2025-07-31 09:20:10 +08:00
|
|
|
|
using DocumentFormat.OpenXml.Bibliography;
|
2025-08-08 10:21:37 +08:00
|
|
|
|
using Gatedge.Enpower.BOS.PlugIn.Utils;
|
2025-07-31 09:20:10 +08:00
|
|
|
|
using GZ_LTHPilot_ORDER.Models.VO;
|
|
|
|
|
|
using GZ_LTHPilot_ORDER.Service;
|
|
|
|
|
|
using GZ_LTHPilot_ORDER.Services;
|
2025-08-08 10:36:02 +08:00
|
|
|
|
using GZ_LTHPilot_ORDER.Utils;
|
2025-07-31 09:20:10 +08:00
|
|
|
|
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;
|
2025-08-08 10:21:37 +08:00
|
|
|
|
using Newtonsoft.Json;
|
2025-07-31 09:20:10 +08:00
|
|
|
|
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
|
|
|
|
|
|
{
|
2025-08-07 16:27:12 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 查询周期单位:月
|
|
|
|
|
|
/// </summary>
|
2025-08-07 22:11:39 +08:00
|
|
|
|
int Cycle = 12;
|
2025-08-08 10:36:02 +08:00
|
|
|
|
public void Run(Context oldCtx, Schedule schedule)
|
2025-07-31 09:20:10 +08:00
|
|
|
|
{
|
2025-08-08 10:36:02 +08:00
|
|
|
|
ContextUtil contextUtil = new ContextUtil(oldCtx);
|
|
|
|
|
|
var ctx = contextUtil.GetDefaultContext();
|
|
|
|
|
|
TempTableService tempTableService = new TempTableService(ctx);
|
|
|
|
|
|
OrgService orgService = new OrgService(ctx);
|
|
|
|
|
|
SaleOrderService saleOrderService = new SaleOrderService(ctx);
|
2025-07-31 09:20:10 +08:00
|
|
|
|
var orgList = orgService.GetOrgList();
|
|
|
|
|
|
var tableName = tempTableService.CreateTempTable();
|
2025-08-08 10:36:02 +08:00
|
|
|
|
CreateTempTable(ctx, tableName);
|
2025-07-31 17:39:21 +08:00
|
|
|
|
var advanceAays = GetAdvanceAays(schedule);
|
|
|
|
|
|
var planStartDate = DateTime.Now;
|
2025-08-07 22:11:39 +08:00
|
|
|
|
Dictionary<string, string> orgDict = new Dictionary<string, string>();
|
2025-08-07 23:08:45 +08:00
|
|
|
|
var orgIdList = orgList
|
|
|
|
|
|
.Where(n => n["FORGID"].ToString() != "100302")
|
|
|
|
|
|
.Where(n => n["FORGID"].ToString() != "1485290")
|
|
|
|
|
|
.ToList();
|
2025-08-07 22:11:39 +08:00
|
|
|
|
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)
|
|
|
|
|
|
{
|
2025-08-08 10:36:02 +08:00
|
|
|
|
InsertDataToTempTable(ctx, tableName, orgDict, receiveAmountList);
|
2025-08-07 22:11:39 +08:00
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
startDate = startDate.AddMonths(Cycle);
|
|
|
|
|
|
endDate = startDate.AddMonths(Cycle);
|
|
|
|
|
|
}
|
2025-08-08 10:21:37 +08:00
|
|
|
|
|
2025-08-08 10:36:02 +08:00
|
|
|
|
UpdateSaleOrderReceiveAmount(ctx, tableName);
|
2025-07-31 17:39:21 +08:00
|
|
|
|
tempTableService.DropTempTable(tableName);
|
|
|
|
|
|
|
2025-07-31 09:20:10 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-31 17:39:21 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 更新销售订单累计核销金额
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="ctx"></param>
|
|
|
|
|
|
/// <param name="tableName"></param>
|
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
|
private int UpdateSaleOrderReceiveAmount(Context ctx, string tableName)
|
|
|
|
|
|
{
|
2025-08-02 02:30:43 +08:00
|
|
|
|
var sql = $@"/*dialect*/UPDATE t1
|
2025-07-31 17:39:21 +08:00
|
|
|
|
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);
|
|
|
|
|
|
}
|
2025-07-31 09:20:10 +08:00
|
|
|
|
|
|
|
|
|
|
|
2025-07-31 17:39:21 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 将查询的数据插入临时表
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="ctx"></param>
|
|
|
|
|
|
/// <param name="tableName"></param>
|
|
|
|
|
|
/// <param name="orgId"></param>
|
|
|
|
|
|
/// <param name="saleExecuteOuts"></param>
|
|
|
|
|
|
/// <returns></returns>
|
2025-08-07 22:11:39 +08:00
|
|
|
|
private int InsertDataToTempTable(Context ctx, string tableName, Dictionary<string, string> orgDict, List<SaleExecuteOut> saleExecuteOuts)
|
2025-07-31 09:20:10 +08:00
|
|
|
|
{
|
2025-08-13 15:01:00 +08:00
|
|
|
|
var values = saleExecuteOuts.Select(n => $"({orgDict[n.FSALEORGNAME]},'{n.FSALEORGNAME}','{n.FBILLNO}',{n.FALLMATCHAMOUNT.ToString()},'{n.FDate}')").ToList();
|
2025-08-02 02:30:43 +08:00
|
|
|
|
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
|
2025-07-31 09:20:10 +08:00
|
|
|
|
{tableName} (FORGID, FORGNAME, FBILLNO, FAMOUNT, FDATE)
|
|
|
|
|
|
VALUES
|
|
|
|
|
|
{valuesString}
|
|
|
|
|
|
";
|
2025-08-02 02:30:43 +08:00
|
|
|
|
line += DBServiceHelper.Execute(ctx, sqlTemp);
|
|
|
|
|
|
index += pageSize;
|
|
|
|
|
|
}
|
|
|
|
|
|
return line;
|
|
|
|
|
|
|
2025-07-31 09:20:10 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-07-31 17:39:21 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 创建临时表
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="ctx"></param>
|
|
|
|
|
|
/// <param name="tableName"></param>
|
2025-07-31 09:20:10 +08:00
|
|
|
|
private void CreateTempTable(Context ctx, string tableName)
|
|
|
|
|
|
{
|
2025-08-02 02:30:43 +08:00
|
|
|
|
var sql = $@"/*dialect*/CREATE TABLE
|
2025-07-31 09:20:10 +08:00
|
|
|
|
{tableName} (
|
|
|
|
|
|
FORGID int,
|
|
|
|
|
|
FORGNAME NVARCHAR (100),
|
|
|
|
|
|
FBILLNO NVARCHAR (100),
|
2025-08-13 15:01:00 +08:00
|
|
|
|
FAMOUNT DECIMAL(18, 10),
|
2025-07-31 09:20:10 +08:00
|
|
|
|
FDATE DATETIME,
|
|
|
|
|
|
);
|
|
|
|
|
|
";
|
|
|
|
|
|
DBServiceHelper.Execute(ctx, sql);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <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;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|