paper-full-intelligent.vue 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <template>
  2. <el-row :gutter="20">
  3. <el-col :span="8">
  4. <el-form label-width="68px">
  5. <BatchYearSelect v-model:batch-id="batchId" :batch-list="batchList" />
  6. <el-form-item label="考生类型">
  7. <el-select v-model="examType" clearable style="width: 227px">
  8. <el-option v-for="e in examTypes" :label="e.dictLabel" :value="e.dictValue"/>
  9. </el-select>
  10. </el-form-item>
  11. <el-form-item label="科目">
  12. <el-select v-model="subjectId" clearable style="width: 227px">
  13. <el-option-group v-for="g in groupedSubjects" :label="g.label">
  14. <el-option v-for="s in g.items" :label="s.subjectName" :value="s.subjectId"/>
  15. </el-option-group>
  16. </el-select>
  17. </el-form-item>
  18. </el-form>
  19. </el-col>
  20. <el-col :span="16">
  21. <class-statistic-table @stat-click="handleStatClick"/>
  22. </el-col>
  23. </el-row>
  24. <el-divider />
  25. <el-row v-if="!hasBuiltPaper" :gutter="20">
  26. <el-col :span="6">
  27. <knowledge-tree allow-multiple/>
  28. </el-col>
  29. <el-col :span="18">
  30. <question-intelligent @submit="handleSubmit" />
  31. </el-col>
  32. </el-row>
  33. <built-paper-list ref="built" @send="handleSubmit" />
  34. <!-- 学生列表弹窗 -->
  35. <student-list-dialog ref="studentDialogRef" :stat-type-map="statTypeMap"/>
  36. </template>
  37. <script setup name="PaperFullIntelligent">
  38. import { ref, computed } from 'vue'
  39. import consts from "@/utils/consts.js";
  40. import {useProvidePaperFullCondition} from "@/views/dz/papers/hooks/usePaperFullCondition.js";
  41. import ClassStatisticTable from "@/views/dz/papers/components/plugs/class-statistic-table.vue";
  42. import {useProvidePaperClassStatisticCondition} from "@/views/dz/papers/hooks/usePaperClassStatisticCondition.js";
  43. import KnowledgeTree from "@/views/dz/papers/components/plugs/knowledge-tree.vue";
  44. import {useProvidePaperKnowledgeCondition} from "@/views/dz/papers/hooks/usePaperKnowledgeCondition.js";
  45. import QuestionIntelligent from "@/views/dz/papers/components/plugs/question-intelligent.vue";
  46. import {ElMessage} from "element-plus";
  47. import {buildPaperFullIntelligent} from "@/api/dz/papers.js";
  48. import BuiltPaperList from "@/views/dz/papers/components/plugs/built-paper-list.vue";
  49. import StudentListDialog from "@/views/dz/papers/components/plugs/student-list-dialog.vue";
  50. import BatchYearSelect from "@/views/dz/papers/components/BatchYearSelect.vue";
  51. const type = consts.enums.buildType.FullIntelligent
  52. const {
  53. batchId,
  54. batchList,
  55. examType,
  56. examTypes,
  57. subjectId,
  58. groupedSubjects,
  59. conditionArgs,
  60. onConditionReady,
  61. onBatchReady
  62. } = useProvidePaperFullCondition(type)
  63. const {selectedClasses, classList, loadClassStatistic} = useProvidePaperClassStatisticCondition()
  64. const {knowledgeNode, knowledgeCheckNodes, loadKnowledge} = useProvidePaperKnowledgeCondition()
  65. const built = ref(null)
  66. const hasBuiltPaper = computed(() => built.value?.hasPaper)
  67. // 统计字段映射
  68. const statTypeMap = {
  69. 'send': '组卷已完成',
  70. 'total': '总人数',
  71. 'unfinish': '组卷未完成',
  72. 'unsend': '未组卷'
  73. }
  74. // 学生列表弹窗引用
  75. const studentDialogRef = ref(null)
  76. // 处理统计字段点击
  77. const handleStatClick = async (row, statType) => {
  78. if (!row || !statType || !batchId.value) {
  79. console.error('参数错误:', { row, statType, batchId: batchId.value })
  80. return
  81. }
  82. // 构建查询条件参数
  83. const queryParams = {}
  84. if (conditionArgs.value) {
  85. if (conditionArgs.value.examType) queryParams.examType = conditionArgs.value.examType
  86. if (conditionArgs.value.subjectId) queryParams.subjectId = conditionArgs.value.subjectId
  87. }
  88. // 打开学生列表弹窗
  89. studentDialogRef.value?.open(row, statType, type, batchId.value, queryParams)
  90. }
  91. const handleSubmit = async (qTypes) => {
  92. // validation
  93. if (!batchId.value) return ElMessage.error('请选择批次')
  94. if (!knowledgeCheckNodes.value.length) return ElMessage.error('请选择知识点')
  95. if (!qTypes.value.length || qTypes.value.every(t => !t.count)) return ElMessage.error('请填写题量')
  96. const classIds = selectedClasses.value.map(c => c.classId)
  97. if (!classIds.length) return ElMessage.error('请选择班级')
  98. // build
  99. const commit = {
  100. buildType: type,
  101. batchId: toValue(batchId),
  102. examType: toValue(examType),
  103. subjectId: toValue(subjectId),
  104. knowledgeIds: knowledgeCheckNodes.value.map(k => k.id),
  105. types: qTypes.value.map(t => ({
  106. type: t.dictValue,
  107. title: t.dictLabel,
  108. count: t.count,
  109. score: t.score || 0
  110. })),
  111. classIds
  112. }
  113. await buildPaperFullIntelligent(commit)
  114. ElMessage.success('生成成功')
  115. _loadClassStatistic()
  116. }
  117. let statArg = null
  118. const _loadClassStatistic = async () => {
  119. selectedClasses.value = []
  120. classList.value = []
  121. await loadClassStatistic(statArg)
  122. }
  123. onConditionReady(async (payload) => {
  124. statArg = payload
  125. knowledgeNode.value = null
  126. knowledgeCheckNodes.value = []
  127. await loadKnowledge(payload)
  128. await _loadClassStatistic()
  129. await built.value.loadBuiltPaper(payload)
  130. })
  131. // 监听批次变化,调用接口
  132. onBatchReady(async (payload) => {
  133. // 如果已经有完整的条件参数,更新批次ID;否则只使用批次
  134. if (statArg) {
  135. statArg = { ...statArg, batchId: payload.batchId }
  136. } else {
  137. statArg = payload
  138. }
  139. await _loadClassStatistic()
  140. await built.value.loadBuiltPaper(statArg)
  141. })
  142. watch(conditionArgs, () => built.value.reset())
  143. // 刷新数据
  144. const refresh = async () => {
  145. if (statArg) {
  146. await _loadClassStatistic()
  147. await built.value.loadBuiltPaper(statArg)
  148. }
  149. }
  150. defineExpose({ refresh })
  151. </script>
  152. <style scoped>
  153. </style>