فهرست منبع

add:新增考试题目难度选项;随机抽题新增抽题方式选项

luoaoxuan 1 سال پیش
والد
کامیت
df88c969c0

+ 128 - 37
src/views/platform/examination/exam/edit.vue

@@ -83,34 +83,69 @@
                     <el-radio label="1" :disabled="!(!!form.ti_ku_id_)">开启</el-radio>
                 </el-radio-group>
             </el-form-item>
+            <el-form-item v-if="form.sui_ji_chou_ti_ === '1'">
+                <template slot="label">
+                    抽题方式
+                    <el-tooltip
+                        effect="dark"
+                        content="随机抽题的依据。"
+                        placement="top"
+                    >
+                        <i class="el-icon-question question-icon">:</i>
+                    </el-tooltip>
+                </template>
+                <el-radio-group v-model="form.chou_ti_fang_shi_" :disabled="isDisabled">
+                    <el-radio label="1">按照题型分类抽题</el-radio>
+                    <el-radio label="2">按照难度分类抽题</el-radio>
+                </el-radio-group>
+            </el-form-item>
             <el-form-item v-if="form.sui_ji_chou_ti_ === '1'" class="handrand">
                 <template slot="label">
                     抽题规则
                     <el-tooltip
                         effect="dark"
-                        content="设置每类题型的抽题数量,相同题型相同分值可以自由选择抽题数量,相同题型不同分值只能全抽或不抽。"
+                        :content="ruleContent"
                         placement="top"
                     >
                         <i class="el-icon-question question-icon">:</i>
                     </el-tooltip>
                 </template>
-                <div v-for="item in handList" :key="item.itemType" class="hand-item">
-                    <template v-if="item.list.length>0">
-                        <span>{{ item.itemType }}:</span>
-                        <el-input-number
-                            v-model="item.questionNumber"
-                            style="width:120px"
-                            :min="0"
-                            :max="item.list.length"
-                            :precision="0"
-                            :disabled="form.sui_ji_chou_ti_ === '0' || isDisabled"
-                            placeholder="请输入抽题数量"
-                            :step="item.step"
-                            step-strictly
-                        />
-                    </template>
-
-                </div>
+                <template v-if="form.chou_ti_fang_shi_==='1'">
+                    <div v-for="item in handList" :key="item.itemType" class="hand-item">
+                        <template v-if="item.list.length>0">
+                            <span>{{ item.itemType }}:</span>
+                            <el-input-number
+                                v-model="item.questionNumber"
+                                style="width:120px"
+                                :min="0"
+                                :max="item.list.length"
+                                :precision="0"
+                                :disabled="form.sui_ji_chou_ti_ === '0' || isDisabled"
+                                placeholder="请输入抽题数量"
+                                :step="item.step"
+                                step-strictly
+                            />
+                        </template>
+                    </div>
+                </template>
+                <template v-if="form.chou_ti_fang_shi_==='2'">
+                    <div v-for="item in levelList" :key="item.itemType" class="hand-item">
+                        <template v-if="item.list.length>0">
+                            <span>{{ item.label }}:</span>
+                            <el-input-number
+                                v-model="item.questionNumber"
+                                style="width:120px"
+                                :min="0"
+                                :max="item.list.length"
+                                :precision="0"
+                                :disabled="form.sui_ji_chou_ti_ === '0' || isDisabled"
+                                placeholder="请输入抽题数量"
+                                :step="item.step"
+                                step-strictly
+                            />
+                        </template>
+                    </div>
+                </template>
 
             </el-form-item>
             <el-form-item prop="xian_kao_shi_jian">
@@ -351,6 +386,14 @@ export default {
                 { itemType: '填空题', questionNumber: 0, list: [], step: 1 },
                 { itemType: '简答题', questionNumber: 0, list: [], step: 1 }
             ],
+            levelList: [
+                { label: '未知', itemType: '0', questionNumber: 0, list: [], step: 1 },
+                { label: '易', itemType: '1', questionNumber: 0, list: [], step: 1 },
+                { label: '偏易', itemType: '2', questionNumber: 0, list: [], step: 1 },
+                { label: '适中', itemType: '3', questionNumber: 0, list: [], step: 1 },
+                { label: '偏难', itemType: '4', questionNumber: 0, list: [], step: 1 },
+                { label: '难', itemType: '5', questionNumber: 0, list: [], step: 1 }
+            ],
             userList,
             examTypeOptions,
             deptList: deptList.filter((i) => i.depth === 4),
@@ -384,7 +427,8 @@ export default {
                 ti_mu_zong_shu_: 0,
                 sui_ji_ti_shu_: [],
                 hours: 2,
-                minutes: 30
+                minutes: 30,
+                chou_ti_fang_shi_: '1'
             },
             pickerOptions: {
                 disabledDate (time) {
@@ -427,6 +471,17 @@ export default {
             }
         }
     },
+    computed: {
+        ruleContent () {
+            switch (this.form.chou_ti_fang_shi_) {
+                case '1':
+                    return '设置每类题型的抽题数量,相同题型相同分值可以自由选择抽题数量,相同题型不同分值只能全抽或不抽。'
+                case '2':
+                    return '设置每种难度的抽题数量,相同难度相同分值可以自由选择抽题数量,相同难度不同分值只能全抽或不抽。未设置难度的题目会自动过滤。'
+            }
+            return '设置每类题型的抽题数量,相同题型相同分值可以自由选择抽题数量,相同题型不同分值只能全抽或不抽。'
+        }
+    },
     watch: {
         visible: {
             handler: function (val, oldVal) {
@@ -450,23 +505,34 @@ export default {
         this.getExamData()
     },
     methods: {
-        // 题型分类
+        // 分类计算
         getHandList (data) {
             // 确定每种类型的题目
             this.handList.forEach(hand => {
                 hand.list = data.filter(item => item.ti_xing_ === hand.itemType)
             })
+            // 确定每种难度的题目
+            this.levelList.forEach(level => {
+                level.list = data.filter(item => item.nan_du_ === level.itemType)
+            })
 
             if (this.$utils.isEmpty(this.id)) {
                 // 设置每种类型题目的默认题数
                 this.handList.forEach(hand => {
                     hand.questionNumber = hand.list.length
                 })
+                // 设置每种难度题目的默认题数
+                this.levelList.forEach(level => {
+                    level.questionNumber = level.list.length
+                })
             } else {
                 if (!this.isFirst) {
                     this.handList.forEach(hand => {
                         hand.questionNumber = hand.list.length
                     })
+                    this.levelList.forEach(level => {
+                        level.questionNumber = level.list.length
+                    })
                 } else {
                     this.isFirst = false
                 }
@@ -479,6 +545,13 @@ export default {
                     hand.step = isSame ? 1 : hand.list.length
                 }
             })
+            // 设置每种难度题目的步数
+            this.levelList.forEach(level => {
+                if (level.list.length > 0) {
+                    const isSame = level.list.every(item => item.fen_zhi_ === level.list[0].fen_zhi_)
+                    level.step = isSame ? 1 : level.list.length
+                }
+            })
         },
         changeLimit (e, type, defaultValue) {
             this.form[type] = e === '1' ? defaultValue : '不限'
@@ -504,7 +577,7 @@ export default {
                 this.randButtonDisabled = true
                 this.$message.info('非未发布状态的考试仅可修改限考时间!')
             }
-            const sql = `select id_, create_by_, ti_ku_id_, guan_lian_id_, kao_shi_ming_chen, kao_shi_lei_xing_, chuang_jian_shi_j, fa_bu_shi_jian_, fa_bu_ren_, xian_kao_shi_jian, xian_kao_ci_shu_, kao_shi_shi_chang, can_kao_ren_yuan_, zhuang_tai_, da_biao_zhan_bi_, ji_fen_fang_shi_, kao_shi_miao_shu_, yun_xu_bao_ming_, sui_ji_chou_ti_, sui_ji_ti_shu_,chou_ti_zong_fen_,ti_mu_zong_shu_ from t_exams where id_ = '${this.id}'`
+            const sql = `select id_, create_by_, ti_ku_id_, guan_lian_id_, kao_shi_ming_chen, kao_shi_lei_xing_, chuang_jian_shi_j, fa_bu_shi_jian_, fa_bu_ren_, xian_kao_shi_jian, xian_kao_ci_shu_, kao_shi_shi_chang, can_kao_ren_yuan_, zhuang_tai_, da_biao_zhan_bi_, ji_fen_fang_shi_, kao_shi_miao_shu_, yun_xu_bao_ming_, sui_ji_chou_ti_, sui_ji_ti_shu_,chou_ti_zong_fen_,ti_mu_zong_shu_,chou_ti_fang_shi_ from t_exams where id_ = '${this.id}'`
             this.$common.request('sql', sql).then((res) => {
                 const { data = [] } = res.variables || {}
                 if (!data.length) {
@@ -525,9 +598,15 @@ export default {
                 this.form = data[0]
                 if (this.form.sui_ji_chou_ti_ === '1') {
                     this.form.sui_ji_ti_shu_ = this.form.sui_ji_ti_shu_.split(',')
-                    this.form.sui_ji_ti_shu_.forEach((item, index) => {
-                        this.handList[index].questionNumber = item
-                    })
+                    if (this.form.chou_ti_fang_shi_ === '1') {
+                        this.form.sui_ji_ti_shu_.forEach((item, index) => {
+                            this.handList[index].questionNumber = item
+                        })
+                    } else if (this.form.chou_ti_fang_shi_ === '2') {
+                        this.form.sui_ji_ti_shu_.forEach((item, index) => {
+                            this.levelList[index].questionNumber = item
+                        })
+                    }
                 }
             })
         },
@@ -550,24 +629,36 @@ export default {
                     this.form.ti_mu_zong_shu_ = 0
                     if (this.form.sui_ji_chou_ti_ === '1') {
                         // 计算总分 总数量
-                        this.handList.forEach(item => {
-                            if (item.list.length > 0) {
-                                this.form.sui_ji_ti_shu_.push(item.questionNumber)
-                                this.form.ti_mu_zong_shu_ += item.questionNumber
-                                this.form.chou_ti_zong_fen_ += item.list.slice(0, item.questionNumber).reduce((pre, cur) => {
-                                    return pre + +cur.fen_zhi_
-                                }, 0)
-                            } else {
-                                this.form.sui_ji_ti_shu_.push(0)
-                            }
-                        })
+                        if (this.form.chou_ti_fang_shi_ === '1') {
+                            this.handList.forEach(item => {
+                                if (item.list.length > 0) {
+                                    this.form.sui_ji_ti_shu_.push(item.questionNumber)
+                                    this.form.ti_mu_zong_shu_ += item.questionNumber
+                                    this.form.chou_ti_zong_fen_ += item.list.slice(0, item.questionNumber).reduce((pre, cur) => {
+                                        return pre + +cur.fen_zhi_
+                                    }, 0)
+                                } else {
+                                    this.form.sui_ji_ti_shu_.push(0)
+                                }
+                            })
+                        } else if (this.form.chou_ti_fang_shi_ === '2') {
+                            this.levelList.forEach(item => {
+                                if (item.list.length > 0) {
+                                    this.form.sui_ji_ti_shu_.push(item.questionNumber)
+                                    this.form.ti_mu_zong_shu_ += item.questionNumber
+                                    this.form.chou_ti_zong_fen_ += item.list.slice(0, item.questionNumber).reduce((pre, cur) => {
+                                        return pre + +cur.fen_zhi_
+                                    }, 0)
+                                } else {
+                                    this.form.sui_ji_ti_shu_.push(0)
+                                }
+                            })
+                        }
 
                         if (this.form.ti_mu_zong_shu_ === 0) {
                             return this.$message.warning('请填写需要抽取的题目数量!')
                         }
                     }
-                    this.form.chou_ti_zong_fen_ += ''
-                    this.form.ti_mu_zong_shu_ += ''
                     this.form.sui_ji_ti_shu_ = this.form.sui_ji_ti_shu_.join(',')
 
                     const { isTimeLimit, xian_kao_shi_jian = '' } = this.form || {}

+ 2 - 2
src/views/platform/examination/exam/list.vue

@@ -35,7 +35,7 @@
                 />
             </template>
             <template slot="isRand" slot-scope="scope">
-                <div>{{ scope.row.isRand ? '是' : '否' }}</div>
+                <div>{{ scope.row.isRand==='1' ? '是' : '否' }}</div>
             </template>
         </ibps-crud>
         <exam-edit
@@ -279,7 +279,7 @@ export default {
                                 bankId: item.bankId,
                                 bankName: item.bankName,
                                 examinee: item.examinee,
-                                questionCount: item.isRand === '1' ? parseFloat(item.randNumber) : parseFloat(item.questionCount),
+                                questionCount: item.isRand === '1' ? parseFloat(item.randTotal) : parseFloat(item.questionCount),
                                 duration: item.duration,
                                 limitCount: item.limitCount,
                                 limitDate: item.limitDate,

+ 17 - 2
src/views/platform/examination/question/edit.vue

@@ -143,6 +143,14 @@
                     size=""
                 />
             </el-form-item>
+            <el-form-item label="难度:" prop="nan_du_">
+                <el-rate
+                    v-model="form.nan_du_"
+                    show-text
+                    :texts="texts"
+                    :colors="colors"
+                />
+            </el-form-item>
             <el-form-item label="分值:" prop="fen_zhi_" :maxlength="8">
                 <el-input-number
                     v-model="form.fen_zhi_"
@@ -331,6 +339,8 @@ export default {
         const { userList = [], deptList = [], userId } = this.$store.getters || {}
         const defaultType = questionType.length ? questionType[0].value : ''
         return {
+            colors: { 1: '#00FF00', 2: '#7FFF00', 3: '#FFFF00', 4: '#FFA500', 5: '#FF0000' },
+            texts: ['易', '偏易', '适中', '偏难', '难'],
             userId,
             userList,
             questionType,
@@ -358,7 +368,8 @@ export default {
                 ping_fen_ren_: [userId],
                 fen_zhi_: '',
                 bei_zhu_: '',
-                zhuang_tai_: '启用'
+                zhuang_tai_: '启用',
+                nan_du_: 0
             },
             questionTags: [],
             toolbars: [
@@ -493,7 +504,7 @@ export default {
             if (this.$utils.isEmpty(this.id)) {
                 return
             }
-            const sql = `select id_, chu_ti_ren_, bu_men_, chu_ti_shi_jian_, ti_gan_, ti_xing_, xuan_xiang_lei_xi, biao_qian_, da_an_, zheng_que_da_an_, ping_fen_fang_shi, ping_fen_ren_, fen_zhi_, zhuang_tai_, xuan_xiang_shu_, fu_tu_, bei_zhu_ from t_questions where id_ = '${this.id}'`
+            const sql = `select id_, chu_ti_ren_, bu_men_, chu_ti_shi_jian_, ti_gan_, ti_xing_, xuan_xiang_lei_xi, biao_qian_, da_an_, zheng_que_da_an_, ping_fen_fang_shi, ping_fen_ren_, fen_zhi_, zhuang_tai_, xuan_xiang_shu_, fu_tu_, bei_zhu_,nan_du_ from t_questions where id_ = '${this.id}'`
             this.$common.request('sql', sql).then(res => {
                 const { data = [] } = res.variables || {}
                 if (!data.length) {
@@ -533,6 +544,7 @@ export default {
                         })
                     })
                 }
+                item.nan_du_ = +item.nan_du_ || 0
                 item.fen_zhi_ = parseInt(item.fen_zhi_)
                 item.fu_tu_ = item.fu_tu_ ? JSON.parse(item.fu_tu_) : ''
                 item.ping_fen_ren_ = item.ping_fen_ren_ ? item.ping_fen_ren_.split(',') : []
@@ -726,6 +738,9 @@ export default {
 <style lang="scss" scoped>
     .question-dialog {
         ::v-deep {
+            .el-rate{
+                padding: 6px 0 0 0;
+            }
             .el-dialog {
                 min-width: 1080px;
             }

+ 15 - 4
src/views/platform/examination/questionBank/edit.vue

@@ -311,6 +311,16 @@
                     width="75"
                     sortable
                 />
+                <el-table-column
+                    prop="questionLevel"
+                    label="难度"
+                    width="75"
+                    sortable
+                >
+                    <template slot-scope="{row}">
+                        <span>{{ ['未知','易','偏易','适中','偏难','难'][+row.questionLevel] }}</span>
+                    </template>
+                </el-table-column>
                 <el-table-column
                     prop="createTime"
                     label="出题时间"
@@ -591,7 +601,7 @@ export default {
                 return
             }
             const sql1 = `select id_, bian_zhi_ren_, bian_zhi_bu_men_, bian_zhi_shi_jian, ti_ku_ming_cheng_, ti_ku_fen_lei_, ti_ku_zhuang_tai_, shi_fou_gong_kai_, xian_kao_ci_shu_, ping_fen_ren_, miao_shu_, suo_shu_fan_wei_, kao_shi_shi_chang, da_biao_zhan_bi_ from t_question_bank where id_ = '${this.formId}'`
-            const sql2 = `select id_ as quesId, chu_ti_ren_ as creator, bu_men_ as createDept, chu_ti_shi_jian_ as createTime, xu_hao_ as sn, ti_gan_ as content, ti_xing_ as quesType, fu_tu_ as img, xuan_xiang_lei_xi as optionType, da_an_ as answer, zheng_que_da_an_ as rightKey, ping_fen_fang_shi as rateType, ping_fen_ren_ as rater, fen_zhi_ as score, bei_zhu_ as note, xuan_xiang_shu_ as optionCount, biao_qian_ as quesTag, zhuang_tai_ as quesState from t_questions where parent_id_ = '${this.formId}' order by chu_ti_shi_jian_ desc`
+            const sql2 = `select id_ as quesId, chu_ti_ren_ as creator, bu_men_ as createDept, chu_ti_shi_jian_ as createTime, xu_hao_ as sn, ti_gan_ as content, ti_xing_ as quesType, fu_tu_ as img, xuan_xiang_lei_xi as optionType, da_an_ as answer, zheng_que_da_an_ as rightKey, ping_fen_fang_shi as rateType, ping_fen_ren_ as rater, fen_zhi_ as score, bei_zhu_ as note, xuan_xiang_shu_ as optionCount, biao_qian_ as quesTag, zhuang_tai_ as quesState,nan_du_ as questionLevel from t_questions where parent_id_ = '${this.formId}' order by chu_ti_shi_jian_ desc`
             Promise.all([this.$common.request('sql', sql1), this.$common.request('sql', sql2)]).then(([res1, res2]) => {
                 const { data: bankData = [] } = res1.variables || {}
                 const { data: questionData = [] } = res2.variables || {}
@@ -619,7 +629,7 @@ export default {
             })
         },
         addSelectQuestion () {
-            const sql = `select id_ as quesId, chu_ti_ren_ as creator, bu_men_ as createDept, chu_ti_shi_jian_ as createTime, xu_hao_ as sn, ti_gan_ as content, ti_xing_ as quesType, fu_tu_ as img, xuan_xiang_lei_xi as optionType, da_an_ as answer, zheng_que_da_an_ as rightKey, ping_fen_fang_shi as rateType, ping_fen_ren_ as rater, fen_zhi_ as score, bei_zhu_ as note, xuan_xiang_shu_ as optionCount, biao_qian_ as quesTag, zhuang_tai_ as quesState from t_questions where find_in_set(id_, '${this.quesIdList}')`
+            const sql = `select id_ as quesId, chu_ti_ren_ as creator, bu_men_ as createDept, chu_ti_shi_jian_ as createTime, xu_hao_ as sn, ti_gan_ as content, ti_xing_ as quesType, fu_tu_ as img, xuan_xiang_lei_xi as optionType, da_an_ as answer, zheng_que_da_an_ as rightKey, ping_fen_fang_shi as rateType, ping_fen_ren_ as rater, fen_zhi_ as score, bei_zhu_ as note, xuan_xiang_shu_ as optionCount, biao_qian_ as quesTag, zhuang_tai_ as quesState,nan_du_ as questionLevel from t_questions where find_in_set(id_, '${this.quesIdList}')`
             this.$common.request('sql', sql).then(res => {
                 const { data = [] } = res.variables || {}
                 this.questionData = data.concat(this.questionData)
@@ -669,7 +679,7 @@ export default {
                 xu_hao_: item.sn || '',
                 ti_gan_: item.content,
                 ti_xing_: item.quesType,
-                fu_tu_: item.img,
+                fu_tu_: item.img || '',
                 xuan_xiang_lei_xi: item.optionType || '',
                 da_an_: item.answer || '',
                 fen_zhi_: item.score,
@@ -679,7 +689,8 @@ export default {
                 ping_fen_ren_: item.rater || '',
                 bei_zhu_: item.note || '',
                 zhuang_tai_: item.quesState,
-                biao_qian_: item.quesTag || ''
+                biao_qian_: item.quesTag || '',
+                nan_du_: item.questionLevel || 0
             }))
             await this.$common.request('add', {
                 tableName: 't_questions',

+ 26 - 11
src/views/platform/examination/questionBank/test.vue

@@ -135,8 +135,8 @@
 
 <script>
 // import Watermark from '@/layout/header-aside/components/header-message/watermark/watermark-cont'
-import { shuffle } from 'lodash'
-import { round } from 'lodash'
+import { shuffle, round } from 'lodash'
+
 export default {
     components: {
         IbpsImage: () => import('@/business/platform/file/image')
@@ -323,28 +323,42 @@ export default {
         },
         // 随机题目
         getRandQuestionData (data) {
-            data = shuffle(data)
-            const temp = []
+            let temp = []
             const type = ['单选题', '多选题', '判断题', '填空题', '简答题']
             this.examData.randNumber = this.examData.randNumber.split(',')
             for (let i = 0; i < this.examData.randNumber.length; i++) {
                 let t = +this.examData.randNumber[i]
                 // console.log(t)
                 if (t !== 0) {
-                    for (let j = 0; j < data.length && t; j++) {
-                        const item = data[j]
-                        if (item.questionType === type[i]) {
-                            temp.push(item)
-                            t--
+                    // 题型分类
+                    if (this.examData.randWay === '1') {
+                        for (let j = 0; j < data.length && t; j++) {
+                            const item = data[j]
+                            if (item.questionType === type[i]) {
+                                temp.push(item)
+                                t--
+                            }
+                        } // 难度分类
+                    } else if (this.examData.randWay === '2') {
+                        for (let j = 0; j < data.length && t; j++) {
+                            const item = data[j]
+                            if (item.questionLevel === i + '') {
+                                temp.push(item)
+                                t--
+                            }
                         }
                     }
                 }
             }
+            temp = shuffle(temp)
+            temp.sort((a, b) => {
+                return type.indexOf(a.questionType) - type.indexOf(b.questionType)
+            })
             return temp
         },
         getQuestionData () {
             this.loading = true
-            const sql = `select id_ as questionId, ti_gan_ as stem, ti_xing_ as questionType, fu_tu_ as img, xuan_xiang_lei_xi as optionType, da_an_ as options, xuan_xiang_shu_ as optionsLength, fen_zhi_ as score, ping_fen_fang_shi as rateType, ping_fen_ren_ as rater, zheng_que_da_an_ as rightKey from t_questions where parent_id_ = '${this.bankId}' and zhuang_tai_ = '启用' order by field(ti_xing_, '单选题', '多选题', '判断题', '填空题', '简答题')`
+            const sql = `select id_ as questionId, ti_gan_ as stem, ti_xing_ as questionType, fu_tu_ as img, xuan_xiang_lei_xi as optionType, da_an_ as options, xuan_xiang_shu_ as optionsLength, fen_zhi_ as score, ping_fen_fang_shi as rateType, ping_fen_ren_ as rater, zheng_que_da_an_ as rightKey,nan_du_ as questionLevel from t_questions where parent_id_ = '${this.bankId}' and zhuang_tai_ = '启用' order by field(ti_xing_, '单选题', '多选题', '判断题', '填空题', '简答题')`
             return new Promise((resolve, reject) => {
                 this.$common.request('sql', sql).then(res => {
                     let { data = [] } = res.variables || {}
@@ -533,7 +547,8 @@ export default {
                     shi_fou_yi_yue_: autoType ? '是' : '否',
                     ping_yue_shi_jian: autoType ? time : '',
                     de_fen_: autoType ? this.getScore(item) : '',
-                    jie_xi_: ''
+                    jie_xi_: '',
+                    nan_du_: item.questionLevel || 0
                 })
             })
             return submitData