소스 검색

fix:教研分析部分课程编号改动

caozixuan 11 달 전
부모
커밋
899d679ed0
24개의 변경된 파일459개의 추가작업 그리고 219개의 파일을 삭제
  1. 12 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/analyze/GradeInitResult.java
  2. 1 3
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamStudentMapper.java
  3. 2 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/GradeInitializeMapper.java
  4. 1 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskService.java
  5. 4 3
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/GradeInitializeService.java
  6. 7 6
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/GradePaperDimensionService.java
  7. 11 7
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/GradePaperStructService.java
  8. 2 6
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java
  9. 86 60
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradeBatchServiceImpl.java
  10. 5 3
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradeInitializeServiceImpl.java
  11. 61 43
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradePaperDimensionServiceImpl.java
  12. 61 37
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradePaperStructServiceImpl.java
  13. 34 0
      distributed-print-business/src/main/resources/mapper/ExamStudentMapper.xml
  14. 8 5
      distributed-print-business/src/main/resources/mapper/GradeInitializeMapper.xml
  15. 4 2
      distributed-print-business/src/main/resources/mapper/GradePaperDimensionMapper.xml
  16. 5 4
      distributed-print-business/src/main/resources/mapper/GradePaperStructMapper.xml
  17. 4 4
      distributed-print/src/main/java/com/qmth/distributed/print/api/GradePaperController.java
  18. 3 5
      distributed-print/src/main/java/com/qmth/distributed/print/api/GradePaperDimensionController.java
  19. 34 27
      distributed-print/src/main/java/com/qmth/distributed/print/api/GradePaperStructController.java
  20. 48 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/result/MarkQuestionResult.java
  21. 7 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkQuestionMapper.java
  22. 3 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkQuestionService.java
  23. 6 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkQuestionServiceImpl.java
  24. 50 0
      teachcloud-mark/src/main/resources/mapper/MarkQuestionMapper.xml

+ 12 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/analyze/GradeInitResult.java

@@ -20,6 +20,10 @@ public class GradeInitResult {
     @ApiModelProperty(value = "考试名称")
     private String examName;
 
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "课程id")
+    private Long courseId;
+
     @ApiModelProperty(value = "课程编号")
     private String courseCode;
 
@@ -68,6 +72,14 @@ public class GradeInitResult {
         this.examName = examName;
     }
 
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
     public String getCourseCode() {
         return courseCode;
     }

+ 1 - 3
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamStudentMapper.java

@@ -34,9 +34,7 @@ public interface ExamStudentMapper extends BaseMapper<ExamStudent> {
     List<ExamStudent> listExamStudentBySchoolIdAndClazzId(@Param("schoolId") Long schoolId, @Param("classId") String classId);
 
 
-    @SuppressWarnings("MybatisXMapperMethodInspection")
-    List<ExamStudentCourseClassDto> listExamStudentByPaperNumberAndPaperType(@Param("batchId") Long batchId, @Param("examId") Long examId, @Param("paperNumber") String paperNumber,
-                                                                             @Param("paperType") String paperType);
+    List<ExamStudentCourseClassDto> listMarkStudentInfo(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("paperType") String paperType);
 
     List<ExamStudent> listByExamDetailCourseIdNotIntMarkStudent(@Param("examDetailCourseId") Long examDetailCourseId, @Param("paperType") String paperType);
 

+ 2 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/GradeInitializeMapper.java

@@ -21,7 +21,7 @@ public interface GradeInitializeMapper {
      * @param iPage      分页参数
      * @param semesterId 学期id
      * @param examId     考试id
-     * @param courseCode 课程编号
+     * @param courseId 课程id
      * @param dpr     命题教师id
      * @param schoolId   学校id
      * @return 结果
@@ -29,7 +29,7 @@ public interface GradeInitializeMapper {
     IPage<GradeInitResult> findNeedAnalyzedPaper(@Param("iPage") Page<GradeInitResult> iPage,
                                                  @Param("semesterId") Long semesterId,
                                                  @Param("examId") Long examId,
-                                                 @Param("courseCode") String courseCode,
+                                                 @Param("courseId") Long courseId,
                                                  @Param("dpr") DataPermissionRule dpr,
                                                  @Param("schoolId") Long schoolId);
 

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskService.java

@@ -176,7 +176,7 @@ public interface ExamTaskService extends IService<ExamTask> {
 
     List<String> listPaperNumber(String param, List<Long> printPlanIdList);
 
-    ExamTask getByExamIdAndCourseCodeAndPaperNumber(Long examId, String courseCode, String paperNumber);
+    ExamTask getByExamIdAndPaperNumber(Long examId, String paperNumber);
 
     ExamTask getByExamIdAndCourseIdAndPaperNumber(Long examId, Long courseId, String paperNumber);
 

+ 4 - 3
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/GradeInitializeService.java

@@ -17,13 +17,14 @@ public interface GradeInitializeService {
      *
      * @param semesterId  学期id
      * @param examId      考试id
-     * @param courseCode  课程编号
+     * @param courseId    课程id
      * @param requestUser 请求的命题老师
      * @return 试卷结果
      */
-    IPage<GradeInitResult> findNeedAnalyzedPaper(Long semesterId, Long examId, String courseCode, SysUser requestUser, int pageNumber, int pageSize);
+    IPage<GradeInitResult> findNeedAnalyzedPaper(Long semesterId, Long examId, Long courseId, SysUser requestUser, int pageNumber, int pageSize);
 
     long countByPropositionTeacherId(GradeAnalyzePaperStatusEnum status, Boolean ready);
 
-    IPage<GradeInitResult> listNeedAnalyzedPaperToWork(SysUser requestUser, Integer pageNumber, Integer pageSize, GradeAnalyzePaperStatusEnum status, Boolean ready);
+    IPage<GradeInitResult> listNeedAnalyzedPaperToWork(SysUser requestUser, Integer pageNumber, Integer pageSize,
+            GradeAnalyzePaperStatusEnum status, Boolean ready);
 }

+ 7 - 6
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/GradePaperDimensionService.java

@@ -31,7 +31,8 @@ public interface GradePaperDimensionService extends IService<GradePaperDimension
      * @param requestUser 请求用户
      * @return 结果集
      */
-    List<GradePaperDimensionResult> findGradePaperDimensionList(Long examId, String paperNumber, String paperType, SysUser requestUser);
+    List<GradePaperDimensionResult> findGradePaperDimensionList(Long examId, String paperNumber, String paperType,
+            SysUser requestUser);
 
     /**
      * 批量保存分析试卷维度数据
@@ -51,7 +52,8 @@ public interface GradePaperDimensionService extends IService<GradePaperDimension
      * @param paperName   试卷名称
      * @param requestUser 请求用户
      */
-    void importGradePaperKnowledgeDimension(MultipartFile file, Long examId, String paperNumber, String paperType, String paperName, SysUser requestUser) throws IOException, NoSuchFieldException;
+    void importGradePaperKnowledgeDimension(MultipartFile file, Long examId, String paperNumber, String paperType,
+            String paperName, SysUser requestUser) throws IOException, NoSuchFieldException;
 
     /**
      * 分析 - 试卷能力维度数据导入
@@ -68,11 +70,10 @@ public interface GradePaperDimensionService extends IService<GradePaperDimension
     /**
      * 分析 - 试卷维度模板导出
      *
-     * @param courseCode    试卷编号
-     * @param courseName    试卷名称
+     * @param courseId      课程id
      * @param dimensionType 维度类型
      */
-    void exportGradePaperDimensionTemplate(String courseCode, String courseName, DimensionEnum dimensionType) throws Exception;
+    void exportGradePaperDimensionTemplate(Long courseId, DimensionEnum dimensionType) throws Exception;
 
-    List<PaperDimension> findBySchoolIdAndPaperNumberAndPaperType(Long schoolId,Long examId, String paperNumber, String paperType);
+    List<PaperDimension> findBySchoolIdAndPaperNumberAndPaperType(Long schoolId, Long examId, String paperNumber, String paperType);
 }

+ 11 - 7
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/GradePaperStructService.java

@@ -5,6 +5,7 @@ import com.qmth.distributed.print.business.bean.dto.open.PaperStructure;
 import com.qmth.distributed.print.business.bean.params.analyze.GradePaperStructParam;
 import com.qmth.distributed.print.business.bean.result.analyze.GradePaperStructResult;
 import com.qmth.distributed.print.business.entity.GradePaperStruct;
+import com.qmth.teachcloud.common.bean.result.MarkQuestionResult;
 import com.qmth.teachcloud.common.entity.MarkQuestion;
 import com.qmth.teachcloud.common.entity.SysUser;
 import org.springframework.web.multipart.MultipartFile;
@@ -29,10 +30,11 @@ public interface GradePaperStructService extends IService<GradePaperStruct> {
      * @param paperNumber      试卷编号
      * @param paperType        试卷类型
      * @param requestUser      请求的用户
-     * @param markQuestionList
+     * @param markQuestionList markQuestionList
      * @return 结果
      */
-    List<GradePaperStructResult> findGradePaperStructureResultList(Long examId, String paperNumber, String paperType, SysUser requestUser, List<MarkQuestion> markQuestionList);
+    List<GradePaperStructResult> findGradePaperStructureResultList(Long examId, String paperNumber, String paperType,
+            SysUser requestUser, List<MarkQuestionResult> markQuestionList);
 
     /**
      * 批量保存分析试卷结构
@@ -46,12 +48,14 @@ public interface GradePaperStructService extends IService<GradePaperStruct> {
      * 分析 - 试卷结构数据导入
      *
      * @param file        excel 文件
+     * @param examId      考试id
      * @param paperNumber 试卷编号
      * @param paperType   试卷类型
      * @param paperName   试卷名称
      * @param requestUser 请求用户
      */
-    void importGradePaperStruct(MultipartFile file, String paperNumber, String paperType, String paperName, SysUser requestUser) throws IOException, NoSuchFieldException;
+    void importGradePaperStruct(MultipartFile file, Long examId, String paperNumber, String paperType, String paperName,
+            SysUser requestUser) throws IOException, NoSuchFieldException;
 
     /**
      * 分析 - 试卷结构模板导出
@@ -59,12 +63,12 @@ public interface GradePaperStructService extends IService<GradePaperStruct> {
      * @param paperNumber      试卷编号
      * @param paperType        试卷类型
      * @param requestUser      请求用户
-     * @param markQuestionList
+     * @param markQuestionList markQuestionList
      * @throws Exception 异常
      */
-    void exportGradePaperStructTemplate(Long examId, String paperNumber, String paperType, SysUser requestUser, List<MarkQuestion> markQuestionList) throws Exception;
+    void exportGradePaperStructTemplate(Long examId, String paperNumber, String paperType, SysUser requestUser, List<MarkQuestionResult> markQuestionList) throws Exception;
 
-    List<PaperStructure> findBySchoolIdAndPaperNumberAndPaperType(Long schoolId,Long examId, String paperNumber, String paperType);
+    List<PaperStructure> findBySchoolIdAndPaperNumberAndPaperType(Long schoolId, Long examId, String paperNumber, String paperType);
 
     /**
      * 更新云阅卷试卷结构
@@ -76,7 +80,7 @@ public interface GradePaperStructService extends IService<GradePaperStruct> {
      * @param schoolId         学校id
      * @param paperNumber      试卷编号
      * @param paperType        试卷类型
-     * @param markQuestionList
+     * @param markQuestionList markQuestionList
      */
     void updateExamCloudPaperStruct(Long schoolId, String paperNumber, String paperType, List<MarkQuestion> markQuestionList);
 }

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

@@ -1647,14 +1647,10 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
     }
 
     @Override
-    public ExamTask getByExamIdAndCourseCodeAndPaperNumber(Long examId, String courseCode, String paperNumber) {
+    public ExamTask getByExamIdAndPaperNumber(Long examId,String paperNumber) {
         QueryWrapper<ExamTask> queryWrapper = new QueryWrapper<>();
         LambdaQueryWrapper<ExamTask> lambdaQueryWrapper = queryWrapper.lambda();
-        lambdaQueryWrapper.eq(ExamTask::getExamId, examId);
-        if (StringUtils.isNotBlank(courseCode)) {
-            lambdaQueryWrapper.eq(ExamTask::getCourseId, courseCode);
-        }
-        lambdaQueryWrapper.eq(ExamTask::getPaperNumber, paperNumber);
+        lambdaQueryWrapper.eq(ExamTask::getExamId, examId).eq(ExamTask::getPaperNumber, paperNumber);
         return this.getOne(queryWrapper);
     }
 

+ 86 - 60
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradeBatchServiceImpl.java

@@ -36,6 +36,7 @@ import com.qmth.teachcloud.common.service.*;
 import com.qmth.teachcloud.common.util.ExcelUtil;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.excel.ExcelError;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.time.DateFormatUtils;
 import org.apache.poi.ss.usermodel.*;
@@ -98,7 +99,8 @@ public class GradeBatchServiceImpl extends ServiceImpl<GradeBatchMapper, GradeBa
     public IPage<GradeBatchResult> gradeBatchPage(Long semesterId, Long examId, String batchName, int pageNumber, int pageSize, SysUser requestUser) {
         batchName = SystemConstant.translateSpecificSign(batchName);
         DataPermissionRule dpr = basicRoleDataPermissionService.findDataPermission();
-        IPage<GradeBatchResult> page = this.baseMapper.findGradeBatchPage(new Page<>(pageNumber, pageSize), semesterId, examId, batchName, requestUser.getSchoolId(), dpr);
+        IPage<GradeBatchResult> page = this.baseMapper.findGradeBatchPage(new Page<>(pageNumber, pageSize), semesterId,
+                examId, batchName, requestUser.getSchoolId(), dpr);
         for (GradeBatchResult record : page.getRecords()) {
             String txtPath = record.getReportFilePath();
             if (SystemConstant.strNotNull(txtPath)) {
@@ -157,11 +159,34 @@ public class GradeBatchServiceImpl extends ServiceImpl<GradeBatchMapper, GradeBa
         }
 
         List<ExamStudentCourseClassDto> finalList = new ArrayList<>();
+        List<GradeBatchStudentClazz> gradeBatchStudentClazzList = gradeBatchStudentClazzService.list(
+                new QueryWrapper<GradeBatchStudentClazz>().lambda().eq(GradeBatchStudentClazz::getBatchId, batchId));
+
         for (GradeBatchPaper gradeBatchPaper : gradeBatchPaperList) {
-            List<ExamStudentCourseClassDto> examStudentClassList = examStudentMapper.listExamStudentByPaperNumberAndPaperType(
-                    batchId, gradeBatchPaper.getExamId(), gradeBatchPaper.getPaperNumber(), gradeBatchPaper.getPaperType());
-            if (!examStudentClassList.isEmpty()) {
-                finalList.addAll(examStudentClassList);
+            String paperNumber = gradeBatchPaper.getPaperNumber();
+            String paperType = gradeBatchPaper.getPaperType();
+            Long examId = gradeBatchPaper.getExamId();
+
+            List<ExamStudentCourseClassDto> examStudentClassList = examStudentMapper.listMarkStudentInfo(examId,
+                    paperNumber, paperType);
+            for (ExamStudentCourseClassDto examStudentCourseClassDto : examStudentClassList) {
+                String clazzName = examStudentCourseClassDto.getClazzName();
+                if (!SystemConstant.strNotNull(clazzName)) {
+                    throw ExceptionResultEnum.ERROR.exception(
+                            String.format("试卷编号为[%s],试卷类型为[%s]的考生缺少教学班信息", paperNumber, paperType));
+                }
+
+                List<GradeBatchStudentClazz> gradeBatchStudentClazzPaperInfoList = gradeBatchStudentClazzList.stream()
+                        .filter(e -> e.getPaperNumber().equals(paperNumber) && e.getPaperType().equals(paperType) && e.getClazzName().equals(clazzName)).collect(Collectors.toList());
+
+                if (CollectionUtils.isNotEmpty(gradeBatchStudentClazzPaperInfoList)) {
+                    GradeBatchStudentClazz gradeBatchStudentClazzPaperInfo = gradeBatchStudentClazzPaperInfoList.get(0);
+                    String dbTeacherName = gradeBatchStudentClazzPaperInfo.getTeacherName();
+                    String dbTeacherNumber = gradeBatchStudentClazzPaperInfo.getTeacherNumber();
+                    examStudentCourseClassDto.setTeacherName(dbTeacherName);
+                    examStudentCourseClassDto.setTeacherNumber(dbTeacherNumber);
+                }
+                finalList.add(examStudentCourseClassDto);
             }
         }
 
@@ -224,7 +249,7 @@ public class GradeBatchServiceImpl extends ServiceImpl<GradeBatchMapper, GradeBa
 
         XSSFRow headRow = sheet.createRow(0);
         // 表头
-        String[] fieldsNameList = {"课程代码", "课程名称", "试卷编号", "试卷类型", "班级名称", "任课老师", "任课老师工号"};
+        String[] fieldsNameList = { "课程代码", "课程名称", "试卷编号", "试卷类型", "班级名称", "任课老师", "任课老师工号" };
         for (int i = 0; i < fieldsNameList.length; i++) {
             XSSFCell cell = headRow.createCell(i);
             cell.setCellValue(fieldsNameList[i]);
@@ -297,57 +322,59 @@ public class GradeBatchServiceImpl extends ServiceImpl<GradeBatchMapper, GradeBa
     public void uploadFile(Long batchId, MultipartFile file) throws IOException, NoSuchFieldException {
         List<GradeBatchStudentClazzDto> list = new ArrayList<>();
         Map<String, String> teacherMap = new HashMap<>();
-        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(GradeBatchStudentClazzDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
-            List<ExcelError> excelErrorTemp = new ArrayList<>();
-            // 只允许导入一个sheet
-            if (finalExcelList.size() > 1) {
-                throw ExceptionResultEnum.ERROR.exception("excel中只允许有一个sheet");
-            }
-
-            for (int i = 0; i < finalExcelList.size(); i++) {
-                LinkedMultiValueMap<Integer, Object> excelMap = finalExcelList.get(i);
-                List<Object> gradeBatchStudentTempList = excelMap.get(i);
-                for (int y = 0; y < Objects.requireNonNull(gradeBatchStudentTempList).size(); y++) {
-                    GradeBatchStudentClazzDto gradeBatchStudentClazzDto = (GradeBatchStudentClazzDto) gradeBatchStudentTempList.get(y);
-                    if (StringUtils.isBlank(gradeBatchStudentClazzDto.getCourseCode())) {
-                        excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[课程代码]必填"));
-                    }
-                    if (StringUtils.isBlank(gradeBatchStudentClazzDto.getCourseName())) {
-                        excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[课程名称]必填"));
-                    }
-                    if (StringUtils.isBlank(gradeBatchStudentClazzDto.getPaperNumber())) {
-                        excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[试卷编号]必填"));
-                    }
-                    if (StringUtils.isBlank(gradeBatchStudentClazzDto.getPaperType())) {
-                        excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[试卷类型]必填"));
+        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(GradeBatchStudentClazzDto.class),
+                (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
+                    List<ExcelError> excelErrorTemp = new ArrayList<>();
+                    // 只允许导入一个sheet
+                    if (finalExcelList.size() > 1) {
+                        throw ExceptionResultEnum.ERROR.exception("excel中只允许有一个sheet");
                     }
-                    if (StringUtils.isBlank(gradeBatchStudentClazzDto.getClazzName())) {
-                        excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[班级名称]必填"));
-                    }
-                    String teacherName = gradeBatchStudentClazzDto.getTeacherName();
-                    if (StringUtils.isBlank(teacherName)) {
-                        excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[任课老师]必填"));
-                    }
-                    String teacherNumber = gradeBatchStudentClazzDto.getTeacherNumber();
-                    if (StringUtils.isBlank(teacherNumber)) {
-                        excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[任课老师工号]必填"));
-                    }
-                    if (teacherMap.containsKey(teacherNumber) && !teacherName.equals(teacherMap.get(teacherNumber))) {
-                        excelErrorTemp.add(new ExcelError(y + 1, "excel中同一个任课老师工号有多个姓名"));
-                    }
-
-                    teacherMap.put(gradeBatchStudentClazzDto.getTeacherNumber(), gradeBatchStudentClazzDto.getTeacherName());
 
-                    list.add(gradeBatchStudentClazzDto);
-                }
-            }
+                    for (int i = 0; i < finalExcelList.size(); i++) {
+                        LinkedMultiValueMap<Integer, Object> excelMap = finalExcelList.get(i);
+                        List<Object> gradeBatchStudentTempList = excelMap.get(i);
+                        for (int y = 0; y < Objects.requireNonNull(gradeBatchStudentTempList).size(); y++) {
+                            GradeBatchStudentClazzDto gradeBatchStudentClazzDto = (GradeBatchStudentClazzDto) gradeBatchStudentTempList.get(
+                                    y);
+                            if (StringUtils.isBlank(gradeBatchStudentClazzDto.getCourseCode())) {
+                                excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[课程代码]必填"));
+                            }
+                            if (StringUtils.isBlank(gradeBatchStudentClazzDto.getCourseName())) {
+                                excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[课程名称]必填"));
+                            }
+                            if (StringUtils.isBlank(gradeBatchStudentClazzDto.getPaperNumber())) {
+                                excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[试卷编号]必填"));
+                            }
+                            if (StringUtils.isBlank(gradeBatchStudentClazzDto.getPaperType())) {
+                                excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[试卷类型]必填"));
+                            }
+                            if (StringUtils.isBlank(gradeBatchStudentClazzDto.getClazzName())) {
+                                excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[班级名称]必填"));
+                            }
+                            String teacherName = gradeBatchStudentClazzDto.getTeacherName();
+                            if (StringUtils.isBlank(teacherName)) {
+                                excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[任课老师]必填"));
+                            }
+                            String teacherNumber = gradeBatchStudentClazzDto.getTeacherNumber();
+                            if (StringUtils.isBlank(teacherNumber)) {
+                                excelErrorTemp.add(new ExcelError(y + 1, "excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[任课老师工号]必填"));
+                            }
+                            if (teacherMap.containsKey(teacherNumber) && !teacherName.equals(teacherMap.get(teacherNumber))) {
+                                excelErrorTemp.add(new ExcelError(y + 1, "excel中同一个任课老师工号有多个姓名"));
+                            }
+
+                            teacherMap.put(gradeBatchStudentClazzDto.getTeacherNumber(), gradeBatchStudentClazzDto.getTeacherName());
+
+                            list.add(gradeBatchStudentClazzDto);
+                        }
+                    }
 
-            if (excelErrorTemp.size() > 0) {
-                List<String> errors = excelErrorTemp.stream().map(ExcelError::getExcelErrorType).collect(Collectors.toList());
-                throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(errors));
-            }
-            return finalExcelList;
-        },1);
+                    if (excelErrorTemp.size() > 0) {
+                        List<String> errors = excelErrorTemp.stream().map(ExcelError::getExcelErrorType).collect(Collectors.toList());
+                        throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(errors));
+                    }
+                    return finalExcelList;
+                }, 1);
 
         executeImportGradeBatchStudent(batchId, list);
     }
@@ -420,8 +447,7 @@ public class GradeBatchServiceImpl extends ServiceImpl<GradeBatchMapper, GradeBa
 
             List<Long> orgIds = dtoList.stream().map(m -> m.getCourseCode() + "##" + m.getPaperNumber()).distinct().map(m -> {
                 String[] strings = m.split("##");
-                // todo xf 20230413
-                ExamTask examTask = examTaskService.getByExamIdAndCourseCodeAndPaperNumber(gradeBatch.getExamId(), strings[0], strings[1]);
+                ExamTask examTask = examTaskService.getByExamIdAndPaperNumber(gradeBatch.getExamId(), strings[1]);
                 SysOrg sysOrg = sysOrgService.findCollegeLevelOrgByOrgId(examTask.getTeachingRoomId());
                 return sysOrg.getId();
             }).distinct().collect(Collectors.toList());
@@ -444,13 +470,13 @@ public class GradeBatchServiceImpl extends ServiceImpl<GradeBatchMapper, GradeBa
                 SysOrg userSecondaryOrg = sysOrgService.findCollegeLevelOrgByOrgId(orgId);
                 Long userSecondaryOrgId = userSecondaryOrg.getId();
                 if (!courseSecondaryOrgId.equals(userSecondaryOrgId)) {
-                    throw ExceptionResultEnum.ERROR.exception("导入的excel中,工号为【" + key[0] + "】的用户所在学院为【" + userSecondaryOrg.getName() +
-                            "】,和课程所在学院【" + sysOrgService.getById(courseSecondaryOrgId).getName() + "】不一致");
+                    throw ExceptionResultEnum.ERROR.exception(
+                            "导入的excel中,工号为【" + key[0] + "】的用户所在学院为【" + userSecondaryOrg.getName() + "】,和课程所在学院【" + sysOrgService.getById(courseSecondaryOrgId).getName() + "】不一致");
                 }
                 String dbRealName = sysUser.getRealName();
                 if (!dbRealName.equals(key[1])) {
-                    throw ExceptionResultEnum.ERROR.exception("导入的excel中,工号为【" + key[0] + "】的用户姓名【" + key[1] +
-                            "】,与系统用户姓名【" + dbRealName + "】不一致 请检查excel数据");
+                    throw ExceptionResultEnum.ERROR.exception(
+                            "导入的excel中,工号为【" + key[0] + "】的用户姓名【" + key[1] + "】,与系统用户姓名【" + dbRealName + "】不一致 请检查excel数据");
                 }
                 sysUser.setRealName(key[1]);
                 sysUser.setEnable(true);

+ 5 - 3
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradeInitializeServiceImpl.java

@@ -32,15 +32,17 @@ public class GradeInitializeServiceImpl implements GradeInitializeService {
     BasicRoleDataPermissionService basicRoleDataPermissionService;
 
     @Override
-    public IPage<GradeInitResult> findNeedAnalyzedPaper(Long semesterId, Long examId, String courseCode, SysUser requestUser, int pageNumber, int pageSize) {
+    public IPage<GradeInitResult> findNeedAnalyzedPaper(Long semesterId, Long examId, Long courseId, SysUser requestUser, int pageNumber, int pageSize) {
         Long schoolId = requestUser.getSchoolId();
-        DataPermissionRule dpr = basicRoleDataPermissionService.findDataPermission(schoolId,requestUser.getId(),ServletUtil.getRequest().getServletPath());
+        DataPermissionRule dpr = basicRoleDataPermissionService.findDataPermission(schoolId, requestUser.getId(),
+                ServletUtil.getRequest().getServletPath());
 
         List<String> finished = new ArrayList<>();
         finished.add(GradeAnalyzePaperStatusEnum.READY_TO_CALCULATE.name());
         finished.add(GradeAnalyzePaperStatusEnum.CALCULATING.name());
         finished.add(GradeAnalyzePaperStatusEnum.FINISH_CALCULATE.name());
-        IPage<GradeInitResult> page = gradeInitializeMapper.findNeedAnalyzedPaper(new Page<>(pageNumber, pageSize), semesterId, examId, courseCode, dpr, schoolId);
+        IPage<GradeInitResult> page = gradeInitializeMapper.findNeedAnalyzedPaper(new Page<>(pageNumber, pageSize),
+                semesterId, examId, courseId, dpr, schoolId);
         for (GradeInitResult record : page.getRecords()) {
             String status = record.getStatus();
             if (SystemConstant.strNotNull(status)) {

+ 61 - 43
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradePaperDimensionServiceImpl.java

@@ -15,9 +15,11 @@ import com.qmth.distributed.print.business.mapper.GradePaperDimensionMapper;
 import com.qmth.distributed.print.business.service.GradeBatchPaperService;
 import com.qmth.distributed.print.business.service.GradePaperDimensionService;
 import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.BasicCourse;
 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.service.BasicCourseService;
 import com.qmth.teachcloud.common.util.ExcelUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import org.springframework.stereotype.Service;
@@ -39,9 +41,13 @@ import java.util.*;
  */
 @Service
 public class GradePaperDimensionServiceImpl extends ServiceImpl<GradePaperDimensionMapper, GradePaperDimension> implements GradePaperDimensionService {
+
     @Resource
     private GradeBatchPaperService gradeBatchPaperService;
 
+    @Resource
+    private BasicCourseService basicCourseService;
+
     @Override
     public List<GradePaperDimensionResult> findGradePaperDimensionList(Long examId, String paperNumber, String paperType, SysUser requestUser) {
         return this.baseMapper.findGradePaperDimensionList(examId, paperNumber, paperType, requestUser.getSchoolId());
@@ -58,15 +64,14 @@ public class GradePaperDimensionServiceImpl extends ServiceImpl<GradePaperDimens
         List<GradePaperDimensionDatasource> datasource = gradePaperDimensionParam.getDatasource();
 
         gradeBatchPaperService.checkOperateAuth(schoolId, examId, paperNumber, paperType);
-        List<GradePaperDimension> gradePaperDimensionList = this.checkAndBuildGradePaperDimensionList(datasource,examId, paperNumber, paperType, paperName, dimensionType, requestUser);
+        List<GradePaperDimension> gradePaperDimensionList = this.checkAndBuildGradePaperDimensionList(datasource, examId, paperNumber, paperType, paperName, dimensionType, requestUser);
         this.remove(new QueryWrapper<GradePaperDimension>().lambda()
                 .eq(GradePaperDimension::getSchoolId, requestUser.getSchoolId())
-                .eq(GradePaperDimension::getExamId,examId)
-                .eq(GradePaperDimension::getPaperNumber, paperNumber)
+                .eq(GradePaperDimension::getExamId, examId).eq(GradePaperDimension::getPaperNumber, paperNumber)
                 .eq(GradePaperDimension::getPaperType, paperType)
                 .eq(GradePaperDimension::getDimensionType, dimensionType));
         this.saveBatch(gradePaperDimensionList);
-        gradeBatchPaperService.updatePaperAndBatchStatus(schoolId,examId , paperNumber, paperType);
+        gradeBatchPaperService.updatePaperAndBatchStatus(schoolId, examId, paperNumber, paperType);
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -76,12 +81,13 @@ public class GradePaperDimensionServiceImpl extends ServiceImpl<GradePaperDimens
             throw ExceptionResultEnum.ERROR.exception("找不到附件");
         }
 
-        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(GradePaperDimensionKnowledgeDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
-            if (finalExcelErrorList.size() > 0) {
-                throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(finalExcelErrorList));
-            }
-            return finalExcelList;
-        },1);
+        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(GradePaperDimensionKnowledgeDto.class),
+                (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
+                    if (finalExcelErrorList.size() > 0) {
+                        throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(finalExcelErrorList));
+                    }
+                    return finalExcelList;
+                }, 1);
         List<GradePaperDimensionDatasource> gradePaperDimensionDatasourceList = new ArrayList<>();
 
         if (Objects.nonNull(finalList) && finalList.size() > 0) {
@@ -91,7 +97,8 @@ public class GradePaperDimensionServiceImpl extends ServiceImpl<GradePaperDimens
 
                 for (int y = 0; y < Objects.requireNonNull(importList).size(); y++) {
                     if (importList.get(y) instanceof GradePaperDimensionKnowledgeDto) {
-                        GradePaperDimensionKnowledgeDto gradePaperDimensionKnowledgeDto = (GradePaperDimensionKnowledgeDto) importList.get(y);
+                        GradePaperDimensionKnowledgeDto gradePaperDimensionKnowledgeDto = (GradePaperDimensionKnowledgeDto) importList.get(
+                                y);
 
                         GradePaperDimensionDatasource gradePaperDimensionDatasource = new GradePaperDimensionDatasource();
                         gradePaperDimensionDatasource.setCodePrimary(gradePaperDimensionKnowledgeDto.getCodePrimary());
@@ -115,17 +122,19 @@ public class GradePaperDimensionServiceImpl extends ServiceImpl<GradePaperDimens
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public void importGradePaperAbilityDimension(MultipartFile file, Long examId, String paperNumber, String paperType, String paperName, SysUser requestUser) throws IOException, NoSuchFieldException {
+    public void importGradePaperAbilityDimension(MultipartFile file, Long examId, String paperNumber, String paperType,
+            String paperName, SysUser requestUser) throws IOException, NoSuchFieldException {
         if (Objects.isNull(file)) {
             throw ExceptionResultEnum.ERROR.exception("找不到附件");
         }
 
-        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(GradePaperDimensionAbilityDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
-            if (finalExcelErrorList.size() > 0) {
-                throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(finalExcelErrorList));
-            }
-            return finalExcelList;
-        },1);
+        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(GradePaperDimensionAbilityDto.class),
+                (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
+                    if (finalExcelErrorList.size() > 0) {
+                        throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(finalExcelErrorList));
+                    }
+                    return finalExcelList;
+                }, 1);
         List<GradePaperDimensionDatasource> gradePaperDimensionDatasourceList = new ArrayList<>();
 
         if (Objects.nonNull(finalList) && finalList.size() > 0) {
@@ -135,7 +144,8 @@ public class GradePaperDimensionServiceImpl extends ServiceImpl<GradePaperDimens
 
                 for (int y = 0; y < Objects.requireNonNull(importList).size(); y++) {
                     if (importList.get(y) instanceof GradePaperDimensionAbilityDto) {
-                        GradePaperDimensionAbilityDto gradePaperDimensionAbilityDto = (GradePaperDimensionAbilityDto) importList.get(y);
+                        GradePaperDimensionAbilityDto gradePaperDimensionAbilityDto = (GradePaperDimensionAbilityDto) importList.get(
+                                y);
 
                         GradePaperDimensionDatasource gradePaperDimensionDatasource = new GradePaperDimensionDatasource();
                         gradePaperDimensionDatasource.setCodePrimary(gradePaperDimensionAbilityDto.getCodePrimary());
@@ -158,32 +168,39 @@ public class GradePaperDimensionServiceImpl extends ServiceImpl<GradePaperDimens
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public void exportGradePaperDimensionTemplate(String courseCode, String courseName, DimensionEnum dimensionType) throws Exception {
+    public void exportGradePaperDimensionTemplate(Long courseId, DimensionEnum dimensionType) throws Exception {
+        BasicCourse basicCourse = basicCourseService.getById(courseId);
+        String courseCode = basicCourse.getCode();
+        String courseName = basicCourse.getName();
+
         switch (dimensionType) {
-            case KNOWLEDGE:
-                List<GradePaperDimensionKnowledgeDto> kDatasource = new ArrayList<>();
-                GradePaperDimensionKnowledgeDto kCell = new GradePaperDimensionKnowledgeDto();
-                kCell.setCourseCode(courseCode);
-                kCell.setCourseName(courseName);
-                kDatasource.add(kCell);
-                ExcelUtil.excelExport(courseName + "-知识维度导入模板", GradePaperDimensionKnowledgeDto.class, kDatasource, ServletUtil.getResponse());
-                break;
-            case ABILITY:
-                List<GradePaperDimensionAbilityDto> aDatasource = new ArrayList<>();
-                GradePaperDimensionAbilityDto aCell = new GradePaperDimensionAbilityDto();
-                aCell.setCourseCode(courseCode);
-                aCell.setCourseName(courseName);
-                aDatasource.add(aCell);
-                ExcelUtil.excelExport(courseName + "-能力维度导入模板", GradePaperDimensionAbilityDto.class, aDatasource, ServletUtil.getResponse());
-                break;
-            default:
-                break;
+        case KNOWLEDGE:
+            List<GradePaperDimensionKnowledgeDto> kDatasource = new ArrayList<>();
+            GradePaperDimensionKnowledgeDto kCell = new GradePaperDimensionKnowledgeDto();
+            kCell.setCourseCode(courseCode);
+            kCell.setCourseName(courseName);
+            kDatasource.add(kCell);
+            ExcelUtil.excelExport(courseName + "-知识维度导入模板", GradePaperDimensionKnowledgeDto.class, kDatasource,
+                    ServletUtil.getResponse());
+            break;
+        case ABILITY:
+            List<GradePaperDimensionAbilityDto> aDatasource = new ArrayList<>();
+            GradePaperDimensionAbilityDto aCell = new GradePaperDimensionAbilityDto();
+            aCell.setCourseCode(courseCode);
+            aCell.setCourseName(courseName);
+            aDatasource.add(aCell);
+            ExcelUtil.excelExport(courseName + "-能力维度导入模板", GradePaperDimensionAbilityDto.class, aDatasource,
+                    ServletUtil.getResponse());
+            break;
+        default:
+            break;
         }
     }
 
     @Override
-    public List<PaperDimension> findBySchoolIdAndPaperNumberAndPaperType(Long schoolId,Long examId, String paperNumber, String paperType) {
-        return this.baseMapper.findBySchoolIdAndPaperNumberAndPaperType(schoolId,examId, paperNumber, paperType);
+    public List<PaperDimension> findBySchoolIdAndPaperNumberAndPaperType(Long schoolId, Long examId, String paperNumber,
+            String paperType) {
+        return this.baseMapper.findBySchoolIdAndPaperNumberAndPaperType(schoolId, examId, paperNumber, paperType);
     }
 
     /**
@@ -203,7 +220,8 @@ public class GradePaperDimensionServiceImpl extends ServiceImpl<GradePaperDimens
      * @param requestUser                       请求用户
      * @return 构建好的维度预新增对象集合
      */
-    private List<GradePaperDimension> checkAndBuildGradePaperDimensionList(List<GradePaperDimensionDatasource> gradePaperDimensionDatasourceList,Long examId, String paperNumber, String paperType, String paperName, DimensionEnum dimensionType, SysUser requestUser) {
+    private List<GradePaperDimension> checkAndBuildGradePaperDimensionList(List<GradePaperDimensionDatasource> gradePaperDimensionDatasourceList,
+            Long examId, String paperNumber, String paperType, String paperName, DimensionEnum dimensionType, SysUser requestUser) {
         // TODO: 2022/6/15 校验如果试卷结构不为空,判断试卷结构中是不是存在
         Map<String, String> checkPrimaryCodeNameMap = new HashMap<>();
         List<GradePaperDimension> gradePaperDimensionList = new ArrayList<>();
@@ -215,7 +233,7 @@ public class GradePaperDimensionServiceImpl extends ServiceImpl<GradePaperDimens
             String nameSecond = gradePaperDimensionDatasource.getNameSecond();
             String interpretation = gradePaperDimensionDatasource.getInterpretation();
 
-            if (SystemConstant.isOneNull(examId,paperNumber, paperType, dimensionType, codePrimary, namePrimary)) {
+            if (SystemConstant.isOneNull(examId, paperNumber, paperType, dimensionType, codePrimary, namePrimary)) {
                 throw ExceptionResultEnum.PARAMS_ERROR.exception();
             }
 
@@ -259,4 +277,4 @@ public class GradePaperDimensionServiceImpl extends ServiceImpl<GradePaperDimens
         }
         return gradePaperDimensionList;
     }
-}
+}

+ 61 - 37
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/GradePaperStructServiceImpl.java

@@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
 import com.qmth.distributed.print.business.bean.dto.excel.GradePaperStructDto;
 import com.qmth.distributed.print.business.bean.dto.open.PaperStructure;
-import com.qmth.teachcloud.common.bean.marking.Question;
 import com.qmth.distributed.print.business.bean.params.analyze.GradePaperStructDatasource;
 import com.qmth.distributed.print.business.bean.params.analyze.GradePaperStructParam;
 import com.qmth.distributed.print.business.bean.result.analyze.GradePaperStructResult;
@@ -16,11 +15,15 @@ import com.qmth.distributed.print.business.mapper.GradePaperStructMapper;
 import com.qmth.distributed.print.business.service.ExamTaskService;
 import com.qmth.distributed.print.business.service.GradeBatchPaperService;
 import com.qmth.distributed.print.business.service.GradePaperStructService;
+import com.qmth.teachcloud.common.bean.marking.Question;
+import com.qmth.teachcloud.common.bean.result.MarkQuestionResult;
 import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.BasicCourse;
 import com.qmth.teachcloud.common.entity.MarkQuestion;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.ObjectiveType;
+import com.qmth.teachcloud.common.service.BasicCourseService;
 import com.qmth.teachcloud.common.util.ExcelUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import org.apache.commons.collections4.CollectionUtils;
@@ -47,17 +50,23 @@ import java.util.stream.Stream;
  */
 @Service
 public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMapper, GradePaperStruct> implements GradePaperStructService {
+
     @Resource
     private GradeBatchPaperService gradeBatchPaperService;
+
     @Resource
     private ExamTaskService examTaskService;
 
+    @Resource
+    private BasicCourseService basicCourseService;
+
     @Override
-    public List<GradePaperStructResult> findGradePaperStructureResultList(Long examId, String paperNumber, String paperType, SysUser requestUser, List<MarkQuestion> markQuestionList) {
+    public List<GradePaperStructResult> findGradePaperStructureResultList(Long examId, String paperNumber, String paperType, SysUser requestUser, List<MarkQuestionResult> markQuestionList) {
         Long schoolId = requestUser.getSchoolId();
         List<GradePaperStructResult> result = new ArrayList<>();
         // 先从分析试卷结构表取
-        List<GradePaperStructResult> gradeStructDatasource = this.baseMapper.findStructByGradePaper(schoolId, examId, paperNumber, paperType);
+        List<GradePaperStructResult> gradeStructDatasource = this.baseMapper.findStructByGradePaper(schoolId, examId,
+                paperNumber, paperType);
         if (gradeStructDatasource != null && gradeStructDatasource.size() > 0) {
             // 如果已经设置了试卷结构查询之前配置好的分析参数-试卷结构
             result = gradeStructDatasource;
@@ -71,10 +80,8 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
             List<Question> examPaperObjList = examCloudPaperStructMap.get(ObjectiveType.OBJECTIVE);
             List<Question> examPaperSubList = examCloudPaperStructMap.get(ObjectiveType.SUBJECTIVE);
 
-            List<ExamTask> examTaskList = examTaskService.list(new QueryWrapper<ExamTask>().lambda()
-                    .eq(ExamTask::getSchoolId, schoolId)
-                    .eq(ExamTask::getExamId, examId)
-                    .eq(ExamTask::getPaperNumber, paperNumber));
+            List<ExamTask> examTaskList = examTaskService.list(
+                    new QueryWrapper<ExamTask>().lambda().eq(ExamTask::getSchoolId, schoolId).eq(ExamTask::getExamId, examId).eq(ExamTask::getPaperNumber, paperNumber));
             if (Objects.isNull(examTaskList)) {
                 throw ExceptionResultEnum.ERROR.exception("没有找到试卷编号对应的命题任务");
             }
@@ -82,12 +89,21 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
                 throw ExceptionResultEnum.ERROR.exception("有多个考试任务异常");
             }
             ExamTask examTask = examTaskList.get(0);
-            String courseCode = examTask.getCourseCode();
-            String courseName = examTask.getCourseName();
+
+            Long courseId = examTask.getCourseId();
+            BasicCourse basicCourse = basicCourseService.getById(courseId);
+            if (Objects.isNull(basicCourse)) {
+                throw ExceptionResultEnum.ERROR.exception("没有找到课程信息");
+            }
+
+            String courseCode = basicCourse.getCode();
+            String courseName = basicCourse.getName();
 
             // 按题号排序
-            examPaperObjList = examPaperObjList.stream().sorted(Comparator.comparing(Question::getMainNumber).thenComparing(Question::getSubNumber)).collect(Collectors.toList());
-            examPaperSubList = examPaperSubList.stream().sorted(Comparator.comparing(Question::getMainNumber).thenComparing(Question::getSubNumber)).collect(Collectors.toList());
+            examPaperObjList = examPaperObjList.stream().sorted(Comparator.comparing(Question::getMainNumber).thenComparing(Question::getSubNumber))
+                    .collect(Collectors.toList());
+            examPaperSubList = examPaperSubList.stream().sorted(Comparator.comparing(Question::getMainNumber).thenComparing(Question::getSubNumber))
+                    .collect(Collectors.toList());
             for (Question question : examPaperObjList) {
                 GradePaperStructResult cell = new GradePaperStructResult();
                 cell.setCourseCode(courseCode);
@@ -137,11 +153,8 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
         // 检验结构正确性并构建分析试卷结构
         List<GradePaperStruct> gradePaperStructList = this.checkAndBuildGradePaperStruct(datasource, examId, paperNumber, paperType, paperName, requestUser);
         // 删除旧的试卷结构
-        this.remove(new QueryWrapper<GradePaperStruct>()
-                .lambda()
-                .eq(GradePaperStruct::getSchoolId, schoolId)
-                .eq(GradePaperStruct::getExamId, examId)
-                .eq(GradePaperStruct::getPaperNumber, paperNumber)
+        this.remove(new QueryWrapper<GradePaperStruct>().lambda().eq(GradePaperStruct::getSchoolId, schoolId)
+                .eq(GradePaperStruct::getExamId, examId).eq(GradePaperStruct::getPaperNumber, paperNumber)
                 .eq(GradePaperStruct::getPaperType, paperType));
         this.saveBatch(gradePaperStructList);
         gradeBatchPaperService.updatePaperAndBatchStatus(schoolId, examId, paperNumber, paperType);
@@ -149,20 +162,23 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public void importGradePaperStruct(MultipartFile file, String paperNumber, String paperType, String paperName, SysUser requestUser) throws IOException, NoSuchFieldException {
+    public void importGradePaperStruct(MultipartFile file, Long examId, String paperNumber, String paperType, String paperName,
+            SysUser requestUser) throws IOException, NoSuchFieldException {
         if (Objects.isNull(file)) {
             throw ExceptionResultEnum.ERROR.exception("找不到附件");
         }
-        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(GradePaperStructDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
-            if (finalExcelErrorList.size() > 0) {
-                throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(finalExcelErrorList));
-            }
-            return finalExcelList;
-        }, 1);
+        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(file.getInputStream(), Lists.newArrayList(GradePaperStructDto.class),
+                (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
+                    if (finalExcelErrorList.size() > 0) {
+                        throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(finalExcelErrorList));
+                    }
+                    return finalExcelList;
+                }, 1);
         GradePaperStructParam gradePaperStructParam = new GradePaperStructParam();
         gradePaperStructParam.setPaperNumber(paperNumber);
         gradePaperStructParam.setPaperType(paperType);
         gradePaperStructParam.setPaperName(paperName);
+        gradePaperStructParam.setExamId(examId);
         List<GradePaperStructDatasource> gradePaperStructDatasourceList = new ArrayList<>();
 
         if (Objects.nonNull(finalList) && finalList.size() > 0) {
@@ -191,18 +207,24 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
     }
 
     @Override
-    public void exportGradePaperStructTemplate(Long examId, String paperNumber, String paperType, @NotNull SysUser requestUser, List<MarkQuestion> markQuestionList) throws Exception {
+    public void exportGradePaperStructTemplate(Long examId, String paperNumber, String paperType, @NotNull SysUser requestUser, List<MarkQuestionResult> markQuestionList) throws Exception {
 
-        ExamTask examTask = examTaskService.getOne(new QueryWrapper<ExamTask>().lambda()
-                .eq(ExamTask::getSchoolId, requestUser.getSchoolId())
-                .eq(ExamTask::getPaperNumber, paperNumber));
+        ExamTask examTask = examTaskService.getOne(
+                new QueryWrapper<ExamTask>().lambda().eq(ExamTask::getSchoolId, requestUser.getSchoolId()).eq(ExamTask::getPaperNumber, paperNumber));
         if (Objects.isNull(examTask)) {
             throw ExceptionResultEnum.ERROR.exception("没有找到试卷编号对应的命题任务");
         }
-        String courseCode = examTask.getCourseCode();
-        String courseName = examTask.getCourseName();
+        Long courseId = examTask.getCourseId();
+        BasicCourse basicCourse = basicCourseService.getById(courseId);
+        if (Objects.isNull(basicCourse)) {
+            throw ExceptionResultEnum.ERROR.exception("未找到课程信息");
+        }
+
+        String courseCode = basicCourse.getCode();
+        String courseName = basicCourse.getName();
 
-        List<GradePaperStructResult> datasource = this.findGradePaperStructureResultList(examId, paperNumber, paperType, requestUser, markQuestionList);
+        List<GradePaperStructResult> datasource = this.findGradePaperStructureResultList(examId, paperNumber, paperType,
+                requestUser, markQuestionList);
         List<GradePaperStructDto> gradePaperStructDtoList = datasource.stream().flatMap(e -> {
             GradePaperStructDto cell = new GradePaperStructDto();
             cell.setCourseCode(courseCode);
@@ -222,7 +244,8 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
     }
 
     @Override
-    public List<PaperStructure> findBySchoolIdAndPaperNumberAndPaperType(Long schoolId, Long examId, String paperNumber, String paperType) {
+    public List<PaperStructure> findBySchoolIdAndPaperNumberAndPaperType(Long schoolId, Long examId, String paperNumber,
+            String paperType) {
         return this.baseMapper.findBySchoolIdAndPaperNumberAndPaperType(schoolId, examId, paperNumber, paperType);
     }
 
@@ -236,10 +259,10 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
         // 如果没有客观题 试卷类型传空
         paperType = null;
         // todo 3.3.0待更新
-//        String cloudInfoJson = cloudMarkingTaskUtils.queryPaperStructure(schoolId, examId, subjectCode, paperType);
-//        examPaperStructure.setCloudInfoJson(cloudInfoJson);
-//        examPaperStructure.setStructureChange(false);
-//        examPaperStructureService.updateById(examPaperStructure);
+        //        String cloudInfoJson = cloudMarkingTaskUtils.queryPaperStructure(schoolId, examId, subjectCode, paperType);
+        //        examPaperStructure.setCloudInfoJson(cloudInfoJson);
+        //        examPaperStructure.setStructureChange(false);
+        //        examPaperStructureService.updateById(examPaperStructure);
 
         // 更新grade_paper_struct
         QueryWrapper<GradePaperStruct> willDeleteQueryWrapper = new QueryWrapper<>();
@@ -271,7 +294,8 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
             gradePaperStruct.setPaperNumber(paperNumber);
             gradePaperStruct.setPaperType(paperType);
             gradePaperStruct.setPaperName(paperName);
-            gradePaperStruct.setQuestionName(e.getBigTopicName() + " " + e.getBigQuestionNumber() + SystemConstant.HYPHEN + e.getSmallQuestionNumber());
+            gradePaperStruct.setQuestionName(
+                    e.getBigTopicName() + " " + e.getBigQuestionNumber() + SystemConstant.HYPHEN + e.getSmallQuestionNumber());
             gradePaperStruct.setNumberType(e.getNumberType());
             gradePaperStruct.setBigQuestionNumber(e.getBigQuestionNumber());
             gradePaperStruct.setSmallQuestionNumber(e.getSmallQuestionNumber());
@@ -289,7 +313,7 @@ public class GradePaperStructServiceImpl extends ServiceImpl<GradePaperStructMap
         }).collect(Collectors.toList());
     }
 
-    private Map<ObjectiveType, List<Question>> parseExamCloudPaperStruct(List<MarkQuestion> markQuestionList) {
+    private Map<ObjectiveType, List<Question>> parseExamCloudPaperStruct(List<MarkQuestionResult> markQuestionList) {
         Map<ObjectiveType, List<Question>> result = new HashMap<>();
         List<Question> objList = new ArrayList<>();
         List<Question> subList = new ArrayList<>();

+ 34 - 0
distributed-print-business/src/main/resources/mapper/ExamStudentMapper.xml

@@ -171,4 +171,38 @@
         WHERE
             es.exam_detail_course_id = #{examDetailCourseId}
     </select>
+
+    <select id="listMarkStudentInfo"
+            resultType="com.qmth.distributed.print.business.bean.dto.ExamStudentCourseClassDto">
+        SELECT
+            bc.code AS courseCode,
+            bc.name AS courseName,
+            ms.paper_number AS paperNumber,
+            ms.paper_type AS paperType,
+            btc.clazz_name AS clazzName,
+            teacher.login_name AS teacherNumber,
+            teacher.real_name AS teacherName
+        FROM
+            mark_student ms
+                LEFT JOIN
+            basic_exam_student bes ON ms.basic_student_id = bes.id
+                LEFT JOIN
+            basic_course bc ON ms.course_id = bc.id
+                LEFT JOIN
+            basic_teach_clazz btc ON btc.id = bes.clazz_id
+                LEFT JOIN
+            sys_user teacher ON teacher.id = bes.teacher_id
+        <where>
+            <if test="examId != null">
+                AND ms.exam_id = #{examId}
+            </if>
+            <if test="paperNumber != null and paperNumber != ''">
+                AND ms.paper_number = #{paperNumber}
+            </if>
+            <if test="paperType != null and paperType != ''">
+                AND ms.paper_type = #{paperType}
+            </if>
+        </where>
+        GROUP BY courseCode , courseName , paperNumber , paperType , clazzName , teacherNumber , teacherName
+    </select>
 </mapper>

+ 8 - 5
distributed-print-business/src/main/resources/mapper/GradeInitializeMapper.xml

@@ -8,8 +8,9 @@
             bs.name AS semesterName,
             be.id AS examId,
             be.name AS examName,
-            et.course_code AS courseCode,
-            et.course_name AS courseName,
+            bc.id AS courseId,
+            bc.code AS courseCode,
+            bc.name AS courseName,
             et.paper_number AS paperNumber,
             pnpt.paper_type AS paperType,
             pnpt.paper_name AS paperName,
@@ -41,6 +42,8 @@
             basic_exam be ON et.exam_id = be.id AND be.enable
                 INNER JOIN
             basic_semester bs ON bs.id = be.semester_id AND bs.enable
+                LEFT JOIN
+            basic_course bc ON et.course_id = bc.id
         <where>
             <if test="schoolId != null and schoolId != ''">
                 AND et.school_id = #{schoolId}
@@ -51,8 +54,8 @@
             <if test="examId != null and examId != ''">
                 AND be.id = #{examId}
             </if>
-            <if test="courseCode != null and courseCode != ''">
-                AND et.course_code = #{courseCode}
+            <if test="courseId != null">
+                AND bc.id = #{courseId}
             </if>
             <if test="dpr != null">
                 <if test="dpr.requestUserId != null">
@@ -66,7 +69,7 @@
                 </if>
             </if>
         </where>
-        ORDER BY bs.name , be.name , et.course_code ,et.exam_id, et.paper_number , pnpt.paper_type
+        ORDER BY bs.name , be.name , et.course_id ,et.exam_id, et.paper_number , pnpt.paper_type
     </select>
 
     <select id="listNeedAnalyzedPaperToWork"

+ 4 - 2
distributed-print-business/src/main/resources/mapper/GradePaperDimensionMapper.xml

@@ -5,8 +5,8 @@
     <select id="findGradePaperDimensionList"
             resultType="com.qmth.distributed.print.business.bean.result.analyze.GradePaperDimensionResult">
         SELECT
-            et.course_code AS courseCode,
-            et.course_name AS courseName,
+            bc.code AS courseCode,
+            bc.name AS courseName,
             gpd.dimension_type AS dimensionType,
             gpd.code_primary AS codePrimary,
             gpd.name_primary AS namePrimary,
@@ -19,6 +19,8 @@
             exam_task et ON gpd.school_id = et.school_id
                 AND gpd.exam_id = et.exam_id
                 AND gpd.paper_number = et.paper_number
+                LEFT JOIN
+            basic_course bc ON et.course_id = bc.id
         <where>
             <if test="schoolId != null and schoolId != ''">
                 AND gpd.school_id = #{schoolId}

+ 5 - 4
distributed-print-business/src/main/resources/mapper/GradePaperStructMapper.xml

@@ -25,8 +25,8 @@
     <select id="findStructByGradePaper"
             resultType="com.qmth.distributed.print.business.bean.result.analyze.GradePaperStructResult">
         SELECT
-            et.course_code AS courseCode,
-            et.course_name AS courseName,
+            bc.code AS courseCode,
+            bc.name AS courseName,
             gps.paper_number AS paperNumber,
             gps.paper_type AS paperType,
             gps.number_type AS numberType,
@@ -44,13 +44,14 @@
                  school_id,
                  exam_id,
                  paper_number,
-                 MAX(course_code) AS course_code,
-                 MAX(course_name) AS course_name
+                 MAX(course_id) AS course_id
              FROM
                  exam_task
              GROUP BY school_id ,exam_id, paper_number) et ON gps.school_id = et.school_id
                 AND gps.exam_Id = et.exam_id
                 AND gps.paper_number = et.paper_number
+                LEFT JOIN
+            basic_course bc ON et.course_id = bc.id
         <where>
             <if test="schoolId != null and schoolId != ''">
                 AND gps.school_id = #{schoolId}

+ 4 - 4
distributed-print/src/main/java/com/qmth/distributed/print/api/GradePaperController.java

@@ -45,14 +45,14 @@ public class GradePaperController {
     @ApiOperation(value = "成绩分析课程数据初始化")
     @RequestMapping(value = "/initialize", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = GradeInitResult.class)})
-    public Result findGradePaperInitialize(@ApiParam(value = "学期id") @RequestParam(required = false) String semesterId,
-                                           @ApiParam(value = "考试id") @RequestParam(required = false) String examId,
-                                           @ApiParam(value = "课程编号") @RequestParam(required = false) String courseCode,
+    public Result findGradePaperInitialize(@ApiParam(value = "学期id") @RequestParam(required = false) Long semesterId,
+                                           @ApiParam(value = "考试id") @RequestParam(required = false) Long examId,
+                                           @ApiParam(value = "课程编号") @RequestParam(required = false) Long courseId,
                                            @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
                                            @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
 
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
-        return ResultUtil.ok(gradeInitializeService.findNeedAnalyzedPaper(SystemConstant.convertIdToLong(semesterId), SystemConstant.convertIdToLong(examId), courseCode, requestUser, pageNumber, pageSize));
+        return ResultUtil.ok(gradeInitializeService.findNeedAnalyzedPaper(semesterId, examId, courseId, requestUser, pageNumber, pageSize));
     }
 
     @ApiOperation(value = "成绩分析课程-查询定义")

+ 3 - 5
distributed-print/src/main/java/com/qmth/distributed/print/api/GradePaperDimensionController.java

@@ -100,15 +100,13 @@ public class GradePaperDimensionController {
     @RequestMapping(value = "/export", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
     @OperationLogDetail(operationType = OperationTypeEnum.EXPORT)
-    public Result gradePaperDimensionExport(@ApiParam(value = "课程编号", required = true) @RequestParam String courseCode,
-                                            @ApiParam(value = "课程名称", required = true) @RequestParam String courseName,
+    public Result gradePaperDimensionExport(@ApiParam(value = "课程Id", required = true) @RequestParam Long courseId,
                                             @ApiParam(value = "维度类型", required = true) @RequestParam DimensionEnum dimensionType) throws Exception {
 
-        SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
-        if (SystemConstant.isOneNull(courseCode, courseName, dimensionType)) {
+        if (SystemConstant.isOneNull(courseId, dimensionType)) {
             throw ExceptionResultEnum.ERROR.exception("参数不完整");
         }
-        gradePaperDimensionService.exportGradePaperDimensionTemplate(courseCode, courseName, dimensionType);
+        gradePaperDimensionService.exportGradePaperDimensionTemplate(courseId, dimensionType);
         return ResultUtil.ok();
     }
 }

+ 34 - 27
distributed-print/src/main/java/com/qmth/distributed/print/api/GradePaperStructController.java

@@ -5,6 +5,7 @@ import com.qmth.distributed.print.business.bean.params.analyze.GradePaperStructP
 import com.qmth.distributed.print.business.bean.result.analyze.GradePaperStructResult;
 import com.qmth.distributed.print.business.service.GradePaperStructService;
 import com.qmth.teachcloud.common.annotation.OperationLogDetail;
+import com.qmth.teachcloud.common.bean.result.MarkQuestionResult;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.MarkQuestion;
 import com.qmth.teachcloud.common.entity.SysUser;
@@ -39,31 +40,36 @@ import java.util.List;
 @Validated
 //@Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
 public class GradePaperStructController {
+
     @Resource
     private GradePaperStructService gradePaperStructService;
+
     @Resource
     private MarkQuestionService markQuestionService;
 
     @ApiOperation(value = "成绩分析试卷结构-查询")
     @RequestMapping(value = "/list", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = GradePaperStructResult.class)})
-    public Result findGradePaperStructList(@ApiParam(value = "考试id", required = true) @RequestParam Long examId,
-                                           @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
-                                           @ApiParam(value = "试卷类型", required = true) @RequestParam String paperType) {
+    @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = GradePaperStructResult.class) })
+    public Result findGradePaperStructList(@ApiParam(value = "考试id", required = true) @RequestParam Long examId, @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
+            @ApiParam(value = "试卷类型", required = true) @RequestParam String paperType) {
 
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
         if (SystemConstant.isOneNull(paperNumber, paperType)) {
             throw ExceptionResultEnum.ERROR.exception("试卷参数不完整");
         }
-        List<MarkQuestion> markQuestionList = markQuestionService.listByExamIdAndPaperNumberAndPaperType(examId, paperNumber, paperType, null);
-        return ResultUtil.ok(gradePaperStructService.findGradePaperStructureResultList(examId, paperNumber, paperType, requestUser, markQuestionList));
+        List<MarkQuestionResult> markQuestionList = markQuestionService.listDetailByExamIdAndPaperNumberAndPaperType(
+                examId, paperNumber, paperType, null);
+        return ResultUtil.ok(
+                gradePaperStructService.findGradePaperStructureResultList(examId, paperNumber, paperType, requestUser,
+                        markQuestionList));
     }
 
     @ApiOperation(value = "成绩分析试卷结构-新建试卷结构")
     @RequestMapping(value = "/save", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "更新成功", response = Result.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "更新成功", response = Result.class) })
     @OperationLogDetail(operationType = OperationTypeEnum.ADD)
-    public Result saveGradePaperStructBatch(@Valid @RequestBody GradePaperStructParam gradePaperStructParam, BindingResult bindingResult) {
+    public Result saveGradePaperStructBatch(@Valid @RequestBody GradePaperStructParam gradePaperStructParam,
+            BindingResult bindingResult) {
         if (bindingResult.hasErrors()) {
             return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
         }
@@ -74,51 +80,52 @@ public class GradePaperStructController {
 
     @ApiOperation(value = "成绩分析试卷结构-导入")
     @RequestMapping(value = "/import", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class) })
     @OperationLogDetail(operationType = OperationTypeEnum.IMPORT)
-    public Result gradePaperStructImport(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,
-                                         @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
-                                         @ApiParam(value = "试卷类型", required = true) @RequestParam String paperType,
-                                         @ApiParam(value = "试卷名称", required = true) @RequestParam String paperName) throws IOException, NoSuchFieldException {
+    public Result gradePaperStructImport(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file, @ApiParam(value = "考试id", required = true) @RequestParam Long examId,
+            @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber, @ApiParam(value = "试卷类型", required = true) @RequestParam String paperType,
+            @ApiParam(value = "试卷名称", required = true) @RequestParam String paperName) throws IOException, NoSuchFieldException {
 
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
-        if (SystemConstant.isOneNull(file, paperNumber, paperType, paperName)) {
+        if (SystemConstant.isOneNull(file, examId, paperNumber, paperType, paperName)) {
             throw ExceptionResultEnum.ERROR.exception("参数不完整");
         }
-        gradePaperStructService.importGradePaperStruct(file, paperNumber, paperType, paperName, requestUser);
+        gradePaperStructService.importGradePaperStruct(file, examId, paperNumber, paperType, paperName, requestUser);
         return ResultUtil.ok();
     }
 
     @ApiOperation(value = "成绩分析试卷结构-模板导出")
     @RequestMapping(value = "/export", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class) })
     @OperationLogDetail(operationType = OperationTypeEnum.EXPORT)
-    public Result gradePaperStructExport(@ApiParam(value = "考试id", required = true) @RequestParam Long examId,
-                                         @ApiParam(value = "课程编号", required = true) @RequestParam String paperNumber,
-                                         @ApiParam(value = "课程名称", required = true) @RequestParam String paperType) throws Exception {
+    public Result gradePaperStructExport(@ApiParam(value = "考试id", required = true) @RequestParam Long examId, @ApiParam(value = "课程编号", required = true) @RequestParam String paperNumber,
+            @ApiParam(value = "课程名称", required = true) @RequestParam String paperType) throws Exception {
 
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
         if (SystemConstant.isOneNull(examId, paperNumber, paperType)) {
             throw ExceptionResultEnum.ERROR.exception("参数不完整");
         }
-        List<MarkQuestion> markQuestionList = markQuestionService.listByExamIdAndPaperNumberAndPaperType(examId, paperNumber, paperType, null);
-        gradePaperStructService.exportGradePaperStructTemplate(examId, paperNumber, paperType, requestUser, markQuestionList);
+        List<MarkQuestionResult> markQuestionList = markQuestionService.listDetailByExamIdAndPaperNumberAndPaperType(
+                examId, paperNumber, paperType, null);
+        gradePaperStructService.exportGradePaperStructTemplate(examId, paperNumber, paperType, requestUser,
+                markQuestionList);
         return ResultUtil.ok();
     }
 
     @ApiOperation(value = "成绩分析试卷结构-更新试卷机构")
     @RequestMapping(value = "/change_paper_structure", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "更新成功", response = Result.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "更新成功", response = Result.class) })
     @OperationLogDetail(operationType = OperationTypeEnum.UPDATE)
-    public Result updateExamCloudPaperStruct(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
-                                             @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
-                                             @ApiParam(value = "试卷类型") @RequestParam(required = false) String paperType) {
+    public Result updateExamCloudPaperStruct(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId, @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
+            @ApiParam(value = "试卷类型") @RequestParam(required = false) String paperType) {
         if (SystemConstant.isOneNull(paperNumber)) {
             throw ExceptionResultEnum.ERROR.exception("缺少试卷编号");
         }
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
-        List<MarkQuestion> markQuestionList = markQuestionService.listByExamIdAndPaperNumberAndPaperType(examId, paperNumber, paperType, null);
-        gradePaperStructService.updateExamCloudPaperStruct(requestUser.getSchoolId(), paperNumber, paperType, markQuestionList);
+        List<MarkQuestion> markQuestionList = markQuestionService.listByExamIdAndPaperNumberAndPaperType(examId,
+                paperNumber, paperType, null);
+        gradePaperStructService.updateExamCloudPaperStruct(requestUser.getSchoolId(), paperNumber, paperType,
+                markQuestionList);
         return ResultUtil.ok();
     }
 }

+ 48 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/result/MarkQuestionResult.java

@@ -0,0 +1,48 @@
+package com.qmth.teachcloud.common.bean.result;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.common.entity.MarkQuestion;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Description: 试卷结构详情(带课程信息)
+ * @Author: CaoZixuan
+ * @Date: 2024-07-11
+ */
+public class MarkQuestionResult extends MarkQuestion {
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "课程id")
+    private Long courseId;
+
+    @ApiModelProperty(value = "课程编号")
+    private String courseCode;
+
+    @ApiModelProperty(value = "课程名称")
+    private String courseName;
+
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public String getCourseCode() {
+        return courseCode;
+    }
+
+    public void setCourseCode(String courseCode) {
+        this.courseCode = courseCode;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+}

+ 7 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkQuestionMapper.java

@@ -1,9 +1,12 @@
 package com.qmth.teachcloud.mark.mapper;
 
-import com.qmth.teachcloud.common.entity.MarkQuestion;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.teachcloud.common.bean.result.MarkQuestionResult;
+import com.qmth.teachcloud.common.entity.MarkQuestion;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * <p>
  * 小题信息表 Mapper 接口
@@ -17,4 +20,7 @@ public interface MarkQuestionMapper extends BaseMapper<MarkQuestion> {
     String assembleQuestionsByExamIdAndPaperNumberAndNumber(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("groupNumber") Integer groupNumber);
 
     Double sumTotalScoreByGroupNumber(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("groupNumber") Integer groupNumber);
+
+    List<MarkQuestionResult> listByExamIdAndPaperNumberAndPaperType(@Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("paperType") String paperType,
+            @Param("objective") Boolean objective);
 }

+ 3 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkQuestionService.java

@@ -4,6 +4,7 @@ import java.util.List;
 
 import javax.servlet.http.HttpServletResponse;
 
+import com.qmth.teachcloud.common.bean.result.MarkQuestionResult;
 import org.springframework.web.multipart.MultipartFile;
 
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -77,6 +78,8 @@ public interface MarkQuestionService extends IService<MarkQuestion> {
 
     List<MarkQuestion> listByExamIdAndPaperNumberAndPaperType(Long examId, String paperNumber, String paperType, Boolean objective);
 
+    List<MarkQuestionResult> listDetailByExamIdAndPaperNumberAndPaperType(Long examId, String paperNumber, String paperType, Boolean objective);
+
     void deleteByExamIdAndPaperNumber(Long examId, String paperNumber);
 
     /**

+ 6 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkQuestionServiceImpl.java

@@ -7,6 +7,7 @@ import java.util.stream.Stream;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 
+import com.qmth.teachcloud.common.bean.result.MarkQuestionResult;
 import com.qmth.teachcloud.mark.service.*;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.MapUtils;
@@ -510,6 +511,11 @@ public class MarkQuestionServiceImpl extends ServiceImpl<MarkQuestionMapper, Mar
         return this.list(queryWrapper);
     }
 
+    @Override
+    public List<MarkQuestionResult> listDetailByExamIdAndPaperNumberAndPaperType(Long examId, String paperNumber, String paperType, Boolean objective) {
+        return this.baseMapper.listByExamIdAndPaperNumberAndPaperType(examId, paperNumber, paperType, objective);
+    }
+
     @Override
     public void deleteByExamIdAndPaperNumber(Long examId, String paperNumber) {
         UpdateWrapper<MarkQuestion> updateWrapper = new UpdateWrapper<>();

+ 50 - 0
teachcloud-mark/src/main/resources/mapper/ClientUpgradeService.xml → teachcloud-mark/src/main/resources/mapper/MarkQuestionMapper.xml

@@ -41,5 +41,55 @@
           AND q.paper_number = #{paperNumber}
           AND q.group_number = #{groupNumber}
     </select>
+    <select id="listByExamIdAndPaperNumberAndPaperType"
+            resultType="com.qmth.teachcloud.common.bean.result.MarkQuestionResult">
+        SELECT
+            mq.id AS id,
+            mq.exam_id AS examId,
+            mq.paper_number AS paperNumber,
+            mq.paper_type AS paperType,
+            mq.objective AS objective,
+            mq.group_number AS groupNumber,
+            mq.main_number AS mainNumber,
+            mq.sub_number AS subNumber,
+            mq.main_title AS mainTitle,
+            mq.answer AS answer,
+            mq.total_score AS totalScore,
+            mq.option_count AS optionCount,
+            mq.interval_score AS intervalScore,
+            mq.objective_policy AS objectivePolicy,
+            mq.question_type AS questionType,
+            mq.name AS name,
+            mq.paper_index AS paperIndex,
+            mq.page_index AS pageIndex,
+            mq.objective_policy_score AS objectivePolicyScore,
+            mq.create_id AS createId,
+            mq.create_time AS createTime,
+            mq.update_id AS updateId,
+            mq.update_time AS updateTime,
+            bc.code AS courseCode,
+            bc.name AS courseName,
+            bc.id AS courseId
+        FROM
+            mark_question mq
+                LEFT JOIN
+            exam_task et ON mq.exam_id = et.exam_id AND et.paper_number = mq.paper_number
+                LEFT JOIN
+            basic_course bc ON et.course_id = bc.id
+        <where>
+            <if test="examId != null">
+                AND mq.exam_id = #{examId}
+            </if>
+            <if test="paperType != null and paperType != ''">
+                AND mq.paper_type = #{paperType}
+            </if>
+            <if test="paperNumber != null and paperNumber != ''">
+                AND mq.paper_number = #{paperNumber}
+            </if>
+            <if test="objective != null">
+                AND mq.objective = #{objective}
+            </if>
+        </where>
+    </select>
 
 </mapper>