Procházet zdrojové kódy

feat: 在问卷管理中增加报告列表入口

Developer před 1 týdnem
rodič
revize
890f5166ce

+ 67 - 12
src/views/modules/agent/questionnaireList.vue

@@ -21,7 +21,7 @@
             </el-select>
         </div>
         <div class="list">
-            <el-table :data="dataList" border cell-class-name="vertical-top-cell" v-loading="loading" empty-text="暂无问卷" max-height="578px">
+            <el-table :data="dataList" row-key="id" :expand-row-keys="expandedReportRows" border cell-class-name="vertical-top-cell" v-loading="loading" empty-text="暂无问卷" max-height="578px">
                 <el-table-column label="序号" width="50">
                     <template #default="scope">
                         {{ scope.$index + 1 }}
@@ -34,13 +34,29 @@
                         {{ typecfg[scope.row.type]||'' }}
                     </template>
                 </el-table-column>
-                <el-table-column label="创建时间" prop="createDate"></el-table-column>
-                <el-table-column label="操作" width="200">
-                    <template #default="scope">
+                <el-table-column label="创建时间" prop="createDate"></el-table-column>
+                <el-table-column type="expand" width="1">
+                    <template #default="scope">
+                        <div v-loading="scope.row.reportLoading">
+                            <reportList
+                                v-for="(item, index) in scope.row.reportEntries"
+                                :key="item.id"
+                                :item="item"
+                                :reportList="item.reportList"
+                                :showMore="item.showMore"
+                                @toggleReport="item.showMore = !item.showMore; item.showMore && refreshReportEntry(index)"
+                                @refreshReportList="refreshReportEntry(index)">
+                            </reportList>
+                        </div>
+                    </template>
+                </el-table-column>
+                <el-table-column label="操作" width="260">
+                    <template #default="scope">
                         <el-button link type="text" size="mini" @click="handleEdit(scope.row)" v-hasPermi="['core:questionnaire:update']">编辑</el-button>
                         <el-button link type="text" size="mini" @click="handleRelease(scope.row)" v-hasPermi="['core:questionnaire:publish']">发布问卷</el-button>
-                        <el-button link type="text" size="mini" @click="handleDetail(scope.row)" v-hasPermi="['core:questionnairedetail:info']">详情</el-button>
-                        <el-button link type="text" size="mini" @click="handleDelete(scope.row)" v-hasPermi="['core:questionnaire:delete']">删除</el-button>
+                        <el-button link type="text" size="mini" @click="handleDetail(scope.row)" v-hasPermi="['core:questionnairedetail:info']">详情</el-button>
+                        <el-button link type="text" size="mini" @click="toggleReportList(scope.row)">报告列表</el-button>
+                        <el-button link type="text" size="mini" @click="handleDelete(scope.row)" v-hasPermi="['core:questionnaire:delete']">删除</el-button>
                     </template>
                 </el-table-column>
             </el-table>
@@ -104,11 +120,12 @@
 
 <script setup name="">
     import Cookies from "js-cookie"
-    import { ref, getCurrentInstance, onMounted } from 'vue'
+    import { ref, getCurrentInstance, onMounted } from 'vue'
+    import reportList from '@/components/reportList/index.vue'
     const { proxy } = getCurrentInstance();
     const uploadUrl = `${window.SITE_CONFIG["apiURL"]}/sys/oss/uploadFile`
     const uploadHeaders = {token:Cookies.get("token")};
-    import { getQuestionnaireList, addQuestionnaire, updateQuestionnaire, deleteQuestionnaire } from '@/api/agent/index.js'
+    import { getQuestionnaireList, addQuestionnaire, updateQuestionnaire, deleteQuestionnaire, getTeamQuestionnaireList, getTeamReportWjList } from '@/api/agent/index.js'
     
     const queryParams = ref({
         page:1,
@@ -124,7 +141,9 @@
         4: '中级',
         5: '初级'
     }
-    const dataList = ref([])
+    const dataList = ref([])
+    const expandedReportRows = ref([])
+    const currentReportRow = ref(null)
     const total = ref(0)
     const loading = ref(false)
     const show = ref(false)
@@ -235,14 +254,50 @@
         proxy?.$refs.wjRef.resetFields();
     }
 
-    const getList = async () => {
+    const getList = async () => {
         let query = {...queryParams.value};
         loading.value = true;
         const res = await getQuestionnaireList(query);
-        dataList.value = res.data.list;
+            dataList.value = res.data.list.map(prepareQuestionnaireRow);
         total.value = res.data.total;
         loading.value = false;
-    }
+    }
+    const prepareQuestionnaireRow = row => ({
+        ...row,
+        reportExpanded: false,
+        reportEntries: [],
+        reportLoading: false
+    })
+    const loadReportEntries = async row => {
+        row.reportLoading = true
+        currentReportRow.value = row
+        try {
+            const res = await getTeamQuestionnaireList({ page: 1, limit: 100, questionnaireId: row.id })
+            if (res.code !== 0) return proxy.$message.error(res.msg)
+            row.reportEntries = res.data.list.map(entry => ({
+                ...entry,
+                showMore: false,
+                reportList: []
+            }))
+        } finally {
+            row.reportLoading = false
+        }
+    }
+    const toggleReportList = async row => {
+        row.reportExpanded = !row.reportExpanded
+        currentReportRow.value = row
+        expandedReportRows.value = row.reportExpanded ? [row.id] : []
+        if (row.reportExpanded && row.reportEntries.length === 0) {
+            await loadReportEntries(row)
+        }
+    }
+    const refreshReportEntry = async index => {
+        const entry = currentReportRow.value?.reportEntries[index]
+        if (!entry) return
+        const res = await getTeamReportWjList(entry.id)
+        if (res.code !== 0) return proxy.$message.error(res.msg)
+        entry.reportList = res.data
+    }
     const handleSizeChange = (e)=>{
         queryParams.value.limit = e;
         getList();

+ 15 - 0
tests/unit/questionnaireReportMerge.spec.js

@@ -0,0 +1,15 @@
+const fs = require('fs')
+const path = require('path')
+
+const source = fs.readFileSync(
+  path.resolve(__dirname, '../../src/views/modules/agent/questionnaireList.vue'),
+  'utf8'
+)
+
+test('questionnaire management exposes an inline report list action', () => {
+  expect(source).toContain('报告列表')
+  expect(source).toContain('getTeamQuestionnaireList')
+  expect(source).toContain('getTeamReportWjList')
+  expect(source).toContain('reportList')
+  expect(source).toContain('reportExpanded')
+})