From 80d81836a11c9c7a4f8991dd07b3d07c35c0f42c Mon Sep 17 00:00:00 2001 From: gitadmin Date: Thu, 7 May 2026 15:57:06 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=20ReportPreviewData?= =?UTF-8?q?=20=E6=8E=A5=E5=8F=A3=E5=92=8C=20ready=20=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/types/report.ts | 56 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/src/types/report.ts b/src/types/report.ts index 03789c7..f2bc79e 100644 --- a/src/types/report.ts +++ b/src/types/report.ts @@ -1,7 +1,7 @@ // 报告基础类型 export type ReportType = 'weekly' | 'monthly' export type ReportFormat = 'pdf' | 'docx' -export type ReportStatus = 'pending' | 'generating' | 'completed' | 'failed' +export type ReportStatus = 'pending' | 'ready' | 'generating' | 'completed' | 'failed' export interface ReportCreateInput { report_type: ReportType @@ -39,6 +39,7 @@ export interface ClassifiedTicket { close_time: string duration_minutes: number availability: number | null + isOngoing?: boolean } // 第一章:每日在线节点统计 @@ -54,7 +55,8 @@ export interface DailyOnlineStats { export interface Chapter2FaultItem { ip: string fault_subcategory: string - recoveryDays: number // 0=当日, 1=次日, ≥2=N日后 + recoveryDays: number // 0=当日, 1=次日, ≥2=N日后(仅已结单有效,进行中时为 0) + isOngoing?: boolean } export interface Chapter2Entry { @@ -72,6 +74,7 @@ export interface Chapter3FaultEntry { faultCause: string // "更换" + parts_replaced 或 "-" durationMinutes: number countedInSla: '是' | '否' + isOngoing?: boolean } // 第三章:其他工单表行(7列,表头不同) @@ -83,6 +86,7 @@ export interface Chapter3OtherEntry { ticketConclusion: string // conclusion durationMinutes: number countedInSla: '是' | '否' + isOngoing?: boolean } // 第四章:每IP服务可用性 @@ -91,6 +95,7 @@ export interface Chapter4Entry { totalDurationMinutes: number monthDays: number availabilityPercent: number // e.g. 97.28 + hasOngoing?: boolean } // 月报顶层聚合数据 @@ -125,6 +130,38 @@ export interface MonthlyReportPreview { avgAvailability: number | null } +// 预览页完整 metadata 结构(新格式) +export interface ReportPreviewData { + // 原有字段 + gpuCount: number + storageCount: number + totalTickets: number + gpuFaultCount: number + storageFaultCount: number + otherTicketCount: number + avgAvailability: number + // 新增字段 + resolvedCount: number + avgDurationMinutes: number + ongoingCount: number + faultTicketCount: number + affectedDeviceCount: number + faultFreeDays: number | null // 周报为 null + availabilityDetails: AvailabilityDetail[] | null // 周报为 null + reportLabel: string + // 旧格式兼容 + summary?: { total_tickets: number; resolved_tickets: number; avg_duration: number; sla_rate: number } + categories?: Array<{ fault_category: string; count: number }> +} + +export interface AvailabilityDetail { + ip: string + deviceType: 'gpu' | 'storage' | 'other' + durationMinutes: number + availabilityPercent: number + isOngoing: boolean +} + // ===== 周报类型 ===== export interface WeeklyDailyStats { @@ -157,6 +194,7 @@ export interface WeeklyTicketEntry { currentStatus: string // 'resolved' | 'closed' | 'in_progress' | 'open' isResolved: boolean steps: TicketStepRaw[] + availability: number | null } export interface WeeklyReportData { @@ -175,3 +213,17 @@ export interface WeeklyReportData { resolvedCount: number pendingCount: number } + +// 自然周范围(用于月报嵌入周报) +export interface WeekRange { + index: number // 第几周 (1, 2, 3, ...) + start: string // "2026-04-01" + end: string // "2026-04-05" + label: string // "第1周(04/01-04/05)" +} + +// 周报附件(嵌入用) +export interface WeeklyAttachment { + label: string + buffer: Buffer +}