Преглед изворни кода

feat(questionnaire): show reports by survey

Developer пре 1 недеља
родитељ
комит
02007cf264
3 измењених фајлова са 70 додато и 17 уклоњено
  1. BIN
      dist.zip
  2. 59 17
      src/views/modules/agent/questionnaire.vue
  3. 11 0
      tests/unit/questionnaireReportMerge.spec.js

+ 59 - 17
src/views/modules/agent/questionnaire.vue

@@ -66,11 +66,23 @@
                 <div class="li_jd">
                     <div class="lj" :style="{'width':(item.finishNum/item.userNum*100)+'%'}"></div>
                 </div>
-                <div class="li_text adfacjb">
-                    <span>完成情况</span>
-                    <span>{{ item.userNum?((item.finishNum/item.userNum)*100).toFixed(0):0 }}%</span>
-                </div>
-            </div>
+                <div class="li_text adfacjb">
+                    <span>完成情况</span>
+                    <span>{{ item.userNum?((item.finishNum/item.userNum)*100).toFixed(0):0 }}%</span>
+                </div>
+                <div class="li_report_action">
+                    <el-button link type="text" size="mini" @click="toggleReportList(item)">报告列表</el-button>
+                </div>
+                <div v-if="item.reportExpanded" v-loading="item.reportLoading">
+                    <reportList
+                        :item="item"
+                        :reportList="item.reportList"
+                        :showMore="true"
+                        @toggleReport="toggleReportList"
+                        @refreshReportList="refreshReportList">
+                    </reportList>
+                </div>
+            </div>
             <el-row style="display: flex;justify-content: center;">
                 <el-pagination
                     @size-change="handleSizeChange"
@@ -175,10 +187,12 @@
 </template>
 
 <script setup name="">
-    import { ref, getCurrentInstance, onMounted } from 'vue'
-    import {useAgentStore} from "@/store_v3/modules/agent";
-    import { 
-        getTeamQuestionnaireList,
+    import { ref, getCurrentInstance, onMounted } from 'vue'
+    import {useAgentStore} from "@/store_v3/modules/agent";
+    import reportList from '@/components/reportList/index.vue'
+    import {
+        getTeamQuestionnaireList,
+        getTeamReportWjList,
         deleteQuestionnaireOne,
         getQuestionnairePublishInfo,
         getProgramList,
@@ -374,14 +388,42 @@
         })
     }
 
-    const getList = () => {
-        let query = {...queryParams.value};
-        getTeamQuestionnaireList(query).then(res=>{
-            if(res.code!==0) return proxy.$message.error(res.msg)
-            dataList.value = res.data.list;
-            total.value = res.data.total;
-        })
-    }
+    const getList = () => {
+        let query = {...queryParams.value};
+        getTeamQuestionnaireList(query).then(res=>{
+            if(res.code!==0) return proxy.$message.error(res.msg)
+            dataList.value = res.data.list.map(item => ({
+                ...item,
+                reportExpanded: false,
+                reportLoading: false,
+                reportList: []
+            }));
+            total.value = res.data.total;
+        })
+    }
+
+    const toggleReportList = async row => {
+        row.reportExpanded = !row.reportExpanded
+        if (!row.reportExpanded || row.reportList.length > 0) return
+        row.reportLoading = true
+        try {
+            const res = await getTeamReportWjList(row.id)
+            if(res.code!==0) return proxy.$message.error(res.msg)
+            row.reportList = res.data || []
+        } finally {
+            row.reportLoading = false
+        }
+    }
+
+    const refreshReportList = relationId => {
+        const row = dataList.value.find(item => item.id === relationId)
+        if (!row) return
+        getTeamReportWjList(row.id).then(res => {
+            if(res.code!==0) return proxy.$message.error(res.msg)
+            row.reportList = res.data || []
+        })
+    }
+
 
     const handleSizeChange = (e)=>{
         queryParams.value.limit = e;

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

@@ -24,6 +24,17 @@ test('questionnaire management exposes an inline report list action', () => {
   expect(source).toContain('reportExpanded')
 })
 
+test('questionnaire survey page exposes reports from each questionnaire row', () => {
+  const questionnaireSource = fs.readFileSync(
+    path.resolve(__dirname, '../../src/views/modules/agent/questionnaire.vue'),
+    'utf8'
+  )
+
+  expect(questionnaireSource).toContain('报告列表')
+  expect(questionnaireSource).toContain('getTeamReportWjList')
+  expect(questionnaireSource).toContain('reportList')
+})
+
 test('questionnaire management wires inline report mutation events to report APIs', () => {
   expect(source).toContain('@deleteReport="e=>deleteReportEntry(e,index)"')
   expect(source).toContain('@sendReport="e=>sendReportEntry(e,index,item)"')