diff --git a/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs b/ProductionMgr/Tnb.ProductionMgr/RedisBackGround.cs index c4a90176..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,284 +2079,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA /// async void AgvelevatorTimerTaskExceptionHandle(object args) { - if (s_agvElevatortaskDic.CurrentCount == 0) - return; - - await s_agvElevatortaskDic.WaitAsync(); - var floor3outstock = await db_agvElevatorTaskExceptionHandles.Queryable().Where(p => p.key == "floor3outstock").FirstAsync(); - if (floor3outstock != null && floor3outstock.value == "0") - return; - - 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; - - 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") - { - LoggerAgvElevatorTask.LogInformation($"下次任务下发后重置首选电梯为{(wmsElevatorH.elevator_code == "Elevator3" ? "Elevator4" : "Elevator3")}"); - // 选择另一个电梯座位首选电梯 - 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(); - } - - 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) - { - LoggerAgvElevatorTask.LogInformation($"成功下发预任务 {string.Join(',', preTasks.Select(r => r.bill_code))}"); - LoggerAgvElevatorTask.LogInformation($"成功下发载具 {string.Join(',', preTasks.Distinct().Select(r => r.carry_code))}"); - //查询库位表 - 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 内存测试 @@ -3076,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/Entity/InventorycheckInput.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/InventorycheckInput.cs index d5bef8f4..108feca2 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/InventorycheckInput.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/InventorycheckInput.cs @@ -29,6 +29,11 @@ namespace Tnb.WarehouseMgr.Entities.Dto.ErpInputs /// public string? warehouse_code { get; set; } + /// + /// 盘点日期 + /// + public string? check_date { get; set; } + /// /// 主表pk /// @@ -72,5 +77,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/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 index 447feeb1..276cbab3 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsInventorycheckD.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsInventorycheckD.cs @@ -109,4 +109,16 @@ public partial class WmsInventorycheckD : BaseEntity /// 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 index 9f6cbb68..c3741372 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsInventorycheckH.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsInventorycheckH.cs @@ -84,4 +84,10 @@ public partial class WmsInventorycheckH : BaseEntity /// public string? erp_bill_code { get; set; } + /// + /// 盘点日期 + /// + public string? check_date { 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/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.Interfaces/IWareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs index 523cb980..72b1afa7 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Interfaces/IWareHouseService.cs @@ -238,5 +238,11 @@ namespace Tnb.WarehouseMgr.Interfaces 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 7150463b..a4219930 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs @@ -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,9 +281,10 @@ 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"); @@ -402,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") @@ -428,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; } @@ -439,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]}"); @@ -850,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]}"); @@ -928,7 +942,17 @@ namespace Tnb.WarehouseMgr 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))}"); } @@ -966,7 +990,8 @@ 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(); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs b/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs index fa30f338..92a41aea 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/ErpToWmsService.cs @@ -1217,6 +1217,7 @@ namespace Tnb.WarehouseMgr } return await ToApiResult(HttpStatusCode.OK, "成功"); } + /// /// 销售发货单 /// @@ -1243,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) @@ -1272,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) { // 判断单据是否已经下发 @@ -1349,7 +1350,7 @@ namespace Tnb.WarehouseMgr wmsSaleD.material_name = material.name; wmsSaleD.material_specification = material.material_specification; } - + wmsSaleD.auxprop = detail.auxprop; wmsSaleDs.Add(wmsSaleD); } @@ -1553,7 +1554,7 @@ namespace Tnb.WarehouseMgr msRawmatTransferinstockD.matname = material.name; msRawmatTransferinstockD.matspecification = material.material_specification; } - + msRawmatTransferinstockD.auxprop = detail.auxprop; wmsRawmatTransferinstockDs.Add(msRawmatTransferinstockD); } @@ -1624,6 +1625,7 @@ namespace Tnb.WarehouseMgr wmsTransferInstockD.material_code = material.code; wmsTransferInstockD.material_desc = material.material_specification; } + wmsTransferInstockD.auxprop = detail.auxprop; wmsTransferInstockDs.Add(wmsTransferInstockD); } @@ -2182,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; @@ -2192,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; @@ -2219,7 +2223,7 @@ namespace Tnb.WarehouseMgr wmsRawmatOutstockD.material_name = material.name; wmsRawmatOutstockD.material_specification = material.material_specification; } - + wmsRawmatOutstockD.auxprop = detail.auxprop; wmsRawmatOutstockDs.Add(wmsRawmatOutstockD); } @@ -2244,6 +2248,140 @@ 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, "成功"); + } + /// /// 盘点单 /// @@ -2332,7 +2470,7 @@ namespace Tnb.WarehouseMgr 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(); @@ -2373,7 +2511,7 @@ namespace Tnb.WarehouseMgr _LoggerErp2Mes.LogWarning($@"【Inventorycheck】表体明细中单位{detail.unit_code}在wms系统中未找到!"); throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到!", 500); } - + wmsInventorycheckD.auxprop = detail.auxprop; wmsInventorycheckDs.Add(wmsInventorycheckD); } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index f9f4adf8..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); @@ -2564,15 +2566,11 @@ namespace Tnb.WarehouseMgr #region 电梯第三次改动 // 一托下的时候切换首选电梯 - //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(); - //} + if (disTaskIds.Count == 1) + { + await ChangeSelectedElevator(db); + } + #endregion } @@ -4473,6 +4471,323 @@ namespace Tnb.WarehouseMgr } #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/WmsMaterialSignHService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialSignHService.cs index 3af6f813..f78fefa2 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialSignHService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialSignHService.cs @@ -389,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 745cc018..962add84 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsMaterialTransferService.cs @@ -359,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") @@ -383,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(); @@ -1676,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)) { @@ -2101,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) @@ -2138,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/WmsPurchaseDService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsPurchaseDService.cs index 38550f17..3ee31125 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,6 +134,7 @@ namespace Tnb.WarehouseMgr tableIds.Add(_userManager.UserId); tableIds.Add(WmsWareHouseConst.AdministratorOrgId); tableIds.Add(instock.warehouse_id); + tableIds.Add("1001A11000000002OOGU"); tableIds.AddRange(materialIds); tableIds.Add(supplierId); tableIds.Add(tranTypeId); @@ -177,9 +178,10 @@ 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 ?? "", - ["cgeneralbid"] = "", - ["cgeneralhid"] = "", + //["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 ?? "", ["cmaterialvid"] = erpExtendFields.Find(x => x.table_id == item.material_id)?.cmaterialvid ?? "", ["corpoid"] = erpOrg.corpoid, @@ -192,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/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/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;