You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
460 lines
24 KiB
460 lines
24 KiB
using BBWYB.Common.Extensions;
|
|
using BBWYB.Common.Log;
|
|
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;
|
|
using Org.BouncyCastle.Tls.Crypto;
|
|
using Yitter.IdGenerator;
|
|
|
|
namespace BBWYB.Server.Business
|
|
{
|
|
public class OptimizationBusiness : BaseBusiness, IDenpendency
|
|
{
|
|
private FreeSqlMultiDBManager fsqlManager;
|
|
private VenderBusiness venderBusiness;
|
|
private TimeLimitRules timeLimitRules;
|
|
private UserBusiness userBusiness;
|
|
|
|
public OptimizationBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, FreeSqlMultiDBManager fsqlManager, VenderBusiness venderBusiness, TimeLimitRules timeLimitRules, UserBusiness userBusiness) : base(fsql, nLogManager, idGenerator)
|
|
{
|
|
this.fsqlManager = fsqlManager;
|
|
this.venderBusiness = venderBusiness;
|
|
this.timeLimitRules = timeLimitRules;
|
|
this.userBusiness = userBusiness;
|
|
}
|
|
|
|
|
|
public Enums.TriggerOptimizationReason? GetOptimizationReason(SpuTotalSaleInfo s)
|
|
{
|
|
if (s.IsFirstPurchaseCompleted == false)
|
|
return Enums.TriggerOptimizationReason.首次采购;
|
|
if (s.IsFirstPurchaseCompleted == true &&
|
|
s.IsFirstOptimizationCompleted == false)
|
|
{
|
|
if (s.ItemCount - s.FirstPurchaseCompletedItemCount >= 20)
|
|
return Enums.TriggerOptimizationReason.首次优化;
|
|
if (s.LastOptimizationTime != null &&
|
|
(DateTime.Now.Date - s.LastOptimizationTime.Value.Date).TotalDays > 30)
|
|
return Enums.TriggerOptimizationReason.首次优化;
|
|
}
|
|
if (s.IsFirstOptimizationCompleted == true)
|
|
{
|
|
if (s.LastOptimizationItemCount != 0 && s.ItemCount * 1.0 / s.LastOptimizationItemCount >= 2)
|
|
return Enums.TriggerOptimizationReason.再次优化;
|
|
|
|
if (s.LastOptimizationTime != null &&
|
|
(DateTime.Now.Date - s.LastOptimizationTime.Value.Date).TotalDays > 30)
|
|
return Enums.TriggerOptimizationReason.再次优化;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 良库预警
|
|
/// </summary>
|
|
/// <param name="request"></param>
|
|
/// <exception cref="BusinessException"></exception>
|
|
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();
|
|
|
|
var jdqtskuList = fsqlManager.BBWYCfsql.Select<PurchaseOrderSku>()
|
|
.Where(ps1 => ps1.ShopId == request.ShopId && jdSkuIdList.Contains(ps1.SkuId))
|
|
.GroupBy(ps1 => ps1.SkuId)
|
|
.WithTempQuery(g => new { MaxId = g.Max(g.Value.Id) })
|
|
.From<PurchaseOrderSku>()
|
|
.InnerJoin((ps1, ps2) => ps1.MaxId == ps2.Id)
|
|
.ToList((ps1, ps2) => ps2);
|
|
|
|
var qtSkuIdList = jdqtskuList.Select(x => x.PurchaseSkuIds).Distinct().ToList();
|
|
|
|
var productSkuList = fsql.Select<Model.Db.ProductSku>(qtSkuIdList).ToList();
|
|
if (productSkuList.Count() == 0)
|
|
return;
|
|
|
|
var shopId = productSkuList.FirstOrDefault()?.ShopId;
|
|
var productIdList = productSkuList.Select(ps => ps.ProductId).Distinct().ToList();
|
|
var productList = fsql.Select<Product>(productIdList).ToList();
|
|
var dbSpuTotalInfoList = fsql.Select<SpuTotalSaleInfo>().Where(spi => productIdList.Contains(spi.ProductId)).ToList();
|
|
#endregion
|
|
|
|
|
|
//查询已存在未结束的优化任务
|
|
var dbSpuOptimizationTaskList = fsql.Select<SpuOptimizationTask>()
|
|
.Where(t => t.ShopId == shopId &&
|
|
t.IsOptimizationCompleted == false &&
|
|
productIdList.Contains(t.ProductId))
|
|
.ToList();
|
|
|
|
|
|
//优化历史
|
|
var dbSpuOptimizationHistoryList = fsql.Select<SpuOptimizationTask>()
|
|
.Where(s1 => productIdList.Contains(s1.ProductId) && s1.IsOptimizationCompleted == true)
|
|
.GroupBy(s1 => s1.ProductId)
|
|
.WithTempQuery(g => new { MaxId = g.Max(g.Value.Id) })
|
|
.From<SpuOptimizationTask>()
|
|
.InnerJoin((s1, s2) => s1.MaxId == s2.Id)
|
|
.ToList((s1, s2) => s2);
|
|
|
|
|
|
#region DB Operation
|
|
List<SpuOptimizationTask> insertSpuOptimizationTaskList = new List<SpuOptimizationTask>();
|
|
List<SkuOptimizationTask> insertSkuOptimizationTaskList = new List<SkuOptimizationTask>();
|
|
List<SpuOptimizationBargainTeamTask> insertSpuOptimizationBargainTeamTaskList = new List<SpuOptimizationBargainTeamTask>();
|
|
List<SpuOptimizationCompetitiveTenderTask> insertSpuOptimizationCompetitiveTenderTaskList = new List<SpuOptimizationCompetitiveTenderTask>();
|
|
List<TimeLimitTask> insertTimeLimitTaskList = new List<TimeLimitTask>();
|
|
#endregion
|
|
|
|
var belongShop = venderBusiness.GetShopList(request.ShopId).FirstOrDefault();
|
|
if (belongShop == null)
|
|
throw new BusinessException("店铺不存在");
|
|
|
|
var bargainTeamList = venderBusiness.GetYiJiaGroup(); //获取议价组
|
|
var bargainTeamIdList = bargainTeamList.Select(t => t.Id).ToList();
|
|
var waitToCompetitiveTenderSchemeList = fsql.Select<PurchaseScheme>()
|
|
.Where(ps => bargainTeamIdList.Contains(ps.BelongBargainTeamId) &&
|
|
productIdList.Contains(ps.ProductId))
|
|
.ToList(); //需要参与竞标采购方案
|
|
|
|
foreach (var productId in productIdList)
|
|
{
|
|
#region 验证
|
|
if (dbSpuOptimizationTaskList.Any(s => s.ProductId == productId)) //过滤未结束的spu任务
|
|
continue;
|
|
|
|
var spuTotalInfo = spuTotalInfoList.FirstOrDefault(psi => psi.ProductId == productId); //spu销量
|
|
if (spuTotalInfo == null)
|
|
continue;
|
|
|
|
var reason = GetOptimizationReason(spuTotalInfo); //过滤不需要优化的spu
|
|
if (reason == null)
|
|
continue;
|
|
#endregion
|
|
|
|
var skuOptimizationHistory = dbSpuOptimizationHistoryList.FirstOrDefault(h => h.ProductId == productId); //优化历史
|
|
|
|
#region qtsku - jdsku 关系匹配
|
|
var currentProductSkuList = productSkuList.Where(ps => ps.ProductId == productId &&
|
|
jdqtskuList.Any(x => x.PurchaseSkuIds == ps.Id)).ToList();
|
|
|
|
//拳探sku-京东sku下单关系映射表
|
|
var mappingQT_JDSKUDictionary = new Dictionary<string, string>();
|
|
foreach (var ps in currentProductSkuList)
|
|
{
|
|
var jdsku = jdqtskuList.FirstOrDefault(x => x.PurchaseSkuIds == ps.Id)?.SkuId;
|
|
if (string.IsNullOrEmpty(jdsku))
|
|
continue;
|
|
if (!mappingQT_JDSKUDictionary.ContainsKey(ps.Id))
|
|
mappingQT_JDSKUDictionary.TryAdd(ps.Id, jdsku);
|
|
}
|
|
var jdskus = mappingQT_JDSKUDictionary.Values.ToList();
|
|
var qtskus = mappingQT_JDSKUDictionary.Keys.ToList();
|
|
#endregion
|
|
|
|
#region 读取JDSKU预估金额
|
|
var jdskuRecentCostList = fsqlManager.BBWYCfsql.Select<SkuRecentCost>(jdskus).ToList();
|
|
#endregion
|
|
|
|
#region 创建SPU优化任务
|
|
var spuOptimizationTask = new SpuOptimizationTask()
|
|
{
|
|
Id = idGenerator.NewLong(),
|
|
BelongShopName = belongShop.ShopName,
|
|
CompletionTime = null,
|
|
CreateTime = DateTime.Now,
|
|
IsOptimizationCompleted = false,
|
|
LastOptimizationTime = null,
|
|
ProductId = productId,
|
|
ShopId = shopId,
|
|
ProductTitle = productList.FirstOrDefault(p => p.Id == productId)?.ProductName,
|
|
TriggerOptimizationReason = reason,
|
|
PreSkuCount = jdskus.Count(),
|
|
PreItemCount = 0,
|
|
PrePurchaseAmount = 0M
|
|
};
|
|
#endregion
|
|
|
|
#region 创建SKU优化任务
|
|
foreach (var sku in mappingQT_JDSKUDictionary.Keys)
|
|
{
|
|
mappingQT_JDSKUDictionary.TryGetValue(sku, out string jdSkuId);
|
|
var requestSkuItem = request.Items.FirstOrDefault(x => x.Sku == jdSkuId);
|
|
if (requestSkuItem == null)
|
|
continue;
|
|
|
|
var preItemCount = requestSkuItem.PreItemCount;
|
|
var prePurchaseAmount = 0M;
|
|
if (!string.IsNullOrEmpty(jdSkuId))
|
|
{
|
|
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(),
|
|
CreateTime = DateTime.Now,
|
|
JDSkuId = jdSkuId,
|
|
PreItemCount = preItemCount,
|
|
SkuId = sku,
|
|
SpuOptimizationTaskId = spuOptimizationTask.Id,
|
|
PrePurchaseAmount = prePurchaseAmount
|
|
};
|
|
insertSkuOptimizationTaskList.Add(skuOptimizationTask);
|
|
|
|
//累计spu优化任务信息
|
|
spuOptimizationTask.PreItemCount += preItemCount;
|
|
spuOptimizationTask.PrePurchaseAmount += prePurchaseAmount;
|
|
}
|
|
#endregion
|
|
|
|
#region 创建SPU优化议价组任务
|
|
foreach (var department in bargainTeamList)
|
|
{
|
|
var spuOptimizationBargainTeamTask = new SpuOptimizationBargainTeamTask()
|
|
{
|
|
Id = idGenerator.NewLong(),
|
|
BelongTeamId = department.Id,
|
|
BelongTeamName = department.DepartmentName,
|
|
CompletionTime = null,
|
|
IsOptimizationCompleted = false,
|
|
SpuOptimizationTaskId = spuOptimizationTask.Id
|
|
};
|
|
insertSpuOptimizationBargainTeamTaskList.Add(spuOptimizationBargainTeamTask);
|
|
|
|
#region 创建采购方案竞标任务
|
|
var waitJoinSchemeList = waitToCompetitiveTenderSchemeList.Where(ps => ps.BelongBargainTeamId == department.Id &&
|
|
qtskus.Contains(ps.SkuId))
|
|
.ToList();
|
|
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 创建优化限时任务
|
|
|
|
{
|
|
//判断sku是否首次采购
|
|
var isFirst = !dbSpuTotalInfoList.Any(s => s.ProductId == productId);
|
|
|
|
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(isFirst ? 1 : 0)),
|
|
//OrderId = o.OrderId,
|
|
//OrderSn = o.OrderSn,
|
|
ShopId = shopId,
|
|
//SkuId = waitCheckOrderSku.SkuId,
|
|
TaskType = Enums.TimeLimitTaskType.待议价任务,
|
|
TaskId = spuOptimizationTask.Id,
|
|
Remark = "首次采购限时任务"
|
|
});
|
|
}
|
|
#endregion
|
|
|
|
}
|
|
|
|
|
|
fsql.Transaction(() =>
|
|
{
|
|
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 (insertTimeLimitTaskList.Count() > 0)
|
|
fsql.Insert(insertTimeLimitTaskList).ExecuteAffrows();
|
|
});
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 完成优化
|
|
/// </summary>
|
|
/// <param name="taskId"></param>
|
|
/// <param name="userId"></param>
|
|
/// <exception cref="BusinessException"></exception>
|
|
public void CompleteOptimization(long taskId, string userId)
|
|
{
|
|
#region 验证待议价任务
|
|
var optimazaionTask = fsql.Select<SkuOptimizationTask>(taskId).ToOne();
|
|
if (optimazaionTask == null)
|
|
throw new BusinessException("优化任务不存在");
|
|
if (optimazaionTask.IsOptimizationCompleted == true)
|
|
throw new BusinessException("优化任务已完成");
|
|
|
|
#endregion
|
|
|
|
#region 获取用户和部门信息
|
|
var uInfo = userBusiness.GetisBargainTeamByUserId(userId, true);
|
|
#endregion
|
|
|
|
#region 验证待议价子任务
|
|
var optimazaionChildTaskList = fsql.Select<SkuOptimizationChildTask>()
|
|
.Where(sc => sc.OptimizationTaskId == optimazaionTask.Id)
|
|
.ToList();
|
|
var currentOptimazaionChildTaskList = optimazaionChildTaskList.FirstOrDefault(sc => sc.BelongTeamId == uInfo.department.Id);
|
|
if (currentOptimazaionChildTaskList == null)
|
|
throw new BusinessException($"未找到议价组{uInfo.department.DepartmentName}的议价子任务");
|
|
if (currentOptimazaionChildTaskList.IsOptimizationCompleted == true)
|
|
throw new BusinessException($"{uInfo.department.DepartmentName}的议价子任务已完成");
|
|
|
|
currentOptimazaionChildTaskList.IsOptimizationCompleted = true;
|
|
#endregion
|
|
|
|
IUpdate<SkuOptimizationChildTask> updateChildTask = null;
|
|
IUpdate<SkuOptimizationTask> updateTask = null;
|
|
IUpdate<SpuTotalSaleInfo> updateSpuSaleInfo = null;
|
|
IUpdate<TimeLimitTask> updateTimeLimitTask = null;
|
|
|
|
if (!optimazaionChildTaskList.Any(sc => sc.IsOptimizationCompleted == false))
|
|
{
|
|
//全部完成
|
|
|
|
#region 更新spu销量表
|
|
var spuSaleInfo = fsql.Select<SpuTotalSaleInfo>(optimazaionTask.ProductId).ToOne();
|
|
if (spuSaleInfo == null)
|
|
|
|
throw new BusinessException($"未找到spu{optimazaionTask.ProductId}销量");
|
|
|
|
updateSpuSaleInfo = fsql.Update<SpuTotalSaleInfo>(optimazaionTask.ProductId)
|
|
.SetIf(spuSaleInfo.IsFirstPurchaseCompleted == false, s => s.IsFirstPurchaseCompleted, true)
|
|
.SetIf(spuSaleInfo.IsFirstPurchaseCompleted == false, s => s.FirstPurchaseCompletedItemCount == s.ItemCount)
|
|
.SetIf(spuSaleInfo.IsFirstPurchaseCompleted == true &&
|
|
spuSaleInfo.IsFirstOptimizationCompleted == false, s => s.IsFirstOptimizationCompleted, true)
|
|
.SetIf(spuSaleInfo.IsFirstPurchaseCompleted == true &&
|
|
spuSaleInfo.IsFirstOptimizationCompleted == false, s => s.FirstOptimizationCompletedItemCount == s.ItemCount)
|
|
.Set(s => s.LastOptimizationItemCount == s.ItemCount)
|
|
.Set(s => s.LastOptimizationTime, DateTime.Now)
|
|
.Set(s => s.UpdateTime, DateTime.Now);
|
|
#endregion
|
|
|
|
#region 更新待议价任务
|
|
updateTask = fsql.Update<SkuOptimizationTask>(optimazaionTask.Id)
|
|
.Set(t => t.IsOptimizationCompleted, true)
|
|
.Set(t => t.CompletionTime, DateTime.Now);
|
|
#endregion
|
|
|
|
#region 更新待议价限时任务
|
|
updateTimeLimitTask = fsql.Update<TimeLimitTask>().Set(t => t.CompletionTime, DateTime.Now)
|
|
.Set(t => t.IsTimely == (DateTime.Now < t.ExpirationTime ? true : false))
|
|
.Where(t => t.TaskId == optimazaionTask.Id &&
|
|
t.CompletionTime == null &&
|
|
t.TaskType == Enums.TimeLimitTaskType.待议价任务);
|
|
#endregion
|
|
}
|
|
|
|
#region 更新待议价子任务
|
|
updateChildTask = fsql.Update<SkuOptimizationChildTask>(currentOptimazaionChildTaskList.Id)
|
|
.Set(sc => sc.IsOptimizationCompleted, true)
|
|
.Set(sc => sc.CompletionTime, DateTime.Now);
|
|
#endregion
|
|
|
|
fsql.Transaction(() =>
|
|
{
|
|
updateChildTask?.ExecuteAffrows();
|
|
updateTask?.ExecuteAffrows();
|
|
updateSpuSaleInfo?.ExecuteAffrows();
|
|
updateTimeLimitTask?.ExecuteAffrows();
|
|
});
|
|
}
|
|
|
|
public ListResponse<SkuOptimizationTaskResponse> GetNoCompletionSkuOptimizationTask(PageRequest request, string userId)
|
|
{
|
|
var uInfo = userBusiness.GetisBargainTeamByUserId(userId, true);
|
|
var taskList = fsql.Select<SkuOptimizationTask, TimeLimitTask>()
|
|
.InnerJoin((t, tt) => t.Id == tt.TaskId)
|
|
.Where((t, tt) => t.IsOptimizationCompleted == false)
|
|
.OrderByDescending((t, tt) => t.CreateTime)
|
|
.Count(out var total)
|
|
.Page(request.PageIndex, request.PageSize)
|
|
.ToList((t, tt) => new SkuOptimizationTask
|
|
{
|
|
Id = t.Id,
|
|
ShopId = t.ShopId,
|
|
BelongShopName = t.BelongShopName,
|
|
JDSkuId = t.JDSkuId,
|
|
ProductId = t.ProductId,
|
|
SkuId = t.SkuId,
|
|
PreItemCount = t.PreItemCount,
|
|
PrePurchasedAmount = t.PrePurchasedAmount,
|
|
SafeWarningRemainingDay = t.SafeWarningRemainingDay,
|
|
IsOptimizationCompleted = t.IsOptimizationCompleted,
|
|
IsPurchasementCompleted = t.IsPurchasementCompleted,
|
|
CreateTime = t.CreateTime,
|
|
CompletionTime = t.CompletionTime,
|
|
TriggerOptimizationReason = t.TriggerOptimizationReason,
|
|
LastOptimizationRatio = t.LastOptimizationRatio,
|
|
LastPurchasePrice = t.LastPurchasePrice,
|
|
LastOptimizationTime = t.LastOptimizationTime,
|
|
|
|
TimeLimitTaskId = tt.Id,
|
|
TimeLimitTaskBelongTaskId = tt.TaskId,
|
|
TimeLimitTaskCompletionTime = tt.CompletionTime,
|
|
TimeLimitTaskCreateTme = tt.CreateTme,
|
|
TimeLimitTaskExpirationTime = tt.ExpirationTime,
|
|
TimeLimitTaskIsTimely = tt.IsTimely,
|
|
TimeLimitTaskOrderId = tt.OrderId,
|
|
TimeLimitTaskOrderSn = tt.OrderSn,
|
|
TimeLimitTaskPayTime = tt.PayTime,
|
|
TimeLimitTaskRemark = tt.Remark,
|
|
TimeLimitTaskShopId = tt.ShopId,
|
|
TimeLimitTaskSkuId = tt.SkuId,
|
|
TimeLimitTaskTaskType = tt.TaskType
|
|
}).Map<List<SkuOptimizationTaskResponse>>();
|
|
|
|
List<long> taskIdList = taskList.Select(t => t.Id).ToList();
|
|
var childTaskList = fsql.Select<SkuOptimizationChildTask>().Where(ct => taskIdList.Contains(ct.OptimizationTaskId)).ToList<SkuOptimizationChildTaskResponse>();
|
|
|
|
foreach (var task in taskList)
|
|
{
|
|
task.ChildTaskList = childTaskList.Where(ct => ct.OptimizationTaskId == task.Id).ToList();
|
|
var currentChildTask = task.ChildTaskList.FirstOrDefault(ct => ct.BelongTeamId == uInfo.user.DepartmentId);
|
|
task.IsOptimizationCompletedByCurrentTeam = currentChildTask?.IsOptimizationCompleted ?? false;
|
|
}
|
|
|
|
return new ListResponse<SkuOptimizationTaskResponse>()
|
|
{
|
|
Items = taskList,
|
|
TotalCount = total
|
|
};
|
|
}
|
|
}
|
|
}
|
|
|