usePaperQuestionCondition.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import {useInjectPaperExactCondition} from "@/views/dz/papers/hooks/usePaperExactCondition.js";
  2. import {useInjectPaperFullCondition} from "@/views/dz/papers/hooks/usePaperFullCondition.js";
  3. import {useInjectPaperKnowledgeCondition} from "@/views/dz/papers/hooks/usePaperKnowledgeCondition.js";
  4. import {useInjectGlobalLoading} from "@/views/hooks/useGlobalLoading.js";
  5. import {getPaperQuestions, getPaperQuestionTypes} from "@/api/dz/papers.js";
  6. import {injectLocal, provideLocal} from "@vueuse/core";
  7. import {ElMessage} from "element-plus";
  8. const key = Symbol('PaperQuestionCondition')
  9. export const useProvidePaperQuestionCondition = function (exactMode, handMode) {
  10. const keyword = ref('')
  11. const qtpye = ref('') // 历史遗留拼写错误
  12. const qTypes = ref([])
  13. const pageNum = ref(1)
  14. const pageSize = ref(10)
  15. const total = ref(0)
  16. const questionList = ref([])
  17. const {conditionArgs, conditionData} = exactMode ? useInjectPaperExactCondition() : useInjectPaperFullCondition()
  18. const {knowledgeId, knowledgeIds} = useInjectPaperKnowledgeCondition()
  19. const loading = useInjectGlobalLoading()
  20. // question cart
  21. const cart = ref([])
  22. const currentSubject = computed(() => {
  23. if (!conditionArgs.value.subjectId) return null
  24. if (!cart.value.length) return null
  25. const demoId = cart.value[0].subjectId
  26. return conditionData.value.subjectList.find(s => s.subjectId == demoId)
  27. })
  28. const groupedQuestions = computed(() => {
  29. const results = {}
  30. cart.value.forEach(q => {
  31. if (!results[q.qtpye]) {
  32. results[q.qtpye] = []
  33. }
  34. results[q.qtpye].push(q)
  35. })
  36. return Object.keys(results).map(k => ({qtpye: k, questions: results[k]}))
  37. })
  38. const hasQuestion = (q) => {
  39. return cart.value.some(c => c.id == q.id)
  40. }
  41. const removeQuestion = (q) => {
  42. const idx = cart.value.findIndex(c => c.id == q.id)
  43. if (idx > -1) cart.value.splice(idx, 1)
  44. }
  45. const addQuestion = (q) => {
  46. if (currentSubject.value && currentSubject.value.subjectId != q.subjectId) {
  47. return ElMessage.error(`当前科目【${currentSubject.value.subjectName}】冲突`)
  48. }
  49. cart.value.push(q)
  50. }
  51. const removeQuestionGroup = (qtpye) => {
  52. const ls = groupedQuestions.value.find(g => g.qtpye == qtpye)?.questions
  53. ls?.forEach(q => removeQuestion(q))
  54. }
  55. const clearCart = () => cart.value = []
  56. // hooks
  57. watch([() => conditionArgs.value.subjectId, knowledgeId, () => knowledgeIds.value.toString()], async ([subjectId, knowledgeId, knowledgeIds]) => {
  58. // clean
  59. qtpye.value = ''
  60. qTypes.value = []
  61. if (!subjectId && conditionData.value.subjectList?.length) return
  62. if (!knowledgeId && !knowledgeIds) return
  63. const query = {subjectId, knowledgeIds: knowledgeId || knowledgeIds}
  64. const res = await getPaperQuestionTypes(query)
  65. qTypes.value = res.data
  66. })
  67. const questionQuery = computed(() => ({
  68. pageNum: pageNum.value,
  69. pageSize: pageSize.value,
  70. title: keyword.value,
  71. qtpye: qtpye.value,
  72. knowledgeId: knowledgeId.value,
  73. knowledges: knowledgeIds.value.toString()
  74. }))
  75. const getQuestionList = async function () {
  76. if (!handMode) return // 智能组卷时不需要查询
  77. loading.value = true
  78. try {
  79. const res = await getPaperQuestions(questionQuery.value)
  80. total.value = res.total
  81. questionList.value = res.rows
  82. } finally {
  83. loading.value = false
  84. }
  85. }
  86. watch([keyword, qtpye, knowledgeId, () => knowledgeIds.value.toString()], async ([title, qtpye, knowledgeId, knowledges]) => {
  87. pageNum.value = 1
  88. questionList.value = []
  89. total.value = 0
  90. if (!knowledgeId && !knowledges) return // 有知识点即可以查询题库
  91. await getQuestionList(pageNum.value, pageSize.value)
  92. })
  93. const payload = {
  94. keyword, qtpye, qTypes, pageNum, pageSize, total, questionList, getQuestionList,
  95. cart, currentSubject, groupedQuestions,
  96. hasQuestion, addQuestion, removeQuestion, removeQuestionGroup, clearCart
  97. }
  98. provideLocal(key, payload)
  99. return payload
  100. }
  101. export const useInjectPaperQuestionCondition = function () {
  102. return injectLocal(key)
  103. }