MarkHistory.vue 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. <template>
  2. <div :class="['mark-history', { hide: !markStore.historyOpen }]">
  3. <div class="mark-history-title">
  4. {{ title }}
  5. </div>
  6. <div
  7. v-if="showSearch && markStore.getStatusValueName !== '试评'"
  8. class="mark-history-search"
  9. >
  10. <a-select
  11. ref="select"
  12. v-model:value="searchType"
  13. style="width: 75px; margin-right: 12px; font-size: 12px"
  14. >
  15. <a-select-option value="1">编号</a-select-option>
  16. <a-select-option value="2">分数</a-select-option>
  17. </a-select>
  18. <a-input
  19. v-model:value="secretNumberInput"
  20. style="font-size: 13px"
  21. class="search-value"
  22. placeholder="查找试卷"
  23. allowClear
  24. @keyup.enter="searchHistoryTask"
  25. @keypress.stop=""
  26. @keydown.stop=""
  27. >
  28. </a-input>
  29. <a-button
  30. type="primary"
  31. style="margin-left: 8px"
  32. @click="searchHistoryTask"
  33. >搜索</a-button
  34. >
  35. </div>
  36. <div class="mark-history-table-head">
  37. <div class="head-item">编号</div>
  38. <div class="head-item head-item-time">时间</div>
  39. <div class="head-item">分数</div>
  40. </div>
  41. <div class="mark-history-table-body">
  42. <a-spin :spinning="loading" size="large" tip="Loading..." :delay="500">
  43. <div
  44. v-for="(task, index) of markStore.historyTasks"
  45. :key="index"
  46. :class="['body-row', { 'is-active': markStore.currentTask === task }]"
  47. @click="replaceCurrentTask(task)"
  48. >
  49. <div class="body-col">
  50. {{ task.secretNumber }}
  51. </div>
  52. <div class="body-col">
  53. {{ $filters.datetimeFilter(task.markerTime ?? task.inspectTime) }}
  54. </div>
  55. <div class="body-col">
  56. {{ task.markerScore === -1 ? "未选做" : task.markerScore }}
  57. </div>
  58. </div>
  59. </a-spin>
  60. </div>
  61. <div class="mark-history-table-page">
  62. <div>共{{ total }}项数据</div>
  63. <a-pagination
  64. :current="currentPage"
  65. simple
  66. :total="total"
  67. :pageSize="limitPageSize"
  68. @change="pageChange"
  69. />
  70. </div>
  71. </div>
  72. </template>
  73. <script setup lang="ts">
  74. import type {
  75. GetHistory,
  76. HistoryQueryParams,
  77. MarkHistoryOrderBy,
  78. MarkHistorySortField,
  79. Task,
  80. } from "@/types";
  81. import { watch } from "vue";
  82. import { message } from "ant-design-vue";
  83. import { useMarkStore } from "@/store";
  84. import EventBus from "@/plugins/eventBus";
  85. import useDraw from "./composables/useDraw";
  86. const limitPageSize = 20;
  87. const markStore = useMarkStore();
  88. const { preDrawImageHistory } = useDraw();
  89. const {
  90. title = "回评",
  91. showSearch = false,
  92. orderTimeField = "marker_time",
  93. subjectCode = undefined,
  94. groupNumber = undefined,
  95. markerId = undefined,
  96. markerScore = undefined,
  97. examId = undefined,
  98. getHistory,
  99. } = defineProps<{
  100. title?: string;
  101. showSearch?: boolean;
  102. orderTimeField?: "marker_time" | "inspect_time";
  103. subjectCode?: string;
  104. groupNumber?: string;
  105. markerId?: string;
  106. markerScore?: string;
  107. examId?: string;
  108. getHistory: GetHistory;
  109. }>();
  110. let searchType = $ref("1");
  111. // 密号输入
  112. let secretNumberInput = $ref("");
  113. const format = (val: string, preVal: string) => {
  114. const reg = /^-?\d*(\.\d*)?$/;
  115. if ((!isNaN(+val) && reg.test(val)) || val === "" || val === "-") {
  116. secretNumberInput = val;
  117. } else {
  118. secretNumberInput = preVal;
  119. }
  120. };
  121. watch(
  122. () => secretNumberInput,
  123. (val, preVal) => {
  124. format(val, preVal);
  125. }
  126. );
  127. let loading = $ref(false);
  128. let currentPage = $ref(1);
  129. let total = $ref(0);
  130. let order: MarkHistoryOrderBy = $ref("marker_time");
  131. if (orderTimeField) {
  132. order = orderTimeField;
  133. }
  134. let sort: MarkHistorySortField = $ref("DESC");
  135. const currentTaskChange = async () => {
  136. if (markStore.historyOpen) {
  137. markStore.globalMask = true;
  138. try {
  139. await updateHistoryTask({
  140. secretNumber: secretNumberInput,
  141. order: order,
  142. sort: sort,
  143. pageNumber: currentPage,
  144. });
  145. } catch (e) {
  146. // 恢复以前的行为,取回评失败则评卷任务为空
  147. await replaceCurrentTask(undefined);
  148. } finally {
  149. markStore.globalMask = false;
  150. }
  151. await replaceCurrentTask(markStore.historyTasks[0]);
  152. } else {
  153. await replaceCurrentTask(markStore.tasks[0]);
  154. markStore.historyTasks.splice(0);
  155. secretNumberInput = "";
  156. currentPage = 1;
  157. order = "marker_time";
  158. sort = "DESC";
  159. }
  160. };
  161. watch(() => markStore.historyOpen, currentTaskChange);
  162. watch([$$(order), $$(sort), $$(currentPage)], currentTaskChange);
  163. EventBus.on("should-reload-history", () => {
  164. (async () => {
  165. markStore.globalMask = true;
  166. try {
  167. const res = await getHistory({
  168. secretNumber: markStore.currentTask?.secretNumber,
  169. order,
  170. sort,
  171. pageNumber: 1,
  172. subjectCode,
  173. groupNumber,
  174. markerId,
  175. markerScore,
  176. examId,
  177. pageSize: 10,
  178. });
  179. if (res?.data) {
  180. const data = res.data.records;
  181. if (markStore.currentTask) {
  182. // 这种方式(对象被重新构造了)能查找到index,我也很惊讶
  183. const indexOfTasks = markStore.historyTasks.indexOf(
  184. markStore.currentTask
  185. );
  186. if (data[0]) {
  187. // 如果原任务依然存在
  188. markStore.historyTasks.splice(indexOfTasks, 1, data[0]);
  189. await replaceCurrentTask(markStore.historyTasks[indexOfTasks]);
  190. } else {
  191. // 问题卷会查找不到,这里直接删除此任务
  192. markStore.historyTasks.splice(indexOfTasks, 1);
  193. await replaceCurrentTask(markStore.historyTasks[indexOfTasks]);
  194. }
  195. } else {
  196. // 问题卷会将清除它作为 currentTask ,然后刷新当前页
  197. markStore.historyTasks = data;
  198. await replaceCurrentTask(markStore.historyTasks[0]);
  199. }
  200. }
  201. } finally {
  202. markStore.globalMask = false;
  203. }
  204. })().catch((e) => console.log("reload-history error", e));
  205. });
  206. async function updateHistoryTask({
  207. pageNumber = 1,
  208. order = "marker_time",
  209. sort = "DESC",
  210. secretNumber = null,
  211. }: HistoryQueryParams) {
  212. loading = true;
  213. let params = {
  214. pageNumber,
  215. pageSize: limitPageSize,
  216. order,
  217. sort,
  218. subjectCode,
  219. groupNumber,
  220. markerId,
  221. markerScore,
  222. examId,
  223. };
  224. let key = searchType == "1" ? "secretNumber" : "markerScore";
  225. params[key] = secretNumber || undefined;
  226. const res = await getHistory(params);
  227. loading = false;
  228. if (res?.data) {
  229. markStore.historyTasks = res.data.records;
  230. total = res.data.total;
  231. replaceCurrentTask(markStore.historyTasks[0]).catch((err) => {
  232. console.log(err);
  233. void message.error("切换至回评任务失败");
  234. });
  235. }
  236. }
  237. async function replaceCurrentTask(task: Task | undefined) {
  238. if (markStore.isScanImage && !!task) {
  239. await preDrawImageHistory(task);
  240. }
  241. markStore.currentTask = task;
  242. }
  243. function pageChange(page) {
  244. currentPage = page;
  245. }
  246. async function searchHistoryTask() {
  247. if (currentPage !== 1) {
  248. currentPage = 1;
  249. } else {
  250. await currentTaskChange();
  251. }
  252. }
  253. </script>