jinxia.mo 3 дней назад
Родитель
Сommit
1bba5cc489

+ 1 - 1
back-ui/src/views/dz/papers/components/list-exact-hand.vue

@@ -98,7 +98,7 @@ const handleAction = async function (action, row) {
             drawerObj.value = row
             break;
         case "download":
-            await handleDownload(row)
+            await handleDownload(row.paperId, row.paperName)
             break;
         default:
             throw new Error(`Action key '${action.key}' not support.`)

+ 1 - 1
back-ui/src/views/dz/papers/components/list-exact-intelligent.vue

@@ -62,7 +62,7 @@ const handleAction = async function (action, row) {
             drawerObj.value = row
             break;
         case "download":
-            await handleDownload(row)
+            await handleDownload(row.paperId, row.paperName)
             break;
         default:
             throw new Error(`Action key '${action.key}' not support.`)

+ 1 - 1
back-ui/src/views/dz/papers/components/list-full-hand.vue

@@ -86,7 +86,7 @@ const handleAction = async function (action, row) {
             drawerObj.value = row
             break;
         case "download":
-            await handleDownload(row)
+            await handleDownload(row.paperId, row.paperName)
             break;
         default:
             throw new Error(`Action key '${action.key}' not support.`)

+ 1 - 1
back-ui/src/views/dz/papers/components/list-full-intelligent.vue

@@ -86,7 +86,7 @@ const handleAction = async function (action, row) {
             drawerObj.value = row
             break;
         case "download":
-            await handleDownload(row)
+            await handleDownload(row.paperId, row.paperName)
             break;
         default:
             throw new Error(`Action key '${action.key}' not support.`)

+ 9 - 1
back-ui/src/views/dz/papers/components/paper-records.vue

@@ -63,6 +63,9 @@
             <template #paperName="{row}">
                 <span class="paper-name-link" @click="handleShowPaperDetail(row)">{{ row.paperName || '-' }}</span>
             </template>
+            <template #download="{row}">
+                <el-button type="primary" link @click="handleDownload(row.paperId, row.paperName)" v-hasPermi="['learn:paper:download']">下载</el-button>
+            </template>
         </Table>
         
         <!-- 题目类型详情弹窗 -->
@@ -117,6 +120,7 @@ import DictTag from '@/components/DictTag/index.vue'
 import consts from "@/utils/consts.js"
 import { listToMap } from "@/utils/index.js"
 import { useProvidePaperBatchCondition } from "@/views/dz/papers/hooks/usePaperBatchCondition.js"
+import { usePaperDownload } from "@/views/dz/papers/hooks/usePaperDownload.js"
 import { parseTime } from "@/utils/ruoyi.js"
 
 const { proxy } = getCurrentInstance()
@@ -140,6 +144,9 @@ const queryParams = ref({
     pageSize: 10
 })
 
+// 下载功能
+const { handleDownload } = usePaperDownload(queryParams)
+
 // 表单验证规则
 const rules = {}
 
@@ -268,7 +275,8 @@ const columns = [
     { label: '试卷类型', prop: 'paperType', width: 120 },
     { label: '题数/总分', prop: 'questionInfo', width: 100, type: 'slot', slotName: 'questionInfo' },
     { label: '时长(分钟)', prop: 'duration', width: 120, type: 'slot', slotName: 'duration' },
-    { label: '创建时间', prop: 'createTime', width: 160, type: 'slot', slotName: 'createTime' }
+    { label: '创建时间', prop: 'createTime', width: 160, type: 'slot', slotName: 'createTime' },
+    { label: '下载', prop: 'download', width: 80, type: 'slot', slotName: 'download' }
 ]
 
 // 操作按钮

+ 18 - 16
back-ui/src/views/dz/papers/hooks/usePaperDownload.js

@@ -12,30 +12,32 @@ import { blobValidate } from "@/utils/ruoyi";
 export function usePaperDownload(queryParams) {
     /**
      * 处理下载
-     * @param {Object} row - 表格行数据
+     * @param {Number|String} paperId - 试卷ID(可选,如果不传则从queryParams中获取)
+     * @param {String} paperName - 试卷名称(可选,用于生成文件名)
      */
-    const handleDownload = async (row) => {
+    const handleDownload = async (paperId, paperName) => {
         try {
-            // 优先使用 row 中的字段,如果没有则使用 queryParams 中的值
-            const currentParams = toValue(queryParams)
-            const params = {
-                batchId: row.batchId || currentParams.batchId,
-                examType: row.examType || currentParams.examType,
-                subjectId: row.subjectId || currentParams.subjectId,
-                classId: row.classId || row.id || currentParams.classId,
-                // 定向组卷可能需要的额外参数
-                universityId: row.universityId || currentParams.universityId,
-                majorGroup: row.majorGroup || currentParams.majorGroup,
-                majorPlanId: row.majorPlanId || currentParams.majorPlanId
+            // 如果没有传入paperId,尝试从queryParams中获取
+            if (!paperId && queryParams) {
+                const params = toValue(queryParams)
+                paperId = params.paperId
+                paperName = paperName || params.paperName
             }
             
-            const response = await downloadPaper(params)
+            if (!paperId) {
+                ElMessage.error('试卷ID不存在')
+                return
+            }
+            
+            const response = await downloadPaper({ paperId })
             
             // 检查响应是否为 blob
             if (blobValidate(response)) {
                 const blob = new Blob([response])
-                // 生成文件名,可以根据实际情况调整
-                const filename = `${row.className || '试卷'}_${row.batchName || ''}_${Date.now()}.xlsx`
+                // 生成文件名,使用paperName或默认名称
+                const filename = paperName 
+                    ? `${paperName}_${Date.now()}.docx`
+                    : `试卷_${Date.now()}.docx`
                 saveAs(blob, filename)
                 ElMessage.success('下载成功')
             } else {

+ 1 - 0
ie-admin/src/main/java/com/ruoyi/web/controller/learn/LearnPaperController.java

@@ -121,6 +121,7 @@ public class LearnPaperController extends BaseController
     }
 
     @ApiOperation("下载试卷")
+    @PreAuthorize("@ss.hasPermi('learn:paper:download')")
     @RequestMapping(value = "download", method = {RequestMethod.GET, RequestMethod.POST})
     public void download(HttpServletResponse response, Long paperId) {
         commService.download(response, paperId);