using Kingdee.BOS; using Kingdee.BOS.App.Data; using Kingdee.BOS.Contracts.Report; using Kingdee.BOS.Core.Metadata; using Kingdee.BOS.Core.Report; using Kingdee.BOS.Orm.DataEntity; using Kingdee.BOS.Util; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ProductionMaterialsReport { [Description("生产投料报表-服务插件"), HotUpdate] public class ProductionMaterialsReport : SysReportBaseService { /***********事件执行顺序************* 2015/8/31 18:04:12 : Initialize 2015/8/31 18:04:12 : GetTableName 2015/8/31 18:04:15 : BuilderReportSqlAndTempTable 2015/8/31 18:04:15 : GetIdentityFieldIndexSQL 2015/8/31 18:04:15 : ExecuteBatch 2015/8/31 18:04:19 : GetReportHeaders 2015/8/31 18:04:19 : GetReportTitles 2015/8/31 18:04:27 : GetTableName 2015/8/31 18:04:27 : GetIdentityFieldIndexSQL 2015/8/31 18:04:28 : ExecuteBatch 2015/8/31 18:04:28 : AnalyzeDspCloumn 2015/8/31 18:04:28 : AfterCreateTempTable 2015/8/31 18:04:28 : GetSummaryColumnInfo 2015/8/31 18:04:28 : GetSummaryColumsSQL 2015/8/31 18:04:28 : GetTableName 2015/8/31 18:04:28 : GetTableName 2015/8/31 18:04:29 : ExecuteBatch 2015/8/31 18:04:29 : GetIdentityFieldIndexSQL 2015/8/31 18:04:29 : ExecuteBatch 2015/8/31 18:04:29 : CreateGroupSummaryData 2015/8/31 18:04:29 : GetListData 2015/8/31 18:04:30 : GetReportData 2015/8/31 18:04:30 : GetRowsCount 2015/8/31 18:04:30 : GetListData */ public override void Initialize() { base.Initialize(); //简单账表类型:普通、树形、分页 this.ReportProperty.ReportType = ReportType.REPORTTYPE_NORMAL; //报表名称 this.ReportProperty.ReportName = new LocaleValue("生产投料报表", base.Context.UserLocale.LCID); //是否由插件创建表名 this.IsCreateTempTableByPlugin = true; // this.ReportProperty.IsUIDesignerColumns = false; // this.ReportProperty.IsGroupSummary = true; // this.ReportProperty.SimpleAllCols = false; // 单据主键:两行FID相同,则为同一单的两条分录,单据编号可以不重复显示 this.ReportProperty.PrimaryKeyFieldName = "FID"; // this.ReportProperty.IsDefaultOnlyDspSumAndDetailData = true; // 报表主键字段名:默认为FIDENTITYID,可以修改 //this.ReportProperty.IdentityFieldName = "FIDENTITYID"; // 设置精度控制 var list = new List { new DecimalControlField("FDECIMALS", "FLOTYIELD"), }; this.ReportProperty.DecimalControlFieldList = list; this.ReportProperty.DspInsteadColumnsInfo.DefaultDspInsteadColumns.Add("FSTOCKID", "仓库"); } public override string GetTableName() { return base.GetTableName(); } /// /// 向报表临时表,插入报表数据 /// /// /// public override void BuilderReportSqlAndTempTable(IRptParams filter, string tableName) { base.BuilderReportSqlAndTempTable(filter, tableName); string seqFld = string.Format(base.KSQL_SEQ, " t0.FID "); var sql = $@" DECLARE @FBILLNO varchar(80) ,@MainNumber varchar(80) ,@MainName varchar(80) ,@FMOBILLNO varchar(80) ,@FNumber varchar(80) ,@FName varchar(80) ,@FSALEORDERNO varchar(80) ,@LCID int set @FBILLNO = '' set @MainNumber = '' set @MainName = '' set @FMOBILLNO = '' set @FNumber = '' set @FName = '' set @FSALEORDERNO = '' set @LCID = 2052 --set @FBILLNO ='' --set @MainNumber='' --set @MainName='' --set @FMOBILLNO='' --set @FNumber='' --set @FName='' --set @FSALEORDERNO='' --set @LCID=2052 SELECT top 1000 ROW_NUMBER() OVER(ORDER BY T0.FMATERIALID) AS '行号' --1.行号 ,T0.FID --,T0.FFORMID ,t7.FDATE AS '单据日期' --2.单据日期 ,T0.FBILLNO AS '生产投料单号'--3.生产投料单号 --,T0.FMOID --生产订单内码 ----,T0.FMOENTRYID --生产订单子表内码 --,t0.FSALEORDERID --,t0.FSALEORDERENTRYID ,T0.FSALEORDERNO AS '销售订单号' --4.销售订单号 --,T0.FMATERIALID --产品ID --5.购货单位代码 ,T1.FMNEMONICCODE AS '助记码'--6.助记码 ,T0.FMOBILLNO AS '生产任务单号'--7.生产任务单号 ,T1.FNUMBER --AS '产品编码'--8.产品编码 ,T1_L.FNAME AS '产品名称'--9.产品名称 ,T1_L.FSPECIFICATION AS '产品规格型号'--10.产品规格型号 ,T3_L.FNAME AS '产品单位'--11.产品单位 ,T0.FQTY AS '产品生产数量'--12.产品生产数量 ,T2.FNUMBER AS '物料代码'--13.物料代码 ,T2_L.FNAME AS '物料名称'--14.物料名称 ,(CASE T2.FMATERIALSRC WHEN 'A' THEN 'PLM' WHEN 'B' THEN 'ERP' ELSE '' END) AS '物料来源' --15.物料来源 ,T2_L.FSPECIFICATION AS '物料规格型号'--16.物料规格型号 ,t10_L.FNAME AS '物料技术标准'--17.物料技术标准 ,(T0E.FNUMERATOR / T0E.FDENOMINATOR) AS '物料单位用量' --18.物料单位用量 --,T0E.FUNITID AS ENTRYUNITID ,T4_L.FNAME AS '物料单位' --19.物料单位 ,t9.FBASEQTY AS '物料库存量'--20.物料库存量 ,T11E_A.FBASEINVQTY --21.物料待检数 ,T0E.FNEEDQTY AS '物料总需求'--22.物料总需求 ,T0E_Q.FBASEWIPQTY AS '当前在制品数量'--23.当前在制品数量 --,(case when t9.FBASEQTY > T0E.FNEEDQTY then 0 else T0E.FNEEDQTY - t9.FBASEQTY end) AS '欠料'--24.欠料 ,T11E.FBASELACKQTY AS '欠料'--24.欠料 ,T11E_A.FBASEONORDERQTY AS '物料在途数' --25.物料在途数 ,T11E_A.FENTRYID --26.计划投料数量 ,T0E_Q.FPICKEDQTY AS '已领数量'--27.已领数量 ,T0E_Q.FNOPICKEDQTY AS '未领数量'--28.未领数量 ,T0E.FSTDQTY AS '标准数量'--标准用量 --29.标准数量 ,T0E.FMUSTQTY AS '应发数量'--应发数量 --30.应发数量 ,t0E_L.FMEMO AS '备注'--31.备注 ,T0E_Q.FPICKEDQTY * (100 - t7E.FYIELDRATE) AS '损耗数量'--32.损耗数量 ,T0E_Q.FSCRAPQTY AS '报废数量' --33.报废数量 --34.计划发料日期 ,T0E_C.FSTOCKID ,T5_L.FNAME --AS '仓库'--35.仓库 ,T0E_C.FSTOCKLOCID --36.仓位 ,T0E_Q.FREPICKEDQTY AS '补料数量'--37.补料数量 ,t7E.FPLANSTARTDATE AS '计划开工日期'--38.计划开工日期 ,t7E.FPLANFINISHDATE AS '计划完工日期'--39.计划完工日期 --40.工位 --,7E.FMEMO AS '其他备注项' --41.其他备注项 ,t8_L.FMEMO AS 'BOM备注项'--42.BOM备注项 --,t8.FNUMERATOR ,(CASE T7e.FPRODUCTTYPE WHEN 1 THEN '主产品' WHEN 2 THEN '主产品' WHEN 3 THEN '主产品' ELSE '' END) AS '生产类型'--43.生产类型 --,T0.FWORKSHOPID ,T6_L.FNAME AS '生产车间'--44.生产车间 ,(CASE T7E_A.FSTATUS WHEN 6 THEN '已结案'ELSE '' END) AS '生产任务单结案否'--45.生产任务单结案否 ,(CASE t0.FDOCUMENTSTATUS WHEN 'A' THEN '创建' WHEN 'B' THEN '审核中' WHEN 'C' THEN '已审核' WHEN 'D' THEN '重新审核' WHEN 'Z' THEN '暂存' ELSE '' END) AS '生产投料单状态'--46.生产投料单状态 --47.PR已审未转PO数量 ,6 AS FDECIMALS ,{seqFld} into {tableName} FROM T_PRD_MO t7 --生产订单 LEFT JOIN T_PRD_MOENTRY t7E on t7E.FID = t7.FID LEFT JOIN T_PRD_MOENTRY_A t7E_A on t7E_A.FENTRYID = t7E.FENTRYID LEFT JOIN T_PRD_PPBOM T0 on T0.FMOID = t7.FID --生产用料清单 LEFT JOIN T_PRD_PPBOMENTRY T0E ON T0.FID = T0E.FID AND t0.FMOENTRYSEQ = t7e.FSEQ--生产用料清单子表 LEFT JOIN T_PRD_PPBOMENTRY_Q T0E_Q ON T0E_Q.FENTRYID = T0E.FENTRYID --生产用料清单数量拆分表 LEFT JOIN T_PRD_PPBOMENTRY_C T0E_C ON T0E_C.FENTRYID = T0E.FENTRYID LEFT JOIN T_PRD_PPBOMENTRY_L t0E_L on t0E_L.FENTRYID = T0E.FENTRYID AND t0E_L.FLOCALEID = @LCID LEFT JOIN T_BD_MATERIAL T1 ON T1.FMATERIALID = T0.FMATERIALID LEFT JOIN T_BD_MATERIAL_L T1_L ON T1_L.FMATERIALID = T0.FMATERIALID AND T1_L.FLOCALEID = @LCID LEFT JOIN T_BD_MATERIAL T2 ON T2.FMATERIALID = T0E.FMATERIALID LEFT JOIN T_BD_MATERIAL_L T2_L ON T2_L.FMATERIALID = T0E.FMATERIALID AND T2_L.FLOCALEID = @LCID LEFT JOIN T_BD_UNIT_L T3_L ON T3_L.FUNITID = T0.FUNITID AND T3_L.FLOCALEID = @LCID LEFT JOIN T_BD_UNIT_L T4_L ON T4_L.FUNITID = T0E.FUNITID AND T4_L.FLOCALEID = @LCID LEFT JOIN T_BD_STOCK_L T5_L ON T5_L.FSTOCKID = T0E_C.FSTOCKID AND T5_L.FLOCALEID =@LCID LEFT JOIN T_BD_DEPARTMENT_L T6_L ON T6_L.FDEPTID = T0.FWORKSHOPID AND T6_L.FLOCALEID = @LCID LEFT JOIN T_ENG_BOMCHILD_L t8_L ON t8_L.FENTRYID = T0E.FBOMENTRYID AND t8_L.FLOCALEID = @LCID LEFT JOIN ( SELECT t0.FMATERIALID ,t0.FSTOCKORGID ,sum(t0.FBASEQTY) AS FBASEQTY FROM T_STK_INVENTORY t0 GROUP BY t0.FMATERIALID ,t0.FSTOCKORGID ) t9 on t9.FMATERIALID = T2.FMASTERID AND t9.FSTOCKORGID = t2.FUSEORGID LEFT JOIN T_ENG_ROUTE_L t10_L on t10_L.FID = t7E.FROUTINGID AND t10_L.FLOCALEID = @LCID LEFT JOIN T_PRD_PMPPBOMENTRY T11E on T11E.FMOID = t7e.FID AND T11E.FMOENTRYID = t7e.FENTRYID AND T11E.FMOENTRYSEQ = t7E.FSEQ AND T11E.FMATERIALIDSUB = T0E.FMATERIALID AND T11E.FMATERIALID = t0.FMATERIALID LEFT JOIN T_PRD_PMPPBOMENTRY_A T11E_A ON T11E_A.FENTRYID = T11E.FENTRYID WHERE T0.FBILLNO = (CASE WHEN @FBILLNO != '' THEN @FBILLNO ELSE T0.FBILLNO END) AND T0.FMOBILLNO = (CASE WHEN @FMOBILLNO != '' THEN @FMOBILLNO ELSE T0.FMOBILLNO END) AND T0.FSALEORDERNO = (CASE WHEN @FSALEORDERNO != '' THEN @FSALEORDERNO ELSE T0.FSALEORDERNO END) AND T1.FNUMBER = (CASE WHEN @MAINNUMBER != '' THEN @MAINNUMBER ELSE T1.FNUMBER END) AND T1_L.FNAME = (CASE WHEN @MAINNAME != '' THEN @MAINNAME ELSE T1_L.FNAME END) AND T2.FNUMBER = (CASE WHEN @FNUMBER != '' THEN @FNUMBER ELSE T2.FNUMBER END) AND T2_L.FNAME = (CASE WHEN @FNAME != '' THEN @FNAME ELSE T2_L.FNAME END) "; var res = DBUtils.ExecuteDynamicObject(this.Context, $"/*dialect*/{sql}"); } public override ReportHeader GetReportHeaders(IRptParams filter) { var header = base.GetReportHeaders(filter); int _colIndex = 0; header.AddChild("FNUMBER", new LocaleValue("产品编码"), _colIndex++); header.AddChild("FSTOCKID", new LocaleValue("仓库"), _colIndex++); header.AddChild("FSTOCKLOCID", new LocaleValue("仓位"), _colIndex++); return header; } protected override void ExecuteBatch(List listSql) { base.ExecuteBatch(listSql); } public override ReportTitles GetReportTitles(IRptParams filter) { var result = base.GetReportTitles(filter); //DynamicObject dyFilter = filter.FilterParameter.CustomFilter; //if (dyFilter != null) //{ // if (result == null) // { // result = new ReportTitles(); // } // //数据保存状态 // string saveDataStauts = dyFilter["DataBDStatu"].Long2Int() > 0 ? "1" : "0"; // result.AddTitle("FDataBDStatu", saveDataStauts); // result.AddTitle("FDataHoldYear", dyFilter["DataHoldYear"].ToString()); // result.AddTitle("FDataHoldMonth", dyFilter["DataHoldMonth"].ToString()); //} return result; } protected override string AnalyzeDspCloumn(IRptParams filter, string tablename) { string result = base.AnalyzeDspCloumn(filter, tablename); return result; } protected override void AfterCreateTempTable(string tablename) { base.AfterCreateTempTable(tablename); } /// /// 设置报表合计列 /// /// /// public override List GetSummaryColumnInfo(IRptParams filter) { var result = base.GetSummaryColumnInfo(filter); return result; } protected override string GetSummaryColumsSQL(List summaryFields) { var result = base.GetSummaryColumsSQL(summaryFields); return result; } protected override System.Data.DataTable GetListData(string sSQL) { var result = base.GetListData(sSQL); return result; } protected override System.Data.DataTable GetReportData(IRptParams filter) { var result = base.GetReportData(filter); return result; } protected override System.Data.DataTable GetReportData(string tablename, IRptParams filter) { var result = base.GetReportData(tablename, filter); return result; } public override int GetRowsCount(IRptParams filter) { var result = base.GetRowsCount(filter); return result; } protected override string BuilderFromWhereSQL(IRptParams filter) { string result = base.BuilderFromWhereSQL(filter); return result; } protected override string BuilderSelectFieldSQL(IRptParams filter) { string result = base.BuilderSelectFieldSQL(filter); return result; } protected override string BuilderTempTableOrderBySQL(IRptParams filter) { string result = base.BuilderTempTableOrderBySQL(filter); return result; } public override void CloseReport() { base.CloseReport(); } protected override string CreateGroupSummaryData(IRptParams filter, string tablename) { string result = base.CreateGroupSummaryData(filter, tablename); return result; } protected override void CreateTempTable(string sSQL) { base.CreateTempTable(sSQL); } public override void DropTempTable() { base.DropTempTable(); } public override System.Data.DataTable GetList(IRptParams filter) { var result = base.GetList(filter); return result; } public override List GetOrgIdList(IRptParams filter) { var result = base.GetOrgIdList(filter); return result; } public override List GetTreeNodes(IRptParams filter) { var result = base.GetTreeNodes(filter); return result; } } }