|
|
@ -8,6 +8,7 @@ using BBWYB.Server.Model.Dto; |
|
|
|
using FreeSql; |
|
|
|
using Newtonsoft.Json; |
|
|
|
using Org.BouncyCastle.Tls.Crypto; |
|
|
|
using System.Linq; |
|
|
|
using Yitter.IdGenerator; |
|
|
|
|
|
|
|
namespace BBWYB.Server.Business |
|
|
@ -18,13 +19,15 @@ namespace BBWYB.Server.Business |
|
|
|
private VenderBusiness venderBusiness; |
|
|
|
private TimeLimitRules timeLimitRules; |
|
|
|
private UserBusiness userBusiness; |
|
|
|
private PurchaseSchemeBusiness purchaseSchemeBusiness; |
|
|
|
|
|
|
|
public OptimizationBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, FreeSqlMultiDBManager fsqlManager, VenderBusiness venderBusiness, TimeLimitRules timeLimitRules, UserBusiness userBusiness) : base(fsql, nLogManager, idGenerator) |
|
|
|
public OptimizationBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, FreeSqlMultiDBManager fsqlManager, VenderBusiness venderBusiness, TimeLimitRules timeLimitRules, UserBusiness userBusiness, PurchaseSchemeBusiness purchaseSchemeBusiness) : base(fsql, nLogManager, idGenerator) |
|
|
|
{ |
|
|
|
this.fsqlManager = fsqlManager; |
|
|
|
this.venderBusiness = venderBusiness; |
|
|
|
this.timeLimitRules = timeLimitRules; |
|
|
|
this.userBusiness = userBusiness; |
|
|
|
this.purchaseSchemeBusiness = purchaseSchemeBusiness; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -129,7 +132,7 @@ namespace BBWYB.Server.Business |
|
|
|
if (dbSpuOptimizationTaskList.Any(s => s.ProductId == productId)) //过滤未结束的spu任务
|
|
|
|
continue; |
|
|
|
|
|
|
|
var spuTotalInfo = spuTotalInfoList.FirstOrDefault(psi => psi.ProductId == productId); //spu销量
|
|
|
|
var spuTotalInfo = dbSpuTotalInfoList.FirstOrDefault(psi => psi.ProductId == productId); //spu销量
|
|
|
|
if (spuTotalInfo == null) |
|
|
|
continue; |
|
|
|
|
|
|
@ -143,6 +146,8 @@ namespace BBWYB.Server.Business |
|
|
|
#region qtsku - jdsku 关系匹配
|
|
|
|
var currentProductSkuList = productSkuList.Where(ps => ps.ProductId == productId && |
|
|
|
jdqtskuList.Any(x => x.PurchaseSkuIds == ps.Id)).ToList(); |
|
|
|
if (currentProductSkuList.Count() == 0) |
|
|
|
continue; |
|
|
|
|
|
|
|
//拳探sku-京东sku下单关系映射表
|
|
|
|
var mappingQT_JDSKUDictionary = new Dictionary<string, string>(); |
|
|
@ -255,7 +260,8 @@ namespace BBWYB.Server.Business |
|
|
|
SchemeId = ps.Id, |
|
|
|
SkuId = ps.SkuId, |
|
|
|
SpuOptimizationBargainTeamTaskId = spuOptimizationBargainTeamTask.Id, |
|
|
|
SpuOptimizationTaskId = spuOptimizationTask.Id |
|
|
|
SpuOptimizationTaskId = spuOptimizationTask.Id, |
|
|
|
UpdateTime = DateTime.Now |
|
|
|
})); |
|
|
|
} |
|
|
|
#endregion
|
|
|
@ -303,7 +309,89 @@ namespace BBWYB.Server.Business |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 更新报价
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="request"></param>
|
|
|
|
/// <param name="userId"></param>
|
|
|
|
public void BatchUpdateCompetitiveTenderQuotation(BatchUpdateCompetitiveTenderQuotationRequest request, string userId) |
|
|
|
{ |
|
|
|
#region 获取用户和部门信息
|
|
|
|
var uInfo = userBusiness.GetisBargainTeamByUserId(userId, true); |
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region 业务验证
|
|
|
|
var spuOptimizationTask = fsql.Select<SpuOptimizationTask>(request.SpuOptimizationTaskId).ToOne(); |
|
|
|
if (spuOptimizationTask == null) |
|
|
|
throw new BusinessException($"待优化任务{request.SpuOptimizationTaskId}不存在"); |
|
|
|
var spuOptimizationBargainTeamTask = fsql.Select<SpuOptimizationBargainTeamTask>().Where(sbt => sbt.SpuOptimizationTaskId == request.SpuOptimizationTaskId && sbt.BelongTeamId == uInfo.department.Id).ToOne(); |
|
|
|
if (spuOptimizationBargainTeamTask == null) |
|
|
|
throw new BusinessException($"待优化任务{request.SpuOptimizationTaskId}中不存在议价组{uInfo.department.Id}/{uInfo.department.DepartmentName}的子任务"); |
|
|
|
var skuIdList = fsql.Select<SkuOptimizationTask>().Where(s => s.SpuOptimizationTaskId == request.SpuOptimizationTaskId).ToList(s => s.SkuId); |
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region DBOperation
|
|
|
|
List<SpuOptimizationCompetitiveTenderTask> insertSpuOptimizationCompetitiveTenderTaskList = new List<SpuOptimizationCompetitiveTenderTask>(); |
|
|
|
List<long> updateCompetitiveTenderTaskIdList = new List<long>(); |
|
|
|
#endregion
|
|
|
|
|
|
|
|
//var skuList = request.ItemList.Select(x => x.SkuId).Distinct().ToList();
|
|
|
|
var purchaseSkuIdList = request.ItemList.Select(x => x.PurchaseSkuId).Distinct().ToList(); |
|
|
|
|
|
|
|
//查询竞标任务
|
|
|
|
var competitiveTenderTaskList = fsql.Select<SpuOptimizationCompetitiveTenderTask>() |
|
|
|
.Where(ct => ct.BargainTeamId == uInfo.user.DepartmentId && |
|
|
|
ct.SpuOptimizationTaskId == request.SpuOptimizationTaskId && |
|
|
|
ct.SchemeGroupId == request.SchemeGroupId) |
|
|
|
.ToList(); |
|
|
|
|
|
|
|
//查询配件关联的采购方案
|
|
|
|
var relationPurchaseSchemeList = fsql.Select<PurchaseScheme>() |
|
|
|
.Where(ps => ps.SchemeGroupId == request.SchemeGroupId && |
|
|
|
ps.BelongBargainTeamId == uInfo.user.DepartmentId && |
|
|
|
fsql.Select<PurchaseSchemeProductSku>() |
|
|
|
.Where(pss => skuIdList.Contains(pss.SkuId) && |
|
|
|
purchaseSkuIdList.Contains(pss.PurchaseSkuId) && |
|
|
|
pss.SkuPurchaseSchemeId == ps.Id).Any()) |
|
|
|
.ToList(); |
|
|
|
|
|
|
|
|
|
|
|
//筛选出不在竞标任务中的采购方案
|
|
|
|
var noJoinCompetitiveTenderPurchaseSchemeList = relationPurchaseSchemeList.Where(ps => !competitiveTenderTaskList.Any(ct => ct.SchemeId == ps.Id)).ToList(); |
|
|
|
var noJoinCompetitiveTenderPurchaseSchemeIdList = noJoinCompetitiveTenderPurchaseSchemeList.Select(x => x.Id).ToList(); |
|
|
|
//批量更新配件
|
|
|
|
purchaseSchemeBusiness.BatchEditPurchaseSkuActualPrice(request.Map<BatchEditPurchaseSkuActualPriceRequest>(), noJoinCompetitiveTenderPurchaseSchemeIdList, userId); |
|
|
|
|
|
|
|
if (noJoinCompetitiveTenderPurchaseSchemeList.Count() > 0) |
|
|
|
{ |
|
|
|
insertSpuOptimizationCompetitiveTenderTaskList.AddRange(noJoinCompetitiveTenderPurchaseSchemeList.Select(ps => new SpuOptimizationCompetitiveTenderTask() |
|
|
|
{ |
|
|
|
Id = idGenerator.NewLong(), |
|
|
|
CreateTime = DateTime.Now, |
|
|
|
BargainTeamId = uInfo.department.Id, |
|
|
|
IsUpdateQuotedPrice = true, |
|
|
|
SchemeGroupId = ps.SchemeGroupId, |
|
|
|
SchemeId = ps.Id, |
|
|
|
SkuId = ps.SkuId, |
|
|
|
SpuOptimizationBargainTeamTaskId = spuOptimizationBargainTeamTask.Id, |
|
|
|
SpuOptimizationTaskId = request.SpuOptimizationTaskId, |
|
|
|
UpdateTime = DateTime.Now |
|
|
|
})); |
|
|
|
} |
|
|
|
if (competitiveTenderTaskList.Count() > 0) |
|
|
|
updateCompetitiveTenderTaskIdList.AddRange(competitiveTenderTaskList.Select(ct => ct.Id).ToList()); |
|
|
|
|
|
|
|
fsql.Transaction(() => |
|
|
|
{ |
|
|
|
if (insertSpuOptimizationCompetitiveTenderTaskList.Count() > 0) |
|
|
|
fsql.Insert(insertSpuOptimizationCompetitiveTenderTaskList).ExecuteAffrows(); |
|
|
|
if (updateCompetitiveTenderTaskIdList.Count() > 0) |
|
|
|
fsql.Update<SpuOptimizationCompetitiveTenderTask>(updateCompetitiveTenderTaskIdList) |
|
|
|
.Set(ct => ct.IsUpdateQuotedPrice, true) |
|
|
|
.Set(ct => ct.UpdateTime, DateTime.Now) |
|
|
|
.ExecuteAffrows(); |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 完成优化
|
|
|
@ -313,48 +401,69 @@ namespace BBWYB.Server.Business |
|
|
|
/// <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) |
|
|
|
#region 业务验证
|
|
|
|
var spuOptimizationTask = fsql.Select<SpuOptimizationTask>(taskId).ToOne(); |
|
|
|
if (spuOptimizationTask == null) |
|
|
|
throw new BusinessException($"待优化任务{taskId}不存在"); |
|
|
|
if (spuOptimizationTask.IsOptimizationCompleted == true) |
|
|
|
throw new BusinessException("待优化任务已完成"); |
|
|
|
|
|
|
|
var spuOptimizationBargainTeamTaskList = fsql.Select<SpuOptimizationBargainTeamTask>() |
|
|
|
.Where(sbt => sbt.SpuOptimizationTaskId == taskId && sbt.BelongTeamId == uInfo.department.Id) |
|
|
|
.ToList(); |
|
|
|
var currentOptimazaionChildTaskList = optimazaionChildTaskList.FirstOrDefault(sc => sc.BelongTeamId == uInfo.department.Id); |
|
|
|
if (currentOptimazaionChildTaskList == null) |
|
|
|
var currentspuOptimizationBargainTeamTask = spuOptimizationBargainTeamTaskList.FirstOrDefault(sc => sc.BelongTeamId == uInfo.department.Id); |
|
|
|
if (currentspuOptimizationBargainTeamTask == null) |
|
|
|
throw new BusinessException($"未找到议价组{uInfo.department.DepartmentName}的议价子任务"); |
|
|
|
if (currentOptimazaionChildTaskList.IsOptimizationCompleted == true) |
|
|
|
if (currentspuOptimizationBargainTeamTask.IsOptimizationCompleted == true) |
|
|
|
throw new BusinessException($"{uInfo.department.DepartmentName}的议价子任务已完成"); |
|
|
|
|
|
|
|
currentOptimazaionChildTaskList.IsOptimizationCompleted = true; |
|
|
|
var skuIdList = fsql.Select<SkuOptimizationTask>() |
|
|
|
.Where(s => s.SpuOptimizationTaskId == taskId) |
|
|
|
.ToList(s => s.SkuId); |
|
|
|
|
|
|
|
//查询该议价组的竞标任务
|
|
|
|
var competitiveTenderTaskList = fsql.Select<SpuOptimizationCompetitiveTenderTask>() |
|
|
|
.Where(ct => ct.BargainTeamId == uInfo.user.DepartmentId && |
|
|
|
ct.SpuOptimizationTaskId == taskId) |
|
|
|
.ToList(); |
|
|
|
var competitiveTenderSchemeIdList = competitiveTenderTaskList.Select(ct => ct.SchemeId.Value).ToList(); |
|
|
|
|
|
|
|
//验证该议价组的符合sku条件的采购方案是否都参与投标
|
|
|
|
var purchaseSchemeIdList = fsql.Select<PurchaseScheme>().Where(ps => ps.BelongBargainTeamId == uInfo.user.DepartmentId && |
|
|
|
skuIdList.Contains(ps.SkuId)) |
|
|
|
.ToList(ps => ps.Id); |
|
|
|
var noJoinCompetitiveTenderSchemeIdList = purchaseSchemeIdList.Except(competitiveTenderSchemeIdList); |
|
|
|
if (noJoinCompetitiveTenderSchemeIdList.Count() > 0) |
|
|
|
throw new BusinessException($"议价组{uInfo.department.DepartmentName}存在{noJoinCompetitiveTenderSchemeIdList.Count()}个符合条件但未参与竞标的采购方案"); |
|
|
|
|
|
|
|
//验证该议价组参与投标的采购方案是否都完成报价
|
|
|
|
if (competitiveTenderTaskList.Any(ct => ct.IsUpdateQuotedPrice == false)) |
|
|
|
throw new BusinessException($"议价组{uInfo.department.DepartmentName}存在未更新报价的投标"); |
|
|
|
|
|
|
|
currentspuOptimizationBargainTeamTask.IsOptimizationCompleted = true; |
|
|
|
#endregion
|
|
|
|
|
|
|
|
IUpdate<SkuOptimizationChildTask> updateChildTask = null; |
|
|
|
IUpdate<SkuOptimizationTask> updateTask = null; |
|
|
|
|
|
|
|
IUpdate<SpuOptimizationBargainTeamTask> updateBargainTask = null; |
|
|
|
IUpdate<SpuOptimizationTask> updateSpuTask = null; |
|
|
|
IUpdate<SpuTotalSaleInfo> updateSpuSaleInfo = null; |
|
|
|
IUpdate<TimeLimitTask> updateTimeLimitTask = null; |
|
|
|
|
|
|
|
if (!optimazaionChildTaskList.Any(sc => sc.IsOptimizationCompleted == false)) |
|
|
|
if (!spuOptimizationBargainTeamTaskList.Any(sc => sc.IsOptimizationCompleted == false)) |
|
|
|
{ |
|
|
|
//全部完成
|
|
|
|
|
|
|
|
#region 更新spu销量表
|
|
|
|
var spuSaleInfo = fsql.Select<SpuTotalSaleInfo>(optimazaionTask.ProductId).ToOne(); |
|
|
|
var spuSaleInfo = fsql.Select<SpuTotalSaleInfo>(spuOptimizationTask.ProductId).ToOne(); |
|
|
|
if (spuSaleInfo == null) |
|
|
|
|
|
|
|
throw new BusinessException($"未找到spu{optimazaionTask.ProductId}销量"); |
|
|
|
throw new BusinessException($"未找到spu{spuOptimizationTask.ProductId}销量"); |
|
|
|
|
|
|
|
updateSpuSaleInfo = fsql.Update<SpuTotalSaleInfo>(optimazaionTask.ProductId) |
|
|
|
updateSpuSaleInfo = fsql.Update<SpuTotalSaleInfo>(spuOptimizationTask.ProductId) |
|
|
|
.SetIf(spuSaleInfo.IsFirstPurchaseCompleted == false, s => s.IsFirstPurchaseCompleted, true) |
|
|
|
.SetIf(spuSaleInfo.IsFirstPurchaseCompleted == false, s => s.FirstPurchaseCompletedItemCount == s.ItemCount) |
|
|
|
.SetIf(spuSaleInfo.IsFirstPurchaseCompleted == true && |
|
|
@ -366,31 +475,31 @@ namespace BBWYB.Server.Business |
|
|
|
.Set(s => s.UpdateTime, DateTime.Now); |
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region 更新待议价任务
|
|
|
|
updateTask = fsql.Update<SkuOptimizationTask>(optimazaionTask.Id) |
|
|
|
#region 更新待优化任务
|
|
|
|
updateSpuTask = fsql.Update<SpuOptimizationTask>(spuOptimizationTask.Id) |
|
|
|
.Set(t => t.IsOptimizationCompleted, true) |
|
|
|
.Set(t => t.CompletionTime, DateTime.Now); |
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region 更新待议价限时任务
|
|
|
|
#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 && |
|
|
|
.Where(t => t.TaskId == spuOptimizationTask.Id && |
|
|
|
t.CompletionTime == null && |
|
|
|
t.TaskType == Enums.TimeLimitTaskType.待议价任务); |
|
|
|
#endregion
|
|
|
|
} |
|
|
|
|
|
|
|
#region 更新待议价子任务
|
|
|
|
updateChildTask = fsql.Update<SkuOptimizationChildTask>(currentOptimazaionChildTaskList.Id) |
|
|
|
#region 更新待优化议价组任务
|
|
|
|
updateBargainTask = fsql.Update<SpuOptimizationBargainTeamTask>(currentspuOptimizationBargainTeamTask.Id) |
|
|
|
.Set(sc => sc.IsOptimizationCompleted, true) |
|
|
|
.Set(sc => sc.CompletionTime, DateTime.Now); |
|
|
|
#endregion
|
|
|
|
|
|
|
|
fsql.Transaction(() => |
|
|
|
{ |
|
|
|
updateChildTask?.ExecuteAffrows(); |
|
|
|
updateTask?.ExecuteAffrows(); |
|
|
|
updateSpuTask?.ExecuteAffrows(); |
|
|
|
updateBargainTask?.ExecuteAffrows(); |
|
|
|
updateSpuSaleInfo?.ExecuteAffrows(); |
|
|
|
updateTimeLimitTask?.ExecuteAffrows(); |
|
|
|
}); |
|
|
|