Browse Source

question.score -> scoreList -> markerScore 自动更新

Michael Wang 4 years ago
parent
commit
1f0d703f29

+ 9 - 0
src/features/mark/Mark.vue

@@ -223,6 +223,15 @@ export default defineComponent({
       const markResult = findCurrentTaskMarkResult();
       const markResult = findCurrentTaskMarkResult();
       if (!markResult) return;
       if (!markResult) return;
 
 
+      if (
+        markResult.scoreList.length !==
+          store.currentTask?.questionList.length ||
+        !markResult.scoreList.every((s) => isNumber(s))
+      ) {
+        console.error("markResult格式不正确,缺少分数");
+        return;
+      }
+
       if (
       if (
         markResult.scoreList.length !==
         markResult.scoreList.length !==
           store.currentTask?.questionList.length &&
           store.currentTask?.questionList.length &&

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

@@ -43,7 +43,7 @@
     </div>
     </div>
     <div>
     <div>
       <h1 class="tw-text-3xl tw-text-center">
       <h1 class="tw-text-3xl tw-text-center">
-        总分:{{ store.currentMarkResult?.markerScore || 0 }}
+        总分:{{ store.currentMarkResult?.markerScore }}
       </h1>
       </h1>
     </div>
     </div>
 
 

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

@@ -43,7 +43,7 @@
     </div>
     </div>
     <div>
     <div>
       <h1 class="tw-text-3xl tw-text-center">
       <h1 class="tw-text-3xl tw-text-center">
-        总分:{{ store.currentMarkResult?.markerScore || 0 }}
+        总分:{{ store.currentMarkResult?.markerScore }}
       </h1>
       </h1>
     </div>
     </div>
     <div class="tw-flex tw-place-content-center tw-mb-2">
     <div class="tw-flex tw-place-content-center tw-mb-2">

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

@@ -32,7 +32,7 @@
         />
         />
       </div>
       </div>
       <h1 class="tw-text-3xl tw-text-center tw-flex-grow">
       <h1 class="tw-text-3xl tw-text-center tw-flex-grow">
-        总分:{{ store.currentMarkResult?.markerScore || 0 }}
+        总分:{{ store.currentMarkResult?.markerScore }}
       </h1>
       </h1>
     </div>
     </div>
     <div class="tw-mb-2 tw-flex tw-place-content-center">
     <div class="tw-mb-2 tw-flex tw-place-content-center">

+ 27 - 14
src/features/mark/MarkBody.vue

@@ -78,7 +78,7 @@ import {
   getDataUrlForSplitConfig,
   getDataUrlForSplitConfig,
   loadImage,
   loadImage,
 } from "@/utils/utils";
 } from "@/utils/utils";
-import { groupBy, sortBy } from "lodash";
+import { groupBy, isNumber, sortBy } from "lodash";
 // @ts-ignore
 // @ts-ignore
 import CustomCursor from "custom-cursor.js";
 import CustomCursor from "custom-cursor.js";
 
 
@@ -98,6 +98,7 @@ interface SliceImage {
 }
 }
 // should not render twice at the same time
 // should not render twice at the same time
 let __lock = false;
 let __lock = false;
+let __currentLibraryId = -1; // save __currentLibraryId of lock
 export default defineComponent({
 export default defineComponent({
   name: "MarkBody",
   name: "MarkBody",
   components: { MarkDrawTrack },
   components: { MarkDrawTrack },
@@ -113,7 +114,6 @@ export default defineComponent({
 
 
     let rendering = ref(false);
     let rendering = ref(false);
     let sliceImagesWithTrackList: Array<SliceImage> = reactive([]);
     let sliceImagesWithTrackList: Array<SliceImage> = reactive([]);
-    let _studentId = -1; // 判断是否改变了任务
     let maxSliceWidth = 0; // 最大的裁切块宽度,图片容器以此为准
     let maxSliceWidth = 0; // 最大的裁切块宽度,图片容器以此为准
     let theFinalHeight = 0; // 最终宽度,用来定位轨迹在第几张图片,不包括image-seperator高度
     let theFinalHeight = 0; // 最终宽度,用来定位轨迹在第几张图片,不包括image-seperator高度
 
 
@@ -276,10 +276,15 @@ export default defineComponent({
     // let trackLen = store.currentMarkResult?.trackList.length;
     // let trackLen = store.currentMarkResult?.trackList.length;
     const renderPaperAndMark = async () => {
     const renderPaperAndMark = async () => {
       if (__lock) {
       if (__lock) {
+        if (store.currentTask?.libraryId === __currentLibraryId) {
+          console.log("重复渲染,返回");
+          return;
+        }
         await new Promise((res) => setTimeout(res, 1000));
         await new Promise((res) => setTimeout(res, 1000));
         await renderPaperAndMark();
         await renderPaperAndMark();
       }
       }
       __lock = true;
       __lock = true;
+      __currentLibraryId = store.currentTask?.libraryId ?? -1;
       sliceImagesWithTrackList.splice(0);
       sliceImagesWithTrackList.splice(0);
       // check if have MarkResult for currentTask
       // check if have MarkResult for currentTask
       let markResult = findCurrentTaskMarkResult();
       let markResult = findCurrentTaskMarkResult();
@@ -576,24 +581,32 @@ export default defineComponent({
             }
             }
           }
           }
           markResult.scoreList = scoreList as number[];
           markResult.scoreList = scoreList as number[];
-          // const sortScore = orderBy(markResult.trackList, ['mainNumber', 'subNumber', 'score']);
-          // markResult.scoreList = sortScore.reduce((acc, pre) => {
-          //   if(pre.mainNumber === cur.mainNumber && pre.subNumber === cur.subNumber) {
-          //     acc[acc.length-1] += cur.score
-          //   }
-          // }, [0])
-          markResult.markerScore =
-            markResult.scoreList
-              .filter((v): v is number => v !== null)
-              .reduce((acc, v) => (acc += Math.round(v * 100)), 0) / 100;
-
-          // console.log(markResult.scoreList, markResult.markerScore);
           // renderPaperAndMark();
           // renderPaperAndMark();
         }
         }
       },
       },
       { deep: true }
       { deep: true }
     );
     );
 
 
+    // question.score更新后,自动关联markResult.scoreList和markResult.markerScore
+    watchEffect(() => {
+      const markResult = findCurrentTaskMarkResult();
+
+      // 普通模式更新分数时
+      if (store.setting.mode === ModeEnum.COMMON) {
+        if (markResult && store.currentTask) {
+          const scoreList = store.currentTask.questionList.map((q) => q.score);
+          markResult.scoreList = [...(scoreList as number[])];
+        }
+      }
+      if (markResult && markResult.scoreList && store.currentTask) {
+        markResult.markerScore =
+          (markResult.scoreList.filter((s) => isNumber(s)) as number[]).reduce(
+            (acc, v) => (acc += Math.round(v * 100)),
+            0
+          ) / 100;
+      }
+    });
+
     watch(
     watch(
       () => store.setting.mode,
       () => store.setting.mode,
       () => {
       () => {

+ 2 - 4
src/features/mark/store.ts

@@ -72,10 +72,8 @@ export function findCurrentTaskMarkResult() {
     markResult.specialTagList =
     markResult.specialTagList =
       store.currentTask.specialTagList?.splice(0) ?? [];
       store.currentTask.specialTagList?.splice(0) ?? [];
     markResult.scoreList = store.currentTask.questionList.map((q) => q.score);
     markResult.scoreList = store.currentTask.questionList.map((q) => q.score);
-    markResult.markerScore =
-      markResult.scoreList
-        .filter((v): v is number => v !== null)
-        .reduce((acc, v) => (acc += Math.round(v * 100)), 0) / 100;
+    markResult.markerScore = 0; // 后期通过 scoreList 自动更新
+
     store.markResults = [...store.markResults, markResult];
     store.markResults = [...store.markResults, markResult];
   }
   }
 
 

+ 1 - 29
src/features/mark/use/keyboardAndMouse.ts

@@ -1,7 +1,4 @@
-import { ModeEnum } from "@/types";
-import { isNumber } from "lodash";
-import { watch } from "vue";
-import { findCurrentTaskMarkResult, store } from "../store";
+import { store } from "../store";
 
 
 export function keyMouse() {
 export function keyMouse() {
   function toggleKeyMouse() {
   function toggleKeyMouse() {
@@ -12,30 +9,5 @@ export function keyMouse() {
     }
     }
   }
   }
 
 
-  // 普通模式更新分数时
-  watch(
-    () => store.currentQuestion,
-    () => {
-      if (store.setting.mode === ModeEnum.COMMON) {
-        // TODO: findCurrentTaskMarkResult => store.currentMarkResult
-        const markResult = findCurrentTaskMarkResult();
-        if (markResult && store.currentTask) {
-          const scoreList = store.currentTask.questionList.map((q) => q.score);
-          if (scoreList.every((s) => isNumber(s))) {
-            markResult.scoreList = scoreList as number[];
-          }
-          markResult.markerScore =
-            (scoreList.filter((s) => isNumber(s)) as number[]).reduce(
-              (acc, v) => (acc += Math.round(v * 100)),
-              0
-            ) / 100;
-        }
-      }
-    },
-    {
-      deep: true,
-    }
-  );
-
   return { toggleKeyMouse };
   return { toggleKeyMouse };
 }
 }