index.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. <template>
  2. <div class="data-check">
  3. <div class="check-menu">
  4. <div class="check-menu-body">
  5. <ul>
  6. <li
  7. v-for="item in studentList"
  8. :key="item.id"
  9. :class="{ 'is-active': dataCheckStore.curStudent?.id === item.id }"
  10. @click="onSelectStudent(item)"
  11. >
  12. {{ item.examNumber }}
  13. </li>
  14. </ul>
  15. </div>
  16. <div class="check-menu-page">
  17. <SimplePagination
  18. :total="total"
  19. :page-size="pageSize"
  20. @change="onChangeListPage"
  21. />
  22. </div>
  23. </div>
  24. <div class="check-body">
  25. <ScanImage
  26. v-if="dataCheckStore.curPage && isOriginImage"
  27. :key="dataCheckStore.curPage.kid"
  28. @prev="onPrevPage"
  29. @next="onNextPage"
  30. />
  31. <SliceImage v-if="dataCheckStore.curPage && !isOriginImage" />
  32. </div>
  33. <CheckAction @search="onSearch" />
  34. </div>
  35. </template>
  36. <script setup lang="ts">
  37. import { ref, reactive, onMounted, computed } from "vue";
  38. import { message } from "ant-design-vue";
  39. import { CaretLeftOutlined, CaretRightOutlined } from "@ant-design/icons-vue";
  40. import { AbsentCheckListFilter } from "@/ap/types/absentCheck";
  41. import { DataCheckListItem } from "@/ap/types/dataCheck";
  42. import { absentCheckList } from "@/ap/absentCheck";
  43. import { StudentPage } from "../DataCheck/types";
  44. import { useDataCheckStore, useUserStore } from "@/store";
  45. import SimplePagination from "@/components/SimplePagination/index.vue";
  46. import ScanImage from "../DataCheck/ScanImage/index.vue";
  47. import SliceImage from "../DataCheck/SliceImage/index.vue";
  48. import CheckAction from "./CheckAction.vue";
  49. defineOptions({
  50. name: "AbsentCheck",
  51. });
  52. const dataCheckStore = useDataCheckStore();
  53. const userStore = useUserStore();
  54. let searchModel = {} as AbsentCheckListFilter;
  55. const pageNumber = ref(1);
  56. const pageSize = ref(20);
  57. const total = ref(0);
  58. const studentList = ref<DataCheckListItem[]>([]);
  59. const dataList = ref<StudentPage[]>([]);
  60. const loading = ref(false);
  61. async function getList() {
  62. loading.value = true;
  63. const datas = {
  64. ...searchModel,
  65. pageNumber: pageNumber.value,
  66. pageSize: pageSize.value,
  67. };
  68. const res = await absentCheckList(datas).catch(() => null);
  69. loading.value = false;
  70. if (!res) return;
  71. total.value = res.totalCount;
  72. studentList.value = res.result;
  73. parseStudentPageList(res.result);
  74. }
  75. function parseStudentPageList(students: DataCheckListItem[]) {
  76. dataList.value = [] as StudentPage[];
  77. students.forEach((student, studentIndex) => {
  78. student.papers.forEach((paper, paperIndex) => {
  79. if (!paper.pages) return;
  80. paper.pages.forEach((page, pageIndex) => {
  81. const row: StudentPage = {
  82. ...page,
  83. paperId: paper.id,
  84. paperIndex,
  85. paperNumber: paper.number,
  86. pageIndex,
  87. studentIndex,
  88. studentId: student.id,
  89. examId: searchModel.examId,
  90. kid: `${student.id}-${studentIndex}-${paperIndex}-${pageIndex}`,
  91. };
  92. dataList.value.push(row);
  93. });
  94. });
  95. });
  96. }
  97. function onSelectStudent(record: DataCheckListItem) {
  98. const pageIndex = dataList.value.findIndex(
  99. (item) => item.studentId === record.id
  100. );
  101. if (pageIndex === -1) return;
  102. selectPage(pageIndex);
  103. }
  104. // imageType
  105. const isOriginImage = computed(() => {
  106. return dataCheckStore.imageType === "ORIGIN";
  107. });
  108. // table
  109. async function onChangeListPage(index: number) {
  110. pageNumber.value = index;
  111. await getList();
  112. selectPage(0);
  113. }
  114. async function onSearch(datas: AbsentCheckListFilter) {
  115. searchModel = { ...datas };
  116. pageNumber.value = 1;
  117. await getList();
  118. selectPage(0);
  119. }
  120. onSearch({ examId: userStore.curExam.id } as AbsentCheckListFilter);
  121. // page
  122. function selectPage(index: number) {
  123. dataCheckStore.setInfo({
  124. curPage: dataList.value[index],
  125. curPageIndex: index,
  126. });
  127. if (!dataCheckStore.curPage) return;
  128. const curStudent = studentList.value[
  129. dataCheckStore.curPage.studentIndex
  130. ] as DataCheckListItem;
  131. dataCheckStore.setInfo({ curStudent });
  132. }
  133. async function onPrevPage() {
  134. if (dataCheckStore.curPageIndex <= 0) {
  135. if (pageNumber.value === 1) {
  136. message.error("没有上一张了");
  137. return;
  138. }
  139. pageNumber.value--;
  140. await getList();
  141. selectPage(dataList.value.length - 1);
  142. return;
  143. }
  144. selectPage(dataCheckStore.curPageIndex - 1);
  145. }
  146. async function onNextPage() {
  147. if (dataCheckStore.curPageIndex >= dataList.value.length - 1) {
  148. if (pageNumber.value >= total.value) {
  149. message.error("没有下一张了");
  150. return;
  151. }
  152. pageNumber.value++;
  153. await getList();
  154. selectPage(0);
  155. return;
  156. }
  157. selectPage(dataCheckStore.curPageIndex + 1);
  158. }
  159. </script>