空载具入库,获取目标库位集合代码还原,用于测试CTU

This commit is contained in:
yang.lee
2023-12-13 14:05:44 +08:00
parent 886f3a1661
commit 89e7f0dd50
7 changed files with 65 additions and 50 deletions

View File

@@ -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; }
}
}

View File

@@ -23,7 +23,7 @@ public partial class WmsElevatorH : BaseEntity<string>
/// 电梯ID
/// </summary>
public string elevator_id { get; set; } = string.Empty;
/// <summary>
/// 电梯编号
/// </summary>

View File

@@ -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,

View File

@@ -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();

View File

@@ -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)
{

View File

@@ -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();
}
//更新载具,锁定状态为未锁定,更新载具的库位当前任务的目标库位

View File

@@ -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)))