From 5c1e8a331909ffd7feb302ff72fbc3eab2e3b825 Mon Sep 17 00:00:00 2001 From: shanji <18996038927@163.com> Date: Tue, 9 Apr 2024 00:49:04 +0800 Subject: [PATCH] =?UTF-8?q?1)=20=E5=BE=85=E4=BC=98=E5=8C=96=E9=99=90?= =?UTF-8?q?=E6=97=B6=E4=BB=BB=E5=8A=A1=E5=88=B0=E6=9C=9F=E6=9C=80=E5=A4=9A?= =?UTF-8?q?=E9=87=8D=E5=90=AF=E4=B8=A4=E6=AC=A1=EF=BC=8C=E7=AC=AC=E4=B8=89?= =?UTF-8?q?=E6=AC=A1=E5=BC=80=E5=A7=8B=E5=85=81=E8=AE=B8=E6=97=A0=E9=99=90?= =?UTF-8?q?=E8=B6=85=E6=97=B6=E4=B8=8D=E5=86=8D=E9=87=8D=E5=90=AF=202)=201?= =?UTF-8?q?688=E6=B6=88=E6=81=AF=E9=80=9A=E7=9F=A5=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=B9=B6=E5=8F=91=E6=8E=A7=E5=88=B6,=20?= =?UTF-8?q?=E5=8D=95=E4=BD=8D=E6=97=B6=E9=97=B4=E5=86=85(1min)=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E6=B6=88=E6=81=AF=E4=B8=80=E7=AC=94=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=EF=BC=8C=E5=8F=AA=E5=85=81=E8=AE=B8=E6=89=A7=E8=A1=8C=E4=B8=80?= =?UTF-8?q?=E6=AC=A1=E3=80=82=E4=BD=9C=E7=94=A8=E8=8C=83=E5=9B=B4=E5=90=AB?= =?UTF-8?q?[=E4=BB=98=E6=AC=BE/=E6=94=B9=E4=BB=B7/=E5=8F=91=E8=B4=A7/?= =?UTF-8?q?=E9=83=A8=E5=88=86=E5=8F=91=E8=B4=A7]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PurchaseOrder/PurchaseOrderBusiness.cs | 94 +++++++++++++++---- .../SkuOptimization/OptimizationBusiness.cs | 28 +++++- .../TimeLimitTask/TimeLimitTaskBusiness.cs | 5 - .../Db/SpuOptimization/Spuoptimizationtask.cs | 6 ++ 4 files changed, 109 insertions(+), 24 deletions(-) diff --git a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs index 9718937..5d1a801 100644 --- a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs +++ b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs @@ -10,6 +10,7 @@ using BBWYB.Server.Model.Db.Mds; using BBWYB.Server.Model.Db.MDS; using BBWYB.Server.Model.Dto; using FreeSql; +using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -39,6 +40,7 @@ namespace BBWYB.Server.Business private Lazy venderBusinessLazy; private Lazy purchaseSchemeBusinessLazy; private Lazy timeLimitRulesLazy; + private Lazy memoryCacheLazy; private PP_PlatformClientFactory ppPlatformClientFactory => pplatformClientFactoryLazy.Value; private TaskSchedulerManager taskSchedulerManager => taskSchedulerManagerLazy.Value; @@ -57,8 +59,12 @@ namespace BBWYB.Server.Business private TimeLimitRules timeLimitRules => timeLimitRulesLazy.Value; + private IMemoryCache memoryCache => memoryCacheLazy.Value; + private IList cantPurchaseOrderStateList; + private TimeSpan _1688ConcurrentKeyTimeSpan; + public PurchaseOrderBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, @@ -77,12 +83,14 @@ namespace BBWYB.Server.Business venderBusinessLazy = new Lazy(() => serviceProvider.GetService()); purchaseSchemeBusinessLazy = new Lazy(() => serviceProvider.GetService()); timeLimitRulesLazy = new Lazy(() => serviceProvider.GetService()); + memoryCacheLazy = new Lazy(() => serviceProvider.GetService()); cantPurchaseOrderStateList = new List() { Enums.OrderState.已取消, Enums.OrderState.已完成, Enums.OrderState.待付款 }; + _1688ConcurrentKeyTimeSpan = new TimeSpan(0, 1, 0); } /// @@ -2346,25 +2354,56 @@ namespace BBWYB.Server.Business //} #region 1688CallBack + private string Get1688ConcurrentKey(JObject j) + { + var type = j.Value("type").ToUpper(); + var poId = string.Empty; + switch (type) + { + case "ORDER_BUYER_VIEW_PART_PART_SENDGOODS": //部分发货 + case "ORDER_BUYER_VIEW_ANNOUNCE_SENDGOODS": //发货 + case "ORDER_BUYER_VIEW_ORDER_PRICE_MODIFY": //订单改价 + case "LOGISTICS_BUYER_VIEW_TRACE": //物流变更 + case "ORDER_BUYER_VIEW_ORDER_PAY": //支付 + poId = j["data"].Value("orderId"); + break; + default: + break; + } + if (string.IsNullOrEmpty(poId)) + return string.Empty; + + return $"{type}_{poId}"; + } + public void CallbackFrom1688(string jsonStr) { nLogManager.Default().Info(jsonStr); var jObject = JObject.Parse(jsonStr); + var _1688ConcurrentKey = Get1688ConcurrentKey(jObject); + + if (!string.IsNullOrEmpty(_1688ConcurrentKey)) + { + if (memoryCache.TryGetValue(_1688ConcurrentKey, out _)) + return;//并发key存在,不允执行 + memoryCache.Set(_1688ConcurrentKey, _1688ConcurrentKey, _1688ConcurrentKeyTimeSpan); + } + var type = jObject.Value("type").ToUpper(); switch (type) { case "ORDER_BUYER_VIEW_PART_PART_SENDGOODS": //部分发货 case "ORDER_BUYER_VIEW_ANNOUNCE_SENDGOODS": //发货 - DeliveryCallbackFrom1688(jObject); + DeliveryCallbackFrom1688(jObject, _1688ConcurrentKey); break; case "ORDER_BUYER_VIEW_ORDER_PRICE_MODIFY": - OrderPriceModificationCallbackFrom1688(jObject); //订单改价 + OrderPriceModificationCallbackFrom1688(jObject, _1688ConcurrentKey); //订单改价 break; case "LOGISTICS_BUYER_VIEW_TRACE": // LogisticsUpdateCallbackFrom1688(jObject);//1688物流信息变更 break; case "ORDER_BUYER_VIEW_ORDER_PAY": - OrderPayFrom1688(jObject); + OrderPayFrom1688(jObject, _1688ConcurrentKey); break; default: break; @@ -2375,17 +2414,21 @@ namespace BBWYB.Server.Business /// 1688发货回调 /// /// - private void DeliveryCallbackFrom1688(JObject jObject) + /// 并发key + private void DeliveryCallbackFrom1688(JObject jObject, string _1688ConcurrentKey) { var purchaseOrderId = jObject["data"].Value("orderId"); - Task.Factory.StartNew(() => DeliveryCallbackFrom1688(purchaseOrderId), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); + Task.Factory.StartNew(() => DeliveryCallbackFrom1688(purchaseOrderId, _1688ConcurrentKey), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); } /// /// 1688发货回调 /// - /// 采购单 - private void DeliveryCallbackFrom1688(string purchaseOrderId) + /// + /// + /// + /// + private void DeliveryCallbackFrom1688(string purchaseOrderId, string _1688ConcurrentKey) { string orderId = string.Empty; long? shopId = null; @@ -2623,22 +2666,28 @@ namespace BBWYB.Server.Business { nLogManager.Default().Error(ex, $"DeliveryCallback 回调平台1688,订单号{orderId},采购单号{purchaseOrderId},执行进度[{currentProgress}],采购单物流信息:{wayBillNoResponseInfo}"); } + finally + { + if (!string.IsNullOrEmpty(_1688ConcurrentKey)) + memoryCache.Remove(_1688ConcurrentKey); + } } /// /// 1688订单改价回调 /// /// - private void OrderPriceModificationCallbackFrom1688(JObject jObject) + /// + private void OrderPriceModificationCallbackFrom1688(JObject jObject, string _1688ConcurrentKey) { var purchaseOrderId = jObject["data"].Value("orderId"); - Task.Factory.StartNew(() => OrderPriceModificationCallback(purchaseOrderId, Enums.Platform.阿里巴巴), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); + Task.Factory.StartNew(() => OrderPriceModificationCallback(purchaseOrderId, Enums.Platform.阿里巴巴, _1688ConcurrentKey), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); } - private void OrderPayFrom1688(JObject jObject) + private void OrderPayFrom1688(JObject jObject, string _1688ConcurrentKey) { var purchaseOrderId = jObject["data"].Value("orderId"); - Task.Factory.StartNew(() => OrderPayCallback(purchaseOrderId, Enums.Platform.阿里巴巴), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); + Task.Factory.StartNew(() => OrderPayCallback(purchaseOrderId, Enums.Platform.阿里巴巴, _1688ConcurrentKey), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); } #endregion @@ -2648,14 +2697,21 @@ namespace BBWYB.Server.Business /// /// /// - private void OrderPriceModificationCallback(string purchaseOrderId, Enums.Platform callbackPlatform) + /// + private void OrderPriceModificationCallback(string purchaseOrderId, Enums.Platform callbackPlatform, string concurrentKey) { - OnSomeOnePurchaseOrderChanged(purchaseOrderId, true); + OnSomeOnePurchaseOrderChanged(purchaseOrderId, true, concurrentKey); } - private void OrderPayCallback(string purchaseOrderId, Enums.Platform callbackPlatform) + /// + /// 订单支付回调 + /// + /// + /// + /// + private void OrderPayCallback(string purchaseOrderId, Enums.Platform callbackPlatform, string concurrentKey) { - OnSomeOnePurchaseOrderChanged(purchaseOrderId, false); + OnSomeOnePurchaseOrderChanged(purchaseOrderId, false, concurrentKey); } public void KuaiDi100Publish(string param) @@ -2927,7 +2983,8 @@ namespace BBWYB.Server.Business /// /// 采购单Id /// 当不需要触发订单改价时是否继续走流程 - public void OnSomeOnePurchaseOrderChanged(string purchaseOrderId, bool keepRunWhenNoEditOrderPirce) + /// 并发key + public void OnSomeOnePurchaseOrderChanged(string purchaseOrderId, bool keepRunWhenNoEditOrderPirce, string concurrentKey) { bool isEditOrderPrice = true; try @@ -3182,6 +3239,11 @@ namespace BBWYB.Server.Business { nLogManager.Default().Error(ex, $"OrderPriceModificationCallback 采购单号{purchaseOrderId}"); } + finally + { + if (!string.IsNullOrEmpty(concurrentKey)) + memoryCache.Remove(concurrentKey); + } } private void SendDingDing(string content) diff --git a/BBWYB.Server.Business/SkuOptimization/OptimizationBusiness.cs b/BBWYB.Server.Business/SkuOptimization/OptimizationBusiness.cs index a980dce..65ecade 100644 --- a/BBWYB.Server.Business/SkuOptimization/OptimizationBusiness.cs +++ b/BBWYB.Server.Business/SkuOptimization/OptimizationBusiness.cs @@ -706,10 +706,10 @@ namespace BBWYB.Server.Business { //已超时 select = select.Where(t => t.IsOptimizationCompleted == true) - .Where(t=> fsql.Select() + .Where(t => fsql.Select() .Where(sbt => sbt.IsOptimizationCompleted == false && - sbt.SpuOptimizationTaskId == t.Id ) - .WhereIf(!string.IsNullOrEmpty(barginTeamId),sbt=>sbt.BelongTeamId == barginTeamId) + sbt.SpuOptimizationTaskId == t.Id) + .WhereIf(!string.IsNullOrEmpty(barginTeamId), sbt => sbt.BelongTeamId == barginTeamId) .Any()); } } @@ -903,6 +903,7 @@ namespace BBWYB.Server.Business IUpdate updateSpuTask = null; IUpdate updateSpuSaleInfo = null; IUpdate updateCompetitiveTenderTask = null; + IUpdate updateTimeLimitTask = null; var spuOptimizationBargainTeamTaskList = fsql.Select() .Where(sbt => sbt.SpuOptimizationTaskId == taskId) @@ -960,12 +961,33 @@ namespace BBWYB.Server.Business .Set(ct => ct.IsWin, true); #endregion } + else + { + //重启任务 + if (spuOptimizationTask.ReStartTimes < 2) + { + var timeLimitTask = fsql.Select().Where(t => t.TaskType == Enums.TimeLimitTaskType.待议价任务 && + t.TaskId == spuOptimizationTask.Id).ToOne(); + if (timeLimitTask != null) + { + var expirationTime = timeLimitRules.CalculateExpirationTime(Enums.TimeLimitTaskType.待议价任务, DateTime.Now); + updateTimeLimitTask = fsql.Update(timeLimitTask.Id) + .Set(t => t.ExpirationTime, expirationTime) + .Set(t => t.CompletionTime, null) + .Set(t => t.IsTimely, null); + } + spuOptimizationTask.ReStartTimes++; + updateSpuTask = fsql.Update(spuOptimizationTask.Id) + .Set(t => t.ReStartTimes, spuOptimizationTask.ReStartTimes); + } + } fsql.Transaction(() => { updateSpuTask?.ExecuteAffrows(); updateSpuSaleInfo?.ExecuteAffrows(); updateCompetitiveTenderTask?.ExecuteAffrows(); + updateTimeLimitTask?.ExecuteAffrows(); }); } catch (Exception ex) diff --git a/BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs b/BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs index bf98724..e217ff8 100644 --- a/BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs +++ b/BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs @@ -38,11 +38,6 @@ namespace BBWYB.Server.Business } public void CheckTask() { - //fsql.Update().Set(t => t.IsTimely, false) - // .Where(t => t.CompletionTime == null) - // .Where(t => t.ExpirationTime < DateTime.Now) - // .ExecuteAffrows(); - var timeoutTaskList = fsql.Select().Where(t => t.CompletionTime == null && t.ExpirationTime < DateTime.Now).ToList(); if (timeoutTaskList.Count() > 0) { diff --git a/BBWYB.Server.Model/Db/SpuOptimization/Spuoptimizationtask.cs b/BBWYB.Server.Model/Db/SpuOptimization/Spuoptimizationtask.cs index 97c0020..1c5c598 100644 --- a/BBWYB.Server.Model/Db/SpuOptimization/Spuoptimizationtask.cs +++ b/BBWYB.Server.Model/Db/SpuOptimization/Spuoptimizationtask.cs @@ -87,6 +87,12 @@ namespace BBWYB.Server.Model.Db [Column(DbType = "int", MapType = typeof(int?))] public Enums.TriggerOptimizationReason? TriggerOptimizationReason { get; set; } + /// + /// 重启次数 + /// + [Column(DbType = "int")] + public int ReStartTimes { get; set; } = 0; + } }