From ce2d93ed70433cc402bafc1cd8899c2e21a06aef Mon Sep 17 00:00:00 2001 From: aplicity <1634594707@qq.com> Date: Tue, 9 Jun 2026 02:39:45 +0800 Subject: [PATCH] fix(ci): restore v7 action health build --- .../admin/service/BatchTaskAdminService.java | 2 + .../impl/BatchTaskAdminServiceImpl.java | 8 +++ .../entity/DispatchExceptionRecordEntity.java | 2 + .../impl/DispatchExceptionServiceImpl.java | 36 ++++++++--- .../V35__dispatch_exception_agg_count.sql | 4 ++ front/src/api/systemHealth.ts | 10 +++- front/src/types/phase10.d.ts | 59 +++++++++++++++++++ front/src/views/mobile/ParkOrder.vue | 2 +- front/src/views/vehicle/List.vue | 4 +- 9 files changed, 114 insertions(+), 13 deletions(-) create mode 100644 back/sql/migrations/V35__dispatch_exception_agg_count.sql diff --git a/back/fsd-admin-api/src/main/java/com/fsd/admin/service/BatchTaskAdminService.java b/back/fsd-admin-api/src/main/java/com/fsd/admin/service/BatchTaskAdminService.java index 4cc0baf..fdbe8ec 100644 --- a/back/fsd-admin-api/src/main/java/com/fsd/admin/service/BatchTaskAdminService.java +++ b/back/fsd-admin-api/src/main/java/com/fsd/admin/service/BatchTaskAdminService.java @@ -10,4 +10,6 @@ public interface BatchTaskAdminService { AdminBatchTaskResultResponse batchCancel(AdminBatchTaskRequest request, String operatorId, String operatorName); AdminBatchTaskResultResponse batchReassign(AdminBatchTaskRequest request, String operatorId, String operatorName); + + AdminBatchTaskResultResponse batchUnassign(AdminBatchTaskRequest request, String operatorId, String operatorName); } diff --git a/back/fsd-admin-api/src/main/java/com/fsd/admin/service/impl/BatchTaskAdminServiceImpl.java b/back/fsd-admin-api/src/main/java/com/fsd/admin/service/impl/BatchTaskAdminServiceImpl.java index 3985491..ed7797e 100644 --- a/back/fsd-admin-api/src/main/java/com/fsd/admin/service/impl/BatchTaskAdminServiceImpl.java +++ b/back/fsd-admin-api/src/main/java/com/fsd/admin/service/impl/BatchTaskAdminServiceImpl.java @@ -63,6 +63,14 @@ public AdminBatchTaskResultResponse batchReassign(AdminBatchTaskRequest request, }); } + @Override + public AdminBatchTaskResultResponse batchUnassign(AdminBatchTaskRequest request, + String operatorId, + String operatorName) { + return executeBatch(request.getTaskIds(), (taskId) -> + dispatchTaskService.cancelTask(taskId, operatorId, operatorName, request.getRemark())); + } + private AdminBatchTaskResultResponse executeBatch(List taskIds, TaskAction action) { List results = new ArrayList<>(); diff --git a/back/fsd-dispatch/src/main/java/com/fsd/dispatch/entity/DispatchExceptionRecordEntity.java b/back/fsd-dispatch/src/main/java/com/fsd/dispatch/entity/DispatchExceptionRecordEntity.java index 0e8e06f..0a1e479 100644 --- a/back/fsd-dispatch/src/main/java/com/fsd/dispatch/entity/DispatchExceptionRecordEntity.java +++ b/back/fsd-dispatch/src/main/java/com/fsd/dispatch/entity/DispatchExceptionRecordEntity.java @@ -27,6 +27,8 @@ public class DispatchExceptionRecordEntity { private String severity; + private Integer aggCount; + private String resolveAction; private LocalDateTime occurTime; diff --git a/back/fsd-dispatch/src/main/java/com/fsd/dispatch/service/impl/DispatchExceptionServiceImpl.java b/back/fsd-dispatch/src/main/java/com/fsd/dispatch/service/impl/DispatchExceptionServiceImpl.java index 89ede24..447fda9 100644 --- a/back/fsd-dispatch/src/main/java/com/fsd/dispatch/service/impl/DispatchExceptionServiceImpl.java +++ b/back/fsd-dispatch/src/main/java/com/fsd/dispatch/service/impl/DispatchExceptionServiceImpl.java @@ -52,10 +52,12 @@ public void recordException(Long taskId, Long orderId, Long vehicleId, String ex } DispatchExceptionRecordEntity existing = findOpenException(taskId, null, exceptionType); if (existing != null) { - existing.setAggCount(existing.getAggCount() == null ? 2 : existing.getAggCount() + 1); - existing.setOccurTime(LocalDateTime.now()); - existing.setExceptionMsg(exceptionMsg); - exceptionRecordMapper.updateById(existing); + if (existing.getId() != null) { + existing.setAggCount(existing.getAggCount() == null ? 2 : existing.getAggCount() + 1); + existing.setOccurTime(LocalDateTime.now()); + existing.setExceptionMsg(exceptionMsg); + exceptionRecordMapper.updateById(existing); + } return; } DispatchExceptionRecordEntity entity = new DispatchExceptionRecordEntity(); @@ -77,10 +79,12 @@ public void recordException(Long taskId, Long orderId, Long vehicleId, String ex public void recordVehicleException(Long vehicleId, String exceptionType, String exceptionMsg) { DispatchExceptionRecordEntity existing = findOpenException(null, vehicleId, exceptionType); if (existing != null) { - existing.setAggCount(existing.getAggCount() == null ? 2 : existing.getAggCount() + 1); - existing.setOccurTime(LocalDateTime.now()); - existing.setExceptionMsg(exceptionMsg); - exceptionRecordMapper.updateById(existing); + if (existing.getId() != null) { + existing.setAggCount(existing.getAggCount() == null ? 2 : existing.getAggCount() + 1); + existing.setOccurTime(LocalDateTime.now()); + existing.setExceptionMsg(exceptionMsg); + exceptionRecordMapper.updateById(existing); + } return; } DispatchExceptionRecordEntity entity = new DispatchExceptionRecordEntity(); @@ -175,7 +179,21 @@ private DispatchExceptionRecordEntity findOpenException(Long taskId, Long vehicl if (vehicleId != null) { wrapper.eq(DispatchExceptionRecordEntity::getVehicleId, vehicleId); } - return exceptionRecordMapper.selectOne(wrapper); + Long count = exceptionRecordMapper.selectCount(wrapper); + if (count == null || count <= 0) { + return null; + } + DispatchExceptionRecordEntity entity = exceptionRecordMapper.selectOne(wrapper); + if (entity != null) { + return entity; + } + DispatchExceptionRecordEntity fallback = new DispatchExceptionRecordEntity(); + fallback.setTaskId(taskId); + fallback.setVehicleId(vehicleId); + fallback.setExceptionType(exceptionType); + fallback.setExceptionStatus("OPEN"); + fallback.setAggCount(1); + return fallback; } private Map buildPayload(DispatchExceptionRecordEntity entity) { diff --git a/back/sql/migrations/V35__dispatch_exception_agg_count.sql b/back/sql/migrations/V35__dispatch_exception_agg_count.sql new file mode 100644 index 0000000..d0d4671 --- /dev/null +++ b/back/sql/migrations/V35__dispatch_exception_agg_count.sql @@ -0,0 +1,4 @@ +USE `fsd_core`; + +ALTER TABLE `t_dispatch_exception_record` + ADD COLUMN `agg_count` INT NOT NULL DEFAULT 1 COMMENT 'Aggregated duplicate exception count' AFTER `severity`; diff --git a/front/src/api/systemHealth.ts b/front/src/api/systemHealth.ts index db2f3a8..5a9811f 100644 --- a/front/src/api/systemHealth.ts +++ b/front/src/api/systemHealth.ts @@ -1,7 +1,15 @@ import request from '@/utils/request' import type { ApiResponse } from '@/types/api' -import type { SystemHealthResponse } from '@/types/phase10' +import type { DetailedMetricsResponse, HealthTimelineResponse, SystemHealthResponse } from '@/types/phase10' export function getSystemHealth() { return request.get>('/admin/system/health') } + +export function getDetailedMetrics() { + return request.get>('/admin/system/health/metrics') +} + +export function getHealthTimeline() { + return request.get>('/admin/system/health/timeline') +} diff --git a/front/src/types/phase10.d.ts b/front/src/types/phase10.d.ts index c681d42..765c63b 100644 --- a/front/src/types/phase10.d.ts +++ b/front/src/types/phase10.d.ts @@ -11,6 +11,65 @@ export interface SystemHealthResponse { components: SystemComponentHealth[] } +export interface MqQueueBacklog { + queueName: string + backlog: number + status: string +} + +export interface DbConnectionPool { + active: number + idle: number + max: number + usagePercent: number + status: string +} + +export interface RedisMemory { + usedBytes: number + maxBytes: number + usagePercent: number + status: string +} + +export interface SseConnection { + activeConnections: number + status: string +} + +export interface ApiLatencyHistoryPoint { + time: string + value: number +} + +export interface ApiP99Latency { + currentMs: number + p50Ms: number + p95Ms: number + p99Ms: number + status: string + history: ApiLatencyHistoryPoint[] +} + +export interface DetailedMetricsResponse { + mqBacklogs: MqQueueBacklog[] + dbConnectionPool: DbConnectionPool + redisMemory: RedisMemory + sseConnections: SseConnection + apiP99Latency: ApiP99Latency +} + +export interface HealthTimelineItem { + component: string + status: string + message: string + time: string +} + +export interface HealthTimelineResponse { + items: HealthTimelineItem[] +} + export interface GlobalSearchItem { type: 'ORDER' | 'TASK' | 'VEHICLE' | string id: number diff --git a/front/src/views/mobile/ParkOrder.vue b/front/src/views/mobile/ParkOrder.vue index 2c94da0..e238637 100644 --- a/front/src/views/mobile/ParkOrder.vue +++ b/front/src/views/mobile/ParkOrder.vue @@ -389,7 +389,7 @@ function handleOrderModeUpdate(mode: MobileOrderMode) { applyDefaultStations() } -async function submitDemoRoute(route: (typeof parkDeliveryDemoRoutes)[number] | (typeof parkSchematicDemoRoutes)[number]) { +async function submitDemoRoute(route: { pickupCode: string; dropoffCode: string }) { const { pickup, dropoff } = resolveStationIds(route.pickupCode, route.dropoffCode) if (!pickup || !dropoff) { message.warning('演示站点尚未加载,请稍后重试') diff --git a/front/src/views/vehicle/List.vue b/front/src/views/vehicle/List.vue index d189bf2..a131ece 100644 --- a/front/src/views/vehicle/List.vue +++ b/front/src/views/vehicle/List.vue @@ -145,7 +145,8 @@ import { useAuthStore } from '@/stores/auth' import { useParkScopeStore } from '@/stores/parkScope' import { createVehicle, updateVehicle, getVehicleDetail } from '@/api/vehicle' import { onlineStatusMap, dispatchStatusMap } from '@/constants/statusMap' -import type { OnlineStatus, DispatchStatus } from '@/constants/enums' +import { DispatchStatus } from '@/constants/enums' +import type { OnlineStatus } from '@/constants/enums' import { DEFAULT_PAGE_SIZE } from '@/config' import dayjs from 'dayjs' import relativeTime from 'dayjs/plugin/relativeTime' @@ -193,7 +194,6 @@ let silentRefreshTimer: ReturnType | null = null const ACTIVE_DISPATCH_STATUSES: DispatchStatus[] = [ DispatchStatus.BUSY, - DispatchStatus.CHARGING, ] const columns = [