修改销售订单累计开票金额取值逻辑,

修改销售发票提交校验逻辑
This commit is contained in:
朱斌 2025-08-07 15:47:30 +08:00
parent a33073e02d
commit 6255c510c6
3 changed files with 144 additions and 48 deletions

View File

@ -10,6 +10,7 @@ using Kingdee.K3.FIN.App.Core.Match.Object;
using Newtonsoft.Json; using Newtonsoft.Json;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.Contracts;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -28,6 +29,74 @@ namespace GZ_LTHPilot_ORDER.Service
this.ctx = ctx; this.ctx = ctx;
} }
/// <summary>
/// K3退货金额原币取数逻辑K3退货金额除以销售订单汇率=K3退货金额原币
/// </summary>
/// <param name="contractNo">纸质合同号</param>
/// <param name="rate">销售订单汇率</param>
/// <returns></returns>
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"]);
}
/// <summary>
/// 云星空的退货金额取数逻辑:取已审核的退货通知单的表头字段 ”源头销售订单单号#“ =本销售订单编号的退货通知单原币价税合计金额
/// </summary>
/// <param name="billNo">单据编号</param>
/// <returns></returns>
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"]);
}
/// <summary>
/// 订单明细正数的物料原币价税合计(只取退补类型不等于“退回“的物料明细)
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
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"]);
}
/// <summary> /// <summary>
/// 根据纸质合同号、组织获取销售订单 /// 根据纸质合同号、组织获取销售订单
/// </summary> /// </summary>

View File

@ -50,19 +50,21 @@ FROM
FROM FROM
( (
SELECT SELECT
FSALEORGID, -- v1.FSALEORGID, --
F_PaperNumber, -- v1e.F_CONTRACTNO F_PaperNumber, --
ISNULL (FAFTERTOTALTAX, 0) FAFTERTOTALTAX, -- ISNULL (v1e_o.FALLAMOUNT, 0) FAFTERTOTALTAX, --
ISNULL (FAFTERTOTALTAXFOR, 0) FAFTERTOTALTAXFOR -- ISNULL (v1e.FALLAMOUNTFOR, 0) FAFTERTOTALTAXFOR --
FROM 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 WHERE
1 = 1 1 = 1
AND FDOCUMENTSTATUS = 'C' AND v1.FDOCUMENTSTATUS = 'C'
AND FCANCELSTATUS = 'A' AND v1.FCANCELSTATUS = 'A'
AND F_SFQC = 0 AND v1.F_SFQC = 0
AND FSALEORGID = '{0}' AND v1.FSALEORGID = '{0}'
AND F_PaperNumber = '{1}' AND v1e.F_CONTRACTNO = '{1}'
UNION ALL UNION ALL
SELECT SELECT
'100302' FSALEORGID, -- '100302' FSALEORGID, --

View File

@ -19,8 +19,8 @@ namespace GZ_LTHPilot_ORDER.T_IV_SALESIC.ServicePlugIn
public override void OnPreparePropertys(PreparePropertysEventArgs e) public override void OnPreparePropertys(PreparePropertysEventArgs e)
{ {
base.OnPreparePropertys(e); base.OnPreparePropertys(e);
e.FieldKeys.Add("F_PaperNumber"); e.FieldKeys.Add("F_contractno");
e.FieldKeys.Add("FAFTERTOTALTAX"); e.FieldKeys.Add("FALLAMOUNTFOR");
e.FieldKeys.Add("FSALEORGID"); e.FieldKeys.Add("FSALEORGID");
} }
@ -28,49 +28,74 @@ namespace GZ_LTHPilot_ORDER.T_IV_SALESIC.ServicePlugIn
public override void BeforeExecuteOperationTransaction(BeforeExecuteOperationTransaction e) public override void BeforeExecuteOperationTransaction(BeforeExecuteOperationTransaction e)
{ {
base.BeforeExecuteOperationTransaction(e); base.BeforeExecuteOperationTransaction(e);
//throw new Exception("asdfas"); // 销售订单服务
var saleOrderService = new SaleOrderService(this.Context);
foreach (var bill in e.SelectedRows) foreach (var bill in e.SelectedRows)
{ {
var org = bill["SALEORGID"] as DynamicObject; var org = bill["SALEORGID"] as DynamicObject;
var orgId = org["Id"].ToString(); // 销售订单 var orgId = org["Id"].ToString(); // 销售订单
var contractNo = bill["F_PaperNumber"].ToString(); // 纸质合同号 var entryList = bill["SALESICENTRY"] as DynamicObjectCollection;
var FAFTERTOTALTAX = Convert.ToDecimal(bill["AFTERTOTALTAX"]); // 发票单头价税合计本币 // 根据合同号分组
// 销售订单服务 var grouped = entryList.GroupBy(n => n["F_contractno"].ToString());
var saleOrderService = new SaleOrderService(this.Context); foreach (var group in grouped)
// TODO 根据组织和纸质合同号查找销售订单
var saleOrderList = saleOrderService.GetSaleOrderByOrgIdAndContractNo(orgId, contractNo);
if (saleOrderList.Count == 0)
{ {
//var errInfo = string.Format("纸质合同号:{0},没有找到对应的销售订单,请检查销售订单是否已审核,或者被作废", contractNo); // 纸质合同号
//throw new Exception(errInfo); var contractNo = group.Key;
continue; // 发票单体价税合计原币
} var SumALLAMOUNTFOR = group.Sum(n => Convert.ToDecimal(n["FALLAMOUNTFOR"]));
if (saleOrderList.Count > 1)
{ // TODO 根据组织和纸质合同号查找销售订单
var errInfo = string.Format("纸质合同号:{0},找到多个销售订单,请检查组织内纸质合同号唯一性", contractNo); var saleOrderList = saleOrderService.GetSaleOrderByOrgIdAndContractNo(orgId, contractNo);
throw new Exception(errInfo); if (saleOrderList.Count == 0)
}
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()
{ {
PKValue = "1", continue;
Name = "检查开票金额是否超额", }
MessageType = MessageType.FatalError, if (saleOrderList.Count > 1)
Message = string.Format($"纸质合同号:'{contractNo}' ,销售订单价税合计本币:{saleOrderAmount.ToString("0.00")} ,累计开票金额:{saleOrderINVOICEAMOUNT.ToString("0.00")},本次开票金额:{FAFTERTOTALTAX.ToString("0.00")},已超额,不允许提交"), {
SuccessStatus = false var errInfo = string.Format("纸质合同号:{0},找到多个销售订单,请检查组织内纸质合同号唯一性", contractNo);
}); throw new Exception(errInfo);
this.OperationResult.MergeResult(operationResult); }
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);
}
} }
} }
} }
} }