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>();
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<BlockedByItem> blockedByItems = new List<BlockedByItem>();
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<int>(),
PendingLocks = singleCar.status.pendingLocks?.ToList() ?? new List<int>(),
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<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)
{
string state = "Stopping";