diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CheckPutInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CheckPutInput.cs index 7bc98a7e..c00d5245 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CheckPutInput.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CheckPutInput.cs @@ -10,5 +10,11 @@ namespace Tnb.WarehouseMgr.Entities.Dto.Inputs public class CheckPutInput { public string point_code { get; set; } + public int type { get; set; } + } + public enum exectype + { + 放 = 0, + 取 = 1 } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/ElevagorInfoQuery.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/ElevagorInfoQuery.cs index d69dfd80..5f709c6d 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/ElevagorInfoQuery.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/ElevagorInfoQuery.cs @@ -10,7 +10,5 @@ namespace Tnb.WarehouseMgr.Entities.Dto.Queries { public string taskCode { get; set; } public string endlocation_id { get; set; } - public string startlocation_id { get; set; } - public string sourceName { get; set; } } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsElevatorH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsElevatorH.cs index e7edca99..83c7b068 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsElevatorH.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsElevatorH.cs @@ -23,7 +23,7 @@ public partial class WmsElevatorH : BaseEntity /// 电梯ID /// public string elevator_id { get; set; } = string.Empty; - + /// /// 电梯编号 /// diff --git a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs index 9b738213..56c7c513 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs @@ -45,8 +45,7 @@ namespace Tnb.WarehouseMgr private readonly IElevatorControlService _elevatorControlService; private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build(); private readonly ILoggerFactory _loggerFactory; - private static bool unLoadComplete = true; //是否放货完成 - + public static Dictionary s_eleUseStatusDic = new(); @@ -118,7 +117,6 @@ namespace Tnb.WarehouseMgr Logger.Error("未找到匹配的电梯任务", new Exception($"根据参数,sourceName:{input.sourceName},taskCode:{input.taskCode},未找到匹配的电梯任务")); return await ToApiResult(HttpStatusCode.InternalServerError, $"根据参数,sourceName:{input.sourceName},taskCode:{input.taskCode},未找到匹配的电梯任务"); } - try { if (s_elevatorMap.TryGetValue(elevator.device_id, out object? elevatorCode)) @@ -127,6 +125,7 @@ namespace Tnb.WarehouseMgr string devName = elevatorCode?.ToString(); Logger.Information($"获取设备:{devName},状态"); var tags = _eleCtlCfg.tags; + await Task.Delay(1000); (int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None); Logger.Information($"电梯当前状态->系统状态:{sysStatus.ToEnum()},运行状态:{runStatus.ToEnum()},Agv状态:{agvStatus.ToEnum()},当前楼层:{floorNo}"); { @@ -243,11 +242,10 @@ namespace Tnb.WarehouseMgr if (doorStatus == (int)EnumDoorStatus.开门到位保持 && s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.占用) { - Logger.Information($"{devName.Match(@"\d+")}#梯,任务未完成"); - return await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!"); + await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!"); } //电梯到达目标楼层后,判断当前电梯门状态是否为开门到位保持状态 - if (s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.空闲 && doorStatus != (int)EnumDoorStatus.开门到位保持 && curFloor == floorNo) //判断目标楼层与电梯所在楼层在同一层才可开门放货 + if (doorStatus != (int)EnumDoorStatus.开门到位保持 && curFloor == floorNo) //判断目标楼层与电梯所在楼层在同一层才可开门放货 { _ = await _elevatorControlService.SendOpenCloseCmd(devName, 3); //发送电梯前门开门指令 } @@ -256,7 +254,6 @@ namespace Tnb.WarehouseMgr && doorStatus == (int)EnumDoorStatus.开门到位保持 && s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.空闲) { s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.占用; - Logger.Information($"当前电梯状态:{s_eleUseStatusDic[elevator.device_id].ToEnum().ToString()}"); return await ToApiResult(HttpStatusCode.OK, "成功"); } } @@ -365,7 +362,7 @@ namespace Tnb.WarehouseMgr List disTasks = new() { disTask }; if (input.action == "LOAD") { - unLoadComplete = true; + TaskExecuteAfterUpInput taskExecuteAfterUpInput = new() { disTaskIds = disTasks.Select(x => x.id).ToList() diff --git a/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs b/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs index 591832b1..b2d76469 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs @@ -197,9 +197,11 @@ namespace Tnb.WarehouseMgr ["TagName"] = "DoorExecute", ["Value"] = value.ToString() }; + var eleStatusMap = await RedisHelper.HGetAllAsync(devName); try { _ = await HttpClientHelper.GetAsync(_elevatorCtlCfg.WriteTagUrl, pars: dicCommand); + //flag = await RedisHelper.HSetAsync(devName, ElevatorConsts.DoorExecute, value); } catch (Exception) { @@ -486,7 +488,6 @@ namespace Tnb.WarehouseMgr } var tasks = ParallelWriteTagAsync(input); var writeRes = await Task.WhenAll(tasks); - var timedTaskSvc = _backgudSvc as TimedTaskBackgroundService; if (timedTaskSvc != null) { diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index 3a54605b..539ddfd1 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -1,7 +1,8 @@ using System.Diagnostics; using System.Dynamic; using System.Linq.Expressions; -using Aliyun.OSS; +using System.Security.Policy; +using Aop.Api.Domain; using JNPF; using JNPF.Common.Contracts; using JNPF.Common.Core.Manager; @@ -16,14 +17,17 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.CodeAnalysis; using Microsoft.Extensions.Configuration; +using NetTaste; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using NPOI.OpenXmlFormats.Dml; +using Org.BouncyCastle.Crypto; using SqlSugar; 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; @@ -51,10 +55,11 @@ namespace Tnb.WarehouseMgr private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build(); private static Dictionary locMap = new Dictionary(StringComparer.OrdinalIgnoreCase); private readonly IConfiguration _configuration; + private readonly RedisData _redisData; public Func AddUnExecuteTask { get; set; } - public WareHouseService(ISqlSugarRepository repository, IDictionaryDataService dictionaryDataService, + public WareHouseService(ISqlSugarRepository repository, IDictionaryDataService dictionaryDataService, RedisData redisData, IBillRullService billRullService, IUserManager userManager, ICacheManager cacheManager, IElevatorControlService elevatorControlService //IConfiguration configuration ) : base(repository.AsSugarClient()) @@ -65,6 +70,7 @@ namespace Tnb.WarehouseMgr _userManager = userManager; _cacheManager = cacheManager; _elevatorControlService = elevatorControlService; + _redisData = redisData; //_configuration = configuration; } /// @@ -234,15 +240,28 @@ namespace Tnb.WarehouseMgr /// 判断CTU是否可以放货 /// /// - /*[HttpPost] + [HttpPost] public async Task CheckPut(CheckPutInput input) { - Dictionary dic = new Dictionary(); - dic.Add("5号输送线点位", new string[] { "TY4C-ZHUSU1", "weighDone_5" }); - dic.Add("6号输送线点位", new string[] { "TY4C-ZHUSU1", "weighDone_6" }); - if (!dic.ContainsKey(input.point_code)) - throw new AppFriendlyException("点位" + input.point_code + "不存在", 500); - var strs = dic.Where(p => p.Key == input.point_code).First().Value; + Dictionary putdic = new Dictionary(); + putdic.Add("SSX-021-005", new string[] { "CS05", "ConveyorAllowPutEmptyBox" }); + putdic.Add("SSX-021-006", new string[] { "CS06", "ConveyorAllowPutEmptyBox" }); + Dictionary getdic = new Dictionary(); + getdic.Add("SSX-021-005", new string[] { "CS05", "FullBoxAllowGet" }); + getdic.Add("SSX-021-006", new string[] { "CS06", "FullBoxAllowGet" }); + var strs = new string[] { }; + if (input.type == (int)exectype.放) + { + if (!putdic.ContainsKey(input.point_code)) + throw new AppFriendlyException("点位" + input.point_code + "不存在", 500); + strs = putdic.Where(p => p.Key == input.point_code).First().Value; + } + else if (input.type == (int)exectype.取) + { + if (!getdic.ContainsKey(input.point_code)) + throw new AppFriendlyException("点位" + input.point_code + "不存在", 500); + strs = getdic.Where(p => p.Key == input.point_code).First().Value; + } bool flag = await _redisData.HashExist(strs[0], strs[1]); if (!flag) { @@ -253,7 +272,7 @@ namespace Tnb.WarehouseMgr bool result = res != null && res["Value"] != null ? res.Value("Value") : false; if (!result) throw new AppFriendlyException("点位" + input.point_code + "不可放", 500); - }*/ + } /// /// 生成任务执行 @@ -315,7 +334,7 @@ namespace Tnb.WarehouseMgr //it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase) var elePreTasks = preTasks.Where(it => it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList(); - var normalPreTasks = preTasks.Where(it => !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 firstEleGrp = agvElevatorTasks.GroupBy(g => g.endlocation_code).Select(t => t.OrderBy(o => o.bill_code).FirstOrDefault()); agvElevatorTasks = firstEleGrp?.ToList() ?? Enumerable.Empty().ToList()!; @@ -329,7 +348,8 @@ namespace Tnb.WarehouseMgr } preTasks = normalPreTasks.Concat(agvElevatorTasks).Concat(elePreTasks).ToList(); - + //一楼中储仓CTU + CTUTaskExecute(); List ids = preTasks.Select(x => x.id).Distinct().ToList(); List? preTaskCodes = await db.Queryable().Where(it => ids.Contains(it.bill_id)).ToListAsync(); if (preTasks.Count > 0) @@ -444,9 +464,25 @@ namespace Tnb.WarehouseMgr var agvDTTasks = disTasks.Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) && !it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList(); - await SetEleDevId(agvDTTasks); + foreach (var task in agvDTTasks) + { + ElevagorInfoQuery q = new() { endlocation_id = task.endlocation_id }; + var e = await FindElevatorFromPars(q); + if (e != null) + { + task.device_id = e.device_id; + } + } - + /*foreach (var at in agvDTTasks) + { + var ele = elevatorList.Find(x => x.location_code == at.endlocation_code); + Logger.Information($"ele.elevator_id:{ele?.elevator_id},elevator_code:{ele?.elevator_code}"); + if (ele != null) + { + at.device_id = ele.elevator_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(); @@ -456,7 +492,7 @@ namespace Tnb.WarehouseMgr { if (endLocCodes.Select(x => x.device_id).All(x => !x.IsNullOrWhiteSpace())) { - Logger.Information($"呼梯操作"); + Logger.Information("呼梯操作"); _ = CallingLanding(endLocCodes); } else @@ -472,7 +508,6 @@ namespace Tnb.WarehouseMgr if (elevatorTasks?.Count > 0) { Logger.Information($"当前电梯任务数:{elevatorTasks?.Count ?? 0}"); - await SetEleDevId(elevatorTasks); foreach (WmsDistaskH? elevatorTask in elevatorTasks) { _ = ExecuteTargetFloorTask(elevatorTask); @@ -488,18 +523,7 @@ namespace Tnb.WarehouseMgr } } - async Task SetEleDevId(List distaskList) - { - foreach (var task in distaskList) - { - ElevagorInfoQuery q = new() { endlocation_id = task.endlocation_id }; - var e = await FindElevatorFromPars(q); - if (e != null) - { - task.device_id = e.device_id; - } - } - } + } catch (Exception ex) when (ex is HttpRequestException hReqEx) { @@ -518,30 +542,275 @@ namespace Tnb.WarehouseMgr agvCts.Dispose(); } } + #region CTU /// /// 生成CTU任务执行 /// /// - private async Task CTUTaskExecute(SqlSugarClient db) + private async Task CTUTaskExecute() { - List 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) - .InnerJoin((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)) - .OrderBy(a => new { priority = SqlFunc.Desc(a.priority), a.bill_code }) - .Select((a, b, c, d) => new WmsPretaskH - { - move_num = c.move_num, - third_eqp_type = c.third_eqp_type, - }, true) - .ToListAsync(); - List CTUTasks = preTasks - .Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) && - !it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)) - .ToList(); - } + try + { + var db = _db.CopyNew(); + List CTUTasks = await db.Queryable() + .InnerJoin((a, b) => a.area_id == b.id) + .Where(a => a.status == WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID) + .Where((a, b) => b.code == "B")//一楼中储仓 + .OrderBy(a => a.create_id) + .Select((a, b) => new WmsPretaskH + { + move_num = b.move_num, + third_eqp_type = b.third_eqp_type, + }, true).ToListAsync(); + List TaskCodes = await db.Queryable().Where(it => CTUTasks.Select(p => p.id).ToList().Contains(it.bill_id)).ToListAsync(); + 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(); + var OriginDistaskHs = await db.Queryable() + .InnerJoin((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(); + List DistaskHs = new List(); + List UpDistaskHs = new List(); + List DistaskCodes = new List(); + var inCtuExec = new List(); + var outCtuExec = new List(); + foreach (var item in InTasks) + { + WmsDistaskH distaskH = item.Adapt(); + 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.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); + 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()); + } + } + List preTaskCodes = TaskCodes.FindAll(x => x.bill_id == distaskH.pretask_id); + List disTaskCodes = preTaskCodes.Adapt>(); + 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) + { + WmsDistaskH distaskH = item.Adapt(); + 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.status = WmsWareHouseConst.TASK_BILL_STATUS_YXD_ID; + outCtuExec.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); + + UpDistaskHs.AddRange(OriginDistaskHs.Where(p => p.groups == distaskH.groups).ToList()); + outCtuExec.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); + outCtuExec.AddRange(DistaskHs.Where(p => p.groups == distaskH.groups).ToList()); + } + } + List preTaskCodes = TaskCodes.FindAll(x => x.bill_id == distaskH.pretask_id); + List disTaskCodes = preTaskCodes.Adapt>(); + disTaskCodes.ForEach(x => + { + x.id = SnowflakeIdHelper.NextId(); + x.bill_id = distaskH.id; + x.create_time = DateTime.Now; + }); + DistaskHs.Add(distaskH); + DistaskCodes.AddRange(disTaskCodes); + } + await db.Ado.BeginTranAsync(); + int row = 0; + if (UpDistaskHs.Count > 0) + { + await db.Updateable().SetColumns(it => new WmsDistaskH { status = WmsWareHouseConst.TASK_BILL_STATUS_YXD_ID }).Where(it => UpDistaskHs.Select(p => p.id).ToList().Contains(it.id)).ExecuteCommandAsync(); + } + if (DistaskHs.Count > 0) + { + row = await db.Insertable(DistaskHs).ExecuteCommandAsync(); + } + if (DistaskCodes.Count > 0) + { + await db.Insertable(DistaskCodes).ExecuteCommandAsync(); + } + if (row > 0) + { + List preTaskIds = DistaskHs.Select(x => x.pretask_id).ToList(); + await db.Updateable().SetColumns(it => new WmsPretaskH { status = WmsWareHouseConst.PRETASK_BILL_STATUS_YXF_ID }).Where(it => preTaskIds.Contains(it.id)).ExecuteCommandAsync(); + } + await db.Ado.CommitTranAsync(); + //判断 + if (DistaskHs.Where(p => p.status == WmsWareHouseConst.TASK_BILL_STATUS_DZX_ID).Any()) + { + var time =int.Parse( db.Queryable().Where(P => P.key == "getinterval").First().value); + timer = new Timer(TimerExec, null, TimeSpan.FromMinutes(time), TimeSpan.FromMinutes(time)); + } + if (inCtuExec.Count > 0) + { + //呼叫ctu入库 + await db.Updateable().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().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(); + } + if (outCtuExec.Count > 0) + { + //呼叫ctu出库 + await db.Updateable().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().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) + { + } + } + //判断生成bill_code + private string GetBillCode(List OriginDistaskH, List NewdistaskHs, WmsDistaskH distaskH) + { + string BillCode = string.Empty; + //入库 + if (distaskH.task_type == WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID) + { + var orgdistaskHs = OriginDistaskH.Where(p => p.status == WmsWareHouseConst.TASK_BILL_STATUS_DZX_ID && p.task_type == WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID && p.startpoint_id == distaskH.startpoint_id).ToList(); + var newdistaskHs = NewdistaskHs.Where(p => p.status == WmsWareHouseConst.TASK_BILL_STATUS_DZX_ID && p.task_type == WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID && p.startpoint_id == distaskH.startpoint_id).ToList(); + if ((orgdistaskHs.Count + newdistaskHs.Count) == 0) + { + var groups = _billRullService.GetBillNumber(WmsWareHouseConst.WMS_TASK_EXECUTE_ENCODE).Result; + BillCode = $"{groups}-1"; + } + else + { + var groups = orgdistaskHs.Count > 0 ? orgdistaskHs.First().groups : newdistaskHs.First().groups; + BillCode = $"{groups}-" + (orgdistaskHs.Count + newdistaskHs.Count + 1); + } + } + else if (distaskH.task_type == WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID) + { + var orgdistaskHs = OriginDistaskH.Where(p => p.status == WmsWareHouseConst.TASK_BILL_STATUS_DZX_ID && p.task_type == WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID && p.endpoint_id == distaskH.endpoint_id).ToList(); + var newdistaskHs = NewdistaskHs = OriginDistaskH.Where(p => p.status == WmsWareHouseConst.TASK_BILL_STATUS_DZX_ID && p.task_type == WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID && p.endpoint_id == distaskH.endpoint_id).ToList(); + if ((orgdistaskHs.Count + newdistaskHs.Count) == 0) + { + var groups = _billRullService.GetBillNumber(WmsWareHouseConst.WMS_TASK_EXECUTE_ENCODE).Result; + BillCode = $"{groups}-1"; + } + else + { + var groups = orgdistaskHs.Count > 0 ? orgdistaskHs.First().groups : newdistaskHs.First().groups; + BillCode = $"{groups}-" + (orgdistaskHs.Count + newdistaskHs.Count + 1); + } + } + return BillCode; + } + private Timer? timer; + private async void TimerExec(object e) + { + try + { + SqlSugarClient db = _db.CopyNew(); + var list = db.Queryable().InnerJoin((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) + .ToList(); + var data = list.GroupBy(p => p.groups).Select(p => new + { + groups = p.Key, + time = p.Max(a => a.create_time) + + }).ToList(); + var date = DateTime.Now; + var time = int.Parse(db.Queryable().Where(P => P.key == "getinterval").First().value); + foreach (var item in data) + { + if (date.Subtract(item.time).Minutes >= time) + { + var execlist = list.Where(p => p.groups == item.groups).ToList(); + await db.Updateable().SetColumns(it => new WmsDistaskH { status = WmsWareHouseConst.TASK_BILL_STATUS_RUNING_ID }).Where(it => execlist.Select(p => p.id).ToList().Contains(it.id)).ExecuteCommandAsync(); + await db.Updateable().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); + Ctu.Dispose(); + } + } + } + catch (Exception ex) + { + } + finally + { + timer?.Dispose(); + } + + } + private async Task CallingCTU(List distaskHs, CancellationToken token,int type) + { + try + { + AgvRequestConfig requestCfg = App.Configuration.Build(); + string url = requestCfg.AgvRequestUrls.CreateTaskChainUrl; + var taskChainCodeDic = distaskHs.Where(t => !t.groups.IsNullOrWhiteSpace()).GroupBy(g => g.groups!) + .ToDictionary(x => x.Key, x => x.Select(it => new + { + taskCode = it.bill_code, + sourceName = it.startpoint_code, + targetName = it.endpoint_code, + containerCode = it.carry_code, + })); + foreach ((string k, object v) in taskChainCodeDic) + { + dynamic reqBody = new ExpandoObject(); + reqBody.taskChainCode = k; + reqBody.type = (int)EnumTaskChainType.CTU; + reqBody.sequential = false; + reqBody.taskChainPriority = 0; + reqBody.taskList = v; + reqBody.inOut = type; + dynamic respBody = await HttpClientHelper.PostStreamAsync(url, reqBody, token); + } + } + catch (Exception ex) + { + } + } + #endregion /// /// 呼梯操作 /// @@ -634,16 +903,16 @@ namespace Tnb.WarehouseMgr private async Task ExecuteTargetFloorTask(WmsDistaskH disTask) { //收到放货确认通知,向电梯发送到3楼的指令 - Logger.Information($"开始执行电梯任务,任务ID:{disTask.id},设备ID:{disTask.device_id}"); + Logger.Information($"开始执行电梯任务,任务ID:{disTask.id}"); try { if (!s_elevatorMap.TryGetValue(disTask.device_id, out object? elevatorCode)) { return; } - string devName = elevatorCode?.ToString(); + string devName = s_elevatorMap[disTask.device_id]?.ToString() ?? _eleCtlCfg.DevName3; - Logger.Information($"当前设备{devName},{devName.Match(@"\d+")}#梯"); + Logger.Information($"当前:{devName.Match(@"\d+")}#梯"); var tags = new[] { "SysStatus", "RunStatus", "FloorNo", "DoorStatus", "AGVStatus" }; (int sysStatus, int runStatus, int curFloorNo, int doorStatus, int agvStatus) eleStatusMulti = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None); @@ -651,9 +920,8 @@ namespace Tnb.WarehouseMgr { _ = await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.AGVControl, 1); } - Logger.Information($"电梯当前状态->系统状态:{eleStatusMulti.sysStatus.ToEnum()},运行状态:{eleStatusMulti.runStatus.ToEnum().ToString()},门状态:{eleStatusMulti.doorStatus.ToEnum().ToString()},Agv状态:{eleStatusMulti.agvStatus.ToEnum().ToString()},当前楼层:{eleStatusMulti.curFloorNo}"); - if (!_elevatorAgvCtlStatusMap.TryGetValue(disTask.device_id, out int agvCtlStatus) || agvCtlStatus != (int)EnumAgvStatus.AGV运行状态) + if (!_elevatorAgvCtlStatusMap.TryGetValue(disTask.id, out int agvCtlStatus) || agvCtlStatus != (int)EnumAgvStatus.AGV运行状态) { do { @@ -661,7 +929,7 @@ namespace Tnb.WarehouseMgr await Task.Delay(1000); } while (eleStatusMulti.agvStatus != (int)EnumAgvStatus.AGV运行状态); Logger.Information($"{devName.Match(@"\d+")}#, 当前Agv状态:{eleStatusMulti.agvStatus.ToEnum()}"); - _elevatorAgvCtlStatusMap[disTask.device_id] = eleStatusMulti.agvStatus; + _elevatorAgvCtlStatusMap[disTask.id] = eleStatusMulti.agvStatus; } int doorStatus = -1; @@ -670,7 +938,6 @@ namespace Tnb.WarehouseMgr do { doorStatus = await _elevatorControlService.GetTagAsync(devName, ElevatorConsts.DoorStatus); - Logger.Information($"关门结果:{closeDoorRes}"); await Task.Delay(1000); } while (doorStatus != 4); Logger.Information($"当前门状态:{doorStatus}"); @@ -854,13 +1121,9 @@ namespace Tnb.WarehouseMgr _ = await _db.Updateable().SetColumns(it => new WmsPretaskH { status = WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID }).Where(it => preTaskIds.Contains(it.id)).ExecuteCommandAsync(); //更新电梯任务数量 - var areaCodes = disTasks.Select(x => x.area_code).ToList(); - var eles = await _db.Queryable().Where(it => areaCodes.Contains(it.area_code)).ToListAsync(); + var eles = await _db.Queryable().Where(it => disTasks.Select(x => x.area_code).Contains(it.area_code)).ToListAsync(); if (eles?.Count > 0) - { - eles.ForEach(x => x.task_nums--); - await _db.Updateable(eles).UpdateColumns(it=>it.task_nums).ExecuteCommandAsync(); - } + await _db.Updateable(eles).ReSetValue(it => it.task_nums--).ExecuteCommandAsync(); //更新载具,锁定状态为未锁定,更新载具的库位当前任务的目标库位 diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyInstockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyInstockService.cs index b997d297..e9800b55 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyInstockService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyInstockService.cs @@ -77,7 +77,7 @@ namespace Tnb.WarehouseMgr InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = input.data[nameof(InStockStrategyQuery.warehouse_id)].ToString()!, Size = 1 }; //test BasLocation llll = await _db.Queryable().FirstAsync(it => it.location_code == _configuration["TestLocation"]); - List endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput); //new() { llll }; + List endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput); WmsPointH? sPoint = null; WmsPointH? ePoint = null; if (input.data.ContainsKey(nameof(WmsPointH.location_id))) @@ -106,94 +106,104 @@ namespace Tnb.WarehouseMgr if (sPoint != null && ePoint != null) { Logger.Information($"sPoint.id={sPoint.id},ePoint.id={ePoint.id}"); - List points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id); - if (points.Count <= 2) + List points = new List(); + //中储仓不算路径 + if (input.data[nameof(InStockStrategyQuery.warehouse_id)].ToString() != "2") { - throw new AppFriendlyException("该路径不存在", 500); + points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id); + if (points.Count <= 2) + { + throw new AppFriendlyException("该路径不存在", 500); + } } - //根据获取的路径点生成预任务,生成顺序必须预路径算法返回的起终点的顺序一致(预任务顺序) else { - List preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it => - { - WmsPointH? sPoint = it.FirstOrDefault(); - WmsPointH? ePoint = it.LastOrDefault(); - - WmsPretaskH preTask = new() - { - org_id = _userManager.User.OrganizeId, - startlocation_id = sPoint?.location_id!, - startlocation_code = sPoint?.location_code!, - endlocation_id = ePoint?.location_id!, - endlocation_code = ePoint?.location_code!, - start_floor = sPoint?.floor.ToString(), - end_floor = ePoint?.floor.ToString(), - startpoint_id = sPoint?.id!, - startpoint_code = sPoint?.point_code!, - endpoint_id = ePoint?.id!, - endpoint_code = ePoint?.point_code!, - bill_code = _billRullService.GetBillNumber(WmsWareHouseConst.WMS_PRETASK_H_ENCODE).GetAwaiter().GetResult(), - status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID, - biz_type = WmsWareHouseConst.BIZTYPE_WMSEMPTYINSTOCK_ID, - task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID, - carry_id = input.data[nameof(preTask.carry_id)]?.ToString()!, - carry_code = input.data[nameof(preTask.carry_code)]?.ToString()!, - area_id = sPoint?.area_id!, - area_code = it.Key, - require_id = input.data["ReturnIdentity"].ToString(), - require_code = input.data[nameof(preTask.bill_code)]?.ToString()!, - create_id = _userManager.UserId, - create_time = DateTime.Now, - }; - - return preTask; - }).ToList(); - - bool isOk = await _wareHouseService.GenPreTask(preTasks, null!); - if (isOk) - { - - GenPreTaskUpInput preTaskUpInput = new() - { - RquireId = input.data["ReturnIdentity"].ToString()!, - CarryId = input.data[nameof(WmsCarryD.carry_id)]?.ToString()!, - CarryStartLocationId = points.FirstOrDefault()!.location_id!, - CarryStartLocationCode = points.FirstOrDefault()!.location_code!, - LocationIds = points.Select(x => x.location_id).ToList()!, - PreTaskRecords = preTasks.Adapt>() - }; - preTaskUpInput.PreTaskRecords.ForEach(x => x.id = SnowflakeIdHelper.NextId()); - - WmsHandleH handleH = new() - { - org_id = _userManager.User.OrganizeId, - startlocation_id = input.data[nameof(WmsPointH.location_id)]?.ToString()!, - endlocation_id = endLocations![0].id, - bill_code = input.data[nameof(WmsHandleH.bill_code)]?.ToString()!, - biz_type = input.data[nameof(WmsHandleH.biz_type)]?.ToString()!, - carry_id = input.data[nameof(WmsHandleH.carry_id)]?.ToString()!, - carry_code = input.data[nameof(WmsHandleH.carry_code)]?.ToString()!, - require_id = input.data["ReturnIdentity"].ToString(), - require_code = input.data[nameof(WmsHandleH.bill_code)]?.ToString()!, - create_id = _userManager.UserId, - create_time = DateTime.Now - }; - preTaskUpInput.PreTaskRecord = handleH; - //根据空载具入库Id,回更单据状态 - _ = await _db.Updateable().SetColumns(it => new WmsEmptyInstock { status = WmsWareHouseConst.BILLSTATUS_ON_ID }).Where(it => it.id == preTaskUpInput.RquireId).ExecuteCommandAsync(); - - - await _wareHouseService.GenInStockTaskHandleAfter(preTaskUpInput, - it => new WmsCarryH { is_lock = 1, location_id = preTaskUpInput.CarryStartLocationId, location_code = preTaskUpInput.CarryStartLocationCode }, - it => new BasLocation { is_lock = 1 }); - - } - else - { - throw new AppFriendlyException("预任务生成失败,路径或者设备相关配置错误", 500); - } + points.Add(sPoint); + points.Add(ePoint); } + //根据获取的路径点生成预任务,生成顺序必须预路径算法返回的起终点的顺序一致(预任务顺序) + + List preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it => + { + WmsPointH? sPoint = it.FirstOrDefault(); + WmsPointH? ePoint = it.LastOrDefault(); + + WmsPretaskH preTask = new() + { + org_id = _userManager.User.OrganizeId, + startlocation_id = sPoint?.location_id!, + startlocation_code = sPoint?.location_code!, + endlocation_id = ePoint?.location_id!, + endlocation_code = ePoint?.location_code!, + start_floor = sPoint?.floor.ToString(), + end_floor = ePoint?.floor.ToString(), + startpoint_id = sPoint?.id!, + startpoint_code = sPoint?.point_code!, + endpoint_id = ePoint?.id!, + endpoint_code = ePoint?.point_code!, + bill_code = _billRullService.GetBillNumber(WmsWareHouseConst.WMS_PRETASK_H_ENCODE).GetAwaiter().GetResult(), + status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID, + biz_type = WmsWareHouseConst.BIZTYPE_WMSEMPTYINSTOCK_ID, + task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID, + carry_id = input.data[nameof(preTask.carry_id)]?.ToString()!, + carry_code = input.data[nameof(preTask.carry_code)]?.ToString()!, + area_id = sPoint?.area_id!, + area_code = it.Key, + require_id = input.data["ReturnIdentity"].ToString(), + require_code = input.data[nameof(preTask.bill_code)]?.ToString()!, + create_id = _userManager.UserId, + create_time = DateTime.Now, + }; + + return preTask; + }).ToList(); + + bool isOk = await _wareHouseService.GenPreTask(preTasks, null!); + if (isOk) + { + + GenPreTaskUpInput preTaskUpInput = new() + { + RquireId = input.data["ReturnIdentity"].ToString()!, + CarryId = input.data[nameof(WmsCarryD.carry_id)]?.ToString()!, + CarryStartLocationId = points.FirstOrDefault()!.location_id!, + CarryStartLocationCode = points.FirstOrDefault()!.location_code!, + LocationIds = points.Select(x => x.location_id).ToList()!, + PreTaskRecords = preTasks.Adapt>() + }; + preTaskUpInput.PreTaskRecords.ForEach(x => x.id = SnowflakeIdHelper.NextId()); + + WmsHandleH handleH = new() + { + org_id = _userManager.User.OrganizeId, + startlocation_id = input.data[nameof(WmsPointH.location_id)]?.ToString()!, + endlocation_id = endLocations![0].id, + bill_code = input.data[nameof(WmsHandleH.bill_code)]?.ToString()!, + biz_type = input.data[nameof(WmsHandleH.biz_type)]?.ToString()!, + carry_id = input.data[nameof(WmsHandleH.carry_id)]?.ToString()!, + carry_code = input.data[nameof(WmsHandleH.carry_code)]?.ToString()!, + require_id = input.data["ReturnIdentity"].ToString(), + require_code = input.data[nameof(WmsHandleH.bill_code)]?.ToString()!, + create_id = _userManager.UserId, + create_time = DateTime.Now + }; + preTaskUpInput.PreTaskRecord = handleH; + //根据空载具入库Id,回更单据状态 + _ = await _db.Updateable().SetColumns(it => new WmsEmptyInstock { status = WmsWareHouseConst.BILLSTATUS_ON_ID }).Where(it => it.id == preTaskUpInput.RquireId).ExecuteCommandAsync(); + + + await _wareHouseService.GenInStockTaskHandleAfter(preTaskUpInput, + it => new WmsCarryH { is_lock = 1, location_id = preTaskUpInput.CarryStartLocationId, location_code = preTaskUpInput.CarryStartLocationCode }, + it => new BasLocation { is_lock = 1 }); + + } + else + { + throw new AppFriendlyException("预任务生成失败,路径或者设备相关配置错误", 500); + } + + } else {