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