diff --git a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs index 844f5a39..083ace0d 100644 --- a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs +++ b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs @@ -40,6 +40,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.Entity; using Tnb.WarehouseMgr.Entities.Enums; using Tnb.WarehouseMgr.Interfaces; @@ -67,6 +68,9 @@ namespace Tnb.ProductionMgr private Timer? Floor2timer移走上升降区未生成预任务且满托的料架; private Timer? Floor2timer移走下升降区未生成预任务且空托的料架; + // 7号线补充空料箱 + private Timer? SSX7Supplementtimer; + public static SemaphoreSlim s_taskExecuteFloor2UpMachinecodetimer = new(1); public static SemaphoreSlim s_task送空托到上升降区 = new(1); public static SemaphoreSlim s_task送满托到下升降区 = new(1); @@ -81,11 +85,14 @@ namespace Tnb.ProductionMgr private readonly IBillRullService _billRullService; private readonly IWareHouseService _wareHouseService; private readonly IWmsCarryBindService _wmsCarryBindService; + private readonly IWmsEmptyOutstockService _wmsEmptyOutstockService; + + private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build(); public RedisBackGround(RedisData redisData, IPrdInstockService prdInstockService, ISqlSugarRepository repository, IWmsPDAScanInStockService wmsPDAScanInStock - , IUserManager userManager, IBillRullService billRullService, IWareHouseService wareHouseService, IWmsCarryBindService wmsCarryBindService) + , IUserManager userManager, IBillRullService billRullService, IWareHouseService wareHouseService, IWmsCarryBindService wmsCarryBindService, IWmsEmptyOutstockService wmsEmptyOutstockService) { _redisData = redisData; _prdInstockService = prdInstockService; @@ -95,6 +102,7 @@ namespace Tnb.ProductionMgr _billRullService = billRullService; _wareHouseService = wareHouseService; _wmsCarryBindService = wmsCarryBindService; + _wmsEmptyOutstockService = wmsEmptyOutstockService; } //获取redis数据 private void GetRedisData(object? state) @@ -405,6 +413,24 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA })).CreateLogger(this.GetType()); + protected ILogger LoggerSSX7Supplementtimer => LoggerFactory.Create(builder => builder.AddFile($"{AppContext.BaseDirectory}/logs/customSSX7Supplementtimer{DateTime.Now:yyyyMMdd}.log", cfgOpts => + { + //cfgOpts.DateFormat = "yyyy-MM-dd HH:mm:ss.fff"; + cfgOpts.MessageFormat = (logMsg) => + { + var logLevel = s_logLevelMap[logMsg.LogLevel]; + var sb = new StringBuilder(); + _ = sb.Append($"[{logLevel}] "); + _ = sb.Append($"{logMsg.LogName} "); + _ = sb.Append($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} "); + _ = sb.Append($"#{logMsg.EventId.Id} "); + _ = sb.Append(logMsg.Message + " "); + _ = sb.Append(logMsg.Exception?.ToString()); + return sb.ToString(); + }; + + })).CreateLogger(this.GetType()); + protected ILogger LoggerYCLGLDPJInstock => LoggerFactory.Create(builder => builder.AddFile($"{AppContext.BaseDirectory}/logs/customBGWCarrySupplement{DateTime.Now:yyyyMMdd}.log", cfgOpts => { //cfgOpts.DateFormat = "yyyy-MM-dd HH:mm:ss.fff"; @@ -544,48 +570,33 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA continue; } - // 找到没有库位未锁定的空托盘 - var wmsPoint = _repository.AsSugarClient().Queryable() - .InnerJoin((a, b) => a.location_id == b.id) - .InnerJoin((a, b, c) => b.id == c.location_id) - .LeftJoin((a, b, c, d) => c.id == d.carry_id) - .Where((a, b, c, d) => string.IsNullOrEmpty(d.barcode) && b.wh_id == WmsWareHouseConst.WAREHOUSE_YCL_ID && b.location_code.Contains("YCL-")).OrderBy((a, b, c, d) => b.location_code).Select((a, b, c, d) => new + // 找到库位未锁定的空托盘 todo 待修改为使用出库策略 + var wmsLoc = _repository.AsSugarClient().Queryable() + .InnerJoin((a, b) => a.id == b.location_id) + .LeftJoin((a, b, c) => b.id == c.carry_id) + .Where((a, b, c) => string.IsNullOrEmpty(c.barcode) && a.wh_id == WmsWareHouseConst.WAREHOUSE_YCL_ID && a.location_code.Contains("YCL-")).OrderBy((a, b, c) => a.location_code).Select((a, b, c) => new { - wmsPoint = a, - FirstWmsCarryH = c + basLocation = a, + FirstWmsCarryH = b }); - LoggerBGWCarrySupplement.LogInformation($"【BGWCarrySupplementtimer】 sql {wmsPoint.ToSqlString()}"); + BasLocation startLocation = wmsLoc.First().basLocation; - if (wmsPoint.Count() == 0) - { - LoggerBGWCarrySupplement.LogWarning($"【BGWCarrySupplementtimer】 当前没有可以出库的空托盘"); - continue; - } - WmsPointH startPoint = wmsPoint.First().wmsPoint; - WmsPointH endPoint = _repository.AsSugarClient().Queryable().Where(r => r.location_code == key).First(); - if (endPoint == null) - { - LoggerBGWCarrySupplement.LogWarning($"【BGWCarrySupplementtimer】 终点库位{key}没有维护对应的点位"); - continue; - } + WmsCarryH wmsCarryH = wmsLoc.First().FirstWmsCarryH; //锁定起点库位 - await _repository.AsSugarClient().Updateable().SetColumns(r => r.is_lock == 1).Where(r => r.id == startPoint.location_id).ExecuteCommandAsync(); + await _repository.AsSugarClient().Updateable().SetColumns(r => r.is_lock == 1).Where(r => r.id == startLocation.id).ExecuteCommandAsync(); //锁定终点库位 更新为空闲 - await _repository.AsSugarClient().Updateable().SetColumns(r => new BasLocation { is_lock = 1, is_use = "0" }).Where(r => r.id == endPoint.location_id).ExecuteCommandAsync(); + await _repository.AsSugarClient().Updateable().SetColumns(r => new BasLocation { is_lock = 1, is_use = "0" }).Where(r => r.id == endLocation.id).ExecuteCommandAsync(); - List points = new List(); - points.Add(startPoint); - points.Add(endPoint); - Tuple result_createPretask = await createPretask(points, wmsPoint.First().FirstWmsCarryH.id, wmsPoint.First().FirstWmsCarryH.carry_code, LoggerBGWCarrySupplement); - if (!result_createPretask.Item1) + bool result_createPretask = await createPretask(startLocation.id, endLocation.id, wmsCarryH.id, wmsCarryH.carry_code, LoggerBGWCarrySupplement); + if (!result_createPretask) { - LoggerBGWCarrySupplement.LogWarning($"【BGWCarrySupplementtimer】 {startPoint.location_code} 到 {endPoint.location_code} 预任务生成失败 "); + LoggerBGWCarrySupplement.LogWarning($"【BGWCarrySupplementtimer】 {startLocation.location_code} 到 {endLocation.location_code} 预任务生成失败 "); continue; } - LoggerBGWCarrySupplement.LogWarning($"【BGWCarrySupplementtimer】 {startPoint.location_code} 到 {endPoint.location_code} 预任务生成成功"); + LoggerBGWCarrySupplement.LogWarning($"【BGWCarrySupplementtimer】 {startLocation.location_code} 到 {endLocation.location_code} 预任务生成成功"); _ = _wareHouseService.GenTaskExecute(); @@ -598,6 +609,85 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA } } + /// + /// 7号输送线空料箱补充 + /// + private async void SSX7Supplement(object? state) + { + Dictionary getdic = new Dictionary(); + getdic.Add("SSX-021-007", new string[] { "东面提升机输送线", "出库输送线7呼叫CTU" }); + + foreach (var key in getdic.Keys) + { + try + { + var strs = getdic.Where(p => p.Key == key).First().Value; + string data = await _redisData.GetHash(strs[0], strs[1]); + if (data == null) + { + continue; + } + JObject? res = JsonConvert.DeserializeObject(data); + + bool result = res != null && res["Value"] != null ? res.Value("Value") : false; + if (result) + { + LoggerBGWCarrySupplement.LogInformation($"【SSX7Supplement】 7号输送线 {key} {strs[1]}采集到 {res["Value"]}"); + + BasLocation endLocation = _repository.AsSugarClient().Queryable().Where(r => r.location_code == key).First(); + if (endLocation == null) + { + LoggerBGWCarrySupplement.LogWarning($"【SSX7Supplement】 {key}未维护库位信息"); + continue; + } + if (endLocation.is_lock == 1) + { + LoggerBGWCarrySupplement.LogInformation($"【SSX7Supplement】 7号输送线 {key} 已锁定"); + continue; + } + + BasLocation location = await _repository.AsSugarClient().Queryable().SingleAsync(it => it.location_code == key && it.is_type != EnumLocationType.存储库位.ToString()) ?? throw new AppFriendlyException("无此库位或为存储库位", 500); + //锁定起点库位 + await _repository.AsSugarClient().Updateable().SetColumns(r => r.is_lock == 1).Where(r => r.id == location.id).ExecuteCommandAsync(); + + Dictionary dic = new() + { + [nameof(WmsEmptyOutstockH.id)] = SnowflakeIdHelper.NextId(), + [nameof(WmsEmptyOutstockH.org_id)] = WmsWareHouseConst.AdministratorOrgId, + [nameof(WmsEmptyOutstockH.location_id)] = location.id, + [nameof(WmsEmptyOutstockH.carrystd_id)] = WmsWareHouseConst.LIAOXIANGID, + [nameof(WmsEmptyOutstockH.bill_code)] = _billRullService.GetBillNumber(WmsWareHouseConst.WMS_EMPTYOUTSTK_ENCODE).GetAwaiter().GetResult(), + [nameof(WmsEmptyOutstockH.status)] = WmsWareHouseConst.BILLSTATUS_ADD_ID, + [nameof(WmsEmptyOutstockH.qty)] = 1, + [nameof(WmsEmptyOutstockH.biz_type)] = WmsWareHouseConst.BIZTYPE_WMSEPTYOUTSTK_ID, + ["warehouse_id"] = WmsWareHouseConst.WAREHOUSE_ZC_ID, + [nameof(WmsEmptyOutstockH.create_id)] = WmsWareHouseConst.AdministratorUserId, + [nameof(WmsEmptyOutstockH.create_time)] = DateTime.Now + }; + + VisualDevModelDataCrInput visualDevModelDataCrInput = new() + { + data = dic, + }; + var result_WmsEmptyOut = await _wmsEmptyOutstockService.WmsEmptyOut(visualDevModelDataCrInput); + + if (result_WmsEmptyOut.code2 != "200") + { + LoggerBGWCarrySupplement.LogWarning($"【SSX7Supplement】 预任务生成失败 {result_WmsEmptyOut.msg}"); + continue; + } + LoggerBGWCarrySupplement.LogWarning($"【SSX7Supplement】 预任务生成成功"); + + _ = _wareHouseService.GenTaskExecute(); + } + } + catch (Exception ex) + { + LoggerBGWCarrySupplement.LogInformation($"【SSX7Supplement】 7号输送线空料箱补充发生异常:{ex}"); + } + } + } + /// /// 供料叠盘机空托盘自动入库 /// @@ -623,54 +713,44 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA { LoggerYCLGLDPJInstock.LogInformation($"【YCLGLDPJInstock】 三工位叠盘机 {key} {strs[1]}采集到 {res["Value"]}"); - BasLocation endLocation = _repository.AsSugarClient().Queryable().Where(r => r.location_code == key).First(); - if (endLocation == null) + BasLocation startLocation = _repository.AsSugarClient().Queryable().Where(r => r.location_code == key).First(); + if (startLocation == null) { LoggerYCLGLDPJInstock.LogWarning($"【YCLGLDPJInstock】 {key}未维护库位信息"); continue; } - if (endLocation.is_lock == 1) + if (startLocation.is_lock == 1) { LoggerYCLGLDPJInstock.LogInformation($"【YCLGLDPJInstock】 三工位叠盘机 {key} 已锁定"); continue; } // 找到未锁定且未占用的库位 - var wmsPoint = _repository.AsSugarClient().Queryable() - .InnerJoin((a, b) => a.location_id == b.id) - .Where((a, b) => b.is_lock == 0 && b.is_use == "0" && b.wh_id == WmsWareHouseConst.WAREHOUSE_YCL_ID && b.location_code.Contains("YCL-")); + var endLocations = _repository.AsSugarClient().Queryable() + .Where(a => a.is_lock == 0 && a.is_use == "0" && a.wh_id == WmsWareHouseConst.WAREHOUSE_YCL_ID && a.location_code.Contains("YCL-")); - LoggerYCLGLDPJInstock.LogInformation($"【YCLGLDPJInstock】 sql {wmsPoint.ToSqlString()}"); + LoggerYCLGLDPJInstock.LogInformation($"【YCLGLDPJInstock】 sql {endLocations.ToSqlString()}"); - if (wmsPoint.Count() == 0) + if (endLocations.Count() == 0) { LoggerYCLGLDPJInstock.LogWarning($"【YCLGLDPJInstock】 当前没有空库位可以入库"); continue; } - WmsPointH startPoint = _repository.AsSugarClient().Queryable().Where(r => r.location_code == key).First(); - WmsPointH endPoint = wmsPoint.First(); - if (endPoint == null) - { - LoggerYCLGLDPJInstock.LogWarning($"【YCLGLDPJInstock】 起点库位{key}没有维护对应的点位"); - continue; - } + + BasLocation endLocation = endLocations.First(); //锁定起点库位 更新为空闲 - await _repository.AsSugarClient().Updateable().SetColumns(r => new BasLocation { is_lock = 1, is_use = "0" }).Where(r => r.id == startPoint.location_id).ExecuteCommandAsync(); + await _repository.AsSugarClient().Updateable().SetColumns(r => new BasLocation { is_lock = 1, is_use = "0" }).Where(r => r.id == startLocation.id).ExecuteCommandAsync(); //锁定终点库位 - await _repository.AsSugarClient().Updateable().SetColumns(r => new BasLocation { is_lock = 1 }).Where(r => r.id == endPoint.location_id).ExecuteCommandAsync(); + await _repository.AsSugarClient().Updateable().SetColumns(r => new BasLocation { is_lock = 1 }).Where(r => r.id == endLocation.id).ExecuteCommandAsync(); - List points = new List(); - points.Add(startPoint); - points.Add(endPoint); - - Tuple result_createPretask = await createPretask(points, "", "", LoggerYCLGLDPJInstock); - if (!result_createPretask.Item1) + bool result_createPretask = await createPretask(startLocation.id, endLocation.id, "", "", LoggerYCLGLDPJInstock); + if (!result_createPretask) { - LoggerYCLGLDPJInstock.LogWarning($"【YCLGLDPJInstock】 {startPoint.location_code} 到 {endPoint.location_code} 预任务生成失败"); + LoggerYCLGLDPJInstock.LogWarning($"【YCLGLDPJInstock】 {startLocation.location_code} 到 {endLocation.location_code} 预任务生成失败"); continue; } - LoggerYCLGLDPJInstock.LogWarning($"【YCLGLDPJInstock】 {startPoint.location_code} 到 {endPoint.location_code} 预任务生成成功"); + LoggerYCLGLDPJInstock.LogWarning($"【YCLGLDPJInstock】 {startLocation.location_code} 到 {endLocation.location_code} 预任务生成成功"); _ = _wareHouseService.GenTaskExecute(); @@ -706,56 +786,46 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA bool result = res != null && res["Value"] != null ? res.Value("Value") : false; if (result) { - LoggerYCLGLDPJInstock.LogInformation($"【YCLGLDPJInstock】 外协叠盘机 {key} {strs[1]}采集到 {res["Value"]}"); + LoggerYCLGLDPJInstock.LogInformation($"【YCLWXDPJInstock】 外协叠盘机 {key} {strs[1]}采集到 {res["Value"]}"); - BasLocation endLocation = _repository.AsSugarClient().Queryable().Where(r => r.location_code == key).First(); - if (endLocation == null) + BasLocation startLocation = _repository.AsSugarClient().Queryable().Where(r => r.location_code == key).First(); + if (startLocation == null) { - LoggerYCLGLDPJInstock.LogWarning($"【YCLGLDPJInstock】 {key}未维护库位信息"); + LoggerYCLGLDPJInstock.LogWarning($"【YCLWXDPJInstock】 {key}未维护库位信息"); continue; } - if (endLocation.is_lock == 1) + if (startLocation.is_lock == 1) { - LoggerYCLGLDPJInstock.LogInformation($"【YCLGLDPJInstock】 外协叠盘机 {key} 已锁定"); + LoggerYCLGLDPJInstock.LogInformation($"【YCLWXDPJInstock】 外协叠盘机 {key} 已锁定"); continue; } // 找到未锁定且未占用的库位 - var wmsPoint = _repository.AsSugarClient().Queryable() - .InnerJoin((a, b) => a.location_id == b.id) - .Where((a, b) => b.is_lock == 0 && b.is_use == "0" && b.wh_id == WmsWareHouseConst.WAREHOUSE_YCL_ID && b.location_code.Contains("YCL-")); + var endLocations = _repository.AsSugarClient().Queryable() + .Where(a => a.is_lock == 0 && a.is_use == "0" && a.wh_id == WmsWareHouseConst.WAREHOUSE_YCL_ID && a.location_code.Contains("YCL-")); - LoggerYCLGLDPJInstock.LogInformation($"【YCLGLDPJInstock】 sql {wmsPoint.ToSqlString()}"); + LoggerYCLGLDPJInstock.LogInformation($"【YCLWXDPJInstock】 sql {endLocations.ToSqlString()}"); - if (wmsPoint.Count() == 0) + if (endLocations.Count() == 0) { - LoggerYCLGLDPJInstock.LogWarning($"【YCLGLDPJInstock】 当前没有空库位可以入库"); - continue; - } - WmsPointH startPoint = _repository.AsSugarClient().Queryable().Where(r => r.location_code == key).First(); - WmsPointH endPoint = wmsPoint.First(); - if (endPoint == null) - { - LoggerYCLGLDPJInstock.LogWarning($"【YCLGLDPJInstock】 起点库位{key}没有维护对应的点位"); + LoggerYCLGLDPJInstock.LogWarning($"【YCLWXDPJInstock】 当前没有空库位可以入库"); continue; } + BasLocation endLocation = endLocations.First(); + //锁定起点库位 更新为空闲 - await _repository.AsSugarClient().Updateable().SetColumns(r => new BasLocation { is_lock = 1, is_use = "0" }).Where(r => r.id == startPoint.location_id).ExecuteCommandAsync(); + await _repository.AsSugarClient().Updateable().SetColumns(r => new BasLocation { is_lock = 1, is_use = "0" }).Where(r => r.id == startLocation.id).ExecuteCommandAsync(); //锁定终点库位 - await _repository.AsSugarClient().Updateable().SetColumns(r => new BasLocation { is_lock = 1 }).Where(r => r.id == endPoint.location_id).ExecuteCommandAsync(); + await _repository.AsSugarClient().Updateable().SetColumns(r => new BasLocation { is_lock = 1 }).Where(r => r.id == endLocation.id).ExecuteCommandAsync(); - List points = new List(); - points.Add(startPoint); - points.Add(endPoint); - - Tuple result_createPretask = await createPretask(points, "", "", LoggerYCLGLDPJInstock); - if (!result_createPretask.Item1) + bool result_createPretask = await createPretask(startLocation.id, endLocation.id, "", "", LoggerYCLGLDPJInstock); + if (!result_createPretask) { - LoggerYCLGLDPJInstock.LogWarning($"【YCLGLDPJInstock】 {startPoint.location_code} 到 {endPoint.location_code} 预任务生成失败"); + LoggerYCLGLDPJInstock.LogWarning($"【YCLWXDPJInstock】 {startLocation.location_code} 到 {endLocation.location_code} 预任务生成失败"); continue; } - LoggerYCLGLDPJInstock.LogWarning($"【YCLGLDPJInstock】 {startPoint.location_code} 到 {endPoint.location_code} 预任务生成成功"); + LoggerYCLGLDPJInstock.LogWarning($"【YCLWXDPJInstock】 {startLocation.location_code} 到 {endLocation.location_code} 预任务生成成功"); _ = _wareHouseService.GenTaskExecute(); @@ -763,7 +833,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA } catch (Exception ex) { - LoggerYCLGLDPJInstock.LogInformation($"【YCLGLDPJInstock】 外协叠盘机空托入库发生异常:{ex}"); + LoggerYCLGLDPJInstock.LogInformation($"【YCLWXDPJInstock】 外协叠盘机空托入库发生异常:{ex}"); } } } @@ -880,6 +950,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA BGWCarrySupplementtimer?.Dispose(); YCLGLDPJInstocktimer?.Dispose(); YCLWXDPJInstocktimer?.Dispose(); + + SSX7Supplementtimer?.Dispose(); } #region 二楼上升降机机械臂 @@ -1084,16 +1156,15 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA return; #endregion + await s_task送空托到上升降区.WaitAsync(); using (var db = _repository.AsSugarClient().CopyNew()) { 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)); + ISugarQueryable WmsMechanicalArmHsuagar = db.Queryable() + .InnerJoin((a, b) => a.location_id == b.id) + .Where((a, b) => string.IsNullOrEmpty(a.rackcode) && b.is_lock == 0 && configs_upMachine.Contains(a.name)); List WmsMechanicalArmHs = WmsMechanicalArmHsuagar.ToList(); @@ -1103,6 +1174,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA return; } + //await db.BeginTranAsync(); // 料架区 foreach (WmsMechanicalArmH wmsMechanicalArmH in WmsMechanicalArmHs) { @@ -1123,22 +1195,6 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA 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) { @@ -1155,9 +1211,6 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA // 空料架 WmsCarryH targetCarry = wmsCarryHs[0]; - WmsPointH startPoint = startPoints.First(); - WmsPointH endPoint = endPoints.First(); - await db.Updateable().SetColumns(r => new BasLocation { is_lock = 1 @@ -1165,25 +1218,24 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA await db.Updateable().SetColumns(r => new BasLocation { is_lock = 1 - }).Where(r => r.id == endPoint.location_id).ExecuteCommandAsync(); + }).Where(r => r.id == wmsMechanicalArmH.location_id).ExecuteCommandAsync(); - LoggerFloor2RackDelivery.LogInformation($"【送空托到上升降区】 开始生成预任务 起点{startPoint.point_code} 终点{endPoint.point_code} 料架 {targetCarry.carry_code}"); - List points = new List(); - points.Add(startPoint); - points.Add(endPoint); + LoggerFloor2RackDelivery.LogInformation($"【送空托到上升降区】 开始生成预任务 起点{startLocation.location_code} 终点{wmsMechanicalArmH.location_code} 料架 {targetCarry.carry_code}"); - Tuple result = await createPretask(points, targetCarry.id, targetCarry.carry_code, LoggerFloor2RackDelivery); - if (!result.Item1) + bool result = await createPretask(startLocation.id, wmsMechanicalArmH.location_id, targetCarry.id, targetCarry.carry_code, LoggerFloor2RackDelivery); + if (!result) { - LoggerFloor2RackDelivery.LogInformation($"【送空托到上升降区】 未成功生成预任务 起点{startPoint.point_code} 终点{endPoint.point_code} 料架 {targetCarry.carry_code}"); - continue; + LoggerFloor2RackDelivery.LogInformation($"【送空托到上升降区】 未成功生成预任务 起点{startLocation.location_code} 终点{wmsMechanicalArmH.location_code} 料架 {targetCarry.carry_code}"); + throw new Exception($"【送空托到上升降区】 未成功生成预任务 起点{startLocation.location_code} 终点{wmsMechanicalArmH.location_code} 料架 {wmsMechanicalArmH.rackcode}"); } } - + //await db.CommitTranAsync(); } catch (Exception ex) { - + LoggerFloor2RackDelivery.LogInformation($"【送空托到上升降区】 {ex.Message}"); + LoggerFloor2RackDelivery.LogInformation($"【送空托到上升降区】 {ex.StackTrace}"); + //await db.RollbackTranAsync(); } finally { @@ -1217,16 +1269,15 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA return; #endregion + await s_task送满托到下升降区.WaitAsync(); using (var db = _repository.AsSugarClient().CopyNew()) { 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)); + ISugarQueryable WmsMechanicalArmHsuagar = db.Queryable() + .InnerJoin((a, b) => a.location_id == b.id) + .Where((a, b) => string.IsNullOrEmpty(a.rackcode) && b.is_lock == 0 && configs_upMachine.Contains(a.name)); List WmsMechanicalArmHs = WmsMechanicalArmHsuagar.ToList(); @@ -1236,6 +1287,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA return; } + //await db.BeginTranAsync(); // 料架区 foreach (WmsMechanicalArmH wmsMechanicalArmH in WmsMechanicalArmHs) { @@ -1278,22 +1330,6 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA 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) { @@ -1310,9 +1346,6 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA // 满料架 WmsCarryH targetCarry = wmsCarryHs[0]; - WmsPointH startPoint = startPoints.First(); - WmsPointH endPoint = endPoints.First(); - await db.Updateable().SetColumns(r => new BasLocation { is_lock = 1 @@ -1321,23 +1354,24 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA await db.Updateable().SetColumns(r => new BasLocation { is_lock = 1 - }).Where(r => r.id == endPoint.location_id).ExecuteCommandAsync(); + }).Where(r => r.id == wmsMechanicalArmH.location_id).ExecuteCommandAsync(); - LoggerFloor2RackDelivery.LogInformation($"【送满托到下升降区】 开始生成预任务 起点{startPoint.point_code} 终点{endPoint.point_code} 料架 {targetCarry.carry_code}"); - List points = new List(); - points.Add(startPoint); - points.Add(endPoint); + LoggerFloor2RackDelivery.LogInformation($"【送满托到下升降区】 开始生成预任务 起点{startLocation.location_code} 终点{wmsMechanicalArmH.location_code} 料架 {targetCarry.carry_code}"); - Tuple result = await createPretask(points, targetCarry.id, targetCarry.carry_code, LoggerFloor2RackDelivery); - if (!result.Item1) + bool result = await createPretask(startLocation.id, wmsMechanicalArmH.location_id, targetCarry.id, targetCarry.carry_code, LoggerFloor2RackDelivery); + if (!result) { - LoggerFloor2RackDelivery.LogInformation($"【送满托到下升降区】 未成功生成预任务 起点{startPoint.point_code} 终点{endPoint.point_code} 料架 {targetCarry.carry_code}"); + LoggerFloor2RackDelivery.LogInformation($"【送满托到下升降区】 未成功生成预任务 起点{startLocation.location_code} 终点{wmsMechanicalArmH.location_code} 料架 {targetCarry.carry_code}"); continue; } } + //await db.CommitTranAsync(); } catch (Exception ex) { + LoggerFloor2RackDelivery.LogInformation($"【送满托到下升降区】 {ex.Message}"); + LoggerFloor2RackDelivery.LogInformation($"【送满托到下升降区】 {ex.StackTrace}"); + //await db.RollbackTranAsync(); } finally { @@ -1372,36 +1406,26 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA return; #endregion + await s_task移走上升降区未生成预任务且满托的料架.WaitAsync(); using (var db = _repository.AsSugarClient().CopyNew()) { try { - await s_task移走上升降区未生成预任务且满托的料架.WaitAsync(); + + //await db.BeginTranAsync(); // 读取上升降机的左右料架区配置 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}"); + LoggerFloor2RackDelivery.LogInformation($"【移走上升降区满托的料架】 开始执行预任务生成 {wmsMechanicalArmH.location_code} {wmsMechanicalArmH.outbill} {wmsMechanicalArmH.barcodes}"); await db.Updateable().SetColumns(r => new WmsMechanicalArmH { iscreatepretask = 1 }).Where(r => r.id == wmsMechanicalArmH.id).ExecuteCommandAsync(); - List points = new List(); - - List startPoints = db.Queryable().Where(r => r.id == wmsMechanicalArmH.point_id).ToList(); - - if (startPoints.Count == 0) - { - LoggerFloor2RackDelivery.LogError($"【移走上升降区满托的料架】 起点{wmsMechanicalArmH.point_id} {wmsMechanicalArmH.point_code}未在点位表维护对应的点位"); - continue; - } - - WmsPointH startPoint = startPoints.First(); - points.Add(startPoint); // 找到未占用且未锁定的库位 ISugarQueryable rackEndLocations = @@ -1416,17 +1440,6 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA BasLocation endLocation = rackEndLocations.First(); - List endPoints = db.Queryable().Where(r => r.location_id == endLocation.id).ToList(); - - if (endPoints.Count == 0) - { - LoggerFloor2RackDelivery.LogError($"【移走上升降区满托的料架】 终点库位{endLocation.location_code}未在点位表维护对应的点位"); - continue; - } - - WmsPointH endPoint = endPoints.First(); - points.Add(endPoint); - // 锁住终点库位 await db.Updateable(r => new BasLocation { @@ -1435,17 +1448,23 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA LoggerFloor2RackDelivery.LogInformation($"【移走上升降区满托的料架】 开始执行预任务生成: 料架区为{wmsMechanicalArmH.name}{wmsMechanicalArmH.stackingposition} 料架为{wmsMechanicalArmH.rackcode}"); - Tuple result = await createPretask(points, wmsMechanicalArmH.rackid, wmsMechanicalArmH.rackcode, LoggerFloor2RackDelivery); - if (!result.Item1) + + bool result = await createPretask(wmsMechanicalArmH.location_id, endLocation.id, wmsMechanicalArmH.rackid, wmsMechanicalArmH.rackcode, LoggerFloor2RackDelivery); + if (!result) { - LoggerFloor2RackDelivery.LogInformation($"【移走上升降区满托的料架】 未成功生成预任务 起点{startPoint.point_code} 终点{endPoint.point_code} 料架 {wmsMechanicalArmH.rackcode}"); - continue; + LoggerFloor2RackDelivery.LogError($"【移走上升降区满托的料架】 未成功生成预任务 起点{wmsMechanicalArmH.location_code} 终点{endLocation.location_code} 料架 {wmsMechanicalArmH.rackcode}"); + throw new Exception($"【移走上升降区满托的料架】 未成功生成预任务 起点{wmsMechanicalArmH.location_code} 终点{endLocation.location_code} 料架 {wmsMechanicalArmH.rackcode}"); } - LoggerFloor2RackDelivery.LogInformation($"【移走上升降区满托的料架】 成功生成预任务 {result.Item2}"); + LoggerFloor2RackDelivery.LogInformation($"【移走上升降区满托的料架】 成功生成预任务 {result}"); } + + //await db.CommitTranAsync(); } catch (Exception ex) { + LoggerFloor2RackDelivery.LogInformation($"【移走上升降区未生成预任务且满托的料架】 {ex.Message}"); + LoggerFloor2RackDelivery.LogInformation($"【移走上升降区未生成预任务且满托的料架】 {ex.StackTrace}"); + //await db.RollbackTranAsync(); } finally { @@ -1480,38 +1499,26 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA if (configs_upMachine.Count == 0) return; #endregion + await s_task移走下升降区未生成预任务且空托的料架.WaitAsync(); using (var db = _repository.AsSugarClient().CopyNew()) { try { - await s_task移走下升降区未生成预任务且空托的料架.WaitAsync(); + //await db.BeginTranAsync(); // 读取下升降机的左右料架区配置 List WmsMechanicalArmHs = db.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}"); + LoggerFloor2RackDelivery.LogInformation($"【移走下升降区空托的料架】 开始执行预任务生成 {wmsMechanicalArmH.location_code} {wmsMechanicalArmH.outbill} {wmsMechanicalArmH.barcodes}"); await db.Updateable().SetColumns(r => new WmsMechanicalArmH { iscreatepretask = 1 }).Where(r => r.id == wmsMechanicalArmH.id).ExecuteCommandAsync(); - List points = new List(); - - List startPoints = db.Queryable().Where(r => r.id == wmsMechanicalArmH.point_id).ToList(); - - if (startPoints.Count == 0) - { - LoggerFloor2RackDelivery.LogError($"【移走下升降区空托的料架】 起点{wmsMechanicalArmH.point_id} {wmsMechanicalArmH.point_code}未在点位表维护对应的点位"); - continue; - } - - WmsPointH startPoint = startPoints.First(); - points.Add(startPoint); - // 找到未占用且未锁定的库位 ISugarQueryable rackEndLocations = db.Queryable() @@ -1525,17 +1532,6 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA BasLocation endLocation = rackEndLocations.First(); - List endPoints = db.Queryable().Where(r => r.location_id == endLocation.id).ToList(); - - if (endPoints.Count == 0) - { - LoggerFloor2RackDelivery.LogError($"【移走下升降区空托的料架】 终点库位{endLocation.location_code}未在点位表维护对应的点位"); - continue; - } - - WmsPointH endPoint = endPoints.First(); - points.Add(endPoint); - // 解除绑定料箱到料架 CarryBindFloor2UpDownMachineInput carryBindFloor2UpDownMachineInput = new() { }; carryBindFloor2UpDownMachineInput.carry_id = wmsMechanicalArmH.rackid; @@ -1551,18 +1547,20 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA LoggerFloor2RackDelivery.LogInformation($"【移走下升降区空托的料架】 开始执行预任务生成: 料架区为{wmsMechanicalArmH.name}{wmsMechanicalArmH.stackingposition} 料架为{wmsMechanicalArmH.rackcode}"); - Tuple result = await createPretask(points, wmsMechanicalArmH.rackid, wmsMechanicalArmH.rackcode, LoggerFloor2RackDelivery); - if (!result.Item1) + bool result = await createPretask(wmsMechanicalArmH.location_id, endLocation.id, wmsMechanicalArmH.rackid, wmsMechanicalArmH.rackcode, LoggerFloor2RackDelivery); + if (!result) { - LoggerFloor2RackDelivery.LogInformation($"【移走下升降区空托的料架】 未成功生成预任务 起点{startPoint.point_code} 终点{endPoint.point_code} 料架 {wmsMechanicalArmH.rackcode}"); + LoggerFloor2RackDelivery.LogInformation($"【移走下升降区空托的料架】 未成功生成预任务 起点{wmsMechanicalArmH.location_code} 终点{endLocation.location_code} 料架 {wmsMechanicalArmH.rackcode}"); continue; } } + //await db.CommitTranAsync(); } catch (Exception ex) { - LoggerFloor2RackDelivery.LogError(ex.ToString()); - LoggerFloor2RackDelivery.LogError(ex.StackTrace); + LoggerFloor2RackDelivery.LogInformation($"【移走下升降区空托的料架】 {ex.Message}"); + LoggerFloor2RackDelivery.LogInformation($"【移走下升降区空托的料架】 {ex.StackTrace}"); + //await db.RollbackTranAsync(); } finally { @@ -1573,57 +1571,27 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA } // 上下升降机生成预任务(补充料架、上升降机取货到料架、上升降机满托运走,下升降机拿货到输送线、下升降机空托运走) - private async Task> createPretask(List points, string carry_id, string carry_code, ILogger logger) + private async Task createPretask(string startlocation_id, string endlocation_id, string carry_id, string carry_code, ILogger logger) { - //根据获取的路径点生成预任务,生成顺序必须预路径算法返回的起终点的顺序一致(预任务顺序) - 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 => + CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput(); + commonCreatePretaskInput.startlocation_id = startlocation_id; + commonCreatePretaskInput.endlocation_id = endlocation_id; + commonCreatePretaskInput.carry_id = carry_id; + commonCreatePretaskInput.carry_code = carry_code; + commonCreatePretaskInput.task_type = WmsWareHouseConst.BIZTYPE_WMSTRANSFER_ID; + commonCreatePretaskInput.biz_type = ""; + commonCreatePretaskInput.require_id = ""; + commonCreatePretaskInput.isExcuteMission = false; + + logger.LogInformation($"开始执行 GenPreTask {JsonConvert.SerializeObject(commonCreatePretaskInput)}"); + var res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput); + if (res.code == JNPF.Common.Enums.HttpStatusCode.OK) { - WmsPointH? sPoint = it.FirstOrDefault(); - WmsPointH? ePoint = it.LastOrDefault(); - - preTask = new() - { - org_id = "", - 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 = bill_code, - status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID, - biz_type = "", - task_type = "", - carry_id = carry_id, - carry_code = carry_code, - area_id = sPoint?.area_id!, - area_code = it.Key, - require_id = "", - require_code = "", - create_id = "", - create_time = DateTime.Now - }; - - return preTask; - }).ToList(); - //更新页面 - //赋值签收状态 - - 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}"); - return new Tuple(true, preTask); + logger.LogInformation($"GenPreTask 结果 {JsonConvert.SerializeObject(res)}"); + return true; } - return new Tuple(false, null); + + return false; } private async Task Floor2UpDownMachinecode_GetTag(string tag) @@ -1634,26 +1602,26 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA 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); + //string DevName = "东面提升机输送线"; + //Dictionary dicCommand = new(StringComparer.OrdinalIgnoreCase) + //{ + // ["DevName"] = DevName, + // ["token"] = _eleCtlCfg.token, + // ["TagName"] = tag, + // ["Value"] = value, + //}; + //string result = await HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand); - return result.Contains("Ok"); + //return result.Contains("Ok"); // 测试 - //string DevName = "东面提升机输送线"; + string DevName = "东面提升机输送线"; - //JObject valueJson = new JObject(); - //valueJson["Value"] = value; + JObject valueJson = new JObject(); + valueJson["Value"] = value; - //bool res = await _redisData.HSet(DevName, tag, valueJson.ToString()); - //return true; + bool res = await _redisData.HSet(DevName, tag, valueJson.ToString()); + return true; } #endregion @@ -1674,13 +1642,17 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA //YCLWXDPJInstocktimer = new Timer(YCLWXDPJInstock, null, TimeSpan.Zero, TimeSpan.FromSeconds(100000)); // 二楼上升降机 - Floor2UpMachinecodetimer = new Timer(Floor2UpMachinecode, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); + Floor2UpMachinecodetimer = new Timer(Floor2UpMachinecode, null, TimeSpan.Zero, TimeSpan.FromSeconds(1)); // 二楼料架配送 - Floor2timer送空托到上升降区 = new Timer(送空托到上升降区, null, TimeSpan.Zero, TimeSpan.FromSeconds(60)); - Floor2timer送满托到下升降区 = new Timer(送满托到下升降区, null, TimeSpan.Zero, TimeSpan.FromSeconds(60)); - Floor2timer移走上升降区未生成预任务且满托的料架 = new Timer(移走上升降区未生成预任务且满托的料架, null, TimeSpan.Zero, TimeSpan.FromSeconds(60)); - Floor2timer移走下升降区未生成预任务且空托的料架 = new Timer(移走下升降区未生成预任务且空托的料架, null, TimeSpan.Zero, TimeSpan.FromSeconds(60)); + Floor2timer送空托到上升降区 = new Timer(送空托到上升降区, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); + Floor2timer送满托到下升降区 = new Timer(送满托到下升降区, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); + Floor2timer移走上升降区未生成预任务且满托的料架 = new Timer(移走上升降区未生成预任务且满托的料架, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); + Floor2timer移走下升降区未生成预任务且空托的料架 = new Timer(移走下升降区未生成预任务且空托的料架, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); + + BGWCarrySupplementtimer = new Timer(BGWCarrySupplement, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); + // 7号线补充空料箱 + SSX7Supplementtimer = new Timer(SSX7Supplement, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); return Task.CompletedTask; } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CommonCreatePretaskInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CommonCreatePretaskInput.cs index c12ed4a5..afaa2b06 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CommonCreatePretaskInput.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CommonCreatePretaskInput.cs @@ -38,6 +38,11 @@ namespace Tnb.WarehouseMgr.Entities.Dto.Inputs /// public bool isExcuteMission { get; set; } = true; + /// + /// 是否变更载具位置为任务起点 + /// + public bool isChangeCarryLoc2StartLoc { get; set; } = true; + } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMechanicalArmH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMechanicalArmH.cs index 1e52a670..d42951e6 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMechanicalArmH.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMechanicalArmH.cs @@ -66,14 +66,14 @@ public partial class WmsMechanicalArmH : BaseEntity public string? rackcode { get; set; } /// - /// 点位id + /// 库位id /// - public string? point_id { get; set; } + public string? location_id { get; set; } /// - /// 点位编号 + /// 库位编号 /// - public string? point_code { get; set; } + public string? location_code { get; set; } /// /// 取放货确认 diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsEmptyOutstockService.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsEmptyOutstockService.cs index 4cadb8db..c134acc6 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsEmptyOutstockService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWmsEmptyOutstockService.cs @@ -1,4 +1,5 @@ -using Tnb.WarehouseMgr.Entities.Dto.Inputs; +using JNPF.Common.Dtos.VisualDev; +using Tnb.WarehouseMgr.Entities.Dto.Inputs; namespace Tnb.WarehouseMgr.Interfaces { @@ -13,5 +14,7 @@ namespace Tnb.WarehouseMgr.Interfaces /// /// Task MESEmptyCarryOutStk(MESEmptyCarryOutStkInput input); + + Task WmsEmptyOut(VisualDevModelDataCrInput input); } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/DevServBase`1.cs b/WarehouseMgr/Tnb.WarehouseMgr/DevServBase`1.cs index 0367f680..99efc58e 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/DevServBase`1.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/DevServBase`1.cs @@ -48,6 +48,16 @@ namespace Tnb.WarehouseMgr s_elevatorMap = await context.Queryable().ToDictionaryAsync(x => x.elevator_id, x => x.elevator_code); + + if (s_eleUseStatusDic.Count < 1) + { + foreach (var (k, _) in s_elevatorMap) + { + s_eleUseStatusDic[k] = 0; + s_loadedStatusDic[k] = 0; + } + } + } //public static Task InitializationTask => initializationTask.Value; diff --git a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs index a205c4cf..7cb6d678 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs @@ -46,7 +46,6 @@ namespace Tnb.WarehouseMgr private readonly IElevatorControlService _elevatorControlService; private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build(); private readonly ILoggerFactory _loggerFactory; - public static Dictionary s_eleUseStatusDic = new(); @@ -63,14 +62,6 @@ namespace Tnb.WarehouseMgr _eventPublisher = eventPublisher; _userManager = userManger; _elevatorControlService = elevatorControlService; - if (s_eleUseStatusDic.Count < 1) - { - foreach (var (k, _) in s_elevatorMap) - { - s_eleUseStatusDic[k] = 0; - s_loadedStatusDic[k] = 0; - } - } } /// @@ -146,7 +137,7 @@ namespace Tnb.WarehouseMgr var tags = _eleCtlCfg.tags; await Task.Delay(1000); (int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None); - Logger.Information($"【LoadConfirm】 电梯当前状态->系统状态:{sysStatus.ToEnum()},运行状态:{runStatus.ToEnum()},Agv状态:{agvStatus.ToEnum()},当前楼层:{floorNo}"); + Logger.Information($"【LoadConfirm】 电梯当前状态->系统状态:{sysStatus.ToEnum()},运行状态:{runStatus.ToEnum()},Agv状态:{agvStatus.ToEnum()},当前楼层:{floorNo},电梯占用状态{s_eleUseStatusDic[elevator.device_id]}"); { var curFloor = await GetRealFloor(elevator.end_floor); /* Logger.Information($"目标楼层:{curFloor},电梯当前楼层:{floorNo}"); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs b/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs index b337e7c3..030998c5 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs @@ -202,7 +202,7 @@ namespace Tnb.WarehouseMgr try { (int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await GetElevatorStatus(devName, CancellationToken.None);//elevator.elevator_code - Logger.Information($"【UnloadConfirm】 电梯当前状态->系统状态:{sysStatus.ToEnum()},运行状态:{runStatus},门状态:{doorStatus},Agv状态:{agvStatus},当前楼层:{floorNo}"); + Logger.Information($"【SendOpenCloseCmd】 电梯当前状态->系统状态:{sysStatus.ToEnum()},运行状态:{runStatus},门状态:{doorStatus},Agv状态:{agvStatus},当前楼层:{floorNo}"); //判断Agv电梯是否进入状态 if (agvStatus != (int)EnumAgvStatus.AGV运行状态) _ = await WriteTagAsync(devName, ElevatorConsts.AGVControl, 1); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index 4c0631bb..7f59377c 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -561,172 +561,187 @@ namespace Tnb.WarehouseMgr // 二楼下升降区料架区点位 rackAreaPointsDown.Add("AX01"); rackAreaPointsDown.Add("AX02"); - if (disTask.area_code == "E") - { - Logger.Information($"【二楼机械臂Floor2MechanicalComplete】收到到货完成信号 传入参数: {disTask.bill_code} {action}"); - SqlSugarClient db = _db.CopyNew(); - if (action == "UNLOAD") + try { + + await _db.Ado.BeginTranAsync(); + + if (disTask.area_code == "E") { - // 去料架区放货 - if (rackAreaPointsUp.Contains(disTask.endlocation_code) || rackAreaPointsDown.Contains(disTask.endlocation_code)) + Logger.Information($"【二楼机械臂Floor2MechanicalComplete】收到到货完成信号 传入参数: {disTask.bill_code} {action}"); + SqlSugarClient db = _db.CopyNew(); + + if (action == "UNLOAD") { - ISugarQueryable WmsMechanicalArmHs = db.Queryable().Where(r => r.point_code == disTask.endpoint_code); - if (WmsMechanicalArmHs.Count() == 0) + // 去料架区放货 + if (rackAreaPointsUp.Contains(disTask.endlocation_code) || rackAreaPointsDown.Contains(disTask.endlocation_code)) { - Logger.Information($"【二楼机械臂Floor2MechanicalComplete】 任务执行终点{disTask.endpoint_code} 与料架区的点位不匹配"); - return false; - } - WmsMechanicalArmH target = WmsMechanicalArmHs.First(); - - // 回写料架和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已到货 {disTask.endpoint_code} 更新缓存表{target.id}"); - - // 下升降机写满托数量和送到信号 - if (rackAreaPointsDown.Contains(disTask.endlocation_code)) - { - int LXCount = db.Queryable().Where(a => a.carry_id == disTask.carry_id).Count(); - - bool result = await Floor2UpDownMachinecode_SetTag($"下升降机满托{target.stackingposition}数量", LXCount.ToString()); - Logger.LogInformation($@"【送满托到下升降区】设定下升降机满托{target.stackingposition}满托数量为 {LXCount} 结果为 {result}"); - if (!result) + ISugarQueryable WmsMechanicalArmHs = db.Queryable().Where(r => r.location_code == disTask.endlocation_code); + if (WmsMechanicalArmHs.Count() == 0) { + Logger.Information($"【二楼机械臂Floor2MechanicalComplete】 任务执行终点{disTask.endpoint_code} 与料架区的点位不匹配"); return false; } + WmsMechanicalArmH target = WmsMechanicalArmHs.First(); - // 尝试写入满托送到信号 - bool result下升降机空托送到 = await Floor2UpDownMachinecode_SetTag($"下升降机满托{target.stackingposition}送到", "true"); - Logger.LogInformation($@"【送满托到下升降区】回写 下升降机满托{target.stackingposition}送到 结果为{result下升降机空托送到}"); - if (!result下升降机空托送到) - { - return false; - } - - // 绑定料架 + // 回写料架和AGV确认 await db.Updateable().SetColumns(r => new WmsMechanicalArmH { - mechanicalconfirm = 1, - maxnum = LXCount + agvconfirm = 1, + rackid = disTask.carry_id, + rackcode = disTask.carry_code }).Where(r => r.id == target.id).ExecuteCommandAsync(); + Logger.Information($"【二楼机械臂Floor2MechanicalComplete】{disTask.bill_code} AGV已到货 {disTask.endpoint_code} 更新缓存表{target.id}"); - Logger.LogInformation($@"【送满托到下升降区】 料架{target.rackid}下的料箱开始生成预任务"); - bool pretask_result = await Floor2EmptyCarryCreateZZCPretask(disTask.carry_id); - if (pretask_result) + // 下升降机写满托数量和送到信号 + if (rackAreaPointsDown.Contains(disTask.endlocation_code)) { - Logger.LogInformation($@"【送满托到下升降区】 料架{target.rackid}下的料箱生成预任务完成"); - } - else - { - Logger.LogInformation($@"【送满托到下升降区】 料架{target.rackid}下的料箱生成预任务失败"); + int LXCount = db.Queryable().Where(a => a.carry_id == disTask.carry_id).Count(); + + bool result = await Floor2UpDownMachinecode_SetTag($"下升降机满托{target.stackingposition}数量", LXCount.ToString()); + Logger.LogInformation($@"【送满托到下升降区】设定下升降机满托{target.stackingposition}满托数量为 {LXCount} 结果为 {result}"); + if (!result) + { + return false; + } + + // 尝试写入满托送到信号 + bool result下升降机空托送到 = await Floor2UpDownMachinecode_SetTag($"下升降机满托{target.stackingposition}送到", "true"); + Logger.LogInformation($@"【送满托到下升降区】回写 下升降机满托{target.stackingposition}送到 结果为{result下升降机空托送到}"); + if (!result下升降机空托送到) + { + return false; + } + + // 绑定料架 + await db.Updateable().SetColumns(r => new WmsMechanicalArmH + { + mechanicalconfirm = 1, + maxnum = LXCount + }).Where(r => r.id == target.id).ExecuteCommandAsync(); + + Logger.LogInformation($@"【送满托到下升降区】 料架{target.rackid}下的料箱开始生成预任务"); + bool pretask_result = await Floor2EmptyCarryCreateZZCPretask(disTask.carry_id); + if (pretask_result) + { + Logger.LogInformation($@"【送满托到下升降区】 料架{target.rackid}下的料箱生成预任务完成"); + } + else + { + Logger.LogInformation($@"【送满托到下升降区】 料架{target.rackid}下的料箱生成预任务失败"); + throw new Exception($@"【送满托到下升降区】 料架{target.rackid}下的料箱生成预任务失败"); + } } } - } - else // 去暂存仓放货 - { - // 回写料架料箱绑定表的库位 - 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 => + else // 去暂存仓放货 { - r.location_id = disTask.endlocation_id; - r.location_code = disTask.endlocation_code; - }); - await db.Updateable(WmsCarryCodeList).ExecuteCommandAsync(); + // 回写料架料箱绑定表的库位 + 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; + }); + await db.Updateable(WmsCarryCodeList).ExecuteCommandAsync(); + } + } + else + { + // 去暂存仓取货 + if (rackAreaPointsUp.Contains(disTask.endlocation_code) || rackAreaPointsDown.Contains(disTask.endlocation_code)) + { + + Logger.Information($"【二楼机械臂Floor2MechanicalComplete】{disTask.bill_code} AGV在暂存仓取货完成"); + } + else // 去料架区取货 + { + ISugarQueryable WmsMechanicalArmHs = db.Queryable().Where(r => r.location_code == disTask.startlocation_code); + if (WmsMechanicalArmHs.Count() == 0) + { + Logger.Information($"【二楼机械臂Floor2MechanicalComplete】 任务执行起点{disTask.endpoint_code} 与料架区的点位不匹配"); + return false; + } + 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 + { + 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在料架区取货完成"); + } } } - else - { - // 去暂存仓取货 - if (rackAreaPointsUp.Contains(disTask.endlocation_code) || rackAreaPointsDown.Contains(disTask.endlocation_code)) - { - - Logger.Information($"【二楼机械臂Floor2MechanicalComplete】{disTask.bill_code} AGV在暂存仓取货完成"); - } - else // 去料架区取货 - { - 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(); - 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 - { - 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在料架区取货完成"); - } - } + await _db.Ado.CommitTranAsync(); + return true; } - return true; + catch(Exception ex) + { + await _db.Ado.RollbackTranAsync(); + return false; + } + return false; } 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); + //string DevName = "东面提升机输送线"; + //Dictionary dicCommand = new(StringComparer.OrdinalIgnoreCase) + //{ + // ["DevName"] = DevName, + // ["token"] = _eleCtlCfg.token, + // ["TagName"] = tag, + // ["Value"] = value, + //}; + //string result = await HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand); - return result.Contains("Ok"); + //return result.Contains("Ok"); // 测试 - //string DevName = "东面提升机输送线"; + string DevName = "东面提升机输送线"; - //JObject valueJson = new JObject(); - //valueJson["Value"] = value; + JObject valueJson = new JObject(); + valueJson["Value"] = value; - //bool res = await _redisData.HSet(DevName, tag, valueJson.ToString()); - //return true; + bool res = await _redisData.HSet(DevName, tag, valueJson.ToString()); + return true; } /// @@ -736,7 +751,7 @@ namespace Tnb.WarehouseMgr [HttpPost] public async Task GenTaskExecute() { - CTUTaskExecute(); + await CTUTaskExecute(); await s_taskExecuteSemaphore.WaitAsync(); Stopwatch sw = Stopwatch.StartNew(); @@ -749,10 +764,12 @@ namespace Tnb.WarehouseMgr Logger.Information("【GenTaskExecute】 开始获取未下发的预任务..."); ISugarQueryable sugarQueryable = db.Queryable() - .LeftJoin((a, b) => a.startlocation_id == b.location_id && a.carry_id == b.id) + .LeftJoin((a, b) => 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)) + .Where((a, b) => a.status == WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID && !string.IsNullOrWhiteSpace(a.startlocation_id) + // 载具为空时 不校验载具当前位置是否与预任务起点相同 + && (string.IsNullOrEmpty(a.carry_id) || (!string.IsNullOrEmpty(a.carry_id) && a.startlocation_id == b.location_id))) .OrderBy(a => new { priority = SqlFunc.Desc(a.priority), a.bill_code }) .Select((a, b, c, d) => new WmsPretaskH { @@ -906,6 +923,8 @@ namespace Tnb.WarehouseMgr Logger.Information("【GenTaskExecute】 预任务执行完成"); Logger.Information($"【GenTaskExecute】_eleCtlCfg.Environment={_eleCtlCfg.Environment}"); + + if (string.Equals(_eleCtlCfg.Environment, ElevatorConsts.EnvironmentName, StringComparison.OrdinalIgnoreCase)) { //呼梯操作 @@ -921,16 +940,24 @@ namespace Tnb.WarehouseMgr Logger.Information($"【GenTaskExecute】呼梯时 根据任务单号获取电梯参数 {JsonConvert.SerializeObject(q)}"); var e = await FindElevatorFromPars(q); Logger.Information($"【GenTaskExecute】呼梯时 根据任务单号获取电梯结果 {JsonConvert.SerializeObject(e)}"); - if (e != null) + + var tags = _eleCtlCfg.tags; + (int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(e.elevator_code, tags, CancellationToken.None); + Logger.Information($"【GenTaskExecute】 电梯当前状态->系统状态:{sysStatus.ToEnum()},运行状态:{runStatus.ToEnum()},Agv状态:{agvStatus.ToEnum()},当前楼层:{floorNo},电梯占用状态{s_eleUseStatusDic[e.device_id]}"); + var curFloor = await GetRealFloor(e.end_floor); + + if (e != null && s_eleUseStatusDic[e.device_id] == (int)EnumElevatorUseStatus.空闲 && curFloor != floorNo) { task.device_id = e.device_id; } } - List<(string endlocation_code, string device_id, string id, int start_floor)> endLocCodes = agvDTTasks + Logger.Information($"【GenTaskExecute】呼梯任务数:{agvDTTasks.Count}"); + List<(string endlocation_code, string device_id, string id, int start_floor)> endLocCodes = agvDTTasks.Where(r => !string.IsNullOrEmpty(r.device_id)) .Select(it => (it.endlocation_code, it.device_id, it.id, it.start_floor)).ToList(); var callLiftCnt = endLocCodes?.Count ?? 0; - Logger.Information($"【GenTaskExecute】呼梯任务数:{callLiftCnt}"); + Logger.Information($"【GenTaskExecute】实际可呼梯任务数:{callLiftCnt}"); + if (endLocCodes?.Count > 0) { if (endLocCodes.Select(x => x.device_id).All(x => !x.IsNullOrWhiteSpace())) @@ -1720,6 +1747,7 @@ namespace Tnb.WarehouseMgr List<(string carry_id, string carry_status, string endlocation_id, string endlocation_code)> multiList = disTasks.Select(it => (it.carry_id, it.carry_status, it.endlocation_id, it.endlocation_code)).ToList(); Dictionary locWhIdMap = await _db.Queryable().Where(it => multiList.Select(x => x.endlocation_id).Contains(it.id)).ToDictionaryAsync(it => it.id, it => it.wh_id); + Dictionary locTypeMap = await _db.Queryable().Where(it => multiList.Select(x => x.endlocation_id).Contains(it.id)).ToDictionaryAsync(it => it.id, it => it.is_type); List carryIts = new(); List carryCodeIts = new(); List locIts = new(); @@ -1753,6 +1781,11 @@ namespace Tnb.WarehouseMgr loc.is_use = ((int)EnumCarryStatus.占用).ToString(); } + // 如果是出入库位 完成后解除占用 + string? is_type = locTypeMap.ContainsKey(endLocId) ? locTypeMap[endLocId].ToString() : ""; + if (is_type == ((int)EnumLocationType.出入库位).ToString()) + loc.is_use = ((int)EnumCarryStatus.空闲).ToString(); + locIts.Add(loc); } @@ -1768,6 +1801,7 @@ namespace Tnb.WarehouseMgr */ //更新业务主表的单据状态 foreach (WmsDistaskH? dt in disTasks) { + #region todo 移到service中 // 销售出库 if (dt.biz_type == WmsWareHouseConst.BIZTYPE_WMSSALERELEASE_ID) { @@ -1797,7 +1831,7 @@ namespace Tnb.WarehouseMgr WmsCarryCode wmsCarryCode = await _db.Queryable().Where(r => r.carry_id == dt.carry_id).FirstAsync(); await _db.Updateable().SetColumns(r => r.yzqty == r.yzqty + wmsCarryCode.codeqty).Where(r => r.id == dt.require_id).ExecuteCommandAsync(); } - + #endregion List disTaskCodes = await _db.Queryable().Where(it => it.bill_id == dt.id).ToListAsync(); WareHouseUpInput upInput = new() { bizTypeId = dt.biz_type, requireId = dt.require_id!, distaskCodes = disTaskCodes, carryIds = disTasks.Select(x => x.carry_id).ToList() }; @@ -2418,151 +2452,167 @@ namespace Tnb.WarehouseMgr [HttpPost, NonUnify, AllowAnonymous] public async Task CommonCreatePretask(CommonCreatePretaskInput input) { - Logger.LogInformation($"【createPretask】 接收到请求 参数:{JsonConvert.SerializeObject(input)}"); - try + using (var db = _db.CopyNew()) { - WmsPointH? sPoint = null; - WmsPointH? ePoint = null; + Logger.LogInformation($"【createPretask】 接收到请求 参数:{JsonConvert.SerializeObject(input)}"); + try + { - if (!string.IsNullOrEmpty(input.startlocation_id)) - { - sPoint = await _db.Queryable().FirstAsync(it => it.location_id == input.startlocation_id); - } - if (!string.IsNullOrEmpty(input.endlocation_id)) - { - ePoint = await _db.Queryable().FirstAsync(it => it.location_id == input.endlocation_id); - } + WmsPointH? sPoint = null; + WmsPointH? ePoint = null; - List points = new List(); - if (sPoint.area_code != ePoint.area_code) - { - points = await PathAlgorithms(sPoint.id, ePoint.id); - if (points.Count <= 2) + if (!string.IsNullOrEmpty(input.startlocation_id)) { - throw new AppFriendlyException("该路径不存在", 500); + sPoint = await db.Queryable().FirstAsync(it => it.location_id == input.startlocation_id); + } + if (!string.IsNullOrEmpty(input.endlocation_id)) + { + ePoint = await db.Queryable().FirstAsync(it => it.location_id == input.endlocation_id); + } + + List points = new List(); + if (sPoint.area_code != ePoint.area_code) + { + points = await PathAlgorithms(sPoint.id, ePoint.id); + if (points.Count <= 2) + { + throw new AppFriendlyException("该路径不存在", 500); + } + } + else + { + points.Add(sPoint); + points.Add(ePoint); + } + + //根据获取的路径点生成预任务,生成顺序必须预路径算法返回的起终点的顺序一致(预任务顺序) + WmsPretaskH preTask = null; + string bill_code = await _billRullService.GetBillNumber(WmsWareHouseConst.WMS_PRETASK_H_ENCODE); + + string carry_id = ""; + string carry_code = ""; + WmsCarryH wmsCarryH = null; + + + if (!string.IsNullOrEmpty(input.carry_id) && !string.IsNullOrEmpty(input.carry_code)) + { + carry_id = input.carry_id; + carry_code = input.carry_code; + } + // 如果指定了carry_id + else if (!string.IsNullOrEmpty(input.carry_id)) + { + wmsCarryH = db.Queryable().Where(r => r.id == input.carry_id).First(); + carry_id = wmsCarryH.id; + carry_code = wmsCarryH.carry_code; + } + // carry_code + else if (!string.IsNullOrEmpty(input.carry_code)) + { + wmsCarryH = db.Queryable().Where(r => r.carry_code == input.carry_code).First(); + carry_id = wmsCarryH.id; + carry_code = wmsCarryH.carry_code; + } + + + if (input.visualDevInput != null) + { + //在线开发moduleConsts + VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(input.moduleConsts, true); + await _runService.Create(templateEntity, input.visualDevInput); + input.require_id = input.visualDevInput.data["ReturnIdentity"].ToString() ?? ""; + input.require_code = input.visualDevInput.data["bill_code"].ToString() ?? ""; + } + + + List preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it => + { + WmsPointH? sPoint = it.FirstOrDefault(); + WmsPointH? ePoint = it.LastOrDefault(); + + + 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 = bill_code, + status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID, + biz_type = !string.IsNullOrEmpty(input.biz_type) ? input.biz_type : "", + task_type = !string.IsNullOrEmpty(input.task_type) ? input.task_type : "", + carry_id = carry_id, + carry_code = carry_code, + area_id = sPoint?.area_id!, + area_code = it.Key, + require_id = input.require_id, + require_code = input.require_code, + create_id = _userManager.UserId, + create_time = DateTime.Now + }; + + return preTask; + }).ToList(); + //更新页面 + //赋值签收状态 + + Logger.LogInformation($"【CommonCreatePretask】 开始执行 GenPreTask {JsonConvert.SerializeObject(preTasks)}"); + bool result = await GenPreTask(preTasks, null!); + Logger.LogInformation($"【CommonCreatePretask】 GenPreTask 结果 {result}"); + if (result) + { + GenPreTaskUpInput preTaskUpInput = new() + { + RquireId = input.require_id, + CarryId = carry_id, + CarryStartLocationId = points.FirstOrDefault()!.location_id!, + CarryStartLocationCode = points.FirstOrDefault()!.location_code!, + LocationIds = points.Select(x => x.location_id).ToList()! + }; + + //根据载具移入Id,回更单据状态 + _ = await db.Updateable().SetColumns(it => new WmsMoveInstock { status = WmsWareHouseConst.BILLSTATUS_ON_ID }).Where(it => it.id == preTaskUpInput.RquireId).ExecuteCommandAsync(); + + + Expression> wmsCarryHChangeExp = a => new WmsCarryH { is_lock = 1 }; + + if (input.isChangeCarryLoc2StartLoc) + { + wmsCarryHChangeExp = a => new WmsCarryH { is_lock = 1, location_id = preTaskUpInput.CarryStartLocationId, location_code = preTaskUpInput.CarryStartLocationCode }; + } + + await GenInStockTaskHandleAfter(preTaskUpInput, + wmsCarryHChangeExp, + it => new BasLocation { is_lock = 1 }); + Logger.LogInformation($"【CommonCreatePretask】 成功生成预任务:{preTasks.First().bill_code}"); + return await ToApiResult(JNPF.Common.Enums.HttpStatusCode.OK, "成功"); + } + else + { + throw new AppFriendlyException("生成预任务失败", 500); } } - else + catch (Exception ex) { - points.Add(sPoint); - points.Add(ePoint); + Logger.LogInformation($"【CommonCreatePretask】 {ex.Message}"); + Logger.LogInformation($"【CommonCreatePretask】 {ex.StackTrace}"); + return await ToApiResult(JNPF.Common.Enums.HttpStatusCode.InternalServerError, ex.Message); } - - //根据获取的路径点生成预任务,生成顺序必须预路径算法返回的起终点的顺序一致(预任务顺序) - WmsPretaskH preTask = null; - string bill_code = await _billRullService.GetBillNumber(WmsWareHouseConst.WMS_PRETASK_H_ENCODE); - - string carry_id = ""; - string carry_code = ""; - WmsCarryH wmsCarryH = null; - - - if (!string.IsNullOrEmpty(input.carry_id) && !string.IsNullOrEmpty(input.carry_code)) + finally { - carry_id = input.carry_id; - carry_code = input.carry_code; - } - // 如果指定了carry_id - else if (!string.IsNullOrEmpty(input.carry_id)) - { - wmsCarryH = _db.Queryable().Where(r => r.id == input.carry_id).First(); - carry_id = wmsCarryH.id; - carry_code = wmsCarryH.carry_code; - } - // carry_code - else if (!string.IsNullOrEmpty(input.carry_code)) - { - wmsCarryH = _db.Queryable().Where(r => r.carry_code == input.carry_code).First(); - carry_id = wmsCarryH.id; - carry_code = wmsCarryH.carry_code; - } - - - if (input.visualDevInput != null) - { - //在线开发moduleConsts - VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(input.moduleConsts, true); - await _runService.Create(templateEntity, input.visualDevInput); - input.require_id = input.visualDevInput.data["ReturnIdentity"].ToString() ?? ""; - input.require_code = input.visualDevInput.data["bill_code"].ToString() ?? ""; - } - - - List preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it => - { - WmsPointH? sPoint = it.FirstOrDefault(); - WmsPointH? ePoint = it.LastOrDefault(); - - - preTask = new() + if (input.isExcuteMission) { - 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 = bill_code, - status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID, - biz_type = !string.IsNullOrEmpty(input.biz_type) ? input.biz_type : "", - task_type = !string.IsNullOrEmpty(input.task_type) ? input.task_type : "", - carry_id = carry_id, - carry_code = carry_code, - area_id = sPoint?.area_id!, - area_code = it.Key, - require_id = input.require_id, - require_code = input.require_code, - create_id = _userManager.UserId, - create_time = DateTime.Now - }; - - return preTask; - }).ToList(); - //更新页面 - //赋值签收状态 - - Logger.LogInformation($"【CommonCreatePretask】 开始执行 GenPreTask {JsonConvert.SerializeObject(preTasks)}"); - bool result = await GenPreTask(preTasks, null!); - Logger.LogInformation($"【CommonCreatePretask】 GenPreTask 结果 {result}"); - if (result) - { - GenPreTaskUpInput preTaskUpInput = new() - { - RquireId = input.require_id, - CarryId = carry_id, - CarryStartLocationId = points.FirstOrDefault()!.location_id!, - CarryStartLocationCode = points.FirstOrDefault()!.location_code!, - LocationIds = points.Select(x => x.location_id).ToList()! - }; - - //根据载具移入Id,回更单据状态 - _ = await _db.Updateable().SetColumns(it => new WmsMoveInstock { status = WmsWareHouseConst.BILLSTATUS_ON_ID }).Where(it => it.id == preTaskUpInput.RquireId).ExecuteCommandAsync(); - - await GenInStockTaskHandleAfter(preTaskUpInput, - it => new WmsCarryH { is_lock = 1, location_id = preTaskUpInput.CarryStartLocationId, location_code = preTaskUpInput.CarryStartLocationCode }, - it => new BasLocation { is_lock = 1 }); - Logger.LogInformation($"【CommonCreatePretask】 成功生成预任务:{preTasks.First().bill_code}"); - return await ToApiResult(JNPF.Common.Enums.HttpStatusCode.OK, "成功"); - } - return await ToApiResult(JNPF.Common.Enums.HttpStatusCode.InternalServerError, "生成预任务失败"); - } - catch (Exception ex) - { - return await ToApiResult(JNPF.Common.Enums.HttpStatusCode.InternalServerError, ex.Message); - } - finally - { - if (input.isExcuteMission) - { - GenTaskExecute(); + GenTaskExecute(); + } } } - } #endregion diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs index b3b5e44d..f9a87004 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs @@ -184,43 +184,49 @@ namespace Tnb.WarehouseMgr 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) - { - WmsCarryD wmsCarryD = new() - { - carry_id = input.carry_id, - membercarry_id = input.membercarry_id, - membercarry_code = input.membercarry_code, - loc = 1, - create_time = DateTime.Now - }; - int row = await _db.Insertable(wmsCarryD).ExecuteCommandAsync(); - isOk = row > 0; - if (!isOk) - { - throw Oops.Oh(ErrorCode.COM1001); - } - } - else - { - if (carry == null || subCarry == null) - { - throw new AppFriendlyException("没有可用的主载具", 500); - } - } - } - catch (Exception ex) + using (var db = _db.CopyNew()) { + 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) + { + WmsCarryD wmsCarryD = new() + { + carry_id = input.carry_id, + membercarry_id = input.membercarry_id, + membercarry_code = input.membercarry_code, + loc = 1, + create_time = DateTime.Now + }; + int row = await db.Insertable(wmsCarryD).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); } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs index a2734843..bcc425a1 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs @@ -63,7 +63,7 @@ namespace Tnb.WarehouseMgr - private async Task WmsEmptyOut(VisualDevModelDataCrInput input) + public async Task WmsEmptyOut(VisualDevModelDataCrInput input) { try diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdInstockHService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdInstockHService.cs index 666e1343..16e5928d 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdInstockHService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdInstockHService.cs @@ -8,11 +8,13 @@ using JNPF.Common.Core.Manager; using JNPF.Common.Dtos.VisualDev; using JNPF.Common.Enums; using JNPF.FriendlyException; +using JNPF.Systems.Interfaces.System; using JNPF.VisualDev; using JNPF.VisualDev.Entitys; using JNPF.VisualDev.Interfaces; using Microsoft.Extensions.Logging; using SqlSugar; +using Tnb.BasicData; using Tnb.BasicData.Entities; using Tnb.ProductionMgr.Entities; using Tnb.WarehouseMgr.Entities; @@ -31,14 +33,16 @@ namespace Tnb.WarehouseMgr private readonly IRunService _runService; private readonly IVisualDevService _visualDevService; private readonly IWareHouseService _wareHouseService; + private readonly IBillRullService _billRullService; public WmsPrdInstockHService(ISqlSugarRepository repository, IRunService runService, - IVisualDevService visualDevService, IWareHouseService wareHouseService) + IVisualDevService visualDevService, IWareHouseService wareHouseService, IBillRullService billRullService) { _db = repository.AsSugarClient(); _runService = runService; _visualDevService = visualDevService; _wareHouseService = wareHouseService; + _billRullService = billRullService; } /// @@ -58,16 +62,26 @@ namespace Tnb.WarehouseMgr // 新建主表 if (prdInstockH == null) { - VisualDevModelDataCrInput visualDevInput = new VisualDevModelDataCrInput(); - visualDevInput.data = new Dictionary(); - visualDevInput.data.Add("bill_code", ""); + string bill_code = await _billRullService.GetBillNumber(CodeTemplateConst.PRDOUTSTOCK_CODE); - visualDevInput.data.Add("status", WmsWareHouseConst.BILLSTATUS_ADD_ID); + WmsPrdInstockH wmsPrdInstockH = new (); + wmsPrdInstockH.create_id = ""; + wmsPrdInstockH.create_time = DateTime.Now; + wmsPrdInstockH.prd_bill_code = input.prd_bill_code; + wmsPrdInstockH.bill_code = bill_code; + wmsPrdInstockH.material_id = input.material_id; + wmsPrdInstockH.material_code = input.material_code; + wmsPrdInstockH.material_name = input.material_name; + wmsPrdInstockH.material_spec = input.material_spec; + wmsPrdInstockH.planqty = input.planqty; + wmsPrdInstockH.pqty = input.pqty; + wmsPrdInstockH.rqty = input.rqty; + wmsPrdInstockH.type = input.type; + //wmsPrdInstockH.status = WmsWareHouseConst.BILLSTATUS_ADD_ID; - VisualDevEntity? templateEntity = await _visualDevService.GetInfoById(ModuleConsts.MODULE_WMSPRDINSTOCK_ID, true); - await _runService.Create(templateEntity, visualDevInput); + await _db.Insertable(wmsPrdInstockH).ExecuteCommandAsync(); - prd_instock_code_id = visualDevInput.data["ReturnIdentity"].ToString() ?? ""; + prd_instock_code_id = wmsPrdInstockH.id; } else { @@ -77,7 +91,7 @@ namespace Tnb.WarehouseMgr { pqty = input.pqty, rqty = input.rqty - }).ExecuteCommandAsync(); + }).Where(r => r.id == prd_instock_code_id).ExecuteCommandAsync(); } List WmsPrdInstockDs = new List(); @@ -154,10 +168,14 @@ namespace Tnb.WarehouseMgr } } + WmsCarryH wmsCarryH = await _db.Queryable().Where(r => r.id == wmsPrdInstockD.carry_id).FirstAsync(); + // 生成到输送线任务 CommonCreatePretaskInput commonCreatePretaskInput1 = new CommonCreatePretaskInput(); commonCreatePretaskInput1.startlocation_id = startLocation.id; commonCreatePretaskInput1.endlocation_id = endlocation_ssx.id; + commonCreatePretaskInput1.carry_id = wmsCarryH.id; + commonCreatePretaskInput1.carry_code = wmsCarryH.carry_code; commonCreatePretaskInput1.task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID; commonCreatePretaskInput1.biz_type = ""; commonCreatePretaskInput1.require_id = wmsPrdInstockD.id; @@ -168,10 +186,13 @@ namespace Tnb.WarehouseMgr CommonCreatePretaskInput commonCreatePretaskInput2 = new CommonCreatePretaskInput(); commonCreatePretaskInput2.startlocation_id = startlocation_id_ssx; commonCreatePretaskInput2.endlocation_id = endLocation.id; + commonCreatePretaskInput2.carry_id = wmsCarryH.id; + commonCreatePretaskInput2.carry_code = wmsCarryH.carry_code; commonCreatePretaskInput2.task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID; commonCreatePretaskInput2.biz_type = WmsWareHouseConst.BIZTYPE_WMSPRDINSTOCK_ID; commonCreatePretaskInput2.require_id = wmsPrdInstockD.id; commonCreatePretaskInput2.isExcuteMission = false; + commonCreatePretaskInput1.isChangeCarryLoc2StartLoc = false; Entities.Dto.Outputs.Result res2 = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput2); }