Просмотр исходного кода

fix: 自己仲裁回评打回卷问题

zhangjie 2 месяцев назад
Родитель
Сommit
d7f99d1558

+ 2 - 25
src/features/mark/composables/useAutoChooseFirstQuestion.ts

@@ -2,11 +2,13 @@ import { Question } from "@/types";
 import { useMarkStore } from "@/store";
 import { watch, nextTick } from "vue";
 import useTaskRejection from "./useTaskRejection";
+import useQuestion from "./useQuestion";
 
 /** chooseQuestion 当currentTask改变是,自动选择第一题 */
 export default function useAutoChooseFirstQuestion() {
   const markStore = useMarkStore();
   const { showRejectedReason } = useTaskRejection();
+  const { isDisabledQuestion } = useQuestion();
 
   // 监听currentTask的变化,自动选择第一题
   function watchCurrentTaskChooseQuestion() {
@@ -66,28 +68,6 @@ export default function useAutoChooseFirstQuestion() {
     }
   };
 
-  // 是否处于仲裁阶段
-  function isArbitrated(question: Question) {
-    return ["WAIT_ARBITRATE", "ARBITRATED"].includes(question.status);
-  }
-
-  function getArbitratedStatusName(question: Question) {
-    if (question.status === "WAIT_ARBITRATE") {
-      return "待仲裁";
-    } else if (question.status === "ARBITRATED") {
-      return "已仲裁";
-    }
-    return "";
-  }
-
-  function isDisabledQuestion(question: Question) {
-    return (
-      (!markStore.historyOpen && !question.selfMark) ||
-      (markStore.historyOpen && question.problem) ||
-      isArbitrated(question)
-    );
-  }
-
   function chooseQuestion(question: Question) {
     if (isDisabledQuestion(question)) return;
 
@@ -105,8 +85,5 @@ export default function useAutoChooseFirstQuestion() {
   return {
     watchCurrentTaskChooseQuestion,
     chooseQuestion,
-    isDisabledQuestion,
-    isArbitrated,
-    getArbitratedStatusName,
   };
 }

+ 9 - 5
src/features/mark/composables/useMarkSubmit.ts

@@ -8,12 +8,14 @@ import type { Question, MarkResult } from "@/types";
 import useStatus from "./useStatus";
 import useMarkTask from "./useMarkTask";
 import useTaskTips from "./useTaskTips";
+import useQuestion from "./useQuestion";
 import useTaskQuestion from "./useTaskQuestion";
 
 export default function useMarkSubmit() {
   const markStore = useMarkStore();
   const { updateStatus } = useStatus();
   const { nextTask } = useMarkTask();
+  const { isArbitrated } = useQuestion();
   const { setPrevTips, registTaskChangeTips } = useTaskTips();
   const { updateQuestionStatus } = useTaskQuestion();
   registTaskChangeTips();
@@ -25,8 +27,9 @@ export default function useMarkSubmit() {
     markResult.scoreList.forEach((score: number, index: number) => {
       if (!markStore.currentTask) return;
       const question = markStore.currentTask.questionList[index]!;
-      // 如果是自评或者有问题的题目,不检查分数
-      if (!question.selfMark || question.problem) return;
+      // 如果是自评、有问题或者待仲裁的题目,不检查分数
+      if (!question.selfMark || question.problem || isArbitrated(question))
+        return;
 
       const { maxScore, minScore, mainNumber, subNumber, questionName } =
         question;
@@ -64,13 +67,13 @@ export default function useMarkSubmit() {
       return;
     }
 
-    // 问题卷或者不是自己评的试题的答案允许为null
+    // 问题卷,不是自己评以及非仲裁的试题的答案允许为null
     const allowNullQs = [];
     markStore.currentTask.questionList.forEach((q, i) => {
-      if (q.problem || !q.selfMark) allowNullQs.push(i);
+      if (q.problem || !q.selfMark || isArbitrated(q)) allowNullQs.push(i);
     });
     const questions = markStore.currentTask.questionList.filter(
-      (q) => !q.problem && q.selfMark
+      (q) => !q.problem && q.selfMark && !isArbitrated(q)
     );
     const scoreList = markResult.scoreList.filter(
       (_, i) => !allowNullQs.includes(i)
@@ -88,6 +91,7 @@ export default function useMarkSubmit() {
         markResult.markerTrackList
           .map((t) => Math.round((t.score || 0) * 100))
           .reduce((acc, s) => acc + s, 0) / 100;
+
       if (
         trackScores !== markResult.markerScore &&
         markResult.markerScore !== null

+ 34 - 0
src/features/mark/composables/useQuestion.ts

@@ -0,0 +1,34 @@
+import { Question } from "@/types";
+import { useMarkStore } from "@/store";
+
+export default function useQuestion() {
+  const markStore = useMarkStore();
+
+  // 是否处于仲裁阶段
+  function isArbitrated(question: Question) {
+    return ["WAIT_ARBITRATE", "ARBITRATED"].includes(question.status);
+  }
+
+  function getArbitratedStatusName(question: Question) {
+    if (question.status === "WAIT_ARBITRATE") {
+      return "待仲裁";
+    } else if (question.status === "ARBITRATED") {
+      return "已仲裁";
+    }
+    return "";
+  }
+
+  function isDisabledQuestion(question: Question) {
+    return (
+      (!markStore.historyOpen && !question.selfMark) ||
+      (markStore.historyOpen && question.problem) ||
+      isArbitrated(question)
+    );
+  }
+
+  return {
+    isDisabledQuestion,
+    isArbitrated,
+    getArbitratedStatusName,
+  };
+}

+ 6 - 2
src/features/mark/composables/useTaskWatch.ts

@@ -1,8 +1,10 @@
 import { watch } from "vue";
 import { useMarkStore } from "@/store";
+import useQuestion from "./useQuestion";
 
 export default function useTaskWatch() {
   const markStore = useMarkStore();
+  const { isArbitrated } = useQuestion();
 
   watch(
     () => markStore.currentTask,
@@ -29,7 +31,9 @@ export default function useTaskWatch() {
         const statusValue = markStore.setting.statusValue;
         const { examId, studentId, paperNumber } = task;
 
-        const selfQuestions = task.questionList.filter((q) => q.selfMark);
+        const selfQuestions = task.questionList.filter(
+          (q) => q.selfMark && !isArbitrated(q)
+        );
         task.markResult = {
           examId,
           paperNumber,
@@ -57,7 +61,7 @@ export default function useTaskWatch() {
             })
             .flat(),
           scoreList: task.questionList.map((q) =>
-            q.selfMark ? q.markerScore : null
+            q.selfMark && !isArbitrated(q) ? q.markerScore : null
           ),
           markerScore: 0, // 后期通过 scoreList 自动更新
         };

+ 4 - 6
src/features/mark/scoring/MarkBoardKeyBoard.vue

@@ -146,6 +146,7 @@ import { isNumber } from "lodash-es";
 import { ref, onMounted, onUnmounted, watch } from "vue";
 import { useMarkStore } from "@/store";
 import useAutoChooseFirstQuestion from "../composables/useAutoChooseFirstQuestion";
+import useQuestion from "../composables/useQuestion";
 import useMakeTrack from "../composables/useMakeTrack";
 import { message } from "ant-design-vue";
 
@@ -157,12 +158,9 @@ const emit = defineEmits([
 ]);
 const props = defineProps<{ isCheckAnswer?: boolean }>();
 
-const {
-  chooseQuestion,
-  isDisabledQuestion,
-  isArbitrated,
-  getArbitratedStatusName,
-} = useAutoChooseFirstQuestion();
+const { isDisabledQuestion, isArbitrated, getArbitratedStatusName } =
+  useQuestion();
+const { chooseQuestion } = useAutoChooseFirstQuestion();
 const { makeCommonTrack } = useMakeTrack();
 const hasModifyScore = ref(false);
 

+ 4 - 6
src/features/mark/scoring/MarkBoardMouse.vue

@@ -133,15 +133,13 @@ import { ref } from "vue";
 import type { Question } from "@/types";
 import { useMarkStore } from "@/store";
 import useAutoChooseFirstQuestion from "../composables/useAutoChooseFirstQuestion";
+import useQuestion from "../composables/useQuestion";
 import useMakeTrack from "../composables/useMakeTrack";
 
 const markStore = useMarkStore();
-const {
-  chooseQuestion,
-  isDisabledQuestion,
-  isArbitrated,
-  getArbitratedStatusName,
-} = useAutoChooseFirstQuestion();
+const { isDisabledQuestion, isArbitrated, getArbitratedStatusName } =
+  useQuestion();
+const { chooseQuestion } = useAutoChooseFirstQuestion();
 const { makeCommonTrack } = useMakeTrack();
 
 const emit = defineEmits([

+ 5 - 7
src/features/mark/scoring/MarkBoardTrack.vue

@@ -206,6 +206,7 @@ import { isNumber } from "lodash-es";
 import { onMounted, onUnmounted, watch, ref, reactive, nextTick } from "vue";
 import { useMarkStore } from "@/store";
 import useAutoChooseFirstQuestion from "../composables/useAutoChooseFirstQuestion";
+import useQuestion from "../composables/useQuestion";
 import useDragSplitPane from "../composables/useDragSplitPane";
 import useFocusTracks from "../composables/useFocusTracks";
 
@@ -214,6 +215,10 @@ const emit = defineEmits(["submit", "unselectiveSubmit", "checkSubmit"]);
 
 const { addFocusTrack, removeFocusTrack } = useFocusTracks();
 const { dragSpliter, areaHeight } = useDragSplitPane();
+const { isDisabledQuestion, isArbitrated, getArbitratedStatusName } =
+  useQuestion();
+const { chooseQuestion } = useAutoChooseFirstQuestion();
+
 const activeRightMenuItem = ref<any>(null);
 const hasModifyScore = ref(false);
 const markStore = useMarkStore();
@@ -264,13 +269,6 @@ const positioning = (question: Question) => {
   activeRightMenuItem.value = null;
 };
 
-const {
-  chooseQuestion,
-  isDisabledQuestion,
-  isArbitrated,
-  getArbitratedStatusName,
-} = useAutoChooseFirstQuestion();
-
 // 切换题目是清空上一题的分数
 watch(
   () => markStore.currentQuestion,