From 7d44c723e4a5b9df1a4aa6bd736b96df523c28a0 Mon Sep 17 00:00:00 2001
From: majian <780924089@qq.com>
Date: Sat, 14 Sep 2024 11:58:14 +0800
Subject: [PATCH] =?UTF-8?q?=E7=8E=B0=E5=9C=A8=E9=97=AE=E9=A2=98=E5=A4=84?=
=?UTF-8?q?=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Tnb.ProductionMgr/RedisBackGround.cs | 315 +---------------
.../Consts/WmsWareHouseConst.cs | 2 +-
.../Dto/ErpInputs/ErpRawmatOutstockInput.cs | 5 +
.../Dto/ErpInputs/SaleShippingInput.cs | 4 +
.../Dto/ErpInputs/TransferOutstockInput.cs | 5 +
...MaterialTransferDistributeSCWToZCCInput.cs | 5 +
.../Entity/InventorycheckInput.cs | 10 +
.../Entity/WmsElevatorH.cs | 6 +-
.../Entity/WmsInventorycheckD.cs | 12 +
.../Entity/WmsInventorycheckH.cs | 6 +
.../Entity/WmsRawmatOutstockD.cs | 12 +
.../Entity/WmsRawmatTransferinstockD.cs | 12 +
.../Entity/WmsSaleD.cs | 13 +-
.../Entity/WmsTransferInstockD .cs | 12 +
.../IWareHouseService.cs | 6 +
.../Tnb.WarehouseMgr/BaseWareHouseService.cs | 35 +-
.../Tnb.WarehouseMgr/DeviceProviderService.cs | 41 ++-
.../Tnb.WarehouseMgr/ErpToWmsService.cs | 172 ++++++++-
.../Tnb.WarehouseMgr/WareHouseService.cs | 337 +++++++++++++++++-
.../WmsMaterialSignHService.cs | 4 +-
.../WmsMaterialTransferService.cs | 12 +-
.../Tnb.WarehouseMgr/WmsPurchaseDService.cs | 12 +-
.../WmsSterilizationInstockHService.cs | 4 +-
.../Core/FormDataParsing.cs | 4 +
24 files changed, 677 insertions(+), 369 deletions(-)
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;