diff --git a/BBWYB.Server.API/Controllers/SkuOptimizationController.cs b/BBWYB.Server.API/Controllers/SkuOptimizationController.cs index 9d9b66b..f99350f 100644 --- a/BBWYB.Server.API/Controllers/SkuOptimizationController.cs +++ b/BBWYB.Server.API/Controllers/SkuOptimizationController.cs @@ -72,13 +72,13 @@ namespace BBWYB.Server.API.Controllers } /// - /// 获取未完成spu优化任务数量 + /// 获取待优化任务数量 /// /// [HttpGet] public long GetNoCompletedSpuOptimizationTaskCount() { - return optimizationBusiness.GetNoCompletedSpuOptimizationTaskCount(); + return optimizationBusiness.GetNoCompletedSpuOptimizationTaskCount(GetUserId()); } } } diff --git a/BBWYB.Server.API/Controllers/UserController.cs b/BBWYB.Server.API/Controllers/UserController.cs new file mode 100644 index 0000000..257c39a --- /dev/null +++ b/BBWYB.Server.API/Controllers/UserController.cs @@ -0,0 +1,28 @@ +using BBWYB.Server.Business; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace BBWYB.Server.API.Controllers +{ + [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] + public class UserController : BaseApiController + { + private UserBusiness userBusiness; + + public UserController(IHttpContextAccessor httpContextAccessor, UserBusiness userBusiness) : base(httpContextAccessor) + { + this.userBusiness = userBusiness; + } + + /// + /// 获取登录用户是否为议价组 + /// + /// + [HttpGet] + public bool GetisBargainTeamByUserId() + { + return userBusiness.GetisBargainTeamByUserId(GetUserId(), false).isBargainTeam; + } + } +} diff --git a/BBWYB.Server.Business/DataRepair/DataRepairBusiness.cs b/BBWYB.Server.Business/DataRepair/DataRepairBusiness.cs index c9335a2..e271b67 100644 --- a/BBWYB.Server.Business/DataRepair/DataRepairBusiness.cs +++ b/BBWYB.Server.Business/DataRepair/DataRepairBusiness.cs @@ -15,7 +15,9 @@ using SDKAdapter.OperationPlatform.Client; using SDKAdapter.OperationPlatform.Models; using SDKAdapter.PurchasePlatform.Client; using SDKAdapter.PurchasePlatform.Models; +using System.Collections.Generic; using System.Data; +using System.Net.Http.Headers; using System.Reflection; using System.Text; using Yitter.IdGenerator; @@ -1473,9 +1475,10 @@ namespace BBWYB.Server.Business }); var errorPurchaserList = new List(); - var errorSchemeList = new List(); + //var errorSchemeList = new List(); var errorSchemeGroupList = new List(); + var dbPurchaserList = fsql.Select().ToList(); var dbPurchaseGroupList = fsql.Select().ToList(); var dbSchemeList = fsql.Select().ToList(); @@ -1486,6 +1489,8 @@ namespace BBWYB.Server.Business var updateSchemeGroupList = new List(); var deletePsgIdList = new List(); + + foreach (var purchaseRelation in purchaseRelations) { var dbPurchaser = dbPurchaserList.FirstOrDefault(p => p.Name == purchaseRelation.PurchaserName); @@ -1504,6 +1509,8 @@ namespace BBWYB.Server.Business } } + List compareNullBelongSchemeList = new List(); + var errorBelongSchemeList = new List(); foreach (var purchaseRelation in purchaseRelations) { var dbPurchaser = dbPurchaserList.FirstOrDefault(p => p.Name == purchaseRelation.PurchaserName); @@ -1512,11 +1519,12 @@ namespace BBWYB.Server.Business //查询使用了该采购商的采购方案 var usePurchaserSchemeIdList = dbSchemeProductList.Where(psp => psp.PurchaserId == dbPurchaser.Id) - .Select(psp => psp.SkuPurchaseSchemeId) - .Distinct() - .ToList(); + .Select(psp => psp.SkuPurchaseSchemeId) + .Distinct() + .ToList(); var usePurchaserSchemeList = dbSchemeList.Where(ps => usePurchaserSchemeIdList.Contains(ps.Id)).ToList(); + foreach (var scheme in usePurchaserSchemeList) { var pspList = dbSchemeProductList.Where(psp => psp.SkuPurchaseSchemeId == scheme.Id).ToList(); @@ -1527,14 +1535,27 @@ namespace BBWYB.Server.Business var currentSchemePurchaserBelongGroups = currentSchemePurchaserList.GroupBy(p => p.BelongBargainTeamId); if (currentSchemePurchaserBelongGroups.Count() > 1) { - var sb = new StringBuilder($"采购方案{scheme.Id}使用了{currentSchemePurchaserBelongGroups.Count()}个不同归属的采购商 "); + //if (currentSchemePurchaserBelongGroups.Any(g => string.IsNullOrEmpty(g.Key))) + //{ + //采购方案包含多个不同议价组的采购商且议价组Id为空 + var schemeModel = new BelongSchemeTestModel() + { + SchemeId = scheme.Id, + BelongPurchaserTestModelList = new List() + }; + compareNullBelongSchemeList.Add(schemeModel); + foreach (var belongGroup in currentSchemePurchaserBelongGroups) { - var teamName = belongGroup.FirstOrDefault()?.BelongBargainTeamName; - sb.Append($"{teamName}:{string.Join(",", belongGroup.Select(x => x.Name))},"); + foreach (var purchaser in belongGroup) + { + schemeModel.BelongPurchaserTestModelList.Add(new BelongPurchaserTestModel() + { + BelongTeam = string.IsNullOrEmpty(purchaser.BelongBargainTeamName) ? "空" : purchaser.BelongBargainTeamName, + PurchaserName = purchaser.Name + }); + } } - - errorSchemeList.Add(sb.ToString()); } else if (currentSchemePurchaserBelongGroups.Count() == 1) { @@ -1549,6 +1570,60 @@ namespace BBWYB.Server.Business } } + #region 筛选有没有混合空组采购商的情况 + foreach (var belongScheme in compareNullBelongSchemeList) + { + if (belongScheme.BelongPurchaserTestModelList.Any(p => p.BelongTeam == "空")) + { + var nullBelongPurchaserList = belongScheme.BelongPurchaserTestModelList.Where(p => p.BelongTeam == "空").ToList(); + var otherSchemeList = compareNullBelongSchemeList.Where(c => c.SchemeId != belongScheme.SchemeId && + c.BelongPurchaserTestModelList.Any(p => p.BelongTeam == "空") && + c.BelongGroupKey != belongScheme.BelongGroupKey && + c.BelongPurchaserTestModelList.Any(x => nullBelongPurchaserList.Any(y => y.PurchaserName == x.PurchaserName))).ToList(); + if (otherSchemeList.Count() > 0) + { + foreach (var belongPurchaser in nullBelongPurchaserList) + { + belongPurchaser.RelationSchemeIdList = otherSchemeList.Where(c => c.BelongPurchaserTestModelList.Any(x => belongPurchaser.PurchaserName == x.PurchaserName)).Select(c => c.SchemeId).Distinct().ToList(); + } + errorBelongSchemeList.Add(belongScheme); + } + else + { + //没有混合空组 + var firstNoNullBelongPurchaserName = belongScheme.BelongPurchaserTestModelList.FirstOrDefault(p => p.BelongTeam != "空")?.PurchaserName; + var firstNoNullBelongPurchaser = dbPurchaserList.FirstOrDefault(p => p.Name == firstNoNullBelongPurchaserName); + if (firstNoNullBelongPurchaser != null) + { + foreach (var nullBelongPurchaser in nullBelongPurchaserList) + { + var dbPurchaser = dbPurchaserList.FirstOrDefault(p => p.Name == nullBelongPurchaser.PurchaserName); + if (dbPurchaser != null) + { + dbPurchaser.BelongBargainTeamId = firstNoNullBelongPurchaser.BelongBargainTeamId; + dbPurchaser.BelongBargainTeamName = firstNoNullBelongPurchaser.BelongBargainTeamName; + dbPurchaser.BelongType = Enums.PurchaserBelongType.临时; + updatePurchaserList.Add(dbPurchaser); + } + } + + var dbScheme = dbSchemeList.FirstOrDefault(s => s.Id == belongScheme.SchemeId); + if (dbScheme != null) + { + dbScheme.BelongBargainTeamId = firstNoNullBelongPurchaser.BelongBargainTeamId; + dbScheme.BelongBargainTeamName = firstNoNullBelongPurchaser.BelongBargainTeamName; + updateSchemeList.Add(dbScheme); + } + } + } + } + else + { + errorBelongSchemeList.Add(belongScheme); + } + } + #endregion + foreach (var psg in dbPurchaseGroupList) { var schemeList = dbSchemeList.Where(ps => ps.SchemeGroupId == psg.Id).ToList(); @@ -1561,13 +1636,34 @@ namespace BBWYB.Server.Business var currentPsgPurchaserBelongGroups = schemeList.GroupBy(ps => ps.BelongBargainTeamId); if (currentPsgPurchaserBelongGroups.Count() > 1) { - var sb = new StringBuilder($"采购分组{psg.GroupName}使用了{currentPsgPurchaserBelongGroups.Count()}个不同归属的采购方案 "); - foreach (var belongGroup in currentPsgPurchaserBelongGroups) + //var sb = new StringBuilder($"采购分组{psg.GroupName}使用了{currentPsgPurchaserBelongGroups.Count()}个不同归属的采购方案"); + //foreach (var belongGroup in currentPsgPurchaserBelongGroups) + //{ + // var teamName = belongGroup.FirstOrDefault()?.BelongBargainTeamName; + // sb.Append($"{teamName}:{string.Join(",", belongGroup.Select(x => x.Id))},"); + //} + //errorSchemeGroupList.Add(sb.ToString()); + + var ps = currentPsgPurchaserBelongGroups.SelectMany(g => g.ToList()).FirstOrDefault(ps => !string.IsNullOrEmpty(ps.BelongBargainTeamId)); + + foreach (var schemeGroup in currentPsgPurchaserBelongGroups) + { + foreach (var scheme in schemeGroup) + { + if (string.IsNullOrEmpty(scheme.BelongBargainTeamId)) + { + scheme.BelongBargainTeamId = ps?.BelongBargainTeamId; + scheme.BelongBargainTeamName = ps?.BelongBargainTeamName; + updateSchemeList.Add(scheme); + } + } + } + + if (psg.BelongBargainTeamId != ps?.BelongBargainTeamId) { - var teamName = belongGroup.FirstOrDefault()?.BelongBargainTeamName; - sb.Append($"{teamName}:{string.Join(",", belongGroup.Select(x => x.Id))},"); + psg.BelongBargainTeamId = ps?.BelongBargainTeamId; + updateSchemeGroupList.Add(psg); } - errorSchemeGroupList.Add(sb.ToString()); } else if (currentPsgPurchaserBelongGroups.Count() == 1) { @@ -1581,10 +1677,15 @@ namespace BBWYB.Server.Business } if (errorPurchaserList.Count() > 0 || - errorSchemeList.Count() > 0 || + errorBelongSchemeList.Count() > 0 || errorSchemeGroupList.Count() > 0) { - var msg = JsonConvert.SerializeObject(errorPurchaserList.Union(errorSchemeList).Union(errorSchemeGroupList)); + if (errorBelongSchemeList.Count() > 0) + { + var msg2 = JsonConvert.SerializeObject(errorBelongSchemeList); + throw new BusinessException(msg2); + } + var msg = JsonConvert.SerializeObject(errorPurchaserList.Union(errorSchemeGroupList)); throw new BusinessException(msg); } diff --git a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs index 24db7ea..da64734 100644 --- a/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs +++ b/BBWYB.Server.Business/PurchaseOrder/PurchaseOrderBusiness.cs @@ -11,6 +11,7 @@ using BBWYB.Server.Model.Db.Mds; using BBWYB.Server.Model.Db.MDS; using BBWYB.Server.Model.Dto; using FreeSql; +using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -41,6 +42,7 @@ namespace BBWYB.Server.Business private Lazy venderBusinessLazy; private Lazy purchaseSchemeBusinessLazy; private Lazy timeLimitRulesLazy; + private Lazy memoryCacheLazy; private PP_PlatformClientFactory ppPlatformClientFactory => pplatformClientFactoryLazy.Value; private TaskSchedulerManager taskSchedulerManager => taskSchedulerManagerLazy.Value; @@ -59,8 +61,12 @@ namespace BBWYB.Server.Business private TimeLimitRules timeLimitRules => timeLimitRulesLazy.Value; + private IMemoryCache memoryCache => memoryCacheLazy.Value; + private IList cantPurchaseOrderStateList; + private TimeSpan _1688ConcurrentKeyTimeSpan; + public PurchaseOrderBusiness(IFreeSql fsql, NLogManager nLogManager, IIdGenerator idGenerator, @@ -79,12 +85,14 @@ namespace BBWYB.Server.Business venderBusinessLazy = new Lazy(() => serviceProvider.GetService()); purchaseSchemeBusinessLazy = new Lazy(() => serviceProvider.GetService()); timeLimitRulesLazy = new Lazy(() => serviceProvider.GetService()); + memoryCacheLazy = new Lazy(() => serviceProvider.GetService()); cantPurchaseOrderStateList = new List() { Enums.OrderState.已取消, Enums.OrderState.已完成, Enums.OrderState.待付款 }; + _1688ConcurrentKeyTimeSpan = new TimeSpan(0, 1, 0); } /// @@ -523,49 +531,33 @@ namespace BBWYB.Server.Business var allCargoParamList = new List(); request.CargoParamGroupList.ForEach(x => allCargoParamList.AddRange(x.CargoParamList)); - #region 更新采购方案 - { - var cargoParamGroupsBySchemeList = allCargoParamList.GroupBy(c => c.SchemeId); - foreach (var cargoParamGroupsByScheme in cargoParamGroupsBySchemeList) - { - var schemeId = cargoParamGroupsByScheme.Key; - var skuId = cargoParamGroupsByScheme.FirstOrDefault().BelongSkuId; - var skuItemCount = orderSkus.FirstOrDefault(osku => osku.SkuId == skuId)?.ItemTotal ?? 0; + //#region 更新采购方案 + //{ + // var cargoParamGroupsBySchemeList = allCargoParamList.GroupBy(c => c.SchemeId); + // foreach (var cargoParamGroupsByScheme in cargoParamGroupsBySchemeList) + // { + // var schemeId = cargoParamGroupsByScheme.Key; + // var skuId = cargoParamGroupsByScheme.FirstOrDefault().BelongSkuId; + // var skuItemCount = orderSkus.FirstOrDefault(osku => osku.SkuId == skuId)?.ItemTotal ?? 0; - //var lastPurchasePriceCost = cargoParamGroupsByScheme.Sum(cargoParam => createdPurchaseOrderItemList.Where(x => x.SkuId == cargoParam.SkuId) - // .Select(x => x.Price * (cargoParam.PurchaseRatio ?? 1)) - // .DefaultIfEmpty(0M) - // .First()); + // //var lastPurchasePriceCost = cargoParamGroupsByScheme.Sum(cargoParam => createdPurchaseOrderItemList.Where(x => x.SkuId == cargoParam.SkuId) + // // .Select(x => x.Price * (cargoParam.PurchaseRatio ?? 1)) + // // .DefaultIfEmpty(0M) + // // .First()); - var lastPurchasePriceCost = cargoParamGroupsByScheme.Sum(cargoParam => - { - return (createdPurchaseOrderItemList.FirstOrDefault(x => x.SkuId == cargoParam.SkuId)?.Price ?? 0) * (cargoParam.PurchaseRatio ?? 1); - }); + // var lastPurchasePriceCost = cargoParamGroupsByScheme.Sum(cargoParam => + // { + // return (createdPurchaseOrderItemList.FirstOrDefault(x => x.SkuId == cargoParam.SkuId)?.Price ?? 0) * (cargoParam.PurchaseRatio ?? 1); + // }); - var purchasedAmount = insertOrderCostDetails.Where(ocd => ocd.SkuId == skuId).Sum(ocd => ocd.SkuAmount); - var update = fsql.Update(schemeId).Set(ps => ps.LastPurchaseTime, DateTime.Now) - .Set(ps => ps.LastPurchasePriceCost, lastPurchasePriceCost) - .Set(ps => ps.PurchasedCount + 1) - .Set(ps => ps.PurchasedItemCount + skuItemCount) - .Set(ps => ps.PurchasedAmount + purchasedAmount); - updatePurchaseSchemeList.Add(update); - } - } - #endregion - - //#region 更新采购配件 - //{ - // foreach (var cargoParam in allCargoParamList) - // { - // var createOrderItem = createdPurchaseOrderItemList.FirstOrDefault(x => x.SkuId == cargoParam.SkuId); - // if (createOrderItem != null) - // { - // var update = fsql.Update() - // .Set(pss => pss.LastPurchasePriceCost, createOrderItem.Price) - // .Where(pss => pss.PurchaseSkuId == cargoParam.SkuId && pss.SkuPurchaseSchemeId == cargoParam.SchemeId); - // updatePssList.Add(update); - // } + // var purchasedAmount = insertOrderCostDetails.Where(ocd => ocd.SkuId == skuId).Sum(ocd => ocd.SkuAmount); + // var update = fsql.Update(schemeId).Set(ps => ps.LastPurchaseTime, DateTime.Now) + // .Set(ps => ps.LastPurchasePriceCost, lastPurchasePriceCost) + // .Set(ps => ps.PurchasedCount + 1) + // .Set(ps => ps.PurchasedItemCount + skuItemCount) + // .Set(ps => ps.PurchasedAmount + purchasedAmount); + // updatePurchaseSchemeList.Add(update); // } //} //#endregion @@ -2364,25 +2356,56 @@ namespace BBWYB.Server.Business //} #region 1688CallBack + private string Get1688ConcurrentKey(JObject j) + { + var type = j.Value("type").ToUpper(); + var poId = string.Empty; + switch (type) + { + case "ORDER_BUYER_VIEW_PART_PART_SENDGOODS": //部分发货 + case "ORDER_BUYER_VIEW_ANNOUNCE_SENDGOODS": //发货 + case "ORDER_BUYER_VIEW_ORDER_PRICE_MODIFY": //订单改价 + case "LOGISTICS_BUYER_VIEW_TRACE": //物流变更 + case "ORDER_BUYER_VIEW_ORDER_PAY": //支付 + poId = j["data"].Value("orderId"); + break; + default: + break; + } + if (string.IsNullOrEmpty(poId)) + return string.Empty; + + return $"{type}_{poId}"; + } + public void CallbackFrom1688(string jsonStr) { nLogManager.Default().Info(jsonStr); var jObject = JObject.Parse(jsonStr); + var _1688ConcurrentKey = Get1688ConcurrentKey(jObject); + + if (!string.IsNullOrEmpty(_1688ConcurrentKey)) + { + if (memoryCache.TryGetValue(_1688ConcurrentKey, out _)) + return;//并发key存在,不允执行 + memoryCache.Set(_1688ConcurrentKey, _1688ConcurrentKey, _1688ConcurrentKeyTimeSpan); + } + var type = jObject.Value("type").ToUpper(); switch (type) { case "ORDER_BUYER_VIEW_PART_PART_SENDGOODS": //部分发货 case "ORDER_BUYER_VIEW_ANNOUNCE_SENDGOODS": //发货 - DeliveryCallbackFrom1688(jObject); + DeliveryCallbackFrom1688(jObject, _1688ConcurrentKey); break; case "ORDER_BUYER_VIEW_ORDER_PRICE_MODIFY": - OrderPriceModificationCallbackFrom1688(jObject); //订单改价 + OrderPriceModificationCallbackFrom1688(jObject, _1688ConcurrentKey); //订单改价 break; case "LOGISTICS_BUYER_VIEW_TRACE": // LogisticsUpdateCallbackFrom1688(jObject);//1688物流信息变更 break; case "ORDER_BUYER_VIEW_ORDER_PAY": - OrderPayFrom1688(jObject); + OrderPayFrom1688(jObject, _1688ConcurrentKey); break; default: break; @@ -2393,17 +2416,21 @@ namespace BBWYB.Server.Business /// 1688发货回调 /// /// - private void DeliveryCallbackFrom1688(JObject jObject) + /// 并发key + private void DeliveryCallbackFrom1688(JObject jObject, string _1688ConcurrentKey) { var purchaseOrderId = jObject["data"].Value("orderId"); - Task.Factory.StartNew(() => DeliveryCallbackFrom1688(purchaseOrderId), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); + Task.Factory.StartNew(() => DeliveryCallbackFrom1688(purchaseOrderId, _1688ConcurrentKey), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); } /// /// 1688发货回调 /// - /// 采购单 - private void DeliveryCallbackFrom1688(string purchaseOrderId) + /// + /// + /// + /// + private void DeliveryCallbackFrom1688(string purchaseOrderId, string _1688ConcurrentKey) { string orderId = string.Empty; long? shopId = null; @@ -2641,22 +2668,28 @@ namespace BBWYB.Server.Business { nLogManager.Default().Error(ex, $"DeliveryCallback 回调平台1688,订单号{orderId},采购单号{purchaseOrderId},执行进度[{currentProgress}],采购单物流信息:{wayBillNoResponseInfo}"); } + finally + { + if (!string.IsNullOrEmpty(_1688ConcurrentKey)) + memoryCache.Remove(_1688ConcurrentKey); + } } /// /// 1688订单改价回调 /// /// - private void OrderPriceModificationCallbackFrom1688(JObject jObject) + /// + private void OrderPriceModificationCallbackFrom1688(JObject jObject, string _1688ConcurrentKey) { var purchaseOrderId = jObject["data"].Value("orderId"); - Task.Factory.StartNew(() => OrderPriceModificationCallback(purchaseOrderId, Enums.Platform.阿里巴巴), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); + Task.Factory.StartNew(() => OrderPriceModificationCallback(purchaseOrderId, Enums.Platform.阿里巴巴, _1688ConcurrentKey), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); } - private void OrderPayFrom1688(JObject jObject) + private void OrderPayFrom1688(JObject jObject, string _1688ConcurrentKey) { var purchaseOrderId = jObject["data"].Value("orderId"); - Task.Factory.StartNew(() => OrderPayCallback(purchaseOrderId, Enums.Platform.阿里巴巴), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); + Task.Factory.StartNew(() => OrderPayCallback(purchaseOrderId, Enums.Platform.阿里巴巴, _1688ConcurrentKey), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.PurchaseOrderCallbackTaskScheduler); } #endregion @@ -2666,14 +2699,21 @@ namespace BBWYB.Server.Business /// /// /// - private void OrderPriceModificationCallback(string purchaseOrderId, Enums.Platform callbackPlatform) + /// + private void OrderPriceModificationCallback(string purchaseOrderId, Enums.Platform callbackPlatform, string concurrentKey) { - OnSomeOnePurchaseOrderChanged(purchaseOrderId, true); + OnSomeOnePurchaseOrderChanged(purchaseOrderId, true, concurrentKey); } - private void OrderPayCallback(string purchaseOrderId, Enums.Platform callbackPlatform) + /// + /// 订单支付回调 + /// + /// + /// + /// + private void OrderPayCallback(string purchaseOrderId, Enums.Platform callbackPlatform, string concurrentKey) { - OnSomeOnePurchaseOrderChanged(purchaseOrderId, false); + OnSomeOnePurchaseOrderChanged(purchaseOrderId, false, concurrentKey); } public void KuaiDi100Publish(string param) @@ -2945,7 +2985,8 @@ namespace BBWYB.Server.Business /// /// 采购单Id /// 当不需要触发订单改价时是否继续走流程 - public void OnSomeOnePurchaseOrderChanged(string purchaseOrderId, bool keepRunWhenNoEditOrderPirce) + /// 并发key + public void OnSomeOnePurchaseOrderChanged(string purchaseOrderId, bool keepRunWhenNoEditOrderPirce, string concurrentKey) { bool isEditOrderPrice = true; try @@ -3200,6 +3241,11 @@ namespace BBWYB.Server.Business { nLogManager.Default().Error(ex, $"OrderPriceModificationCallback 采购单号{purchaseOrderId}"); } + finally + { + if (!string.IsNullOrEmpty(concurrentKey)) + memoryCache.Remove(concurrentKey); + } } private void SendDingDing(string content) diff --git a/BBWYB.Server.Business/SkuOptimization/OptimizationBusiness.cs b/BBWYB.Server.Business/SkuOptimization/OptimizationBusiness.cs index 52e80a4..65ecade 100644 --- a/BBWYB.Server.Business/SkuOptimization/OptimizationBusiness.cs +++ b/BBWYB.Server.Business/SkuOptimization/OptimizationBusiness.cs @@ -8,6 +8,7 @@ using BBWYB.Server.Model.Db.SpuOptimization; using BBWYB.Server.Model.Dto; using FreeSql; using Newtonsoft.Json; +using Org.BouncyCastle.Asn1; using System.Numerics; using System.Text.RegularExpressions; using Yitter.IdGenerator; @@ -619,6 +620,7 @@ namespace BBWYB.Server.Business request.EndTime = request.EndTime.Date.AddDays(1).AddSeconds(-1); var uInfo = userBusiness.GetisBargainTeamByUserId(userId); + ISelect select = null; if (request.SpuOptimizationTaskId != null && request.SpuOptimizationTaskId != 0) { @@ -635,9 +637,10 @@ namespace BBWYB.Server.Business skuKeyWords = request.SpuOrSku; } + var barginTeamId = uInfo.bargainTeam?.Id ?? string.Empty; + select = fsql.Select() - .Where(t => t.IsOptimizationCompleted == false && - t.CreateTime >= request.StartTime && + .Where(t => t.CreateTime >= request.StartTime && t.CreateTime <= request.EndTime) .WhereIf(request.BelongShopId != null && request.BelongShopId != 0, t => t.BelongShopId == request.BelongShopId) .WhereIf(!string.IsNullOrEmpty(request.JDSku) || @@ -648,9 +651,72 @@ namespace BBWYB.Server.Business .Any()) .WhereIf(!string.IsNullOrEmpty(request.TitleKeywords), t => t.ProductTitle.Contains(request.TitleKeywords)) .WhereIf(!string.IsNullOrEmpty(spuKeyWords), t => t.ProductId == spuKeyWords); + + /* + .WhereIf(request.IsCompleted, t => t.IsOptimizationCompleted == true || + fsql.Select() + .Where(sbt => sbt.IsOptimizationCompleted == true && + sbt.SpuOptimizationTaskId == t.Id && + sbt.BelongTeamId == barginTeamId) + .Any()) + .WhereIf(!request.IsCompleted && !string.IsNullOrEmpty(barginTeamId), t => t.IsOptimizationCompleted == false && + fsql.Select() + .Where(sbt => sbt.IsOptimizationCompleted == false && + sbt.SpuOptimizationTaskId == t.Id && + sbt.BelongTeamId == barginTeamId) + .Any()) + .WhereIf(!request.IsCompleted && string.IsNullOrEmpty(barginTeamId), t => t.IsOptimizationCompleted == false) + */ + if (request.State == 0) + { + if (string.IsNullOrEmpty(barginTeamId)) + { + //非议价组查询未完成 + select = select.Where(t => t.IsOptimizationCompleted == false); + } + else + { + //议价组查询未完成 + select = select.Where(t => t.IsOptimizationCompleted == false && + fsql.Select() + .Where(sbt => sbt.IsOptimizationCompleted == false && + sbt.SpuOptimizationTaskId == t.Id && + sbt.BelongTeamId == barginTeamId) + .Any()); + } + } + else if (request.State == 1) + { + if (string.IsNullOrEmpty(barginTeamId)) + { + //非议价组查询已完成 + select = select.Where(t => t.IsOptimizationCompleted == true); + } + else + { + //议价组查询已完成 + select = select.Where(t => fsql.Select() + .Where(sbt => sbt.IsOptimizationCompleted == true && + sbt.SpuOptimizationTaskId == t.Id && + sbt.BelongTeamId == barginTeamId) + .Any()); + } + } + else if (request.State == 2) + { + //已超时 + select = select.Where(t => t.IsOptimizationCompleted == true) + .Where(t => fsql.Select() + .Where(sbt => sbt.IsOptimizationCompleted == false && + sbt.SpuOptimizationTaskId == t.Id) + .WhereIf(!string.IsNullOrEmpty(barginTeamId), sbt => sbt.BelongTeamId == barginTeamId) + .Any()); + } } - var taskList = select.OrderByDescending(t => t.CreateTime) + var sql = select.ToSql(); + + var taskList = select.OrderBy(t => t.CreateTime) .Count(out var total) .Page(request.PageIndex, request.PageSize) .ToList(); @@ -837,6 +903,7 @@ namespace BBWYB.Server.Business IUpdate updateSpuTask = null; IUpdate updateSpuSaleInfo = null; IUpdate updateCompetitiveTenderTask = null; + IUpdate updateTimeLimitTask = null; var spuOptimizationBargainTeamTaskList = fsql.Select() .Where(sbt => sbt.SpuOptimizationTaskId == taskId) @@ -894,12 +961,33 @@ namespace BBWYB.Server.Business .Set(ct => ct.IsWin, true); #endregion } + else + { + //重启任务 + if (spuOptimizationTask.ReStartTimes < 2) + { + var timeLimitTask = fsql.Select().Where(t => t.TaskType == Enums.TimeLimitTaskType.待议价任务 && + t.TaskId == spuOptimizationTask.Id).ToOne(); + if (timeLimitTask != null) + { + var expirationTime = timeLimitRules.CalculateExpirationTime(Enums.TimeLimitTaskType.待议价任务, DateTime.Now); + updateTimeLimitTask = fsql.Update(timeLimitTask.Id) + .Set(t => t.ExpirationTime, expirationTime) + .Set(t => t.CompletionTime, null) + .Set(t => t.IsTimely, null); + } + spuOptimizationTask.ReStartTimes++; + updateSpuTask = fsql.Update(spuOptimizationTask.Id) + .Set(t => t.ReStartTimes, spuOptimizationTask.ReStartTimes); + } + } fsql.Transaction(() => { updateSpuTask?.ExecuteAffrows(); updateSpuSaleInfo?.ExecuteAffrows(); updateCompetitiveTenderTask?.ExecuteAffrows(); + updateTimeLimitTask?.ExecuteAffrows(); }); } catch (Exception ex) @@ -946,8 +1034,20 @@ namespace BBWYB.Server.Business //fsql.Delete(ctTaskIdList).ExecuteAffrows(); } - public long GetNoCompletedSpuOptimizationTaskCount() + public long GetNoCompletedSpuOptimizationTaskCount(string userId) { + var uInfo = userBusiness.GetisBargainTeamByUserId(userId); + if (uInfo.isBargainTeam) + { + var barginTeamId = uInfo.bargainTeam?.Id ?? string.Empty; + return fsql.Select().Where(t => t.IsOptimizationCompleted == false && + fsql.Select() + .Where(sbt => sbt.IsOptimizationCompleted == false && + sbt.SpuOptimizationTaskId == t.Id && + sbt.BelongTeamId == barginTeamId) + .Any()).Count(); + } + return fsql.Select().Where(t => t.IsOptimizationCompleted == false).Count(); } } diff --git a/BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs b/BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs index bf98724..e217ff8 100644 --- a/BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs +++ b/BBWYB.Server.Business/TimeLimitTask/TimeLimitTaskBusiness.cs @@ -38,11 +38,6 @@ namespace BBWYB.Server.Business } public void CheckTask() { - //fsql.Update().Set(t => t.IsTimely, false) - // .Where(t => t.CompletionTime == null) - // .Where(t => t.ExpirationTime < DateTime.Now) - // .ExecuteAffrows(); - var timeoutTaskList = fsql.Select().Where(t => t.CompletionTime == null && t.ExpirationTime < DateTime.Now).ToList(); if (timeoutTaskList.Count() > 0) { diff --git a/BBWYB.Server.Model/BelongTestModel.cs b/BBWYB.Server.Model/BelongTestModel.cs new file mode 100644 index 0000000..ba9c32c --- /dev/null +++ b/BBWYB.Server.Model/BelongTestModel.cs @@ -0,0 +1,28 @@ +namespace BBWYB.Server.Model +{ + public class BelongSchemeTestModel + { + public long SchemeId { get; set; } + + public IList BelongPurchaserTestModelList { get; set; } + + public string BelongGroupKey + { + get + { + return string.Join(",", BelongPurchaserTestModelList.OrderBy(x => x.BelongTeam) + .Select(x => x.BelongTeam) + .Distinct()); + } + } + } + + public class BelongPurchaserTestModel + { + public string PurchaserName { get; set; } + + public string BelongTeam { get; set; } + + public List RelationSchemeIdList { get; set; } + } +} diff --git a/BBWYB.Server.Model/Db/SpuOptimization/Spuoptimizationtask.cs b/BBWYB.Server.Model/Db/SpuOptimization/Spuoptimizationtask.cs index 97c0020..1c5c598 100644 --- a/BBWYB.Server.Model/Db/SpuOptimization/Spuoptimizationtask.cs +++ b/BBWYB.Server.Model/Db/SpuOptimization/Spuoptimizationtask.cs @@ -87,6 +87,12 @@ namespace BBWYB.Server.Model.Db [Column(DbType = "int", MapType = typeof(int?))] public Enums.TriggerOptimizationReason? TriggerOptimizationReason { get; set; } + /// + /// 重启次数 + /// + [Column(DbType = "int")] + public int ReStartTimes { get; set; } = 0; + } } diff --git a/BBWYB.Server.Model/Dto/Request/Optimization/QueryNoCompletionOptimizationTaskRequest.cs b/BBWYB.Server.Model/Dto/Request/Optimization/QueryNoCompletionOptimizationTaskRequest.cs index bca729f..9e8e835 100644 --- a/BBWYB.Server.Model/Dto/Request/Optimization/QueryNoCompletionOptimizationTaskRequest.cs +++ b/BBWYB.Server.Model/Dto/Request/Optimization/QueryNoCompletionOptimizationTaskRequest.cs @@ -40,5 +40,20 @@ namespace BBWYB.Server.Model.Dto /// 标题关键字 /// public string TitleKeywords { get; set; } + + ///// + ///// 是否完成 (议价组完成视为完成) + ///// + //public bool IsCompleted { get; set; } + + ///// + ///// 是否关闭 + ///// + //public bool IsClosed { get; set; } + + /// + /// 任务相对状态 0=待优化 1=已完成 2=已关闭 + /// + public int State { get; set; } } } diff --git a/BBWYB.Server.Model/Dto/Response/Optimization/SpuOptimizationBargainTeamTaskResponse.cs b/BBWYB.Server.Model/Dto/Response/Optimization/SpuOptimizationBargainTeamTaskResponse.cs index 5ec20a4..5167561 100644 --- a/BBWYB.Server.Model/Dto/Response/Optimization/SpuOptimizationBargainTeamTaskResponse.cs +++ b/BBWYB.Server.Model/Dto/Response/Optimization/SpuOptimizationBargainTeamTaskResponse.cs @@ -4,5 +4,6 @@ namespace BBWYB.Server.Model.Dto { public class SpuOptimizationBargainTeamTaskResponse : SpuOptimizationBargainTeamTask { + } }