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)
{