Browse Source

日常开发

林旭祥 9 months ago
parent
commit
ec6fa8b1f7

+ 57 - 10
src/components/MultipleItem/index.vue

@@ -39,6 +39,14 @@ const props = defineProps({
     type: String,
     default: ""
   },
+  examState: {
+    type: Number,
+    default: ""
+  },
+  needStart: {
+    type: Boolean,
+    default: false
+  },
 });
 
 
@@ -99,6 +107,7 @@ const getMessage = (e: any) => {
   if (e.cmd === 'set_exam_state') {
     examState.value = e.data;
     if (e.data === 3) {
+      initProject();
     }
     if (e.data === 40) {
       cleanData();
@@ -119,9 +128,8 @@ const getMessage = (e: any) => {
   }
   //人脸识别状态
   if (e.cmd === 'face_check_result') {
-    faceCheckStu.value = e.data[0] || e.data;
-    //工作站识别成功后停止识别并确定人脸
-    getStopFace();
+    let myData = e.data[0] || e.data;
+    returnStudent(myData);
   }
   //测试结束结果
   if (e.cmd === 'oneresult') {
@@ -143,6 +151,9 @@ const getMessage = (e: any) => {
 */
 const getOpenOneTestAndStartFace = async () => {
   console.log("examId", examId)
+  if (examState.value > 3) {
+    await closeOneTest(examId);
+  }
   await openOneTest(examId);
   await startFace(examId);
 };
@@ -151,6 +162,9 @@ const getOpenOneTestAndStartFace = async () => {
  * 停止人脸识别
 */
 const getStopFace = async () => {
+  if (examState.value != 41) {
+    return false;
+  }
   await stopFace(examId);
   if (faceCheckStu.value.student_id) {
     getFaceConfirmOnly();
@@ -177,13 +191,21 @@ const getFaceConfirmOnly = (data?: any) => {
  * 重新识别
 */
 const getRetestFace = () => {
+  if (props.examState == 42) {
+    return false;
+  }
   proxy?.$modal.confirm("确定重新识别吗?").then(() => {
-    //手动流程项目重新识别43返回41,42返回3
-    if (examState.value == 43) {
-      cleanData();
-      startFace(examId);
-    } else {
+    if (props.needStart == false) {
+      //自动流程项目重新识别直接返回3
       closeOneTest(examId);
+    } else {
+      //手动流程项目重新识别43返回41,42返回3
+      if (examState.value == 43) {
+        cleanData();
+        startFace(examId);
+      } else {
+        closeOneTest(examId);
+      }
     }
   }).finally(() => {
   });
@@ -193,8 +215,7 @@ const getRetestFace = () => {
  * 开始测试
 */
 const getStartOneTest = () => {
-  if (!faceCheckStu.value.student_id) {
-    proxy?.$modal.msgError("请选择人员!");
+  if (examState.value != 43 || !faceCheckStu.value.student_id) {
     return false;
   }
   startOneTest(examId, () => { })
@@ -210,6 +231,10 @@ const getAgain = async () => {
   if (examState.value == 42) {
     await finishOneTest(examId);
   }
+  //其他状态
+  if (examState.value > 3) {
+    await closeOneTest(examId);
+  }
   //重新走一次流程
   await openOneTest(examId);
   await startFace(examId);
@@ -246,6 +271,28 @@ const cleanData = () => {
   backReason.value = [];
 };
 
+/**
+ * 自动初始化项目
+*/
+const initProject = () => {
+  //自动项目定时进入下一步
+  if (props.needStart == false) {
+    let time = 0;
+    //控制新建测试的时间,第一次快,之后就慢
+    if (!faceCheckStu.value.student_id) {
+      time = 1000;
+    } else {
+      time = 6000;
+    }
+    setTimeout(() => {
+      //再加一个判断以免和再测一次冲突
+      if (examState.value == 3) {
+        getOpenOneTestAndStartFace();
+      }
+    }, time)
+  }
+};
+
 /**
  * 成绩
 */

+ 1 - 1
src/plugins/modal.ts

@@ -81,6 +81,6 @@ export default {
   },
   // 关闭遮罩层
   closeLoading() {
-    loadingInstance.close();
+    loadingInstance?.close();
   }
 };

+ 22 - 6
src/utils/ws.ts

@@ -357,12 +357,28 @@ export const finishOneTest = (data?: any) => {
  * 关闭测试测试
  */
 export const closeOneTest = (data?: any) => {
-  let examId = data ? data : parameter.examId;
-  sendMessage('msgfrom_frontend', {
-    data: {
-      cmd: 'close_one_test',
-      exam_id: examId
-    }
+  return new Promise((resolve, reject) => {
+    let examId = data ? data : parameter.examId;
+    sendMessage('msgfrom_frontend', {
+      data: {
+        cmd: 'close_one_test',
+        exam_id: examId
+      }
+    });
+    let timer1 = setInterval(() => {
+      if (examState == 3) {
+        clearInterval(timer1);
+        clearTimeout(timer2);
+        resolve({ data: examState });
+      }
+    }, 250);
+    let timer2 = setTimeout(() => {
+      if (examState != 3) {
+        clearInterval(timer1);
+        clearTimeout(timer2);
+        reject({ cmd: 'disconnect_request', data: { message: '超时:close_one_test' } });
+      }
+    }, 30000);
   });
 };
 

+ 1 - 1
src/views/home/index.vue

@@ -53,7 +53,7 @@ const getLogout = () => {
     proxy?.$http.common.logout(params).then((res: any) => {
     });
   }).finally(() => {
-    proxy?.$modal.closeLoading()
+    proxy?.$modal?.closeLoading()
     //清空缓存
     localStorage.clear();
     //跳转

+ 1 - 1
src/views/login/index.vue

@@ -51,7 +51,7 @@ const getLogin = () => {
       router.push({ path: '/' });
       getUserInfo();
     }
-  }).finally(() => proxy?.$modal.closeLoading());
+  }).finally(() => proxy?.$modal?.closeLoading());
 };
 
 //获取个人信息

+ 71 - 13
src/views/train/multiple.vue

@@ -6,13 +6,19 @@
     }}</div>
     <div style="display: flex; justify-content: space-between; margin-bottom: 40px;">
       <MultipleItem :ref="(el: any) => { multipleItemRef(el, index, item.area) }" v-for="(item, index) in testList"
-        :query="parameter" :area="item.area" :key="index" @returnData="returnData" />
+        :query="parameter" :area="item.area" :key="index" @returnData="returnData" :examState="examState"
+        :needStart="needStart" />
     </div>
     <div>
-      <div @click="getAgain" v-if="examState == 42 || showTestAgain">再测一次</div>
-      <div @click="getOpenOneTestAndStartFace" v-if="examState < 41">1、开始识别</div>
-      <div @click="getStopFace" v-if="examState == 41">2、停止人脸识别</div>
-      <div @click="getStartOneTest" v-if="examState == 43">3、开始测试</div>
+      <div v-if="needStart">
+        <div @click="getAgain" v-if="examState == 42 || showTestAgain">再测一次</div>
+        <div @click="getOpenOneTestAndStartFace" v-if="examState < 41">1、开始识别</div>
+        <div @click="getStopFace" v-if="examState == 41">2、停止人脸识别</div>
+        <div @click="getStartOneTest" v-if="examState == 43">3、开始测试</div>
+      </div>
+      <div v-else>
+        <div @click="getStartOneTest">3、开始测试</div>
+      </div>
     </div>
   </div>
 </template>
@@ -32,17 +38,17 @@ const data = reactive<any>({
   },
   userInfo: {},//用户信息
   examState: 0,//当前状态
+  needStart: false,//是否需要按钮
   showTestAgain: false,//再测一次按钮
   testList: [],//获取区列表
   multipleItemRefList: [],//获取区列表
 });
-const { timerManager, parameter, time, userInfo, examState, showTestAgain, testList, multipleItemRefList } = toRefs(data);
+const { timerManager, parameter, time, userInfo, examState, needStart, showTestAgain, testList, multipleItemRefList } = toRefs(data);
 
 /**
  * 创建组件实例
 */
 const multipleItemRef = (el: any, index: number, area: any) => {
-  el.area = area;
   multipleItemRefList.value[index] = el;
 }
 
@@ -50,11 +56,11 @@ const multipleItemRef = (el: any, index: number, area: any) => {
  * 开始识别
 */
 const getOpenOneTestAndStartFace = () => {
+  cleanData();
   examState.value = 41;
   for (let i = 0; i < multipleItemRefList.value.length; i++) {
     multipleItemRefList.value[i].getOpenOneTestAndStartFace()
   }
-  cleanData();
 };
 
 /**
@@ -81,6 +87,9 @@ const getStopFace = async () => {
  * 开始测试
 */
 const getStartOneTest = () => {
+  if (examState.value != 43) {
+    return false;
+  }
   let flag = false;
   for (let i = 0; i < testList.value.length; i++) {
     if (testList.value[i] && testList.value[i].faceCheckStu?.student_id) {
@@ -93,6 +102,10 @@ const getStartOneTest = () => {
   }
   examState.value = 42;
   for (let i = 0; i < multipleItemRefList.value.length; i++) {
+    if (testList.value[i].examState == 41) {
+      //正在识别的停止识别
+      multipleItemRefList.value[i].getStopFace()
+    }
     if (testList.value[i].examState == 43) {
       multipleItemRefList.value[i].getStartOneTest()
     }
@@ -207,8 +220,12 @@ const returnData = (data: any) => {
   //测试完成后回退状态
   if (examState.value == 42) {
     let flag = false;
-    for (let i = 0; i < testList.value.length; i++) {
-      if (testList.value[i] && testList.value[i].faceCheckStu?.student_id && testList.value[i].examState == 3) {
+    //只监听人脸识别的区
+    let newList = testList.value.filter((item: any) => {
+      return item?.faceCheckStu?.student_id;
+    })
+    for (let i = 0; i < newList.length; i++) {
+      if (newList[i] && newList[i].faceCheckStu?.student_id && newList[i].examState == 3) {
         flag = true;
       } else {
         return false;
@@ -218,6 +235,42 @@ const returnData = (data: any) => {
       examState.value = 3;
     }
   }
+
+  if (examState.value == 41) {
+    let flag = false;
+    //只监听人脸识别的区
+    let newList = testList.value.filter((item: any) => {
+      return item?.faceCheckStu?.student_id;
+    })
+    for (let i = 0; i < newList.length; i++) {
+      if (newList[i] && newList[i].faceCheckStu?.student_id && newList[i].examState == 43) {
+        flag = true;
+      } else {
+        return false;
+      }
+    }
+    if (flag) {
+      examState.value = 43;
+    }
+  }
+
+  if (examState.value == 0) {
+    let flag = false;
+    //只监听人脸识别的区
+    let newList = testList.value.filter((item: any) => {
+      return item?.faceCheckStu?.student_id;
+    })
+    for (let i = 0; i < newList.length; i++) {
+      if (newList[i] && newList[i].faceCheckStu?.student_id && newList[i].examState == 41) {
+        flag = true;
+      } else {
+        return false;
+      }
+    }
+    if (flag) {
+      examState.value = 41;
+    }
+  }
 };
 
 onMounted(() => {
@@ -242,12 +295,17 @@ onMounted(() => {
     }
     return obj;
   });
+  //需要开始按钮的项目
+  if (testList.value.length > 5) {
+    needStart.value = true;
+  }
   //加载WS
   initWs({ parameter: parameter.value, testTime: time.value.testTime, version: "v2" }, (data: any) => {
-    let obj = multipleItemRefList.value.find((item: any) => {
-      return project + '_' + item.area == data.exam_id;
+    let index = testList.value.findIndex((item: any) => {
+      let examId = `${project}_${item.area}`;
+      return examId == data.exam_id;
     })
-    obj?.getMessage(data);
+    multipleItemRefList.value[index]?.getMessage(data);
   });
   initSpeech();
 })

+ 13 - 0
src/views/train/run.vue

@@ -165,6 +165,9 @@ const getMessage = (e: any) => {
  * 开始识别
 */
 const getOpenOneTestAndStartFace = async () => {
+  if (examState.value > 3) {
+    await closeOneTest();
+  }
   await openOneTest();
   await startFace();
 };
@@ -173,6 +176,9 @@ const getOpenOneTestAndStartFace = async () => {
  * 停止人脸识别
 */
 const getStopFace = async () => {
+  if (examState.value != 41) {
+    return false;
+  }
   await stopFace();
   getFaceConfirmOnly();
 };
@@ -213,6 +219,9 @@ const getRetestFace = () => {
  * 开始测试
 */
 const getStartOneTest = () => {
+  if (examState.value != 43) {
+    return false;
+  }
   let list = faceStudentList.value.filter((item: any) => {
     return item.student_id;
   })
@@ -249,6 +258,10 @@ const getAgain = async () => {
   if (examState.value == 42) {
     await finishOneTest();
   }
+  //其他状态
+  if (examState.value > 3) {
+    await closeOneTest();
+  }
   //重新走一次流程
   await openOneTest();
   await startFace();

+ 15 - 3
src/views/train/test.vue

@@ -127,9 +127,8 @@ const getMessage = (e: any) => {
   }
   //人脸识别状态
   if (e.cmd === 'face_check_result') {
-    faceCheckStu.value = e.data[0] || e.data;
-    //工作站识别成功后停止识别并确定人脸
-    getStopFace();
+    let myData = e.data[0] || e.data;
+    returnStudent(myData);
   }
   //测试结束结果
   if (e.cmd === 'oneresult') {
@@ -150,6 +149,9 @@ const getMessage = (e: any) => {
  * 开始识别
 */
 const getOpenOneTestAndStartFace = async () => {
+  if (examState.value > 3) {
+    await closeOneTest();
+  }
   await openOneTest();
   await startFace();
 };
@@ -158,6 +160,9 @@ const getOpenOneTestAndStartFace = async () => {
  * 停止人脸识别
 */
 const getStopFace = async () => {
+  if (examState.value != 41) {
+    return false;
+  }
   await stopFace();
   if (faceCheckStu.value.student_id) {
     getFaceConfirmOnly();
@@ -209,6 +214,9 @@ const getRetestFace = () => {
  * 开始测试
 */
 const getStartOneTest = () => {
+  if (examState.value != 43 || !faceCheckStu.value.student_id) {
+    return false;
+  }
   if (!faceCheckStu.value.student_id) {
     proxy?.$modal.msgError("请选择人员!");
     return false;
@@ -242,6 +250,10 @@ const getAgain = async () => {
   if (examState.value == 42) {
     await finishOneTest();
   }
+  //其他状态
+  if (examState.value > 3) {
+    await closeOneTest();
+  }
   //重新走一次流程
   await openOneTest();
   await startFace();