林旭祥 преди 8 месеца
родител
ревизия
9b94d917d7
променени са 5 файла, в които са добавени 167 реда и са изтрити 64 реда
  1. 40 2
      src/components/ChooseStudent/index.vue
  2. 1 0
      src/components/ReportList/index.vue
  3. 5 0
      src/utils/animate.ts
  4. 2 1
      src/utils/speech.ts
  5. 119 61
      src/views/train/run.vue

+ 40 - 2
src/components/ChooseStudent/index.vue

@@ -44,8 +44,9 @@
           </div>
           <div class="multipleList" v-if="props.selectType == 'multiple'">
             <ul>
-              <li v-for="item in selectValue">
-                <div><el-avatar :src="item.face_pic || item.logo_url" /></div>
+              <li v-for="item in selectValue" :key="item.student_id">
+                <div class="pic"><el-avatar :src="item.face_pic || item.logo_url" /><i class="del"
+                    @click="delChooseStudent(item)"></i></div>
                 <div>{{ item.name }}</div>
               </li>
             </ul>
@@ -206,6 +207,13 @@ const handleDblclick = (data: any) => {
   }
 };
 
+//删除已选学生
+const delChooseStudent = (data: any) => {
+  selectValue.value = selectValue.value.filter((item: any) => {
+    return item.student_id != data.student_id
+  })
+};
+
 //确定
 const confirm = () => {
   console.log("selectValue.value", selectValue.value)
@@ -379,6 +387,36 @@ defineExpose({
             margin-right: 20px;
             text-align: center;
             flex-shrink: 0;
+
+            .pic {
+              position: relative;
+
+              .del {
+                width: 100%;
+                height: 100%;
+                position: absolute;
+                z-index: 2;
+                right: 0;
+                top: 0;
+                box-sizing: border-box;
+                border: 1px solid #979797;
+                background-image: url("@/assets/images/common/close.png");
+                background-position: center;
+                background-repeat: no-repeat;
+                background-size: 30% 30%;
+                background-color: rgba(255, 255, 255, 0.5);
+                border-radius: 50%;
+                transition: all 0.5s;
+                cursor: pointer;
+                display: none;
+              }
+            }
+
+            &:hover {
+              .del {
+                display: block;
+              }
+            }
           }
 
           &::-webkit-scrollbar {

+ 1 - 0
src/components/ReportList/index.vue

@@ -209,6 +209,7 @@ defineExpose({
           box-sizing: border-box;
           border: 1px solid rgba(255, 255, 255, 0.5);
           margin-right: 13px;
+          flex-shrink: 0;
 
           img {
             width: 100%;

+ 5 - 0
src/utils/animate.ts

@@ -36,6 +36,10 @@ const report = {
   // leave: animatePrefix + 'animate__fadeOutRight'
 };
 
+const runList = {
+  enter: animatePrefix + 'animate__fadeInRight'
+};
+
 const error = {
   enter: animatePrefix + 'animate__shakeX'
 };
@@ -47,5 +51,6 @@ export default {
   page,
   foul,
   report,
+  runList,
   error
 };

+ 2 - 1
src/utils/speech.ts

@@ -85,12 +85,13 @@ export const speckText = (text: any) => {
     // '各就位,预备': 'Ready.mp3',
     // '还有30秒,加油!': 'countdown30s.mp3',
     // '还有10秒,坚持住!': 'countdown10s.mp3',
+    // '预备': 'Ready.mp3',
     '5': '5.mp3',
     '4': '4.mp3',
     '3': '3.mp3',
     '2': '2.mp3',
     '1': '1.mp3',
-    // '预备和哨声': 'PrepareWhistle.mp3',
+    '各就位,预备!': 'runNew.mp3',
     跑: 'run.mp3',
     哨声: 'shaosheng.mp3',
     哨声2: 'shaosheng2.mp3'

+ 119 - 61
src/views/train/run.vue

@@ -8,76 +8,84 @@
     </transition>
     <div class="main">
       <template v-if="isLongRun">
+        <!--长跑-->
         <swiper :slides-per-view="testListArr.length >= 2 ? 2 : 1" :slides-per-group="testListArr.length >= 2 ? 2 : 1"
           :space-between="20">
           <swiper-slide v-for="(items, indexs) in testListArr " :key="indexs">
             <div class="main-left main-left2">
               <div class="trackItem">
-                <div v-for="(item, index) in items" :key="item" class="li">
-                  <div class="left">
-                    <div class="track">{{ (index + 1) + (8 * indexs) }}</div>
-                    <div class="userInfo" @click="getChooseStudent(item.track)">
-                      <div class="pic pic2" v-if="item.face_pic"> <img :src="item.face_pic" /></div>
-                      <div class="pic" v-else>
-                        <img src="@/assets/images/test/profilePicture.png" />
-                      </div>
-                      <div class="nameBox">
-                        <div class="name">{{ item.student_name || "未检录" }}</div>
+                <transition-group :enter-active-class="proxy?.animate.runList.enter">
+                  <div v-for="(item, index) in items" :key="indexs + '_' + index" class="li">
+                    <div class="left">
+                      <div class="track">{{ (index + 1) + (8 * indexs) }}</div>
+                      <div class="userInfo" @click="getChooseStudent(item.track)">
+                        <div class="pic pic2" v-if="item.student_id"> <img :src="item.face_pic" /></div>
+                        <div class="pic" v-else>
+                          <img src="@/assets/images/test/profilePicture.png" />
+                        </div>
+                        <div class="nameBox">
+                          <div class="name">{{ item.student_name || "未检录" }}</div>
+                        </div>
                       </div>
                     </div>
-                  </div>
-                  <div class="scoreBox">
-                    <div v-if="item.timeStr" class="score">
-                      {{ item.timeStr || "-" }}
+                    <div class="scoreBox">
+                      <div v-if="item.timeStr" class="score">
+                        {{ item.timeStr || "-" }}
+                      </div>
+                      <div v-if="isBackRun && item.student_id" class="turns">往返次数:<span><i>{{ item.turns || "0"
+                            }}</i></span>
+                      </div>
                     </div>
-                    <div v-if="isBackRun && item.student_id" class="turns">往返次数:<span><i>{{ item.turns || "0"
-                          }}</i></span>
+                    <div class="menuBtn menuBtn2" v-if="examState == 43 && item.student_id">等待开始测试</div>
+                    <div class="menuBtn menuBtn2" v-if="examState == 42 && item.student_id">正在测试</div>
+                    <div class="menuBtn" v-if="examState == 3 && !item.timeStr && item.isfinish && item.student_id">
+                      异常
                     </div>
+                    <div class="close" @click="close(item)" v-if="examState == 41"></div>
                   </div>
-                  <!-- <div class="menuBtn" v-if="examState < 42 && !item.isfinish" @click="getChooseStudent(item.track)">检录
-                  </div> -->
-                  <div class="menuBtn menuBtn2" v-if="examState == 43 && item.student_id">等待开始测试</div>
-                  <div class="menuBtn menuBtn2" v-if="examState == 42 && item.student_id">正在测试</div>
-                  <div class="menuBtn" v-if="examState == 3 && !item.timeStr && item.isfinish && item.student_id">
-                    异常
-                  </div>
-                  <div class="close" @click="close(item)" v-if="examState == 41"></div>
-                </div>
+                </transition-group>
               </div>
             </div>
           </swiper-slide>
         </swiper>
       </template>
       <template v-else>
+        <!--短跑-->
         <div class="main-left">
-          <div class="trackItem">
-            <div v-for="(item, index) in faceStudentList" :key="item" class="li">
-              <div class="left">
-                <div class="track">{{ item.track }}</div>
-                <div class="userInfo" @click="getChooseStudent(item.track)">
-                  <div class="pic pic2" v-if="item.face_pic"> <img :src="item.face_pic" /></div>
-                  <div class="pic" v-else>
-                    <img src="@/assets/images/test/profilePicture.png" />
+          <div class="trackItem"><transition-group :enter-active-class="proxy?.animate.runList.enter">
+              <div v-for="(item, index) in faceStudentList" :key="index" class="li">
+                <div class="left">
+                  <div class="track">{{ item.track }}</div>
+                  <div class="userInfo" @click="getChooseStudent(item.track)">
+
+                    <div class="pic pic2" v-if="item.student_id"> <img :src="item.face_pic" /></div>
+                    <div class="pic" v-else>
+                      <img src="@/assets/images/test/profilePicture.png" />
+                    </div>
+
+                    <div class="nameBox">
+                      <div class="name">{{ item.student_name || "未检录" }}</div>
+                    </div>
                   </div>
-                  <div class="nameBox">
-                    <div class="name">{{ item.student_name || "未检录" }}</div>
+                </div>
+                <div class="scoreBox">
+                  <div v-if="item.timeStr" class="score">
+                    {{ item.timeStr || "-" }}
+                  </div>
+                  <div v-if="isBackRun && item.student_id" class="turns">往返次数:<span><i>{{ item.turns || "0"
+                        }}</i></span>
                   </div>
                 </div>
-              </div>
-              <div class="scoreBox">
-                <div v-if="item.timeStr" class="score">
-                  {{ item.timeStr || "-" }}
+                <div class="menuBtn" v-if="examState > 3 && examState < 42" @click="getChooseStudent(item.track)">检录
                 </div>
-                <div v-if="isBackRun && item.student_id" class="turns">往返次数:<span><i>{{ item.turns || "0" }}</i></span>
+                <div class="menuBtn menuBtn2" v-if="examState == 43 && item.student_id">等待开始测试</div>
+                <div class="menuBtn menuBtn2" v-if="examState == 42 && item.student_id">正在测试</div>
+                <div class="menuBtn" v-if="examState == 3 && !item.timeStr && item.isfinish && item.student_id">
+                  异常
                 </div>
+
               </div>
-              <div class="menuBtn" v-if="examState < 42" @click="getChooseStudent(item.track)">检录</div>
-              <div class="menuBtn menuBtn2" v-if="examState == 43 && item.student_id">等待开始测试</div>
-              <div class="menuBtn menuBtn2" v-if="examState == 42 && item.student_id">正在测试</div>
-              <div class="menuBtn" v-if="examState == 3 && !item.timeStr && item.isfinish && item.student_id">
-                异常
-              </div>
-            </div>
+            </transition-group>
           </div>
         </div>
         <div class="main-right">
@@ -252,6 +260,13 @@ const getStopFace = async () => {
   if (examState.value != 41) {
     return false;
   }
+  let list = faceStudentList.value.filter((item: any) => {
+    return item.student_id;
+  })
+  if (!list.length) {
+    proxy?.$modal.msgWarning("请选择人员!");
+    return false;
+  }
   await stopFace();
   getFaceConfirmOnly();
 };
@@ -271,6 +286,13 @@ const getFaceConfirmOnly = (data?: any) => {
       return item.student_id;
     });
   }
+  //短跑播报跑道
+  if (data && !isLongRun.value) {
+    let speechList = list.map((item: any) => {
+      return `第${item.track == 2 ? '二' : item.track}道, ${item.student_name}`
+    }).join();
+    speckText(speechList);
+  }
   //长跑自动拼接跑道
   if (isLongRun.value) {
     list = list.map((item: any, index: any) => {
@@ -317,11 +339,26 @@ const getStartOneTest = () => {
     proxy?.$modal.msgWarning("请选择人员!");
     return false;
   }
-  startOneTest(data == null, () => {
+  //停止播报;
+  speckCancel()
+
+  // 和工作站搭配时差版
+  //提前发送开始的时间
+  let advanceTime = 1000;
+  //各就位+枪声是7秒左右,5.26秒是播枪声
+  let myTime = 7010;
+  //播放音频和遮罩
+  let myText = "各就位,预备!";
+  let loading = ElLoading.service({ text: myText, background: 'rgba(0, 0, 0, 0.8)', customClass: `sports ${parameter.value.project}` });
+  speckText(myText);
+  setTimeout(() => {
+    startOneTest(data == null, () => {
+    });
+    loading?.close();
+  }, advanceTime)
+  setTimeout(() => {
     //显示再测一次按钮
     showTestAgain.value = true;
-    //停止播报;
-    speckCancel()
     //计时项目才开
     if (needStart.value == true) {
       //时间为0的为正计时,大于0的为倒计时
@@ -333,7 +370,24 @@ const getStartOneTest = () => {
     } else {
       speckText("请开始测试");
     }
-  })
+  }, myTime)
+
+  // 立即开版本
+  // startOneTest(data == null, () => {
+  //   //显示再测一次按钮
+  //   showTestAgain.value = true;
+  //   //计时项目才开
+  //   if (needStart.value == true) {
+  //     //时间为0的为正计时,大于0的为倒计时
+  //     if (time.value.testTime == 0) {
+  //       getCounting("+");
+  //     } else {
+  //       getCounting("-");
+  //     }
+  //   } else {
+  //     speckText("请开始测试");
+  //   }
+  // })
 };
 
 /**
@@ -530,16 +584,20 @@ const longStudent = (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;
+  if (isLongRun.value) {
+    faceStudentList.value = [];
+  } else {
+    //重置全部
+    let list = faceStudentList.value.map((item: any) => {
+      let obj = {
+        student_id: null,
+        track: item.track,
+        isfinish: false,
+      }
+      return obj;
+    })
+    faceStudentList.value = list;
+  }
 };
 
 /**