ImportInspect.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. <template>
  2. <div class="my-container">
  3. <mark-header />
  4. <div class="tw-flex tw-gap-1">
  5. <mark-body usingImage="sheetUrls" @error="renderError" />
  6. <MarkBoardInspect
  7. :tagged="isCurrentTagged"
  8. :isFirst="isFirst"
  9. :isLast="isLast"
  10. @makeTag="saveTaskToServer"
  11. @fetchTask="fetchTask"
  12. />
  13. </div>
  14. </div>
  15. <MinimapModal />
  16. </template>
  17. <script setup lang="ts">
  18. import { onMounted } from "vue";
  19. import {
  20. getInspectedSettingOfImportInspect,
  21. getSingleInspectedTaskOfImportInspect,
  22. saveInspectedTaskOfImportInspect,
  23. } from "@/api/importInspectPage";
  24. import { store } from "@/store/store";
  25. import MarkHeader from "./MarkHeader.vue";
  26. import MinimapModal from "@/features/mark/MinimapModal.vue";
  27. import { useRoute } from "vue-router";
  28. import MarkBody from "../studentInspect/MarkBody.vue";
  29. import MarkBoardInspect from "./MarkBoardInspect.vue";
  30. import type { AdminPageSetting } from "@/types";
  31. import { message } from "ant-design-vue";
  32. import { addFileServerPrefixToTask } from "@/utils/utils";
  33. const route = useRoute();
  34. const { studentId } = route.query as {
  35. studentId: string;
  36. };
  37. let studentIds: number[] = $ref([]);
  38. let tagIds: number[] = $ref([]);
  39. let currentStudentId = $ref(0);
  40. async function updateSetting() {
  41. const settingRes = await getInspectedSettingOfImportInspect(studentId);
  42. const { examType, fileServer } = settingRes.data;
  43. store.initSetting({ examType, fileServer } as AdminPageSetting);
  44. store.status.totalCount = settingRes.data.inspectCount;
  45. store.status.markedCount = 0;
  46. if (!settingRes.data.inspectCount) {
  47. store.message = settingRes.data.message;
  48. } else {
  49. studentIds = settingRes.data.studentIds;
  50. tagIds = settingRes.data.tagIds;
  51. }
  52. }
  53. // 要通过fetchTask调用
  54. async function updateTask() {
  55. if (!currentStudentId) {
  56. return;
  57. }
  58. const mkey = "fetch_task_key";
  59. void message.info({ content: "获取任务中...", duration: 1.5, key: mkey });
  60. let res = await getSingleInspectedTaskOfImportInspect("" + currentStudentId);
  61. void message.success({
  62. content: res.data.studentId ? "获取成功" : "无任务",
  63. key: mkey,
  64. });
  65. if (res.data.studentId) {
  66. let rawTask = res.data;
  67. store.currentTask = addFileServerPrefixToTask(rawTask);
  68. } else {
  69. store.message = res.data.message;
  70. }
  71. }
  72. let isCurrentTagged = $computed(() => tagIds.includes(currentStudentId));
  73. let isFirst = $computed(() => studentIds.indexOf(currentStudentId) === 0);
  74. let isLast = $computed(
  75. () => studentIds.indexOf(currentStudentId) === studentIds.length - 1
  76. );
  77. async function fetchTask(next: boolean, init?: boolean) {
  78. if (init) {
  79. currentStudentId = studentIds[0];
  80. } else if (isLast && next) {
  81. return; // currentStudentId是最后一个不调用
  82. } else if (isFirst && !next) {
  83. return; // currentStudentId是第一个不调用
  84. } else {
  85. currentStudentId =
  86. studentIds[studentIds.indexOf(currentStudentId) + (next ? 1 : -1)];
  87. }
  88. if (!currentStudentId) return; // 无currentStudentId不调用
  89. store.status.markedCount = studentIds.indexOf(currentStudentId) + 1;
  90. await updateTask();
  91. }
  92. onMounted(async () => {
  93. await updateSetting();
  94. await fetchTask(true, true);
  95. });
  96. const saveTaskToServer = async () => {
  97. const mkey = "save_task_key";
  98. void message.loading({ content: "标记评卷任务...", key: mkey });
  99. const res = await saveInspectedTaskOfImportInspect(
  100. currentStudentId + "",
  101. !isCurrentTagged + ""
  102. );
  103. if (res.data.success) {
  104. void message.success({
  105. content: isCurrentTagged ? "取消标记成功" : "标记成功",
  106. key: mkey,
  107. duration: 2,
  108. });
  109. if (isCurrentTagged) {
  110. tagIds.splice(tagIds.indexOf(currentStudentId), 1);
  111. } else {
  112. tagIds.push(currentStudentId);
  113. }
  114. } else {
  115. console.log(res.data.message);
  116. void message.error({ content: res.data.message, key: mkey, duration: 10 });
  117. }
  118. };
  119. const renderError = () => {
  120. store.currentTask = undefined;
  121. store.message = "加载失败,请重新加载。";
  122. };
  123. </script>
  124. <style scoped>
  125. .my-container {
  126. width: 100%;
  127. overflow: clip;
  128. }
  129. </style>