|
@@ -5,18 +5,22 @@ const myInfo: any = localStorage.getItem('userInfo');
|
|
|
let socket: any = {}; //ws实例对象
|
|
|
let timerManager: any = {}; //计时器管理
|
|
|
let parameter: any = {}; //参数
|
|
|
-let testTime: number = 60; //默认时长
|
|
|
+let testTime: number = 0; //默认时长
|
|
|
let userInfo: any = JSON.parse(myInfo); //用户信息
|
|
|
let beatTime: number = 10000; //心跳频率
|
|
|
let beatNumber: number = 0; //心跳次数
|
|
|
let loading: any = null; //遮罩层
|
|
|
let version: string = ''; //ws接口版本v2表示单ws多项目
|
|
|
+let examState: number = 0; //当前状态码
|
|
|
+let testList: any = []; //区列表
|
|
|
+let wkList: any = []; //工作站列表
|
|
|
|
|
|
export const initWs = (data: any, callback: any) => {
|
|
|
loading = ElLoading.service({ text: '正在初始化,请稍候', background: 'rgba(0, 0, 0, 0.7)' });
|
|
|
parameter = data.parameter;
|
|
|
testTime = data.testTime;
|
|
|
version = data.version || '';
|
|
|
+ testList = data.parameter.area.split(',');
|
|
|
socket = io(address + '/midexam', {
|
|
|
transports: ['websocket', 'polling'],
|
|
|
query: {
|
|
@@ -24,26 +28,52 @@ export const initWs = (data: any, callback: any) => {
|
|
|
sysuuid: token
|
|
|
}
|
|
|
});
|
|
|
-
|
|
|
+ let loadingTime = setTimeout(() => {
|
|
|
+ //30秒还在0状态就算超时
|
|
|
+ if (examState == 0) {
|
|
|
+ clearTimeout(loadingTime);
|
|
|
+ callback({ cmd: 'disconnect_request', data: { message: 'WS连接超时' } });
|
|
|
+ getExit();
|
|
|
+ }
|
|
|
+ }, 30000);
|
|
|
socket.on('connect', (e: any) => {
|
|
|
- getExamStarts();
|
|
|
- getNetWork((e: any) => {
|
|
|
- if (!e.status) {
|
|
|
- callback({ cmd: 'disconnect_request', data: { message: '工作站未响应' } });
|
|
|
- }
|
|
|
- });
|
|
|
+ if (testList.length > 1) {
|
|
|
+ //单WS多区
|
|
|
+ testList.forEach((item: any) => {
|
|
|
+ let examId = `${parameter.project}_${item}`;
|
|
|
+ getExamStarts(examId);
|
|
|
+ getNetWork(examId, (e: any) => {
|
|
|
+ if (!e.status) {
|
|
|
+ callback({ cmd: 'disconnect_request', data: { message: '工作站未响应' } });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ //单WS单区
|
|
|
+ getExamStarts();
|
|
|
+ getNetWork(data == null, (e: any) => {
|
|
|
+ if (!e.status) {
|
|
|
+ callback({ cmd: 'disconnect_request', data: { message: '工作站未响应' } });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
});
|
|
|
|
|
|
socket.on('msg2frontend', (e: any) => {
|
|
|
callback(e);
|
|
|
//实时状态
|
|
|
if (e.cmd === 'exam_status') {
|
|
|
+ examState = e.data;
|
|
|
beatNumber++;
|
|
|
}
|
|
|
//工作站状态
|
|
|
if (e.cmd === 'init_result') {
|
|
|
if (e.status == 666) {
|
|
|
- parameter.wk_id = e.data.wk_id;
|
|
|
+ let data = {
|
|
|
+ wk_id: e.data.wk_id,
|
|
|
+ examId: e.exam_id
|
|
|
+ };
|
|
|
+ wkList.push(data);
|
|
|
}
|
|
|
}
|
|
|
//测试违规
|
|
@@ -71,9 +101,11 @@ export const initWs = (data: any, callback: any) => {
|
|
|
}
|
|
|
//状态变更
|
|
|
if (e.cmd === 'set_exam_state') {
|
|
|
+ examState = e.data;
|
|
|
if (e.data == 3) {
|
|
|
//关闭遮罩层
|
|
|
loading?.close();
|
|
|
+ clearTimeout(loadingTime);
|
|
|
}
|
|
|
}
|
|
|
//新建测试后返回信息,获取result_id
|
|
@@ -138,11 +170,12 @@ export const sendMessage = (type: string, data: any, callback?: () => void) => {
|
|
|
/**
|
|
|
* 连接成功
|
|
|
*/
|
|
|
-const getExamStarts = () => {
|
|
|
+const getExamStarts = (data?: any) => {
|
|
|
+ let examId = data ? data : parameter.examId;
|
|
|
sendMessage(
|
|
|
'exam_starts',
|
|
|
{
|
|
|
- data: 'start_' + parameter.examId,
|
|
|
+ data: 'start_' + examId,
|
|
|
class_id: parameter.classes,
|
|
|
exam_type: parameter.standard,
|
|
|
gesture: parameter.gesture,
|
|
@@ -155,39 +188,87 @@ const getExamStarts = () => {
|
|
|
/**
|
|
|
* 创建测试
|
|
|
*/
|
|
|
-export const openOneTest = () => {
|
|
|
- let examId = parameter.examId;
|
|
|
- sendMessage('msgfrom_frontend', {
|
|
|
- data: {
|
|
|
- cmd: 'open_one_test',
|
|
|
- exam_id: examId
|
|
|
- }
|
|
|
+export const openOneTest = (data?: any) => {
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ let examId = data ? data : parameter.examId;
|
|
|
+ sendMessage('msgfrom_frontend', {
|
|
|
+ data: {
|
|
|
+ cmd: 'open_one_test',
|
|
|
+ exam_id: examId
|
|
|
+ }
|
|
|
+ });
|
|
|
+ let timer1 = setInterval(() => {
|
|
|
+ if (examState == 40) {
|
|
|
+ clearInterval(timer1);
|
|
|
+ clearTimeout(timer2);
|
|
|
+ resolve({ data: examState });
|
|
|
+ }
|
|
|
+ }, 250);
|
|
|
+ let timer2 = setTimeout(() => {
|
|
|
+ if (examState == 3) {
|
|
|
+ clearInterval(timer1);
|
|
|
+ clearTimeout(timer2);
|
|
|
+ reject({ cmd: 'disconnect_request', data: { message: '超时:open_one_test' } });
|
|
|
+ }
|
|
|
+ }, 30000);
|
|
|
});
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* 开始人脸识别
|
|
|
*/
|
|
|
-export const startFace = () => {
|
|
|
- let examId = parameter.examId;
|
|
|
- sendMessage('msgfrom_frontend', {
|
|
|
- data: {
|
|
|
- cmd: 'start_face_recognition',
|
|
|
- exam_id: examId
|
|
|
- }
|
|
|
+export const startFace = (data?: any) => {
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ let examId = data ? data : parameter.examId;
|
|
|
+ sendMessage('msgfrom_frontend', {
|
|
|
+ data: {
|
|
|
+ cmd: 'start_face_recognition',
|
|
|
+ exam_id: examId
|
|
|
+ }
|
|
|
+ });
|
|
|
+ let timer1 = setInterval(() => {
|
|
|
+ if (examState == 41) {
|
|
|
+ clearInterval(timer1);
|
|
|
+ clearTimeout(timer2);
|
|
|
+ resolve({ data: examState });
|
|
|
+ }
|
|
|
+ }, 250);
|
|
|
+ let timer2 = setTimeout(() => {
|
|
|
+ if (examState == 40) {
|
|
|
+ clearInterval(timer1);
|
|
|
+ clearTimeout(timer2);
|
|
|
+ reject({ cmd: 'disconnect_request', data: { message: '超时:start_face_recognition' } });
|
|
|
+ }
|
|
|
+ }, 30000);
|
|
|
});
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* 停止人脸识别
|
|
|
*/
|
|
|
-export const stopFace = () => {
|
|
|
- let examId = parameter.examId;
|
|
|
- sendMessage('msgfrom_frontend', {
|
|
|
- data: {
|
|
|
- cmd: 'stop_face_recognition',
|
|
|
- exam_id: examId
|
|
|
- }
|
|
|
+export const stopFace = (data?: any) => {
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ let examId = data ? data : parameter.examId;
|
|
|
+ sendMessage('msgfrom_frontend', {
|
|
|
+ data: {
|
|
|
+ cmd: 'stop_face_recognition',
|
|
|
+ exam_id: examId
|
|
|
+ }
|
|
|
+ });
|
|
|
+ let timer1 = setInterval(() => {
|
|
|
+ if (examState == 43) {
|
|
|
+ clearInterval(timer1);
|
|
|
+ clearTimeout(timer2);
|
|
|
+ resolve({ data: examState });
|
|
|
+ }
|
|
|
+ }, 250);
|
|
|
+ let timer2 = setTimeout(() => {
|
|
|
+ if (examState == 41) {
|
|
|
+ clearInterval(timer1);
|
|
|
+ clearTimeout(timer2);
|
|
|
+ reject({ cmd: 'disconnect_request', data: { message: '超时:stop_face_recognition' } });
|
|
|
+ }
|
|
|
+ }, 30000);
|
|
|
});
|
|
|
};
|
|
|
|
|
@@ -195,8 +276,7 @@ export const stopFace = () => {
|
|
|
* 确认并提交人脸
|
|
|
*/
|
|
|
export const faceConfirmOnly = (data: any, callback?: any) => {
|
|
|
- console.log(Array.isArray(data));
|
|
|
- let examId = parameter.examId;
|
|
|
+ let examId = data.exam_id ? data.examId : parameter.examId;
|
|
|
let myData = null;
|
|
|
if (Array.isArray(data)) {
|
|
|
//数组类型
|
|
@@ -228,8 +308,8 @@ export const faceConfirmOnly = (data: any, callback?: any) => {
|
|
|
/**
|
|
|
* 开始测试
|
|
|
*/
|
|
|
-export const startOneTest = (callback?: any) => {
|
|
|
- let examId = parameter.examId;
|
|
|
+export const startOneTest = (data?: any, callback?: any) => {
|
|
|
+ let examId = data ? data : parameter.examId;
|
|
|
sendMessage(
|
|
|
'msgfrom_frontend',
|
|
|
{
|
|
@@ -247,21 +327,37 @@ export const startOneTest = (callback?: any) => {
|
|
|
/**
|
|
|
* 停止测试
|
|
|
*/
|
|
|
-export const finishOneTest = () => {
|
|
|
- let examId = parameter.examId;
|
|
|
- sendMessage('msgfrom_frontend', {
|
|
|
- data: {
|
|
|
- cmd: 'finish_one_test',
|
|
|
- exam_id: examId
|
|
|
- }
|
|
|
+export const finishOneTest = (data?: any) => {
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ let examId = data ? data : parameter.examId;
|
|
|
+ sendMessage('msgfrom_frontend', {
|
|
|
+ data: {
|
|
|
+ cmd: 'finish_one_test',
|
|
|
+ exam_id: examId
|
|
|
+ }
|
|
|
+ });
|
|
|
+ let timer1 = setInterval(() => {
|
|
|
+ if (examState == 3) {
|
|
|
+ clearInterval(timer1);
|
|
|
+ clearTimeout(timer2);
|
|
|
+ resolve({ data: examState });
|
|
|
+ }
|
|
|
+ }, 250);
|
|
|
+ let timer2 = setTimeout(() => {
|
|
|
+ if (examState == 42) {
|
|
|
+ clearInterval(timer1);
|
|
|
+ clearTimeout(timer2);
|
|
|
+ reject({ cmd: 'disconnect_request', data: { message: '超时:finish_one_test' } });
|
|
|
+ }
|
|
|
+ }, 60000);
|
|
|
});
|
|
|
};
|
|
|
|
|
|
/**
|
|
|
* 关闭测试测试
|
|
|
*/
|
|
|
-export const closeOneTest = () => {
|
|
|
- let examId = parameter.examId;
|
|
|
+export const closeOneTest = (data?: any) => {
|
|
|
+ let examId = data ? data : parameter.examId;
|
|
|
sendMessage('msgfrom_frontend', {
|
|
|
data: {
|
|
|
cmd: 'close_one_test',
|
|
@@ -299,10 +395,13 @@ export const resumeFaceRecognitionChannels = (data: any) => {
|
|
|
/**
|
|
|
* 心跳
|
|
|
*/
|
|
|
-export const getNetWork = (callback?: any) => {
|
|
|
+export const getNetWork = (data: any, callback?: any) => {
|
|
|
timerManager.beat = setInterval(() => {
|
|
|
- let examId = parameter.examId;
|
|
|
- let wk_id = parameter.wk_id;
|
|
|
+ let obj = wkList.find((item: any) => {
|
|
|
+ return item.examId == data;
|
|
|
+ });
|
|
|
+ let examId = data ? data : parameter.examId;
|
|
|
+ let wk_id = obj.wk_id;
|
|
|
sendMessage(
|
|
|
'get_exam_status',
|
|
|
{
|
|
@@ -341,10 +440,23 @@ const getExit = () => {
|
|
|
//清除计时器
|
|
|
getClearTimer();
|
|
|
//通知工作站关闭
|
|
|
- sendMessage('exam_ends', {
|
|
|
- data: 'end_' + parameter.examId,
|
|
|
- class_id: parameter.classes
|
|
|
- });
|
|
|
+ if (testList.length > 1) {
|
|
|
+ //单WS多区
|
|
|
+ testList.forEach((item: any) => {
|
|
|
+ let examId = `${parameter.project}_${item}`;
|
|
|
+ sendMessage('exam_ends', {
|
|
|
+ data: 'end_' + examId,
|
|
|
+ class_id: parameter.classes
|
|
|
+ });
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ //单WS单区
|
|
|
+ let examId = parameter.examId;
|
|
|
+ sendMessage('exam_ends', {
|
|
|
+ data: 'end_' + examId,
|
|
|
+ class_id: parameter.classes
|
|
|
+ });
|
|
|
+ }
|
|
|
//如果正在连接就关闭
|
|
|
if (socket?.connected) {
|
|
|
socket?.close();
|