diff --git a/StandardScene.Core/WebApi.cs b/StandardScene.Core/WebApi.cs index ea1f391..5ab2c93 100644 --- a/StandardScene.Core/WebApi.cs +++ b/StandardScene.Core/WebApi.cs @@ -2580,7 +2580,6 @@ namespace StandardScene ); } - var carId = singleCar.id; var alarmsList = new List(); if ( singleCar.status.enums.ContainsKey("AlarmInfo") @@ -2599,16 +2598,18 @@ namespace StandardScene } } - var currentSite = SimpleLib.GetSite(singleCar.status.holdingLocks.FirstOrDefault()); - var blockedBy = singleCar.status.blockedBy.ToHashSet(); + var holdingLocks = singleCar.status.holdingLocks; + var currentSite = SimpleLib.GetSite(holdingLocks?.FirstOrDefault() ?? 0); + var blockedBy = (singleCar.status.blockedBy ?? Array.Empty<(int, int)>()) + .ToHashSet(); List blockedByItems = new List(); - for (int i = 0; i < blockedBy.Count; i++) + foreach (var pair in blockedBy) { blockedByItems.Add( new BlockedByItem { - CarCode = blockedBy.ElementAt(i).Item1.ToString(), - Type = blockedBy.ElementAt(i).Item2 + CarCode = pair.Item1.ToString(), + Type = pair.Item2 } ); } @@ -2635,40 +2636,28 @@ namespace StandardScene carState = $"被{string.Join("、", blockerNames)}车交管"; } + var enums = singleCar.status.enums; return new CarStateInfo() { Code = carCode, Name = singleCar.name, CurrState = carState, IsOnline = isOnline, - Battery = singleCar.status.enums.ContainsKey("Soc") - ? int.Parse(singleCar.status.enums["Soc"]) - : 100, - Voltage = singleCar.status.enums.ContainsKey("Voltage") - ? double.Parse(singleCar.status.enums["Voltage"]) - : 0, - ElectricCurrent = singleCar.status.enums.ContainsKey("ElectricCurrent") - ? double.Parse(singleCar.status.enums["ElectricCurrent"]) - : 0, + Battery = TryParseEnumInt(enums, "Soc", 100), + Voltage = TryParseEnumDouble(enums, "Voltage", 0), + ElectricCurrent = TryParseEnumDouble(enums, "ElectricCurrent", 0), X = singleCar.x, Y = singleCar.y, Theta = singleCar.th, - Speed = singleCar.status.enums.ContainsKey("ActualLeftWheelVelocity") - ? double.Parse( - SimpleLib.GetCar(carId).status.enums["ActualLeftWheelVelocity"] - ) - : singleCar.speed, - //CurrNodeCode = currentSite.fields.ContainsKey("code") ? currentSite.fields["code"] : currentSite.id.ToString(), - Load = singleCar.status.enums.TryGetValue("loadStatus", out var statusEnum) - ? int.Parse(statusEnum) - : 0, - CurrNodeCode = currentSite.id.ToString(), + Speed = TryParseEnumDouble(enums, "ActualLeftWheelVelocity", singleCar.speed), + Load = TryParseEnumInt(enums, "loadStatus", 0), + CurrNodeCode = currentSite != null ? currentSite.id.ToString() : "0", StartNodeCode = "0", EndNodeCode = "0", StartEdgeCode = "0", EndEdgeCode = "0", - HoldingLocks = singleCar.status.holdingLocks.ToList(), - PendingLocks = singleCar.status.pendingLocks.ToList(), + HoldingLocks = holdingLocks?.ToList() ?? new List(), + PendingLocks = singleCar.status.pendingLocks?.ToList() ?? new List(), BlockedBy = blockedByItems, // BlockingTime = singleCar.status.blockingTime.ToString("yyyy-MM-dd HH:mm:ss"),//没有了 TrafficMessage = singleCar.status.TCStat.ToString(), @@ -2686,6 +2675,20 @@ namespace StandardScene } } + static int TryParseEnumInt(IDictionary enums, string key, int fallback) + { + if (enums != null && enums.TryGetValue(key, out var text) && int.TryParse(text, out var value)) + return value; + return fallback; + } + + static double TryParseEnumDouble(IDictionary enums, string key, double fallback) + { + if (enums != null && enums.TryGetValue(key, out var text) && double.TryParse(text, out var value)) + return value; + return fallback; + } + public string SwitchCarState(Car car, ref bool isOnline) { string state = "Stopping";