MarkHeader.vue 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. <template>
  2. <div
  3. class="flex gap-4 justify-between items-center bg-blue-100"
  4. style="z-index: 10000; position: relative; font-size: 16px; height: 40px"
  5. >
  6. <div>
  7. <a href="/mark/subject-select">{{ store.setting.subject?.name }}</a>
  8. </div>
  9. <div class="flex">
  10. <div>考生编号:{{ store.currentTask?.studentCode }}</div>
  11. <div v-if="store.currentTask?.objectiveScore">
  12. 考生编号:{{ store.currentTask?.objectiveScore }}
  13. </div>
  14. </div>
  15. <ul class="flex gap-2 mb-0">
  16. <li>已评{{ store.status.markedCount }}</li>
  17. <li v-if="store.setting.topCount">分配{{ store.setting.topCount }}</li>
  18. <li>未评{{ store.status.totalCount - store.status.markedCount }}</li>
  19. <li
  20. :title="`问题卷${store.status.problemCount}\n待仲裁${store.status.arbitrateCount}`"
  21. style="line-height: 20px"
  22. >
  23. <QuestionCircleOutlined :style="{ 'font-size': '20px' }" />
  24. </li>
  25. <li>进度{{ progress }}%</li>
  26. </ul>
  27. <ul class="flex gap-2 mb-0">
  28. <li @click="upScale" title="放大" style="line-height: 20px">
  29. <PlusCircleOutlined
  30. :style="{
  31. 'font-size': '20px',
  32. color: greaterThanOneScale ? 'green' : 'black',
  33. }"
  34. />
  35. </li>
  36. <li @click="downScale" title="缩小" style="line-height: 20px">
  37. <MinusCircleOutlined
  38. :style="{
  39. 'font-size': '20px',
  40. color: lessThanOneScale ? 'green' : 'black',
  41. }"
  42. />
  43. </li>
  44. <li @click="normalScale" title="适应" style="line-height: 20px">
  45. <FullscreenOutlined :style="{ 'font-size': '20px' }" />
  46. </li>
  47. </ul>
  48. <div @click="toggleHistory" style="line-height: 20px" title="回看">
  49. <HistoryOutlined :style="{ 'font-size': '20px' }" />
  50. </div>
  51. <div
  52. class="flex place-items-center"
  53. :title="
  54. '评卷时间段:' +
  55. $filters.datetimeFilter(store.setting.startTime) +
  56. ' ~ ' +
  57. $filters.datetimeFilter(store.setting.startTime)
  58. "
  59. >
  60. <ClockCircleOutlined
  61. :style="{ 'font-size': '20px' }"
  62. style="line-height: 20px"
  63. />
  64. </div>
  65. <div>{{ group?.title }}(切换)</div>
  66. <div class="flex place-items-center">
  67. <UserOutlined
  68. :style="{ 'font-size': '18px' }"
  69. style="line-height: 18px"
  70. />{{ store.setting.marker?.name }}
  71. </div>
  72. <div class="flex place-items-center">
  73. <PoweroffOutlined
  74. :style="{ 'font-size': '18px' }"
  75. style="line-height: 18px"
  76. />退出
  77. </div>
  78. </div>
  79. </template>
  80. <script lang="ts">
  81. import { getHistoryTask } from "@/api/markPage";
  82. import { computed, defineComponent } from "vue";
  83. import { store } from "./store";
  84. import {
  85. PlusCircleOutlined,
  86. MinusCircleOutlined,
  87. FullscreenOutlined,
  88. HistoryOutlined,
  89. UserOutlined,
  90. PoweroffOutlined,
  91. ClockCircleOutlined,
  92. QuestionCircleOutlined,
  93. } from "@ant-design/icons-vue";
  94. export default defineComponent({
  95. name: "MarkHeader",
  96. components: {
  97. PlusCircleOutlined,
  98. MinusCircleOutlined,
  99. FullscreenOutlined,
  100. HistoryOutlined,
  101. UserOutlined,
  102. PoweroffOutlined,
  103. ClockCircleOutlined,
  104. QuestionCircleOutlined,
  105. },
  106. setup() {
  107. const progress = computed(() => {
  108. const { totalCount, markedCount } = store.status;
  109. if (totalCount <= 0) return 0;
  110. let p = markedCount / totalCount;
  111. if (p < 0.01 && markedCount >= 1) p = 0.01;
  112. p = Math.floor(p * 100);
  113. return p;
  114. });
  115. const group = computed(() => {
  116. return store.groups.find((g) => g.number === store.setting.groupNumber);
  117. });
  118. const upScale = () => {
  119. const s = store.setting.uiSetting["answer.paper.scale"];
  120. if (s < 3)
  121. store.setting.uiSetting["answer.paper.scale"] = +(s + 0.2).toFixed(1);
  122. };
  123. const downScale = () => {
  124. const s = store.setting.uiSetting["answer.paper.scale"];
  125. if (s > 0.2)
  126. store.setting.uiSetting["answer.paper.scale"] = +(s - 0.2).toFixed(1);
  127. };
  128. const normalScale = () => {
  129. store.setting.uiSetting["answer.paper.scale"] = 1;
  130. };
  131. const toggleHistory = () => {
  132. store.historyOpen = !store.historyOpen;
  133. };
  134. const greaterThanOneScale = computed(() => {
  135. return store.setting.uiSetting["answer.paper.scale"] > 1;
  136. });
  137. const lessThanOneScale = computed(() => {
  138. return store.setting.uiSetting["answer.paper.scale"] < 1;
  139. });
  140. async function updateHistoryTask({
  141. pageNumber = 1,
  142. pageSize = 10,
  143. order = "markerTime",
  144. sort = "DESC",
  145. secretNumber = null,
  146. }: {
  147. pageNumber: number; // 从1开始
  148. pageSize: number;
  149. order: "markerTime" | "markerScore";
  150. sort: "ASC" | "DESC";
  151. secretNumber: string | null;
  152. }) {
  153. const res = await getHistoryTask({
  154. pageNumber,
  155. pageSize,
  156. order,
  157. sort,
  158. secretNumber,
  159. });
  160. if (res.data) {
  161. store.historyTasks.push(res.data);
  162. }
  163. }
  164. return {
  165. store,
  166. progress,
  167. group,
  168. upScale,
  169. downScale,
  170. normalScale,
  171. greaterThanOneScale,
  172. lessThanOneScale,
  173. updateHistoryTask,
  174. toggleHistory,
  175. };
  176. },
  177. });
  178. </script>