From 6255c510c6d005826cd9b04cafd3c1b8cef5c57d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E6=96=8C?= <1324361213@qq.com> Date: Thu, 7 Aug 2025 15:47:30 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=94=80=E5=94=AE=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E7=B4=AF=E8=AE=A1=E5=BC=80=E7=A5=A8=E9=87=91=E9=A2=9D?= =?UTF-8?q?=E5=8F=96=E5=80=BC=E9=80=BB=E8=BE=91=EF=BC=8C=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E9=94=80=E5=94=AE=E5=8F=91=E7=A5=A8=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Services/SaleOrderService.cs | 69 ++++++++++++++++++ Services/SaleSicsService.cs | 22 +++--- T_IV_SALESIC/ServicePlugIn/Submit.cs | 101 +++++++++++++++++---------- 3 files changed, 144 insertions(+), 48 deletions(-) diff --git a/Services/SaleOrderService.cs b/Services/SaleOrderService.cs index 040e6cd..c7a7773 100644 --- a/Services/SaleOrderService.cs +++ b/Services/SaleOrderService.cs @@ -10,6 +10,7 @@ using Kingdee.K3.FIN.App.Core.Match.Object; using Newtonsoft.Json; using System; using System.Collections.Generic; +using System.Diagnostics.Contracts; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -28,6 +29,74 @@ namespace GZ_LTHPilot_ORDER.Service this.ctx = ctx; } + /// + /// K3退货金额原币取数逻辑:K3退货金额除以销售订单汇率=K3退货金额原币 + /// + /// 纸质合同号 + /// 销售订单汇率 + /// + public decimal GetK3SaleOrderRetrunAmount(string contractNo, string rate) + { + var sqlTemp = @"/*dialect*/SELECT + ROUND(ISNULL (SUM(退货金额), 0) / {1}, 2) Amount +FROM + oldk3seorder0701 t1 +WHERE + 1 = 1 + AND t1.合同号 = '{0}' +"; + var sql = string.Format(sqlTemp, contractNo, rate); + var result = DBServiceHelper.ExecuteDynamicObject(ctx, sql); + return Convert.ToDecimal(result[0]["Amount"]); + } + + /// + /// 云星空的退货金额取数逻辑:取已审核的退货通知单的表头字段 ”源头销售订单单号#“ =本销售订单编号的退货通知单原币价税合计金额 + /// + /// 单据编号 + /// + public decimal GetSaleOrderRetrunAmount(string billNo) + { + var sqlTemp = @"/*dialect*/SELECT + ISNULL (SUM(FBILLALLAMOUNT), 0) Amount +FROM + T_SAL_RETURNNOTICE t1 + LEFT JOIN T_SAL_RETURNNOTICEFIN t1fin ON t1.FID = t1fin.FID +WHERE + 1 = 1 + AND t1.FDOCUMENTSTATUS = 'C' + AND t1.FCANCELSTATUS = 'A' + AND t1.F_SOURORDERNO = '{0}' +"; + var sql = string.Format(sqlTemp, billNo); + var result = DBServiceHelper.ExecuteDynamicObject(ctx, sql); + return Convert.ToDecimal(result[0]["Amount"]); + } + + /// + /// 订单明细正数的物料原币价税合计(只取退补类型不等于“退回“的物料明细) + /// + /// + /// + public decimal GetSaleOrderAmount(string id) + { + var sqlTemp = @"/*dialect*/SELECT + ISNULL (SUM(t1e_f.FALLAMOUNT), 0) Amount +FROM + T_SAL_ORDER t1 + LEFT JOIN T_SAL_ORDERENTRY_F t1e_f ON t1.FID = t1e_f.FID +WHERE + 1 = 1 + AND t1.FDOCUMENTSTATUS = 'C' + AND t1.FCANCELSTATUS = 'A' + AND t1e_f.FALLAMOUNT > 0 + AND t1.FID = '{0}' +"; + var sql = string.Format(sqlTemp, id); + var result = DBServiceHelper.ExecuteDynamicObject(ctx, sql); + return Convert.ToDecimal(result[0]["Amount"]); + } + /// /// 根据纸质合同号、组织获取销售订单 /// diff --git a/Services/SaleSicsService.cs b/Services/SaleSicsService.cs index c6fac86..3442cd4 100644 --- a/Services/SaleSicsService.cs +++ b/Services/SaleSicsService.cs @@ -50,19 +50,21 @@ FROM FROM ( SELECT - FSALEORGID, -- 销售组织 - F_PaperNumber, -- 纸质合同号 - ISNULL (FAFTERTOTALTAX, 0) FAFTERTOTALTAX, -- 价税合计本币 - ISNULL (FAFTERTOTALTAXFOR, 0) FAFTERTOTALTAXFOR -- 价税合计 + v1.FSALEORGID, -- 销售组织 + v1e.F_CONTRACTNO F_PaperNumber, -- 纸质合同号 + ISNULL (v1e_o.FALLAMOUNT, 0) FAFTERTOTALTAX, -- 价税合计本币 + ISNULL (v1e.FALLAMOUNTFOR, 0) FAFTERTOTALTAXFOR -- 价税合计 FROM - T_IV_SALESIC + T_IV_SALESIC v1 + INNER JOIN T_IV_SALESICENTRY v1e ON v1.FID = v1e.FID + LEFT JOIN T_IV_SALESICENTRY_O v1e_o ON v1e_o.FENTRYID = v1e.FENTRYID WHERE 1 = 1 - AND FDOCUMENTSTATUS = 'C' - AND FCANCELSTATUS = 'A' - AND F_SFQC = 0 - AND FSALEORGID = '{0}' - AND F_PaperNumber = '{1}' + AND v1.FDOCUMENTSTATUS = 'C' + AND v1.FCANCELSTATUS = 'A' + AND v1.F_SFQC = 0 + AND v1.FSALEORGID = '{0}' + AND v1e.F_CONTRACTNO = '{1}' UNION ALL SELECT '100302' FSALEORGID, -- 销售组织 diff --git a/T_IV_SALESIC/ServicePlugIn/Submit.cs b/T_IV_SALESIC/ServicePlugIn/Submit.cs index f25a15f..eb5e470 100644 --- a/T_IV_SALESIC/ServicePlugIn/Submit.cs +++ b/T_IV_SALESIC/ServicePlugIn/Submit.cs @@ -19,8 +19,8 @@ namespace GZ_LTHPilot_ORDER.T_IV_SALESIC.ServicePlugIn public override void OnPreparePropertys(PreparePropertysEventArgs e) { base.OnPreparePropertys(e); - e.FieldKeys.Add("F_PaperNumber"); - e.FieldKeys.Add("FAFTERTOTALTAX"); + e.FieldKeys.Add("F_contractno"); + e.FieldKeys.Add("FALLAMOUNTFOR"); e.FieldKeys.Add("FSALEORGID"); } @@ -28,49 +28,74 @@ namespace GZ_LTHPilot_ORDER.T_IV_SALESIC.ServicePlugIn public override void BeforeExecuteOperationTransaction(BeforeExecuteOperationTransaction e) { base.BeforeExecuteOperationTransaction(e); - //throw new Exception("asdfas"); + // 销售订单服务 + var saleOrderService = new SaleOrderService(this.Context); foreach (var bill in e.SelectedRows) { + var org = bill["SALEORGID"] as DynamicObject; var orgId = org["Id"].ToString(); // 销售订单 - var contractNo = bill["F_PaperNumber"].ToString(); // 纸质合同号 - var FAFTERTOTALTAX = Convert.ToDecimal(bill["AFTERTOTALTAX"]); // 发票单头价税合计本币 - // 销售订单服务 - var saleOrderService = new SaleOrderService(this.Context); - // TODO 根据组织和纸质合同号查找销售订单 - var saleOrderList = saleOrderService.GetSaleOrderByOrgIdAndContractNo(orgId, contractNo); - if (saleOrderList.Count == 0) + var entryList = bill["SALESICENTRY"] as DynamicObjectCollection; + // 根据合同号分组 + var grouped = entryList.GroupBy(n => n["F_contractno"].ToString()); + foreach (var group in grouped) { - //var errInfo = string.Format("纸质合同号:{0},没有找到对应的销售订单,请检查销售订单是否已审核,或者被作废", contractNo); - //throw new Exception(errInfo); - continue; - } - if (saleOrderList.Count > 1) - { - var errInfo = string.Format("纸质合同号:{0},找到多个销售订单,请检查组织内纸质合同号唯一性", contractNo); - throw new Exception(errInfo); - } - var saleOrder = saleOrderList[0]; - // 销售订单价税合计 - var saleOrderAmount = Convert.ToDecimal(saleOrder["FBILLALLAMOUNT_LC"]); - // 销售订单累计开票金额 - var saleOrderINVOICEAMOUNT = Convert.ToDecimal(saleOrder["F_INVOICEAMOUNT"]); - // 校验销售订单累计开票金额+本次开票金额不能大于销售订单价税合计 - if (saleOrderAmount < saleOrderINVOICEAMOUNT + FAFTERTOTALTAX) - { - //有错误信息 - e.Cancel = true; - IOperationResult operationResult = new OperationResult(); - operationResult.OperateResult.Add(new OperateResult() + // 纸质合同号 + var contractNo = group.Key; + // 发票单体价税合计原币 + var SumALLAMOUNTFOR = group.Sum(n => Convert.ToDecimal(n["FALLAMOUNTFOR"])); + + // TODO 根据组织和纸质合同号查找销售订单 + var saleOrderList = saleOrderService.GetSaleOrderByOrgIdAndContractNo(orgId, contractNo); + if (saleOrderList.Count == 0) { - PKValue = "1", - Name = "检查开票金额是否超额", - MessageType = MessageType.FatalError, - Message = string.Format($"纸质合同号:'{contractNo}' ,销售订单价税合计本币:{saleOrderAmount.ToString("0.00")} ,累计开票金额:{saleOrderINVOICEAMOUNT.ToString("0.00")},本次开票金额:{FAFTERTOTALTAX.ToString("0.00")},已超额,不允许提交"), - SuccessStatus = false - }); - this.OperationResult.MergeResult(operationResult); + continue; + } + if (saleOrderList.Count > 1) + { + var errInfo = string.Format("纸质合同号:{0},找到多个销售订单,请检查组织内纸质合同号唯一性", contractNo); + throw new Exception(errInfo); + } + var saleOrder = saleOrderList[0]; + // 销售订单Id + var saleOrderId = saleOrder["FID"].ToString(); + var saleOrderNo = saleOrder["FBILLNO"].ToString(); + // 销售订单价税合计(原币) + var saleOrderAmount = saleOrderService.GetSaleOrderAmount(saleOrderId); + // 销售订单累计开票金额(原币) + var saleOrderINVOICEAMOUNT = Convert.ToDecimal(saleOrder["F_INVOICEAMOUNT"]); + // 销售订单退货金额(原币) + var rate = saleOrder["FEXCHANGERATE"].ToString(); + var saleOrderReturnAmountK3Cloud = saleOrderService.GetSaleOrderRetrunAmount(saleOrderNo); + var saleOrderReturnAmountK3 = saleOrderService.GetK3SaleOrderRetrunAmount(contractNo, rate); + var saleOrderReturnAmount = saleOrderReturnAmountK3 + saleOrderReturnAmountK3Cloud; + // 校验销售订单累计开票金额+本次开票金额不能大于销售订单价税合计 + if (saleOrderAmount < saleOrderINVOICEAMOUNT + SumALLAMOUNTFOR - saleOrderReturnAmount) + { + //有错误信息 + e.Cancel = true; + IOperationResult operationResult = new OperationResult(); + operationResult.OperateResult.Add(new OperateResult() + { + PKValue = "1", + Name = "检查开票金额是否超额", + MessageType = MessageType.FatalError, + Message = string.Format($@" +销售订单:'{saleOrderNo}' , 纸质合同号:'{contractNo}', 开票超额, +不满足条件:销售订单价税合计 >= 累计开票金额 + 本次开票金额 - 退货金额。 +销售订单价税合计:{saleOrderAmount.ToString("0.00")}, +累计开票金额:{saleOrderINVOICEAMOUNT.ToString("0.00")}, +本次开票金额:{SumALLAMOUNTFOR.ToString("0.00")}, +退货金额:{saleOrderReturnAmountK3Cloud.ToString("0.00")}, +K3退货金额:{saleOrderReturnAmountK3.ToString("0.00")} + +"), + SuccessStatus = false + }); + this.OperationResult.MergeResult(operationResult); + } } + } } }