diff --git a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs index 083ace0d..851b5e10 100644 --- a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs +++ b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs @@ -69,7 +69,7 @@ namespace Tnb.ProductionMgr private Timer? Floor2timer移走下升降区未生成预任务且空托的料架; // 7号线补充空料箱 - private Timer? SSX7Supplementtimer; + //private Timer? SSX7Supplementtimer; public static SemaphoreSlim s_taskExecuteFloor2UpMachinecodetimer = new(1); public static SemaphoreSlim s_task送空托到上升降区 = new(1); @@ -431,7 +431,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA })).CreateLogger(this.GetType()); - protected ILogger LoggerYCLGLDPJInstock => LoggerFactory.Create(builder => builder.AddFile($"{AppContext.BaseDirectory}/logs/customBGWCarrySupplement{DateTime.Now:yyyyMMdd}.log", cfgOpts => + protected ILogger LoggerYCLGLDPJInstock => LoggerFactory.Create(builder => builder.AddFile($"{AppContext.BaseDirectory}/logs/customYCLGLDPJInstock{DateTime.Now:yyyyMMdd}.log", cfgOpts => { //cfgOpts.DateFormat = "yyyy-MM-dd HH:mm:ss.fff"; cfgOpts.MessageFormat = (logMsg) => @@ -609,84 +609,84 @@ 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" }); + ///// + ///// 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); + // 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"]}"); + // 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 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(); + // 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 - }; + // 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); + // 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】 预任务生成成功"); + // 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}"); - } - } - } + // _ = _wareHouseService.GenTaskExecute(); + // } + // } + // catch (Exception ex) + // { + // LoggerBGWCarrySupplement.LogInformation($"【SSX7Supplement】 7号输送线空料箱补充发生异常:{ex}"); + // } + // } + //} /// /// 供料叠盘机空托盘自动入库 @@ -694,7 +694,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA private async void YCLGLDPJInstock(object? state) { Dictionary getdic = new Dictionary(); - getdic.Add("SGW-YCL", new string[] { "CP3-3", "AllowGetFullBox" }); + getdic.Add("SGW-YCL", new string[] { "CP3-5", "AllowGetFullBox" }); foreach (var key in getdic.Keys) { @@ -713,45 +713,48 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA { LoggerYCLGLDPJInstock.LogInformation($"【YCLGLDPJInstock】 三工位叠盘机 {key} {strs[1]}采集到 {res["Value"]}"); - BasLocation startLocation = _repository.AsSugarClient().Queryable().Where(r => r.location_code == key).First(); - if (startLocation == null) + using (var db = _repository.AsSugarClient().CopyNew()) { - LoggerYCLGLDPJInstock.LogWarning($"【YCLGLDPJInstock】 {key}未维护库位信息"); - continue; + BasLocation startLocation = db.Queryable().Where(r => r.location_code == key).First(); + if (startLocation == null) + { + LoggerYCLGLDPJInstock.LogWarning($"【YCLGLDPJInstock】 {key}未维护库位信息"); + continue; + } + if (startLocation.is_lock == 1) + { + LoggerYCLGLDPJInstock.LogInformation($"【YCLGLDPJInstock】 三工位叠盘机 {key} 已锁定"); + continue; + } + + // 找到未锁定且未占用的库位 + var endLocations = db.Queryable() + .Where(a => a.is_lock == 0 && a.is_use == "0" && a.wh_id == WmsWareHouseConst.WAREHOUSE_YCL_ID && a.location_code.Contains("YCL-") && a.is_type == "0"); + + LoggerYCLGLDPJInstock.LogInformation($"【YCLGLDPJInstock】 sql {endLocations.ToSqlString()}"); + + if (endLocations.Count() == 0) + { + LoggerYCLGLDPJInstock.LogWarning($"【YCLGLDPJInstock】 当前没有空库位可以入库"); + continue; + } + + BasLocation endLocation = endLocations.First(); + + //锁定起点库位 更新为空闲 + await db.Updateable().SetColumns(r => new BasLocation { is_lock = 1, is_use = "0" }).Where(r => r.id == startLocation.id).ExecuteCommandAsync(); + //锁定终点库位 + await db.Updateable().SetColumns(r => new BasLocation { is_lock = 1 }).Where(r => r.id == endLocation.id).ExecuteCommandAsync(); + + bool result_createPretask = await createPretask(startLocation.id, endLocation.id, "", "", LoggerYCLGLDPJInstock); + if (!result_createPretask) + { + LoggerYCLGLDPJInstock.LogWarning($"【YCLGLDPJInstock】 {startLocation.location_code} 到 {endLocation.location_code} 预任务生成失败"); + continue; + } + LoggerYCLGLDPJInstock.LogWarning($"【YCLGLDPJInstock】 {startLocation.location_code} 到 {endLocation.location_code} 预任务生成成功"); + } - if (startLocation.is_lock == 1) - { - LoggerYCLGLDPJInstock.LogInformation($"【YCLGLDPJInstock】 三工位叠盘机 {key} 已锁定"); - continue; - } - - // 找到未锁定且未占用的库位 - 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 {endLocations.ToSqlString()}"); - - if (endLocations.Count() == 0) - { - LoggerYCLGLDPJInstock.LogWarning($"【YCLGLDPJInstock】 当前没有空库位可以入库"); - continue; - } - - BasLocation endLocation = endLocations.First(); - - //锁定起点库位 更新为空闲 - 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 == endLocation.id).ExecuteCommandAsync(); - - bool result_createPretask = await createPretask(startLocation.id, endLocation.id, "", "", LoggerYCLGLDPJInstock); - if (!result_createPretask) - { - LoggerYCLGLDPJInstock.LogWarning($"【YCLGLDPJInstock】 {startLocation.location_code} 到 {endLocation.location_code} 预任务生成失败"); - continue; - } - LoggerYCLGLDPJInstock.LogWarning($"【YCLGLDPJInstock】 {startLocation.location_code} 到 {endLocation.location_code} 预任务生成成功"); - _ = _wareHouseService.GenTaskExecute(); } @@ -802,8 +805,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA // 找到未锁定且未占用的库位 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-")); - + .Where(a => a.is_lock == 0 && a.is_use == "0" && a.wh_id == WmsWareHouseConst.WAREHOUSE_YCL_ID && a.location_code.Contains("YCL-") && a.is_type == "0"); + LoggerYCLGLDPJInstock.LogInformation($"【YCLWXDPJInstock】 sql {endLocations.ToSqlString()}"); if (endLocations.Count() == 0) @@ -951,7 +954,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA YCLGLDPJInstocktimer?.Dispose(); YCLWXDPJInstocktimer?.Dispose(); - SSX7Supplementtimer?.Dispose(); + //SSX7Supplementtimer?.Dispose(); } #region 二楼上升降机机械臂 @@ -992,30 +995,25 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA } LoggerFloor2UpDownMachine.LogInformation($@"【上升降机】扫描到有效条码 {barcode}"); - // 获取下到输送线9和10的未完成的出库单 - List WmsEmptyOutstockHs = db.Queryable() - .InnerJoin((a, b) => a.id == b.bill_id) - .Where((a, b) => (a.location_id == "32609238573589" || a.location_id == "32609229889045") && (string.IsNullOrEmpty(a.bindrackcomplete) || a.bindrackcomplete != WmsWareHouseConst.BILLSTATUS_COMPLETE_ID) + // 获取下到输送线9和10的未完成的转库单 + List WmsMaterialTransfers = db.Queryable() + .InnerJoin((a, b) => a.id == b.bill_id) + .Where((a, b) => a.warehouse_instock == "33780009364245" && a.warehouse_outstock == "2" && a.remainbindracknum > 0 && b.carry_code == barcode).ToList(); - string ss = db.Queryable() - .InnerJoin((a, b) => a.id == b.bill_id) - .Where((a, b) => (a.location_id == "32609238573589" || a.location_id == "32609229889045") && (string.IsNullOrEmpty(a.bindrackcomplete) || a.bindrackcomplete != WmsWareHouseConst.BILLSTATUS_COMPLETE_ID) - && b.carry_code == barcode).ToSqlString(); - - if (WmsEmptyOutstockHs.Count() == 0) + if (WmsMaterialTransfers.Count() == 0) { - LoggerFloor2UpDownMachine.LogWarning($@"【上升降机】未找到条码{barcode}的输送线为9、10的出库单"); + LoggerFloor2UpDownMachine.LogWarning($@"【上升降机】未找到条码{barcode}的输送线为9、10的转库单"); return; } - // 出库单 - WmsEmptyOutstockH WmsEmptyOutstockH = WmsEmptyOutstockHs.OrderByDescending(r => r.create_time).First(); + // 转库单 + WmsMaterialTransfer WmsMaterialTransfer = WmsMaterialTransfers.OrderByDescending(r => r.create_time).First(); - // 找到条码在的出库单 - string ckdCode = WmsEmptyOutstockH.bill_code; - int ckdRemainBindRackNum = (int)(WmsEmptyOutstockH.remainbindracknum != null ? WmsEmptyOutstockH.remainbindracknum : 0); + // 找到条码在的转库单 + string ckdCode = WmsMaterialTransfer.bill_code; + int ckdRemainBindRackNum = (int)(WmsMaterialTransfer.remainbindracknum != null ? WmsMaterialTransfer.remainbindracknum : 0); - //扫描到的料箱 a.对应出库单的b.码垛计数未达到满托数量的料架区 + //扫描到的料箱 a.对应转库单的b.码垛计数未达到满托数量的料架区 IEnumerable targetConfigs = WmsMechanicalArmHs.Where(r => r.outbill == ckdCode && r.stackingcount < r.maxnum); WmsMechanicalArmH target; @@ -1032,8 +1030,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA // 计算当前料架区的满托数量 int? maxnum = ckdRemainBindRackNum > target.maxracknum ? ckdRemainBindRackNum % target.maxracknum : ckdRemainBindRackNum; - // 更新 出库单、满托数量 - LoggerFloor2UpDownMachine.LogInformation($@"【上升降机】为条码 {barcode} 所在的出库单 {ckdCode} 占用了一个空闲料架"); + // 更新 转库单、满托数量 + LoggerFloor2UpDownMachine.LogInformation($@"【上升降机】为条码 {barcode} 所在的转库单 {ckdCode} 占用了一个空闲料架"); await db.Updateable().SetColumns(r => new WmsMechanicalArmH { outbill = ckdCode, @@ -1056,13 +1054,13 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA } else { - LoggerFloor2UpDownMachine.LogError($@"【上升降机】条码{barcode}找不到绑定出库单{ckdCode}的料架区,且没有空闲的料架区可以用于绑定此出库单!"); + LoggerFloor2UpDownMachine.LogError($@"【上升降机】条码{barcode}找不到绑定转库单{ckdCode}的料架区,且没有空闲的料架区可以用于绑定此转库单!"); await db.Ado.RollbackTranAsync(); return; } } - //如有多个料架绑定同个出库单则取第一个未满托的料架 + //如有多个料架绑定同个转库单则取第一个未满托的料架 target = targetConfigs.First(); LoggerFloor2UpDownMachine.LogInformation($@"【上升降机】当前条码目标料架区为 {JsonConvert.SerializeObject(target)}"); @@ -1088,12 +1086,12 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA }).Where(r => r.id == target.id).ExecuteCommandAsync(); LoggerFloor2UpDownMachine.LogInformation($@"【上升降机】回写料箱条码、码垛计数"); - // 回写出库单的剩余可绑定料架数量 - await db.Updateable().SetColumns(r => new WmsEmptyOutstockH + // 回写转库单的剩余可绑定料架数量 + await db.Updateable().SetColumns(r => new WmsMaterialTransfer { remainbindracknum = r.remainbindracknum - 1 - }).Where(r => r.id == WmsEmptyOutstockH.id).ExecuteCommandAsync(); - LoggerFloor2UpDownMachine.LogInformation($@"【上升降机】回写出库单的剩余可绑定料架数量"); + }).Where(r => r.id == WmsMaterialTransfer.id).ExecuteCommandAsync(); + LoggerFloor2UpDownMachine.LogInformation($@"【上升降机】回写转库单的剩余可绑定料架数量"); // 绑定料箱到料架 CarryBindFloor2UpDownMachineInput carryBindFloor2UpDownMachineInput = new() { }; @@ -1602,26 +1600,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 @@ -1642,17 +1640,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(1)); + Floor2UpMachinecodetimer = new Timer(Floor2UpMachinecode, null, TimeSpan.Zero, TimeSpan.FromSeconds(20)); // 二楼料架配送 - 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)); + 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)); BGWCarrySupplementtimer = new Timer(BGWCarrySupplement, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); - // 7号线补充空料箱 - SSX7Supplementtimer = new Timer(SSX7Supplement, 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/Consts/ModuleConsts.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ModuleConsts.cs index b50b3848..2bd672f1 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ModuleConsts.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ModuleConsts.cs @@ -226,8 +226,8 @@ public class ModuleConsts /// public const string MODULE_WMSMATERIALTRANSFER_ID = "34354738929685"; /// - /// 模块标识-生产入库单 todo + /// 模块标识-生产入库单 /// - public const string MODULE_WMSPRDINSTOCK_ID = "MODULE_WMSPRDINSTOCK_ID"; + public const string MODULE_WMSPRDINSTOCK_ID = "34467501190677"; } \ No newline at end of file diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs index 2504ced4..ba770235 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs @@ -218,7 +218,7 @@ /// /// 预任务生成业务类型-原材料转库单下发 todo /// - public const string BIZTYPE_WMSMATERIALTRANSFER_ID = "BIZTYPE_WMSMATERIALTRANSFER_ID"; + public const string BIZTYPE_WMSMATERIALTRANSFER_ID = "34354738929685"; /// /// 预任务生成业务类型-载具绑定 /// @@ -234,9 +234,9 @@ public const string BIZTYPE_WMSTRANSFERINSTOCK_ID = "34154749548053"; /// - /// 生产入库 todo + /// 生产入库 /// - public const string BIZTYPE_WMSPRDINSTOCK_ID = "BIZTYPE_WMSPRDINSTOCK_ID"; + public const string BIZTYPE_WMSPRDINSTOCK_ID = "34467501190677"; /// /// 条码打印状态-已完成 diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/BindCarryCodeInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/BindCarryCodeInput.cs index 6eecfef3..468d9bfa 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/BindCarryCodeInput.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/BindCarryCodeInput.cs @@ -18,8 +18,8 @@ namespace Tnb.WarehouseMgr.Entities.Dto.Inputs public string location_id { get; set; } = ""; public string location_code { get; set; } = ""; public string code_batch { get; set; } - public string unit_id { get; set; } - public string unit_code { get; set; } + public string unit_id { get; set; } = ""; + public string unit_code { get; set; } = ""; public string create_id { get; set; } = WmsWareHouseConst.AdministratorUserId; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferCallRackToProductionLineInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferCallRackToProductionLineInput.cs new file mode 100644 index 00000000..91dac301 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferCallRackToProductionLineInput.cs @@ -0,0 +1,22 @@ +namespace Tnb.WarehouseMgr.Entities.Dto +{ + /// + /// 库房业务更新输入参数 + /// + public class MaterialTransferCallRackToProductionLineInput + { + /// + /// 组织ID + /// + public string org_id { get; set; } + /// + /// 创建用户 + /// + public string create_id { get; set; } + + /// + /// 料架号 + /// + public string? carry_code { get; set; } + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferDistributeToZCCInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferDistributeToZCCInput.cs new file mode 100644 index 00000000..2a9f56ea --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferDistributeToZCCInput.cs @@ -0,0 +1,22 @@ +namespace Tnb.WarehouseMgr.Entities.Dto +{ + /// + /// 库房业务更新输入参数 + /// + public class MaterialTransferDistributeToZCCInput + { + /// + /// 组织ID + /// + public string org_id { get; set; } + /// + /// 创建用户 + /// + public string create_id { get; set; } + + /// + /// 来源单据id(转库单主表) + /// + public string? source_id { get; set; } + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCarryH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCarryH.cs index e2bbf362..c83331eb 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCarryH.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsCarryH.cs @@ -135,4 +135,9 @@ public partial class WmsCarryH : BaseEntity /// public int check_conclusion { get; set; } = 1; + /// + /// 配送工位 + /// + public string? work_station { get; set; } + } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsEmptyOutstockH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsEmptyOutstockH.cs index d144b722..667dc27c 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsEmptyOutstockH.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsEmptyOutstockH.cs @@ -84,15 +84,15 @@ public partial class WmsEmptyOutstockH : BaseEntity /// public DateTime? timestamp { get; set; } - /// - /// 二楼机械臂剩余绑定料架数量 - /// - public int? remainbindracknum { get; set; } + ///// + ///// 二楼机械臂剩余绑定料架数量 + ///// + //public int? remainbindracknum { get; set; } - /// - /// 二楼机械臂料箱绑定完成 - /// - public string? bindrackcomplete { get; set; } + ///// + ///// 二楼机械臂料箱绑定完成 + ///// + //public string? bindrackcomplete { get; set; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialTransfer.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialTransfer.cs index 549e3cc5..a02aa0f3 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialTransfer.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialTransfer.cs @@ -114,4 +114,14 @@ public partial class WmsMaterialTransfer : BaseEntity /// public string? order_code { get; set; } + /// + /// 载具数量 + /// + public int? carry_count { get; set; } + + /// + /// 可绑定料架的载具数量 + /// + public int? remainbindracknum { get; set; } + } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialTransferD.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialTransferD.cs index 024b8f9a..2a51b331 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialTransferD.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsMaterialTransferD.cs @@ -92,4 +92,5 @@ public partial class WmsMaterialTransferD : BaseEntity /// public string? material_ex { get; set; } + } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/wms_material_transfer_carry.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/wms_material_transfer_carry.cs new file mode 100644 index 00000000..6c37120c --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/wms_material_transfer_carry.cs @@ -0,0 +1,71 @@ +using JNPF.Common.Contracts; +using JNPF.Common.Security; +using SqlSugar; + +namespace Tnb.WarehouseMgr.Entities.Entity; + +/// +/// 转库单载具表 +/// +[SugarTable("wms_material_transfer_carry")] +public partial class WmsMaterialTransferCarry : BaseEntity +{ + public WmsMaterialTransferCarry() + { + id = SnowflakeIdHelper.NextId(); + } + /// + /// 转库单id + /// + public string? bill_id { get; set; } + + /// + /// 载具ID + /// + public string? carry_id { get; set; } + + /// + /// 载具编号 + /// + public string? carry_code { get; set; } + + /// + /// 创建用户 + /// + public string? create_id { get; set; } + + /// + /// 创建时间 + /// + public DateTime? create_time { get; set; } + + /// + /// 起点库位id + /// + public string? startlocation_id { get; set; } + + /// + /// 起点库位编码 + /// + public string? startlocation_code { get; set; } + + /// + /// 终点库位id + /// + public string? endlocation_id { get; set; } + + /// + /// 终点库位编码 + /// + public string? endlocation_code { get; set; } + + /// + /// 转库单物料明细id + /// + public string? mat_bill_id { get; set; } + + /// + /// 料箱数量 + /// + public decimal? qty { get; set; } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index 476591f3..e45fc167 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -302,6 +302,13 @@ namespace Tnb.WarehouseMgr codeqty = b.codeqty }).ToList().Select(r => { + // 如果可出库数量已经扣减完 + if (input.qty <= 0) + { + return new Tuple("", r.WmsCarryH, r.WmsCarryCode, r.BasLocation); + } + + // 扣减可出库数量 input.qty = input.qty - r.codeqty; // 出库数量与托盘上的数量不一致需要进行分拣 @@ -315,7 +322,7 @@ namespace Tnb.WarehouseMgr // 正常预任务出库 return new Tuple("预任务", r.WmsCarryH, r.WmsCarryCode, r.BasLocation); } - }).ToList(); + }).Where(r => r.Item1 != "").ToList(); return items; } @@ -547,7 +554,7 @@ namespace Tnb.WarehouseMgr } /// - /// // 二楼机械臂 + /// 二楼机械臂 /// /// public async Task Floor2MechanicalComplete(WmsDistaskH disTask, string action) @@ -673,6 +680,15 @@ namespace Tnb.WarehouseMgr { throw new Exception($@"【上升降机】设定升上升降机满托{target.stackingposition}移走 结果为 {result}"); } + + // 更新料架在二楼配送的目标工位 + // todo erp工位字段取数位置未确定 + string targetWorkstation = "003-01-01-01"; + Logger.LogInformation($@"【上升降机】更新料架 {target.rackcode} 在二楼配送的目标工位 {targetWorkstation}"); + await db.Updateable().SetColumns(r => new WmsCarryH + { + work_station = targetWorkstation + }).Where(r => r.id == target.rackid).ExecuteCommandAsync(); } else if (target.note == "下升降机") { @@ -684,12 +700,6 @@ namespace Tnb.WarehouseMgr } } - //回写出库单状态 - 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 { @@ -721,26 +731,26 @@ namespace Tnb.WarehouseMgr 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; } /// @@ -1100,7 +1110,7 @@ namespace Tnb.WarehouseMgr Logger.Information($@"【CTUTaskExecute】 获取任务TaskCodes: {JsonConvert.SerializeObject(TaskCodes)}"); var InTasks = CTUTasks.Where(a => a.task_type == WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID).ToList(); - var OutTasks = CTUTasks.Where(a => a.task_type == WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID).ToList(); + var OutTasks = CTUTasks.Where(a => a.task_type == WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID || a.task_type == WmsWareHouseConst.BIZTYPE_WMSTRANSFER_ID).ToList(); //Logger.Information($@"【CTUTaskExecute】 获取任务InTasks: {JsonConvert.SerializeObject(InTasks)}"); //Logger.Information($@"【CTUTaskExecute】 获取任务OutTasks: {JsonConvert.SerializeObject(OutTasks)}"); @@ -1297,7 +1307,7 @@ namespace Tnb.WarehouseMgr BillCode = $"{groups}-" + (orgdistaskHs.Count + newdistaskHs.Count + 1); } } - else if (distaskH.task_type == WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID) + else if (distaskH.task_type == WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID || distaskH.task_type == WmsWareHouseConst.BIZTYPE_WMSTRANSFER_ID) { var orgdistaskHs = OriginDistaskH.Where(p => p.status == WmsWareHouseConst.TASK_BILL_STATUS_DZX_ID && p.task_type == WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID && p.endpoint_id == distaskH.endpoint_id).ToList(); var newdistaskHs = NewdistaskHs = OriginDistaskH.Where(p => p.status == WmsWareHouseConst.TASK_BILL_STATUS_DZX_ID && p.task_type == WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID && p.endpoint_id == distaskH.endpoint_id).ToList(); @@ -1775,7 +1785,7 @@ namespace Tnb.WarehouseMgr is_lock = 0, is_use = multiList[i].carry_status }; - if (multiList[i].carry_status.ToEnum() == EnumCarryStatus.空闲) + if (!string.IsNullOrEmpty(multiList[i].carry_status) && multiList[i].carry_status.ToEnum() == EnumCarryStatus.空闲) { loc.is_use = ((int)EnumCarryStatus.占用).ToString(); } @@ -1824,12 +1834,6 @@ namespace Tnb.WarehouseMgr await _db.Updateable().SetColumns(r => r.qty == r.qty + wmsCarryCode.codeqty).Where(r => r.id == dt.require_id).ExecuteCommandAsync(); } } - // 原材料转库单 - else if (dt.biz_type == WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID) - { - 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(); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs index 61147bac..1d08c58d 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs @@ -33,6 +33,7 @@ using Tnb.WarehouseMgr.Entities.Dto.Inputs; using Microsoft.Extensions.Logging; using JNPF.Systems.Entitys.System; using JNPF.Systems.Entitys.Permission; +using Aop.Api.Domain; namespace Tnb.WarehouseMgr { @@ -43,7 +44,7 @@ namespace Tnb.WarehouseMgr [ServiceModule(BizTypeId)] public class WmsMaterialTransferService : BaseWareHouseService { - private const string BizTypeId = ""; + private const string BizTypeId = "34354738929685"; private readonly ISqlSugarClient _db; private readonly IRunService _runService; private readonly IVisualDevService _visualDevService; @@ -51,6 +52,8 @@ namespace Tnb.WarehouseMgr private readonly IBillRullService _billRullService; private readonly IUserManager _userManager; + public static SemaphoreSlim s_taskDistributeToZCC = new(1); + public WmsMaterialTransferService( ISqlSugarRepository repository, IRunService runService, @@ -80,6 +83,8 @@ namespace Tnb.WarehouseMgr .InnerJoin((a, b, c) => c.Id == a.create_id) .InnerJoin((a, b, c, d) => d.id == a.warehouse_outstock) .InnerJoin((a, b, c, d, e) => e.id == a.warehouse_instock) + // 只显示未完成的单据 + .Where( a => a.status != "25065149810453") .Select((a, b, c, d, e) => new WmsMaterialTransfer { id = a.id, @@ -94,7 +99,7 @@ namespace Tnb.WarehouseMgr status = b.FullName, bill_date = a.bill_date, warehouse_outstock = d.whname, - warehouse_instock = d.whname, + warehouse_instock = e.whname, type = a.type, biller_out = a.biller_out, depart_out = a.depart_out, @@ -113,9 +118,9 @@ namespace Tnb.WarehouseMgr foreach (dynamic row in mainTable) { - row.deliver_date = row.deliver_date.Value.ToString("yyyy-MM-dd"); - row.arrival_date = row.arrival_date.Value.ToString("yyyy-MM-dd"); - row.create_time = row.create_time.Value.ToString("yyyy-MM-dd"); + row.deliver_date = row.deliver_date.Value?.ToString("yyyy-MM-dd"); + row.arrival_date = row.arrival_date.Value?.ToString("yyyy-MM-dd"); + row.create_time = row.create_time.Value?.ToString("yyyy-MM-dd"); } List wmsTransferInstockDs = _db.Queryable((a, b) => @@ -235,6 +240,12 @@ namespace Tnb.WarehouseMgr WmsMaterialTransferD wmsMaterialTransferD = await _db.Queryable().FirstAsync(it => it.id == input.source_id); WmsMaterialTransfer wmsMaterialTransfer = await _db.Queryable().FirstAsync(it => it.id == wmsMaterialTransferD.bill_id); + + if (wmsMaterialTransferD.yxfqty == wmsMaterialTransferD.qty) + { + throw new AppFriendlyException("已下发数量已达到转库数量", 500); + } + await s_taskExecuteSemaphore.WaitAsync(); await _db.Ado.BeginTranAsync(); @@ -280,6 +291,8 @@ namespace Tnb.WarehouseMgr commonCreatePretaskInput.task_type = WmsWareHouseConst.WMS_PRETASK_OUTSTOCK_TYPE_ID; commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID; commonCreatePretaskInput.require_id = input.source_id; + commonCreatePretaskInput.carry_id = wmsCarryH.id; + commonCreatePretaskInput.carry_code = wmsCarryH.carry_code; Entities.Dto.Outputs.Result res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput); @@ -303,7 +316,7 @@ namespace Tnb.WarehouseMgr finally { _ = s_taskExecuteSemaphore.Release(); - await InvokeGenPretaskExcute(); + InvokeGenPretaskExcute(); } return await ToApiResult(HttpStatusCode.OK, "成功"); @@ -321,12 +334,221 @@ namespace Tnb.WarehouseMgr Logger.LogWarning($"【ModifyAsync】载具{input.carryIds[0]}没有绑定物料条码"); return; } + // 更新已转数量 bool isOk = await _db.Updateable().SetColumns(it => new WmsMaterialTransferD { yzqty = it.yzqty + wmsCarryCode.codeqty }) .Where(it => it.id == input.requireId).ExecuteCommandHasChangeAsync(); - if (!isOk) + + // 如果所有明细已完成 更新主表状态为完成 + WmsMaterialTransferD wmsMaterialTransferd = await _db.Queryable().Where(r => r.id == input.requireId).SingleAsync(); + List wmsMaterialTransferDs = _db.Queryable() + .Where(a => a.bill_id == wmsMaterialTransferd.bill_id && a.yzqty < a.qty).ToList(); + bool isOk2 = true; + if (wmsMaterialTransferDs.Count == 0) + { + isOk2 = await _db.Updateable().SetColumns(it => new WmsMaterialTransfer { status = WmsWareHouseConst.BILLSTATUS_COMPLETE_ID }) + .Where(it => it.id == wmsMaterialTransferd.bill_id).ExecuteCommandHasChangeAsync(); + } + + + if (!isOk || !isOk2) { throw Oops.Oh(ErrorCode.COM1001); } } + + /// + /// 中储仓下发到二楼暂存仓 + /// + /// + /// + /// + [HttpPost, NonUnify, AllowAnonymous] + public async Task DistributeToZCC(MaterialTransferDistributeToZCCInput input) + { + s_taskDistributeToZCC.Wait(); + + try + { + WmsMaterialTransfer wmsMaterialTransfer = _db.Queryable().Where(r => r.id == input.source_id).First(); + if (wmsMaterialTransfer == null) + { + Logger.LogWarning($"不存在id为{input.source_id}的转库单!"); + throw new AppFriendlyException($"不存在id为{input.source_id}的转库单!", 500); + } + if (wmsMaterialTransfer.status != WmsWareHouseConst.BILLSTATUS_ADD_ID) + { + Logger.LogWarning($@"当前转库单状态为{wmsMaterialTransfer.status},不能下发中储仓下发到二楼暂存仓任务!"); + throw new AppFriendlyException($@"当前转库单状态为{wmsMaterialTransfer.status},不能下发中储仓下发到二楼暂存仓任务!", 500); + } + + List wmsMaterialTransferds = _db.Queryable().Where(r => r.bill_id == input.source_id).ToList(); + + // 转库单载具子表 + List wmsMaterialTransferCarrys = new List(); + + foreach (WmsMaterialTransferD wmsMaterialTransferD in wmsMaterialTransferds) + { + //出库取起点,获取所有符合输入的载具规格的载具 + OutStockStrategyQuery OutStockStrategyInput = new() + { + warehouse_id = "2", + material_id = wmsMaterialTransferD.material_id, + code_batch = wmsMaterialTransferD.code_batch + }; + List? carrys = await _wareHouseService.OutStockStrategy(OutStockStrategyInput); + + // 需要转库数量 + decimal? needOut = wmsMaterialTransferD.qty; + + foreach (WmsCarryH wmsCarryH in carrys) + { + if (needOut <= 0) + { + break; + } + WmsCarryCode wmsCarryCode = _db.Queryable().Where(r => r.carry_id == wmsCarryH.id).First(); + needOut -= wmsCarryCode.codeqty; + + BasLocation endlocation_ssx = await _db.Queryable().Where(r => new string[2] { "32609229889045", "32609238573589" }.Contains(r.id)).OrderBy("is_lock, task_nums, location_code").FirstAsync(); + await _db.Updateable().SetColumns(it => it.task_nums == it.task_nums + 1).Where(it => endlocation_ssx.id == it.id).ExecuteCommandAsync(); + + // 转库单载具子表 + WmsMaterialTransferCarry wmsMaterialTransferCarry = new WmsMaterialTransferCarry(); + wmsMaterialTransferCarry.bill_id = input.source_id; + wmsMaterialTransferCarry.carry_id = wmsCarryH.id; + wmsMaterialTransferCarry.carry_code = wmsCarryH.carry_code; + wmsMaterialTransferCarry.create_id = input.create_id; + wmsMaterialTransferCarry.create_time = DateTime.Now; + wmsMaterialTransferCarry.endlocation_id = endlocation_ssx.id; + wmsMaterialTransferCarry.endlocation_code = endlocation_ssx.location_code; + wmsMaterialTransferCarry.startlocation_id = wmsCarryH.location_id; + wmsMaterialTransferCarry.startlocation_code = wmsCarryH.location_code; + wmsMaterialTransferCarry.mat_bill_id = wmsMaterialTransferD.id; + wmsMaterialTransferCarry.qty = wmsCarryCode.codeqty; + wmsMaterialTransferCarrys.Add(wmsMaterialTransferCarry); + } + + if (needOut > 0) + { + throw new AppFriendlyException($"物料{wmsMaterialTransferD.material_code}没有足够的库存!,缺失数量为{needOut}", 500); + } + } + + await _db.Ado.BeginTranAsync(); + + await _db.Updateable().SetColumns(r => new WmsMaterialTransfer + { + status = WmsWareHouseConst.BILLSTATUS_ON_ID, + carry_count = wmsMaterialTransferCarrys.Count, + remainbindracknum = wmsMaterialTransferCarrys.Count + }).Where(r => r.id == input.source_id).ExecuteCommandAsync(); + Logger.LogInformation($"【DistributeToZCC】更新转库单{wmsMaterialTransfer.bill_code}主表的数据"); + + await _db.Insertable(wmsMaterialTransferCarrys).ExecuteCommandAsync(); + Logger.LogInformation($"【DistributeToZCC插入转库单{wmsMaterialTransfer.bill_code}载具表的数据"); + + foreach (WmsMaterialTransferCarry wmsMaterialTransferCarry in wmsMaterialTransferCarrys) + { + CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput(); + commonCreatePretaskInput.startlocation_id = wmsMaterialTransferCarry.startlocation_id; + commonCreatePretaskInput.endlocation_id = wmsMaterialTransferCarry.endlocation_id; + commonCreatePretaskInput.carry_id = wmsMaterialTransferCarry.carry_id; + commonCreatePretaskInput.carry_code = wmsMaterialTransferCarry.carry_code; + commonCreatePretaskInput.task_type = WmsWareHouseConst.BIZTYPE_WMSTRANSFER_ID; + commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID; + commonCreatePretaskInput.require_id = wmsMaterialTransferCarry.mat_bill_id; + commonCreatePretaskInput.isExcuteMission = false; + + var res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput); + if (res.code != JNPF.Common.Enums.HttpStatusCode.OK) + { + Logger.LogInformation($"【DistributeToZCC生成预任务失败 载具 {wmsMaterialTransferCarry.carry_code}"); + throw new AppFriendlyException($"生成预任务失败 载具 {wmsMaterialTransferCarry.carry_code}", 500); + } + + await _db.Updateable().SetColumns(r => r.yxfqty == r.yxfqty + wmsMaterialTransferCarry.qty).Where(r => r.id == wmsMaterialTransferCarry.mat_bill_id).ExecuteCommandAsync(); + } + Logger.LogInformation($"转库单{wmsMaterialTransfer.bill_code}预任务{wmsMaterialTransferCarrys.Count}条全部生成成功"); + + + await _db.Ado.CommitTranAsync(); + } + catch(Exception ex) + { + await _db.Ado.RollbackTranAsync(); + Logger.LogError("【DistributeToZCC】" + ex.Message); + Logger.LogError("【DistributeToZCC】" + ex.StackTrace); + return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); + } + finally + { + s_taskDistributeToZCC.Release(); + InvokeGenPretaskExcute(); + } + return await ToApiResult(HttpStatusCode.OK, "成功"); + } + + /// + /// 从暂存仓呼叫料架到产线 + /// + /// + /// + /// + [HttpPost, NonUnify, AllowAnonymous] + public async Task CallRackToProductionLine(MaterialTransferCallRackToProductionLineInput input) + { + WmsCarryH wmsCarryH = _db.Queryable().Where(r => r.carry_code == input.carry_code).First(); + if (wmsCarryH == null) + { + Logger.LogWarning($"不存在编码为{input.carry_code}的料架号!"); + throw new AppFriendlyException($"不存在编码为{input.carry_code}的料架号!", 500); + } + if (string.IsNullOrEmpty(wmsCarryH.work_station)) + { + Logger.LogWarning($"此料架目标工位为空!{input.carry_code}"); + throw new AppFriendlyException($"此料架目标工位为空!{input.carry_code}!", 500); + } + + if (string.IsNullOrEmpty(wmsCarryH.location_id)) + { + Logger.LogWarning($"此料架的库位为空!{input.carry_code}"); + throw new AppFriendlyException($"此料架的库位为空!{input.carry_code}", 500); + } + + BasLocation endlocation = _db.Queryable().Where(r => r.location_code == wmsCarryH.work_station).First(); + + WmsDistaskH wmsDistaskH = _db.Queryable().Where(r => r.carry_code == wmsCarryH.carry_code && r.status != WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID).First(); + if (wmsDistaskH != null) + { + Logger.LogWarning($"此料架{input.carry_code}存在未完成的任务{wmsDistaskH.bill_code}!"); + throw new AppFriendlyException($"此料架{input.carry_code}存在未完成的任务{wmsDistaskH.bill_code}!", 500); + } + + try + { + CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput(); + commonCreatePretaskInput.startlocation_id = wmsCarryH.location_id; + commonCreatePretaskInput.endlocation_id = endlocation.id; + commonCreatePretaskInput.carry_id = wmsCarryH.id; + commonCreatePretaskInput.carry_code = wmsCarryH.carry_code; + commonCreatePretaskInput.task_type = ""; + commonCreatePretaskInput.biz_type = ""; + + var res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput); + if (res.code != JNPF.Common.Enums.HttpStatusCode.OK) + { + Logger.LogInformation($"【CallRackToProductionLine】生成预任务失败 载具 {wmsCarryH.carry_code}"); + throw new AppFriendlyException($"生成预任务失败 载具 {wmsCarryH.carry_code}", 500); + } + } + catch (Exception ex) + { + Logger.LogError("【CallRackToProductionLine】" + ex.Message); + Logger.LogError("【CallRackToProductionLine】" + ex.StackTrace); + return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); + } + + return await ToApiResult(HttpStatusCode.OK, "成功"); + } } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdInstockHService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdInstockHService.cs index 16e5928d..c6cbe2b3 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdInstockHService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdInstockHService.cs @@ -18,6 +18,7 @@ using Tnb.BasicData; using Tnb.BasicData.Entities; using Tnb.ProductionMgr.Entities; 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; @@ -27,8 +28,10 @@ using Tnb.WarehouseMgr.Interfaces; namespace Tnb.WarehouseMgr { [OverideVisualDev(ModuleConsts.MODULE_WMSPRDINSTOCK_ID)] + [ServiceModule(BizTypeId)] public class WmsPrdInstockHService : BaseWareHouseService { + private const string BizTypeId = "34467501190677"; private readonly ISqlSugarClient _db; private readonly IRunService _runService; private readonly IVisualDevService _visualDevService; diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsSaleReleaseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsSaleReleaseService.cs index 24ff3d29..98b02f4e 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsSaleReleaseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsSaleReleaseService.cs @@ -154,7 +154,7 @@ namespace Tnb.WarehouseMgr decimal canOutstockQty = items.Sum(r => r.Item3.codeqty).ParseToDecimal(); if (canOutstockQty < input.qty) { - throw new AppFriendlyException($@"当前可出库数量只有 {canOutstockQty}", 500); + throw new AppFriendlyException($@"当前可出库数量只有 {canOutstockQty.ToString("G")}", 500); } List> items_sorttask = items.Where(r => r.Item1 == "分拣任务").ToList();