diff --git a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs index 6e63cc9c..ee3b4c82 100644 --- a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs +++ b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs @@ -2420,7 +2420,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA } /// - /// 四楼待灭菌线到灭菌仓 + /// 四楼灭菌线到解析仓 /// /// private async void Floor4MJX2MJC(object? args) @@ -2432,8 +2432,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA stopwatch.Start(); try { - Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行四楼待灭菌线到灭菌仓"); - LoggerTimer.LogInformation($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行四楼待灭菌线到灭菌仓"); + Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行四楼灭菌线到解析仓"); + LoggerTimer.LogInformation($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行四楼灭菌线到解析仓"); Dictionary getdic = new Dictionary(); getdic.Add("MJQ-QU01", new string[] { "4楼下料输送西区", "下料工位1请求取盘", "下料工位1条码" }); @@ -2446,75 +2446,89 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA bool result = await GetBoolTag(strs[0], strs[1]); if (result) { - LoggerFloor4MJX2MJC.LogInformation($"【四楼待灭菌线到灭菌仓】 下料点 {key} {strs[1]}采集到 {result}"); - - InStockStrategyQuery inStockStrategyInput = new() + SemaphoreSlim semaphoreSlim = null; + try { - warehouse_id = WmsWareHouseConst.WAREHOUSE_MJC_ID, - Size = 1 - }; - List items = await _wareHouseService.InStockStrategy(inStockStrategyInput); + semaphoreSlim = _wareHouseService.GetSemaphore("instock", WmsWareHouseConst.WAREHOUSE_MJC_ID); + await semaphoreSlim.WaitAsync(); + LoggerFloor4MJX2MJC.LogInformation($"【四楼灭菌线到解析仓】 下料点 {key} {strs[1]}采集到 {result}"); + + InStockStrategyQuery inStockStrategyInput = new() + { + warehouse_id = WmsWareHouseConst.WAREHOUSE_MJC_ID, + Size = 1 + }; + List items = await _wareHouseService.InStockStrategy(inStockStrategyInput); + + if (items.Count < 1) + { + LoggerFloor4MJX2MJC.LogWarning($"【四楼灭菌线到解析仓】 没有可以入库的库位"); + break; + } + var endlocation = items.First(); + + await db_Floor4MJX2MJC.Ado.BeginTranAsync(); + BasLocation startlocation = await db_Floor4MJX2MJC.Queryable().Where(r => r.location_code == key).FirstAsync(); + + if (startlocation.is_lock == 1) + { + LoggerFloor4MJX2MJC.LogWarning($"【四楼灭菌线到解析仓】 起点库位{startlocation.location_code}已锁定"); + continue; + } + string carry_code = (await GetStringTag(strs[0], strs[2])).Replace("\r", "").Replace(" ", ""); + LoggerFloor4MJX2MJC.LogInformation($"【四楼灭菌线到解析仓】 下料点 {key} {strs[2]}采集到 {carry_code}"); + LoggerFloor4MJX2MJC.LogInformation($"【四楼灭菌线到解析仓】 下料点 {key} {strs[2]}采集到长度 {carry_code.Length}"); + WmsCarryH wmsCarryH = await db_Floor4MJX2MJC.Queryable().Where(r => r.carry_code == carry_code).FirstAsync(); + if (wmsCarryH == null) + { + LoggerFloor4MJX2MJC.LogWarning($"【四楼灭菌线到解析仓】 托盘号{carry_code}在系统中不存在"); + continue; + } + //锁定起点库位 + await db_Floor4MJX2MJC.Updateable().SetColumns(r => new BasLocation { is_lock = 1 }).Where(r => r.id == startlocation.id).ExecuteCommandAsync(); + //锁定终点库位 + await db_Floor4MJX2MJC.Updateable().SetColumns(r => new BasLocation { is_lock = 1 }).Where(r => r.id == endlocation.id).ExecuteCommandAsync(); + + DateTime dateTime = DateTime.Now; + WmsSterilizationInstockH wmsSterilizationInstockH = new WmsSterilizationInstockH(); + string code = await _billRullService.GetBillNumber("WmsSterilizationInstockH"); + wmsSterilizationInstockH.bill_code = code; + wmsSterilizationInstockH.carry_id = wmsCarryH.id; + wmsSterilizationInstockH.carry_code = wmsCarryH.carry_code; + wmsSterilizationInstockH.location_id = endlocation.id; + wmsSterilizationInstockH.location_code = endlocation.location_code; + wmsSterilizationInstockH.create_id = WmsWareHouseConst.AdministratorUserId; + wmsSterilizationInstockH.create_time = dateTime; + wmsSterilizationInstockH.instock_time = dateTime; + wmsSterilizationInstockH.org_id = WmsWareHouseConst.AdministratorOrgId; + wmsSterilizationInstockH.xl_location_id = startlocation.id; + wmsSterilizationInstockH.xl_location_code = startlocation.location_code; + wmsSterilizationInstockH.status = WmsWareHouseConst.BILLSTATUS_ADD_ID; + wmsSterilizationInstockH.origin = "生产入库"; + + int row = await db_Floor4MJX2MJC.Insertable(wmsSterilizationInstockH).ExecuteCommandAsync(); + if (row > 0) + LoggerFloor4MJX2MJC.LogInformation($"【四楼灭菌线到解析仓】 灭菌入库记录生成成功"); + else + LoggerFloor4MJX2MJC.LogWarning($"【四楼灭菌线到解析仓】 灭菌入库记录生成失败"); + + bool result_createPretask = await createPretask(startlocation.id, endlocation.id, wmsCarryH.id, wmsCarryH.carry_code, LoggerFloor4MJX2MJC, db_Floor4MJX2MJC, WmsWareHouseConst.BIZTYPE_WMSSTERILIZATIONINSTOCKCH_ID, "", wmsSterilizationInstockH.id); + if (!result_createPretask) + { + LoggerFloor4MJX2MJC.LogWarning($"【四楼灭菌线到解析仓】 {startlocation.location_code} 到 {endlocation.location_code} 预任务生成失败"); + throw new Exception($"【四楼灭菌线到解析仓】 {startlocation.location_code} 到 {endlocation.location_code} 预任务生成失败"); + } + LoggerFloor4MJX2MJC.LogInformation($"【四楼灭菌线到解析仓】 {startlocation.location_code} 到 {endlocation.location_code} 预任务生成成功"); - if (items.Count < 1) - { - LoggerFloor4MJX2MJC.LogWarning($"【四楼待灭菌线到灭菌仓】 没有可以入库的库位"); - break; } - var endlocation = items.First(); - - await db_Floor4MJX2MJC.Ado.BeginTranAsync(); - BasLocation startlocation = await db_Floor4MJX2MJC.Queryable().Where(r => r.location_code == key).FirstAsync(); - - if (startlocation.is_lock == 1) + catch { - LoggerFloor4MJX2MJC.LogWarning($"【四楼待灭菌线到灭菌仓】 起点库位{startlocation.location_code}已锁定"); - continue; + throw; } - string carry_code = (await GetStringTag(strs[0], strs[2])).Replace("\r", "").Replace(" ", ""); - LoggerFloor4MJX2MJC.LogInformation($"【四楼待灭菌线到灭菌仓】 下料点 {key} {strs[2]}采集到 {carry_code}"); - LoggerFloor4MJX2MJC.LogInformation($"【四楼待灭菌线到灭菌仓】 下料点 {key} {strs[2]}采集到长度 {carry_code.Length}"); - WmsCarryH wmsCarryH = await db_Floor4MJX2MJC.Queryable().Where(r => r.carry_code == carry_code).FirstAsync(); - if (wmsCarryH == null) + finally { - LoggerFloor4MJX2MJC.LogWarning($"【四楼待灭菌线到灭菌仓】 托盘号{carry_code}在系统中不存在"); - continue; + semaphoreSlim.Release(); } - //锁定起点库位 - await db_Floor4MJX2MJC.Updateable().SetColumns(r => new BasLocation { is_lock = 1 }).Where(r => r.id == startlocation.id).ExecuteCommandAsync(); - //锁定终点库位 - await db_Floor4MJX2MJC.Updateable().SetColumns(r => new BasLocation { is_lock = 1 }).Where(r => r.id == endlocation.id).ExecuteCommandAsync(); - - DateTime dateTime = DateTime.Now; - WmsSterilizationInstockH wmsSterilizationInstockH = new WmsSterilizationInstockH(); - string code = await _billRullService.GetBillNumber("WmsSterilizationInstockH"); - wmsSterilizationInstockH.bill_code = code; - wmsSterilizationInstockH.carry_id = wmsCarryH.id; - wmsSterilizationInstockH.carry_code = wmsCarryH.carry_code; - wmsSterilizationInstockH.location_id = endlocation.id; - wmsSterilizationInstockH.location_code = endlocation.location_code; - wmsSterilizationInstockH.create_id = WmsWareHouseConst.AdministratorUserId; - wmsSterilizationInstockH.create_time = dateTime; - wmsSterilizationInstockH.instock_time = dateTime; - wmsSterilizationInstockH.org_id = WmsWareHouseConst.AdministratorOrgId; - wmsSterilizationInstockH.xl_location_id = startlocation.id; - wmsSterilizationInstockH.xl_location_code = startlocation.location_code; - wmsSterilizationInstockH.status = WmsWareHouseConst.BILLSTATUS_ADD_ID; - - int row = await db_Floor4MJX2MJC.Insertable(wmsSterilizationInstockH).ExecuteCommandAsync(); - if (row > 0) - LoggerFloor4MJX2MJC.LogInformation($"【四楼待灭菌线到灭菌仓】 灭菌入库记录生成成功"); - else - LoggerFloor4MJX2MJC.LogWarning($"【四楼待灭菌线到灭菌仓】 灭菌入库记录生成失败"); - - bool result_createPretask = await createPretask(startlocation.id, endlocation.id, wmsCarryH.id, wmsCarryH.carry_code, LoggerFloor4MJX2MJC, db_Floor4MJX2MJC, WmsWareHouseConst.BIZTYPE_WMSSTERILIZATIONINSTOCKCH_ID, "", wmsSterilizationInstockH.id); - if (!result_createPretask) - { - LoggerFloor4MJX2MJC.LogWarning($"【四楼待灭菌线到灭菌仓】 {startlocation.location_code} 到 {endlocation.location_code} 预任务生成失败"); - throw new Exception($"【四楼待灭菌线到灭菌仓】 {startlocation.location_code} 到 {endlocation.location_code} 预任务生成失败"); - } - LoggerFloor4MJX2MJC.LogInformation($"【四楼待灭菌线到灭菌仓】 {startlocation.location_code} 到 {endlocation.location_code} 预任务生成成功"); - - } await db_Floor4MJX2MJC.Ado.CommitTranAsync(); } @@ -2523,16 +2537,16 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA } catch (ObjectDisposedException ex) { - LoggerFloor4MJX2MJC.LogError($"【四楼待灭菌线到灭菌仓】 数据库连接异常:{ex.Message}"); - LoggerFloor4MJX2MJC.LogError($"【四楼待灭菌线到灭菌仓】 数据库连接异常:{ex.StackTrace}"); + LoggerFloor4MJX2MJC.LogError($"【四楼灭菌线到解析仓】 数据库连接异常:{ex.Message}"); + LoggerFloor4MJX2MJC.LogError($"【四楼灭菌线到解析仓】 数据库连接异常:{ex.StackTrace}"); if (ex.Source == "Npgsql") db_Floor4MJX2MJC = _repository.AsSugarClient().CopyNew(); } catch (Exception ex) { - Console.WriteLine("【四楼待灭菌线到灭菌仓】" + ex.Message); - LoggerFloor4MJX2MJC.LogError($"【四楼待灭菌线到灭菌仓】 {ex.Message}"); - LoggerFloor4MJX2MJC.LogError($"【四楼待灭菌线到灭菌仓】 {ex.StackTrace}"); + Console.WriteLine("【四楼灭菌线到解析仓】" + ex.Message); + LoggerFloor4MJX2MJC.LogError($"【四楼灭菌线到解析仓】 {ex.Message}"); + LoggerFloor4MJX2MJC.LogError($"【四楼灭菌线到解析仓】 {ex.StackTrace}"); // 数据库连接断开时会报错 try { await db_Floor4MJX2MJC.Ado.RollbackTranAsync(); } catch { }; } @@ -2543,8 +2557,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA try { await db_Floor4MJX2MJC.Ado.CommitTranAsync(); } catch { }; _wareHouseService.GenTaskExecute(); stopwatch.Stop(); - Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 结束四楼待灭菌线到灭菌仓 {stopwatch.ElapsedMilliseconds} ms"); - LoggerTimer.LogInformation($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 结束四楼待灭菌线到灭菌仓 {stopwatch.ElapsedMilliseconds} ms"); + Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 结束四楼灭菌线到解析仓 {stopwatch.ElapsedMilliseconds} ms"); + LoggerTimer.LogInformation($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 结束四楼灭菌线到解析仓 {stopwatch.ElapsedMilliseconds} ms"); } } @@ -2593,60 +2607,79 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA foreach (WmsSterilizationInstockH wmsSterilizationInstockH in wmsSterilizationInstockHs) { - WmsCarryH wmsCarryH = await db_Floor4DMC2CPK.Queryable().Where(r => r.id == wmsSterilizationInstockH.carry_id).FirstAsync(); - - if (wmsCarryH.location_id != wmsSterilizationInstockH.location_id) + SemaphoreSlim semaphoreSlim_MJC = null; + SemaphoreSlim semaphoreSlim_CPK = null; + try { - LoggerFloor4DMC2CPK.LogWarning($"【四楼灭菌仓到成品库】载具{wmsCarryH.carry_code}实际位置与灭菌入库记录位置不一致"); - continue; + semaphoreSlim_MJC = _wareHouseService.GetSemaphore("outstock", WmsWareHouseConst.WAREHOUSE_MJC_ID); + await semaphoreSlim_MJC.WaitAsync(); + semaphoreSlim_CPK = _wareHouseService.GetSemaphore("instock", WmsWareHouseConst.WAREHOUSE_CP_ID); + await semaphoreSlim_CPK.WaitAsync(); + + WmsCarryH wmsCarryH = await db_Floor4DMC2CPK.Queryable().Where(r => r.id == wmsSterilizationInstockH.carry_id).FirstAsync(); + + if (wmsCarryH.location_id != wmsSterilizationInstockH.location_id) + { + LoggerFloor4DMC2CPK.LogWarning($"【四楼灭菌仓到成品库】载具{wmsCarryH.carry_code}实际位置与灭菌入库记录位置不一致"); + continue; + } + + BasLocation startlocation = await db_Floor4DMC2CPK.Queryable().Where(r => r.id == wmsCarryH.location_id).FirstAsync(); + + if (startlocation.is_lock == 1) + { + LoggerFloor4DMC2CPK.LogWarning($"【四楼待灭菌线到灭菌仓】 起点库位{startlocation.location_code}已锁定"); + continue; + } + await db_Floor4DMC2CPK.Ado.BeginTranAsync(); + + + InStockStrategyQuery inStockStrategyInput = new() + { + warehouse_id = WmsWareHouseConst.WAREHOUSE_CP_ID, + Region_id = WmsWareHouseConst.REGION_CPOutstock_ID, + Size = 1 + }; + List items = await _wareHouseService.InStockStrategy(inStockStrategyInput); + + if (items.Count < 1) + { + LoggerFloor4DMC2CPK.LogWarning($"【四楼灭菌仓到成品库】 没有可以入库的库位"); + break; + } + BasLocation endlocation = items[0]; + + //锁定起点库位 + await db_Floor4DMC2CPK.Updateable().SetColumns(r => new BasLocation { is_lock = 1 }).Where(r => r.id == startlocation.id).ExecuteCommandAsync(); + //锁定终点库位 + await db_Floor4DMC2CPK.Updateable().SetColumns(r => new BasLocation { is_lock = 1 }).Where(r => r.id == endlocation.id).ExecuteCommandAsync(); + + bool result_createPretask = await createPretask(startlocation.id, endlocation.id, wmsCarryH.id, wmsCarryH.carry_code, + LoggerFloor4DMC2CPK, db_Floor4DMC2CPK, WmsWareHouseConst.BIZTYPE_WMSSTERILIZATIONINSTOCKCH_ID, "", wmsSterilizationInstockH.id); + if (!result_createPretask) + { + LoggerFloor4DMC2CPK.LogWarning($"【四楼灭菌仓到成品库】 {startlocation.location_code} 到 {endlocation.location_code} 预任务生成失败"); + throw new Exception($"【四楼灭菌仓到成品库】 {startlocation.location_code} 到 {endlocation.location_code} 预任务生成失败"); + } + LoggerFloor4DMC2CPK.LogInformation($"【四楼灭菌仓到成品库】 {startlocation.location_code} 到 {endlocation.location_code} 预任务生成成功"); + + wmsSterilizationInstockH.status = WmsWareHouseConst.BILLSTATUS_ON_ID; + wmsSterilizationInstockH.cp_location_id = endlocation.id; + wmsSterilizationInstockH.cp_location_code = endlocation.location_code; + + await db_Floor4DMC2CPK.Updateable(wmsSterilizationInstockH).UpdateColumns(r => new { r.status }).ExecuteCommandAsync(); + + await db_Floor4DMC2CPK.Ado.CommitTranAsync(); } - - BasLocation startlocation = await db_Floor4DMC2CPK.Queryable().Where(r => r.id == wmsCarryH.location_id).FirstAsync(); - - if (startlocation.is_lock == 1) + catch { - LoggerFloor4DMC2CPK.LogWarning($"【四楼待灭菌线到灭菌仓】 起点库位{startlocation.location_code}已锁定"); - continue; + throw; } - await db_Floor4DMC2CPK.Ado.BeginTranAsync(); - - - InStockStrategyQuery inStockStrategyInput = new() + finally { - warehouse_id = WmsWareHouseConst.WAREHOUSE_CP_ID, - Region_id = WmsWareHouseConst.REGION_CPOutstock_ID, - Size = 1 - }; - List items = await _wareHouseService.InStockStrategy(inStockStrategyInput); - - if (items.Count < 1) - { - LoggerFloor4DMC2CPK.LogWarning($"【四楼灭菌仓到成品库】 没有可以入库的库位"); - break; + semaphoreSlim_MJC.Release(); + semaphoreSlim_CPK.Release(); } - BasLocation endlocation = items[0]; - - //锁定起点库位 - await db_Floor4DMC2CPK.Updateable().SetColumns(r => new BasLocation { is_lock = 1 }).Where(r => r.id == startlocation.id).ExecuteCommandAsync(); - //锁定终点库位 - await db_Floor4DMC2CPK.Updateable().SetColumns(r => new BasLocation { is_lock = 1 }).Where(r => r.id == endlocation.id).ExecuteCommandAsync(); - - bool result_createPretask = await createPretask(startlocation.id, endlocation.id, wmsCarryH.id, wmsCarryH.carry_code, - LoggerFloor4DMC2CPK, db_Floor4DMC2CPK, WmsWareHouseConst.BIZTYPE_WMSSTERILIZATIONINSTOCKCH_ID, "", wmsSterilizationInstockH.id); - if (!result_createPretask) - { - LoggerFloor4DMC2CPK.LogWarning($"【四楼灭菌仓到成品库】 {startlocation.location_code} 到 {endlocation.location_code} 预任务生成失败"); - throw new Exception($"【四楼灭菌仓到成品库】 {startlocation.location_code} 到 {endlocation.location_code} 预任务生成失败"); - } - LoggerFloor4DMC2CPK.LogInformation($"【四楼灭菌仓到成品库】 {startlocation.location_code} 到 {endlocation.location_code} 预任务生成成功"); - - wmsSterilizationInstockH.status = WmsWareHouseConst.BILLSTATUS_ON_ID; - wmsSterilizationInstockH.cp_location_id = endlocation.id; - wmsSterilizationInstockH.cp_location_code = endlocation.location_code; - - await db_Floor4DMC2CPK.Updateable(wmsSterilizationInstockH).UpdateColumns(r => new { r.status }).ExecuteCommandAsync(); - - await db_Floor4DMC2CPK.Ado.CommitTranAsync(); } } catch (ObjectDisposedException ex) @@ -3189,7 +3222,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA Floor4DMJ2MJXtimer = new Timer(Floor4DMJ2MJX, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); Floor4MJX2MJCtimer = new Timer(Floor4MJX2MJC, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); - Floor4DMC2CPKtimer = new Timer(Floor4DMC2CPK, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); + // 需求变更弃用 + //Floor4DMC2CPKtimer = new Timer(Floor4DMC2CPK, null, TimeSpan.Zero, TimeSpan.FromSeconds(10)); F2KTPsupplementtimer = new Timer(F2KTPsupplement, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); YCLInternalTransfertimer = new Timer(YCLInternalTransfer, null, TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(185)); @@ -3391,7 +3425,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA { get { - string newFileName = $"{AppContext.BaseDirectory}/logs/{DateTime.Now:yyyyMMdd}/原材料仓/custom{DateTime.Now:yyyyMMdd}八工位空托盘补充.log"; + string newFileName = $"{AppContext.BaseDirectory}/logs/{DateTime.Now:yyyyMMdd}/原材料仓/custom{DateTime.Now:yyyyMMdd}八工位入库/空托盘补充.log"; if (_LoggerBGWCarrySupplementFileName != newFileName) { ILoggerFactory loggerFactory = LoggerFactory.Create(builder => builder.AddFile(newFileName, cfgOpts => @@ -3561,7 +3595,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA { get { - string newFileName = $"{AppContext.BaseDirectory}/logs/{DateTime.Now:yyyyMMdd}/四楼灭菌/custom{DateTime.Now:yyyyMMdd}灭菌仓到成品仓.log"; + string newFileName = $"{AppContext.BaseDirectory}/logs/{DateTime.Now:yyyyMMdd}/四楼灭菌/custom{DateTime.Now:yyyyMMdd}四楼灭菌线到解析仓.log"; if (_LoggerFloor4DMC2CPKFileName != newFileName) { ILoggerFactory loggerFactory = LoggerFactory.Create(builder => builder.AddFile(newFileName, cfgOpts => diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs index db25d0ab..6767139d 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs @@ -126,6 +126,10 @@ namespace Tnb.WarehouseMgr.Entities.Consts /// 外协调拨出库 /// public const string MATERIALTRANSFER_WXDBOUTWAREHOUSE_CODE = "wxdbOutWarehouse"; + /// + /// 灭菌入库 + /// + public const string MATERIALTRANSFER_SterilizationInstock_CODE = "SterilizationInstock"; /// /// 出入库单据状态TypeID diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/DistributeF4JXCInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/DistributeF4JXCInput.cs new file mode 100644 index 00000000..35526653 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/DistributeF4JXCInput.cs @@ -0,0 +1,17 @@ +namespace Tnb.WarehouseMgr.Entities.Dto +{ + /// + /// 库房业务更新输入参数 + /// + public class DistributeF4JXCInput + { + /// + /// 组织ID + /// + public string org_id { get; set; } + /// + /// 来源单据id + /// + public string? source_id { get; set; } + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsSterilizationInstockH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsSterilizationInstockH.cs index 4a20ffa4..aa340b74 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsSterilizationInstockH.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsSterilizationInstockH.cs @@ -89,9 +89,14 @@ public partial class WmsSterilizationInstockH : BaseEntity /// public string? status { get; set; } - /// /// 单号 /// public string? bill_code { get; set; } + + /// + /// 来源 + /// + public string? origin { get; set; } + } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs index 95c739ac..c9bf2a04 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs @@ -72,6 +72,16 @@ namespace Tnb.WarehouseMgr public static SemaphoreSlim _s_taskExecuteSemaphore_F4DMJCInstock = new(1); public static SemaphoreSlim _s_taskExecuteSemaphore_F4DMJCOutstock = new(1); /// + /// 解析库 + /// + public static SemaphoreSlim _s_taskExecuteSemaphore_F4JXKOutstock = new(1); + public static SemaphoreSlim _s_taskExecuteSemaphore_F4JXKInstock = new(1); + /// + /// 二楼空托区 + /// + public static SemaphoreSlim _s_taskExecuteSemaphore_F2KTQOutstock = new(1); + public static SemaphoreSlim _s_taskExecuteSemaphore_F2KTQInstock = new(1); + /// /// 成品仓 /// public static SemaphoreSlim _s_taskExecuteSemaphore_F3CPInstock = new(1); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs b/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs index afa24c4f..4635fadb 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs @@ -622,7 +622,8 @@ namespace Tnb.WarehouseMgr wmsOutsourceOrderD.fk_wms_outsource_order_id = wmsOutsourceOrderH.id; wmsOutsourceOrderD.matcode = detail.material_code; - var erpExtendField = await db.Queryable().InnerJoin((a, b) => a.table_id == b.Id).Where((a, b) => b.EnCode == detail.unit_code).Select((a, b) => b).FirstAsync(); + var erpExtendField = await db.Queryable().InnerJoin((a, b) => a.table_id == b.Id).Where((a, b) => a.cunitid == detail.unit_code).Select((a, b) => b).FirstAsync(); + if (erpExtendField != null) { wmsOutsourceOrderD.unit_id = erpExtendField.Id; @@ -761,6 +762,9 @@ namespace Tnb.WarehouseMgr // 外协调拨出库 else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_ZC_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_YCL_ID) transfer_type = WmsWareHouseConst.MATERIALTRANSFER_WXDBOUTWAREHOUSE_CODE; + // 灭菌入库 + else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_JXK_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_CP_ID) + transfer_type = WmsWareHouseConst.MATERIALTRANSFER_SterilizationInstock_CODE; #endregion //var wmsMaterialTransferdsDistinct = input.details.Select(r => new @@ -1025,6 +1029,9 @@ namespace Tnb.WarehouseMgr // 外协调拨出库 else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_ZC_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_YCL_ID) transfer_type = WmsWareHouseConst.MATERIALTRANSFER_WXDBOUTWAREHOUSE_CODE; + // 灭菌入库 + else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_JXK_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_CP_ID) + transfer_type = WmsWareHouseConst.MATERIALTRANSFER_SterilizationInstock_CODE; #endregion diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index 160235dc..d91a219a 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -132,6 +132,14 @@ namespace Tnb.WarehouseMgr { get { return _s_taskExecuteSemaphore_F2ZCCOutstock; } } + public SemaphoreSlim s_taskExecuteSemaphore_F4JXKOutstock + { + get { return _s_taskExecuteSemaphore_F4JXKOutstock; } + } + public SemaphoreSlim s_taskExecuteSemaphore_F4JXKInstock + { + get { return _s_taskExecuteSemaphore_F4JXKInstock; } + } public Dictionary s_elevatortaskDic @@ -1216,20 +1224,20 @@ namespace Tnb.WarehouseMgr getdic.Add("ZSSSXCTU02", new string[] { "YTCS", "右输送线上层允许出箱3", "true" }); getdic.Add("ZSSSXCTU01", new string[] { "YTCS", "左输送线上层允许出箱1", "true" }); getdic.Add("SSX-011-008", new string[] { "东面提升机输送线", "入库输送线8出箱完毕", "true" }); - getdic.Add("ZS-C01-2", new string[] { "hxjC", "A2AGV允许入满箱", "true" }); - getdic.Add("ZS-C02-2", new string[] { "hxjC", "A3AGV允许入满箱", "true" }); - getdic.Add("ZS-C03-2", new string[] { "hxjC", "A4AGV允许入满箱", "true" }); - getdic.Add("ZS-C04-2", new string[] { "hxjC", "A5AGV允许入满箱", "true" }); - getdic.Add("ZS-C05-2", new string[] { "hxjC", "A6AGV允许入满箱", "true" }); - getdic.Add("ZS-C06-2", new string[] { "hxjC", "A7AGV允许入满箱", "true" }); - getdic.Add("ZS-C07-2", new string[] { "hxjC", "A8AGV允许入满箱", "true" }); - getdic.Add("ZS-C08-2", new string[] { "hxjC", "A9AGV允许入满箱", "true" }); - getdic.Add("ZS-C09-2", new string[] { "hxjC", "A10AGV允许入满箱", "true" }); - getdic.Add("ZS-C10-2", new string[] { "hxjC", "A11AGV允许入满箱", "true" }); - getdic.Add("ZS-C11-2", new string[] { "hxjC", "A12AGV允许入满箱", "true" }); - getdic.Add("ZS-C12-2", new string[] { "hxjC", "A13AGV允许入满箱", "true" }); - getdic.Add("ZS-C13-2", new string[] { "hxjC", "A14AGV允许入满箱", "true" }); - getdic.Add("ZS-C14-2", new string[] { "hxjC", "A1AGV允许入满箱", "true" }); + getdic.Add("ZS-C01-2", new string[] { "hxjC", "A2AGV允许入满箱", "false" }); + getdic.Add("ZS-C02-2", new string[] { "hxjC", "A3AGV允许入满箱", "false" }); + getdic.Add("ZS-C03-2", new string[] { "hxjC", "A4AGV允许入满箱", "false" }); + getdic.Add("ZS-C04-2", new string[] { "hxjC", "A5AGV允许入满箱", "false" }); + getdic.Add("ZS-C05-2", new string[] { "hxjC", "A6AGV允许入满箱", "false" }); + getdic.Add("ZS-C06-2", new string[] { "hxjC", "A7AGV允许入满箱", "false" }); + getdic.Add("ZS-C07-2", new string[] { "hxjC", "A8AGV允许入满箱", "false" }); + getdic.Add("ZS-C08-2", new string[] { "hxjC", "A9AGV允许入满箱", "false" }); + getdic.Add("ZS-C09-2", new string[] { "hxjC", "A10AGV允许入满箱", "false" }); + getdic.Add("ZS-C10-2", new string[] { "hxjC", "A11AGV允许入满箱", "false" }); + getdic.Add("ZS-C11-2", new string[] { "hxjC", "A12AGV允许入满箱", "false" }); + getdic.Add("ZS-C12-2", new string[] { "hxjC", "A13AGV允许入满箱", "false" }); + getdic.Add("ZS-C13-2", new string[] { "hxjC", "A14AGV允许入满箱", "false" }); + getdic.Add("ZS-C14-2", new string[] { "hxjC", "A1AGV允许入满箱", "false" }); //getdic.Add("ZS-A01-2", new string[] { "hxjA", "A3AGV允许入满箱", "true" }); //getdic.Add("ZS-A02-2", new string[] { "hxjA", "A4AGV允许入满箱", "true" }); @@ -1237,12 +1245,12 @@ namespace Tnb.WarehouseMgr //getdic.Add("ZS-D06-2", new string[] { "hxjA", "A6AGV允许入满箱", "true" }); //getdic.Add("ZS-A05-2", new string[] { "hxjA", "A7AGV允许入满箱", "true" }); //getdic.Add("ZS-A06-2", new string[] { "hxjA", "A8AGV允许入满箱", "true" }); - getdic.Add("ZS-A07-2", new string[] { "hxjA", "A9AGV允许入满箱", "true" }); - getdic.Add("ZS-A08-2", new string[] { "hxjA", "A10AGV允许入满箱", "true" }); - getdic.Add("ZS-A09-2", new string[] { "hxjA", "A11AGV允许入满箱", "true" }); - getdic.Add("ZS-A10-2", new string[] { "hxjA", "A12AGV允许入满箱", "true" }); - getdic.Add("ZS-A11-2", new string[] { "hxjA", "A13AGV允许入满箱", "true" }); - getdic.Add("ZS-A12-2", new string[] { "hxjA", "A14AGV允许入满箱", "true" }); + getdic.Add("ZS-A07-2", new string[] { "hxjA", "A9AGV允许入满箱", "false" }); + getdic.Add("ZS-A08-2", new string[] { "hxjA", "A10AGV允许入满箱", "false" }); + getdic.Add("ZS-A09-2", new string[] { "hxjA", "A11AGV允许入满箱", "false" }); + getdic.Add("ZS-A10-2", new string[] { "hxjA", "A12AGV允许入满箱", "false" }); + getdic.Add("ZS-A11-2", new string[] { "hxjA", "A13AGV允许入满箱", "false" }); + getdic.Add("ZS-A12-2", new string[] { "hxjA", "A14AGV允许入满箱", "false" }); getdic.Add("ZS-D01-2", new string[] { "hxjA", "A1AGV允许入满箱", "false" }); getdic.Add("ZS-D02-2", new string[] { "hxjA", "A2AGV允许入满箱", "false" }); @@ -1264,20 +1272,20 @@ namespace Tnb.WarehouseMgr putdic.Add("SSX-121-009", new string[] { "东面提升机输送线", "上升降机9入箱完毕", "true" }); putdic.Add("SSX-121-010", new string[] { "东面提升机输送线", "上升降机10入箱完毕", "true" }); putdic.Add("YCLCKBGW", new string[] { "CP8", "PutDoneEmptyBox", "true" }); - putdic.Add("ZS-C01-1", new string[] { "hxjC", "A2AGV允许出空箱", "true" }); - putdic.Add("ZS-C02-1", new string[] { "hxjC", "A3AGV允许出空箱", "true" }); - putdic.Add("ZS-C03-1", new string[] { "hxjC", "A4AGV允许出空箱", "true" }); - putdic.Add("ZS-C04-1", new string[] { "hxjC", "A5AGV允许出空箱", "true" }); - putdic.Add("ZS-C05-1", new string[] { "hxjC", "A6AGV允许出空箱", "true" }); - putdic.Add("ZS-C06-1", new string[] { "hxjC", "A7AGV允许出空箱", "true" }); - putdic.Add("ZS-C07-1", new string[] { "hxjC", "A8AGV允许出空箱", "true" }); - putdic.Add("ZS-C08-1", new string[] { "hxjC", "A9AGV允许出空箱", "true" }); - putdic.Add("ZS-C09-1", new string[] { "hxjC", "A10AGV允许出空箱", "true" }); - putdic.Add("ZS-C10-1", new string[] { "hxjC", "A11AGV允许出空箱", "true" }); - putdic.Add("ZS-C11-1", new string[] { "hxjC", "A12AGV允许出空箱", "true" }); - putdic.Add("ZS-C12-1", new string[] { "hxjC", "A13AGV允许出空箱", "true" }); - putdic.Add("ZS-C13-1", new string[] { "hxjC", "A14AGV允许出空箱", "true" }); - putdic.Add("ZS-C14-1", new string[] { "hxjC", "A1AGV允许出空箱", "true" }); + putdic.Add("ZS-C01-1", new string[] { "hxjC", "A2AGV允许出空箱", "false" }); + putdic.Add("ZS-C02-1", new string[] { "hxjC", "A3AGV允许出空箱", "false" }); + putdic.Add("ZS-C03-1", new string[] { "hxjC", "A4AGV允许出空箱", "false" }); + putdic.Add("ZS-C04-1", new string[] { "hxjC", "A5AGV允许出空箱", "false" }); + putdic.Add("ZS-C05-1", new string[] { "hxjC", "A6AGV允许出空箱", "false" }); + putdic.Add("ZS-C06-1", new string[] { "hxjC", "A7AGV允许出空箱", "false" }); + putdic.Add("ZS-C07-1", new string[] { "hxjC", "A8AGV允许出空箱", "false" }); + putdic.Add("ZS-C08-1", new string[] { "hxjC", "A9AGV允许出空箱", "false" }); + putdic.Add("ZS-C09-1", new string[] { "hxjC", "A10AGV允许出空箱", "false" }); + putdic.Add("ZS-C10-1", new string[] { "hxjC", "A11AGV允许出空箱", "false" }); + putdic.Add("ZS-C11-1", new string[] { "hxjC", "A12AGV允许出空箱", "false" }); + putdic.Add("ZS-C12-1", new string[] { "hxjC", "A13AGV允许出空箱", "false" }); + putdic.Add("ZS-C13-1", new string[] { "hxjC", "A14AGV允许出空箱", "false" }); + putdic.Add("ZS-C14-1", new string[] { "hxjC", "A1AGV允许出空箱", "false" }); //putdic.Add("ZS-A01-1", new string[] { "hxjA", "A3AGV允许出空箱", "true" }); //putdic.Add("ZS-A02-1", new string[] { "hxjA", "A4AGV允许出空箱", "true" }); @@ -1285,12 +1293,12 @@ namespace Tnb.WarehouseMgr //putdic.Add("ZS-D06-1", new string[] { "hxjA", "A6AGV允许出空箱", "false" }); //putdic.Add("ZS-A05-1", new string[] { "hxjA", "A7AGV允许出空箱", "true" }); //putdic.Add("ZS-A06-1", new string[] { "hxjA", "A8AGV允许出空箱", "true" }); - putdic.Add("ZS-A07-1", new string[] { "hxjA", "A9AGV允许出空箱", "true" }); - putdic.Add("ZS-A08-1", new string[] { "hxjA", "A10AGV允许出空箱", "true" }); - putdic.Add("ZS-A09-1", new string[] { "hxjA", "A11AGV允许出空箱", "true" }); - putdic.Add("ZS-A10-1", new string[] { "hxjA", "A12AGV允许出空箱", "true" }); + putdic.Add("ZS-A07-1", new string[] { "hxjA", "A9AGV允许出空箱", "false" }); + putdic.Add("ZS-A08-1", new string[] { "hxjA", "A10AGV允许出空箱", "false" }); + putdic.Add("ZS-A09-1", new string[] { "hxjA", "A11AGV允许出空箱", "false" }); + putdic.Add("ZS-A10-1", new string[] { "hxjA", "A12AGV允许出空箱", "false" }); putdic.Add("ZS-A11-1", new string[] { "hxjA", "A13AGV允许出空箱", "false" }); - putdic.Add("ZS-A12-1", new string[] { "hxjA", "A14AGV允许出空箱", "true" }); + putdic.Add("ZS-A12-1", new string[] { "hxjA", "A14AGV允许出空箱", "false" }); // D线 待改成配置 putdic.Add("ZS-D01-1", new string[] { "hxjA", "A1AGV允许出空箱", "false" }); @@ -2874,7 +2882,8 @@ namespace Tnb.WarehouseMgr WmsCarryH wmsCarryH = await _db.Queryable().Where(r => r.location_id == wmsDistaskH.startlocation_id && r.carry_code != wmsDistaskH.carry_code).FirstAsync(); BasLocation startlocation = await _db.Queryable().Where(r => r.location_code == wmsDistaskH.startlocation_code).FirstAsync(); - if (wmsCarryH != null && startlocation.is_type == ((int)(EnumLocationType.存储库位)).ToString()) + WmsCarryH wmsTaskCarryH = await _db.Queryable().Where(r => r.id == wmsDistaskH.carry_id).FirstAsync(); + if (wmsCarryH != null && startlocation.is_type == ((int)(EnumLocationType.存储库位)).ToString() && wmsTaskCarryH.carrystd_id != WmsWareHouseConst.CARRY_LJSTD_ID) { throw Oops.Bah($"任务单{wmsDistaskH.bill_code}的起点库位{wmsDistaskH.startlocation_code}是存储库位,且已被载具{wmsCarryH.carry_code}占用!"); } @@ -2973,7 +2982,8 @@ namespace Tnb.WarehouseMgr { WmsCarryH wmsCarryH = await _db.Queryable().Where(r => r.location_id == wmsDistaskH.endlocation_id && r.carry_code != wmsDistaskH.carry_code).FirstAsync(); BasLocation endlocation = await _db.Queryable().Where(r => r.location_code == wmsDistaskH.endlocation_code).FirstAsync(); - if (wmsCarryH != null && endlocation.is_type == ((int)(EnumLocationType.存储库位)).ToString()) + WmsCarryH wmsTaskCarryH = await _db.Queryable().Where(r => r.id == wmsDistaskH.carry_id).FirstAsync(); + if (wmsCarryH != null && endlocation.is_type == ((int)(EnumLocationType.存储库位)).ToString() && wmsTaskCarryH.carrystd_id != WmsWareHouseConst.CARRY_LJSTD_ID) { throw Oops.Bah($"任务单{wmsDistaskH.bill_code}的终点库位{wmsDistaskH.endlocation_code}是存储库位,且已被载具{wmsCarryH.carry_code}占用!"); } @@ -3587,8 +3597,8 @@ namespace Tnb.WarehouseMgr // points.Add(wmsPointHs.Where(r => r.id == pEndId).First()); //} #endregion - //1-3 - if (startlocation.wh_id == WmsWareHouseConst.WAREHOUSE_CPCRK_ID && endlocation.wh_id == WmsWareHouseConst.WAREHOUSE_CP_ID) + //1-4 + if (startlocation.wh_id == WmsWareHouseConst.WAREHOUSE_CPCRK_ID && endlocation.wh_id == WmsWareHouseConst.WAREHOUSE_JXK_ID) { WmsElevatorH wmsElevatorH = await _db.Queryable().Where(it => it.elevator_group == "2" && it.enabled == 1).OrderBy(r => r.task_nums).FirstAsync(); string elevatorSno = wmsElevatorH.elevator_code.Replace("Elevator", ""); @@ -3596,8 +3606,8 @@ namespace Tnb.WarehouseMgr points.Add(wmsPointHs.Where(r => r.id == pStartId).First()); points.Add(wmsPointHs.Where(r => r.point_code == $"DT-01-0{elevatorSno}").First()); points.Add(wmsPointHs.Where(r => r.point_code == $"DT-1-{elevatorSno}").First()); - points.Add(wmsPointHs.Where(r => r.point_code == $"DT-3-{elevatorSno}").First()); - points.Add(wmsPointHs.Where(r => r.point_code == $"DT-03-0{elevatorSno}").First()); + points.Add(wmsPointHs.Where(r => r.point_code == $"DT-4-{elevatorSno}").First()); + points.Add(wmsPointHs.Where(r => r.point_code == $"DT-04-0{elevatorSno}").First()); points.Add(wmsPointHs.Where(r => r.id == pEndId).First()); } // 2-4 @@ -4596,6 +4606,22 @@ namespace Tnb.WarehouseMgr result = _s_taskExecuteSemaphore_F2BCQInstock; break; } + case WmsWareHouseConst.WAREHOUSE_MJC_ID: + { + if (type == "outstock") + result = _s_taskExecuteSemaphore_F4JXKOutstock; + else if (type == "instock") + result = _s_taskExecuteSemaphore_F4JXKInstock; + break; + } + case WmsWareHouseConst.WAREHOUSE_F2KTQ_ID: + { + if (type == "outstock") + result = _s_taskExecuteSemaphore_F2KTQOutstock; + else if (type == "instock") + result = _s_taskExecuteSemaphore_F2KTQInstock; + break; + } } return result; } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialSignHService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialSignHService.cs index 23318609..d4771d02 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialSignHService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialSignHService.cs @@ -91,6 +91,11 @@ namespace Tnb.WarehouseMgr throw new ArgumentNullException(nameof(input)); } + if (input.details.Count == 0) + { + throw new AppFriendlyException($"【MaterialSign】未接收到物料列表数据,请重试", 500); + } + WmsCarryH wmsCarryH = await _db.Queryable().Where(r => r.carry_code == input.carry_code).FirstAsync(); if (wmsCarryH == null) { @@ -282,6 +287,7 @@ namespace Tnb.WarehouseMgr } } + await _db.Updateable().SetColumns(r => r.is_use == "0").Where(r => r.id == carryLoc.id).ExecuteCommandAsync(); await _db.Insertable(wmsMaterialSignH).ExecuteCommandAsync(); await _db.Insertable(wmsMaterialSignDs).ExecuteCommandAsync(); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs index 23d0355e..c5b75933 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs @@ -380,7 +380,7 @@ namespace Tnb.WarehouseMgr List endLocations = new List(); // 集中供料区三工位 - if (wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_JZGL_ID|| wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_WBZHHC_ID) + if (wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_JZGL_ID || wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_WBZHHC_ID) { // 控制权限 原材料出库到集中供料权限 1.注塑加料工权限 2.注塑领班权限 var power = _db.Queryable() @@ -474,6 +474,186 @@ namespace Tnb.WarehouseMgr return await ToApiResult(HttpStatusCode.OK, "成功"); } + /// + /// 灭菌入库 + /// + /// + /// + /// + /// + public async Task DistributeF4JXC(DistributeF4JXCInput input) + { + SemaphoreSlim semaphoreSlim_MJC = null; + SemaphoreSlim semaphoreSlim_CPK = null; + try + { + semaphoreSlim_MJC = _wareHouseService.GetSemaphore("outstock", WmsWareHouseConst.WAREHOUSE_MJC_ID); + await semaphoreSlim_MJC.WaitAsync(); + semaphoreSlim_CPK = _wareHouseService.GetSemaphore("instock", WmsWareHouseConst.WAREHOUSE_CP_ID); + await semaphoreSlim_CPK.WaitAsync(); + + if (string.IsNullOrEmpty(input.source_id)) + { + throw new AppFriendlyException("来源单据id不可为空", 500); + } + + WmsMaterialTransfer wmsMaterialTransfer = await _db.Queryable().FirstAsync(it => it.id == input.source_id); + List wmsMaterialTransferDs = _db.Queryable() + .Where(a => a.bill_id == wmsMaterialTransfer.id).ToList(); + + if (wmsMaterialTransfer == null) + { + throw new AppFriendlyException($"不存在id为{input.source_id}的转库单", 500); + } + + await _db.Ado.BeginTranAsync(); + + foreach (WmsMaterialTransferD wmsMaterialTransferD in wmsMaterialTransferDs) + { + // 转库单载具子表 + List wmsMaterialTransferCarrys = new List(); + + // 需要转库数量 + decimal needOut = (wmsMaterialTransferD.qty - wmsMaterialTransferD.yxfqty).Value; + + //出库取起点,获取所有符合输入的载具规格的载具 + OutStockStrategyQuery outStockStrategyInput = new() + { + warehouse_id = WmsWareHouseConst.WAREHOUSE_HCC_ID, + material_id = wmsMaterialTransferD.material_id, + code_batch = wmsMaterialTransferD.code_batch, + qty = needOut, + dbConn = _db + }; + List> carryitems = await _wareHouseService.OutStockStrategy_saleRelease(outStockStrategyInput); + List> items_pretask = carryitems.Where(r => r.Item1 == "预任务").ToList(); + + decimal canOutstockQty = items_pretask.Sum(r => r.Item3.codeqty).ParseToDecimal(); + if (canOutstockQty != needOut) + { + throw new AppFriendlyException($@"当前可出库数量与需要出库数量不一致时无法出库! 当前可出库数量为 {canOutstockQty.ToString("G")},需要出库数量为{needOut.ToString("G")}", 500); + } + + InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_CP_ID, Size = items_pretask.Count, Region_id = WmsWareHouseConst.REGION_CPOutstock_ID }; + List endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput); + + int instockLocIndex = 0; + foreach (Tuple item in items_pretask) + { + WmsCarryH wmsCarryH = item.Item2; + WmsCarryCode carryCode = item.Item3; + decimal codeqty = carryCode.codeqty; + BasLocation startLocation = item.Item4; + + + WmsSterilizationInstockH wmsSterilizationInstockH = await _db.Queryable().Where(r => r.carry_id == wmsCarryH.id + && r.status == WmsWareHouseConst.BILLSTATUS_ADD_ID && r.origin == "外协调拨入库").FirstAsync(); + if (wmsSterilizationInstockH == null) + { + Logger.LogWarning($"【四楼静置仓到成品库】载具{wmsCarryH.carry_code}没有找到新增状态且来源是外协调拨入库的灭菌入库记录!"); + continue; + } + if (wmsCarryH.location_id != wmsSterilizationInstockH.location_id) + { + Logger.LogWarning($"【四楼静置仓到成品库】载具{wmsCarryH.carry_code}实际位置与灭菌入库记录位置不一致"); + continue; + } + + BasLocation startlocation = await _db.Queryable().Where(r => r.id == wmsCarryH.location_id).FirstAsync(); + + if (startlocation.is_lock == 1) + { + Logger.LogWarning($"【四楼静置仓到成品库】 起点库位{startlocation.location_code}已锁定"); + continue; + } + + wmsSterilizationInstockH.status = WmsWareHouseConst.BILLSTATUS_ON_ID; + wmsSterilizationInstockH.cp_location_id = endLocations[instockLocIndex].id; + wmsSterilizationInstockH.cp_location_code = endLocations[instockLocIndex].location_code; + + await _db.Updateable(wmsSterilizationInstockH).UpdateColumns(r => new { r.status }).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 = _userManager.UserId; + wmsMaterialTransferCarry.create_time = DateTime.Now; + wmsMaterialTransferCarry.endlocation_id = endLocations[instockLocIndex].id; + wmsMaterialTransferCarry.endlocation_code = endLocations[instockLocIndex].location_code; + wmsMaterialTransferCarry.startlocation_id = startLocation.id; + wmsMaterialTransferCarry.startlocation_code = startLocation.location_code; + wmsMaterialTransferCarry.mat_bill_id = wmsMaterialTransferD.id; + wmsMaterialTransferCarry.qty = codeqty; + wmsMaterialTransferCarrys.Add(wmsMaterialTransferCarry); + + await _db.Updateable().SetColumns(r => r.work_station == wmsMaterialTransferD.station_code).Where(r => r.id == wmsCarryH.id).ExecuteCommandAsync(); + + instockLocIndex++; + } + + await _db.Updateable().SetColumns(r => new WmsMaterialTransfer + { + status = WmsWareHouseConst.BILLSTATUS_ON_ID, + carry_count = (r.carry_count == null ? 0 : r.carry_count) + wmsMaterialTransferCarrys.Count, + remainbindracknum = (r.remainbindracknum == null ? 0 : r.remainbindracknum) + wmsMaterialTransferCarrys.Count + }).Where(r => r.id == input.source_id).ExecuteCommandAsync(); + Logger.LogInformation($"【DistributeF4JXC】更新转库单{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.WMS_PRETASK_OUTSTOCK_TYPE_ID; + commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID; + commonCreatePretaskInput.source_id = wmsMaterialTransferCarry.mat_bill_id; + commonCreatePretaskInput.isExcuteMission = false; + + var res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput, _db); + if (res.code != JNPF.Common.Enums.HttpStatusCode.OK) + { + Logger.LogInformation($"【DistributeF4JXC】生成预任务失败 载具 {wmsMaterialTransferCarry.carry_code}"); + throw new AppFriendlyException($"生成预任务失败 载具 {wmsMaterialTransferCarry.carry_code}", 500); + } + JObject keyValuePairs = JObject.Parse(res.data.ToString()); + JArray array = JArray.Parse(keyValuePairs["pretaskids"].ToString()); + wmsMaterialTransferCarry.pretask_id = array[0].ToString(); + + await _db.Updateable().SetColumns(r => r.yxfqty == r.yxfqty + wmsMaterialTransferCarry.qty).Where(r => r.id == wmsMaterialTransferCarry.mat_bill_id).ExecuteCommandAsync(); + } + + await _db.Insertable(wmsMaterialTransferCarrys).ExecuteCommandAsync(); + Logger.LogInformation($"【DistributeF4JXC】插入转库单{wmsMaterialTransfer.bill_code}载具表的数据"); + + Logger.LogInformation($"转库单{wmsMaterialTransfer.bill_code} 行号 {wmsMaterialTransferD.lineno}预任务{wmsMaterialTransferCarrys.Count}条全部生成成功"); + } + + await _db.Ado.CommitTranAsync(); + + + + } + catch(Exception ex) + { + await _db.Ado.RollbackTranAsync(); + Logger.LogError("【DistributeF4JXC】" + ex.Message); + Logger.LogError("【DistributeF4JXC】" + ex.StackTrace); + return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); + } + finally + { + semaphoreSlim_MJC.Release(); + semaphoreSlim_CPK.Release(); + } + + + return await ToApiResult(HttpStatusCode.OK, "成功"); + } + [HttpPost, NonUnify, AllowAnonymous] public async Task QtckList(QueryQTCKInput input) diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDACarryBindService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDACarryBindService.cs index 5b6e1a6d..3b11f5d1 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDACarryBindService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDACarryBindService.cs @@ -157,7 +157,7 @@ namespace Tnb.WarehouseMgr }*/ /// - /// 1楼到3楼 外协入库 + /// 1楼到4楼 外协入库 /// /// /// @@ -198,7 +198,7 @@ namespace Tnb.WarehouseMgr } await _db.Ado.BeginTranAsync(); //入库取终点 //出库起点 - InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_CP_ID,Region_id = WmsWareHouseConst.REGION_CPOutstock_ID, Size = 1 }; + InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_JXK_ID, Size = 1 }; List endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput); if (endLocations.Count == 0) { diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPackInstockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPackInstockService.cs index 42ec0b47..15309423 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPackInstockService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPackInstockService.cs @@ -94,13 +94,11 @@ namespace Tnb.WarehouseMgr } } - await _db.Ado.CommitTranAsync(); } catch (Exception ex) { Logger.LogWarning("【WmsPackInstockService ModifyAsync】" + ex.Message); Logger.LogWarning("【WmsPackInstockService ModifyAsync】" + ex.StackTrace); - await _db.Ado.RollbackTranAsync(); } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsSaleReleaseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsSaleReleaseService.cs index c25f8335..6236ec43 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsSaleReleaseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsSaleReleaseService.cs @@ -205,7 +205,7 @@ namespace Tnb.WarehouseMgr if (endLocations.Count < items_pretask.Count) { - throw new AppFriendlyException("三楼人工出库区没有足够的未锁定且空闲的出库工位", 500); + throw new AppFriendlyException($"三楼人工出库区没有足够的未锁定且空闲的出库库位!需要{items_pretask.Count}个库位,实际可用{endLocations.Count}个库位", 500); } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsSortingtaskService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsSortingtaskService.cs index 75a7f811..6677f821 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsSortingtaskService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsSortingtaskService.cs @@ -106,33 +106,33 @@ namespace Tnb.WarehouseMgr else { input.sidx = input.sidx.Replace("create_time", "a.create_time").Replace("erp_bill_code", "e.erp_bill_code"); - } - Dictionary status_dic = await _db.Queryable() - .InnerJoin((a, b) => a.Id == b.DictionaryTypeId) - .Where((a, b) => a.FullName == "单据状态").Select((a, b) => b).ToDictionaryAsync(k => k.Id, v => v.FullName); - - SqlSugarPagedList result = await _db.Queryable() + var _result = await _db.Queryable() .InnerJoin((a, b) => a.carry_id == b.carry_id) .InnerJoin((a, b, c) => b.material_id == c.id) .InnerJoin((a, b, c, d) => a.source_id == d.id) .InnerJoin((a, b, c, d, e) => e.id == d.bill_id) - .WhereIF(!string.IsNullOrEmpty(status), (a, b, c, d, e) => a.status == status) - .Select((a, b, c, d, e) => new WmsSortingtask + .InnerJoin((a, b, c, d, e, f) => f.Id == a.status) + .WhereIF(!string.IsNullOrEmpty(status), (a, b, c, d, e, f) => a.status == status) + .Select((a, b, c, d, e, f) => new WmsSortingtask { + id = a.id, create_time = DateTime.Parse(a.create_time.ToString("yyyy-MM-dd HH:mm:ss")), material_id = c.id, - material_code =c.code , + material_code = c.code, material_name = c.name, - material_specification =c.material_specification, + material_specification = c.material_specification, code_batch = b.code_batch, - erp_bill_code = e.erp_bill_code + erp_bill_code = e.erp_bill_code, + status = f.FullName }, true) .OrderBy($"{input.sidx} {input.sort}") .ToPagedListAsync(input.currentPage, input.pageSize); - return PageResult.SqlSugarPageResult(result); + var result = PageResult.SqlSugarPageResult(_result); + + return result; } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsStockReportService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsStockReportService.cs index 8a624f16..7d78cf00 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsStockReportService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsStockReportService.cs @@ -66,6 +66,7 @@ namespace Tnb.WarehouseMgr .WhereIF(!string.IsNullOrEmpty(container_no), (a, b, c, d, e, f) => f.container_no.Contains(container_no)) .WhereIF(!string.IsNullOrEmpty(material_code), (a, b, c, d, e, f) => f.code.Contains(material_code)) .WhereIF(!string.IsNullOrEmpty(warehouse_id), (a, b, c, d, e, f) => c.wh_id == warehouse_id) + .Where((a, b, c, d, e, f) => c.is_type == ((int)EnumLocationType.存储库位).ToString()) .Select((a, b, c, d, e, f, g, h) => new WmsStockReportH { org_id = e.org_id, @@ -136,6 +137,7 @@ namespace Tnb.WarehouseMgr .WhereIF(!string.IsNullOrEmpty(container_no), (a, b, c, d, e, f, g, h) => f.container_no.Contains(container_no)) .WhereIF(!string.IsNullOrEmpty(material_code), (a, b, c, d, e, f) => f.code.Contains(material_code)) .WhereIF(!string.IsNullOrEmpty(warehouse_id), (a, b, c, d, e, f) => c.wh_id == warehouse_id) + .Where((a, b, c, d, e, f) => c.is_type == ((int)EnumLocationType.存储库位).ToString()) .Select((a, b, c, d, e, f, g, h) => new WmsStockReportH { org_id = e.org_id, diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsTransferInstockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsTransferInstockService.cs index db8f8d75..f47b7037 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsTransferInstockService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsTransferInstockService.cs @@ -30,6 +30,7 @@ using Tnb.WarehouseMgr.Interfaces; using Tnb.BasicData; using Tnb.ProductionMgr.Entities.Entity; using Tnb.BasicData.Interfaces; +using System.Security.Cryptography.X509Certificates; namespace Tnb.WarehouseMgr { @@ -73,6 +74,31 @@ namespace Tnb.WarehouseMgr { throw new ArgumentNullException(nameof(input)); } + WmsCarryH wmsCarryH = await _db.Queryable().FirstAsync(x => x.id == input.wmsDistaskH.carry_id); + DateTime dateTime = DateTime.Now; + WmsSterilizationInstockH wmsSterilizationInstockH = new WmsSterilizationInstockH(); + string code = await _billRullService.GetBillNumber("WmsSterilizationInstockH"); + wmsSterilizationInstockH.bill_code = code; + wmsSterilizationInstockH.carry_id = wmsCarryH.id; + wmsSterilizationInstockH.carry_code = wmsCarryH.carry_code; + wmsSterilizationInstockH.location_id = input.wmsDistaskH.endlocation_id; + wmsSterilizationInstockH.location_code = input.wmsDistaskH.endlocation_code; + wmsSterilizationInstockH.create_id = WmsWareHouseConst.AdministratorUserId; + wmsSterilizationInstockH.create_time = dateTime; + wmsSterilizationInstockH.instock_time = dateTime; + wmsSterilizationInstockH.org_id = WmsWareHouseConst.AdministratorOrgId; + wmsSterilizationInstockH.xl_location_id = input.wmsDistaskH.startlocation_id; + wmsSterilizationInstockH.xl_location_code = input.wmsDistaskH.startlocation_code; + wmsSterilizationInstockH.status = WmsWareHouseConst.BILLSTATUS_ADD_ID; + wmsSterilizationInstockH.origin = "外协调拨入库"; + + int row = await _db.Insertable(wmsSterilizationInstockH).ExecuteCommandAsync(); + if (row > 0) + Logger.LogInformation($"【外协到解析仓】 灭菌入库记录生成成功"); + else + Logger.LogWarning($"【外协到解析仓】 灭菌入库记录生成失败"); + + Logger.Information($"进入成品调拨入库单上传BIP逻辑"); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsTransferOutstockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsTransferOutstockService.cs index 9364824c..7f695e72 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsTransferOutstockService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsTransferOutstockService.cs @@ -129,7 +129,7 @@ namespace Tnb.WarehouseMgr if (endLocations.Count < items_pretask.Count) { - throw new AppFriendlyException("三楼人工出库区没有足够的未锁定且空闲的出库工位", 500); + throw new AppFriendlyException($"三楼人工出库区没有足够的未锁定且空闲的出库库位!需要{items_pretask.Count}个库位,实际可用{endLocations.Count}个库位", 500); } }