diff --git a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs index 37e8ae14..6493d340 100644 --- a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs +++ b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs @@ -80,13 +80,17 @@ namespace Tnb.ProductionMgr private static Timer? Floor2timer移走上升降区未生成预任务且满托的料架; private static Timer? Floor2timer移走下升降区未生成预任务且空托的料架; + // 四楼待灭菌仓到灭菌线 + private static Timer? Floor4DMJ2MJXtimer; + // 四楼待灭菌线到灭菌仓 + private static Timer? Floor4MJX2MJCtimer; + // 四楼灭菌仓到成品库 + private static Timer? Floor4DMC2CPKtimer; // 四楼包材自动到二楼包材库 private static Timer? PackOutstockServicetimer; - // 检查到电梯任务异常断开后处理 private Thread? ElevatorTaskExceptionHandleThread; - public SemaphoreSlim s_taskCheckGet = new(1); public SemaphoreSlim s_taskScan = new(1); public SemaphoreSlim s_taskSSXcode = new(1); @@ -99,6 +103,9 @@ namespace Tnb.ProductionMgr public SemaphoreSlim s_task移走上升降区未生成预任务且满托的料架 = new(1); public SemaphoreSlim s_task移走下升降区未生成预任务且空托的料架 = new(1); public SemaphoreSlim s_taskPackOutstockService = new(1); + public SemaphoreSlim s_taskFloor4DMJ2MJXService = new(1); + public SemaphoreSlim s_taskFloor4MJX2MJCService = new(1); + public SemaphoreSlim s_taskFloor4DMC2CPKService = new(1); private StackExRedisHelper _redisData; private readonly IPrdInstockService _prdInstockService; @@ -115,6 +122,11 @@ namespace Tnb.ProductionMgr private ISqlSugarClient db_Floor2timer移走上升降区未生成预任务且满托的料架; private ISqlSugarClient db_Floor2timer移走下升降区未生成预任务且空托的料架; private ISqlSugarClient db_PackOutstockService; + + private ISqlSugarClient db_Floor4DMJ2MJX; + private ISqlSugarClient db_Floor4MJX2MJC; + private ISqlSugarClient db_Floor4DMC2CPK; + private readonly IWmsPDAScanInStockService _wmsPDAScanInStock; private readonly IUserManager _userManager; private readonly IBillRullService _billRullService; @@ -165,7 +177,10 @@ namespace Tnb.ProductionMgr db_Floor2timer移走上升降区未生成预任务且满托的料架 = repository.CopyNew(); db_Floor2timer移走下升降区未生成预任务且空托的料架 = repository.CopyNew(); db_PackOutstockService = repository.CopyNew(); - } + db_Floor4DMJ2MJX = repository.CopyNew(); + db_Floor4MJX2MJC = repository.CopyNew(); + db_Floor4DMC2CPK = repository.CopyNew(); + } #endregion @@ -1716,7 +1731,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA async void ElevatorTaskExceptionHandle(object args) { List wmsDistaskHs = _repository.AsSugarClient().Queryable() - .Where(r => r.startlocation_code.Contains("DT") && r.endlocation_code.Contains("DT") && r.act_start_date != null && r.act_end_date == null).ToList(); + .Where(r => r.startlocation_code.Contains("DT") && r.endlocation_code.Contains("DT") && r.act_start_date == null && r.act_end_date == null).ToList(); LoggerElevatorTask.Information($"【ElevatorTaskExceptionHandle】检查到需要恢复的电梯任务{wmsDistaskHs.Count}条 {string.Join(',', wmsDistaskHs.Select(x => x.bill_code))}"); foreach (WmsDistaskH wmsDistaskH in wmsDistaskHs) @@ -1850,6 +1865,204 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA + #endregion + + #region 灭菌仓 + /// + /// 四楼待灭菌仓到灭菌线 + /// + /// + private async void Floor4DMJ2MJX(object? args) + { + if (s_taskFloor4DMJ2MJXService.CurrentCount == 0) + return; + await s_taskFloor4DMJ2MJXService.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")} 开始执行四楼待灭菌仓到灭菌线"); + + if (false) + { + return; + } + + List endLocations = db_Floor4DMJ2MJX.Queryable().Where(r => r.wh_id == WmsWareHouseConst.WAREHOUSE_DMJC_ID + && r.is_type == ((int)EnumLocationType.分拣库位).ToString() && r.is_lock == 0).ToList(); + + Dictionary getdic = new Dictionary(); + foreach (BasLocation endLocation in endLocations) + { + getdic.Add(endLocation, new string[] { "", "" }); + } + + foreach (var key in getdic.Keys) + { + await db_Floor4DMJ2MJX.Ado.BeginTranAsync(); + var strs = getdic.Where(p => p.Key == key).First().Value; + bool result = await GetBoolTag(strs[0], strs[1]); + if (result) + { + LoggerYCLGLDPJInstock.LogInformation($"【四楼待灭菌仓到灭菌线】 上料点 {key} {strs[1]}采集到 {result}"); + + OutStockStrategyQuery outStockStrategyInput = new() + { + warehouse_id = WmsWareHouseConst.WAREHOUSE_DMJC_ID, + Size = 1 + }; + List items = await _wareHouseService.OutStockStrategy(outStockStrategyInput); + + if (items.Count < 1) + { + LoggerYCLGLDPJInstock.LogInformation($"【四楼待灭菌仓到灭菌线】 没有可以出库的空载具"); + } + + WmsCarryH wmsCarryH = items[0]; + + //锁定起点库位 更新为空闲 + await db_YCLWXDPJInstocktimer.Updateable().SetColumns(r => new BasLocation { is_lock = 1, is_use = "0" }).Where(r => r.id == wmsCarryH.location_id).ExecuteCommandAsync(); + //锁定终点库位 + await db_YCLWXDPJInstocktimer.Updateable().SetColumns(r => new BasLocation { is_lock = 1 }).Where(r => r.id == key.id).ExecuteCommandAsync(); + + bool result_createPretask = await createPretask(wmsCarryH.location_id, key.id, "", "", LoggerYCLGLDPJInstock, db_YCLWXDPJInstocktimer); + if (!result_createPretask) + { + LoggerYCLGLDPJInstock.LogWarning($"【四楼待灭菌仓到灭菌线】 {wmsCarryH.location_code} 到 {key.location_code} 预任务生成失败"); + throw new Exception($"【四楼待灭菌仓到灭菌线】 {wmsCarryH.location_code} 到 {key.location_code} 预任务生成失败"); + } + LoggerYCLGLDPJInstock.LogWarning($"【四楼待灭菌仓到灭菌线】 {wmsCarryH.location_code} 到 {key.location_code} 预任务生成成功"); + + } + await db_Floor4DMJ2MJX.Ado.CommitTranAsync(); + } + _ = _wareHouseService.GenTaskExecute(); + + } + catch (ObjectDisposedException ex) + { + LoggerFloor4DMJ2MJX.LogError($"【四楼待灭菌仓到灭菌线】 数据库连接异常:{ex.Message}"); + LoggerFloor4DMJ2MJX.LogError($"【四楼待灭菌仓到灭菌线】 数据库连接异常:{ex.StackTrace}"); + if (ex.Source == "Npgsql") + db_Floor4DMJ2MJX = _repository.AsSugarClient().CopyNew(); + } + catch (Exception ex) + { + Console.WriteLine("【四楼待灭菌仓到灭菌线】" + ex.Message); + LoggerFloor4DMJ2MJX.LogError($"【四楼待灭菌仓到灭菌线】 {ex.Message}"); + LoggerFloor4DMJ2MJX.LogError($"【四楼待灭菌仓到灭菌线】 {ex.StackTrace}"); + // 数据库连接断开时会报错 + try { await db_Floor4DMJ2MJX.Ado.RollbackTranAsync(); } catch { }; + } + finally + { + s_taskFloor4DMJ2MJXService.Release(); + if (!db_Floor4DMJ2MJX.Ado.Transaction.IsNull()) + try { await db_Floor4DMJ2MJX.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"); + } + } + + /// + /// 四楼待灭菌线到灭菌仓 + /// + /// + private async void Floor4MJX2MJC(object? args) + { + if (s_taskFloor4MJX2MJCService.CurrentCount == 0) + return; + await s_taskFloor4MJX2MJCService.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")} 开始执行四楼待灭菌线到灭菌仓"); + + await db_Floor4MJX2MJC.Ado.BeginTranAsync(); + + + await db_Floor4MJX2MJC.Ado.CommitTranAsync(); + } + catch (ObjectDisposedException ex) + { + 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}"); + // 数据库连接断开时会报错 + try { await db_Floor4MJX2MJC.Ado.RollbackTranAsync(); } catch { }; + } + finally + { + s_taskFloor4MJX2MJCService.Release(); + if (!db_Floor4MJX2MJC.Ado.Transaction.IsNull()) + 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"); + } + } + + /// + /// 四楼灭菌仓到成品库 + /// + /// + private async void Floor4DMC2CPK(object? args) + { + if (s_taskFloor4DMC2CPKService.CurrentCount == 0) + return; + await s_taskFloor4DMC2CPKService.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")} 开始执行四楼灭菌仓到成品库"); + + await db_Floor4DMC2CPK.Ado.BeginTranAsync(); + + + await db_Floor4DMC2CPK.Ado.CommitTranAsync(); + } + catch (ObjectDisposedException ex) + { + LoggerFloor4DMC2CPK.LogError($"【四楼灭菌仓到成品库】 数据库连接异常:{ex.Message}"); + LoggerFloor4DMC2CPK.LogError($"【四楼灭菌仓到成品库】 数据库连接异常:{ex.StackTrace}"); + if (ex.Source == "Npgsql") + db_Floor4DMC2CPK = _repository.AsSugarClient().CopyNew(); + } + catch (Exception ex) + { + Console.WriteLine("【四楼灭菌仓到成品库】" + ex.Message); + LoggerFloor4DMC2CPK.LogError($"【四楼灭菌仓到成品库】 {ex.Message}"); + LoggerFloor4DMC2CPK.LogError($"【四楼灭菌仓到成品库】 {ex.StackTrace}"); + // 数据库连接断开时会报错 + try { await db_Floor4DMC2CPK.Ado.RollbackTranAsync(); } catch { }; + } + finally + { + s_taskFloor4DMC2CPKService.Release(); + if (!db_Floor4DMC2CPK.Ado.Transaction.IsNull()) + try { await db_Floor4DMC2CPK.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) @@ -1883,6 +2096,10 @@ 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)); + return Task.CompletedTask; } @@ -1904,11 +2121,15 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA Floor2timer送满托到下升降区?.Dispose(); Floor2timer移走上升降区未生成预任务且满托的料架?.Dispose(); Floor2timer移走下升降区未生成预任务且空托的料架?.Dispose(); - BGWCarrySupplementtimer?.Dispose(); YCLGLDPJInstocktimer?.Dispose(); YCLWXDPJInstocktimer?.Dispose(); - + GenTaskExecutetimer?.Dispose(); + PackOutstockServicetimer?.Dispose(); + Floor4DMJ2MJXtimer?.Dispose(); + Floor4MJX2MJCtimer?.Dispose(); + Floor4DMC2CPKtimer?.Dispose(); + ElevatorTaskExceptionHandleThread.Abort(); } #region 日志 @@ -2095,7 +2316,6 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA } } - protected string _LoggerBGWCarrySupplementFileName = ""; protected ILogger _LoggerBGWCarrySupplement; protected ILogger LoggerBGWCarrySupplement @@ -2197,6 +2417,108 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA return _LoggerTimer; } } + + protected string _LoggerFloor4DMJ2MJXFileName = ""; + protected ILogger _LoggerFloor4DMJ2MJX; + protected ILogger LoggerFloor4DMJ2MJX + { + get + { + string newFileName = $"{AppContext.BaseDirectory}/logs/customFloor4DMJ2MJX{DateTime.Now:yyyyMMdd}.log"; + if (_LoggerFloor4DMJ2MJXFileName != 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(); + }; + + })); + _LoggerFloor4DMJ2MJX = loggerFactory.CreateLogger(this.GetType()); + _LoggerFloor4DMJ2MJXFileName = newFileName; + } + return _LoggerFloor4DMJ2MJX; + } + } + + protected string _LoggerFloor4MJX2MJCFileName = ""; + protected ILogger _LoggerFloor4MJX2MJC; + protected ILogger LoggerFloor4MJX2MJC + { + get + { + string newFileName = $"{AppContext.BaseDirectory}/logs/customFloor4MJX2MJC{DateTime.Now:yyyyMMdd}.log"; + if (_LoggerFloor4MJX2MJCFileName != 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(); + }; + + })); + _LoggerFloor4MJX2MJC = loggerFactory.CreateLogger(this.GetType()); + _LoggerFloor4MJX2MJCFileName = newFileName; + } + return _LoggerFloor4MJX2MJC; + } + } + + protected string _LoggerFloor4DMC2CPKFileName = ""; + protected ILogger _LoggerFloor4DMC2CPK; + protected ILogger LoggerFloor4DMC2CPK + { + get + { + string newFileName = $"{AppContext.BaseDirectory}/logs/customFloor4DMC2CPK{DateTime.Now:yyyyMMdd}.log"; + if (_LoggerFloor4DMC2CPKFileName != 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(); + }; + + })); + _LoggerFloor4DMC2CPK = loggerFactory.CreateLogger(this.GetType()); + _LoggerFloor4DMC2CPKFileName = newFileName; + } + return _LoggerFloor4DMC2CPK; + } + } #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 e626ac42..1260e665 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs @@ -53,6 +53,7 @@ /// 四楼灭菌仓 /// public const string WAREHOUSE_MJC_ID = "35412482304021"; + /// /// 二楼包材区 /// diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/PurchaseOrderInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/PurchaseOrderInput.cs new file mode 100644 index 00000000..f63298b3 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/PurchaseOrderInput.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tnb.WarehouseMgr.Entities.Dto.ErpInputs +{ + public class PurchaseOrderInput + { + /// + /// 单号 + /// + public string? purchase_order { get; set; } + + /// + /// 联系人 + /// + public string? contact_person { get; set; } + + /// + /// 电话 + /// + public string? tel { get; set; } + + /// + /// 供应商编号 + /// + public string? supplier_code { get; set; } + + /// + /// 凭证日期 + /// + public DateTime? certificate_date { get; set; } + + /// + /// 供货日期 + /// + public DateTime? ship_date { get; set; } + + /// + /// 主表pk + /// + public string? erp_pk { get; set; } + + public List details { get; set; } + } + public class PurchaseOrderDetail + { + /// + /// 行号 + /// + public string? lineno { get; set; } + + /// + /// 物品代码 + /// + public string? material_code { get; set; } + + /// + /// 单位代码 + /// + public string? unit_code { get; set; } + + /// + /// 采购数量 + /// + public decimal? purchase_quantity { get; set; } + + /// + /// 库存地点编号 + /// + public string? stock_location { get; set; } + + /// + /// 批次 + /// + public string? code_batch { get; set; } + + /// + /// 交货日期 + /// + public DateTime? delivery_date { get; set; } + + /// + /// 子表主键 + /// + public string erp_line_pk { get; set; } + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseD.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseD.cs index 7d721ba0..d704983e 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseD.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseD.cs @@ -108,4 +108,9 @@ public partial class WmsPurchaseD : BaseEntity /// [SugarColumn(IsIgnore = true)] public string? container_no { get; set; } + + /// + /// + /// + public string? erp_line_pk { get; set; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseH.cs index fd0c9f7f..2a6a9ecd 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseH.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseH.cs @@ -145,4 +145,15 @@ public partial class WmsPurchaseH : BaseEntity, IPurchaseAndSaleAuitEnti /// public int? audit_status { get; set; } + /// + /// + /// + public string? erp_pk { get; set; } + + /// + /// erp采购订单号 + /// + public string? erp_bill_code { get; set; } + + } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseOrderD.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseOrderD.cs new file mode 100644 index 00000000..9144ed1c --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseOrderD.cs @@ -0,0 +1,122 @@ +using JNPF.Common.Contracts; +using JNPF.Common.Security; +using SqlSugar; + +namespace Tnb.WarehouseMgr.Entities.Entity; + +/// +/// 采购订单表子表 +/// +[SugarTable("wms_purchase_order_d")] +public partial class WmsPurchaseOrderD : BaseEntity +{ + public WmsPurchaseOrderD() + { + id = SnowflakeIdHelper.NextId(); + } + /// + /// 主表id + /// + public string? fk_wms_purchase_order_id { get; set; } + + /// + /// 物料id + /// + public string? matcode_id { get; set; } + + /// + /// 物料编号 + /// + public string? matcode { get; set; } + + /// + /// 物料描述 + /// + public string? matspecification { get; set; } + + /// + /// 单位 + /// + public string? unit { get; set; } + + /// + /// 采购数量 + /// + public string? purchase_quantity { get; set; } + + /// + /// 实收数量 + /// + public string? actual_quantity { get; set; } + + /// + /// 库存地点ID + /// + public string? stock_location_id { get; set; } + + /// + /// 库存地点 + /// + public string? stock_location { get; set; } + + /// + /// 批次 + /// + public string? code_batch { get; set; } + + /// + /// 备注 + /// + public string? remark { get; set; } + + /// + /// 扩展字段 + /// + public string? extras { get; set; } + + /// + /// 交货日期 + /// + public string? delivery_date { get; set; } + + /// + /// 净价 + /// + public string? net_price { get; set; } + + /// + /// 货币 + /// + public string? currency { get; set; } + + /// + /// 工厂 + /// + public string? factory { get; set; } + + /// + /// 创建用户 + /// + public string? create_id { get; set; } + + /// + /// 创建时间 + /// + public DateTime? create_time { get; set; } + + /// + /// 修改用户 + /// + public string? modify_id { get; set; } + + /// + /// 修改时间 + /// + public DateTime? modify_time { get; set; } + + /// + /// erp_line_pk + /// + public string? erp_line_pk { get; set; } + +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseOrderH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseOrderH.cs new file mode 100644 index 00000000..2b2e7892 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPurchaseOrderH.cs @@ -0,0 +1,122 @@ +using JNPF.Common.Contracts; +using JNPF.Common.Security; +using SqlSugar; + +namespace Tnb.WarehouseMgr.Entities.Entity; + +/// +/// 采购订单表 +/// +[SugarTable("wms_purchase_order_h")] +public partial class WmsPurchaseOrderH : BaseEntity +{ + public WmsPurchaseOrderH() + { + id = SnowflakeIdHelper.NextId(); + } + /// + /// 采购订单号 + /// + public string? purchase_order { get; set; } + + /// + /// 联系人 + /// + public string? contact_person { get; set; } + + /// + /// 电话 + /// + public string? tel { get; set; } + + /// + /// 供应商ID + /// + public string? supplier_id { get; set; } + + /// + /// 供应商编号 + /// + public string? supplier_code { get; set; } + + /// + /// 供应商名称 + /// + public string? supplier_name { get; set; } + + /// + /// 备注 + /// + public string? remark { get; set; } + + /// + /// 扩展字段 + /// + public string? extras { get; set; } + + /// + /// 时间戳 + /// + public string? time_stamp { get; set; } + + /// + /// 单据类型 + /// + public string? document_type { get; set; } + + /// + /// 凭证日期 + /// + public string? certificate_date { get; set; } + + /// + /// 创建用户 + /// + public string? create_id { get; set; } + + /// + /// 创建时间 + /// + public DateTime? create_time { get; set; } + + /// + /// 修改用户 + /// + public string? modify_id { get; set; } + + /// + /// 修改时间 + /// + public DateTime? modify_time { get; set; } + + /// + /// 所属组织 + /// + public string? org_id { get; set; } + + /// + /// 流程任务Id + /// + public string? f_flowtaskid { get; set; } + + /// + /// 流程引擎Id + /// + public string? f_flowid { get; set; } + + /// + /// erp_pk + /// + public string? erp_pk { get; set; } + + /// + /// erp_bill_code + /// + public string? erp_bill_code { get; set; } + + /// + /// 供货日期 + /// + public DateTime? ship_date { get; set; } + +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs b/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs index 44e36ab6..4bd3e117 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs @@ -1,4 +1,5 @@ using System.Text; +using Aop.Api.Domain; using JNPF.Common.Enums; using JNPF.DependencyInjection; using JNPF.DynamicApiController; @@ -9,6 +10,7 @@ using Microsoft.AspNetCore.Components.Forms; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Newtonsoft.Json; +using NPOI.SS.Formula.Functions; using SqlSugar; using Tnb.BasicData.Entities; using Tnb.WarehouseMgr.Entities; @@ -290,11 +292,118 @@ namespace Tnb.WarehouseMgr await db.Insertable(WmsInstockDs).ExecuteCommandAsync(); } + + /// + /// 采购订单 + /// + [HttpPost, NonUnify, AllowAnonymous] + public async Task PurchaseOrder(PurchaseOrderInput input) + { + LoggerErp2Mes.LogInformation($"【PurchaseOrderInput】ERP传入数据:{JsonConvert.SerializeObject(input)}"); + var db = _repository.AsSugarClient(); + + if (string.IsNullOrEmpty(input.erp_pk)) + { + _LoggerErp2Mes.LogWarning($"【PurchaseOrderInput】主表主键不能为空!"); + return await ToApiResult(HttpStatusCode.InternalServerError, $"主表主键不能为空!"); + } + + int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count(); + if (count_erp_line_pk > 0) + { + _LoggerErp2Mes.LogWarning($@"【PurchaseOrderInput】子表主键不能为空!"); + throw new AppFriendlyException($@"子表主键不能为空!", 500); + } + + var wmsPurchaseOrdersDistinct = input.details.Select(r => new + { + material_id = r.material_code, + code_batch = r.code_batch, + }).Distinct(); + if (wmsPurchaseOrdersDistinct.Count() < input.details.Count) + { + _LoggerErp2Mes.LogWarning($@"【PurchaseOrderInput】表体存在物料和批号重复的明细!"); + throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500); + } + + try + { + await db.Ado.BeginTranAsync(); + WmsPurchaseOrderH wmsPurchaseOrderH = new WmsPurchaseOrderH(); + string Code = await _billRuleService.GetBillNumber("Purchase"); + + wmsPurchaseOrderH.purchase_order = Code; + wmsPurchaseOrderH.erp_bill_code = input.purchase_order; + wmsPurchaseOrderH.contact_person = input.contact_person; + wmsPurchaseOrderH.tel = input.tel; + wmsPurchaseOrderH.supplier_code = input.supplier_code; + wmsPurchaseOrderH.certificate_date = input.certificate_date.Value.ToString("yyyy-MM-dd HH:mm:ss"); + wmsPurchaseOrderH.ship_date = input.ship_date; + wmsPurchaseOrderH.erp_pk = input.erp_pk; + wmsPurchaseOrderH.create_id = WmsWareHouseConst.ErpUserId; + wmsPurchaseOrderH.create_time = DateTime.Now; + var supplier = await db.Queryable().Where(p => p.supplier_code == input.supplier_code).FirstAsync(); + if (supplier != null) + { + wmsPurchaseOrderH.supplier_id = supplier.id; + wmsPurchaseOrderH.supplier_name = supplier.supplier_name; + } + + await db.Insertable(wmsPurchaseOrderH).ExecuteCommandAsync(); + + + List wmsPurchaseOrderDs = new List(); + foreach (var detail in input.details) + { + WmsPurchaseOrderD wmsPurchaseOrderD = new WmsPurchaseOrderD(); + + wmsPurchaseOrderD.fk_wms_purchase_order_id = wmsPurchaseOrderH.id; + wmsPurchaseOrderD.matcode = detail.material_code; + wmsPurchaseOrderD.unit = detail.unit_code; + wmsPurchaseOrderD.purchase_quantity = detail.purchase_quantity.ToString(); + wmsPurchaseOrderD.stock_location = detail.stock_location; + wmsPurchaseOrderD.code_batch = detail.code_batch; + wmsPurchaseOrderD.delivery_date = detail.delivery_date.Value.ToString("yyyy-MM-dd HH:mm:ss"); + wmsPurchaseOrderD.erp_line_pk = detail.erp_line_pk; + wmsPurchaseOrderD.create_id = WmsWareHouseConst.ErpUserId; + wmsPurchaseOrderD.create_time = DateTime.Now; + wmsPurchaseOrderD.actual_quantity = "0"; + + var material = await db.Queryable().Where(p => p.code == detail.material_code).FirstAsync(); + if (material != null) + { + wmsPurchaseOrderD.matcode_id = material.id; + wmsPurchaseOrderD.matspecification = material.material_specification; + } + + wmsPurchaseOrderDs.Add(wmsPurchaseOrderD); + } + + await db.Insertable(wmsPurchaseOrderDs).ExecuteCommandAsync(); + + await db.Ado.CommitTranAsync(); + + LoggerErp2Mes.LogInformation($"【PurchaseOrderInput】成功生成单据:{Code}"); + return await ToApiResult(HttpStatusCode.OK, "成功"); + } + catch (Exception ex) + { + LoggerErp2Mes.LogError($"【PurchaseOrderInput】{ex.Message}"); + LoggerErp2Mes.LogError($"【PurchaseOrderInput】{ex.StackTrace}"); + await db.Ado.RollbackTranAsync(); + return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); + } + finally + { + + } + } + /// /// 转库单 /// [HttpPost, NonUnify, AllowAnonymous] - public async Task MaterialTransfer(MaterialTransferInput input) + public async Task MaterialTransfer(MaterialTransferInput input) { LoggerErp2Mes.LogInformation($"【MaterialTransfer】ERP传入数据:{JsonConvert.SerializeObject(input)}"); var db = _repository.AsSugarClient(); @@ -442,9 +551,9 @@ namespace Tnb.WarehouseMgr } } - protected Task ToApiResult(HttpStatusCode statusCode, string msg) + protected Task ToApiResult(HttpStatusCode statusCode, string msg) { - Result result = new() + Entities.Dto.Outputs.Result result = new() { code = statusCode, msg = msg diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index df6ad2ec..cf35d3e7 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -651,13 +651,13 @@ namespace Tnb.WarehouseMgr public async Task Check(string code, string action) { - Logger.Information($"【Check】 判断CTU是否可以取货 {code} {action}"); + Logger.Information($"【Check】 判断KIVA是否可以{action} {code}"); Dictionary putdic = new Dictionary(); Dictionary getdic = new Dictionary(); - putdic.Add("ZSSSXCTU02", new string[] { "YTCS", "AllowCtuFullOut_CS04", }); - putdic.Add("ZSSSXCTU01", new string[] { "YTCS", "AllowCtuFullOut_CS02", }); - getdic.Add("ZSSSXCTU01", new string[] { "YTCS", "AllowAgvEmptyOut_CS01" }); - getdic.Add("ZSSSXCTU02", new string[] { "YTCS", "AllowAgvEmptyOut_CS03" }); + putdic.Add("ZSSSXCTU02", new string[] { "YTCS", "左输送线下层允许入箱4", }); + putdic.Add("ZSSSXCTU01", new string[] { "YTCS", "左输送线下层允许入箱2", }); + getdic.Add("ZSSSXCTU01", new string[] { "YTCS", "输送线上层允许出箱1" }); + getdic.Add("ZSSSXCTU02", new string[] { "YTCS", "输送线上层允许出箱3" }); #region 注塑车间点位 putdic.Add("ZS-C01-1", new string[] { "hxjC", "A2允许入空箱", }); @@ -751,18 +751,18 @@ namespace Tnb.WarehouseMgr strs = getdic.Where(p => p.Key == code).First().Value; bool flag = await _redisData.HashExists(strs[0], strs[1]); - Logger.Information($"【Check】{action} 判断CTU是否可以取货1 获取{code}的标签{strs[1]}是否存在 结果为:{flag} "); + Logger.Information($"【Check】{action} 判断KIVA是否可以取货(信号是否存在) 获取{code}的标签{strs[1]}是否存在 结果为:{flag} "); if (!flag) { - throw new Exception($"【Check】{action} 判断CTU是否可以取货1 获取{code}的标签{strs[1]}是否存在 结果为:{flag} "); + throw new Exception($"【Check】{action} 判断KIVA是否可以取货(信号是否存在) 获取{code}的标签{strs[1]}是否存在 结果为:{flag} "); } string data = _redisData.GetHash(strs[0], strs[1]).Result; JObject? res = JsonConvert.DeserializeObject(data); bool result = res != null && res["Value"] != null ? res.Value("Value") : false; - Logger.Information($"【Check】{action} 判断CTU是否可以取货2 获取{code}的标签{strs[1]}信号值 结果为:{result} "); + Logger.Information($"【Check】{action} 判断KIVA是否可以取货(信号是否允许) 获取{code}的标签{strs[1]}信号值 结果为:{result} "); if (!result) { - throw new Exception($"【Check】{action} 判断CTU是否可以取货2 获取{code}的标签{strs[1]}信号值 结果为:{result} "); + throw new Exception($"【Check】{action} 判断KIVA是否可以取货(信号是否允许) 获取{code}的标签{strs[1]}信号值 结果为:{result} "); } return true; } @@ -773,18 +773,18 @@ namespace Tnb.WarehouseMgr strs = putdic.Where(p => p.Key == code).First().Value; bool flag = await _redisData.HashExists(strs[0], strs[1]); - Logger.Information($"【Check】 判断CTU是否可以取货1 {code} {action} flag:{flag} "); + Logger.Information($"【Check】 判断CTU是否可以放货(信号是否存在) 获取{code}的标签{strs[1]}是否存在 结果为:{flag} "); if (!flag) { - throw new Exception($"【Check】 判断CTU是否可以取货1 {code} {action} flag:{flag} "); + throw new Exception($"【Check】 判断CTU是否可以放货(信号是否存在) 获取{code}的标签{strs[1]}是否存在 结果为:{flag} "); } string data = _redisData.GetHash(strs[0], strs[1]).Result; JObject? res = JsonConvert.DeserializeObject(data); bool result = res != null && res["Value"] != null ? res.Value("Value") : false; - Logger.Information($"【Check】 判断CTU是否可以取货2 {code} {action} result:{result} "); + Logger.Information($"【Check】 判断CTU是否可以放货(信号是否允许) 获取{code}的标签{strs[1]}信号值 结果为:{result}"); if (!result) { - throw new Exception($"【Check】 判断CTU是否可以取货2 {code} {action} result:{result} "); + throw new Exception($"【Check】 判断CTU是否可以放货(信号是否允许) 获取{code}的标签{strs[1]}信号值 结果为:{result} "); } return true; } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptycarryInstockLogService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptycarryInstockLogService.cs index 793430d9..42b1b5a8 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptycarryInstockLogService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptycarryInstockLogService.cs @@ -69,10 +69,10 @@ namespace Tnb.WarehouseMgr { throw new Exception($"载具{wmsCarryH.carry_code}已锁定"); } - if (wmsCarryH.carry_status == "1") - { - throw new Exception($"载具{wmsCarryH.carry_code}已占用"); - } + //if (wmsCarryH.carry_status == "1") + //{ + // throw new Exception($"载具{wmsCarryH.carry_code}已占用"); + //} if (basLocation.is_lock == 1) {