890 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			890 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								<template>
							 | 
						|||
| 
								 | 
							
									<!-- #ifdef APP-PLUS -->
							 | 
						|||
| 
								 | 
							
									<view class="wrap">
							 | 
						|||
| 
								 | 
							
										<view class="player" v-if="filepath.length > 0&&isOnline">
							 | 
						|||
| 
								 | 
							
											<plv-player ref="vod" class="vod-player" seekType="0" autoPlay="true" disableScreenCAP="false" rememberLastPosition="true" @onPlayStatus="onPlayStatus" @onPlayError="onPlayError"
							 | 
						|||
| 
								 | 
							
												@positionChange="positionChange"></plv-player>
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										</view>
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										<view class="controls-contain">
							 | 
						|||
| 
								 | 
							
											<view class="floating-controls">
							 | 
						|||
| 
								 | 
							
												<view class="abs-box">
							 | 
						|||
| 
								 | 
							
													<view style="display: flex;align-items: center;justify-content: center;flex-direction: row;margin-bottom: 5px;">
							 | 
						|||
| 
								 | 
							
														<view @click="togglePlayLow" style="display: flex;flex-direction: row;">
							 | 
						|||
| 
								 | 
							
															<u-icon name="rewind-left" size="26px" color="#fff"></u-icon>
							 | 
						|||
| 
								 | 
							
															<text style="color: #fff;font-size: 12px;">5s</text>
							 | 
						|||
| 
								 | 
							
														</view>
							 | 
						|||
| 
								 | 
							
														<view @click="togglePlay" class="playing-icon">
							 | 
						|||
| 
								 | 
							
															<u-icon name="pause-circle" size="26px" color="#fff" v-if="isPlaying"></u-icon>
							 | 
						|||
| 
								 | 
							
															<u-icon name="play-circle" size="26px" color="#fff" v-else></u-icon>
							 | 
						|||
| 
								 | 
							
														</view>
							 | 
						|||
| 
								 | 
							
														<view @click="togglePlayFast">
							 | 
						|||
| 
								 | 
							
															<u-icon name="rewind-right" size="26px" color="#c4c6c9"></u-icon>
							 | 
						|||
| 
								 | 
							
														</view>
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
													</view>
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
													<view class="progress-container">
							 | 
						|||
| 
								 | 
							
														<view class="time-text">
							 | 
						|||
| 
								 | 
							
															<text style="font-size: 14px;color: #fff;">{{currentTimeText}}</text>
							 | 
						|||
| 
								 | 
							
														</view>
							 | 
						|||
| 
								 | 
							
														<view class="progress-bar" @click="seekByProgressBar($event)">
							 | 
						|||
| 
								 | 
							
															<u-slider v-model="sliderValue " blockSize="12" @change="changeseek"></u-slider>
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
														</view>
							 | 
						|||
| 
								 | 
							
														<view class="time-text">
							 | 
						|||
| 
								 | 
							
															<text style="font-size: 14px;color: #fff;">{{totalTime }}</text>
							 | 
						|||
| 
								 | 
							
														</view>
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
													</view>
							 | 
						|||
| 
								 | 
							
												</view>
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
											</view>
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										</view>
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										<view  v-if="isVodeoEnd" style="background-color: #fff;margin: 20px 20px 0px 20px;padding: 20px;border-radius: 5px;flex: 1;">
							 | 
						|||
| 
								 | 
							
											<scroll-view class="scrollable-content" scroll-y="true" style="flex: 1;" show-scrollbar="false">
							 | 
						|||
| 
								 | 
							
												<u--form labelPosition="left" labelWidth="auto" labelAlign="center" errorType="border-bottom" ref="sForm" class="demo-ruleForm">
							 | 
						|||
| 
								 | 
							
													<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 style="display: flex;flex: 1;">
							 | 
						|||
| 
								 | 
							
															<view style="display: flex; word-wrap: break-word; word-break: break-all;margin-bottom: 10px;white-space: normal;">
							 | 
						|||
| 
								 | 
							
																<text style="font-size: 15px;">
							 | 
						|||
| 
								 | 
							
																	{{(index + 1) + '. ' + item.Nav_Test.NAME + getType(item)}}
							 | 
						|||
| 
								 | 
							
																</text>
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
															</view>
							 | 
						|||
| 
								 | 
							
															<view class="operate-radio">
							 | 
						|||
| 
								 | 
							
																<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',whiteSpace:'normal',wordBreak: 'break-all'}" 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',whiteSpace:'normal !important',wordBreak: 'break-all !important'}" 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>
							 | 
						|||
| 
								 | 
							
											</scroll-view>
							 | 
						|||
| 
								 | 
							
										</view>
							 | 
						|||
| 
								 | 
							
										<view v-else style="flex: 1;display: flex;align-items: center;justify-content: center;">
							 | 
						|||
| 
								 | 
							
											<text style="color: #c4c6c9;font-size: 14px;">视频播放完毕后,开始答题</text>
							 | 
						|||
| 
								 | 
							
										</view>
							 | 
						|||
| 
								 | 
							
										<view class="bottom-button-new">
							 | 
						|||
| 
								 | 
							
											<button type="primary" v-if="tableKey == 1" @click="submit" :disabled="!isVodeoEnd">提交问卷</button>
							 | 
						|||
| 
								 | 
							
										</view>
							 | 
						|||
| 
								 | 
							
									</view>
							 | 
						|||
| 
								 | 
							
									<!-- #endif -->
							 | 
						|||
| 
								 | 
							
									<!-- #ifndef APP-PLUS -->
							 | 
						|||
| 
								 | 
							
									<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">
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
													<view style=" position: relative;z-index: 1;" v-if="polyvy">
							 | 
						|||
| 
								 | 
							
														<webPlayer :src="filepaths" @over="onEnd()"></webPlayer>
							 | 
						|||
| 
								 | 
							
													</view>
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
													<view v-else>
							 | 
						|||
| 
								 | 
							
														<video id="myVideo" @ended="onEnd()" @timeupdate="onTimeUpdate" :src="filepathsWeb" controls></video>
							 | 
						|||
| 
								 | 
							
													</view>
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
												</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 style="display: flex;flex: 1;">
							 | 
						|||
| 
								 | 
							
															<view style="display: flex; word-wrap: break-word; word-break: break-all;margin-bottom: 10px;white-space: normal;">{{(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',whiteSpace:'normal',wordBreak: 'break-all',}" 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',whiteSpace:'normal',wordBreak: 'break-all',}" 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" class="checkbox">
							 | 
						|||
| 
								 | 
							
																	</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>
							 | 
						|||
| 
								 | 
							
									<!-- #endif -->
							 | 
						|||
| 
								 | 
							
								</template>
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								<script>
							 | 
						|||
| 
								 | 
							
									// #ifdef APP-PLUS
							 | 
						|||
| 
								 | 
							
									var configModule = uni.requireNativePlugin("PLV-VodUniPlugin-ConfigModule")
							 | 
						|||
| 
								 | 
							
									// #endif
							 | 
						|||
| 
								 | 
							
									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 webPlayer from './webPlayer'
							 | 
						|||
| 
								 | 
							
									import config from '../../../../config/common';
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									export default {
							 | 
						|||
| 
								 | 
							
										components: {
							 | 
						|||
| 
								 | 
							
											webPlayer, // 注册组件
							 | 
						|||
| 
								 | 
							
										},
							 | 
						|||
| 
								 | 
							
										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: true,
							 | 
						|||
| 
								 | 
							
												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,
							 | 
						|||
| 
								 | 
							
												playerUrl: '',
							 | 
						|||
| 
								 | 
							
												vid: '', // 解析后的视频ID,
							 | 
						|||
| 
								 | 
							
												plvConfig: {
							 | 
						|||
| 
								 | 
							
													userid: "3cbccb39d9",
							 | 
						|||
| 
								 | 
							
													readtoken: "4567132a-70d2-4a92-a1e5-5a417fe4ab5b",
							 | 
						|||
| 
								 | 
							
													writetoken: "007263ef-a7ee-4681-b248-395d1da539b9",
							 | 
						|||
| 
								 | 
							
													secretkey: "WUAYy8sr4"
							 | 
						|||
| 
								 | 
							
												},
							 | 
						|||
| 
								 | 
							
												// 新增状态变量
							 | 
						|||
| 
								 | 
							
												isPlaying: false, // 是否正在播放
							 | 
						|||
| 
								 | 
							
												currentTime: 0, // 当前播放时间(秒)
							 | 
						|||
| 
								 | 
							
												totalTime: 0, // 总时长(秒)
							 | 
						|||
| 
								 | 
							
												currentTimeText: 0,
							 | 
						|||
| 
								 | 
							
												progressPercent: 0, // 进度百分比
							 | 
						|||
| 
								 | 
							
												duration: 0,
							 | 
						|||
| 
								 | 
							
												sliderValue: 0,
							 | 
						|||
| 
								 | 
							
												timeShowBlock: true,
							 | 
						|||
| 
								 | 
							
												now: 'init',
							 | 
						|||
| 
								 | 
							
												filepaths: '',
							 | 
						|||
| 
								 | 
							
												filepathsWeb: '',
							 | 
						|||
| 
								 | 
							
												polyvy: true,
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										},
							 | 
						|||
| 
								 | 
							
										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'
							 | 
						|||
| 
								 | 
							
											// #ifdef APP-PLUS
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
											if (!configModule) {
							 | 
						|||
| 
								 | 
							
												this.$emit('onError', '插件初始化失败');
							 | 
						|||
| 
								 | 
							
												return;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											configModule.setToken({
							 | 
						|||
| 
								 | 
							
												userid: "3cbccb39d9",
							 | 
						|||
| 
								 | 
							
												readtoken: "4567132a-70d2-4a92-a1e5-5a417fe4ab5b",
							 | 
						|||
| 
								 | 
							
												writetoken: "007263ef-a7ee-4681-b248-395d1da539b9",
							 | 
						|||
| 
								 | 
							
												secretkey: "WUAYy8sr4"
							 | 
						|||
| 
								 | 
							
											}, (ret) => {
							 | 
						|||
| 
								 | 
							
												if (!ret.isSuccess) {
							 | 
						|||
| 
								 | 
							
													this.$emit('onError', ret.errMsg);
							 | 
						|||
| 
								 | 
							
												}
							 | 
						|||
| 
								 | 
							
											});
							 | 
						|||
| 
								 | 
							
											this.totalTime = this.formatTime(0);
							 | 
						|||
| 
								 | 
							
											this.currentTimeText = this.formatTime(0)
							 | 
						|||
| 
								 | 
							
											// #endif
							 | 
						|||
| 
								 | 
							
											this.loadData();
							 | 
						|||
| 
								 | 
							
										},
							 | 
						|||
| 
								 | 
							
										watch: {
							 | 
						|||
| 
								 | 
							
											// 监听 filepaths 的变化
							 | 
						|||
| 
								 | 
							
											filepaths(newVal, oldVal) {
							 | 
						|||
| 
								 | 
							
												if (newVal) {
							 | 
						|||
| 
								 | 
							
													const regex = /vid=([^&]+)/;
							 | 
						|||
| 
								 | 
							
													const match = newVal.match(regex);
							 | 
						|||
| 
								 | 
							
													this.vid = match ? match[1] : '';
							 | 
						|||
| 
								 | 
							
													this.now = 'init'
							 | 
						|||
| 
								 | 
							
													if (oldVal !== '') {
							 | 
						|||
| 
								 | 
							
														this.togglePlay()
							 | 
						|||
| 
								 | 
							
													}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
												}
							 | 
						|||
| 
								 | 
							
											},
							 | 
						|||
| 
								 | 
							
										},
							 | 
						|||
| 
								 | 
							
										methods: {
							 | 
						|||
| 
								 | 
							
											togglePlay() {
							 | 
						|||
| 
								 | 
							
												if (this.now == 'init') {
							 | 
						|||
| 
								 | 
							
													this.$refs.vod.setVid({
							 | 
						|||
| 
								 | 
							
															vid: this.vid,
							 | 
						|||
| 
								 | 
							
															level: 0
							 | 
						|||
| 
								 | 
							
														},
							 | 
						|||
| 
								 | 
							
														(ret) => {
							 | 
						|||
| 
								 | 
							
															if (ret.errMsg != null) {
							 | 
						|||
| 
								 | 
							
																uni.showToast({
							 | 
						|||
| 
								 | 
							
																	title: ret.errMsg,
							 | 
						|||
| 
								 | 
							
																	icon: "none"
							 | 
						|||
| 
								 | 
							
																})
							 | 
						|||
| 
								 | 
							
															}
							 | 
						|||
| 
								 | 
							
														})
							 | 
						|||
| 
								 | 
							
													this.now = 'playing'
							 | 
						|||
| 
								 | 
							
												} else {
							 | 
						|||
| 
								 | 
							
													if (this.isPlaying) {
							 | 
						|||
| 
								 | 
							
														// 调用暂停API(需确认保利威插件实际方法名,可能为pause/stop)
							 | 
						|||
| 
								 | 
							
														this.$refs.vod.pause();
							 | 
						|||
| 
								 | 
							
													} else {
							 | 
						|||
| 
								 | 
							
														this.$refs.vod.start();
							 | 
						|||
| 
								 | 
							
													}
							 | 
						|||
| 
								 | 
							
												}
							 | 
						|||
| 
								 | 
							
											},
							 | 
						|||
| 
								 | 
							
											changeseek(e) {
							 | 
						|||
| 
								 | 
							
												// 将0-100的滑块值转换为对应的视频时间(秒)
							 | 
						|||
| 
								 | 
							
												const seekTime = Math.round((e / 100) * this.duration);
							 | 
						|||
| 
								 | 
							
												if (seekTime < this.currentTime) {
							 | 
						|||
| 
								 | 
							
													this.$refs.vod.seekTo({
							 | 
						|||
| 
								 | 
							
															seconds: seekTime
							 | 
						|||
| 
								 | 
							
														},
							 | 
						|||
| 
								 | 
							
														(ret) => {
							 | 
						|||
| 
								 | 
							
															if (ret.errMsg != null) {
							 | 
						|||
| 
								 | 
							
																uni.showToast({
							 | 
						|||
| 
								 | 
							
																	title: ret.errMsg,
							 | 
						|||
| 
								 | 
							
																	icon: "none"
							 | 
						|||
| 
								 | 
							
																})
							 | 
						|||
| 
								 | 
							
															}
							 | 
						|||
| 
								 | 
							
														})
							 | 
						|||
| 
								 | 
							
												} else {
							 | 
						|||
| 
								 | 
							
													uni.$showErrorInfo('培训答题视频禁止快进');
							 | 
						|||
| 
								 | 
							
												}
							 | 
						|||
| 
								 | 
							
											},
							 | 
						|||
| 
								 | 
							
											togglePlayLow() {
							 | 
						|||
| 
								 | 
							
												this.$refs.vod.rewind({
							 | 
						|||
| 
								 | 
							
														seconds: 5
							 | 
						|||
| 
								 | 
							
													},
							 | 
						|||
| 
								 | 
							
													(ret) => {
							 | 
						|||
| 
								 | 
							
														if (ret.errMsg != null) {
							 | 
						|||
| 
								 | 
							
															uni.showToast({
							 | 
						|||
| 
								 | 
							
																title: ret.errMsg,
							 | 
						|||
| 
								 | 
							
																icon: "none"
							 | 
						|||
| 
								 | 
							
															})
							 | 
						|||
| 
								 | 
							
														}
							 | 
						|||
| 
								 | 
							
													})
							 | 
						|||
| 
								 | 
							
											},
							 | 
						|||
| 
								 | 
							
											togglePlayFast() {
							 | 
						|||
| 
								 | 
							
												uni.$showErrorInfo('培训答题视频禁止快进');
							 | 
						|||
| 
								 | 
							
											},
							 | 
						|||
| 
								 | 
							
											setVid() {
							 | 
						|||
| 
								 | 
							
												this.$refs.vod.setVid({
							 | 
						|||
| 
								 | 
							
														vid: this.vid,
							 | 
						|||
| 
								 | 
							
														level: 0
							 | 
						|||
| 
								 | 
							
													},
							 | 
						|||
| 
								 | 
							
													(ret) => {
							 | 
						|||
| 
								 | 
							
														if (ret.errMsg != null) {
							 | 
						|||
| 
								 | 
							
															uni.showToast({
							 | 
						|||
| 
								 | 
							
																title: ret.errMsg,
							 | 
						|||
| 
								 | 
							
																icon: "none"
							 | 
						|||
| 
								 | 
							
															})
							 | 
						|||
| 
								 | 
							
														}
							 | 
						|||
| 
								 | 
							
													})
							 | 
						|||
| 
								 | 
							
											},
							 | 
						|||
| 
								 | 
							
											onPlayStatus(e) {
							 | 
						|||
| 
								 | 
							
												const status = e.detail.playbackState;
							 | 
						|||
| 
								 | 
							
												// 根据保利威状态枚举更新播放状态(需参考插件文档,示例值)
							 | 
						|||
| 
								 | 
							
												this.isPlaying = status == 'start'
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
												// 视频结束时更新状态
							 | 
						|||
| 
								 | 
							
												if (status == 'complete') {
							 | 
						|||
| 
								 | 
							
													this.isPlaying = false;
							 | 
						|||
| 
								 | 
							
													this.isVodeoEnd = true;
							 | 
						|||
| 
								 | 
							
												}
							 | 
						|||
| 
								 | 
							
												if (e.detail.preparedToPlay !== null) {
							 | 
						|||
| 
								 | 
							
													this.updateDuration();
							 | 
						|||
| 
								 | 
							
												}
							 | 
						|||
| 
								 | 
							
												this.$forceUpdate()
							 | 
						|||
| 
								 | 
							
											},
							 | 
						|||
| 
								 | 
							
											updateDuration() {
							 | 
						|||
| 
								 | 
							
												this.$refs.vod.getDuration(null, ret => {
							 | 
						|||
| 
								 | 
							
													this.duration = ret.duration;
							 | 
						|||
| 
								 | 
							
													this.timeShowBlock = ret.duration >= 3600 ? false : true;
							 | 
						|||
| 
								 | 
							
												});
							 | 
						|||
| 
								 | 
							
											},
							 | 
						|||
| 
								 | 
							
											positionChange(e) {
							 | 
						|||
| 
								 | 
							
												this.timeUpdate(e.detail.currentPosition);
							 | 
						|||
| 
								 | 
							
											},
							 | 
						|||
| 
								 | 
							
											timeUpdate(time) {
							 | 
						|||
| 
								 | 
							
												this.currentTime = time;
							 | 
						|||
| 
								 | 
							
												this.updateProgress();
							 | 
						|||
| 
								 | 
							
											},
							 | 
						|||
| 
								 | 
							
											updateProgress(precent) {
							 | 
						|||
| 
								 | 
							
												// this.currentTime = e.detail.currentPosition;
							 | 
						|||
| 
								 | 
							
												this.totalTime = this.formatTime(this.duration);
							 | 
						|||
| 
								 | 
							
												this.currentTimeText = this.formatTime(this.currentTime)
							 | 
						|||
| 
								 | 
							
												// 将当前播放时间(秒)转换为0-100的滑块值
							 | 
						|||
| 
								 | 
							
												this.sliderValue = (this.currentTime / this.duration) * 100;
							 | 
						|||
| 
								 | 
							
												// 计算进度百分比
							 | 
						|||
| 
								 | 
							
												// this.progressPercent = this.duration > 0 ? (this.currentTime / this.duration) * 100 : 0;
							 | 
						|||
| 
								 | 
							
												this.$forceUpdate()
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
											},
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
											// 格式化时间(秒 -> MM:SS)
							 | 
						|||
| 
								 | 
							
											formatTime(seconds) {
							 | 
						|||
| 
								 | 
							
												if (this.timeShowBlock == true) {
							 | 
						|||
| 
								 | 
							
													const min = Math.floor(seconds / 60);
							 | 
						|||
| 
								 | 
							
													const sec = Math.floor(seconds % 60);
							 | 
						|||
| 
								 | 
							
													return `${min.toString().padStart(2, '0')}:${sec.toString().padStart(2, '0')}`;
							 | 
						|||
| 
								 | 
							
												} else {
							 | 
						|||
| 
								 | 
							
													const hours = Math.floor(seconds / 3600);
							 | 
						|||
| 
								 | 
							
													// 计算剩余秒数,再 ÷ 60 得到分钟
							 | 
						|||
| 
								 | 
							
													const minutes = Math.floor((seconds % 3600) / 60);
							 | 
						|||
| 
								 | 
							
													// 剩余的秒数
							 | 
						|||
| 
								 | 
							
													const remainingSeconds = seconds % 60;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
													// 拼接并补零
							 | 
						|||
| 
								 | 
							
													return `${this.padZero(hours)}:${this.padZero(minutes)}:${this.padZero(remainingSeconds)}`;
							 | 
						|||
| 
								 | 
							
												}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
											},
							 | 
						|||
| 
								 | 
							
											padZero(num) {
							 | 
						|||
| 
								 | 
							
												return num < 10 ? '0' + num : num;
							 | 
						|||
| 
								 | 
							
											},
							 | 
						|||
| 
								 | 
							
											// 点击进度条跳转播放位置
							 | 
						|||
| 
								 | 
							
											seekByProgressBar(e) {
							 | 
						|||
| 
								 | 
							
												// const player = this.$refs.vod;
							 | 
						|||
| 
								 | 
							
												if (this.totalTime <= 0) return;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
												// 获取进度条宽度和点击位置
							 | 
						|||
| 
								 | 
							
												const barWidth = e.currentTarget.clientWidth;
							 | 
						|||
| 
								 | 
							
												const clickX = e.touches[0].clientX - e.currentTarget.getBoundingClientRect().left;
							 | 
						|||
| 
								 | 
							
												// 计算跳转时间
							 | 
						|||
| 
								 | 
							
												const seekTime = (clickX / barWidth) * this.totalTime;
							 | 
						|||
| 
								 | 
							
												// 调用播放器跳转API(需确认方法名,可能为seek/setPosition)
							 | 
						|||
| 
								 | 
							
												this.$refs.vod.seekTo({
							 | 
						|||
| 
								 | 
							
													position: seekTime
							 | 
						|||
| 
								 | 
							
												});
							 | 
						|||
| 
								 | 
							
											},
							 | 
						|||
| 
								 | 
							
											loadData() {
							 | 
						|||
| 
								 | 
							
												let json = initFilter(this.ORG_ID, this.model.ID);
							 | 
						|||
| 
								 | 
							
												extendRule(json, 'ID', 1, this.model.ID);
							 | 
						|||
| 
								 | 
							
												GetSource(json).then(ret => {
							 | 
						|||
| 
								 | 
							
													if (ret) {
							 | 
						|||
| 
								 | 
							
														this.loading = false
							 | 
						|||
| 
								 | 
							
														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.filepathsWeb = config.uni_app_web_source_url + filepath
							 | 
						|||
| 
								 | 
							
														this.filepaths = filepath
							 | 
						|||
| 
								 | 
							
														if (this.filepaths.indexOf('vid') !== -1) {
							 | 
						|||
| 
								 | 
							
															this.polyvy = true
							 | 
						|||
| 
								 | 
							
														} else {
							 | 
						|||
| 
								 | 
							
															this.polyvy = false
							 | 
						|||
| 
								 | 
							
														}
							 | 
						|||
| 
								 | 
							
														const regex = /vid=([^&]+)/;
							 | 
						|||
| 
								 | 
							
														const match = this.filepaths.match(regex);
							 | 
						|||
| 
								 | 
							
														this.vid = match ? match[1] : '';
							 | 
						|||
| 
								 | 
							
														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
							 | 
						|||
| 
								 | 
							
																})
							 | 
						|||
| 
								 | 
							
																if (item.Nav_Test.OPTION_C != undefined && item.Nav_Test.OPTION_C != "") {
							 | 
						|||
| 
								 | 
							
																	this.radiolist2[item.ID].push({
							 | 
						|||
| 
								 | 
							
																		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.filepathsWeb = config.uni_app_web_source_url + filepath
							 | 
						|||
| 
								 | 
							
															this.filepaths = filepath
							 | 
						|||
| 
								 | 
							
															if (this.filepaths.indexOf('vid') !== -1) {
							 | 
						|||
| 
								 | 
							
																this.polyvy = true
							 | 
						|||
| 
								 | 
							
															} else {
							 | 
						|||
| 
								 | 
							
																this.polyvy = false
							 | 
						|||
| 
								 | 
							
															}
							 | 
						|||
| 
								 | 
							
															const regex = /vid=([^&]+)/;
							 | 
						|||
| 
								 | 
							
															const match = this.filepaths.match(regex);
							 | 
						|||
| 
								 | 
							
															this.vid = match ? match[1] : '';
							 | 
						|||
| 
								 | 
							
														}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
														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
							 | 
						|||
| 
								 | 
							
																})
							 | 
						|||
| 
								 | 
							
																if (item.Nav_Test.OPTION_C != undefined && item.Nav_Test.OPTION_C != "") {
							 | 
						|||
| 
								 | 
							
																	this.radiolist2[item.ID].push({
							 | 
						|||
| 
								 | 
							
																		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");
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									.wrap {
							 | 
						|||
| 
								 | 
							
										flex: 1;
							 | 
						|||
| 
								 | 
							
										height: 100%;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										/* 关键:width 包含 padding 和 border */
							 | 
						|||
| 
								 | 
							
										padding-bottom: 80px;
							 | 
						|||
| 
								 | 
							
										position: relative;
							 | 
						|||
| 
								 | 
							
										background: #edf1fd;
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									.bottom-button-new {
							 | 
						|||
| 
								 | 
							
										position: absolute;
							 | 
						|||
| 
								 | 
							
										/* 绝对定位覆盖播放器 */
							 | 
						|||
| 
								 | 
							
										left: 0;
							 | 
						|||
| 
								 | 
							
										right: 0;
							 | 
						|||
| 
								 | 
							
										bottom: 0;
							 | 
						|||
| 
								 | 
							
										/* 靠底部显示 */
							 | 
						|||
| 
								 | 
							
										padding: 20rpx 30rpx;
							 | 
						|||
| 
								 | 
							
										background: linear-gradient(transparent, rgba(0, 0, 0, 0.7));
							 | 
						|||
| 
								 | 
							
										/* 渐变背景提升可读性 */
							 | 
						|||
| 
								 | 
							
										z-index: 10;
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									.scrollable-content {
							 | 
						|||
| 
								 | 
							
										height: 300px;
							 | 
						|||
| 
								 | 
							
										/* 根据实际需求设置高度 */
							 | 
						|||
| 
								 | 
							
										overflow-y: auto;
							 | 
						|||
| 
								 | 
							
										/* 垂直方向滚动 */
							 | 
						|||
| 
								 | 
							
										overflow-x: hidden;
							 | 
						|||
| 
								 | 
							
										/* 隐藏水平滚动条 */
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									.title {
							 | 
						|||
| 
								 | 
							
										height: 140rpx;
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									.player {
							 | 
						|||
| 
								 | 
							
										height: 200px;
							 | 
						|||
| 
								 | 
							
										position: relative;
							 | 
						|||
| 
								 | 
							
										overflow: hidden;
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									.vod-player {
							 | 
						|||
| 
								 | 
							
										flex: 1;
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									.controls-contain {
							 | 
						|||
| 
								 | 
							
										position: relative;
							 | 
						|||
| 
								 | 
							
										height: 60px;
							 | 
						|||
| 
								 | 
							
										background-color: #000;
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									/* 悬浮控件层 */
							 | 
						|||
| 
								 | 
							
									.floating-controls {
							 | 
						|||
| 
								 | 
							
										position: absolute;
							 | 
						|||
| 
								 | 
							
										/* 绝对定位覆盖播放器 */
							 | 
						|||
| 
								 | 
							
										left: 0;
							 | 
						|||
| 
								 | 
							
										right: 0;
							 | 
						|||
| 
								 | 
							
										bottom: 0;
							 | 
						|||
| 
								 | 
							
										height: 60px;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										z-index: 10;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									.abs-box {
							 | 
						|||
| 
								 | 
							
										display: flex;
							 | 
						|||
| 
								 | 
							
										flex-direction: column;
							 | 
						|||
| 
								 | 
							
										justify-content: space-between;
							 | 
						|||
| 
								 | 
							
										/* align-items: center; */
							 | 
						|||
| 
								 | 
							
										flex: 1;
							 | 
						|||
| 
								 | 
							
										/* background-color: aliceblue; */
							 | 
						|||
| 
								 | 
							
										padding: 5px 10px;
							 | 
						|||
| 
								 | 
							
										/* width: 100%; */
							 | 
						|||
| 
								 | 
							
										/* background-color: aqua; */
							 | 
						|||
| 
								 | 
							
										/* box-sizing: border-box; */
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									.playing-icon {
							 | 
						|||
| 
								 | 
							
										/* width: 50px; */
							 | 
						|||
| 
								 | 
							
										/* margin-top: 5px; */
							 | 
						|||
| 
								 | 
							
										margin-right: 40px;
							 | 
						|||
| 
								 | 
							
										margin-left: 40px;
							 | 
						|||
| 
								 | 
							
										/* height: 40px; */
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									/* 进度条容器 */
							 | 
						|||
| 
								 | 
							
									.progress-container {
							 | 
						|||
| 
								 | 
							
										/* width: 100%; */
							 | 
						|||
| 
								 | 
							
										height: 30px;
							 | 
						|||
| 
								 | 
							
										/* margin-top: 20rpx; */
							 | 
						|||
| 
								 | 
							
										flex: 1;
							 | 
						|||
| 
								 | 
							
										display: flex;
							 | 
						|||
| 
								 | 
							
										flex-direction: row;
							 | 
						|||
| 
								 | 
							
										align-items: center;
							 | 
						|||
| 
								 | 
							
										justify-content: space-between;
							 | 
						|||
| 
								 | 
							
										/* box-sizing: border-box; */
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									/* 时间文本 */
							 | 
						|||
| 
								 | 
							
									.time-text {
							 | 
						|||
| 
								 | 
							
										color: #fff;
							 | 
						|||
| 
								 | 
							
										font-size: 24px;
							 | 
						|||
| 
								 | 
							
										/* margin-bottom: 10rpx; */
							 | 
						|||
| 
								 | 
							
										display: flex;
							 | 
						|||
| 
								 | 
							
										margin: 0px 5px;
							 | 
						|||
| 
								 | 
							
										justify-content: space-between;
							 | 
						|||
| 
								 | 
							
										/* margin-left: 10px; */
							 | 
						|||
| 
								 | 
							
										/* width: 80px; */
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									/* 进度条背景 */
							 | 
						|||
| 
								 | 
							
									.progress-bar {
							 | 
						|||
| 
								 | 
							
										/* height: 20px; */
							 | 
						|||
| 
								 | 
							
										/* width: 100%; */
							 | 
						|||
| 
								 | 
							
										flex: 1;
							 | 
						|||
| 
								 | 
							
										/* background: rgba(255, 255, 255, 0.3); */
							 | 
						|||
| 
								 | 
							
										border-radius: 4rpx;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									.progress-content {
							 | 
						|||
| 
								 | 
							
										display: flex;
							 | 
						|||
| 
								 | 
							
										/* width: 100%; */
							 | 
						|||
| 
								 | 
							
										height: 100%;
							 | 
						|||
| 
								 | 
							
										flex: 1;
							 | 
						|||
| 
								 | 
							
										background-color: aqua;
							 | 
						|||
| 
								 | 
							
										position: relative;
							 | 
						|||
| 
								 | 
							
										/* cursor: pointer; */
							 | 
						|||
| 
								 | 
							
										overflow: hidden;
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								</style>
							 |