426 lines
12 KiB
Vue
426 lines
12 KiB
Vue
<template>
|
||
<view class="todo-page" style="padding-bottom: 80px;">
|
||
<view class="background"></view>
|
||
<view class="video" v-if="filepath.length > 0&&isOnline">
|
||
<uni-card margin="0" :is-shadow="true">
|
||
<u--form labelPosition="left" labelWidth="auto" labelAlign="center" ref="wForm" errorType="border-bottom">
|
||
<video id="myVideo" @ended="onEnd()" @timeupdate="onTimeUpdate" :src="filepaths" controls></video>
|
||
</u--form>
|
||
</uni-card>
|
||
</view>
|
||
<view v-if="isVodeoEnd" class="card">
|
||
<u--form labelPosition="left" labelWidth="auto" labelAlign="center" errorType="border-bottom" ref="sForm" class="demo-ruleForm">
|
||
<view style="position: relative;">
|
||
<view style="position: absolute;left: -10px;color: #3d4b70;top: -3px;">*</view>
|
||
</view>
|
||
|
||
<view style="font-size: 15px; font-weight: bold;color: #3d4b70;margin-bottom: 10px;">培训教育在线答题</view>
|
||
<view v-for="(item, index) in papers" :key="index" style="border-bottom: #ceccca 1px dashed;margin-bottom: 10px;padding-bottom: 10px;">
|
||
|
||
<u-form-item>
|
||
<view class="uni-flex uni-column">
|
||
<view style="margin-bottom: 10px;">{{(index + 1) + '. ' + item.Nav_Test.NAME + getType(item)}}
|
||
</view>
|
||
<view>
|
||
<u-radio-group v-if="item.Nav_Test.TYPE == 0" v-model="item.ANSWER1" placement="column">
|
||
<u-radio :customStyle="{marginBottom: '4px',marginTop: '4px'}" v-for="(item1, index1) in radiolist1" :key="index1" :label="item1.name" :name="item1.name"
|
||
@change="doOptionChange(index1, item, 1)" :disabled="readonly" />
|
||
</u-radio-group>
|
||
<u-radio-group v-if="item.Nav_Test.TYPE == 1" v-model="item.ANSWER2" placement="column">
|
||
<u-radio :customStyle="{marginBottom: '4px',marginTop: '4px'}" v-for="(item2, index2) in radiolist2[item.ID]" :key="index2" :label="item2.name" :name="item2.name"
|
||
@change="doOptionChange(index2, item, 1 << index2)" :disabled="readonly" />
|
||
</u-radio-group>
|
||
<u-checkbox-group v-if="item.Nav_Test.TYPE == 2" v-model="item.ANSWER3" @change="checkboxChange($event, item)" placement="column">
|
||
<u-checkbox :customStyle="{marginBottom: '4px',marginTop: '4px'}" v-for="(item3, index3) in radiolist2[item.ID]" :key="index3" :label="item3.name" :name="item3.name"
|
||
:disabled="readonly">
|
||
</u-checkbox>
|
||
</u-checkbox-group>
|
||
</view>
|
||
</view>
|
||
</u-form-item>
|
||
</view>
|
||
</u--form>
|
||
</view>
|
||
<view class="bottom-button">
|
||
<button type="primary" v-if="tableKey == 1" @click="submit" :disabled="!isVodeoEnd">提交问卷</button>
|
||
</view>
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
import {
|
||
mapState,
|
||
mapMutations
|
||
} from 'vuex';
|
||
import {
|
||
extendFilterGroup,
|
||
extendGroupRule,
|
||
extendInclude,
|
||
extendOrder,
|
||
extendRule,
|
||
guid,
|
||
initFilter,
|
||
initFilterGroup,
|
||
formatSeconds
|
||
} from '../../../../utils/common';
|
||
import {
|
||
getRequest,
|
||
} from '../../../../services/apply/FOServices/FOServices';
|
||
import {
|
||
GetSource,
|
||
SavePapers
|
||
} from '../../../../services/apply/subPages/scWB';
|
||
import config from '../../../../config/common';
|
||
|
||
export default {
|
||
data() {
|
||
return {
|
||
model: {
|
||
ORG_ID: "",
|
||
},
|
||
SOURCE_ID: '',
|
||
papers: [],
|
||
res: [],
|
||
viewAll: false,
|
||
filepath: '',
|
||
notify: null,
|
||
UserList: [],
|
||
SelUsrID: null,
|
||
config: null,
|
||
score: 0,
|
||
END_TIME: null,
|
||
readonly: true,
|
||
loading: false,
|
||
tableKey: '0',
|
||
isHaseV: true,
|
||
isVodeoEnd: false, //是否显示题目
|
||
radiolist1: [{
|
||
name: '正确',
|
||
disabled: false
|
||
},
|
||
{
|
||
name: '错误',
|
||
disabled: false
|
||
},
|
||
],
|
||
radiolist2: {},
|
||
radiovalue1: "错误",
|
||
checkbox: [],
|
||
TaskID: '',
|
||
SelUsrNAME: '',
|
||
ORG_ID: uni.getStorageSync('orgId'),
|
||
JOBID: '',
|
||
progress: 0,
|
||
currentTime: '',
|
||
allTime: '',
|
||
lastTime: 0
|
||
}
|
||
},
|
||
onLoad(option) {
|
||
this.TaskID = option.taskID ? option.taskID : '';
|
||
this.model.ID = option.ID ? option.ID : '';
|
||
this.JOBID = option.ID ? option.ID : '';
|
||
this.tableKey = option.tableKey ? option.tableKey : '0'
|
||
this.loadData();
|
||
},
|
||
methods: {
|
||
loadData() {
|
||
let json = initFilter(this.ORG_ID, this.model.ID);
|
||
extendRule(json, 'ID', 1, this.model.ID);
|
||
GetSource(json).then(ret => {
|
||
if (ret) {
|
||
var filepath = ''
|
||
var isOnline = false
|
||
var papers = []
|
||
var SOURCE_ID = ''
|
||
var readonly = true
|
||
var isVodeoEnd = true
|
||
this.res = ret
|
||
|
||
ret.Nav_ListUserPaper.forEach(ele => {
|
||
if ((SOURCE_ID == '') && (ele.ANSWER == null || ele.ANSWER == 0)) {
|
||
SOURCE_ID = ele.SOURCE_ID
|
||
readonly = false
|
||
isVodeoEnd = false
|
||
}
|
||
if (SOURCE_ID.length > 0 && ele.SOURCE_ID == SOURCE_ID) {
|
||
papers.push(ele)
|
||
isOnline = ele.IS_ONLINE
|
||
if (isOnline == true && filepath == '') {
|
||
filepath = ele.FILE_PATH
|
||
}
|
||
}
|
||
});
|
||
|
||
if (SOURCE_ID == "") {
|
||
papers = ret.Nav_ListUserPaper
|
||
}
|
||
if (filepath == null || filepath == "") {
|
||
isVodeoEnd = true
|
||
}
|
||
|
||
this.papers = papers
|
||
this.isOnline = isOnline
|
||
this.readonly = readonly
|
||
this.SOURCE_ID = SOURCE_ID
|
||
this.filepath = filepath
|
||
this.filepaths = config.uni_app_web_source_url + filepath
|
||
this.isVodeoEnd = isVodeoEnd
|
||
|
||
this.papers.forEach(item => {
|
||
let test = {}
|
||
if (item.Nav_Test.TYPE != 0) {
|
||
this.radiolist2[item.ID] = [];
|
||
this.radiolist2[item.ID].push({
|
||
name: item.Nav_Test.OPTION_A
|
||
}, {
|
||
name: item.Nav_Test.OPTION_B
|
||
}, {
|
||
name: item.Nav_Test.OPTION_C
|
||
}, )
|
||
if (item.Nav_Test.OPTION_D != undefined && item.Nav_Test.OPTION_D != "") {
|
||
this.radiolist2[item.ID].push({
|
||
name: item.Nav_Test.OPTION_D
|
||
})
|
||
}
|
||
if (item.Nav_Test.OPTION_E != undefined && item.Nav_Test.OPTION_E != "") {
|
||
this.radiolist2[item.ID].push({
|
||
name: item.Nav_Test.OPTION_E
|
||
})
|
||
}
|
||
}
|
||
})
|
||
}
|
||
});
|
||
},
|
||
preventFastForward(e) {
|
||
const currentTime = e.detail.currentTime;
|
||
if (currentTime > this.lastTime + 1) {
|
||
uni.$showErrorInfo('禁止快进');
|
||
const videoContext = uni.createVideoContext('myVideo', this)
|
||
videoContext.seek(this.lastTime);
|
||
} else {
|
||
this.lastTime = currentTime;
|
||
}
|
||
},
|
||
findSelectedOptions(num, OPTION_A, OPTION_B, OPTION_C, OPTION_D, OPTION_E) {
|
||
var optionVars = {
|
||
'A': {
|
||
value: 1,
|
||
variable: OPTION_A
|
||
},
|
||
'B': {
|
||
value: 2,
|
||
variable: OPTION_B
|
||
},
|
||
'C': {
|
||
value: 4,
|
||
variable: OPTION_C
|
||
},
|
||
'D': {
|
||
value: 8,
|
||
variable: OPTION_D
|
||
},
|
||
'E': {
|
||
value: 16,
|
||
variable: OPTION_E
|
||
}
|
||
};
|
||
var selectedVars = [];
|
||
for (var key in optionVars) {
|
||
if ((num & optionVars[key].value) === optionVars[key].value) {
|
||
selectedVars.push(optionVars[key].variable);
|
||
}
|
||
}
|
||
return selectedVars;
|
||
},
|
||
getType(paper) {
|
||
let ret = '';
|
||
let config = this.config;
|
||
switch (paper.Nav_Test.TYPE) {
|
||
case 0:
|
||
ret = `【是非题】(${paper.SCOREVAL}分)`;
|
||
break;
|
||
case 1:
|
||
ret = `【单选题】(${paper.SCOREVAL}分)`;
|
||
break;
|
||
case 2:
|
||
ret = `【多选题】(${paper.SCOREVAL}分)`;
|
||
break;
|
||
}
|
||
return ret;
|
||
},
|
||
doOptionChange(index, item, mask) {
|
||
if (item.Nav_Test.TYPE === 2) {
|
||
item.ANSWER |= mask;
|
||
} else {
|
||
item.ANSWER = mask;
|
||
}
|
||
|
||
if (item.ANSWER == item.Nav_Test.ANSWER) {
|
||
item.SCORE = item.SCOREVAL
|
||
} else {
|
||
item.SCORE = 0
|
||
}
|
||
},
|
||
checkboxChange(arr, item) {
|
||
let indexArr = this.findCommonElementsIndices(arr, this.radiolist2[item.ID])
|
||
item.ANSWER3 = arr;
|
||
item.ANSWER = 0;
|
||
indexArr.forEach(index => {
|
||
if (index == 0) {
|
||
item.ANSWER += 1;
|
||
} else if (index == 1) {
|
||
item.ANSWER += 2;
|
||
} else if (index == 2) {
|
||
item.ANSWER += 4;
|
||
} else if (index == 3) {
|
||
item.ANSWER += 8;
|
||
} else if (index == 4) {
|
||
item.ANSWER += 16;
|
||
} else if (index == 5) {
|
||
item.ANSWER += 32;
|
||
}
|
||
})
|
||
if (item.ANSWER == item.Nav_Test.ANSWER) {
|
||
item.SCORE = item.SCOREVAL
|
||
} else {
|
||
item.SCORE = 0
|
||
}
|
||
},
|
||
findCommonElementsIndices(arr1, arr2) {
|
||
const commonElements = [];
|
||
for (let i = 0; i < arr1.length; i++) {
|
||
for (let j = 0; j < arr2.length; j++) {
|
||
if (arr1[i] === arr2[j].name) {
|
||
commonElements.push(j);
|
||
}
|
||
}
|
||
}
|
||
return commonElements;
|
||
},
|
||
onTimeUpdate(e) {
|
||
const currentTime = e.detail.currentTime;
|
||
if (currentTime > this.lastTime + 1) {
|
||
uni.$showErrorInfo('禁止快进');
|
||
const videoContext = uni.createVideoContext('myVideo', this)
|
||
videoContext.seek(this.lastTime);
|
||
} else {
|
||
this.lastTime = currentTime;
|
||
}
|
||
},
|
||
//播放结束
|
||
onEnd() {
|
||
this.isVodeoEnd = true
|
||
},
|
||
submit() {
|
||
if (this.tableKey != 1) {
|
||
return
|
||
}
|
||
let data = JSON.parse(JSON.stringify(this.papers));
|
||
var ALLSCORE = 0
|
||
var PASSSCORE = 0
|
||
for (let i = 0; i < data.length; i++) {
|
||
if (data[i].ANSWER == 0) {
|
||
uni.$showErrorInfo(`第${i + 1}题尚未选择答题,请完成所有答题后再进行提交`)
|
||
return;
|
||
}
|
||
if (data[i].Nav_Test.TYPE === 2 && ([0, 1, 2, 4, 8].indexOf(data[i].ANSWER) !== -1)) {
|
||
uni.$showErrorInfo(`第${i + 1}题为多选题,请选择至少两个选项`)
|
||
return;
|
||
}
|
||
ALLSCORE += data[i].SCORE
|
||
if (PASSSCORE == 0) {
|
||
PASSSCORE = data[i].Nav_Source.PASSSCORE
|
||
}
|
||
}
|
||
|
||
//没过线继续考
|
||
if (ALLSCORE < PASSSCORE) {
|
||
uni.$showErrorInfo(`分数不通过,请检查后再提交(得分${ALLSCORE}通过分数为${PASSSCORE}分)!`)
|
||
return false;
|
||
} else {
|
||
// 判断是静态切换 还是直接提交
|
||
let dataS = this.res;
|
||
let SOURCE_ID = this.SOURCE_ID;
|
||
if (SOURCE_ID != dataS.Nav_ListUserPaper[dataS.Nav_ListUserPaper.length - 1].SOURCE_ID) {
|
||
// 切换试题
|
||
var filepath = ''
|
||
var isOnline = false
|
||
var papers = []
|
||
var SOURCE_IDNext = ''
|
||
var readonly = true
|
||
dataS.Nav_ListUserPaper.forEach(ele => {
|
||
if ((SOURCE_IDNext == '') && (ele.ANSWER == null || ele.ANSWER == 0)) {
|
||
SOURCE_IDNext = ele.SOURCE_ID
|
||
readonly = false
|
||
}
|
||
if (SOURCE_IDNext.length > 0 && ele.SOURCE_ID == SOURCE_IDNext) {
|
||
papers.push(ele)
|
||
isOnline = ele.IS_ONLINE
|
||
if (isOnline == true && filepath == '') {
|
||
filepath = ele.FILE_PATH
|
||
}
|
||
}
|
||
});
|
||
if (filepath && filepath.length > 1) {
|
||
this.isVodeoEnd = false //继续看视频
|
||
this.filepath = filepath
|
||
this.filepaths = config.uni_app_web_source_url + filepath
|
||
}
|
||
|
||
this.papers = papers
|
||
this.isOnline = isOnline
|
||
this.readonly = readonly
|
||
this.SOURCE_ID = SOURCE_IDNext
|
||
|
||
this.papers.forEach(item => {
|
||
let test = {}
|
||
if (item.Nav_Test.TYPE != 0) {
|
||
this.radiolist2[item.ID] = [];
|
||
this.radiolist2[item.ID].push({
|
||
name: item.Nav_Test.OPTION_A
|
||
}, {
|
||
name: item.Nav_Test.OPTION_B
|
||
}, {
|
||
name: item.Nav_Test.OPTION_C
|
||
}, )
|
||
if (item.Nav_Test.OPTION_D != undefined && item.Nav_Test.OPTION_D != "") {
|
||
this.radiolist2[item.ID].push({
|
||
name: item.Nav_Test.OPTION_D
|
||
})
|
||
}
|
||
if (item.Nav_Test.OPTION_E != undefined && item.Nav_Test.OPTION_E != "") {
|
||
this.radiolist2[item.ID].push({
|
||
name: item.Nav_Test.OPTION_E
|
||
})
|
||
}
|
||
}
|
||
})
|
||
|
||
} else {
|
||
//提交答卷
|
||
var modelR = this.res
|
||
if (this.TaskID != '')
|
||
modelR.TaskID = this.TaskID
|
||
SavePapers(modelR).then(ret => {
|
||
uni.$showMsgFunc('操作成功!', () => {
|
||
uni.navigateBack()
|
||
}, 'success', 1000)
|
||
}).catch(err => {
|
||
if (err.length > 0) {
|
||
uni.$showErrorInfo(err[0].message)
|
||
} else {
|
||
uni.$showErrorInfo('校验失败!')
|
||
}
|
||
})
|
||
}
|
||
}
|
||
},
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style scoped>
|
||
@import url("../../../../style/css/newTemplate.css");
|
||
</style> |