Compare commits

..

10 Commits

Author SHA1 Message Date
e6cad1ce9d Merge branch 'main' of http://8.130.121.29:3000/Develop/Piolot_Order_TH 2025-11-21 20:06:27 +08:00
2bf48230f3 修改开票校验币别区分的问题 2025-11-21 20:06:25 +08:00
e748b0eef5 施工安装费的税率取值ID错了 2025-11-12 14:44:35 +08:00
0dbacffcf3 0 2025-10-31 13:47:27 +08:00
9bb3fb4696 0 2025-10-27 23:51:36 +08:00
3237265dfd 修复发票超额控制问题 2025-10-27 23:16:14 +08:00
5881d9e9c7 1 2025-09-29 11:06:52 +08:00
0f875c3f5b 111 2025-09-28 09:52:09 +08:00
1d53dd3b1e Merge branch 'main' of http://8.130.121.29:3000/TianHua/Piolot_Order_TH into main 2025-09-22 18:44:58 +08:00
097a0080da 231 2025-09-22 18:44:50 +08:00
4 changed files with 116 additions and 35 deletions

View File

@@ -94,9 +94,11 @@ namespace GZ_LTHPilot_ORDER.PRD_PPBOMCHANGE
变更类型为变更后将分子赋值为0*/
if (Convert.ToString(entityObj["ChangeType"]) == "3")
{
//this.View.ShowMessage("12345");
//变更类型为变更后分子赋值为0
this.View.Model.SetValue("FNumerator", 0, Convert.ToInt32(entityObj["Seq"]) - 1);
}
this.View.Model.SetValue("FIssueType", 7, Convert.ToInt32(entityObj["Seq"]) - 1);
}
/*变更类型为新增将物料编码替换为动态窗口选择的物料FID*/
if (Convert.ToString(entityObj["ChangeType"]) == "1")
{

View File

@@ -330,5 +330,42 @@ WHERE
var sql = string.Format(sqlTemp, orgId, contractNo, k3retrunAmount, retrunAmount, orderAmount);
return DBServiceHelper.Execute(ctx, sql);
}
/// <summary>
/// 获取已提交发票金额
/// </summary>
/// <param name="orgId"></param>
/// <param name="contractNo"></param>
/// <param name="billIds"></param>
/// <returns></returns>
internal decimal GetSubmitedAmount(string orgId, string contractNo, List<string> billIds)
{
var billIdFilter = string.Empty;
if (billIds != null && billIds.Count > 0)
{
var billIdString = string.Join(",", billIds.Select(n => "'" + n + "'"));
billIdFilter = $@" AND t1.FID NOT IN ({billIdString}) ";
}
var sqlTemp = $@"/*dialect*/SELECT
ISNULL (SUM(t1e.FALLAMOUNTFOR), 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}'
{billIdFilter}
";
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.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics.Contracts;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -24,45 +25,82 @@ namespace GZ_LTHPilot_ORDER.T_IV_SALESIC.ServicePlugIn
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; }
/// <summary>
/// 单据Id
/// </summary>
public string BillId { get; set; }
}
public override void BeforeExecuteOperationTransaction(BeforeExecuteOperationTransaction e)
{
base.BeforeExecuteOperationTransaction(e);
var entryListUnion = new List<SALESIC>();
foreach (var bill in e.SelectedRows)
{
var billId = bill["Id"].ToString();
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);
}
BillId = billId,
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);
var billIds = item.Select(n => n.BillId).ToList();
// TODO 校验是否超额
var verifResult = ExcessVerification(orgId, contractNo, SumALLAMOUNTFOR, billIds);
if (verifResult != null)
{
//有错误信息
e.Cancel = true;
IOperationResult operationResult = new OperationResult();
operationResult.OperateResult.Add(verifResult);
this.OperationResult.MergeResult(operationResult);
}
}
}
@@ -93,7 +131,7 @@ namespace GZ_LTHPilot_ORDER.T_IV_SALESIC.ServicePlugIn
return null;
}
// 校验源单是否超额
var srcVerifResult = ExcessVerification(orgId, srcContractNo, 0);
var srcVerifResult = ExcessVerification(orgId, srcContractNo, 0, null);
if (srcVerifResult != null)
{
return srcVerifResult;
@@ -109,8 +147,9 @@ namespace GZ_LTHPilot_ORDER.T_IV_SALESIC.ServicePlugIn
/// <param name="orgId">销售组织</param>
/// <param name="contractNo">合同号</param>
/// <param name="amount">开票金额</param>
/// <param name="billIds">本次操作单据ID</param>
/// <returns></returns>
private OperateResult ExcessVerification(string orgId, string contractNo, decimal amount)
private OperateResult ExcessVerification(string orgId, string contractNo, decimal amount, List<string> billIds)
{
// 销售订单服务
var saleOrderService = new SaleOrderService(this.Context);
@@ -123,6 +162,8 @@ 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, billIds);
// 销售订单价税合计(原币)
var saleOrderAmount = saleOrderService.GetSaleOrderAmount(orgId, contractNo);
// 销售订单累计开票金额(原币)
@@ -132,8 +173,8 @@ namespace GZ_LTHPilot_ORDER.T_IV_SALESIC.ServicePlugIn
var saleOrderReturnAmountK3 = saleOrderService.GetK3SaleOrderRetrunAmount(orgId, contractNo);
// 销售订单退货金额(原币)
var saleOrderReturnAmount = saleOrderReturnAmountK3 + saleOrderReturnAmountK3Cloud;
// 校验销售订单累计开票金额+本次开票金额不能大于销售订单价税合计
if (saleOrderAmount - saleOrderReturnAmount < saleOrderINVOICEAMOUNT + amount)
// 校验销售订单累计开票金额 + 本次开票金额 + 已提交发票金额 <= 销售订单价税合计
if ((saleOrderAmount - saleOrderReturnAmount < saleOrderINVOICEAMOUNT + amount + submitedAmount) && amount >= 0)
{
return new OperateResult()
{
@@ -142,10 +183,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
};
}