新增插件刷新销售订单累计开票金额

新增插件校验销售订单累计开票金额+本次开票金额不能大于累计开票金额
This commit is contained in:
朱斌 2025-07-26 17:16:59 +08:00
parent 3338863a22
commit 5afc317a6c
7 changed files with 427 additions and 0 deletions

View File

@ -336,6 +336,12 @@
<Compile Include="SAL_ORDERList\ListUpFJ.cs" />
<Compile Include="SAL_ORDER\DataChage.cs" />
<Compile Include="SAL_ORDER\SaveWL.cs" />
<Compile Include="ScheduleService\SaleOrderSumSicsAmountRefresh.cs" />
<Compile Include="Service\SaleOrderService.cs" />
<Compile Include="Service\SaleSicsService.cs" />
<Compile Include="T_IV_SALESIC\ServicePlugIn\Audit.cs" />
<Compile Include="T_IV_SALESIC\ServicePlugIn\Submit.cs" />
<Compile Include="T_IV_SALESIC\ServicePlugIn\UnAudit.cs" />
<Compile Include="T_PUR_RECEIVE\SaveDate.cs" />
<Compile Include="SAL_DELIVERYNOTICE\SaveYFH.cs" />
<Compile Include="T_IV_SALESIC\AuditS_Order.cs" />
@ -405,6 +411,7 @@
<Content Include="Library\NPOI.OpenXml4Net.dll" />
<Content Include="Library\NPOI.OpenXmlFormats.dll" />
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="packages\SkiaSharp.NativeAssets.macOS.2.88.8\build\net462\SkiaSharp.NativeAssets.macOS.targets" Condition="Exists('packages\SkiaSharp.NativeAssets.macOS.2.88.8\build\net462\SkiaSharp.NativeAssets.macOS.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
@ -415,4 +422,7 @@
<Error Condition="!Exists('packages\SkiaSharp.NativeAssets.Win32.2.88.8\build\net462\SkiaSharp.NativeAssets.Win32.targets')" Text="$([System.String]::Format('$(ErrorText)', 'packages\SkiaSharp.NativeAssets.Win32.2.88.8\build\net462\SkiaSharp.NativeAssets.Win32.targets'))" />
</Target>
<Import Project="packages\SkiaSharp.NativeAssets.Win32.2.88.8\build\net462\SkiaSharp.NativeAssets.Win32.targets" Condition="Exists('packages\SkiaSharp.NativeAssets.Win32.2.88.8\build\net462\SkiaSharp.NativeAssets.Win32.targets')" />
<PropertyGroup>
<PostBuildEvent>copy $(TargetPath) "D:\Program Files (x86)\Kingdee\K3Cloud\WebSite\Bin\$(TargetFileName)"</PostBuildEvent>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,68 @@
using DocumentFormat.OpenXml.Bibliography;
using GZ_LTHPilot_ORDER.Service;
using Kingdee.BOS;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.Core;
using Kingdee.BOS.Util;
using Kingdee.K3.FIN.App.Core.Match.Object;
using System;
using System.ComponentModel;
namespace GZ_LTHPilot_ORDER.ScheduleService
{
[Description("定时刷新#"), HotUpdate]
public class SaleOrderSumSicsAmountRefresh : IScheduleService
{
public void Run(Context ctx, Schedule schedule)
{
var advanceAays = GetAdvanceAays(schedule);
// 提前天的日期
var approvedDate = DateTime.Now.Date.AddDays(-advanceAays - 1);
// 销售发票服务
SaleSicsService saleSicsService = new SaleSicsService(ctx);
// TODO 获取前一天的发票数据
var sicsList = saleSicsService.GetSaleSiceListByApprovedDate(approvedDate);
SaleOrderService saleOrderService = new SaleOrderService(ctx);
foreach (var sice in sicsList)
{
var saleOrgId = sice["FSALEORGID"].ToString();
var contractNo = sice["contractNo"].ToString();
var saleOrderList = saleOrderService.GetSaleOrderByOrgIdAndContractNo(saleOrgId, contractNo);
if (saleOrderList.Count == 0)
{
//var errInfo = string.Format("纸质合同号:{0},没有找到对应的销售订单,请检查销售订单是否已审核,或者被作废", contractNo);
//throw new Exception(errInfo);
continue;
}
var saleOrder = saleOrderList[0];
saleSicsService.UpdateSaleOrderSumSicsamountBySaleOrder(saleOrder);
}
}
/// <summary>
/// 参数获取提前天
/// </summary>
/// <param name="schedule"></param>
/// <returns></returns>
private int GetAdvanceAays(Schedule schedule)
{
// 参数获取提前天
var advanceAaysStr = schedule.Parameters;
int advanceAays;
try
{
advanceAays = Convert.ToInt32(advanceAaysStr);
if (advanceAays < 0)
{
throw new Exception();
}
}
catch (Exception)
{
throw new Exception("获取参数提前天失败参数格式为整数且大于等于0");
}
return advanceAays;
}
}
}

View File

@ -0,0 +1,47 @@
using Kingdee.BOS;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GZ_LTHPilot_ORDER.Service
{
/// <summary>
/// 销售订单服务类
/// </summary>
public class SaleOrderService
{
private Context ctx;
public SaleOrderService(Context ctx)
{
this.ctx = ctx;
}
/// <summary>
/// 根据纸质合同号、组织获取销售订单
/// </summary>
/// <returns></returns>
public DynamicObjectCollection GetSaleOrderByOrgIdAndContractNo(string orgId, string contractNo)
{
var sqlTemp = @"/*dialect*/SELECT
*
FROM
T_SAL_ORDER t1
LEFT JOIN T_SAL_ORDERFIN t1fin ON t1.FID = t1fin.FID
WHERE
1 = 1
AND t1.FDOCUMENTSTATUS = 'C'
AND t1.FCANCELSTATUS = 'A'
AND t1.FSALEORGID = '{0}'
AND t1.F_CONTRACTNUMBER = '{1}'
";
var sql = string.Format(sqlTemp, orgId, contractNo);
var resultData = DBServiceHelper.ExecuteDynamicObject(ctx, sql);
return resultData;
}
}
}

107
Service/SaleSicsService.cs Normal file
View File

@ -0,0 +1,107 @@
using Kingdee.BOS;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using Kingdee.K3.FIN.App.Core.Match.Object;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GZ_LTHPilot_ORDER.Service
{
/// <summary>
/// 销售发票服务类
/// </summary>
public class SaleSicsService
{
private Context ctx;
public SaleSicsService(Context ctx)
{
this.ctx = ctx;
}
/// <summary>
/// 刷新销售订单累计开票金额
/// </summary>
/// <param name="saleOrderId"></param>
/// <returns></returns>
public int UpdateSaleOrderSumSicsamountBySaleOrder(DynamicObject saleOrder)
{
// 销售订单ID
var saleOrderId = saleOrder["FID"].ToString();
// 纸质合同号
var contractNo = saleOrder["F_CONTRACTNUMBER"].ToString();
// 销售组织Id
var saleOrgId = saleOrder["FSALEORGID"].ToString();
var sqlTemp = @"/*dialect*/UPDATE t1
SET
t1.F_INVOICEAMOUNT = TEMP1.FAFTERTOTALTAX
FROM
T_SAL_ORDER t1
INNER JOIN (
SELECT
FSALEORGID,
F_PaperNumber,
SUM(FAFTERTOTALTAX) FAFTERTOTALTAX
FROM
(
SELECT
FSALEORGID, --
F_PaperNumber, --
ISNULL (FAFTERTOTALTAX, 0) FAFTERTOTALTAX --
FROM
T_IV_SALESIC
WHERE
1 = 1
AND FDOCUMENTSTATUS = 'C'
AND FCANCELSTATUS = 'A'
AND FSALEORGID = '{0}'
AND F_PaperNumber = '{1}'
UNION ALL
SELECT
'100302' FSALEORGID, --
F_PaperNumber, --
SUM(ISNULL (, 0) + ISNULL (, 0)) FAFTERTOTALTAX --
FROm
dbo.oldk3seorder0701
WHERE
1 = 1
AND = '{1}'
GROUP BY
) temp02
GROUP BY
FSALEORGID,
F_PaperNumber
) TEMP1 ON t1.F_CONTRACTNUMBER = TEMP1.F_PaperNumber
AND t1.FSALEORGID = TEMP1.FSALEORGID
WHERE
t1.FID = '{2}'
";
var sql = string.Format(sqlTemp, saleOrgId, contractNo, saleOrderId);
return DBServiceHelper.Execute(ctx, sql);
}
/// <summary>
///
/// </summary>
/// <param name="approvedDate"></param>
/// <returns></returns>
public DynamicObjectCollection GetSaleSiceListByApprovedDate(DateTime approvedDate)
{
var sqlTemp = @"/*dialect*/SELECT DISTINCT
t1.FSALEORGID,
ISNULL(t1.F_PaperNumber, '') contractNo
FROM
T_IV_SALESIC t1
WHERE
1 = 1
AND t1.FAPPROVEDATE > '{0}'
";
var sql = string.Format(sqlTemp, approvedDate.ToString("yyyy-MM-dd HH:mm:dd"));
return DBServiceHelper.ExecuteDynamicObject(ctx, sql);
}
}
}

View File

@ -0,0 +1,60 @@
using GZ_LTHPilot_ORDER.Service;
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 Audit : AbstractOperationServicePlugIn
{
public override void OnPreparePropertys(PreparePropertysEventArgs e)
{
base.OnPreparePropertys(e);
e.FieldKeys.Add("F_PaperNumber");
}
/// <summary>
/// 审核插件执行后插件、事务提交后事件
/// </summary>
/// <param name="e"></param>
public override void AfterExecuteOperationTransaction(AfterExecuteOperationTransaction e)
{
base.AfterExecuteOperationTransaction(e);
foreach (var bill in e.DataEntitys)
{
var org = bill["SALEORGID"] as DynamicObject;
var orgId = org["Id"].ToString(); // 销售订单
var contractNo = bill["F_PaperNumber"].ToString(); // 纸质合同号
// 销售订单服务
var saleOrderService = new SaleOrderService(this.Context);
// TODO 根据组织和纸质合同号查找销售订单
var saleOrderList = saleOrderService.GetSaleOrderByOrgIdAndContractNo(orgId, contractNo);
if (saleOrderList.Count == 0)
{
//var errInfo = string.Format("纸质合同号:{0},没有找到对应的销售订单,请检查销售订单是否已审核,或者被作废", contractNo);
//throw new Exception(errInfo);
continue;
}
if (saleOrderList.Count > 1)
{
var errInfo = string.Format("纸质合同号:{0},找到多个销售订单,请检查组织内纸质合同号唯一性", contractNo);
throw new Exception(errInfo);
}
var saleOrder = saleOrderList[0];
// 发票服务
SaleSicsService saleSicsService = new SaleSicsService(this.Context);
// TODO 刷新销售订单单头的累计开票金额
saleSicsService.UpdateSaleOrderSumSicsamountBySaleOrder(saleOrder);
}
}
}
}

View File

@ -0,0 +1,76 @@
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_PaperNumber");
e.FieldKeys.Add("FAFTERTOTALTAX");
}
public override void BeforeExecuteOperationTransaction(BeforeExecuteOperationTransaction e)
{
base.BeforeExecuteOperationTransaction(e);
//throw new Exception("asdfas");
foreach (var bill in e.SelectedRows)
{
var org = bill["SALEORGID"] as DynamicObject;
var orgId = org["Id"].ToString(); // 销售订单
var contractNo = bill["F_PaperNumber"].ToString(); // 纸质合同号
var FAFTERTOTALTAX = Convert.ToDecimal(bill["FAFTERTOTALTAX"]); // 发票单头价税合计本币
// 销售订单服务
var saleOrderService = new SaleOrderService(this.Context);
// TODO 根据组织和纸质合同号查找销售订单
var saleOrderList = saleOrderService.GetSaleOrderByOrgIdAndContractNo(orgId, contractNo);
if (saleOrderList.Count == 0)
{
//var errInfo = string.Format("纸质合同号:{0},没有找到对应的销售订单,请检查销售订单是否已审核,或者被作废", contractNo);
//throw new Exception(errInfo);
continue;
}
if (saleOrderList.Count > 1)
{
var errInfo = string.Format("纸质合同号:{0},找到多个销售订单,请检查组织内纸质合同号唯一性", contractNo);
throw new Exception(errInfo);
}
var saleOrder = saleOrderList[0];
// 销售订单价税合计
var saleOrderAmount = Convert.ToDecimal(saleOrder["FBILLALLAMOUNT_LC"]);
// 销售订单累计开票金额
var saleOrderINVOICEAMOUNT = Convert.ToDecimal(saleOrder["F_INVOICEAMOUNT"]);
// 校验销售订单累计开票金额+本次开票金额不能大于销售订单价税合计
if (saleOrderAmount < saleOrderINVOICEAMOUNT + FAFTERTOTALTAX)
{
//有错误信息
e.Cancel = true;
IOperationResult operationResult = new OperationResult();
operationResult.OperateResult.Add(new OperateResult()
{
PKValue = "1",
Name = "检查开票金额是否超额",
MessageType = MessageType.FatalError,
Message = string.Format($"纸质合同号:'{contractNo}' ,销售订单价税合计本币:{saleOrderAmount} ,累计开票金额:{saleOrderINVOICEAMOUNT},本次开票金额:{FAFTERTOTALTAX},已超额,不允许提交"),
SuccessStatus = false
});
this.OperationResult.MergeResult(operationResult);
}
}
}
}
}

View File

@ -0,0 +1,59 @@
using GZ_LTHPilot_ORDER.Service;
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 UnAudit : AbstractOperationServicePlugIn
{
public override void OnPreparePropertys(PreparePropertysEventArgs e)
{
base.OnPreparePropertys(e);
e.FieldKeys.Add("F_PaperNumber");
}
/// <summary>
/// 审核插件执行后插件、事务提交后事件
/// </summary>
/// <param name="e"></param>
public override void AfterExecuteOperationTransaction(AfterExecuteOperationTransaction e)
{
base.AfterExecuteOperationTransaction(e);
foreach (var bill in e.DataEntitys)
{
var org = bill["SALEORGID"] as DynamicObject;
var orgId = org["Id"].ToString(); // 销售订单
var contractNo = bill["F_PaperNumber"].ToString(); // 纸质合同号
// 销售订单服务
var saleOrderService = new SaleOrderService(this.Context);
// TODO 根据组织和纸质合同号查找销售订单
var saleOrderList = saleOrderService.GetSaleOrderByOrgIdAndContractNo(orgId, contractNo);
if (saleOrderList.Count == 0)
{
//var errInfo = string.Format("纸质合同号:{0},没有找到对应的销售订单,请检查销售订单是否已审核,或者被作废", contractNo);
//throw new Exception(errInfo);
continue;
}
if (saleOrderList.Count > 1)
{
var errInfo = string.Format("纸质合同号:{0},找到多个销售订单,请检查组织内纸质合同号唯一性", contractNo);
throw new Exception(errInfo);
}
var saleOrder = saleOrderList[0];
// 发票服务
SaleSicsService saleSicsService = new SaleSicsService(this.Context);
// TODO 刷新销售订单单头的累计开票金额
saleSicsService.UpdateSaleOrderSumSicsamountBySaleOrder(saleOrder);
}
}
}
}