diff --git a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs index 1554790..7c8cd19 100644 --- a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs +++ b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs @@ -332,6 +332,7 @@ namespace BBWYB.Server.Business List> updatePurchaserList = new List>(); List insertSkuHistoryPurchaserRelationList = new List(); List insertSkuOptimizationHistoryList = new List(); + List updateSkuOptimizationPurhcasementByIdList = new List(); List notifyQikuPackSchemeParamList = null; if (dbOrder.IntoStoreType == Enums.IntoStoreType.发回齐越) @@ -686,9 +687,17 @@ namespace BBWYB.Server.Business { //本批次在线采购的订单sku集合 var allBelongSkuIdList = request.CargoParamGroupList.SelectMany(cg => cg.CargoParamList.Select(c => c.BelongSkuId)).Distinct().ToList(); - var optimizationSkuIdList = orderSkus.Where(osku => osku.IsOptimizationCompleted == 1 && allBelongSkuIdList.Contains(osku.SkuId)) - .Select(osku => osku.SkuId) - .ToList(); + //var optimizationSkuIdList = orderSkus.Where(osku => osku.IsOptimizationCompleted == 1 && allBelongSkuIdList.Contains(osku.SkuId)) + // .Select(osku => osku.SkuId) + // .ToList(); + + var optimizationTaskList = fsql.Select() + .Where(s => allBelongSkuIdList.Contains(s.SkuId) && + s.IsOptimizationCompleted == true && + s.IsPurchasementCompleted == false) + .ToList(); + + var optimizationSkuIdList = optimizationTaskList.Select(s => s.SkuId).Distinct().ToList(); if (optimizationSkuIdList.Count() > 0) { //优化历史 @@ -725,6 +734,10 @@ namespace BBWYB.Server.Business TriggerOptimizationReason = orderSku.TriggerOptimizationReason }; insertSkuOptimizationHistoryList.Add(newOptimizationHistory); + + var skuOptimizationTask = optimizationTaskList.FirstOrDefault(x => x.SkuId == optimizationSkuId); + if (skuOptimizationTask != null) + updateSkuOptimizationPurhcasementByIdList.Add(skuOptimizationTask.Id); } } } @@ -777,6 +790,9 @@ namespace BBWYB.Server.Business foreach (var update in updateOrderSkuCostList) update.ExecuteAffrows(); } + if (updateSkuOptimizationPurhcasementByIdList.Count() > 0) + fsql.Update(updateSkuOptimizationPurhcasementByIdList).Set(s => s.IsPurchasementCompleted, true).ExecuteAffrows(); + //if (updatePurchaserList.Count() > 0) //{ // foreach (var update in updatePurchaserList) diff --git a/BBWYB.Server.Business/SkuOptimization/SkuOptimizationBusiness.cs b/BBWYB.Server.Business/SkuOptimization/SkuOptimizationBusiness.cs index 3308f91..7a953d0 100644 --- a/BBWYB.Server.Business/SkuOptimization/SkuOptimizationBusiness.cs +++ b/BBWYB.Server.Business/SkuOptimization/SkuOptimizationBusiness.cs @@ -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() + .Where(s1 => s1.ShopId == request.ShopId && qtSkuIdList.Contains(s1.SkuId)) + .GroupBy(s1 => s1.SkuId) + .WithTempQuery(g => new { MaxId = g.Max(g.Value.Id) }) + .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(); + #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(); + }); } diff --git a/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs b/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs index 4a86044..6801477 100644 --- a/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs +++ b/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs @@ -440,16 +440,18 @@ namespace BBWYB.Server.Business.Sync PreItemCount = 0, PrePurchasedAmount = 0, IsOptimizationCompleted = false, + IsPurchasementCompleted = false, CreateTime = DateTime.Now, SafeWarningRemainingDay = 0, - UsePrePurchasedPrice = 0, TriggerOptimizationReason = Enums.TriggerOptimizationReason.首次采购, SkuId = waitCheckOrderSku.SkuId, ShopId = shopId, ProductId = waitCheckOrderSku.ProductId, BelongShopName = sourceShopName, CompletionTime = null, - JDSkuId = belongSkus?.FirstOrDefault(j => j.Value("SkuId") == waitCheckOrderSku.SkuId)?.Value("BelongSkuId") ?? string.Empty + JDSkuId = belongSkus?.FirstOrDefault(j => j.Value("SkuId") == waitCheckOrderSku.SkuId)?.Value("BelongSkuId") ?? string.Empty, + LastOptimizationRatio = 0, + LastPurchasePrice = 0 }; insertSkuOptimizationTaskList.Add(skuOptimizationTask); @@ -499,38 +501,38 @@ namespace BBWYB.Server.Business.Sync } } - #region 更新订单sku优化标记 - var allSkuOptimizationTaskList = dbSkuOptimizationTaskList.Union(insertSkuOptimizationTaskList); - foreach (var waitCheckOrder in waitToCheckSkuSaleOrderList) - { - foreach (var waitCheckOrderSku in waitCheckOrder.OrderSkuList) - { - var task = allSkuOptimizationTaskList.FirstOrDefault(t => t.SkuId == waitCheckOrderSku.SkuId); - if (task != null) - { - #region 更新sku优化标记 - var oskuId = long.Parse(waitCheckOrderSku.SkuId); - var insertOrderSku = insertOrderSkuList.FirstOrDefault(s => s.Id == oskuId); - if (insertOrderSku != null) - { - insertOrderSku.IsNeedOptimization = 1; - insertOrderSku.TriggerOptimizationReason = task.TriggerOptimizationReason; - } - else - { - //updateOrderSkuIdList_OptimizationFlag.Add(oskuId); - if (!updateOSkuOptimizationFlagByReasonGroups.TryGetValue(task.TriggerOptimizationReason.Value, out var updateOSkuOptimizationFlagByReasonList)) - { - updateOSkuOptimizationFlagByReasonList = new List(); - updateOSkuOptimizationFlagByReasonGroups.Add(task.TriggerOptimizationReason.Value, updateOSkuOptimizationFlagByReasonList); - } - updateOSkuOptimizationFlagByReasonList.Add(oskuId); - } - #endregion - } - } - } - #endregion + //#region 更新订单sku优化标记 + //var allSkuOptimizationTaskList = dbSkuOptimizationTaskList.Union(insertSkuOptimizationTaskList); + //foreach (var waitCheckOrder in waitToCheckSkuSaleOrderList) + //{ + // foreach (var waitCheckOrderSku in waitCheckOrder.OrderSkuList) + // { + // var task = allSkuOptimizationTaskList.FirstOrDefault(t => t.SkuId == waitCheckOrderSku.SkuId); + // if (task != null) + // { + // #region 更新sku优化标记 + // var oskuId = long.Parse(waitCheckOrderSku.SkuId); + // var insertOrderSku = insertOrderSkuList.FirstOrDefault(s => s.Id == oskuId); + // if (insertOrderSku != null) + // { + // insertOrderSku.IsNeedOptimization = 1; + // insertOrderSku.TriggerOptimizationReason = task.TriggerOptimizationReason; + // } + // else + // { + // //updateOrderSkuIdList_OptimizationFlag.Add(oskuId); + // if (!updateOSkuOptimizationFlagByReasonGroups.TryGetValue(task.TriggerOptimizationReason.Value, out var updateOSkuOptimizationFlagByReasonList)) + // { + // updateOSkuOptimizationFlagByReasonList = new List(); + // updateOSkuOptimizationFlagByReasonGroups.Add(task.TriggerOptimizationReason.Value, updateOSkuOptimizationFlagByReasonList); + // } + // updateOSkuOptimizationFlagByReasonList.Add(oskuId); + // } + // #endregion + // } + // } + //} + //#endregion } } #endregion @@ -588,19 +590,19 @@ namespace BBWYB.Server.Business.Sync //if (updateOrderSkuIdList_OptimizationFlag.Count() > 0) // fsql.Update(updateOrderSkuIdList_OptimizationFlag).Set(osku => osku.IsNeedOptimization, 1).ExecuteAffrows(); - if (updateOSkuOptimizationFlagByReasonGroups.Keys.Count() > 0) - { - foreach (var triggerOptimizationReason in updateOSkuOptimizationFlagByReasonGroups.Keys) - { - var updateOSkuListOptimizationFlagList = updateOSkuOptimizationFlagByReasonGroups[triggerOptimizationReason]; - if (updateOSkuListOptimizationFlagList != null && updateOSkuListOptimizationFlagList.Count > 0) - { - fsql.Update(updateOSkuListOptimizationFlagList).Set(osku => osku.IsNeedOptimization, 1) - .Set(osku => osku.TriggerOptimizationReason, triggerOptimizationReason) - .ExecuteAffrows(); - } - } - } + //if (updateOSkuOptimizationFlagByReasonGroups.Keys.Count() > 0) + //{ + // foreach (var triggerOptimizationReason in updateOSkuOptimizationFlagByReasonGroups.Keys) + // { + // var updateOSkuListOptimizationFlagList = updateOSkuOptimizationFlagByReasonGroups[triggerOptimizationReason]; + // if (updateOSkuListOptimizationFlagList != null && updateOSkuListOptimizationFlagList.Count > 0) + // { + // fsql.Update(updateOSkuListOptimizationFlagList).Set(osku => osku.IsNeedOptimization, 1) + // .Set(osku => osku.TriggerOptimizationReason, triggerOptimizationReason) + // .ExecuteAffrows(); + // } + // } + //} foreach (var key in deductionSkuCountDictionary.Keys) fsql.Update(key).Set(s => s.ItemCount - deductionSkuCountDictionary[key]).ExecuteAffrows(); diff --git a/BBWYB.Server.Model/Db/Product/Skuoptimizationtask.cs b/BBWYB.Server.Model/Db/Product/Skuoptimizationtask.cs index fa32c28..5c413c1 100644 --- a/BBWYB.Server.Model/Db/Product/Skuoptimizationtask.cs +++ b/BBWYB.Server.Model/Db/Product/Skuoptimizationtask.cs @@ -18,8 +18,16 @@ namespace BBWYB.Server.Model.Db [Column(DbType = "datetime")] public DateTime? CreateTime { get; set; } + /// + /// 是否完成优化 + /// public bool? IsOptimizationCompleted { get; set; } = false; + /// + /// 是否完成采购 + /// + public bool? IsPurchasementCompleted { get; set; } = false; + [Column(StringLength = 50)] public string JDSkuId { get; set; } @@ -62,12 +70,18 @@ namespace BBWYB.Server.Model.Db [Column(DbType = "int", MapType = typeof(int))] public Enums.TriggerOptimizationReason? TriggerOptimizationReason { get; set; } = 0; + /// - /// 进行预估的采购成本 + /// 上次优化率 /// [Column(DbType = "decimal(18,2)")] - public decimal? UsePrePurchasedPrice { get; set; } = 0.00M; + public decimal? LastOptimizationRatio { get; set; } = 0.00M; + /// + /// 上次采购单价 + /// + [Column(DbType = "decimal(18,2)")] + public decimal? LastPurchasePrice { get; set; } = 0.00M; } }