diff --git a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs index bef33f31..e1dc6f12 100644 --- a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs +++ b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs @@ -35,6 +35,7 @@ using Tnb.ProductionMgr.Interfaces; using Tnb.WarehouseMgr.Entities; using Tnb.WarehouseMgr.Entities.Configs; using Tnb.WarehouseMgr.Entities.Consts; +using Tnb.WarehouseMgr.Entities.Dto.Inputs; using Tnb.WarehouseMgr.Entities.Enums; using Tnb.WarehouseMgr.Interfaces; @@ -64,9 +65,11 @@ namespace Tnb.ProductionMgr private readonly IUserManager _userManager; private readonly IBillRullService _billRullService; private readonly IWareHouseService _wareHouseService; + private readonly IWmsCarryBindService _wmsCarryBindService; + private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build(); public RedisBackGround(RedisData redisData, IPrdInstockService prdInstockService, ISqlSugarRepository repository, IWmsPDAScanInStockService wmsPDAScanInStock - , IUserManager userManager, IBillRullService billRullService, IWareHouseService wareHouseService) + , IUserManager userManager, IBillRullService billRullService, IWareHouseService wareHouseService, IWmsCarryBindService wmsCarryBindService) { _redisData = redisData; _prdInstockService = prdInstockService; @@ -75,6 +78,7 @@ namespace Tnb.ProductionMgr _userManager = userManager; _billRullService = billRullService; _wareHouseService = wareHouseService; + _wmsCarryBindService = wmsCarryBindService; } //获取redis数据 private void GetRedisData(object state) @@ -621,6 +625,13 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA target = targetConfigs.First(); LoggerFloor2UpDownMachine.LogInformation($@"【上升降机】当前条码目标料架区为 {JsonConvert.SerializeObject(target)}"); + // 料架信息 + WmsCarryH rack = db.Queryable().Where(r => r.id == target.rackid).ToList()[0]; + + // 料箱信息 + WmsCarryH LX = db.Queryable().Where(r => r.carry_code == barcode).ToList()[0]; + + // 判断《上升降机空托1/2送到》是否为true string tag_上升降机空托送到 = $@"上升降机空托{target.stackingposition}送到"; @@ -646,6 +657,16 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA remainbindracknum = r.remainbindracknum - 1 }).Where(r => r.id == WmsEmptyOutstockH.id).ExecuteCommandAsync(); LoggerFloor2UpDownMachine.LogInformation($@"【上升降机】回写出库单的剩余可绑定料架数量"); + + // 绑定料箱到料架 + CarryBindFloor2UpDownMachineInput carryBindFloor2UpDownMachineInput = new() { }; + carryBindFloor2UpDownMachineInput.carry_id = target.rackid; + carryBindFloor2UpDownMachineInput.carry_code= target.rackcode; + carryBindFloor2UpDownMachineInput.membercarry_id = LX.id; + carryBindFloor2UpDownMachineInput.membercarry_code = LX.carry_code; + carryBindFloor2UpDownMachineInput.carrystd_id = rack.carrystd_id; + + await _wmsCarryBindService.CarryBindFloor2UpDownMachine(carryBindFloor2UpDownMachineInput); } else { @@ -665,17 +686,109 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA } } - // 下升降机 - private void Floor2DownMachinecode(object args) + + + private async void Floor2DownMachinecode(object args) { - // 补充料架 + using (var db = _repository.AsSugarClient().CopyNew()) + { - // 扫码分配拆垛位 + // 读取上升降机的左右料架区配置 + string[] configs = new string[2] { "二楼下升降机机械臂左", "二楼下升降机机械臂右" }; + + // 左右料架区配置 + List WmsMechanicalArmHs = db.Queryable() + .Where(r => configs.Contains(r.name) && r.mechanicalconfirm == 1 && r.stackingcount < r.maxnum).ToList(); + + // 是否可以放货 + if (WmsMechanicalArmHs.Count == 0) + { + LoggerFloor2UpDownMachine.LogWarning($@"【下升降机】目前没有可以取货的料架区"); + return; + } + + WmsMechanicalArmH target; + target = WmsMechanicalArmHs.First(); + // 待拆垛列表 + List WmsCarrybindHs = db.Queryable() + .InnerJoin((a, b) => a.rackid == b.carry_id) + .Where(a => configs.Contains(a.name) && a.mechanicalconfirm == 1 && a.id == target.id).Select((a, b) => b).OrderBy(a => a.id).ToList(); + // 料架拆垛完成 + if (WmsCarrybindHs.Count() == 0) + { + return; + } + string barcode = WmsCarrybindHs[0].membercarry_code; + + // 如果条码已被绑定 + if (WmsMechanicalArmHs.Where(r => !string.IsNullOrEmpty(r.barcodes) && r.barcodes.Contains(barcode)).Count() > 0) + { + LoggerFloor2UpDownMachine.LogWarning($@"【下升降机】条码{barcode}已被绑定"); + return; + } + LoggerFloor2UpDownMachine.LogInformation($@"【下升降机】扫描到有效条码 {barcode}"); + + await db.Ado.BeginTranAsync(); + try + { + LoggerFloor2UpDownMachine.LogInformation($@"【下升降机】当前条码目标料架区为 {JsonConvert.SerializeObject(target)}"); + + // 料架信息 + WmsCarryH rack = db.Queryable().Where(r => r.id == target.rackid).ToList()[0]; + + // 料箱信息 + WmsCarryH LX = db.Queryable().Where(r => r.carry_code == barcode).ToList()[0]; + + + // 判断《下升降机满托1/2送到》是否为true + string tag_下升降机满托送到 = $@"下升降机满托{target.stackingposition}送到"; + + bool 下升降机满托送到 = (bool)Floor2UpDownMachinecode_GetTag(tag_下升降机满托送到); + + LoggerFloor2UpDownMachine.LogInformation($@"【下降机】取值 {tag_下升降机满托送到} 结果为 {下升降机满托送到}"); + if (下升降机满托送到) + { + // 开始拆垛 + bool result = await Floor2UpDownMachinecode_SetTag(MechanicalArmConsts.下升降机当前码垛位, target.stackingposition.ToString()); + LoggerFloor2UpDownMachine.LogInformation($@"【下升降机】拆垛结果 {result}"); + // 回写料箱条码、码垛计数 + await db.Updateable().SetColumns(r => new WmsMechanicalArmH + { + barcodes = $"{target.barcodes},{barcode}".Trim(','), + stackingcount = r.stackingcount + 1 + }).Where(r => r.id == target.id).ExecuteCommandAsync(); + LoggerFloor2UpDownMachine.LogInformation($@"【下升降机】回写料箱条码、拆垛计数"); + + // 解除绑定料箱到料架 + CarryBindFloor2UpDownMachineInput carryBindFloor2UpDownMachineInput = new() { }; + carryBindFloor2UpDownMachineInput.carry_id = target.rackid; + carryBindFloor2UpDownMachineInput.carry_code = target.rackcode; + carryBindFloor2UpDownMachineInput.membercarry_id = LX.id; + carryBindFloor2UpDownMachineInput.membercarry_code = LX.carry_code; + carryBindFloor2UpDownMachineInput.carrystd_id = rack.carrystd_id; + + await _wmsCarryBindService.CarryUnbindFloor2UpDownMachine(carryBindFloor2UpDownMachineInput); + } + else + { + LoggerFloor2UpDownMachine.LogError($@"【下升降机】料架未送到 料架区{target.stackingposition}"); + } + + + await db.Ado.CommitTranAsync(); + + } + catch (Exception ex) + { + LoggerFloor2UpDownMachine.LogError(ex.ToString()); + LoggerFloor2UpDownMachine.LogError(ex.StackTrace); + await db.Ado.RollbackTranAsync(); + } + } } - /// /// 检查机械臂料架区信号(上升降机空托1送到) /// @@ -712,6 +825,46 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA } } + + /// + /// 检查机械臂料架区信号(上升降机满托1送到) + /// + /// + public async Task 检查机械臂料架区信号_下升降机满托1送到() + { + using (var db = _repository.AsSugarClient().CopyNew()) + { + string[] configs_upMachine = new string[2] { "二楼下升降机机械臂左", "二楼下升降机机械臂右" }; + + // 找到AGV已到货,没有机械臂确认的数据 + ISugarQueryable WmsMechanicalArmHsuagar = db.Queryable() + .Where(r => r.agvconfirm == 1 && r.mechanicalconfirm == 0 && configs_upMachine.Contains(r.name)); + + foreach (WmsMechanicalArmH wmsMechanicalArmH in WmsMechanicalArmHsuagar.ToList()) + { + bool 上升降机请求送空托 = (bool)Floor2UpDownMachinecode_GetTag($"下升降机请求送满托{wmsMechanicalArmH.stackingposition}"); + + string data = _redisData.GetHash("东面提升机输送线", $"下升降机满托{wmsMechanicalArmH.stackingposition}送到").Result; + JObject? res = JsonConvert.DeserializeObject(data); + bool result = res != null && res["Value"] != null ? res.Value("Value") : false; + LoggerFloor2RackDelivery.LogInformation($"【送满托到上升降区】 下升降机满托{wmsMechanicalArmH.stackingposition}送到 结果为{result}"); + if (result) + { + int LXCount = db.Queryable().Where(r => r.carry_id == wmsMechanicalArmH.rackid).Count(); + + // 绑定料架 + await db.Updateable().SetColumns(r => new WmsMechanicalArmH + { + mechanicalconfirm = 1, + maxnum = LXCount + }).Where(r => r.id == wmsMechanicalArmH.id).ExecuteCommandAsync(); + } + } + + return true; + } + } + /// /// 送空托到上升降区 /// @@ -736,94 +889,209 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA } // 料架区 - WmsMechanicalArmH wmsMechanicalArmH = WmsMechanicalArmHs[0]; - - bool 上升降机请求送空托 = (bool)Floor2UpDownMachinecode_GetTag($"上升降机请求送空托{wmsMechanicalArmH.stackingposition}"); - if (!上升降机请求送空托) + foreach (WmsMechanicalArmH wmsMechanicalArmH in WmsMechanicalArmHs) { - LoggerFloor2RackDelivery.LogWarning($"【送空托到上升降区】 料架区 {wmsMechanicalArmH.name}{wmsMechanicalArmH.stackingposition} 上升降机请求送空托{wmsMechanicalArmH.stackingposition}信号不为true"); - return false; + + bool 上升降机请求送空托 = (bool)Floor2UpDownMachinecode_GetTag($"上升降机请求送空托{wmsMechanicalArmH.stackingposition}"); + if (!上升降机请求送空托) + { + LoggerFloor2RackDelivery.LogWarning($"【送空托到上升降区】 料架区 {wmsMechanicalArmH.name}{wmsMechanicalArmH.stackingposition} 上升降机请求送空托{wmsMechanicalArmH.stackingposition}信号不为true"); + return false; + } + + LoggerFloor2RackDelivery.LogInformation($"【送空托到上升降区】 即将补充料架区{wmsMechanicalArmH.name}"); + + + // 找到占用且未锁定的库位上的空料架 + ISugarQueryable rackStartLocations = + _repository.AsSugarClient().Queryable() + .InnerJoin((a, b) => a.id == b.location_id) + .LeftJoin((a, b, c) => b.id == c.carry_id) + .Where((a, b, c) => a.wh_id == "33780009364245" && a.is_use == "1" && a.is_lock == 0 && string.IsNullOrEmpty(c.id) + && b.carrystd_id == WmsWareHouseConst.CARRY_LJSTD_ID).OrderBy(a => a.id).Take(1); + + if (rackStartLocations.Count() == 0) + { + LoggerFloor2RackDelivery.LogWarning($"【送空托到上升降区】 暂存仓中没有可用的空料架 {rackStartLocations.ToSqlString()}"); + return false; + } + + BasLocation startLocation = rackStartLocations.First(); + + List startPoints = _repository.AsSugarClient().Queryable().Where(r => r.location_id == startLocation.id).ToList(); + + if (startPoints.Count == 0) + { + LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 起始库位{startLocation.location_code}未在点位表维护对应的点位"); + return false; + } + + List endPoints = _repository.AsSugarClient().Queryable().Where(r => r.id == wmsMechanicalArmH.point_id).ToList(); + + if (endPoints.Count == 0) + { + LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 终点{wmsMechanicalArmH.point_id} {wmsMechanicalArmH.point_code}未在点位表维护对应的点位"); + return false; + } + + List wmsCarryHs = _repository.AsSugarClient().Queryable().Where(r => r.location_id == startLocation.id).ToList(); + if (wmsCarryHs.Count == 0) + { + LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 起点{startLocation.id} {startLocation.location_code}上找不到料架"); + return false; + } + + if (wmsCarryHs.Count > 1) + { + LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 起点{startLocation.id} {startLocation.location_code}上存在多个料架"); + return false; + } + + // 空料架 + WmsCarryH targetCarry = wmsCarryHs[0]; + + WmsPointH startPoint = startPoints.First(); + WmsPointH endPoint = endPoints.First(); + + await _repository.AsSugarClient().Updateable().SetColumns(r => new BasLocation + { + is_lock = 1 + }).Where(r => r.id == startLocation.id).ExecuteCommandAsync(); + await _repository.AsSugarClient().Updateable().SetColumns(r => new WmsPointH + { + is_lock = 1 + }).Where(r => r.id == endPoint.id).ExecuteCommandAsync(); + + + LoggerFloor2RackDelivery.LogInformation($"【送空托到上升降区】 开始生成预任务 起点{startPoint.point_code} 终点{endPoint.point_code} 料架 {targetCarry.carry_code}"); + List points = new List(); + points.Add(startPoint); + points.Add(endPoint); + + Tuple result = await Floor2UpDownMachinecode_createPretask(points, targetCarry.id, targetCarry.carry_code); + if (!result.Item1) + { + throw new Exception("【送空托到上升降区】 未成功生成预任务"); + } } - - LoggerFloor2RackDelivery.LogInformation($"【送空托到上升降区】 即将补充料架区{wmsMechanicalArmH.name}"); - - - // 找到占用且未锁定的库位上的空料架 - ISugarQueryable rackStartLocations = - _repository.AsSugarClient().Queryable() - .InnerJoin((a, b) => a.id == b.location_id) - .LeftJoin((a, b, c) => b.id == c.carrybind_id) - .Where((a, b, c) => a.wh_id == "33780009364245" && a.is_use == "1" && a.is_lock == 0 && string.IsNullOrEmpty(c.id) - && b.carrystd_id == WmsWareHouseConst.CARRY_LJSTD_ID).OrderBy(a => a.id).Take(1); - - if (rackStartLocations.Count() == 0) - { - LoggerFloor2RackDelivery.LogWarning($"【送空托到上升降区】 暂存仓中没有可用的空料架 {rackStartLocations.ToSqlString()}"); - return false; - } - - BasLocation startLocation = rackStartLocations.First(); - - List startPoints = _repository.AsSugarClient().Queryable().Where(r => r.location_id == startLocation.id).ToList(); - - if (startPoints.Count == 0) - { - LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 起始库位{startLocation.location_code}未在点位表维护对应的点位"); - return false; - } - - List endPoints = _repository.AsSugarClient().Queryable().Where(r => r.id == wmsMechanicalArmH.point_id).ToList(); - - if (endPoints.Count == 0) - { - LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 终点{wmsMechanicalArmH.point_id} {wmsMechanicalArmH.point_code}未在点位表维护对应的点位"); - return false; - } - - List wmsCarryHs = _repository.AsSugarClient().Queryable().Where(r => r.location_id == startLocation.id).ToList(); - if (wmsCarryHs.Count == 0) - { - LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 起点{startLocation.id} {startLocation.location_code}上找不到料架"); - return false; - } - - if (wmsCarryHs.Count > 1) - { - LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 起点{startLocation.id} {startLocation.location_code}上存在多个料架"); - return false; - } - - // 空料架 - WmsCarryH targetCarry = wmsCarryHs[0]; - - WmsPointH startPoint = startPoints.First(); - WmsPointH endPoint = endPoints.First(); - - await _repository.AsSugarClient().Updateable().SetColumns(r => new BasLocation - { - is_lock = 1 - }).Where(r => r.id == startLocation.id).ExecuteCommandAsync(); - await _repository.AsSugarClient().Updateable().SetColumns(r => new WmsPointH - { - is_lock = 1 - }).Where(r => r.id == endPoint.id).ExecuteCommandAsync(); - - - LoggerFloor2RackDelivery.LogInformation($"【送空托到上升降区】 开始生成预任务 起点{startPoint.point_code} 终点{endPoint.point_code} 料架 {targetCarry.carry_code}"); - List points = new List(); - points.Add(startPoint); - points.Add(endPoint); - - bool isOk = await Floor2UpDownMachinecode_createPretask(points, targetCarry.id, targetCarry.carry_code); - if (!isOk) - { - throw new Exception("【送空托到上升降区】 未成功生成预任务"); - } - return true; } } + /// + /// 送满托到下升降区 + /// + /// + public async Task 送满托到下升降区() + { + using (var db = _repository.AsSugarClient().CopyNew()) + { + string[] configs_upMachine = new string[2] { "二楼下升降机机械臂左", "二楼下升降机机械臂右" }; + + // 找到没有绑定料架的且点位未锁定的料架区 + ISugarQueryable WmsMechanicalArmHsuagar = _repository.AsSugarClient().Queryable(). + InnerJoin((a, b) => a.point_id == b.id) + .Where((a, b) => string.IsNullOrEmpty(a.rackcode) && b.is_lock == 0 && configs_upMachine.Contains(a.name)); + + List WmsMechanicalArmHs = WmsMechanicalArmHsuagar.ToList(); + + if (WmsMechanicalArmHs.Count() == 0) + { + LoggerFloor2RackDelivery.LogWarning($"【送满托到下升降区】 无需补充料架区 {WmsMechanicalArmHsuagar.ToSqlString()}"); + return false; + } + + // 料架区 + foreach (WmsMechanicalArmH wmsMechanicalArmH in WmsMechanicalArmHs) + { + + bool 下升降机请求送满托 = (bool)Floor2UpDownMachinecode_GetTag($"下升降机请求送满托{wmsMechanicalArmH.stackingposition}"); + if (!下升降机请求送满托) + { + LoggerFloor2RackDelivery.LogWarning($"【送满托到下升降区】 料架区 {wmsMechanicalArmH.name}{wmsMechanicalArmH.stackingposition} 下升降机请求送满托{wmsMechanicalArmH.stackingposition}信号不为true"); + return false; + } + + LoggerFloor2RackDelivery.LogInformation($"【送满托到下升降区】 即将补充料架区{wmsMechanicalArmH.name}"); + + + // 找到占用且未锁定的库位上的满料架 + ISugarQueryable rackStartLocations = + _repository.AsSugarClient().Queryable() + .InnerJoin((a, b) => a.id == b.location_id) + .LeftJoin((a, b, c) => b.id == c.carry_id) + .Where((a, b, c) => a.wh_id == "33780009364245" && a.is_use == "1" && a.is_lock == 0 && !string.IsNullOrEmpty(c.id) + && b.carrystd_id == WmsWareHouseConst.CARRY_LJSTD_ID).OrderBy(a => a.id).Take(1); + + if (rackStartLocations.Count() == 0) + { + LoggerFloor2RackDelivery.LogWarning($"【送满托到下升降区】 暂存仓中没有可用的满料架 {rackStartLocations.ToSqlString()}"); + return false; + } + + BasLocation startLocation = rackStartLocations.First(); + + List startPoints = _repository.AsSugarClient().Queryable().Where(r => r.location_id == startLocation.id).ToList(); + + if (startPoints.Count == 0) + { + LoggerFloor2RackDelivery.LogError($"【送满托到下升降区】 起始库位{startLocation.location_code}未在点位表维护对应的点位"); + return false; + } + + List endPoints = _repository.AsSugarClient().Queryable().Where(r => r.id == wmsMechanicalArmH.point_id).ToList(); + + if (endPoints.Count == 0) + { + LoggerFloor2RackDelivery.LogError($"【送满托到下升降区】 终点{wmsMechanicalArmH.point_id} {wmsMechanicalArmH.point_code}未在点位表维护对应的点位"); + return false; + } + + List wmsCarryHs = _repository.AsSugarClient().Queryable().Where(r => r.location_id == startLocation.id).ToList(); + if (wmsCarryHs.Count == 0) + { + LoggerFloor2RackDelivery.LogError($"【送满托到下升降区】 起点{startLocation.id} {startLocation.location_code}上找不到料架"); + return false; + } + + if (wmsCarryHs.Count > 1) + { + LoggerFloor2RackDelivery.LogError($"【送满托到下升降区】 起点{startLocation.id} {startLocation.location_code}上存在多个料架"); + return false; + } + + // 满料架 + WmsCarryH targetCarry = wmsCarryHs[0]; + + WmsPointH startPoint = startPoints.First(); + WmsPointH endPoint = endPoints.First(); + + await _repository.AsSugarClient().Updateable().SetColumns(r => new BasLocation + { + is_lock = 1 + }).Where(r => r.id == startLocation.id).ExecuteCommandAsync(); + await _repository.AsSugarClient().Updateable().SetColumns(r => new WmsPointH + { + is_lock = 1 + }).Where(r => r.id == endPoint.id).ExecuteCommandAsync(); + + + LoggerFloor2RackDelivery.LogInformation($"【送满托到下升降区】 开始生成预任务 起点{startPoint.point_code} 终点{endPoint.point_code} 料架 {targetCarry.carry_code}"); + List points = new List(); + points.Add(startPoint); + points.Add(endPoint); + + Tuple result = await Floor2UpDownMachinecode_createPretask(points, targetCarry.id, targetCarry.carry_code); + if (!result.Item1) + { + throw new Exception("【送满托到下升降区】 未成功生成预任务"); + } + } + return true; + } + } + + /// /// 移走上升降区未生成预任务且满托的料架 /// @@ -839,6 +1107,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA foreach (WmsMechanicalArmH wmsMechanicalArmH in WmsMechanicalArmHs) { + LoggerFloor2RackDelivery.LogInformation($"【移走上升降区满托的料架】 开始执行预任务生成 {wmsMechanicalArmH.point_code} {wmsMechanicalArmH.outbill} {wmsMechanicalArmH.barcodes}"); try { // 判断是否 上升降机请求取满托 @@ -887,14 +1156,24 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA LoggerFloor2RackDelivery.LogError($"【移走上升降区满托的料架】 终点库位{endLocation.location_code}未在点位表维护对应的点位"); return false; } + WmsPointH endPoint = endPoints.First(); points.Add(endPoint); + // 锁住终点库位 + await db.Updateable(r => new BasLocation + { + is_lock = 1 + }).Where(r => r.id == endLocation.id).ExecuteCommandAsync(); + await db.Updateable(r => new WmsPointH + { + is_lock = 1 + }).Where(r => r.id == endPoint.id).ExecuteCommandAsync(); - LoggerFloor2RackDelivery.LogInformation($"开始执行预任务生成: 料架区为{wmsMechanicalArmH.name}{wmsMechanicalArmH.stackingposition} 料架为{wmsMechanicalArmH.rackcode}"); + LoggerFloor2RackDelivery.LogInformation($"【移走上升降区满托的料架】 开始执行预任务生成: 料架区为{wmsMechanicalArmH.name}{wmsMechanicalArmH.stackingposition} 料架为{wmsMechanicalArmH.rackcode}"); - bool isOk = await Floor2UpDownMachinecode_createPretask(points, wmsMechanicalArmH.rackid, wmsMechanicalArmH.rackcode); - if (!isOk) + Tuple result = await Floor2UpDownMachinecode_createPretask(points, wmsMechanicalArmH.rackid, wmsMechanicalArmH.rackcode); + if (!result.Item1) { throw new Exception("未成功生成预任务"); } @@ -909,6 +1188,104 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA } } + + /// + /// 移走下升降区未生成预任务且空托的料架 + /// + /// + public async Task 移走下升降区未生成预任务且空托的料架() + { + using (var db = _repository.AsSugarClient().CopyNew()) + { + string[] configs_upMachine = new string[2] { "二楼下升降机机械臂左", "二楼下升降机机械臂右" }; + // 读取下升降机的左右料架区配置 + + List WmsMechanicalArmHs = _repository.AsSugarClient().Queryable().Where(r => r.stackingcount == r.maxnum && r.maxnum != 0 && !string.IsNullOrEmpty(r.rackcode) && r.iscreatepretask == 0 && configs_upMachine.Contains(r.name)).ToList(); + + foreach (WmsMechanicalArmH wmsMechanicalArmH in WmsMechanicalArmHs) + { + LoggerFloor2RackDelivery.LogInformation($"【移走下升降区空托的料架】 开始执行预任务生成 {wmsMechanicalArmH.point_code} {wmsMechanicalArmH.outbill} {wmsMechanicalArmH.barcodes}"); + try + { + // 判断是否 上升降机请求取满托 + bool 下升降机请求取空托 = (bool)Floor2UpDownMachinecode_GetTag($"下升降机请求取空托{wmsMechanicalArmH.stackingposition}"); + if (!下升降机请求取空托) + { + LoggerFloor2RackDelivery.LogError($"【移走下升降区空托的料架】下升降机请求取空托{wmsMechanicalArmH.stackingposition}"); + return false; + } + + await _repository.AsSugarClient().Updateable().SetColumns(r => new WmsMechanicalArmH + { + iscreatepretask = 1 + }).Where(r => r.id == wmsMechanicalArmH.id).ExecuteCommandAsync(); + + List points = new List(); + + List startPoints = _repository.AsSugarClient().Queryable().Where(r => r.id == wmsMechanicalArmH.point_id).ToList(); + + if (startPoints.Count == 0) + { + LoggerFloor2RackDelivery.LogError($"【移走下升降区空托的料架】 起点{wmsMechanicalArmH.point_id} {wmsMechanicalArmH.point_code}未在点位表维护对应的点位"); + return false; + } + + WmsPointH startPoint = startPoints.First(); + points.Add(startPoint); + + // 找到未占用且未锁定的库位 + ISugarQueryable rackEndLocations = + _repository.AsSugarClient().Queryable() + .Where(r => r.wh_id == "33780009364245" && r.is_use == "0" && r.is_lock == 0).OrderBy(a => a.id).Take(1); + + if (rackEndLocations.Count() == 0) + { + LoggerFloor2RackDelivery.LogWarning($"【移走下升降区空托的料架】 暂存仓中没有可用的空库位 {rackEndLocations.ToSqlString()}"); + return false; + } + + BasLocation endLocation = rackEndLocations.First(); + + List endPoints = _repository.AsSugarClient().Queryable().Where(r => r.location_id == endLocation.id).ToList(); + + if (endPoints.Count == 0) + { + LoggerFloor2RackDelivery.LogError($"【移走下升降区空托的料架】 终点库位{endLocation.location_code}未在点位表维护对应的点位"); + return false; + } + + WmsPointH endPoint = endPoints.First(); + points.Add(endPoint); + + // 锁住终点库位 + await db.Updateable(r => new BasLocation + { + is_lock = 1 + }).Where(r => r.id == endLocation.id).ExecuteCommandAsync(); + await db.Updateable(r => new WmsPointH + { + is_lock = 1 + }).Where(r => r.id == endPoint.id).ExecuteCommandAsync(); + + LoggerFloor2RackDelivery.LogInformation($"【移走下升降区空托的料架】 开始执行预任务生成: 料架区为{wmsMechanicalArmH.name}{wmsMechanicalArmH.stackingposition} 料架为{wmsMechanicalArmH.rackcode}"); + + Tuple result = await Floor2UpDownMachinecode_createPretask(points, wmsMechanicalArmH.rackid, wmsMechanicalArmH.rackcode); + if (!result.Item1) + { + throw new Exception("未成功生成预任务"); + } + } + catch (Exception ex) + { + LoggerFloor2RackDelivery.LogError(ex.ToString()); + LoggerFloor2RackDelivery.LogError(ex.StackTrace); + } + } + return true; + } + } + + // 料架配送 private async void Floor2RackDelivery(object args) { @@ -916,16 +1293,24 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA await s_taskExecuteRackDelivery.WaitAsync(); try { - // 检查机械臂料架区信号(上升降机空托1送到) await 检查机械臂料架区信号_上升降机空托1送到(); + // 检查机械臂料架区信号(下升降机满托1送到) + await 检查机械臂料架区信号_下升降机满托1送到(); + // 送空托到上升降区 await 送空托到上升降区(); + // 送满托到下升降区 + await 送满托到下升降区(); + // 移走上升降区未生成预任务且满托的料架 await 移走上升降区未生成预任务且满托的料架(); + // 移走下升降区未生成预任务且空托的料架 + await 移走下升降区未生成预任务且空托的料架(); + _ = _wareHouseService.GenTaskExecute(); } @@ -940,15 +1325,17 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA // 上下升降机生成预任务(补充料架、上升降机取货到料架、上升降机满托运走,下升降机拿货到输送线、下升降机空托运走) - private async Task Floor2UpDownMachinecode_createPretask(List points, string carry_id, string carry_code) + private async Task> Floor2UpDownMachinecode_createPretask(List points, string carry_id, string carry_code) { //根据获取的路径点生成预任务,生成顺序必须预路径算法返回的起终点的顺序一致(预任务顺序) + WmsPretaskH preTask = null; + string bill_code = _billRullService.GetBillNumber(WmsWareHouseConst.WMS_PRETASK_H_ENCODE).GetAwaiter().GetResult(); 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() + preTask = new() { org_id = "", startlocation_id = sPoint?.location_id!, @@ -961,7 +1348,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA 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(), + bill_code = bill_code, status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID, biz_type = "", task_type = "", @@ -984,9 +1371,9 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA if (result) { LoggerFloor2RackDelivery.LogInformation($"成功生成预任务:{preTasks.First().bill_code}"); - return true; + return new Tuple(true, preTask); } - return false; + return new Tuple(false, null); } private object Floor2UpDownMachinecode_GetTag(string tag) @@ -1069,7 +1456,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA reqBody.taskChainPriority = 0; reqBody.taskList = v; reqBody.floor = dis.end_floor; - LoggerFloor2UpDownMachine.LogInformation($"【AgvDispatch】 Agv任务执行 开始请求联核/task-chain/create接口 请求地址:{url} 请求参数:{reqBody} "); + LoggerFloor2UpDownMachine.LogInformation($"【AgvDispatch】 Agv任务执行 开始请求联核/task-chain/create接口 请求地址:{url} 请求参数:{JsonConvert.SerializeObject(reqBody)} "); dynamic respBody = await HttpClientHelper.PostStreamAsync(url, reqBody, token); LoggerFloor2UpDownMachine.LogInformation($"【AgvDispatch】 Agv任务执行 接收到联核/task-chain/create接口信息:{respBody}"); } @@ -1086,15 +1473,15 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA public Task StartAsync(CancellationToken cancellationToken) { - Readtimer = new Timer(GetRedisData, null, TimeSpan.Zero, TimeSpan.FromSeconds(300)); - CheckGettimer = new Timer(CheckGet, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); - Scantimer = new Timer(ScanInStock, null, TimeSpan.Zero, TimeSpan.FromSeconds(60)); - SSXcodetimer = new Timer(SSXcode, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); + //Readtimer = new Timer(GetRedisData, null, TimeSpan.Zero, TimeSpan.FromSeconds(300)); + //CheckGettimer = new Timer(CheckGet, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); + //Scantimer = new Timer(ScanInStock, null, TimeSpan.Zero, TimeSpan.FromSeconds(60)); + //SSXcodetimer = new Timer(SSXcode, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); // 二楼上升降机 - Floor2UpMachinecodetimer = new Timer(Floor2UpMachinecode, null, TimeSpan.Zero, TimeSpan.FromSeconds(20)); + Floor2UpMachinecodetimer = new Timer(Floor2UpMachinecode, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); // 二楼下升降机 - //Floor2DownMachinecodetimer = new Timer(Floor2DownMachinecode, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); + Floor2DownMachinecodetimer = new Timer(Floor2DownMachinecode, null, TimeSpan.Zero, TimeSpan.FromSeconds(60)); // 二楼料架配送 Floor2RackDeliverytimer = new Timer(Floor2RackDelivery, null, TimeSpan.Zero, TimeSpan.FromSeconds(60)); diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CarryBindFloor2UpDownMachineInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CarryBindFloor2UpDownMachineInput.cs new file mode 100644 index 00000000..4d60b738 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CarryBindFloor2UpDownMachineInput.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tnb.WarehouseMgr.Entities.Dto.Inputs +{ + public class CarryBindFloor2UpDownMachineInput + { + public string? carry_id { get; set; } + public string? carry_code { get; set; } + public string? carrystd_id { get; set; } + public string? membercarry_id { get; set; } + public string? membercarry_code { get; set; } + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CarryMaterialBindInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CarryMaterialBindInput.cs index 8a705e74..8572cd3b 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CarryMaterialBindInput.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CarryMaterialBindInput.cs @@ -20,6 +20,6 @@ namespace Tnb.WarehouseMgr.Entities.Dto.Inputs public string? codeqty { get; set; } public int is_out { get; set; } public string? unit_id { get; set; } - + } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCarrybindH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCarrybindH.cs index b28ac64a..7731764f 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCarrybindH.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCarrybindH.cs @@ -37,7 +37,7 @@ public partial class WmsCarrybindH : BaseEntity /// /// 载具名称 /// - public string carry_name { get; set; } = string.Empty; + //public string carry_name { get; set; } = string.Empty; /// /// dataType diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryBindService.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryBindService.cs index d697abda..22a13c86 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryBindService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsCarryBindService.cs @@ -1,4 +1,5 @@ using JNPF.Common.Dtos.VisualDev; +using Tnb.WarehouseMgr.Entities.Dto.Inputs; namespace Tnb.WarehouseMgr.Interfaces { @@ -8,5 +9,8 @@ namespace Tnb.WarehouseMgr.Interfaces public interface IWmsCarryBindService { Task CarryBind(VisualDevModelDataCrInput input); + + Task CarryBindFloor2UpDownMachine(CarryBindFloor2UpDownMachineInput input); + Task CarryUnbindFloor2UpDownMachine(CarryBindFloor2UpDownMachineInput input); } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index b4d59a77..3c1231a5 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -440,6 +440,12 @@ namespace Tnb.WarehouseMgr /// public async Task Floor2MechanicalComplete(WmsDistaskH disTask, string action) { + List rackAreaPoints = new List(); + // 二楼料架区点位 + rackAreaPoints.Add("AS01"); + rackAreaPoints.Add("AS02"); + rackAreaPoints.Add("AX01"); + rackAreaPoints.Add("AX02"); if (disTask.area_code == "E") { Logger.Information($"【二楼机械臂Floor2MechanicalComplete】收到到货完成信号 传入参数: {disTask.bill_code} {action}"); @@ -447,53 +453,80 @@ namespace Tnb.WarehouseMgr if (action == "UNLOAD") { - ISugarQueryable WmsMechanicalArmHs = db.Queryable().Where(r => r.point_code == disTask.endpoint_code); - if (WmsMechanicalArmHs.Count() == 0) + // 去料架区放货 + if (rackAreaPoints.Contains(disTask.endlocation_code)) { - Logger.Information($"【二楼机械臂Floor2MechanicalComplete】 任务执行终点{disTask.endpoint_code} 与料架区的点位不匹配"); - return false; - } - WmsMechanicalArmH target = WmsMechanicalArmHs.First(); + ISugarQueryable WmsMechanicalArmHs = db.Queryable().Where(r => r.point_code == disTask.endpoint_code); + if (WmsMechanicalArmHs.Count() == 0) + { + Logger.Information($"【二楼机械臂Floor2MechanicalComplete】 任务执行终点{disTask.endpoint_code} 与料架区的点位不匹配"); + return false; + } + WmsMechanicalArmH target = WmsMechanicalArmHs.First(); - // 回写料架和AGV确认 - await db.Updateable().SetColumns(r => new WmsMechanicalArmH + // 回写料架和AGV确认 + await db.Updateable().SetColumns(r => new WmsMechanicalArmH + { + agvconfirm = 1, + rackid = disTask.carry_id, + rackcode = disTask.carry_code + }).Where(r => r.id == target.id).ExecuteCommandAsync(); + Logger.Information($"【二楼机械臂Floor2MechanicalComplete】{disTask.bill_code} AGV已到货"); + } + else // 去暂存仓放货 { - agvconfirm = 1, - rackid = disTask.carry_id, - rackcode = disTask.carry_code - }).Where(r => r.id == target.id).ExecuteCommandAsync(); - Logger.Information($"【二楼机械臂Floor2MechanicalComplete】{disTask.bill_code} AGV已到货"); + // 回写料架料箱绑定表的库位 + ISugarQueryable wmsCarryHs = db.Queryable().Where(r => r.carry_code == disTask.carry_code); + var wmsCarryHList = wmsCarryHs.ToList(); + wmsCarryHList.ForEach(r => + { + r.location_id = disTask.endlocation_id; + r.location_code = disTask.endlocation_code; + r.source_id = disTask.id; + r.source_code = disTask.bill_code; + }); + await db.Updateable(wmsCarryHList).ExecuteCommandAsync(); + } } else { - ISugarQueryable WmsMechanicalArmHs = db.Queryable().Where(r => r.point_code == disTask.startpoint_code); - if (WmsMechanicalArmHs.Count() == 0) + // 去暂存仓取货 + if (rackAreaPoints.Contains(disTask.endlocation_code)) { - Logger.Information($"【二楼机械臂Floor2MechanicalComplete】 任务执行起点{disTask.endpoint_code} 与料架区的点位不匹配"); - return false; + + Logger.Information($"【二楼机械臂Floor2MechanicalComplete】{disTask.bill_code} AGV在暂存仓取货完成"); } - WmsMechanicalArmH target = WmsMechanicalArmHs.First(); - - //回写出库单状态 - await db.Updateable().SetColumns(r=>new WmsEmptyOutstockH + else // 去料架区取货 { - bindrackcomplete = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID - }).Where(r => r.bill_code == target.outbill).ExecuteCommandAsync(); + ISugarQueryable WmsMechanicalArmHs = db.Queryable().Where(r => r.point_code == disTask.startpoint_code); + if (WmsMechanicalArmHs.Count() == 0) + { + Logger.Information($"【二楼机械臂Floor2MechanicalComplete】 任务执行起点{disTask.endpoint_code} 与料架区的点位不匹配"); + return false; + } + WmsMechanicalArmH target = WmsMechanicalArmHs.First(); - // 重置料架区 - await db.Updateable().SetColumns(r => new WmsMechanicalArmH - { - stackingcount = 0, - barcodes = "", - outbill = "", - maxnum = 0, - iscreatepretask = 0, - rackcode = "", - rackid = "", - agvconfirm = 0, - mechanicalconfirm = 0 - }).Where(r => r.id == target.id).ExecuteCommandAsync(); - Logger.Information($"【二楼机械臂Floor2MechanicalComplete】{disTask.bill_code} AGV已到货"); + //回写出库单状态 + await db.Updateable().SetColumns(r => new WmsEmptyOutstockH + { + bindrackcomplete = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID + }).Where(r => r.bill_code == target.outbill).ExecuteCommandAsync(); + + // 重置料架区 + await db.Updateable().SetColumns(r => new WmsMechanicalArmH + { + stackingcount = 0, + barcodes = "", + outbill = "", + maxnum = 0, + iscreatepretask = 0, + rackcode = "", + rackid = "", + agvconfirm = 0, + mechanicalconfirm = 0 + }).Where(r => r.id == target.id).ExecuteCommandAsync(); + Logger.Information($"【二楼机械臂Floor2MechanicalComplete】{disTask.bill_code} AGV在料架区取货完成"); + } } } return true; @@ -547,9 +580,9 @@ namespace Tnb.WarehouseMgr var normalPreTasks = preTasks.Where(it => it.area_code != "B" && !agvElevatorTasks.Concat(elePreTasks).Select(x => x.endlocation_code).Contains(it.endlocation_code)).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)); + //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 firstEleGrp = agvElevatorTasks.GroupBy(g => g.endlocation_code).Select(t => t.OrderBy(o => o.bill_code).FirstOrDefault()); agvElevatorTasks = firstEleGrp?.ToList() ?? Enumerable.Empty().ToList()!; @@ -845,8 +878,8 @@ namespace Tnb.WarehouseMgr 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)}"); + //Logger.Information($@"【CTUTaskExecute】 获取任务InTasks: {JsonConvert.SerializeObject(InTasks)}"); + //Logger.Information($@"【CTUTaskExecute】 获取任务OutTasks: {JsonConvert.SerializeObject(OutTasks)}"); var OriginDistaskHs = await db.Queryable() .InnerJoin((a, b) => a.area_id == b.id) @@ -855,7 +888,7 @@ namespace Tnb.WarehouseMgr .ToListAsync(); - Logger.Information($@"【CTUTaskExecute】 OriginDistaskHs: {JsonConvert.SerializeObject(OriginDistaskHs)}"); + //Logger.Information($@"【CTUTaskExecute】 OriginDistaskHs: {JsonConvert.SerializeObject(OriginDistaskHs)}"); List DistaskHs = new List(); @@ -992,7 +1025,7 @@ namespace Tnb.WarehouseMgr var time = int.Parse(db.Queryable().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)}"); + //Logger.Information($@"【CTUTaskExecute】 可执行的CTU任务inCtuExec: {JsonConvert.SerializeObject(inCtuExec)}"); if (inCtuExec.Count > 0) { Logger.Information($"开始执行CTU入库任务: {JsonConvert.SerializeObject(inCtuExec)}"); @@ -1004,7 +1037,7 @@ namespace Tnb.WarehouseMgr await CallingCTU(inCtuExec, Ctu.Token, 1); Ctu.Dispose(); } - Logger.Information($@"【CTUTaskExecute】 可执行的CTU任务outCtuExec: {JsonConvert.SerializeObject(outCtuExec)}"); + //Logger.Information($@"【CTUTaskExecute】 可执行的CTU任务outCtuExec: {JsonConvert.SerializeObject(outCtuExec)}"); if (outCtuExec.Count > 0) { Logger.Information($"开始执行CTU出库任务: {JsonConvert.SerializeObject(outCtuExec)}"); @@ -1121,7 +1154,7 @@ 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入库")}"); + Logger.Information($"【CallingCTU】 CTU任务下发 开始请求联核/task-chain/create接口 请求地址:{url} 请求参数:{JsonConvert.SerializeObject(reqBody)} type:{(type == 0 ? "CTU出库" : "CTU入库")}"); dynamic respBody = await HttpClientHelper.PostStreamAsync(url, reqBody, token); Logger.Information($"【CallingCTU】 CTU任务下发 接收到联核/task-chain/create接口信息:{respBody}"); } @@ -1327,6 +1360,7 @@ namespace Tnb.WarehouseMgr { Logger.Information("【AgvDispatch】 Agv任务执行...."); List kiva = new List(); + // 一楼中储仓 kiva.Add("ZSSSXCTU02"); kiva.Add("ZSSSXCTU01"); //调用AGV创建任务链接口 @@ -1363,7 +1397,7 @@ namespace Tnb.WarehouseMgr reqBody.taskChainPriority = 0; reqBody.taskList = v; reqBody.floor = dis.end_floor; - Logger.Information($"【AgvDispatch】 Agv任务执行 开始请求联核/task-chain/create接口 请求地址:{url} 请求参数:{reqBody} "); + Logger.Information($"【AgvDispatch】 Agv任务执行 开始请求联核/task-chain/create接口 请求地址:{url} 请求参数:{JsonConvert.SerializeObject(reqBody)} "); dynamic respBody = await HttpClientHelper.PostStreamAsync(url, reqBody, token); Logger.Information($"【AgvDispatch】 Agv任务执行 接收到联核/task-chain/create接口信息:{respBody}"); } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs index e231211d..a9e3f8a2 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs @@ -128,7 +128,7 @@ namespace Tnb.WarehouseMgr } await _db.Ado.CommitTranAsync(); } - catch (Exception) + catch (Exception ex) { await _db.Ado.RollbackTranAsync(); throw; @@ -170,8 +170,104 @@ namespace Tnb.WarehouseMgr } } - + /// + /// 二楼机械手 + /// + /// + /// + /// + /// + [NonAction] + public async Task CarryBindFloor2UpDownMachine(CarryBindFloor2UpDownMachineInput input) + { + bool isOk = false; + try + { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + + WmsCarryH? carry = await _db.Queryable().SingleAsync(it => it.id == input.carry_id); + WmsCarryH? subCarry = await _db.Queryable().SingleAsync(it => it.id == input.membercarry_id); + if (carry != null && subCarry != null) + { + WmsCarrybindH wmsCarrybindH = new() + { + carry_id = input.carry_id, + carry_code = input.carry_code, + membercarry_id = input.membercarry_id, + membercarry_code = input.membercarry_code, + loc = 1, + type = 0, + create_time = DateTime.Now + }; + int row = await _db.Insertable(wmsCarrybindH).ExecuteCommandAsync(); + isOk = row > 0; + if (!isOk) + { + throw Oops.Oh(ErrorCode.COM1001); + } + } + else + { + if (carry == null || subCarry == null) + { + throw new AppFriendlyException("没有可用的主载具", 500); + } + } + } + catch (Exception ex) + { + } + return Task.FromResult(true); + } + + /// + /// 二楼机械手解绑定 + /// + /// + /// + /// + /// + [NonAction] + public async Task CarryUnbindFloor2UpDownMachine(CarryBindFloor2UpDownMachineInput input) + { + bool isOk = false; + try + { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + + WmsCarryH? carry = await _db.Queryable().SingleAsync(it => it.id == input.carry_id); + WmsCarryH? subCarry = await _db.Queryable().SingleAsync(it => it.id == input.membercarry_id); + if (carry != null && subCarry != null) + { + int row = await _db.Deleteable().Where(r => r.carry_id == input.carry_id && r.membercarry_id == input.membercarry_id).ExecuteCommandAsync(); + isOk = row > 0; + + if (!isOk) + { + throw Oops.Oh(ErrorCode.COM1001); + } + } + else + { + if (carry == null || subCarry == null) + { + throw new AppFriendlyException("没有可用的主载具", 500); + } + } + } + catch (Exception ex) + { + } + return Task.FromResult(true); + } + /* public override async Task ModifyAsync(WareHouseUpInput input) { if (input == null) throw new ArgumentNullException(nameof(input));