From 934530c7f93d51580a03fb7f73229cbb0be2dba8 Mon Sep 17 00:00:00 2001 From: zpc Date: Wed, 25 Feb 2026 11:11:31 +0800 Subject: [PATCH] 21 --- .../src/api/business/assessmentRecord.ts | 23 +++++ .../business/assessment/record/index.vue | 94 +++++++++++++++++-- 2 files changed, 111 insertions(+), 6 deletions(-) diff --git a/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/api/business/assessmentRecord.ts b/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/api/business/assessmentRecord.ts index da2559d..d73df56 100644 --- a/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/api/business/assessmentRecord.ts +++ b/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/api/business/assessmentRecord.ts @@ -135,3 +135,26 @@ export function exportRecords(params: AssessmentRecordQuery): Promise> { + return request({ + url: '/admin/assessmentRecord/regenerateReport', + method: 'post', + data: { id } + }) +} + +/** 批量重新生成报告 */ +export function batchRegenerateReport(ids: number[]): Promise> { + return request({ + url: '/admin/assessmentRecord/batchRegenerateReport', + method: 'post', + data: { ids } + }) +} diff --git a/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/views/business/assessment/record/index.vue b/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/views/business/assessment/record/index.vue index 0fbac04..efd872a 100644 --- a/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/views/business/assessment/record/index.vue +++ b/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/views/business/assessment/record/index.vue @@ -8,6 +8,10 @@ 查看用户测评记录、答案详情和测评报告
+ + + 批量重新生成 + 导出Excel @@ -33,6 +37,7 @@ + @@ -62,7 +67,8 @@ - + + - + @@ -270,13 +286,15 @@ * @description 查看用户测评记录、答案详情和测评报告,支持搜索、导出 */ import { reactive, ref, onMounted } from 'vue' -import { Search, Refresh, View, Download, Document } from '@element-plus/icons-vue' -import { ElMessage } from 'element-plus' +import { Search, Refresh, View, Download, Document, RefreshRight } from '@element-plus/icons-vue' +import { ElMessage, ElMessageBox } from 'element-plus' import { getRecordList, getRecordDetail, getRecordReport, exportRecords, + regenerateReport, + batchRegenerateReport, type AssessmentRecordItem, type AssessmentRecordDetail, type AssessmentReport, @@ -331,6 +349,8 @@ interface RecordPageState { report: AssessmentReport | null exportLoading: boolean scoreOptionMap: Map + batchRegenerateLoading: boolean + selectedRows: AssessmentRecordItem[] } // ============ Refs ============ @@ -359,7 +379,9 @@ const state = reactive({ reportLoading: false, report: null, exportLoading: false, - scoreOptionMap: new Map() + scoreOptionMap: new Map(), + batchRegenerateLoading: false, + selectedRows: [] }) // ============ Helper Functions ============ @@ -368,12 +390,13 @@ const state = reactive({ * 获取状态标签类型 * 待测评=info, 测评中=primary, 生成中=warning, 已完成=success */ -function getStatusTagType(status: number): 'info' | 'primary' | 'warning' | 'success' { +function getStatusTagType(status: number): 'info' | 'primary' | 'warning' | 'success' | 'danger' { switch (status) { case 1: return 'info' case 2: return 'primary' case 3: return 'warning' case 4: return 'success' + case 5: return 'danger' default: return 'info' } } @@ -547,6 +570,65 @@ function handleViewReport(row: AssessmentRecordItem) { loadRecordReport(row.id) } +/** 表格选择变化 */ +function handleSelectionChange(rows: AssessmentRecordItem[]) { + state.selectedRows = rows +} + +/** 单条重新生成报告 */ +async function handleRegenerate(row: AssessmentRecordItem) { + try { + await ElMessageBox.confirm( + `确定要重新生成记录 ID=${row.id} 的报告吗?`, + '重新生成报告', + { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' } + ) + const res = await regenerateReport(row.id) + if (res.code === 0) { + ElMessage.success('已提交重新生成,请稍后刷新查看') + loadRecordList() + } else { + throw new Error(res.message || '重新生成失败') + } + } catch (error) { + if (error === 'cancel' || (error as any)?.toString?.().includes('cancel')) return + const message = error instanceof Error ? error.message : '重新生成失败' + ElMessage.error(message) + } +} + +/** 批量重新生成报告 */ +async function handleBatchRegenerate() { + const eligibleRows = state.selectedRows.filter(r => r.status === 3 || r.status === 5) + if (eligibleRows.length === 0) { + ElMessage.warning('请先勾选状态为"生成中"或"生成失败"的记录') + return + } + try { + await ElMessageBox.confirm( + `已选中 ${eligibleRows.length} 条符合条件的记录,确定批量重新生成?`, + '批量重新生成报告', + { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' } + ) + state.batchRegenerateLoading = true + const ids = eligibleRows.map(r => r.id) + const res = await batchRegenerateReport(ids) + if (res.code === 0) { + const { successCount, skippedCount } = res.data! + ElMessage.success(`成功入队 ${successCount} 条,跳过 ${skippedCount} 条`) + loadRecordList() + } else { + throw new Error(res.message || '批量重新生成失败') + } + } catch (error) { + if (error === 'cancel' || (error as any)?.toString?.().includes('cancel')) return + const message = error instanceof Error ? error.message : '批量重新生成失败' + ElMessage.error(message) + } finally { + state.batchRegenerateLoading = false + } +} + async function handleExport() { state.exportLoading = true try {