MarkHistory.vue 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. <template>
  2. <div :class="['mark-history', { hide: !store.historyOpen }]">
  3. <div class="mark-history-title">
  4. {{ title }}
  5. </div>
  6. <div
  7. v-if="showSearch && store.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 store.historyTasks"
  45. :key="index"
  46. :class="['body-row', { 'is-active': store.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. v-model:current="currentPage"
  65. simple
  66. :total="total"
  67. @change="pageChange"
  68. />
  69. </div>
  70. </div>
  71. </template>
  72. <script setup lang="ts">
  73. import type {
  74. GetHistory,
  75. HistoryQueryParams,
  76. MarkHistoryOrderBy,
  77. MarkHistorySortField,
  78. Task,
  79. } from "@/types";
  80. import { watch } from "vue";
  81. import { store } from "@/store/store";
  82. import EventBus from "@/plugins/eventBus";
  83. import { preDrawImageHistory } from "@/utils/utils";
  84. import { message } from "ant-design-vue";
  85. const limitPageSize = 20;
  86. const {
  87. title = "回评",
  88. showSearch = false,
  89. orderTimeField = "marker_time",
  90. subjectCode = undefined,
  91. groupNumber = undefined,
  92. markerId = undefined,
  93. markerScore = undefined,
  94. getHistory,
  95. } = defineProps<{
  96. title?: string;
  97. showSearch?: boolean;
  98. orderTimeField?: "marker_time" | "inspect_time";
  99. subjectCode?: string;
  100. groupNumber?: string;
  101. markerId?: string;
  102. markerScore?: string;
  103. getHistory: GetHistory;
  104. }>();
  105. let searchType = $ref("1");
  106. let secretNumberInput = $ref("");
  107. const format = (val: string, preVal: string) => {
  108. const reg = /^-?\d*(\.\d*)?$/;
  109. if ((!isNaN(+val) && reg.test(val)) || val === "" || val === "-") {
  110. secretNumberInput = val;
  111. } else {
  112. secretNumberInput = preVal;
  113. }
  114. };
  115. watch(
  116. () => secretNumberInput,
  117. (val, preVal) => {
  118. format(val, preVal);
  119. }
  120. );
  121. let loading = $ref(false);
  122. let currentPage = $ref(1);
  123. let total = $ref(0);
  124. let order: MarkHistoryOrderBy = $ref("marker_time");
  125. if (orderTimeField) {
  126. order = orderTimeField;
  127. }
  128. let sort: MarkHistorySortField = $ref("DESC");
  129. const currentTaskChange = async () => {
  130. if (store.historyOpen) {
  131. // replaceCurrentTask(undefined);
  132. store.globalMask = true;
  133. try {
  134. await updateHistoryTask({
  135. secretNumber: secretNumberInput,
  136. order: order,
  137. sort: sort,
  138. pageNumber: currentPage,
  139. });
  140. } catch (e) {
  141. // 恢复以前的行为,取回评失败则评卷任务为空
  142. await replaceCurrentTask(undefined);
  143. } finally {
  144. store.globalMask = false;
  145. }
  146. await replaceCurrentTask(store.historyTasks[0]);
  147. } else {
  148. await replaceCurrentTask(store.tasks[0]);
  149. store.historyTasks.splice(0);
  150. secretNumberInput = "";
  151. currentPage = 1;
  152. order = "marker_time";
  153. sort = "DESC";
  154. }
  155. };
  156. watch(() => store.historyOpen, currentTaskChange);
  157. watch([$$(order), $$(sort), $$(currentPage)], currentTaskChange);
  158. EventBus.on("should-reload-history", () => {
  159. // await updateHistoryTask({
  160. // secretNumber: secretNumberInput,
  161. // order: order,
  162. // sort: sort,
  163. // pageNumber: currentPage,
  164. // });
  165. // // 提交后,渲染第一条
  166. // replaceCurrentTask(store.historyTasks[0]);
  167. // TODO: 因为 mitt 不支持 å https://github.com/developit/mitt/issues/122
  168. (async () => {
  169. store.globalMask = true;
  170. try {
  171. const res = await getHistory({
  172. secretNumber: store.currentTask?.secretNumber,
  173. order,
  174. sort,
  175. pageNumber: currentPage,
  176. subjectCode,
  177. groupNumber,
  178. markerId,
  179. markerScore,
  180. pageSize: limitPageSize,
  181. });
  182. if (res?.data) {
  183. const data = res.data.records;
  184. total = res.data.total;
  185. if (store.currentTask) {
  186. // 这种方式(对象被重新构造了)能查找到index,我也很惊讶
  187. const indexOfTasks = store.historyTasks.indexOf(store.currentTask);
  188. if (data[0]) {
  189. // 如果原任务依然存在
  190. store.historyTasks.splice(indexOfTasks, 1, data[0]);
  191. await replaceCurrentTask(store.historyTasks[indexOfTasks]);
  192. } else {
  193. // 问题卷会查找不到,这里直接删除此任务
  194. store.historyTasks.splice(indexOfTasks, 1);
  195. await replaceCurrentTask(store.historyTasks[indexOfTasks]);
  196. }
  197. } else {
  198. // 问题卷会将清除它作为 currentTask ,然后刷新当前页
  199. store.historyTasks = data;
  200. await replaceCurrentTask(store.historyTasks[0]);
  201. }
  202. }
  203. } finally {
  204. store.globalMask = false;
  205. }
  206. })().catch((e) => console.log("reload-history error", e));
  207. });
  208. async function updateHistoryTask({
  209. pageNumber = 1,
  210. order = "marker_time",
  211. sort = "DESC",
  212. secretNumber = null,
  213. }: HistoryQueryParams) {
  214. loading = true;
  215. let params = {
  216. pageNumber,
  217. pageSize: limitPageSize,
  218. order,
  219. sort,
  220. subjectCode,
  221. groupNumber,
  222. markerId,
  223. markerScore,
  224. };
  225. let key = searchType == "1" ? "secretNumber" : "markerScore";
  226. params[key] = secretNumber || undefined;
  227. const res = await getHistory(params);
  228. loading = false;
  229. if (res?.data) {
  230. store.historyTasks = res.data.records;
  231. total = res.data.total;
  232. replaceCurrentTask(store.historyTasks[0]).catch((err) => {
  233. console.log(err);
  234. void message.error("切换至回评任务失败");
  235. });
  236. }
  237. }
  238. async function replaceCurrentTask(task: Task | undefined) {
  239. // console.log("replaceCurrentTask:", task);
  240. if (store.isScanImage && !!task) {
  241. await preDrawImageHistory(task);
  242. }
  243. store.currentTask = task;
  244. }
  245. function pageChange(page) {
  246. currentPage = page;
  247. }
  248. async function searchHistoryTask() {
  249. if (currentPage !== 1) {
  250. currentPage = 1;
  251. } else {
  252. await currentTaskChange();
  253. }
  254. }
  255. </script>