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