bug处理

This commit is contained in:
2024-04-23 10:16:16 +08:00
parent c8e2f1eafd
commit 579f2d3a39
197 changed files with 2509 additions and 1363 deletions

View File

@@ -2,6 +2,7 @@
using System.Dynamic;
using System.Linq.Expressions;
using System.Security.Policy;
using System.Threading.Tasks;
using Aop.Api.Domain;
using JNPF;
using JNPF.Common.Contracts;
@@ -18,6 +19,7 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.CodeAnalysis;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using NetTaste;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
@@ -28,6 +30,7 @@ using Tnb.BasicData.Entities;
using Tnb.Common.Extension;
using Tnb.Common.Redis;
using Tnb.Common.Utils;
using Tnb.ProductionMgr.Entities;
using Tnb.WarehouseMgr.Entities;
using Tnb.WarehouseMgr.Entities.Configs;
using Tnb.WarehouseMgr.Entities.Consts;
@@ -43,7 +46,7 @@ namespace Tnb.WarehouseMgr
/// <summary>
/// 库房业务类(出入库)
/// </summary>
public class WareHouseService : ServiceLoggerBase<WareHouseService>, IWareHouseService
public class WareHouseService : DevServBase<WareHouseService>, IWareHouseService
{
private readonly ISqlSugarClient _db;
private readonly IDictionaryDataService _dictionaryDataService;
@@ -63,7 +66,7 @@ namespace Tnb.WarehouseMgr
public WareHouseService(ISqlSugarRepository<WmsInstockH> repository, IDictionaryDataService dictionaryDataService, RedisData redisData,
IBillRullService billRullService, IUserManager userManager, ICacheManager cacheManager, IElevatorControlService elevatorControlService
//IConfiguration configuration
)// : base(repository.AsSugarClient())
) : base(repository.AsSugarClient())
{
_db = repository.AsSugarClient();
_dictionaryDataService = dictionaryDataService;
@@ -73,7 +76,9 @@ namespace Tnb.WarehouseMgr
_elevatorControlService = elevatorControlService;
_redisData = redisData;
//_configuration = configuration;
}
/// <summary>
/// 根据载具Id带出库位、仓库信息
/// </summary>
@@ -238,6 +243,7 @@ namespace Tnb.WarehouseMgr
.ToListAsync();
return input.Size > 0 ? items.Take(input.Size).ToList() : items;
}
/// <summary>
/// 判断CTU是否可以放货
/// </summary>
@@ -246,20 +252,20 @@ namespace Tnb.WarehouseMgr
[AllowAnonymous]
public async Task CheckPut(CheckPutInput input)
{
Logger.Information("联请求CheckPut接口传入参数为:" + JsonConvert.SerializeObject(input));
Logger.Information("联请求CheckPut接口传入参数为:" + JsonConvert.SerializeObject(input));
Dictionary<string, string[]> putdic = new Dictionary<string, string[]>();
putdic.Add("SSX-011-006", new string[] { "YTCS", "AllowEmptyIn_CS06" });
putdic.Add("SSX-021-007", new string[] { "东面提升机输送线", "出库输送线7允许入箱" });
putdic.Add("SSX-121-009", new string[] { "东面提升机输送线", "上升降机9允许入箱" });
putdic.Add("SSX-121-010", new string[] { "东面提升机输送线", "上升降机10允许入箱" });
putdic.Add("SSX-021-003", new string[] { "YTCS", "AllowCtuEmptyIn_CS03" });
putdic.Add("SSX-021-001", new string[] { "YTCS", "AllowCtuEmptyIn_CS01" });
putdic.Add("ZSSSXCTU02", new string[] { "YTCS", "AllowCtuFullOut_CS04", });
putdic.Add("ZSSSXCTU02", new string[] { "YTCS", "AllowCtuFullOut_CS04", });
putdic.Add("ZSSSXCTU01", new string[] { "YTCS", "AllowCtuFullOut_CS02", });
var strs = new string[] { };
if (!putdic.ContainsKey(input.targetName))
throw new AppFriendlyException("点位" + input.targetName + "不存在", 500);
strs = putdic.Where(p => p.Key == input.targetName).First().Value;
@@ -270,12 +276,12 @@ namespace Tnb.WarehouseMgr
throw new AppFriendlyException("点位" + input.targetName + "不存在", 500);
}
string data = await _redisData.GetHash(strs[0], strs[1]);
Logger.Information("联请求CheckPut接口查询X2Server数据:" + data);
Logger.Information("联请求CheckPut接口查询X2Server数据:" + data);
JObject? res = JsonConvert.DeserializeObject<JObject>(data);
bool result = res != null && res["Value"] != null ? res.Value<bool>("Value") : false;
if (!result)
throw new AppFriendlyException("点位" + input.targetName + "不可放", 500);
Logger.Information("联请求CheckPut接口结果CTU可放货" + data);
Logger.Information("联请求CheckPut接口结果CTU可放货" + data);
}
/// <summary>
@@ -285,6 +291,7 @@ namespace Tnb.WarehouseMgr
public async Task<bool> Check(string code, string action)
{
Logger.Information($"【Check】 判断CTU是否可以取货 {code} {action}");
Dictionary<string, string[]> putdic = new Dictionary<string, string[]>();
Dictionary<string, string[]> getdic = new Dictionary<string, string[]>();
putdic.Add("ZSSSXCTU02", new string[] { "YTCS", "AllowCtuFullOut_CS04", });
@@ -313,12 +320,15 @@ namespace Tnb.WarehouseMgr
if (action == "LOAD")//取货
{
if (!getdic.ContainsKey(code))
{
return false;
}
strs = getdic.Where(p => p.Key == code).First().Value;
bool flag = _redisData.HashExist(strs[0], strs[1]).Result;
if (!flag)
{
Logger.Information($"【Check】 判断CTU是否可以取货 {code} {action} flag:{flag} ");
return false;
}
string data = _redisData.GetHash(strs[0], strs[1]).Result;
@@ -337,6 +347,7 @@ namespace Tnb.WarehouseMgr
bool flag = _redisData.HashExist(strs[0], strs[1]).Result;
if (!flag)
{
Logger.Information($"【Check】 判断CTU是否可以取货 {code} {action} flag:{flag} ");
return false;
}
string data = _redisData.GetHash(strs[0], strs[1]).Result;
@@ -377,7 +388,7 @@ namespace Tnb.WarehouseMgr
putdic.Add("SSX-021-001", new string[] { "YTCS", "CtuEmptyIn_CS01Done", "true" });
putdic.Add("ZSSSXCTU02", new string[] { "YTCS", "右输送线下层允许入箱4", "true" });
putdic.Add("ZSSSXCTU01", new string[] { "YTCS", "左输送线下层允许入箱2", "true" });
putdic.Add("SSX-121-009", new string[] { "东面提升机输送线", "上升降机9入箱完毕", "true" });
putdic.Add("SSX-121-009", new string[] { "东面提升机输送线", "上升降机9入箱完毕", "true" });
putdic.Add("SSX-121-010", new string[] { "东面提升机输送线", "上升降机10入箱完毕", "true" });
putdic.Add("YCLCKBGW", new string[] { "CP8", "PutDoneEmptyBox", "true" });
putdic.Add("ZS-C01-1", new string[] { "hxjC", "A2AGV允许出空箱", "true" });
@@ -441,7 +452,9 @@ namespace Tnb.WarehouseMgr
try
{
//获取所有未下发的预任务申请
List<WmsPretaskH> preTasks = await db.Queryable<WmsPretaskH>().InnerJoin<WmsCarryH>((a, b) => a.startlocation_id == b.location_id && a.carry_id == b.id)
Logger.Information("【GenTaskExecute】 开始获取未下发的预任务...");
ISugarQueryable<WmsPretaskH> sugarQueryable = 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)
.InnerJoin<BasLocation>((a, b, c, d) => a.endlocation_id == d.id && d.is_use == "0")
.Where(a => a.status == WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID && !string.IsNullOrWhiteSpace(a.startlocation_id))
@@ -450,10 +463,13 @@ namespace Tnb.WarehouseMgr
{
move_num = c.move_num,
third_eqp_type = c.third_eqp_type,
}, true)
.ToListAsync();
}, true);
Logger.Information("【GenTaskExecute】 执行SQL: " + sugarQueryable.ToSqlString());
List<WmsPretaskH> preTasks = await sugarQueryable.ToListAsync();
//List<WmsPretaskH> executedPreTasks = await db.Queryable<WmsPretaskH>().Where(it => it.status != WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID && it.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID).ToListAsync();
@@ -461,25 +477,31 @@ namespace Tnb.WarehouseMgr
.Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) &&
!it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase))
.ToList();
var elePreTasks = preTasks.Where(it => it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList();
var normalPreTasks = preTasks.Where(it =>it.area_code!="B"&& !agvElevatorTasks.Concat(elePreTasks).Select(x => x.endlocation_code).Contains(it.endlocation_code)).ToList();
var normalPreTasks = preTasks.Where(it => it.area_code != "B" && !agvElevatorTasks.Concat(elePreTasks).Select(x => x.endlocation_code).Contains(it.endlocation_code)).ToList();
/* IEnumerable<WmsPretaskH?> firstEleGrp = agvElevatorTasks.GroupBy(g => g.endlocation_code).Select(t => t.OrderBy(o => o.bill_code).FirstOrDefault());
agvElevatorTasks = firstEleGrp?.ToList() ?? Enumerable.Empty<WmsPretaskH>().ToList()!;
*/
Logger.Information("【GenTaskExecute】 电梯预任务elePreTasks:" + JsonConvert.SerializeObject(elePreTasks));
Logger.Information("【GenTaskExecute】 AGV/CTU/KIVA预任务normalPreTasks:" + JsonConvert.SerializeObject(normalPreTasks));
Logger.Information("【GenTaskExecute】 AGV电梯预任务agvElevatorTasks:" + JsonConvert.SerializeObject(agvElevatorTasks));
/* IEnumerable<WmsPretaskH?> firstEleGrp = agvElevatorTasks.GroupBy(g => g.endlocation_code).Select(t => t.OrderBy(o => o.bill_code).FirstOrDefault());
agvElevatorTasks = firstEleGrp?.ToList() ?? Enumerable.Empty<WmsPretaskH>().ToList()!;
*/
//如果电梯任务预Agv任务存在相同目标库位删除Agv任务保证电梯任务先行
var equalEndLocPreTasks = elePreTasks.Select(x => x.endlocation_code).Intersect(agvElevatorTasks.Select(x => x.endlocation_code));
if (equalEndLocPreTasks.Any())
{
Logger.Information("【GenTaskExecute】 执行如果电梯任务预Agv任务存在相同目标库位删除Agv任务保证电梯任务先行 ");
agvElevatorTasks = agvElevatorTasks.Where(x => !equalEndLocPreTasks.Contains(x.endlocation_code)).ToList();
}
preTasks = normalPreTasks.Concat(agvElevatorTasks).Concat(elePreTasks).ToList();
//一楼中储仓CTU
List<string> ids = preTasks.Select(x => x.id).Distinct().ToList();
List<WmsPretaskCode>? preTaskCodes = await db.Queryable<WmsPretaskCode>().Where(it => ids.Contains(it.bill_id)).ToListAsync();
if (preTasks.Count > 0)
@@ -571,25 +593,29 @@ namespace Tnb.WarehouseMgr
await db.Ado.BeginTranAsync();
int row = await db.Insertable(disTasks).ExecuteCommandAsync();
Logger.Information("【GenTaskExecute】 插入任务执行表数据: " + JsonConvert.SerializeObject(disTasks));
if (preTaskCodes?.Count > 0)
{
row = await db.Insertable(distaskCodes).ExecuteCommandAsync();
Logger.Information("【GenTaskExecute】 插入任务执行条码表数据: " + JsonConvert.SerializeObject(disTasks));
}
if (row > 0)
{
List<string> preTaskIds = preTasks.Select(x => x.id).ToList();
List<string> preTaskBill_codes = preTasks.Select(x => x.bill_code).ToList();
row = await db.Updateable<WmsPretaskH>().SetColumns(it => new WmsPretaskH { status = WmsWareHouseConst.PRETASK_BILL_STATUS_YXF_ID }).Where(it => preTaskIds.Contains(it.id)).ExecuteCommandAsync();
Logger.Information("【GenTaskExecute】 更改这些预任务执行状态为 已下发: " + JsonConvert.SerializeObject(preTaskBill_codes));
}
await db.Ado.CommitTranAsync();
Logger.Information("预任务执行完成");
Logger.Information($"_eleCtlCfg.Environment={_eleCtlCfg.Environment}");
Logger.Information("【GenTaskExecute】 预任务执行完成");
Logger.Information($"【GenTaskExecute】_eleCtlCfg.Environment={_eleCtlCfg.Environment}");
if (string.Equals(_eleCtlCfg.Environment, ElevatorConsts.EnvironmentName, StringComparison.OrdinalIgnoreCase))
{
//呼梯操作
//获取目标库位为电梯库位的任务
Logger.Information("操作设备");
Logger.Information("【GenTaskExecute】操作设备");
var agvDTTasks = disTasks.Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) &&
!it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList();
@@ -597,27 +623,29 @@ namespace Tnb.WarehouseMgr
foreach (var task in agvDTTasks)
{
ElevagorInfoQuery q = new() { endlocation_id = task.endlocation_id };
Logger.Information($"【GenTaskExecute】呼梯时 根据任务单号获取电梯参数 {JsonConvert.SerializeObject(q)}");
var e = await FindElevatorFromPars(q);
Logger.Information($"【GenTaskExecute】呼梯时 根据任务单号获取电梯结果 {JsonConvert.SerializeObject(e)}");
if (e != null)
{
task.device_id = e.device_id;
}
}
List<(string endlocation_code, string device_id, string id, int start_floor)> endLocCodes = agvDTTasks
.Select(it => (it.endlocation_code, it.device_id, it.id, it.start_floor)).ToList();
var callLiftCnt = endLocCodes?.Count ?? 0;
Logger.Information($"呼梯任务数:{callLiftCnt}");
Logger.Information($"【GenTaskExecute】呼梯任务数:{callLiftCnt}");
if (endLocCodes?.Count > 0)
{
if (endLocCodes.Select(x => x.device_id).All(x => !x.IsNullOrWhiteSpace()))
{
Logger.Information("呼梯操作");
Logger.Information("【GenTaskExecute】呼梯操作");
_ = CallingLanding(endLocCodes);
}
else
{
Logger.Error("呼梯失败没有设备ID");
Logger.Error("【GenTaskExecute】呼梯失败没有设备ID");
return;
}
}
@@ -625,11 +653,20 @@ namespace Tnb.WarehouseMgr
//执行电梯任务
List<WmsDistaskH>? elevatorTasks = disTasks.Where(it => it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList();
Logger.Information($"【GenTaskExecute】当前电梯任务数:{elevatorTasks?.Count ?? 0}");
if (elevatorTasks?.Count > 0)
{
Logger.Information($"当前电梯任务数:{elevatorTasks?.Count ?? 0}");
foreach (WmsDistaskH? elevatorTask in elevatorTasks)
{
ElevagorInfoQuery q = new() { endlocation_id = elevatorTask.endlocation_id };
Logger.Information($"【GenTaskExecute】执行电梯任务时 根据任务单号获取电梯参数 {JsonConvert.SerializeObject(q)}");
var e = await FindElevatorFromPars(q);
Logger.Information($"【GenTaskExecute】执行电梯任务时 根据任务单号获取电梯结果 {JsonConvert.SerializeObject(e)}");
if (e != null)
{
elevatorTask.device_id = e.device_id;
}
_ = ExecuteTargetFloorTask(elevatorTask);
}
}
@@ -637,7 +674,7 @@ namespace Tnb.WarehouseMgr
if (agvTasks?.Count > 0)
{
Logger.Information($"Agv任务数量{agvTasks.Count},taskCodes:{string.Join(",", agvTasks.Select(x => x.bill_code).Distinct())}");
Logger.Information($"【GenTaskExecute】Agv任务数量{agvTasks.Count},taskCodes:{string.Join(",", agvTasks.Select(x => x.bill_code).Distinct())}");
_ = AgvDispatch(agvTasks, agvCts.Token);
}
}
@@ -677,6 +714,9 @@ namespace Tnb.WarehouseMgr
{
var whereExpable = Expressionable.Create<WmsElevatorH, WmsElevatorD, WmsDistaskH>()
.And((a, b, c) => a.enabled == 1);
Logger.Information($"【FindElevatorFromPars】 {JsonConvert.SerializeObject(input)}");
if (!input.taskCode.IsNullOrEmpty())
{
whereExpable.AndIF(!SqlFunc.IsNullOrEmpty(input.taskCode), (a, b, c) => c.bill_code == input.taskCode);
@@ -689,7 +729,8 @@ namespace Tnb.WarehouseMgr
{
whereExpable.AndIF(!SqlFunc.IsNullOrEmpty(input.startlocation_id), (a, b, c) => b.location_id == input.startlocation_id);
}
var ele = await _db.CopyNew().Queryable<WmsElevatorH>().InnerJoin<WmsElevatorD>((a, b) => a.id == b.bill_id)
ISugarQueryable<WmsElevatorH> queryable = _db.CopyNew().Queryable<WmsElevatorH>().InnerJoin<WmsElevatorD>((a, b) => a.id == b.bill_id)
.InnerJoin<WmsDistaskH>((a, b, c) => b.location_code == c.endlocation_code || b.location_code == c.startlocation_code)
.Where(whereExpable.ToExpression())
.WhereIF(!SqlFunc.IsNullOrEmpty(input.sourceName) && SqlFunc.StartsWith("DT-R", input.sourceName), (a, b, c) => c.startpoint_code == input.sourceName)
@@ -699,8 +740,11 @@ namespace Tnb.WarehouseMgr
bill_code = c.bill_code,
device_id = a.elevator_id,
end_floor = c.end_floor
}, true)
.FirstAsync();
}, true);
var ele = await queryable.FirstAsync();
Logger.Information($"【FindElevatorFromPars】 " + queryable.ToSqlString());
return ele;
@@ -731,13 +775,25 @@ namespace Tnb.WarehouseMgr
third_eqp_type = b.third_eqp_type,
}, true).ToListAsync();
List<WmsPretaskCode> TaskCodes = await db.Queryable<WmsPretaskCode>().Where(it => CTUTasks.Select(p => p.id).ToList().Contains(it.bill_id)).ToListAsync();
Logger.Information($@"【CTUTaskExecute】 获取任务TaskCodes: {JsonConvert.SerializeObject(TaskCodes)}");
var InTasks = CTUTasks.Where(a => a.task_type == WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID).ToList();
var OutTasks = CTUTasks.Where(a => a.task_type == WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID).ToList();
Logger.Information($@"【CTUTaskExecute】 获取任务InTasks: {JsonConvert.SerializeObject(InTasks)}");
Logger.Information($@"【CTUTaskExecute】 获取任务OutTasks: {JsonConvert.SerializeObject(OutTasks)}");
var OriginDistaskHs = await db.Queryable<WmsDistaskH>()
.InnerJoin<WmsAreaH>((a, b) => a.area_id == b.id)
.Where((a, b) => b.code == "B" && a.status == WmsWareHouseConst.TASK_BILL_STATUS_DZX_ID)
.OrderBy(a => a.bill_code)
.ToListAsync();
Logger.Information($@"【CTUTaskExecute】 OriginDistaskHs: {JsonConvert.SerializeObject(OriginDistaskHs)}");
List<WmsDistaskH> DistaskHs = new List<WmsDistaskH>();
List<WmsDistaskH> UpDistaskHs = new List<WmsDistaskH>();
List<WmsDistaskCode> DistaskCodes = new List<WmsDistaskCode>();
@@ -763,46 +819,45 @@ namespace Tnb.WarehouseMgr
}*/
WmsDistaskH distaskH = item.Adapt<WmsDistaskH>();
distaskH.id = SnowflakeIdHelper.NextId();
distaskH.status = WmsWareHouseConst.TASK_BILL_STATUS_DZX_ID;
distaskH.is_chain = 1;
distaskH.create_time = DateTime.Now;
var billcode = GetBillCode(OriginDistaskHs, DistaskHs, distaskH);
distaskH.groups = billcode.Substring(0, billcode.Length - 2);
distaskH.bill_code = billcode;
var num = int.Parse(distaskH.bill_code.Substring(billcode.Length - 1, 1));
if (num == item.move_num)
distaskH.id = SnowflakeIdHelper.NextId();
distaskH.status = WmsWareHouseConst.TASK_BILL_STATUS_DZX_ID;
distaskH.is_chain = 1;
distaskH.create_time = DateTime.Now;
var billcode = GetBillCode(OriginDistaskHs, DistaskHs, distaskH);
distaskH.groups = billcode.Substring(0, billcode.Length - 2);
distaskH.bill_code = billcode;
var num = int.Parse(distaskH.bill_code.Substring(billcode.Length - 1, 1));
Logger.Information($@"【CTUTaskExecute】 比对billcode{num}和单次搬运数量move_num{item.move_num},如果一致 会添加到inCtuExec");
if (num == item.move_num)
{
distaskH.status = WmsWareHouseConst.TASK_BILL_STATUS_YXD_ID;
inCtuExec.Add(distaskH);
if (OriginDistaskHs.Where(p => p.groups == distaskH.groups).Any())
{
distaskH.status = WmsWareHouseConst.TASK_BILL_STATUS_YXD_ID;
inCtuExec.Add(distaskH);
if (OriginDistaskHs.Where(p => p.groups == distaskH.groups).Any())
{
OriginDistaskHs.Where(p => p.groups == distaskH.groups).ToList().ForEach(p => p.status = WmsWareHouseConst.TASK_BILL_STATUS_YXD_ID);
OriginDistaskHs.Where(p => p.groups == distaskH.groups).ToList().ForEach(p => p.status = WmsWareHouseConst.TASK_BILL_STATUS_YXD_ID);
UpDistaskHs.AddRange(OriginDistaskHs.Where(p => p.groups == distaskH.groups).ToList());
inCtuExec.AddRange(OriginDistaskHs.Where(p => p.groups == distaskH.groups).ToList());
}
if (DistaskHs.Where(p => p.groups == distaskH.groups).Any())
{
DistaskHs.Where(p => p.groups == distaskH.groups).ToList().ForEach(p => p.status = WmsWareHouseConst.TASK_BILL_STATUS_YXD_ID);
inCtuExec.AddRange(DistaskHs.Where(p => p.groups == distaskH.groups).ToList());
}
UpDistaskHs.AddRange(OriginDistaskHs.Where(p => p.groups == distaskH.groups).ToList());
inCtuExec.AddRange(OriginDistaskHs.Where(p => p.groups == distaskH.groups).ToList());
}
if (DistaskHs.Where(p => p.groups == distaskH.groups).Any())
{
DistaskHs.Where(p => p.groups == distaskH.groups).ToList().ForEach(p => p.status = WmsWareHouseConst.TASK_BILL_STATUS_YXD_ID);
inCtuExec.AddRange(DistaskHs.Where(p => p.groups == distaskH.groups).ToList());
}
}
Logger.Information($"开始执行CTU入库任务: {JsonConvert.SerializeObject(distaskH)}");
List<WmsPretaskCode> preTaskCodes = TaskCodes.FindAll(x => x.bill_id == distaskH.pretask_id);
List<WmsDistaskCode> disTaskCodes = preTaskCodes.Adapt<List<WmsDistaskCode>>();
disTaskCodes.ForEach(x =>
{
x.id = SnowflakeIdHelper.NextId();
x.bill_id = distaskH.id;
x.create_time = DateTime.Now;
});
DistaskHs.Add(distaskH);
DistaskCodes.AddRange(disTaskCodes);
List<WmsDistaskCode> disTaskCodes = preTaskCodes.Adapt<List<WmsDistaskCode>>();
disTaskCodes.ForEach(x =>
{
x.id = SnowflakeIdHelper.NextId();
x.bill_id = distaskH.id;
x.create_time = DateTime.Now;
});
DistaskHs.Add(distaskH);
DistaskCodes.AddRange(disTaskCodes);
}
foreach (var item in OutTasks)
{
@@ -815,6 +870,8 @@ namespace Tnb.WarehouseMgr
distaskH.groups = billcode.Substring(0, billcode.Length - 2);
distaskH.bill_code = billcode;
var num = int.Parse(distaskH.bill_code.Substring(billcode.Length - 1, 1));
Logger.Information($@"【CTUTaskExecute】 比对billcode{num}和单次搬运数量move_num{item.move_num},如果一致 会添加到outCtuExec");
if (num == item.move_num)
{
distaskH.status = WmsWareHouseConst.TASK_BILL_STATUS_YXD_ID;
@@ -833,7 +890,6 @@ namespace Tnb.WarehouseMgr
}
}
Logger.Information($"开始执行CTU出库任务: {JsonConvert.SerializeObject(distaskH)}");
List<WmsPretaskCode> preTaskCodes = TaskCodes.FindAll(x => x.bill_id == distaskH.pretask_id);
List<WmsDistaskCode> disTaskCodes = preTaskCodes.Adapt<List<WmsDistaskCode>>();
disTaskCodes.ForEach(x =>
@@ -866,31 +922,37 @@ namespace Tnb.WarehouseMgr
}
await db.Ado.CommitTranAsync();
//判断
Logger.Information($"【CTUTaskExecute】 判断单据状态(status)是否为26126851525157 {JsonConvert.SerializeObject(DistaskHs)}");
if (DistaskHs.Where(p => p.status == WmsWareHouseConst.TASK_BILL_STATUS_DZX_ID).Any())
{
var time =int.Parse( db.Queryable<BasFactoryConfig>().Where(P => P.key == "getinterval").First().value);
var time = int.Parse(db.Queryable<BasFactoryConfig>().Where(P => P.key == "getinterval").First().value);
timer = new Timer(TimerExec, null, TimeSpan.FromMinutes(time), TimeSpan.FromMinutes(time));
}
Logger.Information($@"【CTUTaskExecute】 可执行的CTU任务inCtuExec: {JsonConvert.SerializeObject(inCtuExec)}");
if (inCtuExec.Count > 0)
{
Logger.Information($"开始执行CTU入库任务: {JsonConvert.SerializeObject(inCtuExec)}");
//呼叫ctu入库
// await db.Updateable<WmsDistaskH>().SetColumns(it => new WmsDistaskH { status = WmsWareHouseConst.TASK_BILL_STATUS_RUNING_ID }).Where(it => inCtuExec.Select(p => p.id).ToList().Contains(it.id)).ExecuteCommandAsync();
// await db.Updateable<WmsPretaskH>().SetColumns(it => new WmsPretaskH { status = WmsWareHouseConst.PRETASK_BILL_STATUS_START_ID }).Where(it => inCtuExec.Select(x => x.pretask_id).ToList().Contains(it.id)).ExecuteCommandAsync();
CancellationTokenSource Ctu = new();
await CallingCTU(inCtuExec, Ctu.Token, 1);
Ctu.Dispose();
}
Logger.Information($@"【CTUTaskExecute】 可执行的CTU任务outCtuExec: {JsonConvert.SerializeObject(outCtuExec)}");
if (outCtuExec.Count > 0)
{
Logger.Information($"开始执行CTU出库任务: {JsonConvert.SerializeObject(outCtuExec)}");
//呼叫ctu出库
// await db.Updateable<WmsDistaskH>().SetColumns(it => new WmsDistaskH { status = WmsWareHouseConst.TASK_BILL_STATUS_RUNING_ID }).Where(it => outCtuExec.Select(p => p.id).ToList().Contains(it.id)).ExecuteCommandAsync();
// await db.Updateable<WmsPretaskH>().SetColumns(it => new WmsPretaskH { status = WmsWareHouseConst.PRETASK_BILL_STATUS_START_ID }).Where(it => outCtuExec.Select(x => x.pretask_id).ToList().Contains(it.id)).ExecuteCommandAsync();
// await db.Updateable<WmsDistaskH>().SetColumns(it => new WmsDistaskH { status = WmsWareHouseConst.TASK_BILL_STATUS_RUNING_ID }).Where(it => outCtuExec.Select(p => p.id).ToList().Contains(it.id)).ExecuteCommandAsync();
// await db.Updateable<WmsPretaskH>().SetColumns(it => new WmsPretaskH { status = WmsWareHouseConst.PRETASK_BILL_STATUS_START_ID }).Where(it => outCtuExec.Select(x => x.pretask_id).ToList().Contains(it.id)).ExecuteCommandAsync();
CancellationTokenSource Ctu = new();
await CallingCTU(outCtuExec, Ctu.Token, 0);
Ctu.Dispose();
}
}
catch(Exception ex)
catch (Exception ex)
{
}
}
@@ -955,7 +1017,7 @@ namespace Tnb.WarehouseMgr
{
var execlist = list.Where(p => p.groups == item.groups).ToList();
await db.Updateable<WmsDistaskH>().SetColumns(it => new WmsDistaskH { status = WmsWareHouseConst.TASK_BILL_STATUS_YXD_ID }).Where(it => execlist.Select(p => p.id).ToList().Contains(it.id)).ExecuteCommandAsync();
// await db.Updateable<WmsPretaskH>().SetColumns(it => new WmsPretaskH { status = WmsWareHouseConst.PRETASK_BILL_STATUS_START_ID }).Where(it => execlist.Select(x => x.pretask_id).ToList().Contains(it.id)).ExecuteCommandAsync();
// await db.Updateable<WmsPretaskH>().SetColumns(it => new WmsPretaskH { status = WmsWareHouseConst.PRETASK_BILL_STATUS_START_ID }).Where(it => execlist.Select(x => x.pretask_id).ToList().Contains(it.id)).ExecuteCommandAsync();
CancellationTokenSource Ctu = new();
int type = execlist.First().task_type == WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID ? 1 : 0;
await CallingCTU(execlist, Ctu.Token, type);
@@ -970,9 +1032,9 @@ namespace Tnb.WarehouseMgr
{
timer?.Dispose();
}
}
private async Task CallingCTU(List<WmsDistaskH> distaskHs, CancellationToken token,int type)
private async Task CallingCTU(List<WmsDistaskH> distaskHs, CancellationToken token, int type)
{
try
{
@@ -995,12 +1057,14 @@ namespace Tnb.WarehouseMgr
reqBody.taskChainPriority = 0;
reqBody.taskList = v;
reqBody.inOut = type;
Logger.Information($"【CallingCTU】 CTU任务下发 开始请求联核/task-chain/create接口 请求地址:{url} 请求参数:{reqBody} type{(type == 0 ? "CTU出库" : "CTU入库")}");
dynamic respBody = await HttpClientHelper.PostStreamAsync(url, reqBody, token);
Logger.Information($"CTU任务下发:{respBody}");
Logger.Information($"【CallingCTU】 CTU任务下发 接收到联核/task-chain/create接口信息:{respBody}");
}
}
catch (Exception ex)
{
Logger.Information($"【CallingCTU】 CTU任务下发 请求联核/task-chain/create接口失败 异常信息:{ex}");
}
}
#endregion
@@ -1011,26 +1075,26 @@ namespace Tnb.WarehouseMgr
/// <returns></returns>
private async Task CallingLanding(List<(string endlocation_code, string device_id, string id, int floorNO)> endLocCodes)
{
Logger.Information($" 开始呼梯操作.............");
Logger.Information($"【CallingLanding】 开始呼梯操作.............");
try
{
foreach ((_, string devId, string disTaskId, int floorNO) in endLocCodes)
{
Logger.Information($"devId:{devId}");
Logger.Information($"【CallingLanding】 devId:{devId}");
if (!s_elevatorMap.TryGetValue(devId, out object? elevatorCode))
{
continue;
}
string? devName = elevatorCode.ToString();
Logger.Information($"电梯编号:{devName}");
Logger.Information($"当前:{devName.Match(@"\d+")}#梯");
Logger.Information($"【CallingLanding】 电梯编号:{devName}");
Logger.Information($"【CallingLanding】 当前:{devName.Match(@"\d+")}#梯");
await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.AGVControl, 1);
(int sysStatus, int runStatus, int curFloorNo, int doorStatus, int agvStatus) eleStatusMulti = (-1, -1, -1, -1, -1);
Logger.Information("【CallingLanding】 获取电梯AGV运行状态");
if (!_elevatorAgvCtlStatusMap.TryGetValue(devId, out int agvCtlStatus) || agvCtlStatus != (int)EnumAgvStatus.AGV运行状态)
{
Logger.Information("获取电梯AGV运行状态");
var tags = new[] { "SysStatus", "RunStatus", "FloorNo", "DoorStatus", "AGVStatus" };
do
{
@@ -1040,18 +1104,22 @@ namespace Tnb.WarehouseMgr
Logger.Information($"{devName.Match(@"\d+")}#, 当前Agv状态:{eleStatusMulti.agvStatus.ToEnum<EnumAgvStatus>()}");
_elevatorAgvCtlStatusMap[devId] = eleStatusMulti.agvStatus;
}
else
{
Logger.Information("【CallingLanding】 AGV运行状态" + agvCtlStatus);
}
Logger.Information($"任务开始目标楼层为:{floorNO}");
Logger.Information($"【CallingLanding】 任务开始目标楼层为:{floorNO}");
int floorN = await GetRealFloor(floorNO);
//如果电梯在当前楼层则不呼梯
if (floorN == eleStatusMulti.curFloorNo)
{
Logger.Information($"{devName.Match(@"\d+")}#,在当前楼层,无需呼梯");
Logger.Information($"【CallingLanding】 {devName.Match(@"\d+")}#,在当前楼层,无需呼梯");
continue;
}
Logger.Information($"实际目标楼层为:{floorN}");
Logger.Information($"【CallingLanding】 实际目标楼层为:{floorN}");
WmsElevatorUnexecute elevatorQueueItem = new()
{
@@ -1064,8 +1132,10 @@ namespace Tnb.WarehouseMgr
create_time = DateTime.Now
};
List<WmsElevatorUnexecute> elevatorQueue = await _db.Queryable<WmsElevatorUnexecute>().Where(it => it.distask_id == disTaskId && it.task_status == "执行中").ToListAsync();
if ((elevatorQueue.IsNull() || elevatorQueue.Count < 1) && floorN != eleStatusMulti.curFloorNo)
{
Logger.Information($"【CallingLanding】 判断当前电梯{devName.Match(@"\d+")}#梯 无任务在做执行呼梯");
elevatorQueueItem.task_status = "执行中";
bool callLiftRes = await _elevatorControlService.CallLift(devName, floorN, CancellationToken.None);
@@ -1073,17 +1143,21 @@ namespace Tnb.WarehouseMgr
string callLiftResult = callLiftRes ? successful : fail;
Logger.Information($"{devName.Match(@"\d+")}#, 呼梯结果:{callLiftResult}");
}
else
{
Logger.Information("【CallingLanding】 当前有任务在做,不会呼梯");
}
//如果当前电梯有任务在做,将当前呼梯任务放入待执行队列
_ = await _db.Insertable(elevatorQueueItem).ExecuteCommandAsync();
Logger.Information("呼梯任务执行完成");
Logger.Information("【CallingLanding】 呼梯任务执行完成");
}
}
catch (Exception ex)
{
Logger.Error("呼梯操作错误", ex);
Logger.Error($"呼梯操作错误堆栈跟踪:{Environment.NewLine}{ex.StackTrace}");
Logger.Error("【CallingLanding】 呼梯操作错误", ex);
Logger.Error($"【CallingLanding】 呼梯操作错误堆栈跟踪:{Environment.NewLine}{ex.StackTrace}");
throw;
}
}
@@ -1101,6 +1175,7 @@ namespace Tnb.WarehouseMgr
{
if (!s_elevatorMap.TryGetValue(disTask.device_id, out object? elevatorCode))
{
Logger.Information($"开始执行电梯任务,没有取到设备{disTask.device_id}的 elevatorCode! s_elevatorMap: {JsonConvert.SerializeObject(s_elevatorMap)}");
return;
}
string devName = s_elevatorMap[disTask.device_id]?.ToString() ?? _eleCtlCfg.DevName3;
@@ -1186,7 +1261,7 @@ namespace Tnb.WarehouseMgr
/// <returns></returns>
private async Task AgvDispatch(List<WmsDistaskH> disTasks, CancellationToken token)
{
Logger.Information("Agv任务执行....");
Logger.Information("【AgvDispatch】 Agv任务执行....");
List<string> kiva = new List<string>();
kiva.Add("ZSSSXCTU02");
kiva.Add("ZSSSXCTU01");
@@ -1196,7 +1271,7 @@ namespace Tnb.WarehouseMgr
AgvRequestConfig requestCfg = App.Configuration.Build<AgvRequestConfig>();
string url = requestCfg.AgvRequestUrls.CreateTaskChainUrl;
Logger.Information($"Agv任务执行的disTasks{JsonConvert.SerializeObject(disTasks)}");
Logger.Information($"【AgvDispatch】 Agv任务执行的disTasks{JsonConvert.SerializeObject(disTasks)}");
var taskChainCodeDic = disTasks.Where(t => !t.groups.IsNullOrWhiteSpace()).GroupBy(g => g.groups!)
.ToDictionary(x => x.Key, x => x.Select(it => new
@@ -1206,9 +1281,8 @@ namespace Tnb.WarehouseMgr
targetName = it.endpoint_code,
containerCode = it.carry_code,
}));
Logger.Information($"请求地址:{url}");
Logger.Information($"Agv任务执行的taskChainCodeDic{JsonConvert.SerializeObject(taskChainCodeDic)}");
Logger.Information($"【AgvDispatch】 Agv任务执行的taskChainCodeDic{JsonConvert.SerializeObject(taskChainCodeDic)}");
foreach ((string k, object v) in taskChainCodeDic)
{
@@ -1225,19 +1299,20 @@ namespace Tnb.WarehouseMgr
reqBody.taskChainPriority = 0;
reqBody.taskList = v;
reqBody.floor = dis.end_floor;
Logger.Information($"请求参数:{JsonConvert.SerializeObject(reqBody)}");
Logger.Information($"【AgvDispatch】 Agv任务执行 开始请求联核/task-chain/create接口 请求地址:{url} 请求参数:{reqBody} ");
dynamic respBody = await HttpClientHelper.PostStreamAsync(url, reqBody, token);
Logger.Information($"调用Agv接口响应结果:{respBody}");
Logger.Information($"【AgvDispatch】 Agv任务执行 接收到联核/task-chain/create接口信息:{respBody}");
}
}
catch (Exception ex)
{
Logger.Error("agv调度失败异常", ex);
Logger.Information($"【AgvDispatch】 agv任务执行 请求联核/task-chain/create接口失败 异常信息:{ex}");
throw;
}
}
/// <summary>
/// 任务执行
/// </summary>
@@ -1332,9 +1407,7 @@ namespace Tnb.WarehouseMgr
_ = await _db.Updateable<WmsPretaskH>().SetColumns(it => new WmsPretaskH { status = WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID }).Where(it => preTaskIds.Contains(it.id)).ExecuteCommandAsync();
//更新电梯任务数量
var eles = await _db.Queryable<WmsElevatorH>().Where(it => disTasks.Select(x => x.area_code).Contains(it.area_code)).ToListAsync();
if (eles?.Count > 0)
await _db.Updateable(eles).ReSetValue(it => it.task_nums--).ExecuteCommandAsync();
_ = await _db.Updateable<WmsElevatorH>().SetColumns(it => new WmsElevatorH { task_nums = it.task_nums - 1}).Where(it => disTasks.Select(x => x.area_code).Contains(it.area_code)).ExecuteCommandAsync();
//更新载具,锁定状态为未锁定,更新载具的库位当前任务的目标库位