fix: GetCarStateInfo 空引用与枚举解析

holdingLocks/blockedBy/enums 为空时不再抛异常,CurrNodeCode 在无站点时返回 0。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
黄兆尉
2026-08-26 23:03:41 +08:00
co-authored by Cursor
parent f5c404173b
commit d9bf8b9c84
+30 -27
View File
@@ -2580,7 +2580,6 @@ namespace StandardScene
); );
} }
var carId = singleCar.id;
var alarmsList = new List<CarAlarm>(); var alarmsList = new List<CarAlarm>();
if ( if (
singleCar.status.enums.ContainsKey("AlarmInfo") singleCar.status.enums.ContainsKey("AlarmInfo")
@@ -2599,16 +2598,18 @@ namespace StandardScene
} }
} }
var currentSite = SimpleLib.GetSite(singleCar.status.holdingLocks.FirstOrDefault()); var holdingLocks = singleCar.status.holdingLocks;
var blockedBy = singleCar.status.blockedBy.ToHashSet(); var currentSite = SimpleLib.GetSite(holdingLocks?.FirstOrDefault() ?? 0);
var blockedBy = (singleCar.status.blockedBy ?? Array.Empty<(int, int)>())
.ToHashSet();
List<BlockedByItem> blockedByItems = new List<BlockedByItem>(); List<BlockedByItem> blockedByItems = new List<BlockedByItem>();
for (int i = 0; i < blockedBy.Count; i++) foreach (var pair in blockedBy)
{ {
blockedByItems.Add( blockedByItems.Add(
new BlockedByItem new BlockedByItem
{ {
CarCode = blockedBy.ElementAt(i).Item1.ToString(), CarCode = pair.Item1.ToString(),
Type = blockedBy.ElementAt(i).Item2 Type = pair.Item2
} }
); );
} }
@@ -2635,40 +2636,28 @@ namespace StandardScene
carState = $"被{string.Join("", blockerNames)}车交管"; carState = $"被{string.Join("", blockerNames)}车交管";
} }
var enums = singleCar.status.enums;
return new CarStateInfo() return new CarStateInfo()
{ {
Code = carCode, Code = carCode,
Name = singleCar.name, Name = singleCar.name,
CurrState = carState, CurrState = carState,
IsOnline = isOnline, IsOnline = isOnline,
Battery = singleCar.status.enums.ContainsKey("Soc") Battery = TryParseEnumInt(enums, "Soc", 100),
? int.Parse(singleCar.status.enums["Soc"]) Voltage = TryParseEnumDouble(enums, "Voltage", 0),
: 100, ElectricCurrent = TryParseEnumDouble(enums, "ElectricCurrent", 0),
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,
X = singleCar.x, X = singleCar.x,
Y = singleCar.y, Y = singleCar.y,
Theta = singleCar.th, Theta = singleCar.th,
Speed = singleCar.status.enums.ContainsKey("ActualLeftWheelVelocity") Speed = TryParseEnumDouble(enums, "ActualLeftWheelVelocity", singleCar.speed),
? double.Parse( Load = TryParseEnumInt(enums, "loadStatus", 0),
SimpleLib.GetCar(carId).status.enums["ActualLeftWheelVelocity"] CurrNodeCode = currentSite != null ? currentSite.id.ToString() : "0",
)
: 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(),
StartNodeCode = "0", StartNodeCode = "0",
EndNodeCode = "0", EndNodeCode = "0",
StartEdgeCode = "0", StartEdgeCode = "0",
EndEdgeCode = "0", EndEdgeCode = "0",
HoldingLocks = singleCar.status.holdingLocks.ToList(), HoldingLocks = holdingLocks?.ToList() ?? new List<int>(),
PendingLocks = singleCar.status.pendingLocks.ToList(), PendingLocks = singleCar.status.pendingLocks?.ToList() ?? new List<int>(),
BlockedBy = blockedByItems, BlockedBy = blockedByItems,
// BlockingTime = singleCar.status.blockingTime.ToString("yyyy-MM-dd HH:mm:ss"),//没有了 // BlockingTime = singleCar.status.blockingTime.ToString("yyyy-MM-dd HH:mm:ss"),//没有了
TrafficMessage = singleCar.status.TCStat.ToString(), TrafficMessage = singleCar.status.TCStat.ToString(),
@@ -2686,6 +2675,20 @@ namespace StandardScene
} }
} }
static int TryParseEnumInt(IDictionary<string, string> 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<string, string> 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) public string SwitchCarState(Car car, ref bool isOnline)
{ {
string state = "Stopping"; string state = "Stopping";