From 20b6e2a0f08ad98945d23eb5e88cfbe5aaeb7bad Mon Sep 17 00:00:00 2001 From: shanji <18996038927@163.com> Date: Sat, 16 Dec 2023 03:14:08 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A1=E7=AE=97=E6=97=B6=E9=95=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DataRepair/DataRepairBusiness.cs | 9 +- BBWYB.Server.Business/JD/JDBusiness.cs | 11 +- .../PurchaseOrder/PurchaseOrderBusiness.cs | 7 +- BBWYB.Server.Business/QiKuManager.cs | 34 ++-- .../Sync/OrderSyncBusiness.cs | 11 +- .../TimeLimitTask/TimeLimitRules.cs | 168 ++++++++++++++++++ .../TimeLimitTask/TimeLimitTaskBusiness.cs | 8 +- 7 files changed, 221 insertions(+), 27 deletions(-) create mode 100644 BBWYB.Server.Business/TimeLimitTask/TimeLimitRules.cs diff --git a/BBWYB.Server.Business/DataRepair/DataRepairBusiness.cs b/BBWYB.Server.Business/DataRepair/DataRepairBusiness.cs index 88bacda..590054a 100644 --- a/BBWYB.Server.Business/DataRepair/DataRepairBusiness.cs +++ b/BBWYB.Server.Business/DataRepair/DataRepairBusiness.cs @@ -27,7 +27,8 @@ namespace BBWYB.Server.Business private OP_PlatformClientFactory opPlatformClientFactory; private PP_PlatformClientFactory pp_PlatformClientFactory; private RestApiService restApiService; - public DataRepairBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, KuaiDi100Manager kuaiDi100Manager, PurchaseSchemeBusiness purchaseSchemeBusiness, PurchaseOrderBusiness purchaseOrderBusiness, FreeSqlMultiDBManager freeSqlMultiDBManager, VenderBusiness venderBusiness, OP_PlatformClientFactory opPlatformClientFactory, PP_PlatformClientFactory pp_PlatformClientFactory, RestApiService restApiService) : base(fsql, nLogManager, idGenerator) + private TimeLimitRules timeLimitRules; + public DataRepairBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, KuaiDi100Manager kuaiDi100Manager, PurchaseSchemeBusiness purchaseSchemeBusiness, PurchaseOrderBusiness purchaseOrderBusiness, FreeSqlMultiDBManager freeSqlMultiDBManager, VenderBusiness venderBusiness, OP_PlatformClientFactory opPlatformClientFactory, PP_PlatformClientFactory pp_PlatformClientFactory, RestApiService restApiService, TimeLimitRules timeLimitRules) : base(fsql, nLogManager, idGenerator) { this.kuaiDi100Manager = kuaiDi100Manager; this.purchaseSchemeBusiness = purchaseSchemeBusiness; @@ -37,6 +38,7 @@ namespace BBWYB.Server.Business this.opPlatformClientFactory = opPlatformClientFactory; this.pp_PlatformClientFactory = pp_PlatformClientFactory; this.restApiService = restApiService; + this.timeLimitRules = timeLimitRules; } @@ -278,11 +280,12 @@ namespace BBWYB.Server.Business Id = idGenerator.NewLong(), OrderId = order.Id, CreateTme = DateTime.Now, - ExpirationTime = DateTime.Now.AddDays(1), + //ExpirationTime = DateTime.Now.AddDays(1), OrderSn = order.OrderSn, Remark = "手工处理待核算", ShopId = order.ShopId, - TaskType = Enums.TimeLimitTaskType.待核算任务 + TaskType = Enums.TimeLimitTaskType.待核算任务, + ExpirationTime = timeLimitRules.CalculateExpirationTime(Enums.TimeLimitTaskType.待核算任务, DateTime.Now) }); } } diff --git a/BBWYB.Server.Business/JD/JDBusiness.cs b/BBWYB.Server.Business/JD/JDBusiness.cs index ad644c9..7987817 100644 --- a/BBWYB.Server.Business/JD/JDBusiness.cs +++ b/BBWYB.Server.Business/JD/JDBusiness.cs @@ -17,18 +17,22 @@ namespace BBWYB.Server.Business.JD private VenderBusiness venderBusiness; private DingDingBusiness dingDingBusiness; private TaskSchedulerManager taskSchedulerManager; + private TimeLimitRules timeLimitRules; + public JDBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, RestApiService restApiService, VenderBusiness venderBusiness, DingDingBusiness dingDingBusiness, - TaskSchedulerManager taskSchedulerManager) : base(fsql, nLogManager, idGenerator) + TaskSchedulerManager taskSchedulerManager, + TimeLimitRules timeLimitRules) : base(fsql, nLogManager, idGenerator) { this.restApiService = restApiService; this.venderBusiness = venderBusiness; this.dingDingBusiness = dingDingBusiness; this.taskSchedulerManager = taskSchedulerManager; + this.timeLimitRules = timeLimitRules; } public ApiResponse> GetJDInStoreOrderDetailList(string sourceShopName, IList poOrderNos) @@ -71,7 +75,7 @@ namespace BBWYB.Server.Business.JD var checkTaskList = fsql.Select().Where(x => x.IsChecked == false).ToList(); if (checkTaskList.Count() == 0) return; - + orderIds = checkTaskList.Select(x => x.OrderId).ToList(); var timelimitTaskList = fsql.Select().Where(t => orderIds.Contains(t.OrderId) && t.TaskType == Enums.TimeLimitTaskType.待核算任务).ToList(); @@ -200,7 +204,8 @@ namespace BBWYB.Server.Business.JD OrderSn = checkTask.OrderSn, ShopId = checkTask.ShopId, TaskType = Enums.TimeLimitTaskType.待核算任务, - ExpirationTime = DateTime.Now.AddDays(1) + ExpirationTime = timeLimitRules.CalculateExpirationTime(Enums.TimeLimitTaskType.待核算任务, DateTime.Now) + //ExpirationTime = DateTime.Now.AddDays(1) }; insertTimeLimitTaskList.Add(t); } diff --git a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs index 73b108c..47f8727 100644 --- a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs +++ b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs @@ -38,6 +38,7 @@ namespace BBWYB.Server.Business private Lazy opPlatformClientFactoryLazy; private Lazy venderBusinessLazy; private Lazy purchaseSchemeBusinessLazy; + private Lazy timeLimitRulesLazy; private PP_PlatformClientFactory ppPlatformClientFactory => pplatformClientFactoryLazy.Value; private TaskSchedulerManager taskSchedulerManager => taskSchedulerManagerLazy.Value; @@ -54,6 +55,8 @@ namespace BBWYB.Server.Business private PurchaseSchemeBusiness purchaseSchemeBusiness => purchaseSchemeBusinessLazy.Value; + private TimeLimitRules timeLimitRules => timeLimitRulesLazy.Value; + private IList cantPurchaseOrderStateList; public PurchaseOrderBusiness(IFreeSql fsql, @@ -73,6 +76,7 @@ namespace BBWYB.Server.Business opPlatformClientFactoryLazy = new Lazy(() => serviceProvider.GetService()); venderBusinessLazy = new Lazy(() => serviceProvider.GetService()); purchaseSchemeBusinessLazy = new Lazy(() => serviceProvider.GetService()); + timeLimitRulesLazy = new Lazy(() => serviceProvider.GetService()); cantPurchaseOrderStateList = new List() { Enums.OrderState.已取消, @@ -2835,7 +2839,8 @@ namespace BBWYB.Server.Business OrderSn = order.OrderSn, ShopId = order.ShopId, TaskType = Enums.TimeLimitTaskType.待核算任务, - ExpirationTime = DateTime.Now.AddDays(1) + ExpirationTime = timeLimitRules.CalculateExpirationTime(Enums.TimeLimitTaskType.待核算任务, DateTime.Now) + //ExpirationTime = DateTime.Now.AddDays(1) }; insertTimeLimitTaskList.Add(t); } diff --git a/BBWYB.Server.Business/QiKuManager.cs b/BBWYB.Server.Business/QiKuManager.cs index 3382f4c..cfd9399 100644 --- a/BBWYB.Server.Business/QiKuManager.cs +++ b/BBWYB.Server.Business/QiKuManager.cs @@ -19,10 +19,14 @@ namespace BBWYB.Server.Business private Lazy dingDingBusinessLazy; private Lazy venderBusinessLazy; + private Lazy timeLimitRulesLazy; private DingDingBusiness dingDingBusiness => dingDingBusinessLazy.Value; + private VenderBusiness venderBusiness => venderBusinessLazy.Value; + private TimeLimitRules timeLimitRules => timeLimitRulesLazy.Value; + public QiKuManager(RestApiService restApiService, IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, IServiceProvider serviceProvider) : base(fsql, nLogManager, idGenerator) { this.restApiService = restApiService; @@ -33,6 +37,7 @@ namespace BBWYB.Server.Business }; this.dingDingBusinessLazy = new Lazy(() => serviceProvider.GetService()); this.venderBusinessLazy = new Lazy(() => serviceProvider.GetService()); + this.timeLimitRulesLazy = new Lazy(() => serviceProvider.GetService()); } public void PublishQikuReceiveInfo(string orderId, @@ -103,14 +108,14 @@ namespace BBWYB.Server.Business } //推送齐库 - var publishResult = restApiService.SendRequest("http://qiku.qiyue666.com", - "/Api/PackPurchaseTask/UpdateAvailabilityState", - new - { - availability = isSignAll ? 0 : 1, - orderId = osku.OrderId, - skuId = osku.BelongSkuId - }, null, HttpMethod.Post); + var publishResult = restApiService.SendRequest("http://qiku.qiyue666.com", + "/Api/PackPurchaseTask/UpdateAvailabilityState", + new + { + availability = isSignAll ? 0 : 1, + orderId = osku.OrderId, + skuId = osku.BelongSkuId + }, null, HttpMethod.Post); if (publishResult.StatusCode != System.Net.HttpStatusCode.OK) throw new Exception(publishResult.Content); } @@ -179,7 +184,7 @@ namespace BBWYB.Server.Business OrderSn = order.OrderSn, ShopId = order.ShopId, TaskType = Enums.TimeLimitTaskType.合格证拟定任务, - ExpirationTime = DateTime.Now.AddDays(1), + ExpirationTime = timeLimitRules.CalculateExpirationTime(Enums.TimeLimitTaskType.合格证拟定任务, DateTime.Now) //DateTime.Now.AddDays(1), }; insertTimeLimitTaskList.Add(t); } @@ -256,12 +261,13 @@ namespace BBWYB.Server.Business SkuId = orderSku.SkuId, OrderSn = order.OrderSn, ShopId = order.ShopId, - TaskType = Enums.TimeLimitTaskType.合格证补充任务 + TaskType = Enums.TimeLimitTaskType.合格证补充任务, + ExpirationTime = timeLimitRules.CalculateExpirationTime(Enums.TimeLimitTaskType.合格证补充任务, DateTime.Now) //DateTime.Now.AddHours(2) }; - if (DateTime.Now.Hour < 16) - t.ExpirationTime = DateTime.Now.AddHours(2); - else - t.ExpirationTime = DateTime.Now.Date.AddDays(1).AddHours(13); + //if (DateTime.Now.Hour < 16) + // t.ExpirationTime = DateTime.Now.AddHours(2); + //else + // t.ExpirationTime = DateTime.Now.Date.AddDays(1).AddHours(13); insertTimeLimitTask = fsql.Insert(t); #region 发送钉钉通知 diff --git a/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs b/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs index f85dd4d..fd16504 100644 --- a/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs +++ b/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs @@ -18,8 +18,9 @@ namespace BBWYB.Server.Business.Sync private VenderBusiness venderBusiness; private TaskSchedulerManager taskSchedulerManager; private List timeLimitTaskTypes; + private TimeLimitRules timeLimitRules; - public OrderSyncBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, OP_PlatformClientFactory opPlatformClientFactory, VenderBusiness venderBusiness, TaskSchedulerManager taskSchedulerManager) : base(fsql, nLogManager, idGenerator) + public OrderSyncBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, OP_PlatformClientFactory opPlatformClientFactory, VenderBusiness venderBusiness, TaskSchedulerManager taskSchedulerManager, TimeLimitRules timeLimitRules) : base(fsql, nLogManager, idGenerator) { this.opPlatformClientFactory = opPlatformClientFactory; this.venderBusiness = venderBusiness; @@ -29,6 +30,7 @@ namespace BBWYB.Server.Business.Sync Enums.TimeLimitTaskType.采购任务, Enums.TimeLimitTaskType.待议价任务 }; + this.timeLimitRules = timeLimitRules; } public void AutoOrderSync() @@ -430,12 +432,13 @@ namespace BBWYB.Server.Business.Sync { Id = idGenerator.NewLong(), CreateTme = DateTime.Now, - ExpirationTime = DateTime.Now.AddDays(isFirst ? 2 : 1), + //ExpirationTime = DateTime.Now.AddDays(isFirst ? 2 : 1), + ExpirationTime = timeLimitRules.CalculateExpirationTime(Enums.TimeLimitTaskType.待议价任务, DateTime.Now.AddDays(isFirst ? 1 : 0)), OrderId = o.OrderId, OrderSn = o.OrderSn, ShopId = shopId, SkuId = osku.SkuId, - TaskType = Enums.TimeLimitTaskType.待议价任务 + //TaskType = Enums.TimeLimitTaskType.待议价任务 }); } #endregion @@ -544,7 +547,7 @@ namespace BBWYB.Server.Business.Sync SkuId = osku.SkuId, TaskType = Enums.TimeLimitTaskType.采购任务, ShopId = shopId, - ExpirationTime = CalculationPurcashTimeLimitTaskExpirationTime(order.PayTime.Value), + ExpirationTime = timeLimitRules.CalculateExpirationTime(Enums.TimeLimitTaskType.采购任务, order.PayTime.Value), PayTime = order.PayTime }).ToList(); if (waitInserTimeLimitTasks != null && waitInserTimeLimitTasks.Count() > 0) diff --git a/BBWYB.Server.Business/TimeLimitTask/TimeLimitRules.cs b/BBWYB.Server.Business/TimeLimitTask/TimeLimitRules.cs new file mode 100644 index 0000000..5518d36 --- /dev/null +++ b/BBWYB.Server.Business/TimeLimitTask/TimeLimitRules.cs @@ -0,0 +1,168 @@ +using BBWYB.Common.Models; +using BBWYB.Server.Model; + +namespace BBWYB.Server.Business +{ + public class TimeLimitRules : IDenpendency + { + /// + /// 计算到期时间算法字典 + /// + private IDictionary> calculateExpirationTimeAlgorithmDictionary; + + public TimeLimitRules() + { + calculateExpirationTimeAlgorithmDictionary = new Dictionary>() + { + { Enums.TimeLimitTaskType.采购任务, CalculateExpirationTimeFor8WorkHour }, + { Enums.TimeLimitTaskType.合格证拟定任务, CalculateExpirationTimeFor8WorkHour }, + { Enums.TimeLimitTaskType.合格证补充任务, CalculateExpirationTimeFor2WorkHour } + }; + } + + /// + /// 计算到期时间 + /// + /// 任务类型 + /// 起点计算时间 + /// + public DateTime CalculateExpirationTime(Enums.TimeLimitTaskType timeLimitTaskType, DateTime startTime) + { + return calculateExpirationTimeAlgorithmDictionary[timeLimitTaskType](startTime); + } + + /// + /// 计算需要追加的天数,周六追加2天,周日追加1天 + /// + /// + /// + private int CalculateAddDay(DayOfWeek dayOfWeek) + { + if (dayOfWeek == DayOfWeek.Saturday) + return 2; + return 1; + } + + /// + /// 8小时工作时计算到期时间 + /// + /// 起点时间 + /// + private DateTime CalculateExpirationTimeFor8WorkHour(DateTime startTime) + { + int addDay = 0, addHour = 0, addSeconds = 0; + //先确定是否为周日 + if (startTime.DayOfWeek == DayOfWeek.Sunday) + { + addDay = 1; + addHour = 18; + } + else + { + if (startTime.Hour < 9) + addHour = 18; + else if (startTime.Hour >= 9 && startTime.Hour < 12) + { + //计算从起点时间的9点开始到当前时间的时差 + var timeSpan = DateTime.Now - startTime.Date.AddHours(9); + if (timeSpan.TotalMinutes <= 5) + { + //从9点开始小于5分钟以内,以当天18点结束 + addHour = 18; + } + else + { + addDay = CalculateAddDay(startTime.DayOfWeek); + addHour = 9; + addSeconds = (int)timeSpan.TotalSeconds; + } + } + else if (startTime.Hour >= 12 && startTime.Hour < 13) + { + //下一个工作日的12点结束 + addDay = CalculateAddDay(startTime.DayOfWeek); + addHour = 12; + } + else if (startTime.Hour >= 13 && startTime.Hour < 18) + { + var timeSpan = DateTime.Now - startTime.Date.AddHours(13); + //到下一个工作日的当前时间结束 + addDay = CalculateAddDay(startTime.DayOfWeek); + addHour = 13; + addSeconds = (int)timeSpan.TotalSeconds; + + } + else if (startTime.Hour >= 18) + { + //下一个工作日的18点结束 + addDay = CalculateAddDay(startTime.DayOfWeek); + addHour = 18; + } + } + return startTime.Date.AddDays(addDay).AddHours(addHour).AddSeconds(addSeconds); + } + + /// + /// 2小时工作时计算到期时间 + /// + /// 起点时间 + /// + private DateTime CalculateExpirationTimeFor2WorkHour(DateTime startTime) + { + int addDay = 0, addHour = 0, addSeconds = 0; + //先确定是否为周日 + if (startTime.DayOfWeek == DayOfWeek.Sunday) + { + addDay = 1; + addHour = 11; + } + else + { + if (startTime.Hour < 9) + addHour = 11; + else if (startTime.Hour >= 9 && startTime.Hour < 12) + { + //计算从起点时间的9点开始到当前时间的时差 + var timeSpan = DateTime.Now - startTime.Date.AddHours(9); + if (timeSpan.TotalHours <= 1) + { + addHour = 11; + addSeconds = (int)timeSpan.TotalSeconds; + } + else + { + addHour = 13; + addSeconds = 7200 - (int)timeSpan.TotalSeconds; + } + } + else if (startTime.Hour >= 12 && startTime.Hour < 13) + { + addHour = 15; + } + else if (startTime.Hour >= 13 && startTime.Hour < 18) + { + var timeSpan = DateTime.Now - startTime.Date.AddHours(13); + + if (timeSpan.TotalHours <= 3) + { + addHour = startTime.Hour + 2; + addSeconds = startTime.Minute * 60 + startTime.Second; + } + else + { + addDay = CalculateAddDay(startTime.DayOfWeek); + addHour = 9; + addSeconds = Convert.ToInt32(7200 - (startTime - startTime.Date.AddHours(15)).TotalSeconds); + } + } + else if (startTime.Hour >= 18) + { + //下一个工作日的18点结束 + addDay = CalculateAddDay(startTime.DayOfWeek); + addHour = 11; + } + } + return startTime.Date.AddDays(addDay).AddHours(addHour).AddSeconds(addSeconds); + } + } +} diff --git a/BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs b/BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs index 78225b4..9f16e05 100644 --- a/BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs +++ b/BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs @@ -11,7 +11,9 @@ namespace BBWYB.Server.Business { private VenderBusiness venderBusiness; private List hgzTaskTypeList; - public TimeLimitTaskBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, VenderBusiness venderBusiness) : base(fsql, nLogManager, idGenerator) + private TimeLimitRules timeLimitRules; + + public TimeLimitTaskBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, VenderBusiness venderBusiness, TimeLimitRules timeLimitRules) : base(fsql, nLogManager, idGenerator) { this.venderBusiness = venderBusiness; hgzTaskTypeList = new List() @@ -19,6 +21,7 @@ namespace BBWYB.Server.Business Enums.TimeLimitTaskType.合格证拟定任务, Enums.TimeLimitTaskType.合格证补充任务 }; + this.timeLimitRules = timeLimitRules; } public void CheckTask() { @@ -50,7 +53,8 @@ namespace BBWYB.Server.Business OrderSn = o.OrderSn, ShopId = o.ShopId, TaskType = Enums.TimeLimitTaskType.待核算任务, - ExpirationTime = DateTime.Now.AddDays(1), + ExpirationTime = timeLimitRules.CalculateExpirationTime(Enums.TimeLimitTaskType.待核算任务, DateTime.Now) + //ExpirationTime = DateTime.Now.AddDays(1), Remark = "RepairOrderComputationTask" }).ToList();