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; + } }