Эх сурвалжийг харах

下载原图时增加续传与是否显示评卷员选择

luoshi 6 жил өмнө
parent
commit
00e3576274

+ 1 - 2
config.json

@@ -12,7 +12,6 @@
     },
     "watermark": {
         "fontFile": "/Users/luoshi/develop/project/stmms-proxy/font/simsun.ttf",
-        "fontSize": 60,
         "color": "#ff0000"
     },
     "logger": {
@@ -45,4 +44,4 @@
             "upyunDomain": ""
         }
     ]
-}
+}

+ 50 - 65
source/lib/image.js

@@ -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)

+ 2 - 2
source/view/image-download.html

@@ -96,9 +96,9 @@
                 $('#popup').show()
             })
             if (config.type == '1') {
-                imageUtil.downloadSheet(config.dir, config.template, config.watermark)
+                imageUtil.downloadSheet(config.dir, config.template, config.append, config.watermark, config.showMarker)
             } else {
-                imageUtil.downloadPackage(config.dir, config.template)
+                imageUtil.downloadPackage(config.dir, config.template, config.append)
             }
         })
     </script>

+ 34 - 1
source/view/image.html

@@ -46,6 +46,15 @@
                         <th>图片转存规则:</th>
                         <td><input id="template-input" type="text" style="width: 600px" /></td>
                     </tr>
+                    <tr id="append-select">
+                        <th>是否续传:</th>
+                        <td>
+                            <div class="input-radio">
+                                <label><input type="radio" name="append" value="1"><span></span><em>是</em></label>
+                                <label><input type="radio" name="append" value="2"><span></span><em>否</em></label>
+                            </div>
+                        </td>
+                    </tr>
                     <tr id="watermark-select" style="display: none">
                         <th>添加分数水印:</th>
                         <td>
@@ -55,6 +64,15 @@
                             </div>
                         </td>
                     </tr>
+                    <tr id="marker-select" style="display: none">
+                        <th>显示评卷员:</th>
+                        <td>
+                            <div class="input-radio">
+                                <label><input type="radio" name="showMarker" value="1"><span></span><em>是</em></label>
+                                <label><input type="radio" name="showMarker" value="2"><span></span><em>否</em></label>
+                            </div>
+                        </td>
+                    </tr>
                     <tr id="message-tr" style="display: none">
                         <th></th>
                         <td>
@@ -95,13 +113,16 @@
                     $('#message-text').html('范例: ' + config.imageUrl.sheet)
                     $('#message-tr').show()
                     $('#watermark-select').show()
+                    $('#marker-select').show()
                 } else if (type == '2') {
                     $('#message-text').html('范例: ' + config.imageUrl.package)
                     $('#message-tr').show()
                     $('#watermark-select').hide()
+                    $('#marker-select').hide()
                 } else {
                     $('#message-tr').hide()
                     $('#watermark-select').hide()
+                    $('#marker-select').hide()
                 }
             })
 
@@ -116,7 +137,9 @@
 
             $('#run-button').click(() => {
                 let type = $('input:radio[name="type"]:checked').val()
+                let append = $('input:radio[name="append"]:checked').val()
                 let watermark = $('input:radio[name="watermark"]:checked').val()
+                let showMarker = $('input:radio[name="showMarker"]:checked').val()
                 let template = $('#template-input').val()
                 let dir = $('#path-text').val()
                 if (type == undefined || type == '') {
@@ -131,15 +154,25 @@
                     alert('请选择图片转存目录')
                     return false
                 }
+                if (append == undefined || append == '') {
+                    alert('请选择是否续传')
+                    return false
+                }
                 if (type == '1' && (watermark == undefined || watermark == '')) {
                     alert('请选择是否添加分数水印')
                     return false
                 }
+                if (type == '1' && (showMarker == undefined || showMarker == '')) {
+                    alert('请选择是否显示评卷员')
+                    return false
+                }
                 window.localStorage.setItem('image-config', JSON.stringify({
                     type: type,
                     template: template.trim(),
                     dir: dir.trim(),
-                    watermark: watermark == '1'
+                    append: append == '1',
+                    watermark: watermark == '1',
+                    showMarker: showMarker == '1'
                 }))
                 window.location.href = 'image-download.html'
             })