LibraryInspect.vue 5.9 KB

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