|
@@ -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,
|
|
|
};
|
|
|
},
|
|
|
});
|