|
@@ -0,0 +1,197 @@
|
|
|
+<template>
|
|
|
+ <div class="my-container">
|
|
|
+ <mark-header />
|
|
|
+ <div class="tw-flex tw-gap-1">
|
|
|
+ <mark-history
|
|
|
+ @reload="reloadAndfetchTask"
|
|
|
+ :should-reload="shouldReloadHistory"
|
|
|
+ />
|
|
|
+ <mark-body />
|
|
|
+ <MarkBoardInspect @inspect="saveTaskToServer" @reject="rejectQuestions" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script lang="ts">
|
|
|
+import { computed, defineComponent, onMounted, ref } from "vue";
|
|
|
+import { store } from "./store";
|
|
|
+import MarkHeader from "./MarkHeader.vue";
|
|
|
+import { useRoute } from "vue-router";
|
|
|
+import MarkBody from "./MarkBody.vue";
|
|
|
+import MarkHistory from "./MarkHistory.vue";
|
|
|
+import MarkBoardInspect from "./MarkBoardInspect.vue";
|
|
|
+import { Question } from "@/types";
|
|
|
+import { message } from "ant-design-vue";
|
|
|
+import {
|
|
|
+ clearInspectedTask,
|
|
|
+ getInspectedSetting,
|
|
|
+ getInspectedTaskStatus,
|
|
|
+ getOneOfInspectedTask,
|
|
|
+ rejectInspectedTask,
|
|
|
+ saveInspectedTask,
|
|
|
+} from "@/api/libraryInspectPage";
|
|
|
+
|
|
|
+export default defineComponent({
|
|
|
+ name: "LibraryInspect",
|
|
|
+ components: {
|
|
|
+ MarkHeader,
|
|
|
+ MarkBody,
|
|
|
+ MarkHistory,
|
|
|
+ MarkBoardInspect,
|
|
|
+ },
|
|
|
+ setup: () => {
|
|
|
+ const route = useRoute();
|
|
|
+ let isSingleStudent = !!route.query.libraryId;
|
|
|
+ const { subjectCode, groupNumber, libraryId } = route.query as {
|
|
|
+ subjectCode: string;
|
|
|
+ groupNumber: string;
|
|
|
+ libraryId: string; // TODO: 未来单一任务
|
|
|
+ };
|
|
|
+
|
|
|
+ async function updateClearTask() {
|
|
|
+ await clearInspectedTask(subjectCode, groupNumber);
|
|
|
+ }
|
|
|
+
|
|
|
+ async function updateSetting() {
|
|
|
+ const settingRes = await getInspectedSetting();
|
|
|
+ store.setting.fileServer = settingRes.data.fileServer;
|
|
|
+ store.setting.userName = settingRes.data.userName;
|
|
|
+ store.setting.uiSetting = {
|
|
|
+ "answer.paper.scale": 1,
|
|
|
+ "score.board.collapse": false,
|
|
|
+ };
|
|
|
+ }
|
|
|
+ async function updateStatus() {
|
|
|
+ const res = await getInspectedTaskStatus(subjectCode, groupNumber);
|
|
|
+ if (res.data.valid) store.status = res.data;
|
|
|
+ }
|
|
|
+ async function updateTask() {
|
|
|
+ // const mkey = "fetch_task_key";
|
|
|
+ message.info({ content: "获取任务中...", duration: 2 });
|
|
|
+ let res;
|
|
|
+ // if (isSingleStudent) {
|
|
|
+ // res = await getSingleStuTask();
|
|
|
+ // } else {
|
|
|
+ res = await getOneOfStuTask();
|
|
|
+ // }
|
|
|
+ // message.success({ content: "获取成功", key: mkey });
|
|
|
+
|
|
|
+ if (res.data.libraryId) {
|
|
|
+ store.currentTask = res.data;
|
|
|
+ if (store.currentTask)
|
|
|
+ store.setting.subject = store.currentTask.subject;
|
|
|
+ } else {
|
|
|
+ store.message = res.data.message;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const shouldReloadHistory = ref(0);
|
|
|
+
|
|
|
+ async function reloadAndfetchTask() {
|
|
|
+ await updateClearTask();
|
|
|
+ await fetchTask();
|
|
|
+ }
|
|
|
+
|
|
|
+ async function fetchTask() {
|
|
|
+ !isSingleStudent && (await updateStatus());
|
|
|
+ await updateTask();
|
|
|
+ }
|
|
|
+
|
|
|
+ onMounted(async () => {
|
|
|
+ await updateClearTask();
|
|
|
+
|
|
|
+ updateSetting();
|
|
|
+ // fetchTask(); // mark-header 会调用 (watchEffect)
|
|
|
+ });
|
|
|
+
|
|
|
+ async function getSingleStuTask() {
|
|
|
+ // return getSingleInspectedTask(libraryId);
|
|
|
+ }
|
|
|
+
|
|
|
+ async function getOneOfStuTask() {
|
|
|
+ return getOneOfInspectedTask(subjectCode, groupNumber);
|
|
|
+ }
|
|
|
+
|
|
|
+ const realLibraryId = computed(
|
|
|
+ () =>
|
|
|
+ (isSingleStudent ? libraryId : store.currentTask?.libraryId) as string
|
|
|
+ );
|
|
|
+ const saveTaskToServer = async () => {
|
|
|
+ console.log("save inspect task to server");
|
|
|
+ const mkey = "save_task_key";
|
|
|
+ message.loading({ content: "保存评卷任务...", key: mkey });
|
|
|
+ const res = (await saveInspectedTask(realLibraryId.value)) as any;
|
|
|
+ if (res.data.success && store.currentTask) {
|
|
|
+ message.success({ content: "复核成功", key: mkey, duration: 2 });
|
|
|
+ if (!store.historyOpen) {
|
|
|
+ store.currentTask = undefined;
|
|
|
+ if (!isSingleStudent) fetchTask();
|
|
|
+ } else {
|
|
|
+ shouldReloadHistory.value = Date.now();
|
|
|
+ }
|
|
|
+ } else if (res.data.message) {
|
|
|
+ console.log(res.data.message);
|
|
|
+ message.error({ content: res.data.message, key: mkey, duration: 10 });
|
|
|
+ } else if (!store.currentTask) {
|
|
|
+ message.warn({ content: "暂无新任务", key: mkey, duration: 10 });
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ const rejectQuestions = async (questions: Array<Question>) => {
|
|
|
+ if (!store.currentTask) return;
|
|
|
+ const mkey = "reject_task_key";
|
|
|
+ message.loading({ content: "打回评卷任务...", key: mkey });
|
|
|
+ const res = (await rejectInspectedTask(
|
|
|
+ //realLibraryId.value,
|
|
|
+ store.currentTask.studentId + "",
|
|
|
+ questions
|
|
|
+ )) as any;
|
|
|
+ if (res.data.success) {
|
|
|
+ store.currentTask = undefined;
|
|
|
+ message.success({ content: "打回成功", key: mkey, duration: 2 });
|
|
|
+ if (!store.historyOpen) {
|
|
|
+ store.currentTask = undefined;
|
|
|
+ if (!isSingleStudent) fetchTask();
|
|
|
+ } else {
|
|
|
+ shouldReloadHistory.value = Date.now();
|
|
|
+ }
|
|
|
+ } else if (res.data.message) {
|
|
|
+ console.log(res.data.message);
|
|
|
+ message.error({ content: res.data.message, key: mkey, duration: 10 });
|
|
|
+ } else if (!store.currentTask) {
|
|
|
+ message.warn({ content: "暂无新任务", key: mkey, duration: 10 });
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ return {
|
|
|
+ store,
|
|
|
+ fetchTask,
|
|
|
+ reloadAndfetchTask,
|
|
|
+ saveTaskToServer,
|
|
|
+ rejectQuestions,
|
|
|
+ shouldReloadHistory,
|
|
|
+ };
|
|
|
+ },
|
|
|
+});
|
|
|
+</script>
|
|
|
+
|
|
|
+<style scoped>
|
|
|
+.my-container {
|
|
|
+ width: 100%;
|
|
|
+}
|
|
|
+a {
|
|
|
+ color: #42b983;
|
|
|
+}
|
|
|
+
|
|
|
+label {
|
|
|
+ margin: 0 0.5em;
|
|
|
+ font-weight: bold;
|
|
|
+}
|
|
|
+
|
|
|
+code {
|
|
|
+ background-color: #eee;
|
|
|
+ padding: 2px 4px;
|
|
|
+ border-radius: 4px;
|
|
|
+ color: #304455;
|
|
|
+}
|
|
|
+</style>
|