|
|
@ -5,6 +5,7 @@ using BBWYB.Server.Model.Db; |
|
|
|
using BBWYB.Server.Model.Db.BBWY; |
|
|
|
using BBWYB.Server.Model.Dto; |
|
|
|
using FreeSql; |
|
|
|
using Newtonsoft.Json; |
|
|
|
using Yitter.IdGenerator; |
|
|
|
|
|
|
|
namespace BBWYB.Server.Business |
|
|
@ -12,9 +13,14 @@ namespace BBWYB.Server.Business |
|
|
|
public class SkuOptimizationBusiness : BaseBusiness, IDenpendency |
|
|
|
{ |
|
|
|
private FreeSqlMultiDBManager fsqlManager; |
|
|
|
public SkuOptimizationBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, FreeSqlMultiDBManager fsqlManager) : base(fsql, nLogManager, idGenerator) |
|
|
|
private VenderBusiness venderBusiness; |
|
|
|
private TimeLimitRules timeLimitRules; |
|
|
|
|
|
|
|
public SkuOptimizationBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, FreeSqlMultiDBManager fsqlManager, VenderBusiness venderBusiness, TimeLimitRules timeLimitRules) : base(fsql, nLogManager, idGenerator) |
|
|
|
{ |
|
|
|
this.fsqlManager = fsqlManager; |
|
|
|
this.venderBusiness = venderBusiness; |
|
|
|
this.timeLimitRules = timeLimitRules; |
|
|
|
} |
|
|
|
|
|
|
|
public Enums.TriggerOptimizationReason? GetOptimizationReason(SpuTotalSaleInfo s) |
|
|
@ -32,6 +38,8 @@ namespace BBWYB.Server.Business |
|
|
|
|
|
|
|
public void LKInventoryAlertNotification(BatchLKInventoryAlertRequest request) |
|
|
|
{ |
|
|
|
nLogManager.Default().Info($"LKInventoryAlertNotification {JsonConvert.SerializeObject(request)}"); |
|
|
|
|
|
|
|
#region 确定JDSKU对应的拳探SKU和拳探SPU
|
|
|
|
var jdSkuIdList = request.Items.Select(x => x.Sku).Distinct().ToList(); |
|
|
|
|
|
|
@ -59,6 +67,27 @@ namespace BBWYB.Server.Business |
|
|
|
qtSkuIdList.Contains(t.SkuId)) |
|
|
|
.ToList(); |
|
|
|
|
|
|
|
|
|
|
|
//优化历史
|
|
|
|
var dbSkuOptimizationHistoryList = fsql.Select<SkuOptimizationHistory>() |
|
|
|
.Where(s1 => s1.ShopId == request.ShopId && qtSkuIdList.Contains(s1.SkuId)) |
|
|
|
.GroupBy(s1 => s1.SkuId) |
|
|
|
.WithTempQuery(g => new { MaxId = g.Max(g.Value.Id) }) |
|
|
|
.From<SkuOptimizationHistory>() |
|
|
|
.InnerJoin((s1, s2) => s1.MaxId == s2.Id) |
|
|
|
.ToList((s1, s2) => s2); |
|
|
|
|
|
|
|
|
|
|
|
#region DB Operation
|
|
|
|
var insertSkuOptimizationTaskList = new List<SkuOptimizationTask>(); |
|
|
|
var insertSkuOptimizationChildTaskList = new List<SkuOptimizationChildTask>(); |
|
|
|
var insertTimeLimitTaskList = new List<TimeLimitTask>(); |
|
|
|
#endregion
|
|
|
|
|
|
|
|
var belongShop = venderBusiness.GetShopList(request.ShopId).FirstOrDefault(); |
|
|
|
if (belongShop == null) |
|
|
|
throw new BusinessException("店铺不存在"); |
|
|
|
|
|
|
|
foreach (var reqItem in request.Items) |
|
|
|
{ |
|
|
|
var qtsku = jdqtskuList.FirstOrDefault(x => x.SkuId == reqItem.Sku); |
|
|
@ -73,7 +102,7 @@ namespace BBWYB.Server.Business |
|
|
|
if (productSku == null) |
|
|
|
continue; |
|
|
|
|
|
|
|
var spuTotalInfo = spuTotalInfoList.FirstOrDefault(psi=>psi.ProductId == productSku.ProductId); //spu销量
|
|
|
|
var spuTotalInfo = spuTotalInfoList.FirstOrDefault(psi => psi.ProductId == productSku.ProductId); //spu销量
|
|
|
|
if (spuTotalInfo == null) |
|
|
|
continue; |
|
|
|
|
|
|
@ -81,8 +110,76 @@ namespace BBWYB.Server.Business |
|
|
|
if (reason == null) |
|
|
|
continue; |
|
|
|
|
|
|
|
var skuOptimizationHistory = dbSkuOptimizationHistoryList.FirstOrDefault(h => h.SkuId == qtskuId); |
|
|
|
|
|
|
|
#region 创建待议价任务
|
|
|
|
var skuOptimizationTask = new SkuOptimizationTask() |
|
|
|
{ |
|
|
|
Id = idGenerator.NewLong(), |
|
|
|
BelongShopName = belongShop.ShopName, |
|
|
|
ShopId = productSku.ShopId, |
|
|
|
CompletionTime = null, |
|
|
|
CreateTime = DateTime.Now, |
|
|
|
IsOptimizationCompleted = false, |
|
|
|
IsPurchasementCompleted = false, |
|
|
|
JDSkuId = reqItem.Sku, |
|
|
|
PreItemCount = reqItem.PreItemCount, |
|
|
|
ProductId = productSku.ProductId, |
|
|
|
SafeWarningRemainingDay = reqItem.SafeWarningRemainingDay, |
|
|
|
SkuId = qtskuId, |
|
|
|
TriggerOptimizationReason = reason, |
|
|
|
LastOptimizationRatio = skuOptimizationHistory?.OptimizationRatio ?? 0M, |
|
|
|
LastPurchasePrice = skuOptimizationHistory?.CurrentPurchasePrice, |
|
|
|
PrePurchasedAmount = (skuOptimizationHistory?.CurrentPurchasePrice ?? 0M) * reqItem.PreItemCount |
|
|
|
}; |
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region 创建待优化子任务
|
|
|
|
{ |
|
|
|
var yijiagroups = venderBusiness.GetYiJiaGroup(); |
|
|
|
foreach (var department in yijiagroups) |
|
|
|
{ |
|
|
|
var skuOptimizationChildTask = new SkuOptimizationChildTask() |
|
|
|
{ |
|
|
|
Id = idGenerator.NewLong(), |
|
|
|
BelongTeamId = department.Id, |
|
|
|
BelongTeamName = department.DepartmentName, |
|
|
|
CompletionTime = null, |
|
|
|
IsOptimizationCompleted = false, |
|
|
|
OptimizationTaskId = skuOptimizationTask.Id |
|
|
|
}; |
|
|
|
insertSkuOptimizationChildTaskList.Add(skuOptimizationChildTask); |
|
|
|
} |
|
|
|
} |
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region 创建待优化限时任务
|
|
|
|
insertTimeLimitTaskList.Add(new TimeLimitTask() |
|
|
|
{ |
|
|
|
Id = idGenerator.NewLong(), |
|
|
|
CreateTme = DateTime.Now, |
|
|
|
//ExpirationTime = DateTime.Now.AddDays(isFirst ? 2 : 1),
|
|
|
|
ExpirationTime = timeLimitRules.CalculateExpirationTime(Enums.TimeLimitTaskType.待议价任务, DateTime.Now.AddDays(reason == Enums.TriggerOptimizationReason.首次采购 ? 1 : 0)), |
|
|
|
//OrderId = o.OrderId,
|
|
|
|
//OrderSn = o.OrderSn,
|
|
|
|
ShopId = productSku.ShopId, |
|
|
|
SkuId = qtskuId, |
|
|
|
TaskType = Enums.TimeLimitTaskType.待议价任务, |
|
|
|
TaskId = skuOptimizationTask.Id, |
|
|
|
Remark = reason.ToString() |
|
|
|
}); |
|
|
|
#endregion
|
|
|
|
} |
|
|
|
|
|
|
|
fsql.Transaction(() => |
|
|
|
{ |
|
|
|
if (insertSkuOptimizationTaskList.Count() > 0) |
|
|
|
fsql.Insert(insertSkuOptimizationTaskList).ExecuteAffrows(); |
|
|
|
if (insertSkuOptimizationChildTaskList.Count() > 0) |
|
|
|
fsql.Insert(insertSkuOptimizationChildTaskList).ExecuteAffrows(); |
|
|
|
if (insertTimeLimitTaskList.Count() > 0) |
|
|
|
fsql.Insert(insertTimeLimitTaskList).ExecuteAffrows(); |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|