Browse Source

多媒体阅卷:管理后台页面兼容

Michael Wang 4 years ago
parent
commit
9a9263731d

+ 45 - 1
src/api/jsonMark.ts

@@ -1,7 +1,51 @@
 import { httpApp } from "@/plugins/axiosApp";
-import { Question } from "@/types";
+import { RichTextQuestion, UnionStore } from "@/types";
 
 /** 清理复核任务 */
 export async function getJSON(url: string) {
   return httpApp.get(url, { withCredentials: false });
 }
+
+export async function getPaper(store: UnionStore) {
+  const res = await getJSON(store.setting.subject.paperUrl);
+  store.setting.subject.questions = [];
+  if (res.data.questions) {
+    // 云平台格式
+    const questions = res.data.questions; // TODO: add type
+    for (const q of questions) {
+      const tempQuestion = {
+        unionOrder: q.mainNumber + "-" + q.subNumber,
+        body: q.body,
+        parentBody: q.parentBody,
+        answer: [q.answer],
+      } as RichTextQuestion;
+      store.setting.subject.questions.push(tempQuestion);
+    }
+  } else {
+    const details = res.data.details;
+    for (let order1 of details) {
+      for (let order2 of order1.questions) {
+        if (order2.subQuestions) {
+          for (let order3 of order2.subQuestions) {
+            const tempQuestion = {
+              unionOrder:
+                order1.number + "-" + order2.number + "-" + order3.number,
+              body: order3.body,
+              parentBody: order2.body,
+              answer: order3.answer,
+            } as RichTextQuestion;
+            store.setting.subject.questions.push(tempQuestion);
+          }
+        } else {
+          const tempQuestion = {
+            unionOrder: order1.number + "-" + order2.number,
+            body: order2.body,
+            parentBody: null,
+            answer: order2.answer,
+          } as RichTextQuestion;
+          store.setting.subject.questions.push(tempQuestion);
+        }
+      }
+    }
+  }
+}

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

@@ -50,6 +50,7 @@ import type { Setting, Task } from "@/types";
 import { isNumber } from "lodash";
 import AnswerModal from "../mark/AnswerModal.vue";
 import PaperModal from "../mark/PaperModal.vue";
+import { getPaper } from "@/api/jsonMark";
 
 const route = useRoute();
 let isSingleStudent = !!route.query.historyId;
@@ -73,6 +74,7 @@ async function updateSetting() {
     subjectCode,
     groupNumber
   );
+  store.setting.examType = settingRes.data.examType;
   store.setting.fileServer = settingRes.data.fileServer;
   store.setting.userName = settingRes.data.userName;
   store.setting.uiSetting = {
@@ -89,6 +91,8 @@ async function updateSetting() {
   if (store.setting.subject?.paperUrl) {
     store.setting.subject.paperUrl =
       store.setting.fileServer + store.setting.subject?.paperUrl;
+
+    await getPaper(store);
   }
 }
 async function updateStatus() {

+ 8 - 3
src/features/arbitrate/MarkHeader.vue

@@ -33,7 +33,7 @@
         }}</span>
       </li>
     </ul>
-    <ZoomPaper :store="store" />
+    <ZoomPaper v-if="isScanImage()" :store="store" />
     <div @click="toggleHistory" v-if="!isSingleStudent" title="回看">
       <SnippetsOutlined
         class="icon-font icon-font-size-20 tw-cursor-pointer"
@@ -42,7 +42,12 @@
         }"
       />
     </div>
-    <a-popover title="小助手" trigger="hover" class="tw-cursor-pointer">
+    <a-popover
+      v-if="isScanImage()"
+      title="小助手"
+      trigger="hover"
+      class="tw-cursor-pointer"
+    >
       <template #content>
         <table class="assistant-table">
           <tr v-if="store.setting.subject.paperUrl">
@@ -95,7 +100,7 @@
 
 <script setup lang="ts">
 import { onMounted } from "vue";
-import { store } from "@/features/mark/store";
+import { store, isScanImage } from "@/features/mark/store";
 import {
   SnippetsOutlined,
   UserOutlined,

+ 2 - 2
src/features/arbitrate/MarkHistory.vue

@@ -163,7 +163,7 @@ watch(
       if (res.data) {
         let data = cloneDeep(res.data) as Array<Task>;
         data = data.map((t) => {
-          t.sliceUrls = t.sliceUrls.map((s) => store.setting.fileServer + s);
+          t.sliceUrls = t.sliceUrls?.map((s) => store.setting.fileServer + s);
           t.sheetUrls = t.sheetUrls?.map((s) => store.setting.fileServer + s);
           t.jsonUrl = store.setting.fileServer + t.jsonUrl;
 
@@ -214,7 +214,7 @@ async function updateHistoryTask({
   if (res.data) {
     let data = cloneDeep(res.data) as Array<Task>;
     data = data.map((t) => {
-      t.sliceUrls = t.sliceUrls.map((s) => store.setting.fileServer + s);
+      t.sliceUrls = t.sliceUrls?.map((s) => store.setting.fileServer + s);
       t.sheetUrls = t.sheetUrls?.map((s) => store.setting.fileServer + s);
       t.jsonUrl = store.setting.fileServer + t.jsonUrl;
 

+ 14 - 5
src/features/library/inspect/LibraryInspect.vue

@@ -24,12 +24,13 @@ import type { MarkStore, Question, Task } from "@/types";
 import { message } from "ant-design-vue";
 import {
   clearInspectedTask,
-  getInspectedSetting,
   getInspectedTaskStatus,
   getOneOfInspectedTask,
   rejectInspectedTask,
   saveInspectedTask,
 } from "@/api/libraryInspectPage";
+import { getPaper } from "@/api/jsonMark";
+import { getInspectedSetting } from "@/api/inspectPage";
 
 const route = useRoute();
 let isSingleStudent = !!route.query.libraryId;
@@ -44,14 +45,22 @@ async function updateClearTask() {
 }
 
 async function updateSetting() {
-  const settingRes = await getInspectedSetting();
+  const settingRes = await getInspectedSetting(subjectCode);
+  store.setting.examType = settingRes.data.examType;
   store.setting.fileServer = settingRes.data.fileServer;
   store.setting.userName = settingRes.data.userName;
+  store.setting.subject = settingRes.data.subject;
   store.setting.uiSetting = {
     "answer.paper.scale": 1,
     "score.board.collapse": false,
   } as MarkStore["setting"]["uiSetting"];
   store.setting.splitConfig = settingRes.data.splitConfig;
+  if (store.setting.subject?.paperUrl) {
+    store.setting.subject.paperUrl =
+      store.setting.fileServer + store.setting.subject?.paperUrl;
+
+    await getPaper(store);
+  }
 }
 async function updateStatus() {
   const res = await getInspectedTaskStatus(subjectCode, groupNumber);
@@ -78,9 +87,9 @@ async function updateTask() {
     );
     rawTask.jsonUrl = store.setting.fileServer + rawTask.jsonUrl;
     store.currentTask = res.data;
-    if (store.currentTask)
-      store.setting.subject = store.currentTask
-        .subject as MarkStore["setting"]["subject"];
+    // if (store.currentTask)
+    //   store.setting.subject = store.currentTask
+    //     .subject as MarkStore["setting"]["subject"];
   } else {
     store.message = res.data.message;
   }

+ 2 - 2
src/features/library/inspect/MarkHeader.vue

@@ -26,7 +26,7 @@
         待复核<span class="highlight-text">{{ store.status.totalCount }}</span>
       </li>
     </ul>
-    <ZoomPaper :store="store" />
+    <ZoomPaper v-if="isScanImage()" :store="store" />
     <div class="tw-flex tw-place-items-center">
       <UserOutlined class="icon-font icon-with-text" />{{
         store.setting.userName
@@ -43,7 +43,7 @@
 
 <script setup lang="ts">
 import { onMounted, ref } from "vue";
-import { store } from "@/features/mark/store";
+import { store, isScanImage } from "@/features/mark/store";
 import { UserOutlined, PoweroffOutlined } from "@ant-design/icons-vue";
 import { useRoute } from "vue-router";
 import { clearInspectedTask } from "@/api/libraryInspectPage";

+ 1 - 1
src/features/library/inspect/MarkHistory.vue

@@ -108,7 +108,7 @@ async function updateHistoryTask({
   if (res.data) {
     let data = cloneDeep(res.data) as Array<Task>;
     data = data.map((t) => {
-      t.sliceUrls = t.sliceUrls.map((s) => store.setting.fileServer + s);
+      t.sliceUrls = t.sliceUrls?.map((s) => store.setting.fileServer + s);
       t.sheetUrls = t.sheetUrls?.map((s) => store.setting.fileServer + s);
       t.jsonUrl = store.setting.fileServer + t.jsonUrl;
 

+ 23 - 3
src/features/library/libraryTrack/LibraryTrack.vue

@@ -16,9 +16,31 @@ import MarkBody from "./MarkBody.vue";
 import type { MarkStore, Task } from "@/types";
 import { message } from "ant-design-vue";
 import { getSingleLibraryTask } from "@/api/libraryTrackPage";
+import { getInspectedSetting } from "@/api/inspectPage";
+import { getPaper } from "@/api/jsonMark";
 
 const route = useRoute();
 let libraryId = route.query.libraryId;
+let subjectCode = route.query.subjectCode;
+
+async function updateSetting() {
+  const settingRes = await getInspectedSetting(subjectCode as string);
+  store.setting.examType = settingRes.data.examType;
+  store.setting.fileServer = settingRes.data.fileServer;
+  store.setting.userName = settingRes.data.userName;
+  store.setting.subject = settingRes.data.subject;
+  store.setting.uiSetting = {
+    "answer.paper.scale": 1,
+    "score.board.collapse": false,
+  } as MarkStore["setting"]["uiSetting"];
+  store.setting.splitConfig = settingRes.data.splitConfig;
+  if (store.setting.subject?.paperUrl) {
+    store.setting.subject.paperUrl =
+      store.setting.fileServer + store.setting.subject?.paperUrl;
+
+    await getPaper(store);
+  }
+}
 
 async function updateTask() {
   // const mkey = "fetch_task_key";
@@ -42,9 +64,6 @@ async function updateTask() {
     );
 
     store.currentTask = task;
-    if (store.currentTask)
-      store.setting.subject = store.currentTask
-        .subject as MarkStore["setting"]["subject"];
   } else {
     store.message = res.data.message;
   }
@@ -55,6 +74,7 @@ async function fetchTask() {
 }
 
 onMounted(async () => {
+  await updateSetting();
   await fetchTask();
 });
 

+ 2 - 2
src/features/library/libraryTrack/MarkHeader.vue

@@ -14,7 +14,7 @@
         }}</span>
       </div>
     </div>
-    <ZoomPaper :store="store" />
+    <ZoomPaper v-if="isScanImage()" :store="store" />
     <div
       class="tw-flex tw-place-content-center tw-cursor-pointer"
       style="max-width: 8%"
@@ -37,7 +37,7 @@
 </template>
 
 <script setup lang="ts">
-import { store } from "@/features/mark/store";
+import { store, isScanImage } from "@/features/mark/store";
 import { PoweroffOutlined } from "@ant-design/icons-vue";
 import ZoomPaper from "@/components/ZoomPaper.vue";
 

+ 8 - 3
src/features/library/quality/MarkHeader.vue

@@ -21,8 +21,13 @@
         }}</span>
       </div>
     </div>
-    <ZoomPaper :store="store" />
-    <a-popover title="小助手" trigger="hover" class="tw-cursor-pointer">
+    <ZoomPaper v-if="isScanImage()" :store="store" />
+    <a-popover
+      v-if="isScanImage()"
+      title="小助手"
+      trigger="hover"
+      class="tw-cursor-pointer"
+    >
       <template #content>
         <table class="assistant-table">
           <tr v-if="store.setting.subject.paperUrl">
@@ -74,7 +79,7 @@
 </template>
 
 <script setup lang="ts">
-import { store } from "@/features/mark/store";
+import { store, isScanImage } from "@/features/mark/store";
 import {
   UserOutlined,
   PoweroffOutlined,

+ 7 - 2
src/features/library/quality/MarkHistory.vue

@@ -23,7 +23,12 @@
           "
           :class="store.currentTask === task && 'current-task'"
         >
-          <div>{{ task.secretNumber }}</div>
+          <div
+            class="tw-overflow-ellipsis tw-overflow-hidden tw-w-1/3"
+            :title="task.secretNumber"
+          >
+            {{ task.secretNumber }}
+          </div>
           <div>
             {{ task.markTime && $filters.datetimeFilter(task.markTime) }}
           </div>
@@ -87,7 +92,7 @@ async function updateHistoryTask({
   if (res.data) {
     let data = cloneDeep(res.data) as Array<Task>;
     data = data.map((t) => {
-      t.sliceUrls = t.sliceUrls.map((s) => store.setting.fileServer + s);
+      t.sliceUrls = t.sliceUrls?.map((s) => store.setting.fileServer + s);
       t.sheetUrls = t.sheetUrls?.map((s) => store.setting.fileServer + s);
       t.jsonUrl = store.setting.fileServer + t.jsonUrl;
 

+ 6 - 5
src/features/library/quality/Quality.vue

@@ -18,11 +18,12 @@ import MarkHeader from "./MarkHeader.vue";
 import { useRoute } from "vue-router";
 import MarkBody from "./MarkBody.vue";
 import MarkHistory from "./MarkHistory.vue";
-import { MarkStore, Question, Task } from "@/types";
+import { MarkStore } from "@/types";
 import { getInspectedSetting } from "@/api/inspectPage";
 import MinimapModal from "@/features/mark/MinimapModal.vue";
 import PaperModal from "@/features/mark/PaperModal.vue";
 import AnswerModal from "@/features/mark/AnswerModal.vue";
+import { getPaper } from "@/api/jsonMark";
 
 export default defineComponent({
   name: "Quality",
@@ -44,7 +45,9 @@ export default defineComponent({
 
     async function updateSetting() {
       const settingRes = await getInspectedSetting(subjectCode);
+      store.setting.examType = settingRes.data.examType;
       store.setting.fileServer = settingRes.data.fileServer;
+      store.setting.subject = settingRes.data.subject;
       store.setting.userName = settingRes.data.userName;
       store.setting.uiSetting = {
         "answer.paper.scale": 1,
@@ -59,16 +62,14 @@ export default defineComponent({
       if (store.setting.subject?.paperUrl) {
         store.setting.subject.paperUrl =
           store.setting.fileServer + store.setting.subject?.paperUrl;
+
+        await getPaper(store);
       }
     }
 
-    const shouldReloadHistory = ref(0);
-
     onMounted(async () => {
       await updateSetting();
       store.historyOpen = true;
-      // await updateClearTask();
-      // fetchTask(); // mark-header 会调用 (watchEffect)
     });
 
     const renderError = () => {

+ 2 - 46
src/features/mark/Mark.vue

@@ -66,7 +66,7 @@ import AllPaperModal from "./AllPaperModal.vue";
 import SheetViewModal from "./SheetViewModal.vue";
 import SpecialTagModal from "./SpecialTagModal.vue";
 import { preDrawImage } from "@/utils/utils";
-import { getJSON } from "@/api/jsonMark";
+import { getJSON, getPaper } from "@/api/jsonMark";
 
 const { addInterval } = useTimers();
 
@@ -93,51 +93,7 @@ async function updateSetting() {
     store.setting.subject.paperUrl =
       store.setting.fileServer + store.setting.subject?.paperUrl;
 
-    const paper = await getPaper();
-  }
-}
-
-async function getPaper() {
-  const res = await getJSON(store.setting.subject.paperUrl);
-  store.setting.subject.questions = [];
-  if (res.data.questions) {
-    // 云平台格式
-    const questions = res.data.questions; // TODO: add type
-    for (const q of questions) {
-      const tempQuestion = {
-        unionOrder: q.mainNumber + "-" + q.subNumber,
-        body: q.body,
-        parentBody: q.parentBody,
-        answer: [q.answer],
-      } as RichTextQuestion;
-      store.setting.subject.questions.push(tempQuestion);
-    }
-  } else {
-    const details = res.data.details;
-    for (let order1 of details) {
-      for (let order2 of order1.questions) {
-        if (order2.subQuestions) {
-          for (let order3 of order2.subQuestions) {
-            const tempQuestion = {
-              unionOrder:
-                order1.number + "-" + order2.number + "-" + order3.number,
-              body: order3.body,
-              parentBody: order2.body,
-              answer: order3.answer,
-            } as RichTextQuestion;
-            store.setting.subject.questions.push(tempQuestion);
-          }
-        } else {
-          const tempQuestion = {
-            unionOrder: order1.number + "-" + order2.number,
-            body: order2.body,
-            parentBody: null,
-            answer: order2.answer,
-          } as RichTextQuestion;
-          store.setting.subject.questions.push(tempQuestion);
-        }
-      }
-    }
+    const paper = await getPaper(store);
   }
 }
 

+ 30 - 3
src/features/mark/MarkHeader.vue

@@ -66,7 +66,7 @@
         进度<span class="highlight-text">{{ progress ?? "-" }}%</span>
       </li>
     </ul>
-    <ZoomPaper :store="store" />
+    <ZoomPaper v-if="isScanImage()" :store="store" />
     <div>
       <a-dropdown class="header-bg-color">
         <template #overlay v-if="!store.setting.forceMode">
@@ -114,7 +114,34 @@
     >
       <ClockCircleOutlined class="icon-font icon-font-size-20" />
     </div>
-    <a-popover title="小助手" trigger="hover" class="tw-cursor-pointer">
+    <a-popover
+      v-if="!isScanImage()"
+      title="小助手"
+      trigger="hover"
+      class="tw-cursor-pointer"
+    >
+      <template #content>
+        <table class="assistant-table">
+          <tr v-if="store.setting.statusValue !== 'TRIAL'">
+            <td>问题卷</td>
+            <td><a-button @click="openProblemModal">选择问题类型</a-button></td>
+          </tr>
+        </table>
+      </template>
+      <div class="tw-flex">
+        小助手
+        <DownOutlined
+          style="font-size: 12px; display: inline-block"
+          class="tw-self-center tw-ml-1"
+        />
+      </div>
+    </a-popover>
+    <a-popover
+      v-if="isScanImage()"
+      title="小助手"
+      trigger="hover"
+      class="tw-cursor-pointer"
+    >
       <template #content>
         <table class="assistant-table">
           <tr v-if="store.setting.subject.paperUrl">
@@ -219,7 +246,7 @@
 <script setup lang="ts">
 import { doLogout } from "@/api/markPage";
 import { computed, defineEmit, ref, watchEffect } from "vue";
-import { store } from "./store";
+import { store, isScanImage } from "./store";
 import {
   SnippetsOutlined,
   UserOutlined,

+ 2 - 2
src/features/mark/MarkHistory.vue

@@ -168,7 +168,7 @@ watch(
             q.__origScore = q.score;
             return q;
           });
-          t.sliceUrls = t.sliceUrls.map((s) => store.setting.fileServer + s);
+          t.sliceUrls = t.sliceUrls?.map((s) => store.setting.fileServer + s);
           t.sheetUrls = t.sheetUrls?.map((s) => store.setting.fileServer + s);
           t.jsonUrl = store.setting.fileServer + t.jsonUrl;
 
@@ -221,7 +221,7 @@ async function updateHistoryTask({
         q.__origScore = q.score;
         return q;
       });
-      t.sliceUrls = t.sliceUrls.map((s) => store.setting.fileServer + s);
+      t.sliceUrls = t.sliceUrls?.map((s) => store.setting.fileServer + s);
       t.sheetUrls = t.sheetUrls?.map((s) => store.setting.fileServer + s);
       t.jsonUrl = store.setting.fileServer + t.jsonUrl;
 

+ 10 - 1
src/features/mark/MultiMediaMarkBody.vue

@@ -28,6 +28,11 @@
             v-html="getDomByRichTextJSON(question.standardAnswerr)?.innerHTML"
           />
         </div>
+        <div style="color: blue">
+          得分 / 总分 :{{
+            (question.score ?? "") + " / " + question.totalScore
+          }}
+        </div>
       </div>
       <div style="margin-bottom: 20px"></div>
     </div>
@@ -55,6 +60,8 @@ interface QuestionForRender {
   body: RichTextJSON;
   studentAnswer: Array<RichTextJSON> | null;
   standardAnswerr: Array<RichTextJSON> | null;
+  score: number | null;
+  totalScore: number;
 }
 
 const questions = ref([] as Array<QuestionForRender>);
@@ -110,10 +117,12 @@ watch(
       questionForRender.body = questionBody.body;
       questionForRender.standardAnswerr = questionBody.answer;
       questionForRender.studentAnswer = q.answer;
+      questionForRender.score = taskQuestion.score;
+      questionForRender.totalScore = taskQuestion.maxScore;
       questions.value.push(questionForRender);
     }
   },
-  { immediate: true }
+  { immediate: true, deep: true }
 );
 
 let viewer: Viewer = null as unknown as Viewer;

+ 12 - 2
src/features/student/inspect/Inspect.vue

@@ -31,6 +31,7 @@ import MarkHistory from "./MarkHistory.vue";
 import MarkBoardInspect from "./MarkBoardInspect.vue";
 import type { Question, Task } from "@/types";
 import { message } from "ant-design-vue";
+import { getPaper } from "@/api/jsonMark";
 
 const route = useRoute();
 let isSingleStudent = !!route.query.studentId;
@@ -59,14 +60,22 @@ async function updateClearTask() {
 }
 
 async function updateSetting() {
-  const settingRes = await getInspectedSetting();
+  const settingRes = await getInspectedSetting(subjectCode);
+  store.setting.examType = settingRes.data.examType;
   store.setting.fileServer = settingRes.data.fileServer;
+  store.setting.subject = settingRes.data.subject;
   store.setting.userName = settingRes.data.userName;
   store.setting.uiSetting = {
     "answer.paper.scale": 1,
     "score.board.collapse": false,
   };
   store.setting.splitConfig = settingRes.data.splitConfig;
+  if (store.setting.subject?.paperUrl) {
+    store.setting.subject.paperUrl =
+      store.setting.fileServer + store.setting.subject?.paperUrl;
+
+    await getPaper(store);
+  }
 }
 async function updateStatus() {
   const res = await getInspectedTaskStatus({
@@ -101,7 +110,8 @@ async function updateTask() {
     );
     rawTask.jsonUrl = store.setting.fileServer + rawTask.jsonUrl;
     store.currentTask = res.data;
-    if (store.currentTask) store.setting.subject = store.currentTask.subject;
+    // if (store.currentTask)
+    //   Object.assign(store.setting.subject, store.currentTask.subject);
   } else {
     store.message = res.data.message;
   }

+ 2 - 2
src/features/student/inspect/MarkHeader.vue

@@ -26,7 +26,7 @@
         待复核<span class="highlight-text">{{ store.status.totalCount }}</span>
       </li>
     </ul>
-    <ZoomPaper :store="store" />
+    <ZoomPaper v-if="isScanImage()" :store="store" />
     <div @click="toggleHistory" v-if="!isSingleStudent" title="回看">
       <SnippetsOutlined
         class="icon-font icon-font-size-20 tw-cursor-pointer"
@@ -52,7 +52,7 @@
 <script setup lang="ts">
 import { clearInspectedTask } from "@/api/inspectPage";
 import { onMounted, ref } from "vue";
-import { store } from "../store";
+import { store, isScanImage } from "../store";
 import {
   SnippetsOutlined,
   UserOutlined,

+ 1 - 1
src/features/student/inspect/MarkHistory.vue

@@ -107,7 +107,7 @@ async function updateHistoryTask({
   if (res.data) {
     let data = cloneDeep(res.data) as Array<Task>;
     data = data.map((t) => {
-      t.sliceUrls = t.sliceUrls.map((s) => store.setting.fileServer + s);
+      t.sliceUrls = t.sliceUrls?.map((s) => store.setting.fileServer + s);
       t.sheetUrls = t.sheetUrls?.map((s) => store.setting.fileServer + s);
       t.jsonUrl = store.setting.fileServer + t.jsonUrl;
 

+ 10 - 1
src/features/student/store.ts

@@ -5,7 +5,8 @@ const obj = {
   setting: {
     fileServer: "",
     userName: "",
-    subject: { name: "", code: "" },
+    subject: { name: "", code: "", paperUrl: "", questions: [] },
+    examType: "SCAN_IMAGE",
     uiSetting: {
       "answer.paper.scale": 1,
       "score.board.collapse": false,
@@ -23,4 +24,12 @@ const obj = {
   message: null,
 } as InspectStore;
 
+/**
+ * 是否是扫描阅卷
+ * @returns boolean
+ */
+export function isScanImage() {
+  return store.setting.examType === "SCAN_IMAGE";
+}
+
 export const store = reactive(obj);

+ 2 - 2
src/features/student/studentTrack/MarkHeader.vue

@@ -14,7 +14,7 @@
         }}</span>
       </div>
     </div>
-    <ZoomPaper :store="store" />
+    <ZoomPaper v-if="isScanImage()" :store="store" />
     <div
       class="tw-flex tw-place-items-center tw-cursor-pointer"
       @click="closeWindow"
@@ -25,7 +25,7 @@
 </template>
 
 <script setup lang="ts">
-import { store } from "../store";
+import { store, isScanImage } from "../store";
 import { PoweroffOutlined } from "@ant-design/icons-vue";
 import ZoomPaper from "@/components/ZoomPaper.vue";
 

+ 23 - 1
src/features/student/studentTrack/StudentTrack.vue

@@ -16,9 +16,31 @@ import MarkBody from "../inspect/MarkBody.vue";
 import type { Task } from "@/types";
 import { message } from "ant-design-vue";
 import { getSingleStudentTask } from "@/api/studentTrackPage";
+import { getInspectedSetting } from "@/api/inspectPage";
+import { getPaper } from "@/api/jsonMark";
 
 const route = useRoute();
 let studentId = route.query.studentId;
+let subjectCode = route.query.subjectCode as string;
+
+async function updateSetting() {
+  const settingRes = await getInspectedSetting(subjectCode);
+  store.setting.examType = settingRes.data.examType;
+  store.setting.fileServer = settingRes.data.fileServer;
+  store.setting.subject = settingRes.data.subject;
+  store.setting.userName = settingRes.data.userName;
+  store.setting.uiSetting = {
+    "answer.paper.scale": 1,
+    "score.board.collapse": false,
+  };
+  store.setting.splitConfig = settingRes.data.splitConfig;
+  if (store.setting.subject?.paperUrl) {
+    store.setting.subject.paperUrl =
+      store.setting.fileServer + store.setting.subject?.paperUrl;
+
+    await getPaper(store);
+  }
+}
 
 async function updateTask() {
   // const mkey = "fetch_task_key";
@@ -48,7 +70,6 @@ async function updateTask() {
     task.specialTagList = res.data.tagList.filter((q) => q.tagName);
 
     store.currentTask = task;
-    if (store.currentTask) store.setting.subject = store.currentTask.subject;
   } else {
     store.message = res.data.message;
   }
@@ -59,6 +80,7 @@ async function fetchTask() {
 }
 
 onMounted(async () => {
+  await updateSetting();
   await fetchTask();
 });
 

+ 8 - 2
src/types/index.ts

@@ -86,7 +86,7 @@ export interface Task {
   studentName: string; //后端处理是否显示
   studentCode: string;
   examNumber: string;
-  subject: { name: string; code: string };
+  // subject: { name: string; code: string };
   sliceUrls: Array<string>; //裁切图url
   sliceConfig: Array<PictureSlice>; //最高显示优先级
   jsonUrl: string; // sliceUrls为空,则是多媒体阅卷,显示JSON
@@ -181,9 +181,15 @@ export interface MarkResult {
 
 export interface InspectStore {
   setting: {
+    examType: "SCAN_IMAGE" | "MULTI_MEDIA"; // 扫描图片或者多媒体,多媒体只允许 common mode
     fileServer: string;
     userName: string;
-    subject: { name: string; code: string; paperUrl: string };
+    subject: {
+      name: string;
+      code: string;
+      paperUrl: string;
+      questions: Array<RichTextQuestion>;
+    };
     uiSetting: {
       "answer.paper.scale": number;
       "score.board.collapse": boolean;