diff --git a/Directory.Build.props b/Directory.Build.props index a363d7b9..a78d6df4 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -3,6 +3,9 @@ $(MSBuildThisFileDirectory) latest $(NoWarn);CS1570;CS1587;CS1591;CS8601;CS8602;CS8603;CS8618; + enable + enable + diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Configs/ElevatorControlConfiguration.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Configs/ElevatorControlConfiguration.cs index 07ec571e..c50e9373 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Configs/ElevatorControlConfiguration.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Configs/ElevatorControlConfiguration.cs @@ -20,5 +20,6 @@ /// public string WriteTagUrl { get; set; } + public string Environment { get; set; } } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ElevatorConsts.cs b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ElevatorConsts.cs index 1a440145..72a7107c 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ElevatorConsts.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr.Entities/Consts/ElevatorConsts.cs @@ -50,5 +50,11 @@ /// AGV心跳 /// public const string AGVKeepalive = "AGVKeepalive"; + /// + /// 运行环境名称 + /// + public const string EnvironmentName = "TIANYI"; + + } } diff --git a/WarehouseMgr/Tnb.WarehouseMgr/Tnb.WarehouseMgr.csproj b/WarehouseMgr/Tnb.WarehouseMgr/Tnb.WarehouseMgr.csproj index 238adaa3..1e562b1a 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/Tnb.WarehouseMgr.csproj +++ b/WarehouseMgr/Tnb.WarehouseMgr/Tnb.WarehouseMgr.csproj @@ -9,6 +9,10 @@ Debug;Release;tianyi + + + + diff --git a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs index f8a94183..f0d72f5d 100644 --- a/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs +++ b/WarehouseMgr/Tnb.WarehouseMgr/WareHouseService.cs @@ -263,9 +263,12 @@ namespace Tnb.WarehouseMgr .Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) && !it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)) .ToList(); + preTasks = preTasks.Where(it => !agvElevatorTasks.Select(x=>x.endlocation_code).Contains(it.endlocation_code)).ToList(); + IEnumerable firstEleGrp = agvElevatorTasks.GroupBy(g => g.endlocation_code).Select(t => t.OrderBy(o => o.bill_code).FirstOrDefault()); agvElevatorTasks = agvElevatorTasks.FindAll(x => firstEleGrp.Select(y => y.endlocation_code).Contains(x.endlocation_code)); - preTasks = preTasks.Where(it => !it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase)).Concat(agvElevatorTasks).ToList(); + preTasks = preTasks.Concat(agvElevatorTasks).ToList(); + List ids = preTasks.Select(x => x.id).Distinct().ToList(); List? preTaskCodes = await db.Queryable().Where(it => ids.Contains(it.bill_id)).ToListAsync(); @@ -382,38 +385,42 @@ namespace Tnb.WarehouseMgr await db.Ado.CommitTranAsync(); - //呼梯操作 - //获取目标库位为电梯库位的任务 - List<(string endlocation_code, string device_id, string id, string? start_floor)> endLocCodes = disTasks - .Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) && - !it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)) - .Select(it => (it.endlocation_code, it.device_id, it.id, it.start_floor)).ToList(); - if (endLocCodes?.Count > 0) + if(_eleCtlCfg.Environment == ElevatorConsts.EnvironmentName) { - - await CallingLanding(endLocCodes); - } - //执行电梯任务 - List? elevatorTasks = disTasks.Where(it => it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList(); - - if (elevatorTasks?.Count > 0) - { - Logger.Information($"当前电梯任务数:{elevatorTasks?.Count ?? 0}"); - Logger.Information("准备执行电梯任务"); - Logger.Information("执行电梯任务"); - - foreach (WmsDistaskH? elevatorTask in elevatorTasks) + //呼梯操作 + //获取目标库位为电梯库位的任务 + List<(string endlocation_code, string device_id, string id, string? start_floor)> endLocCodes = disTasks + .Where(it => it.endlocation_code.StartsWith("DT", StringComparison.OrdinalIgnoreCase) && + !it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)) + .Select(it => (it.endlocation_code, it.device_id, it.id, it.start_floor)).ToList(); + if (endLocCodes?.Count > 0) { - await ExecuteTargetFloorTask(elevatorTask); - } + await CallingLanding(endLocCodes); + } + //执行电梯任务 + List? elevatorTasks = disTasks.Where(it => it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList(); + + if (elevatorTasks?.Count > 0) + { + Logger.Information($"当前电梯任务数:{elevatorTasks?.Count ?? 0}"); + Logger.Information("准备执行电梯任务"); + Logger.Information("执行电梯任务"); + + foreach (WmsDistaskH? elevatorTask in elevatorTasks) + { + await ExecuteTargetFloorTask(elevatorTask); + } + + } + ////调用AGV创建任务链接口 + List agvTasks = disTasks.Where(it => !it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList(); + if (agvTasks?.Count > 0) + { + await AgvDispatch(agvTasks, agvCts.Token); + } } - ////调用AGV创建任务链接口 - List agvTasks = disTasks.Where(it => !it.area_code.Contains("ELE", StringComparison.OrdinalIgnoreCase)).ToList(); - if (agvTasks?.Count > 0) - { - await AgvDispatch(agvTasks, agvCts.Token); - } + } } catch (Exception ex) when (ex is HttpRequestException hReqEx) diff --git a/apihost/Tnb.API.Entry/Configurations/ElevatorControlSettings.json b/apihost/Tnb.API.Entry/Configurations/ElevatorControlSettings.json index 33b95bee..caecf272 100644 --- a/apihost/Tnb.API.Entry/Configurations/ElevatorControlSettings.json +++ b/apihost/Tnb.API.Entry/Configurations/ElevatorControlSettings.json @@ -3,5 +3,6 @@ "token": "780BE4144636CF47DDF3920B0F1D069B", "GetTagListUrl": "http://192.168.11.110:9100/Dev/GetTagList", "GetTagUrl": "http://192.168.11.110:9100/Dev/GetTag", - "WriteTagUrl": "http://192.168.11.110:9100/Dev/writeTag" + "WriteTagUrl": "http://192.168.11.110:9100/Dev/writeTag", + "Environment": "" } \ No newline at end of file diff --git a/common/Tnb.Common/Extension/TnbStringExtensions.cs b/common/Tnb.Common/Extension/TnbStringExtensions.cs index 25e9d5d8..c6412e97 100644 --- a/common/Tnb.Common/Extension/TnbStringExtensions.cs +++ b/common/Tnb.Common/Extension/TnbStringExtensions.cs @@ -184,7 +184,10 @@ public static class StringExtensions #endregion - public static (string, string) LastSplit(this string str, char seperate) + /// + /// 查找路径的上一级 + /// + public static (string?, string) LastSplitOnce(this string str, char seperate) { int n = str.LastIndexOf(seperate); if (n > 0) @@ -193,7 +196,8 @@ public static class StringExtensions } else { - return (str, null); + return (null, str); } } + } \ No newline at end of file diff --git a/visualdev/Tnb.Vengine/Domain/VmQueryParser.cs b/visualdev/Tnb.Vengine/Domain/VmQueryParser.cs index dc1729f7..5f698831 100644 --- a/visualdev/Tnb.Vengine/Domain/VmQueryParser.cs +++ b/visualdev/Tnb.Vengine/Domain/VmQueryParser.cs @@ -8,52 +8,57 @@ namespace Tnb.Vengine.Domain private readonly IDataAccess _dataAccess; private readonly Vmodel _root; private List _outputs; - private Dictionary _selectProps = new Dictionary(); + private Dictionary _selectProps = new Dictionary(); private Dictionary _navModels = new Dictionary(); public VmQueryParser(IDataAccess dataAccess, Vmodel rootModel, string output) { _dataAccess = dataAccess; _root = rootModel; - _outputs = output.Split(',').Distinct().ToList(); - ParseOutputStr(); + ParseOutputStr(output); } /// /// 按模型组织要输出的属性 /// - private void ParseOutputStr() + private void ParseOutputStr(string output) { + _outputs = output.Split(',').Distinct().ToList(); + _selectProps.Add(Vmodel.MAIN_ALIES, new VmSelect() { navModel = _root }); foreach (var outStr in _outputs) { - if (string.IsNullOrWhiteSpace(outStr)) + if (string.IsNullOrWhiteSpace(outStr)) continue; + var codes = outStr.Split('.'); + if (codes.Length == 1) { + _selectProps[Vmodel.MAIN_ALIES].propCodes.Add(outStr); continue; } - string vmPath; - int n = outStr.LastIndexOf('.'); - if (n < 1) + var vmPath = ""; + for (int i = 0; i < codes.Length - 1; i++) { - vmPath = Vmodel.MAIN_ALIES; + vmPath = i == 0 ? codes[i] : vmPath + "." + codes[i]; + if (!_selectProps.ContainsKey(vmPath)) + { + _selectProps.Add(vmPath, new VmSelect(vmPath, i + 2)); + } + if (i == codes.Length - 2) + { + _selectProps[vmPath].propCodes.Add(codes[i + 1]); + } } - else - { - vmPath = outStr.Substring(0, n); - } - if (!_selectProps.ContainsKey(vmPath)) - { - _selectProps.Add(vmPath, new OutputSelect { navPaths = vmPath.Split(',').ToList(), vmPath = vmPath }); - } - var outSelect = _selectProps[vmPath]; - outSelect.propCodes.Add(outStr.Substring(n + 1)); } } private async Task LoadNavModel() { + var keys = _selectProps.Keys.Where(a => a != Vmodel.MAIN_ALIES).OrderBy(a => a).ToList(); foreach (var selVm in _selectProps.Values) { - //if(selVm.navModel != null) + if (_navModels.ContainsKey(selVm.path)) + { + continue; + } } - var navProps = _root.navProps.Where(a => _selectProps.Values.Any(b => b.vmPath.StartsWith(a.code + "."))).ToList(); + var navProps = _root.navProps.Where(a => _selectProps.Values.Any(b => b.path.StartsWith(a.code + "."))).ToList(); await LoadVmodelNavigateAsync(navProps); } private async Task LoadVmodelNavigateAsync(List navProps) @@ -65,30 +70,30 @@ namespace Tnb.Vengine.Domain foreach (var navProp in navProps) { navProp.naviModel = (Vmodel)navs.GetOrDefault(navProp.vmid); - navProp.naviModel.navProps.Where(a => _selectProps.Values.Any(b => b.vmPath.StartsWith(a.code + "."))).ToList(); + navProp.naviModel.navProps.Where(a => _selectProps.Values.Any(b => b.path.StartsWith(a.code + "."))).ToList(); } } } - internal class OutputSelect + internal class VmSelect { public Vmodel? navModel { get; set; } - public string navPath { get; set; } = string.Empty; - public string vmPath { get; set; } = string.Empty; + public string path { get; set; } = Vmodel.MAIN_ALIES; + public int level { get; set; } = 1; public eNavigateType navType { get; set; } = eNavigateType.None; public List navPaths { get; set; } = new List(); public List propCodes { get; set; } = new List(); public List fieldCodes { get; set; } = new List(); - public OutputSelect() + public VmSelect() { - } - public OutputSelect(Vmodel model) + public VmSelect(string vmPath, int vmLevel) { - vmPath = Vmodel.MAIN_ALIES; + path = vmPath; + level = vmLevel; } } diff --git a/visualdev/Tnb.Vengine/Domain/Vmodel.cs b/visualdev/Tnb.Vengine/Domain/Vmodel.cs index 070ce510..23198e81 100644 --- a/visualdev/Tnb.Vengine/Domain/Vmodel.cs +++ b/visualdev/Tnb.Vengine/Domain/Vmodel.cs @@ -332,7 +332,7 @@ public partial class Vmodel : Entity if (navCode == VmSelectProp.MAIN_ALIES) continue; var navProp = navProps.First(a => a.code == navCode); if (navProp.naviModel == null || navProp.navType != eNavigateType.OneToOne) continue; - JoinInfoParameter join = new JoinInfoParameter { TableName = navProp.naviModel.tableName, ShortName = navCode, Type = JoinType.Inner }; + JoinInfoParameter join = new JoinInfoParameter { TableName = navProp.naviModel.tableName, ShortName = navCode, Type = JoinType.Left }; var fkField = navProp.naviModel.PropCodeToFieldCode(navProp.fkField); var refField = navProp.refField; if (navProp.refCode != VmSelectProp.MAIN_ALIES)