|
|
@ -20,19 +20,30 @@ namespace BBWY.Server.Business |
|
|
|
public class EvaluationAssistantBusiness : BasePlatformRelayBusiness, IDenpendency |
|
|
|
{ |
|
|
|
private IFreeSql fsql; |
|
|
|
|
|
|
|
private IIdGenerator idGenerator; |
|
|
|
|
|
|
|
private TaskSchedulerManager taskSchedulerManager; |
|
|
|
|
|
|
|
private VenderBusiness venderBusiness; |
|
|
|
private DingDingBusiness dingDingBusiness; |
|
|
|
private NLogManager nLogManager; |
|
|
|
private List<Enums.OrderState> validOrderStateList; |
|
|
|
|
|
|
|
public EvaluationAssistantBusiness(RestApiService restApiService, IOptions<GlobalConfig> options, YunDingBusiness yunDingBusiness, IFreeSql fsql, IIdGenerator idGenerator, TaskSchedulerManager taskSchedulerManager, VenderBusiness venderBusiness) : base(restApiService, options, yunDingBusiness) |
|
|
|
public EvaluationAssistantBusiness(RestApiService restApiService, IOptions<GlobalConfig> options, YunDingBusiness yunDingBusiness, IFreeSql fsql, IIdGenerator idGenerator, TaskSchedulerManager taskSchedulerManager, VenderBusiness venderBusiness, DingDingBusiness dingDingBusiness, NLogManager nLogManager) : base(restApiService, options, yunDingBusiness) |
|
|
|
{ |
|
|
|
this.fsql = fsql; |
|
|
|
this.idGenerator = idGenerator; |
|
|
|
this.taskSchedulerManager = taskSchedulerManager; |
|
|
|
this.venderBusiness = venderBusiness; |
|
|
|
this.dingDingBusiness = dingDingBusiness; |
|
|
|
this.nLogManager = nLogManager; |
|
|
|
validOrderStateList = new List<Enums.OrderState>() |
|
|
|
{ |
|
|
|
Enums.OrderState.待出库, |
|
|
|
Enums.OrderState.待收货, |
|
|
|
Enums.OrderState.暂停, |
|
|
|
Enums.OrderState.等待采购, |
|
|
|
Enums.OrderState.已完成, |
|
|
|
Enums.OrderState.锁定 |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
#region 赠品模板
|
|
|
@ -484,29 +495,204 @@ namespace BBWY.Server.Business |
|
|
|
} |
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#region 自动任务
|
|
|
|
|
|
|
|
public void StartMonitor(long? shopId) |
|
|
|
{ |
|
|
|
//查询店铺
|
|
|
|
var shopList = venderBusiness.GetShopList(shopId, Enums.Platform.京东); |
|
|
|
|
|
|
|
//查询正在进行的任务
|
|
|
|
var runningTaskList = fsql.Select<PromotionTask>() |
|
|
|
.WhereIf(shopId != null, pt => pt.ShopId == shopId) |
|
|
|
.Where(pt => pt.Status == Enums.PromitionTaskStatus.进行中).ToList(); |
|
|
|
|
|
|
|
if (runningTaskList == null || runningTaskList.Count() == 0) |
|
|
|
return; |
|
|
|
var runningTaskIdList = runningTaskList.Select(pt => pt.Id).ToList(); |
|
|
|
|
|
|
|
//查询订单sku
|
|
|
|
var querySkuTime = DateTime.Now.AddHours(-1); |
|
|
|
var orderSkuList = fsql.Select<OrderSku, Order>() |
|
|
|
.InnerJoin((osku, o) => osku.OrderId == o.Id) |
|
|
|
.WhereIf(shopId != null, (osku, o) => o.ShopId == shopId) |
|
|
|
.Where((osku, o) => o.StorageType != Enums.StorageType.SD && o.StorageType != null) |
|
|
|
.Where((osku, o) => validOrderStateList.Contains(o.OrderState.Value)) |
|
|
|
.Where((osku, o) => osku.Price > 0 && osku.CreateTime >= querySkuTime) |
|
|
|
.ToList((osku, o) => new OrderSku |
|
|
|
{ |
|
|
|
CreateTime = osku.CreateTime, |
|
|
|
Id = osku.Id, |
|
|
|
IsRefund = osku.IsRefund, |
|
|
|
ItemTotal = osku.ItemTotal, |
|
|
|
Logo = osku.Logo, |
|
|
|
OrderDropShippingId = osku.OrderDropShippingId, |
|
|
|
OrderId = osku.OrderId, |
|
|
|
Price = osku.Price, |
|
|
|
ProductId = osku.ProductId, |
|
|
|
SkuId = osku.SkuId, |
|
|
|
ProductNo = osku.ProductNo, |
|
|
|
Title = osku.Title, |
|
|
|
ShopId = o.ShopId |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
//查询已记录的任务进度sku
|
|
|
|
var promotionTaskSkuRecordList = fsql.Select<PromotionTaskSkuRecord>() |
|
|
|
.WhereIf(shopId != null, psr => psr.ShopId == shopId) |
|
|
|
.Where(psr => runningTaskIdList.Contains(psr.PromotionTaskId)) |
|
|
|
.Where(psr => psr.CreateTime >= querySkuTime) |
|
|
|
.ToList(); |
|
|
|
|
|
|
|
foreach (var shop in shopList) |
|
|
|
{ |
|
|
|
Task.Factory.StartNew(() => MonitorTaskCore(shop), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.JDPromotionMonitorTaskScheduler); |
|
|
|
var sId = long.Parse(shop.ShopId); |
|
|
|
|
|
|
|
var currentShopRunningTaskList = runningTaskList.Where(pt => pt.ShopId == sId).ToList(); |
|
|
|
if (currentShopRunningTaskList == null || currentShopRunningTaskList.Count() == 0) |
|
|
|
continue; |
|
|
|
|
|
|
|
var currentOrderSkuList = orderSkuList.Where(osku => osku.ShopId == sId).ToList(); |
|
|
|
if (currentOrderSkuList == null || currentOrderSkuList.Count() == 0) |
|
|
|
continue; |
|
|
|
|
|
|
|
var currentPromotionTaskSkuRecordList = promotionTaskSkuRecordList.Where(psr => psr.ShopId == sId).ToList(); |
|
|
|
|
|
|
|
Task.Factory.StartNew(() => MonitorTaskCore(shop, sId, currentShopRunningTaskList, currentOrderSkuList, currentPromotionTaskSkuRecordList), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.JDPromotionMonitorTaskScheduler); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#region 自动任务
|
|
|
|
private void MonitorTaskCore(ShopResponse shop) |
|
|
|
/// <summary>
|
|
|
|
/// 监控
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="shop"></param>
|
|
|
|
/// <param name="shopId"></param>
|
|
|
|
/// <param name="runningTaskList"></param>
|
|
|
|
/// <param name="orderSkuList"></param>
|
|
|
|
/// <param name="promotionTaskSkuRecordList"></param>
|
|
|
|
private void MonitorTaskCore(ShopResponse shop, |
|
|
|
long shopId, |
|
|
|
IList<PromotionTask> runningTaskList, |
|
|
|
IList<OrderSku> orderSkuList, |
|
|
|
IList<PromotionTaskSkuRecord> promotionTaskSkuRecordList) |
|
|
|
{ |
|
|
|
var shopId = long.Parse(shop.ShopId); |
|
|
|
var loggerName = $"库存预警-{shop.ShopName}"; |
|
|
|
List<IUpdate<PromotionTask>> updatePromotionTaskList = new List<IUpdate<PromotionTask>>(); |
|
|
|
List<PromotionTaskSkuRecord> insertPromotionTaskSkuRecordList = new List<PromotionTaskSkuRecord>(); |
|
|
|
IList<long> jobDoneTaskIdList = new List<long>(); |
|
|
|
|
|
|
|
#region 查询正在进行的任务
|
|
|
|
var runningTaskList = fsql.Select<PromotionTask>().Where(pt => pt.ShopId == shopId && pt.Status == Enums.PromitionTaskStatus.进行中).ToList(); |
|
|
|
if (runningTaskList == null || runningTaskList.Count() == 0) |
|
|
|
return; |
|
|
|
foreach (var promotionTask in runningTaskList) |
|
|
|
{ |
|
|
|
var motherSkuList = new List<string>(); |
|
|
|
if (!string.IsNullOrEmpty(promotionTask.CustomMotherSku)) |
|
|
|
motherSkuList.AddRange(promotionTask.CustomMotherSku.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)); |
|
|
|
if (!string.IsNullOrEmpty(promotionTask.MainProductSku)) |
|
|
|
motherSkuList.AddRange(promotionTask.MainProductSku.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)); |
|
|
|
|
|
|
|
var newOrderSkuList = orderSkuList.Where(osku => motherSkuList.Contains(osku.SkuId) && |
|
|
|
osku.CreateTime > promotionTask.StartTime && |
|
|
|
promotionTaskSkuRecordList.Count(psr => psr.PromotionTaskId == promotionTask.Id && |
|
|
|
psr.OrderId == osku.OrderId) == 0).ToList(); |
|
|
|
|
|
|
|
//if (newOrderSkuList.Count() == 0)
|
|
|
|
// continue;
|
|
|
|
|
|
|
|
var completedTaskCount = 0; |
|
|
|
if (newOrderSkuList.Count() > 0) |
|
|
|
{ |
|
|
|
foreach (var newOrderSku in newOrderSkuList) |
|
|
|
{ |
|
|
|
completedTaskCount += newOrderSku.ItemTotal ?? 1; |
|
|
|
insertPromotionTaskSkuRecordList.Add(new PromotionTaskSkuRecord() |
|
|
|
{ |
|
|
|
CreateTime = DateTime.Now, |
|
|
|
Id = idGenerator.NewLong(), |
|
|
|
ItemTotal = newOrderSku.ItemTotal ?? 1, |
|
|
|
OrderId = newOrderSku.OrderId, |
|
|
|
PromotionTaskId = promotionTask.Id, |
|
|
|
ShopId = shopId, |
|
|
|
SkuId = newOrderSku.SkuId |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
promotionTask.CompletedTaskCount += completedTaskCount; |
|
|
|
var isDone = promotionTask.CompletedTaskCount >= promotionTask.TaskCount || (promotionTask.EndTime != null && promotionTask.EndTime > DateTime.Now); |
|
|
|
|
|
|
|
if (completedTaskCount > 0 || isDone) |
|
|
|
{ |
|
|
|
var updatePromotionTask = fsql.Update<PromotionTask>(promotionTask.Id) |
|
|
|
.Set(pt => pt.CompletedTaskCount, promotionTask.CompletedTaskCount) |
|
|
|
.SetIf(isDone, pt => pt.Status, Enums.PromitionTaskStatus.已完成) |
|
|
|
.SetIf(isDone, pt => pt.StopTime, DateTime.Now); |
|
|
|
updatePromotionTaskList.Add(updatePromotionTask); |
|
|
|
|
|
|
|
if (isDone) |
|
|
|
{ |
|
|
|
if (promotionTask.EndTime < DateTime.Now) |
|
|
|
{ |
|
|
|
#region 提前完成任务量,暂停JD活动
|
|
|
|
{ |
|
|
|
var httpResult = restApiService.SendRequest(GetPlatformRelayAPIHost(Enums.Platform.京东), |
|
|
|
"api/platformsdk/SuspendJDPromotionTask", |
|
|
|
new SuspendDPromotionTaskRequest() |
|
|
|
{ |
|
|
|
AppKey = shop.AppKey2, |
|
|
|
AppSecret = shop.AppSecret2, |
|
|
|
AppToken = shop.AppToken2, |
|
|
|
Platform = Enums.Platform.京东, |
|
|
|
PromotionId = promotionTask.PromotionId.Value |
|
|
|
}, |
|
|
|
GetYunDingRequestHeader(), |
|
|
|
HttpMethod.Post); |
|
|
|
|
|
|
|
if (httpResult.StatusCode != System.Net.HttpStatusCode.OK) |
|
|
|
{ |
|
|
|
LogMonitorError(shop, loggerName, "自动任务-暂停京东活动", httpResult.Content); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
var response = JsonConvert.DeserializeObject<ApiResponse>(httpResult.Content); |
|
|
|
if (!response.Success) |
|
|
|
{ |
|
|
|
LogMonitorError(shop, loggerName, "自动任务-暂停京东活动", response.Msg); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
#endregion
|
|
|
|
} |
|
|
|
|
|
|
|
jobDoneTaskIdList.Add(promotionTask.Id); //记录完成任务
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
fsql.Transaction(() => |
|
|
|
{ |
|
|
|
if (updatePromotionTaskList.Count() > 0) |
|
|
|
foreach (var update in updatePromotionTaskList) |
|
|
|
update.ExecuteAffrows(); |
|
|
|
if (insertPromotionTaskSkuRecordList.Count() > 0) |
|
|
|
fsql.Insert(insertPromotionTaskSkuRecordList).ExecuteAffrows(); |
|
|
|
}); |
|
|
|
|
|
|
|
#region 开始后续任务
|
|
|
|
if (jobDoneTaskIdList.Count() > 0) |
|
|
|
{ |
|
|
|
|
|
|
|
} |
|
|
|
#endregion
|
|
|
|
} |
|
|
|
|
|
|
|
private void LogMonitorError(ShopResponse shop, string loggerName, string step, string error) |
|
|
|
{ |
|
|
|
nLogManager.GetLogger(loggerName).Error($"{step},{error}"); |
|
|
|
|
|
|
|
//send dingding
|
|
|
|
|
|
|
|
} |
|
|
|
#endregion
|
|
|
|
} |
|
|
|
} |
|
|
|