Browse Source

订单同步对接SPU级别优化任务

liangku_skuoptimazation
shanji 1 year ago
parent
commit
34e7817707
  1. 152
      BBWYB.Server.Business/Sync/OrderSyncBusiness.cs
  2. 99
      BBWYB.Server.Model/Db/BBWY/SkuRecentCost.cs
  3. 12
      BBWYB.Server.Model/Db/SpuOptimization/Skuoptimizationtask.cs
  4. 8
      BBWYB.Server.Model/Db/SpuOptimization/Spuoptimizationbargainteamtask.cs
  5. 14
      BBWYB.Server.Model/Db/SpuOptimization/Spuoptimizationcompetitivetendertask.cs
  6. 26
      BBWYB.Server.Model/Db/SpuOptimization/Spuoptimizationtask.cs

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

@ -2,6 +2,7 @@
using BBWYB.Common.Models;
using BBWYB.Server.Model;
using BBWYB.Server.Model.Db;
using BBWYB.Server.Model.Db.BBWY;
using BBWYB.Server.Model.Dto;
using FreeSql;
using Newtonsoft.Json.Linq;
@ -19,6 +20,7 @@ namespace BBWYB.Server.Business.Sync
private TaskSchedulerManager taskSchedulerManager;
private List<Enums.TimeLimitTaskType> timeLimitTaskTypes;
private TimeLimitRules timeLimitRules;
private FreeSqlMultiDBManager fsqlManager;
public OrderSyncBusiness(IFreeSql fsql,
NLogManager nLogManager,
@ -26,7 +28,8 @@ namespace BBWYB.Server.Business.Sync
OP_PlatformClientFactory opPlatformClientFactory,
VenderBusiness venderBusiness,
TaskSchedulerManager taskSchedulerManager,
TimeLimitRules timeLimitRules) : base(fsql, nLogManager, idGenerator)
TimeLimitRules timeLimitRules,
FreeSqlMultiDBManager fsqlManager) : base(fsql, nLogManager, idGenerator)
{
this.opPlatformClientFactory = opPlatformClientFactory;
this.venderBusiness = venderBusiness;
@ -37,6 +40,7 @@ namespace BBWYB.Server.Business.Sync
Enums.TimeLimitTaskType.
};
this.timeLimitRules = timeLimitRules;
this.fsqlManager = fsqlManager;
}
public void AutoOrderSync()
@ -145,8 +149,8 @@ namespace BBWYB.Server.Business.Sync
List<SpuOptimizationTask> insertSpuOptimizationTaskList = new List<SpuOptimizationTask>();
List<SkuOptimizationTask> insertSkuOptimizationTaskList = new List<SkuOptimizationTask>();
List<SpuOptimizationBargainTeamTask> insertSkuOptimizationBargainTeamTaskList = new List<SpuOptimizationBargainTeamTask>();
List<SpuOptimizationCompetitiveTenderTask> insertSkuOptimizationCompetitiveTenderTaskList = new List<SpuOptimizationCompetitiveTenderTask>();
List<SpuOptimizationBargainTeamTask> insertSpuOptimizationBargainTeamTaskList = new List<SpuOptimizationBargainTeamTask>();
List<SpuOptimizationCompetitiveTenderTask> insertSpuOptimizationCompetitiveTenderTaskList = new List<SpuOptimizationCompetitiveTenderTask>();
#endregion
@ -424,7 +428,7 @@ namespace BBWYB.Server.Business.Sync
var includeSpuOrderList = waitToCheckSkuSaleOrderList.Where(o => o.OrderSkuList.Any(osku => osku.ProductId == spuGroup.Key));
var sourceShopName = string.Empty;
//京东sku-拳探sku下单关系映射表
//拳探sku-京东sku下单关系映射表
var mappingQT_JDSKUDictionary = new Dictionary<string, string>();
#region 解析来源店铺数据
@ -456,72 +460,118 @@ namespace BBWYB.Server.Business.Sync
}
}
#endregion
}
}
foreach (var waitCheckOrder in waitToCheckSkuSaleOrderList)
#region 读取JDSKU预估金额
var jdskus = mappingQT_JDSKUDictionary.Values.ToList();
var jdskuRecentCostList = fsqlManager.BBWYCfsql.Select<SkuRecentCost>(jdskus).ToList();
#endregion
#region 处理SKU分组
var skuGroups = spuGroup.GroupBy(osku => osku.SkuId).ToList();
var skuIdList = skuGroups.Select(g => g.Key).ToList();
#endregion
#region 创建SPU优化任务
var spuOptimizationTask = new SpuOptimizationTask()
{
Id = idGenerator.NewLong(),
BelongShopName = sourceShopName,
CompletionTime = null,
CreateTime = DateTime.Now,
IsOptimizationCompleted = false,
LastOptimizationTime = null,
ProductId = spuGroup.Key,
ShopId = shopId,
ProductTitle = spuGroup.FirstOrDefault()?.ProductTitle,
TriggerOptimizationReason = Enums.TriggerOptimizationReason.,
PreSkuCount = skuGroups.Count(),
PreItemCount = 0,
PrePurchaseAmount = 0M
};
#endregion
foreach (var waitCheckOrderSku in waitCheckOrder.OrderSkuList)
#region 创建SKU优化任务
foreach (var skuGroup in skuGroups)
{
if (noFisrstPurchasedSpuList.Contains(waitCheckOrderSku.ProductId) &&
!dbSpuOptimizationTaskList.Any(t => t.ProductId == waitCheckOrderSku.ProductId) &&
!insertSpuOptimizationTaskList.Any(t => t.SkuId == waitCheckOrderSku.SkuId))
mappingQT_JDSKUDictionary.TryGetValue(skuGroup.Key, out string jdSkuId);
var preItemCount = skuGroup.Sum(osku => osku.Quantity);
var prePurchaseAmount = 0M;
if (!string.IsNullOrEmpty(jdSkuId))
{
#region 创建待优化任务
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(),
PreItemCount = 0,
PrePurchasedAmount = 0,
IsOptimizationCompleted = false,
IsPurchasementCompleted = false,
CreateTime = DateTime.Now,
SafeWarningRemainingDay = 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,
LastOptimizationRatio = 0,
LastPurchasePrice = 0,
LastOptimizationTime = null
JDSkuId = jdSkuId,
PreItemCount = preItemCount,
SkuId = skuGroup.Key,
SpuOptimizationTaskId = spuOptimizationTask.Id,
PrePurchaseAmount = prePurchaseAmount
};
insertSkuOptimizationTaskList.Add(skuOptimizationTask);
//累计spu优化任务信息
spuOptimizationTask.PreItemCount += preItemCount;
spuOptimizationTask.PrePurchaseAmount += prePurchaseAmount;
}
#endregion
#region 创建待优化子任务
{
#region 创建SPU优化议价组任务
foreach (var department in bargainTeamList)
{
var skuOptimizationChildTask = new SkuOptimizationChildTask()
var spuOptimizationBargainTeamTask = new SpuOptimizationBargainTeamTask()
{
Id = idGenerator.NewLong(),
BelongTeamId = department.Id,
BelongTeamName = department.DepartmentName,
CompletionTime = null,
IsOptimizationCompleted = false,
OptimizationTaskId = skuOptimizationTask.Id
SpuOptimizationTaskId = spuOptimizationTask.Id
};
insertSkuOptimizationChildTaskList.Add(skuOptimizationChildTask);
insertSpuOptimizationBargainTeamTaskList.Add(spuOptimizationBargainTeamTask);
#region 创建竞标任务
var schemeList = waitToCompetitiveTenderSchemeList.Where(ps => ps.SkuId == waitCheckOrderSku.SkuId &&
ps.BelongBargainTeamId == department.Id)
#region 创建采购方案竞标任务
var waitJoinSchemeList = waitToCompetitiveTenderSchemeList.Where(ps => ps.BelongBargainTeamId == department.Id &&
skuIdList.Contains(ps.SkuId))
.ToList();
#endregion
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 创建待优化限时任务
#region 创建优化限时任务
{
//判断sku是否首次采购
var isFirst = !dbSkuTotalSaleInfoList.Any(s => s.SkuId == waitCheckOrderSku.SkuId);
var isFirst = !dbSpuTotalSaleInfoList.Any(s => s.ProductId == spuGroup.Key);
insertTimeLimitTaskList.Add(new TimeLimitTask()
{
@ -532,13 +582,13 @@ namespace BBWYB.Server.Business.Sync
//OrderId = o.OrderId,
//OrderSn = o.OrderSn,
ShopId = shopId,
SkuId = waitCheckOrderSku.SkuId,
//SkuId = waitCheckOrderSku.SkuId,
TaskType = Enums.TimeLimitTaskType.,
TaskId = skuOptimizationTask.Id,
TaskId = spuOptimizationTask.Id,
Remark = "首次采购限时任务"
});
#endregion
}
#endregion
}
}
}
@ -564,14 +614,14 @@ namespace BBWYB.Server.Business.Sync
if (insertTimeLimitTaskList.Count() > 0)
fsql.Insert(insertTimeLimitTaskList).ExecuteAffrows();
//if (insertSkuOptimizationTaskList.Count() > 0)
// fsql.Insert(insertSkuOptimizationTaskList).ExecuteAffrows();
//if (insertSkuOptimizationChildTaskList.Count() > 0)
// fsql.Insert(insertSkuOptimizationChildTaskList).ExecuteAffrows();
//if (insertCompetitiveTenderList.Count() > 0)
// fsql.Insert(insertCompetitiveTenderList).ExecuteAffrows();
if (insertSpuOptimizationTaskList.Count() > 0)
fsql.Insert(insertSpuOptimizationTaskList).ExecuteAffrows();
if (insertSkuOptimizationTaskList.Count() > 0)
fsql.Insert(insertSkuOptimizationTaskList).ExecuteAffrows();
if (insertSpuOptimizationBargainTeamTaskList.Count() > 0)
fsql.Insert(insertSpuOptimizationBargainTeamTaskList).ExecuteAffrows();
if (insertSpuOptimizationCompetitiveTenderTaskList.Count() > 0)
fsql.Insert(insertSpuOptimizationCompetitiveTenderTaskList).ExecuteAffrows();
if (updateOrderList.Count() > 0)
foreach (var update in updateOrderList)

99
BBWYB.Server.Model/Db/BBWY/SkuRecentCost.cs

@ -0,0 +1,99 @@
using FreeSql.DataAnnotations;
namespace BBWYB.Server.Model.Db.BBWY
{
[Table(Name = "skurecentcost", DisableSyncStructure = true)]
public partial class SkuRecentCost
{
[Column(StringLength = 50, IsPrimary = true, IsNullable = false)]
public string SkuId { get; set; }
[Column(DbType = "datetime")]
public DateTime? CreateTime { get; set; }
[Column(StringLength = 50)]
public string ProductId { get; set; }
/// <summary>
/// 最近一笔订单来源
/// </summary>
[Column(StringLength = 50)]
public string RecentOrderId { get; set; }
[Column(DbType = "bigint")]
public long? ShopId { get; set; }
/// <summary>
/// 耗材费(单件)
/// </summary>
[Column(DbType = "decimal(20,2)")]
public decimal? SingleConsumableAmount { get; set; } = 0.00M;
/// <summary>
/// 发货运费(单件)
/// </summary>
[Column(DbType = "decimal(20,2)")]
public decimal? SingleDeliveryFreight { get; set; } = 0.00M;
/// <summary>
/// 头程运费(单件)
/// </summary>
[Column(DbType = "decimal(20,2)")]
public decimal? SingleFirstFreight { get; set; }
/// <summary>
/// 采购运费(单件)
/// </summary>
[Column(DbType = "decimal(20,2)")]
public decimal? SingleFreight { get; set; } = 0.00M;
/// <summary>
/// 入仓操作费(单件)
/// </summary>
[Column(DbType = "decimal(20,2)")]
public decimal? SingleInStorageAmount { get; set; } = 0.00M;
/// <summary>
/// 操作费(单件)
/// </summary>
[Column(DbType = "decimal(20,2)")]
public decimal? SingleOperationAmount { get; set; } = 0.00M;
/// <summary>
/// 出仓操作费(单件)
/// </summary>
[Column(DbType = "decimal(20,2)")]
public decimal? SingleOutStorageAmount { get; set; } = 0.00M;
///// <summary>
///// 退货入仓操作费(单件)
///// </summary>
//[Column(DbType = "decimal(20,2)")]
//public decimal? SingleRefundInStorageAmount { get; set; } = 0.00M;
/// <summary>
/// SKU成本(单件)
/// </summary>
[Column(DbType = "decimal(20,2)")]
public decimal? SingleSkuAmount { get; set; }
///// <summary>
///// 仓储费(单件)
///// </summary>
//[Column(DbType = "decimal(20,2)")]
//public decimal? SingleStorageAmount { get; set; } = 0.00M;
[Column(DbType = "datetime")]
public DateTime? UpdateTime { get; set; }
/// <summary>
/// 包装人工单价
/// </summary>
[Column(DbType = "decimal(20,2)")]
public decimal? SinglePackagingLaborAmount { get; set; } = 0.00M;
}
}

12
BBWYB.Server.Model/Db/SpuOptimization/Skuoptimizationtask.cs

@ -20,28 +20,22 @@ namespace BBWYB.Server.Model.Db
public string JDSkuId { get; set; }
/// <summary>
/// 预估件数;预估件数
/// 预估件数
/// </summary>
[Column(DbType = "int")]
public int? PreItemCount { get; set; }
/// <summary>
/// 预估采购金额;预估采购金额
/// 预估采购金额
/// </summary>
[Column(DbType = "decimal(18,2)")]
public decimal? PrePurchaseAmount { get; set; }
/// <summary>
/// 预估Sku数;预估Sku数
/// </summary>
[Column(DbType = "int")]
public int? PreSkuCount { get; set; }
[Column(StringLength = 50)]
public string SkuId { get; set; }
/// <summary>
/// Spu优化任务Id;Spu优化任务Id
/// Spu优化任务Id
/// </summary>
[Column(DbType = "bigint")]
public long? SpuOptimizationTaskId { get; set; }

8
BBWYB.Server.Model/Db/SpuOptimization/Spuoptimizationbargainteamtask.cs

@ -14,25 +14,25 @@ namespace BBWYB.Server.Model.Db
public long Id { get; set; }
/// <summary>
/// 团队Id (议价组Id);团队Id (议价组Id)
/// 团队Id (议价组Id)
/// </summary>
[Column(StringLength = 50)]
public string BelongTeamId { get; set; }
/// <summary>
/// 议价组名称;议价组名称
/// 议价组名称
/// </summary>
[Column(StringLength = 50)]
public string BelongTeamName { get; set; }
/// <summary>
/// 完成时间;完成时间
/// 完成时间
/// </summary>
[Column(DbType = "datetime")]
public DateTime? CompletionTime { get; set; }
/// <summary>
/// 是否优化完成;是否优化完成
/// 是否优化完成
/// </summary>
public bool? IsOptimizationCompleted { get; set; }

14
BBWYB.Server.Model/Db/SpuOptimization/Spuoptimizationcompetitivetendertask.cs

@ -11,10 +11,10 @@ namespace BBWYB.Server.Model.Db
{
[Column(IsPrimary = true, IsNullable = false)]
public string Id { get; set; }
public long Id { get; set; }
/// <summary>
/// 议价组Id;议价组Id
/// 议价组Id
/// </summary>
[Column(StringLength = 50)]
public string BargainTeamId { get; set; }
@ -23,18 +23,18 @@ namespace BBWYB.Server.Model.Db
public DateTime? CreateTime { get; set; }
/// <summary>
/// 是否更新报价;是否更新报价
/// 是否更新报价
/// </summary>
public bool? IsUpdateQuotedPrice { get; set; } = false;
/// <summary>
/// 采购方案分组Id;采购方案分组Id
/// 采购方案分组Id
/// </summary>
[Column(DbType = "bigint")]
public long? SchemeGroupId { get; set; }
/// <summary>
/// 采购方案Id;采购方案Id
/// 采购方案Id
/// </summary>
[Column(DbType = "bigint")]
public long? SchemeId { get; set; }
@ -43,13 +43,13 @@ namespace BBWYB.Server.Model.Db
public string SkuId { get; set; }
/// <summary>
/// Spu优化议价组任务Id;Spu优化议价组任务Id
/// Spu优化议价组任务Id
/// </summary>
[Column(DbType = "bigint")]
public long? SpuOptimizationBargainTeamTaskId { get; set; }
/// <summary>
/// Spu优化任务Id;Spu优化任务Id
/// Spu优化任务Id
/// </summary>
[Column(DbType = "bigint")]
public long? SpuOptimizationTaskId { get; set; }

26
BBWYB.Server.Model/Db/SpuOptimization/Spuoptimizationtask.cs

@ -11,37 +11,37 @@ namespace BBWYB.Server.Model.Db
{
/// <summary>
/// 待优化任务Id;待优化任务Id
/// 待优化任务Id
/// </summary>
[Column(DbType = "bigint", IsPrimary = true)]
public long Id { get; set; }
/// <summary>
/// 需求方店铺Id;需求方店铺Id
/// 需求方店铺Id
/// </summary>
[Column(DbType = "bigint")]
public long? BelongShopId { get; set; }
/// <summary>
/// 需求方店铺名称;需求方店铺名称
/// 需求方店铺名称
/// </summary>
[Column(StringLength = 50)]
public string BelongShopName { get; set; }
/// <summary>
/// 完成优化时间;完成优化时间
/// 完成优化时间
/// </summary>
[Column(DbType = "datetime")]
public DateTime? CompletionTime { get; set; }
/// <summary>
/// 创建时间;创建时间
/// 创建时间
/// </summary>
[Column(DbType = "datetime")]
public DateTime? CreateTime { get; set; }
/// <summary>
/// 是否优化完成;是否优化完成
/// 是否优化完成
/// </summary>
public bool? IsOptimizationCompleted { get; set; }
@ -52,31 +52,31 @@ namespace BBWYB.Server.Model.Db
public string ProductTitle { get; set; }
/// <summary>
/// 上次优化时间;上次优化时间
/// 上次优化时间
/// </summary>
[Column(DbType = "datetime")]
public DateTime? LastOptimizationTime { get; set; }
/// <summary>
/// 预估件数;预估件数
/// 预估件数
/// </summary>
[Column(DbType = "int")]
public int? PreItemCount { get; set; }
/// <summary>
/// 预估采购金额;预估采购金额
/// 预估采购金额
/// </summary>
[Column(DbType = "decimal(18,2)")]
public decimal? PrePurchaseAmount { get; set; }
/// <summary>
/// 预估Sku数;预估Sku数
/// 预估Sku数
/// </summary>
[Column(DbType = "int")]
public int? PreSkuCount { get; set; }
/// <summary>
/// 店铺Id;店铺Id
/// 店铺Id
/// </summary>
[Column(DbType = "bigint")]
public long? ShopId { get; set; }
@ -84,8 +84,8 @@ namespace BBWYB.Server.Model.Db
/// <summary>
/// 触发优化原因 首次采购 = 0, 首次优化 = 1, 再次优化 = 2;触发优化原因 首次采购 = 0, 首次优化 = 1, 再次优化 = 2
/// </summary>
[Column(DbType = "int")]
public int? TriggerOptimizationReason { get; set; }
[Column(DbType = "int", MapType = typeof(int?))]
public Enums.TriggerOptimizationReason? TriggerOptimizationReason { get; set; }
}

Loading…
Cancel
Save