Include aircraft name in path conflict resume alerts

This commit is contained in:
sladro 2026-05-11 15:35:08 +08:00
parent fb5badbaba
commit cdb91765e8
2 changed files with 53 additions and 11 deletions

View File

@ -219,7 +219,8 @@ public class VehicleCommandService {
previousState.parkingIssued(),
confirmedCycles,
observation.vehicleDistanceMeters(),
observation.aircraftDistanceMeters()
observation.aircraftDistanceMeters(),
previousState.aircraftName()
);
VehicleConflictCommand resumeContext = new VehicleConflictCommand(
@ -229,7 +230,8 @@ public class VehicleCommandService {
null,
resolveRegistryType(vehicleId),
previousState.vehicleDistanceMeters(),
previousState.aircraftDistanceMeters()
previousState.aircraftDistanceMeters(),
previousState.aircraftName()
);
boolean resumeIssued = sendCommand(resumeContext, CommandType.RESUME, CommandReason.RESUME_TRAFFIC);
@ -254,6 +256,7 @@ public class VehicleCommandService {
VehicleConflictCommand leftCandidate = toVehicleConflictCommand(
event.getObject1Name(),
event.getObject1Type(),
resolveAircraftName(event),
level,
event.getConflictPoint(),
event.getObject1Distance(),
@ -266,6 +269,7 @@ public class VehicleCommandService {
return toVehicleConflictCommand(
event.getObject2Name(),
event.getObject2Type(),
resolveAircraftName(event),
level,
event.getConflictPoint(),
event.getObject2Distance(),
@ -276,6 +280,7 @@ public class VehicleCommandService {
private VehicleConflictCommand toVehicleConflictCommand(
String vehicleId,
MovingObjectType objectType,
String aircraftName,
VehicleRiskLevel level,
Point conflictPoint,
Double candidateDistance,
@ -312,10 +317,24 @@ public class VehicleCommandService {
objectType,
registryType,
vehicleDistance,
aircraftDistance
aircraftDistance,
aircraftName
);
}
private String resolveAircraftName(ConflictAlertEvent event) {
if (event == null) {
return null;
}
if (event.getObject1Type() == MovingObjectType.AIRCRAFT) {
return event.getObject1Name();
}
if (event.getObject2Type() == MovingObjectType.AIRCRAFT) {
return event.getObject2Name();
}
return event.getAircraftName();
}
private VehicleRiskLevel toRiskLevel(ConflictAlertEvent event) {
if (event.isAlert() || event.isEmergencyAlert()) {
return VehicleRiskLevel.ALERT;
@ -581,15 +600,28 @@ public class VehicleCommandService {
ConflictRecoveryObservation observation) {
try {
String vehicleObjectType = toMovingObjectTypeName(resolveRegistryType(vehicleId));
Double vehicleDistance = observation != null ? observation.vehicleDistanceMeters() : previousState.vehicleDistanceMeters();
Double aircraftDistance = observation != null ? observation.aircraftDistanceMeters() : previousState.aircraftDistanceMeters();
PathConflictAlertMessage message = PathConflictAlertMessage.builder()
.messageType("PATH_CONFLICT_RESUME")
.message("Path conflict resolved, traffic resumed")
.object1(PathConflictAlertMessage.ConflictObject.builder()
.objectName(vehicleId)
.objectType(toMovingObjectTypeName(resolveRegistryType(vehicleId)))
.objectType(vehicleObjectType)
.build())
.object1Distance(observation != null ? observation.vehicleDistanceMeters() : previousState.vehicleDistanceMeters())
.object2Distance(observation != null ? observation.aircraftDistanceMeters() : previousState.aircraftDistanceMeters())
.object2(PathConflictAlertMessage.ConflictObject.builder()
.objectName(previousState.aircraftName())
.objectType(MovingObjectType.AIRCRAFT.name())
.build())
.aircraftName(previousState.aircraftName())
.aircraftObjectType(MovingObjectType.AIRCRAFT.name())
.aircraftDistanceToConflictMeters(aircraftDistance)
.vehicleName(vehicleId)
.vehicleObjectType(vehicleObjectType)
.vehicleDistanceToConflictMeters(vehicleDistance)
.object1Distance(vehicleDistance)
.object2Distance(aircraftDistance)
.eventTime(LocalDateTime.now())
.build();
@ -637,7 +669,8 @@ public class VehicleCommandService {
MovingObjectType objectType,
VehicleRegistryType registryType,
Double vehicleDistanceMeters,
Double aircraftDistanceMeters) {
Double aircraftDistanceMeters,
String aircraftName) {
}
private record ActiveVehicleCommandState(
@ -645,7 +678,8 @@ public class VehicleCommandService {
boolean parkingIssued,
int missingConflictCycles,
Double vehicleDistanceMeters,
Double aircraftDistanceMeters) {
Double aircraftDistanceMeters,
String aircraftName) {
private static ActiveVehicleCommandState fromCommand(
VehicleRiskLevel level,
@ -658,7 +692,8 @@ public class VehicleCommandService {
parkingIssued,
missingConflictCycles,
command.vehicleDistanceMeters(),
command.aircraftDistanceMeters()
command.aircraftDistanceMeters(),
command.aircraftName()
);
}
@ -667,14 +702,15 @@ public class VehicleCommandService {
int missingConflictCycles) {
if (observation == null) {
return new ActiveVehicleCommandState(level, parkingIssued, missingConflictCycles, vehicleDistanceMeters, aircraftDistanceMeters);
return new ActiveVehicleCommandState(level, parkingIssued, missingConflictCycles, vehicleDistanceMeters, aircraftDistanceMeters, aircraftName);
}
return new ActiveVehicleCommandState(
level,
parkingIssued,
missingConflictCycles,
observation.vehicleDistanceMeters(),
observation.aircraftDistanceMeters()
observation.aircraftDistanceMeters(),
aircraftName
);
}
}

View File

@ -157,6 +157,12 @@ class VehicleCommandServiceTest {
server.verify();
verify(webSocketPublisher).publishPathConflictAlert(argThat(message ->
"PATH_CONFLICT_RESUME".equals(message.getMessageType())
&& "UV-001".equals(message.getVehicleName())
&& "CA1234".equals(message.getAircraftName())
&& message.getObject1() != null
&& "UV-001".equals(message.getObject1().getObjectName())
&& message.getObject2() != null
&& "CA1234".equals(message.getObject2().getObjectName())
));
}