Browse Source

日常开发

林旭祥 10 months ago
parent
commit
d6b03bffa9
4 changed files with 221 additions and 20 deletions
  1. 93 0
      src/utils/index.ts
  2. 12 5
      src/utils/ws.ts
  3. 111 11
      src/views/train/run.vue
  4. 5 4
      src/views/train/test.vue

+ 93 - 0
src/utils/index.ts

@@ -1,3 +1,4 @@
+import dayjs from 'dayjs';
 import dataDictionary from './dataDictionary';
 
 let utils = {
@@ -73,6 +74,98 @@ let utils = {
       m = h * 60 + m;
     }
     return `${m}:${s}`;
+  },
+
+  /**
+   * 跑步成绩格式化
+   */
+  runTime: (times: any, noMin = false, isLongRun: boolean) => {
+    if (times != undefined && times.toString().indexOf('.') != -1) {
+      times = Math.round((times + Number.EPSILON) * 100) / 100;
+    }
+    if (isLongRun) {
+      if (times <= 0) {
+        return '0分0秒';
+      }
+      // let isMinus = false
+      if (isNaN && isNaN(times)) {
+        times = 0;
+      }
+      if (times === -1) {
+        return '-';
+      }
+      if (times < 0) {
+        times = Math.abs(times);
+        // isMinus = true
+      }
+      if (noMin) {
+        // dayjs SS格式化后SS保持原样,  所以直接用SSS格式化后.slice(0, -1)去掉最后一位
+        return dayjs(+times * 1000)
+          .format('ss″SSS')
+          .slice(0, -1);
+      }
+      //console.log(times, "runTimerunTime");
+      if (times >= 3600) {
+        return (
+          Math.floor(times / 3600) +
+          '' +
+          dayjs(+times * 1000)
+            .format('mm:ss.SSS')
+            .slice(0, -1)
+        );
+      } else if (times >= 60) {
+        return dayjs(+times * 1000)
+          .format('m分s秒 ')
+          .slice(0, -1);
+      } else {
+        return dayjs(+times * 1000)
+          .format('m分s秒 ')
+          .slice(0, -1);
+      }
+    } else {
+      if (times <= 0) {
+        if (noMin) {
+          return '00″00';
+        } else {
+          return '00′00″00';
+        }
+      }
+      // let isMinus = false
+      if (isNaN && isNaN(times)) {
+        times = 0;
+      }
+      if (times === -1) {
+        return '-';
+      }
+      if (times < 0) {
+        times = Math.abs(times);
+        // isMinus = true
+      }
+      if (noMin) {
+        // dayjs SS格式化后SS保持原样,  所以直接用SSS格式化后.slice(0, -1)去掉最后一位
+        return dayjs(+times * 1000)
+          .format('ss″SSS')
+          .slice(0, -1);
+      }
+      //console.log(times, "runTimerunTime");
+      if (times >= 3600) {
+        return (
+          Math.floor(times / 3600) +
+          '' +
+          dayjs(+times * 1000)
+            .format('mm:ss.SSS')
+            .slice(0, -1)
+        );
+      } else if (times >= 60) {
+        return dayjs(+times * 1000)
+          .format('mm′ss″SSS')
+          .slice(0, -1);
+      } else {
+        return dayjs(+times * 1000)
+          .format('ss″SSS')
+          .slice(0, -1);
+      }
+    }
   }
 };
 export default utils;

+ 12 - 5
src/utils/ws.ts

@@ -27,6 +27,11 @@ export const initWs = (data: any, callback: any) => {
 
   socket.on('connect', (e: any) => {
     getExamStarts();
+    getNetWork((e: any) => {
+      if (!e.status) {
+        callback({ cmd: 'disconnect_request', data: { message: '工作站未响应' } });
+      }
+    });
   });
 
   socket.on('msg2frontend', (e: any) => {
@@ -59,7 +64,9 @@ export const initWs = (data: any, callback: any) => {
     //断线状态
     if (e.cmd === 'disconnect_request') {
       let message = e.data.message;
-      ElMessage({ message: message, type: 'error', duration: 5 * 1000 });
+      if (message) {
+        ElMessage({ message: message, type: 'error', duration: 5 * 1000 });
+      }
       getExit();
     }
     //状态变更
@@ -141,9 +148,7 @@ const getExamStarts = () => {
       gesture: parameter.gesture,
       test_time: testTime
     },
-    () => {
-      getNetWork();
-    }
+    () => {}
   );
 };
 
@@ -310,7 +315,9 @@ export const getNetWork = (callback?: any) => {
         let beforBeatNumber = JSON.parse(JSON.stringify(beatNumber));
         setTimeout(() => {
           if (beforBeatNumber == beatNumber) {
-            callback();
+            callback({ status: false });
+          } else {
+            callback({ status: true });
           }
         }, 5000);
       }

+ 111 - 11
src/views/train/run.vue

@@ -9,9 +9,23 @@
         <div><el-avatar :src="item.face_pic" @click="getChooseStudent(item.track)" />
         </div>
         <div>{{ item.student_name || "未检录" }}</div>
-        <div class="menuBtn" v-if="examState <= 42" @click="getChooseStudent(item.track)">检录
+
+        <view>
+          <view v-if="item.timeStr" class="achievement">
+            {{ item.timeStr || "-" }}
+          </view>
+          <view v-if="isBackRun && item.student_id"> 往返次数:{{ item.turns || "0" }} </view>
+        </view>
+
+        <view class="menuBtn" v-if="isBackRun && item.student_id"> 往返次数:{{ item.turns || "0" }} </view>
+
+        <div class="menuBtn" v-if="examState < 42" @click="getChooseStudent(item.track)">检录
         </div>
 
+        <div class="menuBtn" v-if="examState == 43">等待开始测试</div>
+        <div class="menuBtn" v-if="examState == 42">正在测试</div>
+        <view class="menuBtn btn3" v-if="examState == 3 && !item.timeStr && item.isfinish && item.student_id">异常
+        </view>
       </div>
     </div>
     <div>当前状态:({{ examState == 3 ? "初始化完成" : examState == 40 ? "创建测试" : examState == 41 ? "正在人脸识别"
@@ -24,7 +38,7 @@
       <div @click="getStopFace" v-if="examState == 41">3、停止人脸识别</div>
       <div @click="getStartOneTest" v-if="examState == 43">5、开始测试</div>
     </div>
-    <div @click="getRetest" v-if="examState == 42">再测一次</div>
+    <div @click="getRetest" v-if="examState == 42 || showTestAgain">再测一次</div>
     <div @click="confirmExit">退出</div>
     <ChooseStudent ref="chooseStudentRef" @returnData="returnStudent" />
   </div>
@@ -32,7 +46,7 @@
 
 <script setup name="TrainTest" lang="ts">
 import { initSpeech, speckText, speckCancel, chineseNumber } from '@/utils/speech'
-import { initWs, examEnds, openOneTest, startFace, stopFace, faceConfirmOnly, startOneTest, finishOneTest, closeOneTest, getNetWork, suspendFaceRecognitionChannels, resumeFaceRecognitionChannels } from '@/utils/ws'
+import { initWs, examEnds, openOneTest, startFace, stopFace, faceConfirmOnly, startOneTest, finishOneTest, closeOneTest, suspendFaceRecognitionChannels, resumeFaceRecognitionChannels } from '@/utils/ws'
 import dataDictionary from "@/utils/dataDictionary"
 const { proxy } = getCurrentInstance() as any;
 const router = useRouter();
@@ -48,14 +62,13 @@ const data = reactive<any>({
   userInfo: {},//用户信息
   examState: 0,//当前状态
   resultId: null,//测试ID
-  currentResultObj: {},//成绩
   unit: "",//单位
-  backReason: [],//犯规项
   needStart: false,//是否需要按钮
   faceStudentList: [],//跑道和人信息
   currentTrack: null,//当前跑道
+  showTestAgain: false,//再测一次按钮
 });
-const { timerManager, parameter, time, userInfo, examState, resultId, currentResultObj, unit, backReason, needStart, faceStudentList, currentTrack } = toRefs(data);
+const { timerManager, parameter, time, userInfo, examState, resultId, unit, needStart, faceStudentList, currentTrack, showTestAgain } = toRefs(data);
 
 /**
  * 接收消息
@@ -102,7 +115,9 @@ const getMessage = (e: any) => {
   }
   //断线状态
   if (e.cmd === 'disconnect_request') {
-    speckText(e.data.message);
+    if (e.data.message) {
+      speckText(e.data.message);
+    }
     getExit();
   }
   //状态变更
@@ -133,7 +148,7 @@ const getMessage = (e: any) => {
   //测试结束结果
   if (e.cmd === 'oneresult') {
     if (e.data.length) {
-      let data = e.data[0];
+      let data = e.data;
       getAchievement(data)
     }
   }
@@ -203,6 +218,7 @@ const getStartOneTest = () => {
   //   return false;
   // }
   startOneTest(() => {
+    showTestAgain.value = true;
     //计时项目才开
     if (needStart.value == true) {
       //时间为0的为正计时,大于0的为倒计时
@@ -335,6 +351,17 @@ const returnStudent = (data: any) => {
 */
 const cleanData = () => {
   time.value.countdownNum = time.value.testTime;
+  showTestAgain.value = false;
+  //重置全部
+  let list = faceStudentList.value.map((item: any) => {
+    let obj = {
+      student_id: null,
+      track: item.track,
+      isfinish: false,
+    }
+    return obj;
+  })
+  faceStudentList.value = list;
 };
 
 /**
@@ -352,6 +379,28 @@ const countdownNumFormat = computed(() => {
   return proxy?.$utils.timeFormat(time.value.countdownNum);
 });
 
+/**
+ * 判断是否为折返跑
+*/
+const isBackRun = computed(() => {
+  let project = parameter.value.project;
+  return (
+    project.slice(0, 3) === "run" &&
+    project.includes("x")
+  );
+});
+
+/**
+ * 判断是否为长跑
+*/
+const isLongRun = computed(() => {
+  let project = parameter.value.project;
+  if (project.replace('run', '') > 799) {
+    return true;
+  } else {
+    return false;
+  }
+});
 /**
  * 倒计时
 */
@@ -376,6 +425,56 @@ const getCounting = (type: string) => {
  * 成绩
 */
 const getAchievement = (data: any) => {
+  if (!data) {
+    return;
+  }
+  let dataList = data.map((item: any) => {
+    if (item.track && item.times != 0) {
+      if (typeof item.times === "string") {
+        item.times = JSON.parse(item.times);
+      }
+      if (typeof item.times === "object") {
+        item.timeStr = proxy?.$utils.runTime(item.times[item.times.length - 1], false, isLongRun.value);
+        item.turns = Math.floor(item.times.length / 2);
+        if (item.times.length) {
+          item.timeTotal = item.times.reduce((total: any, num: any) => {
+            return total + Number(num);
+          });
+        } else {
+          item.timeTotal = 0;
+        }
+      } else {
+        item.timeStr = proxy?.$utils.runTime(item.times, false, isLongRun.value);
+        item.turns = 0;
+        item.timeTotal = 0;
+      }
+    }
+    return item
+  });
+  faceStudentList.value.forEach((item: any, index: any) => {
+    let obj = dataList.find((items: any) => {
+      return parseInt(item.track) == parseInt(items.track);
+    })
+    //加this.result_id == obj.result_id是避免抢跑的时候上一把成绩没返回会被覆盖的可能,要新的ID才能赋值
+    if (obj != undefined && resultId.value == obj.result_id) {
+      if (
+        parseInt(obj.track) === parseInt(item.track) ||
+        isLongRun
+      ) {
+        faceStudentList.value[index].timeStr = obj.timeStr
+        faceStudentList.value[index].times = obj.times
+        faceStudentList.value[index].timeTotal = obj.timeTotal
+        faceStudentList.value[index].tid_num = obj.tid_num
+        faceStudentList.value[index].score = obj.score
+        faceStudentList.value[index].isfinish = obj.isfinish
+        faceStudentList.value[index].turns = obj.turns
+        faceStudentList.value[index].result_id = obj.result_id
+      } else {
+        faceStudentList.value[index].trackFalse = true;
+        faceStudentList.value[index].timeStr = "跑道错误";
+      }
+    }
+  });
 };
 
 onMounted(() => {
@@ -402,9 +501,10 @@ onMounted(() => {
   initWs({ parameter: parameter.value, testTime: time.value.testTime }, (data: any) => {
     getMessage(data);
   });
-  getNetWork(() => {
-    getExit();
-  });
+  //连接状态
+  // getNetWork(() => {
+  //   getExit();
+  // });
   initSpeech();
 })
 

+ 5 - 4
src/views/train/test.vue

@@ -36,7 +36,7 @@
 
 <script setup name="TrainTest" lang="ts">
 import { initSpeech, speckText, speckCancel, chineseNumber } from '@/utils/speech'
-import { initWs, examEnds, openOneTest, startFace, stopFace, faceConfirmOnly, startOneTest, finishOneTest, closeOneTest, getNetWork, suspendFaceRecognitionChannels, resumeFaceRecognitionChannels } from '@/utils/ws'
+import { initWs, examEnds, openOneTest, startFace, stopFace, faceConfirmOnly, startOneTest, finishOneTest, closeOneTest, suspendFaceRecognitionChannels, resumeFaceRecognitionChannels } from '@/utils/ws'
 import dataDictionary from "@/utils/dataDictionary"
 const { proxy } = getCurrentInstance() as any;
 const router = useRouter();
@@ -530,9 +530,10 @@ onMounted(() => {
   initWs({ parameter: parameter.value, testTime: time.value.testTime }, (data: any) => {
     getMessage(data);
   });
-  getNetWork(() => {
-    getExit();
-  });
+  //连接状态
+  // getNetWork(() => {
+  //   getExit();
+  // });
   initSpeech();
 })