Explorar el Código

paper - exact conditions

abpcoder hace 1 mes
padre
commit
e6d9614f75

+ 39 - 0
back-ui/src/api/dz/papers.js

@@ -16,4 +16,43 @@ export function getPaperKnowledges(query) {
         method: 'get',
         params: query
     })
+}
+
+/// 省份列表
+export function getPaperProvinces(query) {
+    return request({
+        url: '/learn/teaching/provinces',
+        method: 'get',
+        params: query
+    })
+}
+
+/// 考生类型
+export function getPaperExamTypes(query) {
+    // query: {location}
+    return request({
+        url: '/learn/teaching/examTypes',
+        method: 'get',
+        params: query
+    })
+}
+
+/// 院校
+export function getPaperUniversities(query) {
+    // query: {batchId}
+    return request({
+        url: '/learn/teaching/universities',
+        method: 'get',
+        params: query
+    })
+}
+
+/// 专业组
+export function getPaperMajors(query) {
+    // query: {location, examType, batchId, universityId}
+    return request({
+        url: '/learn/teaching/majors',
+        method: 'get',
+        params: query
+    })
 }

+ 39 - 5
back-ui/src/views/dz/papers/components/paper-exact-conditions.vue

@@ -1,11 +1,45 @@
 <template>
-
+    <div class="flex flex-row items-center gap-2">
+        <span :class="labelClass">省份:</span>
+        <el-select v-model="location" style="width: 280px">
+            <el-option v-for="p in provinces" :label="p.dictLabel" :value="p.dictValue"/>
+        </el-select>
+    </div>
+    <div class="flex flex-row items-center gap-2 mt-5">
+        <span :class="labelClass">考生类型:</span>
+        <el-select v-model="examType" style="width: 280px">
+            <el-option v-for="t in examTypes" :label="t.dictLabel" :value="t.dictValue"/>
+        </el-select>
+    </div>
+    <div class="flex flex-row items-center gap-2 mt-5">
+        <span :class="labelClass">院校:</span>
+        <el-select v-model="universityId" style="width: 280px">
+            <el-option v-for="u in universities" :label="u.name" :value="u.id"/>
+        </el-select>
+    </div>
+    <div class="flex flex-row items-center gap-2 mt-5">
+        <span :class="labelClass">专业组:</span>
+        <el-radio-group v-model="majorPlanId">
+            <el-radio-button v-for="m in majors" :label="m.majorGroup" :value="m.id"/>
+        </el-radio-group>
+    </div>
+    <div class="flex flex-row items-center gap-2 mt-5">
+        <span :class="labelClass">科目:</span>
+        <el-radio-group v-model="subjectId">
+            <el-radio-button v-for="s in subjects" :label="s.subjectName" :value="s.subjectId"/>
+        </el-radio-group>
+    </div>
 </template>
 
-<script>
-export default {
-    name: "paper-exact-conditions"
-}
+<script setup name="PaperExactConditions">
+import {useInjectPaperExactCondition} from "@/views/dz/papers/hooks/usePaperExactCondition.js";
+
+const labelClass = 'break-keep text-sm font-bold w-[80px]'
+const {location, provinces,
+    examType, examTypes,
+    universityId, universities,
+    majorPlanId, majors,
+    subjectId, subjects} = useInjectPaperExactCondition()
 </script>
 
 <style scoped>

+ 13 - 5
back-ui/src/views/dz/papers/components/paper-hand-exact.vue

@@ -1,11 +1,19 @@
 <template>
-
+    <paper-exact-conditions/>
+    <el-container class="mt-5">
+        <el-aside width="350px">
+            <paper-knowledge-tree exact-mode/>
+        </el-aside>
+        <el-main></el-main>
+    </el-container>
 </template>
 
-<script>
-export default {
-    name: "paper-hand-exact"
-}
+<script setup name="PaperHandExact">
+import PaperExactConditions from "@/views/dz/papers/components/paper-exact-conditions.vue";
+import PaperKnowledgeTree from "@/views/dz/papers/components/paper-knowledge-tree.vue";
+import {useProvidePaperExactCondition} from "@/views/dz/papers/hooks/usePaperExactCondition.js";
+
+useProvidePaperExactCondition()
 </script>
 
 <style scoped>

+ 6 - 2
back-ui/src/views/dz/papers/components/paper-knowledge-tree.vue

@@ -8,13 +8,17 @@
 
 <script setup name="PaperKnowledgeTree">
 import {useInjectPaperFullCondition} from "@/views/dz/papers/hooks/usePaperFullCondition.js";
+import {useInjectPaperExactCondition} from "@/views/dz/papers/hooks/usePaperExactCondition.js";
 
 const props = defineProps({
-    allowMultiple: Boolean
+    allowMultiple: Boolean,
+    exactMode: Boolean
 })
 
 const keyword = ref('')
-const {knowledgeId, knowledges, knowledgeCheckNodes} = useInjectPaperFullCondition()
+const {knowledgeId, knowledges, knowledgeCheckNodes} = props.exactMode
+    ? useInjectPaperExactCondition()
+    : useInjectPaperFullCondition()
 
 const filterNode = function (value, data) {
     if (!value) return true

+ 92 - 0
back-ui/src/views/dz/papers/hooks/usePaperExactCondition.js

@@ -0,0 +1,92 @@
+import {injectLocal, provideLocal} from "@vueuse/core";
+import {
+    getPaperExamTypes,
+    getPaperKnowledges,
+    getPaperMajors,
+    getPaperProvinces,
+    getPaperSubjects,
+    getPaperUniversities
+} from "@/api/dz/papers.js";
+
+const key = Symbol('PaperExactCondition')
+
+export const useProvidePaperExactCondition = function () {
+    const location = ref('')
+    const provinces = ref([])
+    const examType = ref('')
+    const examTypes = ref([])
+    const universityId = ref('')
+    const universities = ref([])
+    const majorPlanId = ref('')
+    const majors = ref([])
+
+    const subjects = ref([])
+    const subjectId = ref('')
+    const knowledges = ref([])
+    const knowledgeId = ref('') // 单选
+    const knowledgeCheckNodes = ref([]) // 多选的节点
+    const knowledgeIds = computed(() => knowledgeCheckNodes.value.map(k => k.id))
+
+    const payload = {
+        location, provinces, examType, examTypes, universityId, universities, majorPlanId, majors,
+        subjects, subjectId, knowledges, knowledgeId, knowledgeCheckNodes, knowledgeIds
+    }
+    provideLocal(key, payload)
+
+    // hooks
+    onMounted(async () => {
+        const res = await getPaperProvinces()
+        provinces.value = res.data
+    })
+    watch(location, async () => {
+        // clean
+        examType.value = ''
+        examTypes.value = []
+        universityId.value = ''
+        universities.value = []
+
+        if (!location.value) return
+        const resT = await getPaperExamTypes({location: toValue(location)})
+        examTypes.value = resT.data
+
+        const resU = await getPaperUniversities({location: toValue(location)})
+        universities.value = resU.data
+    })
+    watch([examType, universityId], async ([examType, universityId]) => {
+        // clean
+        majorPlanId.value = ''
+        majors.value = []
+
+        if (!examType || !universityId) return
+        const res = await getPaperMajors({location: toValue(location), examType, universityId})
+        majors.value = res.data
+        if (res.data.length) majorPlanId.value = res.data[0].id
+    })
+    watch(universityId, async (universityId) => {
+        // clean
+        subjects.value = []
+        subjectId.value = ''
+
+        if (!universityId) return
+        const res = await getPaperSubjects({universityId})
+        subjects.value = res.data
+        if (res.data.length) subjectId.value = res.data[0].subjectId
+    })
+    watch([majorPlanId, subjectId], async ([majorPlanId, subjectId]) => {
+        // clean
+        knowledges.value = []
+        knowledgeId.value = '' // 单选的情况
+        knowledgeCheckNodes.value = [] // 多选的情况
+
+        if (!subjectId || !majorPlanId) return
+        // 获取知识点数据
+        const res = await getPaperKnowledges({subjectId, majorPlanId})
+        knowledges.value = res.data
+    })
+
+    return payload
+}
+
+export const useInjectPaperExactCondition = function () {
+    return injectLocal(key)
+}

+ 1 - 0
back-ui/src/views/dz/papers/hooks/usePaperFullCondition.js

@@ -23,6 +23,7 @@ export const useProvidePaperFullCondition = function () {
     })
     watch(subjectId, async () => {
         // 先清空以前的知识点
+        knowledges.value = []
         knowledgeId.value = '' // 单选的情况
         knowledgeCheckNodes.value = [] // 多选的情况