using GZ_LTHPilot_ORDER.Service; using Kingdee.BOS.Core.DynamicForm; using Kingdee.BOS.Core.DynamicForm.PlugIn; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.Orm.DataEntity; using Kingdee.BOS.Util; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace GZ_LTHPilot_ORDER.T_IV_SALESIC.ServicePlugIn { [Description("服务插件:发票提交,校验销售订单累计开票金额加开票金额不能大于销售订单价税合计本币"), HotUpdate] public class Submit : AbstractOperationServicePlugIn { public override void OnPreparePropertys(PreparePropertysEventArgs e) { base.OnPreparePropertys(e); e.FieldKeys.Add("F_contractno"); e.FieldKeys.Add("FALLAMOUNTFOR"); e.FieldKeys.Add("FSALEORGID"); } public override void BeforeExecuteOperationTransaction(BeforeExecuteOperationTransaction e) { base.BeforeExecuteOperationTransaction(e); // 销售订单服务 var saleOrderService = new SaleOrderService(this.Context); 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) { // 纸质合同号 var contractNo = group.Key; // 发票单体价税合计原币 var SumALLAMOUNTFOR = group.Sum(n => Convert.ToDecimal(n["FALLAMOUNTFOR"])); // TODO 根据组织和纸质合同号查找销售订单 var saleOrderList = saleOrderService.GetSaleOrderByOrgIdAndContractNo(orgId, contractNo); if (saleOrderList.Count == 0) { 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); } } } } } }