|
@ -7,6 +7,7 @@ using BBWYB.Server.Model.Db.BBWY; |
|
|
using BBWYB.Server.Model.Dto; |
|
|
using BBWYB.Server.Model.Dto; |
|
|
using FreeSql; |
|
|
using FreeSql; |
|
|
using Newtonsoft.Json; |
|
|
using Newtonsoft.Json; |
|
|
|
|
|
using Org.BouncyCastle.Tls.Crypto; |
|
|
using Yitter.IdGenerator; |
|
|
using Yitter.IdGenerator; |
|
|
|
|
|
|
|
|
namespace BBWYB.Server.Business |
|
|
namespace BBWYB.Server.Business |
|
@ -75,40 +76,208 @@ namespace BBWYB.Server.Business |
|
|
var qtSkuIdList = jdqtskuList.Select(x => x.PurchaseSkuIds).Distinct().ToList(); |
|
|
var qtSkuIdList = jdqtskuList.Select(x => x.PurchaseSkuIds).Distinct().ToList(); |
|
|
|
|
|
|
|
|
var productSkuList = fsql.Select<Model.Db.ProductSku>(qtSkuIdList).ToList(); |
|
|
var productSkuList = fsql.Select<Model.Db.ProductSku>(qtSkuIdList).ToList(); |
|
|
var productIdList = productSkuList.Select(ps => ps.ProductId).Distinct().ToList(); |
|
|
if (productSkuList.Count() == 0) |
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
var shopId = productSkuList.FirstOrDefault()?.ShopId; |
|
|
|
|
|
var productIdList = productSkuList.Select(ps => ps.ProductId).Distinct().ToList(); |
|
|
|
|
|
var productList = fsql.Select<Product>(productIdList).ToList(); |
|
|
var spuTotalInfoList = fsql.Select<SpuTotalSaleInfo>().Where(spi => productIdList.Contains(spi.ProductId)).ToList(); |
|
|
var spuTotalInfoList = fsql.Select<SpuTotalSaleInfo>().Where(spi => productIdList.Contains(spi.ProductId)).ToList(); |
|
|
#endregion
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//查询已存在未结束的优化任务
|
|
|
//查询已存在未结束的优化任务
|
|
|
var dbSkuOptimizationTaskList = fsql.Select<SkuOptimizationTask>() |
|
|
var dbSpuOptimizationTaskList = fsql.Select<SpuOptimizationTask>() |
|
|
.Where(t => t.ShopId == request.ShopId && |
|
|
.Where(t => t.ShopId == shopId && |
|
|
t.IsOptimizationCompleted == false && |
|
|
t.IsOptimizationCompleted == false && |
|
|
qtSkuIdList.Contains(t.SkuId)) |
|
|
productIdList.Contains(t.ProductId)) |
|
|
.ToList(); |
|
|
.ToList(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//优化历史
|
|
|
//优化历史
|
|
|
var dbSkuOptimizationHistoryList = fsql.Select<SkuOptimizationHistory>() |
|
|
var dbSpuOptimizationHistoryList = fsql.Select<SpuOptimizationTask>() |
|
|
.Where(s1 => s1.ShopId == request.ShopId && qtSkuIdList.Contains(s1.SkuId)) |
|
|
.Where(s1 => productIdList.Contains(s1.ProductId) && s1.IsOptimizationCompleted == true) |
|
|
.GroupBy(s1 => s1.SkuId) |
|
|
.GroupBy(s1 => s1.ProductId) |
|
|
.WithTempQuery(g => new { MaxId = g.Max(g.Value.Id) }) |
|
|
.WithTempQuery(g => new { MaxId = g.Max(g.Value.Id) }) |
|
|
.From<SkuOptimizationHistory>() |
|
|
.From<SpuOptimizationTask>() |
|
|
.InnerJoin((s1, s2) => s1.MaxId == s2.Id) |
|
|
.InnerJoin((s1, s2) => s1.MaxId == s2.Id) |
|
|
.ToList((s1, s2) => s2); |
|
|
.ToList((s1, s2) => s2); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#region DB Operation
|
|
|
#region DB Operation
|
|
|
var insertSkuOptimizationTaskList = new List<SkuOptimizationTask>(); |
|
|
List<SpuOptimizationTask> insertSpuOptimizationTaskList = new List<SpuOptimizationTask>(); |
|
|
var insertSkuOptimizationChildTaskList = new List<SkuOptimizationChildTask>(); |
|
|
List<SkuOptimizationTask> insertSkuOptimizationTaskList = new List<SkuOptimizationTask>(); |
|
|
var insertTimeLimitTaskList = new List<TimeLimitTask>(); |
|
|
List<SpuOptimizationBargainTeamTask> insertSpuOptimizationBargainTeamTaskList = new List<SpuOptimizationBargainTeamTask>(); |
|
|
|
|
|
List<SpuOptimizationCompetitiveTenderTask> insertSpuOptimizationCompetitiveTenderTaskList = new List<SpuOptimizationCompetitiveTenderTask>(); |
|
|
#endregion
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
var belongShop = venderBusiness.GetShopList(request.ShopId).FirstOrDefault(); |
|
|
var belongShop = venderBusiness.GetShopList(request.ShopId).FirstOrDefault(); |
|
|
if (belongShop == null) |
|
|
if (belongShop == null) |
|
|
throw new BusinessException("店铺不存在"); |
|
|
throw new BusinessException("店铺不存在"); |
|
|
|
|
|
|
|
|
|
|
|
foreach (var productId in productIdList) |
|
|
|
|
|
{ |
|
|
|
|
|
#region 验证
|
|
|
|
|
|
if (dbSpuOptimizationTaskList.Any(s => s.ProductId == productId)) //过滤未结束的spu任务
|
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
|
|
var spuTotalInfo = spuTotalInfoList.FirstOrDefault(psi => psi.ProductId == productId); //spu销量
|
|
|
|
|
|
if (spuTotalInfo == null) |
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
|
|
var reason = GetOptimizationReason(spuTotalInfo); //过滤不需要优化的spu
|
|
|
|
|
|
if (reason == null) |
|
|
|
|
|
continue; |
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
var skuOptimizationHistory = dbSpuOptimizationHistoryList.FirstOrDefault(h => h.ProductId == productId); //优化历史
|
|
|
|
|
|
|
|
|
|
|
|
#region qtsku - jdsku 关系匹配
|
|
|
|
|
|
var currentProductSkuList = productSkuList.Where(ps => ps.ProductId == productId && |
|
|
|
|
|
jdqtskuList.Any(x => x.PurchaseSkuIds == ps.Id)).ToList(); |
|
|
|
|
|
|
|
|
|
|
|
//拳探sku-京东sku下单关系映射表
|
|
|
|
|
|
var mappingQT_JDSKUDictionary = new Dictionary<string, string>(); |
|
|
|
|
|
foreach (var ps in currentProductSkuList) |
|
|
|
|
|
{ |
|
|
|
|
|
var jdsku = jdqtskuList.FirstOrDefault(x => x.PurchaseSkuIds == ps.Id)?.SkuId; |
|
|
|
|
|
if (string.IsNullOrEmpty(jdsku)) |
|
|
|
|
|
continue; |
|
|
|
|
|
if (!mappingQT_JDSKUDictionary.ContainsKey(ps.Id)) |
|
|
|
|
|
mappingQT_JDSKUDictionary.TryAdd(ps.Id, jdsku); |
|
|
|
|
|
} |
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region 读取JDSKU预估金额
|
|
|
|
|
|
var jdskus = mappingQT_JDSKUDictionary.Values.ToList(); |
|
|
|
|
|
var jdskuRecentCostList = fsqlManager.BBWYCfsql.Select<SkuRecentCost>(jdskus).ToList(); |
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region 创建SPU优化任务
|
|
|
|
|
|
var spuOptimizationTask = new SpuOptimizationTask() |
|
|
|
|
|
{ |
|
|
|
|
|
Id = idGenerator.NewLong(), |
|
|
|
|
|
BelongShopName = belongShop.ShopName, |
|
|
|
|
|
CompletionTime = null, |
|
|
|
|
|
CreateTime = DateTime.Now, |
|
|
|
|
|
IsOptimizationCompleted = false, |
|
|
|
|
|
LastOptimizationTime = null, |
|
|
|
|
|
ProductId = productId, |
|
|
|
|
|
ShopId = shopId, |
|
|
|
|
|
ProductTitle = productList.FirstOrDefault(p => p.Id == productId)?.ProductName, |
|
|
|
|
|
TriggerOptimizationReason = reason, |
|
|
|
|
|
PreSkuCount = jdskus.Count(), |
|
|
|
|
|
PreItemCount = 0, |
|
|
|
|
|
PrePurchaseAmount = 0M |
|
|
|
|
|
}; |
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region 创建SKU优化任务
|
|
|
|
|
|
foreach (var sku in mappingQT_JDSKUDictionary.Keys) |
|
|
|
|
|
{ |
|
|
|
|
|
mappingQT_JDSKUDictionary.TryGetValue(sku, out string jdSkuId); |
|
|
|
|
|
var requestSkuItem = request.Items.FirstOrDefault(x => x.Sku == jdSkuId); |
|
|
|
|
|
if (requestSkuItem == null) |
|
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
|
|
var preItemCount = requestSkuItem.PreItemCount; |
|
|
|
|
|
var prePurchaseAmount = 0M; |
|
|
|
|
|
if (!string.IsNullOrEmpty(jdSkuId)) |
|
|
|
|
|
{ |
|
|
|
|
|
var jdSkuRecentCost = jdskuRecentCostList.FirstOrDefault(x => x.SkuId == jdSkuId); |
|
|
|
|
|
if (jdSkuRecentCost != null) |
|
|
|
|
|
{ |
|
|
|
|
|
prePurchaseAmount = (jdSkuRecentCost.SingleSkuAmount ?? 0M + |
|
|
|
|
|
jdSkuRecentCost.SingleFirstFreight ?? 0M + |
|
|
|
|
|
jdSkuRecentCost.SingleFreight ?? 0M + |
|
|
|
|
|
jdSkuRecentCost.SingleDeliveryFreight ?? 0M + |
|
|
|
|
|
jdSkuRecentCost.SingleConsumableAmount ?? 0M + |
|
|
|
|
|
jdSkuRecentCost.SingleInStorageAmount ?? 0M + |
|
|
|
|
|
jdSkuRecentCost.SingleOutStorageAmount ?? 0M + |
|
|
|
|
|
jdSkuRecentCost.SinglePackagingLaborAmount ?? 0M + |
|
|
|
|
|
jdSkuRecentCost.SingleOperationAmount ?? 0M) * preItemCount; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
var skuOptimizationTask = new SkuOptimizationTask() |
|
|
|
|
|
{ |
|
|
|
|
|
Id = idGenerator.NewLong(), |
|
|
|
|
|
CreateTime = DateTime.Now, |
|
|
|
|
|
JDSkuId = jdSkuId, |
|
|
|
|
|
PreItemCount = preItemCount, |
|
|
|
|
|
SkuId = sku, |
|
|
|
|
|
SpuOptimizationTaskId = spuOptimizationTask.Id, |
|
|
|
|
|
PrePurchaseAmount = prePurchaseAmount |
|
|
|
|
|
}; |
|
|
|
|
|
insertSkuOptimizationTaskList.Add(skuOptimizationTask); |
|
|
|
|
|
|
|
|
|
|
|
//累计spu优化任务信息
|
|
|
|
|
|
spuOptimizationTask.PreItemCount += preItemCount; |
|
|
|
|
|
spuOptimizationTask.PrePurchaseAmount += prePurchaseAmount; |
|
|
|
|
|
} |
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region 创建SPU优化议价组任务
|
|
|
|
|
|
foreach (var department in bargainTeamList) |
|
|
|
|
|
{ |
|
|
|
|
|
var spuOptimizationBargainTeamTask = new SpuOptimizationBargainTeamTask() |
|
|
|
|
|
{ |
|
|
|
|
|
Id = idGenerator.NewLong(), |
|
|
|
|
|
BelongTeamId = department.Id, |
|
|
|
|
|
BelongTeamName = department.DepartmentName, |
|
|
|
|
|
CompletionTime = null, |
|
|
|
|
|
IsOptimizationCompleted = false, |
|
|
|
|
|
SpuOptimizationTaskId = spuOptimizationTask.Id |
|
|
|
|
|
}; |
|
|
|
|
|
insertSpuOptimizationBargainTeamTaskList.Add(spuOptimizationBargainTeamTask); |
|
|
|
|
|
|
|
|
|
|
|
#region 创建采购方案竞标任务
|
|
|
|
|
|
var waitJoinSchemeList = waitToCompetitiveTenderSchemeList.Where(ps => ps.BelongBargainTeamId == department.Id && |
|
|
|
|
|
skuIdList.Contains(ps.SkuId)) |
|
|
|
|
|
.ToList(); |
|
|
|
|
|
if (waitJoinSchemeList.Count() > 0) |
|
|
|
|
|
{ |
|
|
|
|
|
insertSpuOptimizationCompetitiveTenderTaskList.AddRange(waitJoinSchemeList.Select(ps => new SpuOptimizationCompetitiveTenderTask() |
|
|
|
|
|
{ |
|
|
|
|
|
Id = idGenerator.NewLong(), |
|
|
|
|
|
BargainTeamId = ps.BelongBargainTeamId, |
|
|
|
|
|
CreateTime = DateTime.Now, |
|
|
|
|
|
IsUpdateQuotedPrice = false, |
|
|
|
|
|
SchemeGroupId = ps.SchemeGroupId, |
|
|
|
|
|
SchemeId = ps.Id, |
|
|
|
|
|
SkuId = ps.SkuId, |
|
|
|
|
|
SpuOptimizationBargainTeamTaskId = spuOptimizationBargainTeamTask.Id, |
|
|
|
|
|
SpuOptimizationTaskId = spuOptimizationTask.Id |
|
|
|
|
|
})); |
|
|
|
|
|
} |
|
|
|
|
|
#endregion
|
|
|
|
|
|
} |
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region 创建优化限时任务
|
|
|
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
//判断sku是否首次采购
|
|
|
|
|
|
var isFirst = !dbSpuTotalSaleInfoList.Any(s => s.ProductId == spuGroup.Key); |
|
|
|
|
|
|
|
|
|
|
|
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(isFirst ? 1 : 0)), |
|
|
|
|
|
//OrderId = o.OrderId,
|
|
|
|
|
|
//OrderSn = o.OrderSn,
|
|
|
|
|
|
ShopId = shopId, |
|
|
|
|
|
//SkuId = waitCheckOrderSku.SkuId,
|
|
|
|
|
|
TaskType = Enums.TimeLimitTaskType.待议价任务, |
|
|
|
|
|
TaskId = spuOptimizationTask.Id, |
|
|
|
|
|
Remark = "首次采购限时任务" |
|
|
|
|
|
}); |
|
|
|
|
|
} |
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
foreach (var reqItem in request.Items) |
|
|
foreach (var reqItem in request.Items) |
|
|
{ |
|
|
{ |
|
|
var qtsku = jdqtskuList.FirstOrDefault(x => x.SkuId == reqItem.Sku); |
|
|
var qtsku = jdqtskuList.FirstOrDefault(x => x.SkuId == reqItem.Sku); |
|
|