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);
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 srcVerifResult = SrcExcessVerification(orgId, contractNo);
if (srcVerifResult != null)
{
//有错误信息
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);
}
}
}
}
///
/// 校验源头单据是否超额
///
///
///
///
///
private OperateResult SrcExcessVerification(string orgId, string contractNo)
{
// 销售订单服务
var saleOrderService = new SaleOrderService(this.Context);
// TODO 根据组织和纸质合同号查找销售订单
var saleOrderList = saleOrderService.GetSaleOrderByOrgIdAndContractNo(orgId, contractNo);
if (saleOrderList.Count == 0)
{
return null;
}
var saleOrder = saleOrderList[0];
// 源纸质合同号
var srcContractNo = saleOrder["F_SOURPAPERCONTRACT"]?.ToString();
// 如果原纸质合同号为空,则认为是源头单, 加上源单合同号 = 纸质合同号 是防止纸质合同号变更出错导致死递归
if (srcContractNo.IsNullOrEmptyOrWhiteSpace() || srcContractNo.Trim() == contractNo.Trim())
{
return null;
}
// 校验源单是否超额
var srcVerifResult = ExcessVerification(orgId, srcContractNo, 0);
if (srcVerifResult != null)
{
return srcVerifResult;
}
// 递归校验
return SrcExcessVerification(orgId, srcContractNo);
}
///
/// 超额校验,如果校验不通过会返回OperateResult实例,通过返回null
///
/// 销售组织
/// 合同号
/// 开票金额
///
private OperateResult ExcessVerification(string orgId, string contractNo, decimal amount)
{
// 销售订单服务
var saleOrderService = new SaleOrderService(this.Context);
// TODO 根据组织和纸质合同号查找销售订单
var saleOrderList = saleOrderService.GetSaleOrderByOrgIdAndContractNo(orgId, contractNo);
if (saleOrderList.Count == 0)
{
return null;
}
var saleOrderNoList = saleOrderList.Select(n => n["FBILLNO"].ToString()).ToList();
var saleOrderNoString = string.Join(",\n\r", saleOrderNoList);
var saleOrder = saleOrderList[0];
// 销售订单价税合计(原币)
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)
{
return new OperateResult()
{
PKValue = "1",
Name = "检查开票金额是否超额",
MessageType = MessageType.FatalError,
Message = string.Format($@" 销售纸质合同号:'{contractNo}',
销售订单:'{saleOrderNoString}' , 开票超额。
不满足条件:整单可开票金额 >= 累计开票金额 + 本次开票金额。
整单可开票金额:{(saleOrderAmount - saleOrderReturnAmountK3Cloud - saleOrderReturnAmountK3).ToString("0.00")},
累计开票金额:{saleOrderINVOICEAMOUNT.ToString("0.00")},
本次开票金额:{amount.ToString("0.00")}"),
SuccessStatus = false
};
}
return null;
}
}
}