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

+ 8 - 13
src/features/check-subjective/CheckSubjective.vue

@@ -79,7 +79,7 @@
       @allZeroSubmit="allZeroSubmit"
     />
     <div class="mark-main">
-      <mark-body @error="removeBrokenTask" />
+      <mark-body />
       <mark-board-track
         v-if="markStore.isTrackMode"
         isCheckAnswer
@@ -132,7 +132,7 @@ import { isNumber, cloneDeep } from "lodash-es";
 import vls from "@/utils/storage";
 
 // components
-import MarkTool from "../mark/MarkTool.vue";
+import MarkTool from "../mark/toolbar/MarkTool.vue";
 import MarkBody from "./MarkBody.vue";
 // scoring
 import MarkBoardTrack from "../mark/scoring/MarkBoardTrack.vue";
@@ -169,13 +169,8 @@ vls.set("mark", {
 
 const markStore = useMarkStore();
 useTaskWatch();
-const {
-  getNextStudent,
-  getPreviousStudent,
-  studentIds,
-  taskQuestionInfo,
-  isMultiStudent,
-} = useTask(sids);
+const { getNextStudent, getPreviousStudent, studentIds, isMultiStudent } =
+  useTask(sids);
 
 const { updateSetting } = useSetting();
 
@@ -192,10 +187,10 @@ const logout = () => {
   doLogout();
 };
 
-const removeBrokenTask = () => {
-  console.log("removeBrokenTask");
-  // store.currentTask = undefined;
-};
+// const removeBrokenTask = () => {
+//   console.log("removeBrokenTask");
+//   // store.currentTask = undefined;
+// };
 
 const allZeroSubmit = async () => {
   const markResult = markStore.currentTask?.markResult;

+ 2 - 6
src/features/check-subjective/MarkBody.vue

@@ -1,15 +1,11 @@
 <template>
-  <MarkBodyBase
-    hasMarkResultToRender
-    :makeTrack="makeTrack"
-    @error="$emit('error')"
-  />
+  <MarkBodyBase hasMarkResultToRender :makeTrack="makeTrack" />
   <MarkBodyCursor />
 </template>
 
 <script setup lang="ts">
 import MarkBodyCursor from "../mark/MarkBodyCursor.vue";
-import MarkBodyBase from "../MarkBodyBase.vue";
+import MarkBodyBase from "./MarkBodyBase.vue";
 
 import useMakeTrack from "../mark/composables/useMakeTrack";
 

+ 5 - 3
src/features/check-subjective/composables/useSetting.ts

@@ -31,9 +31,11 @@ export default function useSetting() {
   }
 
   const debouncedUpdateUISetting = debounce(() => {
-    updateUISetting(markStore.setting.mode, markStore.setting.uiSetting).catch(
-      (e) => console.log("保存设置出错", e)
-    );
+    updateUISetting(
+      markStore.setting.mode,
+      markStore.setting.uiSetting,
+      markStore.setting.questionModel
+    ).catch((e) => console.log("保存设置出错", e));
   }, 3000);
 
   watch(

+ 2 - 4
src/features/check-subjective/composables/useSliceTrack.ts

@@ -1,4 +1,4 @@
-import { ref } from "vue";
+import { ref, watch } from "vue";
 import type { SliceImage } from "@/types";
 import { useMarkStore } from "@/store";
 import { loadImage } from "@/utils/utils";
@@ -7,8 +7,6 @@ import useTrackColor from "./useTrackColor";
 
 // 计算裁切图和裁切图上的分数轨迹和特殊标记轨迹
 export default function useSliceTrack() {
-  const emit = defineEmits(["error"]);
-
   const markStore = useMarkStore();
   const {
     addTrackColorAttr,
@@ -95,7 +93,7 @@ export default function useSliceTrack() {
       sliceImagesWithTrackList.splice(0);
       console.trace("render error ", error);
       // 图片加载出错,自动加载下一个任务
-      emit("error");
+      EventBus.emit("body-render-error");
     } finally {
       markStore.renderLock = false;
       markStore.globalMask = false;

+ 3 - 1
src/features/mark/composables/useAutoChooseFirstQuestion.ts

@@ -16,7 +16,9 @@ export default function useAutoChooseFirstQuestion() {
       markStore.currentScore = undefined;
 
       // FIXed ME: 此时取到的还是score:null,但是 chooseQuestion之后就变成了score:0
-      const firstQuestion = markStore.currentTask?.questionList[0];
+      const firstQuestion = markStore.currentTask?.questionList.find(
+        (question) => question.selfMark
+      );
       if (firstQuestion) {
         chooseQuestion(firstQuestion);
       }

+ 24 - 16
src/features/mark/composables/useMarkSubmit.ts

@@ -59,14 +59,14 @@ export default function useMarkSubmit() {
       return;
     }
 
-    const problemQs = markStore.currentTask.questionList
-      .filter((q) => q.problem)
+    const allowNullQs = markStore.currentTask.questionList
+      .filter((q) => q.problem || !q.selfMark)
       .map((q, i) => i);
     const questions = markStore.currentTask.questionList.filter(
-      (q) => !q.problem
+      (q) => !q.problem && q.selfMark
     );
     const scoreList = markResult.scoreList.filter(
-      (_, i) => !problemQs.includes(i)
+      (_, i) => !allowNullQs.includes(i)
     );
     if (
       scoreList.length !== questions.length ||
@@ -110,18 +110,26 @@ export default function useMarkSubmit() {
   function getSaveTaskResult() {
     const datas = cloneDeep(markStore.currentTask.markResult);
     datas.spent = Date.now() - markStore.currentTask.__markStartTime;
-    datas.questionList = datas.questionList.map((q) => {
-      q.markerTrackList = datas.markerTrackList.filter(
-        (t) => t.mainNumber === q.mainNumber && t.subNumber === q.subNumber
-      );
-      q.markerTagList = datas.markerTagList.filter(
-        (t) => t.mainNumber === q.mainNumber && t.subNumber === q.subNumber
-      );
-      q.markerScore = q.markerTrackList.reduce((acc, t) => {
-        return acc + (t.score || 0);
-      }, 0);
-      return q;
-    }) as Question[];
+    const allowNullQs = datas.questionList
+      .filter((q) => !q.selfMark)
+      .map((q, i) => i);
+    datas.scoreList = datas.scoreList.filter(
+      (_, i) => !allowNullQs.includes(i)
+    );
+    datas.questionList = datas.questionList
+      .filter((q) => q.selfMark)
+      .map((q) => {
+        q.markerTrackList = datas.markerTrackList.filter(
+          (t) => t.mainNumber === q.mainNumber && t.subNumber === q.subNumber
+        );
+        q.markerTagList = datas.markerTagList.filter(
+          (t) => t.mainNumber === q.mainNumber && t.subNumber === q.subNumber
+        );
+        q.markerScore = q.markerTrackList.reduce((acc, t) => {
+          return acc + (t.score || 0);
+        }, 0);
+        return q;
+      }) as Question[];
 
     datas.markerTrackList = [];
     datas.markerTagList = [];

+ 7 - 3
src/features/mark/composables/useTaskWatch.ts

@@ -28,6 +28,8 @@ export default function useTaskWatch() {
         task.__markStartTime = Date.now();
         const statusValue = markStore.setting.statusValue;
         const { examId, studentId, paperNumber } = task;
+
+        const selfQuestions = task.questionList.filter((q) => q.selfMark);
         task.markResult = {
           examId,
           paperNumber,
@@ -35,7 +37,7 @@ export default function useTaskWatch() {
           spent: 0,
           statusValue,
           questionList: task.questionList,
-          markerTrackList: task.questionList
+          markerTrackList: selfQuestions
             .map((q) => {
               const trackList =
                 q.headerTrackList && q.headerTrackList.length
@@ -44,7 +46,7 @@ export default function useTaskWatch() {
               return trackList || [];
             })
             .flat(),
-          markerTagList: task.questionList
+          markerTagList: selfQuestions
             .map((q) => {
               const tagList =
                 q.headerTagList && q.headerTagList.length
@@ -53,7 +55,9 @@ export default function useTaskWatch() {
               return tagList || [];
             })
             .flat(),
-          scoreList: task.questionList.map((q) => q.markerScore),
+          scoreList: task.questionList.map((q) =>
+            q.selfMark ? q.markerScore : null
+          ),
           markerScore: 0, // 后期通过 scoreList 自动更新
         };
         task.markResult.markerTrackList.forEach((t) => {

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

@@ -105,9 +105,15 @@
             </div>
             <!-- 设置高度 避免动画跳动 -->
             <div
-              :class="['question-score', { 'is-problem': question.problem }]"
+              :class="[
+                'question-score',
+                {
+                  'is-problem': question.problem,
+                },
+              ]"
             >
               <span v-if="question.problem" key="problem"> 问题卷 </span>
+              <span v-else-if="!question.selfMark">已评</span>
               <span
                 v-else
                 :key="markStore.currentTask?.markResult?.scoreList[index] || 0"
@@ -142,6 +148,7 @@
         {{ s }}
       </div>
       <div
+        v-if="questionScoreSteps.length"
         class="board-score"
         :class="Object.is(markStore.currentScore, 0) && 'is-current'"
         @click="chooseScore(0)"

+ 2 - 0
src/features/mark/toolbar/MarkTool.vue

@@ -148,6 +148,7 @@
     </div>
     <div>
       <div
+        v-if="checkValid('questionModel')"
         class="mark-tool-item"
         style="width: 70px"
         @click="toSwitchQuestionModal"
@@ -221,6 +222,7 @@ const markStore = useMarkStore();
  * shortCut:快捷键
  * specialTag:特殊标记
  * imgScale:图片缩放
+ * questionModel:切换题目模式
  */
 const { actions = [] } = defineProps<{
   actions?: string[];

+ 6 - 1
src/styles/page.less

@@ -706,7 +706,7 @@
     }
 
     &.is-current,
-    &:hover {
+    &:not(.is-disabled):hover {
       border-color: #165dff;
       color: #165dff;
     }
@@ -714,6 +714,11 @@
     &.is-disabled {
       cursor: not-allowed;
       color: #999;
+      background-color: #f9f9f9;
+
+      .question-score {
+        color: #999;
+      }
     }
   }