using Kingdee.BOS.App.Data; using Kingdee.BOS.Core.Report; using Kingdee.BOS.Orm.DataEntity; using Kingdee.BOS; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Kingdee.BOS.Contracts.Report; using Kingdee.BOS.Util; using System.ComponentModel; namespace Pilot.Report.Exploitation.SaleOrderProgress { /// /// 销售订单进度报表 /// [Description("【列表插件】销售订单进度报表【报表】"), HotUpdate] public class SaleOrderProgressReport: SysReportBaseService { /// /// 初始化 /// public override void Initialize() { base.Initialize(); this.ReportProperty.ReportName = new LocaleValue("销售订单进度表", base.Context.UserLocale.LCID); this.ReportProperty.IsUIDesignerColumns = false; // 简单账表类型:普通、树形、分页 this.ReportProperty.ReportType = ReportType.REPORTTYPE_NORMAL; this.IsCreateTempTableByPlugin = true; // this.IsCreateTempTableByPlugin = true; // this.ReportProperty.IsGroupSummary = true; // this.ReportProperty.SimpleAllCols = false; // 单据主键:两行FID相同,则为同一单的两条分录,单据编号可以不重复显示 this.ReportProperty.PrimaryKeyFieldName = "FID"; // this.ReportProperty.IsDefaultOnlyDspSumAndDetailData = true; // 设置精度控制 var list = new List { new DecimalControlField("FDECIMALS", "OrigInvoiceAmount"), new DecimalControlField("FDECIMALS", "ExchangeRate"), new DecimalControlField("FDECIMALS", "InvoiceAmountTHB"), new DecimalControlField("FDECIMALS", "MonthEndExRate"), new DecimalControlField("FDECIMALS", "RevaluationAountInTHB"), new DecimalControlField("FDECIMALS", "UnrealizedGainLoss"), }; this.ReportProperty.DecimalControlFieldList = list; } /// /// 报表列表头 /// /// /// public override ReportHeader GetReportHeaders(IRptParams filter) { base.GetReportHeaders(filter); ReportHeader header = new ReportHeader(); header.AddChild("ClientName", new LocaleValue("客户名称"), SqlStorageType.Sqlnvarchar); header.AddChild("ContractNumber", new LocaleValue("纸质合同号"), SqlStorageType.Sqlnvarchar); header.AddChild("ProjectName", new LocaleValue("项目名称"), SqlStorageType.Sqlnvarchar); header.AddChild("Salesman", new LocaleValue("销售员"), SqlStorageType.Sqlnvarchar); header.AddChild("ContractPrice", new LocaleValue("合同金额"), SqlStorageType.SqlDecimal); header.AddChild("CollectionName", new LocaleValue("收款负责人"), SqlStorageType.Sqlnvarchar); header.AddChild("CollectionDate", new LocaleValue("收款日期"), SqlStorageType.Sqlnvarchar); header.AddChild("CollectionAmount", new LocaleValue("收款金额"), SqlStorageType.Sqlnvarchar); header.AddChild("RefundName", new LocaleValue("退款负责人"), SqlStorageType.Sqlnvarchar); header.AddChild("RefundDate", new LocaleValue("退款日期"), SqlStorageType.Sqlnvarchar); header.AddChild("RefundAmount", new LocaleValue("退款金额"), SqlStorageType.SqlDecimal); header.AddChild("ShipmentsName", new LocaleValue("发货负责人"), SqlStorageType.Sqlnvarchar); header.AddChild("ShipmentsDate", new LocaleValue("发货日期"), SqlStorageType.Sqlnvarchar); header.AddChild("ShipmentsNum", new LocaleValue("发货数量"), SqlStorageType.SqlBigInt); header.AddChild("ShipmentsAmount", new LocaleValue("发货金额"), SqlStorageType.SqlDecimal); header.AddChild("OutShipmentsName", new LocaleValue("出库负责人"), SqlStorageType.Sqlnvarchar); header.AddChild("OutShipmentsDate", new LocaleValue("出库日期"), SqlStorageType.Sqlnvarchar); header.AddChild("OutShipmentsNum", new LocaleValue("出库数量"), SqlStorageType.SqlBigInt); header.AddChild("OutShipmentsAmount", new LocaleValue("出库金额"), SqlStorageType.SqlDecimal); header.AddChild("SignNum", new LocaleValue("签收数量"), SqlStorageType.SqlBigInt); header.AddChild("IsSign", new LocaleValue("是否签收"), SqlStorageType.Sqlnvarchar); header.AddChild("ReturnName", new LocaleValue("退货负责人"), SqlStorageType.Sqlnvarchar); header.AddChild("ReturnDate", new LocaleValue("退货日期"), SqlStorageType.Sqlnvarchar); header.AddChild("ReturnNum", new LocaleValue("退货数量"), SqlStorageType.SqlBigInt); header.AddChild("ReturnAmount", new LocaleValue("退货金额"), SqlStorageType.SqlDecimal); header.AddChild("BillingName", new LocaleValue("开票负责人"), SqlStorageType.Sqlnvarchar); header.AddChild("BillingNumber", new LocaleValue("发票号码"), SqlStorageType.Sqlnvarchar); header.AddChild("BillingDate", new LocaleValue("开票日期"), SqlStorageType.Sqlnvarchar); header.AddChild("BillingNum", new LocaleValue("开票数量"), SqlStorageType.SqlBigInt); header.AddChild("BillingAmount", new LocaleValue("开票金额"), SqlStorageType.SqlDecimal); header.AddChild("NotCollectedAmount", new LocaleValue("销售订单未收款金额"), SqlStorageType.SqlDecimal); foreach (var item in header.GetChilds()) { item.Width = 160; } return header; } /// /// 显示报表数据 /// /// /// public override void BuilderReportSqlAndTempTable(IRptParams filter, string tableName) { DynamicObject customFilter = filter.FilterParameter.CustomFilter; // 日期 string fDate = customFilter["FDate"]?.ToString(); // 结束日期 string fEndDate = customFilter["FEndDate"]?.ToString(); // 纸质合同号 string fPaperContract = customFilter["FPaperContract"]?.ToString(); // 组织 var organizationList = (customFilter["FZuZhi"] as DynamicObjectCollection)?.Select(n => (n["FZuZhi"] as DynamicObject)["ID"].ToString()).ToList(); var organization = organizationList == null ? "" : (string.Join(",", organizationList)); base.BuilderReportSqlAndTempTable(filter, tableName); string sql = string.Format(@"/*dialect*/ Select A.FDate as 'Date', ISNULL(B.FNAME,'') as 'ClientName', --客户名称 A.F_contractnumber as 'ContractNumber', --纸质合同号 ISNULL(C.FNAME,'') as 'ProjectName', --项目名称 ISNULL(D.FNAME,'') as 'Salesman', --销售员 AA.FBILLALLAMOUNT_LC as 'ContractPrice', --合同金额 ISNULL(E5.FNAME,'') as 'CollectionName', --收款负责人 ISNULL(E5.FDate,'') as 'CollectionDate', --收款日期 ISNULL(E5.FREALRECAMOUNT,0) as 'CollectionAmount', --收款金额 ISNULL(E6.FNAME,'') as 'RefundName', --退款负责人 ISNULL(E6.FDate,'') as 'RefundDate', --退款日期 ISNULL(E6.FREALREFUNDAMOUNT,0) as 'RefundAmount', --退款金额 ISNULL(E1.FName,'') as 'ShipmentsName', --发货负责人 ISNULL(E1.FDate,'') as 'ShipmentsDate', --发货日期 ISNULL(E1.FPriceUnitQty,0) as 'ShipmentsNum', --发货数量 ISNULL(E1.FALLAMOUNT_LC,0) as 'ShipmentsAmount', --发货金额 ISNULL(E2.FNAME,'') as 'OutShipmentsName', --出库负责人 ISNULL(E2.FDate,'') as 'OutShipmentsDate', --出库日期 ISNULL(E2.FREALQTY,0) as 'OutShipmentsNum', --出库数量 ISNULL(E2.FALLAMOUNT_LC,0) as 'OutShipmentsAmount', --出库金额 ISNULL(E2.FSIGNQTY,0) as 'SignNum', --签收数量 CASE WHEN E2.FTRACESTATUS = 3 THEN '已签收' ELSE '未签收' END as 'IsSign', --是否签收 ISNULL(E3.FNAME,'') as 'ReturnName', --退货负责人 ISNULL(E3.FDate,'') as 'ReturnDate', --退货日期 ISNULL(E3.FPriceUnitQty,0) as 'ReturnNum', --退货数量 ISNULL(E3.FALLAMOUNT_LC,0) as 'ReturnAmount', --退货金额 ISNULL(E4.FNAME,'') as 'BillingName', --开票负责人 ISNULL(E4.F_INVOICENUMBER,'') as 'BillingNumber', --发票号码 ISNULL(E4.FDate,'') as 'BillingDate', --开票日期 ISNULL(E4.FPriceQty,0) as 'BillingNum', --开票数量 ISNULL(E4.FALLAMOUNT,0) as 'BillingAmount' --开票金额 --0 as 'NotCollectedAmount' --销售订单未收款金额 INTO #TEMPTABLE1 From T_SAL_ORDER A --销售顶大 JOIN T_SAL_ORDERFIN AA --销售订单-财务 on A.FID = AA.FID LEFT JOIN (SELECT A2.FDATAVALUE,A1.* FROM (Select q2.FNAME,q1.* From T_BD_CUSTOMER q1 JOIN T_BD_CUSTOMER_L q2 on q1.FCUSTID = q2.FCUSTID) A1 LEFT JOIN (Select A.FMASTERID,B.FDATAVALUE From T_BAS_ASSISTANTDATAENTRY A JOIN T_BAS_ASSISTANTDATAENTRY_L B on A.FENTRYID = B.FENTRYID Where A.FID = '673af6092e2877' AND A.FDocumentStatus = 'C' AND A.FForbidStatus = 'A') A2 on A1.F_CREDITCLASSIFICATION = A2.FMASTERID) B --客户表 on A.FCustId = B.FCUSTID LEFT JOIN (Select q2.FNAME,q1.* From T_BAS_PREBDONE q1 JOIN T_BAS_PREBDONE_L q2 on q1.FID = q2.FID Where q2.FLocaleID = 2052 AND q1.FDocumentStatus = 'C' AND q1.FForbidStatus = 'A') C --工程项目(预置1)项目表 on C.FID = A.F_projectname LEFT JOIN (Select q2.FNAME,q1.* From V_BD_SALESMAN q1 LEFT JOIN V_BD_SALESMAN_L q2 on q1.fid = q2.fid Where q2.FLOCALEID = 2052 AND q1.FDocumentStatus = 'C' AND q1.FForbidStatus = 'A' AND q1.FForbiddenStatus = '0') D --销售员表 on A.FSalerId = D.fid LEFT JOIN (Select R1.FSBILLID,STRING_AGG(R1.FNAME,',') as 'FName',SUM(R1.FALLAMOUNT_LC) as 'FALLAMOUNT_LC',SUM(R1.FPriceUnitQty) as 'FPriceUnitQty', STRING_AGG(CONVERT(nvarchar,R1.FDATE,23),',') as 'FDate' From (SELECT W2.FSBILLID,W1.FNAME,SUM(W1.FALLAMOUNT_LC) as 'FALLAMOUNT_LC', SUM(W1.FPriceUnitQty) as 'FPriceUnitQty',STRING_AGG(CONVERT(nvarchar,W1.FDATE,23),',') as 'FDate' FROM (Select q2.FALLAMOUNT_LC, q2.FENTRYID,q1.FDATE,q3.FNAME,q2.FPriceUnitQty From T_SAL_DELIVERYNOTICE q1 JOIN T_SAL_DELIVERYNOTICEENTRY_F q2 on q1.FID = q2.FID JOIN T_SEC_USER q3 on q1.FCreatorId = q3.FUSERID Where q1.FDocumentStatus = 'C' AND q3.FForbidStatus = 'A' AND q1.FCancelStatus = 'A') W1 JOIN T_SAL_DELIVERYNOTICEENTRY_LK W2 on W1.FENTRYID = W2.FENTRYID Where W2.FSTABLENAME = 'T_SAL_ORDERENTRY' GROUP BY W2.FSBILLID,W1.FNAME) R1 GROUP BY R1.FSBILLID) E1 --发货通知单表 on A.FID = E1.FSBILLID LEFT JOIN (SELECT QQ.FSBILLID,QQ.FTRACESTATUS,SUM(QQ.FREALQTY)'FREALQTY',SUM(QQ.FSIGNQTY)'FSIGNQTY',SUM(QQ.FALLAMOUNT_LC)'FALLAMOUNT_LC', STRING_AGG(CONVERT(nvarchar,QQ.FDATE,23),',')'FDate',STRING_AGG(QQ.FNAME,',') as 'FNAME' FROM (SELECT Q.FSBILLID,Q.FTRACESTATUS,Q.FNAME, SUM(Q.FREALQTY)'FREALQTY',SUM(Q.FSIGNQTY)'FSIGNQTY',SUM(Q.FALLAMOUNT_LC)'FALLAMOUNT_LC',STRING_AGG(CONVERT(nvarchar,Q.FDATE,23),',')'FDate' FROM (Select q5.FSBILLID,q1.FDate,q3.FNAME,q2.FRealQty,q4.FALLAMOUNT_LC,q7.FTraceStatus,q6.FSIGNQTY From T_SAL_OUTSTOCK q1 JOIN T_SEC_USER q3 on q1.FCreatorId = q3.FUSERID JOIN T_SAL_OUTSTOCKENTRY q2 on q1.FID = q2.FID JOIN T_SAL_OUTSTOCKENTRY_F q4 on q2.FENTRYID = q4.FENTRYID JOIN T_SAL_OUTSTOCKENTRY_LK q5 on q5.FENTRYID = q2.FENTRYID JOIN T_SAL_OUTSTOCKENTRY_R q6 on q2.FENTRYID = q6.FENTRYID LEFT JOIN T_SAL_OUTSTOCKTRACE q7 on q1.FID = q7.FID Where q1.FDocumentStatus = 'C' AND q3.FForbidStatus = 'A' AND q1.FCancelStatus = 'A') Q GROUP BY Q.FSBILLID,Q.FTRACESTATUS,Q.FNAME) QQ GROUP BY QQ.FSBILLID,QQ.FTRACESTATUS) E2 --销售出库单 on A.FID = E2.FSBILLID LEFT JOIN (SELECT AA.FSBILLID,STRING_AGG(AA.FNAME,',')'FNAME',STRING_AGG(CONVERT(nvarchar,AA.FDATE,23),',')'FDate',SUM(AA.FPriceUnitQty)'FPriceUnitQty', SUM(AA.FALLAMOUNT_LC)'FALLAMOUNT_LC' FROM (Select a7.FSBILLID,a3.FNAME,STRING_AGG(CONVERT(nvarchar,a1.FDATE,23),',')'FDate', SUM(a2.FPriceUnitQty)'FPriceUnitQty',SUM(a2.FALLAMOUNT_LC)'FALLAMOUNT_LC' From T_SAL_RETURNSTOCK a1 JOIN T_SAL_RETURNSTOCKENTRY_F a2 on a1.FID = a2.FID JOIN T_SEC_USER a3 on a1.FCreatorId = a3.FUSERID JOIN T_SAL_RETURNSTOCKENTRY_LK a5 on a2.FENTRYID = a5.FENTRYID JOIN T_SAL_RETURNNOTICEENTRY a6 on a5.FSID = a6.FENTRYID JOIN T_SAL_RETURNNOTICEENTRY_LK a7 on a6.FENTRYID = a7.FENTRYID Where a5.FSTABLENAME = 'T_SAL_RETURNNOTICEENTRY' AND a7.FSTABLENAME = 'T_SAL_ORDERENTRY'GROUP BY a7.FSBILLID,a3.FNAME) AA GROUP BY AA.FSBILLID) E3 --退货订单表 on A.FID = E3.FSBILLID LEFT JOIN (SELECT WW.FSBILLID,WW.F_INVOICENUMBER,STRING_AGG(WW.FNAME,',')as 'FNAME',SUM(WW.FALLAMOUNT) as 'FALLAMOUNT',SUM(WW.FPriceQty) as 'FPriceQty', STRING_AGG(CONVERT(nvarchar,WW.FDATE,23),',') as 'FDate' FROM (SELECT W2.FSBILLID,W1.FNAME,W1.F_INVOICENUMBER,SUM(W1.FALLAMOUNT) as 'FALLAMOUNT', SUM(W1.FPriceQty) as 'FPriceQty',STRING_AGG(CONVERT(nvarchar,W1.FDATE,23),',') as 'FDate' FROM (Select B1.FALLAMOUNT,B1.FENTRYID,B1.FOPENAMOUNTFOR, A1.FDATE,A1.F_InvoiceNumber,C1.FNAME,B1.FPriceQty From T_AR_RECEIVABLE A1 JOIN T_AR_RECEIVABLEENTRY B1 on A1.FID = B1.FID JOIN T_SEC_USER C1 on A1.FCreatorId = C1.FUSERID Where A1.FDocumentStatus = 'C' AND B1.FORDERNUMBER !='' AND A1.F_GeneralInvoice != 'Y') W1 JOIN T_AR_RECEIVABLEENTRY_LK W2 on W1.FENTRYID = W2.FENTRYID Where W2.FSTABLENAME = 'T_SAL_ORDERENTRY' GROUP BY W2.FSBILLID,W1.FNAME,W1.F_INVOICENUMBER) WW GROUP BY WW.FSBILLID,WW.F_INVOICENUMBER) E4 --应收单表 on A.FID = E4.FSBILLID LEFT JOIN (Select a1.FSBILLID,a3.FID,a4.FNAME,CONVERT(nvarchar,a3.FDATE,23) as FDate,SUM(a3.FREALRECAMOUNT) as 'FREALRECAMOUNT' From T_AR_RECEIVEBILLSRCENTRY_LK a1 JOIN T_AR_RECEIVEBILLENTRY a2 on a1.FENTRYID = a2.FENTRYID JOIN T_AR_RECEIVEBILL a3 on a2.FID = a3.FID JOIN T_SEC_USER a4 on a3.FCreatorId = a4.FUSERID Where a1.FSTABLENAME = 'T_SAL_ORDERPLAN' AND a3.FDOCUMENTSTATUS = 'C' Group by a1.FSBILLID,a3.FID,a4.FNAME,a3.FDATE) E5 on E5.FSBILLID = A.FID LEFT JOIN (Select a1.FSBILLID,a3.FID,a4.FNAME,CONVERT(nvarchar,a3.FDATE,23) as FDate,SUM(a3.FREALREFUNDAMOUNT) as 'FREALREFUNDAMOUNT' From T_AR_REFUNDBILLSRCENTRY_LK a1 JOIN T_AR_REFUNDBILLENTRY a2 on a1.FENTRYID = a2.FENTRYID JOIN T_AR_REFUNDBILL a3 on a2.FID = a3.FID JOIN T_SEC_USER a4 on a3.FCREATERID = a4.FUSERID Where a1.FSTABLENAME = 'T_AR_RECEIVEBILLENTRY' AND a3.FDOCUMENTSTATUS = 'C' Group by a1.FSBILLID,a3.FID,a4.FNAME,a3.FDATE) E6 on E5.FID = E6.FSBILLID Where A.FDocumentStatus = 'C'"); if (!string.IsNullOrEmpty(organization)) { sql += string.Format(@" AND A.FSaleOrgId in ({0})", organization); } sql += string.Format(@";"); sql += string.Format(@"/*dialect*/Select *,(ContractPrice-CollectionAmount-RefundAmount) as'NotCollectedAmount' INTO #TEMPTABLE2 From #TEMPTABLE1 Where 1=1"); if (!string.IsNullOrEmpty(fDate)) { sql += string.Format(@" AND DATE >= '{0}'", fDate); } if (!string.IsNullOrEmpty(fEndDate)) { sql += string.Format(@" AND DATE <= '{0}'", fEndDate); } if (!string.IsNullOrEmpty(fPaperContract)) { sql += string.Format(@" AND ContractNumber like '%{0}%'", fPaperContract); } sql += string.Format(@"/*dialect*/ Select * INTO #TEMPTABLE3 From #TEMPTABLE2 UNION ALL Select '','合计:','','','',SUM(ContractPrice),'','',SUM(CollectionAmount),'','', SUM(RefundAmount),'','',SUM(ShipmentsNum),SUM(ShipmentsAmount),'','', SUM(OutShipmentsNum),SUM(OutShipmentsAmount),SUM(SignNum),'','','', SUM(ReturnNum),SUM(ReturnAmount),'','','',SUM(BillingAmount), SUM(BillingAmount),SUM(NotCollectedAmount) FROM #TEMPTABLE2"); sql += string.Format(@";"); sql += string.Format(@"/*dialect*/ Select *, ROW_NUMBER() OVER (ORDER BY Date DESC) AS FID, ROW_NUMBER() OVER (ORDER BY Date DESC) AS FIDENTITYID INTO {0} From #TEMPTABLE3", tableName); DBUtils.Execute(this.Context, sql); } /// /// 获取前端组件转换过滤条件 /// /// /// public override ReportTitles GetReportTitles(IRptParams filter) { ReportTitles reportTitles = new ReportTitles(); DynamicObject customFilter = filter.FilterParameter.CustomFilter; if (customFilter != null) { // 下单时间 string fDate = customFilter["FDate"]?.ToString(); // 下单时间 string fEndDate = customFilter["FEndDate"]?.ToString(); // 纸质合同号 string fPaperContract = customFilter["FPaperContract"]?.ToString(); // 组织 var organizationList = (customFilter["FZuZhi"] as DynamicObjectCollection)?.Select(n => (n["FZuZhi"] as DynamicObject)["Name"].ToString()).ToList(); //这里是报表页面的标识 reportTitles.AddTitle("FPaperContract", fPaperContract == null ? "" : fPaperContract); reportTitles.AddTitle("FDate", fDate == null ? "" : Convert.ToDateTime(fDate).ToString("yyyy-MM-dd")); reportTitles.AddTitle("FEndDate", fEndDate == null ? "" : Convert.ToDateTime(fEndDate).ToString("yyyy-MM-dd")); reportTitles.AddTitle("FZuZhi", organizationList == null ? "" : string.Join(",", organizationList)); } return reportTitles; } } }