diff --git a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs index 073b0d57..4ed7ee81 100644 --- a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs +++ b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs @@ -121,7 +121,6 @@ namespace Tnb.ProductionMgr /// /// AGV到电梯任务 /// - public SemaphoreSlim s_agvElevatortaskDic = new(1); private StackExRedisHelper _redisData; @@ -145,7 +144,6 @@ namespace Tnb.ProductionMgr private ISqlSugarClient db_Floor4DMC2CPK; private ISqlSugarClient db_F2KTPsupplement; private ISqlSugarClient db_YCLInternalTransfer; - private ISqlSugarClient db_agvElevatorTaskExceptionHandles; @@ -204,7 +202,6 @@ namespace Tnb.ProductionMgr db_Floor4DMC2CPK = repository.CopyNew(); db_F2KTPsupplement = repository.CopyNew(); db_YCLInternalTransfer = repository.CopyNew(); - db_agvElevatorTaskExceptionHandles = repository.CopyNew(); List elevatorAreas = repository.CopyNew().Queryable().Select(r => r.area_code).Distinct().ToList(); foreach (var s_elevatorArea in elevatorAreas) @@ -2082,254 +2079,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA /// async void AgvelevatorTimerTaskExceptionHandle(object args) { - if (s_agvElevatortaskDic.CurrentCount == 0) - return; - - var floor3outstock = await db_agvElevatorTaskExceptionHandles.Queryable().Where(p => p.key == "floor3outstock").FirstAsync(); - if (floor3outstock != null && floor3outstock.value == "0") - return; - await s_agvElevatortaskDic.WaitAsync(); - - try - { - await db_agvElevatorTaskExceptionHandles.Ado.BeginTranAsync(); - // 获取暂存区需要生成任务的库位 - List agvElevatorStartLocs = await db_agvElevatorTaskExceptionHandles.Queryable() - .Where(r => r.region_id == WmsWareHouseConst.REGION_CPOutstockCache_ID && r.is_use == "1" && r.is_lock == 0).ToListAsync(); - - if (agvElevatorStartLocs.Count > 0) - { - LoggerAgvElevatorTask.Information($"【AgvelevatorTimerTaskExceptionHandle】检查到需要下发到一楼任务的暂存区库位{agvElevatorStartLocs.Count}条 {string.Join(',', agvElevatorStartLocs.Select(x => x.location_code))}"); - - List> elevatorTaskGroup = agvElevatorStartLocs.GroupBy(r => r.region_id).ToList(); - foreach (IGrouping group in elevatorTaskGroup) - { - List locs = group.ToList(); - LoggerAgvElevatorTask.LogWarning($"即将下发{locs.Count}条任务"); - for (int i = 0; i < locs.Count; i++) - { - // 选一楼出货库位 - List outLocations = await db_agvElevatorTaskExceptionHandles.Queryable() - .Where(r => _wareHouseService.GetFloor1OutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0") - .OrderBy("location_code").ToListAsync(); - - if (outLocations.Count == 0) - { - LoggerAgvElevatorTask.LogWarning($"一楼没有可用的出货库位"); - continue; - } - BasLocation outLocation = outLocations.FirstOrDefault(); - WmsPointH outPoint = await db_agvElevatorTaskExceptionHandles.Queryable().FirstAsync(it => it.location_id == outLocation.id); - - // 交替选择缓存区库位 - var YCLInnerTransfer = await db_agvElevatorTaskExceptionHandles.Queryable().Where(p => p.key == "floor3CurOutCacheLocation").FirstAsync(); - - if (YCLInnerTransfer.value == null || (YCLInnerTransfer.value != "3楼发货左" && YCLInnerTransfer.value != "3楼发货右")) - throw new AppFriendlyException($"工厂配置->三楼出库暂存区当前出库分区 项配置错误!需要配置值为【3楼发货左】或【3楼发货右】", 500); - - BasLocation startloc = null; - // 如果没切换就是当前发货区 - string 切换发货区 = YCLInnerTransfer.value; - if (group.Key == WmsWareHouseConst.REGION_CPOutstockCache_ID) - { - List locations = await db_agvElevatorTaskExceptionHandles.Queryable() - .InnerJoin((a, b) => a.id == b.location_id) - .Where((a, b) => b.name == YCLInnerTransfer.value && a.is_use == "1" && a.is_lock == 0).OrderBy("a.location_code").ToListAsync(); - - startloc = locations.FirstOrDefault(); - #region 如果当前侧没有可用库位 切换另一侧继续发货,但是因为不能同时发两托同侧的货到同个电梯,所以必须保证当前优先级电梯是接第一托货 - // 交替出的时候可能会选不到库位,做特殊处理 - if (startloc == null) - { - LoggerAgvElevatorTask.LogInformation($"交替到{YCLInnerTransfer.value} 进行发货的时候,没有货物可以发"); - var _floor3FirstSelectElevatorTasknums = await db_agvElevatorTaskExceptionHandles.Queryable().Where(p => p.key == "floor3FirstSelectElevatorTasknums").FirstAsync(); - - 切换发货区 = YCLInnerTransfer.value == "3楼发货左" ? "3楼发货右" : "3楼发货左"; - LoggerAgvElevatorTask.LogInformation($"再次交替到{切换发货区} 进行发货"); - - await db_agvElevatorTaskExceptionHandles.Updateable().SetColumns(r => r.value == 切换发货区) - .Where(r => r.key == "floor3CurOutCacheLocation").ExecuteCommandAsync(); - locations = await db_agvElevatorTaskExceptionHandles.Queryable() - .InnerJoin((a, b) => a.id == b.location_id) - .Where((a, b) => b.name == 切换发货区 && a.is_use == "1" && a.is_lock == 0).OrderBy("a.location_code").ToListAsync(); - - startloc = locations.FirstOrDefault(); - // 如果还是选不到 - if (startloc == null) - { - throw new Exception($"再次交替到{切换发货区} 进行发货,仍然没有货可发,属于暂存区数据异常"); - } - - var _floor3FirstSelectElevator = await db_agvElevatorTaskExceptionHandles.Queryable().Where(p => p.key == "floor3FirstSelectElevator").FirstAsync(); - // 如果当前优先级电梯是空托盘 切换发货区之后不需要切换电梯 - if (_floor3FirstSelectElevatorTasknums.value == "2") - { - LoggerAgvElevatorTask.LogInformation($"当前优先级电梯{_floor3FirstSelectElevator.value}是空托盘 切换发货区之后不需要切换电梯"); - } - // 如果当前优先级电梯不是空托盘 切换发货区之后还需要切换电梯 - else - { - LoggerAgvElevatorTask.LogInformation($"当前优先级电梯{_floor3FirstSelectElevator.value}不是空托盘 切换发货区之后还需要切换电梯"); - - string 切换电梯 = _floor3FirstSelectElevator.value == "Elevator3" ? "Elevator4" : "Elevator3"; - LoggerAgvElevatorTask.LogInformation($"交替到{切换电梯} 进行发货"); - // 选择另一个电梯座位首选电梯 - await db_agvElevatorTaskExceptionHandles.Updateable().SetColumns(r => r.value == 切换电梯) - .Where(r => r.key == "floor3FirstSelectElevator").ExecuteCommandAsync(); - // 剩余可放托数 - await db_agvElevatorTaskExceptionHandles.Updateable().SetColumns(r => r.value == "2") - .Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync(); - } - - } - #endregion - - } - List wmsCarryHs = await db_agvElevatorTaskExceptionHandles.Queryable().Where(r => r.location_id == startloc.id).ToListAsync(); - if (wmsCarryHs.Count > 1) - { - LoggerAgvElevatorTask.LogWarning($"暂存区库位{startloc.location_code}上存在多个托盘{string.Join(',', wmsCarryHs.Select(x => x.carry_code))}"); - continue; - } - if (wmsCarryHs.Count == 0) - { - LoggerAgvElevatorTask.LogWarning($"暂存区库位{startloc.location_code}上不存在托盘"); - continue; - } - WmsCarryH wmsCarryH = wmsCarryHs.FirstOrDefault(); - - WmsElevatorH wmsElevatorH = null; - // 选电梯 - if (group.Key == WmsWareHouseConst.REGION_CPOutstockCache_ID) - { - var floor3FirstSelectElevator = await db_agvElevatorTaskExceptionHandles.Queryable().Where(p => p.key == "floor3FirstSelectElevator").FirstAsync(); - var floor3FirstSelectElevatorTasknums = await db_agvElevatorTaskExceptionHandles.Queryable().Where(p => p.key == "floor3FirstSelectElevatorTasknums").FirstAsync(); - - wmsElevatorH = await db_agvElevatorTaskExceptionHandles.Queryable().Where(r => r.elevator_code == floor3FirstSelectElevator.value).FirstAsync(); - - floor3FirstSelectElevatorTasknums.value = (int.Parse(floor3FirstSelectElevatorTasknums.value) - 1).ToString(); - if (floor3FirstSelectElevatorTasknums.value == "0") - { - // 选择另一个电梯座位首选电梯 - await db_agvElevatorTaskExceptionHandles.Updateable().SetColumns(r => r.value == (r.value == "Elevator3" ? "Elevator4" : "Elevator3")) - .Where(r => r.key == "floor3FirstSelectElevator").ExecuteCommandAsync(); - // 重置为可放两托 - floor3FirstSelectElevatorTasknums.value = "2"; - } - // 剩余可放托数 - await db_agvElevatorTaskExceptionHandles.Updateable().SetColumns(r => r.value == floor3FirstSelectElevatorTasknums.value) - .Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync(); - } - - string elevatorSno = wmsElevatorH.elevator_code.Replace("Elevator", ""); - - List wmsPointHs = await db_agvElevatorTaskExceptionHandles.Queryable().Where(it => it.status == 1).ToListAsync(); - List points = new List(); - - // 到电梯 - WmsPointH cacheOut_point = wmsPointHs.Where(r => r.location_code == startloc.location_code).First().Copy(); - WmsPointH DT_C_point = wmsPointHs.Where(r => r.point_code == $"DT-C-03-0{elevatorSno}").First().Copy(); - cacheOut_point.area_code = "FC"; - DT_C_point.area_code = "FC"; - - points.Add(cacheOut_point); - points.Add(DT_C_point); - // 到一楼 - points.Add(wmsPointHs.Where(r => r.point_code == $"DT-3-{elevatorSno}").First()); - points.Add(wmsPointHs.Where(r => r.point_code == $"DT-1-{elevatorSno}").First()); - points.Add(wmsPointHs.Where(r => r.point_code == $"DT-R-01-0{elevatorSno}").First()); - points.Add(outPoint); - - //根据获取的路径点生成预任务,生成顺序必须预路径算法返回的起终点的顺序一致(预任务顺序) - if (points?.Count > 0) - { - List preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it => - { - WmsPointH? sPoint = it.FirstOrDefault(); - WmsPointH? ePoint = it.LastOrDefault(); - - WmsPretaskH preTask = new() - { - org_id = WmsWareHouseConst.AdministratorOrgId, - startlocation_id = sPoint?.location_id!, - startlocation_code = sPoint?.location_code!, - endlocation_id = ePoint?.location_id!, - endlocation_code = ePoint?.location_code!, - start_floor = sPoint?.floor.ToString(), - end_floor = ePoint?.floor.ToString(), - startpoint_id = sPoint?.id!, - startpoint_code = sPoint?.point_code!, - endpoint_id = ePoint?.id!, - endpoint_code = ePoint?.point_code!, - bill_code = _billRullService!.GetBillNumber(WmsWareHouseConst.WMS_PRETASK_H_ENCODE).GetAwaiter().GetResult(), - status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID, - biz_type = wmsCarryH.biz_type, - task_type = WmsWareHouseConst.WMS_PRETASK_TRANSFER_TYPE_ID - }; - preTask.carry_id = wmsCarryH.id; - preTask.carry_code = wmsCarryH.carry_code; - preTask.area_id = sPoint?.area_id!; - preTask.area_code = it.Key; - // 载具记录 require_id todo - preTask.require_id = wmsCarryH.require_id; - preTask.require_code = ""; - preTask.create_id = _userManager.UserId; - preTask.create_time = DateTime.Now; - return preTask; - }).ToList(); - bool isOk = await _wareHouseService.GenPreTask(preTasks, null!, db_agvElevatorTaskExceptionHandles); - if (isOk) - { - //查询库位表 - BasLocation location = await db_agvElevatorTaskExceptionHandles.Queryable().SingleAsync(it => it.id == startloc.id); - { - //载具加锁,增加库位信息 - _ = await db_agvElevatorTaskExceptionHandles.Updateable().SetColumns(it => new WmsCarryH - { - carry_status = ((int)EnumCarryStatus.占用).ToString(), - is_lock = 1, - location_id = startloc.id, - location_code = location.location_code - }).Where(it => it.id == wmsCarryH.id).ExecuteCommandAsync(); - } - - await db_agvElevatorTaskExceptionHandles.Updateable().SetColumns(r => r.value == (切换发货区 == "3楼发货左" ? "3楼发货右" : "3楼发货左")) - .Where(r => r.key == "floor3CurOutCacheLocation").ExecuteCommandAsync(); - - //所有库位加锁 - string?[] ids = new[] { startloc.id, preTasks[0].endlocation_id, outLocation.id }; - _ = await db_agvElevatorTaskExceptionHandles.Updateable().SetColumns(it => new BasLocation { is_lock = 1 }).Where(it => ids.Contains(it.id)).ExecuteCommandAsync(); - } - else - { - throw new Exception("预任务生成失败"); - } - } - } - } - - await db_agvElevatorTaskExceptionHandles.Ado.CommitTranAsync(); - } - } - catch (ObjectDisposedException ex) - { - LoggerAgvElevatorTask.LogWarning($"【AgvelevatorTimerTaskExceptionHandle】 数据库连接异常:{ex.Message}"); - LoggerAgvElevatorTask.LogWarning($"【AgvelevatorTimerTaskExceptionHandle】 数据库连接异常:{ex.StackTrace}"); - if (ex.Source == "Npgsql") - db_agvElevatorTaskExceptionHandles = _repository.AsSugarClient().CopyNew(); - } - catch (Exception ex) - { - Console.WriteLine("【AgvelevatorTimerTaskExceptionHandle】" + ex.Message); - LoggerAgvElevatorTask.LogError($"【AgvelevatorTimerTaskExceptionHandle】 {ex.Message}"); - LoggerAgvElevatorTask.LogError($"【AgvelevatorTimerTaskExceptionHandle】 {ex.StackTrace}"); - // 数据库连接断开时会报错 - try { await db_agvElevatorTaskExceptionHandles.Ado.RollbackTranAsync(); } catch { }; - } - finally - { - s_agvElevatortaskDic.Release(); - } + await _wareHouseService.AgvelevatorTimerTaskExceptionHandle(); } #region 内存测试 @@ -2962,8 +2712,8 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA F2KTPsupplementtimer = new Timer(F2KTPsupplement, null, TimeSpan.Zero, TimeSpan.FromSeconds(30)); YCLInternalTransfertimer = new Timer(YCLInternalTransfer, null, TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(185)); - elevatorTimer = new Timer(ElevatorTaskExceptionHandle, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(20)); - agvelevatorTimer = new Timer(AgvelevatorTimerTaskExceptionHandle, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(20)); + elevatorTimer = new Timer(ElevatorTaskExceptionHandle, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10)); + agvelevatorTimer = new Timer(AgvelevatorTimerTaskExceptionHandle, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10)); return Task.CompletedTask; } @@ -3046,39 +2796,6 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA } } - protected string _LoggerAgvElevatorTaskFileName = ""; - protected ILogger _LoggerAgvElevatorTask; - protected ILogger LoggerAgvElevatorTask - { - get - { - string newFileName = $"{AppContext.BaseDirectory}/logs/{DateTime.Now:yyyyMMdd}/custom{DateTime.Now:yyyyMMdd}AgvElevatorTask.log"; - if (_LoggerAgvElevatorTaskFileName != 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(); - }; - - })); - _LoggerAgvElevatorTask = loggerFactory.CreateLogger(this.GetType()); - _LoggerAgvElevatorTaskFileName = newFileName; - } - return _LoggerAgvElevatorTask; - } - } protected string _LoggerSSXFileName = ""; protected ILogger _LoggerSSX; diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs index 4abb990f..b4a3fdcd 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/WmsWareHouseConst.cs @@ -607,7 +607,7 @@ /// 第三方 bip 地址 /// // public const string BIP_DOMAIN = "http://192.168.1.11:8087/";//测试地址 - public const string BIP_DOMAIN = "http://192.168.0.145:8089/";//正式地址 + public const string BIP_DOMAIN = "http://192.168.1.145:8089/";//正式地址 /// /// 单位类型id diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/ErpRawmatOutstockInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/ErpRawmatOutstockInput.cs index fe51bec0..65f64bf5 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/ErpRawmatOutstockInput.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/ErpRawmatOutstockInput.cs @@ -72,5 +72,10 @@ namespace Tnb.WarehouseMgr.Entities.Dto.ErpInputs /// 子表主键 /// public string erp_line_pk { get; set; } + + /// + /// 辅助属性 + /// + public string auxprop { get; set; } } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/SaleShippingInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/SaleShippingInput.cs index 77837840..c5ed1ce5 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/SaleShippingInput.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/SaleShippingInput.cs @@ -82,5 +82,9 @@ namespace Tnb.WarehouseMgr.Entities.Dto.ErpInputs /// 子表主键 /// public string erp_line_pk { get; set; } + /// + /// 辅助属性 + /// + public string auxprop { get; set; } } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/TransferOutstockInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/TransferOutstockInput.cs index 487ed847..eb38aa52 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/TransferOutstockInput.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/ErpInputs/TransferOutstockInput.cs @@ -106,5 +106,10 @@ namespace Tnb.WarehouseMgr.Entities.Dto.ErpInputs /// 子表主键 /// public string erp_line_pk { get; set; } + + /// + /// 辅助属性 + /// + public string auxprop { get; set; } } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferDistributeSCWToZCCInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferDistributeSCWToZCCInput.cs index 43a8de4e..238aa88c 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferDistributeSCWToZCCInput.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Inputs/MaterialTransferDistributeSCWToZCCInput.cs @@ -29,5 +29,10 @@ /// public decimal qty { get; set; } + /// + /// 起点 + /// + public string startlocation_code { get; set; } + } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/InStockStrategyQuery.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/InStockStrategyQuery.cs index 9aa362b4..2c73df19 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/InStockStrategyQuery.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/InStockStrategyQuery.cs @@ -1,4 +1,6 @@ -namespace Tnb.WarehouseMgr.Entities.Dto +using SqlSugar; + +namespace Tnb.WarehouseMgr.Entities.Dto { /// /// 入库策略输入参数 @@ -34,5 +36,8 @@ // 策略编号 public string PolicyCode { get; set; } + + // 策略编号 + public ISqlSugarClient dbConn { get; set; } = null; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/OutStockStrategyQuery.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/OutStockStrategyQuery.cs index 99e2c9ae..e088f99b 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/OutStockStrategyQuery.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/OutStockStrategyQuery.cs @@ -1,4 +1,6 @@ -namespace Tnb.WarehouseMgr.Entities.Dto +using SqlSugar; + +namespace Tnb.WarehouseMgr.Entities.Dto { public class OutStockStrategyQuery { @@ -52,5 +54,8 @@ // 策略编号 public string PolicyCode { get; set; } + + // 策略编号 + public ISqlSugarClient dbConn { get; set; } = null; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/InventorycheckInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/InventorycheckInput.cs new file mode 100644 index 00000000..108feca2 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/InventorycheckInput.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Transactions; + +namespace Tnb.WarehouseMgr.Entities.Dto.ErpInputs +{ + public class InventorycheckInput + { + /// + /// 盘点单号 + /// + public string? erp_bill_code { get; set; } + + /// + /// 部门编码 + /// + public string? dept_code { get; set; } + + /// + /// 业务员编码 + /// + public string? biller { get; set; } + + /// + /// 盘点仓库编码 + /// + public string? warehouse_code { get; set; } + + /// + /// 盘点日期 + /// + public string? check_date { get; set; } + + /// + /// 主表pk + /// + public string? erp_pk { get; set; } + + public List details { get; set; } + } + public class InventorycheckInputDetail + { + /// + /// 行号 + /// + public string? lineno { get; set; } + + /// + /// 物品代码 + /// + public string? material_code { get; set; } + + /// + /// 单位代码 + /// + public string? unit_code { get; set; } + + /// + /// 采购数量 + /// + public decimal? qty { get; set; } + + /// + /// 批次 + /// + public string? code_batch { get; set; } + + /// + /// 生产日期 + /// + public DateTime? production_date { get; set; } + + /// + /// 子表主键 + /// + public string erp_line_pk { get; set; } + + /// + /// 辅助属性 + /// + public string auxprop { get; set; } + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsElevatorH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsElevatorH.cs index a5fe608d..377a9d27 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsElevatorH.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsElevatorH.cs @@ -105,5 +105,9 @@ public partial class WmsElevatorH : BaseEntity /// 电梯内托数 /// public int carry_count { get; set; } - + + /// + /// 梯内货位占用情况 + /// + public string? innerpos { get; set; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsInventorycheckD.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsInventorycheckD.cs new file mode 100644 index 00000000..276cbab3 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsInventorycheckD.cs @@ -0,0 +1,124 @@ +using JNPF.Common.Contracts; +using JNPF.Common.Security; +using SqlSugar; + +namespace Tnb.WarehouseMgr.Entities.Entity; + +/// +/// 盘点明细 +/// +[SugarTable("wms_inventorycheck_d")] +public partial class WmsInventorycheckD : BaseEntity +{ + public WmsInventorycheckD() + { + id = SnowflakeIdHelper.NextId(); + } + /// + /// 盘点单id + /// + public string? bill_id { 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? remark { get; set; } + + /// + /// 所属组织 + /// + public string? org_id { get; set; } + + /// + /// 物料id + /// + public string? material_id { get; set; } + + /// + /// 物料编号 + /// + public string? material_code { get; set; } + + /// + /// 物料名称 + /// + public string? material_name { get; set; } + + /// + /// 规格型号 + /// + public string? material_specification { get; set; } + + /// + /// 批次 + /// + public string? code_batch { get; set; } + + /// + /// 单位id + /// + public string? unit_id { get; set; } + + /// + /// 单位编码 + /// + public string? unit_code { get; set; } + + /// + /// 数量 + /// + public decimal? qty { get; set; } + + /// + /// 生产日期 + /// + public DateTime? production_date { get; set; } + + /// + /// erp_line_pk + /// + public string? erp_line_pk { get; set; } + + /// + /// 行号 + /// + public string? lineno { get; set; } + + /// + /// 实际数量 + /// + public decimal? actual_qty { get; set; } + + /// + /// 辅助属性 + /// + public string auxprop { get; set; } + /// + /// 辅助属性 供应商 + /// + public string auxprop_gys { get; set; } + /// + /// 辅助属性 小批号 + /// + public string auxprop_xph { get; set; } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsInventorycheckH.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsInventorycheckH.cs new file mode 100644 index 00000000..c3741372 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsInventorycheckH.cs @@ -0,0 +1,93 @@ +using JNPF.Common.Contracts; +using JNPF.Common.Security; +using SqlSugar; + +namespace Tnb.WarehouseMgr.Entities.Entity; + +/// +/// 盘点单 +/// +[SugarTable("wms_inventorycheck_h")] +public partial class WmsInventorycheckH : BaseEntity +{ + public WmsInventorycheckH() + { + id = SnowflakeIdHelper.NextId(); + } + /// + /// 创建用户 + /// + 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; } + + /// + /// 备注 + /// + public string? remark { get; set; } + + /// + /// 盘点单号 + /// + public string? bill_code { get; set; } + + /// + /// 仓库id + /// + public string? warehouse_id { get; set; } + + /// + /// 仓库编码 + /// + public string? warehouse_code { get; set; } + + /// + /// 仓库名称 + /// + public string? warehouse_name { get; set; } + + /// + /// 部门编码 + /// + public string? dept_code { get; set; } + + /// + /// 业务员编码 + /// + public string? biller { get; set; } + + /// + /// erp_pk + /// + public string? erp_pk { get; set; } + + /// + /// erp_bill_code + /// + public string? erp_bill_code { get; set; } + + /// + /// 盘点日期 + /// + public string? check_date { get; set; } + + +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsInventorycheckRecord.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsInventorycheckRecord.cs new file mode 100644 index 00000000..0939de14 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsInventorycheckRecord.cs @@ -0,0 +1,67 @@ +using JNPF.Common.Contracts; +using JNPF.Common.Security; +using SqlSugar; + +namespace Tnb.WarehouseMgr.Entities.Entity; + +/// +/// 盘点记录 +/// +[SugarTable("wms_inventorycheck_record")] +public partial class WmsInventorycheckRecord : BaseEntity +{ + public WmsInventorycheckRecord() + { + id = SnowflakeIdHelper.NextId(); + } + /// + /// 创建用户 + /// + public string? create_id { get; set; } + + /// + /// 创建时间 + /// + public DateTime? create_time { get; set; } + + /// + /// 修改用户 + /// + public string? modify_id { get; set; } + + /// + /// 修改时间 + /// + public DateTime? modify_time { get; set; } + + /// + /// 盘点单id + /// + public string? bill_id { get; set; } + + /// + /// 盘点单明细id + /// + public string? mat_bill_id { get; set; } + + /// + /// 载具id + /// + public string? carry_id { get; set; } + + /// + /// 载具编码 + /// + public string? carry_code { get; set; } + + /// + /// 库位id + /// + public string? location_id { get; set; } + + /// + /// 库位编码 + /// + public string? location_code { get; set; } + +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPretaskH.part.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPretaskH.part.cs index e35603c6..afeef7e0 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPretaskH.part.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsPretaskH.part.cs @@ -18,4 +18,9 @@ public partial class WmsPretaskH : ITaskManagerDel /// [SugarColumn(IsIgnore = true)] public string third_eqp_type { get; set; } + /// + /// 巷道 + /// + [SugarColumn(IsIgnore = true)] + public string passage { get; set; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatOutstockD.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatOutstockD.cs index ed96575c..1389fd3f 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatOutstockD.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatOutstockD.cs @@ -124,4 +124,16 @@ public partial class WmsRawmatOutstockD : BaseEntity /// public decimal? actual_outstock_qty { get; set; } + /// + /// 辅助属性 + /// + public string auxprop { get; set; } + /// + /// 辅助属性 供应商 + /// + public string auxprop_gys { get; set; } + /// + /// 辅助属性 小批号 + /// + public string auxprop_xph { get; set; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatTransferinstockD.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatTransferinstockD.cs index f4cf1ef7..c3fba4d0 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatTransferinstockD.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsRawmatTransferinstockD.cs @@ -138,5 +138,17 @@ public partial class WmsRawmatTransferinstockD : BaseEntity /// 物料名称 /// public string? matname { get; set; } + /// + /// 辅助属性 + /// + public string auxprop { get; set; } + /// + /// 辅助属性 供应商 + /// + public string auxprop_gys { get; set; } + /// + /// 辅助属性 小批号 + /// + public string auxprop_xph { get; set; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsSaleD.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsSaleD.cs index 2e84774a..fca1b0f2 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsSaleD.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsSaleD.cs @@ -97,5 +97,16 @@ public partial class WmsSaleD : BaseEntity /// public string? erp_line_pk { get; set; } - + /// + /// 辅助属性 + /// + public string auxprop { get; set; } + /// + /// 辅助属性 供应商 + /// + public string auxprop_gys { get; set; } + /// + /// 辅助属性 小批号 + /// + public string auxprop_xph { get; set; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsStockReportCode.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsStockReportCode.cs index 69c50463..f16bcaa8 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsStockReportCode.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsStockReportCode.cs @@ -17,7 +17,7 @@ public partial class WmsStockReportCode : BaseEntity /// /// 主表ID /// - public string? report_id { get; set; } + //public string? report_id { get; set; } ///// ///// 载具ID @@ -52,7 +52,7 @@ public partial class WmsStockReportCode : BaseEntity /// /// 条码数量 /// - public decimal codeqty { get; set; } + public decimal? codeqty { get; set; } /// /// 单位ID @@ -84,6 +84,10 @@ public partial class WmsStockReportCode : BaseEntity /// public DateTime? time_stamp { get; set; } + /// + /// 物料名称 + /// + public string? material_name { get; set; } /// /// 规格型号 /// @@ -116,4 +120,14 @@ public partial class WmsStockReportCode : BaseEntity /// public string? warehouse_name { get; set; } + /// + /// 区域编码 + /// + public string? region_code { get; set; } + + /// + /// 区域名称 + /// + public string? region_name { get; set; } + } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsStockReportH.part.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsStockReportH.part.cs index 42af197c..1aad1ce8 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsStockReportH.part.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsStockReportH.part.cs @@ -18,7 +18,7 @@ public partial class WmsStockReportH //[SugarColumn(IsIgnore = true)] //public List Details { get; set; } //[SugarColumn(IsIgnore = true)] - public decimal codeqty { get; set; } + public decimal? codeqty { get; set; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsTransferInstockD .cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsTransferInstockD .cs index 0b4d6ca0..c94d60c5 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsTransferInstockD .cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsTransferInstockD .cs @@ -123,5 +123,17 @@ public partial class WmsTransferInstockD : BaseEntity /// 物料名称 /// public string? material_name { get; set; } + /// + /// 辅助属性 + /// + public string auxprop { get; set; } + /// + /// 辅助属性 供应商 + /// + public string auxprop_gys { get; set; } + /// + /// 辅助属性 小批号 + /// + public string auxprop_xph { get; set; } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumLocationType.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumLocationType.cs index afa934c4..31afce51 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumLocationType.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumLocationType.cs @@ -10,5 +10,6 @@ 出库库位, 出入库位, 分拣库位, + 人工管理库位, } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs index 07d7b3eb..72b1afa7 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs @@ -196,6 +196,7 @@ namespace Tnb.WarehouseMgr.Interfaces /// Task> PathAlgorithmsEle(string pStartId, string pEndId, int ele); Task SsxControl(WmsDistaskH disTask, string action); + Task SsxControl_complete(WmsDistaskH disTask, string action); Func AddUnExecuteTask { get; set; } Task Check(string code, string action); /// @@ -235,5 +236,13 @@ namespace Tnb.WarehouseMgr.Interfaces Task FindElevatorFromPars(ElevagorInfoQuery input); Task CreateCodeRules(string prefix, string custom, int watercodeLength); + + public Task CallingLanding(List agvDTTasks); + + /// + /// 电梯第三次改动 生成Agv到电梯任务 + /// + /// + public Task AgvelevatorTimerTaskExceptionHandle(); } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs index f2d2d23a..9b5cd304 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs @@ -107,7 +107,7 @@ namespace Tnb.WarehouseMgr public static Dictionary _s_elevatortaskWCSRequestDic = new(); public static List _db_ElevatorTaskExceptionHandles = new(); - + public static SemaphoreSlim s_agvElevatortaskDic = new(1); public static SemaphoreSlim s_GenTaskExecute = new(1); protected IEventPublisher? EventPublisher { set; get; } @@ -145,6 +145,39 @@ namespace Tnb.WarehouseMgr return _Logger; } } + protected string _LoggerAgvElevatorTaskFileName = ""; + protected ILogger _LoggerAgvElevatorTask; + protected ILogger LoggerAgvElevatorTask + { + get + { + string newFileName = $"{AppContext.BaseDirectory}/logs/{DateTime.Now:yyyyMMdd}/custom{DateTime.Now:yyyyMMdd}AgvElevatorTask.log"; + if (_LoggerAgvElevatorTaskFileName != 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(); + }; + + })); + _LoggerAgvElevatorTask = loggerFactory.CreateLogger(this.GetType()); + _LoggerAgvElevatorTaskFileName = newFileName; + } + return _LoggerAgvElevatorTask; + } + } static BaseWareHouseService() { diff --git a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs index bd730732..a4219930 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs @@ -92,9 +92,9 @@ namespace Tnb.WarehouseMgr { Logger.Information($"【LoadConfirm】接收到WCS取货确认信号.................. {JsonConvert.SerializeObject(input)}"); + var dis = _db.Queryable().Where(P => P.bill_code == input.taskCode).First(); try { - var dis = _db.Queryable().Where(P => P.bill_code == input.taskCode).First(); if (dis.area_code == "ZSCJ001") { var flag = await _wareHouseService.Check(dis.startlocation_code, "LOAD"); @@ -174,7 +174,6 @@ namespace Tnb.WarehouseMgr var tags = _eleCtlCfg.tags; await Task.Delay(1000); (int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None); - Logger.Information($"【LoadConfirm】 电梯当前状态->系统状态:{sysStatus.ToEnum()},运行状态:{runStatus.ToEnum()},门状态:{doorStatus},Agv状态:{agvStatus.ToEnum()},当前楼层:{floorNo},电梯占用状态{s_eleUseStatusDic[elevator.device_id]}"); { var curFloor = await GetRealFloor(elevator.elevator_code, elevator.end_floor); /* Logger.Information($"目标楼层:{curFloor},电梯当前楼层:{floorNo}"); @@ -182,6 +181,7 @@ namespace Tnb.WarehouseMgr var loadedStatus = s_eleUseStatusDic[elevator.device_id] == 1 ? "完成" : "未完成"; Logger.Information($"{devName.Match(@"\d+")}#梯,取货-> {loadedStatus}"); */ + Logger.Information($"【LoadConfirm】 电梯当前状态->系统状态:{sysStatus.ToEnum()},运行状态:{runStatus.ToEnum()},门状态:{doorStatus},Agv状态:{agvStatus.ToEnum()},当前楼层:{floorNo},目标楼层:{curFloor},电梯占用状态{s_eleUseStatusDic[elevator.device_id]}"); if (s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.空闲 && curFloor != floorNo) { _ = await _elevatorControlService.CallLift(devName, curFloor, CancellationToken.None); @@ -281,19 +281,22 @@ namespace Tnb.WarehouseMgr Logger.Information("【UnloadConfirm】 接收到WCS放货确认信号.................."); Logger.Information($"【UnloadConfirm】 当前放货,任务编号:{input.taskCode}"); + WmsDistaskH dis = null; try { - var dis = _db.Queryable().Where(P => P.bill_code == input.taskCode).First(); + dis = _db.Queryable().Where(P => P.bill_code == input.taskCode).First(); if (dis.area_code == "ZSCJ001") { var flag = await _wareHouseService.Check(dis.endlocation_code, "UNLOAD"); if (flag) { await _wareHouseService.SsxControl(dis, "UNLOAD"); + Logger.Information($"【UnloadConfirm】 当前放货,任务编号:{input.taskCode} 确认成功"); return await ToApiResult(HttpStatusCode.OK, "成功"); } else { + Logger.Information($"【UnloadConfirm】 当前放货,任务编号:{input.taskCode} 确认信号不允许"); return await ToApiResult(HttpStatusCode.InternalServerError, "失败"); } } @@ -304,10 +307,12 @@ namespace Tnb.WarehouseMgr { // 二楼机械臂 await _wareHouseService.Floor2MechanicalConfirm(dis, "UNLOAD"); + Logger.Information($"【UnloadConfirm】 当前放货,任务编号:{input.taskCode} 确认成功"); return await ToApiResult(HttpStatusCode.OK, "成功"); } else { + Logger.Information($"【UnloadConfirm】 当前放货,任务编号:{input.taskCode} 确认成功"); return await ToApiResult(HttpStatusCode.OK, "成功"); } } @@ -316,6 +321,7 @@ namespace Tnb.WarehouseMgr { Logger.LogError(ex.Message); Logger.LogError(ex.StackTrace); + Logger.Information($"【UnloadConfirm】 当前放货,任务编号:{input.taskCode} 确认失败"); return await ToApiResult(HttpStatusCode.InternalServerError, $"放货确认..................失败 原因是{ex.Message}"); throw; } @@ -397,7 +403,7 @@ namespace Tnb.WarehouseMgr Logger.Information($"【UnloadConfirm】 发送电梯{devName}前门开门指令"); _ = await _elevatorControlService.SendOpenCloseCmd(devName, 3); //发送电梯前门开门指令 } - + string innerpos = ""; // 3 4号梯需要电梯是当前楼层开门状态就能进 bool canEnter = false; if (devName == "Elevator3" || devName == "Elevator4") @@ -423,8 +429,19 @@ namespace Tnb.WarehouseMgr if (elevator.carry_count >= 2) { Logger.LogInformation($"电梯内{devName}已有两托货!"); - return await ToApiResult(HttpStatusCode.InternalServerError, $"电梯内{devName}已有两托货!"); + return await ToApiResult(HttpStatusCode.InternalServerError, $"电梯{devName}内已有两托货!"); } + WmsElevatorH wmsElevatorH = await _db.Queryable().Where(r => r.elevator_id == elevator.device_id).FirstAsync(); + WmsElevatorcacheArea wmsElevatorcacheArea = await _db.Queryable().Where(r => r.location_id == dis.startlocation_id).FirstAsync(); + // 如果当前所放梯内货位已占用 + if (wmsElevatorH.innerpos.Contains(wmsElevatorcacheArea.name)) + { + return await ToApiResult(HttpStatusCode.InternalServerError, $"电梯{devName}内托盘{dis.carry_code}当前准备放置的货位已有货!"); + } + + innerpos = wmsElevatorH.innerpos + "," + wmsElevatorcacheArea.name; + + canEnter = true; } @@ -434,7 +451,8 @@ namespace Tnb.WarehouseMgr await _db.Updateable().SetColumns(r => new WmsElevatorH { is_use = (int)EnumElevatorUseStatus.占用, - use_tasks = $"','{r.use_tasks}".Trim(',') + use_tasks = $"','{r.use_tasks}".Trim(','), + innerpos = innerpos.Trim(',') }).Where(r => r.elevator_id == elevator.device_id).ExecuteCommandAsync(); s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.占用; Logger.Information($"【UnloadConfirm】 {devName}放货成功 状态变更为占用 {s_eleUseStatusDic.GetHashCode()} {s_eleUseStatusDic[elevator.device_id]}"); @@ -845,7 +863,8 @@ namespace Tnb.WarehouseMgr await _db.Updateable().SetColumns(r => new WmsElevatorH { is_use = (int)EnumElevatorUseStatus.空闲, - use_tasks = "" + use_tasks = "", + innerpos = "" }).Where(r => r.elevator_id == elevator.device_id).ExecuteCommandAsync(); s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.空闲; Logger.Information($"【TaskCallback】 {devName.Match(@"\d+")}#梯,设备名称:{devName},开始进入关门流程 {devName} 变更为空闲 {s_eleUseStatusDic.GetHashCode()} {s_eleUseStatusDic[elevator.device_id]}"); @@ -895,6 +914,11 @@ namespace Tnb.WarehouseMgr _ = await _db.Deleteable(elevatorQueueItem).ExecuteCommandAsync(); } + // 三楼出库取货完成时呼叫电梯 + if (disTask.area_code == "FC") + { + _wareHouseService.CallingLanding(new List() { disTask }); + } // 中储仓KIVA取货确认后不需要再发送信号给输送线 if (disTask.startlocation_code == "ZSSSXCTU01" || disTask.startlocation_code == "ZSSSXCTU02") @@ -915,10 +939,20 @@ namespace Tnb.WarehouseMgr }; Logger.Information($"taskCompleUpInput json parameter:{JsonConvert.SerializeObject(taskCompleUpInput)}"); await _wareHouseService.TaskComplate(taskCompleUpInput); - await _wareHouseService.SsxControl(disTask, "UNLOAD"); + await _wareHouseService.SsxControl_complete(disTask, "UNLOAD"); await _wareHouseService.Floor2MechanicalComplete(disTask, "UNLOAD"); - + // 三楼暂存放货完成时生成到电梯任务 + if (disTask.area_code == "F") + { + BasLocation endlocation = await _db.Queryable().FirstAsync(r => r.id == disTask.endlocation_id); + if (endlocation.region_id == WmsWareHouseConst.REGION_CPOutstockCache_ID) + { + Logger.Information($"【TaskCallback】托盘{disTask.carry_code}放货完成 开始分配到电梯任务"); + await _wareHouseService.AgvelevatorTimerTaskExceptionHandle(); + } + } + Logger.Information($"【TaskCallback】 Agv放货完成,任务编号:{string.Join(",", disTasks.Select(x => x.bill_code))}"); } @@ -956,10 +990,18 @@ namespace Tnb.WarehouseMgr { is_use = (int)EnumElevatorUseStatus.空闲, use_tasks = "", - carry_count = 0 + carry_count = 0, + innerpos = "" }) .Where(it => it.elevator_id == wmsElevatorH.elevator_id).ExecuteCommandAsync(); + var floor3FirstSelectElevator = await _db.Queryable().Where(p => p.key == "floor3FirstSelectElevator").FirstAsync(); + if (floor3FirstSelectElevator.value == input.elevator_code) + { + // 剩余可放托数 + await _db.Updateable().SetColumns(r => r.value == "2") + .Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync(); + } List elevatorTasks = _db.Queryable() .Where(r => r.startlocation_code.Contains($"DT") && r.endlocation_code.Contains($"DT") && r.act_start_date == null && r.act_end_date == null diff --git a/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs b/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs index a5d49be8..92a41aea 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs @@ -5,6 +5,7 @@ using JNPF.Common.Enums; using JNPF.DependencyInjection; using JNPF.DynamicApiController; using JNPF.FriendlyException; +using JNPF.Systems.Entitys.Permission; using JNPF.Systems.Entitys.System; using JNPF.Systems.Interfaces.System; using Microsoft.AspNetCore.Authorization; @@ -938,6 +939,284 @@ namespace Tnb.WarehouseMgr } } + /// + /// 转库单 + /// + [HttpPost, NonUnify, AllowAnonymous] + public async Task MaterialTransferBatch(List inputs) + { + LoggerErp2Mes.LogInformation($"【MaterialTransfer】ERP传入数据:{JsonConvert.SerializeObject(inputs)}"); + var db = _repository.AsSugarClient(); + + List error_erpbillcodes = new List(); + foreach (MaterialTransferInput input in inputs) + { + try + { + WmsErpWarehouserelaH wmsErpWarehouserelaHout = await db.Queryable().Where(r => r.erp_warehousecode == input.warehouse_outstock).FirstAsync(); + if (wmsErpWarehouserelaHout == null) + { + _LoggerErp2Mes.LogWarning($@"【TransferOrder】不存在erp仓库类型{input.warehouse_outstock}对应wms系统的映射关系!"); + throw new AppFriendlyException($@"不存在erp仓库类型{input.warehouse_outstock}对应wms系统的映射关系!", 500); + } + + WmsErpWarehouserelaH wmsErpWarehouserelaHin = await db.Queryable().Where(r => r.erp_warehousecode == input.warehouse_instock).FirstAsync(); + if (wmsErpWarehouserelaHin == null) + { + _LoggerErp2Mes.LogWarning($@"【TransferOrder】不存在erp仓库类型{input.warehouse_instock}对应wms系统的映射关系!"); + throw new AppFriendlyException($@"不存在erp仓库类型{input.warehouse_instock}对应wms系统的映射关系!", 500); + } + + string warehouse_outstock_code = wmsErpWarehouserelaHout.wms_warehousecode; + string warehouse_instock_code = wmsErpWarehouserelaHin.wms_warehousecode; + + BasWarehouse warehouse_outstock = await db.Queryable().Where(r => r.whcode == warehouse_outstock_code).FirstAsync(); + BasWarehouse warehouse_instock = await db.Queryable().Where(r => r.whcode == warehouse_instock_code).FirstAsync(); + if (warehouse_outstock == null) + { + _LoggerErp2Mes.LogWarning($"【MaterialTransfer】无法查询到出库仓库{input.warehouse_outstock}的档案记录!"); + throw new AppFriendlyException($"无法查询到出库仓库{input.warehouse_outstock}的档案记录!", 500); + } + if (warehouse_instock == null) + { + _LoggerErp2Mes.LogWarning($"【MaterialTransfer】无法查询到入库仓库{input.warehouse_instock}的档案记录!"); + throw new AppFriendlyException($"无法查询到入库仓库{input.warehouse_instock}的档案记录!", 500); + } + + if (string.IsNullOrEmpty(input.erp_pk)) + { + _LoggerErp2Mes.LogWarning($"【MaterialTransfer】主表主键不能为空!"); + throw new AppFriendlyException($@"主表主键不能为空!", 500); + } + + int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count(); + if (count_erp_line_pk > 0) + { + _LoggerErp2Mes.LogWarning($@"【MaterialTransfer】子表主键不能为空!"); + throw new AppFriendlyException($@"子表主键不能为空!", 500); + } + + string transfer_type = ""; + // 中储仓到暂存仓 + if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_ZC_ID + && (warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_ZCC_ID || warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_HCC_ID)) + { + int count = input.details.Where(r => string.IsNullOrEmpty(r.station_code)).Count(); + if (count > 0) + { + _LoggerErp2Mes.LogWarning($@"【MaterialTransfer】表体存在未填写工位的明细!"); + throw new AppFriendlyException($@"表体存在未填写工位的明细!", 500); + } + + transfer_type = WmsWareHouseConst.MATERIALTRANSFER_CGCK_CODE; + } + else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_CPCRK_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_CP_ID) + { + transfer_type = WmsWareHouseConst.MATERIALTRANSFER_WXDBRK_CODE; + } + else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_YCL_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_JZGL_ID) + { + transfer_type = WmsWareHouseConst.MATERIALTRANSFER_JZGLRK_CODE; + } + else if (warehouse_outstock.id == WmsWareHouseConst.WAREHOUSE_YCL_ID && warehouse_instock.id == WmsWareHouseConst.WAREHOUSE_ZZXBK_ID) + { + transfer_type = WmsWareHouseConst.MATERIALTRANSFER_CROSSLAYER_CODE; + } + + // 暂时其他情况都算齐套出入库类型(未定) + else + { + int count = input.details.Where(r => string.IsNullOrEmpty(r.station_code)).Count(); + if (count > 0) + { + _LoggerErp2Mes.LogWarning($@"【MaterialTransfer】表体存在未填写工位的明细!"); + throw new AppFriendlyException($@"表体存在未填写工位的明细!", 500); + } + + transfer_type = WmsWareHouseConst.MATERIALTRANSFER_QTCRK_CODE; + } + + + //var wmsMaterialTransferdsDistinct = input.details.Select(r => new + //{ + // material_id = r.material_code, + // code_batch = r.code_batch, + //}).Distinct(); + //if (wmsMaterialTransferdsDistinct.Count() < input.details.Count) + //{ + // _LoggerErp2Mes.LogWarning($@"【MaterialTransfer】表体存在物料和批号重复的明细!"); + // throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500); + //} + + await db.Ado.BeginTranAsync(); + + // 判断是否重复传输 + WmsMaterialTransfer wmsMaterialTransferRep = await db.Queryable().Where(r => r.erp_bill_code == input.bill_code).FirstAsync(); + if (wmsMaterialTransferRep != null) + { + // 判断单据是否已经下发 + List _wmsMaterialTransferDs = await db.Queryable().Where(r => r.bill_id == wmsMaterialTransferRep.id).ToListAsync(); + bool isxf = _wmsMaterialTransferDs.Where(r => r.yxfqty > 0).Any(); + if (isxf) + { + _LoggerErp2Mes.LogWarning($@"【TransferOutstock】wms已下发使用转库单{input.bill_code}!"); + throw new AppFriendlyException($@"wms已下发使用转库单{input.bill_code}!", 500); + } + else // 删除数据重新插入 + { + await db.Deleteable().Where(r => r.id == wmsMaterialTransferRep.id).ExecuteCommandAsync(); + await db.Deleteable().Where(r => r.bill_id == wmsMaterialTransferRep.id).ExecuteCommandAsync(); + } + } + + List details = input.details.Where(r => r.qty > 0).ToList(); + List details_return = input.details.Where(r => r.qty < 0).ToList(); + + if (details.Count > 0) + { + WmsMaterialTransfer wmsMaterialTransfer = new WmsMaterialTransfer(); + string Code = await _billRuleService.GetBillNumber("MaterialTransfer"); + wmsMaterialTransfer.bill_code = Code; + wmsMaterialTransfer.status = WmsWareHouseConst.BILLSTATUS_ADD_ID; + wmsMaterialTransfer.bill_date = DateTime.Now; + wmsMaterialTransfer.warehouse_outstock = warehouse_outstock.id; + wmsMaterialTransfer.warehouse_instock = warehouse_instock.id; + wmsMaterialTransfer.biller_out = input.biller_out; + wmsMaterialTransfer.depart_out = input.depart_out; + wmsMaterialTransfer.biller_in = input.biller_in; + wmsMaterialTransfer.depart_in = input.depart_in; + wmsMaterialTransfer.deliver_date = input.deliver_date; + wmsMaterialTransfer.arrival_date = input.arrival_date; + wmsMaterialTransfer.create_id = WmsWareHouseConst.ErpUserId; + wmsMaterialTransfer.create_time = DateTime.Now; + wmsMaterialTransfer.org_id = WmsWareHouseConst.AdministratorOrgId; + wmsMaterialTransfer.erp_bill_code = input.bill_code; + wmsMaterialTransfer.type = transfer_type; + wmsMaterialTransfer.erp_pk = input.erp_pk; + + await db.Insertable(wmsMaterialTransfer).ExecuteCommandAsync(); + + List wmsMaterialTransferDs = new List(); + foreach (var detail in details) + { + WmsMaterialTransferD wmsMaterialTransferD = new WmsMaterialTransferD(); + wmsMaterialTransferD.lineno = detail.lineno; + wmsMaterialTransferD.material_code = detail.material_code; + wmsMaterialTransferD.code_batch = detail.code_batch; + wmsMaterialTransferD.station_code = detail.station_code; + wmsMaterialTransferD.qty = detail.qty; + wmsMaterialTransferD.bill_id = wmsMaterialTransfer.id; + + wmsMaterialTransferD.yxfqty = 0; + wmsMaterialTransferD.yzqty = 0; + wmsMaterialTransferD.yxfqty_rk = 0; + wmsMaterialTransferD.yzqty_rk = 0; + wmsMaterialTransferD.erp_line_pk = detail.erp_line_pk; + + var material = await db.Queryable().Where(p => p.code == detail.material_code).FirstAsync(); + if (material != null) + { + wmsMaterialTransferD.material_id = material.id; + wmsMaterialTransferD.material_specification = material.material_specification; + } + + + 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) + { + wmsMaterialTransferD.unit_id = erpExtendField.Id; + wmsMaterialTransferD.unit_code = erpExtendField.EnCode; + } + else + { + _LoggerErp2Mes.LogWarning($@"【MaterialTransfer】表体明细中单位{detail.unit_code}在wms系统中未找到!"); + throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到!", 500); + } + + wmsMaterialTransferDs.Add(wmsMaterialTransferD); + } + + await db.Insertable(wmsMaterialTransferDs).ExecuteCommandAsync(); + LoggerErp2Mes.LogInformation($"【MaterialTransfer】成功生成单据:{Code}"); + } + + if (details_return.Count > 0) + { + WmsPrdReturnH wmsPrdReturnH = new WmsPrdReturnH(); + string Code = await _billRuleService.GetBillNumber("WMSPRDRETURN"); + wmsPrdReturnH.bill_code = Code; + wmsPrdReturnH.status = WmsWareHouseConst.BILLSTATUS_ADD_ID; + wmsPrdReturnH.warehouse_id = warehouse_instock.id; + wmsPrdReturnH.create_id = WmsWareHouseConst.ErpUserId; + wmsPrdReturnH.create_time = DateTime.Now; + wmsPrdReturnH.erp_bill_code = input.bill_code; + wmsPrdReturnH.transfer_type = transfer_type; + wmsPrdReturnH.erp_pk = input.erp_pk; + + await db.Insertable(wmsPrdReturnH).ExecuteCommandAsync(); + + List wmsPrdReturnDs = new List(); + foreach (var detail in details_return) + { + WmsPrdReturnD wmsPrdReturnD = new WmsPrdReturnD(); + wmsPrdReturnD.lineno = detail.lineno; + wmsPrdReturnD.material_code = detail.material_code; + wmsPrdReturnD.code_batch = detail.code_batch; + wmsPrdReturnD.qty = -detail.qty; + wmsPrdReturnD.bill_id = wmsPrdReturnH.id; + + wmsPrdReturnD.ytqty = 0; + wmsPrdReturnD.erp_line_pk = detail.erp_line_pk; + + var material = await db.Queryable().Where(p => p.code == detail.material_code).FirstAsync(); + if (material != null) + { + wmsPrdReturnD.material_id = material.id; + wmsPrdReturnD.material_code = material.code; + wmsPrdReturnD.material_name = material.name; + } + + 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) + { + wmsPrdReturnD.unit_id = erpExtendField.Id; + } + else + { + _LoggerErp2Mes.LogWarning($@"【MaterialTransfer】表体明细中单位{detail.unit_code}在wms系统中未找到!"); + throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到!", 500); + } + + wmsPrdReturnDs.Add(wmsPrdReturnD); + } + + await db.Insertable(wmsPrdReturnDs).ExecuteCommandAsync(); + LoggerErp2Mes.LogInformation($"【MaterialTransfer】成功生成单据:{Code}"); + } + + await db.Ado.CommitTranAsync(); + + } + catch (Exception ex) + { + error_erpbillcodes.Add($"bip单据号{input.bill_code}: {ex.Message}"); + LoggerErp2Mes.LogWarning($"【MaterialTransfer】{ex.Message}"); + LoggerErp2Mes.LogWarning($"【MaterialTransfer】{ex.StackTrace}"); + await db.Ado.RollbackTranAsync(); + } + finally + { + + } + } + + if (error_erpbillcodes.Count > 0) + { + LoggerErp2Mes.LogWarning($"同步失败信息:{string.Join(',', error_erpbillcodes)}"); + return await ToApiResult(HttpStatusCode.InternalServerError, $"同步失败信息:{string.Join(',', error_erpbillcodes)}"); + } + return await ToApiResult(HttpStatusCode.OK, "成功"); + } /// /// 销售发货单 @@ -965,16 +1244,16 @@ namespace Tnb.WarehouseMgr throw new AppFriendlyException($@"子表主键不能为空!", 500); } - var wmsSaleShippingsDistinct = input.details.Select(r => new - { - material_id = r.material_code, - code_batch = r.code_batch, - }).Distinct(); - if (wmsSaleShippingsDistinct.Count() < input.details.Count) - { - _LoggerErp2Mes.LogWarning($@"【SaleShipping】表体存在物料和批号重复的明细!"); - throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500); - } + //var wmsSaleShippingsDistinct = input.details.Select(r => new + //{ + // material_id = r.material_code, + // code_batch = r.code_batch, + //}).Distinct(); + //if (wmsSaleShippingsDistinct.Count() < input.details.Count) + //{ + // _LoggerErp2Mes.LogWarning($@"【SaleShipping】表体存在物料和批号重复的明细!"); + // throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500); + //} WmsErpWarehouserelaH wmsErpWarehouserelaH = await db.Queryable().Where(r => r.erp_warehousecode == input.warehouse_code).FirstAsync(); if (wmsErpWarehouserelaH == null) @@ -994,7 +1273,7 @@ namespace Tnb.WarehouseMgr await db.Ado.BeginTranAsync(); // 判断是否重复传输 - WmsSaleH wmsSaleHRep = await db.Queryable().Where(r => r.erp_pk == input.erp_pk).FirstAsync(); + WmsSaleH wmsSaleHRep = await db.Queryable().Where(r => r.erp_bill_code == input.bill_code).FirstAsync(); if (wmsSaleHRep != null) { // 判断单据是否已经下发 @@ -1016,6 +1295,7 @@ namespace Tnb.WarehouseMgr string Code = await _billRuleService.GetBillNumber("WmsSale"); wmsSaleH.bill_code = Code; + wmsSaleH.org_id = WmsWareHouseConst.AdministratorOrgId; wmsSaleH.erp_bill_code = input.bill_code; wmsSaleH.bill_type = "25103439022357";//销售出库单 wmsSaleH.audit_status = 0; @@ -1031,7 +1311,7 @@ namespace Tnb.WarehouseMgr wmsSaleH.customer_name = customer.customer_name; } - wmsSaleH.ship_date = input.ship_date.Value; + //wmsSaleH.ship_date = input.ship_date.Value; wmsSaleH.erp_pk = input.erp_pk; wmsSaleH.create_id = WmsWareHouseConst.ErpUserId; wmsSaleH.create_time = DateTime.Now; @@ -1070,7 +1350,7 @@ namespace Tnb.WarehouseMgr wmsSaleD.material_name = material.name; wmsSaleD.material_specification = material.material_specification; } - + wmsSaleD.auxprop = detail.auxprop; wmsSaleDs.Add(wmsSaleD); } @@ -1218,6 +1498,12 @@ namespace Tnb.WarehouseMgr { wmsRawmatTransferinstockH.outstockorg_id = org_erpExtendField.pk_org_v; wmsRawmatTransferinstockH.outstockorg_code = org_erpExtendField.pk_org; + + var OrganizeEntity = await db.Queryable().Where(a => a.Id == org_erpExtendField.table_id).FirstAsync(); + if (OrganizeEntity != null) + { + wmsRawmatTransferinstockH.outstockorg_name = OrganizeEntity.FullName; + } } else { @@ -1268,7 +1554,7 @@ namespace Tnb.WarehouseMgr msRawmatTransferinstockD.matname = material.name; msRawmatTransferinstockD.matspecification = material.material_specification; } - + msRawmatTransferinstockD.auxprop = detail.auxprop; wmsRawmatTransferinstockDs.Add(msRawmatTransferinstockD); } @@ -1339,6 +1625,7 @@ namespace Tnb.WarehouseMgr wmsTransferInstockD.material_code = material.code; wmsTransferInstockD.material_desc = material.material_specification; } + wmsTransferInstockD.auxprop = detail.auxprop; wmsTransferInstockDs.Add(wmsTransferInstockD); } @@ -1897,6 +2184,8 @@ namespace Tnb.WarehouseMgr wmsRawmatOutstockH.bill_code = code; wmsRawmatOutstockH.create_id = WmsWareHouseConst.ErpUserId; wmsRawmatOutstockH.create_time = DateTime.Now; + wmsRawmatOutstockH.erp_bill_code = input.outstock_order; + wmsRawmatOutstockH.warehouse_id = WmsWareHouseConst.WAREHOUSE_YCL_ID; //wmsRawmatOutstockH.biller = input.biller; wmsRawmatOutstockH.department = input.dept_code; wmsRawmatOutstockH.erp_pk = input.erp_pk; @@ -1907,7 +2196,7 @@ namespace Tnb.WarehouseMgr WmsRawmatOutstockD wmsRawmatOutstockD = new WmsRawmatOutstockD(); wmsRawmatOutstockD.bill_id = wmsRawmatOutstockH.id; wmsRawmatOutstockD.unit = detail.unit_code; - 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(); + 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(); if (erpExtendField != null) { wmsRawmatOutstockD.unit = erpExtendField.EnCode; @@ -1934,7 +2223,7 @@ namespace Tnb.WarehouseMgr wmsRawmatOutstockD.material_name = material.name; wmsRawmatOutstockD.material_specification = material.material_specification; } - + wmsRawmatOutstockD.auxprop = detail.auxprop; wmsRawmatOutstockDs.Add(wmsRawmatOutstockD); } @@ -1959,6 +2248,292 @@ namespace Tnb.WarehouseMgr } } + /// + /// 材料出库单(批量) + /// + [HttpPost, NonUnify, AllowAnonymous] + public async Task RawmatOutstockBatch(List inputs) + { + LoggerErp2Mes.LogInformation($"【RawmatOutstock】ERP传入数据:{JsonConvert.SerializeObject(inputs)}"); + var db = _repository.AsSugarClient(); + + + List error_erpbillcodes = new List(); + foreach (ErpRawmatOutstockInput input in inputs) + { + try + { + if (string.IsNullOrEmpty(input.erp_pk)) + { + _LoggerErp2Mes.LogWarning($"【RawmatOutstock】主表主键不能为空!"); + throw new AppFriendlyException($@"主表主键不能为空!", 500); + } + + int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count(); + if (count_erp_line_pk > 0) + { + _LoggerErp2Mes.LogWarning($@"【RawmatOutstock】子表主键不能为空!"); + throw new AppFriendlyException($@"子表主键不能为空!", 500); + } + + //var wmsRawmatOutstocksDistinct = input.details.Select(r => new + //{ + // material_id = r.material_code, + // code_batch = r.code_batch, + //}).Distinct(); + //if (wmsRawmatOutstocksDistinct.Count() < input.details.Count) + //{ + // _LoggerErp2Mes.LogWarning($@"【RawmatOutstock】表体存在物料和批号重复的明细!"); + // throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500); + //} + + await db.Ado.BeginTranAsync(); + // 判断是否重复传输 + WmsRawmatOutstockH wmsRawmatOutstockHRep = await db.Queryable().Where(r => r.erp_bill_code == input.outstock_order).FirstAsync(); + if (wmsRawmatOutstockHRep != null) + { + // 判断单据是否已经下发 + List _wmsRawmatOutstockDs = await db.Queryable().Where(r => r.bill_id == wmsRawmatOutstockHRep.id).ToListAsync(); + bool isxf = _wmsRawmatOutstockDs.Where(r => r.actual_outstock_qty > 0).Any(); + if (isxf) + { + _LoggerErp2Mes.LogWarning($@"【RawmatOutstock】wms已下发使用材料出库单{input.outstock_order}!"); + throw new AppFriendlyException($@"wms已下发使用材料出库单{input.outstock_order}!", 500); + } + else // 删除数据重新插入 + { + await db.Deleteable().Where(r => r.id == wmsRawmatOutstockHRep.id).ExecuteCommandAsync(); + await db.Deleteable().Where(r => r.bill_id == wmsRawmatOutstockHRep.id).ExecuteCommandAsync(); + } + } + + WmsRawmatOutstockH wmsRawmatOutstockH = new WmsRawmatOutstockH(); + string code = await _billRuleService.GetBillNumber("rawmatoutstock"); + wmsRawmatOutstockH.bill_code = code; + wmsRawmatOutstockH.create_id = WmsWareHouseConst.ErpUserId; + wmsRawmatOutstockH.create_time = DateTime.Now; + wmsRawmatOutstockH.erp_bill_code = input.outstock_order; + wmsRawmatOutstockH.warehouse_id = WmsWareHouseConst.WAREHOUSE_YCL_ID; + //wmsRawmatOutstockH.biller = input.biller; + wmsRawmatOutstockH.department = input.dept_code; + wmsRawmatOutstockH.erp_pk = input.erp_pk; + wmsRawmatOutstockH.issuance_status = "0"; + List wmsRawmatOutstockDs = new List(); + foreach (var detail in input.details) + { + WmsRawmatOutstockD wmsRawmatOutstockD = new WmsRawmatOutstockD(); + wmsRawmatOutstockD.bill_id = wmsRawmatOutstockH.id; + wmsRawmatOutstockD.unit = detail.unit_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(); + if (erpExtendField != null) + { + wmsRawmatOutstockD.unit = erpExtendField.EnCode; + } + else + { + _LoggerErp2Mes.LogWarning($@"【TransferOrder】表体明细中单位{detail.unit_code}在wms系统中未找到!"); + throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到!", 500); + } + + wmsRawmatOutstockD.qty = detail.qty; + wmsRawmatOutstockD.batchno = detail.code_batch; + wmsRawmatOutstockD.erp_line_pk = detail.erp_line_pk; + wmsRawmatOutstockD.create_id = WmsWareHouseConst.ErpUserId; + wmsRawmatOutstockD.create_time = DateTime.Now; + wmsRawmatOutstockD.lineno = detail.lineno; + wmsRawmatOutstockD.actual_outstock_qty = 0; + + var material = await db.Queryable().Where(p => p.code == detail.material_code).FirstAsync(); + if (material != null) + { + wmsRawmatOutstockD.material_id = material.id; + wmsRawmatOutstockD.material_code = material.code; + wmsRawmatOutstockD.material_name = material.name; + wmsRawmatOutstockD.material_specification = material.material_specification; + } + + wmsRawmatOutstockDs.Add(wmsRawmatOutstockD); + } + + await db.Insertable(wmsRawmatOutstockH).ExecuteCommandAsync(); + await db.Insertable(wmsRawmatOutstockDs).ExecuteCommandAsync(); + + await db.Ado.CommitTranAsync(); + + LoggerErp2Mes.LogInformation($"【RawmatOutstock】成功生成单据:{code}"); + } + catch (Exception ex) + { + error_erpbillcodes.Add($"bip单据号{input.outstock_order}: {ex.Message}"); + LoggerErp2Mes.LogError($"【RawmatOutstock】{ex.Message}"); + LoggerErp2Mes.LogError($"【RawmatOutstock】{ex.StackTrace}"); + await db.Ado.RollbackTranAsync(); + } + finally + { + + } + } + if (error_erpbillcodes.Count > 0) + { + LoggerErp2Mes.LogWarning($"同步失败信息:{string.Join(',', error_erpbillcodes)}"); + return await ToApiResult(HttpStatusCode.InternalServerError, $"同步失败信息:{string.Join(',', error_erpbillcodes)}"); + } + return await ToApiResult(HttpStatusCode.OK, "成功"); + } + + /// + /// 盘点单 + /// + [HttpPost, NonUnify, AllowAnonymous] + public async Task Inventorycheck(InventorycheckInput input) + { + + LoggerErp2Mes.LogInformation($"【Inventorycheck】ERP传入数据:{JsonConvert.SerializeObject(input)}"); + var db = _repository.AsSugarClient(); + + + try + { + if (string.IsNullOrEmpty(input.erp_pk)) + { + _LoggerErp2Mes.LogWarning($"【Inventorycheck】主表主键不能为空!"); + throw new AppFriendlyException($@"主表主键不能为空!", 500); + } + + int count_erp_line_pk = input.details.Where(r => string.IsNullOrEmpty(r.erp_line_pk)).Count(); + if (count_erp_line_pk > 0) + { + _LoggerErp2Mes.LogWarning($@"【Inventorycheck】子表主键不能为空!"); + throw new AppFriendlyException($@"子表主键不能为空!", 500); + } + + var wmsInventorychecksDistinct = input.details.Select(r => new + { + material_id = r.material_code, + code_batch = r.code_batch, + }).Distinct(); + if (wmsInventorychecksDistinct.Count() < input.details.Count) + { + _LoggerErp2Mes.LogWarning($@"【Inventorycheck】表体存在物料和批号重复的明细!"); + throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500); + } + + WmsErpWarehouserelaH wmsErpWarehouserelaH = await db.Queryable().Where(r => r.erp_warehousecode == input.warehouse_code).FirstAsync(); + if (wmsErpWarehouserelaH == null) + { + _LoggerErp2Mes.LogWarning($@"【Inventorycheck】不存在erp仓库类型{input.warehouse_code}对应wms系统的映射关系!"); + throw new AppFriendlyException($@"不存在erp仓库类型{input.warehouse_code}对应wms系统的映射关系!", 500); + } + + string warehouse_code = wmsErpWarehouserelaH.wms_warehousecode; + + BasWarehouse warehouse = await db.Queryable().Where(r => r.whcode == warehouse_code).FirstAsync(); + if (warehouse == null) + { + _LoggerErp2Mes.LogWarning($"【Inventorycheck】无法查询到出库仓库{warehouse_code}的档案记录!"); + return await ToApiResult(HttpStatusCode.InternalServerError, $"无法查询到出库仓库{warehouse_code}的档案记录!"); + } + await db.Ado.BeginTranAsync(); + + // 判断是否重复传输 + WmsInventorycheckH wmsInventorycheckHRep = await db.Queryable().Where(r => r.erp_pk == input.erp_pk).FirstAsync(); + if (wmsInventorycheckHRep != null) + { + // 判断单据是否已经下发 + List _wmsSaleDs = await db.Queryable().Where(r => r.bill_id == wmsInventorycheckHRep.id).ToListAsync(); + bool isxf = _wmsSaleDs.Where(r => r.actual_qty > 0).Any(); + if (isxf) + { + _LoggerErp2Mes.LogWarning($@"【Inventorycheck】wms已下发使用盘点单{input.erp_bill_code}!"); + throw new AppFriendlyException($@"wms已下发使用盘点单{input.erp_bill_code}!", 500); + } + else // 删除数据重新插入 + { + await db.Deleteable().Where(r => r.id == wmsInventorycheckHRep.id).ExecuteCommandAsync(); + await db.Deleteable().Where(r => r.bill_id == wmsInventorycheckHRep.id).ExecuteCommandAsync(); + } + } + + WmsInventorycheckH wmsInventorycheckH = new WmsInventorycheckH(); + string Code = await _billRuleService.GetBillNumber("CheckStockCode"); + + wmsInventorycheckH.create_id = WmsWareHouseConst.ErpUserId; + wmsInventorycheckH.create_time = DateTime.Now; + wmsInventorycheckH.org_id = WmsWareHouseConst.AdministratorOrgId; + wmsInventorycheckH.bill_code = Code; + + wmsInventorycheckH.warehouse_id = warehouse.id; + wmsInventorycheckH.warehouse_code = warehouse.whcode; + wmsInventorycheckH.warehouse_name = warehouse.whname; + wmsInventorycheckH.dept_code = input.dept_code; + wmsInventorycheckH.biller = input.biller; + wmsInventorycheckH.erp_bill_code = input.erp_bill_code; + wmsInventorycheckH.erp_pk = input.erp_pk; + wmsInventorycheckH.check_date = input.check_date; + await db.Insertable(wmsInventorycheckH).ExecuteCommandAsync(); + + + List wmsInventorycheckDs = new List(); + foreach (var detail in input.details) + { + WmsInventorycheckD wmsInventorycheckD = new WmsInventorycheckD(); + + wmsInventorycheckD.bill_id = wmsInventorycheckH.id; + wmsInventorycheckD.create_id = WmsWareHouseConst.ErpUserId; + wmsInventorycheckD.create_time = DateTime.Now; + wmsInventorycheckD.org_id = WmsWareHouseConst.AdministratorOrgId; + wmsInventorycheckD.production_date = detail.production_date; + + var material = await db.Queryable().Where(p => p.code == detail.material_code).FirstAsync(); + if (material != null) + { + wmsInventorycheckD.material_id = material.id; + wmsInventorycheckD.material_code = material.code; + wmsInventorycheckD.material_name = material.name; + wmsInventorycheckD.material_specification = material.material_specification; + } + + wmsInventorycheckD.qty = detail.qty; + wmsInventorycheckD.actual_qty = 0; + wmsInventorycheckD.code_batch = detail.code_batch; + wmsInventorycheckD.erp_line_pk = detail.erp_line_pk; + wmsInventorycheckD.lineno = detail.lineno; + + 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(); + if (erpExtendField != null) + { + wmsInventorycheckD.unit_id = erpExtendField.Id; + wmsInventorycheckD.unit_code = erpExtendField.EnCode; + } + else + { + _LoggerErp2Mes.LogWarning($@"【Inventorycheck】表体明细中单位{detail.unit_code}在wms系统中未找到!"); + throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到!", 500); + } + wmsInventorycheckD.auxprop = detail.auxprop; + wmsInventorycheckDs.Add(wmsInventorycheckD); + } + + await db.Insertable(wmsInventorycheckDs).ExecuteCommandAsync(); + + await db.Ado.CommitTranAsync(); + + LoggerErp2Mes.LogInformation($"【Inventorycheck】成功生成单据:{Code}"); + return await ToApiResult(HttpStatusCode.OK, "成功"); + } + catch (Exception ex) + { + LoggerErp2Mes.LogError($"【Inventorycheck】{ex.Message}"); + LoggerErp2Mes.LogError($"【Inventorycheck】{ex.StackTrace}"); + await db.Ado.RollbackTranAsync(); + return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message); + } + finally + { + + } + } protected Task ToApiResult(HttpStatusCode statusCode, string msg) { diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index 228c9eb9..bf2ac622 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -76,9 +76,11 @@ namespace Tnb.WarehouseMgr private readonly IWmsCarryBindService _wmsCarryBindService; private readonly IWmsCarryUnbindService _wmsCarryUnbindService; private readonly IWmsOutinStockDetailService _wmsOutinStockDetailService; + private static ISqlSugarClient db_agvElevatorTaskExceptionHandles; + + - private static readonly Dictionary _elevatorAgvCtlStatusMap = new(StringComparer.OrdinalIgnoreCase); private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build(); private static Dictionary locMap = new Dictionary(StringComparer.OrdinalIgnoreCase); @@ -276,7 +278,11 @@ namespace Tnb.WarehouseMgr List items = new(); try { - var db = _db.CopyNew(); + var db = input.dbConn; + if (input.dbConn == null) + { + db = _db.CopyNew(); + } WmsInstockPolicies policy = await db.Queryable().Where(it => it.status == 1 && (string.IsNullOrEmpty(input.PolicyCode)|| it.bill_code == input.PolicyCode)).FirstAsync(); if (policy == null) @@ -307,7 +313,7 @@ namespace Tnb.WarehouseMgr .AndIF(!string.IsNullOrEmpty(input.passage), it => it.passage == input.passage) .ToExpression(); - items = await _db.CopyNew().Queryable().Where(whereExp).OrderBy(policy.policy).ToListAsync(); + items = await db.Queryable().Where(whereExp).OrderBy(policy.policy).ToListAsync(); } catch (Exception) { @@ -325,7 +331,12 @@ namespace Tnb.WarehouseMgr List items = new(); try { - WmsInstockPolicies policy = await _db.CopyNew().Queryable().Where(it => it.status == 1).FirstAsync(); + var db = input.dbConn; + if (input.dbConn == null) + { + db = _db.CopyNew(); + } + WmsInstockPolicies policy = await db.Queryable().Where(it => it.status == 1).FirstAsync(); if (policy == null) { throw new AppFriendlyException("没有可用的策略", 500); @@ -337,7 +348,7 @@ namespace Tnb.WarehouseMgr .And(it => it.is_type == ((int)EnumLocationType.分拣库位).ToString()) .And(it => it.is_use == ((int)EnumCarryStatus.空闲).ToString()) .ToExpression(); - items = await _db.CopyNew().Queryable().Where(whereExp).OrderBy(policy.policy).ToListAsync(); + items = await db.Queryable().Where(whereExp).OrderBy(policy.policy).ToListAsync(); } catch (Exception) { @@ -356,7 +367,12 @@ namespace Tnb.WarehouseMgr List items = new(); try { - WmsInstockPolicies policy = await _db.CopyNew().Queryable().Where(it => it.status == 1).FirstAsync(); + var db = input.dbConn; + if (input.dbConn == null) + { + db = _db.CopyNew(); + } + WmsInstockPolicies policy = await db.Queryable().Where(it => it.status == 1).FirstAsync(); if (policy == null) { throw new AppFriendlyException("没有可用的策略", 500); @@ -368,7 +384,7 @@ namespace Tnb.WarehouseMgr .And(it => it.is_type == ((int)EnumLocationType.出入库位).ToString()) .And(it => it.is_use == ((int)EnumCarryStatus.空闲).ToString()) .ToExpression(); - items = await _db.CopyNew().Queryable().Where(whereExp).OrderBy(policy.policy).ToListAsync(); + items = await db.Queryable().Where(whereExp).OrderBy(policy.policy).ToListAsync(); } catch (Exception) { @@ -472,7 +488,11 @@ namespace Tnb.WarehouseMgr _ = whereExprable.And(carryStatusFilterExp); Expression> whereExpr = whereExprable.ToExpression(); - SqlSugarClient cyDb = _db.CopyNew(); + var cyDb = input.dbConn; + if (input.dbConn == null) + { + cyDb = _db.CopyNew(); + } List> items = cyDb.Queryable().LeftJoin((a, b) => a.id == b.carry_id) .LeftJoin((a, b, c) => a.location_id == c.id) @@ -513,7 +533,11 @@ namespace Tnb.WarehouseMgr public async Task> OutStockStrategy([FromQuery] OutStockStrategyQuery input) { - SqlSugarClient cyDb = _db.CopyNew(); + var cyDb = input.dbConn; + if (input.dbConn == null) + { + cyDb = _db.CopyNew(); + } List busyPassages = new(); if (input.AvoidBusyPassage) { @@ -915,8 +939,8 @@ namespace Tnb.WarehouseMgr putdic.Add("ZS-A03-1", new string[] { "hxjA", "A5允许入空箱", }); getdic.Add("ZS-A03-2", new string[] { "hxjA", "A5允许取满箱" }); - putdic.Add("ZS-A04-1", new string[] { "hxjA", "A6允许入空箱", }); - getdic.Add("ZS-A04-2", new string[] { "hxjA", "A6允许取满箱" }); + putdic.Add("ZS-D06-1", new string[] { "hxjA", "A6允许入空箱", }); + getdic.Add("ZS-D06-2", new string[] { "hxjA", "A6允许取满箱" }); putdic.Add("ZS-A05-1", new string[] { "hxjA", "A7允许入空箱", }); getdic.Add("ZS-A05-2", new string[] { "hxjA", "A7允许取满箱" }); @@ -1028,7 +1052,7 @@ namespace Tnb.WarehouseMgr getdic.Add("ZS-A01-2", new string[] { "hxjA", "A3AGV允许入满箱", "true" }); getdic.Add("ZS-A02-2", new string[] { "hxjA", "A4AGV允许入满箱", "true" }); getdic.Add("ZS-A03-2", new string[] { "hxjA", "A5AGV允许入满箱", "true" }); - getdic.Add("ZS-A04-2", new string[] { "hxjA", "A6AGV允许入满箱", "true" }); + 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" }); @@ -1067,7 +1091,7 @@ namespace Tnb.WarehouseMgr putdic.Add("ZS-A01-1", new string[] { "hxjA", "A3AGV允许出空箱", "true" }); putdic.Add("ZS-A02-1", new string[] { "hxjA", "A4AGV允许出空箱", "true" }); putdic.Add("ZS-A03-1", new string[] { "hxjA", "A5AGV允许出空箱", "true" }); - putdic.Add("ZS-A04-1", new string[] { "hxjA", "A6AGV允许出空箱", "true" }); + putdic.Add("ZS-D06-1", new string[] { "hxjA", "A6AGV允许出空箱", "true" }); 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" }); @@ -1116,6 +1140,131 @@ namespace Tnb.WarehouseMgr } + + public async Task SsxControl_complete(WmsDistaskH disTask, string action) + { + Logger.Information($"输送线控制SsxControl_complete传入参数: {JsonConvert.SerializeObject(disTask)} {action}"); + + Dictionary putdic = new Dictionary(); + Dictionary getdic = new Dictionary(); + getdic.Add("SSX-021-005", new string[] { "YTCS", "FullOut_CS05Done", "true" }); + getdic.Add("SSX-111-011", new string[] { "东面提升机输送线", "下升降机11出箱完毕", "true" }); + getdic.Add("SSX-111-012", new string[] { "东面提升机输送线", "下升降机12出箱完毕", "true" }); + + getdic.Add("ZZ-01-02", new string[] { "外包装箱码垛线", "WBZX_x1_take_mtp", "true" }); + getdic.Add("ZZ-02-02", new string[] { "外包装箱码垛线", "WBZX_x2_take_mtp", "true" }); + + + 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-A01-2", new string[] { "hxjA", "A3AGV允许入满箱", "true" }); + getdic.Add("ZS-A02-2", new string[] { "hxjA", "A4AGV允许入满箱", "true" }); + getdic.Add("ZS-A03-2", new string[] { "hxjA", "A5AGV允许入满箱", "true" }); + 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" }); + + + + putdic.Add("SSX-021-007", new string[] { "东面提升机输送线", "出库输送线7入箱完毕", "true" }); + putdic.Add("SSX-011-006", new string[] { "YTCS", "EmptyIn_CS06Done", "true" }); + putdic.Add("SSX-021-003", new string[] { "YTCS", "AgvFullIn_CS03Done", "true" }); + putdic.Add("SSX-021-001", new string[] { "YTCS", "CtuEmptyIn_CS01Done", "true" }); + putdic.Add("ZSSSXCTU02", new string[] { "YTCS", "右输送线下层允许入箱4", "true" }); + putdic.Add("ZSSSXCTU01", new string[] { "YTCS", "左输送线下层允许入箱2", "true" }); + 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-A01-1", new string[] { "hxjA", "A3AGV允许出空箱", "true" }); + putdic.Add("ZS-A02-1", new string[] { "hxjA", "A4AGV允许出空箱", "true" }); + putdic.Add("ZS-A03-1", new string[] { "hxjA", "A5AGV允许出空箱", "true" }); + 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-A11-1", new string[] { "hxjA", "A13AGV允许出空箱", "false" }); + putdic.Add("ZS-A12-1", new string[] { "hxjA", "A14AGV允许出空箱", "true" }); + + if (action == "LOAD")//取货 + { + if (getdic.Keys.Contains(disTask.startlocation_code)) + { + var strarr = getdic.Where(p => p.Key == disTask.startlocation_code).First().Value; + Dictionary dicCommand = new(StringComparer.OrdinalIgnoreCase) + { + ["DevName"] = strarr[0], + ["token"] = _eleCtlCfg.token, + ["TagName"] = strarr[1], + ["Value"] = strarr[2], + }; + Logger.Information($"SsxControlLOAD:{JsonConvert.SerializeObject(dicCommand)}"); + var str = await HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand); + Logger.Information($"SsxControlLOAD:{str}"); + //Logger.Information($"SsxControlUNLOAD - 控制后查询:{_redisData.GetHash(strarr[0], strarr[1]).Result}"); + } + } + else if (action == "UNLOAD")//放货 + { + if (putdic.Keys.Contains(disTask.endlocation_code)) + { + var strarr = putdic.Where(p => p.Key == disTask.endlocation_code).First().Value; + Dictionary dicCommand = new(StringComparer.OrdinalIgnoreCase) + { + ["DevName"] = strarr[0], + ["token"] = _eleCtlCfg.token, + ["TagName"] = strarr[1], + ["Value"] = strarr[2], + }; + Logger.Information($"SsxControlUNLOAD:{JsonConvert.SerializeObject(dicCommand)}"); + var str = await HttpClientHelper.GetRequestAsync(_eleCtlCfg.WriteTagUrl, dicCommand); + Logger.Information($"SsxControlUNLOAD:{str}"); + //Logger.Information($"SsxControlUNLOAD - 控制后查询:{_redisData.GetHash(strarr[0], strarr[1]).Result}"); + } + } + + } + + /// /// 二楼机械臂 /// @@ -1480,6 +1629,35 @@ namespace Tnb.WarehouseMgr agvElevatorTasks = agvElevatorTasks.Where(x => !equalEndLocPreTasks.Contains(x.endlocation_code)).ToList(); } + #region 原材料仓同巷道任务出库控制同时只发一条 + // 原材料仓的未完成任务 + List wmspretasks_ycl = await db.Queryable() + .InnerJoin((a, b) => a.endlocation_id == b.id) + .InnerJoin((a, b, c) => a.area_id == c.id) + .InnerJoin((a, b, c, d) => a.startlocation_id == d.id) + .Where((a, b, c, d) => a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID && a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID + && b.is_use == "0" && d.is_type == "0" && b.wh_id == WmsWareHouseConst.WAREHOUSE_YCL_ID) + .Select((a, b, c, d) => new WmsPretaskH + { + move_num = c.move_num, + third_eqp_type = c.third_eqp_type, + passage = d.passage + }, true) + .ToListAsync(); + // 原材料仓的执行中任务 + List wmspretasksrun_ycl = wmspretasks_ycl.Where(r => r.status == WmsWareHouseConst.PRETASK_BILL_STATUS_YXF_ID || r.status == WmsWareHouseConst.PRETASK_BILL_STATUS_START_ID).ToList(); + + // 过滤normalPreTasks中的原材料仓的任务 + normalPreTasks = normalPreTasks.Where(r => !wmspretasks_ycl.Select(a => a.id).Contains(r.id)).ToList(); + // 过滤原材料仓同巷道的正在执行的任务 + var yclTasks = wmspretasks_ycl.Where(r => !wmspretasksrun_ycl.Select(a => a.passage).Contains(r.passage)).ToList(); + // 过滤重复巷道的预任务 + yclTasks = yclTasks.OrderBy(r => r.passage).GroupBy(r => r.passage).Select(r => { return r.ToList()[0]; }).OrderBy(r => r.bill_code).ToList(); + + normalPreTasks = normalPreTasks.Concat(yclTasks).ToList(); + #endregion + + #region 三楼三四号梯如果与判断一托下有冲突 #region 电梯第三次改动 @@ -1507,7 +1685,7 @@ namespace Tnb.WarehouseMgr // 过滤到三楼暂存区同目标库位的正在执行的任务 var cacheLocTasks = wmspretasks_agvElevator.Where(r => !wmsdistasks_agvElevator.Select(a => a.endlocation_id).Contains(r.endlocation_id)).ToList(); // 过滤重复目标库位的预任务 - cacheLocTasks = cacheLocTasks.OrderBy(r => r.endlocation_code).GroupBy(r => r.endlocation_code).Select(r => { return r.ToList()[0]; }).ToList(); + cacheLocTasks = cacheLocTasks.OrderBy(r => r.endlocation_code).GroupBy(r => r.endlocation_code).Select(r => { return r.ToList()[0]; }).OrderBy(r => r.bill_code).ToList(); normalPreTasks = normalPreTasks.Concat(cacheLocTasks).ToList(); #endregion @@ -1695,26 +1873,8 @@ namespace Tnb.WarehouseMgr task.device_id = e.device_id; } } + _ = CallingLanding(agvDTTasks); - Logger.Information($"【GenTaskExecute】呼梯任务数:{agvDTTasks.Count}"); - List<(string endlocation_code, string device_id, string id, int start_floor)> endLocCodes = agvDTTasks.Where(r => !string.IsNullOrEmpty(r.device_id)) - .Select(it => (it.endlocation_code, it.device_id, it.id, it.start_floor)).ToList(); - var callLiftCnt = endLocCodes?.Count ?? 0; - Logger.Information($"【GenTaskExecute】实际可呼梯任务数:{callLiftCnt}"); - - if (endLocCodes?.Count > 0) - { - if (endLocCodes.Select(x => x.device_id).All(x => !x.IsNullOrWhiteSpace())) - { - Logger.Information("【GenTaskExecute】呼梯操作"); - _ = CallingLanding(endLocCodes); - } - else - { - Logger.Error("【GenTaskExecute】呼梯失败,没有设备ID"); - return; - } - } //执行电梯任务 List? elevatorTasks = disTasks.Where(it => it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList(); @@ -1818,6 +1978,7 @@ namespace Tnb.WarehouseMgr } + /// /// 获取电梯根据任务单号 /// @@ -2222,8 +2383,28 @@ namespace Tnb.WarehouseMgr /// /// /// - private async Task CallingLanding(List<(string endlocation_code, string device_id, string id, int floorNO)> endLocCodes) + public async Task CallingLanding(List agvDTTasks) { + Logger.Information($"【GenTaskExecute】呼梯任务数:{agvDTTasks.Count}"); + List<(string endlocation_code, string device_id, string id, int start_floor)> endLocCodes = agvDTTasks.Where(r => !string.IsNullOrEmpty(r.device_id)) + .Select(it => (it.endlocation_code, it.device_id, it.id, it.start_floor)).ToList(); + var callLiftCnt = endLocCodes?.Count ?? 0; + Logger.Information($"【GenTaskExecute】实际可呼梯任务数:{callLiftCnt}"); + + if (endLocCodes?.Count > 0) + { + if (endLocCodes.Select(x => x.device_id).All(x => !x.IsNullOrWhiteSpace())) + { + Logger.Information("【GenTaskExecute】呼梯操作"); + // todo + } + else + { + Logger.Error("【GenTaskExecute】呼梯失败,没有设备ID"); + return; + } + } + Logger.Information($"【CallingLanding】 开始呼梯操作............."); try { @@ -2387,14 +2568,10 @@ namespace Tnb.WarehouseMgr // 一托下的时候切换首选电梯 if (disTaskIds.Count == 1) { - // 选择另一个电梯座位首选电梯 - await db.Updateable().SetColumns(r => r.value == (r.value == "Elevator3" ? "Elevator4" : "Elevator3")) - .Where(r => r.key == "floor3FirstSelectElevator").ExecuteCommandAsync(); - // 剩余可放托数 - await db.Updateable().SetColumns(r => r.value == "2") - .Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync(); + await ChangeSelectedElevator(db); } + #endregion } @@ -4085,8 +4262,7 @@ namespace Tnb.WarehouseMgr code_batch = input.code_batch, Size = 100, Region_id = WmsWareHouseConst.REGION_Purchase_ID, - PolicyCode = WmsWareHouseConst.POLICY_YCLOUTSTOCK, - AvoidBusyPassage = true + PolicyCode = WmsWareHouseConst.POLICY_YCLOUTSTOCK }; List items = await OutStockStrategy(outStockStrategyInput); @@ -4221,6 +4397,7 @@ namespace Tnb.WarehouseMgr public SemaphoreSlim GetSemaphore(string type, string warehouse_id, string region_id = "") { + Logger.LogInformation($"【GetSemaphore】type:{type} warehouse_id:{warehouse_id} region_id:{region_id}"); SemaphoreSlim result = null; switch (warehouse_id) { @@ -4290,10 +4467,327 @@ namespace Tnb.WarehouseMgr break; } } - return _s_taskExecuteSemaphore_F1ZCCOutstock; + return result; } #endregion - + + + /// + /// 电梯第三次改动 生成Agv到电梯任务 + /// + /// + public async Task AgvelevatorTimerTaskExceptionHandle() + { + if (s_agvElevatortaskDic.CurrentCount == 0) + return; + + LoggerAgvElevatorTask.Information($"三楼出货检查暂存区"); + + await s_agvElevatortaskDic.WaitAsync(); + + if (db_agvElevatorTaskExceptionHandles == null) + db_agvElevatorTaskExceptionHandles = _db.CopyNew(); + + try + { + var floor3outstock = await db_agvElevatorTaskExceptionHandles.Queryable().Where(p => p.key == "floor3outstock").FirstAsync(); + if (floor3outstock != null && floor3outstock.value == "0") + return; + await db_agvElevatorTaskExceptionHandles.Ado.BeginTranAsync(); + // 获取暂存区需要生成任务的库位 + List agvElevatorStartLocs = await db_agvElevatorTaskExceptionHandles.Queryable() + .Where(r => r.region_id == WmsWareHouseConst.REGION_CPOutstockCache_ID && r.is_use == "1" && r.is_lock == 0).ToListAsync(); + + if (agvElevatorStartLocs.Count > 0) + { + LoggerAgvElevatorTask.Information($"【AgvelevatorTimerTaskExceptionHandle】检查到需要下发到一楼任务的暂存区库位{agvElevatorStartLocs.Count}条 {string.Join(',', agvElevatorStartLocs.Select(x => x.location_code))}"); + + List> elevatorTaskGroup = agvElevatorStartLocs.GroupBy(r => r.region_id).ToList(); + + foreach (IGrouping group in elevatorTaskGroup) + { + List locs = group.ToList(); + LoggerAgvElevatorTask.LogWarning($"即将下发{locs.Count}条任务"); + for (int i = 0; i < locs.Count; i++) + { + + // 交替选择缓存区库位 + var YCLInnerTransfer = await db_agvElevatorTaskExceptionHandles.Queryable().Where(p => p.key == "floor3CurOutCacheLocation").FirstAsync(); + + if (YCLInnerTransfer.value == null || (YCLInnerTransfer.value != "3楼发货左" && YCLInnerTransfer.value != "3楼发货右")) + throw new AppFriendlyException($"工厂配置->三楼出库暂存区当前出库分区 项配置错误!需要配置值为【3楼发货左】或【3楼发货右】", 500); + + BasLocation startloc = null; + // 如果没切换就是当前发货区 + string 切换发货区 = YCLInnerTransfer.value; + if (group.Key == WmsWareHouseConst.REGION_CPOutstockCache_ID) + { + List locations = await db_agvElevatorTaskExceptionHandles.Queryable() + .InnerJoin((a, b) => a.id == b.location_id) + .Where((a, b) => b.name == YCLInnerTransfer.value && a.is_use == "1" && a.is_lock == 0).OrderBy("a.location_code").ToListAsync(); + + startloc = locations.FirstOrDefault(); + #region 如果当前侧没有可用库位 切换另一侧继续发货,但是因为不能同时发两托同侧的货到同个电梯,所以必须保证当前优先级电梯是接第一托货 + // 交替出的时候可能会选不到库位,做特殊处理 + if (startloc == null) + { + LoggerAgvElevatorTask.LogInformation($"交替到{YCLInnerTransfer.value} 进行发货的时候,没有货物可以发"); + var _floor3FirstSelectElevatorTasknums = await db_agvElevatorTaskExceptionHandles.Queryable().Where(p => p.key == "floor3FirstSelectElevatorTasknums").FirstAsync(); + + 切换发货区 = YCLInnerTransfer.value == "3楼发货左" ? "3楼发货右" : "3楼发货左"; + LoggerAgvElevatorTask.LogInformation($"再次交替到{切换发货区} 进行发货"); + + await db_agvElevatorTaskExceptionHandles.Updateable().SetColumns(r => r.value == 切换发货区) + .Where(r => r.key == "floor3CurOutCacheLocation").ExecuteCommandAsync(); + locations = await db_agvElevatorTaskExceptionHandles.Queryable() + .InnerJoin((a, b) => a.id == b.location_id) + .Where((a, b) => b.name == 切换发货区 && a.is_use == "1" && a.is_lock == 0).OrderBy("a.location_code").ToListAsync(); + + startloc = locations.FirstOrDefault(); + // 如果还是选不到 + if (startloc == null) + { + throw new Exception($"再次交替到{切换发货区} 进行发货,仍然没有货可发,属于暂存区数据异常"); + } + + var _floor3FirstSelectElevator = await db_agvElevatorTaskExceptionHandles.Queryable().Where(p => p.key == "floor3FirstSelectElevator").FirstAsync(); + // 如果当前优先级电梯是空托盘 切换发货区之后不需要切换电梯 + if (_floor3FirstSelectElevatorTasknums.value == "2") + { + LoggerAgvElevatorTask.LogInformation($"当前优先级电梯{_floor3FirstSelectElevator.value}是空托盘 切换发货区之后不需要切换电梯"); + } + // 如果当前优先级电梯不是空托盘 切换发货区之后还需要切换电梯 + else + { + LoggerAgvElevatorTask.LogInformation($"当前优先级电梯{_floor3FirstSelectElevator.value}不是空托盘 切换发货区之后还需要切换电梯"); + + string 切换电梯 = _floor3FirstSelectElevator.value == "Elevator3" ? "Elevator4" : "Elevator3"; + LoggerAgvElevatorTask.LogInformation($"交替到{切换电梯} 进行发货"); + + + WmsElevatorH _wmsElevatorH = await db_agvElevatorTaskExceptionHandles.Queryable().Where(r => r.elevator_code == 切换电梯).FirstAsync(); + // 仅切换电梯后 如果一托任务在等第二托时要做特殊处理 + if (_wmsElevatorH.task_nums == 1) + { + await ChangeSelectedElevator(db_agvElevatorTaskExceptionHandles, "1"); + } + else + { + // 选择另一个电梯座位首选电梯 + await ChangeSelectedElevator(db_agvElevatorTaskExceptionHandles); + } + + } + + } + #endregion + + } + + List wmsCarryHs = await db_agvElevatorTaskExceptionHandles.Queryable().Where(r => r.location_id == startloc.id).ToListAsync(); + if (wmsCarryHs.Count > 1) + { + LoggerAgvElevatorTask.LogWarning($"暂存区库位{startloc.location_code}上存在多个托盘{string.Join(',', wmsCarryHs.Select(x => x.carry_code))}"); + continue; + } + if (wmsCarryHs.Count == 0) + { + LoggerAgvElevatorTask.LogWarning($"暂存区库位{startloc.location_code}上不存在托盘"); + continue; + } + + // 选一楼出货库位 + List outLocations = await db_agvElevatorTaskExceptionHandles.Queryable() + .Where(r => GetFloor1OutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0") + .OrderBy("location_code" + (切换发货区 == "3楼发货左" ? " desc" : "")).ToListAsync(); + + if (outLocations.Count == 0) + { + LoggerAgvElevatorTask.LogWarning($"一楼没有可用的出货库位"); + continue; + } + BasLocation outLocation = outLocations.FirstOrDefault(); + WmsPointH outPoint = await db_agvElevatorTaskExceptionHandles.Queryable().FirstAsync(it => it.location_id == outLocation.id); + + WmsCarryH wmsCarryH = wmsCarryHs.FirstOrDefault(); + + WmsElevatorH wmsElevatorH = null; + + string elevatorSno = ""; + // 选电梯 + if (group.Key == WmsWareHouseConst.REGION_CPOutstockCache_ID) + { + var floor3FirstSelectElevator = await db_agvElevatorTaskExceptionHandles.Queryable().Where(p => p.key == "floor3FirstSelectElevator").FirstAsync(); + var floor3FirstSelectElevatorTasknums = await db_agvElevatorTaskExceptionHandles.Queryable().Where(p => p.key == "floor3FirstSelectElevatorTasknums").FirstAsync(); + + wmsElevatorH = await db_agvElevatorTaskExceptionHandles.Queryable().Where(r => r.elevator_code == floor3FirstSelectElevator.value).FirstAsync(); + elevatorSno = wmsElevatorH.elevator_code.Replace("Elevator", ""); + + + // 检查有没有同时从同个暂存区分区发到同个电梯任务 + //if (wmsElevatorH.task_nums + wmsElevatorH.carry_count > 0) + //{ + // List currentAreaLocs = await db_agvElevatorTaskExceptionHandles.Queryable().Where(r => r.name == 切换发货区).Select(r => r.location_code).ToListAsync(); + // // 同个暂存分区同个电梯的托盘 + // List _carrys = await db_agvElevatorTaskExceptionHandles.Queryable() + // .InnerJoin((a, b) => currentAreaLocs.Contains(a.startlocation_code) && a.carry_code == b.carry_code + // && a.endlocation_code == b.startlocation_code && a.endlocation_code == $"DT-3-{elevatorSno}") + // .Where((a, b) => (a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID && a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID) + // || (b.status != WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID && b.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID)).Select((a, b) => a.carry_code).ToListAsync(); + + // if (_carrys.Count > 0) + // { + // LoggerAgvElevatorTask.LogInformation($"出现同时从同个暂存区分区发到同个电梯{wmsElevatorH.elevator_code}的托盘{string.Join(',', _carrys)},等待托盘任务完成"); + // continue; + // } + //} + + + floor3FirstSelectElevatorTasknums.value = (int.Parse(floor3FirstSelectElevatorTasknums.value) - 1).ToString(); + if (floor3FirstSelectElevatorTasknums.value == "0") + { + await ChangeSelectedElevator(db_agvElevatorTaskExceptionHandles); + } + else + { + // 仅切换电梯后 如果一托任务在等第二托时要做特殊处理 + if (wmsElevatorH.task_nums == 1) + { + await ChangeSelectedElevator(db_agvElevatorTaskExceptionHandles); + } + else + { + // 剩余可放托数 + await db_agvElevatorTaskExceptionHandles.Updateable().SetColumns(r => r.value == floor3FirstSelectElevatorTasknums.value) + .Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync(); + } + + } + } + + List wmsPointHs = await db_agvElevatorTaskExceptionHandles.Queryable().Where(it => it.status == 1).ToListAsync(); + List points = new List(); + + // 到电梯 + WmsPointH cacheOut_point = wmsPointHs.Where(r => r.location_code == startloc.location_code).First().Copy(); + WmsPointH DT_C_point = wmsPointHs.Where(r => r.point_code == $"DT-C-03-0{elevatorSno}").First().Copy(); + cacheOut_point.area_code = "FC"; + DT_C_point.area_code = "FC"; + + points.Add(cacheOut_point); + points.Add(DT_C_point); + // 到一楼 + points.Add(wmsPointHs.Where(r => r.point_code == $"DT-3-{elevatorSno}").First()); + points.Add(wmsPointHs.Where(r => r.point_code == $"DT-1-{elevatorSno}").First()); + points.Add(wmsPointHs.Where(r => r.point_code == $"DT-R-01-0{elevatorSno}").First()); + points.Add(outPoint); + + //根据获取的路径点生成预任务,生成顺序必须预路径算法返回的起终点的顺序一致(预任务顺序) + if (points?.Count > 0) + { + List preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it => + { + WmsPointH? sPoint = it.FirstOrDefault(); + WmsPointH? ePoint = it.LastOrDefault(); + + WmsPretaskH preTask = new() + { + org_id = WmsWareHouseConst.AdministratorOrgId, + startlocation_id = sPoint?.location_id!, + startlocation_code = sPoint?.location_code!, + endlocation_id = ePoint?.location_id!, + endlocation_code = ePoint?.location_code!, + start_floor = sPoint?.floor.ToString(), + end_floor = ePoint?.floor.ToString(), + startpoint_id = sPoint?.id!, + startpoint_code = sPoint?.point_code!, + endpoint_id = ePoint?.id!, + endpoint_code = ePoint?.point_code!, + bill_code = _billRullService!.GetBillNumber(WmsWareHouseConst.WMS_PRETASK_H_ENCODE).GetAwaiter().GetResult(), + status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID, + biz_type = wmsCarryH.biz_type, + task_type = WmsWareHouseConst.WMS_PRETASK_TRANSFER_TYPE_ID + }; + preTask.carry_id = wmsCarryH.id; + preTask.carry_code = wmsCarryH.carry_code; + preTask.area_id = sPoint?.area_id!; + preTask.area_code = it.Key; + // 载具记录 require_id todo + preTask.require_id = wmsCarryH.require_id; + preTask.require_code = ""; + preTask.create_id = _userManager.UserId; + preTask.create_time = DateTime.Now; + return preTask; + }).ToList(); + bool isOk = await GenPreTask(preTasks, null!, db_agvElevatorTaskExceptionHandles); + if (isOk) + { + LoggerAgvElevatorTask.LogInformation($"成功下发预任务 {string.Join(',', preTasks.Select(r => r.bill_code))}"); + LoggerAgvElevatorTask.LogInformation($"成功下发载具 {string.Join(',', preTasks.Select(r => r.carry_code).Distinct())}"); + //查询库位表 + BasLocation location = await db_agvElevatorTaskExceptionHandles.Queryable().SingleAsync(it => it.id == startloc.id); + { + //载具加锁,增加库位信息 + _ = await db_agvElevatorTaskExceptionHandles.Updateable().SetColumns(it => new WmsCarryH + { + carry_status = ((int)EnumCarryStatus.占用).ToString(), + is_lock = 1, + location_id = startloc.id, + location_code = location.location_code + }).Where(it => it.id == wmsCarryH.id).ExecuteCommandAsync(); + } + + await db_agvElevatorTaskExceptionHandles.Updateable().SetColumns(r => r.value == (切换发货区 == "3楼发货左" ? "3楼发货右" : "3楼发货左")) + .Where(r => r.key == "floor3CurOutCacheLocation").ExecuteCommandAsync(); + + //所有库位加锁 + string?[] ids = new[] { startloc.id, preTasks[0].endlocation_id, outLocation.id }; + _ = await db_agvElevatorTaskExceptionHandles.Updateable().SetColumns(it => new BasLocation { is_lock = 1 }).Where(it => ids.Contains(it.id)).ExecuteCommandAsync(); + } + else + { + throw new Exception("预任务生成失败"); + } + } + } + } + + await db_agvElevatorTaskExceptionHandles.Ado.CommitTranAsync(); + } + } + catch (ObjectDisposedException ex) + { + LoggerAgvElevatorTask.LogWarning($"【AgvelevatorTimerTaskExceptionHandle】 数据库连接异常:{ex.Message}"); + LoggerAgvElevatorTask.LogWarning($"【AgvelevatorTimerTaskExceptionHandle】 数据库连接异常:{ex.StackTrace}"); + if (ex.Source == "Npgsql") + db_agvElevatorTaskExceptionHandles = _db.CopyNew(); + } + catch (Exception ex) + { + Console.WriteLine("【AgvelevatorTimerTaskExceptionHandle】" + ex.Message); + LoggerAgvElevatorTask.LogError($"【AgvelevatorTimerTaskExceptionHandle】 {ex.Message}"); + LoggerAgvElevatorTask.LogError($"【AgvelevatorTimerTaskExceptionHandle】 {ex.StackTrace}"); + // 数据库连接断开时会报错 + try { await db_agvElevatorTaskExceptionHandles.Ado.RollbackTranAsync(); } catch { }; + } + finally + { + s_agvElevatortaskDic.Release(); + } + } + + async Task ChangeSelectedElevator(ISqlSugarClient db, string maxposcount = "2") + { + BasFactoryConfig floor3FirstSelectElevator = await db.Queryable().Where(r => r.key == "floor3FirstSelectElevator").FirstAsync(); + string elevator = floor3FirstSelectElevator.value == "Elevator3" ? "Elevator4" : "Elevator3"; + LoggerAgvElevatorTask.LogInformation($"重置首选电梯为{elevator}"); + // 选择另一个电梯座位首选电梯 + await db.Updateable().SetColumns(r => r.value == elevator) + .Where(r => r.key == "floor3FirstSelectElevator").ExecuteCommandAsync(); + + await db.Updateable().SetColumns(r => r.value == maxposcount) + .Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync(); + } } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs index e3bb0ad7..4d8ad1a1 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryBindService.cs @@ -200,7 +200,10 @@ namespace Tnb.WarehouseMgr { decimal? sum = input.details.Where(r => group.Select(r => r.barcode).Contains(r.barcode)).Select(r => r.codeqty).Sum(); WmsPurchaseD wmsPurchaseD = await _db.Queryable().Where(r => r.id == group.Key.require_id).FirstAsync(); - + if (wmsPurchaseD == null) + { + throw new Exception($"条码{string.Join(',', input.details.Select(r => r.barcode))}来源采购收货明细不存在!"); + } // 收货质检之后不能绑定 if (!string.IsNullOrEmpty(wmsPurchaseD.qc_res)) { @@ -221,6 +224,10 @@ namespace Tnb.WarehouseMgr { decimal? sum = input.details.Where(r => group.Select(r => r.barcode).Contains(r.barcode)).Select(r => r.codeqty).Sum(); WmsOutsourceD wmsOutsourceD = await _db.Queryable().Where(r => r.id == group.Key.require_id).FirstAsync(); + if (wmsOutsourceD == null) + { + throw new Exception($"条码{string.Join(',', input.details.Select(r => r.barcode))}来源委外收货明细不存在!"); + } decimal? bind_qty = wmsOutsourceD.bind_qty ?? 0; if (sum + bind_qty > wmsOutsourceD.outsource_quantity) { @@ -234,6 +241,10 @@ namespace Tnb.WarehouseMgr { decimal? sum = input.details.Where(r => group.Select(r => r.barcode).Contains(r.barcode)).Select(r => r.codeqty).Sum(); WmsRawmatTransferinstockD wmsRawmatTransferinstockD = await _db.Queryable().Where(r => r.id == group.Key.require_id).FirstAsync(); + if (wmsRawmatTransferinstockD == null) + { + throw new Exception($"条码{string.Join(',', input.details.Select(r => r.barcode))}来源原材料调拨入库明细不存在!"); + } decimal? bind_qty = wmsRawmatTransferinstockD.bind_qty ?? 0; if (sum + bind_qty > wmsRawmatTransferinstockD.qty) @@ -339,7 +350,6 @@ namespace Tnb.WarehouseMgr throw new Exception($"以下条码已被绑定:{string.Join(',', repeat_wmsCarryCodes.Select(r => r.barcode))}"); } - List WmsCarryCodes = new List(); WmsCarrybindH wmsCarrybindH = new WmsCarrybindH(); @@ -441,6 +451,7 @@ namespace Tnb.WarehouseMgr foreach (var detail in WmsCarryCodes) { var wmsCarrybindCode = detail.Adapt(); + wmsCarrybindCode.id = SnowflakeIdHelper.NextId(); wmsCarrybindCode.membercarry_id = input.membercarry_id; wmsCarrybindCode.membercarry_code = input.membercarry_code; wmsCarrybindCode.carrybind_id = wmsCarrybindH.id; diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryStockReportService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryStockReportService.cs index e3eef7ff..f8b1ae72 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryStockReportService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCarryStockReportService.cs @@ -59,8 +59,7 @@ namespace Tnb.WarehouseMgr .LeftJoin((a, b, c, d) => d.id == b.carrystd_id) .LeftJoin((a, b, c, d, e) => e.carry_id == b.id) .LeftJoin((a, b, c, d, e, f) => f.id == e.material_id) - .Where((a, b, c, d, e) => a.is_type == ((int)EnumLocationType.存储库位).ToString() - && ((!string.IsNullOrEmpty(b.carry_code) && b.carry_status != "0" && b.carry_status != "6") || string.IsNullOrEmpty(b.carry_code))) + .Where((a, b, c, d, e) => ((!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_code), (a, b, c, d) => b.carry_code.Contains(carry_code)) .WhereIF(!string.IsNullOrEmpty(material_code), (a, b, c, d, e, f) => e.material_code.Contains(material_code)) @@ -71,8 +70,8 @@ namespace Tnb.WarehouseMgr { warehouse_name = c.whname, carry_id = b.id, - carry_code = string.IsNullOrEmpty(b.carry_code) ? "空托盘堆垛" : b.carry_code, - carry_name = string.IsNullOrEmpty(b.carry_code) ? "空托盘堆垛" : b.carry_name, + carry_code = a.is_use == "1" && string.IsNullOrEmpty(b.carry_code) && c.id == WmsWareHouseConst.WAREHOUSE_YCL_ID ? "空托盘堆垛" : b.carry_code, + carry_name = a.is_use == "1" && string.IsNullOrEmpty(b.carry_code) && c.id == WmsWareHouseConst.WAREHOUSE_YCL_ID ? "空托盘堆垛" : b.carry_name, carry_status = b.is_lock == 1 ? "锁定" : "未锁定", carry_type = d.carrystd_name, location_code = a.location_code, @@ -101,7 +100,7 @@ namespace Tnb.WarehouseMgr .InnerJoin((a, b, c, d, e, f) => f.carry_id == e.membercarry_id) .InnerJoin((a, b, c, d, e, f, g) => g.id == f.material_id) .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() && b.carry_status != "0" && b.carry_status != "6") + .Where((a, b, c, d, e) => 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_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)) @@ -146,7 +145,7 @@ namespace Tnb.WarehouseMgr if (report.carry_code != "空托盘堆垛") { - List curCarryCodes = items.FindAll(x => x.carry_id == itGroup.Key.carry_id); + List curCarryCodes = items.FindAll(x => !string.IsNullOrEmpty(x.carry_id) && x.carry_id == itGroup.Key.carry_id); List wmsCarryStockReportCodes = new List(); int index = 0; @@ -205,51 +204,56 @@ namespace Tnb.WarehouseMgr var warehouse_id = ""; var carry_code = ""; var material_code = ""; + var container_no = ""; + var code_batch = ""; if (!input.queryJson.IsNullOrWhiteSpace()) { warehouse_id = JObject.Parse(input.queryJson).Value(nameof(WmsCarryCode.warehouse_id)); carry_code = JObject.Parse(input.queryJson).Value(nameof(WmsCarryCode.carry_code)); material_code = JObject.Parse(input.queryJson).Value(nameof(WmsCarryCode.material_code)); + code_batch = JObject.Parse(input.queryJson).Value(nameof(WmsCarryCode.code_batch)); + container_no = JObject.Parse(input.queryJson).Value(nameof(WmsCarryCode.container_no)); } List items = await _db.Queryable() - .LeftJoin((a, b) => b.location_id == a.id) - .InnerJoin((a, b, c) => a.wh_id == c.id) - .LeftJoin((a, b, c, d) => d.id == b.carrystd_id) - .LeftJoin((a, b, c, d, e) => e.carry_id == b.id) - .LeftJoin((a, b, c, d, e, f) => f.id == e.material_id) - .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_code), (a, b, c, d) => b.carry_code.Contains(carry_code)) - .WhereIF(!string.IsNullOrEmpty(material_code), (a, b, c, d, e, f) => e.material_code.Contains(material_code)) - .OrderByDescending((a, b, c, d, e, f) => b.carry_code) - .Select((a, b, c, d, e, f) => new WmsCarryStockReport - { - warehouse_name = c.whname, - carry_id = b.id, - carry_code = string.IsNullOrEmpty(b.carry_code) ? "空托盘堆垛" : b.carry_code, - carry_name = string.IsNullOrEmpty(b.carry_code) ? "空托盘堆垛" : b.carry_name, - carry_status = b.is_lock == 1 ? "锁定" : "未锁定", - carry_type = d.carrystd_name, - location_code = a.location_code, - location_name = a.location_name, - location_status = a.is_lock == 1 ? "锁定" : "未锁定", - instock_time = b.instock_time != null ? b.instock_time.Value.ToString("yyyy-MM-dd HH:mm:ss") : "", - barcode = e.barcode, - code_batch = e.code_batch, - qty = e.codeqty, - material_id = e.material_id, - material_code = e.material_code, - material_name = f.name, - unit = e.unit_id, - creator = e.create_id, - bind_time = e.create_time != null ? e.create_time.Value.ToString("yyyy-MM-dd HH:mm:ss") : "" - }) - .OrderBy((a) => a.location_code) - .ToListAsync(); + .LeftJoin((a, b) => b.location_id == a.id) + .InnerJoin((a, b, c) => a.wh_id == c.id) + .LeftJoin((a, b, c, d) => d.id == b.carrystd_id) + .LeftJoin((a, b, c, d, e) => e.carry_id == b.id) + .LeftJoin((a, b, c, d, e, f) => f.id == e.material_id) + .Where((a, b, c, d, e) => ((!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_code), (a, b, c, d) => b.carry_code.Contains(carry_code)) + .WhereIF(!string.IsNullOrEmpty(material_code), (a, b, c, d, e, f) => e.material_code.Contains(material_code)) + .WhereIF(!string.IsNullOrEmpty(code_batch), (a, b, c, d, e, f) => e.code_batch.Contains(code_batch)) + .WhereIF(!string.IsNullOrEmpty(container_no), (a, b, c, d, e, f) => f.container_no.Contains(container_no)) + .OrderByDescending((a, b, c, d, e, f) => b.carry_code) + .Select((a, b, c, d, e, f) => new WmsCarryStockReport + { + warehouse_name = c.whname, + carry_id = b.id, + carry_code = a.is_use == "1" && string.IsNullOrEmpty(b.carry_code) && c.id == WmsWareHouseConst.WAREHOUSE_YCL_ID ? "空托盘堆垛" : b.carry_code, + carry_name = a.is_use == "1" && string.IsNullOrEmpty(b.carry_code) && c.id == WmsWareHouseConst.WAREHOUSE_YCL_ID ? "空托盘堆垛" : b.carry_name, + carry_status = b.is_lock == 1 ? "锁定" : "未锁定", + carry_type = d.carrystd_name, + location_code = a.location_code, + location_name = a.location_name, + location_status = a.is_lock == 1 ? "锁定" : "未锁定", + instock_time = b.instock_time != null ? b.instock_time.Value.ToString("yyyy-MM-dd HH:mm:ss") : "", + barcode = e.barcode, + code_batch = e.code_batch, + qty = e.codeqty, + material_id = e.material_id, + material_code = e.material_code, + material_name = f.name, + unit = e.unit_id, + creator = e.create_id, + bind_time = e.create_time != null ? e.create_time.Value.ToString("yyyy-MM-dd HH:mm:ss") : "" + }) + .OrderBy((a) => a.location_code) + .ToListAsync(); // 料架 List items_LJ = await _db.Queryable() @@ -264,6 +268,8 @@ namespace Tnb.WarehouseMgr .WhereIF(!string.IsNullOrEmpty(warehouse_id), (a, b, c, d) => c.id == warehouse_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)) + .WhereIF(!string.IsNullOrEmpty(code_batch), (a, b, c, d, e, f, g) => f.code_batch.Contains(code_batch)) + .WhereIF(!string.IsNullOrEmpty(container_no), (a, b, c, d, e, f, g) => g.container_no.Contains(container_no)) .Select((a, b, c, d, e, f, g, h) => new WmsCarryStockReport { warehouse_name = c.whname, diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs index 7ecdcaff..e7cd47e7 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyOutstockService .cs @@ -11,6 +11,7 @@ using JNPF.VisualDev; using JNPF.VisualDev.Entitys; using JNPF.VisualDev.Interfaces; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; using Newtonsoft.Json; using SqlSugar; using Tnb.BasicData.Entities; @@ -68,7 +69,8 @@ namespace Tnb.WarehouseMgr SemaphoreSlim semaphoreSlim = null; try { - semaphoreSlim = _wareHouseService.GetSemaphore("outstock", input.data[nameof(OutStockStrategyQuery.warehouse_id)].ToString()); + string warehouse_id = input.data[nameof(OutStockStrategyQuery.warehouse_id)].ToString(); + semaphoreSlim = _wareHouseService.GetSemaphore("outstock", warehouse_id); await semaphoreSlim.WaitAsync(); await _db.Ado.BeginTranAsync(); @@ -83,9 +85,10 @@ namespace Tnb.WarehouseMgr OutStockStrategyQuery OutStockStrategyInput = new() { carrystd_id = input.data[nameof(OutStockStrategyQuery.carrystd_id)].ToString(), - warehouse_id = input.data[nameof(OutStockStrategyQuery.warehouse_id)].ToString(), + warehouse_id = warehouse_id, Size = qty }; + List? carrys = await _wareHouseService.OutStockStrategy(OutStockStrategyInput); Logger.Information($"根据出库策略获取的载具数量:{carrys?.Count}"); //var carrys = await _db.Queryable().LeftJoin((a, b) => a.location_id == b.id) @@ -253,7 +256,8 @@ namespace Tnb.WarehouseMgr } catch (Exception ex) { - Logger.Information($"空载具出库错误", ex); + Logger.LogWarning($"空载具出库错误 {ex.Message}"); + Logger.LogWarning($"空载具出库错误 {ex.StackTrace}"); await _db.Ado.RollbackTranAsync(); throw; } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialSignHService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialSignHService.cs index db0fd55b..f78fefa2 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialSignHService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialSignHService.cs @@ -179,57 +179,113 @@ namespace Tnb.WarehouseMgr List _wmsCarryCodes = _db.Queryable().Where(r => r.carry_id == wmsCarryH.id).ToList(); await _db.Updateable().SetColumns(r => r.carry_status == (_wmsCarryCodes.Count == 0 ? "0" : r.carry_status)).Where(r => r.id == wmsCarryH.id).ExecuteCommandAsync(); - switch (carryLoc.wh_id) + await _db.Updateable(wmsCarryCodes).ExecuteCommandAsync(); + + wmsMaterialSignH.warehouse_sign_id = carryLoc.wh_id; + + if (_wmsCarryCodes.Count > 0) { - case WmsWareHouseConst.WAREHOUSE_YCL_ID: - { - - await _db.Updateable(wmsCarryCodes).ExecuteCommandAsync(); - - await _wareHouseService.s_taskExecuteSemaphore_YCLInstock.WaitAsync(); - wmsMaterialSignH.warehouse_sign_id = WmsWareHouseConst.WAREHOUSE_YCL_ID; - wmsMaterialSignH.warehouse_instock_id = WmsWareHouseConst.WAREHOUSE_YCL_ID; - try + switch (carryLoc.wh_id) + { + case WmsWareHouseConst.WAREHOUSE_YCL_ID: { - InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = "1", Size = 1, AvoidBusyPassage = true, Region_id = WmsWareHouseConst.REGION_YCLCache_ID }; - List endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput); - if (endLocations.Count == 0) + try { - throw new AppFriendlyException("没有可以回库的库位", 500); + await _wareHouseService.s_taskExecuteSemaphore_YCLInstock.WaitAsync(); + wmsMaterialSignH.warehouse_instock_id = WmsWareHouseConst.WAREHOUSE_YCL_ID; + InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = "1", Size = 1, AvoidBusyPassage = true, Region_id = WmsWareHouseConst.REGION_YCLCache_ID }; + List endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput); + if (endLocations.Count == 0) + { + throw new AppFriendlyException("没有可以回库的库位", 500); + } + CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput(); + commonCreatePretaskInput.startlocation_id = carryLoc.id; + commonCreatePretaskInput.endlocation_id = endLocations[0].id; + commonCreatePretaskInput.carry_id = wmsCarryH.id; + commonCreatePretaskInput.carry_code = wmsCarryH.carry_code; + commonCreatePretaskInput.task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID; + commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_WmsMaterialSign_ID; + + Logger.LogInformation($"【MaterialSign】 开始生成原材料仓回库任务 起点{carryLoc.location_code} 终点{endLocations[0].location_code} 托盘 {wmsCarryH.carry_code}"); + + Entities.Dto.Outputs.Result res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput, _db); + if (res.code != HttpStatusCode.OK) + { + throw new AppFriendlyException(res.msg, 500); + } } - CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput(); - commonCreatePretaskInput.startlocation_id = carryLoc.id; - commonCreatePretaskInput.endlocation_id = endLocations[0].id; - commonCreatePretaskInput.carry_id = wmsCarryH.id; - commonCreatePretaskInput.carry_code = wmsCarryH.carry_code; - commonCreatePretaskInput.task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID; - commonCreatePretaskInput.biz_type = WmsWareHouseConst.BIZTYPE_WmsMaterialSign_ID; - - Logger.LogInformation($"【MaterialSign】 开始生成原材料仓回库任务 起点{carryLoc.location_code} 终点{endLocations[0].location_code} 托盘 {wmsCarryH.carry_code}"); - - Entities.Dto.Outputs.Result res = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput, _db); - if (res.code != HttpStatusCode.OK) + catch (Exception ex) { - throw new AppFriendlyException(res.msg, 500); + throw; + } + finally + { + _wareHouseService.s_taskExecuteSemaphore_YCLInstock.Release(); } - } - catch (Exception ex) - { - throw; - } - finally - { - _wareHouseService.s_taskExecuteSemaphore_YCLInstock.Release(); - } - - break; - } + + break; + } + } } + await _db.Insertable(wmsMaterialSignH).ExecuteCommandAsync(); await _db.Insertable(wmsMaterialSignDs).ExecuteCommandAsync(); + #region 更新库存表 + + //switch (wmsDistaskH.biz_type) + //{ + // // 原材料调拨出库 + // case WmsWareHouseConst.BIZTYPE_WmsRawmatTransferoutstock_ID: + // { + // //WmsRawmatTransferoutstockD wmsRawmatTransferoutstockD = await _db.Queryable().Where(r => r.id == wmsDistaskH.source_id).FirstAsync(); + // //WmsRawmatTransferoutstockH wmsRawmatTransferoutstockH = await _db.Queryable().Where(r => r.id == wmsRawmatTransferoutstockD.bill_id).FirstAsync(); + + // //WmsTransferOrderH wmsTransferOrderH = await _db.Queryable().Where(r => r.id == wmsRawmatTransferoutstockH.transfer_order_id).FirstAsync(); + + + // break; + // } + // case WmsWareHouseConst.BIZTYPE_WMSMATERIALTRANSFER_ID: + // { + // WmsMaterialTransferD wmsMaterialTransferD = await _db.Queryable().Where(r => r.id == wmsDistaskH.source_id).FirstAsync(); + // WmsMaterialTransfer wmsMaterialTransfer = await _db.Queryable().Where(r => r.id == wmsMaterialTransferD.bill_id).FirstAsync(); + + // List wmsStockReportCodes = new List(); + // foreach (var wmsMaterialSignD in wmsMaterialSignDs) + // { + // WmsStockReportCode wmsStockReportCode = new WmsStockReportCode(); + // wmsStockReportCode.material_id = wmsMaterialSignD.id; + // wmsStockReportCode.material_code = wmsMaterialSignD.material_code; + // wmsStockReportCode.barcode = wmsMaterialSignD.barcode; + // wmsStockReportCode.code_batch = wmsMaterialSignD.code_batch; + // wmsStockReportCode.codeqty = wmsMaterialSignD.qty - wmsMaterialSignD.sign_qty; + // wmsStockReportCode.unit_id = wmsMaterialSignD.unit_id; + // wmsStockReportCode.create_id = _userManager?.User?.Id; + // wmsStockReportCode.create_time = DateTime.Now; + // wmsStockReportCode.warehouse_id = wmsMaterialTransfer.warehouse_instock; + // wmsStockReportCode. + // wmsStockReportCodes.Add(wmsStockReportCode); + // } + + + // //// todo 对接其它出库单 出库数量为签收数量 + // //if (!_wareHouseService.GetFloor1WXSGWOutstockLocation().Contains(carryLoc.id)) + // //{ + // // // todo 对接其它入库单 入库数量为签收数量 + + // //} + // break; + // } + //} + + + #endregion + + #region 上传bip switch (wmsDistaskH.biz_type) @@ -333,8 +389,8 @@ namespace Tnb.WarehouseMgr thirdWebapiRecord.third_name = WmsWareHouseConst.BIP; thirdWebapiRecord.name = "调拨出库"; thirdWebapiRecord.method = "POST"; - thirdWebapiRecord.url = config.value + "uapws/rest/transOut/save"; - // thirdWebapiRecord.url = WmsWareHouseConst.BIP_DOMAIN + "uapws/rest/transIn/save"; + //thirdWebapiRecord.url = config.value + "uapws/rest/transOut/save"; + thirdWebapiRecord.url = WmsWareHouseConst.BIP_DOMAIN + "uapws/rest/transIn/save"; thirdWebapiRecord.request_data = JsonConvert.SerializeObject(requestData); thirdWebapiRecord.create_time = DateTime.Now; await _db.Insertable(thirdWebapiRecord).ExecuteCommandAsync(); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs index 92dd1e7a..962add84 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs @@ -108,7 +108,6 @@ namespace Tnb.WarehouseMgr { queryJson = JObject.Parse(input.queryJson); } - SqlSugarPagedList result = await _db.Queryable() .InnerJoin((a, b) => a.status == b.Id) @@ -117,7 +116,7 @@ namespace Tnb.WarehouseMgr .InnerJoin((a, b, c, d, e) => e.id == a.warehouse_instock) .LeftJoin((a, b, c, d, e, f) => a.type == f.EnCode) // 只显示未完成的单据 - .Where(a => a.status != "25065149810453") + //.Where(a => a.status != "25065149810453") .WhereIF(queryJson != null && queryJson["type"] != null, a => a.type == queryJson["type"].ToString()) .WhereIF(queryJson != null && queryJson["bill_code"] != null, a => a.bill_code.Contains(queryJson["bill_code"].ToString())) .Select((a, b, c, d, e, f) => new WmsMaterialTransfer @@ -195,7 +194,6 @@ namespace Tnb.WarehouseMgr } } - /// /// 获取物料库存 /// @@ -227,8 +225,7 @@ namespace Tnb.WarehouseMgr code_batch = input.code_batch, Size = input.palletCount, Region_id = WmsWareHouseConst.REGION_Purchase_ID, - PolicyCode = WmsWareHouseConst.POLICY_YCLOUTSTOCK, - AvoidBusyPassage = true + PolicyCode = WmsWareHouseConst.POLICY_YCLOUTSTOCK }; List items = await _wareHouseService.OutStockStrategy(outStockStrategyInput); @@ -337,8 +334,7 @@ namespace Tnb.WarehouseMgr await _db.Ado.BeginTranAsync(); OutStockStrategyQuery outStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_YCL_ID, material_id = wmsMaterialTransferD.material_id, - code_batch = input.code_batch, Size = input.palletCount,Region_id = WmsWareHouseConst.REGION_Purchase_ID,PolicyCode = WmsWareHouseConst.POLICY_YCLOUTSTOCK, - AvoidBusyPassage = true}; + code_batch = input.code_batch, Size = input.palletCount,Region_id = WmsWareHouseConst.REGION_Purchase_ID,PolicyCode = WmsWareHouseConst.POLICY_YCLOUTSTOCK}; List items = await _wareHouseService.OutStockStrategy(outStockStrategyInput); if (items.Count == 0) @@ -363,7 +359,7 @@ namespace Tnb.WarehouseMgr .OrderBy("is_lock, task_nums, location_code").ToList(); } // 中储仓三工位 - else if (wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_ZC_ID || wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_ZZXBK_ID) + else if (wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_ZC_ID || wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_ZZXBK_ID || wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_ZCC_ID) { // 根据三工位任务数平均分配任务 暂定 endLocations = _db.Queryable().Where(r => _wareHouseService.GetFloor1WXSGWOutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0") @@ -387,7 +383,7 @@ namespace Tnb.WarehouseMgr endLocation = await _db.Queryable().Where(r => _wareHouseService.GetFloor1GLSGWOutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0").OrderBy("is_lock, task_nums, location_code").FirstAsync(); } // 中储仓三工位 - else if(wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_ZC_ID || wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_ZZXBK_ID) + else if(wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_ZC_ID || wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_ZZXBK_ID || wmsMaterialTransfer.warehouse_instock == WmsWareHouseConst.WAREHOUSE_ZCC_ID) { // 根据三工位任务数平均分配任务 暂定 endLocation = await _db.Queryable().Where(r => _wareHouseService.GetFloor1WXSGWOutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0").OrderBy("is_lock, task_nums, location_code").FirstAsync(); @@ -789,8 +785,10 @@ namespace Tnb.WarehouseMgr { semaphoreSlimOutStock = _wareHouseService.GetSemaphore("outstock", WmsWareHouseConst.WAREHOUSE_BCK_ID); await semaphoreSlimOutStock.WaitAsync(); + Logger.LogInformation($"开始执行下发到包材库1"); semaphoreSlimInStock = _wareHouseService.GetSemaphore("instock", WmsWareHouseConst.WAREHOUSE_F2BCQ_ID); await semaphoreSlimInStock.WaitAsync(); + Logger.LogInformation($"开始执行下发到包材库2"); if (string.IsNullOrEmpty(input.source_id)) { throw new AppFriendlyException("来源单据id不可为空", 500); @@ -1129,6 +1127,7 @@ namespace Tnb.WarehouseMgr { await _s_taskExecuteSemaphore_F1ZCCOutstock.WaitAsync(); + Logger.LogInformation($"中储仓下发到二楼暂存仓"); try { WmsMaterialTransfer wmsMaterialTransfer = _db.Queryable().Where(r => r.id == input.source_id).First(); @@ -1271,7 +1270,7 @@ namespace Tnb.WarehouseMgr public async Task DistributeZCCToYCL(MaterialTransferDistributeToZCCInput input) { await _s_taskExecuteSemaphore_F1ZCCOutstock.WaitAsync(); - + Logger.LogInformation($"开始执行中储仓退料到原材料仓"); try { WmsMaterialTransfer wmsMaterialTransfer = _db.Queryable().Where(r => r.id == input.source_id).First(); @@ -1677,7 +1676,7 @@ namespace Tnb.WarehouseMgr { try { - List wmsCarryHs = _db.Queryable().Where(r => r.work_station == input.work_station && r.is_lock == 0 && r.carrystd_id == WmsWareHouseConst.CARRY_LJSTD_ID + List wmsCarryHs = _db.Queryable().Where(r => r.work_station == input.work_station && r.is_lock == 0 && (r.carry_status == ((int)(EnumCarryStatus.占用)).ToString() || r.carry_status == ((int)(EnumCarryStatus.齐套)).ToString())).ToList(); if (string.IsNullOrEmpty(input.work_station)) { @@ -2102,9 +2101,9 @@ namespace Tnb.WarehouseMgr { throw new AppFriendlyException($"载具{input.carry_code}已锁定!", 500); } - if (string.IsNullOrEmpty(wmsCarryH.location_id)) + if (string.IsNullOrEmpty(input.startlocation_code)) { - throw new AppFriendlyException($"载具{input.carry_code}的库位为空!", 500); + throw new AppFriendlyException($"起点库位为空!", 500); } if (wmsCarryH.carrystd_id != WmsWareHouseConst.CARRY_ZYXCSTD_ID && wmsCarryH.carrystd_id != WmsWareHouseConst.CARRY_ZYLJSTD_ID) @@ -2139,7 +2138,7 @@ namespace Tnb.WarehouseMgr throw new AppFriendlyException($@"没有可以入库的库位", 500); } - BasLocation startLocation = await _db.Queryable().Where(r => r.id == wmsCarryH.location_id).FirstAsync(); + BasLocation startLocation = await _db.Queryable().Where(r => r.location_code == input.startlocation_code).FirstAsync(); CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput(); commonCreatePretaskInput.startlocation_id = startLocation.id; diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDADeliveryService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDADeliveryService.cs index b0332c48..56513564 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDADeliveryService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDADeliveryService.cs @@ -120,11 +120,12 @@ namespace Tnb.WarehouseMgr } if (input.data.ContainsKey(nameof(WmsTransfer.endlocation_id))) { - ePoint = await _db!.Queryable().FirstAsync(it => it.location_id == input.data[nameof(WmsTransfer.endlocation_id)].ToString()); + ePoint = await _db!.Queryable().FirstAsync(it => it.location_code == input.data[nameof(WmsTransfer.endlocation_id)].ToString()); } if (sPoint != null && ePoint != null) { + Logger.LogError($"【PDADelivery】起点 {sPoint.point_code} 终点 {ePoint.point_code}"); List points = new List(); if (sPoint.area_code != ePoint.area_code) { @@ -198,10 +199,17 @@ namespace Tnb.WarehouseMgr _ = await _db.Updateable().SetColumns(it => new BasLocation { is_lock = 1 }).Where(it => ids.Contains(it.id)).ExecuteCommandAsync(); } } + else + { + throw new AppFriendlyException($"【PDADelivery】生成预任务失败", 500); + } } } - + else + { + throw new AppFriendlyException($"【PDADelivery】点位不存在", 500); + } await _db.Ado.CommitTranAsync(); } catch (Exception ex) diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAEmptyOutstockService .cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAEmptyOutstockService .cs index 7680855d..357befb9 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAEmptyOutstockService .cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPDAEmptyOutstockService .cs @@ -226,8 +226,8 @@ namespace Tnb.WarehouseMgr } catch (Exception ex) { - Log.Error("PDA空载具出库错误", ex.Message); - Log.Error("PDA空载具出库错误", ex.StackTrace); + Logger.Error("PDA空载具出库错误", ex.Message); + Logger.Error("PDA空载具出库错误", ex.StackTrace); await _db.Ado.RollbackTranAsync(); throw; } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdInstockHService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdInstockHService.cs index 35d30db1..1ffba189 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdInstockHService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPrdInstockHService.cs @@ -274,7 +274,6 @@ namespace Tnb.WarehouseMgr commonCreatePretaskInput2.task_type = WmsWareHouseConst.WMS_PRETASK_INSTOCK_TYPE_ID; commonCreatePretaskInput2.biz_type = WmsWareHouseConst.BIZTYPE_WMSPRDINSTOCK_ID; commonCreatePretaskInput2.require_id = wmsPrdInstockD.id; - commonCreatePretaskInput2.isChangeCarryLoc2StartLoc = false; Entities.Dto.Outputs.Result res2 = await _wareHouseService.CommonCreatePretask(commonCreatePretaskInput2, db); if (res2.code != HttpStatusCode.OK) diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseDService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseDService.cs index b5bb8f9d..47497814 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseDService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseDService.cs @@ -116,7 +116,7 @@ namespace Tnb.WarehouseMgr string wmsPurchaseOrderHId = wmsPurchaseH?.erp_bill_code ?? ""; WmsPurchaseOrderH wmsPurchaseOrderH = await _db.Queryable().SingleAsync(x => x.id == wmsPurchaseOrderHId); WmsPurchaseOrderD wmsPurchaseOrderDs = await _db.Queryable().FirstAsync(x => x.fk_wms_purchase_order_id == wmsPurchaseOrderHId); - BasWarehouse basWarehouse = await _db.Queryable().SingleAsync(x=>x.id==instock.warehouse_id); + //BasWarehouse basWarehouse = await _db.Queryable().SingleAsync(x=>x.id==instock.warehouse_id); List materialIds = allInstockDetails.Select(x => x.material_id).Distinct().ToList(); List unitCodes = allInstockDetails.Select(x => x.unit_id).Distinct().ToList(); @@ -134,7 +134,7 @@ namespace Tnb.WarehouseMgr tableIds.Add(_userManager.UserId); tableIds.Add(wmsPurchaseH.create_id); tableIds.Add(WmsWareHouseConst.AdministratorOrgId); - tableIds.Add(instock.warehouse_id); + tableIds.Add(instock.warehouse_id);// 1001A11000000002OOGU tableIds.AddRange(materialIds); tableIds.Add(supplierId); tableIds.Add(tranTypeId); @@ -178,7 +178,8 @@ namespace Tnb.WarehouseMgr ["castunitid"] = erpExtendFields.Find(x => x.table_id == (unitDatas.Find(x => x.EnCode == item.unit_id)?.Id ?? ""))?.cunitid ?? "", ["cbodytranstypecode"] = erpExtendFields.Find(x => x.table_id == tranTypeId)?.transaction_type_id ?? "", // ["cbodywarehouseid"] = erpExtendFields.Find(x => x.table_id == instock.warehouse_id)?.cotherwhid ?? "", - ["cbodywarehouseid"] = erpWarehouserelaHs.Find(x => x.erp_warehousecode == basWarehouse.whcode)?.erp_warehouseid ?? "", + //["cbodywarehouseid"] = erpWarehouserelaHs.Find(x => x.erp_warehousecode == basWarehouse.whcode)?.erp_warehouseid ?? "", + ["cbodywarehouseid"] = "1001A11000000002OOGU", ["cgeneralbid"] = null, ["cgeneralhid"] = null, ["cmaterialoid"] = erpExtendFields.Find(x => x.table_id == item.material_id)?.cmaterialoid ?? "", @@ -193,7 +194,7 @@ namespace Tnb.WarehouseMgr ["nnum"] = item.qty, ["nshouldnum"] = item.pr_qty, // ["pk_creqwareid"] = erpExtendFields.Find(x => x.table_id == instock.warehouse_id)?.cotherwhid ?? "", - ["pk_creqwareid"] = erpWarehouserelaHs.Find(x => x.erp_warehousecode == basWarehouse.whcode)?.erp_warehouseid ?? "", + ["pk_creqwareid"] = "1001A11000000002OOGU", ["pk_group"] = erpOrg.pk_group, ["pk_org"] = erpOrg.pk_org, ["pk_org_v"] = erpOrg.pk_org_v, diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatTransferinstockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatTransferinstockService.cs index 871e7257..6251d7d1 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatTransferinstockService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsRawmatTransferinstockService.cs @@ -74,21 +74,22 @@ namespace Tnb.WarehouseMgr } Logger.Information($"进入原材料调拨入库单上传BIP逻辑"); - List wmsCarryCodes = await _db.Queryable().Where(r => r.carry_id == input.carryIds[0]).ToListAsync(); + WmsTempCode wmsTempCode = await _db.Queryable() + .LeftJoin((a, b) => a.barcode == b.barcode) + .Where((a, b) => a.carry_id == input.wmsDistaskH.carry_id) + .Select((a, b) => b) + .FirstAsync(); + string rawmatTransferinstockDId = wmsTempCode?.require_id ?? ""; + WmsRawmatTransferinstockD wmsRawmatTransferinstockD = await _db.Queryable().SingleAsync(x => x.id == rawmatTransferinstockDId); + List wmsCarryCodes = await _db.Queryable().Where(r => r.carry_id == input.carryIds[0]) + .Where(r => r.material_id == wmsRawmatTransferinstockD.matcode_id && r.code_batch == wmsRawmatTransferinstockD.code_batch).ToListAsync(); await _db.Updateable().SetColumns(it => new WmsRawmatTransferinstockD { actual_qty = it.actual_qty + wmsCarryCodes.Sum(r => r.codeqty) }) .Where(it => it.id == input.wmsDistaskH.source_id).ExecuteCommandHasChangeAsync(); WmsInstockH instock = await _db.Queryable().SingleAsync(x => x.id == input.requireId); List allInstockDetails = await _db.Queryable().Where(it => it.bill_id == input.requireId).ToListAsync(); - WmsTempCode wmsTempCode = await _db.Queryable() - .LeftJoin((a, b) => a.barcode == b.barcode) - .Where((a, b) => a.carry_id == input.wmsDistaskH.carry_id) - .Select((a, b) => b) - .FirstAsync(); - string rawmatTransferinstockDId = wmsTempCode?.require_id ?? ""; - WmsRawmatTransferinstockD wmsRawmatTransferinstockD = await _db.Queryable().SingleAsync(x => x.id == rawmatTransferinstockDId); string rawmatTransferinstockHId = wmsRawmatTransferinstockD?.bill_id ?? ""; WmsRawmatTransferinstockH wmsRawmatTransferinstockH = await _db.Queryable().SingleAsync(x => x.id == rawmatTransferinstockHId); @@ -116,7 +117,9 @@ namespace Tnb.WarehouseMgr tableIds.AddRange(unitDatas.Select(x => x.Id).ToList()); List erpExtendFields = await _db.Queryable().Where(x => tableIds.Contains(x.table_id)).ToListAsync(); - string erpCreateId = erpExtendFields.Find(x => x.table_id == userId)?.user_id ?? ""; + // 暂时传 1001A110000000003NBJ 陈书会 + //string erpCreateId = erpExtendFields.Find(x => x.table_id == userId)?.user_id ?? ""; + string erpCreateId = "1001A110000000003NBJ"; ErpExtendField erpOrg = erpExtendFields.Find(x => x.table_id == (WmsWareHouseConst.AdministratorOrgId)); string nowStr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); @@ -144,8 +147,9 @@ namespace Tnb.WarehouseMgr erpRequestData.Add("ctrantypeid", "0001H11000000000D31E");//先写死 erpRequestData.Add("vtrantypecode", "4E-01");//先写死 erpRequestData.Add("csourcebillhid", wmsRawmatTransferinstockH?.erp_pk ?? ""); - + + decimal qty = wmsCarryCodes.Sum(r => r.codeqty); List> erpRequestDataDetails = new List>(); foreach (WmsInstockD item in allInstockDetails) { @@ -169,8 +173,8 @@ namespace Tnb.WarehouseMgr ["dplanoutdate"] = instock.create_time.ToString("yyyy-MM-dd HH:mm:ss"), // ["nnum"] = item.qty, // ["nshouldnum"] = item.pr_qty, - ["nnum"] = wmsRawmatTransferinstockD.actual_qty, - ["nshouldnum"] = wmsRawmatTransferinstockD.actual_qty, + ["nnum"] = qty, + ["nshouldnum"] = qty, ["pk_group"] = erpOrg.pk_group, ["pk_org"] = erpOrg.pk_org, ["pk_org_v"] = erpOrg.pk_org_v, diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsSaleReleaseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsSaleReleaseService.cs index 6f8a0652..053c9a5c 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsSaleReleaseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsSaleReleaseService.cs @@ -165,7 +165,7 @@ namespace Tnb.WarehouseMgr WmsSaleD wmsOutstockD = await _db.Queryable().FirstAsync(it => it.id == input.source_id); await _db.Ado.BeginTranAsync(); //入库取终点 //出库起点 - OutStockStrategyQuery outStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_CP_ID, material_id = wmsOutstockD.material_id, qty = input.qty, code_batch = wmsOutstockD.code_batch, Region_id = WmsWareHouseConst.REGION_CPOutstock_ID }; + OutStockStrategyQuery outStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_CP_ID, material_id = wmsOutstockD.material_id, qty = input.qty, code_batch = wmsOutstockD.code_batch, Region_id = WmsWareHouseConst.REGION_CPOutstock_ID, dbConn = _db }; List> items = await _wareHouseService.OutStockStrategy_saleRelease(outStockStrategyInput); decimal canOutstockQty = items.Sum(r => r.Item3.codeqty).ParseToDecimal(); @@ -200,7 +200,7 @@ namespace Tnb.WarehouseMgr //人工发货 else { - InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_CP_ID, Size = items_pretask.Count, Region_id = WmsWareHouseConst.REGION_CPManualOutstock_ID }; + InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_CP_ID, Size = items_pretask.Count, Region_id = WmsWareHouseConst.REGION_CPManualOutstock_ID, dbConn = _db }; endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput); if (endLocations.Count < items_pretask.Count) @@ -244,11 +244,15 @@ namespace Tnb.WarehouseMgr throw new AppFriendlyException($"载具{carry.carry_code}无法选到缓存区库位,请检查电梯缓存分区配置表", 500); } #endregion + if (endLocation == null) + { + throw new AppFriendlyException("一楼没有足够的未锁定且空闲的出库工位", 500); + } } //人工发货 else { - InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_CP_ID, Size = 1, Region_id = WmsWareHouseConst.REGION_CPManualOutstock_ID }; + InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_CP_ID, Size = 1, Region_id = WmsWareHouseConst.REGION_CPManualOutstock_ID, dbConn = _db }; endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput); if (endLocations.Count < 1) @@ -257,10 +261,6 @@ namespace Tnb.WarehouseMgr } endLocation = endLocations[0]; } - if (endLocation == null) - { - throw new AppFriendlyException("一楼没有足够的未锁定且空闲的出库工位", 500); - } WmsPointH sPoint = null!; WmsPointH ePoint = null!; @@ -366,8 +366,7 @@ namespace Tnb.WarehouseMgr //所有库位加锁 string?[] ids = new[] { startLocation.id, preTasks[0].endlocation_id, endLocationId }; - _ = await _db.Updateable().SetColumns(it => new BasLocation { is_lock = 1 }).Where(it => ids.Contains(it.id)).ExecuteCommandAsync(); - + int row = await _db.Updateable().SetColumns(it => new BasLocation { is_lock = 1 }).Where(it => ids.Contains(it.id)).ExecuteCommandAsync(); } } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsSterilizationInstockHService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsSterilizationInstockHService.cs index 07bdf654..ceef2543 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsSterilizationInstockHService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsSterilizationInstockHService.cs @@ -192,8 +192,8 @@ namespace Tnb.WarehouseMgr thirdWebapiRecord.third_name = WmsWareHouseConst.BIP; thirdWebapiRecord.name = "转库单"; thirdWebapiRecord.method = "POST"; - thirdWebapiRecord.url = config.value + "uapws/rest/whstrans/save"; - // thirdWebapiRecord.url = WmsWareHouseConst.BIP_DOMAIN + "uapws/rest/transIn/save"; + //thirdWebapiRecord.url = config.value + "uapws/rest/whstrans/save"; + thirdWebapiRecord.url = WmsWareHouseConst.BIP_DOMAIN + "uapws/rest/transIn/save"; thirdWebapiRecord.request_data = JsonConvert.SerializeObject(erpRequestData); thirdWebapiRecord.create_time = DateTime.Now; await _db.Insertable(thirdWebapiRecord).ExecuteCommandAsync(); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsTransferOutstockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsTransferOutstockService.cs index 85f982d3..9364824c 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsTransferOutstockService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsTransferOutstockService.cs @@ -96,7 +96,7 @@ namespace Tnb.WarehouseMgr WmsTransferOutstockD wmsOutstockD = await _db.Queryable().FirstAsync(it => it.id == input.source_id); await _db.Ado.BeginTranAsync(); //入库取终点 //出库起点 - OutStockStrategyQuery outStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_CP_ID, material_id = wmsOutstockD.material_id, qty = input.qty, code_batch = wmsOutstockD.pi_code, Region_id = WmsWareHouseConst.REGION_CPOutstock_ID }; + OutStockStrategyQuery outStockStrategyInput = new() { warehouse_id = WmsWareHouseConst.WAREHOUSE_CP_ID, material_id = wmsOutstockD.material_id, qty = input.qty, code_batch = wmsOutstockD.pi_code, Region_id = WmsWareHouseConst.REGION_CPOutstock_ID, dbConn = _db }; List> items = await _wareHouseService.OutStockStrategy_saleRelease(outStockStrategyInput); decimal canOutstockQty = items.Sum(r => r.Item3.codeqty).ParseToDecimal(); diff --git a/visualdev/Tnb.VisualDev.Engine/Core/FormDataParsing.cs b/visualdev/Tnb.VisualDev.Engine/Core/FormDataParsing.cs index cee6be81..554e7065 100644 --- a/visualdev/Tnb.VisualDev.Engine/Core/FormDataParsing.cs +++ b/visualdev/Tnb.VisualDev.Engine/Core/FormDataParsing.cs @@ -1657,6 +1657,10 @@ public class FormDataParsing : ITransient case JnpfKeyConst.POPUPTABLESELECT: case JnpfKeyConst.POPUPSELECT: { + //if (model.relationField == model.showField) + //{ + // break; + //} // 获取远端数据 var dynamic = await _dataInterfaceService.GetInfo(model.interfaceId); if (dynamic == null) break;