diff --git a/backend/services/snapshot-service/prisma/schema.prisma b/backend/services/snapshot-service/prisma/schema.prisma index f1f550b1..3c17a8a3 100644 --- a/backend/services/snapshot-service/prisma/schema.prisma +++ b/backend/services/snapshot-service/prisma/schema.prisma @@ -30,7 +30,8 @@ model SnapshotDetail { taskId String target String status String @default("PENDING") - progress Int @default(0) + progress Float @default(0) + progressMsg String? fileSize BigInt @default(0) fileName String? error String? diff --git a/backend/services/snapshot-service/src/application/services/snapshot-orchestrator.service.ts b/backend/services/snapshot-service/src/application/services/snapshot-orchestrator.service.ts index 912b0cb1..885ea12a 100644 --- a/backend/services/snapshot-service/src/application/services/snapshot-orchestrator.service.ts +++ b/backend/services/snapshot-service/src/application/services/snapshot-orchestrator.service.ts @@ -130,7 +130,7 @@ export class SnapshotOrchestratorService implements OnModuleInit { const now = Date.now(); if (now - lastDbWriteTime >= 2000) { lastDbWriteTime = now; - this.repo.updateDetailProgress(taskId, target, percent).catch(() => {}); + this.repo.updateDetailProgress(taskId, target, percent, msg).catch(() => {}); } }); diff --git a/backend/services/snapshot-service/src/infrastructure/backup/postgres-backup.handler.ts b/backend/services/snapshot-service/src/infrastructure/backup/postgres-backup.handler.ts index e6801078..aa27a683 100644 --- a/backend/services/snapshot-service/src/infrastructure/backup/postgres-backup.handler.ts +++ b/backend/services/snapshot-service/src/infrastructure/backup/postgres-backup.handler.ts @@ -98,7 +98,7 @@ export class PostgresBackupHandler implements BackupHandler { if (readMB > lastReportedMB) { lastReportedMB = readMB; const totalMB = Math.floor(totalSize / (1024 * 1024)); - const percent = Math.min(99, Math.floor((bytesRead / totalSize) * 100)); + const percent = Math.min(99, parseFloat(((bytesRead / totalSize) * 100).toFixed(2))); onProgress(percent, `PostgreSQL 备份中... ${readMB}MB / ~${totalMB}MB`); } }); diff --git a/backend/services/snapshot-service/src/infrastructure/persistence/repositories/snapshot.repository.ts b/backend/services/snapshot-service/src/infrastructure/persistence/repositories/snapshot.repository.ts index 97b75dfe..59f03727 100644 --- a/backend/services/snapshot-service/src/infrastructure/persistence/repositories/snapshot.repository.ts +++ b/backend/services/snapshot-service/src/infrastructure/persistence/repositories/snapshot.repository.ts @@ -79,14 +79,16 @@ export class SnapshotRepository { return this.prisma.snapshotDetail.update({ where: { id: detail.id }, data }); } - async updateDetailProgress(taskId: string, target: string, progress: number) { + async updateDetailProgress(taskId: string, target: string, progress: number, progressMsg?: string) { const detail = await this.prisma.snapshotDetail.findFirst({ where: { taskId, target }, }); if (!detail) return; + const data: Record = { progress }; + if (progressMsg !== undefined) data.progressMsg = progressMsg; return this.prisma.snapshotDetail.update({ where: { id: detail.id }, - data: { progress }, + data, }); } diff --git a/frontend/admin-web/src/app/(dashboard)/snapshots/page.tsx b/frontend/admin-web/src/app/(dashboard)/snapshots/page.tsx index 73f602e6..564cddd7 100644 --- a/frontend/admin-web/src/app/(dashboard)/snapshots/page.tsx +++ b/frontend/admin-web/src/app/(dashboard)/snapshots/page.tsx @@ -255,7 +255,7 @@ export default function SnapshotsPage() { {BACKUP_TARGET_LABELS[p.target] || p.target} - {p.status === 'completed' ? '100%' : p.status === 'failed' ? '失败' : `${p.percent}%`} + {p.status === 'completed' ? '100%' : p.status === 'failed' ? '失败' : `${p.percent.toFixed(1)}%`}
diff --git a/frontend/admin-web/src/hooks/useSnapshotPolling.ts b/frontend/admin-web/src/hooks/useSnapshotPolling.ts index 18a634b0..1c6031a2 100644 --- a/frontend/admin-web/src/hooks/useSnapshotPolling.ts +++ b/frontend/admin-web/src/hooks/useSnapshotPolling.ts @@ -48,7 +48,7 @@ export function useSnapshotPolling(taskId: string | null): UseSnapshotPollingRet : d.status === 'COMPLETED' ? '完成' : d.status === 'RUNNING' - ? `备份中... ${d.progress}%` + ? (d.progressMsg || `备份中... ${d.progress.toFixed(1)}%`) : '等待中', status: statusMap[d.status] || 'pending', }); diff --git a/frontend/admin-web/src/types/snapshot.types.ts b/frontend/admin-web/src/types/snapshot.types.ts index fe3a0a6f..3f122822 100644 --- a/frontend/admin-web/src/types/snapshot.types.ts +++ b/frontend/admin-web/src/types/snapshot.types.ts @@ -16,6 +16,7 @@ export interface SnapshotDetail { target: BackupTarget; status: SnapshotStatus; progress: number; + progressMsg: string | null; fileSize: string; fileName: string | null; error: string | null; diff --git a/frontend/mining-admin-web/src/app/(dashboard)/snapshots/page.tsx b/frontend/mining-admin-web/src/app/(dashboard)/snapshots/page.tsx index e3c0b405..57e3697d 100644 --- a/frontend/mining-admin-web/src/app/(dashboard)/snapshots/page.tsx +++ b/frontend/mining-admin-web/src/app/(dashboard)/snapshots/page.tsx @@ -238,7 +238,7 @@ export default function SnapshotsPage() { : 'text-blue-500' } > - {p.status === 'completed' ? '100%' : p.status === 'failed' ? '失败' : `${p.percent}%`} + {p.status === 'completed' ? '100%' : p.status === 'failed' ? '失败' : `${p.percent.toFixed(1)}%`}
diff --git a/frontend/mining-admin-web/src/lib/hooks/useSnapshotPolling.ts b/frontend/mining-admin-web/src/lib/hooks/useSnapshotPolling.ts index c3faad41..17826962 100644 --- a/frontend/mining-admin-web/src/lib/hooks/useSnapshotPolling.ts +++ b/frontend/mining-admin-web/src/lib/hooks/useSnapshotPolling.ts @@ -48,7 +48,7 @@ export function useSnapshotPolling(taskId: string | null): UseSnapshotPollingRet : d.status === 'COMPLETED' ? '完成' : d.status === 'RUNNING' - ? `备份中... ${d.progress}%` + ? (d.progressMsg || `备份中... ${d.progress.toFixed(1)}%`) : '等待中', status: statusMap[d.status] || 'pending', }); diff --git a/frontend/mining-admin-web/src/types/snapshot.types.ts b/frontend/mining-admin-web/src/types/snapshot.types.ts index fe3a0a6f..3f122822 100644 --- a/frontend/mining-admin-web/src/types/snapshot.types.ts +++ b/frontend/mining-admin-web/src/types/snapshot.types.ts @@ -16,6 +16,7 @@ export interface SnapshotDetail { target: BackupTarget; status: SnapshotStatus; progress: number; + progressMsg: string | null; fileSize: string; fileName: string | null; error: string | null;