diff --git a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs index e1dc6f12..d7129edf 100644 --- a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs +++ b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs @@ -20,6 +20,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using NPOI.OpenXmlFormats; using NPOI.SS.Formula.Eval; +using NPOI.SS.Formula.Functions; using Org.BouncyCastle.Asn1.X509; using Org.BouncyCastle.Asn1.X509.Qualified; using Qiniu.Util; @@ -548,12 +549,12 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA string[] configs = new string[2] { "二楼上升降机机械臂左", "二楼上升降机机械臂右" }; // 左右料架区配置 List WmsMechanicalArmHs = db.Queryable() - .Where(r => configs.Contains(r.name) && r.mechanicalconfirm == 1).ToList(); + .Where(r => configs.Contains(r.name) && r.agvconfirm == 1).ToList(); // 是否可以放货 if (WmsMechanicalArmHs.Count == 0) { - LoggerFloor2UpDownMachine.LogWarning($@"【上升降机】目前没有可以放货的料架区"); + LoggerFloor2UpDownMachine.LogWarning($@"【上升降机】目前没有可以放货的料架区(机械臂空托送到信号为false)"); return; } @@ -568,7 +569,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA // 获取下到输送线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") && a.bindrackcomplete != WmsWareHouseConst.BILLSTATUS_COMPLETE_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) @@ -612,6 +613,17 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA bool result = await Floor2UpDownMachinecode_SetTag($"上升降机满托{target.stackingposition}数量", maxnum.ToString()); LoggerFloor2UpDownMachine.LogInformation($@"【上升降机】设定升降机满托{target.stackingposition}满托数量为 {maxnum} 结果为 {result}"); + if (!result) + { + throw new Exception($@"【上升降机】设定升降机满托{target.stackingposition}满托数量为 {maxnum} 结果为 {result}"); + } + // 尝试写入空托送到信号 + bool result上升降机空托送到 = await Floor2UpDownMachinecode_SetTag($"上升降机空托{target.stackingposition}送到", "true"); + LoggerFloor2UpDownMachine.LogInformation($@"【送空托到上升降区】回写 上升降机空托{target.stackingposition}送到 结果为{result上升降机空托送到}"); + if (!result上升降机空托送到) + { + return; + } } else { @@ -631,47 +643,39 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA // 料箱信息 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_开始码垛}"); + if (!result_开始码垛) { - // 开始码垛 - 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($@"【上升降机】回写料箱条码、码垛计数"); - - // 回写出库单的剩余可绑定料架数量 - await db.Updateable().SetColumns(r => new WmsEmptyOutstockH - { - 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); + throw new Exception($@"【上升降机】码垛结果 {result_开始码垛}"); } - else + // 回写料箱条码、码垛计数 + await db.Updateable().SetColumns(r => new WmsMechanicalArmH { - LoggerFloor2UpDownMachine.LogError($@"【上升降机】料架未送到 料架区{target.stackingposition}"); - } + barcodes = $"{target.barcodes},{barcode}".Trim(','), + stackingcount = r.stackingcount + 1, + mechanicalconfirm = 1 + }).Where(r => r.id == target.id).ExecuteCommandAsync(); + LoggerFloor2UpDownMachine.LogInformation($@"【上升降机】回写料箱条码、码垛计数"); + + // 回写出库单的剩余可绑定料架数量 + await db.Updateable().SetColumns(r => new WmsEmptyOutstockH + { + 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); + await db.Ado.CommitTranAsync(); @@ -688,143 +692,126 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA - private async void Floor2DownMachinecode(object args) - { - using (var db = _repository.AsSugarClient().CopyNew()) - { + //private async void Floor2DownMachinecode(object args) + //{ + // using (var db = _repository.AsSugarClient().CopyNew()) + // { - // 读取上升降机的左右料架区配置 - string[] configs = new string[2] { "二楼下升降机机械臂左", "二楼下升降机机械臂右" }; + // // 读取上升降机的左右料架区配置 + // string[] configs = new string[2] { "二楼下升降机机械臂左", "二楼下升降机机械臂右" }; - // 左右料架区配置 - List WmsMechanicalArmHs = db.Queryable() - .Where(r => configs.Contains(r.name) && r.mechanicalconfirm == 1 && r.stackingcount < r.maxnum).ToList(); + // // 左右料架区配置 + // 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; - } + // // 是否可以放货 + // if (WmsMechanicalArmHs.Count == 0) + // { + // //LoggerFloor2UpDownMachine.LogWarning($@"【下升降机】目前没有可以取货的料架区"); + // return; + // } - WmsMechanicalArmH target; - target = WmsMechanicalArmHs.First(); + // 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(); + // // 待拆垛列表 + // List WmsCarryCodes = 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 (WmsCarryCodes.Count() == 0) + // { + // return; + // } + // string barcode = WmsCarryCodes[0].membercarry_code; - // 如果条码已被绑定 - if (WmsMechanicalArmHs.Where(r => !string.IsNullOrEmpty(r.barcodes) && r.barcodes.Contains(barcode)).Count() > 0) - { - LoggerFloor2UpDownMachine.LogWarning($@"【下升降机】条码{barcode}已被绑定"); - return; - } - LoggerFloor2UpDownMachine.LogInformation($@"【下升降机】扫描到有效条码 {barcode}"); + // // 如果条码已被绑定 + // 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)}"); + // await db.Ado.BeginTranAsync(); + // try + // { + // LoggerFloor2UpDownMachine.LogInformation($@"【下升降机】当前条码目标料架区为 {JsonConvert.SerializeObject(target)}"); - // 料架信息 - WmsCarryH rack = db.Queryable().Where(r => r.id == target.rackid).ToList()[0]; + // // 料架信息 + // WmsCarryH rack = db.Queryable().Where(r => r.id == target.rackid).ToList()[0]; - // 料箱信息 - WmsCarryH LX = db.Queryable().Where(r => r.carry_code == barcode).ToList()[0]; + // // 料箱信息 + // WmsCarryH LX = db.Queryable().Where(r => r.carry_code == barcode).ToList()[0]; - // 判断《下升降机满托1/2送到》是否为true - string tag_下升降机满托送到 = $@"下升降机满托{target.stackingposition}送到"; + // 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($@"【下升降机】回写料箱条码、拆垛计数"); - bool 下升降机满托送到 = (bool)Floor2UpDownMachinecode_GetTag(tag_下升降机满托送到); + // // 解除绑定料箱到料架 + // 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; - 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 _wmsCarryBindService.CarryUnbindFloor2UpDownMachine(carryBindFloor2UpDownMachineInput); + - await db.Ado.CommitTranAsync(); + // await db.Ado.CommitTranAsync(); + + // } + // catch (Exception ex) + // { + // LoggerFloor2UpDownMachine.LogError(ex.ToString()); + // LoggerFloor2UpDownMachine.LogError(ex.StackTrace); + // await db.Ado.RollbackTranAsync(); + // } + // } + //} - } - catch (Exception ex) - { - LoggerFloor2UpDownMachine.LogError(ex.ToString()); - LoggerFloor2UpDownMachine.LogError(ex.StackTrace); - await db.Ado.RollbackTranAsync(); - } - } - } /// /// 检查机械臂料架区信号(上升降机空托1送到) /// /// - public async Task 检查机械臂料架区信号_上升降机空托1送到() - { - using (var db = _repository.AsSugarClient().CopyNew()) - { - string[] configs_upMachine = new string[2] { "二楼上升降机机械臂左", "二楼上升降机机械臂右" }; + //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)); + // // 找到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}"); + // foreach (WmsMechanicalArmH wmsMechanicalArmH in WmsMechanicalArmHsuagar.ToList()) + // { + // // 尝试写入空托送到信号 + // bool result上升降机空托送到 = await Floor2UpDownMachinecode_SetTag($"上升降机空托{wmsMechanicalArmH.stackingposition}送到", "true"); + // LoggerFloor2UpDownMachine.LogInformation($@"【送空托到上升降区】回写 上升降机空托{wmsMechanicalArmH.stackingposition}送到 结果为{result上升降机空托送到}"); + // if (!result上升降机空托送到) + // { + // return false; + // } - 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) - { - // 绑定料架 - await db.Updateable().SetColumns(r => new WmsMechanicalArmH - { - mechanicalconfirm = 1 - }).Where(r => r.id == wmsMechanicalArmH.id).ExecuteCommandAsync(); - } - } - - return true; - } - } + // // 绑定料架 + // await db.Updateable().SetColumns(r => new WmsMechanicalArmH + // { + // mechanicalconfirm = 1 + // }).Where(r => r.id == wmsMechanicalArmH.id).ExecuteCommandAsync(); + // } + // return true; + // } + //} /// /// 检查机械臂料架区信号(上升降机满托1送到) @@ -842,23 +829,29 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA 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) + // 尝试写入满托送到信号 + bool result上升降机空托送到 = await Floor2UpDownMachinecode_SetTag($"下升降机满托{wmsMechanicalArmH.stackingposition}送到", "true"); + LoggerFloor2UpDownMachine.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 false; } + + 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}"); + } + + // 绑定料架 + await db.Updateable().SetColumns(r => new WmsMechanicalArmH + { + mechanicalconfirm = 1, + maxnum = LXCount + }).Where(r => r.id == wmsMechanicalArmH.id).ExecuteCommandAsync(); } return true; @@ -892,13 +885,6 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA 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}"); @@ -906,14 +892,14 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA ISugarQueryable rackStartLocations = _repository.AsSugarClient().Queryable() .InnerJoin((a, b) => a.id == b.location_id) - .LeftJoin((a, b, c) => b.id == c.carry_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; + continue; } BasLocation startLocation = rackStartLocations.First(); @@ -923,7 +909,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA if (startPoints.Count == 0) { LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 起始库位{startLocation.location_code}未在点位表维护对应的点位"); - return false; + continue; } List endPoints = _repository.AsSugarClient().Queryable().Where(r => r.id == wmsMechanicalArmH.point_id).ToList(); @@ -931,20 +917,20 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA if (endPoints.Count == 0) { LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 终点{wmsMechanicalArmH.point_id} {wmsMechanicalArmH.point_code}未在点位表维护对应的点位"); - return false; + continue; } 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; + continue; } if (wmsCarryHs.Count > 1) { LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 起点{startLocation.id} {startLocation.location_code}上存在多个料架"); - return false; + continue; } // 空料架 @@ -971,7 +957,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA Tuple result = await Floor2UpDownMachinecode_createPretask(points, targetCarry.id, targetCarry.carry_code); if (!result.Item1) { - throw new Exception("【送空托到上升降区】 未成功生成预任务"); + continue; + //throw new Exception("【送空托到上升降区】 未成功生成预任务"); } } return true; @@ -997,7 +984,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA if (WmsMechanicalArmHs.Count() == 0) { - LoggerFloor2RackDelivery.LogWarning($"【送满托到下升降区】 无需补充料架区 {WmsMechanicalArmHsuagar.ToSqlString()}"); + //LoggerFloor2RackDelivery.LogWarning($"【送满托到下升降区】 无需补充料架区 {WmsMechanicalArmHsuagar.ToSqlString()}"); return false; } @@ -1012,22 +999,43 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA return false; } - LoggerFloor2RackDelivery.LogInformation($"【送满托到下升降区】 即将补充料架区{wmsMechanicalArmH.name}"); - - // 找到占用且未锁定的库位上的满料架 - ISugarQueryable rackStartLocations = + // 找到占用且未锁定的库位上的满料架且料架中的料箱是空的 + List 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); + .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()}"); + //LoggerFloor2RackDelivery.LogWarning($"【送满托到下升降区】 暂存仓中没有可用的满料架 {rackStartLocations.ToSqlString()}"); return false; } + LoggerFloor2RackDelivery.LogInformation($"【送满托到下升降区】 即将补充料架区{wmsMechanicalArmH.name}"); BasLocation startLocation = rackStartLocations.First(); @@ -1063,6 +1071,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA // 满料架 WmsCarryH targetCarry = wmsCarryHs[0]; + + WmsPointH startPoint = startPoints.First(); WmsPointH endPoint = endPoints.First(); @@ -1107,6 +1117,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA foreach (WmsMechanicalArmH wmsMechanicalArmH in WmsMechanicalArmHs) { + await s_taskExecuteRackDelivery.WaitAsync(); LoggerFloor2RackDelivery.LogInformation($"【移走上升降区满托的料架】 开始执行预任务生成 {wmsMechanicalArmH.point_code} {wmsMechanicalArmH.outbill} {wmsMechanicalArmH.barcodes}"); try { @@ -1114,7 +1125,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA bool 上升降机请求取满托 = (bool)Floor2UpDownMachinecode_GetTag($"上升降机请求取满托{wmsMechanicalArmH.stackingposition}"); if (!上升降机请求取满托) { - LoggerFloor2RackDelivery.LogError($"【移走上升降区满托的料架】上升降机请求取满托{wmsMechanicalArmH.stackingposition}"); + LoggerFloor2RackDelivery.LogError($"【移走上升降区满托的料架】上升降机请求取满托{wmsMechanicalArmH.stackingposition} {上升降机请求取满托}"); return false; } @@ -1177,6 +1188,9 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA { throw new Exception("未成功生成预任务"); } + LoggerFloor2RackDelivery.LogInformation($"【移走上升降区满托的料架】 成功生成预任务 {result.Item2}"); + + s_taskExecuteRackDelivery.Release(); } catch (Exception ex) { @@ -1200,11 +1214,10 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA 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(); + List WmsMechanicalArmHs = _repository.AsSugarClient().Queryable().Where(r => !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 { // 判断是否 上升降机请求取满托 @@ -1214,6 +1227,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA LoggerFloor2RackDelivery.LogError($"【移走下升降区空托的料架】下升降机请求取空托{wmsMechanicalArmH.stackingposition}"); return false; } + LoggerFloor2RackDelivery.LogInformation($"【移走下升降区空托的料架】 开始执行预任务生成 {wmsMechanicalArmH.point_code} {wmsMechanicalArmH.outbill} {wmsMechanicalArmH.barcodes}"); + await _repository.AsSugarClient().Updateable().SetColumns(r => new WmsMechanicalArmH { @@ -1257,6 +1272,14 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA WmsPointH endPoint = endPoints.First(); points.Add(endPoint); + + // 解除绑定料箱到料架 + CarryBindFloor2UpDownMachineInput carryBindFloor2UpDownMachineInput = new() { }; + carryBindFloor2UpDownMachineInput.carry_id = wmsMechanicalArmH.rackid; + carryBindFloor2UpDownMachineInput.carry_code = wmsMechanicalArmH.rackcode; + + await _wmsCarryBindService.CarryUnbindFloor2UpDownMachine(carryBindFloor2UpDownMachineInput); + // 锁住终点库位 await db.Updateable(r => new BasLocation { @@ -1290,11 +1313,10 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA private async void Floor2RackDelivery(object args) { var db = _repository.AsSugarClient().CopyNew(); - await s_taskExecuteRackDelivery.WaitAsync(); try { // 检查机械臂料架区信号(上升降机空托1送到) - await 检查机械臂料架区信号_上升降机空托1送到(); + //await 检查机械臂料架区信号_上升降机空托1送到(); // 检查机械臂料架区信号(下升降机满托1送到) await 检查机械臂料架区信号_下升降机满托1送到(); @@ -1320,7 +1342,6 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA LoggerFloor2RackDelivery.LogError(ex.StackTrace); } - s_taskExecuteRackDelivery.Release(); } @@ -1367,7 +1388,9 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA //更新页面 //赋值签收状态 + LoggerFloor2RackDelivery.LogInformation($"开始执行 GenPreTask {JsonConvert.SerializeObject(preTasks)}"); bool result = await _wareHouseService.GenPreTask(preTasks, null!); + LoggerFloor2RackDelivery.LogInformation($"GenPreTask 结果 {result}"); if (result) { LoggerFloor2RackDelivery.LogInformation($"成功生成预任务:{preTasks.First().bill_code}"); @@ -1414,61 +1437,16 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA }; string result = await HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand); // TODO 测试 - //string result = "Ok"; + + //JObject valueJson = new JObject(); + //valueJson["Value"] = value; + + //bool res = await _redisData.HSet(DevName, tag, valueJson.ToString()); + //return true; + return result.Contains("Ok"); } - /// - /// Agv调度 - /// - /// - /// - /// - private async Task Floor2UpDownMachinecode_AgvDispatch(List disTasks, CancellationToken token) - { - LoggerFloor2UpDownMachine.LogInformation("【AgvDispatch】 Agv任务执行...."); - //调用AGV创建任务链接口 - try - { - AgvRequestConfig requestCfg = App.Configuration.Build(); - string url = requestCfg.AgvRequestUrls.CreateTaskChainUrl; - - LoggerFloor2UpDownMachine.LogInformation($"【AgvDispatch】 Agv任务执行的disTasks:{JsonConvert.SerializeObject(disTasks)}"); - - var taskChainCodeDic = disTasks.Where(t => !t.groups.IsNullOrWhiteSpace()).GroupBy(g => g.groups!) - .ToDictionary(x => x.Key, x => x.Select(it => new - { - taskCode = it.bill_code, - sourceName = it.startpoint_code, - targetName = it.endpoint_code, - containerCode = it.carry_code, - })); - - LoggerFloor2UpDownMachine.LogInformation($"【AgvDispatch】 Agv任务执行的taskChainCodeDic:{JsonConvert.SerializeObject(taskChainCodeDic)}"); - - foreach ((string k, object v) in taskChainCodeDic) - { - var dis = disTasks.Where(p => p.groups == k).First(); - dynamic reqBody = new ExpandoObject(); - reqBody.taskChainCode = k; - reqBody.type = (int)EnumTaskChainType.AGV; - reqBody.sequential = false; - reqBody.taskChainPriority = 0; - reqBody.taskList = v; - reqBody.floor = dis.end_floor; - 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}"); - } - } - catch (Exception ex) - { - LoggerFloor2UpDownMachine.LogInformation($"【AgvDispatch】 agv任务执行 请求联核/task-chain/create接口失败 异常信息:{ex}"); - throw; - } - } - - #endregion public Task StartAsync(CancellationToken cancellationToken) @@ -1478,12 +1456,12 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA //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(10)); - // 二楼下升降机 - Floor2DownMachinecodetimer = new Timer(Floor2DownMachinecode, null, TimeSpan.Zero, TimeSpan.FromSeconds(60)); - // 二楼料架配送 - Floor2RackDeliverytimer = new Timer(Floor2RackDelivery, null, TimeSpan.Zero, TimeSpan.FromSeconds(60)); + //// 二楼上升降机 + //Floor2UpMachinecodetimer = new Timer(Floor2UpMachinecode, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); + //// 二楼下升降机 + ////Floor2DownMachinecodetimer = new Timer(Floor2DownMachinecode, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); + //// 二楼料架配送 + //Floor2RackDeliverytimer = new Timer(Floor2RackDelivery, null, TimeSpan.Zero, TimeSpan.FromSeconds(60)); return Task.CompletedTask; } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs index 07c1ed9b..27767775 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs @@ -289,5 +289,18 @@ /// 盘点状态-盘点结账 /// public const string CHECKSTATUS_PDJZ_ID = "27584597303317"; + + /// + /// 一楼成品出库工位 + /// + public const string FinishproductOutstockStation1 = "30018211902485"; + /// + /// 一楼成品出库工位 + /// + public const string FinishproductOutstockStation2 = "30018225923349"; + /// + /// 一楼成品出库工位 + /// + public const string FinishproductOutstockStation3 = "30018217822229"; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/FinishproductOutstockSignInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/FinishproductOutstockSignInput.cs new file mode 100644 index 00000000..5793bed0 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/FinishproductOutstockSignInput.cs @@ -0,0 +1,23 @@ +namespace Tnb.WarehouseMgr.Entities.Dto +{ + /// + /// 库房业务更新输入参数 + /// + public class FinishproductOutstockSortInput + { + /// + /// 载具id + /// + public string? carry_id { get; set; } + + ///// + ///// 物料id + ///// + //public string? material_id { get; set; } + + /// + /// 数量 + /// + public decimal qty { get; set; } + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/FinishproductOutstockSortInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/FinishproductOutstockSortInput.cs new file mode 100644 index 00000000..4d6d14c2 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/FinishproductOutstockSortInput.cs @@ -0,0 +1,13 @@ +namespace Tnb.WarehouseMgr.Entities.Dto +{ + /// + /// 库房业务更新输入参数 + /// + public class FinishproductOutstockSignInput + { + /// + /// 起点 + /// + public string? location_id { get; set; } + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/OutsourcedPartsInstockInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/OutsourcedPartsInstockInput.cs new file mode 100644 index 00000000..00a452d1 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/OutsourcedPartsInstockInput.cs @@ -0,0 +1,25 @@ +namespace Tnb.WarehouseMgr.Entities.Dto +{ + /// + /// 库房业务更新输入参数 + /// + public class OutsourcedPartsInstockInput + { + /// + /// 载具ID + /// + public string? carry_id { get; set; } + /// + /// 物料ID + /// + public string? material_id { get; set; } + /// + /// 物料数量 + /// + public decimal qty { get; set; } + /// + /// 起点 + /// + public string? startlocation_id { get; set; } + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMechanicalArmH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMechanicalArmH.cs index 157c4d33..1e52a670 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMechanicalArmH.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMechanicalArmH.cs @@ -84,4 +84,9 @@ public partial class WmsMechanicalArmH : BaseEntity /// 取放货确认 /// public int? mechanicalconfirm { get; set; } + + /// + /// 备注 + /// + public string? note { get; set; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs index 45d2e74d..a205c4cf 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs @@ -538,6 +538,8 @@ namespace Tnb.WarehouseMgr } + + /// /// 申请进出电梯 /// diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index 3c1231a5..4a7dbc22 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -1,9 +1,11 @@ using System.Diagnostics; using System.Dynamic; using System.Linq.Expressions; +using System.Net; using System.Security.Policy; using System.Threading.Tasks; using Aop.Api.Domain; +using Aspose.Cells; using JNPF; using JNPF.Common.Contracts; using JNPF.Common.Core.Manager; @@ -36,6 +38,7 @@ using Tnb.WarehouseMgr.Entities.Configs; using Tnb.WarehouseMgr.Entities.Consts; using Tnb.WarehouseMgr.Entities.Dto; using Tnb.WarehouseMgr.Entities.Dto.Inputs; +using Tnb.WarehouseMgr.Entities.Dto.Outputs; using Tnb.WarehouseMgr.Entities.Dto.Queries; using Tnb.WarehouseMgr.Entities.Entity; using Tnb.WarehouseMgr.Entities.Enums; @@ -476,16 +479,16 @@ namespace Tnb.WarehouseMgr else // 去暂存仓放货 { // 回写料架料箱绑定表的库位 - ISugarQueryable wmsCarryHs = db.Queryable().Where(r => r.carry_code == disTask.carry_code); - var wmsCarryHList = wmsCarryHs.ToList(); - wmsCarryHList.ForEach(r => + ISugarQueryable WmsCarryCodes = db.Queryable() + .InnerJoin((a, b) => b.membercarry_id == a.carry_id) + .Where((a, b) => b.carry_id == disTask.carry_id); + var WmsCarryCodeList = WmsCarryCodes.ToList(); + WmsCarryCodeList.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(); + await db.Updateable(WmsCarryCodeList).ExecuteCommandAsync(); } } else @@ -506,6 +509,25 @@ namespace Tnb.WarehouseMgr } WmsMechanicalArmH target = WmsMechanicalArmHs.First(); + if (target.note == "上升降机") + { + bool result = await Floor2UpDownMachinecode_SetTag($"上升降机满托{target.stackingposition}移走", "true"); + Logger.LogInformation($@"【上升降机】设定升上升降机满托{target.stackingposition}移走 结果为 {result}"); + if (!result) + { + throw new Exception($@"【上升降机】设定升上升降机满托{target.stackingposition}移走 结果为 {result}"); + } + } + else if (target.note == "下升降机") + { + bool result = await Floor2UpDownMachinecode_SetTag($"下升降机空托{target.stackingposition}移走", "true"); + Logger.LogInformation($@"【上升降机】设定升下升降机空托{target.stackingposition}移走 结果为 {result}"); + if (!result) + { + throw new Exception($@"【上升降机】设定升下升降机空托{target.stackingposition}移走 结果为 {result}"); + } + } + //回写出库单状态 await db.Updateable().SetColumns(r => new WmsEmptyOutstockH { @@ -532,6 +554,28 @@ namespace Tnb.WarehouseMgr return true; } + private async Task Floor2UpDownMachinecode_SetTag(string tag, string value) + { + string DevName = "东面提升机输送线"; + Dictionary dicCommand = new(StringComparer.OrdinalIgnoreCase) + { + ["DevName"] = DevName, + ["token"] = _eleCtlCfg.token, + ["TagName"] = tag, + ["Value"] = value, + }; + string result = await HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand); + // TODO 测试 + + //JObject valueJson = new JObject(); + //valueJson["Value"] = value; + + //bool res = await _redisData.HSet(DevName, tag, valueJson.ToString()); + //return true; + + return result.Contains("Ok"); + } + /// /// 生成任务执行 /// @@ -1363,6 +1407,12 @@ namespace Tnb.WarehouseMgr // 一楼中储仓 kiva.Add("ZSSSXCTU02"); kiva.Add("ZSSSXCTU01"); + List floor2 = new List(); + // 二楼暂存仓 + floor2.Add("AS01"); + floor2.Add("AS02"); + floor2.Add("AX01"); + floor2.Add("AX02"); //调用AGV创建任务链接口 try { @@ -1378,6 +1428,7 @@ namespace Tnb.WarehouseMgr sourceName = it.startpoint_code, targetName = it.endpoint_code, containerCode = it.carry_code, + shelfNumber = floor2.Contains(it.startlocation_code) || floor2.Contains(it.endlocation_code) ? it.carry_code : "" // 二楼暂存仓传料架 })); Logger.Information($"【AgvDispatch】 Agv任务执行的taskChainCodeDic:{JsonConvert.SerializeObject(taskChainCodeDic)}"); @@ -1386,7 +1437,7 @@ namespace Tnb.WarehouseMgr { var typeflag = false; var dis = disTasks.Where(p => p.groups == k).First(); - if (kiva.Contains(dis.startlocation_code) || kiva.Contains(dis.endlocation_code)) + if (kiva.Contains(dis.startlocation_code) || kiva.Contains(dis.endlocation_code) || floor2.Contains(dis.startlocation_code) || floor2.Contains(dis.endlocation_code)) { typeflag = true; } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs index a9e3f8a2..5f3cded8 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs @@ -193,17 +193,15 @@ namespace Tnb.WarehouseMgr WmsCarryH? subCarry = await _db.Queryable().SingleAsync(it => it.id == input.membercarry_id); if (carry != null && subCarry != null) { - WmsCarrybindH wmsCarrybindH = new() + WmsCarryD wmsCarryD = 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(); + int row = await _db.Insertable(wmsCarryD).ExecuteCommandAsync(); isOk = row > 0; if (!isOk) { @@ -243,10 +241,9 @@ namespace Tnb.WarehouseMgr } 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) + if (carry != null) { - int row = await _db.Deleteable().Where(r => r.carry_id == input.carry_id && r.membercarry_id == input.membercarry_id).ExecuteCommandAsync(); + int row = await _db.Deleteable().Where(r => r.carry_id == input.carry_id).ExecuteCommandAsync(); isOk = row > 0; if (!isOk) @@ -256,7 +253,7 @@ namespace Tnb.WarehouseMgr } else { - if (carry == null || subCarry == null) + if (carry == null) { throw new AppFriendlyException("没有可用的主载具", 500); } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDACarryBindService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDACarryBindService.cs index 3f6bf46a..e79d5bf2 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDACarryBindService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDACarryBindService.cs @@ -8,9 +8,15 @@ using JNPF.Systems.Interfaces.System; using JNPF.VisualDev; using JNPF.VisualDev.Entitys; using JNPF.VisualDev.Interfaces; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; using SqlSugar; +using Tnb.BasicData.Entities; using Tnb.WarehouseMgr.Entities; +using Tnb.WarehouseMgr.Entities.Consts; +using Tnb.WarehouseMgr.Entities.Dto; using Tnb.WarehouseMgr.Entities.Enums; +using Tnb.WarehouseMgr.Interfaces; namespace Tnb.WarehouseMgr { @@ -25,11 +31,13 @@ namespace Tnb.WarehouseMgr private readonly IVisualDevService _visualDevService; private readonly IUserManager _userManager; private readonly IBillRullService _billRullService; + private readonly IWareHouseService _wareHouseService; public WmsPDACarryBindService( ISqlSugarRepository repository, IRunService runService, IVisualDevService visualDevService, IUserManager userManager, + IWareHouseService wareHouseService, IBillRullService billRullService) { _db = repository.AsSugarClient(); @@ -37,6 +45,7 @@ namespace Tnb.WarehouseMgr _visualDevService = visualDevService; _userManager = userManager; _billRullService = billRullService; + _wareHouseService = wareHouseService; OverideFuncs.CreateAsync = PDACarryBind; } @@ -130,5 +139,257 @@ namespace Tnb.WarehouseMgr var isOk = await _db.Updateable().SetColumns(it => new WmsCarryReplaceH { status = input.bizTypeId }).Where(it => it.id == input.requireId).ExecuteCommandHasChangeAsync(); if (!isOk) throw Oops.Oh(ErrorCode.COM1001); }*/ + + /// + /// 1楼到3楼 外协入库 + /// + /// + /// + /// + [HttpPost, NonUnify, AllowAnonymous] + public async Task OutsourcedPartsInstock(OutsourcedPartsInstockInput input) + { + try + { + if (string.IsNullOrEmpty(input.carry_id)) + { + throw new AppFriendlyException("载具id不可为空", 500); + } + if (string.IsNullOrEmpty(input.material_id)) + { + throw new AppFriendlyException("物料不可为空", 500); + } + if (input.qty <= 0) + { + throw new AppFriendlyException("数量必须大于0", 500); + } + if (string.IsNullOrEmpty(input.startlocation_id)) + { + throw new AppFriendlyException("起点不可为空", 500); + } + + await s_taskExecuteSemaphore.WaitAsync(); + await _db.Ado.BeginTranAsync(); + //入库取终点 //出库起点 + InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_CP_ID, Size = 1 }; + List endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput); + WmsPointH sPoint = null!; + WmsPointH ePoint = null!; + + sPoint = await _db.Queryable().FirstAsync(it => it.location_id == input.startlocation_id); + if (endLocations?.Count > 0) + { + WmsCarryH carry = await _db.Queryable().SingleAsync(it => it.id == input.carry_id); + BasLocation loc = await _db.Queryable().SingleAsync(it => it.id == endLocations[0].id); + bool isMatch = await IsCarryAndLocationMatchByCarryStd(carry, loc); + if (!isMatch) + { + throw new AppFriendlyException("库位与载具规格不匹配", 500); + } + + ePoint = await _db.Queryable().FirstAsync(it => it.location_id == endLocations[0].id); + } + else + { + throw new AppFriendlyException($"库位{endLocations[0].location_code}未在点位表中维护对应点位", 500); + } + + + string endLocationId = endLocations[0].id; + + // 在线开发 + //VisualDevEntity? templateEntity = await _visualDevService?.GetInfoById(ModuleConsts.MODULE_WMSDELIVERYPDA_ID, true)!; + //await _runService.Create(templateEntity, input); + + // 计算路径,插入预任务申请 + + if (sPoint != null && ePoint != null) + { + List points = new List(); + if (sPoint.area_code != ePoint.area_code) + { + points = await _wareHouseService.PathAlgorithms(sPoint.id, ePoint.id); + if (points.Count <= 2) + { + throw new AppFriendlyException("该路径不存在", 500); + } + } + else + { + points.Add(sPoint); + points.Add(ePoint); + } + + WmsCarryH wmsCarryH = await _db.Queryable().FirstAsync(it => it.id == input.carry_id); + //根据获取的路径点生成预任务,生成顺序必须预路径算法返回的起终点的顺序一致(预任务顺序) + if (points?.Count > 0) + { + 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_WMSDELIVERY_ID, + task_type = WmsWareHouseConst.WMS_PRETASK_TRANSFER_TYPE_ID + }; + preTask.carry_id = input.carry_id; + preTask.carry_code = wmsCarryH.carry_code; + preTask.area_id = sPoint?.area_id!; + preTask.area_code = it.Key; + preTask.require_id = ""; + preTask.require_code = ""; + preTask.create_id = _userManager.UserId; + preTask.create_time = DateTime.Now; + return preTask; + }).ToList(); + bool isOk = await _wareHouseService.GenPreTask(preTasks, null!); + if (isOk) + { + if (endLocationId != null) + { + //查询库位表 + BasLocation location = await _db.Queryable().SingleAsync(it => it.id == input.startlocation_id); + { + //载具加锁,增加库位信息 + _ = await _db.Updateable().SetColumns(it => new WmsCarryH + { + carry_status = ((int)EnumCarryStatus.占用).ToString(), + is_lock = 1, + location_id = input.startlocation_id, + location_code = location.location_code + }).Where(it => it.id == input.carry_id).ExecuteCommandAsync(); + } + + //所有库位加锁 + string?[] ids = new[] { input.startlocation_id, endLocationId }; + _ = await _db.Updateable().SetColumns(it => new BasLocation { is_lock = 1 }).Where(it => ids.Contains(it.id)).ExecuteCommandAsync(); + + BasMaterial basMaterial = await _db.Queryable().FirstAsync(it => it.id == input.material_id); + WmsCarryCode wmsCarryCode = new WmsCarryCode(); + wmsCarryCode.carry_id = input.carry_id; + wmsCarryCode.barcode = wmsCarryH.carry_code; + wmsCarryCode.codeqty = input.qty; + wmsCarryCode.material_id = input.material_id; + wmsCarryCode.material_code = basMaterial.code; + wmsCarryCode.material_name = basMaterial.name; + wmsCarryCode.location_id = endLocations[0].id; + wmsCarryCode.location_code = endLocations[0].location_code; + _ = await _db.Insertable(wmsCarryCode).ExecuteCommandAsync(); + } + } + } + + } + + await _db.Ado.CommitTranAsync(); + } + catch (Exception) + { + await _db.Ado.RollbackTranAsync(); + throw; + } + finally + { + _ = s_taskExecuteSemaphore.Release(); + await InvokeGenPretaskExcute(); + } + + return await ToApiResult(HttpStatusCode.OK, "成功"); + } + + /// + /// 3楼到1楼出库 盘点签收 解锁一楼库位 + /// + /// + /// + [HttpPost, NonUnify, AllowAnonymous] + public async Task FinishproductOutstockSign(FinishproductOutstockSignInput input) + { + if (string.IsNullOrEmpty(input.location_id)) + { + throw new AppFriendlyException("起点id不可为空", 500); + } + + if (input.location_id != WmsWareHouseConst.FinishproductOutstockStation1 && input.location_id != WmsWareHouseConst.FinishproductOutstockStation2 + && input.location_id != WmsWareHouseConst.FinishproductOutstockStation3) + { + throw new AppFriendlyException("非一楼出库库位不允许通过此功能解锁", 500); + } + + await _db.Ado.BeginTranAsync(); + try + { + await _db.Updateable().SetColumns(r => new BasLocation + { + is_lock = 0, + is_use = "0" + }).Where(r => r.id == input.location_id).ExecuteCommandAsync(); + + await _db.Updateable().SetColumns(r => new WmsPointH + { + is_lock = 0 + }).Where(r => r.location_id == input.location_id).ExecuteCommandAsync(); + + await _db.Ado.CommitTranAsync(); + } + catch (Exception ex) + { + await _db.Ado.RollbackTranAsync(); + throw; + } + + return await ToApiResult(HttpStatusCode.OK, "成功"); + } + + /// + /// 3楼到1楼出库 盘点签收 解锁一楼库位 + /// + /// + /// + [HttpPost, NonUnify, AllowAnonymous] + public async Task FinishproductOutstockSort(FinishproductOutstockSortInput input) + { + if (string.IsNullOrEmpty(input.carry_id)) + { + throw new AppFriendlyException("载具id不可为空", 500); + } + if (input.qty <= 0) + { + throw new AppFriendlyException("数量必须大于0", 500); + } + + await _db.Ado.BeginTranAsync(); + try + { + await _db.Updateable().SetColumns(r => new WmsCarryCode + { + codeqty = input.qty, + }).Where(r => r.carry_id == input.carry_id).ExecuteCommandAsync(); + + await _db.Ado.CommitTranAsync(); + } + catch (Exception ex) + { + await _db.Ado.RollbackTranAsync(); + throw; + } + + return await ToApiResult(HttpStatusCode.OK, "成功"); + } } }