index.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. <template>
  2. <div class="home audit">
  3. <div class="home-head">
  4. <div>
  5. <a-space v-if="userStore.curExam" :size="6">
  6. <span class="head-no">No.{{ userStore.curExam.id }}</span>
  7. <a-tag class="head-mode" color="blue"
  8. >{{ userStore.curExam.mode }}模式</a-tag
  9. >
  10. <h3 class="head-name">{{ userStore.curExam.name }}</h3>
  11. </a-space>
  12. </div>
  13. <div>
  14. <a-button @click="onSwitchExam">
  15. <template #icon><SwapOutlined /></template>切换考试
  16. </a-button>
  17. </div>
  18. </div>
  19. <div class="home-body">
  20. <template v-if="overviewData">
  21. <div class="audit-box">
  22. <div class="audit-box-head">
  23. <h4>实时审核</h4>
  24. </div>
  25. <div class="audit-box-body">
  26. <div class="audit-card">
  27. <div class="audit-card-icon audit-wait"></div>
  28. <div class="audit-card-content">
  29. <p>待审核</p>
  30. <p>{{ overviewData.verifyTask.todoCount }}</p>
  31. </div>
  32. <div class="audit-card-action" @click="toPage('IntimeAudit')">
  33. 进入 <RightOutlined />
  34. </div>
  35. </div>
  36. </div>
  37. </div>
  38. <div class="audit-box">
  39. <div class="audit-box-head">
  40. <h4>
  41. 复核校验<span style="font-weight: normal">(人工绑定审核)</span>
  42. </h4>
  43. </div>
  44. <div class="audit-box-body">
  45. <div class="audit-card">
  46. <div class="audit-card-icon audit-wait"></div>
  47. <div class="audit-card-content">
  48. <p>待审核</p>
  49. <p>{{ overviewData.assignedCheck.todoCount }}</p>
  50. </div>
  51. <div class="audit-card-action" @click="toPage('ReviewAudit')">
  52. 进入 <RightOutlined />
  53. </div>
  54. </div>
  55. </div>
  56. </div>
  57. <div class="audit-box img-check">
  58. <div class="audit-box-head">
  59. <h4>图片抽查</h4>
  60. </div>
  61. <div class="audit-box-body">
  62. <div class="audit-card">
  63. <div class="audit-card-icon audit-done"></div>
  64. <div class="audit-card-content">
  65. <p>已审核</p>
  66. <p>{{ overviewData.imageCheckTask.finishCount }}</p>
  67. </div>
  68. </div>
  69. <div class="audit-card">
  70. <div class="audit-card-icon audit-wait"></div>
  71. <div class="audit-card-content">
  72. <p>待审核</p>
  73. <p>{{ overviewData.imageCheckTask.todoCount }}</p>
  74. </div>
  75. <div class="audit-card-action" @click="toPage('ImageCheckAudit')">
  76. 进入 <RightOutlined />
  77. </div>
  78. </div>
  79. </div>
  80. <div class="audit-box-foot">
  81. <a-tag :bordered="false">
  82. <template #icon><PieChartFilled /></template>抽查比例:{{
  83. overviewData.imageCheckTask.checkRatio * 100
  84. }}%
  85. </a-tag>
  86. <a-space :size="8">
  87. <span>轮播时间配置:</span>
  88. <a-input-number
  89. v-model:value="imageCheckLoopTime"
  90. :min="0"
  91. :max="999"
  92. :controls="false"
  93. ></a-input-number>
  94. <span>秒/张</span>
  95. <a-button type="primary" @click="onSetLoopTime">设置</a-button>
  96. </a-space>
  97. </div>
  98. </div>
  99. </template>
  100. </div>
  101. </div>
  102. <!-- SelectExamDialog -->
  103. <SelectExamDialog ref="selectExamDialogRef" />
  104. </template>
  105. <script setup lang="ts">
  106. import { ref, watch, onMounted } from "vue";
  107. import {
  108. SwapOutlined,
  109. RightOutlined,
  110. PieChartFilled,
  111. } from "@ant-design/icons-vue";
  112. import { message } from "ant-design-vue";
  113. import { examOverview } from "@/ap/audit";
  114. import { ExamOverviewResult } from "@/ap/types/audit";
  115. import { useRouter } from "vue-router";
  116. import { useUserStore } from "@/store";
  117. import SelectExamDialog from "./SelectExamDialog.vue";
  118. defineOptions({
  119. name: "Audit",
  120. });
  121. const router = useRouter();
  122. const userStore = useUserStore();
  123. const overviewData = ref<ExamOverviewResult | null>(null);
  124. async function getOverviewData() {
  125. if (!userStore.curExam) return;
  126. const res = await examOverview({ examId: userStore.curExam.id });
  127. overviewData.value = res || null;
  128. }
  129. function toPage(name: string) {
  130. router.push({ name });
  131. }
  132. const selectExamDialogRef = ref();
  133. function onSwitchExam() {
  134. selectExamDialogRef.value?.open();
  135. }
  136. const imageCheckLoopTime = ref(userStore.imageCheckLoopTime || 1);
  137. if (!userStore.imageCheckLoopTime) {
  138. userStore.setImageCheckLoopTime(1);
  139. }
  140. function onSetLoopTime() {
  141. if (!imageCheckLoopTime.value) {
  142. message.error("请输入轮播时间");
  143. return;
  144. }
  145. userStore.setImageCheckLoopTime(imageCheckLoopTime.value);
  146. message.success("设置成功!");
  147. }
  148. watch(
  149. () => userStore.curExam,
  150. (val) => {
  151. if (!val) return;
  152. getOverviewData();
  153. },
  154. { immediate: true }
  155. );
  156. </script>