|
@@ -1,137 +1,141 @@
|
|
import { Setting, MarkStore, Track } from "@/types";
|
|
import { Setting, MarkStore, Track } from "@/types";
|
|
-import { reactive, watch } from "vue";
|
|
|
|
|
|
+import { watch } from "vue";
|
|
|
|
+import { defineStore } from "pinia";
|
|
|
|
|
|
-const obj = {
|
|
|
|
- setting: {
|
|
|
|
- mode: "TRACK",
|
|
|
|
- examType: "SCAN_IMAGE",
|
|
|
|
- forceMode: false,
|
|
|
|
- sheetView: false,
|
|
|
|
- sheetConfig: [],
|
|
|
|
- enableAllZero: false,
|
|
|
|
- fileServer: "",
|
|
|
|
- userName: "",
|
|
|
|
- subject: <Setting["subject"]>{},
|
|
|
|
- forceSpecialTag: false,
|
|
|
|
- uiSetting: {
|
|
|
|
- "answer.paper.scale": 1,
|
|
|
|
- "score.board.collapse": false,
|
|
|
|
- "normal.mode": "keyboard",
|
|
|
|
- "paper.modal": false,
|
|
|
|
- "answer.modal": false,
|
|
|
|
- "minimap.modal": false,
|
|
|
|
- "specialTag.modal": false,
|
|
|
|
- "score.fontSize.scale": 1,
|
|
|
|
- },
|
|
|
|
- statusValue: "FORMAL",
|
|
|
|
- problemTypes: [],
|
|
|
|
- groupNumber: 0,
|
|
|
|
- groupTitle: "",
|
|
|
|
- topCount: 0,
|
|
|
|
- splitConfig: [],
|
|
|
|
- prefetchCount: 3,
|
|
|
|
- startTime: 0,
|
|
|
|
- endTime: 0,
|
|
|
|
- selective: false,
|
|
|
|
|
|
+export const useMarkStore = defineStore("mark", {
|
|
|
|
+ state: () => {
|
|
|
|
+ return {
|
|
|
|
+ setting: {
|
|
|
|
+ mode: "TRACK",
|
|
|
|
+ examType: "SCAN_IMAGE",
|
|
|
|
+ forceMode: false,
|
|
|
|
+ sheetView: false,
|
|
|
|
+ sheetConfig: [],
|
|
|
|
+ enableAllZero: false,
|
|
|
|
+ fileServer: "",
|
|
|
|
+ userName: "",
|
|
|
|
+ subject: <Setting["subject"]>{},
|
|
|
|
+ forceSpecialTag: false,
|
|
|
|
+ uiSetting: {
|
|
|
|
+ "answer.paper.scale": 1,
|
|
|
|
+ "score.board.collapse": false,
|
|
|
|
+ "normal.mode": "keyboard",
|
|
|
|
+ "paper.modal": false,
|
|
|
|
+ "answer.modal": false,
|
|
|
|
+ "minimap.modal": false,
|
|
|
|
+ "specialTag.modal": false,
|
|
|
|
+ "score.fontSize.scale": 1,
|
|
|
|
+ },
|
|
|
|
+ statusValue: "FORMAL",
|
|
|
|
+ problemTypes: [],
|
|
|
|
+ groupNumber: 0,
|
|
|
|
+ groupTitle: "",
|
|
|
|
+ topCount: 0,
|
|
|
|
+ splitConfig: [],
|
|
|
|
+ prefetchCount: 3,
|
|
|
|
+ startTime: 0,
|
|
|
|
+ endTime: 0,
|
|
|
|
+ selective: false,
|
|
|
|
+ },
|
|
|
|
+ status: <MarkStore["status"]>{},
|
|
|
|
+ groups: [],
|
|
|
|
+ tasks: [],
|
|
|
|
+ message: null,
|
|
|
|
+ currentTask: undefined,
|
|
|
|
+ currentQuestion: undefined,
|
|
|
|
+ currentScore: undefined,
|
|
|
|
+ currentSpecialTag: undefined,
|
|
|
|
+ historyOpen: false,
|
|
|
|
+ historyTasks: [],
|
|
|
|
+ removeScoreTracks: [],
|
|
|
|
+ focusTracks: [],
|
|
|
|
+ maxModalZIndex: 1020,
|
|
|
|
+ minimapScrollTo: 0,
|
|
|
|
+ allPaperModal: false,
|
|
|
|
+ sheetViewModal: false,
|
|
|
|
+ globalMask: false,
|
|
|
|
+ } as MarkStore;
|
|
},
|
|
},
|
|
- status: <MarkStore["status"]>{},
|
|
|
|
- groups: [],
|
|
|
|
- tasks: [],
|
|
|
|
- message: null,
|
|
|
|
- currentTask: undefined,
|
|
|
|
- currentQuestion: undefined,
|
|
|
|
- currentScore: undefined,
|
|
|
|
- currentSpecialTag: undefined,
|
|
|
|
- historyOpen: false,
|
|
|
|
- historyTasks: [],
|
|
|
|
- removeScoreTracks: [],
|
|
|
|
- focusTracks: [],
|
|
|
|
- maxModalZIndex: 1020,
|
|
|
|
- minimapScrollTo: 0,
|
|
|
|
- allPaperModal: false,
|
|
|
|
- sheetViewModal: false,
|
|
|
|
- globalMask: false,
|
|
|
|
-} as MarkStore;
|
|
|
|
-
|
|
|
|
-/**
|
|
|
|
- * 返回正在评卷的状态 '' | 回评 | 打回
|
|
|
|
- */
|
|
|
|
-export function getMarkStatus() {
|
|
|
|
- if (!store.currentTask) return "";
|
|
|
|
-
|
|
|
|
- if (store.currentTask.previous) return "回评";
|
|
|
|
- if (store.currentTask.rejected) return "打回";
|
|
|
|
|
|
+ getters: {
|
|
|
|
+ /* 是否是扫描阅卷 */
|
|
|
|
+ isScanImage(): boolean {
|
|
|
|
+ return this.setting.examType === "SCAN_IMAGE";
|
|
|
|
+ },
|
|
|
|
+ /* 返回正在评卷的状态 '' | 回评 | 打回 */
|
|
|
|
+ getMarkStatus(): string {
|
|
|
|
+ if (!this.currentTask) return "";
|
|
|
|
+ if (this.currentTask.previous) return "回评";
|
|
|
|
+ if (this.currentTask.rejected) return "打回";
|
|
|
|
|
|
- return "";
|
|
|
|
-}
|
|
|
|
|
|
+ return "";
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ actions: {},
|
|
|
|
+});
|
|
|
|
|
|
-/**
|
|
|
|
- * 是否是扫描阅卷
|
|
|
|
- * @returns boolean
|
|
|
|
- */
|
|
|
|
-export function isScanImage() {
|
|
|
|
- return store.setting.examType === "SCAN_IMAGE";
|
|
|
|
-}
|
|
|
|
|
|
+export let store = null as unknown as ReturnType<typeof useMarkStore>;
|
|
|
|
|
|
-export const store = reactive(obj);
|
|
|
|
|
|
+setTimeout(() => {
|
|
|
|
+ store = useMarkStore();
|
|
|
|
|
|
-watch(
|
|
|
|
- () => store.currentTask,
|
|
|
|
- () => {
|
|
|
|
- // 初始化 task.markResult ,始终保证 task 下有 markResult
|
|
|
|
- // 1. 评卷时,如果没有 markResult ,则初始化一个 markResult 给它
|
|
|
|
- // 1. 回评时,先清空它的 markResult ,然后初始化一个 markResult 给它
|
|
|
|
- if (!store.currentTask) return;
|
|
|
|
|
|
+ watch(
|
|
|
|
+ () => store.currentTask,
|
|
|
|
+ () => {
|
|
|
|
+ // 初始化 task.markResult ,始终保证 task 下有 markResult
|
|
|
|
+ // 1. 评卷时,如果没有 markResult ,则初始化一个 markResult 给它
|
|
|
|
+ // 1. 回评时,先清空它的 markResult ,然后初始化一个 markResult 给它
|
|
|
|
+ if (!store.currentTask) return;
|
|
|
|
|
|
- const task = store.currentTask;
|
|
|
|
- if (task.previous && task.markResult) {
|
|
|
|
- // @ts-ignore 将其强制置空
|
|
|
|
- task.markResult = undefined;
|
|
|
|
- }
|
|
|
|
- if (!task.markResult) {
|
|
|
|
- // 初始化 __index
|
|
|
|
- task.questionList.forEach((q, i, ar) => (ar[i].__index = i));
|
|
|
|
|
|
+ const task = store.currentTask;
|
|
|
|
+ if (task.previous && task.markResult) {
|
|
|
|
+ // @ts-ignore 将其强制置空
|
|
|
|
+ task.markResult = undefined;
|
|
|
|
+ }
|
|
|
|
+ if (!task.markResult) {
|
|
|
|
+ // 初始化 __index
|
|
|
|
+ task.questionList.forEach((q, i, ar) => (ar[i].__index = i));
|
|
|
|
|
|
- task.__markStartTime = Date.now();
|
|
|
|
- const statusValue = store.setting.statusValue;
|
|
|
|
- const { libraryId, studentId } = task;
|
|
|
|
- task.markResult = {
|
|
|
|
- statusValue: statusValue,
|
|
|
|
- libraryId: libraryId,
|
|
|
|
- studentId: studentId,
|
|
|
|
- spent: 0,
|
|
|
|
|
|
+ task.__markStartTime = Date.now();
|
|
|
|
+ const statusValue = store.setting.statusValue;
|
|
|
|
+ const { libraryId, studentId } = task;
|
|
|
|
+ task.markResult = {
|
|
|
|
+ statusValue: statusValue,
|
|
|
|
+ libraryId: libraryId,
|
|
|
|
+ studentId: studentId,
|
|
|
|
+ spent: 0,
|
|
|
|
|
|
- trackList: task.questionList.reduce(
|
|
|
|
- (all, c) => all.concat(c.trackList),
|
|
|
|
- [] as Array<Track>
|
|
|
|
- ),
|
|
|
|
- specialTagList: [...(task.specialTagList ?? [])],
|
|
|
|
- scoreList: task.questionList.map((q) => q.score),
|
|
|
|
- markerScore: null, // 后期通过 scoreList 自动更新
|
|
|
|
|
|
+ trackList: task.questionList.reduce(
|
|
|
|
+ (all, c) => all.concat(c.trackList),
|
|
|
|
+ [] as Array<Track>
|
|
|
|
+ ),
|
|
|
|
+ specialTagList: [...(task.specialTagList ?? [])],
|
|
|
|
+ scoreList: task.questionList.map((q) => q.score),
|
|
|
|
+ markerScore: null, // 后期通过 scoreList 自动更新
|
|
|
|
|
|
- problem: false,
|
|
|
|
- problemTypeId: 0,
|
|
|
|
- unselective: false,
|
|
|
|
- };
|
|
|
|
|
|
+ problem: false,
|
|
|
|
+ problemTypeId: 0,
|
|
|
|
+ unselective: false,
|
|
|
|
+ };
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- }
|
|
|
|
-);
|
|
|
|
|
|
+ );
|
|
|
|
|
|
-// 唯一根据 scoreList 自动更新 markerScore
|
|
|
|
-watch(
|
|
|
|
- () => store.currentTask?.markResult.scoreList,
|
|
|
|
- () => {
|
|
|
|
- if (!store.currentTask) return;
|
|
|
|
- const scoreList = store.currentTask.markResult.scoreList.filter(
|
|
|
|
- (v) => v !== null
|
|
|
|
- ) as number[];
|
|
|
|
- const result =
|
|
|
|
- scoreList.length === 0
|
|
|
|
- ? null
|
|
|
|
- : scoreList.reduce((acc, v) => (acc += Math.round(v * 100)), 0) / 100;
|
|
|
|
- store.currentTask.markResult.markerScore = result;
|
|
|
|
- },
|
|
|
|
- { deep: true }
|
|
|
|
-);
|
|
|
|
|
|
+ // 唯一根据 scoreList 自动更新 markerScore
|
|
|
|
+ watch(
|
|
|
|
+ () => store.currentTask?.markResult.scoreList,
|
|
|
|
+ () => {
|
|
|
|
+ if (!store.currentTask) return;
|
|
|
|
+ const scoreList = store.currentTask.markResult.scoreList.filter(
|
|
|
|
+ (v) => v !== null
|
|
|
|
+ ) as number[];
|
|
|
|
+ const result =
|
|
|
|
+ scoreList.length === 0
|
|
|
|
+ ? null
|
|
|
|
+ : scoreList.reduce((acc, v) => (acc += Math.round(v * 100)), 0) / 100;
|
|
|
|
+ store.currentTask.markResult.markerScore = result;
|
|
|
|
+ },
|
|
|
|
+ { deep: true }
|
|
|
|
+ );
|
|
|
|
|
|
-// scoreList 被 trackList 和用户手动更新
|
|
|
|
|
|
+ // scoreList 被 trackList 和用户手动更新
|
|
|
|
+}, 0);
|