|
@@ -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();
|
|
|
})
|
|
|
|