2
0

LibraryInspect.vue 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. <template>
  2. <div class="my-container">
  3. <mark-header />
  4. <div class="tw-flex tw-gap-1">
  5. <mark-history
  6. @reload="reloadAndfetchTask"
  7. :should-reload="shouldReloadHistory"
  8. />
  9. <mark-body @error="renderError" />
  10. <MarkBoardInspect @inspect="saveTaskToServer" @reject="rejectQuestions" />
  11. </div>
  12. </div>
  13. </template>
  14. <script setup lang="ts">
  15. import { computed, onMounted, ref } from "vue";
  16. import { store } from "@/features/mark/store";
  17. import MarkHeader from "./MarkHeader.vue";
  18. import { useRoute } from "vue-router";
  19. import MarkBody from "./MarkBody.vue";
  20. import MarkHistory from "./MarkHistory.vue";
  21. import MarkBoardInspect from "./MarkBoardInspect.vue";
  22. import type { MarkStore, Question, Task } from "@/types";
  23. import { message } from "ant-design-vue";
  24. import {
  25. clearInspectedTask,
  26. getInspectedTaskStatus,
  27. getOneOfInspectedTask,
  28. rejectInspectedTask,
  29. saveInspectedTask,
  30. } from "@/api/libraryInspectPage";
  31. import { getPaper } from "@/api/jsonMark";
  32. import { getInspectedSetting } from "@/api/inspectPage";
  33. const route = useRoute();
  34. let isSingleStudent = !!route.query.libraryId;
  35. const { subjectCode, groupNumber, libraryId } = route.query as {
  36. subjectCode: string;
  37. groupNumber: string;
  38. libraryId: string; // TODO: for未来单一任务
  39. };
  40. async function updateClearTask() {
  41. await clearInspectedTask(subjectCode, groupNumber);
  42. }
  43. async function updateSetting() {
  44. const settingRes = await getInspectedSetting(subjectCode);
  45. store.setting.examType = settingRes.data.examType;
  46. store.setting.fileServer = settingRes.data.fileServer;
  47. store.setting.userName = settingRes.data.userName;
  48. store.setting.subject = settingRes.data.subject;
  49. store.setting.uiSetting = {
  50. "answer.paper.scale": 1,
  51. "score.board.collapse": false,
  52. } as MarkStore["setting"]["uiSetting"];
  53. store.setting.splitConfig = settingRes.data.splitConfig;
  54. if (store.setting.subject?.paperUrl) {
  55. store.setting.subject.paperUrl =
  56. store.setting.fileServer + store.setting.subject?.paperUrl;
  57. await getPaper(store);
  58. }
  59. }
  60. async function updateStatus() {
  61. const res = await getInspectedTaskStatus(subjectCode, groupNumber);
  62. if (res.data.valid) store.status = res.data;
  63. }
  64. async function updateTask() {
  65. // const mkey = "fetch_task_key";
  66. message.info({ content: "获取任务中...", duration: 2 });
  67. let res;
  68. // if (isSingleStudent) {
  69. // res = await getSingleStuTask();
  70. // } else {
  71. res = await getOneOfStuTask();
  72. // }
  73. // message.success({ content: "获取成功", key: mkey });
  74. if (res.data.libraryId) {
  75. let rawTask = res.data as Task;
  76. rawTask.sliceUrls = rawTask.sliceUrls?.map(
  77. (s) => store.setting.fileServer + s
  78. );
  79. rawTask.sheetUrls = rawTask.sheetUrls?.map(
  80. (s) => store.setting.fileServer + s
  81. );
  82. rawTask.jsonUrl = store.setting.fileServer + rawTask.jsonUrl;
  83. store.currentTask = res.data;
  84. // if (store.currentTask)
  85. // store.setting.subject = store.currentTask
  86. // .subject as MarkStore["setting"]["subject"];
  87. } else {
  88. store.message = res.data.message;
  89. }
  90. }
  91. const shouldReloadHistory = ref(0);
  92. async function reloadAndfetchTask() {
  93. await updateClearTask();
  94. await updateSetting();
  95. await fetchTask();
  96. }
  97. async function fetchTask() {
  98. !isSingleStudent && (await updateStatus());
  99. await updateTask();
  100. }
  101. onMounted(async () => {
  102. // await updateClearTask();
  103. // fetchTask(); // mark-header 会调用 (watchEffect)
  104. });
  105. async function getSingleStuTask() {
  106. // return getSingleInspectedTask(libraryId);
  107. }
  108. async function getOneOfStuTask() {
  109. return getOneOfInspectedTask(subjectCode, groupNumber);
  110. }
  111. const realLibraryId = computed(
  112. () => (isSingleStudent ? libraryId : store.currentTask?.libraryId) as string
  113. );
  114. const saveTaskToServer = async () => {
  115. console.log("save inspect task to server");
  116. const mkey = "save_task_key";
  117. message.loading({ content: "保存评卷任务...", key: mkey });
  118. const res = (await saveInspectedTask(realLibraryId.value)) as any;
  119. if (res.data.success && store.currentTask) {
  120. message.success({ content: "复核成功", key: mkey, duration: 2 });
  121. if (!store.historyOpen) {
  122. store.currentTask = undefined;
  123. if (!isSingleStudent) fetchTask();
  124. } else {
  125. shouldReloadHistory.value = Date.now();
  126. }
  127. } else if (res.data.message) {
  128. console.log(res.data.message);
  129. message.error({ content: res.data.message, key: mkey, duration: 10 });
  130. } else if (!store.currentTask) {
  131. message.warn({ content: "暂无新任务", key: mkey, duration: 10 });
  132. }
  133. };
  134. const rejectQuestions = async (questions: Array<Question>) => {
  135. if (!store.currentTask) return;
  136. const mkey = "reject_task_key";
  137. message.loading({ content: "打回评卷任务...", key: mkey });
  138. const res = (await rejectInspectedTask(
  139. //realLibraryId.value,
  140. store.currentTask.libraryId + "",
  141. questions
  142. )) as any;
  143. if (res.data.success) {
  144. store.currentTask = undefined;
  145. message.success({ content: "打回成功", key: mkey, duration: 2 });
  146. if (!store.historyOpen) {
  147. store.currentTask = undefined;
  148. if (!isSingleStudent) fetchTask();
  149. } else {
  150. shouldReloadHistory.value = Date.now();
  151. }
  152. } else if (res.data.message) {
  153. console.log(res.data.message);
  154. message.error({ content: res.data.message, key: mkey, duration: 10 });
  155. } else if (!store.currentTask) {
  156. message.warn({ content: "暂无新任务", key: mkey, duration: 10 });
  157. }
  158. };
  159. const renderError = () => {
  160. store.currentTask = undefined;
  161. store.message = "加载失败,请重新加载。";
  162. };
  163. </script>
  164. <style scoped>
  165. .my-container {
  166. width: 100%;
  167. }
  168. </style>