feat(aireport): 优化多模板报告任务、报告任务管理功能

- 在多个对话框组件中禁用点击遮罩关闭功能
- 将报告任务编号设为可选字段,支持系统自动生成
- 添加报告任务下载功能按钮和相关API接口
- 重构多模板批任务的子任务显示逻辑,统一使用任务概念
- 优化报告任务分组对话框的界面布局和样式
- 添加分组报告详情查看功能
- 更新测试报告多模板创建对话框的表单结构
- 调整报告任务相关API接口参数类型定义
This commit is contained in:
dk
2026-07-22 16:28:32 +08:00
parent ecbb40d4a0
commit 93eca67807
25 changed files with 196 additions and 114 deletions

View File

@@ -62,6 +62,11 @@ export const generateReportTaskGroupReportsApi = (id: string) => {
return http.post<boolean>(`${REPORT_TASK_BASE_URL}/${id}/generate`)
}
export const downloadReportTaskApi = (id: string): Promise<AxiosResponse<Blob>> =>
http.get(`${REPORT_TASK_BASE_URL}/${id}/download`, undefined, {
responseType: 'blob'
}) as unknown as Promise<AxiosResponse<Blob>>
export const downloadReportTaskGroupReportApi = (groupReportId: string): Promise<AxiosResponse<Blob>> =>
http.get(`${REPORT_TASK_BASE_URL}/group-report/${groupReportId}/download`, undefined, {
responseType: 'blob'

View File

@@ -50,7 +50,7 @@ export namespace ReportTask {
export interface ReportTaskAddParam {
id?: string
no: string
no?: string
reportModelId: string
data: Record<string, unknown> | unknown[]
batchId?: string

View File

@@ -22,8 +22,8 @@ export const getReportTaskMultiDetailApi = (id: string) => {
return http.get<ReportTaskMulti.ReportTaskMultiRecord>(`${REPORT_TASK_MULTI_BASE_URL}/${id}`)
}
export const listReportTaskMultiChildReportsApi = (id: string) => {
return http.get(`${REPORT_TASK_MULTI_BASE_URL}/${id}/child-report/list`)
export const listReportTaskMultiChildTasksApi = (id: string) => {
return http.get(`${REPORT_TASK_MULTI_BASE_URL}/${id}/child-task/list`)
}
export const downloadReportTaskMultiApi = (id: string): Promise<AxiosResponse<Blob>> =>

View File

@@ -55,12 +55,12 @@ export namespace ReportTaskMulti {
export interface ReportTaskMultiChildConfig {
templateDirName: string
templateDirPath: string
no: string
no?: string
reportModelId: string
}
export interface ReportTaskMultiCreateParam {
no: string
no?: string
sessionId: string
childReports: ReportTaskMultiChildConfig[]
}

View File

@@ -1,5 +1,5 @@
<template>
<el-dialog v-model="visibleProxy" title="委托单位详情" width="720px" append-to-body destroy-on-close>
<el-dialog v-model="visibleProxy" title="委托单位详情" width="720px" append-to-body destroy-on-close :close-on-click-modal="false">
<div v-loading="loading" class="client-unit-detail-dialog">
<el-descriptions :column="2" border>
<el-descriptions-item label="单位名称">{{ resolveClientUnitText(detail?.name) }}</el-descriptions-item>

View File

@@ -5,6 +5,7 @@
width="620px"
append-to-body
destroy-on-close
:close-on-click-modal="false"
@closed="resetForm"
>
<el-form ref="formRef" :model="formModel" :rules="formRules" label-width="96px">

View File

@@ -1,5 +1,5 @@
<template>
<el-dialog v-model="visibleProxy" title="导入委托单位" width="640px" append-to-body destroy-on-close @closed="resetImport">
<el-dialog v-model="visibleProxy" title="导入委托单位" width="640px" append-to-body destroy-on-close :close-on-click-modal="false" @closed="resetImport">
<div class="client-unit-import-dialog">
<div class="file-select-row">
<el-input :model-value="selectedFileName" readonly placeholder="请选择 .xlsx 文件" />

View File

@@ -5,6 +5,7 @@
width="560px"
append-to-body
destroy-on-close
:close-on-click-modal="false"
@close="handleClose"
>
<el-form ref="formRef" :model="formState" :rules="formRules" label-width="88px">

View File

@@ -5,6 +5,7 @@
width="720px"
append-to-body
destroy-on-close
:close-on-click-modal="false"
>
<div v-loading="loading" class="report-model-detail-dialog">
<el-descriptions class="detail-descriptions" :column="2" border>

View File

@@ -5,6 +5,7 @@
width="560px"
append-to-body
destroy-on-close
:close-on-click-modal="false"
@closed="resetForm"
>
<el-form ref="formRef" :model="formModel" :rules="formRules" label-width="96px">

View File

@@ -5,6 +5,7 @@
width="960px"
append-to-body
destroy-on-close
:close-on-click-modal="false"
@closed="clearPreview"
>
<div v-loading="loading" class="report-model-preview-dialog">

View File

@@ -1,5 +1,5 @@
<template>
<el-dialog v-model="visibleProxy" title="检测设备详情" width="720px" append-to-body destroy-on-close>
<el-dialog v-model="visibleProxy" title="检测设备详情" width="720px" append-to-body destroy-on-close :close-on-click-modal="false">
<div v-loading="loading" class="test-device-detail-dialog">
<el-descriptions class="detail-descriptions" :column="2" border>
<el-descriptions-item label="设备型号">{{ resolveTestDeviceText(detail?.typeName) }}</el-descriptions-item>

View File

@@ -5,6 +5,7 @@
width="640px"
append-to-body
destroy-on-close
:close-on-click-modal="false"
@closed="resetForm"
>
<el-form ref="formRef" :model="formModel" :rules="formRules" label-width="108px">

View File

@@ -1,5 +1,5 @@
<template>
<el-dialog v-model="visibleProxy" title="导入检测设备" width="680px" append-to-body destroy-on-close @closed="resetImport">
<el-dialog v-model="visibleProxy" title="导入检测设备" width="680px" append-to-body destroy-on-close :close-on-click-modal="false" @closed="resetImport">
<div class="test-device-import-dialog">
<div class="file-select-row">
<el-input :model-value="selectedFileName" readonly placeholder="请选择检测设备 Excel 文件" />

View File

@@ -5,6 +5,7 @@
width="960px"
append-to-body
destroy-on-close
:close-on-click-modal="false"
@closed="clearPreview"
>
<div v-loading="loading" class="test-device-report-preview-dialog">

View File

@@ -5,6 +5,7 @@
width="560px"
append-to-body
destroy-on-close
:close-on-click-modal="false"
@closed="resetForm"
>
<el-form ref="formRef" :model="formModel" :rules="formRules" label-width="96px">

View File

@@ -2,12 +2,7 @@
<div class="form-panel">
<el-form ref="formRef" :model="localFormModel" :rules="formRules" label-width="108px" class="report-task-form">
<el-row :gutter="16">
<el-col :xs="24" :sm="12">
<el-form-item label="任务编号" prop="no">
<el-input v-model="localFormModel.no" maxlength="32" clearable placeholder="请输入任务编号" />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12">
<el-col :xs="24" :sm="16">
<el-form-item label="报告模板" prop="reportModelId">
<el-select v-model="localFormModel.reportModelId" filterable clearable placeholder="请选择报告模板">
<el-option v-for="option in reportModelSelectOptions" :key="option.value" :label="option.label" :value="option.value" />
@@ -43,7 +38,6 @@ const formRef = ref<FormInstance>()
const localFormModel = ref<ReportTaskFormModel>({ ...props.formModel })
const formRules: FormRules = {
no: [{ required: true, message: '请输入任务编号', trigger: 'blur' }],
reportModelId: [{ required: true, message: '请选择报告模板', trigger: 'change' }]
}

View File

@@ -7,7 +7,7 @@
/>
<el-descriptions :column="2" border>
<el-descriptions-item label="任务编号">{{ formModel.no || '-' }}</el-descriptions-item>
<el-descriptions-item label="任务编号">{{ formModel.no || '系统自动生成' }}</el-descriptions-item>
<el-descriptions-item label="报告模板">{{ resolveCurrentOptionLabel(reportModelOptions, formModel.reportModelId) }}</el-descriptions-item>
<el-descriptions-item label="监测点数">{{ importSummary.pointCount }}</el-descriptions-item>
<el-descriptions-item label="分组数">{{ importSummary.groupCount }}</el-descriptions-item>

View File

@@ -1,5 +1,5 @@
<template>
<el-dialog v-model="visibleProxy" title="普测报告任务详情" width="1200px" append-to-body destroy-on-close>
<el-dialog v-model="visibleProxy" title="普测报告任务详情" width="1200px" append-to-body destroy-on-close :close-on-click-modal="false">
<div v-loading="loading" class="report-task-detail-dialog">
<el-descriptions class="detail-descriptions" :column="2" border>
<el-descriptions-item label="任务编号">{{ resolveReportTaskText(detail?.no) }}</el-descriptions-item>
@@ -54,8 +54,9 @@
</el-table-column>
<el-table-column prop="generateMessage" label="生成消息" min-width="180" show-overflow-tooltip />
<el-table-column prop="generateTime" label="生成时间" min-width="160" show-overflow-tooltip />
<el-table-column label="操作" width="120" fixed="right">
<el-table-column label="操作" width="140" fixed="right">
<template #default="{ row }">
<el-button link type="primary" @click="openGroupReportDetail(row)">详情</el-button>
<el-button
link
type="primary"
@@ -70,6 +71,42 @@
</el-table>
</div>
</div>
<el-dialog
v-model="groupReportDetailVisible"
title="分组报告详情"
width="640px"
append-to-body
destroy-on-close
:close-on-click-modal="false"
class="group-report-detail-dialog"
>
<el-descriptions v-if="currentGroupReport" :column="1" label-width="100px" border class="group-report-detail-descriptions">
<el-descriptions-item label="分组号">{{ resolveReportTaskText(currentGroupReport.groupNo) }}</el-descriptions-item>
<el-descriptions-item label="报告编号">{{ resolveReportTaskText(currentGroupReport.reportNo) }}</el-descriptions-item>
<el-descriptions-item label="委托单位">
{{ resolveReportTaskClientUnitText(currentGroupReport.clientUnitId, clientUnitLabelMap) }}
</el-descriptions-item>
<el-descriptions-item label="检测公司">
{{ resolveReportTaskCreateUnitText(currentGroupReport.createUnit, companyLabelMap) }}
</el-descriptions-item>
<el-descriptions-item label="合同编号">{{ resolveReportTaskText(currentGroupReport.contractNumber) }}</el-descriptions-item>
<el-descriptions-item label="检测依据">
{{ resolveReportTaskStandardText(currentGroupReport.standard, standardLabelMap) }}
</el-descriptions-item>
<el-descriptions-item label="联系电话">{{ resolveReportTaskText(currentGroupReport.phonenumber) }}</el-descriptions-item>
<el-descriptions-item label="报告名称">{{ resolveReportTaskText(currentGroupReport.reportName) }}</el-descriptions-item>
<el-descriptions-item label="报告文件">{{ resolveReportTaskText(currentGroupReport.reportFileName) }}</el-descriptions-item>
<el-descriptions-item label="生成状态">
{{ resolveReportTaskGroupReportGenerateStateText(currentGroupReport.generateState) }}
</el-descriptions-item>
<el-descriptions-item label="生成消息">{{ resolveReportTaskText(currentGroupReport.generateMessage) }}</el-descriptions-item>
<el-descriptions-item label="生成时间">{{ resolveReportTaskText(currentGroupReport.generateTime) }}</el-descriptions-item>
</el-descriptions>
<template #footer>
<el-button type="primary" @click="groupReportDetailVisible = false">关闭</el-button>
</template>
</el-dialog>
<template #footer>
<el-button type="primary" @click="visibleProxy = false">关闭</el-button>
</template>
@@ -77,7 +114,7 @@
</template>
<script setup lang="ts">
import { computed } from 'vue'
import { computed, ref } from 'vue'
import type { ReportTask } from '@/api/aireport/testReport/interface'
import {
normalizeReportTaskLedgerSnapshot,
@@ -118,6 +155,8 @@ const companyLabelMap = computed(() => props.companyLabelMap)
const standardLabelMap = computed(() => props.standardLabelMap)
const groupReports = computed(() => props.groupReports || [])
const downloadingGroupReportId = computed(() => props.downloadingGroupReportId || '')
const groupReportDetailVisible = ref(false)
const currentGroupReport = ref<ReportTask.ReportTaskGroupReportRecord | null>(null)
const detailSnapshot = computed(() => normalizeReportTaskLedgerSnapshot(props.detail?.data as string | null | undefined))
const displayGroupCount = computed(() => {
if (groupReports.value.length > 0) {
@@ -135,6 +174,11 @@ const resolveReportTaskClientUnitText = (value: string | null | undefined, label
if (!text) return '-'
return labelMap[text] || text
}
const openGroupReportDetail = (row: ReportTask.ReportTaskGroupReportRecord) => {
currentGroupReport.value = row
groupReportDetailVisible.value = true
}
</script>
<style scoped lang="scss">

View File

@@ -5,6 +5,7 @@
width="1080px"
append-to-body
destroy-on-close
:close-on-click-modal="false"
class="report-task-flow-dialog"
@closed="resetForm"
>
@@ -49,12 +50,7 @@
class="report-task-form"
>
<el-row :gutter="16">
<el-col :xs="24" :sm="12">
<el-form-item label="任务编号" prop="no">
<el-input v-model="formModel.no" maxlength="32" clearable placeholder="请输入任务编号" />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12">
<el-col :xs="24" :sm="16">
<el-form-item label="报告模板" prop="reportModelId">
<el-select
v-model="formModel.reportModelId"
@@ -106,7 +102,7 @@
/>
<el-descriptions :column="2" border>
<el-descriptions-item label="任务编号">{{ formModel.no || '-' }}</el-descriptions-item>
<el-descriptions-item label="任务编号">{{ formModel.no || '系统自动生成' }}</el-descriptions-item>
<el-descriptions-item label="报告模板">
{{ resolveCurrentOptionLabel(reportModelSelectOptions, formModel.reportModelId) }}
</el-descriptions-item>
@@ -184,7 +180,7 @@ const REPORT_TASK_FORM_STEPS: Array<{
description: string
}> = [
{ index: 1, value: 'import', title: '数据导入', description: '先完成台账与附件校验' },
{ index: 2, value: 'form', title: '任务信息', description: '填写任务编号和报告模板' },
{ index: 2, value: 'form', title: '任务信息', description: '确认报告模板并提交' },
{ index: 3, value: 'done', title: '完成', description: '查看结果并结束本次流程' }
]
@@ -232,7 +228,6 @@ const formModel = reactive({
})
const formRules: FormRules = {
no: [{ required: true, message: '请输入任务编号', trigger: 'blur' }],
reportModelId: [{ required: true, message: '请选择报告模板', trigger: 'change' }]
}
@@ -463,7 +458,7 @@ const submitForm = async () => {
pushLog('info', props.mode === 'create' ? '开始提交新增任务' : '开始提交编辑后的任务信息')
emit('submit', {
id: activeDraftId.value || formModel.id || undefined,
no: formModel.no.trim(),
no: formModel.no.trim() || undefined,
reportModelId: formModel.reportModelId,
data: JSON.parse(formModel.data.trim() || '{}'),
batchId: ledgerPreparedState.value.batchId || undefined

View File

@@ -1,5 +1,5 @@
<template>
<el-dialog v-model="visibleProxy" title="监测点分组" width="1380px" append-to-body destroy-on-close>
<el-dialog v-model="visibleProxy" title="监测点分组" width="1380px" append-to-body destroy-on-close :close-on-click-modal="false">
<div v-loading="loading" class="report-task-group-dialog">
<el-descriptions :column="4" border class="summary-descriptions">
<el-descriptions-item label="任务编号">{{ resolveReportTaskText(record?.no) }}</el-descriptions-item>
@@ -33,7 +33,7 @@
max-height="420"
class="point-table"
>
<el-table-column label="分组号" width="120">
<el-table-column label="分组号" width="150" class-name="group-no-column">
<template #default="{ row }">
<el-input-number
:model-value="resolvePointGroupNo(row.id)"
@@ -48,7 +48,11 @@
<el-table-column prop="pointName" label="监测点" min-width="180" show-overflow-tooltip />
<el-table-column prop="monitorTime" label="监测时间" min-width="160" show-overflow-tooltip />
<el-table-column prop="voltageLevel" label="电压等级" min-width="120" show-overflow-tooltip />
<el-table-column prop="excelAttachmentName" label="Excel原始文件" min-width="220" show-overflow-tooltip />
<el-table-column prop="excelAttachmentName" label="Excel原始文件" min-width="220" show-overflow-tooltip>
<template #default="{ row }">
{{ resolveReportTaskText(row.excelAttachmentName) }}
</template>
</el-table-column>
<el-table-column prop="wordAttachmentName" label="Word原始文件" min-width="220" show-overflow-tooltip>
<template #default="{ row }">
{{ resolveReportTaskText(row.wordAttachmentName) }}
@@ -58,7 +62,6 @@
<div class="toolbar secondary-toolbar">
<div class="toolbar-title">分组报告信息</div>
<div class="toolbar-tip">这些字段允许先保存为空执行生成报告时再由后端做完整校验</div>
</div>
<el-empty
@@ -416,4 +419,12 @@ const handleSubmit = () => {
:deep(.el-input) {
width: 100%;
}
:deep(.point-table .el-input-number) {
width: 120px;
}
:deep(.point-table .group-no-column .cell) {
overflow: visible;
}
</style>

View File

@@ -35,6 +35,16 @@
>
生成报告
</el-button>
<el-button
link
type="primary"
:icon="Download"
:disabled="!row.groupCount"
:loading="downloadingReportTaskId === row.id"
@click="handleDownloadTaskReports(row)"
>
下载
</el-button>
<el-button link type="primary" :icon="Edit" @click="openEditDialog(row)">编辑</el-button>
<el-button link type="primary" :icon="Upload" @click="openAuditDialog(row)">提交审核</el-button>
<el-button link type="danger" :icon="Delete" @click="handleDelete(row)">删除</el-button>
@@ -98,6 +108,7 @@ import type { ColumnProps, ProTableInstance } from '@/components/ProTable/interf
import {
createReportTaskApi,
deleteReportTasksApi,
downloadReportTaskApi,
downloadReportTaskGroupReportApi,
exportReportTasksApi,
generateReportTaskGroupReportsApi,
@@ -150,6 +161,7 @@ const detailLoading = ref(false)
const auditSaving = ref(false)
const groupDialogLoading = ref(false)
const groupDialogSaving = ref(false)
const downloadingReportTaskId = ref('')
const formMode = ref<'create' | 'edit'>('create')
const currentRecord = ref<ReportTask.ReportTaskRecord | null>(null)
const detailRecord = ref<ReportTask.ReportTaskRecord | null>(null)
@@ -216,7 +228,7 @@ const columns = reactive<ColumnProps<ReportTask.ReportTaskRecord>[]>([
},
{ prop: 'createByName', label: '创建人', minWidth: 120, render: ({ row }) => resolveReportTaskText(row.createByName || row.createBy) },
{ prop: 'createTime', label: '创建时间', minWidth: 170, render: ({ row }) => resolveReportTaskText(row.createTime) },
{ prop: 'operation', label: '操作', fixed: 'right', width: 360 }
{ prop: 'operation', label: '操作', fixed: 'right', width: 430 }
])
const ensureReportTaskDictOptionsReady = async () => {
@@ -521,6 +533,29 @@ const handleDownloadGroupReport = async (row: ReportTask.ReportTaskGroupReportRe
}
}
const handleDownloadTaskReports = async (row: ReportTask.ReportTaskRecord) => {
const reportId = String(row.id || '').trim()
if (!reportId) {
ElMessage.warning('当前报告任务缺少 ID无法下载')
return
}
downloadingReportTaskId.value = reportId
try {
await useDownloadWithServerFileName(
() => downloadReportTaskApi(reportId),
row.no || '普测报告任务报告包',
undefined,
false,
'.zip'
)
} catch (error) {
ElMessage.error(getReportTaskErrorMessage(error, '报告任务下载失败'))
} finally {
downloadingReportTaskId.value = ''
}
}
const deleteReportTasks = async (ids: string[], successMessage: string) => {
if (!ids.length) {
ElMessage.warning('请选择要删除的报告任务')

View File

@@ -429,18 +429,22 @@ export const normalizeReportTaskGroupSavePayload = (
return {
groups: Array.from(groupedPointMap.entries())
.sort(([groupNoA], [groupNoB]) => groupNoA - groupNoB)
.map(([groupNo, pointIds]) => ({
groupNo,
pointIds,
reportNo: String(groupConfigMap[groupNo]?.reportNo || '').trim() || undefined,
clientUnitId: String(groupConfigMap[groupNo]?.clientUnitId || '').trim() || undefined,
createUnit: String(groupConfigMap[groupNo]?.createUnit || '').trim() || undefined,
contractNumber: String(groupConfigMap[groupNo]?.contractNumber || '').trim() || undefined,
standard: Array.isArray(groupConfigMap[groupNo]?.standard)
.map(([groupNo, pointIds]) => {
const standard = Array.isArray(groupConfigMap[groupNo]?.standard)
? groupConfigMap[groupNo].standard!.map(item => String(item || '').trim()).filter(Boolean)
: [],
phonenumber: String(groupConfigMap[groupNo]?.phonenumber || '').trim() || undefined
}))
: []
return {
groupNo,
pointIds,
reportNo: String(groupConfigMap[groupNo]?.reportNo || '').trim() || undefined,
clientUnitId: String(groupConfigMap[groupNo]?.clientUnitId || '').trim() || undefined,
createUnit: String(groupConfigMap[groupNo]?.createUnit || '').trim() || undefined,
contractNumber: String(groupConfigMap[groupNo]?.contractNumber || '').trim() || undefined,
standard: standard.length ? standard : undefined,
phonenumber: String(groupConfigMap[groupNo]?.phonenumber || '').trim() || undefined
}
})
}
}

View File

@@ -2,35 +2,34 @@
<el-dialog
v-model="visibleProxy"
title="新增多模板批任务"
width="1240px"
width="760px"
append-to-body
destroy-on-close
:close-on-click-modal="false"
@closed="handleClosed"
>
<div class="create-dialog-body">
<el-form :model="createForm" label-width="110px" class="create-base-form">
<el-row :gutter="16">
<el-col :xs="24" :sm="12">
<el-form-item label="批任务编号" required>
<el-input v-model="createForm.no" maxlength="64" clearable placeholder="请输入批任务编号" />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12">
<el-form-item label="压缩包文件" required>
<el-upload
:auto-upload="false"
:limit="1"
:file-list="zipFileList"
accept=".zip"
@change="handleZipChange"
@remove="handleZipRemove"
@exceed="handleZipExceed"
>
<el-button>选择 zip 压缩包</el-button>
</el-upload>
</el-form-item>
</el-col>
</el-row>
<el-alert
title="批任务编号和子任务编号将由系统自动生成。"
type="info"
:closable="false"
show-icon
/>
<el-form :model="createForm" label-width="96px" class="create-base-form">
<el-form-item label="压缩包文件" required>
<el-upload
:auto-upload="false"
:limit="1"
:file-list="zipFileList"
accept=".zip"
@change="handleZipChange"
@remove="handleZipRemove"
@exceed="handleZipExceed"
>
<el-button>选择 zip 压缩包</el-button>
</el-upload>
</el-form-item>
</el-form>
<div class="validate-toolbar">
@@ -90,25 +89,16 @@
</div>
</div>
<el-form label-width="96px">
<el-row :gutter="16">
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="任务编号" required>
<el-input v-model="item.no" maxlength="32" clearable placeholder="请输入任务编号" />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8">
<el-form-item label="报告模板" required>
<el-select v-model="item.reportModelId" filterable clearable placeholder="请选择报告模板">
<el-option
v-for="option in reportModelOptions"
:key="option.value"
:label="option.label"
:value="option.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="报告模板" required>
<el-select v-model="item.reportModelId" filterable clearable placeholder="请选择报告模板">
<el-option
v-for="option in reportModelOptions"
:key="option.value"
:label="option.label"
:value="option.value"
/>
</el-select>
</el-form-item>
</el-form>
</div>
</div>
@@ -162,11 +152,9 @@ const emit = defineEmits<{
const selectedZipFile = ref<File | null>(null)
const zipFileList = ref<UploadUserFile[]>([])
const createForm = reactive<{
no: string
sessionId: string
childReports: ChildConfigFormItem[]
}>({
no: '',
sessionId: '',
childReports: []
})
@@ -185,7 +173,6 @@ const clearValidatedResult = (notify = true) => {
}
const resetLocalState = (notify = true) => {
createForm.no = ''
selectedZipFile.value = null
zipFileList.value = []
clearValidatedResult(notify)
@@ -195,7 +182,6 @@ const buildChildConfigForms = (templateDirs: ReportTaskMulti.ReportTaskMultiTemp
templateDirs.map(item => ({
templateDirName: String(item.dirName || ''),
templateDirPath: String(item.dirPath || ''),
no: '',
reportModelId: '',
pointCount: Number(item.pointCount || 0),
groupCount: Number(item.groupCount || 0),
@@ -246,12 +232,10 @@ const handleValidateZip = () => {
}
const validateCreateForm = () => {
if (!createForm.no.trim()) return '请输入批任务编号'
if (!createForm.sessionId) return '请先校验通过压缩包'
if (!createForm.childReports.length) return '当前没有可创建的子任务配置'
for (const item of createForm.childReports) {
if (!item.no.trim()) return `模板目录 ${item.templateDirName} 缺少任务编号`
if (!item.reportModelId) return `模板目录 ${item.templateDirName} 缺少报告模板`
}
@@ -266,12 +250,10 @@ const handleCreate = () => {
}
emit('create', {
no: createForm.no.trim(),
sessionId: createForm.sessionId,
childReports: createForm.childReports.map(item => ({
templateDirName: item.templateDirName,
templateDirPath: item.templateDirPath,
no: item.no.trim(),
reportModelId: item.reportModelId
}))
})
@@ -294,6 +276,10 @@ const handleClosed = () => {
width: 100%;
}
.create-base-form {
max-width: 560px;
}
.validate-toolbar {
display: flex;
align-items: center;
@@ -325,7 +311,7 @@ const handleClosed = () => {
.dir-config-item {
border: 1px solid var(--el-border-color-light);
border-radius: 8px;
padding: 16px 16px 0;
padding: 16px;
background: var(--el-fill-color-blank);
}

View File

@@ -23,7 +23,7 @@
@reset="resetCreateDialogState"
/>
<el-dialog v-model="detailDialogVisible" title="多模板批任务详情" width="1200px" append-to-body destroy-on-close>
<el-dialog v-model="detailDialogVisible" title="多模板批任务详情" width="1200px" append-to-body destroy-on-close :close-on-click-modal="false">
<div v-loading="detailLoading" class="detail-dialog-body">
<el-descriptions v-if="detailRecord" :column="2" border>
<el-descriptions-item label="批任务编号">{{ resolveReportTaskText(detailRecord.no) }}</el-descriptions-item>
@@ -42,13 +42,13 @@
<div class="detail-toolbar">
<div class="section-title">子任务列表</div>
<el-button
:loading="downloadingMultiId === detailRecord?.id"
:disabled="!detailRecord?.id"
@click="handleDownloadMulti(detailRecord)"
>
下载批任务
</el-button>
<!-- <el-button-->
<!-- :loading="downloadingMultiId === detailRecord?.id"-->
<!-- :disabled="!detailRecord?.id"-->
<!-- @click="handleDownloadMulti(detailRecord)"-->
<!-- >-->
<!-- 下载批任务-->
<!-- </el-button>-->
<el-button
type="primary"
:loading="multiGenerating"
@@ -59,7 +59,7 @@
</el-button>
</div>
<el-table :data="detailChildReports" border class="child-report-table">
<el-table :data="detailChildTasks" border class="child-task-table">
<el-table-column prop="templateDirName" label="模板目录" min-width="150" />
<el-table-column prop="no" label="任务编号" min-width="160" />
<el-table-column prop="reportModelName" label="报告模板" min-width="140" />
@@ -128,7 +128,7 @@ import {
downloadReportTaskMultiApi,
generateReportTaskMultiApi,
getReportTaskMultiDetailApi,
listReportTaskMultiChildReportsApi,
listReportTaskMultiChildTasksApi,
listReportTaskMultisApi,
validateReportTaskMultiZipApi,
createReportTaskMultiApi
@@ -191,7 +191,7 @@ const childGroupSaving = ref(false)
const multiGenerating = ref(false)
const zipValidateResult = ref<ReportTaskMulti.ReportTaskMultiValidateResult | null>(null)
const detailRecord = ref<ReportTaskMulti.ReportTaskMultiRecord | null>(null)
const detailChildReports = ref<ReportTask.ReportTaskRecord[]>([])
const detailChildTasks = ref<ReportTask.ReportTaskRecord[]>([])
const childDetailRecord = ref<ReportTask.ReportTaskRecord | null>(null)
const childDetailGroupReports = ref<ReportTask.ReportTaskGroupReportRecord[]>([])
const childGroupReports = ref<ReportTask.ReportTaskGroupReportRecord[]>([])
@@ -322,15 +322,15 @@ const handleCreateMulti = async (payload: ReportTaskMulti.ReportTaskMultiCreateP
}
const loadDetailData = async (id: string) => {
const [detailResponse, childReportsResponse] = await Promise.all([
const [detailResponse, childTasksResponse] = await Promise.all([
getReportTaskMultiDetailApi(id),
listReportTaskMultiChildReportsApi(id)
listReportTaskMultiChildTasksApi(id)
])
detailRecord.value = unwrapReportTaskPayload<ReportTaskMulti.ReportTaskMultiRecord>(
detailResponse as ResultData<ReportTaskMulti.ReportTaskMultiRecord>
)
detailChildReports.value = (unwrapReportTaskPayload<ReportTask.ReportTaskRecord[]>(
childReportsResponse as ResultData<ReportTask.ReportTaskRecord[]>
detailChildTasks.value = (unwrapReportTaskPayload<ReportTask.ReportTaskRecord[]>(
childTasksResponse as ResultData<ReportTask.ReportTaskRecord[]>
) || []) as ReportTask.ReportTaskRecord[]
}
@@ -591,7 +591,7 @@ onMounted(async () => {
gap: 16px;
}
.child-report-table {
.child-task-table {
width: 100%;
}
.detail-toolbar {