فهرست منبع

1.0.4 增加四舍五入

xiaofei 2 سال پیش
والد
کامیت
d6e17f6dcd

+ 10 - 0
src/main/java/com/qmth/eds/bean/dto/CloudMarkingScoreDto.java

@@ -40,6 +40,8 @@ public class CloudMarkingScoreDto implements Serializable {
 
     private String subjectiveScore;
 
+    private String relateExamData;
+
     public Integer getExamId() {
         return examId;
     }
@@ -167,4 +169,12 @@ public class CloudMarkingScoreDto implements Serializable {
     public void setSubjectiveScore(String subjectiveScore) {
         this.subjectiveScore = subjectiveScore;
     }
+
+    public String getRelateExamData() {
+        return relateExamData;
+    }
+
+    public void setRelateExamData(String relateExamData) {
+        this.relateExamData = relateExamData;
+    }
 }

+ 10 - 0
src/main/java/com/qmth/eds/bean/dto/ScoreDownloadDto.java

@@ -30,6 +30,8 @@ public class ScoreDownloadDto {
     private String totalScore;
     @ExcelProperty("赋分成绩")
     private String assignScore;
+    @ExcelProperty("是否关联考务数据")
+    private String relateExamData;
 
     public String getSemesterName() {
         return semesterName;
@@ -126,4 +128,12 @@ public class ScoreDownloadDto {
     public void setAssignScore(String assignScore) {
         this.assignScore = assignScore;
     }
+
+    public String getRelateExamData() {
+        return relateExamData;
+    }
+
+    public void setRelateExamData(String relateExamData) {
+        this.relateExamData = relateExamData;
+    }
 }

+ 22 - 0
src/main/java/com/qmth/eds/common/entity/ExamAssign.java

@@ -44,6 +44,12 @@ public class ExamAssign extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "公式类型")
     private FormulaEnum formula;
 
+    @ApiModelProperty(value = "赋分后59分自动加1")
+    private Boolean openRound;
+
+    @ApiModelProperty(value = "原始分四舍五入")
+    private Boolean openTotalScoreRound;
+
     @ApiModelProperty(value = "系数json")
     private String coefficient;
 
@@ -129,6 +135,22 @@ public class ExamAssign extends BaseEntity implements Serializable {
         this.formula = formula;
     }
 
+    public Boolean getOpenRound() {
+        return openRound;
+    }
+
+    public void setOpenRound(Boolean openRound) {
+        this.openRound = openRound;
+    }
+
+    public Boolean getOpenTotalScoreRound() {
+        return openTotalScoreRound;
+    }
+
+    public void setOpenTotalScoreRound(Boolean openTotalScoreRound) {
+        this.openTotalScoreRound = openTotalScoreRound;
+    }
+
     public String getCoefficient() {
         return coefficient;
     }

+ 21 - 6
src/main/java/com/qmth/eds/service/impl/ExamAssignServiceImpl.java

@@ -3,6 +3,7 @@ package com.qmth.eds.service.impl;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.Update;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -69,11 +70,11 @@ public class ExamAssignServiceImpl extends ServiceImpl<ExamAssignMapper, ExamAss
         if (examSyncTotal == null) {
             throw ExceptionResultEnum.ERROR.exception("未设置使用数据文件,请联系管理员处理");
         }
+        List<ExamSyncStudent> examSyncStudents = examSyncStudentService.listByExamSyncTotalId(examSyncTotal);
         for (ExamAssignDto record : assignListDtoIPage.getRecords()) {
             int actualCount = 0;
             String kkxy = "";
 
-            List<ExamSyncStudent> examSyncStudents = examSyncStudentService.listByExamSyncTotalId(examSyncTotal);
             if (!CollectionUtils.isEmpty(examSyncStudents)) {
                 List<ExamSyncStudent> syncStudents = examSyncStudents.stream().filter(m -> m.getKch().equals(record.getCourseCode())).collect(Collectors.toList());
                 actualCount = syncStudents.size();
@@ -218,25 +219,39 @@ public class ExamAssignServiceImpl extends ServiceImpl<ExamAssignMapper, ExamAss
 
         List<CloudMarkingScoreForeign> cloudMarkingScoreForeigns = new ArrayList<>();
         List<ExamSyncStudent> examSyncStudents = examSyncStudentService.listByExamSyncTotalId(examSyncTotal);
+        List<CloudMarkingScore> cloudMarkingScoreUpdateList = new ArrayList<>();
         for (CloudMarkingScore cloudMarkingScore : cloudMarkingScoreList) {
             if (cloudMarkingScore.getExamSyncStudentId() != null) {
                 ExamSyncStudent examSyncStudent = examSyncStudents.stream().filter(m -> cloudMarkingScore.getExamSyncStudentId().equals(m.getId())).findFirst().get();
                 cloudMarkingScoreForeigns.add(new CloudMarkingScoreForeign(collegeId, semesterId, examTypeId, cloudMarkingScore.getExamId(), examSyncStudent.getXnm(), examSyncStudent.getXqm(), examSyncStudent.getJxbId(), examSyncStudent.getKch(), examSyncStudent.getKcmc(), examSyncStudent.getXh(), cloudMarkingScore.getAssignScore()));
             } else {
                 Optional<ExamSyncStudent> optional = examSyncStudents.stream()
-                        .filter(s -> s.getJxbmc().equals(cloudMarkingScore.getClassName())
-                                && ((StringUtils.isBlank(s.getCloudMarkingCourseCode()) && s.getKch().equals(cloudMarkingScore.getSubjectCode())) || (StringUtils.isNotBlank(s.getCloudMarkingCourseCode()) && s.getCloudMarkingCourseCode().equals(cloudMarkingScore.getSubjectCode())))
+                        .filter(s -> ((StringUtils.isBlank(s.getCloudMarkingCourseCode()) && s.getKch().equals(cloudMarkingScore.getSubjectCode())) || (StringUtils.isNotBlank(s.getCloudMarkingCourseCode()) && s.getCloudMarkingCourseCode().equals(cloudMarkingScore.getSubjectCode())))
                                 && s.getXh().equals(cloudMarkingScore.getStudentCode())).findFirst();
-                if (!optional.isPresent()) {
-                    cloudMarkingScoreForeigns.add(new CloudMarkingScoreForeign(collegeId, semesterId, examTypeId, cloudMarkingScore.getExamId(), null, null, null, cloudMarkingScore.getSubjectCode(), cloudMarkingScore.getSubjectName(), cloudMarkingScore.getStudentCode(), cloudMarkingScore.getAssignScore()));
-                } else {
+                if (optional.isPresent()) {
                     ExamSyncStudent examSyncStudent = optional.get();
                     // 匹配上,保存考务数据表ID
                     cloudMarkingScoreForeigns.add(new CloudMarkingScoreForeign(collegeId, semesterId, examTypeId, cloudMarkingScore.getExamId(), examSyncStudent.getXnm(), examSyncStudent.getXqm(), examSyncStudent.getJxbId(), examSyncStudent.getKch(), examSyncStudent.getKcmc(), examSyncStudent.getXh(), cloudMarkingScore.getAssignScore()));
+
+                    // 设置关联考务数据id
+                    cloudMarkingScore.setExamSyncStudentId(examSyncStudent.getId());
+                    cloudMarkingScoreUpdateList.add(cloudMarkingScore);
+                } else {
+                    cloudMarkingScoreForeigns.add(new CloudMarkingScoreForeign(collegeId, semesterId, examTypeId, cloudMarkingScore.getExamId(), null, null, null, cloudMarkingScore.getSubjectCode(), cloudMarkingScore.getSubjectName(), cloudMarkingScore.getStudentCode(), cloudMarkingScore.getAssignScore()));
                 }
             }
         }
 
+        // 补更新关联id
+        if (!CollectionUtils.isEmpty(cloudMarkingScoreUpdateList)) {
+            for (CloudMarkingScore cloudMarkingScore : cloudMarkingScoreUpdateList) {
+                UpdateWrapper<CloudMarkingScore> updateWrapper = new UpdateWrapper<>();
+                updateWrapper.lambda().set(CloudMarkingScore::getExamSyncStudentId, cloudMarkingScore.getExamSyncStudentId())
+                        .eq(CloudMarkingScore::getId, cloudMarkingScore.getId());
+                cloudMarkingScoreService.update(updateWrapper);
+            }
+        }
+
         List<Integer> examIds = cloudMarkingScoreList.stream().map(CloudMarkingScore::getExamId).distinct().collect(Collectors.toList());
         // 删除全量数据
         UpdateWrapper<CloudMarkingScoreForeign> updateWrapper = new UpdateWrapper<>();

+ 43 - 14
src/main/java/com/qmth/eds/service/impl/WhuDataSyncServiceImpl.java

@@ -32,7 +32,6 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.math.BigDecimal;
-import java.math.BigInteger;
 import java.math.RoundingMode;
 import java.time.Instant;
 import java.time.LocalDate;
@@ -283,8 +282,12 @@ public class WhuDataSyncServiceImpl implements WhuDataSyncService {
             // 选模式
             // 解析计算参数
             JSONObject object = JSON.parseObject(examAssign.getCoefficient());
+            // 是否统一设置
             Boolean all = object.getBoolean("all");
+            // 统一设置系数
             Double allValue = object.getDoubleValue("value");
+            // 重修赋分系数
+            Double rebuildValue = object.getDoubleValue("rebuildValue");
 
             List<ExamSyncStudentDto> finalList = new ArrayList<>();
             List<ExamSyncStudentDto> examSyncStudentDtoList = cloudMarkingScoreService.listExamSyncStudentDtos(examAssign.getSchoolId(), examAssign.getSemesterId(), examAssign.getExamTypeId(), examAssign.getCourseCode(), examAssign.getOpenCollege());
@@ -292,7 +295,7 @@ public class WhuDataSyncServiceImpl implements WhuDataSyncService {
             Double maxTotalScore = examSyncStudentDtoList.stream().map(m -> Double.parseDouble(m.getTotalScore())).max(Comparator.comparingDouble(x -> x)).get();
             if (all) {
                 // 卷面最高分
-                calcProgress(examAssign.getFormula(), allValue, examSyncStudentDtoList, maxTotalScore, finalList);
+                calcProgress(examAssign, allValue, rebuildValue, examSyncStudentDtoList, maxTotalScore, finalList);
             } else {
                 Map<String, List<ExamSyncStudentDto>> collect = examSyncStudentDtoList.stream().collect(Collectors.groupingBy(ExamSyncStudentDto::getJgmc));
                 for (Map.Entry<String, List<ExamSyncStudentDto>> entry : collect.entrySet()) {
@@ -303,7 +306,8 @@ public class WhuDataSyncServiceImpl implements WhuDataSyncService {
                         throw ExceptionResultEnum.ERROR.exception(String.format("开课学院[%s]未设置的参数值", college));
                     }
                     double collegeValue = objectOptional.get().getDoubleValue("value");
-                    calcProgress(examAssign.getFormula(), collegeValue, entry.getValue(), maxTotalScore, finalList);
+                    double collegeRebuildValue = objectOptional.get().getDoubleValue("rebuildValue");
+                    calcProgress(examAssign, collegeValue, collegeRebuildValue, entry.getValue(), maxTotalScore, finalList);
                 }
             }
 
@@ -333,23 +337,30 @@ public class WhuDataSyncServiceImpl implements WhuDataSyncService {
     /**
      * 计算公共方法
      *
-     * @param formula                公式
+     * @param examAssign             examAssign
      * @param value                  系数
+     * @param rebuildValue           重修系数
      * @param examSyncStudentDtoList 源数据
      * @param finalList              计算后数据
      *                               备注:AviatorEvaluator.compile(formula).execute(paramMap),paramMap中的参数值不能为String类型
      */
-    private void calcProgress(FormulaEnum formula, Double value, List<ExamSyncStudentDto> examSyncStudentDtoList, Double maxTotalScore, List<ExamSyncStudentDto> finalList) {
+    private void calcProgress(ExamAssign examAssign, Double value, Double rebuildValue, List<ExamSyncStudentDto> examSyncStudentDtoList, Double maxTotalScore, List<ExamSyncStudentDto> finalList) {
+        // 开启原始分四舍五入,先将分数四舍五入后再进行赋分计算
+        if (examAssign.getOpenTotalScoreRound()) {
+            value = new BigDecimal(value).setScale(0, RoundingMode.HALF_UP).doubleValue();
+        }
         // 公式1(赋值分=卷面成绩+ (100- 卷面成绩)/赋分系数)
-        if (FormulaEnum.FORMULA1.equals(formula)) {
+        if (FormulaEnum.FORMULA1.equals(examAssign.getFormula())) {
             // a为卷面成绩,y为赋分系数
             String formula1 = "a+(100-a)/b";
             for (ExamSyncStudentDto studentDto : examSyncStudentDtoList) {
                 Map<String, Object> paramMap = new HashMap<>();
                 paramMap.put("a", Double.parseDouble(studentDto.getTotalScore()));
-                paramMap.put("b", value);
+                // 判断是否重修
+                Double bValue = StringUtils.isNotBlank(studentDto.getCxbj()) && "1".equals(studentDto.getCxbj()) && rebuildValue != null && rebuildValue.doubleValue() != 0 ? rebuildValue : value;
+                paramMap.put("b", bValue);
                 String assignScore = AviatorEvaluator.compile(formula1).execute(paramMap).toString();
-                studentDto.setAssignScore(stripTrailingZerosFormula1(assignScore));
+                studentDto.setAssignScore(roundOff59(stripTrailingZerosFormula1(assignScore), examAssign.getOpenRound()));
                 finalList.add(studentDto);
             }
         }
@@ -359,31 +370,33 @@ public class WhuDataSyncServiceImpl implements WhuDataSyncService {
             说明:1.如果初始卷面最高的大于99时,则x=100,否则x=99;
                  2.参数根据每次总体初始成绩的不及格率进行调整。
          */
-        else if (FormulaEnum.FORMULA2.equals(formula)) {
+        else if (FormulaEnum.FORMULA2.equals(examAssign.getFormula())) {
             int x = maxTotalScore.doubleValue() > 99 ? 100 : 99;
             // a:初始卷面,b:参数,c:初始卷面最高分,x:说明1中参数
             String formula2_1 = "(55+(a-b)/(c-b)*(x-55))*2";
             String formula2_2 = "(a*50/b)*2";
 
             for (ExamSyncStudentDto studentDto : examSyncStudentDtoList) {
+                // 判断是否重修
+                Double bValue = StringUtils.isNotBlank(studentDto.getCxbj()) && "1".equals(studentDto.getCxbj()) && rebuildValue != null && rebuildValue.doubleValue() != 0 ? rebuildValue : value;
                 Map<String, Object> paramMap = new HashMap<>();
                 Double totalScore = Double.valueOf(studentDto.getTotalScore());
                 String tempAssignScore;
                 if (totalScore >= value) {
                     paramMap.put("a", totalScore.doubleValue());
-                    paramMap.put("b", value);
+                    paramMap.put("b", bValue.doubleValue());
                     paramMap.put("c", maxTotalScore.doubleValue());
                     paramMap.put("x", x);
                     tempAssignScore = AviatorEvaluator.compile(formula2_1).execute(paramMap).toString();
                 } else {
                     paramMap.put("a", totalScore.doubleValue());
-                    paramMap.put("b", value.doubleValue());
+                    paramMap.put("b", bValue.doubleValue());
                     tempAssignScore = AviatorEvaluator.compile(formula2_2).execute(paramMap).toString();
                 }
 
                 BigDecimal bigDecimal = new BigDecimal(tempAssignScore).setScale(0, RoundingMode.HALF_UP);
                 String assignScore = bigDecimal.divide(new BigDecimal("2")).toString();
-                studentDto.setAssignScore(stripTrailingZeros(assignScore));
+                studentDto.setAssignScore(roundOff59(stripTrailingZeros(assignScore), examAssign.getOpenRound()));
                 finalList.add(studentDto);
             }
         }
@@ -422,6 +435,22 @@ public class WhuDataSyncServiceImpl implements WhuDataSyncService {
         return new BigDecimal(value).stripTrailingZeros().toPlainString();
     }
 
+    /**
+     * 满59进1到60
+     *
+     * @param value
+     * @return
+     */
+    private String roundOff59(String value, Boolean openRound) {
+        // 分数>59,进1为60
+        int intValue = new BigDecimal(value).setScale(0, RoundingMode.FLOOR).intValue();
+        if (openRound && intValue == 59) {
+            return "60";
+        } else {
+            return value;
+        }
+    }
+
     @Transactional
     public void saveScoreData(Long schoolId, Long collegeId, Long semesterId, Long examTypeId, Integer examId, List<CloudMarkingScore> cloudMarkingScoreList) {
         // 查询对外数据
@@ -431,9 +460,9 @@ public class WhuDataSyncServiceImpl implements WhuDataSyncService {
         }
         List<ExamSyncStudent> examSyncStudents = examSyncStudentService.listByExamSyncTotalId(examSyncTotal);
         for (CloudMarkingScore cloudMarkingScore : cloudMarkingScoreList) {
+            // 通过课程号+学号进行云阅卷数据和考务数据匹配
             Optional<ExamSyncStudent> optional = examSyncStudents.stream()
-                    .filter(s -> s.getJxbmc().equals(cloudMarkingScore.getClassName())
-                            && ((StringUtils.isBlank(s.getCloudMarkingCourseCode()) && s.getKch().equals(cloudMarkingScore.getSubjectCode())) || (StringUtils.isNotBlank(s.getCloudMarkingCourseCode()) && s.getCloudMarkingCourseCode().equals(cloudMarkingScore.getSubjectCode())))
+                    .filter(s -> ((StringUtils.isBlank(s.getCloudMarkingCourseCode()) && s.getKch().equals(cloudMarkingScore.getSubjectCode())) || (StringUtils.isNotBlank(s.getCloudMarkingCourseCode()) && s.getCloudMarkingCourseCode().equals(cloudMarkingScore.getSubjectCode())))
                             && s.getXh().equals(cloudMarkingScore.getStudentCode())).findFirst();
             if (optional.isPresent()) {
                 ExamSyncStudent examSyncStudent = optional.get();

+ 6 - 0
src/main/resources/db/log/log-1.0.4.sql

@@ -90,3 +90,9 @@ ALTER TABLE `exam_sync_total`
 
 ALTER TABLE `exam_sync_student`
     ADD INDEX `idx_sync_total_id` (`exam_sync_total_id` ASC) VISIBLE;
+
+-------------------------------------2023-06-09---------------------------
+ALTER TABLE `exam_assign`
+    ADD COLUMN `open_round` TINYINT(1) NULL DEFAULT '0' COMMENT '赋分后59分自动加1' AFTER `formula`;
+ALTER TABLE `exam_assign`
+    ADD COLUMN `open_total_score_round` TINYINT(1) NULL DEFAULT 0 COMMENT '原始分四舍五入' AFTER `open_round`;

+ 6 - 3
src/main/resources/mapper/CloudMarkingScoreMapper.xml

@@ -23,7 +23,8 @@
             cms.total_score totalScore,
             cms.assign_score assignScore,
             cms.objective_score objectiveScore,
-            cms.subjective_score subjectiveScore
+            cms.subjective_score subjectiveScore,
+            case cms.exam_sync_student_id when null then '未关联' else '已关联' end relateExamData
         FROM
             cloud_marking_score cms
                 join
@@ -49,7 +50,8 @@
             cms.id cloudMarkingScoreId,
             cms.total_score totalScore,
             ess.kkbm,
-            ess.jgmc
+            ess.jgmc,
+            ess.cxbj
         FROM
             cloud_marking_score cms
                 LEFT JOIN
@@ -131,7 +133,8 @@
             ess.xsxm,
             ess.jgmc,
             cms.total_score totalScore,
-            cms.assign_score assignScore
+            cms.assign_score assignScore,
+            case cms.exam_sync_student_id when null then '未关联' else '已关联' end relateExamData
         FROM
             cloud_marking_score cms
                 LEFT JOIN