소스 검색

add: 教研分析拉取知学知考并新增本地数据

caozixuan 3 년 전
부모
커밋
63d5ca70f7
14개의 변경된 파일475개의 추가작업 그리고 49개의 파일을 삭제
  1. 0 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/analyze/GradePaperDimensionParam.java
  2. 0 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/analyze/GradePaperStructParam.java
  3. 6 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradePaperStructServiceImpl.java
  4. 1 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/EvaluationEnum.java
  5. 1 2
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/SysUserService.java
  6. 1 2
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysUserServiceImpl.java
  7. 5 3
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/dto/printOpen/AnswerInfo.java
  8. 10 9
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/dto/printOpen/ExamStudentScore.java
  9. 4 3
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/dto/printOpen/PaperEvaluation.java
  10. 1 1
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/AnalyzeDataGetAndEditService.java
  11. 9 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TBSchoolClazzService.java
  12. 402 23
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/AnalyzeDataGetAndEditServiceImpl.java
  13. 34 0
      teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TBSchoolClazzServiceImpl.java
  14. 1 1
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/BasicDatasourceController.java

+ 0 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/analyze/GradePaperDimensionParam.java

@@ -31,7 +31,6 @@ public class GradePaperDimensionParam {
 
     @ApiModelProperty(value = "成绩分析课程维度数据源")
     @NotNull(message = "缺少试卷维度")
-    @Range(min = 1L, message = "缺少试卷维度")
     private List<GradePaperDimensionDatasource> datasource;
 
     public String getPaperNumber() {

+ 0 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/params/analyze/GradePaperStructParam.java

@@ -27,7 +27,6 @@ public class GradePaperStructParam {
 
     @ApiModelProperty(value = "分析试卷数据集")
     @NotNull(message = "请填写试卷结构")
-    @Range(min = 1L, message = "请填写试卷结构")
     private List<GradePaperStructDatasource> datasource;
 
     public String getPaperNumber() {

+ 6 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradePaperStructServiceImpl.java

@@ -312,8 +312,12 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
             gradePaperStruct.setBigTopicName(e.getBigTopicName());
             gradePaperStruct.setFullScore(e.getFullScore());
             gradePaperStruct.setScoreRules(e.getScoreRules());
-            gradePaperStruct.setKnowledgeDimension(e.getKnowledgeDimension());
-            gradePaperStruct.setAbilityDimension(e.getAbilityDimension());
+            if (SystemConstant.strNotNull(e.getKnowledgeDimension())) {
+                gradePaperStruct.setKnowledgeDimension(e.getKnowledgeDimension());
+            }
+            if (SystemConstant.strNotNull(e.getAbilityDimension())) {
+                gradePaperStruct.setAbilityDimension(e.getAbilityDimension());
+            }
             gradePaperStruct.insertInfo(userId);
             return Stream.of(gradePaperStruct);
         }).collect(Collectors.toList());

+ 1 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/EvaluationEnum.java

@@ -6,7 +6,7 @@ package com.qmth.teachcloud.common.enums;
  * @Date: 2022-05-31
  */
 public enum EvaluationEnum {
-    PERSONAL_SCORE_RATE("个人得分率"),
+    PERSONAL_SCORE_RATE("得分率"),
     PERCENTILE_RANK("百分等级"),
     ;
     EvaluationEnum(String desc) {

+ 1 - 2
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/SysUserService.java

@@ -85,11 +85,10 @@ public interface SysUserService extends IService<SysUser> {
      * 根据外键查找教师信息
      *
      * @param schoolId    学校id
-     * @param teacherName 教师名称
      * @param teacherCode 教师编号
      * @return 学院数据
      */
-    SysUser findByForeignKey(Long schoolId, String teacherName, String teacherCode);
+    SysUser findByForeignKey(Long schoolId, String teacherCode);
 
     /**
      * 临时-不鉴权保存用户 (默认创建用户角色为该学校管理员)

+ 1 - 2
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysUserServiceImpl.java

@@ -480,10 +480,9 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     }
 
     @Override
-    public SysUser findByForeignKey(Long schoolId, String teacherName, String teacherCode) {
+    public SysUser findByForeignKey(Long schoolId, String teacherCode) {
         List<SysUser> tbSchoolTeacherList = this.list(new QueryWrapper<SysUser>().lambda()
                 .eq(SysUser::getSchoolId, schoolId)
-                .eq(SysUser::getRealName, teacherName)
                 .eq(SysUser::getLoginName, teacherCode));
         SysRole sysRole = sysRoleService.getOne(new QueryWrapper<SysRole>().lambda().eq(SysRole::getType, RoleTypeEnum.TEACHER));
 //        tbSchoolTeacherList = tbSchoolTeacherList.stream().filter(e -> Arrays.asList(e.getRoleIds()).contains(sysRole.getId())).collect(Collectors.toList());

+ 5 - 3
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/dto/printOpen/AnswerInfo.java

@@ -1,21 +1,23 @@
 package com.qmth.teachcloud.report.business.bean.dto.printOpen;
 
+import java.math.BigDecimal;
+
 /**
  * @Description: 考生每题目作答
  * @Author: CaoZixuan
  * @Date: 2022-06-08
  */
 public class AnswerInfo {
-    private String score;
+    private BigDecimal score;
     private String answer;
     private Integer mainNumber;
     private String subNumber;
 
-    public String getScore() {
+    public BigDecimal getScore() {
         return score;
     }
 
-    public void setScore(String score) {
+    public void setScore(BigDecimal score) {
         this.score = score;
     }
 

+ 10 - 9
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/dto/printOpen/ExamStudentScore.java

@@ -1,5 +1,6 @@
 package com.qmth.teachcloud.report.business.bean.dto.printOpen;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -19,9 +20,9 @@ public class ExamStudentScore {
     private String teacherName;
     private String teacherCode;
     private Integer status;
-    private Double totalScore;
-    private Double objectiveScore;
-    private Double subjectiveScore;
+    private BigDecimal totalScore;
+    private BigDecimal objectiveScore;
+    private BigDecimal subjectiveScore;
     private List<AnswerInfo> objectiveScoreDetail;
     private List<AnswerInfo> subjectiveScoreDetail;
 
@@ -113,27 +114,27 @@ public class ExamStudentScore {
         this.status = status;
     }
 
-    public Double getTotalScore() {
+    public BigDecimal getTotalScore() {
         return totalScore;
     }
 
-    public void setTotalScore(Double totalScore) {
+    public void setTotalScore(BigDecimal totalScore) {
         this.totalScore = totalScore;
     }
 
-    public Double getObjectiveScore() {
+    public BigDecimal getObjectiveScore() {
         return objectiveScore;
     }
 
-    public void setObjectiveScore(Double objectiveScore) {
+    public void setObjectiveScore(BigDecimal objectiveScore) {
         this.objectiveScore = objectiveScore;
     }
 
-    public Double getSubjectiveScore() {
+    public BigDecimal getSubjectiveScore() {
         return subjectiveScore;
     }
 
-    public void setSubjectiveScore(Double subjectiveScore) {
+    public void setSubjectiveScore(BigDecimal subjectiveScore) {
         this.subjectiveScore = subjectiveScore;
     }
 

+ 4 - 3
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/bean/dto/printOpen/PaperEvaluation.java

@@ -1,6 +1,7 @@
 package com.qmth.teachcloud.report.business.bean.dto.printOpen;
 
 import com.qmth.teachcloud.common.enums.DimensionEnum;
+import com.qmth.teachcloud.common.enums.EvaluationEnum;
 
 import java.util.List;
 
@@ -14,7 +15,7 @@ public class PaperEvaluation {
     private String interpret;
     private String remark;
     private List<SecondaryDimensionLevelDefine> secondaryDimensionLevelDefineList;
-    private String formula;
+    private EvaluationEnum formula;
     private List<ModuleEvaluation> moduleEvaluationList;
 
     public DimensionEnum getModuleType() {
@@ -49,11 +50,11 @@ public class PaperEvaluation {
         this.secondaryDimensionLevelDefineList = secondaryDimensionLevelDefineList;
     }
 
-    public String getFormula() {
+    public EvaluationEnum getFormula() {
         return formula;
     }
 
-    public void setFormula(String formula) {
+    public void setFormula(EvaluationEnum formula) {
         this.formula = formula;
     }
 

+ 1 - 1
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/AnalyzeDataGetAndEditService.java

@@ -49,5 +49,5 @@ public interface AnalyzeDataGetAndEditService {
      */
     void tbPaperModuleDispose(Long examId, String courseCode, Long schoolId) throws IOException;
 
-    void tbExamStudentScoreDatasourceDispose(Long examId, String courseCode, Long schoolId);
+    void tbExamStudentScoreDatasourceDispose(Long examId, String courseCode, Long schoolId) throws IOException;
 }

+ 9 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/TBSchoolClazzService.java

@@ -1,8 +1,11 @@
 package com.qmth.teachcloud.report.business.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.report.business.bean.dto.query.TBSchoolClazzDto;
 import com.qmth.teachcloud.report.business.entity.TBSchoolClazz;
 
+import java.util.List;
+
 /**
  * <p>
  * 学校班级表 服务类
@@ -20,4 +23,10 @@ public interface TBSchoolClazzService extends IService<TBSchoolClazz> {
      * @return 基础班级数据
      */
     TBSchoolClazz findByForeignKey(Long schoolId,String clazzCode,String clazzName);
+
+    /**
+     * 保存班级信息
+     * @param tbSchoolClazzDtoList tbSchoolClazzDtoList
+     */
+    void saveClazzInfo(List<TBSchoolClazzDto> tbSchoolClazzDtoList);
 }

+ 402 - 23
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/AnalyzeDataGetAndEditServiceImpl.java

@@ -1,12 +1,24 @@
 package com.qmth.teachcloud.report.business.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qmth.teachcloud.common.bean.params.UserSaveParams;
 import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.SysOrg;
+import com.qmth.teachcloud.common.entity.SysRole;
+import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.DimensionEnum;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.RoleTypeEnum;
 import com.qmth.teachcloud.common.service.BasicCourseService;
+import com.qmth.teachcloud.common.service.SysOrgService;
+import com.qmth.teachcloud.common.service.SysRoleService;
+import com.qmth.teachcloud.common.service.SysUserService;
 import com.qmth.teachcloud.report.business.bean.dto.printOpen.*;
+import com.qmth.teachcloud.report.business.bean.dto.query.TBSchoolClazzDto;
+import com.qmth.teachcloud.report.business.bean.dto.query.TBSchoolCollegeDto;
+import com.qmth.teachcloud.report.business.bean.dto.query.TBSchoolTeacherDto;
 import com.qmth.teachcloud.report.business.entity.*;
+import com.qmth.teachcloud.report.business.enums.NumberTypeEnum;
 import com.qmth.teachcloud.report.business.service.*;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -42,6 +54,24 @@ public class AnalyzeDataGetAndEditServiceImpl implements AnalyzeDataGetAndEditSe
     private TBModuleProficiencyService tbModuleProficiencyService;
     @Resource
     private TBModuleConfigService tbModuleConfigService;
+    @Resource
+    private TBSchoolClazzService tbSchoolClazzService;
+    @Resource
+    private SysOrgService sysOrgService;
+    @Resource
+    private SysUserService sysUserService;
+    @Resource
+    private SysRoleService sysRoleService;
+    @Resource
+    private TBStudentService tbStudentService;
+    @Resource
+    private TBExamService tbExamService;
+    @Resource
+    private TBExamStudentService tbExamStudentService;
+    @Resource
+    private TBExamRecordService tbExamRecordService;
+    @Resource
+    private TBAnswerService tbAnswerService;
 
     @Resource
     private AnalyzeDataCheckService analyzeDataCheckService;
@@ -50,11 +80,11 @@ public class AnalyzeDataGetAndEditServiceImpl implements AnalyzeDataGetAndEditSe
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void tbPaperDispose(Long examId, String courseCode, Long schoolId) throws IOException {
-        if (tbExamCourseService.verifyExamCourseCantRun(examId,schoolId,courseCode,null)){
+        if (tbExamCourseService.verifyExamCourseCantRun(examId, schoolId, courseCode, null)) {
             throw ExceptionResultEnum.ERROR.exception("课程编号为【" + courseCode + "】的课程不能进行数据更改");
         }
         String courseName = basicCourseService.findByCourseCode(courseCode, schoolId).getName();
-        PaperConfig paperConfig = callPrintOpenApiService.callPaperConfig(examId,courseCode);
+        PaperConfig paperConfig = callPrintOpenApiService.callPaperConfig(examId, courseCode);
 
         BigDecimal coefficient = BigDecimal.ZERO;
         if (Objects.nonNull(paperConfig.getCoefficient())) {
@@ -78,7 +108,7 @@ public class AnalyzeDataGetAndEditServiceImpl implements AnalyzeDataGetAndEditSe
         tbPaper.setPaperType(paperConfig.getPaperType());
         Long startTime = tbPaper.getStartTime();
         Long endTime = tbPaper.getEndTime();
-        if (!SystemConstant.isOneNull(startTime,endTime)){
+        if (!SystemConstant.isOneNull(startTime, endTime)) {
             tbPaper.setStartTime(startTime);
             tbPaper.setEndTime(endTime);
         }
@@ -93,10 +123,10 @@ public class AnalyzeDataGetAndEditServiceImpl implements AnalyzeDataGetAndEditSe
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void tbPaperDimensionDispose(Long examId, String courseCode, Long schoolId) throws IOException {
-        if (tbExamCourseService.verifyExamCourseCantRun(examId,schoolId,courseCode,null)){
+        if (tbExamCourseService.verifyExamCourseCantRun(examId, schoolId, courseCode, null)) {
             throw ExceptionResultEnum.ERROR.exception("课程编号为【" + courseCode + "】的课程不能进行数据更改");
         }
-        List<PaperDimension> paperDimensionList = callPrintOpenApiService.callPaperDimension(examId,courseCode);
+        List<PaperDimension> paperDimensionList = callPrintOpenApiService.callPaperDimension(examId, courseCode);
         String courseName = basicCourseService.findByCourseCode(courseCode, schoolId).getName();
 
         List<TBDimension> tbDimensionList = paperDimensionList.stream().flatMap(e -> {
@@ -114,7 +144,7 @@ public class AnalyzeDataGetAndEditServiceImpl implements AnalyzeDataGetAndEditSe
             return Stream.of(tbDimension);
         }).collect(Collectors.toList());
         // 根据课程编号删除已有
-        tbDimensionService.remove(new QueryWrapper<TBDimension>().lambda().eq(TBDimension::getExamId,examId).eq(TBDimension::getCourseCode,courseCode));
+        tbDimensionService.remove(new QueryWrapper<TBDimension>().lambda().eq(TBDimension::getExamId, examId).eq(TBDimension::getCourseCode, courseCode));
         // 批量新增
         tbDimensionService.saveBatch(tbDimensionList);
     }
@@ -122,17 +152,17 @@ public class AnalyzeDataGetAndEditServiceImpl implements AnalyzeDataGetAndEditSe
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void tbPaperStructDispose(Long examId, String courseCode, Long schoolId) throws IOException {
-        if (tbExamCourseService.verifyExamCourseCantRun(examId,schoolId,courseCode,null)){
+        if (tbExamCourseService.verifyExamCourseCantRun(examId, schoolId, courseCode, null)) {
             throw ExceptionResultEnum.ERROR.exception("课程编号为【" + courseCode + "】的课程不能进行数据更改");
         }
-        List<TBPaper> tbPaperList = tbPaperService.list(new QueryWrapper<TBPaper>().lambda().eq(TBPaper::getExamId,examId).eq(TBPaper::getCourseCode,courseCode));
-        if (tbPaperList.size() != 1){
+        List<TBPaper> tbPaperList = tbPaperService.list(new QueryWrapper<TBPaper>().lambda().eq(TBPaper::getExamId, examId).eq(TBPaper::getCourseCode, courseCode));
+        if (tbPaperList.size() != 1) {
             throw ExceptionResultEnum.ERROR.exception("未找到考试id为【" + examId + "】,课程编号为【" + courseCode + "】的唯一试卷");
         }
         TBPaper tbPaper = tbPaperList.get(0);
         Long paperId = tbPaper.getId();
 
-        List<PaperStructure> paperStructureList = callPrintOpenApiService.callPaperStruct(examId,courseCode);
+        List<PaperStructure> paperStructureList = callPrintOpenApiService.callPaperStruct(examId, courseCode);
 
         List<TBPaperStruct> tbPaperStructList = paperStructureList.stream().flatMap(e -> {
             TBPaperStruct tbPaperStruct = new TBPaperStruct();
@@ -148,14 +178,14 @@ public class AnalyzeDataGetAndEditServiceImpl implements AnalyzeDataGetAndEditSe
             String knowledgeDimension = e.getKnowledgeDimension();
             String abilityDimension = e.getAbilityDimension();
             // TODO: 2022/6/9  校验的实现
-            analyzeDataCheckService.checkPaperStructInDimensionDatasource(knowledgeDimension,abilityDimension,examId,courseCode);
+            analyzeDataCheckService.checkPaperStructInDimensionDatasource(knowledgeDimension, abilityDimension, examId, courseCode);
             tbPaperStruct.setKnowledgeDimension(knowledgeDimension);
             tbPaperStruct.setAbilityDimension(abilityDimension);
             return Stream.of(tbPaperStruct);
         }).collect(Collectors.toList());
 
         // 删除试卷id下所有试卷结构
-        tbPaperStructService.remove(new QueryWrapper<TBPaperStruct>().lambda().eq(TBPaperStruct::getPaperId,paperId));
+        tbPaperStructService.remove(new QueryWrapper<TBPaperStruct>().lambda().eq(TBPaperStruct::getPaperId, paperId));
         // 新增试卷id下的试卷结构
         tbPaperStructService.saveBatch(tbPaperStructList);
     }
@@ -163,26 +193,26 @@ public class AnalyzeDataGetAndEditServiceImpl implements AnalyzeDataGetAndEditSe
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void tbPaperModuleDispose(Long examId, String courseCode, Long schoolId) throws IOException {
-        if (tbExamCourseService.verifyExamCourseCantRun(examId,schoolId,courseCode,null)){
+        if (tbExamCourseService.verifyExamCourseCantRun(examId, schoolId, courseCode, null)) {
             throw ExceptionResultEnum.ERROR.exception("课程编号为【" + courseCode + "】的课程不能进行数据更改");
         }
         String courseName = basicCourseService.findByCourseCode(courseCode, schoolId).getName();
-        List<PaperEvaluation> paperEvaluationList = callPrintOpenApiService.callPaperModule(examId,courseCode);
+        List<PaperEvaluation> paperEvaluationList = callPrintOpenApiService.callPaperModule(examId, courseCode);
 
         List<TBModuleProficiency> tbModuleProficiencyList = new ArrayList<>();
         List<TBModuleConfig> tbModuleConfigList = new ArrayList<>();
-        Map<DimensionEnum,PaperEvaluation> checkDimensionType = new HashMap<>();
+        Map<DimensionEnum, PaperEvaluation> checkDimensionType = new HashMap<>();
         for (PaperEvaluation paperEvaluation : paperEvaluationList) {
             // 校验大的数据结构
             DimensionEnum moduleType = paperEvaluation.getModuleType();
-            if (checkDimensionType.containsKey(moduleType)){
+            if (checkDimensionType.containsKey(moduleType)) {
                 throw ExceptionResultEnum.ERROR.exception("模块数据存在相同模块类型【" + moduleType + "】异常");
             }
-            checkDimensionType.put(moduleType,paperEvaluation);
+            checkDimensionType.put(moduleType, paperEvaluation);
 
             String interpret = paperEvaluation.getInterpret();
             String remark = paperEvaluation.getRemark();
-            String formula = paperEvaluation.getFormula();
+            String formula = paperEvaluation.getFormula().getDesc();
 
             // 解析并生成't_b_module_proficiency' 二级维度精熟度
             List<SecondaryDimensionLevelDefine> secondaryDimensionLevelDefineList = paperEvaluation.getSecondaryDimensionLevelDefineList();
@@ -230,19 +260,368 @@ public class AnalyzeDataGetAndEditServiceImpl implements AnalyzeDataGetAndEditSe
         }
         // 删除后新增
         tbModuleProficiencyService.remove(new QueryWrapper<TBModuleProficiency>().lambda()
-                .eq(TBModuleProficiency::getExamId,examId)
-                .eq(TBModuleProficiency::getCourseCode,courseCode));
+                .eq(TBModuleProficiency::getExamId, examId)
+                .eq(TBModuleProficiency::getCourseCode, courseCode));
         tbModuleProficiencyService.saveBatch(tbModuleProficiencyList);
 
         tbModuleConfigService.remove(new QueryWrapper<TBModuleConfig>().lambda()
-                .eq(TBModuleConfig::getExamId,examId)
-                .eq(TBModuleConfig::getCourseCode,courseCode));
+                .eq(TBModuleConfig::getExamId, examId)
+                .eq(TBModuleConfig::getCourseCode, courseCode));
         tbModuleConfigService.saveBatch(tbModuleConfigList);
     }
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public void tbExamStudentScoreDatasourceDispose(Long examId, String courseCode, Long schoolId) {
+    public void tbExamStudentScoreDatasourceDispose(Long examId, String courseCode, Long schoolId) throws IOException {
+        if (tbExamCourseService.verifyExamCourseCantRun(examId, schoolId, courseCode, null)) {
+            throw ExceptionResultEnum.ERROR.exception("课程编号为【" + courseCode + "】的课程不能进行数据更改");
+        }
+        String courseName = basicCourseService.findByCourseCode(courseCode, schoolId).getName();
+        List<ExamStudentScore> examStudentScoreList = callPrintOpenApiService.callExamStudentScore(examId, courseCode);
+
+        // 1.创建班级数据
+        this.createTBSchoolClazz(examStudentScoreList, schoolId);
+        // 2.筛选并创建学校学院表
+        this.createCollegeInfo(examStudentScoreList, schoolId);
+        // 3.筛选并创建教师
+        this.saveTeacherInfo(examStudentScoreList, examId, courseCode, schoolId);
+        // 4.创建学生及作答
+        this.saveExamStudentScore(examStudentScoreList, examId, courseCode, courseName, schoolId);
+    }
+
+    /**
+     * 创建基础班级数据
+     *
+     * @param examStudentScoreList 考生成绩数据源
+     * @param schoolId             学校id
+     */
+    private void createTBSchoolClazz(List<ExamStudentScore> examStudentScoreList, Long schoolId) {
+        List<TBSchoolClazzDto> tbSchoolClazzDtoList = new ArrayList<>();
+        List<String> clazzList = examStudentScoreList.stream()
+                .map(ExamStudentScore::getClassName)
+                .distinct().collect(Collectors.toList());
+        for (String clazzInfo : clazzList) {
+            TBSchoolClazzDto tbSchoolClazzDto = new TBSchoolClazzDto();
+            tbSchoolClazzDto.setSchoolId(schoolId);
+            tbSchoolClazzDto.setClazzCode(clazzInfo);
+            tbSchoolClazzDto.setClazzName(clazzInfo);
+            tbSchoolClazzDtoList.add(tbSchoolClazzDto);
+        }
+        tbSchoolClazzService.saveClazzInfo(tbSchoolClazzDtoList);
+    }
+
+    /**
+     * 筛选并创建学校学院表
+     *
+     * @param examStudentScoreList 考生集合
+     * @param schoolId             学校id
+     */
+    private void createCollegeInfo(List<ExamStudentScore> examStudentScoreList, Long schoolId) {
+        List<TBSchoolCollegeDto> tbSchoolCollegeDtoList = new ArrayList<>();
+        List<String> collegeList = examStudentScoreList.stream()
+                .map(ExamStudentScore::getCollege)
+                .distinct().collect(Collectors.toList());
+        for (String collegeInfo : collegeList) {
+            TBSchoolCollegeDto tbSchoolCollegeDto = new TBSchoolCollegeDto();
+            tbSchoolCollegeDto.setSchoolId(schoolId);
+            tbSchoolCollegeDto.setCollegeCode(collegeInfo);
+            tbSchoolCollegeDto.setCollegeName(collegeInfo);
+            tbSchoolCollegeDtoList.add(tbSchoolCollegeDto);
+        }
+        for (TBSchoolCollegeDto tbSchoolCollegeDto : tbSchoolCollegeDtoList) {
+            sysOrgService.searchOrInsert(tbSchoolCollegeDto.getSchoolId(), tbSchoolCollegeDto.getCollegeName());
+        }
+    }
+
+
+    /**
+     * 更新或新增教师信息
+     *
+     * @param examStudentScoreList 考生集合
+     * @param examId               考试id
+     * @param courseCode           课程编号
+     * @param schoolId             学校id
+     */
+    private void saveTeacherInfo(List<ExamStudentScore> examStudentScoreList, Long examId, String courseCode, Long schoolId) {
+        TBExamCourse tbExamCourse = tbExamCourseService.getOne(new QueryWrapper<TBExamCourse>().lambda()
+                .eq(TBExamCourse::getExamId, examId)
+                .eq(TBExamCourse::getCourseCode, courseCode)
+                .eq(TBExamCourse::getSchoolId, schoolId));
+        if (Objects.isNull(tbExamCourse)) {
+            throw ExceptionResultEnum.ERROR.exception("缺少课程数据");
+        }
+        Long teachCollegeId = tbExamCourse.getTeachCollegeId();
+        if (SystemConstant.longNotNull(teachCollegeId)) {
+            throw ExceptionResultEnum.ERROR.exception("课程数据缺少开课学院异常");
+        }
+
+        Map<String, String> teacherMap = new HashMap<>();
+        for (ExamStudentScore examStudentScore : examStudentScoreList) {
+            String teacherCode = examStudentScore.getTeacherCode();
+            String teacherName = examStudentScore.getTeacherName();
+            if (SystemConstant.isOneNull(teacherCode, teacherName)) {
+                throw ExceptionResultEnum.ERROR.exception("缺少教师数据");
+            }
+            if (teacherMap.containsKey(teacherCode)) {
+                String value = teacherMap.get(teacherCode);
+                if (!teacherName.equals(value)) {
+                    throw ExceptionResultEnum.ERROR.exception("教师工号【" + teacherCode + "】对应多个教师名称");
+                }
+                continue;
+            }
+            teacherMap.put(teacherCode, teacherName);
+        }
+
+        List<TBSchoolTeacherDto> tbSchoolTeacherDtoList = teacherMap.keySet().stream().flatMap(e -> {
+            TBSchoolTeacherDto tbSchoolTeacherDto = new TBSchoolTeacherDto();
+            tbSchoolTeacherDto.setSchoolId(schoolId);
+            tbSchoolTeacherDto.setTeacherCode(e);
+            tbSchoolTeacherDto.setTeacherName(teacherMap.get(e));
+            tbSchoolTeacherDto.setOrgId(teachCollegeId);
+            return Stream.of(tbSchoolTeacherDto);
+        }).collect(Collectors.toList());
+
+
+        Map<String, String> checkMap = new HashMap<>();
+        for (TBSchoolTeacherDto tbSchoolTeacherDto : tbSchoolTeacherDtoList) {
+            if (checkMap.containsKey(tbSchoolTeacherDto.getTeacherCode())) {
+                continue;
+            }
+            SysUser old = sysUserService.getOne(new QueryWrapper<SysUser>().lambda()
+                    .eq(SysUser::getSchoolId, tbSchoolTeacherDto.getSchoolId())
+                    .eq(SysUser::getLoginName, tbSchoolTeacherDto.getTeacherCode())
+                    .eq(SysUser::getRealName, tbSchoolTeacherDto.getTeacherName()));
+            checkMap.put(tbSchoolTeacherDto.getTeacherCode(), tbSchoolTeacherDto.getTeacherName());
+            Long id = 0L;
+            if (Objects.nonNull(old)) {
+                id = old.getId();
+            }
+
+            SysRole teacherRole = sysRoleService.list(new QueryWrapper<SysRole>().lambda().eq(SysRole::getType, RoleTypeEnum.TEACHER)).get(0);
+            List<Long> roleIds = new ArrayList<>();
+            roleIds.add(teacherRole.getId());
+
+            UserSaveParams userSaveParams = new UserSaveParams();
+            if (id > 0) {
+                userSaveParams.setId(id);
+            }
+
+
+            userSaveParams.setSchoolId(tbSchoolTeacherDto.getSchoolId());
+            userSaveParams.setLoginName(tbSchoolTeacherDto.getTeacherCode());
+            userSaveParams.setRealName(tbSchoolTeacherDto.getTeacherName());
+            userSaveParams.setPassword(SystemConstant.DEFAULT_PASSWORD);
+            userSaveParams.setOrgId(tbSchoolTeacherDto.getOrgId());
+            userSaveParams.setEnable(true);
+            userSaveParams.setRoleIds(roleIds.toArray(new Long[0]));
+            sysUserService.saveUserNoAuth(userSaveParams);
+        }
+    }
+
+    /**
+     * 新增处理考生成绩相关数据
+     * <p>
+     * 1.t_b_student
+     * 2.t_b_exam_student
+     * 3.t_b_exam_record
+     * 4.t_b_answer
+     * </p>
+     *
+     * @param examStudentScoreList 考生成绩相关信息
+     * @param examId               考试id
+     * @param courseCode           课程编号
+     * @param courseName           课程名称
+     * @param schoolId             学校id
+     */
+    private void saveExamStudentScore(List<ExamStudentScore> examStudentScoreList, Long examId, String courseCode, String courseName, Long schoolId) {
+        List<TBStudent> tbStudentList = new ArrayList<>();
+        List<TBExamStudent> tbExamStudentList = new ArrayList<>();
+        List<TBExamRecord> tbExamRecordList = new ArrayList<>();
+        List<TBAnswer> tbAnswerList = new ArrayList<>();
+
+        List<String> paperTypeList = examStudentScoreList.stream().map(ExamStudentScore::getPaperType).distinct().collect(Collectors.toList());
+        final String specialPaperType = "#";
+        paperTypeList.remove(specialPaperType);
+        int count = paperTypeList.size();
+        int i = 0;
+
+        Map<String, TBStudent> checkMap = new HashMap<>();
+        for (ExamStudentScore examStudentScore : examStudentScoreList) {
+            String studentCode = examStudentScore.getStudentCode(); //学号
+            String name = examStudentScore.getName(); //名称
+            String paperType = examStudentScore.getPaperType(); //试卷类型
+            // 循环依次为#生成(分配)试卷编号为A、B、C......A、B、C......
+            if (count > 0 && paperType.equals(specialPaperType)) {
+                paperType = paperTypeList.get(i);
+                i++;
+                if (i == count) {
+                    i = 0;
+                }
+            }
+
+            String college = examStudentScore.getCollege(); //学院
+            String className = examStudentScore.getClassName(); //班级名称
+            String teacherCode = examStudentScore.getTeacherCode(); //教师
+            String teacherName = examStudentScore.getTeacherName();
+            // 缺考状态 2 -> 缺考 ; 3 -> 违纪
+            int status = examStudentScore.getStatus(); //学生考试状态
+            BigDecimal totalScore = examStudentScore.getTotalScore(); //考生总分
+            BigDecimal objectiveScore = examStudentScore.getObjectiveScore(); //客观题总分
+            BigDecimal subjectiveScore = examStudentScore.getSubjectiveScore(); //主观题总分
+            List<AnswerInfo> objectiveScoreDetailList = examStudentScore.getObjectiveScoreDetail(); //客观题明细
+            List<AnswerInfo> subjectiveScoreDetailList = examStudentScore.getSubjectiveScoreDetail(); //主观题答题明细
+
+            /*
+                组建学生基础信息 student
+             */
+            if (checkMap.containsKey(studentCode)) {
+                if (!checkMap.get(studentCode).getName().equals(name)) {
+                    throw ExceptionResultEnum.ERROR.exception("有学号【" + studentCode + "】的学生名称不统一");
+                }
+            } else {
+                TBStudent studentTemp = tbStudentService.getOne(new QueryWrapper<TBStudent>().lambda()
+                        .eq(TBStudent::getSchoolId, schoolId)
+                        .eq(TBStudent::getStudentCode, studentCode));
+                Long studentId;
+                if (Objects.nonNull(studentTemp)) {
+                    studentId = studentTemp.getId();
+                } else {
+                    studentId = SystemConstant.getDbUuid();
+                }
+                TBStudent tbStudent = new TBStudent();
+                tbStudent.setId(studentId);
+                tbStudent.setSchoolId(schoolId);
+                tbStudent.setName(name);
+                tbStudent.setStudentCode(studentCode);
+                checkMap.put(studentCode, tbStudent);
+                tbStudentList.add(tbStudent);
+            }
+
+
+            /*
+                组建考生考试信息 exm_pap_tik
+             */
+            // 开课学院id
+            TBExamCourse tbExamCourse = tbExamCourseService.getOne(new QueryWrapper<TBExamCourse>().lambda()
+                    .eq(TBExamCourse::getExamId, examId)
+                    .eq(TBExamCourse::getCourseCode, courseCode)
+                    .eq(TBExamCourse::getSchoolId, schoolId));
+            if (Objects.isNull(tbExamCourse)) {
+                throw ExceptionResultEnum.ERROR.exception("缺少课程数据");
+            }
+            Long teachCollegeId = tbExamCourse.getTeachCollegeId();
+            if (SystemConstant.longNotNull(teachCollegeId)) {
+                throw ExceptionResultEnum.ERROR.exception("课程数据缺少开课学院异常");
+            }
+
+            // 获取关联的基础表主键
+            SysOrg tbSchoolCollege = sysOrgService.findByForeignKey(schoolId, college, college);
+            TBSchoolClazz tbSchoolClazz = tbSchoolClazzService.findByForeignKey(schoolId, className, className);
+            SysUser tbSchoolTeacher = sysUserService.findByForeignKey(schoolId, teacherCode);
+
+            TBExamStudent tbExamStudent = new TBExamStudent();
+            Long examStudentId = SystemConstant.getDbUuid();
+            tbExamStudent.setId(examStudentId);
+            tbExamStudent.setSchoolId(tbExamService.getById(examId).getSchoolId());
+            tbExamStudent.setExamId(examId);
+            tbExamStudent.setName(name);
+            tbExamStudent.setStudentId(checkMap.get(studentCode).getId());
+            tbExamStudent.setStudentCode(studentCode);
+            tbExamStudent.setCourseCode(courseCode);
+            tbExamStudent.setCourseName(courseName);
+            tbExamStudent.setTeachCollegeId(teachCollegeId);
+            tbExamStudent.setInspectCollegeId(tbSchoolCollege.getId());
+            tbExamStudent.setClazzId(tbSchoolClazz.getId());
+            tbExamStudent.setMajorId(0L);
+            if (Objects.nonNull(tbSchoolTeacher)) {
+                tbExamStudent.setTeacherId(tbSchoolTeacher.getId());
+            } else {
+                tbExamStudent.setTeacherId(0L);
+            }
+            tbExamStudent.setTicketNumber(studentCode);
+            tbExamStudent.setAbsent(status == 2 || status == 3);
+            // 全部设置为本届
+            tbExamStudent.setStudentCurrent(true);
+            tbExamStudentList.add(tbExamStudent);
+
+            // 构建考生作答记录表(t_b_exam_record)
+            Long examRecordId = SystemConstant.getDbUuid();
+            TBExamRecord tbExamRecord = new TBExamRecord();
+            tbExamRecord.setId(examRecordId);
+            tbExamRecord.setExamId(examId);
+            tbExamRecord.setPaperId(tbPaperService.findByForeignKey(examId, courseCode, courseName, paperType).getId());
+            tbExamRecord.setPaperType(paperType);
+            tbExamRecord.setExamStudentId(examStudentId);
+            tbExamRecord.setSubjectiveScore(subjectiveScore);
+            tbExamRecord.setObjectiveScore(objectiveScore);
+            tbExamRecord.setTotalScore(totalScore);
+            tbExamRecordList.add(tbExamRecord);
+
+            // 构建考生作答明细表(t_b_answer)正常考生才记录
+            // 客观题(选择)
+            if (status == 1) {
+                for (AnswerInfo objective : objectiveScoreDetailList) {
+                    Long answerId = SystemConstant.getDbUuid();
+                    TBAnswer tbAnswer = new TBAnswer();
+                    tbAnswer.setId(answerId);
+                    tbAnswer.setExamRecordId(examRecordId);
+                    tbAnswer.setNumberType(NumberTypeEnum.OBJECTIVE.getValue());
+                    String cloudMainNumber = String.valueOf(objective.getMainNumber());
+                    String cloudSubNumber = objective.getSubNumber();
+                    tbAnswer.setMainNumber(cloudMainNumber);
+                    tbAnswer.setSubNumber(cloudSubNumber);
+                    tbAnswer.setScore(objective.getScore());
+                    tbAnswer.setAnswer(objective.getAnswer());
+                    tbAnswerList.add(tbAnswer);
+                }
+                // 主观题
+                for (AnswerInfo subjective : subjectiveScoreDetailList) {
+                    Long answerId = SystemConstant.getDbUuid();
+                    TBAnswer tbAnswer = new TBAnswer();
+                    tbAnswer.setId(answerId);
+                    tbAnswer.setExamRecordId(examRecordId);
+                    tbAnswer.setNumberType(NumberTypeEnum.SUBJECTIVE.getValue());
+                    String cloudMainNumber = String.valueOf(subjective.getMainNumber());
+                    String cloudSubNumber = subjective.getSubNumber();
+                    tbAnswer.setMainNumber(cloudMainNumber);
+                    tbAnswer.setSubNumber(cloudSubNumber);
+                    tbAnswer.setScore(subjective.getScore());
+                    tbAnswer.setAnswer(subjective.getAnswer());
+                    tbAnswerList.add(tbAnswer);
+                }
+            }
+        }
+
+        // 处理并向数据库插入学生信息
+        tbStudentService.saveOrUpdateBatch(tbStudentList);
+
+        // 删除原t_b_answer、t_b_exam_record、t_b_exam_student表数据
+        List<String> courseInfoList = tbExamStudentList.stream().map(TBExamStudent::getCourseCode).collect(Collectors.toList());
+        Set<Long> examStudentRemoveIdSet = new HashSet<>();
+        for (String s : courseInfoList) {
+            Set<Long> ids = tbExamStudentService.list(new QueryWrapper<TBExamStudent>().lambda()
+                            .eq(TBExamStudent::getCourseCode, s))
+                    .stream().map(TBExamStudent::getId).collect(Collectors.toSet());
+            examStudentRemoveIdSet.addAll(ids);
+        }
+
+        if (examStudentRemoveIdSet.size() > 0) {
+            // 删除考生表
+            tbExamStudentService.removeByIds(examStudentRemoveIdSet);
+            List<TBExamRecord> willRemoveRecord = tbExamRecordService.list(new QueryWrapper<TBExamRecord>()
+                    .lambda().in(TBExamRecord::getExamStudentId, examStudentRemoveIdSet));
+            if (willRemoveRecord.size() > 0) {
+                List<Long> willRemoveRecordIdList = willRemoveRecord.stream().map(TBExamRecord::getId).collect(Collectors.toList());
+                // 删除考生作答
+                tbExamRecordService.removeByIds(willRemoveRecordIdList);
+                // 删除考生作答
+                tbAnswerService.remove(new QueryWrapper<TBAnswer>().lambda().in(TBAnswer::getExamRecordId, willRemoveRecordIdList));
+            }
+        }
 
+        // 保存数据
+        tbExamStudentService.saveBatch(tbExamStudentList);
+        tbExamRecordService.saveBatch(tbExamRecordList);
+        tbAnswerService.saveBatch(tbAnswerList);
     }
 }

+ 34 - 0
teachcloud-report-business/src/main/java/com/qmth/teachcloud/report/business/service/impl/TBSchoolClazzServiceImpl.java

@@ -2,13 +2,18 @@ package com.qmth.teachcloud.report.business.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.report.business.bean.dto.query.TBSchoolClazzDto;
 import com.qmth.teachcloud.report.business.entity.TBSchoolClazz;
 import com.qmth.teachcloud.report.business.mapper.TBSchoolClazzMapper;
 import com.qmth.teachcloud.report.business.service.TBSchoolClazzService;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * <p>
@@ -31,4 +36,33 @@ public class TBSchoolClazzServiceImpl extends ServiceImpl<TBSchoolClazzMapper, T
         }
         return tbSchoolClazzList.get(0);
     }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void saveClazzInfo(List<TBSchoolClazzDto> tbSchoolClazzDtoList) {
+        List<TBSchoolClazz> tbSchoolClazzList = new ArrayList<>();
+        for (TBSchoolClazzDto tbSchoolClazzDto : tbSchoolClazzDtoList) {
+            TBSchoolClazz old = this.getOne(new QueryWrapper<TBSchoolClazz>().lambda()
+                    .eq(TBSchoolClazz::getSchoolId, tbSchoolClazzDto.getSchoolId())
+                    .eq(TBSchoolClazz::getClazzCode, tbSchoolClazzDto.getClazzCode())
+                    .eq(TBSchoolClazz::getClazzName, tbSchoolClazzDto.getClazzName()));
+            Long id;
+            if (Objects.nonNull(old)) {
+                id = old.getId();
+            } else {
+                id = SystemConstant.getDbUuid();
+            }
+
+            TBSchoolClazz tbSchoolClazz = new TBSchoolClazz();
+            tbSchoolClazz.setId(id);
+            tbSchoolClazz.setSchoolId(tbSchoolClazzDto.getSchoolId());
+            tbSchoolClazz.setClazzCode(tbSchoolClazzDto.getClazzCode());
+            tbSchoolClazz.setClazzName(tbSchoolClazzDto.getClazzName());
+            tbSchoolClazz.setEnable(true);
+            tbSchoolClazz.setCreateTime(System.currentTimeMillis());
+            tbSchoolClazz.setUpdateTime(System.currentTimeMillis());
+            tbSchoolClazzList.add(tbSchoolClazz);
+        }
+        this.saveOrUpdateBatch(tbSchoolClazzList);
+    }
 }

+ 1 - 1
teachcloud-report/src/main/java/com/qmth/teachcloud/report/api/BasicDatasourceController.java

@@ -703,7 +703,7 @@ public class BasicDatasourceController {
                 // 获取关联的基础表主键
                 SysOrg tbSchoolCollege = sysOrgService.findByForeignKey(schoolId, college, college);
                 TBSchoolClazz tbSchoolClazz = tbSchoolClazzService.findByForeignKey(schoolId, className, className);
-                SysUser tbSchoolTeacher = sysUserService.findByForeignKey(schoolId, teacherName,teacherCode);
+                SysUser tbSchoolTeacher = sysUserService.findByForeignKey(schoolId,teacherCode);
 
                 TBExamStudent tbExamStudent = new TBExamStudent();
                 Long examStudentId = SystemConstant.getDbUuid();