Browse Source

1) 待优化限时任务到期最多重启两次,第三次开始允许无限超时不再重启

2) 1688消息通知回调增加并发控制, 单位时间内(1min)一个消息一笔订单,只允许执行一次。作用范围含[付款/改价/发货/部分发货]
master
shanji 1 year ago
parent
commit
5c1e8a3319
  1. 94
      BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs
  2. 28
      BBWYB.Server.Business/SkuOptimization/OptimizationBusiness.cs
  3. 5
      BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs
  4. 6
      BBWYB.Server.Model/Db/SpuOptimization/Spuoptimizationtask.cs

94
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<VenderBusiness> venderBusinessLazy;
private Lazy<PurchaseSchemeBusiness> purchaseSchemeBusinessLazy;
private Lazy<TimeLimitRules> timeLimitRulesLazy;
private Lazy<IMemoryCache> 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<Enums.OrderState> cantPurchaseOrderStateList;
private TimeSpan _1688ConcurrentKeyTimeSpan;
public PurchaseOrderBusiness(IFreeSql fsql,
NLogManager nLogManager,
IIdGenerator idGenerator,
@ -77,12 +83,14 @@ namespace BBWYB.Server.Business
venderBusinessLazy = new Lazy<VenderBusiness>(() => serviceProvider.GetService<VenderBusiness>());
purchaseSchemeBusinessLazy = new Lazy<PurchaseSchemeBusiness>(() => serviceProvider.GetService<PurchaseSchemeBusiness>());
timeLimitRulesLazy = new Lazy<TimeLimitRules>(() => serviceProvider.GetService<TimeLimitRules>());
memoryCacheLazy = new Lazy<IMemoryCache>(() => serviceProvider.GetService<IMemoryCache>());
cantPurchaseOrderStateList = new List<Enums.OrderState>()
{
Enums.OrderState.,
Enums.OrderState.,
Enums.OrderState.
};
_1688ConcurrentKeyTimeSpan = new TimeSpan(0, 1, 0);
}
/// <summary>
@ -2346,25 +2354,56 @@ namespace BBWYB.Server.Business
//}
#region 1688CallBack
private string Get1688ConcurrentKey(JObject j)
{
var type = j.Value<string>("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<string>("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<string>(_1688ConcurrentKey, out _))
return;//并发key存在,不允执行
memoryCache.Set(_1688ConcurrentKey, _1688ConcurrentKey, _1688ConcurrentKeyTimeSpan);
}
var type = jObject.Value<string>("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发货回调
/// </summary>
/// <param name="jObject"></param>
private void DeliveryCallbackFrom1688(JObject jObject)
/// <param name="_1688ConcurrentKey">并发key</param>
private void DeliveryCallbackFrom1688(JObject jObject, string _1688ConcurrentKey)
{
var purchaseOrderId = jObject["data"].Value<string>("orderId");
Task.Factory.StartNew(() => DeliveryCallbackFrom1688(purchaseOrderId), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler);
Task.Factory.StartNew(() => DeliveryCallbackFrom1688(purchaseOrderId, _1688ConcurrentKey), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler);
}
/// <summary>
/// 1688发货回调
/// </summary>
/// <param name="purchaseOrderId">采购单</param>
private void DeliveryCallbackFrom1688(string purchaseOrderId)
/// <param name="purchaseOrderId"></param>
/// <param name="_1688ConcurrentKey"></param>
/// <exception cref="Exception"></exception>
/// <exception cref="BusinessException"></exception>
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);
}
}
/// <summary>
/// 1688订单改价回调
/// </summary>
/// <param name="jObject"></param>
private void OrderPriceModificationCallbackFrom1688(JObject jObject)
/// <param name="_1688ConcurrentKey"></param>
private void OrderPriceModificationCallbackFrom1688(JObject jObject, string _1688ConcurrentKey)
{
var purchaseOrderId = jObject["data"].Value<string>("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<string>("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
/// </summary>
/// <param name="purchaseOrderId"></param>
/// <param name="callbackPlatform"></param>
private void OrderPriceModificationCallback(string purchaseOrderId, Enums.Platform callbackPlatform)
/// <param name="concurrentKey"></param>
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)
/// <summary>
/// 订单支付回调
/// </summary>
/// <param name="purchaseOrderId"></param>
/// <param name="callbackPlatform"></param>
/// <param name="concurrentKey"></param>
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
/// </summary>
/// <param name="purchaseOrderId">采购单Id</param>
/// <param name="keepRunWhenNoEditOrderPirce">当不需要触发订单改价时是否继续走流程</param>
public void OnSomeOnePurchaseOrderChanged(string purchaseOrderId, bool keepRunWhenNoEditOrderPirce)
/// <param name="concurrentKey">并发key</param>
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)

28
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<SpuOptimizationBargainTeamTask>()
.Where(t => fsql.Select<SpuOptimizationBargainTeamTask>()
.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<SpuOptimizationTask> updateSpuTask = null;
IUpdate<SpuTotalSaleInfo> updateSpuSaleInfo = null;
IUpdate<SpuOptimizationCompetitiveTenderTask> updateCompetitiveTenderTask = null;
IUpdate<TimeLimitTask> updateTimeLimitTask = null;
var spuOptimizationBargainTeamTaskList = fsql.Select<SpuOptimizationBargainTeamTask>()
.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<TimeLimitTask>().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>(timeLimitTask.Id)
.Set(t => t.ExpirationTime, expirationTime)
.Set(t => t.CompletionTime, null)
.Set(t => t.IsTimely, null);
}
spuOptimizationTask.ReStartTimes++;
updateSpuTask = fsql.Update<SpuOptimizationTask>(spuOptimizationTask.Id)
.Set(t => t.ReStartTimes, spuOptimizationTask.ReStartTimes);
}
}
fsql.Transaction(() =>
{
updateSpuTask?.ExecuteAffrows();
updateSpuSaleInfo?.ExecuteAffrows();
updateCompetitiveTenderTask?.ExecuteAffrows();
updateTimeLimitTask?.ExecuteAffrows();
});
}
catch (Exception ex)

5
BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs

@ -38,11 +38,6 @@ namespace BBWYB.Server.Business
}
public void CheckTask()
{
//fsql.Update<TimeLimitTask>().Set(t => t.IsTimely, false)
// .Where(t => t.CompletionTime == null)
// .Where(t => t.ExpirationTime < DateTime.Now)
// .ExecuteAffrows();
var timeoutTaskList = fsql.Select<TimeLimitTask>().Where(t => t.CompletionTime == null && t.ExpirationTime < DateTime.Now).ToList();
if (timeoutTaskList.Count() > 0)
{

6
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; }
/// <summary>
/// 重启次数
/// </summary>
[Column(DbType = "int")]
public int ReStartTimes { get; set; } = 0;
}
}

Loading…
Cancel
Save