Wms自定义定时服务代码完善
This commit is contained in:
@@ -188,7 +188,6 @@ namespace Tnb.WarehouseMgr
|
||||
var whereExprable = Expressionable.Create<WmsCarryH, WmsCarryCode, BasLocation>()
|
||||
.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<WmsPretaskH>().InnerJoin<WmsCarryH>((a, b) => a.startlocation_id == b.location_id && a.carry_id == b.id)
|
||||
try
|
||||
{
|
||||
//获取所有未下发的预任务申请
|
||||
var preTasks = await db.Queryable<WmsPretaskH>().InnerJoin<WmsCarryH>((a, b) => a.startlocation_id == b.location_id && a.carry_id == b.id)
|
||||
.InnerJoin<WmsAreaH>((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<WmsPretaskCode>().Where(it => ids.Contains(it.bill_id)).ToListAsync();
|
||||
if (preTasks.Count > 0)
|
||||
{
|
||||
//根据预任务管理区分组,获取到所有分组后的预任务,遍历每个预任务 是否为任务链,通过管理区ID
|
||||
var preTaskGroups = preTasks.GroupBy(g => g.area_code).ToList();
|
||||
List<WmsDistaskH> disTasks = new();
|
||||
List<WmsDistaskCode> distaskCodes = new();
|
||||
foreach (var itGroup in preTaskGroups)
|
||||
var ids = preTasks.Select(x => x.id).Distinct().ToList();
|
||||
var preTaskCodes = await db.Queryable<WmsPretaskCode>().Where(it => ids.Contains(it.bill_id)).ToListAsync();
|
||||
if (preTasks.Count > 0)
|
||||
{
|
||||
var items = itGroup.Adapt<List<WmsDistaskH>>();
|
||||
for (int i = 0, cnt = items.Count; i < cnt; i++)
|
||||
//根据预任务管理区分组,获取到所有分组后的预任务,遍历每个预任务 是否为任务链,通过管理区ID
|
||||
var preTaskGroups = preTasks.GroupBy(g => g.area_code).ToList();
|
||||
List<WmsDistaskH> disTasks = new();
|
||||
List<WmsDistaskCode> 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<List<WmsDistaskH>>();
|
||||
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<WmsDistaskH[]>(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<WmsDistaskH[]>(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<List<WmsDistaskCode>>();
|
||||
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<List<WmsDistaskCode>>();
|
||||
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();
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
|
||||
Reference in New Issue
Block a user