using DocumentFormat.OpenXml.Bibliography; using GZ_LTHPilot_ORDER.Models.VO; using GZ_LTHPilot_ORDER.Service; using GZ_LTHPilot_ORDER.Services; using Kingdee.BOS; using Kingdee.BOS.App; using Kingdee.BOS.Contracts; using Kingdee.BOS.Core; using Kingdee.BOS.ServiceHelper; using Kingdee.BOS.Util; using Kingdee.BOS.WebApi.FormService; using Kingdee.K3.FIN.App.Core.Match.Object; using NPOI.SS.Formula.Functions; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; namespace GZ_LTHPilot_ORDER.ScheduleService { [Description("定时刷新销售订单累计核销金额#"), HotUpdate] public class SaleOrderReceiveAmount : IScheduleService { /// /// 查询周期单位:月 /// int Cycle = 12; public void Run(Context ctx, Schedule schedule) { TempTableService tempTableService = new TempTableService(ctx); OrgService orgService = new OrgService(ctx); SaleOrderService saleOrderService = new SaleOrderService(ctx); var orgList = orgService.GetOrgList(); var tableName = tempTableService.CreateTempTable(); CreateTempTable(ctx, tableName); var advanceAays = GetAdvanceAays(schedule); var planStartDate = DateTime.Now; Dictionary orgDict = new Dictionary(); var orgIdList = orgList .Where(n => n["FORGID"].ToString() != "100302") .Where(n => n["FORGID"].ToString() != "1485290") .ToList(); orgIdList.ForEach(n => orgDict.Add(n["FNAME"].ToString(), n["FORGID"].ToString())); var saleOrgIds = string.Join(",", orgDict.Values); // 循环查询销售订单执行明细表,每次查询一个月的数据, 将数据插入自定义临时表中 var startDate = planStartDate.AddDays(-advanceAays); var endDate = startDate.AddMonths(Cycle); // 如果开始时间大于计划开始时间,说明结束了 while (startDate <= planStartDate.AddMonths(1)) { var receiveAmountList = saleOrderService.GetSaleOrderReceiveAmountByDate(saleOrgIds, startDate, endDate); if (receiveAmountList.Count > 0) { InsertDataToTempTable(ctx, tableName, orgDict, receiveAmountList); } startDate = startDate.AddMonths(Cycle); endDate = startDate.AddMonths(Cycle); } UpdateSaleOrderReceiveAmount(ctx, tableName); tempTableService.DropTempTable(tableName); } /// /// 更新销售订单累计核销金额 /// /// /// /// private int UpdateSaleOrderReceiveAmount(Context ctx, string tableName) { var sql = $@"/*dialect*/UPDATE t1 SET t1.F_AMOUNT = FAMOUNT FROM T_SAL_ORDER t1 INNER JOIN {tableName} t2 ON t1.FSALEORGID = t2.FORGID AND t1.FBILLNO = t2.FBILLNO "; return DBServiceHelper.Execute(ctx, sql); } /// /// 将查询的数据插入临时表 /// /// /// /// /// /// private int InsertDataToTempTable(Context ctx, string tableName, Dictionary orgDict, List saleExecuteOuts) { var values = saleExecuteOuts.Select(n => $"({orgDict[n.FSALEORGNAME]},'{n.FSALEORGNAME}','{n.FBILLNO}',{n.FALLMATCHAMOUNT},'{n.FDate}')").ToList(); var index = 0; var line = 0; var pageSize = 100; while (values.Count > index) { var valuesString = string.Join(",", values.Where(n => values.IndexOf(n) >= index && values.IndexOf(n) < index + pageSize)); var sqlTemp = $@"/*dialect*/INSERT INTO {tableName} (FORGID, FORGNAME, FBILLNO, FAMOUNT, FDATE) VALUES {valuesString} "; line += DBServiceHelper.Execute(ctx, sqlTemp); index += pageSize; } return line; } /// /// 创建临时表 /// /// /// private void CreateTempTable(Context ctx, string tableName) { var sql = $@"/*dialect*/CREATE TABLE {tableName} ( FORGID int, FORGNAME NVARCHAR (100), FBILLNO NVARCHAR (100), FAMOUNT decimal, FDATE DATETIME, ); "; DBServiceHelper.Execute(ctx, sql); } /// /// 参数获取提前天 /// /// /// 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; } } }