Piolot_Order_TH/ScheduleService/SaleOrderReceiveAmount.cs

165 lines
5.4 KiB
C#
Raw Normal View History

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
{
2025-08-07 16:27:12 +08:00
/// <summary>
/// 查询周期单位:月
/// </summary>
int Cycle = 6;
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;
foreach (var item in orgList)
{
// 获取组织Id
var orgId = item["FORGID"].ToString();
2025-08-05 09:06:37 +08:00
if (orgId == "100302")
{
continue;
}
// 循环查询销售订单执行明细表,每次查询一个月的数据, 将数据插入自定义临时表中
var startDate = planStartDate.AddDays(-advanceAays);
2025-08-07 16:27:12 +08:00
var endDate = startDate.AddMonths(Cycle);
// 如果开始时间大于计划开始时间,说明结束了
2025-08-02 02:30:43 +08:00
while (startDate <= planStartDate)
{
var receiveAmountList = saleOrderService.GetSaleOrderReceiveAmountByDate(orgId, startDate, endDate);
2025-08-02 02:30:43 +08:00
if (receiveAmountList.Count > 0)
{
InsertDataToTempTable(ctx, tableName, orgId, receiveAmountList);
}
2025-08-07 16:27:12 +08:00
startDate = startDate.AddMonths(Cycle);
endDate = startDate.AddMonths(Cycle);
}
}
UpdateSaleOrderReceiveAmount(ctx, tableName);
tempTableService.DropTempTable(tableName);
}
/// <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
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);
}
/// <summary>
/// 将查询的数据插入临时表
/// </summary>
/// <param name="ctx"></param>
/// <param name="tableName"></param>
/// <param name="orgId"></param>
/// <param name="saleExecuteOuts"></param>
/// <returns></returns>
private int InsertDataToTempTable(Context ctx, string tableName, string orgId, List<SaleExecuteOut> saleExecuteOuts)
{
2025-08-02 02:30:43 +08:00
var values = saleExecuteOuts.Select(n => $"({orgId},'{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}
";
2025-08-02 02:30:43 +08:00
line += DBServiceHelper.Execute(ctx, sqlTemp);
index += pageSize;
}
return line;
}
/// <summary>
/// 创建临时表
/// </summary>
/// <param name="ctx"></param>
/// <param name="tableName"></param>
private void CreateTempTable(Context ctx, string tableName)
{
2025-08-02 02:30:43 +08:00
var sql = $@"/*dialect*/CREATE TABLE
{tableName} (
FORGID int,
FORGNAME NVARCHAR (100),
FBILLNO NVARCHAR (100),
FAMOUNT decimal,
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;
}
}
}