Inspect.vue 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  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. :getHistory="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 { onMounted, watch } from "vue";
  18. import {
  19. clearInspectedTask,
  20. getInspectedSetting,
  21. getInspectedTaskStatus,
  22. getOneOfInspectedTask,
  23. getSingleInspectedTask,
  24. rejectInspectedTask,
  25. saveInspectedTask,
  26. } from "@/api/inspectPage";
  27. import { store } from "@/store/store";
  28. import MarkHeader from "./MarkHeader.vue";
  29. import { useRoute } from "vue-router";
  30. import MarkBody from "./MarkBody.vue";
  31. import MarkHistory from "@/features/mark/MarkHistory.vue";
  32. import MarkBoardInspect from "./MarkBoardInspect.vue";
  33. import type { Question } from "@/types";
  34. import { message } from "ant-design-vue";
  35. import { getPaper } from "@/api/jsonMark";
  36. import { getInspectedHistory } from "@/api/inspectPage";
  37. import EventBus from "@/plugins/eventBus";
  38. import { addFileServerPrefixToTask } from "@/utils/utils";
  39. const route = useRoute();
  40. let isSingleStudent = !!route.query.studentId;
  41. const {
  42. studentId,
  43. subjectCode,
  44. startScore,
  45. endScore,
  46. mainNumber,
  47. mainStartScore,
  48. mainEndScore,
  49. questionScore,
  50. selectiveStatus,
  51. } = route.query as {
  52. studentId: string;
  53. subjectCode: string;
  54. startScore: string;
  55. endScore: string;
  56. mainNumber: string;
  57. mainStartScore: string;
  58. mainEndScore: string;
  59. questionScore: string;
  60. selectiveStatus: string;
  61. };
  62. async function updateClearTask() {
  63. await clearInspectedTask(studentId, subjectCode);
  64. }
  65. async function updateSetting() {
  66. const settingRes = await getInspectedSetting(subjectCode);
  67. const { examType, fileServer, subject, userName, splitConfig } =
  68. settingRes.data;
  69. store.initSetting({
  70. examType,
  71. fileServer,
  72. subject,
  73. userName,
  74. splitConfig,
  75. });
  76. if (store.setting.subject?.paperUrl && store.isMultiMedia) {
  77. await getPaper(store);
  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. selectiveStatus,
  90. });
  91. if (res.data.valid) Object.assign(store.status, res.data);
  92. }
  93. async function updateTask() {
  94. const mkey = "fetch_task_key";
  95. void message.info({ content: "获取任务中...", duration: 1.5, key: mkey });
  96. let res;
  97. if (isSingleStudent) {
  98. res = await getSingleStuTask();
  99. } else {
  100. res = await getOneOfStuTask();
  101. }
  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. if (res.data.subject) store.setting.subject = res.data.subject;
  110. } else {
  111. store.message = res.data.message;
  112. }
  113. }
  114. watch(
  115. () => store.historyOpen,
  116. async () => {
  117. if (!store.historyOpen) {
  118. await updateClearTask();
  119. await updateSetting();
  120. await fetchTask();
  121. }
  122. }
  123. );
  124. async function fetchTask() {
  125. !isSingleStudent && (await updateStatus());
  126. await updateTask();
  127. }
  128. onMounted(async () => {
  129. await updateClearTask();
  130. await updateSetting();
  131. await fetchTask();
  132. });
  133. async function getSingleStuTask() {
  134. return getSingleInspectedTask(studentId);
  135. }
  136. async function getOneOfStuTask() {
  137. return getOneOfInspectedTask({
  138. subjectCode,
  139. mainNumber,
  140. startScore,
  141. endScore,
  142. mainStartScore,
  143. mainEndScore,
  144. questionScore,
  145. selectiveStatus,
  146. });
  147. }
  148. let realStudentId = $computed(
  149. () => (isSingleStudent ? studentId : store.currentTask?.studentId) as string
  150. );
  151. const saveTaskToServer = async () => {
  152. console.log("save inspect task to server");
  153. const mkey = "save_task_key";
  154. void message.loading({ content: "保存评卷任务...", key: mkey });
  155. const res = await saveInspectedTask(realStudentId);
  156. if (res.data.success && store.currentTask) {
  157. void message.success({ content: "复核成功", key: mkey, duration: 2 });
  158. if (!store.historyOpen) {
  159. store.currentTask = undefined;
  160. if (!isSingleStudent) await fetchTask();
  161. } else {
  162. EventBus.emit("should-reload-history");
  163. }
  164. } else if (res.data.message) {
  165. console.log(res.data.message);
  166. void message.error({ content: res.data.message, key: mkey, duration: 10 });
  167. } else if (!store.currentTask) {
  168. void message.warn({ content: "暂无新任务", key: mkey, duration: 10 });
  169. }
  170. };
  171. const rejectQuestions = async (questions: Array<Question>) => {
  172. const mkey = "reject_task_key";
  173. void message.loading({ content: "打回评卷任务...", key: mkey });
  174. const res = await rejectInspectedTask(realStudentId, questions);
  175. if (res.data.success && store.currentTask) {
  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>