|
@@ -38,7 +38,7 @@ class executor extends EventEmitter {
|
|
|
})
|
|
|
}
|
|
|
|
|
|
- async addWatermark(image, file, student, index, showMarker, showHeader) {
|
|
|
+ async addWatermark(image, file, student, index, trackMode) {
|
|
|
let fontFile = config.watermark.fontFile
|
|
|
let color = config.watermark.color
|
|
|
let size = sizeOf(image)
|
|
@@ -82,35 +82,90 @@ class executor extends EventEmitter {
|
|
|
imgData.drawText(x, y += height, '客观题识别结果 | ' + lines[l].join(';'))
|
|
|
}
|
|
|
}
|
|
|
+ //显示复核人
|
|
|
+ if (student.inspector) {
|
|
|
+ imgData.drawText(x, y += height, '复核人: ' + student.inspector.loginName)
|
|
|
+ }
|
|
|
//显示主观题明细
|
|
|
if (student.subjectiveScoreDetail && student.subjectiveScoreDetail.length > 0) {
|
|
|
- let title = '主观题号 | 分数'
|
|
|
- if (showMarker) {
|
|
|
- title += ' | 评卷员'
|
|
|
- if (showHeader) {
|
|
|
- title += ' | 复核人'
|
|
|
+ //普通考试模式,按小题显示明细
|
|
|
+ if (trackMode === '1') {
|
|
|
+ let title = '主观题号 | 分数 | 评卷员 | 仲裁员'
|
|
|
+ let startY = y
|
|
|
+ let width = title.length * fontSize
|
|
|
+ imgData.drawText(x, y += height, title)
|
|
|
+ for (let i = 0; i < student.subjectiveScoreDetail.length; i++) {
|
|
|
+ let detail = student.subjectiveScoreDetail[i]
|
|
|
+ //超过最大高度了则另起一列
|
|
|
+ if ((y + height + 15) > size.height) {
|
|
|
+ y = startY
|
|
|
+ x += width
|
|
|
+ imgData.drawText(x, y += height, title)
|
|
|
+ }
|
|
|
+ let content = detail.mainNumber + '-' + detail.subNumber + ' : ' + detail.score +
|
|
|
+ ' ' + (detail.marker || '') +
|
|
|
+ ' ' + (detail.header || '')
|
|
|
+ width = Math.max(width, content.length * fontSize)
|
|
|
+ imgData.drawText(x, y += height, content)
|
|
|
}
|
|
|
}
|
|
|
- let startY = y
|
|
|
- let width = title.length * fontSize
|
|
|
- imgData.drawText(x, y += height, title)
|
|
|
- for (let i = 0; i < student.subjectiveScoreDetail.length; i++) {
|
|
|
- let detail = student.subjectiveScoreDetail[i]
|
|
|
- //超过最大高度了则另起一列
|
|
|
- if ((y + height + 15) > size.height) {
|
|
|
- y = startY
|
|
|
- x += width
|
|
|
- imgData.drawText(x, y += height, title)
|
|
|
+ //研究生考试模式,按分组显示明细
|
|
|
+ else if (trackMode === '2') {
|
|
|
+ let title = '评卷分组 | 总分 | 评卷员 | 仲裁员'
|
|
|
+ let startY = y
|
|
|
+ let width = title.length * fontSize
|
|
|
+ imgData.drawText(x, y += height, title)
|
|
|
+ //所有小题得分按评卷分组聚合
|
|
|
+ let maxGroupNumber = 0
|
|
|
+ let groups = {}
|
|
|
+ for (let i = 0; i < student.subjectiveScoreDetail.length; i++) {
|
|
|
+ let detail = student.subjectiveScoreDetail[i]
|
|
|
+ let group = groups[detail.groupNumber]
|
|
|
+ if (group == undefined) {
|
|
|
+ group = {
|
|
|
+ number: detail.groupNumber,
|
|
|
+ score: 0,
|
|
|
+ title: {},
|
|
|
+ titleString: [],
|
|
|
+ marker: {},
|
|
|
+ markerString: [],
|
|
|
+ header: {},
|
|
|
+ headerString: []
|
|
|
+ }
|
|
|
+ groups[detail.groupNumber] = group
|
|
|
+ maxGroupNumber = Math.max(maxGroupNumber, group.number)
|
|
|
+ }
|
|
|
+ group.score = group.score + detail.score
|
|
|
+ if (detail.mainTitle && !group.title[detail.mainTitle]) {
|
|
|
+ group.titleString.push(detail.mainTitle)
|
|
|
+ group.title[detail.mainTitle] = true
|
|
|
+ }
|
|
|
+ if (detail.marker && !group.marker[detail.marker]) {
|
|
|
+ group.markerString.push(detail.marker)
|
|
|
+ group.marker[detail.marker] = true
|
|
|
+ }
|
|
|
+ if (detail.header && !group.header[detail.header]) {
|
|
|
+ group.headerString.push(detail.header)
|
|
|
+ group.header[detail.header] = true
|
|
|
+ }
|
|
|
}
|
|
|
- let content = detail.mainNumber + '-' + detail.subNumber + ' : ' + detail.score
|
|
|
- if (showMarker) {
|
|
|
- content = content + ' ' + (detail.marker || detail.markerName || '')
|
|
|
- if (showHeader) {
|
|
|
- content = content + ' ' + (detail.header || '')
|
|
|
+ for (let i = 1; i <= maxGroupNumber; i++) {
|
|
|
+ let group = groups[i]
|
|
|
+ if (group != undefined) {
|
|
|
+ //超过最大高度了则另起一列
|
|
|
+ if ((y + height + 15) > size.height) {
|
|
|
+ y = startY
|
|
|
+ x += width
|
|
|
+ imgData.drawText(x, y += height, title)
|
|
|
+ }
|
|
|
+ let content = group.number + '(' + group.titleString.join(',') + ')' +
|
|
|
+ ' ' + group.score +
|
|
|
+ ' ' + group.markerString.join(',') +
|
|
|
+ ' ' + group.headerString.join(',')
|
|
|
+ width = Math.max(width, content.length * fontSize)
|
|
|
+ imgData.drawText(x, y += height, content)
|
|
|
}
|
|
|
}
|
|
|
- width = Math.max(width, content.length * fontSize)
|
|
|
- imgData.drawText(x, y += height, content)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -168,7 +223,7 @@ class executor extends EventEmitter {
|
|
|
})
|
|
|
}
|
|
|
|
|
|
- async downloadFile(type, append, url, localTemplate, data, dir, index, watermark, showMarker, showHeader) {
|
|
|
+ async downloadFile(type, append, url, localTemplate, data, dir, index, watermark, trackMode) {
|
|
|
data.index = index
|
|
|
let local = path.join(dir, mustache.render(localTemplate, data))
|
|
|
mkdirp.sync(path.dirname(local))
|
|
@@ -193,7 +248,7 @@ class executor extends EventEmitter {
|
|
|
|
|
|
//是否需要添加分数水印
|
|
|
if (watermark) {
|
|
|
- return this.addWatermark(imgData, local, data, index, showMarker, showHeader)
|
|
|
+ return this.addWatermark(imgData, local, data, index, trackMode)
|
|
|
} else {
|
|
|
return new Promise((resolve, reject) => {
|
|
|
fs.writeFile(local, imgData, err => {
|
|
@@ -210,11 +265,13 @@ class executor extends EventEmitter {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- async downloadSheet(dir, template, append, failover, watermark, showMarker, showHeader, params) {
|
|
|
+ async downloadSheet(dir, template, append, failover, watermark, trackMode, params) {
|
|
|
params.upload = true
|
|
|
params.withSheetUrl = true
|
|
|
params.withScoreDetail = watermark === true
|
|
|
params.withMarkTrack = watermark === true
|
|
|
+ params.withGroupScoreTrack = watermark === true && trackMode === '1'
|
|
|
+
|
|
|
try {
|
|
|
let totalCount = await api.countStudents(env.examId, params)
|
|
|
this.emit('total', totalCount)
|
|
@@ -233,7 +290,7 @@ class executor extends EventEmitter {
|
|
|
let student = array[i]
|
|
|
student.examId = env.examId
|
|
|
for (let i = 0; i < student.sheetUrls.length; i++) {
|
|
|
- promises.push(this.downloadFile('sheet', append, student.sheetUrls[i], template, student, dir, i + 1, watermark, showMarker, showHeader))
|
|
|
+ promises.push(this.downloadFile('sheet', append, student.sheetUrls[i], template, student, dir, i + 1, watermark, trackMode))
|
|
|
}
|
|
|
try {
|
|
|
//等待所有图片下载完毕
|