|
@@ -38,8 +38,7 @@ class executor extends EventEmitter {
|
|
|
})
|
|
|
}
|
|
|
|
|
|
- async addWatermark(image, file, student, index) {
|
|
|
- let fontSize = config.watermark.fontSize
|
|
|
+ async addWatermark(image, file, student, index, showMarker) {
|
|
|
let fontFile = config.watermark.fontFile
|
|
|
let color = config.watermark.color
|
|
|
let imgData = gm(image)
|
|
@@ -85,20 +84,26 @@ class executor extends EventEmitter {
|
|
|
}
|
|
|
//显示主观题明细
|
|
|
if (student.subjectiveScoreDetail && student.subjectiveScoreDetail.length > 0) {
|
|
|
+ let title = '主观题号 | 分数'
|
|
|
+ if (showMarker) {
|
|
|
+ title += ' | 评卷员'
|
|
|
+ }
|
|
|
let startY = y
|
|
|
- imgData.drawText(x, y += height, '题号 | 分数')
|
|
|
+ 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 += 300
|
|
|
- imgData.drawText(x, y += height, '题号 | 分数')
|
|
|
+ x += width
|
|
|
+ imgData.drawText(x, y += height, title)
|
|
|
}
|
|
|
let content = detail.mainNumber + '-' + detail.subNumber + ' : ' + detail.score
|
|
|
- if (detail.marker != undefined) {
|
|
|
- content = content + ' ' + detail.marker.join(',')
|
|
|
+ if (showMarker && detail.marker != undefined) {
|
|
|
+ content = content + ' ' + detail.marker
|
|
|
}
|
|
|
+ width = Math.max(width, content.length * fontSize)
|
|
|
imgData.drawText(x, y += height, content)
|
|
|
}
|
|
|
}
|
|
@@ -131,51 +136,47 @@ class executor extends EventEmitter {
|
|
|
})
|
|
|
}
|
|
|
|
|
|
- async downloadFile(remoteTemplate, localTemplate, data, dir, client, bucket, index, watermark) {
|
|
|
+ async downloadFile(append, remoteTemplate, localTemplate, data, dir, client, bucket, index, watermark, showMarker) {
|
|
|
data.index = index
|
|
|
let remote = mustache.render(remoteTemplate, data)
|
|
|
let local = path.join(dir, mustache.render(localTemplate, data))
|
|
|
mkdirp.sync(path.dirname(local))
|
|
|
|
|
|
- let imgData
|
|
|
- if (config.localStore != undefined && config.localStore.length > 0) {
|
|
|
- let cache = path.join(config.localStore, bucket, remote)
|
|
|
- if (fs.existsSync(cache)) {
|
|
|
- imgData = fs.readFileSync(cache)
|
|
|
+ //续传模式下,判断目标文件是否存在,存在则直接跳过
|
|
|
+ if (append && fs.existsSync(local)) {
|
|
|
+ return Promise.resolve()
|
|
|
+ } else {
|
|
|
+ let imgData
|
|
|
+ if (config.localStore != undefined && config.localStore.length > 0) {
|
|
|
+ let cache = path.join(config.localStore, bucket, remote)
|
|
|
+ if (fs.existsSync(cache)) {
|
|
|
+ imgData = fs.readFileSync(cache)
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
- if (imgData == undefined) {
|
|
|
- try {
|
|
|
- imgData = await client.download(remote)
|
|
|
- } catch (err) {
|
|
|
- if (err.code === 404) {
|
|
|
- //文件不存在,记录日志并跳过
|
|
|
- downloadLogger.error('404 ' + bucket + ' ' + remote)
|
|
|
- return Promise.resolve()
|
|
|
- } else {
|
|
|
- logger.error(err)
|
|
|
- return Promise.reject(err)
|
|
|
+ if (imgData == undefined) {
|
|
|
+ try {
|
|
|
+ imgData = await client.download(remote)
|
|
|
+ } catch (err) {
|
|
|
+ if (err.code === 404) {
|
|
|
+ //文件不存在,记录日志并跳过
|
|
|
+ downloadLogger.error('404 ' + bucket + ' ' + remote)
|
|
|
+ return Promise.resolve()
|
|
|
+ } else {
|
|
|
+ logger.error(err)
|
|
|
+ return Promise.reject(err)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- //是否需要添加分数水印
|
|
|
- if (watermark) {
|
|
|
- await this.addWatermark(imgData, local, data, index)
|
|
|
- } else {
|
|
|
- await fs.writeFileSync(local, imgData)
|
|
|
+ //是否需要添加分数水印
|
|
|
+ if (watermark) {
|
|
|
+ await this.addWatermark(imgData, local, data, index, showMarker)
|
|
|
+ } else {
|
|
|
+ await fs.writeFileSync(local, imgData)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- async downloadSheet(dir, template, watermark) {
|
|
|
- //从文件中读取已成功下载的准考证号列表
|
|
|
- let doneFile = path.join(__dirname, '../../logs/sheet.log')
|
|
|
- let finish = await this.readFile(doneFile)
|
|
|
- //logger.info(finish)
|
|
|
- let success = {}
|
|
|
- for (let i = 0; i < finish.length; i++) {
|
|
|
- success[finish[i]] = true
|
|
|
- }
|
|
|
-
|
|
|
+ async downloadSheet(dir, template, append, watermark, showMarker) {
|
|
|
let bucket = env.server.bucketPrefix + '-sheet'
|
|
|
let client = upyun(bucket, config.upyun.operator, config.upyun.password)
|
|
|
if (env.server.upyunDomain && env.server.upyunDomain != '') {
|
|
@@ -200,41 +201,25 @@ class executor extends EventEmitter {
|
|
|
for (let i = 0; i < array.length; i++) {
|
|
|
let promises = []
|
|
|
let student = array[i]
|
|
|
- let examNumber = student['examNumber']
|
|
|
- if (success[examNumber]) {
|
|
|
- //在已完成列表中则跳过,不用重复下载
|
|
|
- } else {
|
|
|
- student.examId = env.examId
|
|
|
- for (let i = 1; i <= student.sheetCount; i++) {
|
|
|
- promises.push(this.downloadFile(config.imageUrl.sheet, template, student, dir, client, bucket, i, watermark))
|
|
|
- }
|
|
|
- //等待所有图片下载完毕
|
|
|
- await Promise.all(promises)
|
|
|
-
|
|
|
- //finish.push(examNumber)
|
|
|
- success[examNumber] = true
|
|
|
-
|
|
|
- //实时回写到记录文件中去
|
|
|
- fs.appendFileSync(doneFile, examNumber + '\r\n')
|
|
|
+ student.examId = env.examId
|
|
|
+ for (let i = 1; i <= student.sheetCount; i++) {
|
|
|
+ promises.push(this.downloadFile(append, config.imageUrl.sheet, template, student, dir, client, bucket, i, watermark, showMarker))
|
|
|
}
|
|
|
+ //等待所有图片下载完毕
|
|
|
+ await Promise.all(promises)
|
|
|
+
|
|
|
count++
|
|
|
this.emit('count', count)
|
|
|
-
|
|
|
- //实时回写到记录文件中去
|
|
|
- //fs.writeFileSync(doneFile, finish.join('\r\n'))
|
|
|
}
|
|
|
}
|
|
|
this.emit('finish')
|
|
|
} catch (error) {
|
|
|
logger.error('download sheet error:' + error)
|
|
|
this.emit('error', error)
|
|
|
- } finally {
|
|
|
- //回写到记录文件中去
|
|
|
- //fs.writeFileSync(doneFile, finish.join('\r\n'))
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- async downloadPackage(dir, template) {
|
|
|
+ async downloadPackage(dir, template, append) {
|
|
|
let bucket = env.server.bucketPrefix + '-package'
|
|
|
let client = upyun(bucket, config.upyun.operator, config.upyun.password)
|
|
|
if (env.server.upyunDomain && env.server.upyunDomain != '') {
|
|
@@ -251,7 +236,7 @@ class executor extends EventEmitter {
|
|
|
p.examId = env.examId
|
|
|
for (let i = 1; i <= p.picCount; i++) {
|
|
|
p.index = i
|
|
|
- await this.downloadFile(config.imageUrl.package, template, p, dir, client, bucket)
|
|
|
+ await this.downloadFile(append, config.imageUrl.package, template, p, dir, client, bucket)
|
|
|
}
|
|
|
count++
|
|
|
this.emit('count', count)
|