现在问题处理
This commit is contained in:
@@ -121,7 +121,6 @@ namespace Tnb.ProductionMgr
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// AGV到电梯任务
|
/// AGV到电梯任务
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public SemaphoreSlim s_agvElevatortaskDic = new(1);
|
|
||||||
|
|
||||||
|
|
||||||
private StackExRedisHelper _redisData;
|
private StackExRedisHelper _redisData;
|
||||||
@@ -145,7 +144,6 @@ namespace Tnb.ProductionMgr
|
|||||||
private ISqlSugarClient db_Floor4DMC2CPK;
|
private ISqlSugarClient db_Floor4DMC2CPK;
|
||||||
private ISqlSugarClient db_F2KTPsupplement;
|
private ISqlSugarClient db_F2KTPsupplement;
|
||||||
private ISqlSugarClient db_YCLInternalTransfer;
|
private ISqlSugarClient db_YCLInternalTransfer;
|
||||||
private ISqlSugarClient db_agvElevatorTaskExceptionHandles;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -204,7 +202,6 @@ namespace Tnb.ProductionMgr
|
|||||||
db_Floor4DMC2CPK = repository.CopyNew();
|
db_Floor4DMC2CPK = repository.CopyNew();
|
||||||
db_F2KTPsupplement = repository.CopyNew();
|
db_F2KTPsupplement = repository.CopyNew();
|
||||||
db_YCLInternalTransfer = repository.CopyNew();
|
db_YCLInternalTransfer = repository.CopyNew();
|
||||||
db_agvElevatorTaskExceptionHandles = repository.CopyNew();
|
|
||||||
|
|
||||||
List<string> elevatorAreas = repository.CopyNew().Queryable<WmsElevatorH>().Select(r => r.area_code).Distinct().ToList();
|
List<string> elevatorAreas = repository.CopyNew().Queryable<WmsElevatorH>().Select(r => r.area_code).Distinct().ToList();
|
||||||
foreach (var s_elevatorArea in elevatorAreas)
|
foreach (var s_elevatorArea in elevatorAreas)
|
||||||
@@ -2082,284 +2079,7 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
|||||||
/// <param name="args"></param>
|
/// <param name="args"></param>
|
||||||
async void AgvelevatorTimerTaskExceptionHandle(object args)
|
async void AgvelevatorTimerTaskExceptionHandle(object args)
|
||||||
{
|
{
|
||||||
if (s_agvElevatortaskDic.CurrentCount == 0)
|
await _wareHouseService.AgvelevatorTimerTaskExceptionHandle();
|
||||||
return;
|
|
||||||
|
|
||||||
await s_agvElevatortaskDic.WaitAsync();
|
|
||||||
var floor3outstock = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3outstock").FirstAsync();
|
|
||||||
if (floor3outstock != null && floor3outstock.value == "0")
|
|
||||||
return;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
await db_agvElevatorTaskExceptionHandles.Ado.BeginTranAsync();
|
|
||||||
// 获取暂存区需要生成任务的库位
|
|
||||||
List<BasLocation> agvElevatorStartLocs = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>()
|
|
||||||
.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<IGrouping<string, BasLocation>> elevatorTaskGroup = agvElevatorStartLocs.GroupBy(r => r.region_id).ToList();
|
|
||||||
foreach (IGrouping<string, BasLocation> group in elevatorTaskGroup)
|
|
||||||
{
|
|
||||||
List<BasLocation> locs = group.ToList();
|
|
||||||
LoggerAgvElevatorTask.LogWarning($"即将下发{locs.Count}条任务");
|
|
||||||
for (int i = 0; i < locs.Count; i++)
|
|
||||||
{
|
|
||||||
// 选一楼出货库位
|
|
||||||
List<BasLocation> outLocations = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>()
|
|
||||||
.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<WmsPointH>().FirstAsync(it => it.location_id == outLocation.id);
|
|
||||||
|
|
||||||
// 交替选择缓存区库位
|
|
||||||
var YCLInnerTransfer = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().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<BasLocation> locations = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>()
|
|
||||||
.InnerJoin<WmsElevatorcacheArea>((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<BasFactoryConfig>().Where(p => p.key == "floor3FirstSelectElevatorTasknums").FirstAsync();
|
|
||||||
|
|
||||||
切换发货区 = YCLInnerTransfer.value == "3楼发货左" ? "3楼发货右" : "3楼发货左";
|
|
||||||
LoggerAgvElevatorTask.LogInformation($"再次交替到{切换发货区} 进行发货");
|
|
||||||
|
|
||||||
await db_agvElevatorTaskExceptionHandles.Updateable<BasFactoryConfig>().SetColumns(r => r.value == 切换发货区)
|
|
||||||
.Where(r => r.key == "floor3CurOutCacheLocation").ExecuteCommandAsync();
|
|
||||||
locations = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>()
|
|
||||||
.InnerJoin<WmsElevatorcacheArea>((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<BasFactoryConfig>().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<BasFactoryConfig>().SetColumns(r => r.value == 切换电梯)
|
|
||||||
.Where(r => r.key == "floor3FirstSelectElevator").ExecuteCommandAsync();
|
|
||||||
// 剩余可放托数
|
|
||||||
await db_agvElevatorTaskExceptionHandles.Updateable<BasFactoryConfig>().SetColumns(r => r.value == "2")
|
|
||||||
.Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync();
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
List<WmsCarryH> wmsCarryHs = await db_agvElevatorTaskExceptionHandles.Queryable<WmsCarryH>().Where(r => r.location_id == startloc.id).ToListAsync();
|
|
||||||
if (wmsCarryHs.Count > 1)
|
|
||||||
{
|
|
||||||
LoggerAgvElevatorTask.LogWarning($"暂存区库位{startloc.location_code}上存在多个托盘{string.Join(',', wmsCarryHs.Select(x => x.carry_code))}");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (wmsCarryHs.Count == 0)
|
|
||||||
{
|
|
||||||
LoggerAgvElevatorTask.LogWarning($"暂存区库位{startloc.location_code}上不存在托盘");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
WmsCarryH wmsCarryH = wmsCarryHs.FirstOrDefault();
|
|
||||||
|
|
||||||
WmsElevatorH wmsElevatorH = null;
|
|
||||||
|
|
||||||
string elevatorSno = "";
|
|
||||||
// 选电梯
|
|
||||||
if (group.Key == WmsWareHouseConst.REGION_CPOutstockCache_ID)
|
|
||||||
{
|
|
||||||
var floor3FirstSelectElevator = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3FirstSelectElevator").FirstAsync();
|
|
||||||
var floor3FirstSelectElevatorTasknums = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3FirstSelectElevatorTasknums").FirstAsync();
|
|
||||||
|
|
||||||
wmsElevatorH = await db_agvElevatorTaskExceptionHandles.Queryable<WmsElevatorH>().Where(r => r.elevator_code == floor3FirstSelectElevator.value).FirstAsync();
|
|
||||||
elevatorSno = wmsElevatorH.elevator_code.Replace("Elevator", "");
|
|
||||||
|
|
||||||
|
|
||||||
// 检查有没有同时从同个暂存区分区发到同个电梯任务
|
|
||||||
//if (wmsElevatorH.task_nums + wmsElevatorH.carry_count > 0)
|
|
||||||
//{
|
|
||||||
// List<string> currentAreaLocs = await db_agvElevatorTaskExceptionHandles.Queryable<WmsElevatorcacheArea>().Where(r => r.name == 切换发货区).Select(r => r.location_code).ToListAsync();
|
|
||||||
// // 同个暂存分区同个电梯的托盘
|
|
||||||
// List<string> _carrys = await db_agvElevatorTaskExceptionHandles.Queryable<WmsPretaskH>()
|
|
||||||
// .InnerJoin<WmsPretaskH>((a, b) => currentAreaLocs.Contains(a.startlocation_code) && a.carry_code == b.carry_code
|
|
||||||
// && a.endlocation_code == b.startlocation_code && a.endlocation_code == $"DT-3-{elevatorSno}")
|
|
||||||
// .Where((a, b) => (a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID && a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID)
|
|
||||||
// || (b.status != WmsWareHouseConst.PRETASK_BILL_STATUS_CANCEL_ID && b.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID)).Select((a, b) => a.carry_code).ToListAsync();
|
|
||||||
|
|
||||||
// if (_carrys.Count > 0)
|
|
||||||
// {
|
|
||||||
// LoggerAgvElevatorTask.LogInformation($"出现同时从同个暂存区分区发到同个电梯{wmsElevatorH.elevator_code}的托盘{string.Join(',', _carrys)},等待托盘任务完成");
|
|
||||||
// continue;
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
|
|
||||||
floor3FirstSelectElevatorTasknums.value = (int.Parse(floor3FirstSelectElevatorTasknums.value) - 1).ToString();
|
|
||||||
if (floor3FirstSelectElevatorTasknums.value == "0")
|
|
||||||
{
|
|
||||||
LoggerAgvElevatorTask.LogInformation($"下次任务下发后重置首选电梯为{(wmsElevatorH.elevator_code == "Elevator3" ? "Elevator4" : "Elevator3")}");
|
|
||||||
// 选择另一个电梯座位首选电梯
|
|
||||||
await db_agvElevatorTaskExceptionHandles.Updateable<BasFactoryConfig>().SetColumns(r => r.value == (r.value == "Elevator3" ? "Elevator4" : "Elevator3"))
|
|
||||||
.Where(r => r.key == "floor3FirstSelectElevator").ExecuteCommandAsync();
|
|
||||||
// 重置为可放两托
|
|
||||||
floor3FirstSelectElevatorTasknums.value = "2";
|
|
||||||
}
|
|
||||||
// 剩余可放托数
|
|
||||||
await db_agvElevatorTaskExceptionHandles.Updateable<BasFactoryConfig>().SetColumns(r => r.value == floor3FirstSelectElevatorTasknums.value)
|
|
||||||
.Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
List<WmsPointH> wmsPointHs = await db_agvElevatorTaskExceptionHandles.Queryable<WmsPointH>().Where(it => it.status == 1).ToListAsync();
|
|
||||||
List<WmsPointH> points = new List<WmsPointH>();
|
|
||||||
|
|
||||||
// 到电梯
|
|
||||||
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<WmsPretaskH> preTasks = points.Where(it => !it.location_id.IsNullOrEmpty()).GroupBy(g => g.area_code).Select(it =>
|
|
||||||
{
|
|
||||||
WmsPointH? sPoint = it.FirstOrDefault();
|
|
||||||
WmsPointH? ePoint = it.LastOrDefault();
|
|
||||||
|
|
||||||
WmsPretaskH preTask = new()
|
|
||||||
{
|
|
||||||
org_id = WmsWareHouseConst.AdministratorOrgId,
|
|
||||||
startlocation_id = sPoint?.location_id!,
|
|
||||||
startlocation_code = sPoint?.location_code!,
|
|
||||||
endlocation_id = ePoint?.location_id!,
|
|
||||||
endlocation_code = ePoint?.location_code!,
|
|
||||||
start_floor = sPoint?.floor.ToString(),
|
|
||||||
end_floor = ePoint?.floor.ToString(),
|
|
||||||
startpoint_id = sPoint?.id!,
|
|
||||||
startpoint_code = sPoint?.point_code!,
|
|
||||||
endpoint_id = ePoint?.id!,
|
|
||||||
endpoint_code = ePoint?.point_code!,
|
|
||||||
bill_code = _billRullService!.GetBillNumber(WmsWareHouseConst.WMS_PRETASK_H_ENCODE).GetAwaiter().GetResult(),
|
|
||||||
status = WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID,
|
|
||||||
biz_type = wmsCarryH.biz_type,
|
|
||||||
task_type = WmsWareHouseConst.WMS_PRETASK_TRANSFER_TYPE_ID
|
|
||||||
};
|
|
||||||
preTask.carry_id = wmsCarryH.id;
|
|
||||||
preTask.carry_code = wmsCarryH.carry_code;
|
|
||||||
preTask.area_id = sPoint?.area_id!;
|
|
||||||
preTask.area_code = it.Key;
|
|
||||||
// 载具记录 require_id todo
|
|
||||||
preTask.require_id = wmsCarryH.require_id;
|
|
||||||
preTask.require_code = "";
|
|
||||||
preTask.create_id = _userManager.UserId;
|
|
||||||
preTask.create_time = DateTime.Now;
|
|
||||||
return preTask;
|
|
||||||
}).ToList();
|
|
||||||
bool isOk = await _wareHouseService.GenPreTask(preTasks, null!, db_agvElevatorTaskExceptionHandles);
|
|
||||||
if (isOk)
|
|
||||||
{
|
|
||||||
LoggerAgvElevatorTask.LogInformation($"成功下发预任务 {string.Join(',', preTasks.Select(r => r.bill_code))}");
|
|
||||||
LoggerAgvElevatorTask.LogInformation($"成功下发载具 {string.Join(',', preTasks.Distinct().Select(r => r.carry_code))}");
|
|
||||||
//查询库位表
|
|
||||||
BasLocation location = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>().SingleAsync(it => it.id == startloc.id);
|
|
||||||
{
|
|
||||||
//载具加锁,增加库位信息
|
|
||||||
_ = await db_agvElevatorTaskExceptionHandles.Updateable<WmsCarryH>().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<BasFactoryConfig>().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<BasLocation>().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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#region 内存测试
|
#region 内存测试
|
||||||
@@ -3076,39 +2796,6 @@ where carry_code = '{coderesult}' and status = '{WmsWareHouseConst.TASK_BILL_STA
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected string _LoggerAgvElevatorTaskFileName = "";
|
|
||||||
protected ILogger _LoggerAgvElevatorTask;
|
|
||||||
protected ILogger LoggerAgvElevatorTask
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
string newFileName = $"{AppContext.BaseDirectory}/logs/{DateTime.Now:yyyyMMdd}/custom{DateTime.Now:yyyyMMdd}AgvElevatorTask.log";
|
|
||||||
if (_LoggerAgvElevatorTaskFileName != newFileName)
|
|
||||||
{
|
|
||||||
ILoggerFactory loggerFactory = LoggerFactory.Create(builder => builder.AddFile(newFileName, cfgOpts =>
|
|
||||||
{
|
|
||||||
|
|
||||||
//cfgOpts.DateFormat = "yyyy-MM-dd HH:mm:ss.fff";
|
|
||||||
cfgOpts.MessageFormat = (logMsg) =>
|
|
||||||
{
|
|
||||||
var logLevel = s_logLevelMap[logMsg.LogLevel];
|
|
||||||
var sb = new StringBuilder();
|
|
||||||
_ = sb.Append($"[{logLevel}] ");
|
|
||||||
_ = sb.Append($"{logMsg.LogName} ");
|
|
||||||
_ = sb.Append($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} ");
|
|
||||||
_ = sb.Append($"#{logMsg.EventId.Id} ");
|
|
||||||
_ = sb.Append(logMsg.Message + " ");
|
|
||||||
_ = sb.Append(logMsg.Exception?.ToString());
|
|
||||||
return sb.ToString();
|
|
||||||
};
|
|
||||||
|
|
||||||
}));
|
|
||||||
_LoggerAgvElevatorTask = loggerFactory.CreateLogger(this.GetType());
|
|
||||||
_LoggerAgvElevatorTaskFileName = newFileName;
|
|
||||||
}
|
|
||||||
return _LoggerAgvElevatorTask;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected string _LoggerSSXFileName = "";
|
protected string _LoggerSSXFileName = "";
|
||||||
protected ILogger _LoggerSSX;
|
protected ILogger _LoggerSSX;
|
||||||
|
|||||||
@@ -607,7 +607,7 @@
|
|||||||
/// 第三方 bip 地址
|
/// 第三方 bip 地址
|
||||||
/// </summary>
|
/// </summary>
|
||||||
// public const string BIP_DOMAIN = "http://192.168.1.11:8087/";//测试地址
|
// 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/";//正式地址
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 单位类型id
|
/// 单位类型id
|
||||||
|
|||||||
@@ -72,5 +72,10 @@ namespace Tnb.WarehouseMgr.Entities.Dto.ErpInputs
|
|||||||
/// 子表主键
|
/// 子表主键
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string erp_line_pk { get; set; }
|
public string erp_line_pk { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 辅助属性
|
||||||
|
/// </summary>
|
||||||
|
public string auxprop { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,5 +82,9 @@ namespace Tnb.WarehouseMgr.Entities.Dto.ErpInputs
|
|||||||
/// 子表主键
|
/// 子表主键
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string erp_line_pk { get; set; }
|
public string erp_line_pk { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 辅助属性
|
||||||
|
/// </summary>
|
||||||
|
public string auxprop { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -106,5 +106,10 @@ namespace Tnb.WarehouseMgr.Entities.Dto.ErpInputs
|
|||||||
/// 子表主键
|
/// 子表主键
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string erp_line_pk { get; set; }
|
public string erp_line_pk { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 辅助属性
|
||||||
|
/// </summary>
|
||||||
|
public string auxprop { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,5 +29,10 @@
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public decimal qty { get; set; }
|
public decimal qty { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 起点
|
||||||
|
/// </summary>
|
||||||
|
public string startlocation_code { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,11 @@ namespace Tnb.WarehouseMgr.Entities.Dto.ErpInputs
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string? warehouse_code { get; set; }
|
public string? warehouse_code { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 盘点日期
|
||||||
|
/// </summary>
|
||||||
|
public string? check_date { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 主表pk
|
/// 主表pk
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -72,5 +77,10 @@ namespace Tnb.WarehouseMgr.Entities.Dto.ErpInputs
|
|||||||
/// 子表主键
|
/// 子表主键
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string erp_line_pk { get; set; }
|
public string erp_line_pk { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 辅助属性
|
||||||
|
/// </summary>
|
||||||
|
public string auxprop { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -106,4 +106,8 @@ public partial class WmsElevatorH : BaseEntity<string>
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public int carry_count { get; set; }
|
public int carry_count { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 梯内货位占用情况
|
||||||
|
/// </summary>
|
||||||
|
public string? innerpos { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -109,4 +109,16 @@ public partial class WmsInventorycheckD : BaseEntity<string>
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public decimal? actual_qty { get; set; }
|
public decimal? actual_qty { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 辅助属性
|
||||||
|
/// </summary>
|
||||||
|
public string auxprop { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 辅助属性 供应商
|
||||||
|
/// </summary>
|
||||||
|
public string auxprop_gys { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 辅助属性 小批号
|
||||||
|
/// </summary>
|
||||||
|
public string auxprop_xph { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,4 +84,10 @@ public partial class WmsInventorycheckH : BaseEntity<string>
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string? erp_bill_code { get; set; }
|
public string? erp_bill_code { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 盘点日期
|
||||||
|
/// </summary>
|
||||||
|
public string? check_date { get; set; }
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -124,4 +124,16 @@ public partial class WmsRawmatOutstockD : BaseEntity<string>
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public decimal? actual_outstock_qty { get; set; }
|
public decimal? actual_outstock_qty { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 辅助属性
|
||||||
|
/// </summary>
|
||||||
|
public string auxprop { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 辅助属性 供应商
|
||||||
|
/// </summary>
|
||||||
|
public string auxprop_gys { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 辅助属性 小批号
|
||||||
|
/// </summary>
|
||||||
|
public string auxprop_xph { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -138,5 +138,17 @@ public partial class WmsRawmatTransferinstockD : BaseEntity<string>
|
|||||||
/// 物料名称
|
/// 物料名称
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string? matname { get; set; }
|
public string? matname { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 辅助属性
|
||||||
|
/// </summary>
|
||||||
|
public string auxprop { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 辅助属性 供应商
|
||||||
|
/// </summary>
|
||||||
|
public string auxprop_gys { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 辅助属性 小批号
|
||||||
|
/// </summary>
|
||||||
|
public string auxprop_xph { get; set; }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -97,5 +97,16 @@ public partial class WmsSaleD : BaseEntity<string>
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public string? erp_line_pk { get; set; }
|
public string? erp_line_pk { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 辅助属性
|
||||||
|
/// </summary>
|
||||||
|
public string auxprop { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 辅助属性 供应商
|
||||||
|
/// </summary>
|
||||||
|
public string auxprop_gys { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 辅助属性 小批号
|
||||||
|
/// </summary>
|
||||||
|
public string auxprop_xph { get; set; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -123,5 +123,17 @@ public partial class WmsTransferInstockD : BaseEntity<string>
|
|||||||
/// 物料名称
|
/// 物料名称
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string? material_name { get; set; }
|
public string? material_name { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 辅助属性
|
||||||
|
/// </summary>
|
||||||
|
public string auxprop { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 辅助属性 供应商
|
||||||
|
/// </summary>
|
||||||
|
public string auxprop_gys { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 辅助属性 小批号
|
||||||
|
/// </summary>
|
||||||
|
public string auxprop_xph { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -238,5 +238,11 @@ namespace Tnb.WarehouseMgr.Interfaces
|
|||||||
Task<string> CreateCodeRules(string prefix, string custom, int watercodeLength);
|
Task<string> CreateCodeRules(string prefix, string custom, int watercodeLength);
|
||||||
|
|
||||||
public Task CallingLanding(List<WmsDistaskH?> agvDTTasks);
|
public Task CallingLanding(List<WmsDistaskH?> agvDTTasks);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 电梯第三次改动 生成Agv到电梯任务
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="args"></param>
|
||||||
|
public Task AgvelevatorTimerTaskExceptionHandle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
public static Dictionary<string, SemaphoreSlim> _s_elevatortaskWCSRequestDic = new();
|
public static Dictionary<string, SemaphoreSlim> _s_elevatortaskWCSRequestDic = new();
|
||||||
public static List<ISqlSugarClient> _db_ElevatorTaskExceptionHandles = new();
|
public static List<ISqlSugarClient> _db_ElevatorTaskExceptionHandles = new();
|
||||||
|
|
||||||
|
public static SemaphoreSlim s_agvElevatortaskDic = new(1);
|
||||||
|
|
||||||
public static SemaphoreSlim s_GenTaskExecute = new(1);
|
public static SemaphoreSlim s_GenTaskExecute = new(1);
|
||||||
protected IEventPublisher? EventPublisher { set; get; }
|
protected IEventPublisher? EventPublisher { set; get; }
|
||||||
@@ -145,6 +145,39 @@ namespace Tnb.WarehouseMgr
|
|||||||
return _Logger;
|
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()
|
static BaseWareHouseService()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -174,7 +174,6 @@ namespace Tnb.WarehouseMgr
|
|||||||
var tags = _eleCtlCfg.tags;
|
var tags = _eleCtlCfg.tags;
|
||||||
await Task.Delay(1000);
|
await Task.Delay(1000);
|
||||||
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None);
|
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None);
|
||||||
Logger.Information($"【LoadConfirm】 电梯当前状态->系统状态:{sysStatus.ToEnum<EnumSysStatus>()},运行状态:{runStatus.ToEnum<EnumRunStatus>()},门状态:{doorStatus},Agv状态:{agvStatus.ToEnum<EnumAgvStatus>()},当前楼层:{floorNo},电梯占用状态{s_eleUseStatusDic[elevator.device_id]}");
|
|
||||||
{
|
{
|
||||||
var curFloor = await GetRealFloor(elevator.elevator_code, elevator.end_floor);
|
var curFloor = await GetRealFloor(elevator.elevator_code, elevator.end_floor);
|
||||||
/* Logger.Information($"目标楼层:{curFloor},电梯当前楼层:{floorNo}");
|
/* Logger.Information($"目标楼层:{curFloor},电梯当前楼层:{floorNo}");
|
||||||
@@ -182,6 +181,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
var loadedStatus = s_eleUseStatusDic[elevator.device_id] == 1 ? "完成" : "未完成";
|
var loadedStatus = s_eleUseStatusDic[elevator.device_id] == 1 ? "完成" : "未完成";
|
||||||
Logger.Information($"{devName.Match(@"\d+")}#梯,取货-> {loadedStatus}");
|
Logger.Information($"{devName.Match(@"\d+")}#梯,取货-> {loadedStatus}");
|
||||||
*/
|
*/
|
||||||
|
Logger.Information($"【LoadConfirm】 电梯当前状态->系统状态:{sysStatus.ToEnum<EnumSysStatus>()},运行状态:{runStatus.ToEnum<EnumRunStatus>()},门状态:{doorStatus},Agv状态:{agvStatus.ToEnum<EnumAgvStatus>()},当前楼层:{floorNo},目标楼层:{curFloor},电梯占用状态{s_eleUseStatusDic[elevator.device_id]}");
|
||||||
if (s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.空闲 && curFloor != floorNo)
|
if (s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.空闲 && curFloor != floorNo)
|
||||||
{
|
{
|
||||||
_ = await _elevatorControlService.CallLift(devName, curFloor, CancellationToken.None);
|
_ = await _elevatorControlService.CallLift(devName, curFloor, CancellationToken.None);
|
||||||
@@ -281,9 +281,10 @@ namespace Tnb.WarehouseMgr
|
|||||||
Logger.Information("【UnloadConfirm】 接收到WCS放货确认信号..................");
|
Logger.Information("【UnloadConfirm】 接收到WCS放货确认信号..................");
|
||||||
Logger.Information($"【UnloadConfirm】 当前放货,任务编号:{input.taskCode}");
|
Logger.Information($"【UnloadConfirm】 当前放货,任务编号:{input.taskCode}");
|
||||||
|
|
||||||
|
WmsDistaskH dis = null;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var dis = _db.Queryable<WmsDistaskH>().Where(P => P.bill_code == input.taskCode).First();
|
dis = _db.Queryable<WmsDistaskH>().Where(P => P.bill_code == input.taskCode).First();
|
||||||
if (dis.area_code == "ZSCJ001")
|
if (dis.area_code == "ZSCJ001")
|
||||||
{
|
{
|
||||||
var flag = await _wareHouseService.Check(dis.endlocation_code, "UNLOAD");
|
var flag = await _wareHouseService.Check(dis.endlocation_code, "UNLOAD");
|
||||||
@@ -402,7 +403,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
Logger.Information($"【UnloadConfirm】 发送电梯{devName}前门开门指令");
|
Logger.Information($"【UnloadConfirm】 发送电梯{devName}前门开门指令");
|
||||||
_ = await _elevatorControlService.SendOpenCloseCmd(devName, 3); //发送电梯前门开门指令
|
_ = await _elevatorControlService.SendOpenCloseCmd(devName, 3); //发送电梯前门开门指令
|
||||||
}
|
}
|
||||||
|
string innerpos = "";
|
||||||
// 3 4号梯需要电梯是当前楼层开门状态就能进
|
// 3 4号梯需要电梯是当前楼层开门状态就能进
|
||||||
bool canEnter = false;
|
bool canEnter = false;
|
||||||
if (devName == "Elevator3" || devName == "Elevator4")
|
if (devName == "Elevator3" || devName == "Elevator4")
|
||||||
@@ -428,8 +429,19 @@ namespace Tnb.WarehouseMgr
|
|||||||
if (elevator.carry_count >= 2)
|
if (elevator.carry_count >= 2)
|
||||||
{
|
{
|
||||||
Logger.LogInformation($"电梯内{devName}已有两托货!");
|
Logger.LogInformation($"电梯内{devName}已有两托货!");
|
||||||
return await ToApiResult(HttpStatusCode.InternalServerError, $"电梯内{devName}已有两托货!");
|
return await ToApiResult(HttpStatusCode.InternalServerError, $"电梯{devName}内已有两托货!");
|
||||||
}
|
}
|
||||||
|
WmsElevatorH wmsElevatorH = await _db.Queryable<WmsElevatorH>().Where(r => r.elevator_id == elevator.device_id).FirstAsync();
|
||||||
|
WmsElevatorcacheArea wmsElevatorcacheArea = await _db.Queryable<WmsElevatorcacheArea>().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;
|
canEnter = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -439,7 +451,8 @@ namespace Tnb.WarehouseMgr
|
|||||||
await _db.Updateable<WmsElevatorH>().SetColumns(r => new WmsElevatorH
|
await _db.Updateable<WmsElevatorH>().SetColumns(r => new WmsElevatorH
|
||||||
{
|
{
|
||||||
is_use = (int)EnumElevatorUseStatus.占用,
|
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();
|
}).Where(r => r.elevator_id == elevator.device_id).ExecuteCommandAsync();
|
||||||
s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.占用;
|
s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.占用;
|
||||||
Logger.Information($"【UnloadConfirm】 {devName}放货成功 状态变更为占用 {s_eleUseStatusDic.GetHashCode()} {s_eleUseStatusDic[elevator.device_id]}");
|
Logger.Information($"【UnloadConfirm】 {devName}放货成功 状态变更为占用 {s_eleUseStatusDic.GetHashCode()} {s_eleUseStatusDic[elevator.device_id]}");
|
||||||
@@ -850,7 +863,8 @@ namespace Tnb.WarehouseMgr
|
|||||||
await _db.Updateable<WmsElevatorH>().SetColumns(r => new WmsElevatorH
|
await _db.Updateable<WmsElevatorH>().SetColumns(r => new WmsElevatorH
|
||||||
{
|
{
|
||||||
is_use = (int)EnumElevatorUseStatus.空闲,
|
is_use = (int)EnumElevatorUseStatus.空闲,
|
||||||
use_tasks = ""
|
use_tasks = "",
|
||||||
|
innerpos = ""
|
||||||
}).Where(r => r.elevator_id == elevator.device_id).ExecuteCommandAsync();
|
}).Where(r => r.elevator_id == elevator.device_id).ExecuteCommandAsync();
|
||||||
s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.空闲;
|
s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.空闲;
|
||||||
Logger.Information($"【TaskCallback】 {devName.Match(@"\d+")}#梯,设备名称:{devName},开始进入关门流程 {devName} 变更为空闲 {s_eleUseStatusDic.GetHashCode()} {s_eleUseStatusDic[elevator.device_id]}");
|
Logger.Information($"【TaskCallback】 {devName.Match(@"\d+")}#梯,设备名称:{devName},开始进入关门流程 {devName} 变更为空闲 {s_eleUseStatusDic.GetHashCode()} {s_eleUseStatusDic[elevator.device_id]}");
|
||||||
@@ -928,6 +942,16 @@ namespace Tnb.WarehouseMgr
|
|||||||
await _wareHouseService.SsxControl_complete(disTask, "UNLOAD");
|
await _wareHouseService.SsxControl_complete(disTask, "UNLOAD");
|
||||||
|
|
||||||
await _wareHouseService.Floor2MechanicalComplete(disTask, "UNLOAD");
|
await _wareHouseService.Floor2MechanicalComplete(disTask, "UNLOAD");
|
||||||
|
// 三楼暂存放货完成时生成到电梯任务
|
||||||
|
if (disTask.area_code == "F")
|
||||||
|
{
|
||||||
|
BasLocation endlocation = await _db.Queryable<BasLocation>().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))}");
|
Logger.Information($"【TaskCallback】 Agv放货完成,任务编号:{string.Join(",", disTasks.Select(x => x.bill_code))}");
|
||||||
}
|
}
|
||||||
@@ -966,7 +990,8 @@ namespace Tnb.WarehouseMgr
|
|||||||
{
|
{
|
||||||
is_use = (int)EnumElevatorUseStatus.空闲,
|
is_use = (int)EnumElevatorUseStatus.空闲,
|
||||||
use_tasks = "",
|
use_tasks = "",
|
||||||
carry_count = 0
|
carry_count = 0,
|
||||||
|
innerpos = ""
|
||||||
})
|
})
|
||||||
.Where(it => it.elevator_id == wmsElevatorH.elevator_id).ExecuteCommandAsync();
|
.Where(it => it.elevator_id == wmsElevatorH.elevator_id).ExecuteCommandAsync();
|
||||||
|
|
||||||
|
|||||||
@@ -1217,6 +1217,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
}
|
}
|
||||||
return await ToApiResult(HttpStatusCode.OK, "成功");
|
return await ToApiResult(HttpStatusCode.OK, "成功");
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 销售发货单
|
/// 销售发货单
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -1243,16 +1244,16 @@ namespace Tnb.WarehouseMgr
|
|||||||
throw new AppFriendlyException($@"子表主键不能为空!", 500);
|
throw new AppFriendlyException($@"子表主键不能为空!", 500);
|
||||||
}
|
}
|
||||||
|
|
||||||
var wmsSaleShippingsDistinct = input.details.Select(r => new
|
//var wmsSaleShippingsDistinct = input.details.Select(r => new
|
||||||
{
|
//{
|
||||||
material_id = r.material_code,
|
// material_id = r.material_code,
|
||||||
code_batch = r.code_batch,
|
// code_batch = r.code_batch,
|
||||||
}).Distinct();
|
//}).Distinct();
|
||||||
if (wmsSaleShippingsDistinct.Count() < input.details.Count)
|
//if (wmsSaleShippingsDistinct.Count() < input.details.Count)
|
||||||
{
|
//{
|
||||||
_LoggerErp2Mes.LogWarning($@"【SaleShipping】表体存在物料和批号重复的明细!");
|
// _LoggerErp2Mes.LogWarning($@"【SaleShipping】表体存在物料和批号重复的明细!");
|
||||||
throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500);
|
// throw new AppFriendlyException($@"表体存在物料和批号重复的明细!", 500);
|
||||||
}
|
//}
|
||||||
|
|
||||||
WmsErpWarehouserelaH wmsErpWarehouserelaH = await db.Queryable<WmsErpWarehouserelaH>().Where(r => r.erp_warehousecode == input.warehouse_code).FirstAsync();
|
WmsErpWarehouserelaH wmsErpWarehouserelaH = await db.Queryable<WmsErpWarehouserelaH>().Where(r => r.erp_warehousecode == input.warehouse_code).FirstAsync();
|
||||||
if (wmsErpWarehouserelaH == null)
|
if (wmsErpWarehouserelaH == null)
|
||||||
@@ -1272,7 +1273,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
await db.Ado.BeginTranAsync();
|
await db.Ado.BeginTranAsync();
|
||||||
|
|
||||||
// 判断是否重复传输
|
// 判断是否重复传输
|
||||||
WmsSaleH wmsSaleHRep = await db.Queryable<WmsSaleH>().Where(r => r.erp_pk == input.erp_pk).FirstAsync();
|
WmsSaleH wmsSaleHRep = await db.Queryable<WmsSaleH>().Where(r => r.erp_bill_code == input.bill_code).FirstAsync();
|
||||||
if (wmsSaleHRep != null)
|
if (wmsSaleHRep != null)
|
||||||
{
|
{
|
||||||
// 判断单据是否已经下发
|
// 判断单据是否已经下发
|
||||||
@@ -1349,7 +1350,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
wmsSaleD.material_name = material.name;
|
wmsSaleD.material_name = material.name;
|
||||||
wmsSaleD.material_specification = material.material_specification;
|
wmsSaleD.material_specification = material.material_specification;
|
||||||
}
|
}
|
||||||
|
wmsSaleD.auxprop = detail.auxprop;
|
||||||
wmsSaleDs.Add(wmsSaleD);
|
wmsSaleDs.Add(wmsSaleD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1553,7 +1554,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
msRawmatTransferinstockD.matname = material.name;
|
msRawmatTransferinstockD.matname = material.name;
|
||||||
msRawmatTransferinstockD.matspecification = material.material_specification;
|
msRawmatTransferinstockD.matspecification = material.material_specification;
|
||||||
}
|
}
|
||||||
|
msRawmatTransferinstockD.auxprop = detail.auxprop;
|
||||||
wmsRawmatTransferinstockDs.Add(msRawmatTransferinstockD);
|
wmsRawmatTransferinstockDs.Add(msRawmatTransferinstockD);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1624,6 +1625,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
wmsTransferInstockD.material_code = material.code;
|
wmsTransferInstockD.material_code = material.code;
|
||||||
wmsTransferInstockD.material_desc = material.material_specification;
|
wmsTransferInstockD.material_desc = material.material_specification;
|
||||||
}
|
}
|
||||||
|
wmsTransferInstockD.auxprop = detail.auxprop;
|
||||||
|
|
||||||
wmsTransferInstockDs.Add(wmsTransferInstockD);
|
wmsTransferInstockDs.Add(wmsTransferInstockD);
|
||||||
}
|
}
|
||||||
@@ -2182,6 +2184,8 @@ namespace Tnb.WarehouseMgr
|
|||||||
wmsRawmatOutstockH.bill_code = code;
|
wmsRawmatOutstockH.bill_code = code;
|
||||||
wmsRawmatOutstockH.create_id = WmsWareHouseConst.ErpUserId;
|
wmsRawmatOutstockH.create_id = WmsWareHouseConst.ErpUserId;
|
||||||
wmsRawmatOutstockH.create_time = DateTime.Now;
|
wmsRawmatOutstockH.create_time = DateTime.Now;
|
||||||
|
wmsRawmatOutstockH.erp_bill_code = input.outstock_order;
|
||||||
|
wmsRawmatOutstockH.warehouse_id = WmsWareHouseConst.WAREHOUSE_YCL_ID;
|
||||||
//wmsRawmatOutstockH.biller = input.biller;
|
//wmsRawmatOutstockH.biller = input.biller;
|
||||||
wmsRawmatOutstockH.department = input.dept_code;
|
wmsRawmatOutstockH.department = input.dept_code;
|
||||||
wmsRawmatOutstockH.erp_pk = input.erp_pk;
|
wmsRawmatOutstockH.erp_pk = input.erp_pk;
|
||||||
@@ -2192,7 +2196,135 @@ namespace Tnb.WarehouseMgr
|
|||||||
WmsRawmatOutstockD wmsRawmatOutstockD = new WmsRawmatOutstockD();
|
WmsRawmatOutstockD wmsRawmatOutstockD = new WmsRawmatOutstockD();
|
||||||
wmsRawmatOutstockD.bill_id = wmsRawmatOutstockH.id;
|
wmsRawmatOutstockD.bill_id = wmsRawmatOutstockH.id;
|
||||||
wmsRawmatOutstockD.unit = detail.unit_code;
|
wmsRawmatOutstockD.unit = detail.unit_code;
|
||||||
var erpExtendField = await db.Queryable<ErpExtendField>().InnerJoin<DictionaryDataEntity>((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<ErpExtendField>().InnerJoin<DictionaryDataEntity>((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<BasMaterial>().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;
|
||||||
|
}
|
||||||
|
wmsRawmatOutstockD.auxprop = detail.auxprop;
|
||||||
|
wmsRawmatOutstockDs.Add(wmsRawmatOutstockD);
|
||||||
|
}
|
||||||
|
|
||||||
|
await db.Insertable(wmsRawmatOutstockH).ExecuteCommandAsync();
|
||||||
|
await db.Insertable(wmsRawmatOutstockDs).ExecuteCommandAsync();
|
||||||
|
|
||||||
|
await db.Ado.CommitTranAsync();
|
||||||
|
|
||||||
|
LoggerErp2Mes.LogInformation($"【RawmatOutstock】成功生成单据:{code}");
|
||||||
|
return await ToApiResult(HttpStatusCode.OK, "成功");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
LoggerErp2Mes.LogError($"【RawmatOutstock】{ex.Message}");
|
||||||
|
LoggerErp2Mes.LogError($"【RawmatOutstock】{ex.StackTrace}");
|
||||||
|
await db.Ado.RollbackTranAsync();
|
||||||
|
return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 材料出库单(批量)
|
||||||
|
/// </summary>
|
||||||
|
[HttpPost, NonUnify, AllowAnonymous]
|
||||||
|
public async Task<Entities.Dto.Outputs.Result> RawmatOutstockBatch(List<ErpRawmatOutstockInput> inputs)
|
||||||
|
{
|
||||||
|
LoggerErp2Mes.LogInformation($"【RawmatOutstock】ERP传入数据:{JsonConvert.SerializeObject(inputs)}");
|
||||||
|
var db = _repository.AsSugarClient();
|
||||||
|
|
||||||
|
|
||||||
|
List<string> error_erpbillcodes = new List<string>();
|
||||||
|
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<WmsRawmatOutstockH>().Where(r => r.erp_bill_code == input.outstock_order).FirstAsync();
|
||||||
|
if (wmsRawmatOutstockHRep != null)
|
||||||
|
{
|
||||||
|
// 判断单据是否已经下发
|
||||||
|
List<WmsRawmatOutstockD> _wmsRawmatOutstockDs = await db.Queryable<WmsRawmatOutstockD>().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<WmsRawmatOutstockH>().Where(r => r.id == wmsRawmatOutstockHRep.id).ExecuteCommandAsync();
|
||||||
|
await db.Deleteable<WmsRawmatOutstockD>().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<WmsRawmatOutstockD> wmsRawmatOutstockDs = new List<WmsRawmatOutstockD>();
|
||||||
|
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<ErpExtendField>().InnerJoin<DictionaryDataEntity>((a, b) => a.table_id == b.Id).Where((a, b) => b.EnCode == detail.unit_code).Select((a, b) => b).FirstAsync();
|
||||||
if (erpExtendField != null)
|
if (erpExtendField != null)
|
||||||
{
|
{
|
||||||
wmsRawmatOutstockD.unit = erpExtendField.EnCode;
|
wmsRawmatOutstockD.unit = erpExtendField.EnCode;
|
||||||
@@ -2229,20 +2361,26 @@ namespace Tnb.WarehouseMgr
|
|||||||
await db.Ado.CommitTranAsync();
|
await db.Ado.CommitTranAsync();
|
||||||
|
|
||||||
LoggerErp2Mes.LogInformation($"【RawmatOutstock】成功生成单据:{code}");
|
LoggerErp2Mes.LogInformation($"【RawmatOutstock】成功生成单据:{code}");
|
||||||
return await ToApiResult(HttpStatusCode.OK, "成功");
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
error_erpbillcodes.Add($"bip单据号{input.outstock_order}: {ex.Message}");
|
||||||
LoggerErp2Mes.LogError($"【RawmatOutstock】{ex.Message}");
|
LoggerErp2Mes.LogError($"【RawmatOutstock】{ex.Message}");
|
||||||
LoggerErp2Mes.LogError($"【RawmatOutstock】{ex.StackTrace}");
|
LoggerErp2Mes.LogError($"【RawmatOutstock】{ex.StackTrace}");
|
||||||
await db.Ado.RollbackTranAsync();
|
await db.Ado.RollbackTranAsync();
|
||||||
return await ToApiResult(HttpStatusCode.InternalServerError, ex.Message);
|
|
||||||
}
|
}
|
||||||
finally
|
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, "成功");
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 盘点单
|
/// 盘点单
|
||||||
@@ -2332,7 +2470,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
wmsInventorycheckH.biller = input.biller;
|
wmsInventorycheckH.biller = input.biller;
|
||||||
wmsInventorycheckH.erp_bill_code = input.erp_bill_code;
|
wmsInventorycheckH.erp_bill_code = input.erp_bill_code;
|
||||||
wmsInventorycheckH.erp_pk = input.erp_pk;
|
wmsInventorycheckH.erp_pk = input.erp_pk;
|
||||||
|
wmsInventorycheckH.check_date = input.check_date;
|
||||||
await db.Insertable(wmsInventorycheckH).ExecuteCommandAsync();
|
await db.Insertable(wmsInventorycheckH).ExecuteCommandAsync();
|
||||||
|
|
||||||
|
|
||||||
@@ -2373,7 +2511,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
_LoggerErp2Mes.LogWarning($@"【Inventorycheck】表体明细中单位{detail.unit_code}在wms系统中未找到!");
|
_LoggerErp2Mes.LogWarning($@"【Inventorycheck】表体明细中单位{detail.unit_code}在wms系统中未找到!");
|
||||||
throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到!", 500);
|
throw new AppFriendlyException($@"表体明细中单位{detail.unit_code}在wms系统中未找到!", 500);
|
||||||
}
|
}
|
||||||
|
wmsInventorycheckD.auxprop = detail.auxprop;
|
||||||
wmsInventorycheckDs.Add(wmsInventorycheckD);
|
wmsInventorycheckDs.Add(wmsInventorycheckD);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -76,6 +76,8 @@ namespace Tnb.WarehouseMgr
|
|||||||
private readonly IWmsCarryBindService _wmsCarryBindService;
|
private readonly IWmsCarryBindService _wmsCarryBindService;
|
||||||
private readonly IWmsCarryUnbindService _wmsCarryUnbindService;
|
private readonly IWmsCarryUnbindService _wmsCarryUnbindService;
|
||||||
private readonly IWmsOutinStockDetailService _wmsOutinStockDetailService;
|
private readonly IWmsOutinStockDetailService _wmsOutinStockDetailService;
|
||||||
|
private static ISqlSugarClient db_agvElevatorTaskExceptionHandles;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -2564,15 +2566,11 @@ namespace Tnb.WarehouseMgr
|
|||||||
#region 电梯第三次改动
|
#region 电梯第三次改动
|
||||||
|
|
||||||
// 一托下的时候切换首选电梯
|
// 一托下的时候切换首选电梯
|
||||||
//if (disTaskIds.Count == 1)
|
if (disTaskIds.Count == 1)
|
||||||
//{
|
{
|
||||||
// 选择另一个电梯座位首选电梯
|
await ChangeSelectedElevator(db);
|
||||||
await db.Updateable<BasFactoryConfig>().SetColumns(r => r.value == (r.value == "Elevator3" ? "Elevator4" : "Elevator3"))
|
}
|
||||||
.Where(r => r.key == "floor3FirstSelectElevator").ExecuteCommandAsync();
|
|
||||||
// 剩余可放托数
|
|
||||||
await db.Updateable<BasFactoryConfig>().SetColumns(r => r.value == "2")
|
|
||||||
.Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync();
|
|
||||||
//}
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
@@ -4474,5 +4472,322 @@ namespace Tnb.WarehouseMgr
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 电梯第三次改动 生成Agv到电梯任务
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="args"></param>
|
||||||
|
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<BasFactoryConfig>().Where(p => p.key == "floor3outstock").FirstAsync();
|
||||||
|
if (floor3outstock != null && floor3outstock.value == "0")
|
||||||
|
return;
|
||||||
|
await db_agvElevatorTaskExceptionHandles.Ado.BeginTranAsync();
|
||||||
|
// 获取暂存区需要生成任务的库位
|
||||||
|
List<BasLocation> agvElevatorStartLocs = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>()
|
||||||
|
.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<IGrouping<string, BasLocation>> elevatorTaskGroup = agvElevatorStartLocs.GroupBy(r => r.region_id).ToList();
|
||||||
|
|
||||||
|
foreach (IGrouping<string, BasLocation> group in elevatorTaskGroup)
|
||||||
|
{
|
||||||
|
List<BasLocation> locs = group.ToList();
|
||||||
|
LoggerAgvElevatorTask.LogWarning($"即将下发{locs.Count}条任务");
|
||||||
|
for (int i = 0; i < locs.Count; i++)
|
||||||
|
{
|
||||||
|
|
||||||
|
// 交替选择缓存区库位
|
||||||
|
var YCLInnerTransfer = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().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<BasLocation> locations = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>()
|
||||||
|
.InnerJoin<WmsElevatorcacheArea>((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<BasFactoryConfig>().Where(p => p.key == "floor3FirstSelectElevatorTasknums").FirstAsync();
|
||||||
|
|
||||||
|
切换发货区 = YCLInnerTransfer.value == "3楼发货左" ? "3楼发货右" : "3楼发货左";
|
||||||
|
LoggerAgvElevatorTask.LogInformation($"再次交替到{切换发货区} 进行发货");
|
||||||
|
|
||||||
|
await db_agvElevatorTaskExceptionHandles.Updateable<BasFactoryConfig>().SetColumns(r => r.value == 切换发货区)
|
||||||
|
.Where(r => r.key == "floor3CurOutCacheLocation").ExecuteCommandAsync();
|
||||||
|
locations = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>()
|
||||||
|
.InnerJoin<WmsElevatorcacheArea>((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<BasFactoryConfig>().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<WmsElevatorH>().Where(r => r.elevator_code == 切换电梯).FirstAsync();
|
||||||
|
// 仅切换电梯后 如果一托任务在等第二托时要做特殊处理
|
||||||
|
if (_wmsElevatorH.task_nums == 1)
|
||||||
|
{
|
||||||
|
await ChangeSelectedElevator(db_agvElevatorTaskExceptionHandles, "1");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 选择另一个电梯座位首选电梯
|
||||||
|
await ChangeSelectedElevator(db_agvElevatorTaskExceptionHandles);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
List<WmsCarryH> wmsCarryHs = await db_agvElevatorTaskExceptionHandles.Queryable<WmsCarryH>().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<BasLocation> outLocations = await db_agvElevatorTaskExceptionHandles.Queryable<BasLocation>()
|
||||||
|
.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<WmsPointH>().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<BasFactoryConfig>().Where(p => p.key == "floor3FirstSelectElevator").FirstAsync();
|
||||||
|
var floor3FirstSelectElevatorTasknums = await db_agvElevatorTaskExceptionHandles.Queryable<BasFactoryConfig>().Where(p => p.key == "floor3FirstSelectElevatorTasknums").FirstAsync();
|
||||||
|
|
||||||
|
wmsElevatorH = await db_agvElevatorTaskExceptionHandles.Queryable<WmsElevatorH>().Where(r => r.elevator_code == floor3FirstSelectElevator.value).FirstAsync();
|
||||||
|
elevatorSno = wmsElevatorH.elevator_code.Replace("Elevator", "");
|
||||||
|
|
||||||
|
|
||||||
|
// 检查有没有同时从同个暂存区分区发到同个电梯任务
|
||||||
|
//if (wmsElevatorH.task_nums + wmsElevatorH.carry_count > 0)
|
||||||
|
//{
|
||||||
|
// List<string> currentAreaLocs = await db_agvElevatorTaskExceptionHandles.Queryable<WmsElevatorcacheArea>().Where(r => r.name == 切换发货区).Select(r => r.location_code).ToListAsync();
|
||||||
|
// // 同个暂存分区同个电梯的托盘
|
||||||
|
// List<string> _carrys = await db_agvElevatorTaskExceptionHandles.Queryable<WmsPretaskH>()
|
||||||
|
// .InnerJoin<WmsPretaskH>((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<BasFactoryConfig>().SetColumns(r => r.value == floor3FirstSelectElevatorTasknums.value)
|
||||||
|
.Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List<WmsPointH> wmsPointHs = await db_agvElevatorTaskExceptionHandles.Queryable<WmsPointH>().Where(it => it.status == 1).ToListAsync();
|
||||||
|
List<WmsPointH> points = new List<WmsPointH>();
|
||||||
|
|
||||||
|
// 到电梯
|
||||||
|
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<WmsPretaskH> 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<BasLocation>().SingleAsync(it => it.id == startloc.id);
|
||||||
|
{
|
||||||
|
//载具加锁,增加库位信息
|
||||||
|
_ = await db_agvElevatorTaskExceptionHandles.Updateable<WmsCarryH>().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<BasFactoryConfig>().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<BasLocation>().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<BasFactoryConfig>().Where(r => r.key == "floor3FirstSelectElevator").FirstAsync();
|
||||||
|
string elevator = floor3FirstSelectElevator.value == "Elevator3" ? "Elevator4" : "Elevator3";
|
||||||
|
LoggerAgvElevatorTask.LogInformation($"重置首选电梯为{elevator}");
|
||||||
|
// 选择另一个电梯座位首选电梯
|
||||||
|
await db.Updateable<BasFactoryConfig>().SetColumns(r => r.value == elevator)
|
||||||
|
.Where(r => r.key == "floor3FirstSelectElevator").ExecuteCommandAsync();
|
||||||
|
|
||||||
|
await db.Updateable<BasFactoryConfig>().SetColumns(r => r.value == maxposcount)
|
||||||
|
.Where(r => r.key == "floor3FirstSelectElevatorTasknums").ExecuteCommandAsync();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -389,8 +389,8 @@ namespace Tnb.WarehouseMgr
|
|||||||
thirdWebapiRecord.third_name = WmsWareHouseConst.BIP;
|
thirdWebapiRecord.third_name = WmsWareHouseConst.BIP;
|
||||||
thirdWebapiRecord.name = "调拨出库";
|
thirdWebapiRecord.name = "调拨出库";
|
||||||
thirdWebapiRecord.method = "POST";
|
thirdWebapiRecord.method = "POST";
|
||||||
thirdWebapiRecord.url = config.value + "uapws/rest/transOut/save";
|
//thirdWebapiRecord.url = config.value + "uapws/rest/transOut/save";
|
||||||
// thirdWebapiRecord.url = WmsWareHouseConst.BIP_DOMAIN + "uapws/rest/transIn/save";
|
thirdWebapiRecord.url = WmsWareHouseConst.BIP_DOMAIN + "uapws/rest/transIn/save";
|
||||||
thirdWebapiRecord.request_data = JsonConvert.SerializeObject(requestData);
|
thirdWebapiRecord.request_data = JsonConvert.SerializeObject(requestData);
|
||||||
thirdWebapiRecord.create_time = DateTime.Now;
|
thirdWebapiRecord.create_time = DateTime.Now;
|
||||||
await _db.Insertable(thirdWebapiRecord).ExecuteCommandAsync();
|
await _db.Insertable(thirdWebapiRecord).ExecuteCommandAsync();
|
||||||
|
|||||||
@@ -359,7 +359,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
.OrderBy("is_lock, task_nums, location_code").ToList();
|
.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<BasLocation>().Where(r => _wareHouseService.GetFloor1WXSGWOutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0")
|
endLocations = _db.Queryable<BasLocation>().Where(r => _wareHouseService.GetFloor1WXSGWOutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0")
|
||||||
@@ -383,7 +383,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
endLocation = await _db.Queryable<BasLocation>().Where(r => _wareHouseService.GetFloor1GLSGWOutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0").OrderBy("is_lock, task_nums, location_code").FirstAsync();
|
endLocation = await _db.Queryable<BasLocation>().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<BasLocation>().Where(r => _wareHouseService.GetFloor1WXSGWOutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0").OrderBy("is_lock, task_nums, location_code").FirstAsync();
|
endLocation = await _db.Queryable<BasLocation>().Where(r => _wareHouseService.GetFloor1WXSGWOutstockLocation().Contains(r.id) && r.is_lock == 0 && r.is_use == "0").OrderBy("is_lock, task_nums, location_code").FirstAsync();
|
||||||
@@ -1676,7 +1676,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
List<WmsCarryH> wmsCarryHs = _db.Queryable<WmsCarryH>().Where(r => r.work_station == input.work_station && r.is_lock == 0 && r.carrystd_id == WmsWareHouseConst.CARRY_LJSTD_ID
|
List<WmsCarryH> wmsCarryHs = _db.Queryable<WmsCarryH>().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();
|
&& (r.carry_status == ((int)(EnumCarryStatus.占用)).ToString() || r.carry_status == ((int)(EnumCarryStatus.齐套)).ToString())).ToList();
|
||||||
if (string.IsNullOrEmpty(input.work_station))
|
if (string.IsNullOrEmpty(input.work_station))
|
||||||
{
|
{
|
||||||
@@ -2101,9 +2101,9 @@ namespace Tnb.WarehouseMgr
|
|||||||
{
|
{
|
||||||
throw new AppFriendlyException($"载具{input.carry_code}已锁定!", 500);
|
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)
|
if (wmsCarryH.carrystd_id != WmsWareHouseConst.CARRY_ZYXCSTD_ID && wmsCarryH.carrystd_id != WmsWareHouseConst.CARRY_ZYLJSTD_ID)
|
||||||
@@ -2138,7 +2138,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
throw new AppFriendlyException($@"没有可以入库的库位", 500);
|
throw new AppFriendlyException($@"没有可以入库的库位", 500);
|
||||||
}
|
}
|
||||||
|
|
||||||
BasLocation startLocation = await _db.Queryable<BasLocation>().Where(r => r.id == wmsCarryH.location_id).FirstAsync();
|
BasLocation startLocation = await _db.Queryable<BasLocation>().Where(r => r.location_code == input.startlocation_code).FirstAsync();
|
||||||
|
|
||||||
CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput();
|
CommonCreatePretaskInput commonCreatePretaskInput = new CommonCreatePretaskInput();
|
||||||
commonCreatePretaskInput.startlocation_id = startLocation.id;
|
commonCreatePretaskInput.startlocation_id = startLocation.id;
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
string wmsPurchaseOrderHId = wmsPurchaseH?.erp_bill_code ?? "";
|
string wmsPurchaseOrderHId = wmsPurchaseH?.erp_bill_code ?? "";
|
||||||
WmsPurchaseOrderH wmsPurchaseOrderH = await _db.Queryable<WmsPurchaseOrderH>().SingleAsync(x => x.id == wmsPurchaseOrderHId);
|
WmsPurchaseOrderH wmsPurchaseOrderH = await _db.Queryable<WmsPurchaseOrderH>().SingleAsync(x => x.id == wmsPurchaseOrderHId);
|
||||||
WmsPurchaseOrderD wmsPurchaseOrderDs = await _db.Queryable<WmsPurchaseOrderD>().FirstAsync(x => x.fk_wms_purchase_order_id == wmsPurchaseOrderHId);
|
WmsPurchaseOrderD wmsPurchaseOrderDs = await _db.Queryable<WmsPurchaseOrderD>().FirstAsync(x => x.fk_wms_purchase_order_id == wmsPurchaseOrderHId);
|
||||||
BasWarehouse basWarehouse = await _db.Queryable<BasWarehouse>().SingleAsync(x=>x.id==instock.warehouse_id);
|
//BasWarehouse basWarehouse = await _db.Queryable<BasWarehouse>().SingleAsync(x=>x.id==instock.warehouse_id);
|
||||||
|
|
||||||
List<String> materialIds = allInstockDetails.Select(x => x.material_id).Distinct().ToList();
|
List<String> materialIds = allInstockDetails.Select(x => x.material_id).Distinct().ToList();
|
||||||
List<String> unitCodes = allInstockDetails.Select(x => x.unit_id).Distinct().ToList();
|
List<String> unitCodes = allInstockDetails.Select(x => x.unit_id).Distinct().ToList();
|
||||||
@@ -134,6 +134,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
tableIds.Add(_userManager.UserId);
|
tableIds.Add(_userManager.UserId);
|
||||||
tableIds.Add(WmsWareHouseConst.AdministratorOrgId);
|
tableIds.Add(WmsWareHouseConst.AdministratorOrgId);
|
||||||
tableIds.Add(instock.warehouse_id);
|
tableIds.Add(instock.warehouse_id);
|
||||||
|
tableIds.Add("1001A11000000002OOGU");
|
||||||
tableIds.AddRange(materialIds);
|
tableIds.AddRange(materialIds);
|
||||||
tableIds.Add(supplierId);
|
tableIds.Add(supplierId);
|
||||||
tableIds.Add(tranTypeId);
|
tableIds.Add(tranTypeId);
|
||||||
@@ -177,9 +178,10 @@ namespace Tnb.WarehouseMgr
|
|||||||
["castunitid"] = erpExtendFields.Find(x => x.table_id == (unitDatas.Find(x => x.EnCode == item.unit_id)?.Id ?? ""))?.cunitid ?? "",
|
["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 ?? "",
|
["cbodytranstypecode"] = erpExtendFields.Find(x => x.table_id == tranTypeId)?.transaction_type_id ?? "",
|
||||||
// ["cbodywarehouseid"] = erpExtendFields.Find(x => x.table_id == instock.warehouse_id)?.cotherwhid ?? "",
|
// ["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 ?? "",
|
||||||
["cgeneralbid"] = "",
|
["cbodywarehouseid"] = "1001A11000000002OOGU",
|
||||||
["cgeneralhid"] = "",
|
["cgeneralbid"] = null,
|
||||||
|
["cgeneralhid"] = null,
|
||||||
["cmaterialoid"] = erpExtendFields.Find(x => x.table_id == item.material_id)?.cmaterialoid ?? "",
|
["cmaterialoid"] = erpExtendFields.Find(x => x.table_id == item.material_id)?.cmaterialoid ?? "",
|
||||||
["cmaterialvid"] = erpExtendFields.Find(x => x.table_id == item.material_id)?.cmaterialvid ?? "",
|
["cmaterialvid"] = erpExtendFields.Find(x => x.table_id == item.material_id)?.cmaterialvid ?? "",
|
||||||
["corpoid"] = erpOrg.corpoid,
|
["corpoid"] = erpOrg.corpoid,
|
||||||
@@ -192,7 +194,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
["nnum"] = item.qty,
|
["nnum"] = item.qty,
|
||||||
["nshouldnum"] = item.pr_qty,
|
["nshouldnum"] = item.pr_qty,
|
||||||
// ["pk_creqwareid"] = erpExtendFields.Find(x => x.table_id == instock.warehouse_id)?.cotherwhid ?? "",
|
// ["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_group"] = erpOrg.pk_group,
|
||||||
["pk_org"] = erpOrg.pk_org,
|
["pk_org"] = erpOrg.pk_org,
|
||||||
["pk_org_v"] = erpOrg.pk_org_v,
|
["pk_org_v"] = erpOrg.pk_org_v,
|
||||||
|
|||||||
@@ -192,8 +192,8 @@ namespace Tnb.WarehouseMgr
|
|||||||
thirdWebapiRecord.third_name = WmsWareHouseConst.BIP;
|
thirdWebapiRecord.third_name = WmsWareHouseConst.BIP;
|
||||||
thirdWebapiRecord.name = "转库单";
|
thirdWebapiRecord.name = "转库单";
|
||||||
thirdWebapiRecord.method = "POST";
|
thirdWebapiRecord.method = "POST";
|
||||||
thirdWebapiRecord.url = config.value + "uapws/rest/whstrans/save";
|
//thirdWebapiRecord.url = config.value + "uapws/rest/whstrans/save";
|
||||||
// thirdWebapiRecord.url = WmsWareHouseConst.BIP_DOMAIN + "uapws/rest/transIn/save";
|
thirdWebapiRecord.url = WmsWareHouseConst.BIP_DOMAIN + "uapws/rest/transIn/save";
|
||||||
thirdWebapiRecord.request_data = JsonConvert.SerializeObject(erpRequestData);
|
thirdWebapiRecord.request_data = JsonConvert.SerializeObject(erpRequestData);
|
||||||
thirdWebapiRecord.create_time = DateTime.Now;
|
thirdWebapiRecord.create_time = DateTime.Now;
|
||||||
await _db.Insertable(thirdWebapiRecord).ExecuteCommandAsync();
|
await _db.Insertable(thirdWebapiRecord).ExecuteCommandAsync();
|
||||||
|
|||||||
@@ -1657,6 +1657,10 @@ public class FormDataParsing : ITransient
|
|||||||
case JnpfKeyConst.POPUPTABLESELECT:
|
case JnpfKeyConst.POPUPTABLESELECT:
|
||||||
case JnpfKeyConst.POPUPSELECT:
|
case JnpfKeyConst.POPUPSELECT:
|
||||||
{
|
{
|
||||||
|
//if (model.relationField == model.showField)
|
||||||
|
//{
|
||||||
|
// break;
|
||||||
|
//}
|
||||||
// 获取远端数据
|
// 获取远端数据
|
||||||
var dynamic = await _dataInterfaceService.GetInfo(model.interfaceId);
|
var dynamic = await _dataInterfaceService.GetInfo(model.interfaceId);
|
||||||
if (dynamic == null) break;
|
if (dynamic == null) break;
|
||||||
|
|||||||
Reference in New Issue
Block a user