diff --git a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs index 2ee09157..1b8a9a6d 100644 --- a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs +++ b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs @@ -90,6 +90,9 @@ namespace Tnb.ProductionMgr private static Timer? PackOutstockServicetimer; // 检查到电梯任务异常断开后处理 private Thread? ElevatorTaskExceptionHandleThread; + // 二楼空托盘自动补充到线边 + private static Timer? F2KTPsupplementtimer; + public SemaphoreSlim s_taskCheckGet = new(1); public SemaphoreSlim s_taskScan = new(1); @@ -106,6 +109,7 @@ namespace Tnb.ProductionMgr public SemaphoreSlim s_taskFloor4DMJ2MJXService = new(1); public SemaphoreSlim s_taskFloor4MJX2MJCService = new(1); public SemaphoreSlim s_taskFloor4DMC2CPKService = new(1); + public SemaphoreSlim s_taskF2KTPsupplement = new(1); private StackExRedisHelper _redisData; private readonly IPrdInstockService _prdInstockService; @@ -127,7 +131,8 @@ namespace Tnb.ProductionMgr private ISqlSugarClient db_Floor4MJX2MJC; private ISqlSugarClient db_Floor4DMC2CPK; private ISqlSugarClient db_ElevatorTaskExceptionHandle; - + private ISqlSugarClient db_F2KTPsupplement; + private readonly IWmsPDAScanInStockService _wmsPDAScanInStock; private readonly IUserManager _userManager; @@ -183,6 +188,7 @@ namespace Tnb.ProductionMgr db_Floor4MJX2MJC = repository.CopyNew(); db_Floor4DMC2CPK = repository.CopyNew(); db_ElevatorTaskExceptionHandle = repository.CopyNew(); + db_F2KTPsupplement = repository.CopyNew(); } #endregion @@ -1922,13 +1928,11 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行四楼待灭菌仓到灭菌线"); LoggerTimer.LogInformation($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行四楼待灭菌仓到灭菌线"); - if (true) - { - return; - } - Dictionary putdic = new Dictionary(); - putdic.Add("SLD1", new string[] { "设备名", "信号" }); + putdic.Add("MJQ-FAN01", new string[] { "4楼上料输送西区", "上料工位1请求送盘" }); + putdic.Add("MJQ-FAN02", new string[] { "4楼上料输送西区", "上料工位2请求送盘" }); + putdic.Add("MJQ-FAN03", new string[] { "4楼上料输送西区", "上料工位3请求送盘" }); + putdic.Add("MJQ-FAN04", new string[] { "4楼上料输送西区", "上料工位4请求送盘" }); //Dictionary putdic = new Dictionary(); //List endLocations = db_Floor4DMJ2MJX.Queryable().Where(r => r.wh_id == WmsWareHouseConst.WAREHOUSE_DMJC_ID @@ -1958,7 +1962,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA if (items.Count < 1) { - LoggerFloor4DMJ2MJX.LogWarning($"【四楼待灭菌仓到灭菌线】 没有可以出库的空载具"); + LoggerFloor4DMJ2MJX.LogWarning($"【四楼待灭菌仓到灭菌线】 没有可以出库的载具"); break; } BasLocation endlocation = await db_Floor4DMJ2MJX.Queryable().Where(r => r.location_code == key).FirstAsync(); @@ -2027,13 +2031,9 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行四楼待灭菌线到灭菌仓"); LoggerTimer.LogInformation($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")} 开始执行四楼待灭菌线到灭菌仓"); - if (true) - { - return; - } - Dictionary getdic = new Dictionary(); - getdic.Add("SLD1", new string[] { "设备名", "信号", "条码信号" }); + getdic.Add("MJQ-QU02", new string[] { "4下上料输送西区", "下料工位2请求取盘", "下料工位2条码" }); + getdic.Add("MJQ-QU01", new string[] { "4下上料输送西区", "下料工位1请求取盘", "下料工位1条码" }); //List startLocations = db_Floor4MJX2MJC.Queryable().Where(r => r.wh_id == WmsWareHouseConst.WAREHOUSE_MJC_ID //&& r.is_type == ((int)EnumLocationType.分拣库位).ToString() && r.is_lock == 0).ToList(); @@ -2051,7 +2051,7 @@ 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}"); + LoggerFloor4MJX2MJC.LogInformation($"【四楼待灭菌线到灭菌仓】 下料点 {key} {strs[1]}采集到 {result}"); InStockStrategyQuery inStockStrategyInput = new() { @@ -2070,7 +2070,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA BasLocation startlocation = await db_Floor4DMJ2MJX.Queryable().Where(r => r.location_code == key).FirstAsync(); BasLocation endlocation = items[0]; - string carry_code = ""; + string carry_code = await GetStringTag(strs[0], strs[2]); + LoggerFloor4MJX2MJC.LogInformation($"【四楼待灭菌线到灭菌仓】 下料点 {key} {strs[2]}采集到 {carry_code}"); WmsCarryH wmsCarryH = await db_Floor4MJX2MJC.Queryable().Where(r => r.carry_code == carry_code).FirstAsync(); //锁定起点库位 @@ -2160,7 +2161,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA if (wmsFloor4StewingConfig == null) { - LoggerFloor4MJX2MJC.LogWarning($"【四楼灭菌仓到成品库】 未在静置仓配置中配置 静置时间(小时)"); + LoggerFloor4DMC2CPK.LogWarning($"【四楼灭菌仓到成品库】 未在静置仓配置中配置 静置时间(小时)"); return; } int hours = 168; @@ -2187,7 +2188,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA await db_Floor4DMC2CPK.Ado.BeginTranAsync(); - BasLocation startlocation = await db_Floor4DMJ2MJX.Queryable().Where(r => r.id == wmsCarryH.location_id).FirstAsync(); + BasLocation startlocation = await db_Floor4DMC2CPK.Queryable().Where(r => r.id == wmsCarryH.location_id).FirstAsync(); InStockStrategyQuery inStockStrategyInput = new() { @@ -2253,6 +2254,107 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA } } + /// + /// 二楼空托盘自动补充到线边 + /// + /// + private async void F2KTPsupplement(object? args) + { + if (s_taskF2KTPsupplement.CurrentCount == 0) + return; + await s_taskF2KTPsupplement.WaitAsync(); + Stopwatch stopwatch = new Stopwatch(); + 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")} 开始执行二楼空托盘自动补充到线边"); + + Dictionary putdic = new Dictionary(); + putdic.Add("ZZ-01-01", new string[] { "外包装箱码垛线", "WBZX_x1_AGV_fan" }); + putdic.Add("ZZ-02-01", new string[] { "外包装箱码垛线", "WBZX_x2_AGV_fan" }); + + foreach (var key in putdic.Keys) + { + await db_F2KTPsupplement.Ado.BeginTranAsync(); + var strs = putdic.Where(p => p.Key == key).First().Value; + bool result = await GetBoolTag(strs[0], strs[1]); + if (result) + { + + LoggerF2KTPsupplement.LogInformation($"【二楼空托盘自动补充到线边】 上料点 {key} {strs[1]}采集到 {result}"); + + OutStockStrategyQuery outStockStrategyInput = new() + { + warehouse_id = WmsWareHouseConst.WAREHOUSE_F2KTQ_ID, + Size = 1 + }; + List items = await _wareHouseService.OutStockStrategy(outStockStrategyInput); + + if (items.Count < 1) + { + LoggerF2KTPsupplement.LogWarning($"【二楼空托盘自动补充到线边】 没有可以出库的空载具"); + break; + } + BasLocation endlocation = await db_F2KTPsupplement.Queryable().Where(r => r.location_code == key).FirstAsync(); + + if (endlocation.is_use == "1") + { + LoggerF2KTPsupplement.LogWarning($"【二楼空托盘自动补充到线边】 终点库位{endlocation.location_code}已占用"); + continue; + } + if (endlocation.is_lock == 1) + { + LoggerF2KTPsupplement.LogWarning($"【二楼空托盘自动补充到线边】 终点库位{endlocation.location_code}已锁定"); + continue; + } + + WmsCarryH wmsCarryH = items[0]; + + //锁定起点库位 + await db_F2KTPsupplement.Updateable().SetColumns(r => new BasLocation { is_lock = 1 }).Where(r => r.id == wmsCarryH.location_id).ExecuteCommandAsync(); + //锁定终点库位 + await db_F2KTPsupplement.Updateable().SetColumns(r => new BasLocation { is_lock = 1 }).Where(r => r.id == endlocation.id).ExecuteCommandAsync(); + + bool result_createPretask = await createPretask(wmsCarryH.location_id, endlocation.id, wmsCarryH.id, wmsCarryH.carry_code, LoggerF2KTPsupplement, db_F2KTPsupplement); + if (!result_createPretask) + { + LoggerF2KTPsupplement.LogWarning($"【二楼空托盘自动补充到线边】 {wmsCarryH.location_code} 到 {endlocation.location_code} 预任务生成失败"); + throw new Exception($"【二楼空托盘自动补充到线边】 {wmsCarryH.location_code} 到 {endlocation.location_code} 预任务生成失败"); + } + LoggerF2KTPsupplement.LogInformation($"【二楼空托盘自动补充到线边】 {wmsCarryH.location_code} 到 {endlocation.location_code} 预任务生成成功"); + + } + await db_F2KTPsupplement.Ado.CommitTranAsync(); + } + _ = _wareHouseService.GenTaskExecute(); + } + catch (ObjectDisposedException ex) + { + LoggerF2KTPsupplement.LogError($"【二楼空托盘自动补充到线边】 数据库连接异常:{ex.Message}"); + LoggerF2KTPsupplement.LogError($"【二楼空托盘自动补充到线边】 数据库连接异常:{ex.StackTrace}"); + if (ex.Source == "Npgsql") + db_F2KTPsupplement = _repository.AsSugarClient().CopyNew(); + } + catch (Exception ex) + { + Console.WriteLine("【二楼空托盘自动补充到线边】" + ex.Message); + LoggerF2KTPsupplement.LogError($"【二楼空托盘自动补充到线边】 {ex.Message}"); + LoggerF2KTPsupplement.LogError($"【二楼空托盘自动补充到线边】 {ex.StackTrace}"); + // 数据库连接断开时会报错 + try { await db_F2KTPsupplement.Ado.RollbackTranAsync(); } catch { }; + } + finally + { + s_taskF2KTPsupplement.Release(); + if (!db_F2KTPsupplement.Ado.Transaction.IsNull()) + try { await db_F2KTPsupplement.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"); + } + } #endregion public Task StartAsync(CancellationToken cancellationToken) @@ -2287,10 +2389,11 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA ElevatorTaskExceptionHandleThread = new Thread(ElevatorTaskExceptionHandle); ElevatorTaskExceptionHandleThread.Start(); - //Floor4DMJ2MJXtimer = new Timer(Floor4DMJ2MJX, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); - //Floor4MJX2MJCtimer = new Timer(Floor4MJX2MJC, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); - //Floor4DMC2CPKtimer = new Timer(Floor4DMC2CPK, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); + Floor4DMJ2MJXtimer = new Timer(Floor4DMJ2MJX, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); + Floor4MJX2MJCtimer = new Timer(Floor4MJX2MJC, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); + Floor4DMC2CPKtimer = new Timer(Floor4DMC2CPK, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); + F2KTPsupplementtimer = new Timer(F2KTPsupplement, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); return Task.CompletedTask; } @@ -2321,6 +2424,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA Floor4MJX2MJCtimer?.Dispose(); Floor4DMC2CPKtimer?.Dispose(); ElevatorTaskExceptionHandleThread.Abort(); + F2KTPsupplementtimer?.Dispose(); + } #region 日志 @@ -2710,6 +2815,40 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA return _LoggerFloor4DMC2CPK; } } + + protected string _LoggerF2KTPsupplementFileName = ""; + protected ILogger _LoggerF2KTPsupplement; + protected ILogger LoggerF2KTPsupplement + { + get + { + string newFileName = $"{AppContext.BaseDirectory}/logs/custom二楼空托盘补充{DateTime.Now:yyyyMMdd}.log"; + if (_LoggerF2KTPsupplementFileName != newFileName) + { + ILoggerFactory loggerFactory = LoggerFactory.Create(builder => builder.AddFile(newFileName, cfgOpts => + { + + //cfgOpts.DateFormat = "yyyy-MM-dd HH:mm:ss.fff"; + cfgOpts.MessageFormat = (logMsg) => + { + var logLevel = s_logLevelMap[logMsg.LogLevel]; + var sb = new StringBuilder(); + _ = sb.Append($"[{logLevel}] "); + _ = sb.Append($"{logMsg.LogName} "); + _ = sb.Append($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} "); + _ = sb.Append($"#{logMsg.EventId.Id} "); + _ = sb.Append(logMsg.Message + " "); + _ = sb.Append(logMsg.Exception?.ToString()); + return sb.ToString(); + }; + + })); + _LoggerF2KTPsupplement = loggerFactory.CreateLogger(this.GetType()); + _LoggerF2KTPsupplementFileName = newFileName; + } + return _LoggerF2KTPsupplement; + } + } #endregion } } \ 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 61f3b426..2f04548c 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs @@ -472,8 +472,20 @@ /// /// 一楼中储仓入库工位 /// + public const string ZZCSSX021007 = "32609215284757"; + /// + /// 一楼中储仓入库工位 + /// public const string ZZCSSX011008 = "32609223625237"; /// + /// 一楼中储仓入库工位 + /// + public const string ZZCSSX121009 = "32609229889045"; + /// + /// 一楼中储仓入库工位 + /// + public const string ZZCSSX121010 = "32609238573589"; + /// /// 料箱id /// public const string LIAOXIANGID = "26037262680357"; diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/OutStockStrategyZCC2Floor2Query.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/OutStockStrategyZCC2Floor2Query.cs index 540f2b1c..943c39eb 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/OutStockStrategyZCC2Floor2Query.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/OutStockStrategyZCC2Floor2Query.cs @@ -49,6 +49,10 @@ /// /// public string? material_code { get; set; } + /// + /// + /// + public string[] endlocations { get; set; } } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index 7b7e8877..fd0770c7 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -586,7 +586,7 @@ namespace Tnb.WarehouseMgr List>? carrys = new List>(); // 6个下发一条任务链 - int move_num = 6; int endlocation_index = 0; string[] endlocations = new string[2] { "32609229889045", "32609238573589" }; + int move_num = 6; int endlocation_index = 0; BasLocation endlocation_ssx = null; for (int i = 0; i < itemsASC.Count; i++) @@ -602,7 +602,7 @@ namespace Tnb.WarehouseMgr // 每6个重新获取一次终点 if (i % move_num == 0) { - endlocation_ssx = await _db.Queryable().Where(r => endlocations.Contains(r.id)).OrderBy("is_lock, task_nums, location_code").FirstAsync(); + endlocation_ssx = await _db.Queryable().Where(r => input.endlocations.Contains(r.id)).OrderBy("is_lock, task_nums, location_code").FirstAsync(); } // 查找是否有一个料箱可以正好满足剩余需求数量(目前只做这个额外判断,其它情形不考虑) diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryStockReportService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryStockReportService.cs index ff4e2079..2b12868d 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryStockReportService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryStockReportService.cs @@ -38,13 +38,13 @@ namespace Tnb.WarehouseMgr public async Task CarryStock(CarryStockInput input) { var warehouse_id = ""; - var carry_id = ""; - var material_id = ""; + var carry_code = ""; + var material_code = ""; if (!input.queryJson.IsNullOrWhiteSpace()) { warehouse_id = JObject.Parse(input.queryJson).Value(nameof(WmsCarryCode.warehouse_id)); - carry_id = JObject.Parse(input.queryJson).Value(nameof(WmsCarryCode.carry_id)); - material_id = JObject.Parse(input.queryJson).Value(nameof(WmsCarryCode.material_id)); + carry_code = JObject.Parse(input.queryJson).Value(nameof(WmsCarryCode.carry_code)); + material_code = JObject.Parse(input.queryJson).Value(nameof(WmsCarryCode.material_code)); } @@ -58,8 +58,8 @@ namespace Tnb.WarehouseMgr .Where((a, b, c, d, e) => a.is_type == ((int)EnumLocationType.存储库位).ToString() && a.is_use == "1" && ((!string.IsNullOrEmpty(b.carry_code) && b.carry_status != "0" && b.carry_status != "6") || string.IsNullOrEmpty(b.carry_code))) .WhereIF(!string.IsNullOrEmpty(warehouse_id), (a, b, c, d) => c.id == warehouse_id) - .WhereIF(!string.IsNullOrEmpty(carry_id), (a, b, c, d) => b.id == carry_id) - .WhereIF(!string.IsNullOrEmpty(material_id), (a, b, c, d, e, f) => f.id == material_id) + .WhereIF(!string.IsNullOrEmpty(carry_code), (a, b, c, d) => b.carry_code.Contains(carry_code)) + .WhereIF(!string.IsNullOrEmpty(material_code), (a, b, c, d, e, f) => f.code.Contains(material_code)) .OrderByDescending((a, b, c, d, e, f) => b.carry_code) .Select((a, b, c, d, e, f) => new WmsCarryStockReport { @@ -97,8 +97,8 @@ namespace Tnb.WarehouseMgr .InnerJoin((a, b, c, d, e, f, g, h) => h.id == e.membercarry_id) .Where((a, b, c, d, e) => a.is_type == ((int)EnumLocationType.存储库位).ToString() && a.is_use == "1" && b.carry_status != "0" && b.carry_status != "6") .WhereIF(!string.IsNullOrEmpty(warehouse_id), (a, b, c, d) => c.id == warehouse_id) - .WhereIF(!string.IsNullOrEmpty(carry_id), (a, b, c, d, e) => b.id == carry_id || e.membercarry_id == carry_id) - .WhereIF(!string.IsNullOrEmpty(material_id), (a, b, c, d, e, f, g) => g.id == material_id) + .WhereIF(!string.IsNullOrEmpty(carry_code), (a, b, c, d, e, f, g, h) => b.carry_code.Contains(carry_code)|| h.carry_code.Contains(carry_code)) + .WhereIF(!string.IsNullOrEmpty(material_code), (a, b, c, d, e, f, g) => g.code.Contains(material_code)) .Select((a, b, c, d, e, f, g, h) => new WmsCarryStockReport { warehouse_name = c.whname, diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs index 69f0f1db..cf72a161 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs @@ -67,6 +67,8 @@ namespace Tnb.WarehouseMgr public static SemaphoreSlim s_taskDistributeToZCC = new(1); public static SemaphoreSlim s_taskDistributeYCL2ZCC = new(1); + public static SemaphoreSlim s_taskDistributeZCCToYCL = new(1); + public WmsMaterialTransferService( ISqlSugarRepository repository, @@ -291,7 +293,6 @@ namespace Tnb.WarehouseMgr } } - /// /// 按托下发(到集中供料或外协) /// @@ -439,7 +440,7 @@ namespace Tnb.WarehouseMgr /// /// [HttpPost, NonUnify, AllowAnonymous] - public async Task DistributeYCL2ZCC(MaterialTransferDistributeYCL2ZCCInput input) + public async Task DistributeYCLToZCC(MaterialTransferDistributeYCL2ZCCInput input) { try { @@ -936,6 +937,8 @@ namespace Tnb.WarehouseMgr throw Oops.Oh(ErrorCode.COM1001); } + await _db.Ado.CommitTranAsync(); + if (input.area_code == "E") await sign(input); @@ -945,6 +948,7 @@ namespace Tnb.WarehouseMgr } // 其它出库 + else { WmsMaterialTransfer wmsMaterialTransfer = await _db.Queryable().SingleAsync(x => x.id == wmsMaterialTransferd.bill_id); List dList = await _db.Queryable().Where(x => x.bill_id == wmsMaterialTransferd.bill_id).OrderBy(x => x.id).ToListAsync(); @@ -1027,16 +1031,12 @@ namespace Tnb.WarehouseMgr await _db.Insertable(thirdWebapiRecord).ExecuteCommandAsync(); } - - - - await _db.Ado.CommitTranAsync(); } catch(Exception ex) { Logger.LogError("【WmsMaterialTransferService ModifyAsync】" + ex.Message); Logger.LogError("【WmsMaterialTransferService ModifyAsync】" + ex.StackTrace); - await _db.Ado.RollbackTranAsync(); + //await _db.Ado.RollbackTranAsync(); } } @@ -1100,11 +1100,11 @@ namespace Tnb.WarehouseMgr material_id = wmsMaterialTransferD.material_id, code_batch = wmsMaterialTransferD.code_batch, needOut = needOut, - material_code = wmsMaterialTransferD.material_code - + material_code = wmsMaterialTransferD.material_code, + endlocations = new string[2] { WmsWareHouseConst.ZZCSSX121009, WmsWareHouseConst.ZZCSSX121010 } }; - List>? carrys = await _wareHouseService.OutStockStrategyZCC2Floor2(OutStockStrategyInput); + List>? carrys = await _wareHouseService.OutStockStrategyZCC2Floor2(OutStockStrategyInput); foreach (var item in carrys) { @@ -1183,6 +1183,144 @@ namespace Tnb.WarehouseMgr return await ToApiResult(HttpStatusCode.OK, "成功"); } + /// + /// 中储仓退料到原材料仓 + /// + /// + /// + /// + [HttpPost, NonUnify, AllowAnonymous] + public async Task DistributeZCCToYCL(MaterialTransferDistributeToZCCInput input) + { + s_taskDistributeZCCToYCL.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(); + + var wmsMaterialTransferdsDistinct = wmsMaterialTransferds.Select(r => new + { + material_id = r.material_id, + code_batch = r.code_batch, + }).Distinct(); + if (wmsMaterialTransferdsDistinct.Count() < wmsMaterialTransferds.Count) + { + Logger.LogWarning($@"转库单{wmsMaterialTransfer.bill_code}表体存在物料和批号重复的明细!"); + throw new AppFriendlyException($@"转库单{wmsMaterialTransfer.bill_code}表体存在物料和批号重复的明细!", 500); + } + + // 转库单载具子表 + List wmsMaterialTransferCarrys = new List(); + + foreach (WmsMaterialTransferD wmsMaterialTransferD in wmsMaterialTransferds) + { + // 需要转库数量 + decimal? needOut = wmsMaterialTransferD.qty; + + //出库取起点,获取所有符合输入的载具规格的载具 + OutStockStrategyZCC2Floor2Query OutStockStrategyInput = new() + { + warehouse_id = "2", + material_id = wmsMaterialTransferD.material_id, + code_batch = wmsMaterialTransferD.code_batch, + needOut = needOut, + material_code = wmsMaterialTransferD.material_code, + endlocations = new string[] {WmsWareHouseConst.ZZCSSX021007 } + }; + List>? carrys = await _wareHouseService.OutStockStrategyZCC2Floor2(OutStockStrategyInput); + + + foreach (var item in carrys) + { + WmsCarryH wmsCarryH = item.Item1; + decimal codeqty = item.Item2; + BasLocation endlocation_ssx = item.Item3; + + // 转库单载具子表 + 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 = codeqty; + wmsMaterialTransferCarrys.Add(wmsMaterialTransferCarry); + } + } + + 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($"【DistributeZCCToYCL】更新转库单{wmsMaterialTransfer.bill_code}主表的数据"); + + await _db.Insertable(wmsMaterialTransferCarrys).ExecuteCommandAsync(); + Logger.LogInformation($"【DistributeZCCToYCL】插入转库单{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); + if (res.code != JNPF.Common.Enums.HttpStatusCode.OK) + { + Logger.LogInformation($"【DistributeZCCToYCL生成预任务失败 载具 {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("【DistributeZCCToYCL】" + ex.Message); + Logger.LogError("【DistributeZCCToYCL】" + ex.StackTrace); + return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); + } + finally + { + s_taskDistributeZCCToYCL.Release(); + InvokeGenPretaskExcute(); + } + return await ToApiResult(HttpStatusCode.OK, "成功"); + } + + + /// /// 从暂存仓呼叫料架到产线 ///