diff --git a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs index 3a7effa..10e787c 100644 --- a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs +++ b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs @@ -322,6 +322,7 @@ namespace BBWYB.Server.Business List insertOrderPurchaseInfos = new List(); List insertOrderPurchaseSkuInfos = new List(); List> updatePurchaseSchemeList = new List>(); + List> updatePssList = new List>(); List insertOrderPurchaseRelationInfoList = new List(); List updatePurchaseTimeLimitTaskOrderSkuList = new List(); List> updatePurchaserList = new List>(); @@ -506,29 +507,57 @@ namespace BBWYB.Server.Business #endregion } - #region 更新采购方案 + #region 更新采购方案/配件 { var allCargoParamList = new List(); - request.CargoParamGroupList.ForEach(x => allCargoParamList.AddRange(x.CargoParamList)); - var cargoParamGroupsBySchemeList = allCargoParamList.GroupBy(c => c.SchemeId); - foreach (var cargoParamGroupsByScheme in cargoParamGroupsBySchemeList) - { - var schemeId = cargoParamGroupsByScheme.Key; - var skuId = cargoParamGroupsByScheme.FirstOrDefault().BelongSkuId; - - var lastPurchasePriceCost = cargoParamGroupsByScheme.Sum(cargoParam => createdPurchaseOrderItemList.Where(x => x.SkuId == cargoParam.SkuId) - .Select(x => x.Price * (cargoParam.PurchaseRatio ?? 1)) - .DefaultIfEmpty(0M) - .First()); - var purchasedAmount = insertOrderCostDetails.Where(ocd => ocd.SkuId == skuId).Sum(ocd => ocd.SkuAmount); - var update = fsql.Update(schemeId).Set(ps => ps.LastPurchaseTime, DateTime.Now) - .Set(ps => ps.LastPurchasePriceCost, lastPurchasePriceCost) - .Set(ps => ps.PurchasedCount + 1) - .Set(ps => ps.PurchasedAmount + purchasedAmount); - updatePurchaseSchemeList.Add(update); + #region 更新采购方案 + { + var cargoParamGroupsBySchemeList = allCargoParamList.GroupBy(c => c.SchemeId); + foreach (var cargoParamGroupsByScheme in cargoParamGroupsBySchemeList) + { + var schemeId = cargoParamGroupsByScheme.Key; + var skuId = cargoParamGroupsByScheme.FirstOrDefault().BelongSkuId; + var skuItemCount = orderSkus.FirstOrDefault(osku => osku.SkuId == skuId)?.ItemTotal ?? 0; + + //var lastPurchasePriceCost = cargoParamGroupsByScheme.Sum(cargoParam => createdPurchaseOrderItemList.Where(x => x.SkuId == cargoParam.SkuId) + // .Select(x => x.Price * (cargoParam.PurchaseRatio ?? 1)) + // .DefaultIfEmpty(0M) + // .First()); + + var lastPurchasePriceCost = cargoParamGroupsByScheme.Sum(cargoParam => + { + return (createdPurchaseOrderItemList.FirstOrDefault(x => x.SkuId == cargoParam.SkuId)?.Price ?? 0) * (cargoParam.PurchaseRatio ?? 1); + }); + + + var purchasedAmount = insertOrderCostDetails.Where(ocd => ocd.SkuId == skuId).Sum(ocd => ocd.SkuAmount); + var update = fsql.Update(schemeId).Set(ps => ps.LastPurchaseTime, DateTime.Now) + .Set(ps => ps.LastPurchasePriceCost, lastPurchasePriceCost) + .Set(ps => ps.PurchasedCount + 1) + .Set(ps => ps.PurchasedItemCount + skuItemCount) + .Set(ps => ps.PurchasedAmount + purchasedAmount); + updatePurchaseSchemeList.Add(update); + } + } + #endregion + + #region 更新采购配件 + { + foreach (var cargoParam in allCargoParamList) + { + var createOrderItem = createdPurchaseOrderItemList.FirstOrDefault(x => x.SkuId == cargoParam.SkuId); + if (createOrderItem != null) + { + var update = fsql.Update() + .Set(pss => pss.LastPurchasePriceCost, createOrderItem.Price) + .Where(pss => pss.SkuId == cargoParam.SkuId && pss.SkuPurchaseSchemeId == cargoParam.SchemeId); + updatePssList.Add(update); + } + } } + #endregion } #endregion @@ -727,6 +756,11 @@ namespace BBWYB.Server.Business foreach (var update in updatePurchaseSchemeList) update.ExecuteAffrows(); } + if (updatePssList.Count() > 0) + { + foreach (var update in updatePssList) + update.ExecuteAffrows(); + } fsql.Update(request.OrderId).Set(o => o.OrderState, dbOrder.OrderState) .SetIf(!string.IsNullOrEmpty(request.Remark), o => o.PurchaseRemark, request.Remark) .Set(o => o.IsPurchased, true) diff --git a/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs b/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs index 55ddaa1..2c979da 100644 --- a/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs +++ b/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs @@ -123,7 +123,8 @@ namespace BBWYB.Server.Business.Sync #region DB Operation List insertOrderList = new List(); List insertOrderSkuList = new List(); - List updateOrderSkuIdList_OptimizationFlag = new List(); + //List updateOrderSkuIdList_OptimizationFlag = new List(); + Dictionary> updateOSkuOptimizationFlagByReasonGroups = new Dictionary>(); List insertOrderConsigneeList = new List(); List insertTimeLimitTaskList = new List(); List deleteTimeLimitTaskOrderIdList = new List(); @@ -375,11 +376,14 @@ namespace BBWYB.Server.Business.Sync { var optimizationSpuSaleList = dbSpuTotalSaleInfoList.Union(insertSpuTotalSaleInfoList).Where(s => { - if (s.LastOptimizationItemCount == 0 && s.ItemCount >= 20) - return true; - if (s.LastOptimizationItemCount != 0 && s.ItemCount * 1.0 / s.LastOptimizationItemCount >= 2) - return true; - return false; + //if (insertSpuTotalSaleInfoList.Any(x => x.ProductId == s.ProductId)) + // return true; //首次触发 + //if (s.LastOptimizationItemCount == 0 && s.ItemCount >= 20) + // return true; //销量大于20 + //if (s.LastOptimizationItemCount != 0 && s.ItemCount * 1.0 / s.LastOptimizationItemCount >= 2) + // return true; + //return false; + return GetOptimizationReason(s, insertSpuTotalSaleInfoList) != null; }); if (optimizationSpuSaleList.Count() > 0) { @@ -393,13 +397,27 @@ namespace BBWYB.Server.Business.Sync if (osku.ProductId != spuSale.ProductId) continue; + var triggerOptimizationReason = GetOptimizationReason(spuSale, insertSpuTotalSaleInfoList); + #region 更新sku优化标记 var oskuId = long.Parse(osku.Id); var insertOrderSku = insertOrderSkuList.FirstOrDefault(s => s.Id == oskuId); if (insertOrderSku != null) + { insertOrderSku.IsNeedOptimization = 1; + insertOrderSku.TriggerOptimizationReason = triggerOptimizationReason; + } else - updateOrderSkuIdList_OptimizationFlag.Add(oskuId); + { + //updateOrderSkuIdList_OptimizationFlag.Add(oskuId); + if (!updateOSkuOptimizationFlagByReasonGroups.TryGetValue(triggerOptimizationReason.Value, out var updateOSkuOptimizationFlagByReasonList)) + { + updateOSkuOptimizationFlagByReasonList = new List(); + updateOSkuOptimizationFlagByReasonGroups.Add(triggerOptimizationReason.Value, updateOSkuOptimizationFlagByReasonList); + } + updateOSkuOptimizationFlagByReasonList.Add(oskuId); + } + #endregion #region 创建待议价任务 @@ -474,8 +492,21 @@ namespace BBWYB.Server.Business.Sync .ExecuteAffrows(); } - if (updateOrderSkuIdList_OptimizationFlag.Count() > 0) - fsql.Update(updateOrderSkuIdList_OptimizationFlag).Set(osku => osku.IsNeedOptimization, 1).ExecuteAffrows(); + //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(); + } + } + } foreach (var key in deductionSkuCountDictionary.Keys) fsql.Update(key).Set(s => s.ItemCount - deductionSkuCountDictionary[key]).ExecuteAffrows(); @@ -576,5 +607,16 @@ namespace BBWYB.Server.Business.Sync return Enums.OrderState.已完成; return null; } + + public Enums.TriggerOptimizationReason? GetOptimizationReason(SpuTotalSaleInfo s, List insertSpuTotalSaleInfoList) + { + if (insertSpuTotalSaleInfoList.Any(x => x.ProductId == s.ProductId)) + return Enums.TriggerOptimizationReason.首次采购; //首次触发 + if (s.LastOptimizationItemCount == 0 && s.ItemCount >= 20) + return Enums.TriggerOptimizationReason.首次优化; //销量大于20 + if (s.LastOptimizationItemCount != 0 && s.ItemCount * 1.0 / s.LastOptimizationItemCount >= 2) + return Enums.TriggerOptimizationReason.再次优化; + return null; + } } } diff --git a/BBWYB.Server.Model/Db/Order/OrderSku.cs b/BBWYB.Server.Model/Db/Order/OrderSku.cs index f80eaa9..fda8c84 100644 --- a/BBWYB.Server.Model/Db/Order/OrderSku.cs +++ b/BBWYB.Server.Model/Db/Order/OrderSku.cs @@ -106,7 +106,7 @@ namespace BBWYB.Server.Model.Db /// /// 是否需要优化 是=1 否=0 /// - [Column(DbType = "int(1)", IsNullable = true)] + [Column(DbType = "int(1)", IsNullable = true)] public int? IsNeedOptimization { get; set; } = 0; /// @@ -114,6 +114,12 @@ namespace BBWYB.Server.Model.Db /// [Column(DbType = "int(1)", IsNullable = true)] public int? IsOptimizationCompleted { get; set; } = 0; + + /// + /// 触发优化原因 + /// + [Column(DbType = "int(1)", MapType = typeof(int?), IsNullable = true)] + public Enums.TriggerOptimizationReason? TriggerOptimizationReason { get; set; } } } diff --git a/BBWYB.Server.Model/Db/PurchaseScheme/PurchaseScheme.cs b/BBWYB.Server.Model/Db/PurchaseScheme/PurchaseScheme.cs index 6e303e4..a655694 100644 --- a/BBWYB.Server.Model/Db/PurchaseScheme/PurchaseScheme.cs +++ b/BBWYB.Server.Model/Db/PurchaseScheme/PurchaseScheme.cs @@ -105,6 +105,11 @@ namespace BBWYB.Server.Model /// [Column(DbType = "datetime")] public DateTime? LastBargainingTime { get; set; } + + /// + /// 采购件数 + /// + public int? PurchasedItemCount { get; set; } = 0; } } diff --git a/BBWYB.Server.Model/Enums.cs b/BBWYB.Server.Model/Enums.cs index e07a061..dc80d1e 100644 --- a/BBWYB.Server.Model/Enums.cs +++ b/BBWYB.Server.Model/Enums.cs @@ -322,5 +322,13 @@ { 未平价 = 0, 已平价 = 1, 部分平价 = 2 } + + /// + /// 触发优化原因 首次采购 = 0, 首次优化 = 1, 再次优化 = 2 + /// + public enum TriggerOptimizationReason + { + 首次采购 = 0, 首次优化 = 1, 再次优化 = 2 + } } }