Michael Wang 3 жил өмнө
parent
commit
5e5b5574ea

+ 1 - 1
package.json

@@ -7,7 +7,7 @@
     "dev": "vite --force",
     "build": "vue-tsc --noEmit --skipLibCheck && vite build",
     "build-without-type-check": "vite build",
-    "typecheck": "vue-tsc --noEmit",
+    "typecheck": "vue-tsc --noEmit --skipLibCheck",
     "serve": "vite preview"
   },
   "dependencies": {

+ 3 - 3
src/api/markPage.ts

@@ -58,7 +58,7 @@ export async function getHistoryTask({
 
 /** 保存评卷任务(正常保存) */
 export async function saveTask() {
-  let markResult = store.currentMarkResult;
+  let markResult = store.currentTask?.markResult;
   if (markResult) {
     // markResult.specialTagList = [];
     markResult.problem = false;
@@ -101,7 +101,7 @@ export async function doSwitchGroup(markerId: number) {
 
 /** 评卷用户选择试卷的问题类型 */
 export async function doProblemType(problemId: number) {
-  let markResult = store.currentMarkResult;
+  let markResult = store.currentTask?.markResult;
   if (markResult) {
     markResult.problem = true;
     markResult.unselective = false;
@@ -127,7 +127,7 @@ export async function doProblemType(problemId: number) {
 
 /** 评卷用户选择试卷的为未选做 */
 export async function doUnselectiveType() {
-  let markResult = store.currentMarkResult;
+  let markResult = store.currentTask?.markResult;
   if (markResult) {
     markResult.problem = false;
     markResult.unselective = true;

+ 4 - 11
src/features/arbitrate/Arbitrate.vue

@@ -30,12 +30,7 @@
 <script setup lang="ts">
 import { computed, onMounted, watch } from "vue";
 // 要共用UI就要共用store
-import {
-  findCurrentTaskMarkResult,
-  isScanImage,
-  removeOldPreviousMarkResult,
-  store,
-} from "@/features/mark/store";
+import { isScanImage, store } from "@/features/mark/store";
 import MarkHeader from "./MarkHeader.vue";
 import { useRoute } from "vue-router";
 import MarkBody from "./MarkBody.vue";
@@ -180,8 +175,6 @@ watch(
   () => store.currentTask,
   () => {
     // 回评切换任务,先删除之前回评任务的markResult
-    removeOldPreviousMarkResult();
-    store.currentMarkResult = findCurrentTaskMarkResult();
 
     // 重置当前选择的quesiton和score
     store.currentQuestion = undefined;
@@ -193,7 +186,7 @@ watch(
 watch(
   () => store.currentTask,
   () => {
-    const markResult = store.currentMarkResult;
+    const markResult = store.currentTask?.markResult;
 
     if (markResult && store.currentTask) {
       const scoreList = store.currentTask.questionList.map((q) => q.score);
@@ -234,8 +227,8 @@ const saveTaskToServer = async (unselective: boolean) => {
     res = (await saveArbitrateTask(
       store.currentTask.libraryId + "",
       store.currentTask.studentId + "",
-      store.currentMarkResult?.markerScore as number,
-      store.currentMarkResult?.scoreList as Array<number>,
+      store.currentTask.markResult.markerScore as number,
+      store.currentTask.markResult.scoreList as Array<number>,
       false
     )) as any;
   }

+ 5 - 5
src/features/mark/CommonMarkBody.vue

@@ -169,7 +169,7 @@ async function getImageUsingDataUrl(
 }
 
 async function processSliceConfig() {
-  let markResult = store.currentMarkResult as MarkResult;
+  let markResult = store.currentTask?.markResult as MarkResult;
   if (useMarkResult) {
     // check if have MarkResult for currentTask
     if (!markResult) return;
@@ -275,7 +275,7 @@ async function processSliceConfig() {
 }
 
 async function processSplitConfig() {
-  let markResult = store.currentMarkResult as MarkResult;
+  let markResult = store.currentTask?.markResult as MarkResult;
   if (useMarkResult) {
     // check if have MarkResult for currentTask
     if (!markResult) return;
@@ -427,7 +427,7 @@ const renderPaperAndMark = async () => {
   // }
   // sliceImagesWithTrackList.splice(0);
   // check if have MarkResult for currentTask
-  let markResult = store.currentMarkResult;
+  let markResult = store.currentTask?.markResult;
 
   if ((useMarkResult && !markResult) || !store.currentTask) {
     renderLock = false;
@@ -534,7 +534,7 @@ if (useMarkResult) {
   watchEffect(() => {
     for (const sliceImage of sliceImagesWithTrackList) {
       sliceImage.tagList = sliceImage.tagList.filter((t) =>
-        store.currentMarkResult?.specialTagList.find(
+        store.currentTask?.markResult.specialTagList.find(
           (st) =>
             st.offsetIndex === t.offsetIndex &&
             st.offsetX === t.offsetX &&
@@ -542,7 +542,7 @@ if (useMarkResult) {
         )
       );
     }
-    if (store.currentMarkResult?.specialTagList.length === 0) {
+    if (store.currentTask?.markResult.specialTagList.length === 0) {
       for (const sliceImage of sliceImagesWithTrackList) {
         sliceImage.tagList = [];
       }

+ 5 - 19
src/features/mark/Mark.vue

@@ -45,13 +45,7 @@ import {
   updateUISetting,
   doUnselectiveType,
 } from "@/api/markPage";
-import {
-  findCurrentTaskMarkResult,
-  isScanImage,
-  removeCurrentMarkResult,
-  removeOldPreviousMarkResult,
-  store,
-} from "./store";
+import { isScanImage, store } from "./store";
 import MarkHeader from "./MarkHeader.vue";
 import MarkBody from "./MarkBody.vue";
 import { useTimers } from "@/setups/useTimers";
@@ -200,14 +194,10 @@ watch(
   { deep: true }
 );
 
-// 切换currentTask的同时,切换currentMarkResult
+// 切换currentTask
 watch(
   () => store.currentTask,
   () => {
-    // 回评切换任务,先删除之前回评任务的markResult
-    removeOldPreviousMarkResult();
-    store.currentMarkResult = findCurrentTaskMarkResult();
-
     // 重置当前选择的quesiton和score
     store.currentQuestion = undefined;
     store.currentScore = undefined;
@@ -233,7 +223,6 @@ const showMarkBoardMouse = computed(() => {
 });
 
 const removeBrokenTask = () => {
-  removeCurrentMarkResult();
   store.currentTask = undefined;
 
   if (store.historyOpen) {
@@ -246,7 +235,7 @@ const removeBrokenTask = () => {
 };
 
 const allZeroSubmit = async () => {
-  const markResult = store.currentMarkResult;
+  const markResult = store.currentTask?.markResult;
   if (!markResult) return;
 
   const { markerScore, scoreList, trackList, specialTagList } = markResult;
@@ -269,7 +258,7 @@ const allZeroSubmit = async () => {
 };
 
 const unselectiveSubmit = async () => {
-  const markResult = store.currentMarkResult;
+  const markResult = store.currentTask?.markResult;
   if (!markResult) return;
 
   try {
@@ -277,8 +266,6 @@ const unselectiveSubmit = async () => {
     if (res?.data.success) {
       message.success({ content: "未选做处理成功", duration: 3 });
       const removeSubmitedTask = () => {
-        removeCurrentMarkResult();
-
         if (!store.historyOpen) {
           store.currentTask = undefined;
           store.tasks.shift();
@@ -301,7 +288,7 @@ const unselectiveSubmit = async () => {
   }
 };
 const saveTaskToServer = async () => {
-  const markResult = store.currentMarkResult;
+  const markResult = store.currentTask?.markResult;
   if (!markResult) return;
 
   if (
@@ -347,7 +334,6 @@ const saveTaskToServer = async () => {
   if (res.data.success && store.currentTask) {
     message.success({ content: "保存成功", key: mkey, duration: 2 });
     if (!store.historyOpen) {
-      removeCurrentMarkResult();
       store.currentTask = undefined;
       store.tasks.shift();
       store.currentTask = store.tasks[0];

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

@@ -35,7 +35,7 @@
           总分
         </div>
         <div class="total-score tw-ml-5 tw-font-bold">
-          {{ store.currentMarkResult?.markerScore }}
+          {{ store.currentTask?.markResult.markerScore }}
         </div>
       </div>
 

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

@@ -35,7 +35,7 @@
           总分
         </div>
         <div class="total-score tw-ml-5 tw-font-bold">
-          {{ store.currentMarkResult?.markerScore }}
+          {{ store.currentTask?.markResult.markerScore }}
         </div>
       </div>
 

+ 10 - 8
src/features/mark/MarkBoardTrack.vue

@@ -20,7 +20,7 @@
           总分
         </div>
         <div class="total-score tw-ml-5 tw-font-bold">
-          {{ store.currentMarkResult?.markerScore }}
+          {{ store.currentTask?.markResult.markerScore }}
         </div>
       </div>
 
@@ -318,9 +318,10 @@ const handleMouseOutWithBoard = () => {
 };
 
 function clearLatestMarkOfCurrentQuetion() {
-  if (!store.currentMarkResult || !store.currentQuestion) return;
+  if (!store.currentTask?.markResult || !store.currentQuestion) return;
 
-  const ts = store.currentMarkResult?.trackList.filter(
+  const markResult = store.currentTask.markResult;
+  const ts = markResult.trackList.filter(
     (q) =>
       q.mainNumber === store.currentQuestion?.mainNumber &&
       q.subNumber === store.currentQuestion?.subNumber
@@ -333,26 +334,27 @@ function clearLatestMarkOfCurrentQuetion() {
     store.currentQuestion.score = null;
   }
   const maxNumber = Math.max(...ts.map((q) => q.number));
-  const idx = store.currentMarkResult.trackList.findIndex(
+  const idx = markResult.trackList.findIndex(
     (q) =>
       q.mainNumber === store.currentQuestion?.mainNumber &&
       q.subNumber === store.currentQuestion?.subNumber &&
       q.number === maxNumber
   );
   if (idx >= 0) {
-    store.removeScoreTracks = store.currentMarkResult.trackList.splice(idx, 1);
+    store.removeScoreTracks = markResult.trackList.splice(idx, 1);
   }
 }
 
 function clearAllMarksOfCurrentQuetion() {
-  if (!store.currentMarkResult || !store.currentQuestion) return;
+  if (!store.currentTask?.markResult || !store.currentQuestion) return;
 
-  store.removeScoreTracks = store.currentMarkResult?.trackList.filter(
+  const markResult = store.currentTask.markResult;
+  store.removeScoreTracks = markResult.trackList.filter(
     (q) =>
       q.mainNumber === store.currentQuestion?.mainNumber &&
       q.subNumber === store.currentQuestion?.subNumber
   );
-  store.currentMarkResult.trackList = store.currentMarkResult?.trackList.filter(
+  markResult.trackList = markResult.trackList.filter(
     (q) =>
       !(
         q.mainNumber === store.currentQuestion?.mainNumber &&

+ 5 - 8
src/features/mark/MarkBody.vue

@@ -76,7 +76,7 @@ const makeScoreTrack = (
   if (ifKeepScore < 0 && store.currentScore > 0) {
     store.currentScore = undefined;
   }
-  const markResult = store.currentMarkResult;
+  const markResult = store.currentTask?.markResult;
   if (markResult) {
     const maxNumber =
       markResult.trackList.length === 0
@@ -132,10 +132,7 @@ const makeSpecialTagTrack = (
     console.log("两个轨迹相距过近");
     return;
   }
-  const markResult = store.currentMarkResult;
-  if (markResult) {
-    markResult.specialTagList.push(track);
-  }
+  store.currentTask?.markResult.specialTagList.push(track);
   item.tagList.push(track);
 };
 
@@ -154,10 +151,10 @@ const makeTrack = (
 
 // 轨迹模式下,添加轨迹,更新分数
 watch(
-  () => store.currentMarkResult?.trackList,
+  () => store.currentTask?.markResult.trackList,
   () => {
     if (store.setting.mode !== ModeEnum.TRACK) return;
-    const markResult = store.currentMarkResult;
+    const markResult = store.currentTask?.markResult;
     if (markResult) {
       const cq = store.currentQuestion;
       // 当无轨迹时,不更新;无轨迹时,将分数置null
@@ -188,7 +185,7 @@ watch(
 
 // question.score更新后,自动关联markResult.scoreList和markResult.markerScore
 watchEffect(() => {
-  const markResult = store.currentMarkResult;
+  const markResult = store.currentTask?.markResult;
 
   if (markResult && store.currentTask) {
     const scoreList = store.currentTask.questionList.map((q) => q.score);

+ 1 - 3
src/features/mark/MarkProblemDialog.vue

@@ -30,7 +30,7 @@
 <script setup lang="ts">
 import { doProblemType, getStatus } from "@/api/markPage";
 import { message } from "ant-design-vue";
-import { removeCurrentMarkResult, store } from "./store";
+import { store } from "./store";
 import EventBus from "@/plugins/eventBus";
 
 let visible = $ref(false);
@@ -40,8 +40,6 @@ const showModal = () => {
 };
 
 const removeSubmitedTask = () => {
-  removeCurrentMarkResult();
-
   if (!store.historyOpen) {
     store.currentTask = undefined;
     store.tasks.shift();

+ 4 - 4
src/features/mark/SpecialTagModal.vue

@@ -72,13 +72,13 @@
 import { store } from "./store";
 
 function clearLatestTagOfCurrentTask() {
-  if (!store.currentMarkResult) return;
-  store.currentMarkResult.specialTagList.splice(-1);
+  if (!store.currentTask?.markResult) return;
+  store.currentTask.markResult.specialTagList.splice(-1);
 }
 
 function clearAllTagsOfCurrentTask() {
-  if (!store.currentMarkResult) return;
-  store.currentMarkResult.specialTagList = [];
+  if (!store.currentTask?.markResult) return;
+  store.currentTask.markResult.specialTagList = [];
 }
 
 const toggleTag = (tagName: string) => {

+ 43 - 55
src/features/mark/store.ts

@@ -1,5 +1,5 @@
-import { Setting, MarkStore, Task, MarkResult, Track } from "@/types";
-import { reactive } from "vue";
+import { Setting, MarkStore, Track } from "@/types";
+import { reactive, watch } from "vue";
 
 const obj = {
   setting: {
@@ -38,12 +38,10 @@ const obj = {
   groups: [],
   tasks: [],
   message: null,
-  currentMarkResult: undefined,
   currentTask: undefined,
   currentQuestion: undefined,
   currentScore: undefined,
   currentSpecialTag: undefined,
-  markResults: [],
   historyOpen: false,
   historyTasks: [],
   removeScoreTracks: [],
@@ -55,57 +53,6 @@ const obj = {
   globalMask: false,
 } as MarkStore;
 
-/** 如果currentTask不存在,则返回undefined; 如果currentMarkResult不存在,则创建一个对应的markResult并返回 */
-export function findCurrentTaskMarkResult() {
-  if (!store.currentTask) return;
-  const { libraryId } = store.currentTask;
-  let markResult = store.markResults.find((m) => m.libraryId === libraryId);
-
-  if (!markResult) {
-    const { studentId } = store.currentTask;
-    const statusValue = store.setting.statusValue;
-    markResult = {} as MarkResult;
-    markResult.libraryId = libraryId;
-    markResult.studentId = studentId;
-    markResult.statusValue = statusValue;
-    markResult.__markStartTime = Date.now();
-    markResult.__previous = store.currentTask.previous;
-    markResult.trackList = store.currentTask.questionList.reduce(
-      (all, c) => all.concat(c.trackList),
-      [] as Array<Track>
-    );
-    markResult.specialTagList = [...(store.currentTask.specialTagList ?? [])];
-    markResult.scoreList = store.currentTask.questionList.map((q) => q.score);
-    markResult.markerScore = 0; // 后期通过 scoreList 自动更新
-
-    store.markResults = [...store.markResults, markResult];
-  }
-
-  return store.markResults.find((m) => m.libraryId === libraryId) as MarkResult;
-}
-
-function clearMarkResultFromTask(task: Task) {
-  let { libraryId } = task;
-  const i = store.markResults.findIndex((s) => s.libraryId === libraryId);
-  if (i >= 0) store.markResults.splice(i, 1);
-}
-/** 回评时,切换任务前,删除之前的回评markResult */
-export function removeOldPreviousMarkResult() {
-  // 清理不在当前任务中的markResult,防止回评产生的markResult造成垃圾
-  store.markResults = store.markResults.filter((m) => !!!m.__previous);
-}
-
-export function removeCurrentMarkResult() {
-  if (!store.currentTask) return;
-
-  clearMarkResultFromTask(store.currentTask);
-
-  for (const task of store.tasks) {
-    // 清理不在当前任务中的markResult,防止回评产生的markResult造成垃圾
-    clearMarkResultFromTask(task);
-  }
-}
-
 /**
  * 返回正在评卷的状态 '' | 回评 | 打回
  */
@@ -127,3 +74,44 @@ export function isScanImage() {
 }
 
 export const store = reactive(obj);
+
+watch(
+  () => store.currentTask,
+  () => {
+    // 初始化 task.markResult ,始终保证 task 下有 markResult
+    // 1. 评卷时,如果没有 markResult ,则初始化一个 markResult 给它
+    // 1. 回评时,先清空它的 markResult ,然后初始化一个 markResult 给它
+    if (!store.currentTask) return;
+
+    const task = store.currentTask;
+    if (task.previous && task.markResult) {
+      // @ts-ignore 将其强制置空
+      task.markResult = undefined;
+    }
+    if (!task.markResult) {
+      const statusValue = store.setting.statusValue;
+      const { libraryId, studentId, previous } = task;
+      task.markResult = {
+        statusValue: statusValue,
+        libraryId: libraryId,
+        studentId: studentId,
+        spent: 0,
+
+        trackList: task.questionList.reduce(
+          (all, c) => all.concat(c.trackList),
+          [] as Array<Track>
+        ),
+        specialTagList: [...(task.specialTagList ?? [])],
+        scoreList: task.questionList.map((q) => q.score),
+        markerScore: 0, // 后期通过 scoreList 自动更新
+
+        problem: false,
+        problemTypeId: 0,
+        unselective: false,
+
+        __markStartTime: Date.now(),
+        __previous: previous,
+      };
+    }
+  }
+);

+ 3 - 2
src/types/index.ts

@@ -13,11 +13,9 @@ export interface MarkStore {
   };
   tasks: Array<Task>; // 保持数量为3
   currentTask?: Task; // 用来切换task,还有回看
-  currentMarkResult?: MarkResult;
   currentQuestion?: Question;
   currentScore?: number;
   currentSpecialTag?: string;
-  markResults: Array<MarkResult>;
   historyOpen: boolean; // 是否打开回评侧边栏
   historyTasks: Array<Task>;
   removeScoreTracks: Array<Track>;
@@ -108,6 +106,9 @@ export interface Task {
   previous: boolean; // 是否回评
   rejected: boolean; // 是否是打回
   message: string | null;
+
+  // 评卷结果,在task第一次被访问时自动添加,watch currentTask
+  markResult: MarkResult;
 }
 
 export interface Question {