1、电梯服务类新增获取电梯状态接口
2、自定义日志记录器代码调整 3、电梯流程新增测试代码
This commit is contained in:
@@ -3,9 +3,13 @@
|
|||||||
public class ElevatorControlConfiguration
|
public class ElevatorControlConfiguration
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 设备名称
|
/// 3#梯设备名称
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string DevName { get; set; }
|
public string DevName3 { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 4#梯设备名称
|
||||||
|
/// </summary>
|
||||||
|
public string DevName4 { get; set; }
|
||||||
public string token { get; set; }
|
public string token { get; set; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取设备标签列表url
|
/// 获取设备标签列表url
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Tnb.WarehouseMgr.Entities.Dto.Queries
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 电梯状态查询输入参数
|
||||||
|
/// </summary>
|
||||||
|
public class ElevatorStatusQuery
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 设备名称
|
||||||
|
/// </summary>
|
||||||
|
public string DevName { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 标签集合
|
||||||
|
/// </summary>
|
||||||
|
public IEnumerable<string> tags { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -24,6 +24,15 @@
|
|||||||
/// <param name="token">取消标志</param>
|
/// <param name="token">取消标志</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus)> GetElevatorStatus(string devName, CancellationToken token);
|
Task<(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus)> GetElevatorStatus(string devName, CancellationToken token);
|
||||||
|
/// <summary>
|
||||||
|
/// 获取电梯状态
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="devName">设备名称</param>
|
||||||
|
/// <param name="tags">标签集合</param>
|
||||||
|
/// <param name="token">取消标志</param>
|
||||||
|
/// <returns>获取到的状态值</returns>
|
||||||
|
Task<(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus)> GetElevatorStatus(string devName,IEnumerable<string> tags, CancellationToken token);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 检查Agv状态
|
/// 检查Agv状态
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -49,5 +58,6 @@
|
|||||||
/// <param name="cancellationToken">取消令牌</param>
|
/// <param name="cancellationToken">取消令牌</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<bool> CallLift(string devName, int floor, CancellationToken cancellationToken);
|
Task<bool> CallLift(string devName, int floor, CancellationToken cancellationToken);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,9 +35,17 @@ namespace Tnb.WarehouseMgr
|
|||||||
public class BaseWareHouseService : IOverideVisualDevService, IDynamicApiController, ITransient
|
public class BaseWareHouseService : IOverideVisualDevService, IDynamicApiController, ITransient
|
||||||
{
|
{
|
||||||
private static readonly Lazy<Dictionary<string, IWHStorageService>> _stroageMapLazy;
|
private static readonly Lazy<Dictionary<string, IWHStorageService>> _stroageMapLazy;
|
||||||
|
private static readonly Dictionary<LogLevel, string> s_logLevelMap = new()
|
||||||
|
{
|
||||||
|
[LogLevel.Debug] = "DBG",
|
||||||
|
[LogLevel.Information] = "INF",
|
||||||
|
[LogLevel.Warning] = "WRN",
|
||||||
|
[LogLevel.Error] = "ERR",
|
||||||
|
};
|
||||||
public OverideVisualDevFunc OverideFuncs { get; } = new OverideVisualDevFunc();
|
public OverideVisualDevFunc OverideFuncs { get; } = new OverideVisualDevFunc();
|
||||||
public static SemaphoreSlim s_taskExecuteSemaphore = new(1);
|
public static SemaphoreSlim s_taskExecuteSemaphore = new(1);
|
||||||
|
|
||||||
|
|
||||||
protected IEventPublisher? EventPublisher { set; get; }
|
protected IEventPublisher? EventPublisher { set; get; }
|
||||||
|
|
||||||
protected ILogger Logger => LoggerFactory.Create(builder => builder.AddFile($"{AppContext.BaseDirectory}/logs/custom{DateTime.Now:yyyyMMdd}.log", cfgOpts =>
|
protected ILogger Logger => LoggerFactory.Create(builder => builder.AddFile($"{AppContext.BaseDirectory}/logs/custom{DateTime.Now:yyyyMMdd}.log", cfgOpts =>
|
||||||
@@ -46,9 +54,9 @@ namespace Tnb.WarehouseMgr
|
|||||||
//cfgOpts.DateFormat = "yyyy-MM-dd HH:mm:ss.fff";
|
//cfgOpts.DateFormat = "yyyy-MM-dd HH:mm:ss.fff";
|
||||||
cfgOpts.MessageFormat = (logMsg) =>
|
cfgOpts.MessageFormat = (logMsg) =>
|
||||||
{
|
{
|
||||||
Span<char> span = logMsg.LogLevel.ToString().ToCharArray();
|
var logLevel = s_logLevelMap[logMsg.LogLevel];
|
||||||
StringBuilder sb = new();
|
var sb = new StringBuilder();
|
||||||
_ = sb.Append($"{span[..4]} ");
|
_ = sb.Append($"[{logLevel}] ");
|
||||||
_ = sb.Append($"{logMsg.LogName} ");
|
_ = sb.Append($"{logMsg.LogName} ");
|
||||||
_ = sb.Append($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} ");
|
_ = sb.Append($"{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} ");
|
||||||
_ = sb.Append($"#{logMsg.EventId.Id} ");
|
_ = sb.Append($"#{logMsg.EventId.Id} ");
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ using Microsoft.AspNetCore.Authorization;
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
using Senparc.CO2NET.Cache;
|
||||||
using SqlSugar;
|
using SqlSugar;
|
||||||
using Tnb.Common.Extension;
|
using Tnb.Common.Extension;
|
||||||
using Tnb.EquipMgr.Entities;
|
using Tnb.EquipMgr.Entities;
|
||||||
@@ -85,9 +86,8 @@ namespace Tnb.WarehouseMgr
|
|||||||
|
|
||||||
WmsElevatorH elevator = await _db.Queryable<WmsElevatorH>().LeftJoin<WmsElevatorD>((a, b) => a.id == b.bill_id)
|
WmsElevatorH 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)
|
.LeftJoin<WmsDistaskH>((a, b, c) => b.location_id == c.startlocation_id)
|
||||||
.LeftJoin<WmsPointH>((a, b, c, d) => c.startlocation_id == d.location_id)
|
.Where((a, b, c) => c.endpoint_code == input.sourceName && input.taskCode == input.taskCode)
|
||||||
.Where((a, b, c, d) => d.point_code == input.sourceName && input.taskCode.Contains(c.bill_code))
|
.Select((a, b, c) => new WmsElevatorH
|
||||||
.Select((a, b, c, d) => new WmsElevatorH
|
|
||||||
{
|
{
|
||||||
distask_id = c.id,
|
distask_id = c.id,
|
||||||
device_id = a.elevator_id,
|
device_id = a.elevator_id,
|
||||||
@@ -102,10 +102,13 @@ namespace Tnb.WarehouseMgr
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
Logger.Information($"当前任务Id:{elevator.distask_id}");
|
Logger.Information($"当前任务Id:{elevator.distask_id}");
|
||||||
|
Logger.Information($"elevator.device_id={elevator.device_id}");
|
||||||
if (s_elevatorMap.TryGetValue(elevator.device_id, out object? elevatorCode))
|
if (s_elevatorMap.TryGetValue(elevator.device_id, out object? elevatorCode))
|
||||||
{
|
{
|
||||||
string devName = elevatorCode?.ToString() ?? _eleCtlCfg.DevName;
|
|
||||||
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(devName, CancellationToken.None);
|
string devName = elevatorCode?.ToString() ?? _eleCtlCfg.DevName3;
|
||||||
|
var tags = new[] { "SysStatus", "RunStatus", "FloorNo", "DoorStatus", "AGVStatus" };
|
||||||
|
(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}");
|
Logger.Information($"电梯当前状态->系统状态:{sysStatus.ToEnum<EnumSysStatus>()},运行状态:{runStatus.ToEnum<EnumRunStatus>()},Agv状态:{agvStatus.ToEnum<EnumAgvStatus>()},当前楼层:{floorNo}");
|
||||||
{
|
{
|
||||||
if (doorStatus.ToEnum<EnumDoorStatus>() != EnumDoorStatus.开门到位保持)
|
if (doorStatus.ToEnum<EnumDoorStatus>() != EnumDoorStatus.开门到位保持)
|
||||||
@@ -139,18 +142,18 @@ namespace Tnb.WarehouseMgr
|
|||||||
[HttpPost, NonUnify, AllowAnonymous]
|
[HttpPost, NonUnify, AllowAnonymous]
|
||||||
public async Task<Result> UnloadConfirm(ConfirmInput input)//
|
public async Task<Result> UnloadConfirm(ConfirmInput input)//
|
||||||
{
|
{
|
||||||
|
Logger.Information($"输入参数:{JsonConvert.SerializeObject(input)}");
|
||||||
Logger.Information("放货确认..................");
|
Logger.Information("放货确认..................");
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
//根据Agv传递的参数获取,对应的电梯
|
//根据Agv传递的参数获取,对应的电梯
|
||||||
WmsElevatorH elevator = await _db.Queryable<WmsElevatorH>().LeftJoin<WmsElevatorD>((a, b) => a.id == b.bill_id)
|
WmsElevatorH elevator = await _db.Queryable<WmsElevatorH>().LeftJoin<WmsElevatorD>((a, b) => a.id == b.bill_id)
|
||||||
.LeftJoin<WmsDistaskH>((a, b, c) => b.location_id == c.endlocation_id)
|
.LeftJoin<WmsDistaskH>((a, b, c) => b.location_id == c.endlocation_id)
|
||||||
.LeftJoin<WmsPointH>((a, b, c, d) => c.endlocation_id == d.location_id)
|
.Where((a, b, c) => c.endpoint_code == input.targetName && (c.bill_code == input.taskCode || c.bill_code == input.taskChainCode))
|
||||||
.Where((a, b, c, d) => d.point_code == input.targetName && c.bill_code == input.taskCode)
|
.Select((a, b, c) => new WmsElevatorH
|
||||||
.Select((a, b, c, d) => new WmsElevatorH
|
|
||||||
{
|
{
|
||||||
end_floor = SqlFunc.ToInt32(c.end_floor),
|
end_floor = SqlFunc.ToInt32(c.end_floor),
|
||||||
distask_id = c.id,
|
device_id = a.elevator_id,
|
||||||
}, true)
|
}, true)
|
||||||
.FirstAsync();
|
.FirstAsync();
|
||||||
if (elevator.IsNull())
|
if (elevator.IsNull())
|
||||||
@@ -158,10 +161,11 @@ namespace Tnb.WarehouseMgr
|
|||||||
throw new Exception($"根据参数,sourceName:{input.sourceName},taskCode:{input.taskCode},未找到匹配的电梯任务");
|
throw new Exception($"根据参数,sourceName:{input.sourceName},taskCode:{input.taskCode},未找到匹配的电梯任务");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s_elevatorMap.TryGetValue(elevator.elevator_id, out object? elevatorCode))
|
if (s_elevatorMap.TryGetValue(elevator.device_id, out object? elevatorCode))
|
||||||
{
|
{
|
||||||
string devName = elevatorCode?.ToString() ?? _eleCtlCfg.DevName;
|
string devName = elevatorCode?.ToString() ?? _eleCtlCfg.DevName3;
|
||||||
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(devName, CancellationToken.None);//elevator.elevator_code
|
var tags = new[] { "SysStatus", "RunStatus", "FloorNo", "DoorStatus", "AGVStatus" };
|
||||||
|
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None);//elevator.elevator_code
|
||||||
Logger.Information($"电梯当前状态->系统状态:{sysStatus.ToEnum<EnumSysStatus>()},运行状态:{runStatus},门状态:{doorStatus},Agv状态:{agvStatus},当前楼层:{floorNo}");
|
Logger.Information($"电梯当前状态->系统状态:{sysStatus.ToEnum<EnumSysStatus>()},运行状态:{runStatus},门状态:{doorStatus},Agv状态:{agvStatus},当前楼层:{floorNo}");
|
||||||
//判断Agv电梯是否进入状态
|
//判断Agv电梯是否进入状态
|
||||||
if (agvStatus != (int)EnumAgvStatus.AGV运行状态)
|
if (agvStatus != (int)EnumAgvStatus.AGV运行状态)
|
||||||
@@ -253,14 +257,22 @@ namespace Tnb.WarehouseMgr
|
|||||||
|
|
||||||
List<WmsDistaskH> disTasks = await _db.Queryable<WmsDistaskH>().Where(it => it.bill_code.Contains(input.taskChainCode)).ToListAsync();
|
List<WmsDistaskH> disTasks = await _db.Queryable<WmsDistaskH>().Where(it => it.bill_code.Contains(input.taskChainCode)).ToListAsync();
|
||||||
List<EqpEquipment> eps = await _db.Queryable<EqpEquipment>().Where(it => it.code.Contains(input.deviceID)).ToListAsync();
|
List<EqpEquipment> eps = await _db.Queryable<EqpEquipment>().Where(it => it.code.Contains(input.deviceID)).ToListAsync();
|
||||||
TaskExecuteUpInput taskExecuteUpInput = new()
|
if (disTasks == null || disTasks.Count < 1)
|
||||||
{
|
{
|
||||||
disTaskIds = disTasks.Select(x => x.id).ToList(),
|
Logger.Error($"根据任务链编号:{input.taskChainCode} ,未获取到任何任务");
|
||||||
EqpIds = eps.Select(x => x.id).ToList(),
|
}
|
||||||
};
|
if (disTasks?.Count > 0)
|
||||||
await _wareHouseService.TaskExecute(taskExecuteUpInput);
|
{
|
||||||
|
TaskExecuteUpInput taskExecuteUpInput = new()
|
||||||
|
{
|
||||||
|
disTaskIds = disTasks?.Select(x => x.id).ToList() ?? Enumerable.Empty<string>().ToList(),
|
||||||
|
EqpIds = eps?.Select(x => x.id).ToList() ?? Enumerable.Empty<string>().ToList(),
|
||||||
|
};
|
||||||
|
await _wareHouseService.TaskExecute(taskExecuteUpInput);
|
||||||
|
}
|
||||||
|
|
||||||
ConnectionConfigOptions opts = App.GetOptions<ConnectionConfigOptions>();
|
|
||||||
|
/*ConnectionConfigOptions opts = App.GetOptions<ConnectionConfigOptions>();
|
||||||
UserAgent userAgent = new(App.HttpContext);
|
UserAgent userAgent = new(App.HttpContext);
|
||||||
//写系统日志
|
//写系统日志
|
||||||
await _eventPublisher.PublishAsync(new LogEventSource("Log:CreateOpLog", opts, new SysLogEntity
|
await _eventPublisher.PublishAsync(new LogEventSource("Log:CreateOpLog", opts, new SysLogEntity
|
||||||
@@ -275,11 +287,12 @@ namespace Tnb.WarehouseMgr
|
|||||||
Json = $"任务链状态上报,任务链编号:{input.taskChainCode},上报状态:{input.status},设备编号:{input.deviceID}",
|
Json = $"任务链状态上报,任务链编号:{input.taskChainCode},上报状态:{input.status},设备编号:{input.deviceID}",
|
||||||
PlatForm = string.Format("{0}-{1}", userAgent.OS.ToString(), userAgent.RawValue),
|
PlatForm = string.Format("{0}-{1}", userAgent.OS.ToString(), userAgent.RawValue),
|
||||||
CreatorTime = DateTime.Now
|
CreatorTime = DateTime.Now
|
||||||
}));
|
}));*/
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.Error("任务链状态上报", ex);
|
Logger.Error("任务链状态上报", ex);
|
||||||
|
Logger.Error($"任务链状态上报错误堆栈{Environment.NewLine}{ex.StackTrace}");
|
||||||
return await ToApiResult(HttpStatusCode.InternalServerError, "请重试!");
|
return await ToApiResult(HttpStatusCode.InternalServerError, "请重试!");
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
@@ -326,6 +339,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
{
|
{
|
||||||
disTaskIds = disTasks.Select(x => x.id).ToList()
|
disTaskIds = disTasks.Select(x => x.id).ToList()
|
||||||
};
|
};
|
||||||
|
Logger.Information($"taskCompleUpInput json parameter:{JsonConvert.SerializeObject(taskCompleUpInput)}");
|
||||||
await _wareHouseService.TaskComplate(taskCompleUpInput);
|
await _wareHouseService.TaskComplate(taskCompleUpInput);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System.Dynamic;
|
using System.Diagnostics.CodeAnalysis;
|
||||||
|
using System.Dynamic;
|
||||||
using JNPF;
|
using JNPF;
|
||||||
using JNPF.Common.Extension;
|
using JNPF.Common.Extension;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
@@ -120,7 +121,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
{
|
{
|
||||||
TaskCompletionSource<object> tcs = new();
|
TaskCompletionSource<object> tcs = new();
|
||||||
dynamic reqParam = new ExpandoObject();
|
dynamic reqParam = new ExpandoObject();
|
||||||
reqParam.DevName = _elevatorCtlCfg.DevName;
|
//reqParam.DevName = _elevatorCtlCfg.DevName;
|
||||||
reqParam.TagName = tagName;
|
reqParam.TagName = tagName;
|
||||||
reqParam.value = value;
|
reqParam.value = value;
|
||||||
reqParam.token = _elevatorCtlCfg.token;
|
reqParam.token = _elevatorCtlCfg.token;
|
||||||
@@ -133,7 +134,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
{
|
{
|
||||||
Dictionary<string, string> parameters = new()
|
Dictionary<string, string> parameters = new()
|
||||||
{
|
{
|
||||||
["DevName"] = _elevatorCtlCfg.DevName,
|
//["DevName"] = _elevatorCtlCfg.DevName,
|
||||||
["token"] = _elevatorCtlCfg.token,
|
["token"] = _elevatorCtlCfg.token,
|
||||||
};
|
};
|
||||||
if (obj is IDictionary<string, object> dynamicDic)
|
if (obj is IDictionary<string, object> dynamicDic)
|
||||||
@@ -181,7 +182,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
{
|
{
|
||||||
Dictionary<string, string> dicCommand = new(StringComparer.OrdinalIgnoreCase)
|
Dictionary<string, string> dicCommand = new(StringComparer.OrdinalIgnoreCase)
|
||||||
{
|
{
|
||||||
["DevName"] = _elevatorCtlCfg.DevName,
|
//["DevName"] = _elevatorCtlCfg.DevName,
|
||||||
["TagName"] = "AGVControl",
|
["TagName"] = "AGVControl",
|
||||||
["Value"] = value.ToString(),
|
["Value"] = value.ToString(),
|
||||||
["token"] = _elevatorCtlCfg.token
|
["token"] = _elevatorCtlCfg.token
|
||||||
@@ -228,39 +229,107 @@ namespace Tnb.WarehouseMgr
|
|||||||
return jo.Value<int>("V");
|
return jo.Value<int>("V");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取电梯状态
|
/// 获取电梯状态
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="devName"></param>
|
/// <param name="devName"></param>
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
|
[HttpGet]
|
||||||
public async Task<(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus)> GetElevatorStatus(string devName, CancellationToken token)
|
public async Task<(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus)> GetElevatorStatus(string devName, CancellationToken token)
|
||||||
{
|
{
|
||||||
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) multi = (-1, -1, -1, -1, -1);
|
(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) multi = (-1, -1, -1, -1, -1);
|
||||||
Dictionary<string, string> pars = new()
|
try
|
||||||
{
|
{
|
||||||
["DevName"] = devName,
|
Dictionary<string, string> pars = new()
|
||||||
["Pos"] = "1",
|
|
||||||
["Count"] = "11",
|
|
||||||
["token"] = _elevatorCtlCfg.token
|
|
||||||
};
|
|
||||||
string url = _elevatorCtlCfg.GetTagListUrl;
|
|
||||||
string systemInfo = await HttpClientHelper.GetAsync(url, pars: pars);
|
|
||||||
JObject jo = JObject.Parse(systemInfo);
|
|
||||||
List<JObject?> objs = jo["Items"].Values<JObject>().ToList();
|
|
||||||
//if (objs?.Count == 4)
|
|
||||||
{
|
|
||||||
if (objs[0].Value<string>("Name").Equals("SysStatus")
|
|
||||||
&& objs[1].Value<string>("Name").Equals("RunStatus")
|
|
||||||
&& objs[3].Value<string>("Name").Equals("FloorNo"))
|
|
||||||
{
|
{
|
||||||
multi = (objs[0].Value<int>("V"), objs[1].Value<int>("V"), objs[3].Value<int>("V"), objs[2].Value<int>("V"), objs[9].Value<int>("V"));
|
["DevName"] = devName,
|
||||||
|
["Pos"] = "1",
|
||||||
|
["Count"] = "11",
|
||||||
|
["token"] = _elevatorCtlCfg.token
|
||||||
|
};
|
||||||
|
string url = _elevatorCtlCfg.GetTagListUrl;
|
||||||
|
string systemInfo = await HttpClientHelper.GetAsync(url, pars: pars);
|
||||||
|
JObject jo = JObject.Parse(systemInfo);
|
||||||
|
List<JObject?> objs = jo["Items"].Values<JObject>().ToList();
|
||||||
|
//if (objs?.Count == 4)
|
||||||
|
{
|
||||||
|
if (objs[0].Value<string>("Name").Equals("SysStatus")
|
||||||
|
&& objs[1].Value<string>("Name").Equals("RunStatus")
|
||||||
|
&& objs[3].Value<string>("Name").Equals("FloorNo"))
|
||||||
|
{
|
||||||
|
multi = (objs[0].Value<int>("V"), objs[1].Value<int>("V"), objs[3].Value<int>("V"), objs[2].Value<int>("V"), objs[10].Value<int>("V"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Logger.Error("获取电梯状态错误", ex);
|
||||||
|
throw;
|
||||||
|
}
|
||||||
return multi;
|
return multi;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 获取电梯状态
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="devName"></param>
|
||||||
|
/// <param name="tags"></param>
|
||||||
|
/// <param name="token"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost("GetElevatorStatus")]
|
||||||
|
public async Task<(int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus)> GetElevatorStatus([NotNull] string devName, [FromBody] IEnumerable<string> tags, CancellationToken token)
|
||||||
|
{
|
||||||
|
Task<string> GetTag(string tag)
|
||||||
|
{
|
||||||
|
var dicCommand = new Dictionary<string, string>
|
||||||
|
{
|
||||||
|
["DevName"] = devName,
|
||||||
|
["token"] = _elevatorCtlCfg.token,
|
||||||
|
["TagName"] = tag
|
||||||
|
};
|
||||||
|
|
||||||
|
return HttpClientHelper.GetAsync(_elevatorCtlCfg.GetTagUrl, pars: dicCommand);
|
||||||
|
}
|
||||||
|
|
||||||
|
var tasks = tags.Select(tag => GetTag(tag));
|
||||||
|
var results = await Task.WhenAll(tasks.Select(task => task));
|
||||||
|
var jos = results.Select(r => JObject.Parse(r)).ToArray();
|
||||||
|
var (sysStatus, runStatus, floorNo, doorStatus, agvStatus) = (0, 0, 0, 0, 0);
|
||||||
|
var propertyMap = new Dictionary<string, Action<int>>()
|
||||||
|
{
|
||||||
|
{ ElevatorConsts.SysStatus, v => sysStatus = v },
|
||||||
|
{ ElevatorConsts.RunStatus, v => runStatus = v },
|
||||||
|
{ ElevatorConsts.FloorNo, v => floorNo = v },
|
||||||
|
{ ElevatorConsts.DoorStatus, v => doorStatus = v },
|
||||||
|
{ ElevatorConsts.AGVStatus, v => agvStatus = v },
|
||||||
|
};
|
||||||
|
|
||||||
|
if (jos?.Length > 0)
|
||||||
|
{
|
||||||
|
foreach (var jo in jos)
|
||||||
|
{
|
||||||
|
if (jo == null)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
string? tagName = jo!.Value<string>("Name");
|
||||||
|
int value = jo!.Value<int>("V");
|
||||||
|
|
||||||
|
if (propertyMap.TryGetValue(tagName!, out var setProperty))
|
||||||
|
{
|
||||||
|
setProperty(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (sysStatus: sysStatus, runStatus: runStatus, floorNo: floorNo, doorStatus: doorStatus, agvStatus: agvStatus);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 检查Agv状态
|
/// 检查Agv状态
|
||||||
@@ -293,10 +362,12 @@ namespace Tnb.WarehouseMgr
|
|||||||
public async Task<bool> CallLift(string devName, int floor, CancellationToken cancellationToken)
|
public async Task<bool> CallLift(string devName, int floor, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
bool isSuccefuly = false;
|
bool isSuccefuly = false;
|
||||||
(int sysStatus, int runStatus, _, int doorStatus, int agvStatus) = await GetElevatorStatus(devName, CancellationToken.None);
|
var tags = new[] { "SysStatus", "RunStatus", "FloorNo", "DoorStatus", "AGVStatus" };
|
||||||
|
(int sysStatus, int runStatus, _, int doorStatus, int agvStatus) = await GetElevatorStatus(devName, tags, CancellationToken.None);
|
||||||
|
Logger.Information($"开始呼梯,当前{devName.Match(@"\d+")}#梯,sysStatus:{sysStatus.ToEnum<EnumSysStatus>().ToString()},runStatus:{runStatus.ToEnum<EnumRunStatus>().ToString()},doorStatus:{doorStatus.ToEnum<EnumDoorStatus>().ToString()},agvStatus:{agvStatus.ToEnum<EnumAgvStatus>().ToString()}");
|
||||||
//判断当前楼层是否是放货楼层,如不是则呼叫电梯到当前楼层
|
//判断当前楼层是否是放货楼层,如不是则呼叫电梯到当前楼层
|
||||||
if (sysStatus.ToEnum<EnumSysStatus>() == EnumSysStatus.正常状态 && runStatus.ToEnum<EnumRunStatus>() == EnumRunStatus.停梯 &&
|
if (sysStatus.ToEnum<EnumSysStatus>() == EnumSysStatus.正常状态 && runStatus.ToEnum<EnumRunStatus>() == EnumRunStatus.停梯 &&
|
||||||
agvStatus.ToEnum<EnumAgvStatus>() != EnumAgvStatus.AGV运行状态)
|
agvStatus.ToEnum<EnumAgvStatus>() == EnumAgvStatus.AGV运行状态)
|
||||||
{
|
{
|
||||||
if (doorStatus.ToEnum<EnumDoorStatus>() != EnumDoorStatus.关门到位保持)
|
if (doorStatus.ToEnum<EnumDoorStatus>() != EnumDoorStatus.关门到位保持)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -75,5 +75,10 @@ namespace Tnb.WarehouseMgr
|
|||||||
{
|
{
|
||||||
logger.LogError(ex, message, parameters);
|
logger.LogError(ex, message, parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void Error(this ILogger logger, string message, params object[] parameters)
|
||||||
|
{
|
||||||
|
logger.LogError(message, parameters);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using JNPF;
|
using JNPF;
|
||||||
|
using JNPF.Common.Extension;
|
||||||
using JNPF.Common.Security;
|
using JNPF.Common.Security;
|
||||||
using JNPF.EventBus;
|
using JNPF.EventBus;
|
||||||
using JNPF.EventHandler;
|
using JNPF.EventHandler;
|
||||||
using JNPF.Systems.Entitys.System;
|
using JNPF.Systems.Entitys.System;
|
||||||
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Hosting;
|
||||||
|
using NPOI.OpenXmlFormats.Dml.Diagram;
|
||||||
using Tnb.Common.Extension;
|
using Tnb.Common.Extension;
|
||||||
using Tnb.Common.Utils;
|
using Tnb.Common.Utils;
|
||||||
using Tnb.WarehouseMgr.Entities.Configs;
|
using Tnb.WarehouseMgr.Entities.Configs;
|
||||||
@@ -42,13 +44,25 @@ namespace Tnb.WarehouseMgr
|
|||||||
{
|
{
|
||||||
Dictionary<string, string> parameter = new()
|
Dictionary<string, string> parameter = new()
|
||||||
{
|
{
|
||||||
["DevName"] = _elevatorControlConfiguration.DevName,
|
["DevName"] = _elevatorControlConfiguration.DevName3,
|
||||||
["TagName"] = "AGVKeepalive",
|
["TagName"] = "AGVKeepalive",
|
||||||
["Value"] = "123",
|
["Value"] = "123",
|
||||||
["token"] = _elevatorControlConfiguration.token
|
["token"] = _elevatorControlConfiguration.token
|
||||||
};
|
};
|
||||||
string result = await HttpClientHelper.GetAsync(_elevatorControlConfiguration.WriteTagUrl, pars: parameter);
|
string result = await HttpClientHelper.GetAsync(_elevatorControlConfiguration.WriteTagUrl, pars: parameter);
|
||||||
await Console.Out.WriteLineAsync($"心跳检测结果:{result}");
|
await Console.Out.WriteLineAsync($"{_elevatorControlConfiguration.DevName3.Match(@"\d+")}#梯, 心跳检测结果:{result}");
|
||||||
|
}, stoppingToken, 30, TimeSpanUnit.Seconds);
|
||||||
|
_ = TimedTask(async token =>
|
||||||
|
{
|
||||||
|
Dictionary<string, string> parameter = new()
|
||||||
|
{
|
||||||
|
["DevName"] = _elevatorControlConfiguration.DevName4,
|
||||||
|
["TagName"] = "AGVKeepalive",
|
||||||
|
["Value"] = "123",
|
||||||
|
["token"] = _elevatorControlConfiguration.token
|
||||||
|
};
|
||||||
|
string result = await HttpClientHelper.GetAsync(_elevatorControlConfiguration.WriteTagUrl, pars: parameter);
|
||||||
|
await Console.Out.WriteLineAsync($"{_elevatorControlConfiguration.DevName4.Match(@"\d+")}#梯,心跳检测结果:{result}");
|
||||||
}, stoppingToken, 30, TimeSpanUnit.Seconds);
|
}, stoppingToken, 30, TimeSpanUnit.Seconds);
|
||||||
////齐套出库
|
////齐套出库
|
||||||
/*var kittingOutService = App.GetRequiredService<IWmskittingOutService>();
|
/*var kittingOutService = App.GetRequiredService<IWmskittingOutService>();
|
||||||
|
|||||||
@@ -408,20 +408,25 @@ namespace Tnb.WarehouseMgr
|
|||||||
{
|
{
|
||||||
//呼梯操作
|
//呼梯操作
|
||||||
//获取目标库位为电梯库位的任务
|
//获取目标库位为电梯库位的任务
|
||||||
var eleTasks = disTasks.Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) &&
|
|
||||||
!it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase))
|
var agvDTTasks = disTasks.Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) &&
|
||||||
.ToList();
|
!it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList();
|
||||||
foreach (var et in eleTasks)
|
foreach (var at in agvDTTasks)
|
||||||
{
|
{
|
||||||
var ele = elevatorList.Find(x => x.location_code == et.endlocation_code);
|
var ele = elevatorList.Find(x => x.location_code == at.endlocation_code);
|
||||||
if(ele!=null)
|
Logger.Information($"ele.elevator_id={ele?.elevator_id}");
|
||||||
|
if (ele != null)
|
||||||
{
|
{
|
||||||
et.device_id = ele.elevator_id;
|
at.device_id = ele.elevator_id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
List<(string endlocation_code, string device_id, string id, string? start_floor)> endLocCodes = eleTasks
|
|
||||||
.Select(it => (it.endlocation_code, it.device_id, it.id, it.start_floor)).ToList();
|
|
||||||
|
|
||||||
|
List<(string endlocation_code, string device_id, string id, string? start_floor)> endLocCodes = agvDTTasks
|
||||||
|
.Select(it => (it.endlocation_code, it.device_id, it.id, it.start_floor)).ToList();
|
||||||
|
if (endLocCodes?.Count > 0)
|
||||||
|
{
|
||||||
|
await CallingLanding(endLocCodes);
|
||||||
|
}
|
||||||
//执行电梯任务
|
//执行电梯任务
|
||||||
List<WmsDistaskH>? elevatorTasks = disTasks.Where(it => it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList();
|
List<WmsDistaskH>? elevatorTasks = disTasks.Where(it => it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList();
|
||||||
|
|
||||||
@@ -483,17 +488,20 @@ namespace Tnb.WarehouseMgr
|
|||||||
}
|
}
|
||||||
|
|
||||||
string? devName = elevatorCode.ToString();
|
string? devName = elevatorCode.ToString();
|
||||||
|
Logger.Information($"电梯编号:{devName}");
|
||||||
Logger.Information($"当前:{devName.Match(@"\d+")}#梯");
|
Logger.Information($"当前:{devName.Match(@"\d+")}#梯");
|
||||||
|
|
||||||
await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.AGVControl, 1);
|
await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.AGVControl, 1);
|
||||||
(int sysStatus, int runStatus, int curFloorNo, int doorStatus, int agvStatus) eleStatusMulti = (-1, -1, -1, -1, -1);
|
(int sysStatus, int runStatus, int curFloorNo, int doorStatus, int agvStatus) eleStatusMulti = (-1, -1, -1, -1, -1);
|
||||||
if (!_elevatorAgvCtlStatusMap.TryGetValue(devId, out int agvCtlStatus) || agvCtlStatus != (int)EnumAgvStatus.AGV运行状态)
|
if (!_elevatorAgvCtlStatusMap.TryGetValue(devId, out int agvCtlStatus) || agvCtlStatus != (int)EnumAgvStatus.AGV运行状态)
|
||||||
{
|
{
|
||||||
|
Logger.Information("获取电梯状态");
|
||||||
|
Logger.Information($"_elevatorControlService ==null{_elevatorControlService == null}");
|
||||||
|
var tags = new[] { "SysStatus", "RunStatus", "FloorNo", "DoorStatus", "AGVStatus" };
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
eleStatusMulti = await _elevatorControlService.GetElevatorStatus(devName, CancellationToken.None);
|
eleStatusMulti = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None);
|
||||||
await Task.Delay(500);
|
await Task.Delay(1000);
|
||||||
} while (eleStatusMulti.agvStatus != (int)EnumAgvStatus.AGV运行状态);
|
} while (eleStatusMulti.agvStatus != (int)EnumAgvStatus.AGV运行状态);
|
||||||
Logger.Information($"{devName.Match(@"\d+")}#, 当前Agv状态:{eleStatusMulti.agvStatus.ToEnum<EnumAgvStatus>()}");
|
Logger.Information($"{devName.Match(@"\d+")}#, 当前Agv状态:{eleStatusMulti.agvStatus.ToEnum<EnumAgvStatus>()}");
|
||||||
_elevatorAgvCtlStatusMap[devId] = eleStatusMulti.agvStatus;
|
_elevatorAgvCtlStatusMap[devId] = eleStatusMulti.agvStatus;
|
||||||
@@ -539,6 +547,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.Error("呼梯操作错误", ex);
|
Logger.Error("呼梯操作错误", ex);
|
||||||
|
Logger.Error($"呼梯操作错误堆栈跟踪:{Environment.NewLine}{ex.StackTrace}");
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -558,18 +567,19 @@ namespace Tnb.WarehouseMgr
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
string devName = s_elevatorMap[disTask.device_id]?.ToString() ?? _eleCtlCfg.DevName;
|
string devName = s_elevatorMap[disTask.device_id]?.ToString() ?? _eleCtlCfg.DevName3;
|
||||||
|
|
||||||
Logger.Information($"当前:{devName.Match(@"\d+")}#梯");
|
Logger.Information($"当前:{devName.Match(@"\d+")}#梯");
|
||||||
|
|
||||||
await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.AGVControl, 1);
|
_ = await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.AGVControl, 1);
|
||||||
(int sysStatus, int runStatus, int curFloorNo, int doorStatus, int agvStatus) eleStatusMulti = (-1, -1, -1, -1, -1);
|
(int sysStatus, int runStatus, int curFloorNo, int doorStatus, int agvStatus) eleStatusMulti = (-1, -1, -1, -1, -1);
|
||||||
|
var tags = new[] { "SysStatus", "RunStatus", "FloorNo", "DoorStatus", "AGVStatus" };
|
||||||
if (!_elevatorAgvCtlStatusMap.TryGetValue(disTask.id, out int agvCtlStatus) || agvCtlStatus != (int)EnumAgvStatus.AGV运行状态)
|
if (!_elevatorAgvCtlStatusMap.TryGetValue(disTask.id, out int agvCtlStatus) || agvCtlStatus != (int)EnumAgvStatus.AGV运行状态)
|
||||||
{
|
{
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
eleStatusMulti = await _elevatorControlService.GetElevatorStatus(devName, CancellationToken.None);
|
eleStatusMulti = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None);
|
||||||
await Task.Delay(500);
|
await Task.Delay(1000);
|
||||||
} while (eleStatusMulti.agvStatus != (int)EnumAgvStatus.AGV运行状态);
|
} while (eleStatusMulti.agvStatus != (int)EnumAgvStatus.AGV运行状态);
|
||||||
Logger.Information($"{devName.Match(@"\d+")}#, 当前Agv状态:{eleStatusMulti.agvStatus.ToEnum<EnumAgvStatus>()}");
|
Logger.Information($"{devName.Match(@"\d+")}#, 当前Agv状态:{eleStatusMulti.agvStatus.ToEnum<EnumAgvStatus>()}");
|
||||||
_elevatorAgvCtlStatusMap[disTask.id] = eleStatusMulti.agvStatus;
|
_elevatorAgvCtlStatusMap[disTask.id] = eleStatusMulti.agvStatus;
|
||||||
@@ -581,7 +591,7 @@ namespace Tnb.WarehouseMgr
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
doorStatus = await _elevatorControlService.GetTagAsync(devName, ElevatorConsts.DoorStatus);
|
doorStatus = await _elevatorControlService.GetTagAsync(devName, ElevatorConsts.DoorStatus);
|
||||||
await Task.Delay(2000);
|
await Task.Delay(1000);
|
||||||
} while (doorStatus != 4);
|
} while (doorStatus != 4);
|
||||||
Logger.Information($"当前门状态:{doorStatus}");
|
Logger.Information($"当前门状态:{doorStatus}");
|
||||||
|
|
||||||
@@ -596,8 +606,8 @@ namespace Tnb.WarehouseMgr
|
|||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
tuple = await _elevatorControlService.GetElevatorStatus(devName, CancellationToken.None);
|
tuple = await _elevatorControlService.GetElevatorStatus(devName,tags, CancellationToken.None);
|
||||||
await Task.Delay(2000);
|
await Task.Delay(1000);
|
||||||
} while (tuple.sysStatus != 3 && tuple.runStatus != 0);
|
} while (tuple.sysStatus != 3 && tuple.runStatus != 0);
|
||||||
|
|
||||||
Logger.Information($"sysStatus:{tuple.sysStatus},runStatus:{tuple.runStatus},floorNo:{tuple.floorNo},disTask.end_floor={disTask.end_floor}");
|
Logger.Information($"sysStatus:{tuple.sysStatus},runStatus:{tuple.runStatus},floorNo:{tuple.floorNo},disTask.end_floor={disTask.end_floor}");
|
||||||
@@ -811,8 +821,6 @@ namespace Tnb.WarehouseMgr
|
|||||||
_ = await _db.Updateable(carryCodeIts).UpdateColumns(it => new { it.warehouse_id, it.location_id, it.location_code }).Where(it => multiList.Select(x => x.carry_id).Contains(it.carry_id)).ExecuteCommandAsync();
|
_ = await _db.Updateable(carryCodeIts).UpdateColumns(it => new { it.warehouse_id, it.location_id, it.location_code }).Where(it => multiList.Select(x => x.carry_id).Contains(it.carry_id)).ExecuteCommandAsync();
|
||||||
//更新库位信息,使用状态为 使用,锁定状态为未锁定
|
//更新库位信息,使用状态为 使用,锁定状态为未锁定
|
||||||
_ = await _db.Updateable(locIts).UpdateColumns(it => new { it.is_use, it.is_lock }).ExecuteCommandAsync();
|
_ = await _db.Updateable(locIts).UpdateColumns(it => new { it.is_use, it.is_lock }).ExecuteCommandAsync();
|
||||||
Logger.Information("更新载具及库位结束.....");
|
|
||||||
Logger.Information($"_userManager==null:{_userManager == null}");
|
|
||||||
/* var loginType= _userManager?.LoginType ?? "web";
|
/* var loginType= _userManager?.LoginType ?? "web";
|
||||||
Log.Information($"_userManager.LoginType={loginType}");
|
Log.Information($"_userManager.LoginType={loginType}");
|
||||||
*/ //更新业务主表的单据状态
|
*/ //更新业务主表的单据状态
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"DevName": "Elevator2",
|
"DevName3": "Elevator3",
|
||||||
|
"DevName4": "Elevator4",
|
||||||
"token": "780BE4144636CF47DDF3920B0F1D069B",
|
"token": "780BE4144636CF47DDF3920B0F1D069B",
|
||||||
"GetTagListUrl": "http://192.168.11.110:9100/Dev/GetTagList",
|
"GetTagListUrl": "http://192.168.11.110:9100/Dev/GetTagList",
|
||||||
"GetTagUrl": "http://192.168.11.110:9100/Dev/GetTag",
|
"GetTagUrl": "http://192.168.11.110:9100/Dev/GetTag",
|
||||||
|
|||||||
Reference in New Issue
Block a user