Inspect.vue 6.0 KB

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