index.vue 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. <template>
  2. <a-card>
  3. <div class="paper-list">
  4. <!-- 任务中心开始 -->
  5. <div class="task-center" style="margin-bottom: 24px">
  6. <h3 style="border-left: solid 4px #3651d4; padding-left: 8px; margin-bottom: 12px; font-size: 18px">
  7. <div>{{ examName }}</div>
  8. </h3>
  9. <div style="display: flex; align-items: center" class="mb-4" v-if="examType == 4">
  10. <div class="mr-4">学科分类</div>
  11. <a-select ref="select" v-model:value="tabId" style="width: 120px" allowClear @change="handleChange">
  12. <a-select-option :value="item.id" v-for="(item, idx) in subjectList">{{ item.name }}</a-select-option>
  13. </a-select>
  14. </div>
  15. <a-spin :spinning="taskLoading">
  16. <a-table
  17. ref="paperTableRef"
  18. :columns="taskColumns"
  19. :data-source="taskList"
  20. :expand-row-by-click="true"
  21. :pagination="queryParam"
  22. >
  23. <template #bodyCell="{ column, record }">
  24. <div v-if="examType != 4">
  25. <template v-if="column.key === 'examName'">
  26. {{ record.examName }}
  27. </template>
  28. <template v-if="column.key === 'examType'">
  29. {{ examTypeName(record.examType) }}
  30. </template>
  31. <template v-if="column.key === 'startTime'">
  32. {{ formatDateTime(record.startTime) }}
  33. </template>
  34. <template v-if="column.key === 'endTime'">
  35. {{ formatDateTime(record.endTime) }}
  36. </template>
  37. <template v-if="column.key === 'examStatus'">
  38. <a-tag :color="statusTagFormatter(record.examStatus)" size="small">
  39. {{ statusTextFormatter(record.examStatus) }}
  40. </a-tag>
  41. </template>
  42. <template v-if="column.key === 'action'">
  43. <router-link
  44. v-if="record.examStatus === 0"
  45. :to="{ path: '/student/do', query: { id: record.paperId } }"
  46. target="_blank"
  47. >
  48. <a-button type="link" size="small">查看{{ examName }}</a-button>
  49. </router-link>
  50. <router-link
  51. v-if="record.examStatus === 1"
  52. :to="{ path: '/student/do', query: { id: record.paperId } }"
  53. target="_blank"
  54. >
  55. <a-button type="link" size="small">填写{{ examName }}</a-button>
  56. </router-link>
  57. <router-link
  58. v-if="record.examStatus === 2"
  59. :to="{ path: '/student/read', query: { id: record.paperId } }"
  60. target="_blank"
  61. >
  62. <a-button type="link" size="small">查看结果</a-button>
  63. </router-link>
  64. </template>
  65. </div>
  66. <div v-if="examType == 4">
  67. <template v-if="column.key === 'paperType'">
  68. {{ paperTypeEnum(record.paperType) }}
  69. </template>
  70. <template v-if="column.key === 'subjectId'">
  71. {{ subjectName(record.subjectId) }}
  72. </template>
  73. <template v-if="column.key === 'action'">
  74. <router-link :to="{ path: '/student/do', query: { id: record.id } }" target="_blank">
  75. <a-button type="link" size="small">开始答题</a-button>
  76. </router-link>
  77. </template>
  78. </div>
  79. </template>
  80. </a-table>
  81. </a-spin>
  82. </div>
  83. </div>
  84. </a-card>
  85. </template>
  86. <script setup>
  87. import { useExamStore } from '@/store/exam'
  88. import examPaperApi from '@/api/student/examPaper'
  89. import taskApi from '@/api/student/examPaper'
  90. import { useRoute } from 'vue-router'
  91. import tool from '@/utils/tool'
  92. import { parseTime } from '@/utils/exam'
  93. const route = useRoute()
  94. const formatDateTime = (val) => {
  95. if (!val) return ''
  96. return parseTime(val, '{y}-{m}-{d} {h}:{i}:{s}')
  97. }
  98. // store
  99. const examStore = useExamStore()
  100. const paperTypeEnum = computed(() => {
  101. return (key) => {
  102. return examStore.paperTypeEnum.filter((item) => item.key == key)[0]?.value
  103. }
  104. })
  105. const examNameOption = tool.dictList('EXAM_TYPE')
  106. const examTypeName = computed(() => {
  107. return (id) => {
  108. return examNameOption.filter((r) => r.value == id)[0].label
  109. }
  110. })
  111. const examName = computed(() => {
  112. switch (examType.value) {
  113. case '1':
  114. return '考试'
  115. break
  116. case '2':
  117. return '章节测验'
  118. break
  119. case '3':
  120. return '调查问卷'
  121. break
  122. case '4':
  123. return '我的作业'
  124. break
  125. }
  126. })
  127. // 任务中心相关
  128. const taskList = ref([])
  129. const taskLoading = ref(false)
  130. // 选中表格的表格common
  131. const selectedCommons = [
  132. {
  133. title: '操作',
  134. dataIndex: 'action',
  135. align: 'center',
  136. width: 80
  137. },
  138. {
  139. title: '机构名',
  140. dataIndex: 'name',
  141. ellipsis: true
  142. }
  143. ]
  144. const taskColumns = computed(() =>
  145. taskAllColumns.value.filter((r) => r.examType.includes(parseFloat(examType.value)))
  146. )
  147. const taskAllColumns = ref([
  148. { title: '问卷名称', dataIndex: 'name', key: 'name', examType: [4] },
  149. { title: '试卷类型', dataIndex: 'paperType', key: 'paperType', width: 120, examType: [4] },
  150. { title: '学科', dataIndex: 'subjectId', key: 'subjectId', width: 120, examType: [4] },
  151. { title: '问卷名称', dataIndex: 'examName', key: 'examName', examType: [1, 2, 3] },
  152. { title: '问卷类型', dataIndex: 'examType', key: 'examType', width: 120, examType: [1, 2, 3] },
  153. { title: '开始时间', dataIndex: 'startTime', key: 'startTime', width: 180, examType: [1, 2, 3] },
  154. { title: '结束时间', dataIndex: 'endTime', key: 'endTime', width: 180, examType: [1, 2, 3] },
  155. { title: '状态', dataIndex: 'examStatus', key: 'examStatus', width: 90, examType: [1, 2, 3] },
  156. { title: '操作', key: 'action', align: 'right', width: 120, examType: [1, 2, 3, 4] }
  157. ])
  158. const statusTextFormatter = (status) => {
  159. if (status === 0) return '未开始'
  160. if (status === 1) return '已开始'
  161. if (status === 2) return '已结束'
  162. return ''
  163. }
  164. const statusTagFormatter = (status) => {
  165. if (status === 0) return 'blue'
  166. if (status === 1) return 'green'
  167. if (status === 2) return 'gray'
  168. return 'default'
  169. }
  170. const getTaskList = async () => {
  171. taskLoading.value = true
  172. try {
  173. let res = []
  174. const params = {
  175. ...queryParam.value,
  176. size: queryParam.value.pageSize,
  177. courseId: route.query.id,
  178. paperType: paperType.value,
  179. examType: examType.value
  180. }
  181. if (examType.value == 4) {
  182. res = await examPaperApi.pageList(params)
  183. } else {
  184. res = await taskApi.pageExamList(params)
  185. }
  186. taskList.value = res?.records || []
  187. } catch (e) {
  188. taskList.value = []
  189. }
  190. taskLoading.value = false
  191. }
  192. // 学科分类
  193. const queryParam = ref({
  194. current: 1,
  195. pageSize: 10
  196. })
  197. const tabId = ref('')
  198. const subjectList = ref([])
  199. const initSubject = async () => {
  200. await examStore.initSubject()
  201. subjectList.value = examStore.subjects
  202. }
  203. const subjectName = computed(() => {
  204. return (id) => {
  205. return subjectList.value.filter((r) => r.id == id)[0]?.name
  206. }
  207. })
  208. const handleChange = (value) => {
  209. queryParam.value.subjectId = value
  210. getTaskList()
  211. }
  212. // lifecycle
  213. const examType = ref()
  214. const paperType = ref(2)
  215. onMounted(() => {
  216. examType.value = route.params && route.params.examType
  217. initSubject()
  218. getTaskList()
  219. })
  220. </script>
  221. <style lang="less" scoped>
  222. .paper-list {
  223. margin-top: 10px;
  224. .task-center {
  225. margin-bottom: 24px;
  226. }
  227. }
  228. </style>