|
@@ -1,6 +1,6 @@
|
|
<template>
|
|
<template>
|
|
<div class="mark arbitrate">
|
|
<div class="mark arbitrate">
|
|
- <mark-header :isSingleStudent="isSingleStudent" />
|
|
|
|
|
|
+ <arbitrate-header :isSingleStudent="isSingleStudent" />
|
|
<mark-tool :actions="['minimap', 'sizeScale', 'imgScale']" />
|
|
<mark-tool :actions="['minimap', 'sizeScale', 'imgScale']" />
|
|
<div class="mark-main">
|
|
<div class="mark-main">
|
|
<mark-history
|
|
<mark-history
|
|
@@ -10,47 +10,44 @@
|
|
:groupNumber="groupNumber + ''"
|
|
:groupNumber="groupNumber + ''"
|
|
:getHistory="getArbitrateHistory"
|
|
:getHistory="getArbitrateHistory"
|
|
/>
|
|
/>
|
|
- <ArbitrateMarkList />
|
|
|
|
- <mark-body @error="renderError" />
|
|
|
|
|
|
+ <arbitrate-mark-list />
|
|
|
|
+ <arbitrate-body @error="renderError" />
|
|
<mark-board-track
|
|
<mark-board-track
|
|
- v-if="store.isTrackMode"
|
|
|
|
|
|
+ v-if="markStore.isTrackMode"
|
|
@unselectiveSubmit="saveTaskToServer(true)"
|
|
@unselectiveSubmit="saveTaskToServer(true)"
|
|
@submit="saveTaskToServerByTrack"
|
|
@submit="saveTaskToServerByTrack"
|
|
/>
|
|
/>
|
|
- <template v-if="!store.isTrackMode">
|
|
|
|
|
|
+ <template v-if="!markStore.isTrackMode">
|
|
<mark-board-key-board
|
|
<mark-board-key-board
|
|
- v-if="store.shouldShowMarkBoardKeyBoard"
|
|
|
|
|
|
+ v-if="markStore.shouldShowMarkBoardKeyBoard"
|
|
@submit="saveTaskToServer(false)"
|
|
@submit="saveTaskToServer(false)"
|
|
@unselectiveSubmit="saveTaskToServer(true)"
|
|
@unselectiveSubmit="saveTaskToServer(true)"
|
|
/>
|
|
/>
|
|
<mark-board-mouse
|
|
<mark-board-mouse
|
|
- v-if="store.shouldShowMarkBoardMouse"
|
|
|
|
|
|
+ v-if="markStore.shouldShowMarkBoardMouse"
|
|
@submit="saveTaskToServer(false)"
|
|
@submit="saveTaskToServer(false)"
|
|
@unselectiveSubmit="saveTaskToServer(true)"
|
|
@unselectiveSubmit="saveTaskToServer(true)"
|
|
/>
|
|
/>
|
|
</template>
|
|
</template>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
- <AnswerModal />
|
|
|
|
- <PaperModal />
|
|
|
|
- <MinimapModal />
|
|
|
|
- <MarkBoardTrackDialog v-if="store.isTrackMode" @submit="saveTaskToServer" />
|
|
|
|
|
|
+ <!-- modal -->
|
|
|
|
+ <modal-answer />
|
|
|
|
+ <modal-paper />
|
|
|
|
+ <modal-minimap />
|
|
|
|
+ <!-- other -->
|
|
|
|
+ <mark-board-track-dialog
|
|
|
|
+ v-if="markStore.isTrackMode"
|
|
|
|
+ @submit="saveTaskToServer"
|
|
|
|
+ />
|
|
</template>
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
import { onMounted, watch, h } from "vue";
|
|
import { onMounted, watch, h } from "vue";
|
|
-import { store } from "@/store/app";
|
|
|
|
-import MarkHeader from "./MarkHeader.vue";
|
|
|
|
-import MarkTool from "../mark/MarkTool.vue";
|
|
|
|
-import MarkBody from "./MarkBody.vue";
|
|
|
|
-import MarkBoardKeyBoard from "@/features/mark/MarkBoardKeyBoard.vue";
|
|
|
|
-import MarkBoardMouse from "@/features/mark/MarkBoardMouse.vue";
|
|
|
|
-import MinimapModal from "@/features/mark/MinimapModal.vue";
|
|
|
|
-import MarkHistory from "@/features/mark/MarkHistory.vue";
|
|
|
|
-import MarkBoardTrack from "@/features/mark/MarkBoardTrack.vue";
|
|
|
|
-import MarkBoardTrackDialog from "@/features/mark/MarkBoardTrackDialog.vue";
|
|
|
|
-
|
|
|
|
import { message } from "ant-design-vue";
|
|
import { message } from "ant-design-vue";
|
|
|
|
+import { useMarkStore } from "@/store";
|
|
|
|
+import { isNumber } from "lodash-es";
|
|
|
|
+import type { Question } from "@/types";
|
|
import {
|
|
import {
|
|
clearArbitrateTask,
|
|
clearArbitrateTask,
|
|
getArbitrateSetting,
|
|
getArbitrateSetting,
|
|
@@ -59,15 +56,30 @@ import {
|
|
getSingleArbitrateTask,
|
|
getSingleArbitrateTask,
|
|
saveArbitrateTask,
|
|
saveArbitrateTask,
|
|
} from "@/api/arbitratePage";
|
|
} from "@/api/arbitratePage";
|
|
-import ArbitrateMarkList from "./ArbitrateMarkList.vue";
|
|
|
|
-import AnswerModal from "../mark/AnswerModal.vue";
|
|
|
|
-import PaperModal from "../mark/PaperModal.vue";
|
|
|
|
import { getArbitrateHistory } from "@/api/arbitratePage";
|
|
import { getArbitrateHistory } from "@/api/arbitratePage";
|
|
import EventBus from "@/plugins/eventBus";
|
|
import EventBus from "@/plugins/eventBus";
|
|
-import { isNumber } from "lodash-es";
|
|
|
|
-import type { Question } from "@/types";
|
|
|
|
import vls from "@/utils/storage";
|
|
import vls from "@/utils/storage";
|
|
|
|
|
|
|
|
+// components
|
|
|
|
+import ArbitrateBody from "./ArbitrateBody.vue";
|
|
|
|
+import ArbitrateHeader from "./ArbitrateHeader.vue";
|
|
|
|
+import ArbitrateMarkList from "./ArbitrateMarkList.vue";
|
|
|
|
+
|
|
|
|
+import MarkTool from "../mark/toolbar/MarkTool.vue";
|
|
|
|
+import MarkHistory from "../mark/MarkHistory.vue";
|
|
|
|
+
|
|
|
|
+// scoring
|
|
|
|
+import MarkBoardKeyBoard from "../mark/scoring/MarkBoardKeyBoard.vue";
|
|
|
|
+import MarkBoardMouse from "../mark/scoring/MarkBoardMouse.vue";
|
|
|
|
+import MarkBoardTrack from "../mark/scoring/MarkBoardTrack.vue";
|
|
|
|
+import MarkBoardTrackDialog from "../mark/scoring/MarkBoardTrackDialog.vue";
|
|
|
|
+// modals
|
|
|
|
+import ModalAnswer from "../mark/modals/ModalAnswer.vue";
|
|
|
|
+import ModalPaper from "../mark/modals/ModalPaper.vue";
|
|
|
|
+import ModalMinimap from "../mark/modals/ModalMinimap.vue";
|
|
|
|
+
|
|
|
|
+const markStore = useMarkStore();
|
|
|
|
+
|
|
const { paperNumber, groupNumber, examId, arbitrateId } = vls.get(
|
|
const { paperNumber, groupNumber, examId, arbitrateId } = vls.get(
|
|
"arbitrate",
|
|
"arbitrate",
|
|
{}
|
|
{}
|
|
@@ -81,10 +93,10 @@ const params = isSingleStudent
|
|
async function updateClearTask() {
|
|
async function updateClearTask() {
|
|
await clearArbitrateTask(params);
|
|
await clearArbitrateTask(params);
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+// 更新设置
|
|
async function updateSetting() {
|
|
async function updateSetting() {
|
|
const settingRes = await getArbitrateSetting(params);
|
|
const settingRes = await getArbitrateSetting(params);
|
|
- store.setting = Object.assign({}, store.setting, {
|
|
|
|
|
|
+ markStore.setting = Object.assign({}, markStore.setting, {
|
|
selective: false,
|
|
selective: false,
|
|
examType: "SCAN_IMAGE",
|
|
examType: "SCAN_IMAGE",
|
|
subject: {
|
|
subject: {
|
|
@@ -95,18 +107,20 @@ async function updateSetting() {
|
|
enableSplit: false,
|
|
enableSplit: false,
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
+
|
|
async function updateStatus() {
|
|
async function updateStatus() {
|
|
const res = await getArbitrateTaskStatus(params);
|
|
const res = await getArbitrateTaskStatus(params);
|
|
- if (res.data.valid) Object.assign(store.status, res.data);
|
|
|
|
|
|
+ if (res.data.valid) Object.assign(markStore.status, res.data);
|
|
}
|
|
}
|
|
|
|
+// 获取任务
|
|
async function updateTask() {
|
|
async function updateTask() {
|
|
const mkey = "fetch_task_key";
|
|
const mkey = "fetch_task_key";
|
|
void message.info({ content: "获取任务中...", duration: 1.5, key: mkey });
|
|
void message.info({ content: "获取任务中...", duration: 1.5, key: mkey });
|
|
let res;
|
|
let res;
|
|
if (isSingleStudent) {
|
|
if (isSingleStudent) {
|
|
- res = await getSingleStuTask();
|
|
|
|
|
|
+ res = await getSingleArbitrateTask(params);
|
|
} else {
|
|
} else {
|
|
- res = await getOneOfStuTask();
|
|
|
|
|
|
+ res = await getOneOfArbitrateTask(params);
|
|
}
|
|
}
|
|
void message.success({
|
|
void message.success({
|
|
content: res.data ? "获取成功" : "当前无评卷任务",
|
|
content: res.data ? "获取成功" : "当前无评卷任务",
|
|
@@ -116,24 +130,32 @@ async function updateTask() {
|
|
if (res.data) {
|
|
if (res.data) {
|
|
let rawTask = res.data;
|
|
let rawTask = res.data;
|
|
rawTask.sheetUrls = rawTask.sheetUrls || [];
|
|
rawTask.sheetUrls = rawTask.sheetUrls || [];
|
|
- // rawTask.sheetUrls = ["/1-1.jpg", "/1-2.jpg"];
|
|
|
|
rawTask.sliceUrls = [...rawTask.sheetUrls];
|
|
rawTask.sliceUrls = [...rawTask.sheetUrls];
|
|
- store.currentTask = rawTask;
|
|
|
|
|
|
+ markStore.currentTask = rawTask;
|
|
} else {
|
|
} else {
|
|
- store.message = "当前无评卷任务";
|
|
|
|
|
|
+ markStore.message = "当前无评卷任务";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
watch(
|
|
watch(
|
|
- () => store.historyOpen,
|
|
|
|
|
|
+ () => markStore.historyOpen,
|
|
async () => {
|
|
async () => {
|
|
- if (!store.historyOpen) {
|
|
|
|
|
|
+ if (!markStore.historyOpen) {
|
|
await updateClearTask();
|
|
await updateClearTask();
|
|
await fetchTask();
|
|
await fetchTask();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
);
|
|
);
|
|
|
|
|
|
|
|
+watch(
|
|
|
|
+ () => markStore.currentTask,
|
|
|
|
+ () => {
|
|
|
|
+ // 重置当前选择的quesiton和score
|
|
|
|
+ markStore.currentQuestion = undefined;
|
|
|
|
+ markStore.currentScore = undefined;
|
|
|
|
+ }
|
|
|
|
+);
|
|
|
|
+
|
|
async function fetchTask() {
|
|
async function fetchTask() {
|
|
!isSingleStudent && (await updateStatus());
|
|
!isSingleStudent && (await updateStatus());
|
|
await updateTask();
|
|
await updateTask();
|
|
@@ -145,26 +167,10 @@ onMounted(async () => {
|
|
await fetchTask();
|
|
await fetchTask();
|
|
});
|
|
});
|
|
|
|
|
|
-watch(
|
|
|
|
- () => store.currentTask,
|
|
|
|
- () => {
|
|
|
|
- // 重置当前选择的quesiton和score
|
|
|
|
- store.currentQuestion = undefined;
|
|
|
|
- store.currentScore = undefined;
|
|
|
|
- }
|
|
|
|
-);
|
|
|
|
-
|
|
|
|
-async function getSingleStuTask() {
|
|
|
|
- return getSingleArbitrateTask(params);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-async function getOneOfStuTask() {
|
|
|
|
- return getOneOfArbitrateTask(params);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
|
|
+// 保存任务
|
|
const saveTaskToServerByTrack = async () => {
|
|
const saveTaskToServerByTrack = async () => {
|
|
- let trackList = store.currentTask.markResult.trackList;
|
|
|
|
- let specialTagList = store.currentTask.markResult.specialTagList;
|
|
|
|
|
|
+ let trackList = markStore.currentTask.markResult.trackList;
|
|
|
|
+ let specialTagList = markStore.currentTask.markResult.specialTagList;
|
|
await saveTaskToServer(false, trackList, specialTagList);
|
|
await saveTaskToServer(false, trackList, specialTagList);
|
|
};
|
|
};
|
|
|
|
|
|
@@ -173,8 +179,8 @@ const saveTaskToServer = async (
|
|
trackList?: any,
|
|
trackList?: any,
|
|
specialTagList?: any
|
|
specialTagList?: any
|
|
) => {
|
|
) => {
|
|
- if (!store.currentTask) return;
|
|
|
|
- const markResult = store.currentTask.markResult;
|
|
|
|
|
|
+ if (!markStore.currentTask) return;
|
|
|
|
+ const markResult = markStore.currentTask.markResult;
|
|
if (!markResult) return;
|
|
if (!markResult) return;
|
|
|
|
|
|
const mkey = "save_task_key";
|
|
const mkey = "save_task_key";
|
|
@@ -182,8 +188,8 @@ const saveTaskToServer = async (
|
|
let res;
|
|
let res;
|
|
if (unselective) {
|
|
if (unselective) {
|
|
res = await saveArbitrateTask(
|
|
res = await saveArbitrateTask(
|
|
- store.currentTask.taskId,
|
|
|
|
- store.currentTask.studentId,
|
|
|
|
|
|
+ markStore.currentTask.taskId,
|
|
|
|
+ markStore.currentTask.studentId,
|
|
-1,
|
|
-1,
|
|
[],
|
|
[],
|
|
true
|
|
true
|
|
@@ -197,8 +203,8 @@ const saveTaskToServer = async (
|
|
const errors: SubmitError[] = [];
|
|
const errors: SubmitError[] = [];
|
|
|
|
|
|
markResult.scoreList.forEach((score, index) => {
|
|
markResult.scoreList.forEach((score, index) => {
|
|
- if (!store.currentTask) return;
|
|
|
|
- const question = store.currentTask.questionList[index];
|
|
|
|
|
|
+ if (!markStore.currentTask) return;
|
|
|
|
+ const question = markStore.currentTask.questionList[index];
|
|
let error;
|
|
let error;
|
|
if (!isNumber(score)) {
|
|
if (!isNumber(score)) {
|
|
error = `${question.mainNumber}-${question.subNumber}${
|
|
error = `${question.mainNumber}-${question.subNumber}${
|
|
@@ -227,10 +233,10 @@ const saveTaskToServer = async (
|
|
});
|
|
});
|
|
}
|
|
}
|
|
res = await saveArbitrateTask(
|
|
res = await saveArbitrateTask(
|
|
- store.currentTask.taskId + "",
|
|
|
|
- store.currentTask.studentId + "",
|
|
|
|
- store.currentTask.markResult.markerScore,
|
|
|
|
- store.currentTask.markResult.scoreList,
|
|
|
|
|
|
+ markStore.currentTask.taskId + "",
|
|
|
|
+ markStore.currentTask.studentId + "",
|
|
|
|
+ markStore.currentTask.markResult.markerScore,
|
|
|
|
+ markStore.currentTask.markResult.scoreList,
|
|
false,
|
|
false,
|
|
trackList,
|
|
trackList,
|
|
specialTagList
|
|
specialTagList
|
|
@@ -258,16 +264,17 @@ const saveTaskToServer = async (
|
|
}
|
|
}
|
|
|
|
|
|
void message.success({ content: "仲裁成功", key: mkey, duration: 2 });
|
|
void message.success({ content: "仲裁成功", key: mkey, duration: 2 });
|
|
- if (!store.historyOpen) {
|
|
|
|
- store.currentTask = undefined;
|
|
|
|
|
|
+ if (!markStore.historyOpen) {
|
|
|
|
+ markStore.currentTask = undefined;
|
|
await fetchTask();
|
|
await fetchTask();
|
|
} else {
|
|
} else {
|
|
EventBus.emit("should-reload-history");
|
|
EventBus.emit("should-reload-history");
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+// 渲染错误
|
|
const renderError = () => {
|
|
const renderError = () => {
|
|
- store.currentTask = undefined;
|
|
|
|
- store.message = "加载失败,请重新加载。";
|
|
|
|
|
|
+ markStore.currentTask = undefined;
|
|
|
|
+ markStore.message = "加载失败,请重新加载。";
|
|
};
|
|
};
|
|
</script>
|
|
</script>
|