Bläddra i källkod

图片下载区分普通模式和研究生模式;研究生模式采用不同的主观题水印样式

luoshi 4 år sedan
förälder
incheckning
b03320fab1
5 ändrade filer med 108 tillägg och 67 borttagningar
  1. 3 3
      config.json
  2. 84 27
      source/lib/image.js
  3. 5 1
      source/main.js
  4. 4 4
      source/view/image-download.html
  5. 12 32
      source/view/image.html

+ 3 - 3
config.json

@@ -20,12 +20,12 @@
     "openDevTools": false,
     "servers": [
         {
-            "name": "分题线上",
+            "name": "线上环境",
             "host": "https://ft.markingcloud.com"
         },
         {
-            "name": "测试环境",
-            "host": "http://hsyw.markingcloud.com"
+            "name": "线下环境",
+            "host": "http://192.168.10.120:8080"
         }
     ]
 }

+ 84 - 27
source/lib/image.js

@@ -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 {
                         //等待所有图片下载完毕

+ 5 - 1
source/main.js

@@ -1,5 +1,8 @@
 // Modules to control application life and create native browser window
-const { app, BrowserWindow } = require('electron')
+const {
+    app,
+    BrowserWindow
+} = require('electron')
 const config = require('./lib/config.js')
 
 // Keep a global reference of the window object, if you don't, the window will
@@ -15,6 +18,7 @@ function createWindow() {
         height: 720,
         resizable: false,
         webPreferences: {
+            enableRemoteModule: true,
             nodeIntegration: true,
             nodeIntegrationInWorker: true
         }

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

@@ -90,10 +90,10 @@
             })
             if (config.type == '1') {
                 imageUtil.downloadSheet(config.dir, config.template, config.append, config.failover, config
-                    .watermark, config.showMarker, config.showHeader, {
-                        examNumberIn: config.examNumber,
-                        subjectCode: config.subjectCode
-                    })
+                    .watermark, config.trackMode, {
+                    examNumberIn: config.examNumber,
+                    subjectCode: config.subjectCode
+                })
             } else {
                 imageUtil.downloadPackage(config.dir, config.template, config.append, config.failover)
             }

+ 12 - 32
source/view/image.html

@@ -71,21 +71,12 @@
                             </div>
                         </td>
                     </tr>
-                    <tr id="marker-select" style="display: none">
-                        <th>显示评卷员:</th>
+                    <tr id="track-mode-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="header-select" style="display: none">
-                        <th>显示复核人:</th>
-                        <td>
-                            <div class="input-radio">
-                                <label><input type="radio" name="showHeader" value="1"><span></span><em>是</em></label>
-                                <label><input type="radio" name="showHeader" value="2"><span></span><em>否</em></label>
+                                <label><input type="radio" name="trackMode" value="1"><span></span><em>普通</em></label>
+                                <label><input type="radio" name="trackMode" value="2"><span></span><em>研究生</em></label>
                             </div>
                         </td>
                     </tr>
@@ -119,9 +110,7 @@
         const $ = require('jquery')
         const env = require('../lib/env.js')
         const config = require('../lib/config.js')
-        const {
-            dialog
-        } = require('electron').remote
+        const { dialog } = require('electron').remote
 
         $(document).ready(() => {
             env.merge(JSON.parse(window.localStorage.getItem('env')))
@@ -133,23 +122,20 @@
                     $('#message-text').html('转存规则范例: ' + config.imageUrl.sheet)
                     $('#message-tr').show()
                     $('#watermark-select').show()
-                    $('#marker-select').show()
-                    $('#header-select').show()
+                    $('#track-mode-select').show()
                     $('#subjectCode-select').show()
                     $('#campusName-select').show()
                 } else if (type == '2') {
                     $('#message-text').html('转存规则范例: ' + config.imageUrl.package)
                     $('#message-tr').show()
                     $('#watermark-select').hide()
-                    $('#marker-select').hide()
-                    $('#header-select').hide()
+                    $('#track-mode-select').hide()
                     $('#examNumber-select').hide()
                     $('#subjectCode-select').hide()
                 } else {
                     $('#message-tr').hide()
                     $('#watermark-select').hide()
-                    $('#marker-select').hide()
-                    $('#header-select').hide()
+                    $('#track-mode-select').hide()
                     $('#examNumber-select').hide()
                     $('#subjectCode-select').hide()
                 }
@@ -171,8 +157,7 @@
                 let append = $('input:radio[name="append"]:checked').val()
                 let exceptionHandle = $('input:radio[name="exception"]:checked').val()
                 let watermark = $('input:radio[name="watermark"]:checked').val()
-                let showMarker = $('input:radio[name="showMarker"]:checked').val()
-                let showHeader = $('input:radio[name="showHeader"]:checked').val()
+                let trackMode = $('input:radio[name="trackMode"]:checked').val()
                 let examNumber = $('#examNumber-input').val()
                 let subjectCode = $('#subjectCode-input').val()
                 let template = $('#template-input').val()
@@ -197,12 +182,8 @@
                     alert('请选择异常处理方法')
                     return false
                 }
-                if (type == '1' && (watermark == undefined || watermark == '')) {
-                    alert('请选择是否添加分数水印')
-                    return false
-                }
-                if (type == '1' && (showMarker == undefined || showMarker == '')) {
-                    alert('请选择是否显示评卷员')
+                if (type == '1' && (trackMode == undefined || trackMode == '')) {
+                    alert('请选择水印模式')
                     return false
                 }
                 window.localStorage.setItem('image-config', JSON.stringify({
@@ -212,8 +193,7 @@
                     append: append == '1',
                     failover: exceptionHandle == '1',
                     watermark: watermark == '1',
-                    showMarker: showMarker == '1',
-                    showHeader: showHeader == '1',
+                    trackMode: trackMode,
                     examNumber: examNumber,
                     subjectCode: subjectCode
                 }))