|
@@ -38,20 +38,35 @@
|
|
</div>
|
|
</div>
|
|
<div class="student-head-right">
|
|
<div class="student-head-right">
|
|
<el-button
|
|
<el-button
|
|
|
|
+ class="el-icon-btn"
|
|
size="mini"
|
|
size="mini"
|
|
type="primary"
|
|
type="primary"
|
|
icon="el-icon-arrow-left"
|
|
icon="el-icon-arrow-left"
|
|
|
|
+ title="查看上一个"
|
|
|
|
+ @click="changeStudent(0)"
|
|
|
|
+ :disabled="holding"
|
|
></el-button>
|
|
></el-button>
|
|
<el-button
|
|
<el-button
|
|
|
|
+ class="el-icon-btn"
|
|
size="mini"
|
|
size="mini"
|
|
type="primary"
|
|
type="primary"
|
|
icon="el-icon-arrow-right"
|
|
icon="el-icon-arrow-right"
|
|
|
|
+ title="查看下一个"
|
|
|
|
+ @click="changeStudent(1)"
|
|
|
|
+ :disabled="holding"
|
|
></el-button>
|
|
></el-button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="student-views">
|
|
<div class="student-views">
|
|
<div class="student-avatar">
|
|
<div class="student-avatar">
|
|
- <img :src="detailInfo.stdAvatar" alt="" />
|
|
|
|
|
|
+ <img
|
|
|
|
+ :src="detailInfo.examStudentAvatar"
|
|
|
|
+ alt=""
|
|
|
|
+ v-if="detailInfo.examStudentAvatar"
|
|
|
|
+ />
|
|
|
|
+ <div class="avatar-default" v-else>
|
|
|
|
+ <i class="el-icon-user-solid"></i>
|
|
|
|
+ </div>
|
|
</div>
|
|
</div>
|
|
<div class="student-video">
|
|
<div class="student-video">
|
|
<div class="student-video-item">
|
|
<div class="student-video-item">
|
|
@@ -78,10 +93,15 @@
|
|
</div>
|
|
</div>
|
|
<div class="student-exception">
|
|
<div class="student-exception">
|
|
<ul>
|
|
<ul>
|
|
- <li v-for="(item, index) in detailInfo.exceptionInfos" :key="index">
|
|
|
|
|
|
+ <li v-for="(log, index) in exceptionSummary" :key="index">
|
|
<i>{{ index + 1 }}</i>
|
|
<i>{{ index + 1 }}</i>
|
|
- <h4>{{ item.remark }}</h4>
|
|
|
|
- <p>{{ item.info }}</p>
|
|
|
|
|
|
+ <h4>{{ log.info }}</h4>
|
|
|
|
+ <p>
|
|
|
|
+ 时间段:
|
|
|
|
+ <span v-if="log.startTime">{{ log.startTime }} ~ </span>
|
|
|
|
+ <span>{{ log.endTime }}</span>
|
|
|
|
+ </p>
|
|
|
|
+ <p v-if="log.durationTime">持续时长约:{{ log.durationTime }}</p>
|
|
</li>
|
|
</li>
|
|
</ul>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
@@ -92,9 +112,24 @@
|
|
<div class="warning-body-head clear-float">
|
|
<div class="warning-body-head clear-float">
|
|
<div class="warning-body-head-action">
|
|
<div class="warning-body-head-action">
|
|
<h3>考试轨迹</h3>
|
|
<h3>考试轨迹</h3>
|
|
- <el-button type="primary" icon="icon icon-view"></el-button>
|
|
|
|
- <el-button type="primary" icon="icon icon-text"></el-button>
|
|
|
|
- <el-button type="primary" icon="icon icon-audio"></el-button>
|
|
|
|
|
|
+ <!-- <el-button
|
|
|
|
+ class="el-icon-btn"
|
|
|
|
+ type="primary"
|
|
|
|
+ icon="icon icon-view"
|
|
|
|
+ ></el-button> -->
|
|
|
|
+ <el-button
|
|
|
|
+ class="el-icon-btn"
|
|
|
|
+ type="primary"
|
|
|
|
+ icon="icon icon-text"
|
|
|
|
+ @click="toSendTextMsg"
|
|
|
|
+ title="发送文字提醒"
|
|
|
|
+ ></el-button>
|
|
|
|
+ <!-- todo: -->
|
|
|
|
+ <!-- <el-button
|
|
|
|
+ class="el-icon-btn"
|
|
|
|
+ type="primary"
|
|
|
|
+ icon="icon icon-audio"
|
|
|
|
+ ></el-button> -->
|
|
<el-popover
|
|
<el-popover
|
|
class="warning-body-head-call"
|
|
class="warning-body-head-call"
|
|
placement="bottom-start"
|
|
placement="bottom-start"
|
|
@@ -107,22 +142,28 @@
|
|
</div>
|
|
</div>
|
|
<div class="warning-body-head-info summary-line">
|
|
<div class="warning-body-head-info summary-line">
|
|
<p class="summary-line-item">
|
|
<p class="summary-line-item">
|
|
- <i class="line-point line-point-danger"></i
|
|
|
|
- ><span class="line-name">系统预警</span
|
|
|
|
- ><span>{{ detailInfo.warningCount }}次</span>
|
|
|
|
|
|
+ <i class="line-point line-point-danger"></i>
|
|
|
|
+ <span class="line-name">系统预警</span>
|
|
|
|
+ <span>{{ detailInfo.warningCount }}次</span>
|
|
</p>
|
|
</p>
|
|
<p class="summary-line-item">
|
|
<p class="summary-line-item">
|
|
- <i class="line-point line-point-danger"></i
|
|
|
|
- ><span class="line-name">陌生人脸</span
|
|
|
|
- ><span>{{ detailInfo.multipleFaceCount }}次</span>
|
|
|
|
|
|
+ <i class="line-point line-point-danger"></i>
|
|
|
|
+ <span class="line-name">陌生人脸</span>
|
|
|
|
+ <span>{{ detailInfo.multipleFaceCount }}次</span>
|
|
</p>
|
|
</p>
|
|
<p class="summary-line-item">
|
|
<p class="summary-line-item">
|
|
- <i class="line-point line-point-danger"></i
|
|
|
|
- ><span class="line-name">异常处理</span
|
|
|
|
- ><span>{{ detailInfo.exceptionCount }}次</span>
|
|
|
|
|
|
+ <i class="line-point line-point-danger"></i>
|
|
|
|
+ <span class="line-name">异常处理</span>
|
|
|
|
+ <span>{{ detailInfo.exceptionCount }}次</span>
|
|
</p>
|
|
</p>
|
|
<p class="summary-line-item">
|
|
<p class="summary-line-item">
|
|
- <span></span><span>违纪状态:{{ detailInfo.breachStatus }}</span>
|
|
|
|
|
|
+ <span></span>
|
|
|
|
+ <span>
|
|
|
|
+ <b>违纪状态:</b>
|
|
|
|
+ <b :class="{ 'color-danger': detailInfo.breachStatus }">
|
|
|
|
+ {{ detailInfo.breachStatus ? "违纪" : "正常" }}
|
|
|
|
+ </b>
|
|
|
|
+ </span>
|
|
</p>
|
|
</p>
|
|
<el-button type="danger" icon="icon icon-stop" @click="toBreach"
|
|
<el-button type="danger" icon="icon icon-stop" @click="toBreach"
|
|
>违纪处理</el-button
|
|
>违纪处理</el-button
|
|
@@ -133,71 +174,42 @@
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="warning-body-main">
|
|
<div class="warning-body-main">
|
|
- <div class="warning-history">
|
|
|
|
- <div class="warning-history-info">
|
|
|
|
- <h3>进入考试</h3>
|
|
|
|
- <p>时间段:08:00:01</p>
|
|
|
|
- </div>
|
|
|
|
- <div class="warning-history-type type-common">
|
|
|
|
- <i class="icon icon-current-step"></i>
|
|
|
|
- </div>
|
|
|
|
- <div class="warning-history-media">
|
|
|
|
- <ul class="media-list">
|
|
|
|
- <li></li>
|
|
|
|
- </ul>
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
- <div class="warning-history">
|
|
|
|
- <div class="warning-history-info">
|
|
|
|
- <h3>违纪预警</h3>
|
|
|
|
- <p>时间段:09:10:20 ~ 09:20:36</p>
|
|
|
|
- <p>持续时长约:10分钟16秒</p>
|
|
|
|
- </div>
|
|
|
|
- <div class="warning-history-type type-exception">
|
|
|
|
- <i class="icon icon-warning-act"></i>
|
|
|
|
- </div>
|
|
|
|
- <div class="warning-history-media">
|
|
|
|
- <ul class="media-list">
|
|
|
|
- <li></li>
|
|
|
|
- <li></li>
|
|
|
|
- <li></li>
|
|
|
|
- <li></li>
|
|
|
|
- <li></li>
|
|
|
|
- <li></li>
|
|
|
|
- <li></li>
|
|
|
|
- <li></li>
|
|
|
|
- </ul>
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
- <div class="warning-history">
|
|
|
|
- <div class="warning-history-info">
|
|
|
|
- <h3>异常处理</h3>
|
|
|
|
- <h5>类型:网络故障</h5>
|
|
|
|
- <p>时间段:09:10:20 ~ 09:20:36</p>
|
|
|
|
- <p>持续时长约:10分钟16秒</p>
|
|
|
|
- </div>
|
|
|
|
- <div class="warning-history-type type-exception">
|
|
|
|
- <i class="icon icon-net-break"></i>
|
|
|
|
- </div>
|
|
|
|
- <div class="warning-history-media">
|
|
|
|
- <ul class="media-list">
|
|
|
|
- <li></li>
|
|
|
|
- </ul>
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
- <div class="warning-history">
|
|
|
|
|
|
+ <div
|
|
|
|
+ class="warning-history"
|
|
|
|
+ v-for="log in detailInfo.examStudentLogList"
|
|
|
|
+ :key="log.id"
|
|
|
|
+ >
|
|
<div class="warning-history-info">
|
|
<div class="warning-history-info">
|
|
- <h3>异常处理</h3>
|
|
|
|
- <h5>类型:网络故障</h5>
|
|
|
|
- <p>时间段:09:10:20 ~ 09:20:36</p>
|
|
|
|
- <p>持续时长约:10分钟16秒</p>
|
|
|
|
|
|
+ <h3>{{ log.info }}</h3>
|
|
|
|
+ <p>
|
|
|
|
+ 时间段:
|
|
|
|
+ <span v-if="log.startTime">{{ log.startTime }} ~ </span>
|
|
|
|
+ <span>{{ log.endTime }}</span>
|
|
|
|
+ </p>
|
|
|
|
+ <p v-if="log.durationTime">持续时长约:{{ log.durationTime }}</p>
|
|
</div>
|
|
</div>
|
|
- <div class="warning-history-type type-exception">
|
|
|
|
- <i class="icon icon-net-break"></i>
|
|
|
|
|
|
+ <div
|
|
|
|
+ :class="[
|
|
|
|
+ 'warning-history-type',
|
|
|
|
+ log.viewType === 'common' ? 'type-common' : 'type-exception',
|
|
|
|
+ ]"
|
|
|
|
+ >
|
|
|
|
+ <i
|
|
|
|
+ :class="[
|
|
|
|
+ 'icon',
|
|
|
|
+ {
|
|
|
|
+ 'icon-current-step': log.viewType === 'common',
|
|
|
|
+ 'icon-warning-act': log.viewType === 'warning',
|
|
|
|
+ 'icon-net-break': log.viewType === 'exception',
|
|
|
|
+ },
|
|
|
|
+ ]"
|
|
|
|
+ ></i>
|
|
</div>
|
|
</div>
|
|
<div class="warning-history-media">
|
|
<div class="warning-history-media">
|
|
- <ul class="media-list">
|
|
|
|
- <li></li>
|
|
|
|
|
|
+ <ul class="media-list" v-if="log.photos">
|
|
|
|
+ <li v-for="(photo, pindex) in log.photos" :key="pindex">
|
|
|
|
+ <img :src="photo" />
|
|
|
|
+ </li>
|
|
</ul>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@@ -208,6 +220,11 @@
|
|
:instance="curDetail"
|
|
:instance="curDetail"
|
|
ref="StudentBreachDialog"
|
|
ref="StudentBreachDialog"
|
|
></student-breach-dialog>
|
|
></student-breach-dialog>
|
|
|
|
+ <!-- warning-text-message-dialog -->
|
|
|
|
+ <warning-text-message-dialog
|
|
|
|
+ :record-id="recordId"
|
|
|
|
+ ref="WarningTextMessageDialog"
|
|
|
|
+ ></warning-text-message-dialog>
|
|
|
|
|
|
<!-- 通话弹出层 -->
|
|
<!-- 通话弹出层 -->
|
|
<el-dialog
|
|
<el-dialog
|
|
@@ -234,9 +251,11 @@
|
|
<div class="communication-wait" v-show="isWaiting">
|
|
<div class="communication-wait" v-show="isWaiting">
|
|
<p class="communication-wait-tips">等待接听…</p>
|
|
<p class="communication-wait-tips">等待接听…</p>
|
|
<div class="communication-wait-avatar">
|
|
<div class="communication-wait-avatar">
|
|
- <img :src="curStudent.stdAvatar" :alt="curStudent.stdName" />
|
|
|
|
|
|
+ <img :src="detailInfo.stdAvatar" :alt="detailInfo.examStudentName" />
|
|
</div>
|
|
</div>
|
|
- <p class="communication-wait-username">{{ curStudent.stdName }}</p>
|
|
|
|
|
|
+ <p class="communication-wait-username">
|
|
|
|
+ {{ detailInfo.examStudentName }}
|
|
|
|
+ </p>
|
|
<div class="communication-wait-action">
|
|
<div class="communication-wait-action">
|
|
<el-button round type="danger" @click="hangup">取消通话</el-button>
|
|
<el-button round type="danger" @click="hangup">取消通话</el-button>
|
|
</div>
|
|
</div>
|
|
@@ -256,82 +275,20 @@ import {
|
|
getUserMonitorKey,
|
|
getUserMonitorKey,
|
|
} from "@/api/invigilation";
|
|
} from "@/api/invigilation";
|
|
import StudentBreachDialog from "./StudentBreachDialog";
|
|
import StudentBreachDialog from "./StudentBreachDialog";
|
|
-
|
|
|
|
-const test = {
|
|
|
|
- breachStatus: 0,
|
|
|
|
- courseNameCode: "大学语文(1001)",
|
|
|
|
- examActivityId: 0,
|
|
|
|
- examId: 0,
|
|
|
|
- examRecordId: 11111,
|
|
|
|
- examStudentId: 0,
|
|
|
|
- examStudentName: "张一三",
|
|
|
|
- exceptionCount: 0,
|
|
|
|
- exceptionInfos: [
|
|
|
|
- {
|
|
|
|
- createTime: "",
|
|
|
|
- info: "系统发现该考生身份识别多次不通过,请监考老师关注!",
|
|
|
|
- remark: "身份验证不通过",
|
|
|
|
- type: "",
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- createTime: "",
|
|
|
|
- info:
|
|
|
|
- "系统发现该考生至少有多次以上持续1分钟以上的违规动作,且违规动作的持续时间已超出合理范围,请监考老师关注!",
|
|
|
|
- remark: "疑似:有违规动作",
|
|
|
|
- type: "",
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- createTime: "",
|
|
|
|
- info: "系统检测到考生可能使用了虚拟摄像头,请监考老师关注!",
|
|
|
|
- remark: "疑似:启用虚拟摄像头",
|
|
|
|
- type: "",
|
|
|
|
- },
|
|
|
|
- ],
|
|
|
|
- stdAvatar: "/img/avatars/2.jpg",
|
|
|
|
- identity: "000000000000000008",
|
|
|
|
- multipleFaceCount: 0,
|
|
|
|
- roomCode: "111",
|
|
|
|
- roomName: "第一考场",
|
|
|
|
- status: "正常",
|
|
|
|
- statusCode: "0124",
|
|
|
|
- studentLogs: [
|
|
|
|
- {
|
|
|
|
- createTime: "",
|
|
|
|
- info: "",
|
|
|
|
- remark: "",
|
|
|
|
- type: "",
|
|
|
|
- },
|
|
|
|
- ],
|
|
|
|
- warningCount: 0,
|
|
|
|
- warningInfos: [
|
|
|
|
- {
|
|
|
|
- approveStatus: 0,
|
|
|
|
- createTime: "",
|
|
|
|
- info: "",
|
|
|
|
- level: "",
|
|
|
|
- remark: "",
|
|
|
|
- type: "",
|
|
|
|
- },
|
|
|
|
- ],
|
|
|
|
-};
|
|
|
|
|
|
+import WarningTextMessageDialog from "./WarningTextMessageDialog";
|
|
|
|
+import { formatDate, timeNumberToText } from "@/utils/utils";
|
|
|
|
+import { mapState } from "vuex";
|
|
|
|
|
|
export default {
|
|
export default {
|
|
name: "warning-detail",
|
|
name: "warning-detail",
|
|
- components: { FlvMedia, StudentBreachDialog },
|
|
|
|
|
|
+ components: { FlvMedia, StudentBreachDialog, WarningTextMessageDialog },
|
|
data() {
|
|
data() {
|
|
return {
|
|
return {
|
|
- // recordId: "32145907927482368",
|
|
|
|
recordId: this.$route.params.recordId,
|
|
recordId: this.$route.params.recordId,
|
|
- detailInfo: test,
|
|
|
|
|
|
+ detailInfo: {},
|
|
curDetail: {},
|
|
curDetail: {},
|
|
- curStudent: {
|
|
|
|
- stdAvatar: "/img/avatars/2.jpg",
|
|
|
|
- stdCardNo: "000000000000000008",
|
|
|
|
- stdName: "张龙龙",
|
|
|
|
- subjectName: "大学英语",
|
|
|
|
- subjectCode: "10006",
|
|
|
|
- roomId: "6",
|
|
|
|
- },
|
|
|
|
|
|
+ serialIds: [],
|
|
|
|
+ exceptionSummary: [],
|
|
firstViewVideo: {
|
|
firstViewVideo: {
|
|
id: "111",
|
|
id: "111",
|
|
src: "",
|
|
src: "",
|
|
@@ -344,6 +301,7 @@ export default {
|
|
},
|
|
},
|
|
firstViewVideoReady: false,
|
|
firstViewVideoReady: false,
|
|
secondViewVideoReady: false,
|
|
secondViewVideoReady: false,
|
|
|
|
+ holding: false,
|
|
// communication
|
|
// communication
|
|
durationTime: "00:10:23",
|
|
durationTime: "00:10:23",
|
|
appId: "1400411036",
|
|
appId: "1400411036",
|
|
@@ -355,12 +313,27 @@ export default {
|
|
setT: null,
|
|
setT: null,
|
|
};
|
|
};
|
|
},
|
|
},
|
|
|
|
+ computed: {
|
|
|
|
+ ...mapState("invigilation", ["detailIds"]),
|
|
|
|
+ },
|
|
|
|
+ watch: {
|
|
|
|
+ $route: {
|
|
|
|
+ handler() {
|
|
|
|
+ this.initData();
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ },
|
|
mounted() {
|
|
mounted() {
|
|
this.initData();
|
|
this.initData();
|
|
},
|
|
},
|
|
methods: {
|
|
methods: {
|
|
async initData() {
|
|
async initData() {
|
|
- this.getInvigilateDetail();
|
|
|
|
|
|
+ this.recordId = this.$route.params.recordId;
|
|
|
|
+ await this.getInvigilateDetail().catch(() => {});
|
|
|
|
+ await this.getStudentVideo().catch(() => {});
|
|
|
|
+ this.holding = false;
|
|
|
|
+ },
|
|
|
|
+ async getStudentVideo() {
|
|
const res = await warningStudentDetail({ recordId: this.recordId });
|
|
const res = await warningStudentDetail({ recordId: this.recordId });
|
|
const records = res.data.data.map((item) => {
|
|
const records = res.data.data.map((item) => {
|
|
item.src = `http://live.qmth.com.cn/live/${item.liveUrl.toLowerCase()}.flv`;
|
|
item.src = `http://live.qmth.com.cn/live/${item.liveUrl.toLowerCase()}.flv`;
|
|
@@ -376,6 +349,100 @@ export default {
|
|
async getInvigilateDetail() {
|
|
async getInvigilateDetail() {
|
|
const res = await invigilateDetail(this.recordId);
|
|
const res = await invigilateDetail(this.recordId);
|
|
this.detailInfo = res.data.data;
|
|
this.detailInfo = res.data.data;
|
|
|
|
+ this.detailInfo.examStudentLogList = this.parseStudentLogs(
|
|
|
|
+ this.detailInfo.examStudentLogList
|
|
|
|
+ );
|
|
|
|
+ this.exceptionSummary = this.detailInfo.examStudentLogList
|
|
|
|
+ .filter((item) => item.viewType === "warning")
|
|
|
|
+ .slice(0, 3);
|
|
|
|
+ },
|
|
|
|
+ parseStudentLogs(examStudentLogList) {
|
|
|
|
+ const statusTypes = {
|
|
|
|
+ common: [
|
|
|
|
+ "FIRST_START",
|
|
|
|
+ "RESUME_START",
|
|
|
|
+ "IN_PROCESS",
|
|
|
|
+ "PREPARE",
|
|
|
|
+ "ANSWERING",
|
|
|
|
+ "BREAK_OFF",
|
|
|
|
+ "RESUME_PREPARE",
|
|
|
|
+ "FINISHED",
|
|
|
|
+ "FIRST_PREPARE",
|
|
|
|
+ ],
|
|
|
|
+ warning: [
|
|
|
|
+ "FACE_COUNT_ERROR",
|
|
|
|
+ "FACE_COMPARE_ERROR",
|
|
|
|
+ "EYE_CLOSE_ERROR",
|
|
|
|
+ "LIVENESS_ACTION_ERROR",
|
|
|
|
+ "REALNESS",
|
|
|
|
+ ],
|
|
|
|
+ exception: [
|
|
|
|
+ "NET_TIME_OUT",
|
|
|
|
+ "MACHING_STOP",
|
|
|
|
+ "NET_TIME_BREAK",
|
|
|
|
+ "SOFTWARE_STOP",
|
|
|
|
+ "POWER_CUT",
|
|
|
|
+ ],
|
|
|
|
+ };
|
|
|
|
+ let statusTypeMap = {};
|
|
|
|
+ Object.keys(statusTypes).map((k) => {
|
|
|
|
+ statusTypes[k].map((item) => {
|
|
|
|
+ statusTypeMap[item] = k;
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ const logs = examStudentLogList.map((item) => {
|
|
|
|
+ let info = { ...item };
|
|
|
|
+ info.endTime = formatDate("HH:mm:ss", new Date(info.createTime));
|
|
|
|
+ info.viewType = statusTypeMap[info.type] || "common";
|
|
|
|
+ if (info.remark && info.remark.includes('{"')) {
|
|
|
|
+ info.remark = JSON.parse(info.remark);
|
|
|
|
+ if (info.remark["MIN_CREATE_TIME"]) {
|
|
|
|
+ info.startTime = formatDate(
|
|
|
|
+ "HH:mm:ss",
|
|
|
|
+ new Date(info.remark["MIN_CREATE_TIME"])
|
|
|
|
+ );
|
|
|
|
+ info.durationTime = timeNumberToText(
|
|
|
|
+ info.createTime - info.remark["MIN_CREATE_TIME"]
|
|
|
|
+ );
|
|
|
|
+ }
|
|
|
|
+ let facePhoto = info.remark["FACE_VERIFY_PHOTO"]
|
|
|
|
+ ? [info.remark["FACE_VERIFY_PHOTO"]]
|
|
|
|
+ : "";
|
|
|
|
+ info.photos = info.remark["PHOTOS"] || facePhoto;
|
|
|
|
+ }
|
|
|
|
+ return info;
|
|
|
|
+ });
|
|
|
|
+ return logs;
|
|
|
|
+ },
|
|
|
|
+ changeStudent(type) {
|
|
|
|
+ let index = this.detailIds.indexOf(this.recordId);
|
|
|
|
+ if (type) {
|
|
|
|
+ if (index >= this.detailIds.length - 1) {
|
|
|
|
+ this.$message.error("当前没有下一个学生了");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ index++;
|
|
|
|
+ } else {
|
|
|
|
+ if (index <= 0) {
|
|
|
|
+ this.$message.error("当前没有上一个学生了");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ index--;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (this.holding) return;
|
|
|
|
+ this.holding = true;
|
|
|
|
+
|
|
|
|
+ this.closeSubscribeVideo();
|
|
|
|
+ console.log(this.detailIds[index]);
|
|
|
|
+
|
|
|
|
+ this.$router.replace({
|
|
|
|
+ name: "WarningDetail",
|
|
|
|
+ params: {
|
|
|
|
+ recordId: this.detailIds[index],
|
|
|
|
+ },
|
|
|
|
+ });
|
|
},
|
|
},
|
|
toBreach() {
|
|
toBreach() {
|
|
this.curDetail = {
|
|
this.curDetail = {
|
|
@@ -404,12 +471,15 @@ export default {
|
|
if (!result) return;
|
|
if (!result) return;
|
|
|
|
|
|
await invigilateFinish({
|
|
await invigilateFinish({
|
|
- examRecordId: this.detailInfo.examRecordId,
|
|
|
|
- type: true,
|
|
|
|
|
|
+ examRecordId: [this.detailInfo.examRecordId],
|
|
|
|
+ type: "INTERRUPT",
|
|
});
|
|
});
|
|
this.$message.success("强制收卷成功!");
|
|
this.$message.success("强制收卷成功!");
|
|
this.goBack();
|
|
this.goBack();
|
|
},
|
|
},
|
|
|
|
+ toSendTextMsg() {
|
|
|
|
+ this.$refs.WarningTextMessageDialog.open();
|
|
|
|
+ },
|
|
// video relative
|
|
// video relative
|
|
initSubscribeVideo() {
|
|
initSubscribeVideo() {
|
|
if (this.firstViewVideo.id) this.firstViewVideoReady = true;
|
|
if (this.firstViewVideo.id) this.firstViewVideoReady = true;
|
|
@@ -668,8 +738,7 @@ export default {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
.student-exception {
|
|
.student-exception {
|
|
- padding-top: 30px;
|
|
|
|
- overflow: auto;
|
|
|
|
|
|
+ margin-top: 30px;
|
|
ul,
|
|
ul,
|
|
li {
|
|
li {
|
|
margin: 0;
|
|
margin: 0;
|
|
@@ -684,8 +753,8 @@ export default {
|
|
vertical-align: top;
|
|
vertical-align: top;
|
|
font-size: 14px;
|
|
font-size: 14px;
|
|
position: relative;
|
|
position: relative;
|
|
- padding-left: 38px;
|
|
|
|
- width: 400px;
|
|
|
|
|
|
+ padding: 0 15px 0 38px;
|
|
|
|
+ width: 33.33%;
|
|
|
|
|
|
> i {
|
|
> i {
|
|
display: block;
|
|
display: block;
|
|
@@ -733,7 +802,6 @@ export default {
|
|
}
|
|
}
|
|
p {
|
|
p {
|
|
margin: 0;
|
|
margin: 0;
|
|
- width: 304px;
|
|
|
|
font-weight: 400;
|
|
font-weight: 400;
|
|
color: #626a82;
|
|
color: #626a82;
|
|
line-height: 20px;
|
|
line-height: 20px;
|
|
@@ -760,7 +828,7 @@ export default {
|
|
margin: 0 30px 0 0;
|
|
margin: 0 30px 0 0;
|
|
}
|
|
}
|
|
|
|
|
|
- i.icon {
|
|
|
|
|
|
+ .el-button >>> i.icon {
|
|
margin: 0;
|
|
margin: 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -786,7 +854,7 @@ export default {
|
|
}
|
|
}
|
|
.warning-history {
|
|
.warning-history {
|
|
display: flex;
|
|
display: flex;
|
|
- min-height: 130px;
|
|
|
|
|
|
+ min-height: 100px;
|
|
align-items: center;
|
|
align-items: center;
|
|
&-info {
|
|
&-info {
|
|
padding: 15px 30px 15px 0;
|
|
padding: 15px 30px 15px 0;
|
|
@@ -844,6 +912,7 @@ export default {
|
|
&-media {
|
|
&-media {
|
|
padding: 10px 0 10px 20px;
|
|
padding: 10px 0 10px 20px;
|
|
position: relative;
|
|
position: relative;
|
|
|
|
+ min-height: 100px;
|
|
z-index: 8;
|
|
z-index: 8;
|
|
|
|
|
|
&::before {
|
|
&::before {
|
|
@@ -868,7 +937,14 @@ export default {
|
|
height: 100px;
|
|
height: 100px;
|
|
margin: 5px 10px;
|
|
margin: 5px 10px;
|
|
border-radius: 6px;
|
|
border-radius: 6px;
|
|
- background-color: #626a82;
|
|
|
|
|
|
+ background-color: #e8edf3;
|
|
|
|
+ overflow: hidden;
|
|
|
|
+
|
|
|
|
+ > img {
|
|
|
|
+ width: 100%;
|
|
|
|
+ height: 100%;
|
|
|
|
+ object-fit: contain;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|