|
|
@@ -0,0 +1,114 @@
|
|
|
+import {useInjectPaperExactCondition} from "@/views/dz/papers/hooks/usePaperExactCondition.js";
|
|
|
+import {useInjectPaperFullCondition} from "@/views/dz/papers/hooks/usePaperFullCondition.js";
|
|
|
+import {injectLocal, provideLocal} from "@vueuse/core";
|
|
|
+import {useInjectLoading} from "@/views/hooks/useLoading.js";
|
|
|
+import {getPaperQuestions, getPaperQuestionTypes} from "@/api/dz/papers.js";
|
|
|
+import {ElMessage} from "element-plus";
|
|
|
+
|
|
|
+const key = Symbol('PaperQuestionCondition')
|
|
|
+
|
|
|
+export const useProvidePaperQuestionCondition = function (exactMode, allowMultiple) {
|
|
|
+ // exactMode: exact condition & full condition
|
|
|
+ // allowMultiple: multiple knowledge selection
|
|
|
+
|
|
|
+ const keyword = ref('')
|
|
|
+ const qtpye = ref('') // 历史遗留拼写错误
|
|
|
+ const qTypes = ref([])
|
|
|
+
|
|
|
+ const pageNum = ref(1)
|
|
|
+ const pageSize = ref(10)
|
|
|
+ const total = ref(0)
|
|
|
+ const questionList = ref([])
|
|
|
+
|
|
|
+ const {
|
|
|
+ batchId, subjectId, subjects, knowledgeId, knowledgeIds
|
|
|
+ } = exactMode ? useInjectPaperExactCondition() : useInjectPaperFullCondition()
|
|
|
+ const loading = useInjectLoading()
|
|
|
+
|
|
|
+ // question cart
|
|
|
+ const cart = ref([])
|
|
|
+ const currentSubject = computed(() => {
|
|
|
+ const demoId = cart.value[0]?.subjectId
|
|
|
+ return subjects.value.find(s => s.subjectId == demoId)
|
|
|
+ })
|
|
|
+ const groupedQuestions = computed(() => {
|
|
|
+ const results = {}
|
|
|
+ cart.value.forEach(q => {
|
|
|
+ if (!results[q.qtpye]) {
|
|
|
+ results[q.qtpye] = []
|
|
|
+ }
|
|
|
+ results[q.qtpye].push(q)
|
|
|
+ })
|
|
|
+ return Object.keys(results).map(k => ({qtpye: k, questions: results[k]}))
|
|
|
+ })
|
|
|
+ const hasQuestion = (q) => {
|
|
|
+ return cart.value.some(c => c.id == q.id)
|
|
|
+ }
|
|
|
+ const removeQuestion = (q) => {
|
|
|
+ const idx = cart.value.findIndex(c => c.id == q.id)
|
|
|
+ if (idx > -1) cart.value.splice(idx, 1)
|
|
|
+ }
|
|
|
+ const addQuestion = (q) => {
|
|
|
+ if (currentSubject.value && currentSubject.value.subjectId != q.subjectId) {
|
|
|
+ return ElMessage.error(`当前科目【${currentSubject.value.subjectName}】冲突`)
|
|
|
+ }
|
|
|
+ cart.value.push(q)
|
|
|
+ }
|
|
|
+ const removeQuestionGroup = (qtpye) => {
|
|
|
+ const ls = groupedQuestions.value.find(g => g.qtpye == qtpye)?.questions
|
|
|
+ ls?.forEach(q => removeQuestion(q))
|
|
|
+ }
|
|
|
+ const clearCart = () => cart.value = []
|
|
|
+
|
|
|
+ // hooks
|
|
|
+ watch([subjectId, knowledgeId, () => knowledgeIds.value.toString()], async ([subjectId, knowledgeId, knowledgeIds]) => {
|
|
|
+ // clean
|
|
|
+ qtpye.value = ''
|
|
|
+ qTypes.value = []
|
|
|
+
|
|
|
+ if (!subjectId) return
|
|
|
+ if (!knowledgeId && !knowledgeIds) return
|
|
|
+ const query = {subjectId, knowledgeIds: knowledgeId || knowledgeIds}
|
|
|
+ const res = await getPaperQuestionTypes(query)
|
|
|
+ qTypes.value = res.data
|
|
|
+ })
|
|
|
+
|
|
|
+ const questionQuery = computed(() => ({
|
|
|
+ pageNum: pageNum.value,
|
|
|
+ pageSize: pageSize.value,
|
|
|
+ title: keyword.value,
|
|
|
+ qtpye: qtpye.value,
|
|
|
+ // knowledgeId: knowledgeId.value,
|
|
|
+ // knowledges: knowledgeIds.value.toString()
|
|
|
+ }))
|
|
|
+ const getQuestionList = async function () {
|
|
|
+ loading.value = true
|
|
|
+ try {
|
|
|
+ const res = await getPaperQuestions(questionQuery.value)
|
|
|
+ total.value = res.total
|
|
|
+ questionList.value = res.rows
|
|
|
+ } finally {
|
|
|
+ loading.value = false
|
|
|
+ }
|
|
|
+ }
|
|
|
+ watch([keyword, qtpye, knowledgeId, () => knowledgeIds.value.toString()], async ([title, qtpye, knowledgeId, knowledges]) => {
|
|
|
+ pageNum.value = 1
|
|
|
+ questionList.value = []
|
|
|
+ total.value = 0
|
|
|
+
|
|
|
+ if (!knowledgeId && !knowledges) return // 有知识点即可以查询题库
|
|
|
+ await getQuestionList(pageNum.value, pageSize.value)
|
|
|
+ })
|
|
|
+
|
|
|
+ const payload = {
|
|
|
+ keyword, qtpye, qTypes, pageNum, pageSize, total, questionList, getQuestionList,
|
|
|
+ cart, currentSubject, groupedQuestions,
|
|
|
+ hasQuestion, addQuestion, removeQuestion, removeQuestionGroup, clearCart
|
|
|
+ }
|
|
|
+ provideLocal(key, payload)
|
|
|
+ return payload
|
|
|
+}
|
|
|
+
|
|
|
+export const useInjectPaperQuestionCondition = function () {
|
|
|
+ return injectLocal(key)
|
|
|
+}
|