LibraryInspect.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  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 {
  44. subjectCode,
  45. groupNumber,
  46. libraryId,
  47. markerId,
  48. examNumber,
  49. secretNumber,
  50. startScore,
  51. endScore,
  52. questionScore,
  53. unselective,
  54. } = route.query as {
  55. subjectCode: string;
  56. groupNumber: string;
  57. libraryId: string; // TODO: for未来单一任务
  58. markerId: string;
  59. examNumber: string;
  60. secretNumber: string;
  61. startScore: string;
  62. endScore: string;
  63. questionScore: string;
  64. unselective: string;
  65. };
  66. async function updateClearTask() {
  67. await clearInspectedTaskOfLibraryInspect(subjectCode, groupNumber);
  68. }
  69. async function updateSetting() {
  70. const settingRes = await getAdminPageSetting(subjectCode);
  71. const { examType, fileServer, subject, userName, splitConfig } =
  72. settingRes.data;
  73. store.initSetting({
  74. examType,
  75. fileServer,
  76. subject,
  77. userName,
  78. splitConfig,
  79. });
  80. if (store.setting.subject?.paperUrl && store.isMultiMedia) {
  81. await getPaper(store);
  82. }
  83. }
  84. async function updateStatus() {
  85. const res = await getInspectedTaskStatusOfLibraryInspect({
  86. subjectCode,
  87. groupNumber,
  88. markerId,
  89. examNumber,
  90. secretNumber,
  91. startScore,
  92. endScore,
  93. questionScore,
  94. unselective,
  95. });
  96. if (res.data.valid) Object.assign(store.status, res.data);
  97. }
  98. async function updateTask() {
  99. const mkey = "fetch_task_key";
  100. void message.info({ content: "获取任务中...", duration: 1.5, key: mkey });
  101. let res = await getOneOfStuTask();
  102. void message.success({
  103. content: res.data.studentId ? "获取成功" : "无任务",
  104. key: mkey,
  105. });
  106. if (res.data.studentId) {
  107. let rawTask = res.data;
  108. store.currentTask = addFileServerPrefixToTask(rawTask);
  109. } else {
  110. store.message = res.data.message;
  111. }
  112. }
  113. watch(
  114. () => store.historyOpen,
  115. async () => {
  116. if (!store.historyOpen) {
  117. await updateClearTask();
  118. await fetchTask();
  119. }
  120. }
  121. );
  122. async function fetchTask() {
  123. !isSingleStudent && (await updateStatus());
  124. await updateTask();
  125. }
  126. onMounted(async () => {
  127. await updateClearTask();
  128. await updateSetting();
  129. await fetchTask();
  130. });
  131. async function getOneOfStuTask() {
  132. return getOneOfInspectedTaskOfLibraryInspect({
  133. subjectCode,
  134. groupNumber,
  135. markerId,
  136. examNumber,
  137. secretNumber,
  138. startScore,
  139. endScore,
  140. questionScore,
  141. unselective,
  142. });
  143. }
  144. const realLibraryId = $computed(
  145. () => (isSingleStudent ? libraryId : store.currentTask?.libraryId) as string
  146. );
  147. const saveTaskToServer = async () => {
  148. console.log("save inspect task to server");
  149. const mkey = "save_task_key";
  150. void message.loading({ content: "保存评卷任务...", key: mkey });
  151. const res = await saveInspectedTaskOfLibraryInspect(realLibraryId);
  152. if (res.data.success && store.currentTask) {
  153. void message.success({ content: "复核成功", key: mkey, duration: 2 });
  154. if (!store.historyOpen) {
  155. store.currentTask = undefined;
  156. if (!isSingleStudent) await fetchTask();
  157. } else {
  158. EventBus.emit("should-reload-history");
  159. }
  160. } else if (res.data.message) {
  161. console.log(res.data.message);
  162. void message.error({ content: res.data.message, key: mkey, duration: 10 });
  163. } else if (!store.currentTask) {
  164. void message.warn({ content: "暂无新任务", key: mkey, duration: 10 });
  165. }
  166. };
  167. const rejectQuestions = async (questions: Array<Question>) => {
  168. if (!store.currentTask) return;
  169. const mkey = "reject_task_key";
  170. void message.loading({ content: "打回评卷任务...", key: mkey });
  171. const res = await rejectInspectedTaskOfLibraryInspect(
  172. store.currentTask.libraryId + "",
  173. questions
  174. );
  175. if (res.data.success) {
  176. store.currentTask = undefined;
  177. void message.success({ content: "打回成功", key: mkey, duration: 2 });
  178. if (!store.historyOpen) {
  179. store.currentTask = undefined;
  180. if (!isSingleStudent) await fetchTask();
  181. } else {
  182. EventBus.emit("should-reload-history");
  183. }
  184. } else if (res.data.message) {
  185. console.log(res.data.message);
  186. void message.error({ content: res.data.message, key: mkey, duration: 10 });
  187. } else if (!store.currentTask) {
  188. void message.warn({ content: "暂无新任务", key: mkey, duration: 10 });
  189. }
  190. };
  191. const renderError = () => {
  192. store.currentTask = undefined;
  193. store.message = "加载失败,请重新加载。";
  194. };
  195. </script>
  196. <style scoped>
  197. .my-container {
  198. width: 100%;
  199. overflow: clip;
  200. }
  201. </style>