store.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import { Setting, MarkStore, Task, MarkResult, Track } from "@/types";
  2. import { reactive } from "vue";
  3. const obj = {
  4. setting: {
  5. mode: "TRACK",
  6. examType: "SCAN_IMAGE",
  7. forceMode: false,
  8. sheetView: false,
  9. sheetConfig: [],
  10. enableAllZero: false,
  11. fileServer: "",
  12. userName: "",
  13. subject: <Setting["subject"]>{},
  14. forceSpecialTag: false,
  15. uiSetting: {
  16. "answer.paper.scale": 1,
  17. "score.board.collapse": false,
  18. "normal.mode": "keyboard",
  19. },
  20. statusValue: "FORMAL",
  21. problemTypes: [],
  22. groupNumber: 0,
  23. topCount: 0,
  24. splitConfig: [],
  25. prefetchCount: 3,
  26. startTime: 0,
  27. endTime: 0,
  28. },
  29. status: <MarkStore["status"]>{},
  30. groups: [],
  31. tasks: [],
  32. currentMarkResult: undefined,
  33. currentTask: undefined,
  34. currentQuestion: undefined,
  35. currentScore: undefined,
  36. markResults: [],
  37. historyOpen: false,
  38. MarkBoardTrackCollapse: false,
  39. historyTasks: [],
  40. removeScoreTracks: [],
  41. } as MarkStore;
  42. /** 如果currentTask不存在,则返回undefined; 如果currentMarkResult不存在,则创建一个对应的markResult并返回 */
  43. export function findCurrentTaskMarkResult() {
  44. if (!store.currentTask) return;
  45. const { libraryId, studentId } = store.currentTask;
  46. const statusValue = store.setting.statusValue;
  47. let markResult = store.markResults.find(
  48. (m) =>
  49. m.libraryId === libraryId &&
  50. m.studentId === studentId &&
  51. m.statusValue === statusValue
  52. );
  53. if (!markResult) {
  54. const { libraryId, studentId } = store.currentTask;
  55. const statusValue = store.setting.statusValue;
  56. markResult = {} as MarkResult;
  57. markResult.libraryId = libraryId;
  58. markResult.studentId = studentId;
  59. markResult.statusValue = statusValue;
  60. markResult.spent = Date.now();
  61. markResult.trackList = store.currentTask.questionList.reduce(
  62. (all, c) => all.concat(c.trackList),
  63. [] as Array<Track>
  64. );
  65. markResult.scoreList = store.currentTask.questionList.map((q) => q.score);
  66. markResult.markerScore =
  67. markResult.scoreList
  68. .filter((v): v is number => v !== null)
  69. .reduce((acc, v) => (acc += Math.round(v * 100)), 0) / 100;
  70. store.markResults = [...store.markResults, markResult];
  71. }
  72. return store.markResults.find(
  73. (m) =>
  74. m.libraryId === libraryId &&
  75. m.studentId === studentId &&
  76. m.statusValue === statusValue
  77. );
  78. }
  79. export function removeCurrentMarkResult() {
  80. if (!store.currentTask) return;
  81. function clearMarkResultFromTask(task: Task) {
  82. let { libraryId, studentId } = task;
  83. const i = store.markResults.findIndex(
  84. (s) => s.libraryId === libraryId && s.studentId === studentId
  85. );
  86. store.markResults.splice(i, 1);
  87. }
  88. clearMarkResultFromTask(store.currentTask);
  89. for (const task of store.tasks) {
  90. // 清理不在当前任务中的markResult,防止回评产生的markResult造成垃圾
  91. clearMarkResultFromTask(task);
  92. }
  93. }
  94. export const store = reactive(obj);