Browse Source

优化对currentTask是否为空的处理

Michael Wang 3 years ago
parent
commit
8ff69db6f3

+ 5 - 5
src/features/library/inspect/MarkBoardInspect.vue

@@ -122,16 +122,16 @@ watch(
   }
 );
 const groups = $computed(() => {
-  const gs = store.currentTask?.questionList.map((q) => q.groupNumber);
+  const gs = store.currentTaskEnsured.questionList.map((q) => q.groupNumber);
   return [...new Set(gs)].sort((a, b) => a - b);
 });
 
 const questions = $computed(() => {
-  const qs = store.currentTask?.questionList;
+  const qs = store.currentTaskEnsured.questionList;
   return qs;
 });
 
-const markerScore = $computed(() => store.currentTask?.markerScore || 0);
+const markerScore = $computed(() => store.currentTaskEnsured.markerScore || 0);
 
 function addToCheckedQuestion(question: Question) {
   checkedQuestions.push(question);
@@ -143,7 +143,7 @@ function removeCheckedQuestion(question: Question) {
 function groupChecked(groupNumber: number) {
   return (
     checkedQuestions.filter((q) => q.groupNumber === groupNumber).length ===
-    questions?.filter((q) => q.groupNumber === groupNumber).length
+    questions.filter((q) => q.groupNumber === groupNumber).length
   );
 }
 
@@ -170,7 +170,7 @@ function groupClicked(groupNumber: number) {
       });
   } else {
     questions
-      ?.filter((q) => q.groupNumber === groupNumber)
+      .filter((q) => q.groupNumber === groupNumber)
       .forEach((q) => {
         if (!questionChecked(q)) checkedQuestions.push(q);
       });

+ 13 - 16
src/features/mark/CommonMarkBody.vue

@@ -53,7 +53,7 @@
 import { onMounted, onUnmounted, reactive, watch, watchEffect } from "vue";
 import { store } from "@/store/store";
 import MarkDrawTrack from "./MarkDrawTrack.vue";
-import type { MarkResult, SliceImage, SpecialTag, Track } from "@/types";
+import type { SliceImage, SpecialTag, Track } from "@/types";
 import { useTimers } from "@/setups/useTimers";
 import {
   getDataUrlForSliceConfig,
@@ -146,14 +146,13 @@ let maxSliceWidth = 0; // 最大的裁切块宽度,图片容器以此为准
 let theFinalHeight = 0; // 最终宽度,用来定位轨迹在第几张图片,不包括image-seperator高度
 
 async function processSliceConfig() {
-  let markResult = store.currentTask?.markResult as MarkResult;
+  if (!store.currentTask) return;
+  let markResult = store.currentTask.markResult;
   if (hasMarkResultToRender) {
     // check if have MarkResult for currentTask
     if (!markResult) return;
   }
 
-  if (!store.currentTask) return;
-
   const images = [];
   // 必须要先加载一遍,把“选择整图”的宽高重置后,再算总高度
   for (const sliceConfig of store.currentTask.sliceConfig) {
@@ -257,14 +256,13 @@ async function processSliceConfig() {
 }
 
 async function processSplitConfig() {
-  let markResult = store.currentTask?.markResult as MarkResult;
+  if (!store.currentTask) return;
+  let markResult = store.currentTask.markResult;
   if (hasMarkResultToRender) {
     // check if have MarkResult for currentTask
     if (!markResult) return;
   }
 
-  if (!store.currentTask) return;
-
   const images = [];
   for (const url of store.currentTask.sliceUrls) {
     const image = await loadImage(url);
@@ -392,7 +390,7 @@ async function processSplitConfig() {
 // should not render twice at the same time
 let renderLock = false;
 const renderPaperAndMark = async () => {
-  if (!store) return;
+  if (!store.currentTask) return;
   if (!store.isScanImage) return;
   if (renderLock) {
     console.log("上个任务还未渲染完毕,稍等一秒再尝试渲染");
@@ -400,19 +398,17 @@ const renderPaperAndMark = async () => {
     await renderPaperAndMark();
     return;
   }
-  renderLock = true;
   // check if have MarkResult for currentTask
-  let markResult = store.currentTask?.markResult;
-
-  if ((hasMarkResultToRender && !markResult) || !store.currentTask) {
-    renderLock = false;
+  let markResult = store.currentTask.markResult;
+  if (hasMarkResultToRender && !markResult) {
     return;
   }
 
+  renderLock = true;
   try {
     store.globalMask = true;
 
-    const hasSliceConfig = store.currentTask?.sliceConfig?.length;
+    const hasSliceConfig = store.currentTask.sliceConfig?.length;
 
     if (hasSliceConfig) {
       await processSliceConfig();
@@ -508,9 +504,10 @@ if (hasMarkResultToRender) {
 
   // 清除特殊标记轨迹
   watchEffect(() => {
+    if (!store.currentTask) return;
     for (const sliceImage of sliceImagesWithTrackList) {
       sliceImage.tagList = sliceImage.tagList.filter((t) =>
-        store.currentTask?.markResult.specialTagList.find(
+        store.currentTaskEnsured.markResult.specialTagList.find(
           (st) =>
             st.offsetIndex === t.offsetIndex &&
             st.offsetX === t.offsetX &&
@@ -518,7 +515,7 @@ if (hasMarkResultToRender) {
         )
       );
     }
-    if (store.currentTask?.markResult.specialTagList.length === 0) {
+    if (store.currentTaskEnsured.markResult.specialTagList.length === 0) {
       for (const sliceImage of sliceImagesWithTrackList) {
         sliceImage.tagList = [];
       }

+ 2 - 2
src/features/mark/Mark.vue

@@ -212,7 +212,7 @@ const allZeroSubmit = async () => {
 
   const { markerScore, scoreList, trackList, specialTagList } = markResult;
   markResult.markerScore = 0;
-  const ss = new Array(store.currentTask?.questionList.length);
+  const ss = new Array(store.currentTaskEnsured.questionList.length);
   markResult.scoreList = ss.fill(0);
   markResult.trackList = [];
 
@@ -298,7 +298,7 @@ const saveTaskToServer = async () => {
   }
 
   if (
-    markResult.scoreList.length !== store.currentTask?.questionList.length ||
+    markResult.scoreList.length !== store.currentTask.questionList.length ||
     !markResult.scoreList.every((s) => isNumber(s))
   ) {
     console.error({ content: "markResult格式不正确,缺少分数", key: mkey });

+ 9 - 9
src/features/mark/MarkBoardKeyBoard.vue

@@ -33,9 +33,9 @@
         <div class="total-score tw-ml-5 tw-font-bold">
           <transition-group name="score-number-animation" tag="span">
             <span
-              :key="store.currentTask?.markResult.markerScore || 0"
+              :key="store.currentTaskEnsured.markResult.markerScore || 0"
               class="tw-inline-block"
-              >{{ store.currentTask?.markResult.markerScore }}</span
+              >{{ store.currentTaskEnsured.markResult.markerScore }}</span
             >
           </transition-group>
         </div>
@@ -85,9 +85,9 @@
       </div>
     </div>
 
-    <div v-if="store.currentTask && store.currentTask.questionList">
+    <div v-if="store.currentTaskEnsured.questionList">
       <template
-        v-for="(question, index) in store.currentTask?.questionList"
+        v-for="(question, index) in store.currentTaskEnsured.questionList"
         :key="index"
       >
         <div
@@ -213,7 +213,7 @@ function numberKeyListener(event: KeyboardEvent) {
   if (store.globalMask) return;
 
   function indexOfCurrentQuestion() {
-    return store.currentTask?.questionList.findIndex(
+    return store.currentTaskEnsured.questionList.findIndex(
       (q) =>
         q.mainNumber === store.currentQuestion?.mainNumber &&
         q.subNumber === store.currentQuestion.subNumber
@@ -221,7 +221,7 @@ function numberKeyListener(event: KeyboardEvent) {
   }
   // 处理Enter跳下一题或submit
   if (event.key === "Enter") {
-    const allScoreMarked = store.currentTask?.markResult.scoreList.every((s) =>
+    const allScoreMarked = store.currentTask.markResult.scoreList.every((s) =>
       isNumber(s)
     );
     // 如果所有题已赋分,并且当前题赋分和输入串和当前题分数一致,则可以在任意题提交
@@ -267,14 +267,14 @@ function numberKeyListener(event: KeyboardEvent) {
     //
     // scoreStr = "";
     // console.log("give score", score);
-    const idx = indexOfCurrentQuestion() as number;
+    const idx = indexOfCurrentQuestion();
     if (idx + 1 < store.currentTask.questionList.length) {
       chooseQuestion(store.currentTask.questionList[idx + 1]);
     }
     return;
   }
   if (event.key === "ArrowLeft") {
-    const idx = indexOfCurrentQuestion() as number;
+    const idx = indexOfCurrentQuestion();
     if (idx > 0) {
       chooseQuestion(store.currentTask.questionList[idx - 1]);
     }
@@ -282,7 +282,7 @@ function numberKeyListener(event: KeyboardEvent) {
     return;
   }
   if (event.key === "ArrowRight") {
-    const idx = indexOfCurrentQuestion() as number;
+    const idx = indexOfCurrentQuestion();
     if (idx < store.currentTask.questionList.length - 1) {
       chooseQuestion(store.currentTask.questionList[idx + 1]);
     }

+ 3 - 3
src/features/mark/MarkBoardMouse.vue

@@ -33,9 +33,9 @@
         <div class="total-score tw-ml-5 tw-font-bold">
           <transition-group name="score-number-animation" tag="span">
             <span
-              :key="store.currentTask?.markResult.markerScore || 0"
+              :key="store.currentTaskEnsured.markResult.markerScore || 0"
               class="tw-inline-block"
-              >{{ store.currentTask?.markResult.markerScore }}</span
+              >{{ store.currentTaskEnsured.markResult.markerScore }}</span
             >
           </transition-group>
         </div>
@@ -95,7 +95,7 @@
       "
     >
       <template
-        v-for="(question, index) in store.currentTask?.questionList"
+        v-for="(question, index) in store.currentTask.questionList"
         :key="index"
       >
         <div class="question tw-rounded tw-mb-2">

+ 3 - 3
src/features/mark/MarkBoardTrack.vue

@@ -18,9 +18,9 @@
         <div class="total-score tw-ml-5 tw-font-bold" style="height: 50px">
           <transition-group name="score-number-animation" tag="span">
             <span
-              :key="store.currentTask?.markResult.markerScore || 0"
+              :key="store.currentTask.markResult.markerScore || 0"
               class="tw-inline-block"
-              >{{ store.currentTask?.markResult.markerScore }}</span
+              >{{ store.currentTask.markResult.markerScore }}</span
             >
           </transition-group>
         </div>
@@ -85,7 +85,7 @@
         :style="{ height: `${topPercent}%` }"
       >
         <template
-          v-for="(question, index) in store.currentTask?.questionList"
+          v-for="(question, index) in store.currentTask.questionList"
           :key="index"
         >
           <div

+ 20 - 22
src/features/mark/MarkBody.vue

@@ -103,27 +103,25 @@ const makeScoreTrack = (
   if (ifKeepScore < 0 && store.currentScore > 0) {
     store.currentScore = undefined;
   }
-  const markResult = store.currentTask?.markResult;
-  if (markResult) {
-    const maxNumber =
-      markResult.trackList.length === 0
-        ? 0
-        : Math.max(...markResult.trackList.map((t) => t.number));
-    track.number = maxNumber + 1;
-    // console.log(
-    //   maxNumber,
-    //   track.number,
-    //   markResult.trackList.map((t) => t.number),
-    //   Math.max(...markResult.trackList.map((t) => t.number))
-    // );
-    markResult.trackList = [...markResult.trackList, track];
-    const { __index, mainNumber, subNumber } = store.currentQuestion;
-    markResult.scoreList[__index] =
-      markResult.trackList
-        .filter((t) => t.mainNumber === mainNumber && t.subNumber === subNumber)
-        .map((t) => t.score)
-        .reduce((acc, v) => (acc += Math.round(v * 100)), 0) / 100;
-  }
+  const markResult = store.currentTaskEnsured.markResult;
+  const maxNumber =
+    markResult.trackList.length === 0
+      ? 0
+      : Math.max(...markResult.trackList.map((t) => t.number));
+  track.number = maxNumber + 1;
+  // console.log(
+  //   maxNumber,
+  //   track.number,
+  //   markResult.trackList.map((t) => t.number),
+  //   Math.max(...markResult.trackList.map((t) => t.number))
+  // );
+  markResult.trackList = [...markResult.trackList, track];
+  const { __index, mainNumber, subNumber } = store.currentQuestion;
+  markResult.scoreList[__index] =
+    markResult.trackList
+      .filter((t) => t.mainNumber === mainNumber && t.subNumber === subNumber)
+      .map((t) => t.score)
+      .reduce((acc, v) => (acc += Math.round(v * 100)), 0) / 100;
   item.trackList.push(track);
 };
 
@@ -179,7 +177,7 @@ const makeSpecialTagTrack = (
     console.log("两个轨迹相距过近");
     return;
   }
-  store.currentTask?.markResult.specialTagList.push(track);
+  store.currentTaskEnsured.markResult.specialTagList.push(track);
   item.tagList.push(track);
 };
 

+ 3 - 3
src/features/student/importInspect/MarkBoardInspect.vue

@@ -104,16 +104,16 @@ watch(
   }
 );
 const groups = $computed(() => {
-  const gs = store.currentTask?.questionList.map((q) => q.groupNumber);
+  const gs = store.currentTaskEnsured.questionList.map((q) => q.groupNumber);
   return [...new Set(gs)].sort((a, b) => a - b);
 });
 
 const questions = $computed(() => {
-  const qs = store.currentTask?.questionList;
+  const qs = store.currentTaskEnsured.questionList;
   return qs;
 });
 
-const markerScore = $computed(() => store.currentTask?.markerScore || 0);
+const markerScore = $computed(() => store.currentTaskEnsured.markerScore || 0);
 
 function fetchTask(next: boolean) {
   emit("fetchTask", next);

+ 3 - 3
src/features/student/studentInspect/MarkBoardInspect.vue

@@ -122,16 +122,16 @@ watch(
   }
 );
 const groups = $computed(() => {
-  const gs = store.currentTask?.questionList.map((q) => q.groupNumber);
+  const gs = store.currentTaskEnsured.questionList.map((q) => q.groupNumber);
   return [...new Set(gs)].sort((a, b) => a - b);
 });
 
 const questions = $computed(() => {
-  const qs = store.currentTask?.questionList;
+  const qs = store.currentTaskEnsured.questionList;
   return qs;
 });
 
-const markerScore = $computed(() => store.currentTask?.markerScore || 0);
+const markerScore = $computed(() => store.currentTaskEnsured.markerScore || 0);
 
 function addToCheckedQuestion(question: Question) {
   checkedQuestions.push(question);

+ 5 - 1
src/store/store.ts

@@ -1,4 +1,4 @@
-import { Setting, MarkStore, ModeEnum, AdminPageSetting } from "@/types";
+import { Setting, MarkStore, ModeEnum, AdminPageSetting, Task } from "@/types";
 import { watch } from "vue";
 import { defineStore } from "pinia";
 
@@ -58,6 +58,10 @@ export const useMarkStore = defineStore("mark", {
     } as MarkStore;
   },
   getters: {
+    /** 当前任务。确保不为空,需在上文已经检查过 store.currentTask 不为空 */
+    currentTaskEnsured(): Task {
+      return store.currentTask!;
+    },
     /** 是否是评卷端的轨迹模式 */
     isTrackMode(): boolean {
       return store.setting.mode && store.setting.mode === ModeEnum.TRACK;