From adda03e0fb9e9219cf19176453e0e82bbd10c8ba Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 3 Aug 2023 15:18:00 +0800 Subject: [PATCH] =?UTF-8?q?Wms=E8=87=AA=E5=AE=9A=E4=B9=89=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E6=9C=8D=E5=8A=A1=E4=BB=A3=E7=A0=81=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IWmsSetSortingService.cs | 16 ++ .../IWmskittingOutService.cs | 11 ++ .../TimedTaskBackgroundService.cs | 102 +++++++++-- .../Tnb.WarehouseMgr/Tnb.WarehouseMgr.csproj | 1 + .../Tnb.WarehouseMgr/WareHouseService.cs | 171 +++++++++--------- .../Tnb.WarehouseMgr/WmsSetSortingService.cs | 35 ++-- .../Tnb.WarehouseMgr/WmskittingOutService.cs | 53 +++--- common/Tnb.Common/Extension/TaskExtensions.cs | 41 +++++ message/Tnb.Message/Service/MessageService.cs | 5 +- 9 files changed, 289 insertions(+), 146 deletions(-) create mode 100644 WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsSetSortingService.cs create mode 100644 common/Tnb.Common/Extension/TaskExtensions.cs diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsSetSortingService.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsSetSortingService.cs new file mode 100644 index 00000000..73418490 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsSetSortingService.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tnb.WarehouseMgr.Interfaces +{ + /// + /// 齐套分拣业务接口 + /// + public interface IWmsSetSortingService + { + Task PackSortingByAdd(CancellationTokenSource? cts = default); + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmskittingOutService.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmskittingOutService.cs index 9267f90b..25f052e5 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmskittingOutService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmskittingOutService.cs @@ -18,5 +18,16 @@ namespace Tnb.WarehouseMgr.Interfaces /// /// Task MESKittingOutStk(List input); + /// + /// 齐套出库(新增状态) + /// + /// + Task KittingOutByAdd(CancellationTokenSource? cts = default); + /// + /// 齐套出库,(待配送状态) + /// + /// + /// + Task KittingOutByIsToBeShipped(CancellationTokenSource? cts = default); } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs b/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs index 2cbddff8..728d6155 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs @@ -4,10 +4,15 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using JNPF; +using JNPF.Common.Core.Manager; +using JNPF.Common.Dtos.Message; using JNPF.Common.Extension; +using JNPF.FriendlyException; using JNPF.Logging; +using JNPF.Message.Interfaces.Message; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.Extensions.Hosting; +using Tnb.Common.Extension; using Tnb.WarehouseMgr.Entities.Dto.Inputs; using Tnb.WarehouseMgr.Interfaces; @@ -19,28 +24,97 @@ namespace Tnb.WarehouseMgr /// public class TimedTaskBackgroundService : BackgroundService { + private ISendMessageService? _sendService; protected override async Task ExecuteAsync(CancellationToken stoppingToken) { - - await Task.Run(() => + await Task.Run(async () => { - CancellationTokenSource tokenSource = new(); - CancellationToken token = tokenSource.Token; + _sendService = App.GetRequiredService(); + var userManager = App.GetRequiredService(); + List toUserIds = new List() { "25398501929509" }; + //生成任务执行 + CancellationTokenSource genTaskCTS = new(); + CancellationTokenSource kittingOutAddCts = new(); + CancellationTokenSource kittingOutShippedCts = new(); + CancellationTokenSource setSortingCts = new(); + var wareHouseService = App.GetRequiredService(); - TimedTask(withOutParamAction: (cts) => Task.Run(async () => - { - while (!token.IsCancellationRequested) - { - await wareHouseService.GenTaskExecute(tokenSource); - await Task.Delay(1000); - } - }, token)); + await TimedTask(cts => wareHouseService.GenTaskExecute(cts), genTaskCTS, toUserIds); + //齐套出库 + + var kittingOutService = App.GetRequiredService(); + await TimedTask(cts => kittingOutService.KittingOutByAdd(cts), kittingOutAddCts, toUserIds); + await TimedTask(cts => kittingOutService.KittingOutByIsToBeShipped(cts), kittingOutShippedCts, toUserIds); + //齐套分拣 + var setSortingService = App.GetRequiredService(); + await TimedTask(cts => setSortingService.PackSortingByAdd(cts), setSortingCts, toUserIds); + + #region 老的方式 + //TimedTask(withOutParamAction: () => Task.Run(async () => + //{ + // while (!genTaskToken.IsCancellationRequested) + // { + // await wareHouseService.GenTaskExecute(genTaskCTS).Catch(ex => + // { + + // }); + // await Task.Delay(1000); + // } + //}, genTaskToken)); + + + //CancellationTokenSource kittingOutAddCts = new(); + //CancellationToken kittingOutAddToken = kittingOutAddCts.Token; + + + //var kittingOutService = App.GetRequiredService(); + //TimedTask(withOutParamAction: () => Task.Run(async () => + //{ + // while (!kittingOutAddToken.IsCancellationRequested) + // { + // await kittingOutService.KittingOutByAdd(kittingOutAddCts); + // await Task.Delay(1000); + // } + //}, kittingOutAddToken)); + + + //CancellationTokenSource kittingOutShippedCts = new(); + //CancellationToken kittingOutShippedToken = kittingOutShippedCts.Token; + + //TimedTask(withOutParamAction: () => Task.Run(async () => + //{ + // while (!kittingOutShippedToken.IsCancellationRequested) + // { + // await kittingOutService.KittingOutByIsToBeShipped(kittingOutShippedCts); + // await Task.Delay(1000); + // } + //}, kittingOutShippedToken)); + #endregion + }); } - private Task? TimedTask(Func? withOutParamAction = null, Func? withParemAction = null, CancellationTokenSource? cts = default, TimedtaskInput? parameter = null) + private Task? TimedTask(Func? withOutParamAction = null, Func? withParemAction = null, TimedtaskInput? parameter = null) { - return parameter != null ? withParemAction?.Invoke(parameter) : withOutParamAction?.Invoke(cts); + return parameter != null ? withParemAction?.Invoke(parameter) : withOutParamAction?.Invoke(); + } + + private Task TimedTask(Func action, CancellationTokenSource cts, List? toUserIds = default) + { + var token = cts.Token; + return Task.Run(async () => + { + while (!token.IsCancellationRequested) + { + await action(cts).Catch(ex => + { + //MessageSendModel messageSendModel = new(); + //_sendService?.SendMessage(); + //messageService.SentMessage(toUserIds!, ex.Message, ex.ToString()); + }); + await Task.Delay(1000); + } + }, token); } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/Tnb.WarehouseMgr.csproj b/WarehouseMgr/Tnb.WarehouseMgr/Tnb.WarehouseMgr.csproj index 11bee379..cb4b994d 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/Tnb.WarehouseMgr.csproj +++ b/WarehouseMgr/Tnb.WarehouseMgr/Tnb.WarehouseMgr.csproj @@ -12,6 +12,7 @@ + diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index e0d69443..29484940 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -188,7 +188,6 @@ namespace Tnb.WarehouseMgr var whereExprable = Expressionable.Create() .And((a, b, c) => a.is_lock == 0) .And((a, b, c) => !string.IsNullOrEmpty(a.location_id)) - //.And((a, b, c) => a.status == (int)EnumCarryStatus.占用) .And((a, b, c) => c.is_type == ((int)EnumLocationType.存储库位).ToString()) .And((a, b, c) => a.out_status == "0") .And((a, b, c) => c.wh_id == input.warehouse_id) @@ -217,21 +216,13 @@ namespace Tnb.WarehouseMgr [HttpPost] public async Task GenTaskExecute(CancellationTokenSource? cts = default) { - //test - //CancellationTokenSource curCts = new(); - - //curCts?.Cancel(); - //if (cts != null) - //{ - // cts = CancellationTokenSource.CreateLinkedTokenSource(cts.Token, curCts.Token); - //} - //cts?.Cancel(); - //await Task.CompletedTask; Stopwatch sw = Stopwatch.StartNew(); var db = _db.CopyNew(); - //获取所有未下发的预任务申请 - var preTasks = await db.Queryable().InnerJoin((a, b) => a.startlocation_id == b.location_id && a.carry_id == b.id) + try + { + //获取所有未下发的预任务申请 + var preTasks = await db.Queryable().InnerJoin((a, b) => a.startlocation_id == b.location_id && a.carry_id == b.id) .InnerJoin((a, b, c) => a.area_id == c.id) .Where(a => a.status == WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID) .OrderBy(a => new { priority = SqlFunc.Desc(a.priority), a.bill_code }) @@ -240,90 +231,89 @@ namespace Tnb.WarehouseMgr move_num = c.move_num }, true) .ToListAsync(); - var ids = preTasks.Select(x => x.id).Distinct().ToList(); - var preTaskCodes = await db.Queryable().Where(it => ids.Contains(it.bill_id)).ToListAsync(); - if (preTasks.Count > 0) - { - //根据预任务管理区分组,获取到所有分组后的预任务,遍历每个预任务 是否为任务链,通过管理区ID - var preTaskGroups = preTasks.GroupBy(g => g.area_code).ToList(); - List disTasks = new(); - List distaskCodes = new(); - foreach (var itGroup in preTaskGroups) + var ids = preTasks.Select(x => x.id).Distinct().ToList(); + var preTaskCodes = await db.Queryable().Where(it => ids.Contains(it.bill_id)).ToListAsync(); + if (preTasks.Count > 0) { - var items = itGroup.Adapt>(); - for (int i = 0, cnt = items.Count; i < cnt; i++) + //根据预任务管理区分组,获取到所有分组后的预任务,遍历每个预任务 是否为任务链,通过管理区ID + var preTaskGroups = preTasks.GroupBy(g => g.area_code).ToList(); + List disTasks = new(); + List distaskCodes = new(); + foreach (var itGroup in preTaskGroups) { - items[i].id = SnowflakeIdHelper.NextId(); - items[i].status = WmsWareHouseConst.TASK_BILL_STATUS_DZX_ID; - } - var moveNum = itGroup.First().move_num; - var itemsCount = items.Count; - var mod = itemsCount % moveNum > 0 ? itemsCount / moveNum + 1 : itemsCount / moveNum; - var arrary = items.ToArray(); - for (int i = 1; i <= mod; i++) - { - var groupCode = await _billRullService.GetBillNumber(WmsWareHouseConst.WMS_TASK_EXECUTE_ENCODE); - if (moveNum >= 1) + var items = itGroup.Adapt>(); + for (int i = 0, cnt = items.Count; i < cnt; i++) { - var areaPreTasks = itGroup.ToList(); - - if (moveNum == 1 || (moveNum > areaPreTasks.Count && areaPreTasks.Count == 1)) + items[i].id = SnowflakeIdHelper.NextId(); + items[i].status = WmsWareHouseConst.TASK_BILL_STATUS_DZX_ID; + } + var moveNum = itGroup.First().move_num; + var itemsCount = items.Count; + var mod = itemsCount % moveNum > 0 ? itemsCount / moveNum + 1 : itemsCount / moveNum; + var arrary = items.ToArray(); + for (int i = 1; i <= mod; i++) + { + var groupCode = await _billRullService.GetBillNumber(WmsWareHouseConst.WMS_TASK_EXECUTE_ENCODE); + if (moveNum >= 1) { - items.ForEach(x => - { - x.is_chain = 0; - }); - items[0].groups = groupCode; - items[0].bill_code = $"{groupCode}-1"; - } - else if ((moveNum >= areaPreTasks.Count && areaPreTasks.Count > 1) || moveNum < areaPreTasks.Count) - { - items.ForEach(x => x.is_chain = 1); + var areaPreTasks = itGroup.ToList(); - var start = 0; - var end = Math.Min(itemsCount, moveNum); - var arrList = new List(mod); - - while (start < itemsCount) + if (moveNum == 1 || (moveNum > areaPreTasks.Count && areaPreTasks.Count == 1)) { - var subArray = arrary[start..end]; - arrList.Add(subArray); - start = end; - end = Math.Min((end + moveNum), arrary.Length); - } - - foreach (var arr in arrList) - { - for (int j = 1, len = arr.Length; j <= len; j++) + items.ForEach(x => { - arr[j - 1].groups = groupCode; - arr[j - 1].bill_code = $"{groupCode}-{j}"; + x.is_chain = 0; + }); + items[0].groups = groupCode; + items[0].bill_code = $"{groupCode}-1"; + } + else if ((moveNum >= areaPreTasks.Count && areaPreTasks.Count > 1) || moveNum < areaPreTasks.Count) + { + items.ForEach(x => x.is_chain = 1); + + var start = 0; + var end = Math.Min(itemsCount, moveNum); + var arrList = new List(mod); + + while (start < itemsCount) + { + var subArray = arrary[start..end]; + arrList.Add(subArray); + start = end; + end = Math.Min((end + moveNum), arrary.Length); + } + + foreach (var arr in arrList) + { + for (int j = 1, len = arr.Length; j <= len; j++) + { + arr[j - 1].groups = groupCode; + arr[j - 1].bill_code = $"{groupCode}-{j}"; + } } } } } - } - if (preTaskCodes?.Count > 0) - { - foreach (var disTask in items) + if (preTaskCodes?.Count > 0) { - var curPreTaskCodes = preTaskCodes.FindAll(x => x.bill_id == disTask.pretask_id); - var curDisTaskCodes = curPreTaskCodes.Adapt>(); - curDisTaskCodes.ForEach(x => + foreach (var disTask in items) { - x.id = SnowflakeIdHelper.NextId(); - x.bill_id = disTask.id; - x.create_time = DateTime.Now; - }); - distaskCodes.AddRange(curDisTaskCodes); + var curPreTaskCodes = preTaskCodes.FindAll(x => x.bill_id == disTask.pretask_id); + var curDisTaskCodes = curPreTaskCodes.Adapt>(); + curDisTaskCodes.ForEach(x => + { + x.id = SnowflakeIdHelper.NextId(); + x.bill_id = disTask.id; + x.create_time = DateTime.Now; + }); + distaskCodes.AddRange(curDisTaskCodes); + } } + + disTasks.AddRange(items); } - disTasks.AddRange(items); - } - try - { await db.Ado.BeginTranAsync(); //disTasks.ForEach(x => x.id = SnowflakeIdHelper.NextId()); @@ -352,16 +342,19 @@ namespace Tnb.WarehouseMgr sw.Stop(); JNPF.Logging.Log.Information($"程序运行耗时{sw.ElapsedMilliseconds}ms"); await db.Ado.CommitTranAsync(); + } - catch (Exception) - { - await db.Ado.RollbackTranAsync(); - cts?.Cancel(); - } - finally - { - cts?.Dispose(); - } + } + catch (Exception ex) + { + JNPF.Logging.Log.Error("生成预任务执行时出现错误",ex); + await db.Ado.RollbackTranAsync(); + cts?.Cancel(); + throw; + } + finally + { + cts?.Dispose(); } } /// diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsSetSortingService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsSetSortingService.cs index 7a34163e..f0cb8afd 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsSetSortingService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsSetSortingService.cs @@ -29,7 +29,7 @@ namespace Tnb.WarehouseMgr /// 齐套分拣服务类 /// [ServiceModule(BizTypeId)] - public class WmsSetSortingService : BaseWareHouseService + public class WmsSetSortingService : BaseWareHouseService, IWmsSetSortingService { private readonly ISqlSugarClient _db; private readonly IWareHouseService _wareHouseService; @@ -50,27 +50,28 @@ namespace Tnb.WarehouseMgr /// /// [HttpPost] - public async Task PackSortingByAdd(WmsCarryMat carryMat) + public async Task PackSortingByAdd(CancellationTokenSource? cts = default) { + var curDb = _db.CopyNew(); string firstLocationId = "27010980724501", secondLocationId = "27010987857941"; - var endLocation = await _db.Queryable().SingleAsync(it => it.id == secondLocationId); + var endLocation = await curDb.Queryable().SingleAsync(it => it.id == secondLocationId); - var setSortings = await _db.Queryable() + var setSortings = await curDb.Queryable() .Where(a => a.status == WmsWareHouseConst.BILLSTATUS_ADD_ID) .Select() .OrderBy(a => a.seq) .ToListAsync(); - var items = await _db.Queryable().Where(it => it.status == WmsWareHouseConst.BILLSTATUS_ON_ID).ToListAsync(); + var items = await curDb.Queryable().Where(it => it.status == WmsWareHouseConst.BILLSTATUS_ON_ID).ToListAsync(); var onFlag = items?.Count > 0; try { - await _db.Ado.BeginTranAsync(); + await curDb.Ado.BeginTranAsync(); if (setSortings?.Count > 0 && !onFlag) { var singleSorting = setSortings[0]; - var setSortingDList = await _db.Queryable().Where(it => it.bill_id == singleSorting.id).ToListAsync(); + var setSortingDList = await curDb.Queryable().Where(it => it.bill_id == singleSorting.id).ToListAsync(); if (setSortingDList?.Count > 0) { List carryMats = new(); @@ -81,13 +82,12 @@ namespace Tnb.WarehouseMgr { var OutStockStrategyInput = new OutStockStrategyQuery { - carry_id = carryMat.carry_id, material_id = os.material_id, warehouse_id = os.warehouse_id, code_batch = os.code_batch, }; var outStkCarrys = await _wareHouseService.OutStockStrategy(OutStockStrategyInput); - var carryCodesPart = await _db.Queryable().InnerJoin((a, b) => a.id == b.carry_id).InnerJoin((a, b, c) => a.location_id == c.id) + var carryCodesPart = await curDb.Queryable().InnerJoin((a, b) => a.id == b.carry_id).InnerJoin((a, b, c) => a.location_id == c.id) .Where((a, b) => outStkCarrys.Select(x => x.id).Contains(b.carry_id)) .Select() .ToListAsync(); @@ -138,19 +138,18 @@ namespace Tnb.WarehouseMgr return carryMat; }) .ToList(); - await _db.Insertable(carryMats).ExecuteCommandAsync(); + await curDb.Insertable(carryMats).ExecuteCommandAsync(); carryIds = carryMats.Select(x => x.carry_id).Distinct().ToList(); - await _db.Updateable().SetColumns(it => new WmsCarryH { out_status = ((int)EnumOutStatus.全部出).ToString(), collocation_scheme_id = singleSorting.collocation_scheme_id, collocation_scheme_code = singleSorting.collocation_scheme_code }).Where(it => carryIds.Contains(it.id)).ExecuteCommandAsync(); + await curDb.Updateable().SetColumns(it => new WmsCarryH { out_status = ((int)EnumOutStatus.全部出).ToString(), collocation_scheme_id = singleSorting.collocation_scheme_id, collocation_scheme_code = singleSorting.collocation_scheme_code }).Where(it => carryIds.Contains(it.id)).ExecuteCommandAsync(); //天益项目不需要 //await _db.Updateable().SetColumns(it => new WmsCarryH { out_status = ((int)EnumOutStatus.分拣出).ToString() }).Where(it => sortingOutIds.Contains(it.id)).ExecuteCommandAsync(); } - var carrys = await _db.Queryable().Where(it => carryIds.Contains(it.id)).ToArrayAsync(); + var carrys = await curDb.Queryable().Where(it => carryIds.Contains(it.id)).ToArrayAsync(); if (carrys?.Length > 0) { if (setSortings?.Count > 0) { - var curCarry = carrys[^carrys.Length]; var isMatch = await IsCarryAndLocationMatchByCarryStd(curCarry, endLocation); if (!isMatch) throw new AppFriendlyException("库位与载具规格不匹配", 500); @@ -184,7 +183,7 @@ namespace Tnb.WarehouseMgr pretaskCodes.AddRange(curPreTaskCodes); } await _wareHouseService.GenPreTask(preTasks, pretaskCodes); - await _db.Updateable().SetColumns(it => new WmsSetsortingH { status = WmsWareHouseConst.BILLSTATUS_ON_ID }).Where(it => it.id == singleSorting.id).ExecuteCommandAsync(); + await curDb.Updateable().SetColumns(it => new WmsSetsortingH { status = WmsWareHouseConst.BILLSTATUS_ON_ID }).Where(it => it.id == singleSorting.id).ExecuteCommandAsync(); GenPreTaskUpInput genPreTaskAfterUpInput = new(); genPreTaskAfterUpInput.CarryIds = preTasks.Select(x => x.carry_id).ToList(); genPreTaskAfterUpInput.LocationIds = new HashSet(locIds).ToList(); @@ -194,11 +193,13 @@ namespace Tnb.WarehouseMgr } } - await _db.Ado.CommitTranAsync(); + await curDb.Ado.CommitTranAsync(); } - catch (Exception) + catch (Exception ex) { - await _db.Ado.RollbackTranAsync(); + JNPF.Logging.Log.Error("齐套分拣执行时出现错误", ex); + await curDb.Ado.RollbackTranAsync(); + cts?.Cancel(); throw; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmskittingOutService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmskittingOutService.cs index 8e1c0279..1066c952 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmskittingOutService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmskittingOutService.cs @@ -59,19 +59,20 @@ namespace Tnb.WarehouseMgr /// /// [HttpPost] - public async Task KittingOutByAdd() + public async Task KittingOutByAdd(CancellationTokenSource? cts = default) { + var curDb = _db.CopyNew(); try { - await _db.Ado.BeginTranAsync(); + await curDb.Ado.BeginTranAsync(); - var kittingOuts = await _db.Queryable() + var kittingOuts = await curDb.Queryable() .Where(a => a.status == WmsWareHouseConst.BILLSTATUS_ADD_ID) .OrderBy(a => a.seq) .ToListAsync(); // 是否有已呼叫的齐套出库任务 // var set = true ; 如果有 把set修改为false - var items = await _db.Queryable().Where(it => it.status == WmsWareHouseConst.BILLSTATUS_CALLED_ID).ToListAsync(); + var items = await curDb.Queryable().Where(it => it.status == WmsWareHouseConst.BILLSTATUS_CALLED_ID).ToListAsync(); var isCalled = items?.Count > 0; if (kittingOuts?.Count > 0) @@ -82,7 +83,7 @@ namespace Tnb.WarehouseMgr Expression> whereExp = (ko.carry_id != null) ? a => a.id == ko.carry_id : a => a.carrystd_id == WmsWareHouseConst.CARRY_LJSTD_ID; - var carrys = await _db.Queryable() + var carrys = await curDb.Queryable() .InnerJoin((a, b) => a.collocation_scheme_id == b.id) .Where(whereExp.And(a => a.collocation_scheme_id == ko.collocation_scheme_id && a.is_lock == 0)) .OrderBy((a, b) => b.seq) @@ -95,7 +96,7 @@ namespace Tnb.WarehouseMgr ko.status = WmsWareHouseConst.BILLSTATUS_TOBESHIPPED_ID; ko.carry_id = firstCarry?.id; ko.carry_code = firstCarry?.carry_code; - await _db.Updateable(ko).UpdateColumns(it => new { it.status, it.carry_id, it.carry_code }).ExecuteCommandAsync(); + await curDb.Updateable(ko).UpdateColumns(it => new { it.status, it.carry_id, it.carry_code }).ExecuteCommandAsync(); } else { @@ -110,9 +111,9 @@ namespace Tnb.WarehouseMgr setSortingH.org_id = _userManager.User.OrganizeId; setSortingH.create_id = _userManager.UserId; setSortingH.create_time = DateTime.Now; - await _db.Insertable(setSortingH).ExecuteCommandAsync(); + await curDb.Insertable(setSortingH).ExecuteCommandAsync(); - var kittingOutDetails = await _db.Queryable().Where(it => it.bill_id == ko.id).ToListAsync(); + var kittingOutDetails = await curDb.Queryable().Where(it => it.bill_id == ko.id).ToListAsync(); var setSortDetails = kittingOutDetails.Adapt>(); setSortDetails.ForEach(x => { @@ -123,20 +124,21 @@ namespace Tnb.WarehouseMgr x.create_id = _userManager.UserId; x.create_time = DateTime.Now; }); - await _db.Insertable(setSortDetails).ExecuteCommandAsync(); + await curDb.Insertable(setSortDetails).ExecuteCommandAsync(); ko.status = WmsWareHouseConst.BILLSTATUS_CALLED_ID; - await _db.Updateable(ko).UpdateColumns(it => it.status).ExecuteCommandAsync(); + await curDb.Updateable(ko).UpdateColumns(it => it.status).ExecuteCommandAsync(); isCalled = true; } } } } - - await _db.Ado.CommitTranAsync(); + await curDb.Ado.CommitTranAsync(); } - catch (Exception) + catch (Exception ex) { - await _db.Ado.RollbackTranAsync(); + JNPF.Logging.Log.Error("齐套出库,新增时出现错误", ex); + await curDb.Ado.RollbackTranAsync(); + cts?.Cancel(); throw; } } @@ -145,11 +147,12 @@ namespace Tnb.WarehouseMgr /// /// [HttpPost] - public async Task KittingOutByIsToBeShipped() + public async Task KittingOutByIsToBeShipped(CancellationTokenSource? cts = default) { + var curDb = _db.CopyNew(); try { - var kittingOuts = await _db.Queryable() + var kittingOuts = await curDb.Queryable() .Where(a => a.status == WmsWareHouseConst.BILLSTATUS_TOBESHIPPED_ID) .OrderBy(a => a.seq) .ToListAsync(); @@ -158,21 +161,21 @@ namespace Tnb.WarehouseMgr var grpList = kittingOuts.GroupBy(g => g.location_id).ToList(); foreach (var koGrp in grpList) { - var locs = await _db.Queryable().Where(it => it.id == koGrp.Key && it.is_use == ((int)EnumCarryStatus.空闲).ToString() && it.is_lock == 0).ToListAsync(); + var locs = await curDb.Queryable().Where(it => it.id == koGrp.Key && it.is_use == ((int)EnumCarryStatus.空闲).ToString() && it.is_lock == 0).ToListAsync(); if (locs?.Count > 0) { var arr = koGrp.ToArray(); var ko = arr[^arr.Length]; - var carry = await _db.Queryable().SingleAsync(it => it.id == ko.carry_id); + var carry = await curDb.Queryable().SingleAsync(it => it.id == ko.carry_id); if (carry != null) { - WmsPointH sPoint = await _db.Queryable().FirstAsync(it => it.location_id == carry.location_id); - WmsPointH ePoint = await _db.Queryable().FirstAsync(it => it.location_id == ko.location_id); + WmsPointH sPoint = await curDb.Queryable().FirstAsync(it => it.location_id == carry.location_id); + WmsPointH ePoint = await curDb.Queryable().FirstAsync(it => it.location_id == ko.location_id); if (sPoint != null && ePoint != null) { //判断目标库位是否自动签收 - var loc = await _db.Queryable().SingleAsync(it => it.id == ePoint.location_id); + var loc = await curDb.Queryable().SingleAsync(it => it.id == ePoint.location_id); var points = await _warehouseService.PathAlgorithms(sPoint.id, ePoint.id); if (points.Count <= 2) throw new AppFriendlyException("该路径不存在", 500); if (points?.Count > 0) @@ -215,11 +218,11 @@ namespace Tnb.WarehouseMgr preTasks[^1].is_sign = 0; // 修改最后一个元素的是否签收值 } await _warehouseService.GenPreTask(preTasks, null!); - var subCarrys = await _db.Queryable().Where(it => it.carry_id == ko.carry_id).ToListAsync(); + var subCarrys = await curDb.Queryable().Where(it => it.carry_id == ko.carry_id).ToListAsync(); var carryIds = subCarrys.Select(x => x.carry_id).Concat(new[] { ko.carry_id }).Distinct().ToList(); GenPreTaskUpInput genPreTaskInput = new() { CarryIds = carryIds!, LocationIds = new List { carry.location_id!, ko.location_id! } }; await _warehouseService.GenInStockTaskHandleAfter(genPreTaskInput, it => new WmsCarryH { is_lock = 1, carry_status = ((int)EnumCarryStatus.齐套).ToString() }, it => new BasLocation { is_lock = 1 }); - await _db.Updateable().SetColumns(it => it.status == WmsWareHouseConst.BILLSTATUS_ON_ID).Where(it => it.id == ko.id).ExecuteCommandAsync(); + await curDb.Updateable().SetColumns(it => it.status == WmsWareHouseConst.BILLSTATUS_ON_ID).Where(it => it.id == ko.id).ExecuteCommandAsync(); } } } @@ -235,8 +238,10 @@ namespace Tnb.WarehouseMgr } } } - catch (Exception) + catch (Exception ex) { + JNPF.Logging.Log.Error("齐套出库,待配送时出现错误", ex); + cts?.Cancel(); throw; } } diff --git a/common/Tnb.Common/Extension/TaskExtensions.cs b/common/Tnb.Common/Extension/TaskExtensions.cs new file mode 100644 index 00000000..e31f008f --- /dev/null +++ b/common/Tnb.Common/Extension/TaskExtensions.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tnb.Common.Extension +{ + public static class TaskEx + { + public static Task Catch(this Task task, Func onError) where TError : Exception + { + var tcs = new TaskCompletionSource(); // #A + task.ContinueWith(innerTask => + { + if (innerTask.IsFaulted && innerTask?.Exception?.InnerException is TError) + tcs.SetResult(onError((TError)innerTask.Exception.InnerException)); // #B + else if (innerTask.IsCanceled) + tcs.SetCanceled(); // #B + else if (innerTask.IsFaulted) + tcs.SetException(innerTask?.Exception?.InnerException ?? throw new InvalidOperationException()); // #B + else + tcs.SetResult(innerTask.Result); // #B + }); + return tcs.Task; + } + + public static async Task Catch(this Task task, Action exceptionHandler) + { + try + { + await task; + } + catch (Exception ex) + { + exceptionHandler(ex); + } + } + + } +} diff --git a/message/Tnb.Message/Service/MessageService.cs b/message/Tnb.Message/Service/MessageService.cs index 1c72e209..65d59f29 100644 --- a/message/Tnb.Message/Service/MessageService.cs +++ b/message/Tnb.Message/Service/MessageService.cs @@ -298,9 +298,10 @@ public class MessageService : IMessageService, IDynamicApiController, ITransient { try { - _repository.AsSugarClient().Insertable(receiveEntityList).ExecuteCommand(); + //modify ly on 20230803 改为CopyNew模式,否则多线程下会报错 + _repository.AsSugarClient().CopyNew().Insertable(receiveEntityList).ExecuteCommand(); - return _repository.AsInsertable(entity).IgnoreColumns(ignoreNullColumn: true).CallEntityMethod(m => m.Create()).ExecuteCommand(); + return _repository.AsSugarClient().CopyNew().Insertable(entity).IgnoreColumns(ignoreNullColumn: true).CallEntityMethod(m => m.Create()).ExecuteCommand(); } catch (Exception) {