From a08268ffd76458553ae0f44991e8b30c7a497bc7 Mon Sep 17 00:00:00 2001 From: shanji <18996038927@163.com> Date: Wed, 28 Feb 2024 03:33:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/SkuOptimizationController.cs | 12 +- .../SkuOptimizationBusiness.cs | 165 ++++++++---------- .../Sync/OrderSyncBusiness.cs | 31 +++- .../Vender/VenderBusiness.cs | 6 + BBWYB.Server.Model/Db/MDS/User.cs | 132 ++++++++++++++ BBWYB.Server.Model/Db/MDS/Userdepartment.cs | 56 ++++++ .../Db/Product/Skuoptimizationchildtask.cs | 44 +++++ .../Response/MDS/UserDepartmentResponse.cs | 8 + 8 files changed, 360 insertions(+), 94 deletions(-) create mode 100644 BBWYB.Server.Model/Db/MDS/User.cs create mode 100644 BBWYB.Server.Model/Db/MDS/Userdepartment.cs create mode 100644 BBWYB.Server.Model/Db/Product/Skuoptimizationchildtask.cs create mode 100644 BBWYB.Server.Model/Dto/Response/MDS/UserDepartmentResponse.cs diff --git a/BBWYB.Server.API/Controllers/SkuOptimizationController.cs b/BBWYB.Server.API/Controllers/SkuOptimizationController.cs index 8c0b93e..61d2086 100644 --- a/BBWYB.Server.API/Controllers/SkuOptimizationController.cs +++ b/BBWYB.Server.API/Controllers/SkuOptimizationController.cs @@ -1,4 +1,5 @@ -using BBWYB.Server.Business; +using BBWYB.Common.Models; +using BBWYB.Server.Business; using BBWYB.Server.Model.Dto; using Microsoft.AspNetCore.Mvc; @@ -25,13 +26,16 @@ namespace BBWYB.Server.API.Controllers } /// - /// 完成待优化任务 (相同spu的优化任务会一起完成) + /// 完成待优化任务(当所有议价组的子任务优化完成, 所属待优化任务才会完成) /// /// 待优化任务Id [HttpPost("{taskId}")] - public void CompleteOptimization([FromRoute]long taskId) + public void CompleteOptimization([FromRoute] long taskId) { - skuOptimizationBusiness.CompleteOptimization(taskId); + var userId = GetUserId(); + if (string.IsNullOrEmpty(userId)) + throw new BusinessException("未从token中获取到userId"); + skuOptimizationBusiness.CompleteOptimization(taskId, userId); } } } diff --git a/BBWYB.Server.Business/SkuOptimization/SkuOptimizationBusiness.cs b/BBWYB.Server.Business/SkuOptimization/SkuOptimizationBusiness.cs index 160fabf..9e34ac6 100644 --- a/BBWYB.Server.Business/SkuOptimization/SkuOptimizationBusiness.cs +++ b/BBWYB.Server.Business/SkuOptimization/SkuOptimizationBusiness.cs @@ -3,14 +3,17 @@ using BBWYB.Common.Models; using BBWYB.Server.Model; using BBWYB.Server.Model.Db; using BBWYB.Server.Model.Dto; +using FreeSql; using Yitter.IdGenerator; namespace BBWYB.Server.Business { public class SkuOptimizationBusiness : BaseBusiness, IDenpendency { - public SkuOptimizationBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator) : base(fsql, nLogManager, idGenerator) + private FreeSqlMultiDBManager fsqlManager; + public SkuOptimizationBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, FreeSqlMultiDBManager fsqlManager) : base(fsql, nLogManager, idGenerator) { + this.fsqlManager = fsqlManager; } public void LKInventoryAlertNotification(BatchLKInventoryAlertRequest request) @@ -22,25 +25,61 @@ namespace BBWYB.Server.Business /// 完成优化 /// /// - public void CompleteOptimization(long taskId) + /// + /// + public void CompleteOptimization(long taskId, string userId) { + #region 验证待议价任务 var optimazaionTask = fsql.Select(taskId).ToOne(); if (optimazaionTask == null) throw new BusinessException("优化任务不存在"); if (optimazaionTask.IsOptimizationCompleted == true) throw new BusinessException("优化任务已完成"); - var optimazationTaskIdList = fsql.Select() - .Where(t => t.ProductId == optimazaionTask.ProductId && t.IsOptimizationCompleted == false) - .ToList(t => t.Id); - + #endregion + + #region 获取用户和部门信息 + var user = fsqlManager.MDSfsql.Select(userId).ToOne(); + if (user == null) + throw new BusinessException("用户不存在"); + if (string.IsNullOrEmpty(user.DepartmentId)) + throw new BusinessException("该用户没有归属部门"); + var department = fsqlManager.MDSfsql.Select(user.DepartmentId).ToOne(); + if (department == null) + throw new BusinessException("部门不存在"); + if (department.ParentDepartmentId != "1760971468360912896") + throw new BusinessException("该用户所在部门不属于议价组"); + #endregion + + #region 验证待议价子任务 + var optimazaionChildTaskList = fsql.Select() + .Where(sc => sc.OptimizationTaskId == optimazaionTask.Id) + .ToList(); + var currentOptimazaionChildTaskList = optimazaionChildTaskList.FirstOrDefault(sc => sc.BelongTeamId == department.Id); + if (currentOptimazaionChildTaskList == null) + throw new BusinessException($"未找到议价组{department.DepartmentName}的议价子任务"); + if (currentOptimazaionChildTaskList.IsOptimizationCompleted == true) + throw new BusinessException($"{department.DepartmentName}的议价子任务已完成"); + + currentOptimazaionChildTaskList.IsOptimizationCompleted = true; + #endregion + + IUpdate updateChildTask = null; + IUpdate updateTask = null; + IUpdate updateSpuSaleInfo = null; + IUpdate updateTimeLimitTask = null; + + if (!optimazaionChildTaskList.Any(sc => sc.IsOptimizationCompleted == false)) + { + //全部完成 - var spuSaleInfo = fsql.Select(optimazaionTask.ProductId).ToOne(); - if (spuSaleInfo == null) + #region 更新spu销量表 + var spuSaleInfo = fsql.Select(optimazaionTask.ProductId).ToOne(); + if (spuSaleInfo == null) - throw new BusinessException($"未找到spu{optimazaionTask.ProductId}销量"); + throw new BusinessException($"未找到spu{optimazaionTask.ProductId}销量"); - var updateSpuSaleInfo = fsql.Update(optimazaionTask.ProductId) + updateSpuSaleInfo = fsql.Update(optimazaionTask.ProductId) .SetIf(spuSaleInfo.IsFirstPurchaseCompleted == false, s => s.IsFirstPurchaseCompleted, true) .SetIf(spuSaleInfo.IsFirstPurchaseCompleted == false, s => s.FirstPurchaseCompletedItemCount == s.ItemCount) .SetIf(spuSaleInfo.IsFirstPurchaseCompleted == true && @@ -50,88 +89,36 @@ namespace BBWYB.Server.Business .Set(s => s.LastOptimizationItemCount == s.ItemCount) .Set(s => s.LastOptimizationTime, DateTime.Now) .Set(s => s.UpdateTime, DateTime.Now); - + #endregion + + #region 更新待议价任务 + updateTask = fsql.Update(optimazaionTask.Id) + .Set(t => t.IsOptimizationCompleted, true) + .Set(t => t.CompletionTime, DateTime.Now); + #endregion + + #region 更新待议价限时任务 + updateTimeLimitTask = fsql.Update().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(currentOptimazaionChildTaskList.Id) + .Set(sc => sc.IsOptimizationCompleted, true) + .Set(sc => sc.CompletionTime, DateTime.Now); + #endregion + fsql.Transaction(() => { - fsql.Update().Set(t => t.IsOptimizationCompleted, true) - .Set(t => t.CompletionTime, DateTime.Now) - .Where(t => optimazationTaskIdList.Contains(t.Id) && t.IsOptimizationCompleted == false) - .ExecuteAffrows(); - - fsql.Update().Set(t => t.CompletionTime, DateTime.Now) - .Set(t => t.IsTimely == (DateTime.Now < t.ExpirationTime ? true : false)) - .Where(t => optimazationTaskIdList.Contains(t.TaskId) && - t.CompletionTime == null && - t.TaskType == Enums.TimeLimitTaskType.待议价任务) - .ExecuteAffrows(); - - updateSpuSaleInfo.ExecuteAffrows(); + updateChildTask?.ExecuteAffrows(); + updateTask?.ExecuteAffrows(); + updateSpuSaleInfo?.ExecuteAffrows(); + updateTimeLimitTask?.ExecuteAffrows(); }); } - - /* - var optimizationSpuSaleList = dbSpuTotalSaleInfoList.Union(insertSpuTotalSaleInfoList).Where(s => - { - return GetOptimizationReason(s) != null; - }); - if (optimizationSpuSaleList.Count() > 0) - { - foreach (var spuSale in optimizationSpuSaleList) - { - var orderList = waitToCheckSkuSaleOrderList.Where(o => o.OrderSkuList.Any(osku => osku.ProductId == spuSale.ProductId)).ToList(); - foreach (var o in orderList) - { - foreach (var osku in o.OrderSkuList) - { - if (osku.ProductId != spuSale.ProductId) - continue; - - var triggerOptimizationReason = GetOptimizationReason(spuSale); - - #region 更新sku优化标记 - var oskuId = long.Parse(osku.Id); - var insertOrderSku = insertOrderSkuList.FirstOrDefault(s => s.Id == oskuId); - if (insertOrderSku != null) - { - insertOrderSku.IsNeedOptimization = 1; - insertOrderSku.TriggerOptimizationReason = triggerOptimizationReason; - } - else - { - //updateOrderSkuIdList_OptimizationFlag.Add(oskuId); - if (!updateOSkuOptimizationFlagByReasonGroups.TryGetValue(triggerOptimizationReason.Value, out var updateOSkuOptimizationFlagByReasonList)) - { - updateOSkuOptimizationFlagByReasonList = new List(); - updateOSkuOptimizationFlagByReasonGroups.Add(triggerOptimizationReason.Value, updateOSkuOptimizationFlagByReasonList); - } - updateOSkuOptimizationFlagByReasonList.Add(oskuId); - } - #endregion - - #region 创建待议价任务 - if (!dbOptimizationLimitTaskList.Any(t => t.OrderId == o.OrderId && t.SkuId == osku.SkuId)) - { - //判断sku是否首次采购 - var isFirst = !dbSkuTotalSaleInfoList.Any(s => s.SkuId == osku.SkuId); - - 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 = osku.SkuId, - TaskType = Enums.TimeLimitTaskType.待议价任务 - }); - } - #endregion - } - } - } - } - */ } } diff --git a/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs b/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs index 3640fb7..4a86044 100644 --- a/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs +++ b/BBWYB.Server.Business/Sync/OrderSyncBusiness.cs @@ -20,7 +20,13 @@ namespace BBWYB.Server.Business.Sync private List timeLimitTaskTypes; private TimeLimitRules timeLimitRules; - public OrderSyncBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, OP_PlatformClientFactory opPlatformClientFactory, VenderBusiness venderBusiness, TaskSchedulerManager taskSchedulerManager, TimeLimitRules timeLimitRules) : base(fsql, nLogManager, idGenerator) + public OrderSyncBusiness(IFreeSql fsql, + NLogManager nLogManager, + IIdGenerator idGenerator, + OP_PlatformClientFactory opPlatformClientFactory, + VenderBusiness venderBusiness, + TaskSchedulerManager taskSchedulerManager, + TimeLimitRules timeLimitRules) : base(fsql, nLogManager, idGenerator) { this.opPlatformClientFactory = opPlatformClientFactory; this.venderBusiness = venderBusiness; @@ -138,6 +144,7 @@ namespace BBWYB.Server.Business.Sync IList updateSpuTotalSaleInfoList = new List(); List insertSkuOptimizationTaskList = new List(); + List insertSkuOptimizationChildTaskList = new List(); #endregion //等待检查sku销量的订单集合 @@ -448,6 +455,25 @@ namespace BBWYB.Server.Business.Sync insertSkuOptimizationTaskList.Add(skuOptimizationTask); #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 创建待优化限时任务 //判断sku是否首次采购 @@ -530,6 +556,9 @@ namespace BBWYB.Server.Business.Sync if (insertSkuOptimizationTaskList.Count() > 0) fsql.Insert(insertSkuOptimizationTaskList).ExecuteAffrows(); + if (insertSkuOptimizationChildTaskList.Count() > 0) + fsql.Insert(insertSkuOptimizationChildTaskList).ExecuteAffrows(); + if (updateOrderList.Count() > 0) foreach (var update in updateOrderList) update.ExecuteAffrows(); diff --git a/BBWYB.Server.Business/Vender/VenderBusiness.cs b/BBWYB.Server.Business/Vender/VenderBusiness.cs index e2ff359..9c54440 100644 --- a/BBWYB.Server.Business/Vender/VenderBusiness.cs +++ b/BBWYB.Server.Business/Vender/VenderBusiness.cs @@ -1,6 +1,7 @@ using BBWYB.Common.Log; using BBWYB.Common.Models; using BBWYB.Server.Model; +using BBWYB.Server.Model.Db; using BBWYB.Server.Model.Db.Mds; using BBWYB.Server.Model.Db.MDS; using BBWYB.Server.Model.Dto; @@ -40,6 +41,11 @@ namespace BBWYB.Server.Business .ToList(); } + public IList GetYiJiaGroup() + { + return fsqlManager.MDSfsql.Select().Where(d => d.ParentDepartmentId == "1760971468360912896").ToList(); + } + public string SaveShopSetting(ShopSettingRequest shopSettingRequest) { diff --git a/BBWYB.Server.Model/Db/MDS/User.cs b/BBWYB.Server.Model/Db/MDS/User.cs new file mode 100644 index 0000000..5de246a --- /dev/null +++ b/BBWYB.Server.Model/Db/MDS/User.cs @@ -0,0 +1,132 @@ +using FreeSql.DataAnnotations; + +namespace BBWYB.Server.Model.Db +{ + + [Table(Name = "user", DisableSyncStructure = true)] + public partial class User + { + + /// + /// 主键 + /// + [Column(StringLength = 50, IsPrimary = true, IsNullable = false)] + public string Id { get; set; } + + /// + /// 业务ID列表 + /// + [Column(StringLength = -2)] + public string BusinessIds { get; set; } + + /// + /// 创建时间 + /// + [Column(DbType = "datetime")] + public DateTime CreateTime { get; set; } + + /// + /// 创建人Id + /// + [Column(StringLength = 50)] + public string CreatorId { get; set; } + + /// + /// 否已删除 + /// + [Column(DbType = "tinyint(4)")] + public sbyte Deleted { get; set; } + + /// + /// 主部门ID + /// + [Column(StringLength = 50)] + public string DepartmentId { get; set; } + + /// + /// 即将过期积分 + /// + + public int? FailureIntegral { get; set; } + + /// + /// 当日冻结积分 + /// + + public int? FreezeIntegral { get; set; } + + /// + /// 是否冻结 + /// + [Column(DbType = "tinyint(4)")] + public sbyte? IsFreeze { get; set; } + + /// + /// 最后积分检测日期 + /// + [Column(DbType = "datetime")] + public DateTime? LastIntegralDate { get; set; } + + /// + /// 登录IP + /// + + public string LoginIp { get; set; } + + /// + /// 最大任务数量 + /// + + public int? MaxPriceTaskCount { get; set; } + + /// + /// 角色ID + /// + [Column(StringLength = 50)] + public string RoleId { get; set; } + + /// + /// 子部门列表 + /// + [Column(StringLength = -1)] + public string SonDepartmentIds { get; set; } + + /// + /// 任务重复检测更新 + /// + [Column(DbType = "datetime")] + public DateTime? UpdateRepeatDate { get; set; } + + /// + /// 用户经验值 + /// + + public int? UserExp { get; set; } + + /// + /// 用户积分 + /// + + public int? UserIntegral { get; set; } + + /// + /// 用户名 + /// + + public string UserName { get; set; } + + /// + /// 花名 + /// + + public string UserNick { get; set; } + + /// + /// 用户密码 + /// + + public string UserPwd { get; set; } + + } + +} diff --git a/BBWYB.Server.Model/Db/MDS/Userdepartment.cs b/BBWYB.Server.Model/Db/MDS/Userdepartment.cs new file mode 100644 index 0000000..6f5ad8d --- /dev/null +++ b/BBWYB.Server.Model/Db/MDS/Userdepartment.cs @@ -0,0 +1,56 @@ +using FreeSql.DataAnnotations; + +namespace BBWYB.Server.Model.Db +{ + + /// + /// 团队 + /// + [Table(Name = "userdepartment", DisableSyncStructure = true)] + public partial class Userdepartment + { + + /// + /// 主键 + /// + [Column(StringLength = 50, IsPrimary = true, IsNullable = false)] + public string Id { get; set; } + + /// + /// 管理ID集合 + /// + [Column(StringLength = -1)] + public string AdminUserIds { get; set; } + + /// + /// 创建时间 + /// + [Column(DbType = "datetime")] + public DateTime CreateTime { get; set; } + + /// + /// 创建人Id + /// + [Column(StringLength = 50)] + public string CreatorId { get; set; } + + /// + /// 否已删除 + /// + [Column(DbType = "tinyint(4)")] + public sbyte Deleted { get; set; } + + /// + /// 部门名称 + /// + public string DepartmentName { get; set; } + + /// + /// 上级部门 + /// + [Column(StringLength = 50)] + public string ParentDepartmentId { get; set; } + + } + +} diff --git a/BBWYB.Server.Model/Db/Product/Skuoptimizationchildtask.cs b/BBWYB.Server.Model/Db/Product/Skuoptimizationchildtask.cs new file mode 100644 index 0000000..f596f33 --- /dev/null +++ b/BBWYB.Server.Model/Db/Product/Skuoptimizationchildtask.cs @@ -0,0 +1,44 @@ +using FreeSql.DataAnnotations; + +namespace BBWYB.Server.Model.Db +{ + + [Table(Name = "skuoptimizationchildtask", DisableSyncStructure = true)] + public partial class SkuOptimizationChildTask + { + + [Column(DbType = "bigint", IsPrimary = true)] + public long Id { get; set; } + + /// + /// 团队Id (议价组Id) + /// + [Column(StringLength = 50)] + public string BelongTeamId { get; set; } + + /// + /// 团队Name (议价组Name) + /// + [Column(StringLength = 50)] + public string BelongTeamName { get; set; } + + /// + /// 完成时间 + /// + [Column(DbType = "datetime")] + public DateTime? CompletionTime { get; set; } + + /// + /// 是否优化完成 + /// + public bool? IsOptimizationCompleted { get; set; } = false; + + /// + /// 优化任务Id + /// + [Column(DbType = "bigint")] + public long? OptimizationTaskId { get; set; } + + } + +} diff --git a/BBWYB.Server.Model/Dto/Response/MDS/UserDepartmentResponse.cs b/BBWYB.Server.Model/Dto/Response/MDS/UserDepartmentResponse.cs new file mode 100644 index 0000000..1f4c667 --- /dev/null +++ b/BBWYB.Server.Model/Dto/Response/MDS/UserDepartmentResponse.cs @@ -0,0 +1,8 @@ +using BBWYB.Server.Model.Db; + +namespace BBWYB.Server.Model.Dto +{ + public class UserDepartmentResponse : Userdepartment + { + } +}