xiaofei 1 rok pred
rodič
commit
2512d6b09f
16 zmenil súbory, kde vykonal 716 pridanie a 144 odobranie
  1. 26 5
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java
  2. 11 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/answercard/AnswerArea.java
  3. 86 6
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/answercard/CardFile.java
  4. 87 5
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/answercard/CardPage.java
  5. 33 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/answercard/CheckArea.java
  6. 54 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/answercard/Extension.java
  7. 27 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/answercard/FieldArea.java
  8. 55 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/answercard/FillLocator.java
  9. 9 6
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/answercard/Locator.java
  10. 45 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/answercard/MarkConfig.java
  11. 128 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/answercard/MarkConfigItem.java
  12. 18 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkManageDto.java
  13. 93 85
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkTaskServiceImpl.java
  14. 19 19
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/ScanAnswerCardServiceImpl.java
  15. 2 2
      teachcloud-mark/src/main/resources/mapper/MarkStudentMapper.xml
  16. 23 16
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/service/impl/PrintFinishServiceImpl.java

+ 26 - 5
teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

@@ -1162,18 +1162,39 @@ public class SystemConstant {
         return file;
     }
 
+    /**
+     * 生成文件
+     *
+     * @param url   文件路径+文件名称
+     * @param bytes 要生成的文件内容
+     */
+    public static File createJsonFile(String url, byte[] bytes) {
+        File file = new File(url);
+        try {
+            if (!file.exists()) {
+                file.getParentFile().mkdirs();
+                file.createNewFile();
+            }
+            IOUtils.write(bytes, new FileOutputStream(file));
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+        }
+        return file;
+    }
+
     /**
      * 实现首字母大写
+     *
      * @param str str
      * @return 首字母大写
      */
-    public static String initCap(String str){
-        if (str == null || "".equals(str)){
+    public static String initCap(String str) {
+        if (str == null || "".equals(str)) {
             return str;
-        }else if (str.length() == 1){
+        } else if (str.length() == 1) {
             return str.toUpperCase();
-        }else {
-            return str.substring(0,1).toUpperCase() + str.substring(1);
+        } else {
+            return str.substring(0, 1).toUpperCase() + str.substring(1);
         }
     }
 

+ 11 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/answercard/AnswerArea.java

@@ -9,6 +9,9 @@ public class AnswerArea {
     @JsonProperty("main_number")
     private Integer mainNumber;
 
+    @JsonProperty("sub_number")
+    private String subNumber;
+
     private double[] area;
 
     public Integer getMainNumber() {
@@ -19,6 +22,14 @@ public class AnswerArea {
         this.mainNumber = mainNumber;
     }
 
+    public String getSubNumber() {
+        return subNumber;
+    }
+
+    public void setSubNumber(String subNumber) {
+        this.subNumber = subNumber;
+    }
+
     public double[] getArea() {
         return area;
     }

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 86 - 6
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/answercard/CardFile.java


+ 87 - 5
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/answercard/CardPage.java

@@ -3,6 +3,7 @@ package com.qmth.teachcloud.mark.bean.answercard;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.annotation.JsonProperty;
 
+import java.util.Collections;
 import java.util.List;
 
 @JsonIgnoreProperties(ignoreUnknown = true)
@@ -17,16 +18,35 @@ public class CardPage {
     @JsonProperty("page_image")
     private String pageImage;
 
+    @JsonProperty("locator")
     private Locator locator;
 
+    @JsonProperty("fill_locator")
+    private List<FillLocator> fillLocator = Collections.emptyList();
+
+    @JsonProperty("check_area")
+    private CheckArea checkArea = new CheckArea();
+
     @JsonProperty("info_area")
-    private double[][] infoArea;
+    private List<double[]> infoArea = Collections.emptyList();
 
     @JsonProperty("answer_area")
-    private List<AnswerArea> answerArea;
+    private List<AnswerArea> answerArea=Collections.emptyList();
+
+    @JsonProperty("barcode")
+    private List<FieldArea> barcode = Collections.emptyList();
+
+    @JsonProperty("qrcode")
+    private List<FieldArea> qrcode = Collections.emptyList();
 
     @JsonProperty("fill_area")
-    private List<FillArea> fillArea;
+    private List<FillArea> fillArea = Collections.emptyList();
+
+    @JsonProperty("ocr_area")
+    private List<FieldArea> ocrArea = Collections.emptyList();
+
+    @JsonProperty("extension")
+    private Extension extension = new Extension();
 
     public int getCardType() {
         return cardType;
@@ -60,11 +80,11 @@ public class CardPage {
         this.locator = locator;
     }
 
-    public double[][] getInfoArea() {
+    public List<double[]> getInfoArea() {
         return infoArea;
     }
 
-    public void setInfoArea(double[][] infoArea) {
+    public void setInfoArea(List<double[]> infoArea) {
         this.infoArea = infoArea;
     }
 
@@ -83,4 +103,66 @@ public class CardPage {
     public void setFillArea(List<FillArea> fillArea) {
         this.fillArea = fillArea;
     }
+
+    public List<FillLocator> getFillLocator() {
+        return fillLocator;
+    }
+
+    public void setFillLocator(List<FillLocator> fillLocator) {
+        this.fillLocator = fillLocator;
+    }
+
+    public CheckArea getCheckArea() {
+        return checkArea;
+    }
+
+    public void setCheckArea(CheckArea checkArea) {
+        this.checkArea = checkArea;
+    }
+
+    public List<FieldArea> getBarcode() {
+        return barcode;
+    }
+
+    public void setBarcode(List<FieldArea> barcode) {
+        this.barcode = barcode;
+    }
+
+    public List<FieldArea> getQrcode() {
+        return qrcode;
+    }
+
+    public void setQrcode(List<FieldArea> qrcode) {
+        this.qrcode = qrcode;
+    }
+
+    public List<FieldArea> getOcrArea() {
+        return ocrArea;
+    }
+
+    public void setOcrArea(List<FieldArea> ocrArea) {
+        this.ocrArea = ocrArea;
+    }
+
+    public Extension getExtension() {
+        return extension;
+    }
+
+    public void setExtension(Extension extension) {
+        this.extension = extension;
+    }
+
+    /**
+     * 输出到文件前,进行必要的字段值转换与处理
+     */
+    public void format() {
+        //默认题卡类型
+        if (cardType < 1 || cardType > 3) {
+            cardType = 2;
+        }
+        //图片内容留空
+        pageImage = "";
+        //主观题答题区清空,避免影响遮盖模式
+        answerArea.clear();
+    }
 }

+ 33 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/answercard/CheckArea.java

@@ -0,0 +1,33 @@
+package com.qmth.teachcloud.mark.bean.answercard;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.Collections;
+import java.util.List;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class CheckArea {
+
+    @JsonProperty("black_line")
+    private List<double[]> blackLine = Collections.emptyList();
+
+    @JsonProperty("white_line")
+    private List<double[]> whiteLine = Collections.emptyList();
+
+    public List<double[]> getBlackLine() {
+        return blackLine;
+    }
+
+    public void setBlackLine(List<double[]> blackLine) {
+        this.blackLine = blackLine;
+    }
+
+    public List<double[]> getWhiteLine() {
+        return whiteLine;
+    }
+
+    public void setWhiteLine(List<double[]> whiteLine) {
+        this.whiteLine = whiteLine;
+    }
+}

+ 54 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/answercard/Extension.java

@@ -0,0 +1,54 @@
+package com.qmth.teachcloud.mark.bean.answercard;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.Collections;
+import java.util.List;
+
+public class Extension {
+
+    @JsonProperty("barcode")
+    private List<FieldArea> barcode = Collections.emptyList();
+
+    @JsonProperty("qrcode")
+    private List<FieldArea> qrcode = Collections.emptyList();
+
+    @JsonProperty("fill_area")
+    private List<FillArea> fillArea = Collections.emptyList();
+
+    @JsonProperty("ocr_area")
+    private List<FieldArea> ocrArea = Collections.emptyList();
+
+    public List<FieldArea> getBarcode() {
+        return barcode;
+    }
+
+    public void setBarcode(List<FieldArea> barcode) {
+        this.barcode = barcode;
+    }
+
+    public List<FieldArea> getQrcode() {
+        return qrcode;
+    }
+
+    public void setQrcode(List<FieldArea> qrcode) {
+        this.qrcode = qrcode;
+    }
+
+    public List<FillArea> getFillArea() {
+        return fillArea;
+    }
+
+    public void setFillArea(List<FillArea> fillArea) {
+        this.fillArea = fillArea;
+    }
+
+    public List<FieldArea> getOcrArea() {
+        return ocrArea;
+    }
+
+    public void setOcrArea(List<FieldArea> ocrArea) {
+        this.ocrArea = ocrArea;
+    }
+
+}

+ 27 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/answercard/FieldArea.java

@@ -0,0 +1,27 @@
+package com.qmth.teachcloud.mark.bean.answercard;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class FieldArea {
+
+    private String field;
+
+    private double[] area;
+
+    public String getField() {
+        return field;
+    }
+
+    public void setField(String field) {
+        this.field = field;
+    }
+
+    public double[] getArea() {
+        return area;
+    }
+
+    public void setArea(double[] area) {
+        this.area = area;
+    }
+}

+ 55 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/answercard/FillLocator.java

@@ -0,0 +1,55 @@
+package com.qmth.teachcloud.mark.bean.answercard;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+import java.util.Collections;
+import java.util.List;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class FillLocator {
+
+    @JsonProperty("area")
+    private double[] area;
+
+    @JsonProperty("dot_num")
+    private int dotNum;
+
+    @JsonProperty("dots")
+    private List<double[]> dots = Collections.emptyList();
+
+    @JsonProperty("horizontal")
+    private boolean horizontal;
+
+    public double[] getArea() {
+        return area;
+    }
+
+    public void setArea(double[] area) {
+        this.area = area;
+    }
+
+    public int getDotNum() {
+        return dotNum;
+    }
+
+    public void setDotNum(int dotNum) {
+        this.dotNum = dotNum;
+    }
+
+    public List<double[]> getDots() {
+        return dots;
+    }
+
+    public void setDots(List<double[]> dots) {
+        this.dots = dots;
+    }
+
+    public boolean isHorizontal() {
+        return horizontal;
+    }
+
+    public void setHorizontal(boolean horizontal) {
+        this.horizontal = horizontal;
+    }
+}

+ 9 - 6
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/answercard/Locator.java

@@ -2,26 +2,29 @@ package com.qmth.teachcloud.mark.bean.answercard;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 
+import java.util.Collections;
+import java.util.List;
+
 @JsonIgnoreProperties(ignoreUnknown = true)
 public class Locator {
 
-    private double[][] top;
+    private List<double[]> top = Collections.emptyList();
 
-    private double[][] bottom;
+    private List<double[]> bottom = Collections.emptyList();
 
-    public double[][] getTop() {
+    public List<double[]> getTop() {
         return top;
     }
 
-    public void setTop(double[][] top) {
+    public void setTop(List<double[]> top) {
         this.top = top;
     }
 
-    public double[][] getBottom() {
+    public List<double[]> getBottom() {
         return bottom;
     }
 
-    public void setBottom(double[][] bottom) {
+    public void setBottom(List<double[]> bottom) {
         this.bottom = bottom;
     }
 }

+ 45 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/answercard/MarkConfig.java

@@ -0,0 +1,45 @@
+package com.qmth.teachcloud.mark.bean.answercard;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.*;
+
+/**
+ * 评卷分组的显示坐标
+ */
+public class MarkConfig {
+
+    private Map<Integer, List<ConfigItem>> map;
+
+    public MarkConfig() {
+        this.map = new HashMap<>();
+    }
+
+    public void addConfig(int mainNumber, int index, double left, double top, double width, double height) {
+        ConfigItem item = new ConfigItem();
+        item.index = index;
+        item.left = left;
+        item.top = top;
+        item.width = width;
+        item.height = height;
+        this.map.computeIfAbsent(mainNumber, key -> new LinkedList<>()).add(item);
+    }
+
+    public List<ConfigItem> getConfig(int mainNumber) {
+        return map.get(mainNumber);
+    }
+
+    static class ConfigItem {
+
+        // 对应的图片序号
+        int index;
+
+        // 坐标点与宽高的相对比例
+        double left, top, width, height;
+
+        @Override
+        public String toString() {
+            return StringUtils.join(Arrays.asList(index, left, top, width, height), MarkConfigItem.DB_FIELD_JOINER);
+        }
+    }
+}

+ 128 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/answercard/MarkConfigItem.java

@@ -0,0 +1,128 @@
+package com.qmth.teachcloud.mark.bean.answercard;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * 单个评卷区设置模型
+ */
+public class MarkConfigItem {
+
+    // 数据库中多个单元紧凑保存的拼接符,兼容旧版本只保存图片序号的模式
+    public static final String DB_ITEM_JOINER = ",";
+
+    // 数据库中单个单元紧凑保存的拼接符,兼容旧版本只保存图片序号的模式
+    public static final String DB_FIELD_JOINER = ":";
+
+    // 裁切去所属的图片序号,从1开始
+    private int i;
+
+    // 裁切区左上角X坐标
+    private double x;
+
+    // 裁切区左上角Y坐标
+    private double y;
+
+    // 裁切区宽度
+    private double w;
+
+    // 裁切区高度
+    private double h;
+
+    public MarkConfigItem() {
+
+    }
+
+    public MarkConfigItem(String text) {
+        text = StringUtils.trimToEmpty(text);
+        String[] values = StringUtils.split(text, DB_FIELD_JOINER);
+        try {
+            i = Integer.parseInt(values[0]);
+            if (values.length > 1) {
+                x = Double.parseDouble(values[1]);
+            }
+            if (values.length > 2) {
+                y = Double.parseDouble(values[2]);
+            }
+            if (values.length > 3) {
+                w = Double.parseDouble(values[3]);
+            }
+            if (values.length > 4) {
+                h = Double.parseDouble(values[4]);
+            }
+        } catch (Exception e) {
+            throw new IllegalArgumentException("Invalid PictureConfigItem init text:" + text);
+        }
+    }
+
+    public int getI() {
+        return i;
+    }
+
+    public void setI(int i) {
+        this.i = i;
+    }
+
+    public double getX() {
+        return x;
+    }
+
+    public void setX(double x) {
+        this.x = x;
+    }
+
+    public double getY() {
+        return y;
+    }
+
+    public void setY(double y) {
+        this.y = y;
+    }
+
+    public double getW() {
+        return w;
+    }
+
+    public void setW(double w) {
+        this.w = w;
+    }
+
+    public double getH() {
+        return h;
+    }
+
+    public void setH(double h) {
+        this.h = h;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(i).append(DB_FIELD_JOINER);
+        sb.append(x).append(DB_FIELD_JOINER);
+        sb.append(y).append(DB_FIELD_JOINER);
+        sb.append(w).append(DB_FIELD_JOINER);
+        sb.append(h);
+        return sb.toString();
+    }
+
+    public static List<MarkConfigItem> parse(String text) {
+        List<MarkConfigItem> list = new LinkedList<MarkConfigItem>();
+        text = StringUtils.trimToEmpty(text);
+        String[] values = StringUtils.split(text, DB_ITEM_JOINER);
+        for (String value : values) {
+            try {
+                MarkConfigItem item = new MarkConfigItem(value);
+                if (item != null && item.i > 0) {
+                    list.add(item);
+                }
+            } catch (Exception e) {
+                continue;
+            }
+        }
+        return list;
+    }
+
+}

+ 18 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/manage/MarkManageDto.java

@@ -15,6 +15,8 @@ public class MarkManageDto {
     private String paperNumber;
     private Integer totalCount;
     private Integer markedCount;
+    private String status;
+    private String statusDisplay;
 
     public Long getExamId() {
         return examId;
@@ -63,4 +65,20 @@ public class MarkManageDto {
     public void setMarkedCount(Integer markedCount) {
         this.markedCount = markedCount;
     }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getStatusDisplay() {
+        return statusDisplay;
+    }
+
+    public void setStatusDisplay(String statusDisplay) {
+        this.statusDisplay = statusDisplay;
+    }
 }

+ 93 - 85
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkTaskServiceImpl.java

@@ -1,15 +1,5 @@
 package com.qmth.teachcloud.mark.service.impl;
 
-import java.text.DecimalFormat;
-import java.util.Arrays;
-import java.util.List;
-
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletResponse;
-
-import org.springframework.stereotype.Service;
-import org.springframework.util.CollectionUtils;
-
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -25,12 +15,22 @@ import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkManageDto;
 import com.qmth.teachcloud.mark.dto.mark.manage.MarkerInfoDto;
 import com.qmth.teachcloud.mark.entity.MarkGroup;
+import com.qmth.teachcloud.mark.entity.MarkPaper;
 import com.qmth.teachcloud.mark.entity.MarkTask;
 import com.qmth.teachcloud.mark.enums.MarkTaskStatus;
 import com.qmth.teachcloud.mark.mapper.MarkTaskMapper;
 import com.qmth.teachcloud.mark.service.MarkGroupService;
+import com.qmth.teachcloud.mark.service.MarkPaperService;
 import com.qmth.teachcloud.mark.service.MarkQuestionService;
 import com.qmth.teachcloud.mark.service.MarkTaskService;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.text.DecimalFormat;
+import java.util.Arrays;
+import java.util.List;
 
 /**
  * <p>
@@ -43,6 +43,8 @@ import com.qmth.teachcloud.mark.service.MarkTaskService;
 @Service
 public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> implements MarkTaskService {
 
+    @Resource
+    private MarkPaperService markPaperService;
     @Resource
     private MarkGroupService markGroupService;
     @Resource
@@ -55,7 +57,13 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
         Page<MarkManageDto> page = new Page<>(pageNumber, pageSize);
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         DataPermissionRule dpr = basicRoleDataPermissionService.findDataPermission(sysUser.getSchoolId(), sysUser.getId(), ServletUtil.getRequest().getServletPath());
-        return this.baseMapper.listPaperManage(page, examId, courseCode, paperNumber, progressStatus, dpr);
+        IPage<MarkManageDto> markManageDtoIPage = this.baseMapper.listPaperManage(page, examId, courseCode, paperNumber, progressStatus, dpr);
+        for (MarkManageDto record : markManageDtoIPage.getRecords()) {
+            MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(record.getExamId(), record.getPaperNumber());
+            record.setStatus(markPaper == null ? null : markPaper.getStatus().name());
+            record.setStatusDisplay(markPaper == null ? null : markPaper.getStatus().getName());
+        }
+        return markManageDtoIPage;
     }
 
     @Override
@@ -237,86 +245,86 @@ public class MarkTaskServiceImpl extends ServiceImpl<MarkTaskMapper, MarkTask> i
         this.remove(updateWrapper);
     }
 
-	@Override
-	public IPage<MarkTask> listPageHistory(Page<MarkTask> page, Long userId, Long examId, String paperNumber,
-			Integer groupNumber, String secretNumber, Double markerScore) {
-		return this.baseMapper.listPageHistory(page, userId, examId, paperNumber, groupNumber, secretNumber, markerScore);
-	}
+    @Override
+    public IPage<MarkTask> listPageHistory(Page<MarkTask> page, Long userId, Long examId, String paperNumber,
+                                           Integer groupNumber, String secretNumber, Double markerScore) {
+        return this.baseMapper.listPageHistory(page, userId, examId, paperNumber, groupNumber, secretNumber, markerScore);
+    }
 
-	@Override
-	public List<MarkTask> findUnMarked(Page<MarkTask> page, Long examId, String paperNumber, Integer groupNumber,
-			Long userId) {
-		return this.baseMapper.findUnMarked(page, examId, paperNumber, groupNumber, userId);
-	}
+    @Override
+    public List<MarkTask> findUnMarked(Page<MarkTask> page, Long examId, String paperNumber, Integer groupNumber,
+                                       Long userId) {
+        return this.baseMapper.findUnMarked(page, examId, paperNumber, groupNumber, userId);
+    }
 
-	@Override
-	public List<MarkTask> findUnMarkedFilterClass(Page<MarkTask> page, Long examId, String paperNumber,
-			Integer groupNumber, Long userId) {
-		return this.baseMapper.findUnMarkedFilterClass(page, examId, paperNumber, groupNumber, userId);
-	}
+    @Override
+    public List<MarkTask> findUnMarkedFilterClass(Page<MarkTask> page, Long examId, String paperNumber,
+                                                  Integer groupNumber, Long userId) {
+        return this.baseMapper.findUnMarkedFilterClass(page, examId, paperNumber, groupNumber, userId);
+    }
 
-	@Override
-	public int countByIdAndStatus(Long id, MarkTaskStatus status) {
-		 QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
-		 queryWrapper.lambda().eq(MarkTask::getId, id)
-	                .eq(MarkTask::getStatus, status);
-		 return this.count(queryWrapper);
-	}
+    @Override
+    public int countByIdAndStatus(Long id, MarkTaskStatus status) {
+        QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkTask::getId, id)
+                .eq(MarkTask::getStatus, status);
+        return this.count(queryWrapper);
+    }
 
-	@Override
-	public List<MarkTask> findByStudentIdAndGroupNumberAndStatus(Long studentId, Integer groupNumber,
-			MarkTaskStatus... status) {
-		QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
-		queryWrapper.lambda().eq(MarkTask::getStudentId, studentId)
-		 			.eq(MarkTask::getGroupNumber, groupNumber)
-	                .in(MarkTask::getStatus, Arrays.asList(status));
-		 return this.list(queryWrapper);
-	}
+    @Override
+    public List<MarkTask> findByStudentIdAndGroupNumberAndStatus(Long studentId, Integer groupNumber,
+                                                                 MarkTaskStatus... status) {
+        QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkTask::getStudentId, studentId)
+                .eq(MarkTask::getGroupNumber, groupNumber)
+                .in(MarkTask::getStatus, Arrays.asList(status));
+        return this.list(queryWrapper);
+    }
 
-	@Override
-	public boolean updateProblemResult(Long taskId, Long userId, Long now, int spent) {
-		 UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
-		 updateWrapper.lambda().eq(MarkTask::getId, taskId)
-		 			.in(MarkTask::getStatus, Arrays.asList( MarkTaskStatus.WAITING, MarkTaskStatus.REJECTED, MarkTaskStatus.MARKED))
-		 			.set(MarkTask::getStatus, MarkTaskStatus.PROBLEM)
-	                .set(MarkTask::getUserId, userId)
-	                .set(MarkTask::getMarkerScore, null)
-	                .set(MarkTask::getMarkerScoreList, null)
-	                .set(MarkTask::getMarkerTime, now)
-	                .set(MarkTask::getMarkerSpent, spent);
-		 return this.update(updateWrapper);
-	}
+    @Override
+    public boolean updateProblemResult(Long taskId, Long userId, Long now, int spent) {
+        UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().eq(MarkTask::getId, taskId)
+                .in(MarkTask::getStatus, Arrays.asList(MarkTaskStatus.WAITING, MarkTaskStatus.REJECTED, MarkTaskStatus.MARKED))
+                .set(MarkTask::getStatus, MarkTaskStatus.PROBLEM)
+                .set(MarkTask::getUserId, userId)
+                .set(MarkTask::getMarkerScore, null)
+                .set(MarkTask::getMarkerScoreList, null)
+                .set(MarkTask::getMarkerTime, now)
+                .set(MarkTask::getMarkerSpent, spent);
+        return this.update(updateWrapper);
+    }
 
-	@Override
-	public boolean updateStatusByStudentIdAndGroupNumber(Long studentId, Integer groupNumber, MarkTaskStatus status) {
-		UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
-		updateWrapper.lambda().eq(MarkTask::getStudentId, studentId)
-		 			.eq(MarkTask::getGroupNumber,groupNumber)
-		 			.set(MarkTask::getStatus, status);
-		return this.update(updateWrapper);
-	}
+    @Override
+    public boolean updateStatusByStudentIdAndGroupNumber(Long studentId, Integer groupNumber, MarkTaskStatus status) {
+        UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().eq(MarkTask::getStudentId, studentId)
+                .eq(MarkTask::getGroupNumber, groupNumber)
+                .set(MarkTask::getStatus, status);
+        return this.update(updateWrapper);
+    }
 
-	@Override
-	public int countByStudentIdAndMarkerIdAndIdNotEqual(Long studentId, Long userId, Long taskId) {
-		QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
-		queryWrapper.lambda().eq(MarkTask::getStudentId, studentId)
-		 			.eq(MarkTask::getUserId, userId)
-	                .ne(MarkTask::getId, taskId);
-		 return this.count(queryWrapper);
-	}
+    @Override
+    public int countByStudentIdAndMarkerIdAndIdNotEqual(Long studentId, Long userId, Long taskId) {
+        QueryWrapper<MarkTask> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkTask::getStudentId, studentId)
+                .eq(MarkTask::getUserId, userId)
+                .ne(MarkTask::getId, taskId);
+        return this.count(queryWrapper);
+    }
 
-	@Override
-	public boolean updateMarkerResult(Long taskId, MarkTaskStatus status, Long userId, Double markerScore,
-			String scoreList, Long now, int spent, MarkTaskStatus... inStatus) {
-		UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
-		 updateWrapper.lambda().eq(MarkTask::getId, taskId)
-		 			.in(MarkTask::getStatus, Arrays.asList(inStatus))
-		 			.set(MarkTask::getStatus, status)
-	                .set(MarkTask::getUserId, userId)
-	                .set(MarkTask::getMarkerScore, markerScore)
-	                .set(MarkTask::getMarkerScoreList, scoreList)
-	                .set(MarkTask::getMarkerTime, now)
-	                .set(MarkTask::getMarkerSpent, spent);
-		 return this.update(updateWrapper);
-	}
+    @Override
+    public boolean updateMarkerResult(Long taskId, MarkTaskStatus status, Long userId, Double markerScore,
+                                      String scoreList, Long now, int spent, MarkTaskStatus... inStatus) {
+        UpdateWrapper<MarkTask> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().eq(MarkTask::getId, taskId)
+                .in(MarkTask::getStatus, Arrays.asList(inStatus))
+                .set(MarkTask::getStatus, status)
+                .set(MarkTask::getUserId, userId)
+                .set(MarkTask::getMarkerScore, markerScore)
+                .set(MarkTask::getMarkerScoreList, scoreList)
+                .set(MarkTask::getMarkerTime, now)
+                .set(MarkTask::getMarkerSpent, spent);
+        return this.update(updateWrapper);
+    }
 }

+ 19 - 19
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/ScanAnswerCardServiceImpl.java

@@ -114,31 +114,31 @@ public class ScanAnswerCardServiceImpl extends ServiceImpl<ScanAnswerCardMapper,
             card.setNeedAdapte(false);
         }
 
-        CardFile cardFile;
-        byte[] fileData;
-        String sliceConfig;
-        try {
-            fileData = domain.getFile().getBytes();
-            // 解析卡格式文件
-            cardFile = parseCardFile(fileData);
-            if (singlePage && domain.getPaperCount() != cardFile.getPages().size()) {
-                throw new ParameterException("卡格式数量不一致");
-            }
-            if (!singlePage && domain.getPaperCount() * 2 != cardFile.getPages().size()) {
-                throw new ParameterException("卡格式数量不一致");
-            }
-            // 提取裁切坐标
-            sliceConfig = cardFile.getSliceConfig().toString();
-        } catch (IOException e) {
-            throw new ParameterException("文件解析失败", e);
-        }
+//        CardFile cardFile;
+//        byte[] fileData;
+//        String sliceConfig;
+//        try {
+//            fileData = domain.getFile().getBytes();
+//            // 解析卡格式文件
+//            cardFile = parseCardFile(fileData);
+//            if (singlePage && domain.getPaperCount() != cardFile.getPages().size()) {
+//                throw new ParameterException("卡格式数量不一致");
+//            }
+//            if (!singlePage && domain.getPaperCount() * 2 != cardFile.getPages().size()) {
+//                throw new ParameterException("卡格式数量不一致");
+//            }
+////            // 提取裁切坐标
+//            sliceConfig = cardFile.getSliceConfig().toString();
+//        } catch (IOException e) {
+//            throw new ParameterException("文件解析失败", e);
+//        }
         String filePath = null;
         try {
             filePath = markFileService.uploadAnswerCard(domain.getFile().getInputStream(), domain.getMd5(), domain.getExamId(), domain.getCoursePaperId(), card.getNumber());
         } catch (IOException e) {
             throw new ParameterException("文件上传失败", e);
         }
-        card.setSliceConfig(sliceConfig);
+//        card.setSliceConfig(sliceConfig);
         card.setMd5(domain.getMd5());
         card.setUri(filePath);
         this.saveOrUpdate(card);

+ 2 - 2
teachcloud-mark/src/main/resources/mapper/MarkStudentMapper.xml

@@ -103,10 +103,10 @@
             <if test="startScore != null">
                 <choose>
                     <when test="startScore == 0">
-                        AND (ms.is_absent = 1 OR ms.is_breach = 1 OR (ms.subjective_score + ms.objective_score &gt;= #{startScore} AND ms.subjective_score + ms.objective_scor &lt;= #{endScore}))
+                        AND (ms.is_absent = 1 OR ms.is_breach = 1 OR (ms.subjective_score + ms.objective_score &gt;= #{startScore} AND ms.subjective_score + ms.objective_score &lt;= #{endScore}))
                     </when>
                     <otherwise>
-                        AND (ms.is_absent = 0 AND ms.is_breach = 0 AND (ms.subjective_score + ms.objective_score &gt;= #{startScore} AND ms.subjective_score + ms.objective_scor &lt;= #{endScore}))
+                        AND (ms.is_absent = 0 AND ms.is_breach = 0 AND (ms.subjective_score + ms.objective_score &gt;= #{startScore} AND ms.subjective_score + ms.objective_score &lt;= #{endScore}))
                     </otherwise>
                 </choose>
             </if>

+ 23 - 16
teachcloud-task/src/main/java/com/qmth/teachcloud/task/service/impl/PrintFinishServiceImpl.java

@@ -14,6 +14,7 @@ import com.qmth.teachcloud.common.entity.MarkQuestion;
 import com.qmth.teachcloud.common.enums.CardCreateMethodEnum;
 import com.qmth.teachcloud.common.enums.UploadFileEnum;
 import com.qmth.teachcloud.common.util.ExamTaskUtil;
+import com.qmth.teachcloud.mark.bean.answercard.CardFile;
 import com.qmth.teachcloud.mark.bean.vo.parseCard.Struct;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
 import com.qmth.teachcloud.mark.entity.MarkStudent;
@@ -158,10 +159,15 @@ public class PrintFinishServiceImpl implements PrintFinishService {
             File tempFile = SystemConstant.getFileTempDirVar(System.currentTimeMillis() + File.separator + SystemConstant.getNanoId(), SystemConstant.TEMP_PREFIX);
             String rootPath = tempFile.getParent();
             String jsonPath = rootPath + File.separator + paperInfoVo.getCardId() + SystemConstant.JSON_PREFIX;
-            File jsonFile = SystemConstant.createJsonFile(jsonPath, examCard.getContent());
-            if (jsonFile.exists()) {
-                InputStream inputStream = null;
-                try {
+
+
+            InputStream inputStream = null;
+            File jsonFile = null;
+            try {
+                // 将知学知考卡格式内容,转换为扫描端格式
+                CardFile cardFile = CardFile.parse(examCard.getContent());
+                jsonFile = SystemConstant.createJsonFile(jsonPath, cardFile.output());
+                if (jsonFile.exists()) {
                     inputStream = new FileInputStream(jsonFile);
                     String md5 = DigestUtils.md5Hex(new FileInputStream(jsonFile));
                     Integer number = scanAnswerCardService.findMaxCardNumberByExamId(dto.getExamId());
@@ -184,24 +190,25 @@ public class PrintFinishServiceImpl implements PrintFinishService {
                     int paperCount = CardParseUtils.calcPaperCount(content, true);
                     scanAnswerCard.setPaperCount(paperCount);
                     scanAnswerCardService.save(scanAnswerCard);
+                }
+            } catch (IOException e) {
+                log.info("考试[{}],试卷编号[{}],题卡ID[{}]同步阅卷失败", dto.getExamId(), dto.getPaperNumber(), paperInfoVo.getCardId());
+            } finally {
+                try {
+                    FileUtils.forceDeleteOnExit(jsonFile);
                 } catch (IOException e) {
-                    log.info("考试[{}],试卷编号[{}],题卡ID[{}]同步阅卷失败", dto.getExamId(), dto.getPaperNumber(), paperInfoVo.getCardId());
-                } finally {
+                    log.info("删除jsonFile失败");
+                }
+                if (inputStream != null) {
                     try {
-                        FileUtils.forceDeleteOnExit(jsonFile);
+                        inputStream.close();
                     } catch (IOException e) {
-                        log.info("删除jsonFile失败");
-                    }
-                    if (inputStream != null) {
-                        try {
-                            inputStream.close();
-                        } catch (IOException e) {
-                            log.info("关闭inputStream流失败");
-                        }
+                        log.info("关闭inputStream流失败");
                     }
                 }
-
             }
+
+
         }
     }
 

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov