|
@@ -127,8 +127,8 @@ import {
|
|
} from "@/api/checkPage";
|
|
} from "@/api/checkPage";
|
|
import { doLogout } from "@/api/markPage";
|
|
import { doLogout } from "@/api/markPage";
|
|
import { useMarkStore } from "@/store";
|
|
import { useMarkStore } from "@/store";
|
|
-import type { Question } from "@/types";
|
|
|
|
-import { isNumber } from "lodash-es";
|
|
|
|
|
|
+import type { MarkResult, Question } from "@/types";
|
|
|
|
+import { isNumber, cloneDeep } from "lodash-es";
|
|
import vls from "@/utils/storage";
|
|
import vls from "@/utils/storage";
|
|
|
|
|
|
// components
|
|
// components
|
|
@@ -223,117 +223,43 @@ const allZeroSubmit = async () => {
|
|
const getMarkData = () => {
|
|
const getMarkData = () => {
|
|
if (!markStore.currentTask?.markResult) return {};
|
|
if (!markStore.currentTask?.markResult) return {};
|
|
|
|
|
|
- let markResult = markStore.currentTask.markResult;
|
|
|
|
-
|
|
|
|
- let commomData = {
|
|
|
|
- status: markResult.status,
|
|
|
|
- spent: Date.now() - markStore.currentTask.__markStartTime,
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
- if (!markStore.isTrackMode) {
|
|
|
|
- const groupMap = {};
|
|
|
|
- markStore.currentTask.questionList.forEach((question) => {
|
|
|
|
- const { __index, groupNumber } = question;
|
|
|
|
- if (!groupMap[groupNumber]) {
|
|
|
|
- groupMap[groupNumber] = {
|
|
|
|
- ...commomData,
|
|
|
|
- groupNumber,
|
|
|
|
- markerTrackList: [],
|
|
|
|
- markerTagList: [],
|
|
|
|
- markerScore: [],
|
|
|
|
- scoreList: [],
|
|
|
|
- studentId: markStore.currentTask.studentId,
|
|
|
|
- };
|
|
|
|
- }
|
|
|
|
- groupMap[groupNumber].scoreList[__index] =
|
|
|
|
- markStore.currentTask.markResult.scoreList[__index];
|
|
|
|
- groupMap[groupNumber].markerScore.push({
|
|
|
|
- mainNumber: question.mainNumber,
|
|
|
|
- subNumber: question.subNumber,
|
|
|
|
- score: markStore.currentTask.markResult.scoreList[__index],
|
|
|
|
- });
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
- const groups = Object.values(groupMap).map((group) => {
|
|
|
|
- group.scoreList = group.scoreList.filter((item) => item !== undefined);
|
|
|
|
- return group;
|
|
|
|
- });
|
|
|
|
- return {
|
|
|
|
- studentId: markStore.currentTask.studentId,
|
|
|
|
- groups,
|
|
|
|
- };
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- let groupMap = {};
|
|
|
|
- markResult.markerTrackList.forEach((track) => {
|
|
|
|
- const { groupNumber } =
|
|
|
|
- taskQuestionInfo[`${track.mainNumber * 1000}${track.subNumber}`];
|
|
|
|
- if (!groupMap[groupNumber]) {
|
|
|
|
- groupMap[groupNumber] = {
|
|
|
|
- groupNumber,
|
|
|
|
- markerTrackList: [],
|
|
|
|
- markerTagList: [],
|
|
|
|
- };
|
|
|
|
- }
|
|
|
|
- groupMap[groupNumber].markerTrackList.push(track);
|
|
|
|
- });
|
|
|
|
- markResult.markerTagList.forEach((track) => {
|
|
|
|
- const { groupNumber } = track;
|
|
|
|
- if (!groupMap[groupNumber]) {
|
|
|
|
- groupMap[groupNumber] = {
|
|
|
|
- groupNumber,
|
|
|
|
- markerTrackList: [],
|
|
|
|
- markerTagList: [],
|
|
|
|
- };
|
|
|
|
- }
|
|
|
|
- groupMap[groupNumber].markerTagList.push(track);
|
|
|
|
- });
|
|
|
|
|
|
+ const datas = cloneDeep(markStore.currentTask.markResult);
|
|
|
|
+ datas.spent = Date.now() - markStore.currentTask.__markStartTime;
|
|
|
|
|
|
const modifiedQuestions = Object.keys(
|
|
const modifiedQuestions = Object.keys(
|
|
markStore.currentTaskModifyQuestion
|
|
markStore.currentTaskModifyQuestion
|
|
).filter((k) => markStore.currentTaskModifyQuestion[k]);
|
|
).filter((k) => markStore.currentTaskModifyQuestion[k]);
|
|
|
|
|
|
- let groups = Object.values(groupMap).map((item) => {
|
|
|
|
- let qScore = {};
|
|
|
|
- const markerTrackList = item.markerTrackList.filter((track) =>
|
|
|
|
- modifiedQuestions.includes(`${track.mainNumber}_${track.subNumber}`)
|
|
|
|
- );
|
|
|
|
- if (!markerTrackList.length && !item.markerTagList.length) return null;
|
|
|
|
-
|
|
|
|
- markerTrackList.forEach((track) => {
|
|
|
|
- const qno = `${track.mainNumber * 1000}${track.subNumber}`;
|
|
|
|
- if (!qScore[qno]) {
|
|
|
|
- qScore[qno] = {
|
|
|
|
- mainNumber: track.mainNumber,
|
|
|
|
- subNumber: track.subNumber,
|
|
|
|
- score: 0,
|
|
|
|
- };
|
|
|
|
- }
|
|
|
|
- qScore[qno].markerScore += track.markerScore;
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
- return {
|
|
|
|
- ...commomData,
|
|
|
|
- ...item,
|
|
|
|
- markerTrackList,
|
|
|
|
- markerScore: Object.values(qScore),
|
|
|
|
- studentId: markStore.currentTask.studentId,
|
|
|
|
- };
|
|
|
|
- });
|
|
|
|
- groups = groups.filter((group) => group);
|
|
|
|
-
|
|
|
|
- return {
|
|
|
|
- studentId: markStore.currentTask.studentId,
|
|
|
|
- groups,
|
|
|
|
- };
|
|
|
|
|
|
+ datas.questionList = datas.questionList
|
|
|
|
+ .filter((q) => {
|
|
|
|
+ return modifiedQuestions.includes(`${q.mainNumber}_${q.subNumber}`);
|
|
|
|
+ })
|
|
|
|
+ .map((q) => {
|
|
|
|
+ q.markerTrackList = datas.markerTrackList.filter(
|
|
|
|
+ (t) => t.mainNumber === q.mainNumber && t.subNumber === q.subNumber
|
|
|
|
+ );
|
|
|
|
+ q.markerTagList = datas.markerTagList.filter(
|
|
|
|
+ (t) => t.mainNumber === q.mainNumber && t.subNumber === q.subNumber
|
|
|
|
+ );
|
|
|
|
+ q.markerScore = q.markerTrackList.reduce((acc, t) => {
|
|
|
|
+ return acc + (t.score || 0);
|
|
|
|
+ }, 0);
|
|
|
|
+ return q;
|
|
|
|
+ }) as Question[];
|
|
|
|
+
|
|
|
|
+ datas.markerTrackList = [];
|
|
|
|
+ datas.markerTagList = [];
|
|
|
|
+ return datas;
|
|
};
|
|
};
|
|
|
|
|
|
-const validateScore = (markResult: any) => {
|
|
|
|
|
|
+const validateScore = (markResult: MarkResult) => {
|
|
const errors: Array<{ question: Question; index: number; error: string }> =
|
|
const errors: Array<{ question: Question; index: number; error: string }> =
|
|
[];
|
|
[];
|
|
markResult.scoreList.forEach((score: number, index: number) => {
|
|
markResult.scoreList.forEach((score: number, index: number) => {
|
|
if (!markStore.currentTask) return;
|
|
if (!markStore.currentTask) return;
|
|
const question = markStore.currentTask.questionList[index]!;
|
|
const question = markStore.currentTask.questionList[index]!;
|
|
|
|
+ if (!question.selfMark || question.problem) return;
|
|
|
|
+
|
|
let error;
|
|
let error;
|
|
if (!isNumber(score)) {
|
|
if (!isNumber(score)) {
|
|
error = `${question.mainNumber}-${question.subNumber}${
|
|
error = `${question.mainNumber}-${question.subNumber}${
|
|
@@ -355,52 +281,62 @@ const validateScore = (markResult: any) => {
|
|
return errors;
|
|
return errors;
|
|
};
|
|
};
|
|
|
|
|
|
-const saveTaskToServer = async () => {
|
|
|
|
- if (!markStore.currentTask) return;
|
|
|
|
- const markResult = markStore.currentTask.markResult;
|
|
|
|
- if (!markResult) return;
|
|
|
|
-
|
|
|
|
- const mkey = "save_task_key";
|
|
|
|
-
|
|
|
|
- type SubmitError = {
|
|
|
|
- question: Question;
|
|
|
|
- index: number;
|
|
|
|
- error: string;
|
|
|
|
- };
|
|
|
|
|
|
+type SubmitError = {
|
|
|
|
+ question: Question;
|
|
|
|
+ index: number;
|
|
|
|
+ error: string;
|
|
|
|
+};
|
|
|
|
|
|
|
|
+const checkMarkResult = (markResult: MarkResult): boolean => {
|
|
const errors: SubmitError[] = validateScore(markResult);
|
|
const errors: SubmitError[] = validateScore(markResult);
|
|
if (errors.length !== 0) {
|
|
if (errors.length !== 0) {
|
|
console.log(errors);
|
|
console.log(errors);
|
|
const msg = errors.map((v) => h("div", `${v.error}`));
|
|
const msg = errors.map((v) => h("div", `${v.error}`));
|
|
void message.warning({
|
|
void message.warning({
|
|
content: h("span", ["校验失败", ...msg]),
|
|
content: h("span", ["校验失败", ...msg]),
|
|
- duration: 10,
|
|
|
|
- key: mkey,
|
|
|
|
|
|
+ duration: 5,
|
|
});
|
|
});
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ const problemQs = markStore.currentTask.questionList
|
|
|
|
+ .filter((q) => q.problem)
|
|
|
|
+ .map((q, i) => i);
|
|
|
|
+ const questions = markStore.currentTask.questionList.filter(
|
|
|
|
+ (q) => !q.problem
|
|
|
|
+ );
|
|
|
|
+ const scoreList = markResult.scoreList.filter(
|
|
|
|
+ (_, i) => !problemQs.includes(i)
|
|
|
|
+ );
|
|
if (
|
|
if (
|
|
- markResult.scoreList.length !== markStore.currentTask.questionList.length ||
|
|
|
|
- !markResult.scoreList.every((s) => isNumber(s))
|
|
|
|
|
|
+ scoreList.length !== questions.length ||
|
|
|
|
+ !scoreList.every((s) => isNumber(s))
|
|
) {
|
|
) {
|
|
- console.error({ content: "markResult格式不正确,缺少分数", key: mkey });
|
|
|
|
|
|
+ console.error({ content: "markResult格式不正确,缺少分数" });
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ return true;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+const saveTaskToServer = async () => {
|
|
|
|
+ if (!markStore.currentTask) return;
|
|
|
|
+ const markResult = markStore.currentTask.markResult;
|
|
|
|
+ if (!markResult) return;
|
|
|
|
+
|
|
|
|
+ if (!checkMarkResult(markResult)) return;
|
|
|
|
+
|
|
const data = getMarkData();
|
|
const data = getMarkData();
|
|
const res = await saveStudentSubjectiveConfirmData(data).catch(() => false);
|
|
const res = await saveStudentSubjectiveConfirmData(data).catch(() => false);
|
|
if (!res) return;
|
|
if (!res) return;
|
|
if (!res.data.success) {
|
|
if (!res.data.success) {
|
|
- console.log(res.data.message);
|
|
|
|
- void message.error({ content: res.data.message, key: mkey, duration: 5 });
|
|
|
|
|
|
+ void message.error({ content: res.data.message, duration: 5 });
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
if (!isMultiStudent) {
|
|
if (!isMultiStudent) {
|
|
void message.success({
|
|
void message.success({
|
|
content: "保存成功,页面将在3秒钟之后关闭",
|
|
content: "保存成功,页面将在3秒钟之后关闭",
|
|
- key: mkey,
|
|
|
|
duration: 2,
|
|
duration: 2,
|
|
});
|
|
});
|
|
setTimeout(() => {
|
|
setTimeout(() => {
|
|
@@ -408,7 +344,7 @@ const saveTaskToServer = async () => {
|
|
}, 3000);
|
|
}, 3000);
|
|
return;
|
|
return;
|
|
} else {
|
|
} else {
|
|
- void message.success({ content: "保存成功", key: mkey, duration: 2 });
|
|
|
|
|
|
+ void message.success({ content: "保存成功", duration: 2 });
|
|
}
|
|
}
|
|
|
|
|
|
markStore.currentTask = undefined;
|
|
markStore.currentTask = undefined;
|