diff --git a/BBWYB.Server.Business/SkuOptimization/SkuOptimizationBusiness.cs b/BBWYB.Server.Business/SkuOptimization/SkuOptimizationBusiness.cs index c48cf22..d82d899 100644 --- a/BBWYB.Server.Business/SkuOptimization/SkuOptimizationBusiness.cs +++ b/BBWYB.Server.Business/SkuOptimization/SkuOptimizationBusiness.cs @@ -7,6 +7,7 @@ using BBWYB.Server.Model.Db.BBWY; using BBWYB.Server.Model.Dto; using FreeSql; using Newtonsoft.Json; +using Org.BouncyCastle.Tls.Crypto; using Yitter.IdGenerator; namespace BBWYB.Server.Business @@ -75,40 +76,208 @@ namespace BBWYB.Server.Business var qtSkuIdList = jdqtskuList.Select(x => x.PurchaseSkuIds).Distinct().ToList(); var productSkuList = fsql.Select(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(productIdList).ToList(); var spuTotalInfoList = fsql.Select().Where(spi => productIdList.Contains(spi.ProductId)).ToList(); #endregion //查询已存在未结束的优化任务 - var dbSkuOptimizationTaskList = fsql.Select() - .Where(t => t.ShopId == request.ShopId && + var dbSpuOptimizationTaskList = fsql.Select() + .Where(t => t.ShopId == shopId && t.IsOptimizationCompleted == false && - qtSkuIdList.Contains(t.SkuId)) + productIdList.Contains(t.ProductId)) .ToList(); //优化历史 - var dbSkuOptimizationHistoryList = fsql.Select() - .Where(s1 => s1.ShopId == request.ShopId && qtSkuIdList.Contains(s1.SkuId)) - .GroupBy(s1 => s1.SkuId) + var dbSpuOptimizationHistoryList = fsql.Select() + .Where(s1 => productIdList.Contains(s1.ProductId) && s1.IsOptimizationCompleted == true) + .GroupBy(s1 => s1.ProductId) .WithTempQuery(g => new { MaxId = g.Max(g.Value.Id) }) - .From() + .From() .InnerJoin((s1, s2) => s1.MaxId == s2.Id) .ToList((s1, s2) => s2); #region DB Operation - var insertSkuOptimizationTaskList = new List(); - var insertSkuOptimizationChildTaskList = new List(); - var insertTimeLimitTaskList = new List(); + List insertSpuOptimizationTaskList = new List(); + List insertSkuOptimizationTaskList = new List(); + List insertSpuOptimizationBargainTeamTaskList = new List(); + List insertSpuOptimizationCompetitiveTenderTaskList = new List(); #endregion var belongShop = venderBusiness.GetShopList(request.ShopId).FirstOrDefault(); if (belongShop == null) 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(); + 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(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) { var qtsku = jdqtskuList.FirstOrDefault(x => x.SkuId == reqItem.Sku);