xiaofei vor 8 Monaten
Ursprung
Commit
efb86e2d0f

+ 3 - 3
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/BasicCardRule.java

@@ -96,7 +96,7 @@ public class BasicCardRule extends BaseEntity implements Serializable {
      * 学号是否包含字母
      */
     @TableField("contains_letter")
-    private String containsLetter;
+    private Boolean containsLetter;
     /**
      * 学号字母位置坐标
      */
@@ -366,11 +366,11 @@ public class BasicCardRule extends BaseEntity implements Serializable {
         this.defaultOptionNumber = defaultOptionNumber;
     }
 
-    public String getContainsLetter() {
+    public Boolean getContainsLetter() {
         return containsLetter;
     }
 
-    public void setContainsLetter(String containsLetter) {
+    public void setContainsLetter(Boolean containsLetter) {
         this.containsLetter = containsLetter;
     }
 

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/ExamNumberStyleEnum.java

@@ -14,7 +14,7 @@ public enum ExamNumberStyleEnum {
 
     PRINT("印刷条码"),
     PASTE("粘贴条码"),
-    FILL("号填涂");
+    FILL("号填涂");
 
     ExamNumberStyleEnum(String name) {
         this.name = name;

+ 2 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/enums/PaperTypeEnum.java

@@ -11,8 +11,8 @@ import java.util.List;
  */
 public enum PaperTypeEnum {
 
-    PRINT("印刷条码"),
-    FILL("卡号填涂");
+    PRINT("印刷"),
+    FILL("填涂");
 
     PaperTypeEnum(String name) {
         this.name = name;

+ 9 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/BasicCardRuleServiceImpl.java

@@ -11,6 +11,8 @@ import com.qmth.distributed.print.business.entity.BasicExamRule;
 import com.qmth.distributed.print.business.entity.ExamCard;
 import com.qmth.distributed.print.business.entity.ExamTask;
 import com.qmth.distributed.print.business.enums.CardRequiredFieldsEnum;
+import com.qmth.distributed.print.business.enums.ExamNumberStyleEnum;
+import com.qmth.distributed.print.business.enums.PaperTypeEnum;
 import com.qmth.distributed.print.business.mapper.BasicCardRuleMapper;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
@@ -153,6 +155,13 @@ public class BasicCardRuleServiceImpl extends ServiceImpl<BasicCardRuleMapper, B
         queryWrapper.lambda().eq(BasicCardRule::getSchoolId, schoolId)
                 .eq(BasicCardRule::getName, cardRule.getName());
         BasicCardRule basicCardRule = this.getOne(queryWrapper);
+
+        // 粘贴条码和学号填涂,AB卷版式必须为填涂,印刷条码,AB卷版式必须为印刷
+        if ((ExamNumberStyleEnum.PASTE.equals(cardRule.getExamNumberStyle()) || ExamNumberStyleEnum.FILL.equals(cardRule.getExamNumberStyle())) && !PaperTypeEnum.FILL.equals(cardRule.getPaperType())) {
+            throw ExceptionResultEnum.ERROR.exception("学号版式为" + cardRule.getExamNumberStyle().getName() + ",AB卷版式必须为" + PaperTypeEnum.FILL.getName());
+        } else if (ExamNumberStyleEnum.PRINT.equals(cardRule.getExamNumberStyle()) && !PaperTypeEnum.PRINT.equals(cardRule.getPaperType())) {
+            throw ExceptionResultEnum.ERROR.exception("学号版式为" + cardRule.getExamNumberStyle().getName() + ",AB卷版式必须为" + PaperTypeEnum.PRINT.getName());
+        }
         // 新增
         if (Objects.isNull(cardRule.getId())) {
             if (basicCardRule != null) {

+ 9 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/archivescore/ArchiveScoreVo.java

@@ -11,6 +11,7 @@ public class ArchiveScoreVo {
 	private String courseName;
 	private String openCollege;
 	private String paperNumber;
+	private String paperType;
 	private Integer studentCount;
 	private Integer classCount;
 	private Integer absentCount;
@@ -62,6 +63,14 @@ public class ArchiveScoreVo {
 		this.paperNumber = paperNumber;
 	}
 
+	public String getPaperType() {
+		return paperType;
+	}
+
+	public void setPaperType(String paperType) {
+		this.paperType = paperType;
+	}
+
 	public Integer getStudentCount() {
 		return studentCount;
 	}

+ 9 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/archivescore/ArchiveStudentVo.java

@@ -22,6 +22,7 @@ public class ArchiveStudentVo {
     private String studentName;
     @ExcelProperty(name = "学号", width = 20, index = 2)
     private String studentCode;
+    private String paperType;
     @ExcelProperty(name = "学院", width = 20, index = 3)
     private String collegeName;
     private String majorName;
@@ -84,6 +85,14 @@ public class ArchiveStudentVo {
         this.studentName = studentName;
     }
 
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
     public String getCollegeName() {
         return collegeName;
     }

+ 30 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/archivescore/QuestionObjectiveVo.java

@@ -0,0 +1,30 @@
+package com.qmth.teachcloud.mark.bean.archivescore;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+public class QuestionObjectiveVo {
+
+    @ApiModelProperty("考生总数")
+    private String paperType;
+
+    @ApiModelProperty("有得分总数")
+    private List<QuestionVo> list;
+
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
+    public List<QuestionVo> getList() {
+        return list;
+    }
+
+    public void setList(List<QuestionVo> list) {
+        this.list = list;
+    }
+}

+ 3 - 3
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/archivescore/ScoreReportVo.java

@@ -27,7 +27,7 @@ public class ScoreReportVo {
 	private List<TeacherClassVo> teacherClass;
 
 	@ApiModelProperty("客观题成绩分析")
-	private List<QuestionVo> objective;
+	private List<QuestionObjectiveVo> objective;
 
 	@ApiModelProperty("主观题成绩分析")
 	private List<QuestionVo> subjective;
@@ -99,11 +99,11 @@ public class ScoreReportVo {
 		this.teacherClass = teacherClass;
 	}
 
-	public List<QuestionVo> getObjective() {
+	public List<QuestionObjectiveVo> getObjective() {
 		return objective;
 	}
 
-	public void setObjective(List<QuestionVo> objective) {
+	public void setObjective(List<QuestionObjectiveVo> objective) {
 		this.objective = objective;
 	}
 

+ 2 - 3
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkServiceImpl.java

@@ -437,7 +437,7 @@ public class MarkServiceImpl implements MarkService {
             lockService.watch(LockType.EXAM_SUBJECT, markPaper.getExamId(), markPaper.getPaperNumber());
             log.info("start create library for examId=" + markPaper.getExamId() + ", paperNumber="
                     + markPaper.getPaperNumber());
-            // 清除缺考考生和违纪考生
+            // 清除缺考考生和违纪考生(违纪考生参与阅卷,update by 2024-10-17)
             List<MarkStudent> markStudentList = markStudentService
                     .listAbsentOrBreachMarkTaskStudent(markPaper.getExamId(), markPaper.getPaperNumber());
             if (CollectionUtils.isNotEmpty(markStudentList)) {
@@ -454,8 +454,7 @@ public class MarkServiceImpl implements MarkService {
                 }
             }
             // 处理正常考生
-            List<MarkGroup> groups = markGroupService.listGroupByExamIdAndPaperNumber(markPaper.getExamId(),
-                    markPaper.getPaperNumber());
+            List<MarkGroup> groups = markGroupService.listGroupByExamIdAndPaperNumber(markPaper.getExamId(), markPaper.getPaperNumber());
             for (MarkGroup group : groups) {
                 // 生成正评任务
                 buildFormalLibrary(group);

+ 67 - 46
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java

@@ -1310,6 +1310,7 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
         String postUrl = "/api/admin/mark/archive/score/list";
         DataPermissionRule dpr = basicRoleDataPermissionService.findDataPermission(sysUser.getSchoolId(), sysUser.getId(), postUrl);
         ScoreReportVo ret = new ScoreReportVo();
+        // 考试概况
         ret.setOverview(baseMapper.overview(sysUser.getSchoolId(), query, dpr));
         if (ret.getOverview() != null && ret.getOverview().getStudentCount() > 0) {
             double total = ret.getOverview().getStudentCount() - ret.getOverview().getAbsentCount();
@@ -1320,8 +1321,11 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
             ret.getOverview().setAvgScore(Calculator.round(ret.getOverview().getAvgScore(), 2));
         }
         List<ArchiveStudentVo> studentList = baseMapper.studentList(sysUser.getSchoolId(), query, dpr);
+
+        // 成绩分数段分析
         fillScoreRange(ret, studentList);
 
+        // 学院成绩分析
         ret.setCollege(baseMapper.college(sysUser.getSchoolId(), query, dpr));
         if (CollectionUtils.isNotEmpty(ret.getCollege())) {
             for (CollegeVo vo : ret.getCollege()) {
@@ -1335,6 +1339,7 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
             }
         }
 
+        // 班级成绩分析
         ret.setClassData(baseMapper.classData(sysUser.getSchoolId(), query, dpr));
         if (CollectionUtils.isNotEmpty(ret.getClassData())) {
             for (ClassVo vo : ret.getClassData()) {
@@ -1348,6 +1353,7 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
             }
         }
 
+        // 任课老师分析
         ret.setTeacher(baseMapper.teacher(sysUser.getSchoolId(), query, dpr));
         if (CollectionUtils.isNotEmpty(ret.getTeacher())) {
             for (TeacherVo vo : ret.getTeacher()) {
@@ -1361,6 +1367,7 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
             }
         }
 
+        // 任课老师班级分析
         ret.setTeacherClass(baseMapper.teacherClass(sysUser.getSchoolId(), query, dpr));
         if (CollectionUtils.isNotEmpty(ret.getTeacherClass())) {
             for (TeacherClassVo vo : ret.getTeacherClass()) {
@@ -1372,7 +1379,10 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
             }
         }
 
+        // 客观题成绩分析
         fillObjective(ret, studentList, query.getExamId(), query.getPaperNumber());
+
+        // 主观题成绩分析
         List<Long> studentIds = studentList.stream().map(ArchiveStudentVo::getStudentId).collect(Collectors.toList());
         ret.setSubjective(markSubjectiveScoreService.getSubjectiveVo(studentIds));
         if (CollectionUtils.isNotEmpty(ret.getSubjective())) {
@@ -1383,6 +1393,8 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
                 vo.setAvgScore(Calculator.round(vo.getAvgScore(), 2));
             }
         }
+
+        // 大题分析
         fillMainQuestionAnalysis(ret, studentList, query.getExamId(), query.getPaperNumber());
         return ret;
     }
@@ -1536,60 +1548,69 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
 
     private void fillObjective(ScoreReportVo ret, List<ArchiveStudentVo> studentList, Long examId, String paperNumber) {
         List<MarkQuestion> qs = markQuestionService.listByExamIdAndPaperNumberAndObjective(examId, paperNumber, true);
-        Map<String, QuestionVo> map = new HashMap<>();
-        List<QuestionVo> list = new ArrayList<>();
-        for (ArchiveStudentVo s : studentList) {
-            List<ScoreItem> sis = s.getScoreList(true, qs);
-            if (CollectionUtils.isNotEmpty(sis)) {
-                for (ScoreItem si : sis) {
-                    String key = si.getMainNumber() + "-" + si.getSubNumber();
-                    QuestionVo vo = map.get(key);
-                    if (vo == null) {
-                        vo = new QuestionVo();
-                        vo.setScoreCount(0);
-                        vo.setFullScoreCount(0);
-                        vo.setStudentCount(0);
-                        vo.setScoreSum(0.0);
-                        vo.setMainNumber(si.getMainNumber());
-                        vo.setSubNumber(si.getSubNumber());
-                        vo.setTitle(si.getTitle());
-                        vo.setScore(si.getTotalScore());
-                        map.put(key, vo);
-                    }
-                    vo.setStudentCount(vo.getStudentCount() + 1);
-                    vo.setScoreSum(vo.getScoreSum() + si.getScore());
-                    if (Objects.nonNull(si.getScore()) && Objects.nonNull(si.getTotalScore()) && si.getScore().doubleValue() == si.getTotalScore().doubleValue()) {
-                        vo.setFullScoreCount(vo.getFullScoreCount() + 1);
-                    }
-                    if (si.getScore() > 0) {
-                        vo.setScoreCount(vo.getScoreCount() + 1);
+        Map<String, List<ArchiveStudentVo>> collect = studentList.stream().collect(Collectors.groupingBy(ArchiveStudentVo::getPaperType));
+
+        List<QuestionObjectiveVo> questionObjectiveVoList = new ArrayList<>();
+        for (Map.Entry<String, List<ArchiveStudentVo>> entry : collect.entrySet()) {
+            QuestionObjectiveVo questionObjectiveVo = new QuestionObjectiveVo();
+            questionObjectiveVo.setPaperType(entry.getKey());
+            Map<String, QuestionVo> map = new HashMap<>();
+            List<QuestionVo> list = new ArrayList<>();
+            for (ArchiveStudentVo s : entry.getValue()) {
+                List<ScoreItem> sis = s.getScoreList(true, qs);
+                if (CollectionUtils.isNotEmpty(sis)) {
+                    for (ScoreItem si : sis) {
+                        String key = si.getMainNumber() + "-" + si.getSubNumber();
+                        QuestionVo vo = map.get(key);
+                        if (vo == null) {
+                            vo = new QuestionVo();
+                            vo.setScoreCount(0);
+                            vo.setFullScoreCount(0);
+                            vo.setStudentCount(0);
+                            vo.setScoreSum(0.0);
+                            vo.setMainNumber(si.getMainNumber());
+                            vo.setSubNumber(si.getSubNumber());
+                            vo.setTitle(si.getTitle());
+                            vo.setScore(si.getTotalScore());
+                            map.put(key, vo);
+                        }
+                        vo.setStudentCount(vo.getStudentCount() + 1);
+                        vo.setScoreSum(vo.getScoreSum() + si.getScore());
+                        if (Objects.nonNull(si.getScore()) && Objects.nonNull(si.getTotalScore()) && si.getScore().doubleValue() == si.getTotalScore().doubleValue()) {
+                            vo.setFullScoreCount(vo.getFullScoreCount() + 1);
+                        }
+                        if (si.getScore() > 0) {
+                            vo.setScoreCount(vo.getScoreCount() + 1);
+                        }
                     }
                 }
             }
-        }
-        if (map.isEmpty()) {
-            ret.setObjective(list);
-            return;
-        }
+            if (map.isEmpty()) {
+                questionObjectiveVo.setList(list);
+                continue;
+            }
 
-        list = new ArrayList<>(map.values());
-        for (QuestionVo questionVo : list) {
-            // 平均分
-            if (questionVo.getStudentCount() == null || questionVo.getStudentCount() == 0) {
-                questionVo.setAvgScore(0D);
-            } else {
-                questionVo.setAvgScore(Calculator.round(Calculator.divide(questionVo.getScoreSum(), questionVo.getStudentCount()), 2));
+            list = new ArrayList<>(map.values());
+            for (QuestionVo questionVo : list) {
+                // 平均分
+                if (questionVo.getStudentCount() == null || questionVo.getStudentCount() == 0) {
+                    questionVo.setAvgScore(0D);
+                } else {
+                    questionVo.setAvgScore(Calculator.round(Calculator.divide(questionVo.getScoreSum(), questionVo.getStudentCount()), 2));
+                }
             }
-        }
 
-        list.sort(Comparator.comparingInt(QuestionVo::getMainNumber).thenComparingInt(QuestionVo::getSubNumber));
+            list.sort(Comparator.comparingInt(QuestionVo::getMainNumber).thenComparingInt(QuestionVo::getSubNumber));
 
-        for (QuestionVo vo : list) {
-            double total = vo.getStudentCount();
-            vo.setScoreRate(Calculator.divide(vo.getScoreCount(), total, 2));
-            vo.setFullScoreRate(Calculator.divide(vo.getFullScoreCount(), total, 2));
+            for (QuestionVo vo : list) {
+                double total = vo.getStudentCount();
+                vo.setScoreRate(Calculator.divide(vo.getScoreCount(), total, 2));
+                vo.setFullScoreRate(Calculator.divide(vo.getFullScoreCount(), total, 2));
+            }
+            questionObjectiveVo.setList(list);
+            questionObjectiveVoList.add(questionObjectiveVo);
         }
-        ret.setObjective(list);
+        ret.setObjective(questionObjectiveVoList);
     }
 
     /**

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

@@ -167,7 +167,7 @@
         ORDER BY sp.package_code
     </select>
     <select id="scoreList" resultType="com.qmth.teachcloud.mark.bean.archivescore.ArchiveScoreVo">
-        SELECT t.id,t.exam_id,bc.code courseCode,bc.name courseName,so.name openCollege,t.paper_number,
+        SELECT t.id,t.exam_id,bc.code courseCode,bc.name courseName,so.name openCollege,t.paper_number,t.paper_type,
         count(*) studentCount,count(distinct bes.teach_class_name) classCount,
         sum(case when s.is_absent =1 or s.omr_absent =1 then 1 else 0 end) absentCount,
         avg(case when s.is_absent !=1 then ifnull(s.objective_score,0)+ifnull(s.subjective_score,0) else null end) avgScore,
@@ -276,7 +276,7 @@
     </select>
 
     <select id="documentList" resultType="com.qmth.teachcloud.mark.bean.document.ArchivePaperVo">
-        SELECT t.id,t.exam_id,bc.code courseCode,bc.name courseName, so.name openCollege,t.paper_number,et.id AS examTaskId
+        SELECT t.id,t.exam_id,bc.code courseCode,bc.name courseName, so.name openCollege,t.paper_number,t.paper_type,et.id AS examTaskId
         FROM
         mark_paper t
             left join basic_course bc on t.course_id = bc.id

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

@@ -44,10 +44,10 @@
     <select id="listQuestionAnswerByExamIdAndPaperNumberAndPaperType"
             resultType="com.qmth.teachcloud.mark.dto.mark.MarkQuestionAnswerVo">
         SELECT
-            mq.*,
             mqa.answer,
             mqa.objective_policy,
-            mqa.objective_policy_score
+            mqa.objective_policy_score,
+            mq.*
         FROM
             (SELECT
                  *

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

@@ -240,7 +240,7 @@
         WHERE ms.exam_id = #{examId}
           AND ms.paper_number = #{paperNumber}
           AND ms.is_upload = TRUE
-          AND (is_absent = TRUE OR is_breach = TRUE OR omr_absent = TRUE)
+          AND (is_absent = TRUE OR omr_absent = TRUE)
           AND EXISTS(SELECT 1
                      FROM mark_task mt
                      WHERE ms.id = mt.student_id)