Jelajahi Sumber

feat(report): add retry action for failed reports

Developer 1 bulan lalu
induk
melakukan
8b50671581

TEMPAT SAMPAH
dist.zip


+ 18 - 2
src/views/modules/agent/questionnaire/reports.vue

@@ -30,7 +30,10 @@
             <el-button link type="text" size="mini" @click="handleReview(scope.row, 'public')">团队报告</el-button>
             <el-button link type="text" size="mini" @click="handleDownload(scope.row)">下载报告</el-button>
           </template>
-          <span v-else-if="String(scope.row.state) === '-1'" class="failed">生成失败</span>
+          <template v-else-if="String(scope.row.state) === '-1'">
+            <span class="failed">生成失败</span>
+            <el-button v-if="String(scope.row.reportType) === '1'" link type="text" size="mini" @click="retryReport(scope.row)">重新生成</el-button>
+          </template>
           <span v-else class="pending">生成中</span>
         </template>
       </el-table-column>
@@ -54,7 +57,7 @@
 
 <script setup name="QuestionnaireReports">
   import { ref, getCurrentInstance, onMounted } from 'vue'
-  import { getQuestionnaireReportList, getReportEvaluation, updateReportEvaluation } from '@/api/agent/index.js'
+  import { getQuestionnaireReportList, getReportEvaluation, updateReportEvaluation, reCreateReport } from '@/api/agent/index.js'
   import { reportArtifactUrl } from '@/utils/reportArtifactLinks.js'
 
   const { proxy } = getCurrentInstance()
@@ -70,6 +73,7 @@
   const evaluationReportId = ref(null)
   const evaluationForm = ref({ overallAssessment: '', developmentAdvice: '' })
   const evaluationProcessingMessage = '评估分析正在进行中,你需要等待1小时左右,我们会在报告生成完成后提示你,你可以去“我的PERILL报告”查阅报告结果。'
+  const retryingReportId = ref(null)
 
   const isGenerated = row => [1, 2].includes(Number(row.state))
   const canEditEvaluation = row => String(row.reportType) === '1'
@@ -84,6 +88,18 @@
     if (!row.fileUrl) return proxy.$message.error('该报告尚未生成,请生成后再下载!')
     window.open(row.fileUrl, '_blank', 'noopener,noreferrer')
   }
+  const retryReport = async row => {
+    if (retryingReportId.value) return
+    retryingReportId.value = row.reportId
+    try {
+      const res = await reCreateReport(row.reportId)
+      if (res.code !== 0) return proxy.$message.error(res.msg)
+      await getList()
+      proxy.$message.success('报告已重新生成,请稍候查看')
+    } finally {
+      retryingReportId.value = null
+    }
+  }
   const openEvaluation = async row => {
     if (!canEditEvaluation(row)) return
     evaluationReportId.value = row.reportId

+ 7 - 0
tests/unit/questionnaireReportsEvaluationEdit.spec.js

@@ -21,6 +21,13 @@ test('questionnaire reports treat string failed state as a failed report', () =>
   expect(source).toContain("String(scope.row.state) === '-1'")
 })
 
+test('failed questionnaire reports expose a retry action', () => {
+  const source = fs.readFileSync(pagePath, 'utf8')
+
+  expect(source).toContain('重新生成')
+  expect(source).toContain('reCreateReport')
+})
+
 test('report API exposes evaluation read and submit methods', () => {
   const source = fs.readFileSync(apiPath, 'utf8')