zhangjie 2 月之前
父节点
当前提交
c81b92e23f

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

@@ -24,6 +24,9 @@ export default function useAutoChooseFirstQuestion() {
         if (firstQuestion) {
           chooseQuestion(firstQuestion);
         }
+      },
+      {
+        immediate: true,
       }
     );
   }
@@ -63,10 +66,25 @@ 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)
+      (markStore.historyOpen && question.problem) ||
+      isArbitrated(question)
     );
   }
 
@@ -84,5 +102,11 @@ export default function useAutoChooseFirstQuestion() {
     });
   }
 
-  return { watchCurrentTaskChooseQuestion, chooseQuestion, isDisabledQuestion };
+  return {
+    watchCurrentTaskChooseQuestion,
+    chooseQuestion,
+    isDisabledQuestion,
+    isArbitrated,
+    getArbitratedStatusName,
+  };
 }

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

@@ -7,22 +7,26 @@ export default function useStatus() {
 
   async function updateStatus() {
     const res = await getStatus(markStore.setting.questionModel);
-    markStore.setInfo({ status: res.data });
+    const statusData = (res.data || []).map((item) => {
+      item.leftCount = item.leftCount <= 0 ? 0 : item.leftCount;
+      return item;
+    });
+    markStore.setInfo({ status: statusData });
 
     // 单题阅的模式status可能有多条,需要依据评卷的试题来确定显示哪一条
     // 整卷阅的模式下只有一条,所以只取第一条数据
     if (!markStore.isSingelQuestionModel) {
-      markStore.setInfo({ curStatus: res.data[0] });
+      markStore.setInfo({ curStatus: statusData[0] });
       return;
     }
 
     // 单题阅的模式下,需要找到当前题目的状态, 并将当前题目的状态放到第一位
-    const curMarkStatusIndex = res.data.findIndex(
+    const curMarkStatusIndex = statusData.findIndex(
       (item) => item.questionId === item.markedQuestionId
     );
     if (curMarkStatusIndex < 0) return;
-    const statuss = res.data.slice(curMarkStatusIndex);
-    statuss.push(...res.data.slice(0, curMarkStatusIndex));
+    const statuss = statusData.slice(curMarkStatusIndex);
+    statuss.push(...statusData.slice(0, curMarkStatusIndex));
     markStore.setInfo({ status: statuss });
   }
 

+ 5 - 1
src/features/mark/composables/useTaskQuestion.ts

@@ -56,9 +56,13 @@ export default function useTaskQuestion() {
 
   async function updateQuestionStatus(questionId: string) {
     const res = await getStatus(markStore.setting.questionModel, questionId);
+    const statusData = (res.data || []).map((item) => {
+      item.leftCount = item.leftCount <= 0 ? 0 : item.leftCount;
+      return item;
+    });
     updateStatusQuestionCount({
       questionId,
-      statusData: res.data[0],
+      statusData: statusData[0],
     });
   }
 

+ 11 - 3
src/features/mark/scoring/MarkBoardKeyBoard.vue

@@ -98,13 +98,16 @@
               :class="[
                 'question-score',
                 {
-                  'is-problem': question.problem,
+                  'is-problem': question.problem || isArbitrated(question),
                 },
               ]"
             >
               <transition-group name="score-number-animation" tag="span">
-                <span v-if="question.problem" key="problem"> 问题卷 </span>
+                <span v-if="question.problem"> 问题卷 </span>
                 <span v-else-if="!question.selfMark">已评</span>
+                <span v-else-if="isArbitrated(question)">{{
+                  getArbitratedStatusName(question)
+                }}</span>
                 <span
                   v-else
                   :key="`${question.mainNumber}_${question.subNumber}_${index}`"
@@ -140,7 +143,12 @@ const emit = defineEmits([
 ]);
 const props = defineProps<{ isCheckAnswer?: boolean }>();
 
-const { chooseQuestion, isDisabledQuestion } = useAutoChooseFirstQuestion();
+const {
+  chooseQuestion,
+  isDisabledQuestion,
+  isArbitrated,
+  getArbitratedStatusName,
+} = useAutoChooseFirstQuestion();
 const hasModifyScore = ref(false);
 
 const markStore = useMarkStore();

+ 14 - 12
src/features/mark/scoring/MarkBoardMouse.vue

@@ -83,17 +83,21 @@
               </div>
             </div>
             <div
-              v-if="question.problem"
+              v-if="isDisabledQuestion(question)"
               :class="[
                 'question-score',
                 {
-                  'is-problem': question.problem,
+                  'is-problem': question.problem || isArbitrated(question),
                 },
               ]"
             >
-              问题卷
+              <span v-if="question.problem"> 问题卷 </span>
+              <span v-else-if="!question.selfMark">已评</span>
+              <span v-else-if="isArbitrated(question)">{{
+                getArbitratedStatusName(question)
+              }}</span>
             </div>
-            <div v-if="!isDisabledQuestion(question)" class="board-scores">
+            <div v-else class="board-scores">
               <div
                 v-for="(s, i) in questionScoreSteps(question)"
                 :key="i"
@@ -105,13 +109,6 @@
               >
                 {{ s }}
               </div>
-              <qm-button
-                v-if="question.problem"
-                class="board-clear"
-                @click="cancelProblem"
-              >
-                取消问题卷
-              </qm-button>
             </div>
           </div>
         </div>
@@ -127,7 +124,12 @@ import { useMarkStore } from "@/store";
 import useAutoChooseFirstQuestion from "../composables/useAutoChooseFirstQuestion";
 
 const markStore = useMarkStore();
-const { chooseQuestion, isDisabledQuestion } = useAutoChooseFirstQuestion();
+const {
+  chooseQuestion,
+  isDisabledQuestion,
+  isArbitrated,
+  getArbitratedStatusName,
+} = useAutoChooseFirstQuestion();
 
 const emit = defineEmits([
   "submit",

+ 10 - 2
src/features/mark/scoring/MarkBoardTrack.vue

@@ -108,12 +108,15 @@
               :class="[
                 'question-score',
                 {
-                  'is-problem': question.problem,
+                  'is-problem': question.problem || isArbitrated(question),
                 },
               ]"
             >
               <span v-if="question.problem" key="problem"> 问题卷 </span>
               <span v-else-if="!question.selfMark">已评</span>
+              <span v-else-if="isArbitrated(question)">{{
+                getArbitratedStatusName(question)
+              }}</span>
               <span
                 v-else
                 :key="markStore.currentTask?.markResult?.scoreList[index] || 0"
@@ -264,7 +267,12 @@ const positioning = (question: Question) => {
   activeRightMenuItem.value = null;
 };
 
-const { chooseQuestion, isDisabledQuestion } = useAutoChooseFirstQuestion();
+const {
+  chooseQuestion,
+  isDisabledQuestion,
+  isArbitrated,
+  getArbitratedStatusName,
+} = useAutoChooseFirstQuestion();
 let sliceImagesWithTrackListCopy = ref([]);
 EventBus.on("draw-change", (list: any) => {
   sliceImagesWithTrackListCopy.value = cloneDeep(list);

+ 1 - 1
src/types/index.ts

@@ -335,7 +335,7 @@ interface RawQuestion {
   /** 是否自己评卷,false时为他人评卷,给分板置灰 */
   selfMark: boolean;
   // 任务状态: WAIT_ARBITRATE:待仲裁,PROBLEM:问题卷
-  status: "WAIT_ARBITRATE" | "PROBLEM" | "WAITING" | "MARKED";
+  status: "WAIT_ARBITRATE" | "ARBITRATED" | "PROBLEM" | "WAITING" | "MARKED";
   /** 轨迹列表 */
   markerTrackList: Array<Track>;
   // 科组长轨迹