zhangjie преди 3 месеца
родител
ревизия
f1e55aa65b

+ 58 - 122
src/features/check-subjective/CheckSubjective.vue

@@ -127,8 +127,8 @@ import {
 } from "@/api/checkPage";
 import { doLogout } from "@/api/markPage";
 import { useMarkStore } from "@/store";
-import type { Question } from "@/types";
-import { isNumber } from "lodash-es";
+import type { MarkResult, Question } from "@/types";
+import { isNumber, cloneDeep } from "lodash-es";
 import vls from "@/utils/storage";
 
 // components
@@ -223,117 +223,43 @@ const allZeroSubmit = async () => {
 const getMarkData = () => {
   if (!markStore.currentTask?.markResult) return {};
 
-  let markResult = markStore.currentTask.markResult;
-
-  let commomData = {
-    status: markResult.status,
-    spent: Date.now() - markStore.currentTask.__markStartTime,
-  };
-
-  if (!markStore.isTrackMode) {
-    const groupMap = {};
-    markStore.currentTask.questionList.forEach((question) => {
-      const { __index, groupNumber } = question;
-      if (!groupMap[groupNumber]) {
-        groupMap[groupNumber] = {
-          ...commomData,
-          groupNumber,
-          markerTrackList: [],
-          markerTagList: [],
-          markerScore: [],
-          scoreList: [],
-          studentId: markStore.currentTask.studentId,
-        };
-      }
-      groupMap[groupNumber].scoreList[__index] =
-        markStore.currentTask.markResult.scoreList[__index];
-      groupMap[groupNumber].markerScore.push({
-        mainNumber: question.mainNumber,
-        subNumber: question.subNumber,
-        score: markStore.currentTask.markResult.scoreList[__index],
-      });
-    });
-
-    const groups = Object.values(groupMap).map((group) => {
-      group.scoreList = group.scoreList.filter((item) => item !== undefined);
-      return group;
-    });
-    return {
-      studentId: markStore.currentTask.studentId,
-      groups,
-    };
-  }
-
-  let groupMap = {};
-  markResult.markerTrackList.forEach((track) => {
-    const { groupNumber } =
-      taskQuestionInfo[`${track.mainNumber * 1000}${track.subNumber}`];
-    if (!groupMap[groupNumber]) {
-      groupMap[groupNumber] = {
-        groupNumber,
-        markerTrackList: [],
-        markerTagList: [],
-      };
-    }
-    groupMap[groupNumber].markerTrackList.push(track);
-  });
-  markResult.markerTagList.forEach((track) => {
-    const { groupNumber } = track;
-    if (!groupMap[groupNumber]) {
-      groupMap[groupNumber] = {
-        groupNumber,
-        markerTrackList: [],
-        markerTagList: [],
-      };
-    }
-    groupMap[groupNumber].markerTagList.push(track);
-  });
+  const datas = cloneDeep(markStore.currentTask.markResult);
+  datas.spent = Date.now() - markStore.currentTask.__markStartTime;
 
   const modifiedQuestions = Object.keys(
     markStore.currentTaskModifyQuestion
   ).filter((k) => markStore.currentTaskModifyQuestion[k]);
 
-  let groups = Object.values(groupMap).map((item) => {
-    let qScore = {};
-    const markerTrackList = item.markerTrackList.filter((track) =>
-      modifiedQuestions.includes(`${track.mainNumber}_${track.subNumber}`)
-    );
-    if (!markerTrackList.length && !item.markerTagList.length) return null;
-
-    markerTrackList.forEach((track) => {
-      const qno = `${track.mainNumber * 1000}${track.subNumber}`;
-      if (!qScore[qno]) {
-        qScore[qno] = {
-          mainNumber: track.mainNumber,
-          subNumber: track.subNumber,
-          score: 0,
-        };
-      }
-      qScore[qno].markerScore += track.markerScore;
-    });
-
-    return {
-      ...commomData,
-      ...item,
-      markerTrackList,
-      markerScore: Object.values(qScore),
-      studentId: markStore.currentTask.studentId,
-    };
-  });
-  groups = groups.filter((group) => group);
-
-  return {
-    studentId: markStore.currentTask.studentId,
-    groups,
-  };
+  datas.questionList = datas.questionList
+    .filter((q) => {
+      return modifiedQuestions.includes(`${q.mainNumber}_${q.subNumber}`);
+    })
+    .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 = [];
+  return datas;
 };
 
-const validateScore = (markResult: any) => {
+const validateScore = (markResult: MarkResult) => {
   const errors: Array<{ question: Question; index: number; error: string }> =
     [];
   markResult.scoreList.forEach((score: number, index: number) => {
     if (!markStore.currentTask) return;
     const question = markStore.currentTask.questionList[index]!;
+    if (!question.selfMark || question.problem) return;
+
     let error;
     if (!isNumber(score)) {
       error = `${question.mainNumber}-${question.subNumber}${
@@ -355,52 +281,62 @@ const validateScore = (markResult: any) => {
   return errors;
 };
 
-const saveTaskToServer = async () => {
-  if (!markStore.currentTask) return;
-  const markResult = markStore.currentTask.markResult;
-  if (!markResult) return;
-
-  const mkey = "save_task_key";
-
-  type SubmitError = {
-    question: Question;
-    index: number;
-    error: string;
-  };
+type SubmitError = {
+  question: Question;
+  index: number;
+  error: string;
+};
 
+const checkMarkResult = (markResult: MarkResult): boolean => {
   const errors: SubmitError[] = validateScore(markResult);
   if (errors.length !== 0) {
     console.log(errors);
     const msg = errors.map((v) => h("div", `${v.error}`));
     void message.warning({
       content: h("span", ["校验失败", ...msg]),
-      duration: 10,
-      key: mkey,
+      duration: 5,
     });
     return;
   }
 
+  const problemQs = markStore.currentTask.questionList
+    .filter((q) => q.problem)
+    .map((q, i) => i);
+  const questions = markStore.currentTask.questionList.filter(
+    (q) => !q.problem
+  );
+  const scoreList = markResult.scoreList.filter(
+    (_, i) => !problemQs.includes(i)
+  );
   if (
-    markResult.scoreList.length !== markStore.currentTask.questionList.length ||
-    !markResult.scoreList.every((s) => isNumber(s))
+    scoreList.length !== questions.length ||
+    !scoreList.every((s) => isNumber(s))
   ) {
-    console.error({ content: "markResult格式不正确,缺少分数", key: mkey });
+    console.error({ content: "markResult格式不正确,缺少分数" });
     return;
   }
 
+  return true;
+};
+
+const saveTaskToServer = async () => {
+  if (!markStore.currentTask) return;
+  const markResult = markStore.currentTask.markResult;
+  if (!markResult) return;
+
+  if (!checkMarkResult(markResult)) return;
+
   const data = getMarkData();
   const res = await saveStudentSubjectiveConfirmData(data).catch(() => false);
   if (!res) return;
   if (!res.data.success) {
-    console.log(res.data.message);
-    void message.error({ content: res.data.message, key: mkey, duration: 5 });
+    void message.error({ content: res.data.message, duration: 5 });
     return;
   }
 
   if (!isMultiStudent) {
     void message.success({
       content: "保存成功,页面将在3秒钟之后关闭",
-      key: mkey,
       duration: 2,
     });
     setTimeout(() => {
@@ -408,7 +344,7 @@ const saveTaskToServer = async () => {
     }, 3000);
     return;
   } else {
-    void message.success({ content: "保存成功", key: mkey, duration: 2 });
+    void message.success({ content: "保存成功", duration: 2 });
   }
 
   markStore.currentTask = undefined;

+ 12 - 14
src/features/check-subjective/composables/useTask.ts

@@ -40,27 +40,25 @@ export default function useTask(ids: string[]) {
     newTask.sliceUrls = [...newTask.sheetUrls];
     markStore.currentTask = newTask;
     currentStudentId = studentId;
-    updateTaskGroupInfo();
   }
 
-  let taskQuestionInfo = $ref({});
-  function updateTaskGroupInfo() {
-    taskQuestionInfo = {};
-    if (!markStore.currentTask) return;
+  // let taskQuestionInfo = $ref({});
+  // function updateTaskGroupInfo() {
+  //   taskQuestionInfo = {};
+  //   if (!markStore.currentTask) return;
 
-    markStore.currentTask.questionList.forEach((question) => {
-      const qno = `${question.mainNumber * 1000}${question.subNumber}`;
-      taskQuestionInfo[qno] = {
-        groupNumber: question.groupNumber,
-        score: question.markerScore,
-      };
-    });
-  }
+  //   markStore.currentTask.questionList.forEach((question) => {
+  //     const qno = `${question.mainNumber * 1000}${question.subNumber}`;
+  //     taskQuestionInfo[qno] = {
+  //       score: question.markerScore,
+  //     };
+  //   });
+  // }
 
   return {
     getNextStudent,
     getPreviousStudent,
-    taskQuestionInfo,
+    // taskQuestionInfo,
     studentIds,
     currentStudentId,
     currentIndex,

+ 1 - 1
src/features/mark/composables/useSliceTrack.ts

@@ -72,7 +72,7 @@ export default function useSliceTrack(hasMarkResultToRender = false) {
 
     const tagLists = hasMarkResultToRender
       ? markResult.markerTagList ?? []
-      : markStore.currentTask.markerTagList ?? [];
+      : markStore.currentTask.questionList.map((q) => q.markerTagList).flat();
 
     const tempSliceImagesWithTrackList: Array<SliceImage> = [];
     for (const sliceConfig of markStore.currentTask.sliceConfig) {

+ 1 - 1
src/features/mark/composables/useTaskWatch.ts

@@ -53,7 +53,7 @@ export default function useTaskWatch() {
               return tagList || [];
             })
             .flat(),
-          scoreList: task.questionList.map((q) => q.markerScore || 0),
+          scoreList: task.questionList.map((q) => q.markerScore),
           markerScore: 0, // 后期通过 scoreList 自动更新
         };
         task.markResult.markerTrackList.forEach((t) => {

+ 9 - 11
src/features/reject/Reject.vue

@@ -1,26 +1,26 @@
 <template>
   <div class="mark">
     <div class="mark-header">
-      <div v-if="store.currentTask" class="mark-header-part">
+      <div v-if="markStore.currentTask" class="mark-header-part">
         <div class="header-noun">
           <span>课程名称:</span>
           <span>
-            {{ store.currentTask.subject.name }}({{
-              store.currentTask.subject.code
+            {{ markStore.currentTask.courseName }}({{
+              markStore.currentTask.courseCode
             }})</span
           >
         </div>
         <div class="header-noun">
           <span>试卷编号:</span>
-          <span>{{ store.currentTask.paperNumber }}</span>
+          <span>{{ markStore.currentTask.paperNumber }}</span>
         </div>
         <div class="header-noun">
           <span>姓名:</span>
-          <span>{{ store.currentTask.studentName }}</span>
+          <span>{{ markStore.currentTask.studentName }}</span>
         </div>
         <div class="header-noun">
           <span>学号:</span>
-          <span>{{ store.currentTask.studentCode }}</span>
+          <span>{{ markStore.currentTask.studentCode }}</span>
         </div>
       </div>
       <div class="mark-header-part">
@@ -34,7 +34,7 @@
 
     <div class="mark-main">
       <track-body origImageUrls="sheetUrls" onlyTrack @error="renderError" />
-      <reject-board v-if="store.currentTask" />
+      <reject-board v-if="markStore.currentTask" />
     </div>
 
     <modal-minimap />
@@ -74,13 +74,11 @@ async function fetchTask() {
   }
 
   const rawTask = res.data;
-  rawTask.subject = {
-    code: rejectParam.courseCode,
-    name: rejectParam.courseName,
-  };
   rawTask.paperNumber = rejectParam.paperNumber;
   rawTask.studentCode = rejectParam.studentCode;
   rawTask.studentName = rejectParam.studentName;
+  rawTask.courseName = rejectParam.courseName;
+  rawTask.courseCode = rejectParam.courseCode;
   markStore.currentTask = rawTask;
 }
 

+ 2 - 6
src/features/track/Track.vue

@@ -5,8 +5,8 @@
         <div class="header-noun">
           <span>课程名称:</span>
           <span>
-            {{ markStore.currentTask.subject.name }}({{
-              markStore.currentTask.subject.code
+            {{ markStore.currentTask.courseName }}({{
+              markStore.currentTask.courseCode
             }})</span
           >
         </div>
@@ -101,10 +101,6 @@ async function updateTask() {
     }
 
     rawTask.sliceUrls = [...rawTask.sheetUrls];
-    rawTask.subject = {
-      code: rawTask.courseCode,
-      name: rawTask.courseName,
-    };
     markStore.currentTask = rawTask;
 
     markStore.setting.doubleTrack = true;

+ 12 - 14
src/features/track/TrackBody.vue

@@ -216,15 +216,21 @@ async function processImage() {
   maxImageWidth = Math.max(...images.map((i) => i.naturalWidth));
 
   const trackLists = (markStore.currentTask.questionList || [])
-    // .map((q) => q.markerTrackList)
     .map((q) => {
-      let tList = q.markerTrackList;
       return q.headerTrackList?.length
         ? addHeaderTrackColorAttr(q.headerTrackList)
-        : addTrackColorAttr(tList);
+        : addTrackColorAttr(q.markerTrackList);
     })
     .flat();
 
+  const tagLists = (markStore.currentTask.questionList || [])
+    .map((q) =>
+      q.headerTagList?.length
+        ? addHeaderTrackColorAttr(q.headerTagList)
+        : addTagColorAttr(q.markerTagList || [])
+    )
+    .flat();
+
   // 解析各试题答题区域以及评分
   const markDetailList = parseMarkDetailList();
   // 解析客观题的得分情况,按大题统计
@@ -237,17 +243,9 @@ async function processImage() {
     const thisImageTrackList = trackLists.filter(
       (t) => t.offsetIndex === indexInSliceUrls
     );
-    const thisImageTagList = markStore.currentTask.headerTagList?.length
-      ? addHeaderTrackColorAttr(
-          (markStore.currentTask.headerTagList || []).filter(
-            (t) => t.offsetIndex === indexInSliceUrls
-          )
-        )
-      : addTagColorAttr(
-          (markStore.currentTask.markerTagList || []).filter(
-            (t) => t.offsetIndex === indexInSliceUrls
-          )
-        );
+    const thisImageTagList = tagLists.filter(
+      (t) => t.offsetIndex === indexInSliceUrls
+    );
     const answerTags = paserRecogData(image, indexInSliceUrls - 1);
 
     sliceImagesWithTrackList.push({