调整,取货、放货 确认接口

This commit is contained in:
alex
2023-09-28 17:44:02 +08:00
parent 73d773c03f
commit db451b6c09
5 changed files with 167 additions and 50 deletions

View File

@@ -43,5 +43,9 @@ public partial class WmsElevatorUnexecute : BaseEntity<string>
/// 创建时间
/// </summary>
public DateTime? create_time { get; set; }
/// <summary>
/// 执行任务ID
/// </summary>
public string distask_id { get; set; }
}

View File

@@ -46,6 +46,14 @@ namespace Tnb.WarehouseMgr.Interfaces
/// 6后门关门
/// </param>
/// <returns></returns>
Task<bool> SendOpenCloseCmd(string devName,int value);
Task<bool> SendOpenCloseCmd(string devName, int value);
/// <summary>
/// 呼梯操作
/// </summary>
/// <param name="devName">设备名称</param>
/// <param name="floor">呼叫楼层</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns></returns>
Task<bool> CallLift(string devName, int floor, CancellationToken cancellationToken);
}
}

View File

@@ -84,10 +84,28 @@ namespace Tnb.WarehouseMgr
{
try
{
//var eles = await _db.Queryable<WmsElevatorH>().LeftJoin<WmsElevatorD>((a, b) => a.id == b.bill_id)
// .LeftJoin<WmsDistaskH>((a, b, c) => b.location_id == c.startlocation_id)
// .Where((a, b, c) => c.startlocation_code == input.sourceName && c.bill_code == input.taskCode)
// .ToListAsync();
var elevator = await _db.Queryable<WmsElevatorH>().LeftJoin<WmsElevatorD>((a, b) => a.id == b.bill_id)
.LeftJoin<WmsDistaskH>((a, b, c) => b.location_id == c.startlocation_id)
.Where((a, b, c) => c.startlocation_code == input.sourceName && c.bill_code == input.taskCode)
.FirstAsync();
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(elevator.elevator_code, CancellationToken.None);
Log.Information($"电梯当前状态->系统状态:{sysStatus.ToEnum<EnumSysStatus>().ToString()},运行状态:{runStatus.ToEnum<EnumRunStatus>().ToString()},Agv状态:{agvStatus.ToEnum<EnumAgvStatus>().ToString()},当前楼层:{floorNo}");
if (floorNo == 3)
{
if (doorStatus.ToEnum<EnumDoorStatus>() != EnumDoorStatus.)
{
await _elevatorControlService.SendOpenCloseCmd(elevator.elevator_code, 3); //发送电梯前门开门指令
}
if (sysStatus.ToEnum<EnumSysStatus>() == EnumSysStatus. && runStatus.ToEnum<EnumRunStatus>() == EnumRunStatus.
&& doorStatus.ToEnum<EnumDoorStatus>() == EnumDoorStatus. && floorNo == 3)
{
elevator.current_floor = floorNo;
await _db.Updateable(elevator).UpdateColumns(it => it.current_floor).ExecuteCommandAsync();
return await ToApiResult(HttpStatusCode.OK, "成功");
}
return await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!");
}
}
catch (Exception)
{
@@ -113,16 +131,19 @@ namespace Tnb.WarehouseMgr
.Where((a, b, c) => c.endlocation_code == input.targetName && c.bill_code == input.taskCode)
.OrderBy(a => a.elevator_code)
.FirstAsync();
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(elevator.elevator_code,CancellationToken.None);
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(elevator.elevator_code, CancellationToken.None);
Log.Information($"电梯当前状态->系统状态:{sysStatus.ToEnum<EnumSysStatus>().ToString()},运行状态:{runStatus.ToEnum<EnumRunStatus>().ToString()},Agv状态:{agvStatus.ToEnum<EnumAgvStatus>().ToString()},当前楼层:{floorNo}");
//判断Agv电梯是否进入状态
if (agvStatus.ToEnum<EnumAgvStatus>() != EnumAgvStatus.AGV运行状态)
{
await _elevatorControlService.WriteTagAsync(elevator.elevator_code, ElevatorConsts.AGVControl, 1);
}
//电梯到达目标楼层后,判断当前电梯门状态是否为开门到位保持状态
//电梯到达目标楼层后,判断当前电梯门状态是否为开门到位保持状态
if (doorStatus.ToEnum<EnumDoorStatus>() != EnumDoorStatus.)
{
await _elevatorControlService.SendOpenCloseCmd(elevator.elevator_code, 3); //发送电梯前门开门指令
}
if (sysStatus.ToEnum<EnumSysStatus>() == EnumSysStatus. && runStatus.ToEnum<EnumRunStatus>() == EnumRunStatus.
&& doorStatus.ToEnum<EnumDoorStatus>() == EnumDoorStatus. && floorNo == 4)
{
@@ -227,6 +248,22 @@ namespace Tnb.WarehouseMgr
disTaskIds = disTasks.Select(x => x.id).ToList()
};
await _wareHouseService.TaskComplate(taskCompleUpInput);
//收到放货确认通知向电梯发送到3楼的指令
var elevatorQueueItem = await _db.Queryable<WmsElevatorUnexecute>().FirstAsync(it => disTasks.Select(x => x.id).Contains(it.distask_id) && it.task_status == "执行中");
if (elevatorQueueItem != null)
{
var disTask = disTasks.Find(x => x.id == elevatorQueueItem.distask_id);
if (disTask?.status == WmsWareHouseConst.TASK_BILL_STATUS_COMPLE_ID)
{
var doorStatus = await _elevatorControlService.GetTagAsync(elevatorQueueItem.elevator_code, ElevatorConsts.DoorStatus);
if (doorStatus.ToEnum<EnumDoorStatus>() != EnumDoorStatus.)
{
await _elevatorControlService.SendOpenCloseCmd(elevatorQueueItem.elevator_code, 4); //向电梯发送前门关门指令
}
//发送到3楼的指令
var reuslt = await _elevatorControlService.WriteTagAsync(elevatorQueueItem.elevator_code, ElevatorConsts.FloorExecute, 4);
}
}
}
}
catch (Exception)

View File

@@ -15,6 +15,7 @@ using MimeKit.Cryptography;
using Newtonsoft.Json.Linq;
using Tnb.Common.Extension;
using Tnb.Common.Utils;
using Tnb.WarehouseMgr.Entities;
using Tnb.WarehouseMgr.Entities.Configs;
using Tnb.WarehouseMgr.Entities.Consts;
using Tnb.WarehouseMgr.Entities.Enums;
@@ -157,7 +158,7 @@ namespace Tnb.WarehouseMgr
return Task.FromResult(0);
}
private Task<object> SetRequestParameter(string tagName, object value)
{
@@ -313,6 +314,34 @@ namespace Tnb.WarehouseMgr
}
return isInAgvStatus;
}
/// <summary>
/// 呼梯操作
/// </summary>
/// <param name="devName">设备名称</param>
/// <param name="floor">呼叫楼层</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns></returns>
public async Task<bool> CallLift(string devName, int floor, CancellationToken cancellationToken)
{
var isSuccefuly = false;
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await GetElevatorStatus(devName, CancellationToken.None);
//判断当前楼层是否是放货楼层,如不是则呼叫电梯到当前楼层
if (sysStatus.ToEnum<EnumSysStatus>() == EnumSysStatus. && runStatus.ToEnum<EnumRunStatus>() == EnumRunStatus. &&
agvStatus.ToEnum<EnumAgvStatus>() != EnumAgvStatus.AGV运行状态 && floorNo != 4)
{
if (doorStatus.ToEnum<EnumDoorStatus>() != EnumDoorStatus.)
{
await SendOpenCloseCmd(devName, (int)EnumAgvControl.);
}
var result = await WriteTagAsync(devName, ElevatorConsts.FloorExecute, floor); //呼叫电梯到4楼
if (!result.IsNullOrEmpty())
{
JObject jo = JObject.Parse(result);
isSuccefuly = jo?.Value<string>("Result").Equals("Ok", StringComparison.OrdinalIgnoreCase) ?? false;
}
}
return isSuccefuly;
}
}
public class ElevatorData

View File

@@ -42,6 +42,7 @@ using Tnb.BasicData.Entities;
using Tnb.BasicData.Entities.Enums;
using Tnb.Common.Extension;
using Tnb.Common.Utils;
using Tnb.ProductionMgr.Entities.Dto.PrdManage;
using Tnb.WarehouseMgr.Entities;
using Tnb.WarehouseMgr.Entities.Attributes;
using Tnb.WarehouseMgr.Entities.Configs;
@@ -237,14 +238,13 @@ namespace Tnb.WarehouseMgr
Stopwatch sw = Stopwatch.StartNew();
CancellationTokenSource agvCts = new();
if (_elevatorMap.Count < 1)
{
_elevatorMap = await _db.Queryable<WmsElevatorH>().ToDictionaryAsync(x => x.elevator_id, x => x.elevator_code);
}
var db = _db.CopyNew();
try
{
if (_elevatorMap.Count < 1)
{
_elevatorMap = await _db.Queryable<WmsElevatorH>().ToDictionaryAsync(x => x.elevator_id, x => x.elevator_code);
}
//获取所有未下发的预任务申请
var preTasks = await db.Queryable<WmsPretaskH>().InnerJoin<WmsCarryH>((a, b) => a.startlocation_id == b.location_id && a.carry_id == b.id)
.InnerJoin<WmsAreaH>((a, b, c) => a.area_id == c.id)
@@ -354,7 +354,47 @@ namespace Tnb.WarehouseMgr
Log.Information($"程序运行耗时{sw.ElapsedMilliseconds}ms");
await db.Ado.CommitTranAsync();
//呼梯操作
//获取目标库位为电梯库位的任务
var endLocCodes = disTasks.Select(it => (it.endlocation_code, it.device_id, it.id)).Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase)).ToList();
if (endLocCodes?.Count > 0)
{
var item = endLocCodes.FirstOrDefault();
if (_elevatorMap.ContainsKey(item.device_id))
{
var devName = _elevatorMap[item.device_id].ToString();
var agvStatus = await _elevatorControlService.GetTagAsync(devName, ElevatorConsts.AGVControl);
//判断当前设备是否为运行状态不是则进入Agv电梯控制状态
if (agvStatus.ToEnum<EnumAgvStatus>() != EnumAgvStatus.AGV运行状态)
{
await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.AGVControl, 1);
}
}
foreach (var (_, devId, disTaskId) in endLocCodes)
{
WmsElevatorUnexecute elevatorQueueItem = new()
{
distask_id = disTaskId,
elevator_id = devId,
elevator_code = _elevatorMap[devId].ToString(),
floor = 5, //5代表4楼
task_status = "待执行",
create_id = _userManager.UserId,
create_time = DateTime.Now
};
var elevatorQueue = await _db.Queryable<WmsElevatorUnexecute>().Where(it => it.elevator_id == devId && it.task_status == "执行中").ToListAsync();
if (_elevatorMap.ContainsKey(devId) && (elevatorQueue.IsNull() || elevatorQueue.Count < 1))
{
var devName = _elevatorMap[devId].ToString();
elevatorQueueItem.task_status = "执行中";
await _elevatorControlService.CallLift(devName, 5, CancellationToken.None);
}
//如果当前电梯有任务在做,将当前呼梯任务放入待执行队列
await _db.Insertable(elevatorQueueItem).ExecuteCommandAsync();
}
}
//调用AGV创建任务链接口
var requestCfg = App.Configuration.Build<AgvRequestConfig>();
var url = requestCfg.AgvRequestUrls.CreateTaskChainUrl;
@@ -379,42 +419,6 @@ namespace Tnb.WarehouseMgr
var respBody = await HttpClientHelper.PostStreamAsync(url, reqBody, agvCts.Token);
Log.Information($"调用Agv接口响应结果:{respBody}");
}
//呼梯操作
var endLocCodes = disTasks.Select(it => (it.endlocation_code, it.device_id)).Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase)).ToList();
if (endLocCodes?.Count > 0)
{
foreach (var (_, devId) in endLocCodes)
{
var elevatorQueue = await _db.Queryable<WmsElevatorUnexecute>().Where(it => it.elevator_id == devId).ToListAsync();
if (_elevatorMap.ContainsKey(devId) && elevatorQueue?.Count < 1)
{
var devName = _elevatorMap[devId].ToString();
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(devName, CancellationToken.None);
//判断当前楼层是否是放货楼层,如不是则呼叫电梯到当前楼层
if (sysStatus.ToEnum<EnumSysStatus>() == EnumSysStatus. && runStatus.ToEnum<EnumRunStatus>() == EnumRunStatus. &&
agvStatus.ToEnum<EnumAgvStatus>() != EnumAgvStatus.AGV运行状态 && floorNo != 4)
{
if (doorStatus.ToEnum<EnumDoorStatus>() != EnumDoorStatus.)
{
await _elevatorControlService.SendOpenCloseCmd(devName, (int)EnumAgvControl.);
}
await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.FloorExecute, 5); //呼叫电梯到4楼
//将当前呼梯任务放入待执行队列
WmsElevatorUnexecute elevatorQueueItem = new()
{
elevator_id = devId,
elevator_code = _elevatorMap[devId].ToString(),
floor = 4,
create_id = _userManager.UserId,
create_time = DateTime.Now
};
await _db.Storageable(elevatorQueueItem).ExecuteCommandAsync();
}
}
}
}
}
}
catch (Exception ex) when (ex is HttpRequestException hReqEx)
@@ -432,6 +436,41 @@ namespace Tnb.WarehouseMgr
agvCts.Dispose();
}
}
/// <summary>
/// Agv调度
/// </summary>
/// <param name="disTasks"></param>
/// <param name="token"></param>
/// <returns></returns>
private async Task AgvDispatch(Dictionary<string, List<dynamic>> taskChainCodeDic, CancellationToken token)
{
//调用AGV创建任务链接口
var requestCfg = App.Configuration.Build<AgvRequestConfig>();
var url = requestCfg.AgvRequestUrls.CreateTaskChainUrl;
//var taskChainCodeDic = disTasks.Where(t => !t.groups.IsNullOrWhiteSpace()).GroupBy(g => g.groups!)
// .ToDictionary(x => x.Key, x => x.Select(it => new
// {
// taskCode = it.bill_code,
// sourceName = it.startpoint_code,
// targetName = it.endpoint_code,
// containerCode = it.carry_code,
// }));
Log.Information($"请求地址:{url}");
foreach (var (k, v) in taskChainCodeDic)
{
dynamic reqBody = new ExpandoObject();
reqBody.taskChainCode = k;
reqBody.type = (int)EnumTaskChainType.AGV;
reqBody.sequential = false;
reqBody.taskChainPriority = 0;
reqBody.taskList = v;
Log.Information($"请求参数:{JsonConvert.SerializeObject(reqBody)}");
var respBody = await HttpClientHelper.PostStreamAsync(url, reqBody, token);
Log.Information($"调用Agv接口响应结果:{respBody}");
}
}
/// <summary>
/// 任务执行
/// </summary>