LibraryInspect.vue 5.3 KB

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