|
@@ -90,117 +90,8 @@ export async function addWatermark(
|
|
|
const maxStartX = imageWidth - fontSize * 0.7 * 5;
|
|
|
const nextLineStartX = x + fontSize * 0.7 * 4;
|
|
|
const height = fontSize + 10;
|
|
|
- //计算总分
|
|
|
- const totalScore =
|
|
|
- (parseFloat(student.objectiveScore) || 0) +
|
|
|
- (parseFloat(student.subjectiveScore) || 0);
|
|
|
- //显示总分明细
|
|
|
imgData.font(fontFile, fontSize).fill(color);
|
|
|
- drawText(x, (y += height), "成绩明细");
|
|
|
- //普通考试模式,按客观+主观模式显示总分
|
|
|
- if (trackMode === "1") {
|
|
|
- drawText(
|
|
|
- x,
|
|
|
- (y += height),
|
|
|
- "总分=(客观+主观) | " +
|
|
|
- totalScore +
|
|
|
- "=" +
|
|
|
- student.objectiveScore +
|
|
|
- "+" +
|
|
|
- student.subjectiveScore
|
|
|
- );
|
|
|
- }
|
|
|
- //研究生考试模式,只显示总分
|
|
|
- else if (trackMode === "2") {
|
|
|
- drawText(x, (y += height), "总分=" + totalScore + "分");
|
|
|
- }
|
|
|
- //显示客观题明细
|
|
|
- if (
|
|
|
- student.objectiveScoreDetail &&
|
|
|
- student.objectiveScoreDetail.length > 0
|
|
|
- ) {
|
|
|
- const title = "大题号 | 大题总分";
|
|
|
- drawText(x, (y += height), title);
|
|
|
- const map: any = {};
|
|
|
- for (let i = 0; i < student.objectiveScoreDetail.length; i++) {
|
|
|
- const item = student.objectiveScoreDetail[i];
|
|
|
- if (!map[item.mainNumber]) {
|
|
|
- map[item.mainNumber] = [item];
|
|
|
- } else {
|
|
|
- map[item.mainNumber].push(item);
|
|
|
- }
|
|
|
- }
|
|
|
- for (const mainNumber in map) {
|
|
|
- const arr = map[mainNumber];
|
|
|
- const mainTotalScore =
|
|
|
- arr.reduce((num: number, item: any) => {
|
|
|
- return num + item.score * 100;
|
|
|
- }, 0) / 100;
|
|
|
- drawText(x, (y += height), `${mainNumber} | ${mainTotalScore}`);
|
|
|
- if (store.pageInputs["/image-download"].showSubScore) {
|
|
|
- dynamicX = saveX;
|
|
|
- drawText((dynamicX += fontSize * 0.7 * 5), y, ":");
|
|
|
- for (let i = 0; i < arr.length; i++) {
|
|
|
- const v = arr[i];
|
|
|
- const joinStr = i == arr.length - 1 ? "" : ",";
|
|
|
- if (dynamicX > maxStartX) {
|
|
|
- dynamicX = nextLineStartX;
|
|
|
- y += height;
|
|
|
- }
|
|
|
- drawText(
|
|
|
- (dynamicX += (v.score + " ").length * fontSize * 0.7),
|
|
|
- y,
|
|
|
- v.score + joinStr
|
|
|
- );
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
|
|
|
- // if (
|
|
|
- // student.objectiveScoreDetail &&
|
|
|
- // student.objectiveScoreDetail.length > 0
|
|
|
- // ) {
|
|
|
- // const lines = [];
|
|
|
- // let array = [];
|
|
|
- // //前置提示文字的字符数
|
|
|
- // let count = 10;
|
|
|
- // lines.push(array);
|
|
|
- // for (let i = 0; i < student.objectiveScoreDetail.length; i++) {
|
|
|
- // const detail = student.objectiveScoreDetail[i];
|
|
|
- // const content =
|
|
|
- // detail.answer + ":" + (detail.score === -1 ? "未选做" : detail.score);
|
|
|
- // //超长后另起一行显示客观题
|
|
|
- // if ((count + content.length) * fontSize * 0.7 > maxX) {
|
|
|
- // array = [];
|
|
|
- // lines.push(array);
|
|
|
- // count = 10;
|
|
|
- // }
|
|
|
- // array.push(content);
|
|
|
- // count += content.length;
|
|
|
- // }
|
|
|
- // //显示所有行的客观题明细
|
|
|
- // for (let l = 0; l < lines.length; l++) {
|
|
|
- // // FIXME: 要在小个版本修复
|
|
|
- // // 事先判断,能否打印,情况较多,比如客观题多个答案
|
|
|
- // // 事后报错,不让错误的数据保存
|
|
|
- // // if (y + height + 15 > imageHeight) {
|
|
|
- // // y = startY;
|
|
|
- // // x += width;
|
|
|
- // // }
|
|
|
- // drawText(x, (y += height), "客观题识别结果 | " + lines[l].join(";"));
|
|
|
- // }
|
|
|
- // }
|
|
|
- //显示复核人
|
|
|
- // if (student.inspector) {
|
|
|
- // drawText(x, (y += height), "复核人: " + student.inspector.loginName);
|
|
|
- // }
|
|
|
- if (student.inspector && student.inspector.length) {
|
|
|
- const allNameStr = student.inspector
|
|
|
- .map((item: any) => item.loginName)
|
|
|
- .join("、");
|
|
|
- drawText(x, (y += height), "复核人: " + allNameStr);
|
|
|
- }
|
|
|
//显示主观题明细
|
|
|
if (
|
|
|
student.subjectiveScoreDetail &&
|
|
@@ -310,6 +201,116 @@ export async function addWatermark(
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ //计算总分
|
|
|
+ const totalScore =
|
|
|
+ (parseFloat(student.objectiveScore) || 0) +
|
|
|
+ (parseFloat(student.subjectiveScore) || 0);
|
|
|
+ //显示总分明细
|
|
|
+ drawText(x, (y += height), "成绩明细");
|
|
|
+ //普通考试模式,按客观+主观模式显示总分
|
|
|
+ if (trackMode === "1") {
|
|
|
+ drawText(
|
|
|
+ x,
|
|
|
+ (y += height),
|
|
|
+ "总分=(客观+主观) | " +
|
|
|
+ totalScore +
|
|
|
+ "=" +
|
|
|
+ student.objectiveScore +
|
|
|
+ "+" +
|
|
|
+ student.subjectiveScore
|
|
|
+ );
|
|
|
+ }
|
|
|
+ //研究生考试模式,只显示总分
|
|
|
+ else if (trackMode === "2") {
|
|
|
+ drawText(x, (y += height), "总分=" + totalScore + "分");
|
|
|
+ }
|
|
|
+ //显示客观题明细
|
|
|
+ if (
|
|
|
+ student.objectiveScoreDetail &&
|
|
|
+ student.objectiveScoreDetail.length > 0
|
|
|
+ ) {
|
|
|
+ const title = "大题号 | 大题总分";
|
|
|
+ drawText(x, (y += height), title);
|
|
|
+ const map: any = {};
|
|
|
+ for (let i = 0; i < student.objectiveScoreDetail.length; i++) {
|
|
|
+ const item = student.objectiveScoreDetail[i];
|
|
|
+ if (!map[item.mainNumber]) {
|
|
|
+ map[item.mainNumber] = [item];
|
|
|
+ } else {
|
|
|
+ map[item.mainNumber].push(item);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (const mainNumber in map) {
|
|
|
+ const arr = map[mainNumber];
|
|
|
+ const mainTotalScore =
|
|
|
+ arr.reduce((num: number, item: any) => {
|
|
|
+ return num + item.score * 100;
|
|
|
+ }, 0) / 100;
|
|
|
+ drawText(x, (y += height), `${mainNumber} | ${mainTotalScore}`);
|
|
|
+ if (store.pageInputs["/image-download"].showSubScore) {
|
|
|
+ dynamicX = saveX;
|
|
|
+ drawText((dynamicX += fontSize * 0.7 * 5), y, ":");
|
|
|
+ for (let i = 0; i < arr.length; i++) {
|
|
|
+ const v = arr[i];
|
|
|
+ const joinStr = i == arr.length - 1 ? "" : ",";
|
|
|
+ if (dynamicX > maxStartX) {
|
|
|
+ dynamicX = nextLineStartX;
|
|
|
+ y += height;
|
|
|
+ }
|
|
|
+ drawText(
|
|
|
+ (dynamicX += (v.score + " ").length * fontSize * 0.7),
|
|
|
+ y,
|
|
|
+ v.score + joinStr
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // if (
|
|
|
+ // student.objectiveScoreDetail &&
|
|
|
+ // student.objectiveScoreDetail.length > 0
|
|
|
+ // ) {
|
|
|
+ // const lines = [];
|
|
|
+ // let array = [];
|
|
|
+ // //前置提示文字的字符数
|
|
|
+ // let count = 10;
|
|
|
+ // lines.push(array);
|
|
|
+ // for (let i = 0; i < student.objectiveScoreDetail.length; i++) {
|
|
|
+ // const detail = student.objectiveScoreDetail[i];
|
|
|
+ // const content =
|
|
|
+ // detail.answer + ":" + (detail.score === -1 ? "未选做" : detail.score);
|
|
|
+ // //超长后另起一行显示客观题
|
|
|
+ // if ((count + content.length) * fontSize * 0.7 > maxX) {
|
|
|
+ // array = [];
|
|
|
+ // lines.push(array);
|
|
|
+ // count = 10;
|
|
|
+ // }
|
|
|
+ // array.push(content);
|
|
|
+ // count += content.length;
|
|
|
+ // }
|
|
|
+ // //显示所有行的客观题明细
|
|
|
+ // for (let l = 0; l < lines.length; l++) {
|
|
|
+ // // FIXME: 要在小个版本修复
|
|
|
+ // // 事先判断,能否打印,情况较多,比如客观题多个答案
|
|
|
+ // // 事后报错,不让错误的数据保存
|
|
|
+ // // if (y + height + 15 > imageHeight) {
|
|
|
+ // // y = startY;
|
|
|
+ // // x += width;
|
|
|
+ // // }
|
|
|
+ // drawText(x, (y += height), "客观题识别结果 | " + lines[l].join(";"));
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ //显示复核人
|
|
|
+ // if (student.inspector) {
|
|
|
+ // drawText(x, (y += height), "复核人: " + student.inspector.loginName);
|
|
|
+ // }
|
|
|
+ if (student.inspector && student.inspector.length) {
|
|
|
+ const allNameStr = student.inspector
|
|
|
+ .map((item: any) => item.loginName)
|
|
|
+ .join("、");
|
|
|
+ drawText(x, (y += height), "复核人: " + allNameStr);
|
|
|
+ }
|
|
|
}
|
|
|
//显示评卷标记
|
|
|
if (student.tags != undefined && student.tags[index] != undefined) {
|