From 082feb0dd3f683021e4a03676b41ce8cfd47e174 Mon Sep 17 00:00:00 2001 From: majian <780924089@qq.com> Date: Tue, 21 May 2024 09:25:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8E=9F=E6=9D=90=E6=96=99=E4=BB=93=E5=8F=A0?= =?UTF-8?q?=E7=9B=98=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Tnb.ProductionMgr/RedisBackGround.cs | 590 ++++++++++++------ .../Dto/Inputs/CommonCreatePretaskInput.cs | 25 + .../Tnb.WarehouseMgr/WareHouseService.cs | 150 ++++- .../Tnb.WarehouseMgr/WmsDeliveryService.cs | 8 + .../Configurations/ConnectionStrings.json | 4 +- common/Tnb.Common/Utils/HttpClientHelper.cs | 1 + 6 files changed, 588 insertions(+), 190 deletions(-) create mode 100644 WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CommonCreatePretaskInput.cs diff --git a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs index abd6b7b6..f3318193 100644 --- a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs +++ b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs @@ -51,11 +51,15 @@ namespace Tnb.ProductionMgr private Timer? CheckGettimer; private Timer? Scantimer; private Timer? SSXcodetimer; + // 八工位缓存区补充空托盘 + private Timer? BGWCarrySupplementtimer; + // 供料叠盘机空托盘自动入库 + private Timer? YCLGLDPJInstocktimer; + // 外协叠盘机空托盘自动入库 + private Timer? YCLWXDPJInstocktimer; // 二楼上升降机 private Timer? Floor2UpMachinecodetimer; - // 二楼下升降机 - private Timer? Floor2DownMachinecodetimer; // 二楼料架配送 private Timer? Floor2RackDeliverytimer; @@ -92,6 +96,10 @@ namespace Tnb.ProductionMgr try { var json = _redisData.GetHash(config.dev_name!, config.tag_name!).Result; + if (json == null) + { + continue; + } JObject? res = JsonConvert.DeserializeObject(json); if (config.data_type == (int)DataType.INT) { @@ -182,6 +190,10 @@ namespace Tnb.ProductionMgr var strs = getdic.Where(p => p.Key == key).First().Value; bool flag = _redisData.HashExist(strs[0], strs[1]).Result; string data = _redisData.GetHash(strs[0], strs[1]).Result; + if (data == null) + { + continue; + } JObject? res = JsonConvert.DeserializeObject(data); bool result = res != null && res["Value"] != null ? res.Value("Value") : false; @@ -190,6 +202,10 @@ namespace Tnb.ProductionMgr if (!string.IsNullOrEmpty(strs[2])) { string codedata = _redisData.GetHash(strs[0], strs[2]).Result; + if (codedata == null) + { + continue; + } JObject? coderes = JsonConvert.DeserializeObject(codedata); string coderesult = coderes != null && coderes["Value"] != null ? coderes.Value("Value")! : ""; coderesult = coderesult.Replace("\r", ""); @@ -362,8 +378,46 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA })).CreateLogger(this.GetType()); + protected ILogger LoggerBGWCarrySupplement => LoggerFactory.Create(builder => builder.AddFile($"{AppContext.BaseDirectory}/logs/customBGWCarrySupplement{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"; + 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()); + #endregion + #region 八工位 + //扫码入库 private void ScanInStock(object state) { @@ -377,6 +431,10 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA var strs = getdic.Where(p => p.Key == key).First().Value; bool flag = _redisData.HashExist(strs[0], strs[1]).Result; string data = _redisData.GetHash(strs[0], strs[1]).Result; + if (data == null) + { + continue; + } JObject? res = JsonConvert.DeserializeObject(data); @@ -393,7 +451,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA ["Value"] = strs[4], }; Logger.LogInformation($"【ScanInStock】 八工位 {key} 发送PutDoneEmptyBox指令 {_eleCtlCfg.WriteTagUrl} {JsonConvert.SerializeObject(dicCommand)}"); - HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand).Wait(); + HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand).Wait(); string codedata = _redisData.GetHash(strs[0], strs[2]).Result; Logger.LogInformation($"【ScanInStock】 八工位 {key} 获取到扫码信息: {codedata}"); JObject? coderes = JsonConvert.DeserializeObject(codedata); @@ -402,18 +460,18 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA Logger.LogInformation($"【ScanInStock】 八工位 {key} 查找{coderesult}绑定的托盘: {JsonConvert.SerializeObject(carry)}"); if (carry != null) { - if (_repository.AsSugarClient().Queryable().Where(p => p.carry_id == carry.id && p.status != WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID ).Any()) + if (_repository.AsSugarClient().Queryable().Where(p => p.carry_id == carry.id && p.status != WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID).Any()) { Logger.LogInformation($"【ScanInStock】 八工位 {key} 托盘 {carry.id} 对应的执行任务状态(status)不是26126860808229(已完成),此时不能执行入库"); continue; } - + var WmsCarryCode = _repository.AsSugarClient().Queryable().Where(it => it.carry_id == carry.id).OrderByDescending(it => it.id).First(); - // 用适当的字段替换 YourTimestampField - + // 用适当的字段替换 YourTimestampField + if (WmsCarryCode != null) { - Logger.LogInformation($"【ScanInStock】 八工位 {key} 查找到托盘{carry.id}在WmsCarryCode中存在"); + Logger.LogInformation($"【ScanInStock】 八工位 {key} 查找到托盘{carry.carry_code}在WmsCarryCode中存在"); VisualDevModelDataCrInput input = new VisualDevModelDataCrInput(); input.data = new Dictionary(); @@ -440,6 +498,272 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA } } + /// + /// 八工位空托盘补充 + /// + private async void BGWCarrySupplement(object state) + { + Dictionary getdic = new Dictionary(); + getdic.Add("YCLCKBGW", new string[] { "CP8", "AllowPutEmptyBox1" }); + + 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($"【BGWCarrySupplementtimer】 八工位 {key} {strs[1]}采集到 {res["Value"]}"); + + BasLocation endLocation = _repository.AsSugarClient().Queryable().Where(r => r.location_code == key).First(); + if (endLocation == null) + { + LoggerBGWCarrySupplement.LogWarning($"【BGWCarrySupplementtimer】 {key}未维护库位信息"); + continue; + } + if (endLocation.is_lock == 1) + { + LoggerBGWCarrySupplement.LogInformation($"【BGWCarrySupplementtimer】 八工位 {key} 已锁定"); + 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 + { + wmsPoint = a, + FirstWmsCarryH = c + }); + + LoggerBGWCarrySupplement.LogInformation($"【BGWCarrySupplementtimer】 sql {wmsPoint.ToSqlString()}"); + + 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; + } + + //锁定起点库位 + await _repository.AsSugarClient().Updateable().SetColumns(r => r.is_lock == 1).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 == endPoint.location_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) + { + LoggerBGWCarrySupplement.LogWarning($"【BGWCarrySupplementtimer】 {startPoint.location_code} 到 {endPoint.location_code} 预任务生成失败 "); + continue; + } + LoggerBGWCarrySupplement.LogWarning($"【BGWCarrySupplementtimer】 {startPoint.location_code} 到 {endPoint.location_code} 预任务生成成功"); + + + _ = _wareHouseService.GenTaskExecute(); + } + } + catch (Exception ex) + { + LoggerBGWCarrySupplement.LogInformation($"【BGWCarrySupplementtimer】 八工位空托盘补充发生异常:{ex}"); + } + } + } + + /// + /// 供料叠盘机空托盘自动入库 + /// + private async void YCLGLDPJInstock(object state) + { + Dictionary getdic = new Dictionary(); + getdic.Add("SGW-YCL", new string[] { "CP3-3", "AllowGetFullBox" }); + + 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) + { + LoggerYCLGLDPJInstock.LogInformation($"【YCLGLDPJInstock】 三工位叠盘机 {key} {strs[1]}采集到 {res["Value"]}"); + + BasLocation endLocation = _repository.AsSugarClient().Queryable().Where(r => r.location_code == key).First(); + if (endLocation == null) + { + LoggerYCLGLDPJInstock.LogWarning($"【YCLGLDPJInstock】 {key}未维护库位信息"); + continue; + } + if (endLocation.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-")); + + LoggerYCLGLDPJInstock.LogInformation($"【YCLGLDPJInstock】 sql {wmsPoint.ToSqlString()}"); + + if (wmsPoint.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; + } + + //锁定起点库位 更新为空闲 + 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 }).Where(r => r.id == endPoint.location_id).ExecuteCommandAsync(); + + List points = new List(); + points.Add(startPoint); + points.Add(endPoint); + + Tuple result_createPretask = await createPretask(points, "", "", LoggerYCLGLDPJInstock); + if (!result_createPretask.Item1) + { + LoggerYCLGLDPJInstock.LogWarning($"【YCLGLDPJInstock】 {startPoint.location_code} 到 {endPoint.location_code} 预任务生成失败"); + continue; + } + LoggerYCLGLDPJInstock.LogWarning($"【YCLGLDPJInstock】 {startPoint.location_code} 到 {endPoint.location_code} 预任务生成成功"); + + + _ = _wareHouseService.GenTaskExecute(); + } + } + catch (Exception ex) + { + LoggerYCLGLDPJInstock.LogInformation($"【YCLGLDPJInstock】 三工位叠盘机空托入库发生异常:{ex}"); + } + } + } + + /// + /// 外协叠盘机空托盘自动入库 + /// + private async void YCLWXDPJInstock(object state) + { + Dictionary getdic = new Dictionary(); + getdic.Add("未定", new string[] { "CP3-3", "AllowGetFullBox" }); + + 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) + { + LoggerYCLGLDPJInstock.LogInformation($"【YCLGLDPJInstock】 外协叠盘机 {key} {strs[1]}采集到 {res["Value"]}"); + + BasLocation endLocation = _repository.AsSugarClient().Queryable().Where(r => r.location_code == key).First(); + if (endLocation == null) + { + LoggerYCLGLDPJInstock.LogWarning($"【YCLGLDPJInstock】 {key}未维护库位信息"); + continue; + } + if (endLocation.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-")); + + LoggerYCLGLDPJInstock.LogInformation($"【YCLGLDPJInstock】 sql {wmsPoint.ToSqlString()}"); + + if (wmsPoint.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; + } + + //锁定起点库位 更新为空闲 + 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 }).Where(r => r.id == endPoint.location_id).ExecuteCommandAsync(); + + List points = new List(); + points.Add(startPoint); + points.Add(endPoint); + + Tuple result_createPretask = await createPretask(points, "", "", LoggerYCLGLDPJInstock); + if (!result_createPretask.Item1) + { + LoggerYCLGLDPJInstock.LogWarning($"【YCLGLDPJInstock】 {startPoint.location_code} 到 {endPoint.location_code} 预任务生成失败"); + continue; + } + LoggerYCLGLDPJInstock.LogWarning($"【YCLGLDPJInstock】 {startPoint.location_code} 到 {endPoint.location_code} 预任务生成成功"); + + + _ = _wareHouseService.GenTaskExecute(); + } + } + catch (Exception ex) + { + LoggerYCLGLDPJInstock.LogInformation($"【YCLGLDPJInstock】 外协叠盘机空托入库发生异常:{ex}"); + } + } + } + + + #endregion + + #region 中储仓 + private void SSXcode(object state) { Dictionary dic = new Dictionary(); @@ -453,14 +777,22 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA { var strs = dic.Where(p => p.Key == key).First().Value; string dataflag = _redisData.GetHash(key, strs[0]).Result; + if (dataflag == null) + { + continue; + } JObject? resflag = JsonConvert.DeserializeObject(dataflag); //Logger.LogInformation($"【定时任务SSXcode】 {key}->{strs[0]} 采集结果:{resflag}"); - bool re = resflag != null && resflag["Value"] != null ? resflag.Value("Value") : false; + bool re = resflag != null && resflag["Value"] != null ? resflag.Value("Value") : false; if (!re) continue; string data = _redisData.GetHash(key, strs[1]).Result; + if (data == null) + { + continue; + } JObject? res = JsonConvert.DeserializeObject(data); //Logger.LogInformation($"【定时任务SSXcode】 {key}->{strs[1]} 采集结果:{res}"); string? result = res != null && res["Value"] != null ? res.Value("Value") : ""; @@ -500,7 +832,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA ["DevName"] = key, ["token"] = _eleCtlCfg.token, ["TagName"] = strs[3], - ["Value"] = "13", + ["Value"] = "13", }; HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand2).Wait(); Dictionary dicCommand = new(StringComparer.OrdinalIgnoreCase) @@ -522,6 +854,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA } } + #endregion + public void Dispose() { Readtimer?.Dispose(); @@ -529,9 +863,11 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA Scantimer?.Dispose(); SSXcodetimer?.Dispose(); Floor2UpMachinecodetimer?.Dispose(); - Floor2DownMachinecodetimer?.Dispose(); - Floor2RackDeliverytimer.Dispose(); - } + Floor2RackDeliverytimer?.Dispose(); + BGWCarrySupplementtimer?.Dispose(); + YCLGLDPJInstocktimer?.Dispose(); + YCLWXDPJInstocktimer?.Dispose(); + } #region 二楼上升降机机械臂 // 上升降机 @@ -691,131 +1027,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA } } - - - //private async void Floor2DownMachinecode(object args) - //{ - // using (var db = _repository.AsSugarClient().CopyNew()) - // { - - // // 读取上升降机的左右料架区配置 - // string[] configs = new string[2] { "二楼下升降机机械臂左", "二楼下升降机机械臂右" }; - - // // 左右料架区配置 - // List WmsMechanicalArmHs = db.Queryable() - // .Where(r => configs.Contains(r.name) && r.mechanicalconfirm == 1 && r.stackingcount < r.maxnum).ToList(); - - // // 是否可以放货 - // if (WmsMechanicalArmHs.Count == 0) - // { - // //LoggerFloor2UpDownMachine.LogWarning($@"【下升降机】目前没有可以取货的料架区"); - // return; - // } - - // WmsMechanicalArmH target; - // target = WmsMechanicalArmHs.First(); - - - // // 待拆垛列表 - // List 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 (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}"); - - // await db.Ado.BeginTranAsync(); - // try - // { - // LoggerFloor2UpDownMachine.LogInformation($@"【下升降机】当前条码目标料架区为 {JsonConvert.SerializeObject(target)}"); - - // // 料架信息 - // WmsCarryH rack = db.Queryable().Where(r => r.id == target.rackid).ToList()[0]; - - // // 料箱信息 - // WmsCarryH LX = db.Queryable().Where(r => r.carry_code == barcode).ToList()[0]; - - - // 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); - - - - // await db.Ado.CommitTranAsync(); - - // } - // 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] { "二楼上升降机机械臂左", "二楼上升降机机械臂右" }; - - // // 找到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 result上升降机空托送到 = await Floor2UpDownMachinecode_SetTag($"上升降机空托{wmsMechanicalArmH.stackingposition}送到", "true"); - // LoggerFloor2UpDownMachine.LogInformation($@"【送空托到上升降区】回写 上升降机空托{wmsMechanicalArmH.stackingposition}送到 结果为{result上升降机空托送到}"); - // if (!result上升降机空托送到) - // { - // return false; - // } - - // // 绑定料架 - // await db.Updateable().SetColumns(r => new WmsMechanicalArmH - // { - // mechanicalconfirm = 1 - // }).Where(r => r.id == wmsMechanicalArmH.id).ExecuteCommandAsync(); - // } - - // return true; - // } - //} - - /// - /// 检查机械臂料架区信号(上升降机满托1送到) + /// 检查机械臂料架区信号(下升降机满托1送到) /// /// public async Task 检查机械臂料架区信号_下升降机满托1送到() @@ -831,15 +1044,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA foreach (WmsMechanicalArmH wmsMechanicalArmH in WmsMechanicalArmHsuagar.ToList()) { - // 尝试写入满托送到信号 - bool result上升降机空托送到 = await Floor2UpDownMachinecode_SetTag($"下升降机满托{wmsMechanicalArmH.stackingposition}送到", "true"); - LoggerFloor2UpDownMachine.LogInformation($@"【送满托到下升降区】回写 下升降机满托{wmsMechanicalArmH.stackingposition}送到 结果为{result上升降机空托送到}"); - if (!result上升降机空托送到) - { - return false; - } - - int LXCount = db.Queryable() .Where(a => a.carry_id == wmsMechanicalArmH.rackid).Count(); + 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}"); @@ -847,6 +1052,15 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA { throw new Exception($@"【送满托到下升降区】设定升降机满托{wmsMechanicalArmH.stackingposition}满托数量为 {LXCount} 结果为 {result}"); } + + // 尝试写入满托送到信号 + bool result下升降机空托送到 = await Floor2UpDownMachinecode_SetTag($"下升降机满托{wmsMechanicalArmH.stackingposition}送到", "true"); + LoggerFloor2UpDownMachine.LogInformation($@"【送满托到下升降区】回写 下升降机满托{wmsMechanicalArmH.stackingposition}送到 结果为{result下升降机空托送到}"); + if (!result下升降机空托送到) + { + return false; + } + // 绑定料架 await db.Updateable().SetColumns(r => new WmsMechanicalArmH { @@ -882,7 +1096,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA string[] configs_upMachine = new string[2] { "二楼上升降机机械臂左", "二楼上升降机机械臂右" }; // 找到没有绑定料架的且库位未锁定的料架区 - ISugarQueryable WmsMechanicalArmHsuagar = _repository.AsSugarClient().Queryable(). + 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)); @@ -898,13 +1112,9 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA // 料架区 foreach (WmsMechanicalArmH wmsMechanicalArmH in WmsMechanicalArmHs) { - - LoggerFloor2RackDelivery.LogInformation($"【送空托到上升降区】 即将补充料架区{wmsMechanicalArmH.name}"); - - // 找到占用且未锁定的库位上的空料架 ISugarQueryable rackStartLocations = - _repository.AsSugarClient().Queryable() + db.Queryable() .InnerJoin((a, b) => a.id == b.location_id) .LeftJoin((a, b, c) => b.id == c.carry_id) .Where((a, b, c) => a.wh_id == "33780009364245" && a.is_use == "1" && a.is_lock == 0 && string.IsNullOrEmpty(c.id) @@ -915,10 +1125,11 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA LoggerFloor2RackDelivery.LogWarning($"【送空托到上升降区】 暂存仓中没有可用的空料架 {rackStartLocations.ToSqlString()}"); continue; } + LoggerFloor2RackDelivery.LogInformation($"【送空托到上升降区】 即将补充料架区{wmsMechanicalArmH.name}"); BasLocation startLocation = rackStartLocations.First(); - List startPoints = _repository.AsSugarClient().Queryable().Where(r => r.location_id == startLocation.id).ToList(); + List startPoints = db.Queryable().Where(r => r.location_id == startLocation.id).ToList(); if (startPoints.Count == 0) { @@ -926,7 +1137,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA continue; } - List endPoints = _repository.AsSugarClient().Queryable().Where(r => r.id == wmsMechanicalArmH.point_id).ToList(); + List endPoints = db.Queryable().Where(r => r.id == wmsMechanicalArmH.point_id).ToList(); if (endPoints.Count == 0) { @@ -934,7 +1145,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA continue; } - List wmsCarryHs = _repository.AsSugarClient().Queryable().Where(r => r.location_id == startLocation.id).ToList(); + List wmsCarryHs = db.Queryable().Where(r => r.location_id == startLocation.id).ToList(); if (wmsCarryHs.Count == 0) { LoggerFloor2RackDelivery.LogError($"【送空托到上升降区】 起点{startLocation.id} {startLocation.location_code}上找不到料架"); @@ -953,11 +1164,11 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA WmsPointH startPoint = startPoints.First(); WmsPointH endPoint = endPoints.First(); - await _repository.AsSugarClient().Updateable().SetColumns(r => new BasLocation + await db.Updateable().SetColumns(r => new BasLocation { is_lock = 1 }).Where(r => r.id == startLocation.id).ExecuteCommandAsync(); - await _repository.AsSugarClient().Updateable().SetColumns(r => new BasLocation + await db.Updateable().SetColumns(r => new BasLocation { is_lock = 1 }).Where(r => r.id == endPoint.location_id).ExecuteCommandAsync(); @@ -972,7 +1183,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA points.Add(startPoint); points.Add(endPoint); - Tuple result = await Floor2UpDownMachinecode_createPretask(points, targetCarry.id, targetCarry.carry_code); + Tuple result = await createPretask(points, targetCarry.id, targetCarry.carry_code, LoggerFloor2RackDelivery); if (!result.Item1) { continue; @@ -993,8 +1204,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA { string[] configs_upMachine = new string[2] { "二楼下升降机机械臂左", "二楼下升降机机械臂右" }; - // 找到没有绑定料架的且点位未锁定的料架区 - ISugarQueryable WmsMechanicalArmHsuagar = _repository.AsSugarClient().Queryable(). + // 找到没有绑定料架的且库位未锁定的料架区 + 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)); @@ -1021,7 +1232,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA // 找到占用且未锁定的库位上的满料架且料架中的料箱是空的 List rackStartLocations = - _repository.AsSugarClient().Queryable() + db.Queryable() .InnerJoin((a, b) => a.id == b.location_id) .LeftJoin((a, b, c) => b.id == c.carry_id) // 有料箱 .LeftJoin((a, b, c, d) => c.membercarry_id == d.carry_id) @@ -1058,7 +1269,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA BasLocation startLocation = rackStartLocations.First(); - List startPoints = _repository.AsSugarClient().Queryable().Where(r => r.location_id == startLocation.id).ToList(); + List startPoints = db.Queryable().Where(r => r.location_id == startLocation.id).ToList(); if (startPoints.Count == 0) { @@ -1066,7 +1277,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA return false; } - List endPoints = _repository.AsSugarClient().Queryable().Where(r => r.id == wmsMechanicalArmH.point_id).ToList(); + List endPoints = db.Queryable().Where(r => r.id == wmsMechanicalArmH.point_id).ToList(); if (endPoints.Count == 0) { @@ -1074,7 +1285,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA return false; } - List wmsCarryHs = _repository.AsSugarClient().Queryable().Where(r => r.location_id == startLocation.id).ToList(); + List wmsCarryHs = db.Queryable().Where(r => r.location_id == startLocation.id).ToList(); if (wmsCarryHs.Count == 0) { LoggerFloor2RackDelivery.LogError($"【送满托到下升降区】 起点{startLocation.id} {startLocation.location_code}上找不到料架"); @@ -1093,12 +1304,12 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA WmsPointH startPoint = startPoints.First(); WmsPointH endPoint = endPoints.First(); - await _repository.AsSugarClient().Updateable().SetColumns(r => new BasLocation + await db.Updateable().SetColumns(r => new BasLocation { is_lock = 1 }).Where(r => r.id == startLocation.id).ExecuteCommandAsync(); - await _repository.AsSugarClient().Updateable().SetColumns(r => new BasLocation + await db.Updateable().SetColumns(r => new BasLocation { is_lock = 1 }).Where(r => r.id == endPoint.location_id).ExecuteCommandAsync(); @@ -1113,7 +1324,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA points.Add(startPoint); points.Add(endPoint); - Tuple result = await Floor2UpDownMachinecode_createPretask(points, targetCarry.id, targetCarry.carry_code); + Tuple result = await createPretask(points, targetCarry.id, targetCarry.carry_code, LoggerFloor2RackDelivery); if (!result.Item1) { throw new Exception("【送满托到下升降区】 未成功生成预任务"); @@ -1135,7 +1346,7 @@ 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) && r.mechanicalconfirm == 1).ToList(); + 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) { @@ -1151,14 +1362,14 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA return false; } - await _repository.AsSugarClient().Updateable().SetColumns(r => new WmsMechanicalArmH + await db.Updateable().SetColumns(r => new WmsMechanicalArmH { iscreatepretask = 1 }).Where(r => r.id == wmsMechanicalArmH.id).ExecuteCommandAsync(); List points = new List(); - List startPoints = _repository.AsSugarClient().Queryable().Where(r => r.id == wmsMechanicalArmH.point_id).ToList(); + List startPoints = db.Queryable().Where(r => r.id == wmsMechanicalArmH.point_id).ToList(); if (startPoints.Count == 0) { @@ -1171,7 +1382,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA // 找到未占用且未锁定的库位 ISugarQueryable rackEndLocations = - _repository.AsSugarClient().Queryable() + db.Queryable() .Where(r => r.wh_id == "33780009364245" && r.is_use == "0" && r.is_lock == 0).OrderBy(a => a.id).Take(1); if (rackEndLocations.Count() == 0) @@ -1182,7 +1393,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA BasLocation endLocation = rackEndLocations.First(); - List endPoints = _repository.AsSugarClient().Queryable().Where(r => r.location_id == endLocation.id).ToList(); + List endPoints = db.Queryable().Where(r => r.location_id == endLocation.id).ToList(); if (endPoints.Count == 0) { @@ -1205,7 +1416,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA LoggerFloor2RackDelivery.LogInformation($"【移走上升降区满托的料架】 开始执行预任务生成: 料架区为{wmsMechanicalArmH.name}{wmsMechanicalArmH.stackingposition} 料架为{wmsMechanicalArmH.rackcode}"); - Tuple result = await Floor2UpDownMachinecode_createPretask(points, wmsMechanicalArmH.rackid, wmsMechanicalArmH.rackcode); + Tuple result = await createPretask(points, wmsMechanicalArmH.rackid, wmsMechanicalArmH.rackcode, LoggerFloor2RackDelivery); if (!result.Item1) { throw new Exception("未成功生成预任务"); @@ -1240,7 +1451,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA string[] configs_upMachine = new string[2] { "二楼下升降机机械臂左", "二楼下升降机机械臂右" }; // 读取下升降机的左右料架区配置 - List WmsMechanicalArmHs = _repository.AsSugarClient().Queryable().Where(r => !string.IsNullOrEmpty(r.rackcode) && r.iscreatepretask == 0 && configs_upMachine.Contains(r.name)).ToList(); + List WmsMechanicalArmHs = db.Queryable().Where(r => !string.IsNullOrEmpty(r.rackcode) && r.iscreatepretask == 0 && configs_upMachine.Contains(r.name)).ToList(); foreach (WmsMechanicalArmH wmsMechanicalArmH in WmsMechanicalArmHs) { @@ -1256,14 +1467,14 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA LoggerFloor2RackDelivery.LogInformation($"【移走下升降区空托的料架】 开始执行预任务生成 {wmsMechanicalArmH.point_code} {wmsMechanicalArmH.outbill} {wmsMechanicalArmH.barcodes}"); - await _repository.AsSugarClient().Updateable().SetColumns(r => new WmsMechanicalArmH + await db.Updateable().SetColumns(r => new WmsMechanicalArmH { iscreatepretask = 1 }).Where(r => r.id == wmsMechanicalArmH.id).ExecuteCommandAsync(); List points = new List(); - List startPoints = _repository.AsSugarClient().Queryable().Where(r => r.id == wmsMechanicalArmH.point_id).ToList(); + List startPoints = db.Queryable().Where(r => r.id == wmsMechanicalArmH.point_id).ToList(); if (startPoints.Count == 0) { @@ -1276,7 +1487,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA // 找到未占用且未锁定的库位 ISugarQueryable rackEndLocations = - _repository.AsSugarClient().Queryable() + db.Queryable() .Where(r => r.wh_id == "33780009364245" && r.is_use == "0" && r.is_lock == 0).OrderBy(a => a.id).Take(1); if (rackEndLocations.Count() == 0) @@ -1287,7 +1498,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA BasLocation endLocation = rackEndLocations.First(); - List endPoints = _repository.AsSugarClient().Queryable().Where(r => r.location_id == endLocation.id).ToList(); + List endPoints = db.Queryable().Where(r => r.location_id == endLocation.id).ToList(); if (endPoints.Count == 0) { @@ -1318,7 +1529,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA LoggerFloor2RackDelivery.LogInformation($"【移走下升降区空托的料架】 开始执行预任务生成: 料架区为{wmsMechanicalArmH.name}{wmsMechanicalArmH.stackingposition} 料架为{wmsMechanicalArmH.rackcode}"); - Tuple result = await Floor2UpDownMachinecode_createPretask(points, wmsMechanicalArmH.rackid, wmsMechanicalArmH.rackcode); + Tuple result = await createPretask(points, wmsMechanicalArmH.rackid, wmsMechanicalArmH.rackcode, LoggerFloor2RackDelivery); if (!result.Item1) { throw new Exception("未成功生成预任务"); @@ -1338,7 +1549,6 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA // 料架配送 private async void Floor2RackDelivery(object args) { - var db = _repository.AsSugarClient().CopyNew(); try { // 检查机械臂料架区信号(上升降机空托1送到) @@ -1372,7 +1582,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA // 上下升降机生成预任务(补充料架、上升降机取货到料架、上升降机满托运走,下升降机拿货到输送线、下升降机空托运走) - private async Task> Floor2UpDownMachinecode_createPretask(List points, string carry_id, string carry_code) + private async Task> createPretask(List points, string carry_id, string carry_code, ILogger logger) { //根据获取的路径点生成预任务,生成顺序必须预路径算法返回的起终点的顺序一致(预任务顺序) WmsPretaskH preTask = null; @@ -1481,13 +1691,19 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA CheckGettimer = new Timer(CheckGet, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); Scantimer = new Timer(ScanInStock, null, TimeSpan.Zero, TimeSpan.FromSeconds(60)); SSXcodetimer = new Timer(SSXcode, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); + //// 八工位缓存区补充空托盘 + //BGWCarrySupplementtimer = new Timer(BGWCarrySupplement, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); - // 二楼上升降机 - 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(30)); + //// 供料叠盘机空托盘自动入库 + //YCLGLDPJInstocktimer = new Timer(YCLGLDPJInstock, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); + + ////// 外协叠盘机空托盘自动入库 + ////YCLWXDPJInstocktimer = new Timer(YCLWXDPJInstock, null, TimeSpan.Zero, TimeSpan.FromSeconds(100000)); + + //// 二楼上升降机 + //Floor2UpMachinecodetimer = new Timer(Floor2UpMachinecode, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); + //// 二楼料架配送 + //Floor2RackDeliverytimer = new Timer(Floor2RackDelivery, 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 new file mode 100644 index 00000000..66a662f3 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/CommonCreatePretaskInput.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tnb.WarehouseMgr.Entities.Dto.Inputs +{ + public class CommonCreatePretaskInput + { + public string startlocation_id { get; set; } + + public string endlocation_id { get; set; } + + public string carry_id { get; set; } + + public string carry_code { get; set; } + + public string biz_type { get; set; } + + public string task_type { get; set; } + } + +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index 7c7727f3..86caedaa 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -1,9 +1,11 @@ -using System.Diagnostics; +using System; +using System.Diagnostics; using System.Dynamic; using System.Linq; using System.Linq.Expressions; using System.Net; using System.Security.Policy; +using System.Text; using System.Threading.Tasks; using Aop.Api.Domain; using Aspose.Cells; @@ -35,6 +37,7 @@ using Tnb.Common.Extension; using Tnb.Common.Redis; using Tnb.Common.Utils; using Tnb.ProductionMgr.Entities; +using Tnb.QcMgr.Entities; using Tnb.WarehouseMgr.Entities; using Tnb.WarehouseMgr.Entities.Configs; using Tnb.WarehouseMgr.Entities.Consts; @@ -2249,6 +2252,11 @@ namespace Tnb.WarehouseMgr if (endLocations?.Count > 0) { WmsCarryH carry = await _db.Queryable().SingleAsync(it => it.carry_code == wmsCarryD.membercarry_code); + await _db.Updateable().SetColumns(r => new WmsCarryH + { + location_id = startLocation.id, + location_code = startLocation.location_code, + }).Where(r => r.id == carry.id).ExecuteCommandAsync(); //if (carry.carry_status == "1") //{ // throw new AppFriendlyException("载具已占用!", 500); @@ -2349,5 +2357,145 @@ namespace Tnb.WarehouseMgr } } #endregion + + + #region 通用接口 + + /// + /// 生成预任务接口 CTU需要传task_type + /// + /// + /// + [HttpPost, NonUnify, AllowAnonymous] + public async Task CommonCreatePretask(CommonCreatePretaskInput input) + { + Logger.LogInformation($"【createPretask】 接收到请求 参数:{JsonConvert.SerializeObject(input)}"); + try + { + WmsPointH? sPoint = null; + WmsPointH? ePoint = null; + + 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); + } + + 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 = _billRullService.GetBillNumber(WmsWareHouseConst.WMS_PRETASK_H_ENCODE).GetAwaiter().GetResult(); + List preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it => + { + WmsPointH? sPoint = it.FirstOrDefault(); + WmsPointH? ePoint = it.LastOrDefault(); + + 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_code + else if (!string.IsNullOrEmpty(input.carry_code)) + { + wmsCarryH = _db.Queryable().Where(r => r.carry_code == input.carry_code).First(); + } + // 如果carry_id和carry_code都没有指定,随机取库位上载具记录的一条 + else + { + wmsCarryH = _db.Queryable().InnerJoin((a, b) => a.id == b.location_id) + .Where((a, b) => a.id == sPoint.location_id).Select((a, b) => b).First(); + } + + if (wmsCarryH != null) + { + carry_id = wmsCarryH.id; + carry_code = wmsCarryH.carry_code; + } + + if (string.IsNullOrEmpty(carry_id)) + { + throw new AppFriendlyException("起点库位上没有载具", 500); + } + + 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 = "", + require_code = "", + create_id = _userManager.UserId, + create_time = DateTime.Now + }; + + return preTask; + }).ToList(); + //更新页面 + //赋值签收状态 + + Logger.LogInformation($"【createPretask】 开始执行 GenPreTask {JsonConvert.SerializeObject(preTasks)}"); + bool result = await GenPreTask(preTasks, null!); + Logger.LogInformation($"【createPretask】 GenPreTask 结果 {result}"); + if (result) + { + Logger.LogInformation($"【createPretask】 成功生成预任务:{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 + { + await GenTaskExecute(); + } + + } + #endregion + } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsDeliveryService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsDeliveryService.cs index 86e185a3..a39fea20 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsDeliveryService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsDeliveryService.cs @@ -12,7 +12,10 @@ 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 Microsoft.Extensions.Logging; +using Newtonsoft.Json; using SqlSugar; using Tnb.BasicData.Entities; using Tnb.BasicData.Interfaces; @@ -20,6 +23,7 @@ using Tnb.WarehouseMgr.Entities; using Tnb.WarehouseMgr.Entities.Attributes; using Tnb.WarehouseMgr.Entities.Consts; using Tnb.WarehouseMgr.Entities.Dto; +using Tnb.WarehouseMgr.Entities.Dto.Inputs; using Tnb.WarehouseMgr.Entities.Enums; using Tnb.WarehouseMgr.Interfaces; @@ -225,5 +229,9 @@ namespace Tnb.WarehouseMgr throw Oops.Oh(ErrorCode.COM1001); } } + + + + } } diff --git a/apihost/Tnb.API.Entry/Configurations/ConnectionStrings.json b/apihost/Tnb.API.Entry/Configurations/ConnectionStrings.json index 3195bfb6..cedc7a1b 100644 --- a/apihost/Tnb.API.Entry/Configurations/ConnectionStrings.json +++ b/apihost/Tnb.API.Entry/Configurations/ConnectionStrings.json @@ -2,8 +2,8 @@ "ConnectionStrings": { "ConfigId": "default", "DBType": "PostgreSQL", //MySql;SqlServer;Oracle;PostgreSQL;Dm;Kdbndp;Sqlite; - "Host": "192.168.11.109", - //"Host": "127.0.0.1", + //"Host": "192.168.11.109", + "Host": "127.0.0.1", "Port": "5432", //"DBName": "tianyi_db", //"UserName": "postgres", diff --git a/common/Tnb.Common/Utils/HttpClientHelper.cs b/common/Tnb.Common/Utils/HttpClientHelper.cs index 84f4536d..de1425df 100644 --- a/common/Tnb.Common/Utils/HttpClientHelper.cs +++ b/common/Tnb.Common/Utils/HttpClientHelper.cs @@ -112,6 +112,7 @@ namespace Tnb.Common.Utils Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); var respBody = await Client.GetAsync(reqUri); var result = await respBody.Content.ReadAsStringAsync(); + Log.Information($"请求 {url} 结果: {result}"); return result; }