Browse Source

良库预警通知接口

liangku_skuoptimazation
shanji 1 year ago
parent
commit
f31ae8e6ec
  1. 20
      BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs
  2. 99
      BBWYB.Server.Business/SkuOptimization/SkuOptimizationBusiness.cs
  3. 96
      BBWYB.Server.Business/Sync/OrderSyncBusiness.cs
  4. 18
      BBWYB.Server.Model/Db/Product/Skuoptimizationtask.cs

20
BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs

@ -332,6 +332,7 @@ namespace BBWYB.Server.Business
List<IUpdate<Purchaser>> updatePurchaserList = new List<IUpdate<Purchaser>>(); List<IUpdate<Purchaser>> updatePurchaserList = new List<IUpdate<Purchaser>>();
List<SkuHistoryPurchaserRelation> insertSkuHistoryPurchaserRelationList = new List<SkuHistoryPurchaserRelation>(); List<SkuHistoryPurchaserRelation> insertSkuHistoryPurchaserRelationList = new List<SkuHistoryPurchaserRelation>();
List<SkuOptimizationHistory> insertSkuOptimizationHistoryList = new List<SkuOptimizationHistory>(); List<SkuOptimizationHistory> insertSkuOptimizationHistoryList = new List<SkuOptimizationHistory>();
List<long> updateSkuOptimizationPurhcasementByIdList = new List<long>();
List<QiKuPackTaskSkuPurchaseSchemeIdRequest> notifyQikuPackSchemeParamList = null; List<QiKuPackTaskSkuPurchaseSchemeIdRequest> notifyQikuPackSchemeParamList = null;
if (dbOrder.IntoStoreType == Enums.IntoStoreType.) if (dbOrder.IntoStoreType == Enums.IntoStoreType.)
@ -686,9 +687,17 @@ namespace BBWYB.Server.Business
{ {
//本批次在线采购的订单sku集合 //本批次在线采购的订单sku集合
var allBelongSkuIdList = request.CargoParamGroupList.SelectMany(cg => cg.CargoParamList.Select(c => c.BelongSkuId)).Distinct().ToList(); 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)) //var optimizationSkuIdList = orderSkus.Where(osku => osku.IsOptimizationCompleted == 1 && allBelongSkuIdList.Contains(osku.SkuId))
.Select(osku => osku.SkuId) // .Select(osku => osku.SkuId)
// .ToList();
var optimizationTaskList = fsql.Select<SkuOptimizationTask>()
.Where(s => allBelongSkuIdList.Contains(s.SkuId) &&
s.IsOptimizationCompleted == true &&
s.IsPurchasementCompleted == false)
.ToList(); .ToList();
var optimizationSkuIdList = optimizationTaskList.Select(s => s.SkuId).Distinct().ToList();
if (optimizationSkuIdList.Count() > 0) if (optimizationSkuIdList.Count() > 0)
{ {
//优化历史 //优化历史
@ -725,6 +734,10 @@ namespace BBWYB.Server.Business
TriggerOptimizationReason = orderSku.TriggerOptimizationReason TriggerOptimizationReason = orderSku.TriggerOptimizationReason
}; };
insertSkuOptimizationHistoryList.Add(newOptimizationHistory); 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) foreach (var update in updateOrderSkuCostList)
update.ExecuteAffrows(); update.ExecuteAffrows();
} }
if (updateSkuOptimizationPurhcasementByIdList.Count() > 0)
fsql.Update<SkuOptimizationTask>(updateSkuOptimizationPurhcasementByIdList).Set(s => s.IsPurchasementCompleted, true).ExecuteAffrows();
//if (updatePurchaserList.Count() > 0) //if (updatePurchaserList.Count() > 0)
//{ //{
// foreach (var update in updatePurchaserList) // foreach (var update in updatePurchaserList)

99
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.Db.BBWY;
using BBWYB.Server.Model.Dto; using BBWYB.Server.Model.Dto;
using FreeSql; using FreeSql;
using Newtonsoft.Json;
using Yitter.IdGenerator; using Yitter.IdGenerator;
namespace BBWYB.Server.Business namespace BBWYB.Server.Business
@ -12,9 +13,14 @@ namespace BBWYB.Server.Business
public class SkuOptimizationBusiness : BaseBusiness, IDenpendency public class SkuOptimizationBusiness : BaseBusiness, IDenpendency
{ {
private FreeSqlMultiDBManager fsqlManager; 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.fsqlManager = fsqlManager;
this.venderBusiness = venderBusiness;
this.timeLimitRules = timeLimitRules;
} }
public Enums.TriggerOptimizationReason? GetOptimizationReason(SpuTotalSaleInfo s) public Enums.TriggerOptimizationReason? GetOptimizationReason(SpuTotalSaleInfo s)
@ -32,6 +38,8 @@ namespace BBWYB.Server.Business
public void LKInventoryAlertNotification(BatchLKInventoryAlertRequest request) public void LKInventoryAlertNotification(BatchLKInventoryAlertRequest request)
{ {
nLogManager.Default().Info($"LKInventoryAlertNotification {JsonConvert.SerializeObject(request)}");
#region 确定JDSKU对应的拳探SKU和拳探SPU #region 确定JDSKU对应的拳探SKU和拳探SPU
var jdSkuIdList = request.Items.Select(x => x.Sku).Distinct().ToList(); var jdSkuIdList = request.Items.Select(x => x.Sku).Distinct().ToList();
@ -59,6 +67,27 @@ namespace BBWYB.Server.Business
qtSkuIdList.Contains(t.SkuId)) qtSkuIdList.Contains(t.SkuId))
.ToList(); .ToList();
//优化历史
var dbSkuOptimizationHistoryList = fsql.Select<SkuOptimizationHistory>()
.Where(s1 => s1.ShopId == request.ShopId && qtSkuIdList.Contains(s1.SkuId))
.GroupBy(s1 => s1.SkuId)
.WithTempQuery(g => new { MaxId = g.Max(g.Value.Id) })
.From<SkuOptimizationHistory>()
.InnerJoin((s1, s2) => s1.MaxId == s2.Id)
.ToList((s1, s2) => s2);
#region DB Operation
var insertSkuOptimizationTaskList = new List<SkuOptimizationTask>();
var insertSkuOptimizationChildTaskList = new List<SkuOptimizationChildTask>();
var insertTimeLimitTaskList = new List<TimeLimitTask>();
#endregion
var belongShop = venderBusiness.GetShopList(request.ShopId).FirstOrDefault();
if (belongShop == null)
throw new BusinessException("店铺不存在");
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);
@ -81,8 +110,76 @@ namespace BBWYB.Server.Business
if (reason == null) if (reason == null)
continue; 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();
});
} }

96
BBWYB.Server.Business/Sync/OrderSyncBusiness.cs

@ -440,16 +440,18 @@ namespace BBWYB.Server.Business.Sync
PreItemCount = 0, PreItemCount = 0,
PrePurchasedAmount = 0, PrePurchasedAmount = 0,
IsOptimizationCompleted = false, IsOptimizationCompleted = false,
IsPurchasementCompleted = false,
CreateTime = DateTime.Now, CreateTime = DateTime.Now,
SafeWarningRemainingDay = 0, SafeWarningRemainingDay = 0,
UsePrePurchasedPrice = 0,
TriggerOptimizationReason = Enums.TriggerOptimizationReason., TriggerOptimizationReason = Enums.TriggerOptimizationReason.,
SkuId = waitCheckOrderSku.SkuId, SkuId = waitCheckOrderSku.SkuId,
ShopId = shopId, ShopId = shopId,
ProductId = waitCheckOrderSku.ProductId, ProductId = waitCheckOrderSku.ProductId,
BelongShopName = sourceShopName, BelongShopName = sourceShopName,
CompletionTime = null, CompletionTime = null,
JDSkuId = belongSkus?.FirstOrDefault(j => j.Value<string>("SkuId") == waitCheckOrderSku.SkuId)?.Value<string>("BelongSkuId") ?? string.Empty JDSkuId = belongSkus?.FirstOrDefault(j => j.Value<string>("SkuId") == waitCheckOrderSku.SkuId)?.Value<string>("BelongSkuId") ?? string.Empty,
LastOptimizationRatio = 0,
LastPurchasePrice = 0
}; };
insertSkuOptimizationTaskList.Add(skuOptimizationTask); insertSkuOptimizationTaskList.Add(skuOptimizationTask);
@ -499,38 +501,38 @@ namespace BBWYB.Server.Business.Sync
} }
} }
#region 更新订单sku优化标记 //#region 更新订单sku优化标记
var allSkuOptimizationTaskList = dbSkuOptimizationTaskList.Union(insertSkuOptimizationTaskList); //var allSkuOptimizationTaskList = dbSkuOptimizationTaskList.Union(insertSkuOptimizationTaskList);
foreach (var waitCheckOrder in waitToCheckSkuSaleOrderList) //foreach (var waitCheckOrder in waitToCheckSkuSaleOrderList)
{ //{
foreach (var waitCheckOrderSku in waitCheckOrder.OrderSkuList) // foreach (var waitCheckOrderSku in waitCheckOrder.OrderSkuList)
{ // {
var task = allSkuOptimizationTaskList.FirstOrDefault(t => t.SkuId == waitCheckOrderSku.SkuId); // var task = allSkuOptimizationTaskList.FirstOrDefault(t => t.SkuId == waitCheckOrderSku.SkuId);
if (task != null) // if (task != null)
{ // {
#region 更新sku优化标记 // #region 更新sku优化标记
var oskuId = long.Parse(waitCheckOrderSku.SkuId); // var oskuId = long.Parse(waitCheckOrderSku.SkuId);
var insertOrderSku = insertOrderSkuList.FirstOrDefault(s => s.Id == oskuId); // var insertOrderSku = insertOrderSkuList.FirstOrDefault(s => s.Id == oskuId);
if (insertOrderSku != null) // if (insertOrderSku != null)
{ // {
insertOrderSku.IsNeedOptimization = 1; // insertOrderSku.IsNeedOptimization = 1;
insertOrderSku.TriggerOptimizationReason = task.TriggerOptimizationReason; // insertOrderSku.TriggerOptimizationReason = task.TriggerOptimizationReason;
} // }
else // else
{ // {
//updateOrderSkuIdList_OptimizationFlag.Add(oskuId); // //updateOrderSkuIdList_OptimizationFlag.Add(oskuId);
if (!updateOSkuOptimizationFlagByReasonGroups.TryGetValue(task.TriggerOptimizationReason.Value, out var updateOSkuOptimizationFlagByReasonList)) // if (!updateOSkuOptimizationFlagByReasonGroups.TryGetValue(task.TriggerOptimizationReason.Value, out var updateOSkuOptimizationFlagByReasonList))
{ // {
updateOSkuOptimizationFlagByReasonList = new List<long>(); // updateOSkuOptimizationFlagByReasonList = new List<long>();
updateOSkuOptimizationFlagByReasonGroups.Add(task.TriggerOptimizationReason.Value, updateOSkuOptimizationFlagByReasonList); // updateOSkuOptimizationFlagByReasonGroups.Add(task.TriggerOptimizationReason.Value, updateOSkuOptimizationFlagByReasonList);
} // }
updateOSkuOptimizationFlagByReasonList.Add(oskuId); // updateOSkuOptimizationFlagByReasonList.Add(oskuId);
} // }
#endregion // #endregion
} // }
} // }
} //}
#endregion //#endregion
} }
} }
#endregion #endregion
@ -588,19 +590,19 @@ namespace BBWYB.Server.Business.Sync
//if (updateOrderSkuIdList_OptimizationFlag.Count() > 0) //if (updateOrderSkuIdList_OptimizationFlag.Count() > 0)
// fsql.Update<OrderSku>(updateOrderSkuIdList_OptimizationFlag).Set(osku => osku.IsNeedOptimization, 1).ExecuteAffrows(); // fsql.Update<OrderSku>(updateOrderSkuIdList_OptimizationFlag).Set(osku => osku.IsNeedOptimization, 1).ExecuteAffrows();
if (updateOSkuOptimizationFlagByReasonGroups.Keys.Count() > 0) //if (updateOSkuOptimizationFlagByReasonGroups.Keys.Count() > 0)
{ //{
foreach (var triggerOptimizationReason in updateOSkuOptimizationFlagByReasonGroups.Keys) // foreach (var triggerOptimizationReason in updateOSkuOptimizationFlagByReasonGroups.Keys)
{ // {
var updateOSkuListOptimizationFlagList = updateOSkuOptimizationFlagByReasonGroups[triggerOptimizationReason]; // var updateOSkuListOptimizationFlagList = updateOSkuOptimizationFlagByReasonGroups[triggerOptimizationReason];
if (updateOSkuListOptimizationFlagList != null && updateOSkuListOptimizationFlagList.Count > 0) // if (updateOSkuListOptimizationFlagList != null && updateOSkuListOptimizationFlagList.Count > 0)
{ // {
fsql.Update<OrderSku>(updateOSkuListOptimizationFlagList).Set(osku => osku.IsNeedOptimization, 1) // fsql.Update<OrderSku>(updateOSkuListOptimizationFlagList).Set(osku => osku.IsNeedOptimization, 1)
.Set(osku => osku.TriggerOptimizationReason, triggerOptimizationReason) // .Set(osku => osku.TriggerOptimizationReason, triggerOptimizationReason)
.ExecuteAffrows(); // .ExecuteAffrows();
} // }
} // }
} //}
foreach (var key in deductionSkuCountDictionary.Keys) foreach (var key in deductionSkuCountDictionary.Keys)
fsql.Update<SkuTotalSaleInfo>(key).Set(s => s.ItemCount - deductionSkuCountDictionary[key]).ExecuteAffrows(); fsql.Update<SkuTotalSaleInfo>(key).Set(s => s.ItemCount - deductionSkuCountDictionary[key]).ExecuteAffrows();

18
BBWYB.Server.Model/Db/Product/Skuoptimizationtask.cs

@ -18,8 +18,16 @@ namespace BBWYB.Server.Model.Db
[Column(DbType = "datetime")] [Column(DbType = "datetime")]
public DateTime? CreateTime { get; set; } public DateTime? CreateTime { get; set; }
/// <summary>
/// 是否完成优化
/// </summary>
public bool? IsOptimizationCompleted { get; set; } = false; public bool? IsOptimizationCompleted { get; set; } = false;
/// <summary>
/// 是否完成采购
/// </summary>
public bool? IsPurchasementCompleted { get; set; } = false;
[Column(StringLength = 50)] [Column(StringLength = 50)]
public string JDSkuId { get; set; } public string JDSkuId { get; set; }
@ -62,12 +70,18 @@ namespace BBWYB.Server.Model.Db
[Column(DbType = "int", MapType = typeof(int))] [Column(DbType = "int", MapType = typeof(int))]
public Enums.TriggerOptimizationReason? TriggerOptimizationReason { get; set; } = 0; public Enums.TriggerOptimizationReason? TriggerOptimizationReason { get; set; } = 0;
/// <summary> /// <summary>
/// 进行预估的采购成本 /// 上次优化率
/// </summary> /// </summary>
[Column(DbType = "decimal(18,2)")] [Column(DbType = "decimal(18,2)")]
public decimal? UsePrePurchasedPrice { get; set; } = 0.00M; public decimal? LastOptimizationRatio { get; set; } = 0.00M;
/// <summary>
/// 上次采购单价
/// </summary>
[Column(DbType = "decimal(18,2)")]
public decimal? LastPurchasePrice { get; set; } = 0.00M;
} }
} }

Loading…
Cancel
Save