From f9c826ffea42a7b2069fa08d654941cc8be28584 Mon Sep 17 00:00:00 2001 From: yexb <553699424@qq.com> Date: Fri, 10 Jul 2026 10:37:52 +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/build/getEnv.ts | 4 +- frontend/src/api/aireport/testReport/index.ts | 8 +- .../aireport/testReport/interface/index.ts | 63 +- frontend/src/types/vite-plugin-eslint.d.ts | 7 + .../components/ReportTaskBaseInfoStep.vue | 221 ++++++ .../components/ReportTaskCompleteStep.vue | 53 ++ .../components/ReportTaskFormDialog.vue | 737 +++++++----------- .../components/ReportTaskImportStep.vue | 263 +++++++ .../ReportTaskLedgerImportPanel.vue | 426 ---------- .../components/ReportTaskPrepareStep.vue | 588 ++++++++++++++ .../check-ledger-summary-file-contract.mjs | 40 + .../check-test-report-page-contract.mjs | 152 ++-- .../src/views/aireport/testReport/index.vue | 42 +- .../testReport/utils/reportTaskFlow.ts | 88 +++ .../aireport/testReport/utils/testReport.ts | 103 ++- .../testReport/utils/testReportForm.ts | 72 ++ frontend/tsconfig.node.json | 5 +- frontend/vite.config.ts | 8 +- 18 files changed, 1907 insertions(+), 973 deletions(-) create mode 100644 frontend/src/types/vite-plugin-eslint.d.ts create mode 100644 frontend/src/views/aireport/testReport/components/ReportTaskBaseInfoStep.vue create mode 100644 frontend/src/views/aireport/testReport/components/ReportTaskCompleteStep.vue create mode 100644 frontend/src/views/aireport/testReport/components/ReportTaskImportStep.vue delete mode 100644 frontend/src/views/aireport/testReport/components/ReportTaskLedgerImportPanel.vue create mode 100644 frontend/src/views/aireport/testReport/components/ReportTaskPrepareStep.vue create mode 100644 frontend/src/views/aireport/testReport/contracts/check-ledger-summary-file-contract.mjs create mode 100644 frontend/src/views/aireport/testReport/utils/reportTaskFlow.ts create mode 100644 frontend/src/views/aireport/testReport/utils/testReportForm.ts diff --git a/frontend/build/getEnv.ts b/frontend/build/getEnv.ts index 1487dc5..aa9f42a 100644 --- a/frontend/build/getEnv.ts +++ b/frontend/build/getEnv.ts @@ -30,7 +30,9 @@ export function wrapperEnv(envConf: Recordable): ViteEnv { if (envName === "VITE_PROXY") { try { realName = JSON.parse(realName); - } catch (error) {} + } catch (error) { + // Keep the original string when the proxy config is not valid JSON. + } } ret[envName] = realName; } diff --git a/frontend/src/api/aireport/testReport/index.ts b/frontend/src/api/aireport/testReport/index.ts index 36cade7..84b2ded 100644 --- a/frontend/src/api/aireport/testReport/index.ts +++ b/frontend/src/api/aireport/testReport/index.ts @@ -36,12 +36,16 @@ export const downloadReportTaskLedgerTemplateApi = (): Promise> -export const importReportTaskLedgerApi = (id: string, formData: FormData) => { - return http.post(`${REPORT_TASK_BASE_URL}/${id}/ledger/import`, formData, { +export const validateReportTaskLedgerApi = (id: string, formData: FormData) => { + return http.post(`${REPORT_TASK_BASE_URL}/${id}/ledger/validate`, formData, { headers: { 'Content-Type': 'multipart/form-data' } }) } +export const importReportTaskLedgerApi = (id: string, params: ReportTask.ReportTaskLedgerImportRequest) => { + return http.post(`${REPORT_TASK_BASE_URL}/${id}/ledger/import`, params) +} + 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 96a06e2..48985bf 100644 --- a/frontend/src/api/aireport/testReport/interface/index.ts +++ b/frontend/src/api/aireport/testReport/interface/index.ts @@ -1,9 +1,11 @@ export namespace ReportTask { + export type ReportTaskState = '01' | '02' | '03' | '04' | '05' + export type ReportTaskGenerateState = 0 | 1 | 2 export type ReportTaskGroupReportGenerateState = 0 | 1 | 2 | 3 export type ReportTaskLedgerImportStage = | '选择文件' | '校验文件' - | '文件上传' + | '文件导入' | '基础资料维护' | '完成' @@ -23,10 +25,11 @@ export namespace ReportTask { checkerName?: string | null checkTime?: string | null checkResult?: string | null + state?: ReportTaskState | null status?: number pointCount?: number | null groupCount?: number | null - reportGenerateState?: number | null + reportGenerateState?: ReportTaskGenerateState | null createBy?: string | null createByName?: string | null createTime?: string | null @@ -40,6 +43,7 @@ export namespace ReportTask { keyword?: string searchBeginTime?: string searchEndTime?: string + state?: ReportTaskState | '' timeRange?: string[] pageNum?: number pageSize?: number @@ -94,11 +98,57 @@ export namespace ReportTask { } | null } + export interface ReportTaskLedgerValidateAttachment { + attachmentName?: string | null + attachmentType?: string | null + referenced?: boolean | null + uploaded?: boolean | null + missing?: boolean | null + reuploadAllowed?: boolean | null + message?: string | null + } + + export interface ReportTaskLedgerValidatePoint { + rowNo?: number | null + pointKey?: string | null + substationName?: string | null + pointName?: string | null + complete?: boolean | null + missingAttachmentCount?: number | null + testDeviceNoValid?: boolean | null + testDeviceNoMessage?: string | null + clientUnitNameValid?: boolean | null + clientUnitNameMessage?: string | null + attachments?: ReportTaskLedgerValidateAttachment[] | null + } + + export interface ReportTaskLedgerValidateResult { + sessionId?: string | null + batchId?: string | null + success?: boolean | null + summaryFileName?: string | null + summaryFilePresent?: boolean | null + tempStoragePath?: string | null + uploadedFileCount?: number | null + pointCount?: number | null + missingAttachmentCount?: number | null + canContinueUpload?: boolean | null + requiredSheets?: string[] | null + existingSheets?: string[] | null + missingSheets?: string[] | null + orphanAttachmentNames?: string[] | null + failReasons?: string[] | null + points?: ReportTaskLedgerValidatePoint[] | null + } + export interface ReportTaskLedgerImportResult { + batchId?: string | null currentStage?: ReportTaskLedgerImportStage | string | null success?: boolean | null summaryFileName?: string | null + tempStoragePath?: string | null totalFileCount?: number + uploadedFileCount?: number pointCount?: number excelAttachmentCount?: number wordAttachmentCount?: number @@ -111,6 +161,10 @@ export namespace ReportTask { stages?: ReportTaskLedgerImportStageRecord[] | null } + export interface ReportTaskLedgerImportRequest { + batchId: string + } + export interface ReportTaskPointRecord { id?: string groupNo?: number | null @@ -150,9 +204,12 @@ export namespace ReportTask { export interface ReportTaskLedgerPreparedState { draftId: string + validateSessionId: string + validateResult: ReportTaskLedgerValidateResult | null latestImportResult: ReportTaskLedgerImportResult | null snapshot: ReportTaskLedgerImportSnapshot | null hasImported: boolean - pendingReimport: boolean + validatedBatchId: string + pendingRevalidate: boolean } } diff --git a/frontend/src/types/vite-plugin-eslint.d.ts b/frontend/src/types/vite-plugin-eslint.d.ts new file mode 100644 index 0000000..2788d8c --- /dev/null +++ b/frontend/src/types/vite-plugin-eslint.d.ts @@ -0,0 +1,7 @@ +declare module 'vite-plugin-eslint' { + import type { Plugin } from 'vite' + + const eslintPlugin: (options?: Record) => Plugin + + export default eslintPlugin +} diff --git a/frontend/src/views/aireport/testReport/components/ReportTaskBaseInfoStep.vue b/frontend/src/views/aireport/testReport/components/ReportTaskBaseInfoStep.vue new file mode 100644 index 0000000..2620f9a --- /dev/null +++ b/frontend/src/views/aireport/testReport/components/ReportTaskBaseInfoStep.vue @@ -0,0 +1,221 @@ + + + + + diff --git a/frontend/src/views/aireport/testReport/components/ReportTaskCompleteStep.vue b/frontend/src/views/aireport/testReport/components/ReportTaskCompleteStep.vue new file mode 100644 index 0000000..f7c628d --- /dev/null +++ b/frontend/src/views/aireport/testReport/components/ReportTaskCompleteStep.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/frontend/src/views/aireport/testReport/components/ReportTaskFormDialog.vue b/frontend/src/views/aireport/testReport/components/ReportTaskFormDialog.vue index 62efb22..5bf91a6 100644 --- a/frontend/src/views/aireport/testReport/components/ReportTaskFormDialog.vue +++ b/frontend/src/views/aireport/testReport/components/ReportTaskFormDialog.vue @@ -6,17 +6,17 @@ append-to-body destroy-on-close class="report-task-flow-dialog" - @closed="resetForm" + @closed="resetFlow" >
-
-
- +
+ + + + + + +
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +