Explorar o código

Merge branch 'master' of http://49.234.186.218:9000/root/ieplus

mingfu hai 2 semanas
pai
achega
154d577a8d

+ 7 - 11
back-ui/src/views/dz/papers/components/list-exact-intelligent.vue

@@ -1,12 +1,12 @@
 <template>
     <el-form ref="queryRef" :model="queryParams" :rules="rules" label-width="68px" inline>
         <el-form-item label="批次" prop="batchId">
-            <el-select v-model="queryParams.batchId" clearable @change="handleQuery" style="width: 172px">
+            <el-select v-model="batchId" clearable @change="handleQuery" style="width: 172px">
                 <el-option v-for="b in batchList" :label="b.name" :value="b.batchId"/>
             </el-select>
         </el-form-item>
         <el-form-item label="班级" prop="classId">
-            <el-select v-model="queryParams.classId" clearable @change="handleQuery" style="width: 172px">
+            <el-select v-model="classId" clearable @change="handleQuery" style="width: 172px">
                 <el-option v-for="c in classList" :label="c.name" :value="c.classId"/>
             </el-select>
         </el-form-item>
@@ -29,12 +29,6 @@ import {useProvidePaperList} from "@/views/dz/papers/hooks/usePaperList.js";
 import Table from "@/components/Table/index.vue"
 import ClassDetail from "@/views/dz/papers/components/plugs/class-detail.vue";
 
-const options = {
-    queryDefine: {
-        batchId: '',
-        classId: ''
-    }
-}
 const columns = [
     {label: '组卷类型', prop: 'buildType'},
     {label: '班级', prop: 'className'},
@@ -46,10 +40,12 @@ const actions = [
     {label: '查看详情', key: 'detail', permission: ['']}
 ]
 
-const type = consts.enums.buildType.ExactIntelligent
-const {batchList} = useProvidePaperBatchCondition(type)
-const {queryParams, rules, handleQuery, resetQuery, list, total, getList, classList} = useProvidePaperList(options)
 const drawer = ref(false)
+const type = consts.enums.buildType.ExactIntelligent
+const {batchList, batchId} = useProvidePaperBatchCondition(type)
+const classId = ref('')
+const queryParams = computed(() => ({batchId: toValue(batchId), classId: toValue(classId)}))
+const {rules, handleQuery, resetQuery, list, total, getList, classList} = useProvidePaperList(queryParams)
 
 const handleAction = function (action, row) {
     switch (action.key) {

+ 62 - 2
back-ui/src/views/dz/papers/components/list-full-intelligent.vue

@@ -1,13 +1,50 @@
 <template>
-
+    <el-form ref="queryRef" :model="queryParams" :rules="rules" label-width="68px" inline>
+        <el-form-item label="批次" prop="batchId">
+            <el-select v-model="batchId" clearable @change="handleQuery" style="width: 172px">
+                <el-option v-for="b in batchList" :label="b.name" :value="b.batchId"/>
+            </el-select>
+        </el-form-item>
+        <el-form-item label="考生类型" prop="examType">
+            <el-select v-model="examType" clearable @change="handleQuery" style="width: 172px">
+                <el-option v-for="e in examTypes" :label="e.dictLabel" :value="e.dictValue"/>
+            </el-select>
+        </el-form-item>
+        <el-form-item label="科目" prop="subjectId">
+            <el-select v-model="subjectId" clearable @change="handleQuery" style="width: 172px">
+                <el-option-group v-for="g in groupedSubjects" :label="g.label">
+                    <el-option v-for="s in g.items" :label="s.subjectName" :value="s.subjectId"/>
+                </el-option-group>
+            </el-select>
+        </el-form-item>
+        <el-form-item label="班级" prop="classId">
+            <el-select v-model="classId" clearable @change="handleQuery" style="width: 172px">
+                <el-option v-for="c in classList" :label="c.name" :value="c.classId"/>
+            </el-select>
+        </el-form-item>
+        <el-form-item>
+            <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+            <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+        </el-form-item>
+    </el-form>
+    <Table :data="list" :columns="columns" :actions="actions" @get-list="getList" @action="handleAction" />
+    <el-drawer v-model="drawer" title="班级详情" size="1000px">
+        <class-detail v-if="drawer" :state="queryParams.state" exact-mode />
+    </el-drawer>
 </template>
 
 <script setup name="ListFullIntelligent">
 import consts from "@/utils/consts.js";
+import {useProvidePaperList} from "@/views/dz/papers/hooks/usePaperList.js";
+import {useProvidePaperFullCondition} from "@/views/dz/papers/hooks/usePaperFullCondition.js";
+import Table from '@/components/Table/index.vue';
+import ClassDetail from "@/views/dz/papers/components/plugs/class-detail.vue";
 
 const options = {
     queryDefine: {
         batchId: '',
+        examType: '',
+        subjectId: '',
         classId: ''
     }
 }
@@ -16,9 +53,32 @@ const columns = [
     {label: '班级', prop: 'className'},
     {label: '批次', prop: 'batchName'},
     {label: '班级人数', prop: 'total'},
-    ...consts.config.exactColumns
+    ...consts.config.fullColumns
+]
+const actions = [
+    {label: '查看详情', key: 'detail', permission: ['']}
 ]
 
+const drawer = ref(false)
+const type = consts.enums.buildType.FullIntelligent
+const {batchList, batchId, examTypes, examType, groupedSubjects, subjectId, conditionArgs} = useProvidePaperFullCondition(type)
+const classId = ref('')
+const queryParams = computed(() => ({
+    ...conditionArgs.value,
+    classId
+}))
+const {rules, handleQuery, resetQuery, list, total, getList, classList} = useProvidePaperList(queryParams)
+
+const handleAction = function (action, row) {
+    switch (action.key) {
+        case "detail":
+            drawer.value = true
+            break;
+        default:
+            throw new Error(`Action key '${action.key}' not support.`)
+            break
+    }
+}
 </script>
 
 <style scoped>

+ 4 - 1
back-ui/src/views/dz/papers/components/plugs/question-hand.vue

@@ -10,7 +10,9 @@
             <el-option v-for="t in qTypes" :value="t.dictValue" :label="t.dictLabel"></el-option>
         </el-select>
         <el-popover width="250">
-            <span v-if="currentSubject" class="text-sm font-bold">科目:{{ currentSubject.subjectName }}</span>
+            <span v-if="subjectStat.length" class="text-lg font-bold">
+                科目:{{subjectStat.map(ss => `${ss.subjectName}(${ss.count})`).join('、')}}
+            </span>
             <div v-for="g in groupedQuestions" class="flex flex-col">
                 <el-divider style="margin: 10px 0"/>
                 <span>{{ g.qtpye }}:{{ g.questions.length }}道</span>
@@ -84,6 +86,7 @@ const {
     cart,
     groupedQuestions,
     currentSubject,
+    subjectStat,
     hasQuestion,
     addQuestion,
     removeQuestion,

+ 13 - 5
back-ui/src/views/dz/papers/hooks/usePaperExactCondition.js

@@ -1,5 +1,5 @@
 import {useProvidePaperBatchCondition} from "@/views/dz/papers/hooks/usePaperBatchCondition.js";
-import {getPaperExamTypes, getPaperMajors, getPaperUniversities} from "@/api/dz/papers.js";
+import {getPaperExamTypes, getPaperMajors, getPaperSubjects, getPaperUniversities} from "@/api/dz/papers.js";
 import {createEventHook, injectLocal, provideLocal} from "@vueuse/core";
 
 const key = Symbol('PaperExactCondition')
@@ -30,19 +30,24 @@ export const useProvidePaperExactCondition = function (type) {
         return _allMajors.value.filter(m => m.majorGroup == majorGroup.value)
     })
 
+    const subjectId = ref('')
+    const subjectList = ref([])
+
     const conditionArgs = computed(() => ({
         buildType: toValue(buildType),
         batchId: toValue(batchId),
         examType: toValue(examType),
         universityId: toValue(universityId),
         majorGroup: toValue(majorGroup),
-        majorPlanId: toValue(majorPlanId)
+        majorPlanId: toValue(majorPlanId),
+        subjectId: toValue(subjectId)
     }))
     const conditionData = computed(() => ({
         examTypes: toValue(examTypes),
         universities: toValue(universities),
         majorGroups: toValue(majorGroups),
-        majors: toValue(majors)
+        majors: toValue(majors),
+        subjectList: toValue(subjectList)
     }))
     const exactEvent = createEventHook()
     const triggerExactEvent = async function (args) {
@@ -62,9 +67,12 @@ export const useProvidePaperExactCondition = function (type) {
         universityId.value = ''
         universities.value = []
 
-        if (!batchId) return
+        if (!batchId || !examType) return
         const res = await getPaperUniversities({buildType, batchId, examType})
         universities.value = res.data
+
+        const resSubject = await getPaperSubjects({buildType, batchId, examType})
+        subjectList.value = resSubject.data
     })
 
     watch([batchId, examType, universityId], async ([batchId, examType, universityId]) => {
@@ -107,7 +115,7 @@ export const useProvidePaperExactCondition = function (type) {
         universityId, universities,
         majorGroup, majorGroups,
         majorPlanId, majors,
-        conditionArgs, conditionData,
+        conditionArgs, conditionData, subjectList,
         onConditionReady: exactEvent.on}
     provideLocal(key, payload)
     return payload

+ 10 - 8
back-ui/src/views/dz/papers/hooks/usePaperList.js

@@ -5,7 +5,6 @@ import {getPaperClasses, getPaperClassRecords} from "@/api/dz/papers.js";
 const key = Symbol('PaperList')
 
 const defaultOptions = {
-    queryDefine: {},
     formDefine: {},
     ruleDefine: {},
     exportPath: '',
@@ -14,7 +13,7 @@ const defaultOptions = {
     formRef: 'formRef',
     rowKey: 'id'
 }
-export const useProvidePaperList = function (opts = defaultOptions) {
+export const useProvidePaperList = function (queryParams, opts = defaultOptions) {
     const options = {...defaultOptions, ...opts}
     const {proxy} = getCurrentInstance()
     const {loading} = useInjectGlobalLoading()
@@ -31,15 +30,14 @@ export const useProvidePaperList = function (opts = defaultOptions) {
 
     const data = reactive({
         form: {...options.formDefine},
-        queryParams: {
+        page: {
             pageNum: 1,
-            pageSize: 10,
-            ...options.queryDefine
+            pageSize: 10
         },
         rules: {...options.ruleDefine}
     })
 
-    const {queryParams, form, rules} = toRefs(data)
+    const {page, form, rules} = toRefs(data)
 
     // 取消按钮
     function cancel() {
@@ -57,7 +55,7 @@ export const useProvidePaperList = function (opts = defaultOptions) {
 
     /** 搜索按钮操作 */
     function handleQuery() {
-        queryParams.value.pageNum = 1
+        page.value.pageNum = 1
         getList()
     }
 
@@ -84,7 +82,11 @@ export const useProvidePaperList = function (opts = defaultOptions) {
     function getList() {
         loading.value = true
 
-        getPaperClassRecords(queryParams.value).then(response => {
+        const query = {
+            ...page.value,
+            ...toValue(queryParams)
+        }
+        getPaperClassRecords(query).then(response => {
             list.value = response.rows
             total.value = response.total
             loading.value = false

+ 11 - 2
back-ui/src/views/dz/papers/hooks/usePaperQuestionCondition.js

@@ -34,7 +34,16 @@ export const useProvidePaperQuestionCondition = function (exactMode, handMode) {
     })
     const subjectStat = computed(() => {
         const results = []
-
+        cart.value.forEach(q => {
+            const match = results.find(i => i.subjectId == q.subjectId)
+            if (!match) {
+                const subject = conditionData.value.subjectList.find(s => s.subjectId == q.subjectId)
+                results.push({subjectId: q.subjectId, subjectName: subject?.subjectName || ('未知'+q.subjectId), count: 1})
+            } else {
+                match.count += 1
+            }
+        })
+        return results
     })
     const groupedQuestions = computed(() => {
         const results = {}
@@ -104,7 +113,7 @@ export const useProvidePaperQuestionCondition = function (exactMode, handMode) {
         total.value = 0
 
         if (!knowledgeId && !knowledges) return // 有知识点即可以查询题库
-        await getQuestionList(pageNum.value, pageSize.value)
+        await getQuestionList()
     })
 
     const payload = {