xiatian 2 years ago
parent
commit
41fee5c50c

+ 4 - 0
shell/11-考生评卷点数据导出.bat

@@ -0,0 +1,4 @@
+
+call java -server -Xms512m -Xmx512m -jar tools.jar --scan.tool.stop=true --scan.tool.taskType=SLICE_DATA_EXPORT
+
+pause

+ 8 - 0
src/main/java/cn/com/qmth/scancloud/tools/config/SysProperty.java

@@ -47,6 +47,9 @@ public class SysProperty {
     
     //场次,上半年为1,下半年为2
     public static String YEAR_HALF;
+    
+    //评卷点数据
+    public static String MARKING_PLACE;
 
     @Value("${scan.server.url}")
     public void scanServerUrl(String scanServerUrl) {
@@ -118,4 +121,9 @@ public class SysProperty {
         YEAR_HALF = yearHalf;
     }
     
+    @Value("${scan.tool.marking-place}")
+    public void markingPlace(String markingPlace) {
+        MARKING_PLACE = markingPlace;
+    }
+    
 }

+ 1 - 0
src/main/java/cn/com/qmth/scancloud/tools/config/TaskConfig.java

@@ -15,6 +15,7 @@ public class TaskConfig {
         log.info("scan.server.url={}", SysProperty.SCAN_SERVER_URL);
         log.info("scan.tool.dataDir={}", SysProperty.DATA_DIR);
         log.info("scan.tool.dataFile={}", SysProperty.DATA_FILE);
+        log.info("scan.tool.marking-place={}", SysProperty.MARKING_PLACE);
         log.info("scan.tool.taskType={}", SysProperty.TASK_TYPE);
         log.info("scan.tool.schoolId={}", SysProperty.SCHOOL_ID);
         log.info("scan.tool.schoolName={}", SysProperty.SCHOOL_NAME);

+ 12 - 2
src/main/java/cn/com/qmth/scancloud/tools/enums/TaskType.java

@@ -1,6 +1,16 @@
 package cn.com.qmth.scancloud.tools.enums;
 
-import cn.com.qmth.scancloud.tools.service.impl.*;
+import cn.com.qmth.scancloud.tools.service.impl.AbsentImportTask;
+import cn.com.qmth.scancloud.tools.service.impl.CourseImportTask;
+import cn.com.qmth.scancloud.tools.service.impl.ExamImportTask;
+import cn.com.qmth.scancloud.tools.service.impl.ExamStudentCleanTask;
+import cn.com.qmth.scancloud.tools.service.impl.ExamStudentCountTask;
+import cn.com.qmth.scancloud.tools.service.impl.ExamStudentImportTask;
+import cn.com.qmth.scancloud.tools.service.impl.ExcelToTxtTask;
+import cn.com.qmth.scancloud.tools.service.impl.ObjectiveQuestionExportTask;
+import cn.com.qmth.scancloud.tools.service.impl.ScanImageCheckTask;
+import cn.com.qmth.scancloud.tools.service.impl.SliceDataExportTask;
+import cn.com.qmth.scancloud.tools.service.impl.UserImportTask;
 
 public enum TaskType {
 
@@ -24,7 +34,7 @@ public enum TaskType {
     
     ABSENT_IMPORT("缺考导入", AbsentImportTask.class),
     
-    
+    SLICE_DATA_EXPORT("评卷点数据导出", SliceDataExportTask.class),
     ;
 
     private String title;

+ 35 - 0
src/main/java/cn/com/qmth/scancloud/tools/model/CetMarking.java

@@ -0,0 +1,35 @@
+package cn.com.qmth.scancloud.tools.model;
+
+public class CetMarking {
+
+    private String paperType;
+
+    private String oddNumber;
+
+    private String evenNumber;
+
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
+    public String getOddNumber() {
+        return oddNumber;
+    }
+
+    public void setOddNumber(String oddNumber) {
+        this.oddNumber = oddNumber;
+    }
+
+    public String getEvenNumber() {
+        return evenNumber;
+    }
+
+    public void setEvenNumber(String evenNumber) {
+        this.evenNumber = evenNumber;
+    }
+
+}

+ 67 - 0
src/main/java/cn/com/qmth/scancloud/tools/model/ExportCetMarkingVo.java

@@ -0,0 +1,67 @@
+package cn.com.qmth.scancloud.tools.model;
+
+import java.util.List;
+
+public class ExportCetMarkingVo {
+
+    private Long id;
+
+    private String examNumber;
+
+    private Long examId;
+
+    private Integer cardNumber;
+
+    private String paperType;
+
+    private List<String> sliceImageInfo;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getExamNumber() {
+        return examNumber;
+    }
+
+    public void setExamNumber(String examNumber) {
+        this.examNumber = examNumber;
+    }
+
+    public List<String> getSliceImageInfo() {
+        return sliceImageInfo;
+    }
+
+    public void setSliceImageInfo(List<String> sliceImageInfo) {
+        this.sliceImageInfo = sliceImageInfo;
+    }
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public Integer getCardNumber() {
+        return cardNumber;
+    }
+
+    public void setCardNumber(Integer cardNumber) {
+        this.cardNumber = cardNumber;
+    }
+
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
+}

+ 1 - 1
src/main/java/cn/com/qmth/scancloud/tools/service/impl/AbsentImportTask.java

@@ -33,7 +33,7 @@ public class AbsentImportTask extends AbstractTask {
     private static Pattern examNumberRex = Pattern.compile("^[0-9]{15}$");
     @Override
     protected String getTaskName() {
-        return TaskType.EXAM_STUDENT_IMPORT.getTitle();
+        return TaskType.ABSENT_IMPORT.getTitle();
     }
 
     @Override

+ 1 - 1
src/main/java/cn/com/qmth/scancloud/tools/service/impl/ObjectiveQuestionExportTask.java

@@ -21,7 +21,7 @@ import java.util.List;
 import java.util.Map;
 
 /**
- * 考生打包文件和扫描结果导出
+ * 考生扫描结果导出
  */
 public class ObjectiveQuestionExportTask extends AbstractTask {
 

+ 175 - 0
src/main/java/cn/com/qmth/scancloud/tools/service/impl/SliceDataExportTask.java

@@ -0,0 +1,175 @@
+package cn.com.qmth.scancloud.tools.service.impl;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.databind.JsonNode;
+
+import cn.com.qmth.scancloud.tools.config.SysProperty;
+import cn.com.qmth.scancloud.tools.enums.TaskType;
+import cn.com.qmth.scancloud.tools.model.CetMarking;
+import cn.com.qmth.scancloud.tools.model.ExportCetMarkingVo;
+import cn.com.qmth.scancloud.tools.service.AbstractTask;
+import cn.com.qmth.scancloud.tools.utils.FileHelper;
+import cn.com.qmth.scancloud.tools.utils.HttpHelper;
+import cn.com.qmth.scancloud.tools.utils.JsonHelper;
+import cn.com.qmth.scancloud.tools.utils.StatusException;
+
+/**
+ * 考生打包文件导出
+ */
+public class SliceDataExportTask extends AbstractTask {
+
+    private static final Logger log = LoggerFactory.getLogger(SliceDataExportTask.class);
+
+    @Override
+    protected String getTaskName() {
+        return TaskType.SLICE_DATA_EXPORT.getTitle();
+    }
+
+    @Override
+    protected void execute() {
+        Long examId = SysProperty.EXAM_ID;
+        if (examId == null) {
+            throw new StatusException("【scan.tool.examId】未配置!");
+        }
+
+        // 查询参数:{"examId":null,"subjectCode":"","examNumber":"","name":"","studentCode":"","packageCode":"",
+        // "seatNumber":"","campusName":"","examSite":"","examRoom":""}
+        Map<String, Object> params = JsonHelper.toMap(SysProperty.MORE_PARAMS, Object.class);
+        if (params == null) {
+            params = new HashMap<>();
+        }
+        params.put("examId", examId);
+
+        String url = SysProperty.SCAN_SERVER_URL + "/api/tool/exam/student/count";
+        String json = JsonHelper.toJson(params);
+        String result = HttpHelper.post(url, json);
+        log.info("查询考生参数:{},结果:{}", json, result);
+
+        int total = 0;
+        JsonNode props = JsonHelper.getNode(result);
+        if (props != null && props.has("count")) {
+            total = props.get("count").asInt();
+        }
+        if (total == 0) {
+            log.warn("未查询到相关考生!");
+            return;
+        }
+        Map<String, CetMarking> cms = readCetMarking();
+        // 分批处理
+        String filePath = String.format("%s/export-slice-data.txt", SysProperty.DATA_DIR);
+        String queryUrl = SysProperty.SCAN_SERVER_URL + "/api/tool/export/cet/marking";
+        params.put("pageSize", 100);
+        int pageNumber = 0;
+        int sum = 0;
+
+        while (true) {
+            params.put("pageNumber", ++pageNumber);
+            String queryJson = JsonHelper.toJson(params);
+            String queryResult = HttpHelper.post(queryUrl, queryJson);
+
+            List<ExportCetMarkingVo> list = JsonHelper.toList(queryResult, ExportCetMarkingVo.class);
+            if (CollectionUtils.isEmpty(list)) {
+                break;
+            }
+
+            this.export(list, filePath, cms);
+
+            sum += list.size();
+            float rate = sum * 100f / total;
+            log.info("已处理数:{} 进度:{}%", sum, rate);
+        }
+
+        log.info("导出文件:" + filePath);
+    }
+
+    private void export(List<ExportCetMarkingVo> list, String filePath, Map<String, CetMarking> cms) {
+        String template = "%s,%s,%s";
+
+        List<String> lines = new ArrayList<>();
+        for (ExportCetMarkingVo data : list) {
+            int subjectCode = Integer.valueOf(data.getExamNumber().substring(9, 10));
+            String markingCode;
+            if (subjectCode >= 3 && subjectCode <= 9) {
+                markingCode = "88";
+            }else {
+                int site = Integer.valueOf(data.getExamNumber().substring(10, 13));
+                if(site%2==0) {
+                    markingCode=cms.get(data.getPaperType()).getEvenNumber();
+                }else {
+                    markingCode=cms.get(data.getPaperType()).getOddNumber();
+                }
+            }
+            lines.add(String.format(template, data.getExamNumber(), markingCode,
+                    StringUtils.join(data.getSliceImageInfo(), ";")));
+        }
+
+        File file = new File(filePath);
+        if (file.exists()) {
+            file.delete();
+        }
+        FileHelper.writeLines(file, lines, true);
+    }
+
+    private Map<String, CetMarking> readCetMarking() {
+        if (StringUtils.isBlank(SysProperty.MARKING_PLACE)) {
+            throw new StatusException("【scan.tool.marking-place】未配置!");
+        }
+        File file = new File(SysProperty.MARKING_PLACE);
+        if (!file.exists()) {
+            throw new StatusException("文件不存在:" + SysProperty.MARKING_PLACE);
+        }
+        List<CetMarking> list = new ArrayList<CetMarking>();
+        XSSFWorkbook wb = null;
+        try {
+            wb = new XSSFWorkbook(SysProperty.MARKING_PLACE);
+            XSSFSheet sheet = wb.getSheetAt(0);
+            int rows = sheet.getLastRowNum();
+            for (int i = 1; i <= rows; i++) {
+                CetMarking cm = new CetMarking();
+                list.add(cm);
+                XSSFRow row = sheet.getRow(i);
+                if (StringUtils.isBlank(row.getCell(3).getStringCellValue())
+                        || StringUtils.isBlank(row.getCell(5).getStringCellValue())
+                        || StringUtils.isBlank(row.getCell(6).getStringCellValue())) {
+                    throw new StatusException("评卷点文件中第" + (i + 1) + "行,条形码值、奇数考场评卷点代码、偶数考场评卷点代码都不能为空");
+                }
+                cm.setPaperType(row.getCell(3).getStringCellValue());
+                cm.setOddNumber(row.getCell(5).getStringCellValue());
+                cm.setEvenNumber(row.getCell(7).getStringCellValue());
+            }
+        } catch (IOException e) {
+            log.error("系统错误", e);
+            throw new StatusException("系统错误");
+        } finally {
+            if (wb != null) {
+                try {
+                    wb.close();
+                } catch (IOException e) {
+                }
+            }
+        }
+        if (list.size() == 0) {
+            throw new StatusException("文件内容为空:" + SysProperty.MARKING_PLACE);
+        }
+        Map<String, CetMarking> map = list.stream()
+                .collect(Collectors.toMap(CetMarking::getPaperType, c -> c, (key1, key2) -> key2));
+
+        return map;
+    }
+
+}

+ 1 - 0
src/main/resources/application.properties

@@ -17,6 +17,7 @@ scan.tool.more-params=
 scan.tool.template.columns=
 
 #############params config###############
+scan.tool.marking-place=${scan.tool.data-dir}/marking-place.xlsx
 scan.tool.template.separator=,
 scan.tool.school-id=1
 scan.tool.school-name=\u5b66\u68211