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);
+ }
}
+
}
}
}