From 6674d10880c9104a2be965fa6221e49b50c28d1d Mon Sep 17 00:00:00 2001 From: majian <780924089@qq.com> Date: Sat, 25 May 2024 15:32:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Tnb.ProductionMgr/RedisBackGround.cs | 725 ++++++++---------- .../Tnb.WarehouseMgr/WareHouseService.cs | 17 +- .../WmsMaterialTransferService.cs | 5 + 3 files changed, 348 insertions(+), 399 deletions(-) diff --git a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs index 9b1a9109..c6f1cabb 100644 --- a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs +++ b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs @@ -63,7 +63,11 @@ namespace Tnb.ProductionMgr // 二楼料架配送 private Timer? Floor2RackDeliverytimer; - public static SemaphoreSlim s_taskExecuteRackDelivery = new(1); + public static SemaphoreSlim s_taskExecuteFloor2UpMachinecodetimer = new(1); + public static SemaphoreSlim s_task送空托到上升降区 = new(1); + public static SemaphoreSlim s_task送满托到下升降区 = new(1); + public static SemaphoreSlim s_task移走上升降区未生成预任务且满托的料架 = new(1); + public static SemaphoreSlim s_task移走下升降区未生成预任务且空托的料架 = new(1); private readonly RedisData _redisData; private readonly IPrdInstockService _prdInstockService; @@ -874,61 +878,68 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA // 上升降机 private async void Floor2UpMachinecode(object args) { + string barcode = await Floor2UpDownMachinecode_GetTag(MechanicalArmConsts.上升降机条码); + if (string.IsNullOrEmpty(barcode)) + { + LoggerFloor2UpDownMachine.LogError($@"【上升降机】未取到条码数据"); + return; + } + using (var db = _repository.AsSugarClient().CopyNew()) { - string barcode = await Floor2UpDownMachinecode_GetTag(MechanicalArmConsts.上升降机条码); - if (string.IsNullOrEmpty(barcode)) - { - LoggerFloor2UpDownMachine.LogError($@"【上升降机】未取到条码数据"); - return; - } - - // 读取上升降机的左右料架区配置 - string[] configs = new string[2] { "二楼上升降机机械臂左", "二楼上升降机机械臂右" }; - // 左右料架区配置 - List WmsMechanicalArmHs = db.Queryable() - .Where(r => configs.Contains(r.name) && r.agvconfirm == 1).ToList(); - - // 是否可以放货 - if (WmsMechanicalArmHs.Count == 0) - { - LoggerFloor2UpDownMachine.LogWarning($@"【上升降机】目前没有可以放货的料架区(机械臂空托送到信号为false)"); - return; - } - - // 如果条码已被绑定 - if (WmsMechanicalArmHs.Where(r => !string.IsNullOrEmpty(r.barcodes) && r.barcodes.Contains(barcode)).Count() > 0) - { - LoggerFloor2UpDownMachine.LogWarning($@"【上升降机】条码{barcode}已被绑定"); - return; - } - LoggerFloor2UpDownMachine.LogInformation($@"【上升降机】扫描到有效条码 {barcode}"); - - // 获取下到输送线9和10的未完成的出库单 - List WmsEmptyOutstockHs = db.Queryable() - .InnerJoin((a, b) => a.id == b.bill_id) - .Where((a, b) => (a.location_id == "32609238573589" || a.location_id == "32609229889045") && (string.IsNullOrEmpty(a.bindrackcomplete) || a.bindrackcomplete != WmsWareHouseConst.BILLSTATUS_COMPLETE_ID) - && b.carry_code == barcode).ToList(); - - if (WmsEmptyOutstockHs.Count() == 0) - { - LoggerFloor2UpDownMachine.LogWarning($@"【上升降机】未找到条码{barcode}的输送线为9、10的出库单"); - return; - } - // 出库单 - WmsEmptyOutstockH WmsEmptyOutstockH = WmsEmptyOutstockHs.OrderByDescending(r => r.create_time).First(); - - // 找到条码在的出库单 - string ckdCode = WmsEmptyOutstockH.bill_code; - int ckdRemainBindRackNum = (int)(WmsEmptyOutstockH.remainbindracknum != null ? WmsEmptyOutstockH.remainbindracknum : 0); - - //扫描到的料箱 a.对应出库单的b.码垛计数未达到满托数量的料架区 - IEnumerable targetConfigs = WmsMechanicalArmHs.Where(r => r.outbill == ckdCode && r.stackingcount < r.maxnum); - - WmsMechanicalArmH target; - await db.Ado.BeginTranAsync(); try { + s_taskExecuteFloor2UpMachinecodetimer.Wait(); + + // 读取上升降机的左右料架区配置 + string[] configs = new string[2] { "二楼上升降机机械臂左", "二楼上升降机机械臂右" }; + // 左右料架区配置 + List WmsMechanicalArmHs = db.Queryable() + .Where(r => configs.Contains(r.name) && r.agvconfirm == 1).ToList(); + + // 是否可以放货 + if (WmsMechanicalArmHs.Count == 0) + { + LoggerFloor2UpDownMachine.LogWarning($@"【上升降机】目前没有可以放货的料架区(料架区一个料架都没有,如果实际有料架说明系统缓存表与实际不对应,需要重置缓存表信息)"); + return; + } + + // 如果条码已被绑定 + if (WmsMechanicalArmHs.Where(r => !string.IsNullOrEmpty(r.barcodes) && r.barcodes.Contains(barcode)).Count() > 0) + { + LoggerFloor2UpDownMachine.LogWarning($@"【上升降机】条码{barcode}已被绑定"); + return; + } + LoggerFloor2UpDownMachine.LogInformation($@"【上升降机】扫描到有效条码 {barcode}"); + + // 获取下到输送线9和10的未完成的出库单 + List WmsEmptyOutstockHs = db.Queryable() + .InnerJoin((a, b) => a.id == b.bill_id) + .Where((a, b) => (a.location_id == "32609238573589" || a.location_id == "32609229889045") && (string.IsNullOrEmpty(a.bindrackcomplete) || a.bindrackcomplete != WmsWareHouseConst.BILLSTATUS_COMPLETE_ID) + && b.carry_code == barcode).ToList(); + + string ss = db.Queryable() + .InnerJoin((a, b) => a.id == b.bill_id) + .Where((a, b) => (a.location_id == "32609238573589" || a.location_id == "32609229889045") && (string.IsNullOrEmpty(a.bindrackcomplete) || a.bindrackcomplete != WmsWareHouseConst.BILLSTATUS_COMPLETE_ID) + && b.carry_code == barcode).ToSqlString(); + + if (WmsEmptyOutstockHs.Count() == 0) + { + LoggerFloor2UpDownMachine.LogWarning($@"【上升降机】未找到条码{barcode}的输送线为9、10的出库单"); + return; + } + // 出库单 + WmsEmptyOutstockH WmsEmptyOutstockH = WmsEmptyOutstockHs.OrderByDescending(r => r.create_time).First(); + + // 找到条码在的出库单 + string ckdCode = WmsEmptyOutstockH.bill_code; + int ckdRemainBindRackNum = (int)(WmsEmptyOutstockH.remainbindracknum != null ? WmsEmptyOutstockH.remainbindracknum : 0); + + //扫描到的料箱 a.对应出库单的b.码垛计数未达到满托数量的料架区 + IEnumerable targetConfigs = WmsMechanicalArmHs.Where(r => r.outbill == ckdCode && r.stackingcount < r.maxnum); + + WmsMechanicalArmH target; + await db.Ado.BeginTranAsync(); // 找不到对应的料架 if (targetConfigs.Count() == 0) { @@ -1014,10 +1025,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA await _wmsCarryBindService.CarryBindFloor2UpDownMachine(carryBindFloor2UpDownMachineInput); - - await db.Ado.CommitTranAsync(); - } catch (Exception ex) { @@ -1025,67 +1033,13 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA LoggerFloor2UpDownMachine.LogError(ex.StackTrace); await db.Ado.RollbackTranAsync(); } + finally + { + s_taskExecuteFloor2UpMachinecodetimer.Release(); + } } } - /// - /// 检查机械臂料架区信号(下升降机满托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)); - // LoggerFloor2UpDownMachine.LogInformation($@"【检查机械臂料架区信号_下升降机满托1送到】 {WmsMechanicalArmHsuagar.Count()}"); - - // foreach (WmsMechanicalArmH wmsMechanicalArmH in WmsMechanicalArmHsuagar.ToList()) - // { - // int LXCount = db.Queryable().Where(a => a.carry_id == wmsMechanicalArmH.rackid).Count(); - - // bool result = await Floor2UpDownMachinecode_SetTag($"下升降机满托{wmsMechanicalArmH.stackingposition}数量", LXCount.ToString()); - // LoggerFloor2UpDownMachine.LogInformation($@"【送满托到下升降区】设定下升降机满托{wmsMechanicalArmH.stackingposition}满托数量为 {LXCount} 结果为 {result}"); - // if (!result) - // { - // throw new Exception($@"【送满托到下升降区】设定升降机满托{wmsMechanicalArmH.stackingposition}满托数量为 {LXCount} 结果为 {result}"); - // } - - // // 尝试写入满托送到信号 - // bool result下升降机空托送到 = await Floor2UpDownMachinecode_SetTag($"下升降机满托{wmsMechanicalArmH.stackingposition}送到", "true"); - // LoggerFloor2UpDownMachine.LogInformation($@"【送满托到下升降区】回写 下升降机满托{wmsMechanicalArmH.stackingposition}送到 结果为{result下升降机空托送到}"); - // if (!result下升降机空托送到) - // { - // return false; - // } - - // // 绑定料架 - // await db.Updateable().SetColumns(r => new WmsMechanicalArmH - // { - // mechanicalconfirm = 1, - // maxnum = LXCount - // }).Where(r => r.id == wmsMechanicalArmH.id).ExecuteCommandAsync(); - - // LoggerFloor2UpDownMachine.LogInformation($@"【送满托到下升降区】 料架{wmsMechanicalArmH.rackid}下的料箱开始生成预任务"); - // bool pretask_result = await _wareHouseService.Floor2EmptyCarryCreateZZCPretask(wmsMechanicalArmH.rackid); - // if (pretask_result) - // { - // LoggerFloor2UpDownMachine.LogInformation($@"【送满托到下升降区】 料架{wmsMechanicalArmH.rackid}下的料箱生成预任务完成"); - // } - // else - // { - // LoggerFloor2UpDownMachine.LogInformation($@"【送满托到下升降区】 料架{wmsMechanicalArmH.rackid}下的料箱生成预任务失败"); - // } - - // } - - // return true; - // } - //} - // 二楼机械臂信号对应机械臂字典 Dictionary floor2mechanicalAtmDic = new Dictionary() { @@ -1124,103 +1078,109 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA using (var db = _repository.AsSugarClient().CopyNew()) { - - // 找到没有绑定料架的且库位未锁定的料架区 - ISugarQueryable WmsMechanicalArmHsuagar = db.Queryable(). - InnerJoin((a, b) => a.point_id == b.id) - .InnerJoin((a, b, c) => b.location_id == c.id) - .Where((a, b, c) => string.IsNullOrEmpty(a.rackcode) && c.is_lock == 0 && configs_upMachine.Contains(a.name)); - - List WmsMechanicalArmHs = WmsMechanicalArmHsuagar.ToList(); - - if (WmsMechanicalArmHs.Count() == 0) + try + { + await s_task送空托到上升降区.WaitAsync(); + // 找到没有绑定料架的且库位未锁定的料架区 + ISugarQueryable WmsMechanicalArmHsuagar = db.Queryable(). + InnerJoin((a, b) => a.point_id == b.id) + .InnerJoin((a, b, c) => b.location_id == c.id) + .Where((a, b, c) => string.IsNullOrEmpty(a.rackcode) && c.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) + { + // 找到占用且未锁定的库位上的空料架 + ISugarQueryable rackStartLocations = + db.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()}"); + continue; + } + LoggerFloor2RackDelivery.LogInformation($"【送空托到上升降区】 即将补充料架区{wmsMechanicalArmH.name}"); + + BasLocation startLocation = rackStartLocations.First(); + + List startPoints = db.Queryable().Where(r => r.location_id == startLocation.id).ToList(); + + if (startPoints.Count == 0) + { + LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 起始库位{startLocation.location_code}未在点位表维护对应的点位"); + continue; + } + + List endPoints = db.Queryable().Where(r => r.id == wmsMechanicalArmH.point_id).ToList(); + + if (endPoints.Count == 0) + { + LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 终点{wmsMechanicalArmH.point_id} {wmsMechanicalArmH.point_code}未在点位表维护对应的点位"); + continue; + } + + List wmsCarryHs = db.Queryable().Where(r => r.location_id == startLocation.id).ToList(); + if (wmsCarryHs.Count == 0) + { + LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 起点{startLocation.id} {startLocation.location_code}上找不到料架"); + continue; + } + + if (wmsCarryHs.Count > 1) + { + LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 起点{startLocation.id} {startLocation.location_code}上存在多个料架"); + continue; + } + + // 空料架 + WmsCarryH targetCarry = wmsCarryHs[0]; + + WmsPointH startPoint = startPoints.First(); + WmsPointH endPoint = endPoints.First(); + + await db.Updateable().SetColumns(r => new BasLocation + { + is_lock = 1 + }).Where(r => r.id == startLocation.id).ExecuteCommandAsync(); + await db.Updateable().SetColumns(r => new BasLocation + { + is_lock = 1 + }).Where(r => r.id == endPoint.location_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 createPretask(points, targetCarry.id, targetCarry.carry_code, LoggerFloor2RackDelivery); + if (!result.Item1) + { + LoggerFloor2RackDelivery.LogInformation($"【送空托到上升降区】 未成功生成预任务 起点{startPoint.point_code} 终点{endPoint.point_code} 料架 {targetCarry.carry_code}"); + continue; + } + } + return true; + } + catch (Exception ex) { - LoggerFloor2RackDelivery.LogWarning($"【送空托到上升降区】 无需补充料架区 {WmsMechanicalArmHsuagar.ToSqlString()}"); return false; } - - // 料架区 - foreach (WmsMechanicalArmH wmsMechanicalArmH in WmsMechanicalArmHs) + finally { - // 找到占用且未锁定的库位上的空料架 - ISugarQueryable rackStartLocations = - db.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()}"); - continue; - } - LoggerFloor2RackDelivery.LogInformation($"【送空托到上升降区】 即将补充料架区{wmsMechanicalArmH.name}"); - - BasLocation startLocation = rackStartLocations.First(); - - List startPoints = db.Queryable().Where(r => r.location_id == startLocation.id).ToList(); - - if (startPoints.Count == 0) - { - LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 起始库位{startLocation.location_code}未在点位表维护对应的点位"); - continue; - } - - List endPoints = db.Queryable().Where(r => r.id == wmsMechanicalArmH.point_id).ToList(); - - if (endPoints.Count == 0) - { - LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 终点{wmsMechanicalArmH.point_id} {wmsMechanicalArmH.point_code}未在点位表维护对应的点位"); - continue; - } - - List wmsCarryHs = db.Queryable().Where(r => r.location_id == startLocation.id).ToList(); - if (wmsCarryHs.Count == 0) - { - LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 起点{startLocation.id} {startLocation.location_code}上找不到料架"); - continue; - } - - if (wmsCarryHs.Count > 1) - { - LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 起点{startLocation.id} {startLocation.location_code}上存在多个料架"); - continue; - } - - // 空料架 - WmsCarryH targetCarry = wmsCarryHs[0]; - - WmsPointH startPoint = startPoints.First(); - WmsPointH endPoint = endPoints.First(); - - await db.Updateable().SetColumns(r => new BasLocation - { - is_lock = 1 - }).Where(r => r.id == startLocation.id).ExecuteCommandAsync(); - await db.Updateable().SetColumns(r => new BasLocation - { - is_lock = 1 - }).Where(r => r.id == endPoint.location_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 createPretask(points, targetCarry.id, targetCarry.carry_code, LoggerFloor2RackDelivery); - if (!result.Item1) - { - continue; - //throw new Exception("【送空托到上升降区】 未成功生成预任务"); - } + s_task送空托到上升降区.Release(); } - return true; } } @@ -1248,129 +1208,134 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA return false; #endregion - using (var db = _repository.AsSugarClient().CopyNew()) { - // 找到没有绑定料架的且库位未锁定的料架区 - ISugarQueryable WmsMechanicalArmHsuagar = db.Queryable(). - InnerJoin((a, b) => a.point_id == b.id) - .InnerJoin((a, b, c) => b.location_id == c.id) - .Where((a, b, c) => string.IsNullOrEmpty(a.rackcode) && c.is_lock == 0 && configs_upMachine.Contains(a.name)); - - List WmsMechanicalArmHs = WmsMechanicalArmHsuagar.ToList(); - - if (WmsMechanicalArmHs.Count() == 0) + try + { + await s_task送满托到下升降区.WaitAsync(); + // 找到没有绑定料架的且库位未锁定的料架区 + ISugarQueryable WmsMechanicalArmHsuagar = db.Queryable(). + InnerJoin((a, b) => a.point_id == b.id) + .InnerJoin((a, b, c) => b.location_id == c.id) + .Where((a, b, c) => string.IsNullOrEmpty(a.rackcode) && c.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) + { + // 找到占用且未锁定的库位上的满料架且料架中的料箱是空的 + List rackStartLocations = + db.Queryable() + .InnerJoin((a, b) => a.id == b.location_id) + .LeftJoin((a, b, c) => b.id == c.carry_id) // 有料箱 + .LeftJoin((a, b, c, d) => c.membercarry_id == d.carry_id) + .Where((a, b, c, d) => 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, b, c, d) => d.id).Select((a, b, c, d) => new // 关联载具物料明细表 + { + basLocation = a, + WmsCarryCode_id = d.id + }).ToList().GroupBy(r => r.basLocation.location_code).Select(r => + { + var item = r.FirstOrDefault(); + // 前面通过OrderBy(d => d.id)对WmsCarryCode_id进行了排序 那么如果第一行有数据则说明存在非空料箱 + if (!string.IsNullOrEmpty(item.WmsCarryCode_id)) + { + return new BasLocation(); + } + else + { + // 进这里说明库位下的料箱都为空 + return item.basLocation; + } + + }) + // 筛选非空库位数据 + .Where(r => !string.IsNullOrEmpty(r.location_code)).ToList(); + + + if (rackStartLocations.Count() == 0) + { + //LoggerFloor2RackDelivery.LogWarning($"【送满托到下升降区】 暂存仓中没有可用的满料架 {rackStartLocations.ToSqlString()}"); + continue; + } + LoggerFloor2RackDelivery.LogInformation($"【送满托到下升降区】 即将补充料架区{wmsMechanicalArmH.name}"); + + BasLocation startLocation = rackStartLocations.First(); + + List startPoints = db.Queryable().Where(r => r.location_id == startLocation.id).ToList(); + + if (startPoints.Count == 0) + { + LoggerFloor2RackDelivery.LogError($"【送满托到下升降区】 起始库位{startLocation.location_code}未在点位表维护对应的点位"); + continue; + } + + List endPoints = db.Queryable().Where(r => r.id == wmsMechanicalArmH.point_id).ToList(); + + if (endPoints.Count == 0) + { + LoggerFloor2RackDelivery.LogError($"【送满托到下升降区】 终点{wmsMechanicalArmH.point_id} {wmsMechanicalArmH.point_code}未在点位表维护对应的点位"); + continue; + } + + List wmsCarryHs = db.Queryable().Where(r => r.location_id == startLocation.id).ToList(); + if (wmsCarryHs.Count == 0) + { + LoggerFloor2RackDelivery.LogError($"【送满托到下升降区】 起点{startLocation.id} {startLocation.location_code}上找不到料架"); + continue; + } + + if (wmsCarryHs.Count > 1) + { + LoggerFloor2RackDelivery.LogError($"【送满托到下升降区】 起点{startLocation.id} {startLocation.location_code}上存在多个料架"); + continue; + } + + // 满料架 + WmsCarryH targetCarry = wmsCarryHs[0]; + + WmsPointH startPoint = startPoints.First(); + WmsPointH endPoint = endPoints.First(); + + await db.Updateable().SetColumns(r => new BasLocation + { + is_lock = 1 + }).Where(r => r.id == startLocation.id).ExecuteCommandAsync(); + + await db.Updateable().SetColumns(r => new BasLocation + { + is_lock = 1 + }).Where(r => r.id == endPoint.location_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 createPretask(points, targetCarry.id, targetCarry.carry_code, LoggerFloor2RackDelivery); + if (!result.Item1) + { + LoggerFloor2RackDelivery.LogInformation($"【送满托到下升降区】 未成功生成预任务 起点{startPoint.point_code} 终点{endPoint.point_code} 料架 {targetCarry.carry_code}"); + continue; + } + } + return true; + } + catch (Exception ex) { - LoggerFloor2RackDelivery.LogWarning($"【送满托到下升降区】 无需补充料架区 {WmsMechanicalArmHsuagar.ToSqlString()}"); return false; } - - // 料架区 - foreach (WmsMechanicalArmH wmsMechanicalArmH in WmsMechanicalArmHs) + finally { - //bool 下升降机请求送满托 = await Floor2UpDownMachinecode_GetTag($"下升降机请求送满托{wmsMechanicalArmH.stackingposition}"); - //if (!下升降机请求送满托) - //{ - // LoggerFloor2RackDelivery.LogWarning($"【送满托到下升降区】 料架区 {wmsMechanicalArmH.name}{wmsMechanicalArmH.stackingposition} 下升降机请求送满托{wmsMechanicalArmH.stackingposition}信号不为true"); - // return false; - //} - - // 找到占用且未锁定的库位上的满料架且料架中的料箱是空的 - List rackStartLocations = - db.Queryable() - .InnerJoin((a, b) => a.id == b.location_id) - .LeftJoin((a, b, c) => b.id == c.carry_id) // 有料箱 - .LeftJoin((a, b, c, d) => c.membercarry_id == d.carry_id) - .Where((a, b, c, d) => 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, b, c, d) => d.id).Select((a, b, c, d) => new // 关联载具物料明细表 - { - basLocation = a, - WmsCarryCode_id = d.id - }).ToList().GroupBy(r => r.basLocation.location_code).Select(r => - { - var item = r.FirstOrDefault(); - // 前面通过OrderBy(d => d.id)对WmsCarryCode_id进行了排序 那么如果第一行有数据则说明存在非空料箱 - if (!string.IsNullOrEmpty(item.WmsCarryCode_id)) - { - return new BasLocation(); - } - else - { - // 进这里说明库位下的料箱都为空 - return item.basLocation; - } - - }) - // 筛选非空库位数据 - .Where(r => !string.IsNullOrEmpty(r.location_code)).ToList(); - - - if (rackStartLocations.Count() == 0) - { - //LoggerFloor2RackDelivery.LogWarning($"【送满托到下升降区】 暂存仓中没有可用的满料架 {rackStartLocations.ToSqlString()}"); - return false; - } - LoggerFloor2RackDelivery.LogInformation($"【送满托到下升降区】 即将补充料架区{wmsMechanicalArmH.name}"); - - BasLocation startLocation = rackStartLocations.First(); - - List startPoints = db.Queryable().Where(r => r.location_id == startLocation.id).ToList(); - - if (startPoints.Count == 0) - { - LoggerFloor2RackDelivery.LogError($"【送满托到下升降区】 起始库位{startLocation.location_code}未在点位表维护对应的点位"); - return false; - } - - List endPoints = db.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 = db.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 db.Updateable().SetColumns(r => new BasLocation - { - is_lock = 1 - }).Where(r => r.id == startLocation.id).ExecuteCommandAsync(); - - await db.Updateable().SetColumns(r => new BasLocation - { - is_lock = 1 - }).Where(r => r.id == endPoint.location_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 createPretask(points, targetCarry.id, targetCarry.carry_code, LoggerFloor2RackDelivery); - if (!result.Item1) - { - throw new Exception("【送满托到下升降区】 未成功生成预任务"); - } + s_task送满托到下升降区.Release(); } - return true; } } @@ -1401,24 +1366,17 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA using (var db = _repository.AsSugarClient().CopyNew()) { - // 读取上升降机的左右料架区配置 - - List WmsMechanicalArmHs = db.Queryable().Where(r => r.stackingcount == r.maxnum && r.maxnum != 0 && !string.IsNullOrEmpty(r.rackcode) && r.iscreatepretask == 0 && configs_upMachine.Contains(r.name) && r.mechanicalconfirm == 1).ToList(); - - foreach (WmsMechanicalArmH wmsMechanicalArmH in WmsMechanicalArmHs) + try { - await s_taskExecuteRackDelivery.WaitAsync(); - LoggerFloor2RackDelivery.LogInformation($"【移走上升降区满托的料架】 开始执行预任务生成 {wmsMechanicalArmH.point_code} {wmsMechanicalArmH.outbill} {wmsMechanicalArmH.barcodes}"); - try - { - //// 判断是否 上升降机请求取满托 - //bool 上升降机请求取满托 = await Floor2UpDownMachinecode_GetTag($"上升降机请求取满托{wmsMechanicalArmH.stackingposition}"); - //LoggerFloor2RackDelivery.LogError($"【移走上升降区满托的料架】上升降机请求取满托{wmsMechanicalArmH.stackingposition} {上升降机请求取满托}"); - //if (!上升降机请求取满托) - //{ - // continue; - //} + await s_task移走上升降区未生成预任务且满托的料架.WaitAsync(); + // 读取上升降机的左右料架区配置 + List WmsMechanicalArmHs = db.Queryable().Where(r => r.stackingcount == r.maxnum && r.maxnum != 0 && !string.IsNullOrEmpty(r.rackcode) && r.iscreatepretask == 0 && configs_upMachine.Contains(r.name) && r.mechanicalconfirm == 1).ToList(); + + foreach (WmsMechanicalArmH wmsMechanicalArmH in WmsMechanicalArmHs) + { + LoggerFloor2RackDelivery.LogInformation($"【移走上升降区满托的料架】 开始执行预任务生成 {wmsMechanicalArmH.point_code} {wmsMechanicalArmH.outbill} {wmsMechanicalArmH.barcodes}"); + await db.Updateable().SetColumns(r => new WmsMechanicalArmH { iscreatepretask = 1 @@ -1466,34 +1424,27 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA { 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 createPretask(points, wmsMechanicalArmH.rackid, wmsMechanicalArmH.rackcode, LoggerFloor2RackDelivery); if (!result.Item1) { - LoggerFloor2RackDelivery.LogInformation($"未成功生成预任务"); + LoggerFloor2RackDelivery.LogInformation($"【移走上升降区满托的料架】 未成功生成预任务 起点{startPoint.point_code} 终点{endPoint.point_code} 料架 {wmsMechanicalArmH.rackcode}"); continue; } LoggerFloor2RackDelivery.LogInformation($"【移走上升降区满托的料架】 成功生成预任务 {result.Item2}"); - - s_taskExecuteRackDelivery.Release(); - } - catch (Exception ex) - { - LoggerFloor2RackDelivery.LogError(ex.ToString()); - LoggerFloor2RackDelivery.LogError(ex.StackTrace); - } - finally - { - s_taskExecuteRackDelivery.Release(); } + return true; + } + catch (Exception ex) + { + return false; + } + finally + { + s_task移走上升降区未生成预任务且满托的料架.Release(); } - return true; } } @@ -1524,24 +1475,18 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA #endregion using (var db = _repository.AsSugarClient().CopyNew()) { - // 读取下升降机的左右料架区配置 + try + { + await s_task移走下升降区未生成预任务且空托的料架.WaitAsync(); - List WmsMechanicalArmHs = db.Queryable().Where(r => !string.IsNullOrEmpty(r.rackcode) && r.iscreatepretask == 0 && configs_upMachine.Contains(r.name)).ToList(); + // 读取下升降机的左右料架区配置 - foreach (WmsMechanicalArmH wmsMechanicalArmH in WmsMechanicalArmHs) - { - try + List WmsMechanicalArmHs = db.Queryable().Where(r => !string.IsNullOrEmpty(r.rackcode) && r.iscreatepretask == 0 && configs_upMachine.Contains(r.name)).ToList(); + + foreach (WmsMechanicalArmH wmsMechanicalArmH in WmsMechanicalArmHs) { - //// 判断是否 上升降机请求取满托 - //bool 下升降机请求取空托 = await Floor2UpDownMachinecode_GetTag($"下升降机请求取空托{wmsMechanicalArmH.stackingposition}"); - //LoggerFloor2RackDelivery.LogError($"【移走下升降区空托的料架】下升降机请求取空托{wmsMechanicalArmH.stackingposition} {下升降机请求取空托}" ); - //if (!下升降机请求取空托) - //{ - // return false; - //} LoggerFloor2RackDelivery.LogInformation($"【移走下升降区空托的料架】 开始执行预任务生成 {wmsMechanicalArmH.point_code} {wmsMechanicalArmH.outbill} {wmsMechanicalArmH.barcodes}"); - await db.Updateable().SetColumns(r => new WmsMechanicalArmH { iscreatepretask = 1 @@ -1554,7 +1499,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA if (startPoints.Count == 0) { LoggerFloor2RackDelivery.LogError($"【移走下升降区空托的料架】 起点{wmsMechanicalArmH.point_id} {wmsMechanicalArmH.point_code}未在点位表维护对应的点位"); - return false; + continue; } WmsPointH startPoint = startPoints.First(); @@ -1567,8 +1512,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA if (rackEndLocations.Count() == 0) { - LoggerFloor2RackDelivery.LogWarning($"【移走下升降区空托的料架】 暂存仓中没有可用的空库位 {rackEndLocations.ToSqlString()}"); - return false; + //LoggerFloor2RackDelivery.LogWarning($"【移走下升降区空托的料架】 暂存仓中没有可用的空库位 {rackEndLocations.ToSqlString()}"); + continue; } BasLocation endLocation = rackEndLocations.First(); @@ -1578,13 +1523,12 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA if (endPoints.Count == 0) { LoggerFloor2RackDelivery.LogError($"【移走下升降区空托的料架】 终点库位{endLocation.location_code}未在点位表维护对应的点位"); - return false; + continue; } WmsPointH endPoint = endPoints.First(); points.Add(endPoint); - // 解除绑定料箱到料架 CarryBindFloor2UpDownMachineInput carryBindFloor2UpDownMachineInput = new() { }; carryBindFloor2UpDownMachineInput.carry_id = wmsMechanicalArmH.rackid; @@ -1597,38 +1541,36 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA { 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 createPretask(points, wmsMechanicalArmH.rackid, wmsMechanicalArmH.rackcode, LoggerFloor2RackDelivery); if (!result.Item1) { - throw new Exception("未成功生成预任务"); + LoggerFloor2RackDelivery.LogInformation($"【移走下升降区空托的料架】 未成功生成预任务 起点{startPoint.point_code} 终点{endPoint.point_code} 料架 {wmsMechanicalArmH.rackcode}"); + continue; } } - catch (Exception ex) - { - LoggerFloor2RackDelivery.LogError(ex.ToString()); - LoggerFloor2RackDelivery.LogError(ex.StackTrace); - } + return true; + } + catch (Exception ex) + { + LoggerFloor2RackDelivery.LogError(ex.ToString()); + LoggerFloor2RackDelivery.LogError(ex.StackTrace); + return false; + } + finally + { + s_task移走下升降区未生成预任务且空托的料架.Release(); } - return true; } } - // 料架配送 private async void Floor2RackDelivery(object args) { try { - // 检查机械臂料架区信号(下升降机满托1送到) - //await 检查机械臂料架区信号_下升降机满托1送到(); - // 送空托到上升降区 await 送空托到上升降区(); @@ -1642,17 +1584,14 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA await 移走下升降区未生成预任务且空托的料架(); _ = _wareHouseService.GenTaskExecute(); - } catch (Exception ex) { LoggerFloor2RackDelivery.LogError(ex.ToString()); LoggerFloor2RackDelivery.LogError(ex.StackTrace); } - } - // 上下升降机生成预任务(补充料架、上升降机取货到料架、上升降机满托运走,下升降机拿货到输送线、下升降机空托运走) private async Task> createPretask(List points, string carry_id, string carry_code, ILogger logger) { @@ -1724,15 +1663,17 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA ["Value"] = value, }; string result = await HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand); + + return result.Contains("Ok"); + // 测试 + //string DevName = "东面提升机输送线"; //JObject valueJson = new JObject(); //valueJson["Value"] = value; //bool res = await _redisData.HSet(DevName, tag, valueJson.ToString()); //return true; - - return result.Contains("Ok"); } #endregion diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index 0d352bee..317835f9 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -716,15 +716,17 @@ namespace Tnb.WarehouseMgr ["Value"] = value, }; string result = await HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand); + + return result.Contains("Ok"); + // 测试 + //string DevName = "东面提升机输送线"; //JObject valueJson = new JObject(); //valueJson["Value"] = value; //bool res = await _redisData.HSet(DevName, tag, valueJson.ToString()); //return true; - - return result.Contains("Ok"); } /// @@ -746,7 +748,8 @@ namespace Tnb.WarehouseMgr //获取所有未下发的预任务申请 Logger.Information("【GenTaskExecute】 开始获取未下发的预任务..."); - ISugarQueryable sugarQueryable = db.Queryable().InnerJoin((a, b) => a.startlocation_id == b.location_id && a.carry_id == b.id) + ISugarQueryable sugarQueryable = db.Queryable() + .LeftJoin((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)) @@ -2481,10 +2484,10 @@ namespace Tnb.WarehouseMgr carry_code = wmsCarryH.carry_code; } - if (string.IsNullOrEmpty(carry_id)) - { - throw new AppFriendlyException("起点库位上没有载具", 500); - } + //if (string.IsNullOrEmpty(carry_id)) + //{ + // throw new AppFriendlyException("起点库位上没有载具", 500); + //} if (input.visualDevInput != null) { diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs index 2c03f59f..61147bac 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs @@ -316,6 +316,11 @@ namespace Tnb.WarehouseMgr throw new ArgumentNullException(nameof(input)); } WmsCarryCode wmsCarryCode = await _db.Queryable().Where(r => r.carry_id == input.carryIds[0]).SingleAsync(); + if (wmsCarryCode == null) + { + Logger.LogWarning($"【ModifyAsync】载具{input.carryIds[0]}没有绑定物料条码"); + return; + } bool isOk = await _db.Updateable().SetColumns(it => new WmsMaterialTransferD { yzqty = it.yzqty + wmsCarryCode.codeqty }) .Where(it => it.id == input.requireId).ExecuteCommandHasChangeAsync(); if (!isOk)