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<SkuHistoryPurchaserRelation> insertSkuHistoryPurchaserRelationList = new List<SkuHistoryPurchaserRelation>();
List<SkuOptimizationHistory> insertSkuOptimizationHistoryList = new List<SkuOptimizationHistory>();
List<long> updateSkuOptimizationPurhcasementByIdList = new List<long>();
List<QiKuPackTaskSkuPurchaseSchemeIdRequest> 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)
//var optimizationSkuIdList = orderSkus.Where(osku => osku.IsOptimizationCompleted == 1 && allBelongSkuIdList.Contains(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();
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<SkuOptimizationTask>(updateSkuOptimizationPurhcasementByIdList).Set(s => s.IsPurchasementCompleted, true).ExecuteAffrows();
//if (updatePurchaserList.Count() > 0)
//{
// 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.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<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)
{
var qtsku = jdqtskuList.FirstOrDefault(x => x.SkuId == reqItem.Sku);
@ -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();
});
}

96
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<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);
@ -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<long>();
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<long>();
// 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<OrderSku>(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<OrderSku>(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<OrderSku>(updateOSkuListOptimizationFlagList).Set(osku => osku.IsNeedOptimization, 1)
// .Set(osku => osku.TriggerOptimizationReason, triggerOptimizationReason)
// .ExecuteAffrows();
// }
// }
//}
foreach (var key in deductionSkuCountDictionary.Keys)
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")]
public DateTime? CreateTime { get; set; }
/// <summary>
/// 是否完成优化
/// </summary>
public bool? IsOptimizationCompleted { get; set; } = false;
/// <summary>
/// 是否完成采购
/// </summary>
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;
/// <summary>
/// 进行预估的采购成本
/// 上次优化率
/// </summary>
[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