From 55fd3df55da829f29dc870bb6861b6dc65690fd3 Mon Sep 17 00:00:00 2001 From: yexb <553699424@qq.com> Date: Fri, 3 Jul 2026 15:52:56 +0800 Subject: [PATCH] =?UTF-8?q?feat(testReport):=20=E6=96=B0=E5=A2=9E=E5=8F=B0?= =?UTF-8?q?=E8=B4=A6=E5=AF=BC=E5=85=A5=E5=8A=9F=E8=83=BD=E5=B9=B6=E9=87=8D?= =?UTF-8?q?=E6=9E=84=E6=8A=A5=E5=91=8A=E4=BB=BB=E5=8A=A1=E8=A1=A8=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增台账导入面板组件,支持Excel模板下载和批量导入 - 在报告任务表单中集成三步式流程(导入→填写→完成) - 添加导入结果预览和分组报告状态展示功能 - 扩展API接口支持台账导入和分组报告查询 - 优化表单验证逻辑,移除送资数据必填限制 - 集成日志面板实时显示导入过程状态 - 更新测试报告页面契约验证规则 - 添加监测点数和分组数统计展示 - 实现台账准备状态检查和快照功能 --- frontend/src/api/aireport/testReport/index.ts | 17 +- .../aireport/testReport/interface/index.ts | 108 ++- .../components/ReportTaskDetailDialog.vue | 37 +- .../components/ReportTaskFormDialog.vue | 884 +++++++++++++++--- .../ReportTaskLedgerImportPanel.vue | 426 +++++++++ .../check-test-report-page-contract.mjs | 96 +- .../src/views/aireport/testReport/index.vue | 30 +- .../aireport/testReport/utils/testReport.ts | 211 +++++ 8 files changed, 1641 insertions(+), 168 deletions(-) create mode 100644 frontend/src/views/aireport/testReport/components/ReportTaskLedgerImportPanel.vue diff --git a/frontend/src/api/aireport/testReport/index.ts b/frontend/src/api/aireport/testReport/index.ts index 13b0ec4..36cade7 100644 --- a/frontend/src/api/aireport/testReport/index.ts +++ b/frontend/src/api/aireport/testReport/index.ts @@ -8,7 +8,7 @@ export const listReportTasksApi = (params: ReportTask.ReportTaskListParams) => { return http.post(`${REPORT_TASK_BASE_URL}/list`, params) } -export const createReportTaskApi = (params: ReportTask.ReportTaskSaveRequest) => { +export const createReportTaskApi = (params: ReportTask.ReportTaskAddParam) => { return http.post(`${REPORT_TASK_BASE_URL}/add`, params) } @@ -30,3 +30,18 @@ export const exportReportTasksApi = (params: ReportTask.ReportTaskListParams): P export const submitReportTaskAuditApi = (params: ReportTask.ReportTaskAuditRequest) => { return http.post(`${REPORT_TASK_BASE_URL}/submit-audit`, params) } + +export const downloadReportTaskLedgerTemplateApi = (): Promise> => + http.get(`${REPORT_TASK_BASE_URL}/ledger/template`, undefined, { + responseType: 'blob' + }) as unknown as Promise> + +export const importReportTaskLedgerApi = (id: string, formData: FormData) => { + return http.post(`${REPORT_TASK_BASE_URL}/${id}/ledger/import`, formData, { + headers: { 'Content-Type': 'multipart/form-data' } + }) +} + +export const listReportTaskGroupReportsApi = (id: string) => { + return http.get(`${REPORT_TASK_BASE_URL}/${id}/group-report/list`) +} diff --git a/frontend/src/api/aireport/testReport/interface/index.ts b/frontend/src/api/aireport/testReport/interface/index.ts index 14823e9..96a06e2 100644 --- a/frontend/src/api/aireport/testReport/interface/index.ts +++ b/frontend/src/api/aireport/testReport/interface/index.ts @@ -1,4 +1,12 @@ export namespace ReportTask { + export type ReportTaskGroupReportGenerateState = 0 | 1 | 2 | 3 + export type ReportTaskLedgerImportStage = + | '选择文件' + | '校验文件' + | '文件上传' + | '基础资料维护' + | '完成' + export interface ReportTaskRecord { id?: string no?: string | null @@ -16,12 +24,16 @@ export namespace ReportTask { checkTime?: string | null checkResult?: string | null status?: number + pointCount?: number | null + groupCount?: number | null + reportGenerateState?: number | null createBy?: string | null createByName?: string | null createTime?: string | null updateBy?: string | null updateByName?: string | null updateTime?: string | null + groupReports?: ReportTaskGroupReportRecord[] | null } export interface ReportTaskListParams { @@ -33,7 +45,7 @@ export namespace ReportTask { pageSize?: number } - export interface ReportTaskSaveRequest { + export interface ReportTaskAddParam { id?: string no: string clientUnitId: string @@ -45,8 +57,102 @@ export namespace ReportTask { phonenumber?: string } + export interface ReportTaskSaveRequest extends ReportTaskAddParam {} + export interface ReportTaskAuditRequest { id: string checkResult?: string } + + export interface ReportTaskLedgerImportStageRecord { + stage?: ReportTaskLedgerImportStage | string | null + success?: boolean | null + message?: string | null + } + + export interface ReportTaskLedgerImportSnapshotGroupRecord { + groupNo?: number | null + count?: number | null + } + + export interface ReportTaskLedgerImportSnapshot { + version?: string | null + importMode?: string | null + summaryFileName?: string | null + sheetSummary?: { + pointSheet?: string | null + deviceSheetPresent?: boolean | null + clientSheetPresent?: boolean | null + } | null + rowCount?: number | null + groupSummary?: ReportTaskLedgerImportSnapshotGroupRecord[] | null + baseDataSummary?: { + deviceAddedCount?: number | null + deviceReuseCount?: number | null + clientAddedCount?: number | null + clientReuseCount?: number | null + } | null + } + + export interface ReportTaskLedgerImportResult { + currentStage?: ReportTaskLedgerImportStage | string | null + success?: boolean | null + summaryFileName?: string | null + totalFileCount?: number + pointCount?: number + excelAttachmentCount?: number + wordAttachmentCount?: number + deviceAddedCount?: number + deviceReuseCount?: number + clientAddedCount?: number + clientReuseCount?: number + groupCount?: number + failReasons?: string[] | null + stages?: ReportTaskLedgerImportStageRecord[] | null + } + + export interface ReportTaskPointRecord { + id?: string + groupNo?: number | null + substationName?: string | null + pointName?: string | null + monitorTime?: string | null + voltageLevel?: string | null + ptRatio?: string | null + ctRatio?: string | null + baseShortCircuitCapacity?: string | null + minShortCircuitCapacity?: string | null + protocolCapacity?: string | null + powerSupplyCapacity?: string | null + excelAttachmentName?: string | null + } + + export interface ReportTaskPointGroupItem { + groupNo: number + pointIds: string[] + } + + export interface ReportTaskGroupSaveRequest { + groups: ReportTaskPointGroupItem[] + } + + export interface ReportTaskGroupReportRecord { + id?: string + groupNo?: number | null + reportName?: string | null + reportFileName?: string | null + reportStoragePath?: string | null + generateState?: ReportTaskGroupReportGenerateState | null + generateMessage?: string | null + generateTime?: string | null + sortNo?: number | null + } + + export interface ReportTaskLedgerPreparedState { + draftId: string + latestImportResult: ReportTaskLedgerImportResult | null + snapshot: ReportTaskLedgerImportSnapshot | null + hasImported: boolean + pendingReimport: boolean + } } diff --git a/frontend/src/views/aireport/testReport/components/ReportTaskDetailDialog.vue b/frontend/src/views/aireport/testReport/components/ReportTaskDetailDialog.vue index 4d237e8..6fb91fa 100644 --- a/frontend/src/views/aireport/testReport/components/ReportTaskDetailDialog.vue +++ b/frontend/src/views/aireport/testReport/components/ReportTaskDetailDialog.vue @@ -1,5 +1,5 @@