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

332 lines
19 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.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
{
/// <summary>
/// 销售订单进度报表
/// </summary>
[Description("【列表插件】销售订单进度报表【报表】"), HotUpdate]
public class SaleOrderProgressReport: 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("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;
}
/// <summary>
/// 显示报表数据
/// </summary>
/// <param name="filter"></param>
/// <param name="tableName"></param>
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);
}
/// <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)
{
// 下单时间
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;
}
}
}