增强航班推送数据处理,优化BizKey解析逻辑,新增实际推出时间存储至Redis,保持原有路由触发行为。更新文档以反映系统能力和接口调用示例。

This commit is contained in:
sladro 2026-02-06 08:17:12 +08:00
parent 87f7541028
commit 022bc183ab
3 changed files with 139 additions and 16 deletions

42
accoutn.md Normal file
View File

@ -0,0 +1,42 @@
1.登录零信任平台 aTrust
(1)零信任账号tianjianyong
(2)初始密码Qdairport@tao12
(3)新密码 0703Dnkj@0703
(4)新密码1107Dnkj@1107
(5)1107Dnkj@1108
2.运维审计系统账号密码
(1)dxyk 账号
(2)dnxxkj@1234 密码
(3)Qdairport@tao12
(4)Qdairport@tao13
(5)Qdairport@tao14
(6)`Zz301301
3.正式平台--10.64.58.228
(1)root --账号
(2)Yptvmpasswd12#$ -- 密码
(3)Yptvmpasswd12#$
(4)Z31020**&d1231=+33
4.测试平台-- 10.100.23.10
(1)root
①Huawei@123
5.红绿灯测试平台-- 10.98.23.111 windows系统
(1)账密
①administrator
②Huawei@123
6.GIS--10.98.23.81
(1)root
(2)Huawei@123
min: 0, max: 8, avg: 0.11 (1768 samples)
used_memory_human:7.94M
mem_fragmentation_ratio:1.36
mem_clients_normal:5146661
/home/project_20250804/qaup/adxp-adapter

View File

@ -6,7 +6,6 @@ import com.qaup.collision.datacollector.config.FlightSdkProperties;
import com.qaup.collision.datacollector.dto.FlightNotificationDTO;
import com.qaup.collision.dataprocessing.service.DataProcessingService;
import com.qaup.common.core.redis.RedisCache;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@ -656,26 +655,65 @@ public class AdxpFlightServiceWebSocketClient implements WebSocketHandler {
}
private FlightNotificationDTO handleAXOT(org.w3c.dom.Element root) {
String flightNo = getTextContent(root, "BizKey");
//分解BizKey
String[] arr = flightNo.split("-", 3); // 最多切 3
// BizKey 常见格式FLIGHTNO-进出港标识-时间(yyyyMMddHHmmss) 或其他分段
String bizKey = getTextContent(root, "BizKey");
String flightNumber = getTextContent(root, "FlightNumber");
String actualPushback = getTextContent(root, "ActualPushback");
// 分解 BizKey最少保证不会抛异常
String[] arr = (bizKey == null ? new String[0] : bizKey.split("-", 3)); // 最多切 3
String flightNoForKey = (arr.length >= 1 && arr[0] != null && !arr[0].isBlank())
? arr[0]
: (flightNumber != null && !flightNumber.isBlank() ? flightNumber : bizKey);
FlightNotificationDTO dto = new FlightNotificationDTO();
dto.setFlightNo(flightNo);
// 保持兼容如果FlightNumber存在优先用它否则回退到BizKey
dto.setFlightNo(flightNumber != null && !flightNumber.isBlank() ? flightNumber : bizKey);
dto.setType("OUT");
// 存储到Redis
if (arr.length >= 3) {
// 解析推出时间ActualPushback用于推出事件时间展示/调试
if (actualPushback != null && !actualPushback.isBlank()) {
try {
String key = "flight:" + arr[0]; // 使用航班号作为键
redisCache.setCacheMapValue(key, "flightNumber", arr[0]);
redisCache.setCacheMapValue(key, "type", arr[1]);
redisCache.setCacheMapValue(key, "time", arr[2]);
log.info("成功将航班数据存储到Redis: flightNumber={}, type={}, time={}", arr[0], arr[1], arr[2]);
java.time.format.DateTimeFormatter formatter = java.time.format.DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
java.time.LocalDateTime pushbackTime = java.time.LocalDateTime.parse(actualPushback.trim(), formatter);
dto.setTime(pushbackTime.atZone(java.time.ZoneId.systemDefault()).toInstant().toEpochMilli());
} catch (Exception e) {
log.error("存储航班数据到Redis失败: {}", e.getMessage());
log.warn("无法解析推出时间(ActualPushback): {}", actualPushback);
}
}
//假装模拟请求接口
// 存储到Redis保留原有字段同时补充 actualPushback 便于运行环境调试
if (flightNoForKey != null && !flightNoForKey.isBlank()) {
try {
String key = "flight:" + flightNoForKey.trim(); // 使用航班号作为键
redisCache.setCacheMapValue(key, "flightNumber", flightNoForKey.trim());
if (arr.length >= 2) {
redisCache.setCacheMapValue(key, "type", arr[1]);
}
if (arr.length >= 3) {
redisCache.setCacheMapValue(key, "time", arr[2]);
}
if (actualPushback != null && !actualPushback.isBlank()) {
redisCache.setCacheMapValue(key, "actualPushback", actualPushback.trim());
}
if (dto.getTime() != null) {
redisCache.setCacheMapValue(key, "pushbackTimeMs", String.valueOf(dto.getTime()));
}
log.info("成功将航班推出数据存储到Redis: flightNumber={}, bizKey={}, actualPushback={}",
flightNoForKey, bizKey, actualPushback);
} catch (Exception e) {
log.error("存储航班推出数据到Redis失败: {}", e.getMessage());
}
}
// 保持原有行为触发路由查询
if (arr.length >= 1 && arr[0] != null && !arr[0].isBlank()) {
dataProcessingService.AXOT(arr[0]);
} else if (flightNumber != null && !flightNumber.isBlank()) {
dataProcessingService.AXOT(flightNumber);
} else {
log.warn("AXOT事件缺少可用航班号跳过路由触发: bizKey={}, flightNumber={}", bizKey, flightNumber);
}
return dto;
}

View File

@ -7,3 +7,46 @@ mvn -pl qaup-admin -am package -DskipTests
#测试本地
java "-Dfile.encoding=GBK" -jar "qaup-admin\target\qaup-admin.jar" --spring.profiles.active=dev,druid
```
有:系统里已经有“航空器滑行路由”能力,并会推送给前端
• 路由来源:通过外部“机场滑行/路径规划”接口获取DataCollectorDao#getArrivalRoute() / getDepartureRoute(),调用
/runwayPathPlanningController/... 返回 taxiway 路由 GeoJSON
• 触发方式:当前主要是收到航班进/出港通知ARR/AXOT后触发查询不是靠“进入范围”/围栏触发。
• AdxpFlightServiceWebSocketClient 解析到 ARR/AXOT 后会调用 DataProcessingService.ARR()/AXOT() 去拉路由并处理。
• 推送前端:发布 AircraftRouteUpdateEvent由 AircraftRouteUpdateEventListener 通过 WebSocket 广播,消息 type =
"aircraftRouteUpdate",带 routeCodes + routeGeometry(WKT) 等字段。
• 落库RoutePersistenceService 会把路由保存到 transport_routes并写 object_route_assignment 关联航班号。
docker exec -it 3ba259ca788a sh -lc "curl -s http://localhost:8086/api/adxp/messages | head"
docker exec -it redis redis-cli HGET flight:CA1234 actualPushback
docker exec -it redis redis-cli HGET flight:CA1234 pushbackTimeMs
docker exec -it qaup-app sh -lc '
echo "ADXP=$ADXP_HOST:$ADXP_PORT";
curl -sv "http://$ADXP_HOST:$ADXP_PORT/actuator/health" 2>&1 | head -n 20;
echo "----";
curl -sv "http://$ADXP_HOST:$ADXP_PORT/api/adxp/status" 2>&1 | head -n 40;
echo "----";
curl -sv "http://$ADXP_HOST:$ADXP_PORT/api/adxp/messages" 2>&1 | head -n 60;
'
docker logs qaup-app | grep -n "ADXP" | tail -n 200
docker logs qaup-app | grep -n "flight-notifications" | tail -n 200
### 确定adapter没问题
tail -n 20000 /home/project_20250804/qaup/adxp-adapter/logs/adapter-logs.log | grep -E "事件的类型是|ADXP_NAOMS_O_CDM_AXOT" | tail -n 200
docker logs qaup-app | grep -E "通过WebSocket接收到|AXOT|BizKey|ActualPushback" | tail -n 200
docker exec -it qaup-app sh -lc '
while true; do
r=$(curl -s "http://$ADXP_HOST:$ADXP_PORT/api/adxp/messages");
echo "$r" | grep -q "ADXP_NAOMS_O_CDM_AXOT" && echo "FOUND AXOT" && echo "$r" && break;
echo "$(date +%T) no-axot";
sleep 1;
done
'