xiaofei преди 6 месеца
родител
ревизия
f7f0e08d07
променени са 27 файла, в които са добавени 584 реда и са изтрити 94 реда
  1. 5 1
      src/main/java/com/qmth/eds/api/CloudMarkingScoreController.java
  2. 2 1
      src/main/java/com/qmth/eds/api/CloudMarkingScoreForeignController.java
  3. 4 2
      src/main/java/com/qmth/eds/api/ExamAssignController.java
  4. 4 10
      src/main/java/com/qmth/eds/api/SysController.java
  5. 9 0
      src/main/java/com/qmth/eds/bean/dto/CloudMarkingScoreDto.java
  6. 10 0
      src/main/java/com/qmth/eds/bean/dto/ScoreDownloadDto.java
  7. 140 0
      src/main/java/com/qmth/eds/bean/dto/coefficient/Coefficient.java
  8. 32 0
      src/main/java/com/qmth/eds/bean/dto/coefficient/Detail.java
  9. 34 2
      src/main/java/com/qmth/eds/common/entity/ExamAssign.java
  10. 13 1
      src/main/java/com/qmth/eds/common/entity/ExamCourseMapping.java
  11. 2 0
      src/main/java/com/qmth/eds/mapper/CloudMarkingScoreForeignMapper.java
  12. 4 1
      src/main/java/com/qmth/eds/mapper/CloudMarkingScoreMapper.java
  13. 3 1
      src/main/java/com/qmth/eds/service/CloudMarkingScoreForeignService.java
  14. 4 1
      src/main/java/com/qmth/eds/service/CloudMarkingScoreService.java
  15. 2 2
      src/main/java/com/qmth/eds/service/CommonService.java
  16. 2 2
      src/main/java/com/qmth/eds/service/ExamAssignService.java
  17. 4 0
      src/main/java/com/qmth/eds/service/ExamCourseMappingService.java
  18. 12 2
      src/main/java/com/qmth/eds/service/impl/CloudMarkingScoreForeignServiceImpl.java
  19. 8 5
      src/main/java/com/qmth/eds/service/impl/CloudMarkingScoreServiceImpl.java
  20. 3 8
      src/main/java/com/qmth/eds/service/impl/CommonServiceImpl.java
  21. 11 16
      src/main/java/com/qmth/eds/service/impl/ExamAssignServiceImpl.java
  22. 9 1
      src/main/java/com/qmth/eds/service/impl/ExamCourseMappingServiceImpl.java
  23. 189 32
      src/main/java/com/qmth/eds/service/impl/WhuDataSyncServiceImpl.java
  24. 4 0
      src/main/resources/db/log/1.1.0.sql
  25. 22 0
      src/main/resources/mapper/CloudMarkingScoreForeignMapper.xml
  26. 48 5
      src/main/resources/mapper/CloudMarkingScoreMapper.xml
  27. 4 1
      src/main/resources/mapper/ExamAssignMapper.xml

+ 5 - 1
src/main/java/com/qmth/eds/api/CloudMarkingScoreController.java

@@ -68,8 +68,12 @@ public class CloudMarkingScoreController {
                        @RequestParam(value = "examTypeId", required = false) Long examTypeId,
                        @RequestParam(value = "collegeId", required = false) Long collegeId,
                        @RequestParam(value = "examId", required = false) String examId,
+                       @RequestParam(value = "syncCourseCode", required = false) String syncCourseCode,
+                       @RequestParam(value = "cloudMarkingCourseCode", required = false) String cloudMarkingCourseCode,
+                       @RequestParam(value = "studentCode", required = false) String studentCode,
+                       @RequestParam(value = "related", required = false) Boolean related,
                        @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
                        @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
-        return ResultUtil.ok(cloudMarkingScoreService.pageData(collegeId, semesterId, examTypeId, examId, pageNumber, pageSize));
+        return ResultUtil.ok(cloudMarkingScoreService.pageData(collegeId, semesterId, examTypeId, examId, syncCourseCode, cloudMarkingCourseCode, studentCode, related, pageNumber, pageSize));
     }
 }

+ 2 - 1
src/main/java/com/qmth/eds/api/CloudMarkingScoreForeignController.java

@@ -45,9 +45,10 @@ public class CloudMarkingScoreForeignController {
                        @RequestParam(value = "examTypeId", required = false) Long examTypeId,
                        @RequestParam(value = "collegeId", required = false) Long collegeId,
                        @RequestParam(value = "examId", required = false) String examId,
+                       @RequestParam(value = "syncCourseCode", required = false) String syncCourseCode,
                        @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
                        @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
-        return ResultUtil.ok(cloudMarkingScoreForeignService.pageData(semesterId, examTypeId, collegeId, examId, pageNumber, pageSize));
+        return ResultUtil.ok(cloudMarkingScoreForeignService.pageData(semesterId, examTypeId, collegeId, examId, syncCourseCode, pageNumber, pageSize));
     }
 
     /**

+ 4 - 2
src/main/java/com/qmth/eds/api/ExamAssignController.java

@@ -63,10 +63,11 @@ public class ExamAssignController {
     public Result toCalc(@RequestParam(value = "semesterId", required = false) Long semesterId,
                          @RequestParam(value = "examTypeId", required = false) Long examTypeId,
                          @RequestParam(value = "collegeId", required = false) Long collegeId,
+                         @RequestParam(value = "syncCourseCode", required = false) String syncCourseCode,
                          @RequestParam(value = "courseCode", required = false) String courseCode,
                          @RequestParam(value = "courseName", required = false) String courseName,
                          @RequestParam(value = "openCollege", required = false) String openCollege) {
-        return ResultUtil.ok(examAssignService.toCalc(semesterId, examTypeId, collegeId, courseCode, courseName, openCollege));
+        return ResultUtil.ok(examAssignService.toCalc(semesterId, examTypeId, collegeId, syncCourseCode, courseCode, courseName, openCollege));
     }
 
 
@@ -84,10 +85,11 @@ public class ExamAssignController {
                           @RequestParam(value = "semesterId", required = false) Long semesterId,
                           @RequestParam(value = "examTypeId", required = false) Long examTypeId,
                           @RequestParam(value = "collegeId", required = false) Long collegeId,
+                          @RequestParam(value = "syncCourseCode", required = false) String syncCourseCode,
                           @RequestParam(value = "courseCode", required = false) String courseCode,
                           @RequestParam(value = "courseName", required = false) String courseName,
                           @RequestParam(value = "openCollege", required = false) String openCollege) {
-        return ResultUtil.ok(examAssignService.publish(id, semesterId, examTypeId, collegeId, courseCode, courseName, openCollege));
+        return ResultUtil.ok(examAssignService.publish(id, semesterId, examTypeId, collegeId, syncCourseCode, courseCode, courseName, openCollege));
     }
 
     @ApiOperation(value = "计算结果查询")

+ 4 - 10
src/main/java/com/qmth/eds/api/SysController.java

@@ -116,16 +116,10 @@ public class SysController {
     @PostMapping("/course/list")
     @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = ExamineCollegeResult.class)})
     public Result examineCollegeList(@ApiParam(value = "学期id") @RequestParam(required = false) Long semesterId,
-                                     @ApiParam(value = "考试类型id") @RequestParam(required = false) Long examTypeId) {
-        List<CloudMarkingScore> examSyncStudentList = commonService.conditionCourseQuery(semesterId, examTypeId);
-        Set<CourseResult> courseResultList = null;
-        if (!CollectionUtils.isEmpty(examSyncStudentList)) {
-            courseResultList = new HashSet<>();
-            for (CloudMarkingScore e : examSyncStudentList) {
-                courseResultList.add(new CourseResult(e.getSubjectCode(), e.getSubjectName()));
-            }
-        }
-        return ResultUtil.ok(!CollectionUtils.isEmpty(courseResultList) ? courseResultList : Collections.emptyList());
+                                     @ApiParam(value = "考试类型id") @RequestParam(required = false) Long examTypeId,
+                                     @ApiParam(value = "学院ID") @RequestParam(required = false) Long collegeId) {
+        List<CourseResult> examSyncStudentList = commonService.conditionCourseQuery(semesterId, examTypeId, collegeId);
+        return ResultUtil.ok(!CollectionUtils.isEmpty(examSyncStudentList) ? examSyncStudentList : Collections.emptyList());
     }
 
     @ApiOperation(value = "查询考查学院列表")

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

@@ -39,6 +39,7 @@ public class CloudMarkingScoreDto implements Serializable {
     private String objectiveScore;
 
     private String subjectiveScore;
+    private String relateExamData;
 
     public Integer getExamId() {
         return examId;
@@ -167,4 +168,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;
+    }
 }

+ 140 - 0
src/main/java/com/qmth/eds/bean/dto/coefficient/Coefficient.java

@@ -0,0 +1,140 @@
+package com.qmth.eds.bean.dto.coefficient;
+
+import com.qmth.eds.common.enums.FormulaEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+public class Coefficient {
+
+    @ApiModelProperty(value = "ID")
+    private Long id;
+    @ApiModelProperty(value = "赋分公式")
+    private FormulaEnum formula;
+    @ApiModelProperty(value = "赋分系数:统一设置、按考查学院设置")
+    private Boolean all;
+    @ApiModelProperty(value = "统一设置系数")
+    private Double value;
+    @ApiModelProperty(value = "重修单独设置赋分系数")
+    private Boolean openRebuild;
+    @ApiModelProperty(value = "重修赋分系数")
+    private Double rebuildValue;
+    @ApiModelProperty(value = "赋分后59分自动加1")
+    private Boolean openRound;
+    @ApiModelProperty(value = "赋分后59分自动加1")
+    private Boolean open59To58;
+    @ApiModelProperty(value = "原始分四舍五入")
+    private Boolean openTotalScoreRound;
+    @ApiModelProperty(value = "赋分后等于54分调整赋分分值为53")
+    private Boolean open54To53;
+    @ApiModelProperty(value = "赋分后如果小于等于54.5的取原始分值")
+    private Boolean open54d5;
+    @ApiModelProperty(value = "赋分后小于原始分值取原始分值")
+    private Boolean openFetchOriginScore;
+    @ApiModelProperty(value = "学院系数设置明细")
+    private List<Detail> detail;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public FormulaEnum getFormula() {
+        return formula;
+    }
+
+    public void setFormula(FormulaEnum formula) {
+        this.formula = formula;
+    }
+
+    public Boolean getAll() {
+        return all;
+    }
+
+    public void setAll(Boolean all) {
+        this.all = all;
+    }
+
+    public Double getValue() {
+        return value;
+    }
+
+    public void setValue(Double value) {
+        this.value = value;
+    }
+
+    public Boolean getOpenRebuild() {
+        return openRebuild;
+    }
+
+    public void setOpenRebuild(Boolean openRebuild) {
+        this.openRebuild = openRebuild;
+    }
+
+    public Double getRebuildValue() {
+        return rebuildValue;
+    }
+
+    public void setRebuildValue(Double rebuildValue) {
+        this.rebuildValue = rebuildValue;
+    }
+
+    public Boolean getOpenRound() {
+        return openRound;
+    }
+
+    public void setOpenRound(Boolean openRound) {
+        this.openRound = openRound;
+    }
+
+    public Boolean getOpen59To58() {
+        return open59To58;
+    }
+
+    public void setOpen59To58(Boolean open59To58) {
+        this.open59To58 = open59To58;
+    }
+
+    public Boolean getOpenTotalScoreRound() {
+        return openTotalScoreRound;
+    }
+
+    public void setOpenTotalScoreRound(Boolean openTotalScoreRound) {
+        this.openTotalScoreRound = openTotalScoreRound;
+    }
+
+    public Boolean getOpen54To53() {
+        return open54To53;
+    }
+
+    public void setOpen54To53(Boolean open54To53) {
+        this.open54To53 = open54To53;
+    }
+
+    public Boolean getOpen54d5() {
+        return open54d5;
+    }
+
+    public void setOpen54d5(Boolean open54d5) {
+        this.open54d5 = open54d5;
+    }
+
+    public Boolean getOpenFetchOriginScore() {
+        return openFetchOriginScore;
+    }
+
+    public void setOpenFetchOriginScore(Boolean openFetchOriginScore) {
+        this.openFetchOriginScore = openFetchOriginScore;
+    }
+
+    public List<Detail> getDetail() {
+        return detail;
+    }
+
+    public void setDetail(List<Detail> detail) {
+        this.detail = detail;
+    }
+}

+ 32 - 0
src/main/java/com/qmth/eds/bean/dto/coefficient/Detail.java

@@ -0,0 +1,32 @@
+package com.qmth.eds.bean.dto.coefficient;
+
+public class Detail {
+
+    private String college;
+    private Double value;
+    private Double rebuildValue;
+
+    public String getCollege() {
+        return college;
+    }
+
+    public void setCollege(String college) {
+        this.college = college;
+    }
+
+    public Double getValue() {
+        return value;
+    }
+
+    public void setValue(Double value) {
+        this.value = value;
+    }
+
+    public Double getRebuildValue() {
+        return rebuildValue;
+    }
+
+    public void setRebuildValue(Double rebuildValue) {
+        this.rebuildValue = rebuildValue;
+    }
+}

+ 34 - 2
src/main/java/com/qmth/eds/common/entity/ExamAssign.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.eds.bean.dto.coefficient.Coefficient;
 import com.qmth.eds.common.enums.ExamAssignStatusEnum;
 import com.qmth.eds.common.enums.FormulaEnum;
 import com.qmth.eds.core.base.BaseEntity;
@@ -31,7 +32,8 @@ public class ExamAssign extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "考试类型id")
     @JsonSerialize(using = ToStringSerializer.class)
     private Long examTypeId;
-
+    @ApiModelProperty(value = "考务数据课程代码")
+    private String syncCourseCode;
     @ApiModelProperty(value = "云阅卷课程代码")
     private String courseCode;
 
@@ -43,6 +45,11 @@ 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;
@@ -60,10 +67,11 @@ public class ExamAssign extends BaseEntity implements Serializable {
     public ExamAssign() {
     }
 
-    public ExamAssign(Long schoolId, Long semesterId, Long examTypeId, String courseCode, String courseName, String openCollege, FormulaEnum formula, String coefficient, ExamAssignStatusEnum status, Boolean publish) {
+    public ExamAssign(Long schoolId, Long semesterId, Long examTypeId, String syncCourseCode, String courseCode, String courseName, String openCollege, FormulaEnum formula, String coefficient, ExamAssignStatusEnum status, Boolean publish) {
         this.schoolId = schoolId;
         this.semesterId = semesterId;
         this.examTypeId = examTypeId;
+        this.syncCourseCode = syncCourseCode;
         this.courseCode = courseCode;
         this.courseName = courseName;
         this.openCollege = openCollege;
@@ -97,6 +105,14 @@ public class ExamAssign extends BaseEntity implements Serializable {
         this.examTypeId = examTypeId;
     }
 
+    public String getSyncCourseCode() {
+        return syncCourseCode;
+    }
+
+    public void setSyncCourseCode(String syncCourseCode) {
+        this.syncCourseCode = syncCourseCode;
+    }
+
     public String getCourseCode() {
         return courseCode;
     }
@@ -160,4 +176,20 @@ public class ExamAssign extends BaseEntity implements Serializable {
     public void setPublish(Boolean publish) {
         this.publish = publish;
     }
+
+    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;
+    }
 }

+ 13 - 1
src/main/java/com/qmth/eds/common/entity/ExamCourseMapping.java

@@ -49,10 +49,13 @@ public class ExamCourseMapping implements Serializable {
     @ApiModelProperty(value = "云阅卷课程代码")
     private String cloudMarkingCourseCode;
 
+    @ApiModelProperty(value = "云阅卷考试ID")
+    private Integer examId;
+
     public ExamCourseMapping() {
     }
 
-    public ExamCourseMapping(Long schoolId, Long semesterId, String semesterName, Long examTypeId, String examTypeName, String studentCode, String syncCourseCode, String cloudMarkingCourseCode) {
+    public ExamCourseMapping(Long schoolId, Long semesterId, String semesterName, Long examTypeId, String examTypeName, String studentCode, String syncCourseCode, String cloudMarkingCourseCode, Integer examId) {
         this.id = SystemConstant.getDbUuid();
         this.schoolId = schoolId;
         this.semesterId = semesterId;
@@ -62,6 +65,7 @@ public class ExamCourseMapping implements Serializable {
         this.studentCode = studentCode;
         this.syncCourseCode = syncCourseCode;
         this.cloudMarkingCourseCode = cloudMarkingCourseCode;
+        this.examId = examId;
     }
 
     public Long getId() {
@@ -135,4 +139,12 @@ public class ExamCourseMapping implements Serializable {
     public void setCloudMarkingCourseCode(String cloudMarkingCourseCode) {
         this.cloudMarkingCourseCode = cloudMarkingCourseCode;
     }
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
 }

+ 2 - 0
src/main/java/com/qmth/eds/mapper/CloudMarkingScoreForeignMapper.java

@@ -2,10 +2,12 @@ package com.qmth.eds.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.qmth.eds.common.entity.CloudMarkingScoreForeign;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 对外输出成绩表 Mapper 接口
  */
 public interface CloudMarkingScoreForeignMapper extends BaseMapper<CloudMarkingScoreForeign> {
 
+    void deleteByCourseCode(@Param("collegeId") Long collegeId, @Param("semesterId") Long semesterId, @Param("examTypeId") Long examTypeId, @Param("syncCourseCode") String syncCourseCode, @Param("courseCode") String courseCode);
 }

+ 4 - 1
src/main/java/com/qmth/eds/mapper/CloudMarkingScoreMapper.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.eds.bean.dto.CloudMarkingScoreDto;
 import com.qmth.eds.bean.dto.ExamSyncStudentDto;
 import com.qmth.eds.bean.dto.ScoreDownloadDto;
+import com.qmth.eds.bean.result.CourseResult;
 import com.qmth.eds.bean.result.StudentMarkResult;
 import com.qmth.eds.common.entity.CloudMarkingScore;
 import org.apache.ibatis.annotations.Param;
@@ -17,7 +18,7 @@ import java.util.List;
  */
 public interface CloudMarkingScoreMapper extends BaseMapper<CloudMarkingScore> {
 
-    IPage<CloudMarkingScoreDto> pageData(@Param("page") Page<CloudMarkingScoreDto> page, @Param("collegeId") Long collegeId, @Param("semesterId") Long semesterId, @Param("examTypeId") Long examTypeId, @Param("examId") String examId);
+    IPage<CloudMarkingScoreDto> pageData(@Param("page") Page<CloudMarkingScoreDto> page, @Param("collegeId") Long collegeId, @Param("semesterId") Long semesterId, @Param("examTypeId") Long examTypeId, @Param("examId") String examId, @Param("syncCourseCode") String syncCourseCode, @Param("cloudMarkingCourseCode") String cloudMarkingCourseCode, @Param("studentCode") String studentCode, @Param("related") Boolean related);
 
     List<ExamSyncStudentDto> listExamSyncStudentDtos(@Param("schoolId") Long schoolId, @Param("semesterId") Long semesterId, @Param("examTypeId") Long examTypeId, @Param("courseCode") String courseCode, @Param("openCollege") String openCollege);
 
@@ -31,4 +32,6 @@ public interface CloudMarkingScoreMapper extends BaseMapper<CloudMarkingScore> {
                                              @Param("courseCode") String courseCode);
 
     List<ScoreDownloadDto> listScoreBySemesterIdAndExamTypeIdAndCollegeIdAndCourseCodeAndOpenCollege(@Param("semesterId") Long semesterId, @Param("examTypeId") Long examTypeId, @Param("collegeId") Long collegeId, @Param("courseCode") String courseCode, @Param("openCollege") String openCollege);
+
+    List<CourseResult> conditionCourseQuery(@Param("semesterId") Long semesterId, @Param("examTypeId") Long examTypeId, @Param("collegeId") Long collegeId);
 }

+ 3 - 1
src/main/java/com/qmth/eds/service/CloudMarkingScoreForeignService.java

@@ -11,7 +11,9 @@ import javax.servlet.http.HttpServletResponse;
  */
 public interface CloudMarkingScoreForeignService extends IService<CloudMarkingScoreForeign> {
 
-    IPage<CloudMarkingScoreForeign> pageData(Long semesterId, Long examTypeId, Long collegeId, String examId, Integer pageNumber, Integer pageSize);
+    IPage<CloudMarkingScoreForeign> pageData(Long semesterId, Long examTypeId, Long collegeId, String examId, String syncCourseCode, Integer pageNumber, Integer pageSize);
 
     void downloadScore(Long semesterId, Long examTypeId, String examId, HttpServletResponse response);
+
+    void deleteByCourseCode(Long collegeId, Long semesterId, Long examTypeId, String syncCourseCode, String courseCode);
 }

+ 4 - 1
src/main/java/com/qmth/eds/service/CloudMarkingScoreService.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.eds.bean.dto.CloudMarkingScoreDto;
 import com.qmth.eds.bean.dto.ExamSyncStudentDto;
 import com.qmth.eds.bean.dto.ScoreDownloadDto;
+import com.qmth.eds.bean.result.CourseResult;
 import com.qmth.eds.bean.result.StudentMarkResult;
 import com.qmth.eds.common.entity.CloudMarkingScore;
 
@@ -17,7 +18,7 @@ public interface CloudMarkingScoreService extends IService<CloudMarkingScore> {
 
     void deleteByKeys(Long schoolId, Long semesterId, Long examTypeId, Integer examId);
 
-    IPage<CloudMarkingScoreDto> pageData(Long collegeId, Long semesterId, Long examTypeId, String examId, Integer pageNumber, Integer pageSize);
+    IPage<CloudMarkingScoreDto> pageData(Long collegeId, Long semesterId, Long examTypeId, String examId, String syncCourseCode, String cloudMarkingCourseCode,  String studentCode, Boolean related, Integer pageNumber, Integer pageSize);
 
     List<ExamSyncStudentDto> listExamSyncStudentDtos(Long schoolId, Long semesterId, Long examTypeId, String courseCode, String openCollege);
 
@@ -39,4 +40,6 @@ public interface CloudMarkingScoreService extends IService<CloudMarkingScore> {
     List<ScoreDownloadDto> listScoreBySemesterIdAndExamTypeIdAndCollegeIdAndCourseCodeAndOpenCollege(Long semesterId, Long examTypeId, Long collegeId, String courseCode, String openCollege);
 
     List<CloudMarkingScore> listByCollegeIdAndSemesterIdAndExamTypeIdAndSubjectCodeAndOpenCollege(Long collegeId, Long semesterId, Long examTypeId, String courseCode, String openCollege);
+
+    List<CourseResult> conditionCourseQuery(Long semesterId, Long examTypeId, Long collegeId);
 }

+ 2 - 2
src/main/java/com/qmth/eds/service/CommonService.java

@@ -1,9 +1,9 @@
 package com.qmth.eds.service;
 
 import com.qmth.eds.bean.auth.AuthBean;
+import com.qmth.eds.bean.result.CourseResult;
 import com.qmth.eds.bean.result.MenuResult;
 import com.qmth.eds.common.entity.CloudMarkingScore;
-import com.qmth.eds.common.entity.ExamSyncStudent;
 import com.qmth.eds.common.entity.SysRolePrivilege;
 import com.qmth.eds.common.entity.SysUserRole;
 import com.qmth.eds.common.enums.PrivilegePropertyEnum;
@@ -78,5 +78,5 @@ public interface CommonService {
      */
     String getSysSettingValue(Long schoolId, String code);
 
-    List<CloudMarkingScore> conditionCourseQuery(Long semesterId, Long examTypeId);
+    List<CourseResult> conditionCourseQuery(Long semesterId, Long examTypeId, Long collegeId);
 }

+ 2 - 2
src/main/java/com/qmth/eds/service/ExamAssignService.java

@@ -46,9 +46,9 @@ public interface ExamAssignService extends IService<ExamAssign> {
 
     Map contrast(Long semesterId, Long examTypeId, String courseCode);
 
-    ExamAssignDto toCalc(Long semesterId, Long examTypeId, Long collegeId, String courseCode, String courseName, String openCollege);
+    ExamAssignDto toCalc(Long semesterId, Long examTypeId, Long collegeId, String syncCourseCode, String courseCode, String courseName, String openCollege);
 
-    boolean publish(Long id, Long semesterId, Long examTypeId, Long collegeId, String courseCode, String courseName, String openCollege);
+    boolean publish(Long id, Long semesterId, Long examTypeId, Long collegeId, String syncCourseCode, String courseCode, String courseName, String openCollege);
 
     void download(Long semesterId, Long examTypeId, Long collegeId, String courseCode, String openCollege, HttpServletResponse response);
 }

+ 4 - 0
src/main/java/com/qmth/eds/service/ExamCourseMappingService.java

@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.eds.common.entity.ExamCourseMapping;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.util.List;
+
 /**
  * <p>
  * 武大考务数据和云阅卷课程代码映射关系表 服务类
@@ -15,4 +17,6 @@ public interface ExamCourseMappingService extends IService<ExamCourseMapping> {
     IPage<ExamCourseMapping> pageData(Long semesterId, Long examTypeId, String syncCourseCode, String cloudMarkingCourseCode, Integer pageNumber, Integer pageSize);
 
     void importData(Long semesterId, Long examTypeId, MultipartFile file);
+
+    List<ExamCourseMapping> listByExamTypeIdAndExamId(Long examTypeId, Integer examId);
 }

+ 12 - 2
src/main/java/com/qmth/eds/service/impl/CloudMarkingScoreForeignServiceImpl.java

@@ -4,6 +4,7 @@ import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.ExcelWriter;
 import com.alibaba.excel.write.metadata.WriteSheet;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -13,6 +14,7 @@ import com.qmth.eds.common.util.FileUtil;
 import com.qmth.eds.common.util.ServletUtil;
 import com.qmth.eds.mapper.CloudMarkingScoreForeignMapper;
 import com.qmth.eds.service.CloudMarkingScoreForeignService;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
 import javax.servlet.http.HttpServletResponse;
@@ -23,8 +25,8 @@ import java.util.List;
 @Service
 public class CloudMarkingScoreForeignServiceImpl extends ServiceImpl<CloudMarkingScoreForeignMapper, CloudMarkingScoreForeign> implements CloudMarkingScoreForeignService {
     @Override
-    public IPage<CloudMarkingScoreForeign> pageData(Long semesterId, Long examTypeId, Long collegeId, String examId, Integer pageNumber, Integer pageSize) {
-        if(collegeId == null){
+    public IPage<CloudMarkingScoreForeign> pageData(Long semesterId, Long examTypeId, Long collegeId, String examId, String syncCourseCode, Integer pageNumber, Integer pageSize) {
+        if (collegeId == null) {
             throw ExceptionResultEnum.ERROR.exception("请选择学院");
         }
         QueryWrapper<CloudMarkingScoreForeign> queryWrapper = new QueryWrapper<>();
@@ -38,6 +40,9 @@ public class CloudMarkingScoreForeignServiceImpl extends ServiceImpl<CloudMarkin
         if (examId != null) {
             queryWrapper.lambda().eq(CloudMarkingScoreForeign::getExamId, examId);
         }
+        if (StringUtils.isNotBlank(syncCourseCode)) {
+            queryWrapper.lambda().like(CloudMarkingScoreForeign::getKch, syncCourseCode);
+        }
         queryWrapper.lambda().orderByDesc(CloudMarkingScoreForeign::getJxbId, CloudMarkingScoreForeign::getXh);
         return this.page(new Page<>(pageNumber, pageSize), queryWrapper);
     }
@@ -108,4 +113,9 @@ public class CloudMarkingScoreForeignServiceImpl extends ServiceImpl<CloudMarkin
             }
         }
     }
+
+    @Override
+    public void deleteByCourseCode(Long collegeId, Long semesterId, Long examTypeId, String syncCourseCode, String courseCode) {
+        this.baseMapper.deleteByCourseCode(collegeId, semesterId, examTypeId, syncCourseCode, courseCode);
+    }
 }

+ 8 - 5
src/main/java/com/qmth/eds/service/impl/CloudMarkingScoreServiceImpl.java

@@ -8,17 +8,15 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.eds.bean.dto.CloudMarkingScoreDto;
 import com.qmth.eds.bean.dto.ExamSyncStudentDto;
 import com.qmth.eds.bean.dto.ScoreDownloadDto;
+import com.qmth.eds.bean.result.CourseResult;
 import com.qmth.eds.bean.result.StudentMarkResult;
 import com.qmth.eds.common.entity.CloudMarkingScore;
-import com.qmth.eds.common.entity.SysUser;
-import com.qmth.eds.common.util.ServletUtil;
 import com.qmth.eds.mapper.CloudMarkingScoreMapper;
 import com.qmth.eds.service.CloudMarkingScoreService;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.util.List;
-import java.util.Set;
 
 @Service
 public class CloudMarkingScoreServiceImpl extends ServiceImpl<CloudMarkingScoreMapper, CloudMarkingScore> implements CloudMarkingScoreService {
@@ -37,9 +35,9 @@ public class CloudMarkingScoreServiceImpl extends ServiceImpl<CloudMarkingScoreM
     }
 
     @Override
-    public IPage<CloudMarkingScoreDto> pageData(Long collegeId, Long semesterId, Long examTypeId, String examId, Integer pageNumber, Integer pageSize) {
+    public IPage<CloudMarkingScoreDto> pageData(Long collegeId, Long semesterId, Long examTypeId, String examId, String syncCourseCode, String cloudMarkingCourseCode,  String studentCode, Boolean related, Integer pageNumber, Integer pageSize) {
         Page<CloudMarkingScoreDto> page = new Page<>(pageNumber, pageSize);
-        return this.baseMapper.pageData(page, collegeId, semesterId, examTypeId, examId);
+        return this.baseMapper.pageData(page, collegeId, semesterId, examTypeId, examId, syncCourseCode, cloudMarkingCourseCode,  studentCode, related);
     }
 
     @Override
@@ -76,4 +74,9 @@ public class CloudMarkingScoreServiceImpl extends ServiceImpl<CloudMarkingScoreM
                 .eq(CloudMarkingScore::getOpenCollege, openCollege);
         return this.list(queryWrapper);
     }
+
+    @Override
+    public List<CourseResult> conditionCourseQuery(Long semesterId, Long examTypeId, Long collegeId) {
+        return this.baseMapper.conditionCourseQuery(semesterId, examTypeId, collegeId);
+    }
 }

+ 3 - 8
src/main/java/com/qmth/eds/service/impl/CommonServiceImpl.java

@@ -7,6 +7,7 @@ import com.qmth.eds.bean.auth.AuthBean;
 import com.qmth.eds.bean.dto.MenuDto;
 import com.qmth.eds.bean.dto.MenuPrivilegeDto;
 import com.qmth.eds.bean.dto.syssetting.SimpleObject;
+import com.qmth.eds.bean.result.CourseResult;
 import com.qmth.eds.bean.result.MenuResult;
 import com.qmth.eds.common.contant.SpringContextHolder;
 import com.qmth.eds.common.contant.SystemConstant;
@@ -16,7 +17,6 @@ import com.qmth.eds.common.enums.PrivilegeEnum;
 import com.qmth.eds.common.enums.PrivilegePropertyEnum;
 import com.qmth.eds.common.enums.RoleTypeEnum;
 import com.qmth.eds.common.util.JacksonUtil;
-import com.qmth.eds.common.util.ServletUtil;
 import com.qmth.eds.service.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -245,12 +245,7 @@ public class CommonServiceImpl implements CommonService {
     }
 
     @Override
-    public List<CloudMarkingScore> conditionCourseQuery(Long semesterId, Long examTypeId) {
-        QueryWrapper<CloudMarkingScore> queryWrapper = new QueryWrapper<>();
-        queryWrapper.select("distinct subject_code, subject_name").lambda()
-                .eq(CloudMarkingScore::getSemesterId, semesterId)
-                .eq(CloudMarkingScore::getExamTypeId, examTypeId)
-                .orderByAsc(CloudMarkingScore::getSubjectCode);
-        return cloudMarkingScoreService.list(queryWrapper);
+    public List<CourseResult> conditionCourseQuery(Long semesterId, Long examTypeId, Long collegeId) {
+        return cloudMarkingScoreService.conditionCourseQuery(semesterId, examTypeId, collegeId);
     }
 }

+ 11 - 16
src/main/java/com/qmth/eds/service/impl/ExamAssignServiceImpl.java

@@ -141,13 +141,16 @@ public class ExamAssignServiceImpl extends ServiceImpl<ExamAssignMapper, ExamAss
     }
 
     @Override
-    public ExamAssignDto toCalc(Long semesterId, Long examTypeId, Long collegeId, String courseCode, String courseName, String openCollege) {
+    public ExamAssignDto toCalc(Long semesterId, Long examTypeId, Long collegeId, String syncCourseCode, String courseCode, String courseName, String openCollege) {
+        if (StringUtils.isBlank(openCollege)) {
+            throw ExceptionResultEnum.ERROR.exception("未查询到开课学院,无法进行计算,请联系管理员处理");
+        }
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
 
         ExamAssign examAssign = this.baseMapper.getBySchoolIdAndSemesterIdAndExamTypeIdAndCourseCodeAndOpenCollege(collegeId, semesterId, examTypeId, courseCode, openCollege);
         ExamAssignDto examAssignDto = new ExamAssignDto();
         if (examAssign == null) {
-            examAssign = new ExamAssign(collegeId, semesterId, examTypeId, courseCode, courseName, openCollege, null, null, ExamAssignStatusEnum.INIT, false);
+            examAssign = new ExamAssign(collegeId, semesterId, examTypeId, syncCourseCode, courseCode, courseName, openCollege, null, null, ExamAssignStatusEnum.INIT, false);
             this.save(examAssign);
         }
         BeanUtils.copyProperties(examAssign, examAssignDto);
@@ -170,13 +173,13 @@ public class ExamAssignServiceImpl extends ServiceImpl<ExamAssignMapper, ExamAss
 
     @Transactional
     @Override
-    public boolean publish(Long id, Long semesterId, Long examTypeId, Long collegeId, String courseCode, String courseName, String openCollege) {
+    public boolean publish(Long id, Long semesterId, Long examTypeId, Long collegeId, String syncCourseCode, String courseCode, String courseName, String openCollege) {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
 
         ExamAssign examAssign;
         if (id == null) {
-            examAssign = new ExamAssign(collegeId, semesterId, examTypeId, courseCode, courseName, openCollege, null, null, ExamAssignStatusEnum.INIT, false);
+            examAssign = new ExamAssign(collegeId, semesterId, examTypeId, syncCourseCode, courseCode, courseName, openCollege, null, null, ExamAssignStatusEnum.INIT, false);
             examAssign.insertInfo(sysUser.getId());
             this.save(examAssign);
         } else {
@@ -207,10 +210,9 @@ public class ExamAssignServiceImpl extends ServiceImpl<ExamAssignMapper, ExamAss
                 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 -> ((StringUtils.isBlank(s.getCloudMarkingCourseCode()) && s.getKch().equals(cloudMarkingScore.getSubjectCode())) || (StringUtils.isNotBlank(s.getCloudMarkingCourseCode()) && s.getCloudMarkingCourseCode().equals(cloudMarkingScore.getSubjectCode())))
-                                && s.getXh().equals(cloudMarkingScore.getStudentCode())).findFirst();
+                        .filter(s -> s.getKch().equals(cloudMarkingScore.getSyncCourseCode()) && 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()));
+                    cloudMarkingScoreForeigns.add(new CloudMarkingScoreForeign(collegeId, semesterId, examTypeId, cloudMarkingScore.getExamId(), null, null, null, cloudMarkingScore.getSyncCourseCode(), cloudMarkingScore.getSubjectName(), cloudMarkingScore.getStudentCode(), cloudMarkingScore.getAssignScore()));
                 } else {
                     ExamSyncStudent examSyncStudent = optional.get();
                     // 匹配上,保存考务数据表ID
@@ -218,15 +220,8 @@ public class ExamAssignServiceImpl extends ServiceImpl<ExamAssignMapper, ExamAss
                 }
             }
         }
-
-        List<Integer> examIds = cloudMarkingScoreList.stream().map(CloudMarkingScore::getExamId).distinct().collect(Collectors.toList());
-        // 删除全量数据
-        UpdateWrapper<CloudMarkingScoreForeign> updateWrapper = new UpdateWrapper<>();
-        updateWrapper.lambda().eq(CloudMarkingScoreForeign::getSchoolId, collegeId)
-                .eq(CloudMarkingScoreForeign::getSemesterId, semesterId)
-                .eq(CloudMarkingScoreForeign::getExamTypeId, examTypeId)
-                .in(CloudMarkingScoreForeign::getExamId, examIds);
-        cloudMarkingScoreForeignService.remove(updateWrapper);
+        // 重新发布时,删除已发布的成绩
+        cloudMarkingScoreForeignService.deleteByCourseCode(collegeId, semesterId, examTypeId, syncCourseCode, courseCode);
 
         List<CloudMarkingScoreForeign> foreignData = new ArrayList<>();
         //1000条提交一次

+ 9 - 1
src/main/java/com/qmth/eds/service/impl/ExamCourseMappingServiceImpl.java

@@ -99,7 +99,7 @@ public class ExamCourseMappingServiceImpl extends ServiceImpl<ExamCourseMappingM
                 }
                 // 不存在,新增
                 if (examCourseMapping == null) {
-                    examCourseMapping = new ExamCourseMapping(schoolId, semesterId, examSemester.getName(), examTypeId, examType.getName(),examCourseMappingDto.getStudentCode(), examCourseMappingDto.getSyncCourseCode(), examCourseMappingDto.getCloudMarkingCourseCode());
+                    examCourseMapping = new ExamCourseMapping(schoolId, semesterId, examSemester.getName(), examTypeId, examType.getName(),examCourseMappingDto.getStudentCode(), examCourseMappingDto.getSyncCourseCode(), examCourseMappingDto.getCloudMarkingCourseCode(), null);
                 }
                 // 存在且云阅卷课程代码不一致,更新
                 else if (!examCourseMapping.getCloudMarkingCourseCode().equals(examCourseMappingDto.getCloudMarkingCourseCode())) {
@@ -113,4 +113,12 @@ public class ExamCourseMappingServiceImpl extends ServiceImpl<ExamCourseMappingM
             throw ExceptionResultEnum.ERROR.exception("导入异常:" + e.getMessage());
         }
     }
+
+    @Override
+    public List<ExamCourseMapping> listByExamTypeIdAndExamId(Long examTypeId, Integer examId) {
+        QueryWrapper<ExamCourseMapping> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(ExamCourseMapping::getExamTypeId, examTypeId)
+                .eq(ExamCourseMapping::getExamId, examId);
+        return this.list(queryWrapper);
+    }
 }

+ 189 - 32
src/main/java/com/qmth/eds/service/impl/WhuDataSyncServiceImpl.java

@@ -11,6 +11,8 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.googlecode.aviator.AviatorEvaluator;
 import com.qmth.boot.api.exception.ApiException;
 import com.qmth.eds.bean.dto.ExamSyncStudentDto;
+import com.qmth.eds.bean.dto.coefficient.Coefficient;
+import com.qmth.eds.bean.dto.coefficient.Detail;
 import com.qmth.eds.common.contant.SystemConstant;
 import com.qmth.eds.common.entity.*;
 import com.qmth.eds.common.enums.*;
@@ -19,20 +21,19 @@ import com.qmth.eds.common.tools.WhuUtils;
 import com.qmth.eds.common.util.FileUtil;
 import com.qmth.eds.service.*;
 import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
 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;
@@ -59,10 +60,8 @@ public class WhuDataSyncServiceImpl implements WhuDataSyncService {
 
     @Resource
     private CloudMarkingScoreService cloudMarkingScoreService;
-
     @Resource
-    private CloudMarkingScoreForeignService cloudMarkingScoreForeignService;
-
+    private ExamCourseMappingService examCourseMappingService;
     @Resource
     private ExamSyncStudentService examSyncStudentService;
 
@@ -77,6 +76,10 @@ public class WhuDataSyncServiceImpl implements WhuDataSyncService {
 
     @Resource
     private ExamAssignService examAssignService;
+    @Resource
+    private ExamSemesterService examSemesterService;
+    @Resource
+    private ExamTypeService examTypeService;
 
     @Async
     @Override
@@ -198,6 +201,8 @@ public class WhuDataSyncServiceImpl implements WhuDataSyncService {
         Long examTypeId = tbSyncTask.getExamTypeId();
         File txtFile = null;
         FileInputStream fis = null;
+        ExamSemester examSemester = examSemesterService.getById(semesterId);
+        ExamType examType = examTypeService.getById(examTypeId);
         // 汇总表ID
         try {
             // 同步中
@@ -206,8 +211,12 @@ public class WhuDataSyncServiceImpl implements WhuDataSyncService {
             Map<String, String> mapSource = new HashMap<>();
             mapSource.put("examId", String.valueOf(examId));
             int totalCount = cloudMarkingUtils.getStudentCount(schoolId, mapSource, collegeId);
+            List<ExamCourseMapping> examCourseMappingList = new ArrayList<>();
             List<CloudMarkingScore> cloudMarkingScoreList = new ArrayList<>();
             if (totalCount > 0) {
+                // 查询已关联的数据
+                List<ExamCourseMapping> examCourseMappings = examCourseMappingService.listByExamTypeIdAndExamId(examTypeId, examId);
+
                 int pageSize = SystemConstant.PAGE_SIZE;
                 int mod = totalCount % pageSize;
                 int pageNos = mod == 0 ? totalCount / pageSize : totalCount / pageSize + 1;
@@ -225,27 +234,43 @@ public class WhuDataSyncServiceImpl implements WhuDataSyncService {
                         cloudMarkingScore.setStudentCode(m.getString("studentCode"));
                         cloudMarkingScore.setName(m.getString("name"));
                         cloudMarkingScore.setSubjectCode(m.getString("subjectCode"));
+                        cloudMarkingScore.setSyncCourseCode(m.getString("remark"));
                         cloudMarkingScore.setSubjectName(m.getString("subjectName"));
                         cloudMarkingScore.setPaperType(m.getString("paperType"));
                         cloudMarkingScore.setCollege(m.getString("college"));
                         cloudMarkingScore.setClassName(m.getString("className"));
                         cloudMarkingScore.setTeacher(m.getString("teacher"));
                         cloudMarkingScore.setStatus(m.getInteger("status"));
-//                        cloudMarkingScore.setSheetUrls(m.getString("sheetUrls"));
                         cloudMarkingScore.setTotalScore(m.getString("totalScore"));
                         cloudMarkingScore.setObjectiveScore(m.getString("objectiveScore"));
                         cloudMarkingScore.setSubjectiveScore(m.getString("subjectiveScore"));
                         cloudMarkingScore.setObjectiveScoreDetail(m.getString("objectiveScoreDetail"));
                         cloudMarkingScore.setSubjectiveScoreDetail(m.getString("subjectiveScoreDetail"));
-//                        cloudMarkingScore.setMarkTags(m.getString("markTags"));
+
+                        Optional<ExamCourseMapping> optional = examCourseMappings.stream().filter(c -> cloudMarkingScore.getSubjectCode().equals(c.getCloudMarkingCourseCode()) && cloudMarkingScore.getStudentCode().equals(c.getStudentCode())).findFirst();
+                        if (optional.isPresent()) {
+                            ExamCourseMapping examCourseMapping = optional.get();
+                            if (!examCourseMapping.getSyncCourseCode().equals(cloudMarkingScore.getSyncCourseCode())) {
+                                examCourseMapping.setSyncCourseCode(cloudMarkingScore.getSyncCourseCode());
+                                examCourseMappingList.add(examCourseMapping);
+                            }
+                        } else {
+                            examCourseMappingList.add(new ExamCourseMapping(schoolId, semesterId, examSemester.getName(), examTypeId, examType.getName(), cloudMarkingScore.getStudentCode(), cloudMarkingScore.getSyncCourseCode(), cloudMarkingScore.getSubjectCode(), examId));
+                        }
+
                         return cloudMarkingScore;
                     }).collect(Collectors.toList());
                     cloudMarkingScoreList.addAll(cloudMarkingScores);
                 }
             }
 
+            // 关联关系数据为空,保存
+            if (CollectionUtils.isNotEmpty(examCourseMappingList)) {
+                examCourseMappingService.saveBatch(examCourseMappingList);
+            }
+
             //2.调用教务系统接口回传成绩
-            if (!cloudMarkingScoreList.isEmpty()) {
+            if (CollectionUtils.isNotEmpty(cloudMarkingScoreList)) {
                 saveScoreData(schoolId, collegeId, semesterId, examTypeId, examId, cloudMarkingScoreList);
             }
 
@@ -282,28 +307,79 @@ public class WhuDataSyncServiceImpl implements WhuDataSyncService {
         try {
             // 选模式
             // 解析计算参数
-            JSONObject object = JSON.parseObject(examAssign.getCoefficient());
-            Boolean all = object.getBoolean("all");
-            Double allValue = object.getDoubleValue("value");
+            Coefficient coefficient = JSON.parseObject(examAssign.getCoefficient(), Coefficient.class);
+            // 是否统一设置
+            Boolean all = coefficient.getAll();
+            if (all == null) {
+                throw ExceptionResultEnum.ERROR.exception("[是否统一设置all]不能为空");
+            }
+            // 统一设置系数
+            Double allValue = coefficient.getValue();
+            if (allValue == null) {
+                throw ExceptionResultEnum.ERROR.exception("[统一设置系数value]不能为空");
+            }
+            // 重修赋分系数
+            Boolean openRebuild = coefficient.getOpenRebuild();
+            if (openRebuild == null) {
+                throw ExceptionResultEnum.ERROR.exception("[重修单独设置赋分系数openRebuild]不能为空");
+            }
+            // 重修赋分系数
+            Double rebuildValue = coefficient.getRebuildValue();
+            if (openRebuild && rebuildValue == null) {
+                throw ExceptionResultEnum.ERROR.exception("[重修赋分系数rebuildValue]不能为空");
+            }
 
+            if (FormulaEnum.FORMULA1.equals(coefficient.getFormula())) {
+                Boolean openRound = coefficient.getOpenRound();
+                if (openRound == null) {
+                    throw ExceptionResultEnum.ERROR.exception("[赋分后59分自动加1openRound]不能为空");
+                }
+                Boolean open59To58 = coefficient.getOpen59To58();
+                if (open59To58 == null) {
+                    throw ExceptionResultEnum.ERROR.exception("[赋分后59分自动减1open59To58]不能为空");
+                }
+                Boolean openTotalScoreRound = coefficient.getOpenTotalScoreRound();
+                if (openTotalScoreRound == null) {
+                    throw ExceptionResultEnum.ERROR.exception("[原始分四舍五入openTotalScoreRound]不能为空");
+                }
+                Boolean open54To53 = coefficient.getOpen54To53();
+                if (open54To53 == null) {
+                    throw ExceptionResultEnum.ERROR.exception("[赋分后等于54分调整赋分分值为53openRebuild]不能为空");
+                }
+                Boolean open54d5 = coefficient.getOpen54d5();
+                if (open54d5 == null) {
+                    throw ExceptionResultEnum.ERROR.exception("[赋分后如果小于等于54.5的取原始分值open54d5]不能为空");
+                }
+            }
+
+            if (FormulaEnum.FORMULA2.equals(coefficient.getFormula())) {
+                Boolean openFetchOriginScore = coefficient.getOpenFetchOriginScore();
+                if (openFetchOriginScore == null) {
+                    throw ExceptionResultEnum.ERROR.exception("[赋分后小于原始分值取原始分值openFetchOriginScore]不能为空");
+                }
+            }
             List<ExamSyncStudentDto> finalList = new ArrayList<>();
             List<ExamSyncStudentDto> examSyncStudentDtoList = cloudMarkingScoreService.listExamSyncStudentDtos(examAssign.getSchoolId(), examAssign.getSemesterId(), examAssign.getExamTypeId(), examAssign.getCourseCode(), examAssign.getOpenCollege());
+            if (CollectionUtils.isEmpty(examSyncStudentDtoList)) {
+                throw ExceptionResultEnum.ERROR.exception("需要计算的数据有误,请联系管理员");
+            }
             // 初始卷面最高分
             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()) {
                     String college = entry.getKey();
-                    List<JSONObject> details = JSON.parseArray(object.getString("detail"), JSONObject.class);
-                    Optional<JSONObject> objectOptional = details.stream().filter(m -> m.getString("college").equals(college)).findFirst();
+                    List<Detail> details = coefficient.getDetail();
+                    Optional<Detail> objectOptional = details.stream().filter(m -> m.getCollege().equals(college)).findFirst();
                     if (!objectOptional.isPresent()) {
                         throw ExceptionResultEnum.ERROR.exception(String.format("开课学院[%s]未设置的参数值", college));
                     }
-                    double collegeValue = objectOptional.get().getDoubleValue("value");
-                    calcProgress(examAssign.getFormula(), collegeValue, entry.getValue(), maxTotalScore, finalList);
+                    double collegeValue = objectOptional.get().getValue();
+                    double collegeRebuildValue = objectOptional.get().getRebuildValue();
+                    calcProgress(examAssign, collegeValue, collegeRebuildValue, entry.getValue(), maxTotalScore, finalList);
                 }
             }
 
@@ -333,23 +409,38 @@ 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) {
+        Coefficient coefficient = JSON.parseObject(examAssign.getCoefficient(), Coefficient.class);
         // 公式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) {
+                double totalScoreDouble = Double.parseDouble(studentDto.getTotalScore());
+                // 开启原始分四舍五入,先将分数四舍五入后再进行赋分计算
+                if (coefficient.getOpenTotalScoreRound()) {
+                    totalScoreDouble = new BigDecimal(totalScoreDouble).setScale(0, RoundingMode.HALF_UP).doubleValue();
+                }
+                // 0分不参与赋分计算
+                if (totalScoreDouble == 0) {
+                    continue;
+                }
                 Map<String, Object> paramMap = new HashMap<>();
-                paramMap.put("a", Double.parseDouble(studentDto.getTotalScore()));
-                paramMap.put("b", value);
+                paramMap.put("a", totalScoreDouble);
+                // 判断是否重修
+                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()));
+                // 计算赋分值后,四舍五入
+                studentDto.setAssignScore(roundScoreForFormula1(valueRoundUp(assignScore), totalScoreDouble, coefficient));
                 finalList.add(studentDto);
             }
         }
@@ -359,31 +450,38 @@ 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) {
-                Map<String, Object> paramMap = new HashMap<>();
                 Double totalScore = Double.valueOf(studentDto.getTotalScore());
+                // 0分不参与赋分计算
+                if (totalScore.doubleValue() == 0) {
+                    continue;
+                }
+                // 判断是否重修
+                Double bValue = StringUtils.isNotBlank(studentDto.getCxbj()) && "1".equals(studentDto.getCxbj()) && rebuildValue != null && rebuildValue.doubleValue() != 0 ? rebuildValue : value;
+                Map<String, Object> paramMap = new HashMap<>();
                 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()));
+                studentDto.setAssignScore(roundScoreForFormula2(valueRoundUp(assignScore), totalScore, coefficient));
                 finalList.add(studentDto);
             }
         }
@@ -422,6 +520,67 @@ public class WhuDataSyncServiceImpl implements WhuDataSyncService {
         return new BigDecimal(value).stripTrailingZeros().toPlainString();
     }
 
+    /**
+     * 四舍五入后只保留整数
+     *
+     * @param value
+     * @return
+     */
+    private String valueRoundUp(String value) {
+        return new BigDecimal(value).setScale(0, RoundingMode.HALF_UP).stripTrailingZeros().toPlainString();
+    }
+
+    /**
+     * 满59进1到60
+     *
+     * @param assignScore
+     * @return
+     */
+    private String roundOff59(String assignScore, Coefficient coefficient) {
+        Boolean openRound = coefficient.getOpenRound();
+        Boolean open54To53 = coefficient.getOpen54To53();
+        Boolean open54d5 = coefficient.getOpen54d5();
+        // 分数>59,进1为60
+        int intValue = new BigDecimal(assignScore).setScale(0, RoundingMode.FLOOR).intValue();
+        if (openRound && intValue == 59) {
+            return "60";
+        } else {
+            return assignScore;
+        }
+    }
+
+    private String roundScoreForFormula1(String assignScore, double studentScore, Coefficient coefficient) {
+        Boolean openRound = coefficient.getOpenRound();
+        Boolean open54To53 = coefficient.getOpen54To53();
+        Boolean open54d5 = coefficient.getOpen54d5();
+        int intValue = new BigDecimal(assignScore).setScale(0, RoundingMode.FLOOR).intValue();
+        // 分数=59,进1为60
+        if (openRound && intValue == 59) {
+            return "60";
+        }
+        // 赋分后等于54分调整赋分分值为53
+        else if (open54To53 && intValue == 54) {
+            return "53";
+        }
+        // 赋分后如果小于54.5的取原始分值
+        else if (open54d5 && intValue < 54.5) {
+            return String.valueOf(studentScore);
+        } else {
+            return assignScore;
+        }
+    }
+
+    private String roundScoreForFormula2(String assignScore, double studentScore, Coefficient coefficient) {
+        Boolean openFetchOriginScore = coefficient.getOpenFetchOriginScore();
+        double doubleValue = new BigDecimal(assignScore).setScale(0, RoundingMode.FLOOR).doubleValue();
+        // 赋分后小于原始分值取原始分值
+        if (openFetchOriginScore && doubleValue < studentScore) {
+            return String.valueOf(studentScore);
+        } else {
+            return assignScore;
+        }
+    }
+
     @Transactional
     public void saveScoreData(Long schoolId, Long collegeId, Long semesterId, Long examTypeId, Integer examId, List<CloudMarkingScore> cloudMarkingScoreList) {
         // 查询对外数据
@@ -431,14 +590,12 @@ public class WhuDataSyncServiceImpl implements WhuDataSyncService {
         }
         List<ExamSyncStudent> examSyncStudents = examSyncStudentService.listByExamSyncTotalId(examSyncTotal);
         for (CloudMarkingScore cloudMarkingScore : cloudMarkingScoreList) {
-            Optional<ExamSyncStudent> optional = examSyncStudents.stream()
-                    .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();
+            // 通过课程号+学号进行云阅卷数据和考务数据匹配
+            Optional<ExamSyncStudent> optional = examSyncStudents.stream().filter(s -> s.getKch().equals(cloudMarkingScore.getSyncCourseCode()) && s.getXh().equals(cloudMarkingScore.getStudentCode())).findFirst();
             if (optional.isPresent()) {
                 ExamSyncStudent examSyncStudent = optional.get();
                 // 匹配上,保存考务数据表ID
-                cloudMarkingScore.setSyncCourseCode(examSyncStudent.getKch());
+//                cloudMarkingScore.setSyncCourseCode(examSyncStudent.getKch());
                 cloudMarkingScore.setOpenCollege(examSyncStudent.getKkbm());
                 cloudMarkingScore.setExamSyncStudentId(examSyncStudent.getId());
             }

+ 4 - 0
src/main/resources/db/log/1.1.0.sql

@@ -1,3 +1,7 @@
 ALTER TABLE `exam_course_mapping` ADD COLUMN `student_code` VARCHAR(50) NULL COMMENT '学号' AFTER `exam_type_name`;
 ALTER TABLE `cloud_marking_score` ADD COLUMN `sync_course_code` VARCHAR(45) NULL COMMENT '武大考务数据课程代码' AFTER `subject_name`;
 ALTER TABLE `cloud_marking_score` ADD COLUMN `open_college` VARCHAR(150) NULL COMMENT '开课学院' AFTER `sync_course_code`;
+ALTER TABLE `exam_course_mapping` ADD COLUMN `exam_id` INT(10) NULL COMMENT '云阅卷考试ID' AFTER `cloud_marking_course_code`;
+ALTER TABLE `exam_course_mapping` ADD INDEX `index_1` (`exam_type_id` ASC, `exam_id` ASC);
+ALTER TABLE `exam_assign` ADD COLUMN `sync_course_code` VARCHAR(45) NULL COMMENT '考务数据课程代码' AFTER `exam_type_id`;
+

+ 22 - 0
src/main/resources/mapper/CloudMarkingScoreForeignMapper.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.qmth.eds.mapper.CloudMarkingScoreForeignMapper">
+    <delete id="deleteByCourseCode">
+        DELETE
+        FROM
+            cloud_marking_score_foreign cmsf
+        WHERE
+            cmsf.school_id = #{collegeId}
+          AND cmsf.semester_id = #{semesterId}
+          AND cmsf.exam_type_id = #{examTypeId}
+          AND cmsf.kch = #{syncCourseCode}
+          AND EXISTS (
+                SELECT
+                    1
+                FROM
+                    ( SELECT * FROM cloud_marking_score WHERE school_id = #{collegeId} AND semester_id = #{semesterId} AND exam_type_id = #{examTypeId} AND subject_code = #{courseCode} ) cms
+                WHERE
+                    cmsf.kch = cms.sync_course_code
+                  AND cmsf.xh = cms.student_code)
+    </delete>
+</mapper>

+ 48 - 5
src/main/resources/mapper/CloudMarkingScoreMapper.xml

@@ -21,9 +21,10 @@
                 WHEN 3 THEN '违纪'
                 END status,
             cms.total_score totalScore,
-            cms.assign_score assignScore,
+            ifnull(cms.assign_score, '/') assignScore,
             cms.objective_score objectiveScore,
-            cms.subjective_score subjectiveScore
+            cms.subjective_score subjectiveScore,
+            case when cms.exam_sync_student_id is null then '未关联' else '已关联' end relateExamData
         FROM
             cloud_marking_score cms
                 join
@@ -31,7 +32,9 @@
                 join
             (select * from exam_type where enable = true) eti on cms.exam_type_id = eti.id
         <where>
-            and cms.school_id = #{collegeId}
+            <if test="collegeId != null">
+                and cms.school_id = #{collegeId}
+            </if>
             <if test="semesterId != null">
                 and cms.semester_id = #{semesterId}
             </if>
@@ -41,6 +44,23 @@
             <if test="examId != null">
                 and cms.exam_id = #{examId}
             </if>
+            <if test="syncCourseCode != null">
+                and cms.sync_course_code = #{syncCourseCode}
+            </if>
+            <if test="cloudMarkingCourseCode != null">
+                and cms.subject_code = #{cloudMarkingCourseCode}
+            </if>
+            <if test="studentCode != null">
+                and cms.student_code like concat('%', #{studentCode}, '%')
+            </if>
+            <if test="related != null">
+                <if test="related == true">
+                    and cms.exam_sync_student_id is not null
+                </if>
+                <if test="related == false">
+                    and cms.exam_sync_student_id is null
+                </if>
+            </if>
         </where>
     </select>
 
@@ -49,9 +69,12 @@
             cms.id cloudMarkingScoreId,
             cms.total_score totalScore,
             cms.open_college kkbm,
-            cms.college jgmc
+            cms.college jgmc,
+            ess.cxbj
         FROM
             cloud_marking_score cms
+                LEFT JOIN
+            exam_sync_student ess ON cms.exam_sync_student_id = ess.id
         <where>
             <if test="schoolId != null">
                 and cms.school_id = #{schoolId}
@@ -119,7 +142,8 @@
             cms.name xsxm,
             ess.jgmc,
             cms.total_score totalScore,
-            cms.assign_score assignScore
+            cms.assign_score assignScore,
+            case when cms.exam_sync_student_id is null then '未关联' else '已关联' end relateExamData
         FROM
             cloud_marking_score cms
                 LEFT JOIN
@@ -146,4 +170,23 @@
             </if>
         </where>
     </select>
+    <select id="conditionCourseQuery" resultType="com.qmth.eds.bean.result.CourseResult">
+        SELECT
+            distinct cms.subject_code courseCode, cms.subject_name courseName
+        FROM
+            cloud_marking_score cms
+        WHERE
+            cms.semester_id = #{semesterId}
+          AND cms.exam_type_id = #{examTypeId}
+          <if test="collegeId != null">
+              AND EXISTS( SELECT
+                              1
+                          FROM
+                              cloud_marking_exam cme
+                          WHERE
+                              cme.school_id = #{collegeId}
+                            AND cms.exam_id = cme.exam_id)
+          </if>
+        ORDER BY cms.subject_code
+    </select>
 </mapper>

+ 4 - 1
src/main/resources/mapper/ExamAssignMapper.xml

@@ -86,11 +86,14 @@
                exam_type_id examTypeId,
                course_code courseCode,
                course_name courseName,
+               open_round openRound,
+               open_total_score_round openTotalScoreRound,
                open_college openCollege,
                formula,
                coefficient,
                status,
-               publish
+               publish,
+               error_msg errorMsg
             from exam_assign t
         where
             t.school_id = #{collegeId}