Browse Source

仲裁回评根据评卷端回评更新

Michael Wang 4 năm trước cách đây
mục cha
commit
a70d3d543a

+ 5 - 5
src/api/arbitratePage.ts

@@ -1,5 +1,5 @@
 import { httpApp } from "@/plugins/axiosApp";
-import { Question } from "@/types";
+import { MarkHistoryOrderBy, MarkHistorySortField, Question } from "@/types";
 
 /** 清理仲裁任务(libraryId 与其他参数互斥填写) */
 export async function clearArbitrateTask(
@@ -77,9 +77,9 @@ export async function getArbitrateHistory({
   groupNumber?: string;
   pageNumber?: number; // 从1开始
   pageSize?: number;
-  order?: "markerTime" | "markerScore";
-  sort?: "ASC" | "DESC";
-  secretNumber?: number | null;
+  order?: MarkHistoryOrderBy;
+  sort?: MarkHistorySortField;
+  secretNumber?: string | null;
 }) {
   const form = new FormData();
   form.append("subjectCode", subjectCode);
@@ -88,7 +88,7 @@ export async function getArbitrateHistory({
   form.append("pageSize", pageSize + "");
   form.append("order", order);
   form.append("sort", sort);
-  secretNumber && form.append("secretNumber", secretNumber + "");
+  secretNumber && form.append("secretNumber", secretNumber);
   return httpApp.post("/admin/exam/arbitrate/getHistory", form);
 }
 

+ 3 - 3
src/features/arbitrate/Arbitrate.vue

@@ -158,9 +158,9 @@ export default defineComponent({
     });
 
     onMounted(async () => {
-      // await updateClearTask();
-      // await updateSetting();
-      // await fetchTask(); // mark-header 会调用 (watchEffect)
+      await updateClearTask();
+      await updateSetting();
+      await fetchTask(); // mark-header 会调用 (watchEffect)
     });
 
     watch(

+ 130 - 24
src/features/arbitrate/MarkHistory.vue

@@ -16,6 +16,7 @@
     <div class="tw-mt-1 tw-mb-1 tw-flex">
       <input
         v-model="secretNumberInput"
+        @keydown.stop="() => {}"
         type="text"
         placeholder="查找试卷"
         class="
@@ -25,18 +26,46 @@
           tw-border-solid
           tw-border-gray-400
           tw-border-2
+          tw-pl-1
+          tw-pr-8
         "
-        @keyup.enter="updateHistoryTask({ secretNumber: secretNumberInput })"
+        @keyup.enter="searchHistoryTask"
       />
       <SearchOutlined
         style="margin-left: -30px; font-size: 24px; padding: 3px"
-        @click="updateHistoryTask({ secretNumber: secretNumberInput })"
+        @click="searchHistoryTask"
       />
     </div>
     <div class="tw-flex tw-justify-between">
-      <div>编号</div>
-      <div>时间</div>
-      <div>分数</div>
+      <div class="tw-cursor-pointer tw-flex">编号</div>
+      <div
+        @click="toggleOrderBy('markerTime')"
+        class="tw-cursor-pointer tw-flex"
+      >
+        时间
+        <CaretUpOutlined
+          style="font-size: 20px"
+          v-if="order === 'markerTime' && sort === 'ASC'"
+        />
+        <CaretDownOutlined
+          style="font-size: 20px"
+          v-if="order === 'markerTime' && sort === 'DESC'"
+        />
+      </div>
+      <div
+        @click="toggleOrderBy('markerScore')"
+        class="tw-cursor-pointer tw-flex"
+      >
+        分数
+        <CaretUpOutlined
+          style="font-size: 20px"
+          v-if="order === 'markerScore' && sort === 'ASC'"
+        />
+        <CaretDownOutlined
+          style="font-size: 20px"
+          v-if="order === 'markerScore' && sort === 'DESC'"
+        />
+      </div>
     </div>
     <a-spin :spinning="loading" size="large" tip="Loading...">
       <div v-for="(task, index) of store.historyTasks" :key="index">
@@ -71,17 +100,27 @@
 </template>
 
 <script lang="ts">
-import { Task } from "@/types";
+import { MarkHistoryOrderBy, MarkHistorySortField, Task } from "@/types";
 import { defineComponent, ref, watch, watchEffect } from "vue";
 import { useRoute } from "vue-router";
 import { store } from "@/features/mark/store";
-import { CloseOutlined, SearchOutlined } from "@ant-design/icons-vue";
+import {
+  CloseOutlined,
+  SearchOutlined,
+  CaretDownOutlined,
+  CaretUpOutlined,
+} from "@ant-design/icons-vue";
 import { cloneDeep } from "lodash";
 import { getArbitrateHistory } from "@/api/arbitratePage";
 
 export default defineComponent({
   name: "MarkHistory",
-  components: { CloseOutlined, SearchOutlined },
+  components: {
+    CloseOutlined,
+    SearchOutlined,
+    CaretDownOutlined,
+    CaretUpOutlined,
+  },
   props: {
     shouldReload: { type: Number, required: true },
   },
@@ -93,29 +132,77 @@ export default defineComponent({
       groupNumber: string;
     };
 
-    watchEffect(async () => {
+    const secretNumberInput = ref("");
+    const loading = ref(false);
+    const currentPage = ref(1);
+    const order = ref("markerTime" as MarkHistoryOrderBy);
+    const sort = ref("DESC" as MarkHistorySortField);
+
+    const currentTaskChange = async () => {
       if (store.historyOpen) {
         replaceCurrentTask(undefined);
-        await updateHistoryTask({});
+        await updateHistoryTask({
+          secretNumber: secretNumberInput.value,
+          order: order.value,
+          sort: sort.value,
+          pageNumber: currentPage.value,
+        });
         replaceCurrentTask(store.historyTasks[0]);
       } else {
-        emit("reload");
+        replaceCurrentTask(store.tasks[0]);
+        store.historyTasks.splice(0);
+        secretNumberInput.value = "";
+        currentPage.value = 1;
+        order.value = "markerTime";
+        sort.value = "DESC";
       }
-    });
+    };
+    watch(() => store.historyOpen, currentTaskChange);
+    watch([order, sort, currentPage], currentTaskChange);
 
     watch(
       () => props.shouldReload,
       async () => {
-        await updateHistoryTask({ pageNumber: currentPage.value });
-        // 提交后,渲染第一条
-        replaceCurrentTask(store.historyTasks[0]);
+        store.globalMask = true;
+        try {
+          const res = await getArbitrateHistory({
+            subjectCode: subjectCode,
+            groupNumber: groupNumber,
+            secretNumber: store.currentTask?.secretNumber,
+          });
+          if (res.data) {
+            let data = cloneDeep(res.data) as Array<Task>;
+            data = data.map((t) => {
+              t.sliceUrls = t.sliceUrls.map(
+                (s) => store.setting.fileServer + s
+              );
+              t.sheetUrls = t.sheetUrls?.map(
+                (s) => store.setting.fileServer + s
+              );
+              t.jsonUrl = store.setting.fileServer + t.jsonUrl;
+
+              return t;
+            });
+            if (store.currentTask) {
+              const indexOfTasks = store.historyTasks.indexOf(
+                store.currentTask
+              );
+              if (data[0]) {
+                store.historyTasks.splice(indexOfTasks, 1, data[0]);
+                replaceCurrentTask(store.historyTasks[indexOfTasks]);
+              } else {
+                // 可能会查找不到,这里直接删除此任务
+                store.historyTasks.splice(indexOfTasks, 1);
+                replaceCurrentTask(store.historyTasks[indexOfTasks]);
+              }
+            }
+          }
+        } finally {
+          store.globalMask = false;
+        }
       }
     );
 
-    const secretNumberInput = ref(null);
-    const loading = ref(false);
-    const currentPage = ref(1);
-
     async function updateHistoryTask({
       pageNumber = 1,
       pageSize = 10,
@@ -125,9 +212,9 @@ export default defineComponent({
     }: {
       pageNumber?: number; // 从1开始
       pageSize?: number;
-      order?: string;
-      sort?: string;
-      secretNumber?: number | null;
+      order?: MarkHistoryOrderBy;
+      sort?: MarkHistorySortField;
+      secretNumber?: string | null;
     }) {
       loading.value = true;
       const res = await getArbitrateHistory({
@@ -136,6 +223,8 @@ export default defineComponent({
         subjectCode,
         groupNumber,
         secretNumber,
+        order,
+        sort,
       });
       loading.value = false;
       if (res.data) {
@@ -159,16 +248,29 @@ export default defineComponent({
     function previousPage() {
       if (currentPage.value > 1) {
         currentPage.value -= 1;
-        updateHistoryTask({ pageNumber: currentPage.value });
       }
     }
     function nextPage() {
       if (store.historyTasks.length >= 10) {
         currentPage.value += 1;
-        updateHistoryTask({ pageNumber: currentPage.value });
       }
     }
 
+    function toggleOrderBy(toOrder: MarkHistoryOrderBy) {
+      if (toOrder === order.value) {
+        sort.value = sort.value === "DESC" ? "ASC" : "DESC";
+      } else {
+        order.value = toOrder;
+      }
+    }
+
+    function searchHistoryTask() {
+      if (currentPage.value !== 1) {
+        currentPage.value = 1;
+      } else {
+        currentTaskChange();
+      }
+    }
     return {
       store,
       loading,
@@ -178,6 +280,10 @@ export default defineComponent({
       currentPage,
       previousPage,
       nextPage,
+      sort,
+      order,
+      toggleOrderBy,
+      searchHistoryTask,
     };
   },
 });