|
|
@@ -12,12 +12,12 @@
|
|
|
<!-- 第一块:基本信息 -->
|
|
|
<div class="section-box">
|
|
|
<!-- 试卷名称 -->
|
|
|
- <el-form-item label="试卷名称" prop="data1" class="full-width-item">
|
|
|
- <el-input v-model="newData.data1" maxLength="30" placeholder="请输入名称"/>
|
|
|
+ <el-form-item label="试卷名称" prop="paperName" class="full-width-item">
|
|
|
+ <el-input v-model="newData.paperName" maxLength="30" placeholder="请输入名称"/>
|
|
|
</el-form-item>
|
|
|
<!-- 总分数 / 及格分数 / 答题时间 -->
|
|
|
<div class="flex-row-box">
|
|
|
- <el-form-item label="总分数" prop="data2">
|
|
|
+ <el-form-item label="总分数" prop="totalScore">
|
|
|
<div class="input-unit-box">
|
|
|
<el-input-number
|
|
|
class="form-input-number"
|
|
|
@@ -25,14 +25,14 @@
|
|
|
:min="0"
|
|
|
:max="9999"
|
|
|
:step="1" :precision="0" step-strictly
|
|
|
- v-model="newData.data2"
|
|
|
+ v-model="newData.totalScore"
|
|
|
:controls="false"
|
|
|
>
|
|
|
</el-input-number>
|
|
|
<span class="unit-text">分</span>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="及格分数" prop="data3">
|
|
|
+ <el-form-item label="及格分数" prop="passScore">
|
|
|
<div class="input-unit-box">
|
|
|
<el-input-number
|
|
|
class="form-input-number"
|
|
|
@@ -40,14 +40,14 @@
|
|
|
:min="0"
|
|
|
:max="9999"
|
|
|
:step="1" :precision="0" step-strictly
|
|
|
- v-model="newData.data3"
|
|
|
+ v-model="newData.passScore"
|
|
|
:controls="false"
|
|
|
>
|
|
|
</el-input-number>
|
|
|
<span class="unit-text">分</span>
|
|
|
</div>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="答题时间" prop="data4">
|
|
|
+ <el-form-item label="答题时间" prop="answerDuration">
|
|
|
<div class="input-unit-box">
|
|
|
<el-input-number
|
|
|
class="form-input-number"
|
|
|
@@ -55,7 +55,7 @@
|
|
|
:min="0"
|
|
|
:max="9999"
|
|
|
:step="1" :precision="0" step-strictly
|
|
|
- v-model="newData.data4"
|
|
|
+ v-model="newData.answerDuration"
|
|
|
:controls="false"
|
|
|
>
|
|
|
</el-input-number>
|
|
|
@@ -66,8 +66,8 @@
|
|
|
|
|
|
<!-- 专业类别 / 是否共享 -->
|
|
|
<div class="flex-row-box">
|
|
|
- <el-form-item label="专业类别" prop="data5">
|
|
|
- <el-select v-model="newData.data5" placeholder="专业类别" style="width:200px;">
|
|
|
+ <el-form-item label="专业类别" prop="disciplineTypeId">
|
|
|
+ <el-select v-model="newData.disciplineTypeId" placeholder="专业类别" style="width:200px;">
|
|
|
<el-option
|
|
|
v-for="item in optionListA"
|
|
|
:key="item.id"
|
|
|
@@ -76,15 +76,15 @@
|
|
|
/>
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="是否共享" prop="data6">
|
|
|
+ <el-form-item label="是否共享" prop="shareStatus">
|
|
|
<el-switch
|
|
|
- v-model="newData.data6"
|
|
|
- :active-value="true"
|
|
|
- :inactive-value="false"
|
|
|
+ v-model="newData.shareStatus"
|
|
|
+ :active-value="1"
|
|
|
+ :inactive-value="0"
|
|
|
active-color="#0183FB"
|
|
|
inactive-color="#AAAAAA"
|
|
|
/>
|
|
|
- <span class="share-tip">{{newData.data6 ? '共享开启,全校所有学院单位都可见' : '不共享,仅本学院单位及上级都可见'}}</span>
|
|
|
+ <span class="share-tip">{{newData.shareStatus == 1 ? '共享开启,全校所有学院单位都可见' : '不共享,仅本学院单位及上级都可见'}}</span>
|
|
|
</el-form-item>
|
|
|
</div>
|
|
|
</div>
|
|
|
@@ -95,27 +95,30 @@
|
|
|
<!-- 第二块:组卷方式 & 知识点 -->
|
|
|
<div class="section-box">
|
|
|
<!-- 组卷方式 -->
|
|
|
- <el-form-item label="组卷方式" prop="data7">
|
|
|
- <el-radio-group v-model="newData.data7">
|
|
|
+ <el-form-item label="组卷方式" prop="assemblyMode">
|
|
|
+ <el-radio-group v-model="newData.assemblyMode">
|
|
|
<el-radio :label="1">固定组卷</el-radio>
|
|
|
<el-radio :label="2">随机组卷</el-radio>
|
|
|
</el-radio-group>
|
|
|
</el-form-item>
|
|
|
|
|
|
<!-- 选择知识点 -->
|
|
|
- <el-form-item label="选择知识点" prop="data8" class="knowledge-form-item">
|
|
|
+ <el-form-item label="选择知识点" prop="knowledgePointId" class="knowledge-form-item">
|
|
|
<!-- 统计信息条 -->
|
|
|
<div class="stat-bar">
|
|
|
<span>总题目数:<b>{{totalQuestionCount}}</b></span>
|
|
|
<span style="margin-left:20px;">总分:<b>{{totalScore}}</b></span>
|
|
|
- <span style="margin-left:20px;" v-if="remainScore > 0">还需设置 <b>{{remainScore}}</b> 分的题目</span>
|
|
|
+ <span style="margin-left:20px;">
|
|
|
+ <span v-if="remainScore > 0">还需设置 <b>{{remainScore}}</b> 分的题目</span>
|
|
|
+ <span v-if="remainScore < 0">超过总分数 <b>{{Math.abs(remainScore)}}</b> 分</span>
|
|
|
+ </span>
|
|
|
</div>
|
|
|
|
|
|
<!-- 已选知识点标签 -->
|
|
|
<div class="knowledge-tag-box">
|
|
|
<el-cascader
|
|
|
ref="knowledgeCascader"
|
|
|
- v-model="newData.data8"
|
|
|
+ v-model="newData.knowledgePointId"
|
|
|
:options="optionListKnowledge"
|
|
|
:props="{
|
|
|
multiple :true,
|
|
|
@@ -134,16 +137,16 @@
|
|
|
</div>
|
|
|
|
|
|
<!-- 知识点明细表格 -->
|
|
|
- <div class="knowledge-table" v-if="selectedKnowledgePoints.length > 0">
|
|
|
+ <div class="knowledge-table" v-if="fixedKnowledgePointConfigs.length > 0">
|
|
|
<div class="table-header">
|
|
|
<span class="col-name">知识点</span>
|
|
|
<span class="col-count">试题数量</span>
|
|
|
<span class="col-score">每题分数</span>
|
|
|
- <span class="col-fixed">{{newData.data7==1?'固定选题':'随机选题'}}</span>
|
|
|
+ <span class="col-fixed">{{newData.assemblyMode==1?'固定选题':'随机选题'}}</span>
|
|
|
</div>
|
|
|
<div
|
|
|
class="table-row"
|
|
|
- v-for="(item, index) in selectedKnowledgePoints"
|
|
|
+ v-for="(item, index) in fixedKnowledgePointConfigs"
|
|
|
:key="index"
|
|
|
draggable="true"
|
|
|
@dragstart="onBigDragStart($event, index)"
|
|
|
@@ -153,41 +156,43 @@
|
|
|
>
|
|
|
<div class="table-big-row">
|
|
|
<span class="col-name color-name">
|
|
|
- <span class="roller-span" v-show="newData.data7==2"
|
|
|
+ <span class="roller-span" v-show="newData.assemblyMode==2"
|
|
|
@click="rollerButton(index)"
|
|
|
:class="item.rollerType?'el-icon-arrow-up':'el-icon-arrow-down'"></span>
|
|
|
{{item.name}}
|
|
|
</span>
|
|
|
- <span class="col-count color-name">{{item.questionCount || 0}}</span>
|
|
|
+ <span class="col-count color-name">{{item.questionTotalCount}}</span>
|
|
|
<span class="col-score">
|
|
|
<span class="number-stepper">
|
|
|
<el-input-number
|
|
|
- v-if="newData.data7==1"
|
|
|
+ v-if="newData.assemblyMode==1"
|
|
|
+ @change="calculationMaxData()"
|
|
|
class="form-input-number"
|
|
|
style="width:160px"
|
|
|
:min="0"
|
|
|
:max="9999"
|
|
|
:step="1" :precision="0" step-strictly
|
|
|
- v-model="item.scorePerQuestion"
|
|
|
+ v-model="item.questionScore"
|
|
|
>
|
|
|
</el-input-number>
|
|
|
</span>
|
|
|
</span>
|
|
|
<span class="col-fixed">
|
|
|
- <span class="item-num-span" v-if="newData.data7==1">{{item.fixedCount}}</span>
|
|
|
- <span class="el-icon-circle-plus" v-if="newData.data7==1" @click="addFixed(index)"></span>
|
|
|
+ <span class="item-num-span" v-if="newData.assemblyMode==1">{{item.questionIds.length}}</span>
|
|
|
+ <span class="el-icon-circle-plus" v-if="newData.assemblyMode==1" @click="addFixed(index)"></span>
|
|
|
<span class="el-icon-rank"></span>
|
|
|
</span>
|
|
|
</div>
|
|
|
- <div v-if="newData.data7==2 && item.rollerType" class="table-min-row">
|
|
|
+ <div v-if="newData.assemblyMode==2 && item.rollerType" class="table-min-row">
|
|
|
<span class="col-name">
|
|
|
<span class="roller-span">单选题</span>
|
|
|
</span>
|
|
|
- <span class="col-count color-name">{{item.maxNumA || 0}}</span>
|
|
|
+ <span class="col-count color-name">{{item.singleQuestionCount}}</span>
|
|
|
<span class="col-score">
|
|
|
<span class="number-stepper">
|
|
|
<el-input-number
|
|
|
class="form-input-number"
|
|
|
+ @change="calculationMaxData()"
|
|
|
style="width:160px"
|
|
|
:min="0"
|
|
|
:max="9999"
|
|
|
@@ -201,9 +206,10 @@
|
|
|
<span class="number-stepper">
|
|
|
<el-input-number
|
|
|
class="form-input-number"
|
|
|
+ @change="calculationMaxData()"
|
|
|
style="width:80px"
|
|
|
:min="0"
|
|
|
- :max="9999"
|
|
|
+ :max="item.singleQuestionCount"
|
|
|
:step="1" :precision="0" step-strictly
|
|
|
v-model="item.checkNumA"
|
|
|
:controls="false"
|
|
|
@@ -212,15 +218,16 @@
|
|
|
</span>
|
|
|
</span>
|
|
|
</div>
|
|
|
- <div v-if="newData.data7==2 && item.rollerType" class="table-min-row">
|
|
|
+ <div v-if="newData.assemblyMode==2 && item.rollerType" class="table-min-row">
|
|
|
<span class="col-name">
|
|
|
- <span class="roller-span">单选题</span>
|
|
|
+ <span class="roller-span">多选题</span>
|
|
|
</span>
|
|
|
- <span class="col-count color-name">{{item.maxNumB || 0}}</span>
|
|
|
+ <span class="col-count color-name">{{item.multipleQuestionCount}}</span>
|
|
|
<span class="col-score">
|
|
|
<span class="number-stepper">
|
|
|
<el-input-number
|
|
|
class="form-input-number"
|
|
|
+ @change="calculationMaxData()"
|
|
|
style="width:160px"
|
|
|
:min="0"
|
|
|
:max="9999"
|
|
|
@@ -234,9 +241,10 @@
|
|
|
<span class="number-stepper">
|
|
|
<el-input-number
|
|
|
class="form-input-number"
|
|
|
+ @change="calculationMaxData()"
|
|
|
style="width:80px"
|
|
|
:min="0"
|
|
|
- :max="9999"
|
|
|
+ :max="item.multipleQuestionCount"
|
|
|
:step="1" :precision="0" step-strictly
|
|
|
v-model="item.checkNumB"
|
|
|
:controls="false"
|
|
|
@@ -245,15 +253,16 @@
|
|
|
</span>
|
|
|
</span>
|
|
|
</div>
|
|
|
- <div v-if="newData.data7==2 && item.rollerType" class="table-min-row">
|
|
|
+ <div v-if="newData.assemblyMode==2 && item.rollerType" class="table-min-row">
|
|
|
<span class="col-name">
|
|
|
<span class="roller-span">判断题</span>
|
|
|
</span>
|
|
|
- <span class="col-count color-name">{{item.maxNumC || 0}}</span>
|
|
|
+ <span class="col-count color-name">{{item.judgeQuestionCount}}</span>
|
|
|
<span class="col-score">
|
|
|
<span class="number-stepper">
|
|
|
<el-input-number
|
|
|
class="form-input-number"
|
|
|
+ @change="calculationMaxData()"
|
|
|
style="width:160px"
|
|
|
:min="0"
|
|
|
:max="9999"
|
|
|
@@ -267,9 +276,10 @@
|
|
|
<span class="number-stepper">
|
|
|
<el-input-number
|
|
|
class="form-input-number"
|
|
|
+ @change="calculationMaxData()"
|
|
|
style="width:80px"
|
|
|
:min="0"
|
|
|
- :max="9999"
|
|
|
+ :max="item.judgeQuestionCount"
|
|
|
:step="1" :precision="0" step-strictly
|
|
|
v-model="item.checkNumC"
|
|
|
:controls="false"
|
|
|
@@ -289,29 +299,24 @@
|
|
|
size="100%"
|
|
|
custom-class="testPaper-select-drawer"
|
|
|
:append-to-body="true"
|
|
|
- :title="drawerKnowledgeName ? '固定选题 - ' + drawerKnowledgeName : '固定选题'"
|
|
|
+ :show-close="false"
|
|
|
+ title="固定选题"
|
|
|
ref="drawer"
|
|
|
:visible.sync="drawer"
|
|
|
direction="rtl"
|
|
|
- :withHeader="false"
|
|
|
>
|
|
|
- <drawer-item
|
|
|
- v-if="drawer"
|
|
|
- :knowledge-name="drawerKnowledgeName"
|
|
|
- :knowledge-id="drawerKnowledgeId"
|
|
|
- :score-per-question="drawerScorePerQuestion"
|
|
|
- :total-score="Number(newData.data2) || 0"
|
|
|
- :init-selected="drawerInitSelected"
|
|
|
- @confirm="onDrawerConfirm"
|
|
|
- @cancel="drawer = false"
|
|
|
- />
|
|
|
+ <drawer-item v-if="drawer" :drawerPropsData="drawerPropsData"/>
|
|
|
</el-drawer>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
- import { examElKnowledgePointTreeList, examElDisciplineTypeList } from '@/api/safetyEducationExaminationNew/index'
|
|
|
+ import {
|
|
|
+ examElPaperAdd,examElPaperEdit,examElKnowledgePointTreeList,examElPaperDetail,
|
|
|
+ examElDisciplineTypeList,examElQuestionBankKnowledgePointCount
|
|
|
+ } from '@/api/safetyEducationExaminationNew/index'
|
|
|
import drawerItem from './drawerItem.vue'
|
|
|
+ import { accAdd,accMul } from '@/utils/calculation'
|
|
|
|
|
|
export default {
|
|
|
name: 'addPage',
|
|
|
@@ -323,54 +328,70 @@
|
|
|
const validateData = (rule, value, callback) => {
|
|
|
if (value == 0) {
|
|
|
callback(new Error('总分数不能为0'))
|
|
|
- } else if (this.newData.data3 > value) {
|
|
|
+ } else if (this.newData.passScore > value) {
|
|
|
callback(new Error('总分数不能小于及格分数'))
|
|
|
} else {
|
|
|
callback()
|
|
|
}
|
|
|
}
|
|
|
+ const validateData1 = (rule, value, callback) => {
|
|
|
+ if (value == 0) {
|
|
|
+ callback(new Error('及格分数不能为0'))
|
|
|
+ } else if (this.newData.passScore > value) {
|
|
|
+ callback(new Error('及格分数不能大于总分数'))
|
|
|
+ } else {
|
|
|
+ callback()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ const validateData2 = (rule, value, callback) => {
|
|
|
+ if (value == 0) {
|
|
|
+ callback(new Error('答题时间不能为0'))
|
|
|
+ } else {
|
|
|
+ callback()
|
|
|
+ }
|
|
|
+ }
|
|
|
return {
|
|
|
+ totalQuestionCount:0,
|
|
|
+ totalScore:0,
|
|
|
newData: {
|
|
|
- data1: '',
|
|
|
- data2: 0,
|
|
|
- data3: 0,
|
|
|
- data4: 0,
|
|
|
- data5: null,
|
|
|
- data6: true,
|
|
|
- data7: 1,
|
|
|
- data8: []
|
|
|
+ paperName: '',
|
|
|
+ totalScore: 0,
|
|
|
+ passScore: 0,
|
|
|
+ answerDuration: 0,
|
|
|
+ disciplineTypeId: null,
|
|
|
+ shareStatus: true,
|
|
|
+ assemblyMode: 1,
|
|
|
+ knowledgePointId: []
|
|
|
},
|
|
|
rules: {
|
|
|
- data1: [
|
|
|
+ paperName: [
|
|
|
{ required: true, message: '请输入试卷名称', trigger: 'blur' }
|
|
|
],
|
|
|
- data2: [
|
|
|
+ totalScore: [
|
|
|
{ required: true, message: '请输入总分数', trigger: 'blur' },
|
|
|
{ validator: validateData, trigger: 'blur' }
|
|
|
],
|
|
|
- data3: [
|
|
|
- { required: true, message: '请输入及格分数', trigger: 'blur' }
|
|
|
+ passScore: [
|
|
|
+ { required: true, message: '请输入及格分数', trigger: 'blur' },
|
|
|
+ { validator: validateData1, trigger: 'blur' }
|
|
|
],
|
|
|
- data4: [
|
|
|
- { required: true, message: '请输入答题时间', trigger: 'blur' }
|
|
|
+ answerDuration: [
|
|
|
+ { required: true, message: '请输入答题时间', trigger: 'blur' },
|
|
|
+ { validator: validateData2, trigger: 'blur' }
|
|
|
],
|
|
|
- data7: [
|
|
|
+ assemblyMode: [
|
|
|
{ required: true, message: '请选择组卷方式', trigger: 'change' }
|
|
|
],
|
|
|
- data8: [
|
|
|
+ knowledgePointId: [
|
|
|
{ required: true, message: '请选择知识点', trigger: 'change' }
|
|
|
]
|
|
|
},
|
|
|
optionListA: [],
|
|
|
optionListKnowledge: [],
|
|
|
- selectedKnowledgePoints: [],
|
|
|
+ fixedKnowledgePointConfigs: [],
|
|
|
//弹窗相关
|
|
|
drawer: false,
|
|
|
- drawerKnowledgeName: '',
|
|
|
- drawerKnowledgeId: null,
|
|
|
- drawerScorePerQuestion: 1,
|
|
|
- drawerInitSelected: [],
|
|
|
- drawerCurrentIndex: -1,
|
|
|
+ drawerPropsData:{},
|
|
|
//拖拽相关
|
|
|
dragInfo: {
|
|
|
type: null, // 'big' 或 'small'
|
|
|
@@ -380,16 +401,9 @@
|
|
|
}
|
|
|
},
|
|
|
computed: {
|
|
|
- totalQuestionCount() {
|
|
|
- return this.selectedKnowledgePoints.reduce((sum, item) => sum + (Number(item.fixedCount) || 0), 0)
|
|
|
- },
|
|
|
- totalScore() {
|
|
|
- return this.selectedKnowledgePoints.reduce((sum, item) => {
|
|
|
- return sum + (Number(item.fixedCount) || 0) * (Number(item.scorePerQuestion) || 0)
|
|
|
- }, 0)
|
|
|
- },
|
|
|
remainScore() {
|
|
|
- return Math.max(0, Number(this.newData.data2 || 0) - this.totalScore)
|
|
|
+ // return Math.max(0, Number(this.newData.totalScore || 0) - this.totalScore)
|
|
|
+ return Number(this.newData.totalScore || 0) - this.totalScore
|
|
|
}
|
|
|
},
|
|
|
mounted() {
|
|
|
@@ -398,9 +412,100 @@
|
|
|
this.examElDisciplineTypeList()
|
|
|
},
|
|
|
methods: {
|
|
|
+ //弹窗返回
|
|
|
+ drawerReturnButton(){
|
|
|
+ this.$refs.drawer.closeDrawer();
|
|
|
+ },
|
|
|
+ //弹窗确定
|
|
|
+ drawerConfirmButton(obj){
|
|
|
+ this.fixedKnowledgePointConfigs[obj.index].questionIds = [...obj.questionIds]
|
|
|
+ this.calculationMaxData();
|
|
|
+ this.$refs.drawer.closeDrawer();
|
|
|
+ },
|
|
|
initialize() {
|
|
|
- if (this.propsData && this.propsData.id) {
|
|
|
- this.newData = { ...this.propsData }
|
|
|
+ let self = this;
|
|
|
+ if (this.propsData.id) {
|
|
|
+ examElPaperDetail({id:this.propsData.id}).then(response => {
|
|
|
+ let obj = {
|
|
|
+ id:this.propsData.id,
|
|
|
+ paperName:response.data.paperName,
|
|
|
+ totalScore:response.data.totalScore,
|
|
|
+ passScore:response.data.passScore,
|
|
|
+ answerDuration:response.data.answerDuration,
|
|
|
+ disciplineTypeId:response.data.disciplineTypeId,
|
|
|
+ shareStatus:response.data.shareStatus,
|
|
|
+ assemblyMode:response.data.assemblyMode,
|
|
|
+ knowledgePointId:[],
|
|
|
+ };
|
|
|
+ let list = [];
|
|
|
+ if(response.data.assemblyMode == 1){
|
|
|
+ for(let i=0;i<response.data.fixedKnowledgePointDetails.length;i++){
|
|
|
+ obj.knowledgePointId.push(response.data.fixedKnowledgePointDetails[i].knowledgePointId)
|
|
|
+ list.push({
|
|
|
+ id: response.data.fixedKnowledgePointDetails[i].knowledgePointId,
|
|
|
+ name:response.data.fixedKnowledgePointDetails[i].knowledgePointName,
|
|
|
+ rollerType: true,
|
|
|
+ questionIds: response.data.fixedKnowledgePointDetails[i].questionIds,
|
|
|
+ questionScore: response.data.fixedKnowledgePointDetails[i].questionScore,//每题分数
|
|
|
+ fixedCount: response.data.fixedKnowledgePointDetails[i].questionIds.length,//选题数量
|
|
|
+ questionTotalCount:response.data.fixedKnowledgePointDetails[i].questionTotalCount,
|
|
|
+ singleQuestionCount:0,
|
|
|
+ multipleQuestionCount:0,
|
|
|
+ judgeQuestionCount:0,
|
|
|
+ scoreA:0,
|
|
|
+ checkNumA:0,
|
|
|
+ scoreB:0,
|
|
|
+ checkNumB:0,
|
|
|
+ scoreC:0,
|
|
|
+ checkNumC:0,
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }else if(response.data.assemblyMode == 2){
|
|
|
+ for(let i=0;i<response.data.randomKnowledgePointDetails.length;i++){
|
|
|
+ obj.knowledgePointId.push(response.data.randomKnowledgePointDetails[i].knowledgePointId)
|
|
|
+ let minObj = {
|
|
|
+ id: response.data.randomKnowledgePointDetails[i].knowledgePointId,
|
|
|
+ name:response.data.randomKnowledgePointDetails[i].knowledgePointName,
|
|
|
+ rollerType: true,
|
|
|
+ questionIds: [],
|
|
|
+ questionScore: 0,//每题分数
|
|
|
+ fixedCount: 0,//选题数量
|
|
|
+ questionTotalCount:response.data.randomKnowledgePointDetails[i].questionTotalCount,
|
|
|
+ singleQuestionCount:0,
|
|
|
+ multipleQuestionCount:0,
|
|
|
+ judgeQuestionCount:0,
|
|
|
+ scoreA:0,
|
|
|
+ checkNumA:0,
|
|
|
+ scoreB:0,
|
|
|
+ checkNumB:0,
|
|
|
+ scoreC:0,
|
|
|
+ checkNumC:0,
|
|
|
+ }
|
|
|
+ for(let o=0;o<response.data.randomKnowledgePointDetails[i].rules.length;o++){
|
|
|
+ if(response.data.randomKnowledgePointDetails[i].rules[o].questionType == 1){
|
|
|
+ minObj.singleQuestionCount = response.data.randomKnowledgePointDetails[i].rules[o].questionTotalCount
|
|
|
+ minObj.scoreA = response.data.randomKnowledgePointDetails[i].rules[o].questionScore
|
|
|
+ minObj.checkNumA = response.data.randomKnowledgePointDetails[i].rules[o].questionCount
|
|
|
+ }
|
|
|
+ if(response.data.randomKnowledgePointDetails[i].rules[o].questionType == 2){
|
|
|
+ minObj.multipleQuestionCount = response.data.randomKnowledgePointDetails[i].rules[o].questionTotalCount
|
|
|
+ minObj.scoreB = response.data.randomKnowledgePointDetails[i].rules[o].questionScore
|
|
|
+ minObj.checkNumB = response.data.randomKnowledgePointDetails[i].rules[o].questionCount
|
|
|
+ }
|
|
|
+ if(response.data.randomKnowledgePointDetails[i].rules[o].questionType == 3){
|
|
|
+ minObj.judgeQuestionCount = response.data.randomKnowledgePointDetails[i].rules[o].questionTotalCount
|
|
|
+ minObj.scoreC = response.data.randomKnowledgePointDetails[i].rules[o].questionScore
|
|
|
+ minObj.checkNumC = response.data.randomKnowledgePointDetails[i].rules[o].questionCount
|
|
|
+ }
|
|
|
+ }
|
|
|
+ list.push(minObj);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.$set(this,'newData',obj);
|
|
|
+ this.$set(this,'fixedKnowledgePointConfigs',list);
|
|
|
+ this.calculationMaxData();
|
|
|
+ this.$forceUpdate();
|
|
|
+ })
|
|
|
}
|
|
|
},
|
|
|
backPage() {
|
|
|
@@ -410,26 +515,102 @@
|
|
|
this.$set(this, 'drawer', true)
|
|
|
},
|
|
|
submitButton() {
|
|
|
- this.$refs.form.validate(valid => {
|
|
|
- if (!valid) return
|
|
|
- // TODO: 调用保存接口
|
|
|
+ let self = this;
|
|
|
+ this.$refs["form"].validate(valid => {
|
|
|
+ if (valid) {
|
|
|
+ if(this.remainScore != 0){
|
|
|
+ this.msgError('总分数与试题分数不一致')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ this.$confirm('是否确认保存?', "警告", {
|
|
|
+ confirmButtonText: "确定",
|
|
|
+ cancelButtonText: "取消",
|
|
|
+ type: "warning"
|
|
|
+ }).then(function() {
|
|
|
+ }).then(() => {
|
|
|
+ self.dataIntegration();
|
|
|
+ }).catch(() => {});
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ },
|
|
|
+ dataIntegration(){
|
|
|
+ let self = this;
|
|
|
+ let obj = {
|
|
|
+ paperName:this.newData.paperName,
|
|
|
+ totalScore:this.newData.totalScore,
|
|
|
+ passScore:this.newData.passScore,
|
|
|
+ answerDuration:this.newData.answerDuration,
|
|
|
+ disciplineTypeId:this.newData.disciplineTypeId,
|
|
|
+ shareStatus:this.newData.shareStatus,
|
|
|
+ assemblyMode:this.newData.assemblyMode,
|
|
|
+ fixedKnowledgePointConfigs:[],
|
|
|
+ randomKnowledgePointConfigs:[],
|
|
|
+ };
|
|
|
+ for(let i=0;i<self.fixedKnowledgePointConfigs.length;i++){
|
|
|
+ if(this.newData.assemblyMode == 1){
|
|
|
+ obj.fixedKnowledgePointConfigs.push({
|
|
|
+ knowledgePointId:self.fixedKnowledgePointConfigs[i].id,
|
|
|
+ questionScore:self.fixedKnowledgePointConfigs[i].questionScore,
|
|
|
+ questionIds:self.fixedKnowledgePointConfigs[i].questionIds,
|
|
|
+ })
|
|
|
+ }else if(this.newData.assemblyMode == 2){
|
|
|
+ obj.randomKnowledgePointConfigs.push({
|
|
|
+ knowledgePointId:self.fixedKnowledgePointConfigs[i].id,
|
|
|
+ rules:[
|
|
|
+ {
|
|
|
+ questionType:1,
|
|
|
+ questionCount:self.fixedKnowledgePointConfigs[i].scoreA,
|
|
|
+ questionScore:self.fixedKnowledgePointConfigs[i].checkNumA,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ questionType:2,
|
|
|
+ questionCount:self.fixedKnowledgePointConfigs[i].scoreB,
|
|
|
+ questionScore:self.fixedKnowledgePointConfigs[i].checkNumB,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ questionType:3,
|
|
|
+ questionCount:self.fixedKnowledgePointConfigs[i].scoreC,
|
|
|
+ questionScore:self.fixedKnowledgePointConfigs[i].checkNumC,
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (this.newData.id){
|
|
|
+ obj.id = this.newData.id;
|
|
|
+ this.examElPaperEdit(obj);
|
|
|
+ }else{
|
|
|
+ this.examElPaperAdd(obj);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ examElPaperAdd(obj){
|
|
|
+ examElPaperAdd(obj).then(response => {
|
|
|
+ this.msgSuccess(response.message);
|
|
|
+ this.$parent.tableButton(6);
|
|
|
+ })
|
|
|
+ },
|
|
|
+ examElPaperEdit(obj){
|
|
|
+ examElPaperEdit(obj).then(response => {
|
|
|
+ this.msgSuccess(response.message);
|
|
|
+ this.$parent.tableButton(6);
|
|
|
})
|
|
|
},
|
|
|
//收起展开
|
|
|
rollerButton(idnex){
|
|
|
- this.$set(this.selectedKnowledgePoints[idnex],'rollerType',!this.selectedKnowledgePoints[idnex].rollerType);
|
|
|
+ this.$set(this.fixedKnowledgePointConfigs[idnex],'rollerType',!this.fixedKnowledgePointConfigs[idnex].rollerType);
|
|
|
},
|
|
|
//change触发过滤知识点列表
|
|
|
onKnowledgeSelect(val) {
|
|
|
if (!Array.isArray(val)) return
|
|
|
- for (let i = this.selectedKnowledgePoints.length - 1; i >= 0; i--) {
|
|
|
- const currentItem = this.selectedKnowledgePoints[i]
|
|
|
+ for (let i = this.fixedKnowledgePointConfigs.length - 1; i >= 0; i--) {
|
|
|
+ const currentItem = this.fixedKnowledgePointConfigs[i]
|
|
|
if (!val.includes(currentItem.id)) {
|
|
|
- this.selectedKnowledgePoints.splice(i, 1)
|
|
|
+ this.fixedKnowledgePointConfigs.splice(i, 1)
|
|
|
}
|
|
|
}
|
|
|
val.forEach(id => {
|
|
|
- const exists = this.selectedKnowledgePoints.some(item => item.id === id)
|
|
|
+ const exists = this.fixedKnowledgePointConfigs.some(item => item.id === id)
|
|
|
if (!exists) {
|
|
|
const node = this.$refs.knowledgeCascader.getCheckedNodes()
|
|
|
let name = ''
|
|
|
@@ -438,76 +619,43 @@
|
|
|
name = node[i].label
|
|
|
}
|
|
|
}
|
|
|
- this.selectedKnowledgePoints.push({
|
|
|
- id: id,
|
|
|
- name,
|
|
|
- rollerType: true,
|
|
|
- dataList: [],
|
|
|
- questionCount: 0,
|
|
|
- scorePerQuestion: 0,
|
|
|
- fixedCount: 0,
|
|
|
- maxNumA:0,
|
|
|
- scoreA:0,
|
|
|
- checkNumA:0,
|
|
|
- maxNumB:0,
|
|
|
- scoreB:0,
|
|
|
- checkNumB:0,
|
|
|
- maxNumC:0,
|
|
|
- scoreC:0,
|
|
|
- checkNumC:0,
|
|
|
- })
|
|
|
+ this.examElQuestionBankKnowledgePointCount(name,id);
|
|
|
}
|
|
|
})
|
|
|
},
|
|
|
- changeScore(index, delta) {
|
|
|
- const val = (Number(this.selectedKnowledgePoints[index].scorePerQuestion) || 0) + delta
|
|
|
- this.selectedKnowledgePoints[index].scorePerQuestion = Math.max(0, val)
|
|
|
- },
|
|
|
- minChangeScore(index, delta,type) {
|
|
|
- let val = 0;
|
|
|
- if(type == 1){
|
|
|
- val = (Number(this.selectedKnowledgePoints[index].scoreA) || 0) + delta
|
|
|
- this.selectedKnowledgePoints[index].scoreA = Math.max(0, val)
|
|
|
- }else if(type == 2){
|
|
|
- val = (Number(this.selectedKnowledgePoints[index].scoreB) || 0) + delta
|
|
|
- this.selectedKnowledgePoints[index].scoreB = Math.max(0, val)
|
|
|
- }else if(type == 3){
|
|
|
- val = (Number(this.selectedKnowledgePoints[index].scoreC) || 0) + delta
|
|
|
- this.selectedKnowledgePoints[index].scoreC = Math.max(0, val)
|
|
|
- }
|
|
|
+ //查询知识点题目数量
|
|
|
+ examElQuestionBankKnowledgePointCount(name,id) {
|
|
|
+ examElQuestionBankKnowledgePointCount({knowledgePointId:id}).then(response => {
|
|
|
+ this.fixedKnowledgePointConfigs.push({
|
|
|
+ id: id,
|
|
|
+ name,
|
|
|
+ rollerType: true,
|
|
|
+ questionIds: [],
|
|
|
+ questionScore: 0,//每题分数
|
|
|
+ fixedCount: 0,//选题数量
|
|
|
+ questionTotalCount:response.data.questionTotalCount,//试题总量
|
|
|
+ singleQuestionCount:response.data.singleQuestionCount,//单选
|
|
|
+ multipleQuestionCount:response.data.multipleQuestionCount,//多选
|
|
|
+ judgeQuestionCount:response.data.judgeQuestionCount,//判断
|
|
|
+ scoreA:0,
|
|
|
+ checkNumA:0,
|
|
|
+ scoreB:0,
|
|
|
+ checkNumB:0,
|
|
|
+ scoreC:0,
|
|
|
+ checkNumC:0,
|
|
|
+ })
|
|
|
+ })
|
|
|
},
|
|
|
addFixed(index) {
|
|
|
- const item = this.selectedKnowledgePoints[index]
|
|
|
- this.drawerCurrentIndex = index
|
|
|
- this.drawerKnowledgeName = item.name
|
|
|
- this.drawerKnowledgeId = item.id
|
|
|
- this.drawerScorePerQuestion = Number(item.scorePerQuestion) || 1
|
|
|
- this.drawerInitSelected = item.fixedList ? [...item.fixedList] : []
|
|
|
+ this.$set(this,'drawerPropsData',{
|
|
|
+ titleName:this.fixedKnowledgePointConfigs[index].name,
|
|
|
+ knowledgePointId:this.fixedKnowledgePointConfigs[index].id,
|
|
|
+ maxScore:this.remainScore,
|
|
|
+ questionIds:this.fixedKnowledgePointConfigs[index].questionIds,
|
|
|
+ index:index
|
|
|
+ });
|
|
|
this.drawer = true
|
|
|
},
|
|
|
- onDrawerConfirm(list) {
|
|
|
- if (this.drawerCurrentIndex >= 0) {
|
|
|
- const item = this.selectedKnowledgePoints[this.drawerCurrentIndex]
|
|
|
- item.fixedList = list
|
|
|
- item.fixedCount = list.length
|
|
|
- this.$set(this.selectedKnowledgePoints, this.drawerCurrentIndex, { ...item })
|
|
|
- }
|
|
|
- this.drawer = false
|
|
|
- },
|
|
|
- //数字过滤
|
|
|
- handleInput(type, val) {
|
|
|
- if (type == 1) {
|
|
|
- this.newData.data2 = val.replace(/[^\d]/g, '')
|
|
|
- } else if (type == 2) {
|
|
|
- this.newData.data3 = val.replace(/[^\d]/g, '')
|
|
|
- } else if (type == 3) {
|
|
|
- this.newData.data4 = val.replace(/[^\d]/g, '')
|
|
|
- }
|
|
|
- },
|
|
|
- //及格分判断
|
|
|
- validateData2() {
|
|
|
- this.$refs.form && this.$refs.form.validateField('data2')
|
|
|
- },
|
|
|
// ========== 大项拖拽逻辑 ==========
|
|
|
onBigDragStart(e, index) {
|
|
|
this.dragInfo = { type: 'big', bigIndex: index, smallIndex: null }
|
|
|
@@ -526,8 +674,8 @@
|
|
|
if (sourceIndex === targetIndex) return
|
|
|
|
|
|
// 核心:交换数组元素
|
|
|
- const movedItem = this.selectedKnowledgePoints.splice(sourceIndex, 1)[0]
|
|
|
- this.selectedKnowledgePoints.splice(targetIndex, 0, movedItem)
|
|
|
+ const movedItem = this.fixedKnowledgePointConfigs.splice(sourceIndex, 1)[0]
|
|
|
+ this.fixedKnowledgePointConfigs.splice(targetIndex, 0, movedItem)
|
|
|
},
|
|
|
// 拖拽结束,清理样式
|
|
|
onDragEnd(e) {
|
|
|
@@ -554,6 +702,47 @@
|
|
|
this.$set(this, 'optionListKnowledge', list)
|
|
|
})
|
|
|
},
|
|
|
+ //计算总分总题
|
|
|
+ calculationMaxData(){
|
|
|
+ let self = this;
|
|
|
+ let totalQuestionCount = 0;
|
|
|
+ let totalScore = 0;
|
|
|
+ for(let i=0;i<self.fixedKnowledgePointConfigs.length;i++){
|
|
|
+ if(self.newData.assemblyMode == 1){
|
|
|
+ //固定组卷
|
|
|
+ totalQuestionCount = self.accAdd(totalQuestionCount,self.fixedKnowledgePointConfigs[i].questionIds.length)
|
|
|
+ let minTotalScore = self.accMul(self.fixedKnowledgePointConfigs[i].questionScore,self.fixedKnowledgePointConfigs[i].questionIds.length);
|
|
|
+ totalScore = self.accAdd(totalScore,minTotalScore)
|
|
|
+ }else if(self.newData.assemblyMode == 2){
|
|
|
+ let numA = self.accMul(self.fixedKnowledgePointConfigs[i].scoreA,self.fixedKnowledgePointConfigs[i].checkNumA);
|
|
|
+ let numB = self.accMul(self.fixedKnowledgePointConfigs[i].scoreB,self.fixedKnowledgePointConfigs[i].checkNumB);
|
|
|
+ let numC = self.accMul(self.fixedKnowledgePointConfigs[i].scoreC,self.fixedKnowledgePointConfigs[i].checkNumC);
|
|
|
+ totalScore = self.accAdd(totalScore,numA)
|
|
|
+ totalScore = self.accAdd(totalScore,numB)
|
|
|
+ totalScore = self.accAdd(totalScore,numC)
|
|
|
+ totalQuestionCount = self.accAdd(totalQuestionCount,self.fixedKnowledgePointConfigs[i].checkNumA)
|
|
|
+ totalQuestionCount = self.accAdd(totalQuestionCount,self.fixedKnowledgePointConfigs[i].checkNumB)
|
|
|
+ totalQuestionCount = self.accAdd(totalQuestionCount,self.fixedKnowledgePointConfigs[i].checkNumC)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.$set(this,'totalQuestionCount',totalQuestionCount);
|
|
|
+ this.$set(this,'totalScore',totalScore);
|
|
|
+ },
|
|
|
+ //乘法
|
|
|
+ accMul(arg1,arg2){
|
|
|
+ var m=0,s1=arg1.toString(),s2=arg2.toString();
|
|
|
+ try{m+=s1.split(".")[1].length}catch(e){}
|
|
|
+ try{m+=s2.split(".")[1].length}catch(e){}
|
|
|
+ return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)
|
|
|
+ },
|
|
|
+ //加法
|
|
|
+ accAdd(arg1,arg2){
|
|
|
+ var r1,r2,m;
|
|
|
+ try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
|
|
|
+ try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
|
|
|
+ m=Math.pow(10,Math.max(r1,r2))
|
|
|
+ return ((arg1*m+arg2*m)/m).toFixed(0);
|
|
|
+ },
|
|
|
}
|
|
|
}
|
|
|
</script>
|
|
|
@@ -898,3 +1087,13 @@
|
|
|
}
|
|
|
}
|
|
|
</style>
|
|
|
+<style lang="scss">
|
|
|
+ .testPaper-select-drawer{
|
|
|
+ .el-drawer__body{
|
|
|
+ padding:0;
|
|
|
+ }
|
|
|
+ .el-drawer__header{
|
|
|
+ margin:0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+</style>
|