using Kingdee.BOS.App.Data; using Kingdee.BOS.Contracts.Report; using Kingdee.BOS.Core.Report; using Kingdee.BOS.Orm.DataEntity; using Kingdee.BOS.Util; using Kingdee.BOS; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data; namespace Pilot.Report.Exploitation.AccountsReceivableStatements { /// /// 应收账款对账报表【明细版】 /// [Description("【列表插件】应收账款对账报表【明细版】"), HotUpdate] public class AccountsReceivableReport2 : 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("Number", new LocaleValue("序号"), SqlStorageType.Sqlvarchar); header.AddChild("DATE", new LocaleValue("签订日期"), SqlStorageType.SqlDatetime); header.AddChild("CONTRACTNUMBER", new LocaleValue("订单号"), SqlStorageType.Sqlvarchar); header.AddChild("ProjectName", new LocaleValue("项目名称"), SqlStorageType.Sqlvarchar); header.AddChild("SizeModel", new LocaleValue("规格型号"), SqlStorageType.Sqlvarchar); header.AddChild("FQty", new LocaleValue("数量/台"), SqlStorageType.SqlInt); header.AddChild("FTaxPrice", new LocaleValue("单价"), SqlStorageType.SqlDecimal); header.AddChild("FAllAmount", new LocaleValue("价税合计"), SqlStorageType.SqlDecimal); header.AddChild("OrderAmount", new LocaleValue("订单金额"), SqlStorageType.SqlDecimal); header.AddChild("ShipmentsDate", new LocaleValue("发货日期"), SqlStorageType.Sqlvarchar); header.AddChild("ShipmentsNum", new LocaleValue("发货数量"), SqlStorageType.SqlInt); header.AddChild("ShipmentsAmount", new LocaleValue("发货金额"), SqlStorageType.SqlDecimal); header.AddChild("ReturnDate", new LocaleValue("退货日期"), SqlStorageType.Sqlvarchar); header.AddChild("ReturnNum", new LocaleValue("退货数量"), SqlStorageType.SqlInt); header.AddChild("ReturnAmount", new LocaleValue("退货金额"), SqlStorageType.SqlDecimal); header.AddChild("BillingDate", new LocaleValue("开票日期"), SqlStorageType.Sqlvarchar); header.AddChild("BillingAmount", new LocaleValue("开票金额"), SqlStorageType.SqlDecimal); header.AddChild("PaymentDate", new LocaleValue("回款日期"), SqlStorageType.Sqlvarchar); header.AddChild("PaymentAmount", new LocaleValue("回款金额"), SqlStorageType.SqlDecimal); header.AddChild("ShippedDebt", new LocaleValue("已出货欠款"), SqlStorageType.SqlDecimal); header.AddChild("InvoicedDebt", new LocaleValue("已开票欠款"), SqlStorageType.SqlDecimal); header.AddChild("OwedTickets", new LocaleValue("欠票"), SqlStorageType.SqlDecimal); header.AddChild("IsEnded", new LocaleValue("是否已完结"), SqlStorageType.Sqlvarchar); header.AddChild("Remark", new LocaleValue("备注"), SqlStorageType.Sqlvarchar); 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 fClient = customFilter["FClient_Id"]?.ToString(); // 工程项目名称 var fProjectList = (customFilter["FProject"] as DynamicObjectCollection)?.Select(n => (n["FProject"] as DynamicObject)["ID"].ToString()).ToList(); // 截止对账日期 var fDate = customFilter["FDate"]?.ToString(); // 订单状态 var fGROUP = customFilter["F_ALL_GROUP"]?.ToString(); var fProject = fProjectList == null ? "" : (string.Join(",", fProjectList)); base.BuilderReportSqlAndTempTable(filter, tableName); string sql = string.Format(@"/*dialect*/ Select * INTO #TABLEXYX From (Select A.FID From View_Table_Temp2 A JOIN View_Table_Temp3 B on A.FCONTRACTNUMBER=B.FCONTRACTNUMBER AND A.FCREATEDATE = B.FCREATEDATE UNION ALL Select * From View_Table_Temp1) W Select A.FDATE, CAST(ROW_NUMBER() OVER (ORDER BY A.FDate DESC) as nvarchar(MAX)) AS Number, CASE WHEN B.FSEQ != 1 THEN null ELSE A.FDate END as 'DATE', --签订日期 CASE WHEN B.FSEQ != 1 THEN '' ELSE A.F_CONTRACTNUMBER END as 'CONTRACTNUMBER', --订单号 CASE WHEN B.FSEQ != 1 THEN '' ELSE ISNULL(H.FNAME,'') END as 'ProjectName', --项目名称 ISNULL(G.FSpecification,'') as 'SizeModel', --规格型号 B.FQty, --数量/台 B2.FTaxPrice, --单价 B2.FAllAmount, --价税合计 CASE WHEN B.FSEQ != 1 THEN null ELSE ISNULL(A2.FBILLALLAMOUNT,0) END as 'OrderAmount', --订单金额 CASE WHEN B.FSEQ != 1 THEN null ELSE ISNULL(H2.FDate,'') END as 'ShipmentsDate', --发货日期 CASE WHEN B.FSEQ != 1 THEN null ELSE ISNULL(H2.FPRICEBASEQTY,0) END as 'ShipmentsNum', --发货数量 CASE WHEN B.FSEQ != 1 THEN null ELSE ISNULL(H2.FALLAMOUNT,0) END as 'ShipmentsAmount', --发货金额 CASE WHEN B.FSEQ != 1 THEN null ELSE ISNULL(H3.FDate,'') END as 'ReturnDate', --退货日期 CASE WHEN B.FSEQ != 1 THEN null ELSE ISNULL(H3.FRETNOTICEQTY,0) END as 'ReturnNum', --退货数量 CASE WHEN B.FSEQ != 1 THEN null ELSE ISNULL(H3.FBillAllAmount,0) END as 'ReturnAmount',--退货金额 CASE WHEN B.FSEQ != 1 THEN null ELSE ISNULL(H4.FDate,'') END as 'BillingDate', --开票日期 CASE WHEN B.FSEQ != 1 THEN null ELSE ISNULL(H4.FALLAMOUNTFOR,0) END as 'BillingAmount', --开票金额 CASE WHEN B.FSEQ != 1 THEN null ELSE (Select STRING_AGG((CONVERT(nvarchar,aa1.FDATE,23)),',') as 'FDate' From T_AR_RECEIVEBILL aa1 JOIN T_SEC_USER aa2 on aa1.FCREATORID = aa2.FUSERID Where FBILLNO in (Select FBILLNO3 From T_AutoWrireRecordEntry a1 JOIN T_AutoWrireRecordEntry2 a2 on a1.FID = a2.FID Where FBILLNO2 = A.FBILLNO)) END as 'PaymentDate', --回款日期 CASE WHEN B.FSEQ != 1 THEN null ELSE ISNULL(A.F_AMOUNT,0) END as 'PaymentAmount', --回款金额 CASE WHEN B.FSEQ != 1 THEN null ELSE ISNULL(H2.FALLAMOUNT,0)-ISNULL(H3.FBillAllAmount,0) -ISNULL(E.FWRITTENOFFAMOUNTFOR,0) END as 'ShippedDebt', --已出货欠款 CASE WHEN B.FSEQ != 1 THEN null ELSE ISNULL(H4.FALLAMOUNTFOR,0) -ISNULL(E.FWRITTENOFFAMOUNTFOR,0) END as 'InvoicedDebt', --已开票欠款 CASE WHEN B.FSEQ != 1 THEN null ELSE ISNULL((ISNULL(H2.FALLAMOUNT,0)-ISNULL(H3.FBillAllAmount,0) -0)-(ISNULL(H4.FALLAMOUNTFOR,0) -0),0) END as 'OwedTickets', --欠票 CASE WHEN B.FSEQ != 1 THEN '' WHEN (ISNULL(AA.FBillAllAmount,0)-ISNULL(H3.FBillAllAmount,0)) = ISNULL(H2.FALLAMOUNT,0) --订单金额-退货金额 = 发货金额 AND (ISNULL(AA.FBillAllAmount,0)-ISNULL(H3.FBillAllAmount,0)) = ISNULL(H4.FALLAMOUNTFOR,0) --订单金额-退货金额 = 开票金额 AND (ISNULL(AA.FBillAllAmount,0)-ISNULL(H3.FBillAllAmount,0)) = ISNULL(H5.FREALRECAMOUNTFOR,0) --订单金额-退货金额 = 收款金额 THEN '已完结' ELSE '未完结' END as 'IsEnded', --是否已完结 CASE WHEN B.FSEQ != 1 THEN '' ELSE A.FNOTE END as 'Remark' --备注 INTO #TEMPTABLE1 --临时表 From T_SAL_ORDER A JOIN T_SAL_ORDERFIN AA on A.FID = AA.FID JOIN T_SAL_ORDERFIN A2 on A.FID = A2.FID JOIN T_SAL_ORDERENTRY B on A.FID = B.FID JOIN T_SAL_ORDERENTRY_F B2 on B.FENTRYID = B2.FENTRYID 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') H --工程项目表(预置基础资料1) on H.FID = A.F_projectname LEFT JOIN (SELECT W2.FSBILLID,SUM(W1.FALLAMOUNT) as 'FALLAMOUNT',SUM(W1.FPRICEBASEQTY) as 'FPRICEBASEQTY', STRING_AGG(CONVERT(nvarchar,W1.FDATE, 23), ',') as 'FDate' FROM (Select q2.FAllAmount,q2.FENTRYID,q2.FPriceBaseQty,q1.FDate From T_SAL_DELIVERYNOTICE q1 JOIN T_SAL_DELIVERYNOTICEENTRY_F q2 on q1.FID = q2.FID Where q1.FDocumentStatus = 'C' 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) H2 --发货通知单表 on A.FID = H2.FSBILLID LEFT JOIN (SELECT W2.FSBILLID,STRING_AGG(CONVERT(nvarchar,W1.FDATE, 23), ',') as 'FDate',SUM(W1.FPriceUnitQty) as 'FRETNOTICEQTY',SUM(W1.FALLAMOUNT) as 'FBillAllAmount' FROM (Select q1.FDATE,q3.FSID,q2.FAllAmount,q2.FPriceUnitQty From T_SAL_RETURNNOTICE q1 JOIN T_SAL_RETURNNOTICEENTRY_F q2 on q1.FID = q2.FID JOIN T_SAL_RETURNNOTICEENTRY_LK q3 on q2.FENTRYID = q3.FENTRYID Where q1.FDocumentStatus = 'C' AND q1.FCancelStatus = 'A' AND q3.FSTABLENAME = 'T_SAL_ORDERENTRY') W1 JOIN T_SAL_ORDERENTRY_LK W2 on W1.FSID = W2.FENTRYID GROUP BY W2.FSBILLID) H3 --退货订单表 on A.FID = H3.FSBILLID LEFT JOIN (SELECT W2.FSBILLID,SUM(W1.FALLAMOUNTFOR) as 'FALLAMOUNTFOR',STRING_AGG(CONVERT(nvarchar,W1.FDATE,23),',') as 'FDate' FROM (Select B.FALLAMOUNTFOR,B.FENTRYID,B.FOPENAMOUNTFOR,A.FDATE From T_AR_RECEIVABLE A JOIN T_AR_RECEIVABLEENTRY B on A.FID = B.FID Where A.FDocumentStatus = 'C' AND B.FORDERNUMBER !='' AND A.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) H4 --应收单表 on A.FID = H4.FSBILLID LEFT JOIN (Select q2.FSALEORDERNO,SUM(q1.FREALRECAMOUNTFOR) as 'FREALRECAMOUNTFOR' From T_AR_RECEIVEBILL q1 JOIN T_AR_RECEIVEBILLENTRY q2 on q1.FID = q2.FID Where q1.FDOCUMENTSTATUS = 'C' AND q1.FCancelStatus = 'A' AND q2.FSALEORDERNO != '' GROUP BY q2.FSALEORDERNO) H5 --收款单表 on A.FBILLNO = H5.FSALEORDERNO LEFT JOIN (Select B.FNAME,B.FSPECIFICATION,A.* From T_BD_MATERIAL A JOIN T_BD_MATERIAL_L B on A.FMATERIALID = B.FMATERIALID Where B.FLOCALEID = 2052 AND A.FDocumentStatus = 'C' AND A.FForbidStatus = 'A') G --物料表 on G.FMATERIALID = B.FMaterialId LEFT JOIN (Select a1.FID,a1.F_CONTRACTNUMBER,STRING_AGG(CONVERT(nvarchar,a1.FDATE, 23), ',') as 'FDate',SUM(a2.FWRITTENOFFAMOUNTFOR) as 'FWRITTENOFFAMOUNTFOR' From T_AR_RECEIVEBILL a1 JOIN T_AR_RECEIVEBILLENTRY a2 on a1.FID = a2.FID WHere a1.F_CONTRACTNUMBER!='' GROUP BY a1.FID,a1.F_CONTRACTNUMBER) E on E.F_CONTRACTNUMBER = A.F_CONTRACTNUMBER Where A.FDocumentStatus = 'C' AND A.FBusinessType = 'NORMAL' AND A.FID in (Select * From #TABLEXYX)"); if (!string.IsNullOrEmpty(fClient) && fClient != "0") { sql += string.Format(@" AND A.FCustId in ({0})", fClient); } if (!string.IsNullOrEmpty(fProject)) { sql += string.Format(@" AND A.F_projectname in ({0})", fProject); } if (!string.IsNullOrEmpty(fDate)) { sql += string.Format(@" AND A.FAPPROVEDATE <= EOMONTH('{0}')", fDate); } sql += string.Format(@";"); sql += string.Format(@"/*dialect*/ Select * INTO #TEMPTABLE2 From #TEMPTABLE1 Where 1=1"); if (!string.IsNullOrEmpty(fGROUP) && fGROUP == "2") { sql += string.Format(@" AND IsEnded = '否'"); } sql += string.Format(@";"); sql += string.Format(@"/*dialect*/ Select *, ROW_NUMBER() OVER (ORDER BY FDate DESC) AS FID, ROW_NUMBER() OVER (ORDER BY FDate DESC) AS FIDENTITYID INTO {0} From #TEMPTABLE2", tableName); DBUtils.Execute(this.Context, sql); } /// /// 获取前端组件转换过滤条件 /// /// /// public override ReportTitles GetReportTitles(IRptParams filter) { ReportTitles reportTitles = new ReportTitles(); DynamicObject customFilter = filter.FilterParameter.CustomFilter; if (customFilter != null) { // 客户 var fClientList = (customFilter["FClient"] as DynamicObject)?["Name"]?.ToString(); // 工程项目名称 var fProjectList = (customFilter["FProject"] as DynamicObjectCollection)?.Select(n => (n["FProject"] as DynamicObject)["Name"].ToString()).ToList(); // 截止对账日期 var fDate = customFilter["FDate"]?.ToString(); // 订单状态 var fGROUP = customFilter["F_ALL_GROUP"]?.ToString(); string fState = ""; if (fGROUP == "1") { fState = "全部订单"; } if (fGROUP == "2") { fState = "未完结订单"; } //这里是报表页面的标识 reportTitles.AddTitle("FState", fGROUP == null ? "" : fState); reportTitles.AddTitle("FClient", fClientList == null ? "" : fClientList); reportTitles.AddTitle("FDate", fDate == null ? "" : Convert.ToDateTime(fDate).ToString("yyyy-MM-dd")); reportTitles.AddTitle("FProject", fProjectList == null ? "" : string.Join(",", fProjectList)); } return reportTitles; } /// /// TableName表显示后追加数据 /// /// /// protected override DataTable GetListData(string sSQL) { var last = sSQL.Trim().Split(' ').ToList().Last(); int rowId = int.Parse(last); string sql = @" SELECT * FROM({0}UNION ALL SELECT '','合计',null,'','','', SUM(FQTY), SUM(FTAXPRICE), SUM(FALLAMOUNT), SUM(OrderAmount), null, SUM(ShipmentsNum), SUM(ShipmentsAmount), null, SUM(ReturnNum), SUM(ReturnAmount), null, SUM(BillingAmount), null, SUM(PaymentAmount), SUM(ShippedDebt), SUM(InvoicedDebt), SUM(OwedTickets), '','', {2} FID, {2} FIDENTITYID FROM ({0}) temp2 ) temp "; string SqlStr = string.Format(sql, sSQL, rowId + 1, rowId + 2, rowId + 1024); return base.GetListData(SqlStr); } } }