李狗蛋 69cf26105d 0
2025-03-14 10:00:24 +08:00

375 lines
18 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
{
/// <summary>
/// 应收账款对账报表【明细版】
/// </summary>
[Description("【列表插件】应收账款对账报表【明细版】"), HotUpdate]
public class AccountsReceivableReport2 : SysReportBaseService
{
/// <summary>
/// 初始化
/// </summary>
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<DecimalControlField>
{
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;
}
/// <summary>
/// 报表列表头
/// </summary>
/// <param name="filter"></param>
/// <returns></returns>
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;
}
/// <summary>
/// 显示报表数据
/// </summary>
/// <param name="filter"></param>
/// <param name="tableName"></param>
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);
}
/// <summary>
/// 获取前端组件转换过滤条件
/// </summary>
/// <param name="filter"></param>
/// <returns></returns>
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;
}
/// <summary>
/// TableName表显示后追加数据
/// </summary>
/// <param name="sSQL"></param>
/// <returns></returns>
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);
}
}
}