diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Configs/ElevatorControlConfiguration.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Configs/ElevatorControlConfiguration.cs index 0b9f0528..ecd29030 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Configs/ElevatorControlConfiguration.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Configs/ElevatorControlConfiguration.cs @@ -14,6 +14,10 @@ /// 心跳检测设备名称集合 /// public List HeartbeatDevNames { get; set; } + /// + /// 电梯状态标签列表 + /// + public List tags { get; set; } public string token { get; set; } /// /// 获取设备标签列表url diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/ElevagorInfoQuery.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/ElevagorInfoQuery.cs new file mode 100644 index 00000000..5f709c6d --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Dto/Queries/ElevagorInfoQuery.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tnb.WarehouseMgr.Entities.Dto.Queries +{ + public class ElevagorInfoQuery + { + public string taskCode { get; set; } + public string endlocation_id { get; set; } + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsElevatorH.part.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsElevatorH.part.cs index 8aab7106..529ed7e7 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsElevatorH.part.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Entity/WmsElevatorH.part.cs @@ -1,4 +1,5 @@ -using SqlSugar; +using System.Reflection; +using SqlSugar; using Tnb.WarehouseMgr.Entities.Entity.Constraints; namespace Tnb.WarehouseMgr.Entities; @@ -66,5 +67,11 @@ public partial class WmsElevatorH : IUpdateEnabledEntity /// [SugarColumn(ColumnName = "status")] public int enabled { get; set; } + /// + /// 任务单号 + /// + [SugarColumn(ColumnName = "status")] + public string bill_code { get; set; } + } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumElevatorUseStatus.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumElevatorUseStatus.cs new file mode 100644 index 00000000..f75af399 --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Enums/EnumElevatorUseStatus.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Tnb.WarehouseMgr.Entities.Enums +{ + /// + /// 电梯使用状态 + /// + public enum EnumElevatorUseStatus + { + 空闲 = 0, + 占用 = 1, + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs index 2e604a6e..b964c72d 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/BaseWareHouseService.cs @@ -338,7 +338,6 @@ namespace Tnb.WarehouseMgr } - #region 斑马打印 /// /// 打印 diff --git a/WarehouseMgr/Tnb.WarehouseMgr/DevServBase`1.cs b/WarehouseMgr/Tnb.WarehouseMgr/DevServBase`1.cs new file mode 100644 index 00000000..c20a445d --- /dev/null +++ b/WarehouseMgr/Tnb.WarehouseMgr/DevServBase`1.cs @@ -0,0 +1,98 @@ +using System.Text; +using JNPF; +using Microsoft.Extensions.Logging; +using SqlSugar; +using Tnb.WarehouseMgr.Entities; +using Tnb.WarehouseMgr.Entities.Dto.Queries; +using Tnb.WarehouseMgr.Entities.Entity; + +namespace Tnb.WarehouseMgr +{ + public class DevServBase : BaseWareHouseService + { + protected static Dictionary s_elevatorMap = new(); + + private static readonly Lazy initializationTask; + private static SqlSugarScope context; + private readonly ISqlSugarClient _db; + + static DevServBase() + { + //initializationTask = new Lazy(InitializeAsync); + _ = Task.Run(() => InitializeAsync()); + } + + public DevServBase(ISqlSugarClient db) + { + _db = db; + } + + + private static async Task InitializeAsync() + { + + ConnectionStringsOptions connectionOpts = App.GetConfig("ConnectionStrings", true); + ConnectionConfig cfg = new() + { + ConfigId = connectionOpts.ConfigId, + ConnectionString = connectionOpts.ConnectString, + DbType = DbType.PostgreSQL, + IsAutoCloseConnection = true, + }; + context = new(cfg); + + s_elevatorMap = await context.Queryable().ToDictionaryAsync(x => x.elevator_id, x => x.elevator_code); + + } + //public static Task InitializationTask => initializationTask.Value; + + /// + /// 获取电梯根据任务单号 + /// + /// + /// taskCode:子任务编号 + /// endlocation_id:目标库位ID + /// + /// + protected async Task FindElevatorFromPars(ElevagorInfoQuery input) + { + var ele = await _db.CopyNew().Queryable().InnerJoin((a, b) => a.id == b.bill_id) + .InnerJoin((a, b, c) => b.location_code == c.endlocation_code) + .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) + .Select((a, b, c) => new WmsElevatorH + { + bill_code = c.bill_code, + device_id = a.elevator_id, + end_floor = c.end_floor + }, true) + .FirstAsync(); + + return ele; + + } + } + + public static class CustomLoggerExtenstions + { + public static void Debug(this ILogger logger, string message, params object[] parameters) + { + logger.Debug(message, parameters); + } + + public static void Information(this ILogger logger, string message, params object[] parameters) + { + logger.LogInformation(message, parameters); + } + + public static void Error(this ILogger logger, string message, Exception ex, params object[] parameters) + { + logger.LogError(ex, message, parameters); + } + + public static void Error(this ILogger logger, string message, params object[] parameters) + { + logger.LogError(message, parameters); + } + } +} diff --git a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs index 60162e1b..521b78dc 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/DeviceProviderService.cs @@ -35,7 +35,7 @@ namespace Tnb.WarehouseMgr /// Wms设备接口提供程序服务类 /// - public class DeviceProviderService : ServiceLoggerBase + public class DeviceProviderService : DevServBase { private readonly ISqlSugarClient _db; private readonly IWareHouseService _wareHouseService; @@ -45,7 +45,7 @@ namespace Tnb.WarehouseMgr private readonly IElevatorControlService _elevatorControlService; private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build(); private readonly ILoggerFactory _loggerFactory; - public static Dictionary s_eleLoadedStatusDic = new(); + public static Dictionary s_eleUseStatusDic = new(); @@ -54,7 +54,7 @@ namespace Tnb.WarehouseMgr IEventPublisher eventPublisher, IUserManager userManger, IElevatorControlService elevatorControlService - ) //: base(repository.AsSugarClient()) + ) : base(repository.AsSugarClient()) { _db = repository.AsSugarClient(); _wareHouseService = wareHouseService; @@ -62,12 +62,11 @@ namespace Tnb.WarehouseMgr _eventPublisher = eventPublisher; _userManager = userManger; _elevatorControlService = elevatorControlService; - _ = InitializationTask; - if (s_eleLoadedStatusDic.Count < 1) + if (s_eleUseStatusDic.Count < 1) { foreach (var (k, _) in s_elevatorMap) { - s_eleLoadedStatusDic[k] = 0; + s_eleUseStatusDic[k] = 0; } } } @@ -92,7 +91,7 @@ namespace Tnb.WarehouseMgr public async Task LoadConfirm(ConfirmInput input) { Logger.Information("取货确认.................."); - var whereExp = Expressionable.Create() + /*var whereExp = Expressionable.Create() .And((a, b, c) => c.bill_code == input.taskCode) .And((a, b, c) => a.enabled == 1) .AndIF(SqlFunc.Contains("DT-R", input.sourceName), (a, b, c) => c.startpoint_code == input.sourceName) @@ -107,8 +106,10 @@ namespace Tnb.WarehouseMgr distask_id = c.id, device_id = a.elevator_id, }, true) - .FirstAsync(); - + .FirstAsync();*/ + Logger.Information($"当前取货,子任务编号:{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},未找到匹配的电梯任务")); @@ -116,69 +117,52 @@ namespace Tnb.WarehouseMgr } try { - - Logger.Information($"当前任务Id:{elevator.distask_id}"); - Logger.Information($"elevator.device_id={elevator.device_id}"); if (s_elevatorMap.TryGetValue(elevator.device_id, out object? elevatorCode)) { - string devName = elevatorCode?.ToString(); Logger.Information($"获取设备:{devName},状态"); - var tags = new[] { "SysStatus", "RunStatus", "FloorNo", "DoorStatus", "AGVStatus" }; + 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()},运行状态:{runStatus.ToEnum()},Agv状态:{agvStatus.ToEnum()},当前楼层:{floorNo}"); { var curFloor = await GetRealFloor(elevator.end_floor); Logger.Information($"目标楼层:{curFloor},电梯当前楼层:{floorNo}"); Logger.Information($"当前放货设备ID:{elevator.device_id}"); - var loadedStatus = s_eleLoadedStatusDic[elevator.device_id] == 1 ? "完成" : "未完成"; + var loadedStatus = s_eleUseStatusDic[elevator.device_id] == 1 ? "完成" : "未完成"; Logger.Information($"{devName.Match(@"\d+")}#梯,放货-> {loadedStatus}"); - var devId = elevator.device_id; - KeyValuePair freeElePair = new(); - if (s_eleLoadedStatusDic[elevator.device_id] != 1) - { - var loadedStatusPairs = s_eleLoadedStatusDic.Where(kv => kv.Value == 1).ToList(); - var rIdx = Random.Shared.Next(0, loadedStatusPairs.Count); - freeElePair = loadedStatusPairs[rIdx]; - if (!freeElePair.Key.IsNullOrWhiteSpace() && s_elevatorMap.TryGetValue(freeElePair.Key, out object? v)) - { - devId = freeElePair.Key; - devName = v?.ToString()!; - Logger.Information($"查找到已放货的设备:{devName},设备ID:{freeElePair.Key}"); - } - } - - if (s_eleLoadedStatusDic[devId] == 1 && curFloor != floorNo) + if (s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.空闲 && curFloor != floorNo) { _ = await _elevatorControlService.CallLift(devName, elevator.end_floor, CancellationToken.None); - s_eleLoadedStatusDic[devId] = 0; } if (curFloor != floorNo) { return await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!"); } - if (doorStatus.ToEnum() != EnumDoorStatus.开门到位保持 && floorNo == curFloor) //判断电梯楼层与当前放货在同一楼层在允许放货 + if (doorStatus.ToEnum() != EnumDoorStatus.开门到位保持 && runStatus.ToEnum() == EnumRunStatus.停梯 && floorNo == curFloor) //判断电梯楼层与当前放货在同一楼层在允许放货 { _ = await _elevatorControlService.SendOpenCloseCmd(devName, 3); //发送电梯前门开门指令 } - if (sysStatus.ToEnum() == EnumSysStatus.正常状态 && runStatus.ToEnum() == EnumRunStatus.停梯) + if (doorStatus == (int)EnumDoorStatus.开门到位保持 && s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.占用) + { + await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!"); + } + + if (sysStatus.ToEnum() == EnumSysStatus.正常状态 && runStatus.ToEnum() == EnumRunStatus.停梯 + && doorStatus == (int)EnumDoorStatus.开门到位保持) { - //elevator.current_floor = floor; - //await _db.Updateable(elevator).UpdateColumns(it => it.current_floor).ExecuteCommandAsync(); return await ToApiResult(HttpStatusCode.OK, "成功"); } - return await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!"); } } - } catch (Exception) { return await ToApiResult(HttpStatusCode.InternalServerError, "请重试!"); throw; } - return await ToApiResult(HttpStatusCode.OK, "未启用"); + return await ToApiResult(HttpStatusCode.InternalServerError, "请重试!"); } /// @@ -190,17 +174,16 @@ namespace Tnb.WarehouseMgr public async Task UnloadConfirm(ConfirmInput input)// { Logger.Information("放货确认.................."); - Logger.Information($"输入参数:{JsonConvert.SerializeObject(input)}"); + Logger.Information($"当前放货,任务编号:{input.taskCode}"); try { - var whereExp = Expressionable.Create() + /*var whereExp = Expressionable.Create() .And((a, b, c) => c.bill_code == input.taskCode) .And((a, b, c) => a.enabled == 1) .AndIF(SqlFunc.Contains("DT-R", input.sourceName), (a, b, c) => c.startpoint_code == input.sourceName) .AndIF(SqlFunc.Contains("DT-C", input.sourceName), (a, b, c) => c.endlocation_code == input.sourceName) .ToExpression(); - //根据Agv传递的参数获取,对应的电梯 WmsElevatorH elevator = await _db.Queryable().LeftJoin((a, b) => a.id == b.bill_id) .LeftJoin((a, b, c) => b.location_id == c.endlocation_id) @@ -210,19 +193,19 @@ namespace Tnb.WarehouseMgr end_floor = SqlFunc.ToInt32(c.end_floor), device_id = a.elevator_id, }, true) - .FirstAsync(); + .FirstAsync();*/ + ElevagorInfoQuery q = new() { taskCode = input.taskCode }; + WmsElevatorH elevator = await FindElevatorFromPars(q); if (elevator.IsNull()) { Logger.Error($"根据参数,sourceName:{input.sourceName},taskCode:{input.taskCode},未找到匹配的电梯任务"); } - if (s_elevatorMap.TryGetValue(elevator.device_id, out object? elevatorCode)) { string devName = elevatorCode?.ToString(); - var tags = new[] { "SysStatus", "RunStatus", "FloorNo", "DoorStatus", "AGVStatus" }; Logger.Information($"获取设备:{devName},状态"); await Task.Delay(1000); - (int sysStatus, int runStatus, int floorNo, int doorStatus, int agvStatus) = await _elevatorControlService.GetElevatorStatus(devName, tags, CancellationToken.None);//elevator.elevator_code + (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()},运行状态:{runStatus},门状态:{doorStatus},Agv状态:{agvStatus},当前楼层:{floorNo}"); //判断Agv电梯是否进入状态 if (agvStatus != (int)EnumAgvStatus.AGV运行状态) @@ -230,65 +213,37 @@ namespace Tnb.WarehouseMgr await _elevatorControlService.WriteTagAsync(devName, ElevatorConsts.AGVControl, 1); } - Logger.Information("目前正常"); - var curFloor = await GetRealFloor(elevator.end_floor); Logger.Information($"当前放货设备ID:{elevator.device_id}"); - var loadedStatus = s_eleLoadedStatusDic[elevator.device_id] == 1 ? "完成" : "未完成"; - Logger.Information($"{devName.Match(@"\d+")}#梯,放货-> {loadedStatus}"); + var loadedStatus = s_eleUseStatusDic[elevator.device_id] == 1 ? "占用" : "空闲"; + Logger.Information($"{devName.Match(@"\d+")}#梯,状态-> {loadedStatus}"); - var devId = elevator.device_id; - KeyValuePair freeElePair = new(); - if (s_eleLoadedStatusDic[elevator.device_id] != 1) - { - var loadedStatusPairs = s_eleLoadedStatusDic.Where(kv => kv.Value == 1).ToList(); - var rIdx = Random.Shared.Next(0, loadedStatusPairs.Count); - freeElePair = loadedStatusPairs[rIdx]; - if (!freeElePair.Key.IsNullOrWhiteSpace() && s_elevatorMap.TryGetValue(freeElePair.Key, out object? v)) - { - devId = freeElePair.Key; - devName = v?.ToString()!; - Logger.Information($"查找到已放货的设备:{devName},设备ID:{freeElePair.Key}"); - } - } - - if (s_eleLoadedStatusDic[devId] == 1 && curFloor != floorNo) + if (s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.空闲 && curFloor != floorNo) { _ = await _elevatorControlService.CallLift(devName, elevator.end_floor, CancellationToken.None); - s_eleLoadedStatusDic[devId] = 0; } if (curFloor != floorNo) { return await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!"); } Logger.Information($"当前楼层:{curFloor},电梯所在楼层:{floorNo}"); + if (doorStatus == (int)EnumDoorStatus.开门到位保持 && s_eleUseStatusDic[elevator.device_id] == (int)EnumElevatorUseStatus.占用) + { + await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!"); + } //电梯到达目标楼层后,判断当前电梯门状态是否为开门到位保持状态 if (doorStatus != (int)EnumDoorStatus.开门到位保持 && curFloor == floorNo) //判断目标楼层与电梯所在楼层在同一层才可开门放货 { _ = await _elevatorControlService.SendOpenCloseCmd(devName, 3); //发送电梯前门开门指令 } - if (sysStatus == (int)EnumSysStatus.正常状态 && runStatus == (int)EnumRunStatus.停梯 && doorStatus == (int)EnumDoorStatus.开门到位保持) { - Log.Information("进入开门状态,马上要成功了"); - try - { - /* elevator.current_floor = elevator.end_floor; - await _db.Updateable(elevator).UpdateColumns(it => it.current_floor).ExecuteCommandAsync();*/ - - } - catch (Exception ex) - { - Logger.LogError("更新延迟队列异常", ex); - throw; - } - + s_eleUseStatusDic[elevator.device_id] = (int)EnumElevatorUseStatus.占用; return await ToApiResult(HttpStatusCode.OK, "成功"); } } - return await ToApiResult(HttpStatusCode.InternalServerError, "电梯还未开门,请重试!"); } @@ -388,8 +343,8 @@ namespace Tnb.WarehouseMgr Logger.Information($"任务状态上报->接收参数:{JsonConvert.SerializeObject(input)}"); try { - - List disTasks = await _db.Queryable().Where(it => it.bill_code.Contains(input.taskCode)).ToListAsync(); + var disTask = await _db.Queryable().FirstAsync(it => it.bill_code == input.taskCode); + List disTasks = new() { disTask }; if (input.action == "LOAD") { @@ -397,27 +352,19 @@ namespace Tnb.WarehouseMgr { disTaskIds = disTasks.Select(x => x.id).ToList() }; - Logger.Information($"设备取返回输入参数:{JsonConvert.SerializeObject(taskExecuteAfterUpInput)}"); await _wareHouseService.TaskExecuteAfter(taskExecuteAfterUpInput); - Logger.Information($"Agv取货完成,任务Id:{string.Join(",", disTasks.Select(x => x.id))}"); + Logger.Information($"Agv取货完成,任务编号:{string.Join(",", disTasks.Select(x => x.bill_code))}"); - var disTask = disTasks.Find(x => x.bill_code == input.taskCode); if (disTask != null && !disTask.startlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase)) { return await ToApiResult(HttpStatusCode.OK, "成功"); } //根据Agv传递的参数获取,对应的电梯 - WmsElevatorH elevator = await _db.Queryable().LeftJoin((a, b) => a.id == b.bill_id) - .Where((a, b) => b.location_id == disTask.startlocation_id) - .Select((a, b) => new WmsElevatorH - { - device_id = a.elevator_id, - }, true) - .FirstAsync(); - - s_eleLoadedStatusDic[elevator.device_id] = 1; + ElevagorInfoQuery q = new() { taskCode = input.taskCode }; + WmsElevatorH elevator = await FindElevatorFromPars(q); + 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(); @@ -433,7 +380,6 @@ namespace Tnb.WarehouseMgr WmsElevatorUnexecute elevatorQueueItem = await _db.Queryable().FirstAsync(it => disTasks.Select(x => x.id).Contains(it.distask_id) && it.task_status == "执行中"); if (elevatorQueueItem != null) { - _ = await _db.Deleteable(elevatorQueueItem).ExecuteCommandAsync(); } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs b/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs index 53faec60..b2d76469 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/ElevatorControlService.cs @@ -190,18 +190,18 @@ namespace Tnb.WarehouseMgr public async Task SendOpenCloseCmd(string devName, int value) { var flag = false; - /*Dictionary dicCommand = new(StringComparer.OrdinalIgnoreCase) + Dictionary dicCommand = new(StringComparer.OrdinalIgnoreCase) { ["DevName"] = devName, ["token"] = _elevatorCtlCfg.token, ["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); + _ = await HttpClientHelper.GetAsync(_elevatorCtlCfg.WriteTagUrl, pars: dicCommand); + //flag = await RedisHelper.HSetAsync(devName, ElevatorConsts.DoorExecute, value); } catch (Exception) { @@ -236,16 +236,16 @@ namespace Tnb.WarehouseMgr /// public async Task WriteTagAsync(string devName, string tagName, int value) { - /*Dictionary dicCommand = new(StringComparer.OrdinalIgnoreCase) + Dictionary dicCommand = new(StringComparer.OrdinalIgnoreCase) { ["DevName"] = devName, ["token"] = _elevatorCtlCfg.token, ["TagName"] = tagName, ["Value"] = value.ToString() }; - return await HttpClientHelper.GetAsync(_elevatorCtlCfg.WriteTagUrl, pars: dicCommand);*/ + return await HttpClientHelper.GetAsync(_elevatorCtlCfg.WriteTagUrl, pars: dicCommand); - return await RedisHelper.HSetAsync(devName, tagName, value); + //return await RedisHelper.HSetAsync(devName, tagName, value); } @@ -272,7 +272,7 @@ namespace Tnb.WarehouseMgr if (eleStatusMap.ContainsKey(tagName)) { JObject jo = JObject.Parse(eleStatusMap[tagName]); - return jo.Value("V"); + return jo.Value("Value"); } return -1; } @@ -355,7 +355,7 @@ namespace Tnb.WarehouseMgr { if (statusMap.ContainsKey(tag)) { - jos.Add(JObject.Parse(tag)); + jos.Add(JObject.Parse(statusMap[tag])); } } @@ -377,7 +377,7 @@ namespace Tnb.WarehouseMgr continue; } string? tagName = jo!.Value("TagName"); - int value = jo!.Value("V"); + int value = jo!.Value("Value"); if (propertyMap.TryGetValue(tagName!, out var setProperty)) { @@ -457,12 +457,12 @@ namespace Tnb.WarehouseMgr { _ = await SendOpenCloseCmd(devName, (int)EnumAgvControl.前门关门); } - isSuccefuly = await WriteTagAsync(devName, ElevatorConsts.FloorExecute, floor); //呼叫电梯到指定楼层 - //if (!string.IsNullOrEmpty(result)) - //{ - // JObject jo = JObject.Parse(result); - // isSuccefuly = jo?.Value("Result")?.Equals("Ok", StringComparison.OrdinalIgnoreCase) ?? false; - //} + dynamic result = await WriteTagAsync(devName, ElevatorConsts.FloorExecute, floor); //呼叫电梯到指定楼层 + if (!string.IsNullOrEmpty(result)) + { + JObject jo = JObject.Parse(result); + isSuccefuly = jo?.Value("Result")?.Equals("Ok", StringComparison.OrdinalIgnoreCase) ?? false; + } } return isSuccefuly; } @@ -486,22 +486,8 @@ namespace Tnb.WarehouseMgr { throw new ArgumentNullException(nameof(input.devNames)); } - //var tasks = ParallelWriteTagAsync(input); - List> devInfoList = new(); - foreach (var dn in input.devNames) - { - var eleStatusMap = await RedisHelper.HGetAllAsync(dn); - if (eleStatusMap?.Count > 0) - { - devInfoList.Add(eleStatusMap); - } - } - foreach (var devMap in devInfoList) - { - devMap[ElevatorConsts.AGVControl] = input.value.ToString(); - } - - //var writeRes = await Task.WhenAll(tasks); + var tasks = ParallelWriteTagAsync(input); + var writeRes = await Task.WhenAll(tasks); var timedTaskSvc = _backgudSvc as TimedTaskBackgroundService; if (timedTaskSvc != null) { diff --git a/WarehouseMgr/Tnb.WarehouseMgr/ServiceLoggerBase`1.cs b/WarehouseMgr/Tnb.WarehouseMgr/ServiceLoggerBase`1.cs deleted file mode 100644 index f4c9cb7c..00000000 --- a/WarehouseMgr/Tnb.WarehouseMgr/ServiceLoggerBase`1.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System.Text; -using JNPF; -using Microsoft.Extensions.Logging; -using SqlSugar; -using Tnb.WarehouseMgr.Entities; - -namespace Tnb.WarehouseMgr -{ - public class ServiceLoggerBase : BaseWareHouseService - { - protected static Dictionary s_elevatorMap = new(); - private static readonly Lazy initializationTask; - - - static ServiceLoggerBase() - { - initializationTask = new Lazy(InitializeAsync); - } - - - - private static async Task InitializeAsync() - { - - ConnectionStringsOptions connectionOpts = App.GetConfig("ConnectionStrings", true); - ConnectionConfig cfg = new() - { - ConfigId = connectionOpts.ConfigId, - ConnectionString = connectionOpts.ConnectString, - DbType = DbType.PostgreSQL, - IsAutoCloseConnection = true, - }; - SqlSugarScope context = new(cfg); - - s_elevatorMap = await context.Queryable().ToDictionaryAsync(x => x.elevator_id, x => x.elevator_code); - - } - public static Task InitializationTask => initializationTask.Value; - - - - //protected ILogger Logger => LoggerFactory.Create(builder => builder.AddFile($"{AppContext.BaseDirectory}/logs/{this.GetType().Name}{DateTime.Now:yyyyMMdd}.log", cfgOpts => - //{ - - // //cfgOpts.DateFormat = "yyyy-MM-dd HH:mm:ss.fff"; - // cfgOpts.MessageFormat = (logMsg) => - // { - // Span span = logMsg.LogLevel.ToString().ToCharArray(); - // StringBuilder sb = new(); - // _ = sb.Append($"{span[..4]} "); - // _ = 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(); - // }; - - //})).CreateLogger(this.GetType()); - } - - public static class CustomLoggerExtenstions - { - public static void Debug(this ILogger logger, string message, params object[] parameters) - { - logger.Debug(message, parameters); - } - - public static void Information(this ILogger logger, string message, params object[] parameters) - { - logger.LogInformation(message, parameters); - } - - public static void Error(this ILogger logger, string message, Exception ex, params object[] parameters) - { - logger.LogError(ex, message, parameters); - } - - public static void Error(this ILogger logger, string message, params object[] parameters) - { - logger.LogError(message, parameters); - } - } -} diff --git a/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs b/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs index a13d97ba..133ec02c 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/TimedTaskBackgroundService.cs @@ -46,16 +46,16 @@ namespace Tnb.WarehouseMgr { foreach (var devName in s_heartbeatDevNames) { - /* Dictionary parameter = new() - { - ["DevName"] = devName, - ["TagName"] = ElevatorConsts.AGVKeepalive, - ["Value"] = "123", - ["token"] = _elevatorControlConfiguration.token - }; - string result = await HttpClientHelper.GetAsync(_elevatorControlConfiguration.WriteTagUrl, pars: parameter); - */ - var result = await RedisHelper.HSetAsync(devName, ElevatorConsts.AGVKeepalive, "123"); + Dictionary parameter = new() + { + ["DevName"] = devName, + ["TagName"] = ElevatorConsts.AGVKeepalive, + ["Value"] = "123", + ["token"] = _elevatorControlConfiguration.token + }; + string result = await HttpClientHelper.GetAsync(_elevatorControlConfiguration.WriteTagUrl, pars: parameter); + + //var result = await RedisHelper.HSetAsync(devName, ElevatorConsts.AGVKeepalive, "123"); await Console.Out.WriteLineAsync($"{devName.Match(@"\d+")}#梯, 心跳检测结果:{result}"); } }, stoppingToken, 30); diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index 8afa268e..acd33811 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -13,6 +13,7 @@ using JNPF.Systems.Interfaces.System; using Mapster; using Microsoft.AspNetCore.Mvc; using Microsoft.CodeAnalysis; +using Microsoft.Extensions.Configuration; using Newtonsoft.Json; using NPOI.OpenXmlFormats.Dml; using SqlSugar; @@ -24,6 +25,7 @@ using Tnb.WarehouseMgr.Entities.Configs; using Tnb.WarehouseMgr.Entities.Consts; using Tnb.WarehouseMgr.Entities.Dto; using Tnb.WarehouseMgr.Entities.Dto.Inputs; +using Tnb.WarehouseMgr.Entities.Dto.Queries; using Tnb.WarehouseMgr.Entities.Entity; using Tnb.WarehouseMgr.Entities.Enums; using Tnb.WarehouseMgr.Interfaces; @@ -33,7 +35,7 @@ namespace Tnb.WarehouseMgr /// /// 库房业务类(出入库) /// - public class WareHouseService : ServiceLoggerBase, IWareHouseService + public class WareHouseService : DevServBase, IWareHouseService { private readonly ISqlSugarClient _db; private readonly IDictionaryDataService _dictionaryDataService; @@ -44,11 +46,14 @@ namespace Tnb.WarehouseMgr private static readonly Dictionary _elevatorAgvCtlStatusMap = new(StringComparer.OrdinalIgnoreCase); private readonly ElevatorControlConfiguration _eleCtlCfg = App.Configuration.Build(); private static Dictionary locMap = new Dictionary(StringComparer.OrdinalIgnoreCase); + private readonly IConfiguration _configuration; public Func AddUnExecuteTask { get; set; } + public WareHouseService(ISqlSugarRepository repository, IDictionaryDataService dictionaryDataService, - IBillRullService billRullService, IUserManager userManager, ICacheManager cacheManager, IElevatorControlService elevatorControlService) - //: base(repository.AsSugarClient()) + IBillRullService billRullService, IUserManager userManager, ICacheManager cacheManager, IElevatorControlService elevatorControlService + //IConfiguration configuration + ) : base(repository.AsSugarClient()) { _db = repository.AsSugarClient(); _dictionaryDataService = dictionaryDataService; @@ -56,7 +61,7 @@ namespace Tnb.WarehouseMgr _userManager = userManager; _cacheManager = cacheManager; _elevatorControlService = elevatorControlService; - _ = InitializationTask; + //_configuration = configuration; } @@ -240,7 +245,7 @@ namespace Tnb.WarehouseMgr try { //获取电梯数据 - List elevatorList = await db.Queryable().InnerJoin((a, b) => a.id == b.bill_id) + /*List elevatorList = await db.Queryable().InnerJoin((a, b) => a.id == b.bill_id) .Where((a, b) => a.enabled == 1) .Select((a, b) => new WmsElevatorH { @@ -252,14 +257,14 @@ namespace Tnb.WarehouseMgr point_code = b.point_code, floor = b.floor - }, true).ToListAsync(); + }, true).ToListAsync();*/ //获取所有未下发的预任务申请 List preTasks = await db.Queryable().InnerJoin((a, b) => a.startlocation_id == b.location_id && a.carry_id == b.id) .InnerJoin((a, b, c) => a.area_id == c.id) .InnerJoin((a, b, c, d) => a.endlocation_id == d.id && d.is_use == "0") - .Where(a => a.status != WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID && !string.IsNullOrWhiteSpace(a.startlocation_id)) + .Where(a => a.status == WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID && !string.IsNullOrWhiteSpace(a.startlocation_id)) .OrderBy(a => new { priority = SqlFunc.Desc(a.priority), a.bill_code }) .Select((a, b, c, d) => new WmsPretaskH { @@ -268,7 +273,7 @@ namespace Tnb.WarehouseMgr }, true) .ToListAsync(); - List executedPreTasks = await db.Queryable().Where(it => it.status != WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID && it.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID).ToListAsync(); + //List executedPreTasks = await db.Queryable().Where(it => it.status != WmsWareHouseConst.PRETASK_BILL_STATUS_DXF_ID && it.status != WmsWareHouseConst.PRETASK_BILL_STATUS_COMPLE_ID).ToListAsync(); List agvElevatorTasks = preTasks .Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) && @@ -283,11 +288,6 @@ namespace Tnb.WarehouseMgr IEnumerable firstEleGrp = agvElevatorTasks.GroupBy(g => g.endlocation_code).Select(t => t.OrderBy(o => o.bill_code).FirstOrDefault()); agvElevatorTasks = firstEleGrp?.ToList() ?? Enumerable.Empty().ToList()!; - var diffEndLocPreTasks = executedPreTasks.Where(it => firstEleGrp.Select(x => x.endlocation_id).Contains(it.endlocation_id)).ToList(); - if(diffEndLocPreTasks?.Count> 0) - { - agvElevatorTasks = agvElevatorTasks.Where(it => !diffEndLocPreTasks.Select(x => x.endlocation_id).Contains(it.endlocation_id)).ToList(); - } //如果电梯任务,预Agv任务存在相同目标库位,删除Agv任务保证电梯任务先行 var equalEndLocPreTasks = elePreTasks.Select(x => x.endlocation_code).Intersect(agvElevatorTasks.Select(x => x.endlocation_code)); @@ -388,27 +388,6 @@ namespace Tnb.WarehouseMgr } await db.Ado.BeginTranAsync(); - List endPointIds = disTasks.Where(t => t.area_code.StartsWith("ELE", StringComparison.OrdinalIgnoreCase)).Select(t => t.endpoint_id).ToList(); - Logger.Information($"endPointIds:{string.Join(",", endPointIds)}"); - if (endPointIds?.Count > 0) - { - elevatorList = elevatorList.FindAll(x => endPointIds.Contains(x.point_id)); - - - if (elevatorList?.Count > 0) - { - foreach (WmsElevatorH? e in elevatorList) - { - WmsDistaskH? disTask = disTasks.Find(x => x.endpoint_id == e.point_id); - if (disTask != null) - { - disTask.device_id = e.elevator_id; - } - } - } - } - - int row = await db.Insertable(disTasks).ExecuteCommandAsync(); if (preTaskCodes?.Count > 0) { @@ -423,15 +402,27 @@ namespace Tnb.WarehouseMgr await db.Ado.CommitTranAsync(); Logger.Information("预任务执行完成"); - + Logger.Information($"_eleCtlCfg.Environment={_eleCtlCfg.Environment}"); if (string.Equals(_eleCtlCfg.Environment, ElevatorConsts.EnvironmentName, StringComparison.OrdinalIgnoreCase)) { //呼梯操作 //获取目标库位为电梯库位的任务 + Logger.Information("操作设备"); var agvDTTasks = disTasks.Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) && !it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList(); - foreach (var at in agvDTTasks) + + 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; + } + } + + /*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}"); @@ -439,10 +430,12 @@ namespace Tnb.WarehouseMgr { 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(); + var callLiftCnt = endLocCodes?.Count ?? 0; + Logger.Information($"呼梯任务数:{callLiftCnt}"); if (endLocCodes?.Count > 0) { if (endLocCodes.Select(x => x.device_id).All(x => !x.IsNullOrWhiteSpace())) @@ -468,18 +461,14 @@ namespace Tnb.WarehouseMgr _ = ExecuteTargetFloorTask(elevatorTask); } } + List agvTasks = disTasks.Where(it => !it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList(); + if (agvTasks?.Count > 0) + { + Logger.Information($"Agv任务数量:{agvTasks.Count},taskCodes:{string.Join(",", agvTasks.Select(x => x.bill_code).Distinct())}"); + _ = AgvDispatch(agvTasks, agvCts.Token); + } } - //调用AGV创建任务链接口 - List agvTasks = disTasks.Where(it => !it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList(); - - if (agvTasks?.Count > 0) - { - Logger.Information($"Agv任务数量:{agvTasks.Count},taskCodes:{string.Join(",", agvTasks.Select(x => x.bill_code).Distinct())}"); - _ = AgvDispatch(agvTasks, agvCts.Token); - } - - } } catch (Exception ex) when (ex is HttpRequestException hReqEx) diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsCheckTaskService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsCheckTaskService.cs index 5a870070..371801cb 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsCheckTaskService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsCheckTaskService.cs @@ -34,7 +34,7 @@ namespace Tnb.WarehouseMgr /// 盘点任务 /// [OverideVisualDev(ModuleConsts.MODULE_WMSCHECKTASK_ID)] - public class WmsCheckTaskService : ServiceLoggerBase + public class WmsCheckTaskService : BaseWareHouseService { private readonly ISqlSugarClient _db; private readonly IWareHouseService _warehouseService; diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyInstockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyInstockService.cs index f0d9d671..5bc60bf4 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyInstockService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsEmptyInstockService.cs @@ -34,7 +34,7 @@ namespace Tnb.WarehouseMgr [OverideVisualDev(ModuleConsts.MODULE_WMSEMPTYINSTOCK_ID)] [ServiceModule(BizTypeId)] - public class WmsEmptyInstockService : ServiceLoggerBase, IWmsEmptyInstockService + public class WmsEmptyInstockService : BaseWareHouseService, IWmsEmptyInstockService { private const string BizTypeId = "26121986416677"; private readonly ISqlSugarClient _db; diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsInternalTempTestService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsInternalTempTestService.cs index 0c79af2c..d9984fcc 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsInternalTempTestService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsInternalTempTestService.cs @@ -17,6 +17,7 @@ using Tnb.Common.Extension; using Tnb.WarehouseMgr.Entities; using Tnb.WarehouseMgr.Entities.Configs; using Tnb.WarehouseMgr.Entities.Consts; +using Tnb.WarehouseMgr.Entities.Dto.Queries; using Tnb.WarehouseMgr.Entities.Entity; using Tnb.WarehouseMgr.Entities.Enums; @@ -113,5 +114,21 @@ namespace Tnb.WarehouseMgr var locCfg = _configuration.Build(); return Task.FromResult(_configuration["TestLocation"]); } + + public async Task GetElevatorByBillCode(ElevagorInfoQuery input) + { + var ele = await _db.CopyNew().Queryable().InnerJoin((a, b) => a.id == b.bill_id) + .InnerJoin((a, b, c) => b.location_code == c.endlocation_code) + .WhereIF(SqlFunc.IsNullOrEmpty(input.taskCode), (a, b, c) => c.bill_code == input.taskCode) + .WhereIF(SqlFunc.IsNullOrEmpty(input.endlocation_id), (a, b, c) => c.endlocation_id == input.endlocation_id) + .Select((a, b, c) => new WmsElevatorH { bill_code = c.bill_code, device_id = a.elevator_id }, true) + .FirstAsync(); + //_db.Aop.OnLogExecuting = (sql, args) => + //{ + // var q = sql; + // Console.WriteLine("sql stat:" + sql); + //}; + return ele; + } } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WmsOutStockService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WmsOutStockService.cs index e5c81b4e..c5b5a42d 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WmsOutStockService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WmsOutStockService.cs @@ -35,7 +35,7 @@ namespace Tnb.WarehouseMgr /// [OverideVisualDev(ModuleConsts.MODULE_WMSOUTSTOCK_ID)] [ServiceModule(BizTypeId)] - public class WmsOutStockService : ServiceLoggerBase, IWmsOutStockService + public class WmsOutStockService : DevServBase, IWmsOutStockService { private const string BizTypeId = "26191522660645"; private readonly ISqlSugarClient _db; @@ -59,7 +59,7 @@ namespace Tnb.WarehouseMgr IBillRullService billRullService, IWmsCarryMoveInStockService wmsCarryMoveInStockService, IWmsCarryService wareCarryService, - IEventPublisher eventPublisher) + IEventPublisher eventPublisher) : base(repository.AsSugarClient()) { _db = repository.AsSugarClient(); _dictionaryDataService = dictionaryDataService; @@ -72,7 +72,6 @@ namespace Tnb.WarehouseMgr _wareCarryService = wareCarryService; OverideFuncs.CreateAsync = OutStockApplyFor; - _ = InitializationTask; } public async Task OutStockApplyFor(VisualDevModelDataCrInput input) @@ -115,7 +114,7 @@ namespace Tnb.WarehouseMgr List freeLocIds = fLocIds.Except(minTaskNumLocs.Select(x => x.endlocation_id)).ToList(); if (freeLocIds?.Count > 0) { - int rIdx = Random.Shared.Next(0, freeLocIds.Count); + int rIdx = Random.Shared.Next(0, freeLocIds.Count); loc = await _db.Queryable().SingleAsync(it => it.id == freeLocIds[rIdx]); } else @@ -210,7 +209,7 @@ namespace Tnb.WarehouseMgr if (carryMats.Count > 0) { carryMats.ForEach(x => x.id = SnowflakeIdHelper.NextId()); - carryMats = carryMats.OrderBy(o => o.create_time).GroupBy(g => new { g.carry_id, g.material_id, g.code_batch , g.material_specification,g.container_no }) + carryMats = carryMats.OrderBy(o => o.create_time).GroupBy(g => new { g.carry_id, g.material_id, g.code_batch, g.material_specification, g.container_no }) .Select(x => { WmsCarryMat[] arr = x.ToArray(); @@ -847,7 +846,7 @@ namespace Tnb.WarehouseMgr string? billDId = otds?.Find(xx => xx.material_id == x.material_id && xx.code_batch == x.code_batch && xx.material_specification == x.material_specification && xx.container_no == x.container_no)?.id; if (billDId.IsNullOrEmpty()) { - billDId = otds?.Find(xx => xx.material_id == x.material_id )?.id; + billDId = otds?.Find(xx => xx.material_id == x.material_id)?.id; } x.id = SnowflakeIdHelper.NextId(); x.bill_id = input.requireId; @@ -893,7 +892,7 @@ namespace Tnb.WarehouseMgr List osCodes = input.distaskCodes.Adapt>(); osCodes.ForEach(x => { - string? billDId = otds?.Find(xx => xx.material_id == x.material_id && xx.code_batch == x.code_batch && xx.material_specification == x.material_specification && xx.container_no == x.container_no )?.id; + string? billDId = otds?.Find(xx => xx.material_id == x.material_id && xx.code_batch == x.code_batch && xx.material_specification == x.material_specification && xx.container_no == x.container_no)?.id; if (billDId.IsNullOrEmpty()) { billDId = otds?.Find(xx => xx.material_id == x.material_id)?.id; diff --git a/apihost/Tnb.API.Entry/Configurations/ElevatorControlSettings.json b/apihost/Tnb.API.Entry/Configurations/ElevatorControlSettings.json index b5a55f06..2ffda1d4 100644 --- a/apihost/Tnb.API.Entry/Configurations/ElevatorControlSettings.json +++ b/apihost/Tnb.API.Entry/Configurations/ElevatorControlSettings.json @@ -2,6 +2,7 @@ "DevName3": "Elevator3", "DevName4": "Elevator4", "HeartbeatDevNames": [ "Elevator3", "Elevator4" ], + "tags": [ "SysStatus", "RunStatus", "FloorNo", "DoorStatus", "AGVStatus" ], "token": "780BE4144636CF47DDF3920B0F1D069B", "GetTagListUrl": "http://192.168.11.110:9100/Dev/GetTagList", "GetTagUrl": "http://192.168.11.110:9100/Dev/GetTag", diff --git a/apihost/Tnb.API.Entry/Configurations/Location.json b/apihost/Tnb.API.Entry/Configurations/Location.json index 17fcbc1d..82fd2b30 100644 --- a/apihost/Tnb.API.Entry/Configurations/Location.json +++ b/apihost/Tnb.API.Entry/Configurations/Location.json @@ -1,3 +1,3 @@ { - "TestLocation": "fffdfadfaf" + "TestLocation": "CP-A08-47" } \ No newline at end of file