From 3237265dfd4cfc4c0c0c3dbf5067173f4b637305 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=8C=20=E6=9C=B1?= <1324361213@qq.com> Date: Mon, 27 Oct 2025 23:16:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8F=91=E7=A5=A8=E8=B6=85?= =?UTF-8?q?=E9=A2=9D=E6=8E=A7=E5=88=B6=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Services/SaleOrderService.cs | 29 ++++++++ T_IV_SALESIC/ServicePlugIn/Submit.cs | 105 ++++++++++++++++++--------- 2 files changed, 98 insertions(+), 36 deletions(-) diff --git a/Services/SaleOrderService.cs b/Services/SaleOrderService.cs index d7f8675..bad8f96 100644 --- a/Services/SaleOrderService.cs +++ b/Services/SaleOrderService.cs @@ -330,5 +330,34 @@ WHERE var sql = string.Format(sqlTemp, orgId, contractNo, k3retrunAmount, retrunAmount, orderAmount); return DBServiceHelper.Execute(ctx, sql); } + + /// + /// 获取已提交发票金额 + /// + /// + /// + /// + internal decimal GetSubmitedAmount(string orgId, string contractNo) + { + var sqlTemp = $@"/*dialect*/SELECT + ISNULL (SUM(t1e_O.FALLAMOUNT), 0) AS SubmitAmount +FROM + T_IV_SALESIC t1 + LEFT JOIN T_IV_SALESICENTRY t1e ON t1.FID = t1e.FID + LEFT JOIN T_IV_SALESICENTRY_O t1e_O ON t1e.FENTRYID = t1e_O.FENTRYID +WHERE + 1 = 1 + AND t1.FDOCUMENTSTATUS = 'B' + AND t1e.F_CONTRACTNO = '{contractNo}' + AND t1.FSALEORGID = '{orgId}' +"; + var sql = string.Format(sqlTemp, orgId, contractNo); + var result = DBServiceHelper.ExecuteDynamicObject(ctx, sql); + if (result.Count == 0) + { + return 0; + } + return Convert.ToDecimal(result[0]["SubmitAmount"]); + } } } diff --git a/T_IV_SALESIC/ServicePlugIn/Submit.cs b/T_IV_SALESIC/ServicePlugIn/Submit.cs index 4dbe6ba..e403c26 100644 --- a/T_IV_SALESIC/ServicePlugIn/Submit.cs +++ b/T_IV_SALESIC/ServicePlugIn/Submit.cs @@ -7,6 +7,7 @@ using Kingdee.BOS.Util; using System; using System.Collections.Generic; using System.ComponentModel; +using System.Diagnostics.Contracts; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -24,45 +25,74 @@ namespace GZ_LTHPilot_ORDER.T_IV_SALESIC.ServicePlugIn e.FieldKeys.Add("FSALEORGID"); } + private class SALESIC + { + /// + /// 组织Id + /// + public string OrgId { get; set; } + /// + /// 纸质合同号 + /// + public string ContractNo { get; set; } + /// + /// 价税合计原币 + /// + public decimal AllAmountFor { get; set; } + } + public override void BeforeExecuteOperationTransaction(BeforeExecuteOperationTransaction e) { base.BeforeExecuteOperationTransaction(e); - + var entryListUnion = new List(); foreach (var bill in e.SelectedRows) { - var org = bill["SALEORGID"] as DynamicObject; var orgId = org["Id"].ToString(); // 销售组织 var entryList = bill["SALESICENTRY"] as DynamicObjectCollection; - // 根据合同号分组 - var grouped = entryList.GroupBy(n => n["F_contractno"].ToString()); - foreach (var group in grouped) + // 添加所有分录到集合 + foreach (var item in entryList) { - // 纸质合同号 - var contractNo = group.Key; - // 校验原单是否超额 - var srcVerifResult = SrcExcessVerification(orgId, contractNo); - if (srcVerifResult != null) + entryListUnion.Add(new SALESIC() { - //有错误信息 - e.Cancel = true; - IOperationResult operationResult = new OperationResult(); - operationResult.OperateResult.Add(srcVerifResult); - this.OperationResult.MergeResult(operationResult); - } - // 发票单体价税合计原币 - var SumALLAMOUNTFOR = group.Sum(n => Convert.ToDecimal(n["ALLAMOUNTFOR"])); - // TODO 校验是否超额 - var verifResult = ExcessVerification(orgId, contractNo, SumALLAMOUNTFOR); - if (verifResult != null) - { - //有错误信息 - e.Cancel = true; - IOperationResult operationResult = new OperationResult(); - operationResult.OperateResult.Add(verifResult); - this.OperationResult.MergeResult(operationResult); - } + OrgId = orgId, + ContractNo = item["F_contractno"].ToString(), + AllAmountFor = Convert.ToDecimal(item["ALLAMOUNTFOR"]) + }); + } + } + var entryGrouped = entryListUnion.GroupBy(n => new + { + n.ContractNo, + n.OrgId + }); + foreach (var item in entryGrouped) + { + // 纸质合同号 + var contractNo = item.Key.ContractNo; + var orgId = item.Key.OrgId; + // 校验原单是否超额 + var srcVerifResult = SrcExcessVerification(orgId, contractNo); + if (srcVerifResult != null) + { + //有错误信息 + e.Cancel = true; + IOperationResult operationResult = new OperationResult(); + operationResult.OperateResult.Add(srcVerifResult); + this.OperationResult.MergeResult(operationResult); + } + // 发票单体价税合计原币 + var SumALLAMOUNTFOR = item.Sum(n => n.AllAmountFor); + // TODO 校验是否超额 + var verifResult = ExcessVerification(orgId, contractNo, SumALLAMOUNTFOR); + if (verifResult != null) + { + //有错误信息 + e.Cancel = true; + IOperationResult operationResult = new OperationResult(); + operationResult.OperateResult.Add(verifResult); + this.OperationResult.MergeResult(operationResult); } } } @@ -123,17 +153,19 @@ namespace GZ_LTHPilot_ORDER.T_IV_SALESIC.ServicePlugIn var saleOrderNoList = saleOrderList.Select(n => n["FBILLNO"].ToString()).ToList(); var saleOrderNoString = string.Join(",\n\r", saleOrderNoList); var saleOrder = saleOrderList[0]; - // 销售订单价税合计(原币) + // 已提交发票金额(本币) + var submitedAmount = saleOrderService.GetSubmitedAmount(orgId, contractNo); + // 销售订单价税合计(本币) var saleOrderAmount = saleOrderService.GetSaleOrderAmount(orgId, contractNo); - // 销售订单累计开票金额(原币) + // 销售订单累计开票金额(本币) var saleOrderINVOICEAMOUNT = Convert.ToDecimal(saleOrder["F_INVOICEAMOUNT"]); - // 销售订单退货金额(原币) + // 销售订单退货金额(本币) var saleOrderReturnAmountK3Cloud = saleOrderService.GetSaleOrderRetrunAmount(orgId, contractNo); var saleOrderReturnAmountK3 = saleOrderService.GetK3SaleOrderRetrunAmount(orgId, contractNo); - // 销售订单退货金额(原币) + // 销售订单退货金额(本币) var saleOrderReturnAmount = saleOrderReturnAmountK3 + saleOrderReturnAmountK3Cloud; - // 校验销售订单累计开票金额+本次开票金额不能大于销售订单价税合计 - if (saleOrderAmount - saleOrderReturnAmount < saleOrderINVOICEAMOUNT + amount) + // 校验销售订单累计开票金额 + 本次开票金额 + 已提交发票金额 <= 销售订单价税合计 + if (saleOrderAmount - saleOrderReturnAmount < saleOrderINVOICEAMOUNT + amount + submitedAmount) { return new OperateResult() { @@ -142,10 +174,11 @@ namespace GZ_LTHPilot_ORDER.T_IV_SALESIC.ServicePlugIn MessageType = MessageType.FatalError, Message = string.Format($@" 销售纸质合同号:'{contractNo}', 销售订单:'{saleOrderNoString}' , 开票超额。 -不满足条件:整单可开票金额 >= 累计开票金额 + 本次开票金额。 +不满足条件:整单可开票金额 >= 累计开票金额 + 本次开票金额 + 已提交发票金额。 整单可开票金额:{(saleOrderAmount - saleOrderReturnAmountK3Cloud - saleOrderReturnAmountK3).ToString("0.00")}, 累计开票金额:{saleOrderINVOICEAMOUNT.ToString("0.00")}, -本次开票金额:{amount.ToString("0.00")}"), +本次开票金额:{amount.ToString("0.00")}, +已提交金额:{submitedAmount.ToString("0.00")}"), SuccessStatus = false }; }