空载具入库,获取目标库位集合代码还原,用于测试CTU
This commit is contained in:
@@ -10,5 +10,7 @@ namespace Tnb.WarehouseMgr.Entities.Dto.Queries
|
||||
{
|
||||
public string taskCode { get; set; }
|
||||
public string endlocation_id { get; set; }
|
||||
public string startlocation_id { get; set; }
|
||||
public string sourceName { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ public partial class WmsElevatorH : BaseEntity<string>
|
||||
/// 电梯ID
|
||||
/// </summary>
|
||||
public string elevator_id { get; set; } = string.Empty;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 电梯编号
|
||||
/// </summary>
|
||||
|
||||
@@ -15,6 +15,7 @@ namespace Tnb.WarehouseMgr
|
||||
private static readonly Lazy<Task> initializationTask;
|
||||
private static SqlSugarScope context;
|
||||
private readonly ISqlSugarClient _db;
|
||||
public static Dictionary<string, int> s_eleUseStatusDic = new();
|
||||
|
||||
static DevServBase()
|
||||
{
|
||||
@@ -57,9 +58,13 @@ namespace Tnb.WarehouseMgr
|
||||
protected async Task<WmsElevatorH> FindElevatorFromPars(ElevagorInfoQuery input)
|
||||
{
|
||||
var ele = await _db.CopyNew().Queryable<WmsElevatorH>().InnerJoin<WmsElevatorD>((a, b) => a.id == b.bill_id)
|
||||
.InnerJoin<WmsDistaskH>((a, b, c) => b.location_code == c.endlocation_code)
|
||||
.InnerJoin<WmsDistaskH>((a, b, c) => b.location_code == c.endlocation_code || b.location_code == c.startpoint_code)
|
||||
.Where((a, b, c) => a.enabled == 1)
|
||||
.WhereIF(!SqlFunc.IsNullOrEmpty(input.taskCode), (a, b, c) => c.bill_code == input.taskCode)
|
||||
.WhereIF(!SqlFunc.IsNullOrEmpty(input.endlocation_id), (a, b, c) => b.location_id == input.endlocation_id)
|
||||
.WhereIF(!SqlFunc.IsNullOrEmpty(input.startlocation_id), (a, b, c) => b.location_id == input.startlocation_id)
|
||||
.WhereIF(!SqlFunc.IsNullOrEmpty(input.sourceName) && SqlFunc.StartsWith("DT-R", input.sourceName), (a, b, c) => c.startpoint_code == input.sourceName)
|
||||
.WhereIF(!SqlFunc.IsNullOrEmpty(input.sourceName) && SqlFunc.StartsWith("DT-C", input.sourceName), (a, b, c) => c.endpoint_code == input.sourceName)
|
||||
.Select((a, b, c) => new WmsElevatorH
|
||||
{
|
||||
bill_code = c.bill_code,
|
||||
|
||||
@@ -45,7 +45,7 @@ namespace Tnb.WarehouseMgr
|
||||
private readonly IElevatorControlService _elevatorControlService;
|
||||
private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build<ElevatorControlConfiguration>();
|
||||
private readonly ILoggerFactory _loggerFactory;
|
||||
public static Dictionary<string, int> s_eleUseStatusDic = new();
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -108,30 +108,32 @@ namespace Tnb.WarehouseMgr
|
||||
}, true)
|
||||
.FirstAsync();*/
|
||||
Logger.Information($"当前取货,子任务编号:{input.taskCode}");
|
||||
ElevagorInfoQuery q = new() { taskCode =input.taskCode };
|
||||
|
||||
ElevagorInfoQuery q = new() { taskCode = input.taskCode };
|
||||
WmsElevatorH elevator = await FindElevatorFromPars(q);
|
||||
if (elevator.IsNull())
|
||||
{
|
||||
Logger.Error("未找到匹配的电梯任务", new Exception($"根据参数,sourceName:{input.sourceName},taskCode:{input.taskCode},未找到匹配的电梯任务"));
|
||||
return await ToApiResult(HttpStatusCode.InternalServerError, $"根据参数,sourceName:{input.sourceName},taskCode:{input.taskCode},未找到匹配的电梯任务");
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
if (s_elevatorMap.TryGetValue(elevator.device_id, out object? elevatorCode))
|
||||
{
|
||||
s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.空闲;
|
||||
string devName = elevatorCode?.ToString();
|
||||
Logger.Information($"获取设备:{devName},状态");
|
||||
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($"电梯当前状态->系统状态:{sysStatus.ToEnum<EnumSysStatus>()},运行状态:{runStatus.ToEnum<EnumRunStatus>()},Agv状态:{agvStatus.ToEnum<EnumAgvStatus>()},当前楼层:{floorNo}");
|
||||
{
|
||||
var curFloor = await GetRealFloor(elevator.end_floor);
|
||||
Logger.Information($"目标楼层:{curFloor},电梯当前楼层:{floorNo}");
|
||||
Logger.Information($"当前放货设备ID:{elevator.device_id}");
|
||||
var loadedStatus = s_eleUseStatusDic[elevator.device_id] == 1 ? "完成" : "未完成";
|
||||
Logger.Information($"{devName.Match(@"\d+")}#梯,放货-> {loadedStatus}");
|
||||
|
||||
/* Logger.Information($"目标楼层:{curFloor},电梯当前楼层:{floorNo}");
|
||||
Logger.Information($"当前取货设备ID:{elevator.device_id}");
|
||||
var loadedStatus = s_eleUseStatusDic[elevator.device_id] == 1 ? "完成" : "未完成";
|
||||
Logger.Information($"{devName.Match(@"\d+")}#梯,取货-> {loadedStatus}");
|
||||
*/
|
||||
if (s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.空闲 && curFloor != floorNo)
|
||||
{
|
||||
_ = await _elevatorControlService.CallLift(devName, elevator.end_floor, CancellationToken.None);
|
||||
@@ -144,10 +146,11 @@ namespace Tnb.WarehouseMgr
|
||||
{
|
||||
_ = await _elevatorControlService.SendOpenCloseCmd(devName, 3); //发送电梯前门开门指令
|
||||
}
|
||||
if (doorStatus == (int)EnumDoorStatus.开门到位保持 && s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.占用)
|
||||
{
|
||||
await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!");
|
||||
}
|
||||
//if (doorStatus == (int)EnumDoorStatus.开门到位保持 && s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.占用)
|
||||
//{
|
||||
// Logger.Information($"{devName.Match(@"\d+")}#梯,任务未完成");
|
||||
// await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!");
|
||||
//}
|
||||
|
||||
if (sysStatus.ToEnum<EnumSysStatus>() == EnumSysStatus.正常状态 && runStatus.ToEnum<EnumRunStatus>() == EnumRunStatus.停梯
|
||||
&& doorStatus == (int)EnumDoorStatus.开门到位保持)
|
||||
@@ -204,7 +207,6 @@ namespace Tnb.WarehouseMgr
|
||||
{
|
||||
string devName = elevatorCode?.ToString();
|
||||
Logger.Information($"获取设备:{devName},状态");
|
||||
await Task.Delay(1000);
|
||||
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(devName, _eleCtlCfg.tags, CancellationToken.None);//elevator.elevator_code
|
||||
Logger.Information($"电梯当前状态->系统状态:{sysStatus.ToEnum<EnumSysStatus>()},运行状态:{runStatus},门状态:{doorStatus},Agv状态:{agvStatus},当前楼层:{floorNo}");
|
||||
//判断Agv电梯是否进入状态
|
||||
@@ -229,10 +231,11 @@ namespace Tnb.WarehouseMgr
|
||||
Logger.Information($"当前楼层:{curFloor},电梯所在楼层:{floorNo}");
|
||||
if (doorStatus == (int)EnumDoorStatus.开门到位保持 && s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.占用)
|
||||
{
|
||||
await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!");
|
||||
Logger.Information($"{devName.Match(@"\d+")}#梯,任务未完成");
|
||||
return await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!");
|
||||
}
|
||||
//电梯到达目标楼层后,判断当前电梯门状态是否为开门到位保持状态
|
||||
if (doorStatus != (int)EnumDoorStatus.开门到位保持 && curFloor == floorNo) //判断目标楼层与电梯所在楼层在同一层才可开门放货
|
||||
if (s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.空闲 && doorStatus != (int)EnumDoorStatus.开门到位保持 && curFloor == floorNo) //判断目标楼层与电梯所在楼层在同一层才可开门放货
|
||||
{
|
||||
_ = await _elevatorControlService.SendOpenCloseCmd(devName, 3); //发送电梯前门开门指令
|
||||
}
|
||||
@@ -241,6 +244,7 @@ namespace Tnb.WarehouseMgr
|
||||
&& doorStatus == (int)EnumDoorStatus.开门到位保持)
|
||||
{
|
||||
s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.占用;
|
||||
Logger.Information($"当前电梯状态:{s_eleUseStatusDic[elevator.device_id].ToEnum<EnumElevatorUseStatus>().ToString()}");
|
||||
return await ToApiResult(HttpStatusCode.OK, "成功");
|
||||
}
|
||||
}
|
||||
@@ -364,7 +368,7 @@ namespace Tnb.WarehouseMgr
|
||||
//根据Agv传递的参数获取,对应的电梯
|
||||
ElevagorInfoQuery q = new() { taskCode = input.taskCode };
|
||||
WmsElevatorH elevator = await FindElevatorFromPars(q);
|
||||
s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.空闲;
|
||||
//s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.空闲;
|
||||
Logger.Information($"当前取货设备ID:{elevator.device_id}");
|
||||
//根据disTask StartLocationId 起始库位关联电梯获取设备ID location_code.Continas("")
|
||||
var devName = s_elevatorMap[elevator.device_id]?.ToString();
|
||||
|
||||
@@ -197,11 +197,9 @@ namespace Tnb.WarehouseMgr
|
||||
["TagName"] = "DoorExecute",
|
||||
["Value"] = value.ToString()
|
||||
};
|
||||
var eleStatusMap = await RedisHelper.HGetAllAsync(devName);
|
||||
try
|
||||
{
|
||||
_ = await HttpClientHelper.GetAsync(_elevatorCtlCfg.WriteTagUrl, pars: dicCommand);
|
||||
//flag = await RedisHelper.HSetAsync(devName, ElevatorConsts.DoorExecute, value);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
@@ -488,6 +486,7 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
var tasks = ParallelWriteTagAsync(input);
|
||||
var writeRes = await Task.WhenAll(tasks);
|
||||
|
||||
var timedTaskSvc = _backgudSvc as TimedTaskBackgroundService;
|
||||
if (timedTaskSvc != null)
|
||||
{
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System.Diagnostics;
|
||||
using System.Dynamic;
|
||||
using System.Linq.Expressions;
|
||||
using Aliyun.OSS;
|
||||
using JNPF;
|
||||
using JNPF.Common.Contracts;
|
||||
using JNPF.Common.Core.Manager;
|
||||
@@ -233,7 +234,7 @@ namespace Tnb.WarehouseMgr
|
||||
/// 判断CTU是否可以放货
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
/*[HttpPost]
|
||||
public async Task CheckPut(CheckPutInput input)
|
||||
{
|
||||
Dictionary<string, string[]> dic = new Dictionary<string, string[]>();
|
||||
@@ -252,7 +253,7 @@ namespace Tnb.WarehouseMgr
|
||||
bool result = res != null && res["Value"] != null ? res.Value<bool>("Value") : false;
|
||||
if (!result)
|
||||
throw new AppFriendlyException("点位" + input.point_code + "不可放", 500);
|
||||
}
|
||||
}*/
|
||||
|
||||
/// <summary>
|
||||
/// 生成任务执行
|
||||
@@ -438,25 +439,9 @@ namespace Tnb.WarehouseMgr
|
||||
var agvDTTasks = disTasks.Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) &&
|
||||
!it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList();
|
||||
|
||||
foreach (var task in agvDTTasks)
|
||||
{
|
||||
ElevagorInfoQuery q = new() { endlocation_id = task.endlocation_id };
|
||||
var e = await FindElevatorFromPars(q);
|
||||
if (e != null)
|
||||
{
|
||||
task.device_id = e.device_id;
|
||||
}
|
||||
}
|
||||
await SetEleDevId(agvDTTasks);
|
||||
|
||||
/*foreach (var at in agvDTTasks)
|
||||
{
|
||||
var ele = elevatorList.Find(x => x.location_code == at.endlocation_code);
|
||||
Logger.Information($"ele.elevator_id:{ele?.elevator_id},elevator_code:{ele?.elevator_code}");
|
||||
if (ele != null)
|
||||
{
|
||||
at.device_id = ele.elevator_id;
|
||||
}
|
||||
}*/
|
||||
|
||||
|
||||
List<(string endlocation_code, string device_id, string id, int start_floor)> endLocCodes = agvDTTasks
|
||||
.Select(it => (it.endlocation_code, it.device_id, it.id, it.start_floor)).ToList();
|
||||
@@ -466,7 +451,7 @@ namespace Tnb.WarehouseMgr
|
||||
{
|
||||
if (endLocCodes.Select(x => x.device_id).All(x => !x.IsNullOrWhiteSpace()))
|
||||
{
|
||||
Logger.Information("呼梯操作");
|
||||
Logger.Information($"呼梯操作");
|
||||
_ = CallingLanding(endLocCodes);
|
||||
}
|
||||
else
|
||||
@@ -482,6 +467,7 @@ namespace Tnb.WarehouseMgr
|
||||
if (elevatorTasks?.Count > 0)
|
||||
{
|
||||
Logger.Information($"当前电梯任务数:{elevatorTasks?.Count ?? 0}");
|
||||
await SetEleDevId(elevatorTasks);
|
||||
foreach (WmsDistaskH? elevatorTask in elevatorTasks)
|
||||
{
|
||||
_ = ExecuteTargetFloorTask(elevatorTask);
|
||||
@@ -496,6 +482,19 @@ namespace Tnb.WarehouseMgr
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async Task SetEleDevId(List<WmsDistaskH> distaskList)
|
||||
{
|
||||
foreach (var task in distaskList)
|
||||
{
|
||||
ElevagorInfoQuery q = new() { endlocation_id = task.endlocation_id };
|
||||
var e = await FindElevatorFromPars(q);
|
||||
if (e != null)
|
||||
{
|
||||
task.device_id = e.device_id;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex) when (ex is HttpRequestException hReqEx)
|
||||
{
|
||||
@@ -606,16 +605,16 @@ namespace Tnb.WarehouseMgr
|
||||
private async Task ExecuteTargetFloorTask(WmsDistaskH disTask)
|
||||
{
|
||||
//收到放货确认通知,向电梯发送到3楼的指令
|
||||
Logger.Information($"开始执行电梯任务,任务ID:{disTask.id}");
|
||||
Logger.Information($"开始执行电梯任务,任务ID:{disTask.id},设备ID:{disTask.device_id}");
|
||||
try
|
||||
{
|
||||
if (!s_elevatorMap.TryGetValue(disTask.device_id, out object? elevatorCode))
|
||||
{
|
||||
return;
|
||||
}
|
||||
string devName = s_elevatorMap[disTask.device_id]?.ToString() ?? _eleCtlCfg.DevName3;
|
||||
string devName = elevatorCode?.ToString();
|
||||
|
||||
Logger.Information($"当前:{devName.Match(@"\d+")}#梯");
|
||||
Logger.Information($"当前设备{devName},{devName.Match(@"\d+")}#梯");
|
||||
|
||||
var tags = new[] { "SysStatus", "RunStatus", "FloorNo", "DoorStatus", "AGVStatus" };
|
||||
(int sysStatus, int runStatus, int curFloorNo, int doorStatus, int agvStatus) eleStatusMulti = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None);
|
||||
@@ -623,8 +622,9 @@ namespace Tnb.WarehouseMgr
|
||||
{
|
||||
_ = await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.AGVControl, 1);
|
||||
}
|
||||
Logger.Information($"电梯当前状态->系统状态:{eleStatusMulti.sysStatus.ToEnum<EnumSysStatus>()},运行状态:{eleStatusMulti.runStatus.ToEnum<EnumRunStatus>().ToString()},门状态:{eleStatusMulti.doorStatus.ToEnum<EnumDoorStatus>().ToString()},Agv状态:{eleStatusMulti.agvStatus.ToEnum<EnumAgvStatus>().ToString()},当前楼层:{eleStatusMulti.curFloorNo}");
|
||||
|
||||
if (!_elevatorAgvCtlStatusMap.TryGetValue(disTask.id, out int agvCtlStatus) || agvCtlStatus != (int)EnumAgvStatus.AGV运行状态)
|
||||
if (!_elevatorAgvCtlStatusMap.TryGetValue(disTask.device_id, out int agvCtlStatus) || agvCtlStatus != (int)EnumAgvStatus.AGV运行状态)
|
||||
{
|
||||
do
|
||||
{
|
||||
@@ -632,7 +632,7 @@ namespace Tnb.WarehouseMgr
|
||||
await Task.Delay(1000);
|
||||
} while (eleStatusMulti.agvStatus != (int)EnumAgvStatus.AGV运行状态);
|
||||
Logger.Information($"{devName.Match(@"\d+")}#, 当前Agv状态:{eleStatusMulti.agvStatus.ToEnum<EnumAgvStatus>()}");
|
||||
_elevatorAgvCtlStatusMap[disTask.id] = eleStatusMulti.agvStatus;
|
||||
_elevatorAgvCtlStatusMap[disTask.device_id] = eleStatusMulti.agvStatus;
|
||||
}
|
||||
|
||||
int doorStatus = -1;
|
||||
@@ -641,6 +641,7 @@ namespace Tnb.WarehouseMgr
|
||||
do
|
||||
{
|
||||
doorStatus = await _elevatorControlService.GetTagAsync(devName, ElevatorConsts.DoorStatus);
|
||||
Logger.Information($"关门结果:{closeDoorRes}");
|
||||
await Task.Delay(1000);
|
||||
} while (doorStatus != 4);
|
||||
Logger.Information($"当前门状态:{doorStatus}");
|
||||
@@ -824,9 +825,13 @@ namespace Tnb.WarehouseMgr
|
||||
_ = await _db.Updateable<WmsPretaskH>().SetColumns(it => new WmsPretaskH { status = WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID }).Where(it => preTaskIds.Contains(it.id)).ExecuteCommandAsync();
|
||||
|
||||
//更新电梯任务数量
|
||||
var eles = await _db.Queryable<WmsElevatorH>().Where(it => disTasks.Select(x => x.area_code).Contains(it.area_code)).ToListAsync();
|
||||
var areaCodes = disTasks.Select(x => x.area_code).ToList();
|
||||
var eles = await _db.Queryable<WmsElevatorH>().Where(it => areaCodes.Contains(it.area_code)).ToListAsync();
|
||||
if (eles?.Count > 0)
|
||||
await _db.Updateable(eles).ReSetValue(it => it.task_nums--).ExecuteCommandAsync();
|
||||
{
|
||||
eles.ForEach(x => x.task_nums--);
|
||||
await _db.Updateable(eles).UpdateColumns(it=>it.task_nums).ExecuteCommandAsync();
|
||||
}
|
||||
|
||||
//更新载具,锁定状态为未锁定,更新载具的库位当前任务的目标库位
|
||||
|
||||
|
||||
@@ -76,8 +76,8 @@ namespace Tnb.WarehouseMgr
|
||||
//入库取终点
|
||||
InStockStrategyQuery inStockStrategyInput = new() { warehouse_id = input.data[nameof(InStockStrategyQuery.warehouse_id)].ToString()!, Size = 1 };
|
||||
//test
|
||||
BasLocation llll = await _db.Queryable<BasLocation>().FirstAsync(it=>it.location_code == _configuration["TestLocation"]);
|
||||
List<BasLocation> endLocations = new() { llll }; //await _wareHouseService.InStockStrategy(inStockStrategyInput);
|
||||
BasLocation llll = await _db.Queryable<BasLocation>().FirstAsync(it => it.location_code == _configuration["TestLocation"]);
|
||||
List<BasLocation> endLocations = await _wareHouseService.InStockStrategy(inStockStrategyInput); //new() { llll };
|
||||
WmsPointH? sPoint = null;
|
||||
WmsPointH? ePoint = null;
|
||||
if (input.data.ContainsKey(nameof(WmsPointH.location_id)))
|
||||
|
||||
Reference in New Issue
Block a user