|
@@ -2,20 +2,10 @@
|
|
<div class="realtime-monitoring">
|
|
<div class="realtime-monitoring">
|
|
<div class="realtime-top clear-float">
|
|
<div class="realtime-top clear-float">
|
|
<p>考场名称:{{ curExamBatch.name }}</p>
|
|
<p>考场名称:{{ curExamBatch.name }}</p>
|
|
- <div
|
|
|
|
- class="el-select el-select--small"
|
|
|
|
- @click="$refs.ExamBatchDialog.open()"
|
|
|
|
- >
|
|
|
|
- <div class="el-input el-input--small el-input--suffix">
|
|
|
|
- <div class="el-input__inner">{{ curExamBatch.label }}</div>
|
|
|
|
- <span class="el-input__suffix">
|
|
|
|
- <span class="el-input__suffix-inner"
|
|
|
|
- ><i
|
|
|
|
- class="el-select__caret el-input__icon el-icon-arrow-up"
|
|
|
|
- ></i></span
|
|
|
|
- ></span>
|
|
|
|
- </div>
|
|
|
|
- </div>
|
|
|
|
|
|
+ <p class="realtime-top-select" @click="$refs.ExamBatchDialog.open()">
|
|
|
|
+ <span>{{ curExamBatch.label || "请选择批次" }}</span>
|
|
|
|
+ <i class="el-icon-caret-bottom"></i>
|
|
|
|
+ </p>
|
|
<text-clock></text-clock>
|
|
<text-clock></text-clock>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
@@ -84,20 +74,20 @@
|
|
clearable
|
|
clearable
|
|
>
|
|
>
|
|
<el-option
|
|
<el-option
|
|
- v-for="item in batchs"
|
|
|
|
- :key="item.id"
|
|
|
|
- :value="item.id"
|
|
|
|
- :label="item.name"
|
|
|
|
|
|
+ v-for="(val, key) in BOOLEAN_TYPE"
|
|
|
|
+ :key="key"
|
|
|
|
+ :value="key * 1"
|
|
|
|
+ :label="val"
|
|
></el-option>
|
|
></el-option>
|
|
</el-select>
|
|
</el-select>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
<el-form-item>
|
|
<el-form-item>
|
|
<el-select v-model="filter.status" placeholder="考试状态" clearable>
|
|
<el-select v-model="filter.status" placeholder="考试状态" clearable>
|
|
<el-option
|
|
<el-option
|
|
- v-for="item in exams"
|
|
|
|
- :key="item.id"
|
|
|
|
- :value="item.id"
|
|
|
|
- :label="item.name"
|
|
|
|
|
|
+ v-for="(val, key) in STUDENT_ONLINE_STATUS"
|
|
|
|
+ :key="key"
|
|
|
|
+ :value="key"
|
|
|
|
+ :label="val"
|
|
></el-option>
|
|
></el-option>
|
|
</el-select>
|
|
</el-select>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
@@ -108,10 +98,10 @@
|
|
clearable
|
|
clearable
|
|
>
|
|
>
|
|
<el-option
|
|
<el-option
|
|
- v-for="item in exams"
|
|
|
|
- :key="item.id"
|
|
|
|
- :value="item.id"
|
|
|
|
- :label="item.name"
|
|
|
|
|
|
+ v-for="(val, key) in BOOLEAN_TYPE"
|
|
|
|
+ :key="key"
|
|
|
|
+ :value="key * 1"
|
|
|
|
+ :label="val"
|
|
></el-option>
|
|
></el-option>
|
|
</el-select>
|
|
</el-select>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
@@ -189,29 +179,37 @@
|
|
<el-table-column prop="name" label="姓名"></el-table-column>
|
|
<el-table-column prop="name" label="姓名"></el-table-column>
|
|
<el-table-column prop="courseName" label="科目名称"></el-table-column>
|
|
<el-table-column prop="courseName" label="科目名称"></el-table-column>
|
|
<el-table-column prop="courseCode" label="科目代码"></el-table-column>
|
|
<el-table-column prop="courseCode" label="科目代码"></el-table-column>
|
|
- <el-table-column prop="subjectCode" label="剩余时间"></el-table-column>
|
|
|
|
- <el-table-column prop="paperDownload" label="试题下载"></el-table-column>
|
|
|
|
|
|
+ <el-table-column prop="remainTime" label="剩余时间"></el-table-column>
|
|
|
|
+ <el-table-column prop="paperDownload" label="试题下载">
|
|
|
|
+ <span slot-scope="scope">
|
|
|
|
+ {{ BOOLEAN_TYPE[scope.row.paperDownload] }}
|
|
|
|
+ </span>
|
|
|
|
+ </el-table-column>
|
|
<el-table-column prop="status" label="考试状态"></el-table-column>
|
|
<el-table-column prop="status" label="考试状态"></el-table-column>
|
|
<el-table-column prop="progress" label="进度"></el-table-column>
|
|
<el-table-column prop="progress" label="进度"></el-table-column>
|
|
- <el-table-column prop="clientCommunicationStatus" label="通讯">
|
|
|
|
|
|
+ <el-table-column prop="clientWebsocketStatus" label="通讯">
|
|
<template slot-scope="scope">
|
|
<template slot-scope="scope">
|
|
<right-or-wrong
|
|
<right-or-wrong
|
|
- :status="scope.row.clientCommunicationStatus"
|
|
|
|
|
|
+ :status="CLIENT_WEBSOCKET_STATUS[scope.row.clientWebsocketStatus]"
|
|
></right-or-wrong>
|
|
></right-or-wrong>
|
|
</template>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table-column>
|
|
- <el-table-column prop="subjectCode" label="推流通讯">
|
|
|
|
|
|
+ <el-table-column prop="monitorStatusSource" label="推流通讯">
|
|
<template slot-scope="scope">
|
|
<template slot-scope="scope">
|
|
<right-or-wrong
|
|
<right-or-wrong
|
|
- :status="scope.row.clientCommunicationStatus"
|
|
|
|
|
|
+ :status="MONITOR_STATUS_SOURCE[scope.row.monitorStatusSource]"
|
|
></right-or-wrong>
|
|
></right-or-wrong>
|
|
</template>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table-column>
|
|
<el-table-column prop="clientCurrentIp" label="IP"></el-table-column>
|
|
<el-table-column prop="clientCurrentIp" label="IP"></el-table-column>
|
|
- <el-table-column prop="updateTime" label="更新时间"></el-table-column>
|
|
|
|
|
|
+ <el-table-column prop="updateTime" label="更新时间">
|
|
|
|
+ <span slot-scope="scope">
|
|
|
|
+ {{ scope.row.updateTime | datetimeFilter }}
|
|
|
|
+ </span>
|
|
|
|
+ </el-table-column>
|
|
<el-table-column prop="warningCount" label="预警数"></el-table-column>
|
|
<el-table-column prop="warningCount" label="预警数"></el-table-column>
|
|
<el-table-column prop="breachStatus" label="违纪"></el-table-column>
|
|
<el-table-column prop="breachStatus" label="违纪"></el-table-column>
|
|
- <el-table-column label="操作">
|
|
|
|
|
|
+ <el-table-column label="操作" width="100">
|
|
<template slot-scope="scope">
|
|
<template slot-scope="scope">
|
|
<el-button
|
|
<el-button
|
|
class="btn-table-icon"
|
|
class="btn-table-icon"
|
|
@@ -264,6 +262,7 @@ import {
|
|
invigilateList,
|
|
invigilateList,
|
|
invigilateVideoList,
|
|
invigilateVideoList,
|
|
invigilateExamFinish,
|
|
invigilateExamFinish,
|
|
|
|
+ monitorCallCount,
|
|
} from "@/api/invigilation";
|
|
} from "@/api/invigilation";
|
|
import ExamBatchDialog from "./ExamBatchDialog";
|
|
import ExamBatchDialog from "./ExamBatchDialog";
|
|
import RightOrWrong from "../common/RightOrWrong";
|
|
import RightOrWrong from "../common/RightOrWrong";
|
|
@@ -271,6 +270,12 @@ import InvigilationStudent from "../common/InvigilationStudent";
|
|
import SummaryLine from "../common/SummaryLine";
|
|
import SummaryLine from "../common/SummaryLine";
|
|
import handleRollupDialog from "./handleRollupDialog";
|
|
import handleRollupDialog from "./handleRollupDialog";
|
|
import TextClock from "../common/TextClock";
|
|
import TextClock from "../common/TextClock";
|
|
|
|
+import {
|
|
|
|
+ BOOLEAN_TYPE,
|
|
|
|
+ STUDENT_ONLINE_STATUS,
|
|
|
|
+ CLIENT_WEBSOCKET_STATUS,
|
|
|
|
+ MONITOR_STATUS_SOURCE,
|
|
|
|
+} from "@/constant/constants";
|
|
|
|
|
|
export default {
|
|
export default {
|
|
name: "realtime-monitoring",
|
|
name: "realtime-monitoring",
|
|
@@ -293,6 +298,10 @@ export default {
|
|
maxWarningCount: undefined,
|
|
maxWarningCount: undefined,
|
|
minWarningCount: undefined,
|
|
minWarningCount: undefined,
|
|
},
|
|
},
|
|
|
|
+ BOOLEAN_TYPE,
|
|
|
|
+ STUDENT_ONLINE_STATUS,
|
|
|
|
+ CLIENT_WEBSOCKET_STATUS,
|
|
|
|
+ MONITOR_STATUS_SOURCE,
|
|
hasNewWarning: false,
|
|
hasNewWarning: false,
|
|
communicationCount: 0,
|
|
communicationCount: 0,
|
|
curExamBatch: {},
|
|
curExamBatch: {},
|
|
@@ -306,53 +315,23 @@ export default {
|
|
exams: [],
|
|
exams: [],
|
|
subjects: [],
|
|
subjects: [],
|
|
pageType: "0",
|
|
pageType: "0",
|
|
- dataList: [
|
|
|
|
|
|
+ dataList: [],
|
|
|
|
+ videoList: [
|
|
{
|
|
{
|
|
- breachStatus: 0,
|
|
|
|
- clientCommunicationStatus: 0,
|
|
|
|
- clientCurrentIp: "192.168.10.12",
|
|
|
|
- courseCode: "F001",
|
|
|
|
- courseName: "数学",
|
|
|
|
- examActivityId: 0,
|
|
|
|
- examId: 111,
|
|
|
|
- examRecordId: 222,
|
|
|
|
- examStudentId: 333,
|
|
|
|
- identity: "000000000000008",
|
|
|
|
- monitorStatusSource: "",
|
|
|
|
- name: "楚一一",
|
|
|
|
- paperDownload: 0,
|
|
|
|
- progress: 0,
|
|
|
|
- roomCode: "123",
|
|
|
|
- roomName: "第一教师",
|
|
|
|
- status: "1",
|
|
|
|
- statusCode: "1",
|
|
|
|
- updateTime: "2020-12-12",
|
|
|
|
- warningCount: 0,
|
|
|
|
|
|
+ name: "刘西西",
|
|
|
|
+ identity: "000000000000000008",
|
|
|
|
+ progress: "52%",
|
|
|
|
+ warning: false,
|
|
|
|
+ netbreak: true,
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- breachStatus: 0,
|
|
|
|
- clientCommunicationStatus: 1,
|
|
|
|
- clientCurrentIp: "192.168.10.12",
|
|
|
|
- courseCode: "F001",
|
|
|
|
- courseName: "数学",
|
|
|
|
- examActivityId: 0,
|
|
|
|
- examId: 111,
|
|
|
|
- examRecordId: 222,
|
|
|
|
- examStudentId: 333,
|
|
|
|
- identity: "000000000000008",
|
|
|
|
- monitorStatusSource: "",
|
|
|
|
- name: "楚一一",
|
|
|
|
- paperDownload: 0,
|
|
|
|
- progress: 0,
|
|
|
|
- roomCode: "123",
|
|
|
|
- roomName: "第一教师",
|
|
|
|
- status: "1",
|
|
|
|
- statusCode: "1",
|
|
|
|
- updateTime: "2020-12-12",
|
|
|
|
- warningCount: 0,
|
|
|
|
|
|
+ name: "刘西西",
|
|
|
|
+ identity: "000000000000000008",
|
|
|
|
+ progress: "52%",
|
|
|
|
+ warning: true,
|
|
|
|
+ netbreak: false,
|
|
},
|
|
},
|
|
],
|
|
],
|
|
- videoList: [],
|
|
|
|
viewingAngles: [
|
|
viewingAngles: [
|
|
{
|
|
{
|
|
code: "1",
|
|
code: "1",
|
|
@@ -370,23 +349,23 @@ export default {
|
|
};
|
|
};
|
|
},
|
|
},
|
|
mounted() {
|
|
mounted() {
|
|
- window.inviligateWaining = (id) => {
|
|
|
|
- console.log(id);
|
|
|
|
- };
|
|
|
|
- this.$notify({
|
|
|
|
- duration: 0,
|
|
|
|
- dangerouslyUseHTMLString: true,
|
|
|
|
- customClass: "msg-monitor-magbox",
|
|
|
|
- position: "bottom-right",
|
|
|
|
- offset: 50,
|
|
|
|
- message: `
|
|
|
|
- <div class="msg-monitor">
|
|
|
|
- <span class="msg-monitor-icon"><i class="icon icon-warning"></i></span>
|
|
|
|
- <span>注意:<b>张三意识</b>发现违纪,</span>
|
|
|
|
- <span class="msg-monitor-action" onclick="window.inviligateWaining(12)">立即处理</span>
|
|
|
|
- </div>
|
|
|
|
- `,
|
|
|
|
- });
|
|
|
|
|
|
+ // window.inviligateWaining = (id) => {
|
|
|
|
+ // console.log(id);
|
|
|
|
+ // };
|
|
|
|
+ // this.$notify({
|
|
|
|
+ // duration: 5,
|
|
|
|
+ // dangerouslyUseHTMLString: true,
|
|
|
|
+ // customClass: "msg-monitor-magbox",
|
|
|
|
+ // position: "bottom-right",
|
|
|
|
+ // offset: 50,
|
|
|
|
+ // message: `
|
|
|
|
+ // <div class="msg-monitor">
|
|
|
|
+ // <span class="msg-monitor-icon"><i class="icon icon-warning"></i></span>
|
|
|
|
+ // <span>注意:<b>张三意识</b>发现违纪,</span>
|
|
|
|
+ // <span class="msg-monitor-action" onclick="window.inviligateWaining(12)">立即处理</span>
|
|
|
|
+ // </div>
|
|
|
|
+ // `,
|
|
|
|
+ // });
|
|
},
|
|
},
|
|
methods: {
|
|
methods: {
|
|
async getList() {
|
|
async getList() {
|
|
@@ -414,11 +393,17 @@ export default {
|
|
this.current = page;
|
|
this.current = page;
|
|
this.getList();
|
|
this.getList();
|
|
},
|
|
},
|
|
|
|
+ async getMonitorCallCount() {
|
|
|
|
+ if (!this.filter.examId) return;
|
|
|
|
+ const res = await monitorCallCount(this.filter.examId);
|
|
|
|
+ this.communicationCount = res.data.data.count || 0;
|
|
|
|
+ },
|
|
examChange(examBatch) {
|
|
examChange(examBatch) {
|
|
if (!examBatch) return;
|
|
if (!examBatch) return;
|
|
this.filter.examId = examBatch.id;
|
|
this.filter.examId = examBatch.id;
|
|
this.curExamBatch = examBatch;
|
|
this.curExamBatch = examBatch;
|
|
- // this.toPage(1);
|
|
|
|
|
|
+ this.toPage(1);
|
|
|
|
+ this.getMonitorCallCount();
|
|
},
|
|
},
|
|
pageTypeChange(pageType) {
|
|
pageTypeChange(pageType) {
|
|
this.pageType = pageType;
|
|
this.pageType = pageType;
|
|
@@ -444,11 +429,16 @@ export default {
|
|
this.getList();
|
|
this.getList();
|
|
},
|
|
},
|
|
async finishInvigilationExam() {
|
|
async finishInvigilationExam() {
|
|
- const result = await this.$confirm("确定要结束监考吗?", {
|
|
|
|
- confirmButtonText: "确定",
|
|
|
|
- cancelButtonText: "取消",
|
|
|
|
- type: "confirm",
|
|
|
|
- }).catch(() => {});
|
|
|
|
|
|
+ const result = await this.$confirm(
|
|
|
|
+ "确定要结束监考吗?",
|
|
|
|
+ "结束监考确认提醒",
|
|
|
|
+ {
|
|
|
|
+ confirmButtonText: "确定",
|
|
|
|
+ cancelButtonText: "取消",
|
|
|
|
+ iconClass: "el-icon-warning",
|
|
|
|
+ customClass: "el-message-box__error",
|
|
|
|
+ }
|
|
|
|
+ ).catch(() => {});
|
|
|
|
|
|
if (!result) return;
|
|
if (!result) return;
|
|
|
|
|
|
@@ -484,6 +474,7 @@ export default {
|
|
border-radius: 6px;
|
|
border-radius: 6px;
|
|
color: #fff;
|
|
color: #fff;
|
|
margin-bottom: 30px;
|
|
margin-bottom: 30px;
|
|
|
|
+ line-height: 32px;
|
|
|
|
|
|
&::before {
|
|
&::before {
|
|
content: "";
|
|
content: "";
|
|
@@ -497,19 +488,33 @@ export default {
|
|
background-size: 100% 100%;
|
|
background-size: 100% 100%;
|
|
}
|
|
}
|
|
|
|
|
|
- > * {
|
|
|
|
|
|
+ > p {
|
|
float: left;
|
|
float: left;
|
|
- line-height: 32px;
|
|
|
|
margin: 0;
|
|
margin: 0;
|
|
}
|
|
}
|
|
- .el-select {
|
|
|
|
- min-width: 200px;
|
|
|
|
- }
|
|
|
|
> p:first-child {
|
|
> p:first-child {
|
|
margin-right: 40px;
|
|
margin-right: 40px;
|
|
min-width: 150px;
|
|
min-width: 150px;
|
|
}
|
|
}
|
|
- > p:last-child {
|
|
|
|
|
|
+ .realtime-top-select {
|
|
|
|
+ display: inline-block;
|
|
|
|
+ position: relative;
|
|
|
|
+ height: 32px;
|
|
|
|
+ line-height: 32px;
|
|
|
|
+ border-radius: 6px;
|
|
|
|
+ min-width: 200px;
|
|
|
|
+ background-color: #fff;
|
|
|
|
+ color: #1886fe;
|
|
|
|
+ padding: 0 26px 0 12px;
|
|
|
|
+ cursor: pointer;
|
|
|
|
+
|
|
|
|
+ > i {
|
|
|
|
+ position: absolute;
|
|
|
|
+ right: 8px;
|
|
|
|
+ top: 9px;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ .text-clock {
|
|
float: right;
|
|
float: right;
|
|
font-size: 12px;
|
|
font-size: 12px;
|
|
opacity: 0.8;
|
|
opacity: 0.8;
|