Browse Source

良库通知对接 70%

liangku_skuoptimazation
shanji 1 year ago
parent
commit
811d2714a9
  1. 191
      BBWYB.Server.Business/SkuOptimization/SkuOptimizationBusiness.cs

191
BBWYB.Server.Business/SkuOptimization/SkuOptimizationBusiness.cs

@ -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);

Loading…
Cancel
Save