修复发票超额控制问题

This commit is contained in:
朱斌 2025-10-27 23:16:14 +08:00
parent 5881d9e9c7
commit 3237265dfd
2 changed files with 98 additions and 36 deletions

View File

@ -330,5 +330,34 @@ WHERE
var sql = string.Format(sqlTemp, orgId, contractNo, k3retrunAmount, retrunAmount, orderAmount); var sql = string.Format(sqlTemp, orgId, contractNo, k3retrunAmount, retrunAmount, orderAmount);
return DBServiceHelper.Execute(ctx, sql); return DBServiceHelper.Execute(ctx, sql);
} }
/// <summary>
/// 获取已提交发票金额
/// </summary>
/// <param name="orgId"></param>
/// <param name="contractNo"></param>
/// <returns></returns>
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"]);
}
} }
} }

View File

@ -7,6 +7,7 @@ using Kingdee.BOS.Util;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Diagnostics.Contracts;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -24,45 +25,74 @@ namespace GZ_LTHPilot_ORDER.T_IV_SALESIC.ServicePlugIn
e.FieldKeys.Add("FSALEORGID"); e.FieldKeys.Add("FSALEORGID");
} }
private class SALESIC
{
/// <summary>
/// 组织Id
/// </summary>
public string OrgId { get; set; }
/// <summary>
/// 纸质合同号
/// </summary>
public string ContractNo { get; set; }
/// <summary>
/// 价税合计原币
/// </summary>
public decimal AllAmountFor { get; set; }
}
public override void BeforeExecuteOperationTransaction(BeforeExecuteOperationTransaction e) public override void BeforeExecuteOperationTransaction(BeforeExecuteOperationTransaction e)
{ {
base.BeforeExecuteOperationTransaction(e); base.BeforeExecuteOperationTransaction(e);
var entryListUnion = new List<SALESIC>();
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 entryList = bill["SALESICENTRY"] as DynamicObjectCollection; var entryList = bill["SALESICENTRY"] as DynamicObjectCollection;
// 根据合同号分组 // 添加所有分录到集合
var grouped = entryList.GroupBy(n => n["F_contractno"].ToString()); foreach (var item in entryList)
foreach (var group in grouped)
{ {
// 纸质合同号 entryListUnion.Add(new SALESIC()
var contractNo = group.Key;
// 校验原单是否超额
var srcVerifResult = SrcExcessVerification(orgId, contractNo);
if (srcVerifResult != null)
{ {
//有错误信息 OrgId = orgId,
e.Cancel = true; ContractNo = item["F_contractno"].ToString(),
IOperationResult operationResult = new OperationResult(); AllAmountFor = Convert.ToDecimal(item["ALLAMOUNTFOR"])
operationResult.OperateResult.Add(srcVerifResult); });
this.OperationResult.MergeResult(operationResult); }
} }
// 发票单体价税合计原币 var entryGrouped = entryListUnion.GroupBy(n => new
var SumALLAMOUNTFOR = group.Sum(n => Convert.ToDecimal(n["ALLAMOUNTFOR"])); {
// TODO 校验是否超额 n.ContractNo,
var verifResult = ExcessVerification(orgId, contractNo, SumALLAMOUNTFOR); n.OrgId
if (verifResult != null) });
{ foreach (var item in entryGrouped)
//有错误信息 {
e.Cancel = true; // 纸质合同号
IOperationResult operationResult = new OperationResult(); var contractNo = item.Key.ContractNo;
operationResult.OperateResult.Add(verifResult); var orgId = item.Key.OrgId;
this.OperationResult.MergeResult(operationResult); // 校验原单是否超额
} 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 saleOrderNoList = saleOrderList.Select(n => n["FBILLNO"].ToString()).ToList();
var saleOrderNoString = string.Join(",\n\r", saleOrderNoList); var saleOrderNoString = string.Join(",\n\r", saleOrderNoList);
var saleOrder = saleOrderList[0]; var saleOrder = saleOrderList[0];
// 销售订单价税合计(原币) // 已提交发票金额(本币)
var submitedAmount = saleOrderService.GetSubmitedAmount(orgId, contractNo);
// 销售订单价税合计(本币)
var saleOrderAmount = saleOrderService.GetSaleOrderAmount(orgId, contractNo); var saleOrderAmount = saleOrderService.GetSaleOrderAmount(orgId, contractNo);
// 销售订单累计开票金额(原币) // 销售订单累计开票金额(币)
var saleOrderINVOICEAMOUNT = Convert.ToDecimal(saleOrder["F_INVOICEAMOUNT"]); var saleOrderINVOICEAMOUNT = Convert.ToDecimal(saleOrder["F_INVOICEAMOUNT"]);
// 销售订单退货金额(币) // 销售订单退货金额(币)
var saleOrderReturnAmountK3Cloud = saleOrderService.GetSaleOrderRetrunAmount(orgId, contractNo); var saleOrderReturnAmountK3Cloud = saleOrderService.GetSaleOrderRetrunAmount(orgId, contractNo);
var saleOrderReturnAmountK3 = saleOrderService.GetK3SaleOrderRetrunAmount(orgId, contractNo); var saleOrderReturnAmountK3 = saleOrderService.GetK3SaleOrderRetrunAmount(orgId, contractNo);
// 销售订单退货金额(币) // 销售订单退货金额(币)
var saleOrderReturnAmount = saleOrderReturnAmountK3 + saleOrderReturnAmountK3Cloud; var saleOrderReturnAmount = saleOrderReturnAmountK3 + saleOrderReturnAmountK3Cloud;
// 校验销售订单累计开票金额+本次开票金额不能大于销售订单价税合计 // 校验销售订单累计开票金额 + 本次开票金额 + 已提交发票金额 <= 销售订单价税合计
if (saleOrderAmount - saleOrderReturnAmount < saleOrderINVOICEAMOUNT + amount) if (saleOrderAmount - saleOrderReturnAmount < saleOrderINVOICEAMOUNT + amount + submitedAmount)
{ {
return new OperateResult() return new OperateResult()
{ {
@ -142,10 +174,11 @@ namespace GZ_LTHPilot_ORDER.T_IV_SALESIC.ServicePlugIn
MessageType = MessageType.FatalError, MessageType = MessageType.FatalError,
Message = string.Format($@" 销售纸质合同号:'{contractNo}' Message = string.Format($@" 销售纸质合同号:'{contractNo}'
'{saleOrderNoString}' , '{saleOrderNoString}' ,
>= + >= + +
{(saleOrderAmount - saleOrderReturnAmountK3Cloud - saleOrderReturnAmountK3).ToString("0.00")} {(saleOrderAmount - saleOrderReturnAmountK3Cloud - saleOrderReturnAmountK3).ToString("0.00")}
{saleOrderINVOICEAMOUNT.ToString("0.00")} {saleOrderINVOICEAMOUNT.ToString("0.00")}
{amount.ToString("0.00")}"), {amount.ToString("0.00")}
{submitedAmount.ToString("0.00")}"),
SuccessStatus = false SuccessStatus = false
}; };
} }