diff --git a/GZ_LTHPilot_ORDER.csproj b/GZ_LTHPilot_ORDER.csproj
index 4b9c947..8e5ac8c 100644
--- a/GZ_LTHPilot_ORDER.csproj
+++ b/GZ_LTHPilot_ORDER.csproj
@@ -336,6 +336,12 @@
+
+
+
+
+
+
@@ -405,6 +411,7 @@
+
@@ -415,4 +422,7 @@
+
+ copy $(TargetPath) "D:\Program Files (x86)\Kingdee\K3Cloud\WebSite\Bin\$(TargetFileName)"
+
\ No newline at end of file
diff --git a/ScheduleService/SaleOrderSumSicsAmountRefresh.cs b/ScheduleService/SaleOrderSumSicsAmountRefresh.cs
new file mode 100644
index 0000000..e374cfc
--- /dev/null
+++ b/ScheduleService/SaleOrderSumSicsAmountRefresh.cs
@@ -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);
+ }
+ }
+
+ ///
+ /// 参数获取提前天
+ ///
+ ///
+ ///
+ 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;
+ }
+ }
+}
diff --git a/Service/SaleOrderService.cs b/Service/SaleOrderService.cs
new file mode 100644
index 0000000..b65262e
--- /dev/null
+++ b/Service/SaleOrderService.cs
@@ -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
+{
+ ///
+ /// 销售订单服务类
+ ///
+ public class SaleOrderService
+ {
+ private Context ctx;
+
+ public SaleOrderService(Context ctx)
+ {
+ this.ctx = ctx;
+ }
+
+ ///
+ /// 根据纸质合同号、组织获取销售订单
+ ///
+ ///
+ 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;
+ }
+ }
+}
diff --git a/Service/SaleSicsService.cs b/Service/SaleSicsService.cs
new file mode 100644
index 0000000..b0bbe77
--- /dev/null
+++ b/Service/SaleSicsService.cs
@@ -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
+{
+ ///
+ /// 销售发票服务类
+ ///
+ public class SaleSicsService
+ {
+ private Context ctx;
+
+ public SaleSicsService(Context ctx)
+ {
+ this.ctx = ctx;
+ }
+
+ ///
+ /// 刷新销售订单累计开票金额
+ ///
+ ///
+ ///
+ 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);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ 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);
+ }
+ }
+}
diff --git a/T_IV_SALESIC/ServicePlugIn/Audit.cs b/T_IV_SALESIC/ServicePlugIn/Audit.cs
new file mode 100644
index 0000000..8c23e59
--- /dev/null
+++ b/T_IV_SALESIC/ServicePlugIn/Audit.cs
@@ -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");
+ }
+
+
+ ///
+ /// 审核插件执行后插件、事务提交后事件
+ ///
+ ///
+ 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);
+ }
+ }
+ }
+}
diff --git a/T_IV_SALESIC/ServicePlugIn/Submit.cs b/T_IV_SALESIC/ServicePlugIn/Submit.cs
new file mode 100644
index 0000000..a9b7fd3
--- /dev/null
+++ b/T_IV_SALESIC/ServicePlugIn/Submit.cs
@@ -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);
+ }
+ }
+ }
+ }
+}
diff --git a/T_IV_SALESIC/ServicePlugIn/UnAudit.cs b/T_IV_SALESIC/ServicePlugIn/UnAudit.cs
new file mode 100644
index 0000000..525d7bf
--- /dev/null
+++ b/T_IV_SALESIC/ServicePlugIn/UnAudit.cs
@@ -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");
+ }
+
+ ///
+ /// 审核插件执行后插件、事务提交后事件
+ ///
+ ///
+ 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);
+ }
+ }
+ }
+}