Przeglądaj źródła

成绩管理1对多

wangliang 8 miesięcy temu
rodzic
commit
8ca18a2652
32 zmienionych plików z 1031 dodań i 491 usunięć
  1. 15 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/excel/ExcelField.java
  2. 2 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/PrintCommonService.java
  3. 18 17
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/PrintCommonServiceImpl.java
  4. 20 1
      distributed-print-business/src/main/resources/db/log/wl.sql
  5. 41 19
      distributed-print/src/main/java/com/qmth/distributed/print/api/obe/TCFinalScoreController.java
  6. 11 10
      distributed-print/src/main/java/com/qmth/distributed/print/api/obe/TCPaperStructController.java
  7. 57 12
      distributed-print/src/main/java/com/qmth/distributed/print/api/obe/TCUsualScoreController.java
  8. 129 114
      distributed-print/src/main/java/com/qmth/distributed/print/api/obe/TRBasicInfoController.java
  9. 1 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java
  10. 30 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/archivescore/MarkStudentScoreVo.java
  11. 131 127
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/MarkStudentVo.java
  12. 2 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java
  13. 23 0
      teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/been/result/ObeScoreResult.java
  14. 32 8
      teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/been/result/report/ReportResult.java
  15. 23 4
      teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/entity/TCFinalScore.java
  16. 51 4
      teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/entity/TCUsualScore.java
  17. 12 0
      teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/entity/TRBasicInfo.java
  18. 19 4
      teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/mapper/TCFinalScoreMapper.java
  19. 3 1
      teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/mapper/TCUsualScoreMapper.java
  20. 17 8
      teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/TCFinalScoreService.java
  21. 10 5
      teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/TCPaperStructService.java
  22. 18 3
      teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/TCUsualScoreService.java
  23. 12 5
      teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/TRBasicInfoService.java
  24. 3 1
      teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/TRExamStudentService.java
  25. 2 3
      teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/impl/ObeCourseRequirementReportServiceImpl.java
  26. 69 28
      teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/impl/TCFinalScoreServiceImpl.java
  27. 26 15
      teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/impl/TCPaperStructServiceImpl.java
  28. 44 12
      teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/impl/TCUsualScoreServiceImpl.java
  29. 134 74
      teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/impl/TRBasicInfoServiceImpl.java
  30. 13 3
      teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/impl/TRExamStudentServiceImpl.java
  31. 45 0
      teachcloud-obe/src/main/resources/mapper/TCFinalScoreMapper.xml
  32. 18 11
      teachcloud-obe/src/main/resources/mapper/TCUsualScoreMapper.xml

+ 15 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/excel/ExcelField.java

@@ -34,6 +34,13 @@ public class ExcelField implements Serializable {
 
     }
 
+    public ExcelField(String code, Boolean comment) {
+        this.index = getIndex() + 1;
+        this.code = code;
+        this.name = code;
+        this.comment = comment;
+    }
+
     public ExcelField(String code, String name, Boolean comment) {
         this.index = getIndex() + 1;
         this.code = code;
@@ -42,6 +49,14 @@ public class ExcelField implements Serializable {
         this.value = "测试" + name;
     }
 
+    public ExcelField(String code, String name, String value, Boolean comment) {
+        this.index = getIndex() + 1;
+        this.code = code;
+        this.name = name;
+        this.comment = comment;
+        this.value = value;
+    }
+
     public void setNull() {
         this.index = null;
         this.code = null;

+ 2 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/PrintCommonService.java

@@ -188,8 +188,8 @@ public interface PrintCommonService {
      * @param describe
      * @param sheetName
      * @param fileName
-     * @param excelFieldList
+     * @param excelFieldRowList
      * @throws IOException
      */
-    public void scoreDownLoadExaminationTemplate(String describe, String sheetName, String fileName, List<ExcelField> excelFieldList) throws IOException;
+    public void scoreDownLoadExaminationTemplate(String describe, String sheetName, String fileName, List<List<ExcelField>> excelFieldRowList) throws IOException;
 }

+ 18 - 17
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/PrintCommonServiceImpl.java

@@ -215,7 +215,6 @@ public class PrintCommonServiceImpl implements PrintCommonService {
      *
      * @param file
      * @param cultureProgramId
-     * @param courseCode
      * @param paperNumber
      * @param courseId
      * @return
@@ -249,11 +248,11 @@ public class PrintCommonServiceImpl implements PrintCommonService {
      * @param describe
      * @param sheetName
      * @param fileName
-     * @param excelFieldList
+     * @param excelFieldRowList
      * @throws IOException
      */
     @Override
-    public void scoreDownLoadExaminationTemplate(String describe, String sheetName, String fileName, List<ExcelField> excelFieldList) throws IOException {
+    public void scoreDownLoadExaminationTemplate(String describe, String sheetName, String fileName, List<List<ExcelField>> excelFieldRowList) throws IOException {
         HttpServletResponse response = ServletUtil.getResponse();
         log.debug("导出Excel开始...");
         XSSFWorkbook wb = new XSSFWorkbook();
@@ -275,7 +274,8 @@ public class PrintCommonServiceImpl implements PrintCommonService {
         describeFont.setFontName("宋体");
         describeFont.setColor(IndexedColors.RED.getIndex());
 
-        int cellCount = excelFieldList.size();
+        List<ExcelField> excelFieldFirstList = excelFieldRowList.get(0);
+        int cellCount = excelFieldFirstList.size();
         // 说明
         XSSFCellStyle describeStyle = wb.createCellStyle();
         describeStyle.setAlignment(HorizontalAlignment.LEFT);
@@ -300,11 +300,11 @@ public class PrintCommonServiceImpl implements PrintCommonService {
         headerStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
         headerStyle.setFont(headFont);
         XSSFRow rowHead = sheet.createRow(1);
-        for (int i = 0; i < excelFieldList.size(); i++) {
+        for (int i = 0; i < excelFieldFirstList.size(); i++) {
             XSSFCell cell = rowHead.createCell(i);
-            cell.setCellValue(excelFieldList.get(i).getName());
+            cell.setCellValue(excelFieldFirstList.get(i).getName());
             cell.setCellStyle(headerStyle);
-            if (excelFieldList.get(i).getComment()) {
+            if (excelFieldFirstList.get(i).getComment()) {
                 // 前四个参数是坐标点,后四个参数是编辑和显示批注时的大小.
                 XSSFDrawing p = sheet.createDrawingPatriarch();
                 XSSFComment comment = p.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, (short) 3, 3, (short) 5, 6));
@@ -318,17 +318,18 @@ public class PrintCommonServiceImpl implements PrintCommonService {
         XSSFCellStyle exampleStyle = wb.createCellStyle();
         exampleStyle.setAlignment(HorizontalAlignment.LEFT);
         exampleStyle.setFont(defaultFont);
-        XSSFRow rowExample = sheet.createRow(2);
-        for (int i = 0; i < excelFieldList.size(); i++) {
-            XSSFCell cell = rowExample.createCell(i);
-            if (excelFieldList.get(i).getCode().startsWith("score")) {
-                cell.setCellValue(new Random().nextInt(100) + 1);
-            } else if (excelFieldList.get(i).getCode().startsWith("key")) {
-                cell.setCellValue(new Random().nextInt(10) + 1);
-            } else {
-                cell.setCellValue(excelFieldList.get(i).getValue());
+        for (int y = 0; y < excelFieldRowList.size(); y++) {
+            XSSFRow rowExample = sheet.createRow(2 + y);
+            List<ExcelField> excelFieldList = excelFieldRowList.get(y);
+            for (int i = 0; i < excelFieldList.size(); i++) {
+                XSSFCell cell = rowExample.createCell(i);
+                if (excelFieldList.get(i).getCode().startsWith("score")) {
+                } else if (excelFieldList.get(i).getCode().startsWith("key")) {
+                } else {
+                    cell.setCellValue(excelFieldList.get(i).getValue());
+                }
+                cell.setCellStyle(exampleStyle);
             }
-            cell.setCellStyle(exampleStyle);
         }
 
         for (int i = 0; i < cellCount; i++) {

+ 20 - 1
distributed-print-business/src/main/resources/db/log/wl.sql

@@ -5,4 +5,23 @@ VALUES(2111, '平时成绩-获取作业集合', '/api/admin/course/degree/usual_
 
 UPDATE sys_privilege
 SET name='管理成绩', url='Score', `type`='LINK', parent_id=2001, `sequence`=1, property='AUTH', related='2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2029,2030,2031,2032,2033,2034,3018,2111', enable=1, default_auth=0, front_display=1
-WHERE id=2006;
+WHERE id=2006;
+
+-- 2024-10-16
+ALTER TABLE t_c_usual_score ADD source varchar(50) NULL COMMENT '来源,EXCEL_IMPORT:excel导入,SYNC:数据同步';
+ALTER TABLE t_c_usual_score CHANGE source source varchar(50) NULL COMMENT '来源,EXCEL_IMPORT:excel导入,SYNC:数据同步' AFTER enable;
+ALTER TABLE t_c_final_score MODIFY COLUMN score_detail mediumtext NULL COMMENT '成绩明细';
+ALTER TABLE t_c_final_score MODIFY COLUMN score double NULL COMMENT '分数';
+ALTER TABLE t_c_usual_score MODIFY COLUMN score mediumtext NULL COMMENT '平常作业分数';
+
+-- 2024-10-17
+ALTER TABLE t_c_usual_score ADD teach_class_name varchar(100) NOT NULL COMMENT '教学班';
+ALTER TABLE t_c_usual_score CHANGE teach_class_name teach_class_name varchar(100) NOT NULL COMMENT '教学班' AFTER source;
+ALTER TABLE t_c_final_score ADD teach_class_name varchar(100) NOT NULL COMMENT '教学班';
+ALTER TABLE t_c_final_score CHANGE teach_class_name teach_class_name varchar(100) NOT NULL COMMENT '教学班' AFTER source;
+ALTER TABLE t_r_basic_info ADD teach_class_name varchar(100) NOT NULL COMMENT '教学班';
+ALTER TABLE t_r_basic_info CHANGE teach_class_name teach_class_name varchar(100) NOT NULL COMMENT '教学班' AFTER enable;
+
+-- 2024-10-18
+ALTER TABLE t_r_basic_info DROP KEY t_r_basic_info_unique;
+ALTER TABLE t_r_basic_info ADD CONSTRAINT t_r_basic_info_unique UNIQUE KEY (culture_program_id,course_id,exam_id,paper_number,teach_class_name);

+ 41 - 19
distributed-print/src/main/java/com/qmth/distributed/print/api/obe/TCFinalScoreController.java

@@ -96,10 +96,23 @@ public class TCFinalScoreController {
                                            @ApiParam(value = "科目id", required = true) @RequestParam Long courseId,
                                            @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber,
                                            @ApiParam(value = "培养方案id", required = true) @RequestParam Long cultureProgramId) throws IOException {
-        tcFinalScoreService.getLock(cultureProgramId, courseId, paperNumber);
-        TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(cultureProgramId, courseId, paperNumber);
-        List<ExcelField> excelFieldList = new ArrayList<>();
-        excelFieldList.addAll(new ArrayList<>(Arrays.asList(new ExcelField("studentCode", "学号", true), new ExcelField("name", "姓名", true), new ExcelField("score", "成绩", true))));
+        tcFinalScoreService.getLock(cultureProgramId, courseId, paperNumber, examId);
+        TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(cultureProgramId, courseId, paperNumber, examId);
+        List<List<ExcelField>> excelFieldRowList = new ArrayList<>();
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        List<TCFinalScore> finalScoreList = tcFinalScoreService.queryFinalScore(cultureProgramId, courseId, paperNumber, examId, sysUser.getId());
+        if (CollectionUtils.isNotEmpty(finalScoreList)) {
+            finalScoreList.stream().peek(s -> {
+                        List<ExcelField> excelFieldList = new ArrayList<>();
+                        excelFieldList.addAll(new ArrayList<>(Arrays.asList(new ExcelField("studentCode", "学号", s.getStudentCode(), true), new ExcelField("name", "姓名", s.getName(), true), new ExcelField("score", "成绩", Objects.nonNull(s.getScore()) ? s.getScore().toString() : null, true))));
+                        excelFieldRowList.add(excelFieldList);
+                    }
+            ).collect(Collectors.toList());
+        } else {
+            List<ExcelField> excelFieldList = new ArrayList<>();
+            excelFieldList.addAll(new ArrayList<>(Arrays.asList(new ExcelField("studentCode", "学号", true), new ExcelField("name", "姓名", true), new ExcelField("score", "成绩", true))));
+            excelFieldRowList.add(excelFieldList);
+        }
         if (Objects.isNull(tcPaperStruct) || Objects.isNull(tcPaperStruct.getPaperStruct())) {
             List<MarkQuestion> markQuestionList = markQuestionService.listQuestionByExamIdAndPaperNumber(examId, paperNumber);
             if (CollectionUtils.isEmpty(markQuestionList)) {
@@ -107,20 +120,26 @@ public class TCFinalScoreController {
             }
             for (int i = 0; i < markQuestionList.size(); i++) {
                 MarkQuestion markQuestion = markQuestionList.get(i);
-                excelFieldList.add(new ExcelField("key" + (i + 1), markQuestion.getMainNumber() + "-" + markQuestion.getSubNumber(), true));
+                for (int y = 0; y < excelFieldRowList.size(); y++) {
+                    List<ExcelField> excelFieldList = excelFieldRowList.get(y);
+                    excelFieldList.add(new ExcelField("key" + (i + 1), markQuestion.getMainNumber() + "-" + markQuestion.getSubNumber(), true));
+                }
             }
         } else {
             List<PaperStructDto> paperStructDtoList = GsonUtil.fromJson(tcPaperStruct.getPaperStruct(), new TypeToken<List<PaperStructDto>>() {
             }.getType());
             for (int i = 0; i < paperStructDtoList.size(); i++) {
                 PaperStructDto paperStructDto = paperStructDtoList.get(i);
-                excelFieldList.add(new ExcelField("key" + (i + 1), paperStructDto.getMainNumber() + "-" + paperStructDto.getSubNumber(), true));
+                for (int y = 0; y < excelFieldRowList.size(); y++) {
+                    List<ExcelField> excelFieldList = excelFieldRowList.get(y);
+                    excelFieldList.add(new ExcelField("key" + (i + 1), paperStructDto.getMainNumber() + "-" + paperStructDto.getSubNumber(), true));
+                }
             }
         }
         printCommonService.scoreDownLoadExaminationTemplate("1、所有字段均为必填字段;\n" +
                 "2、期末成绩按总分,和小题分录入,题号按大题号-小题号方式录入,如下,1-1表示第一大题第一小题,2-1表示第二大题第一小题;\n" +
                 "3、请不要删除此行,也不要删除模板中的任何列;\n" +
-                "4、使用前请先删除样例数据。", "sheet1", "期末成绩导入模版", excelFieldList);
+                "4、使用前请先删除样例数据。", "sheet1", "期末成绩导入模版", excelFieldRowList);
     }
 
     @ApiOperation(value = "导入期末成绩")
@@ -132,8 +151,8 @@ public class TCFinalScoreController {
                                    @ApiParam(value = "课程id", required = true) @RequestParam Long courseId,
                                    @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber,
                                    @ApiParam(value = "培养方案id", required = true) @RequestParam Long cultureProgramId) {
-        tcFinalScoreService.getLock(cultureProgramId, courseId, paperNumber);
-        String lockKey = SystemConstant.REDIS_FINAL_SCORE_DATA_PREFIX + SystemConstant.IMPORT + cultureProgramId + "_" + courseId + "_" + paperNumber;
+        tcFinalScoreService.getLock(cultureProgramId, courseId, paperNumber, examId);
+        String lockKey = SystemConstant.REDIS_FINAL_SCORE_DATA_PREFIX + SystemConstant.IMPORT + cultureProgramId + "_" + courseId + "_" + paperNumber + "_" + examId;
         boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_LOCK_IMPORT_EXAM_DATA_TIME_OUT);
         if (!lock) {
             throw ExceptionResultEnum.ERROR.exception("正在导入数据,请稍候再试!");
@@ -174,8 +193,8 @@ public class TCFinalScoreController {
                                  @ApiParam(value = "课程id", required = true) @RequestParam Long courseId,
                                  @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber,
                                  @ApiParam(value = "培养方案id", required = true) @RequestParam Long cultureProgramId) {
-        tcFinalScoreService.getLock(cultureProgramId, courseId, paperNumber);
-        String lockKey = SystemConstant.REDIS_FINAL_SCORE_DATA_PREFIX + SystemConstant.SYNC + cultureProgramId + "_" + courseId + "_" + paperNumber;
+        tcFinalScoreService.getLock(cultureProgramId, courseId, paperNumber, examId);
+        String lockKey = SystemConstant.REDIS_FINAL_SCORE_DATA_PREFIX + SystemConstant.SYNC + cultureProgramId + "_" + courseId + "_" + paperNumber + "_" + examId;
         boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_LOCK_IMPORT_EXAM_DATA_TIME_OUT);
         if (!lock) {
             throw ExceptionResultEnum.ERROR.exception("正在同步数据,请稍候再试!");
@@ -204,8 +223,10 @@ public class TCFinalScoreController {
                                  @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber,
                                  @ApiParam(value = "培养方案id", required = true) @RequestParam Long cultureProgramId,
                                  @ApiParam(value = "课程id", required = true) @RequestParam 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) throws IOException {
+                                 @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) throws IOException {
         return ResultUtil.ok(tcFinalScoreService.finalScoreList(new Page<>(pageNumber, pageSize), examId, courseCode, paperNumber, cultureProgramId, courseId));
     }
 
@@ -224,14 +245,15 @@ public class TCFinalScoreController {
     @OperationLogDetail(operationType = OperationTypeEnum.UPDATE)
     @ApiResponses({@ApiResponse(code = 200, message = "保存", response = EditResult.class)})
     @Transactional
-    public Result finalScoreSave(@ApiParam(value = "期末考试成绩信息", required = true) @Valid @RequestBody TCFinalScore tcFinalScore, BindingResult bindingResult) throws IOException {
+    public Result finalScoreSave(@ApiParam(value = "期末考试成绩信息", required = true) @Valid @RequestBody TCFinalScore
+                                         tcFinalScore, BindingResult bindingResult) throws IOException {
         if (bindingResult.hasErrors()) {
             return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
         }
         TCFinalScore tcFinalScoreDb = tcFinalScoreService.getById(tcFinalScore.getId());
         Objects.requireNonNull(tcFinalScoreDb, "未找到期末成绩信息");
 
-        tcFinalScoreService.getLock(tcFinalScoreDb.getCultureProgramId(), tcFinalScoreDb.getCourseId(), tcFinalScoreDb.getPaperNumber());
+        tcFinalScoreService.getLock(tcFinalScoreDb.getCultureProgramId(), tcFinalScoreDb.getCourseId(), tcFinalScoreDb.getPaperNumber(), tcFinalScoreDb.getExamId());
 
         List<TCFinalScoreDto> tcFinalScoreDtoList = GsonUtil.fromJson(tcFinalScore.getScoreDetail(), new TypeToken<List<TCFinalScoreDto>>() {
         }.getType());
@@ -240,7 +262,7 @@ public class TCFinalScoreController {
             throw ExceptionResultEnum.ERROR.exception("分数总分不能大于试卷总分");
         }
 
-        TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(tcFinalScoreDb.getCultureProgramId(), tcFinalScoreDb.getCourseId(), tcFinalScoreDb.getPaperNumber());
+        TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(tcFinalScoreDb.getCultureProgramId(), tcFinalScoreDb.getCourseId(), tcFinalScoreDb.getPaperNumber(), tcFinalScoreDb.getExamId());
         Objects.requireNonNull(tcPaperStruct, "未找到试卷结构");
 
         List<PaperStructDimensionResult> paperStructDimensionResultList = null;
@@ -274,7 +296,7 @@ public class TCFinalScoreController {
         tcFinalScoreDb.updateInfo(tcFinalScore, sysUser.getId());
 
         if (!tcFinalScoreSource.equals(tcFinalScoreDb)) {
-            trBasicInfoService.clearReportData(tcFinalScoreDb.getCultureProgramId(), tcFinalScoreDb.getCourseId(), tcFinalScoreDb.getPaperNumber(), false);
+            trBasicInfoService.clearReportData(tcFinalScoreDb.getCultureProgramId(), tcFinalScoreDb.getCourseId(), tcFinalScoreDb.getPaperNumber(), tcFinalScoreDb.getExamId(), false);
             tcFinalScoreService.updateById(tcFinalScoreDb);
         }
         return ResultUtil.ok(true);
@@ -290,7 +312,7 @@ public class TCFinalScoreController {
         TCFinalScore tcFinalScoreDb = tcFinalScoreService.getById(id);
         Objects.requireNonNull(tcFinalScoreDb, "未找到期末成绩信息");
 
-        tcFinalScoreService.getLock(tcFinalScoreDb.getCultureProgramId(), tcFinalScoreDb.getCourseId(), tcFinalScoreDb.getPaperNumber());
+        tcFinalScoreService.getLock(tcFinalScoreDb.getCultureProgramId(), tcFinalScoreDb.getCourseId(), tcFinalScoreDb.getPaperNumber(), tcFinalScoreDb.getExamId());
 
         TCFinalScore tcFinalScoreSource = new TCFinalScore();
         BeanUtils.copyProperties(tcFinalScoreDb, tcFinalScoreSource);
@@ -298,7 +320,7 @@ public class TCFinalScoreController {
         if (!tcFinalScoreSource.equals(tcFinalScoreDb)) {
             SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
             tcFinalScoreDb.updateInfo(sysUser.getId());
-            trBasicInfoService.clearReportData(tcFinalScoreDb.getCultureProgramId(), tcFinalScoreDb.getCourseId(), tcFinalScoreDb.getPaperNumber(), false);
+            trBasicInfoService.clearReportData(tcFinalScoreDb.getCultureProgramId(), tcFinalScoreDb.getCourseId(), tcFinalScoreDb.getPaperNumber(), tcFinalScoreDb.getExamId(), false);
             tcFinalScoreService.updateById(tcFinalScoreDb);
         }
         return ResultUtil.ok(true);

+ 11 - 10
distributed-print/src/main/java/com/qmth/distributed/print/api/obe/TCPaperStructController.java

@@ -88,16 +88,17 @@ public class TCPaperStructController {
     public Result finalScorePaperStructImport(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,
                                               @ApiParam(value = "培养方案id", required = true) @RequestParam Long cultureProgramId,
                                               @ApiParam(value = "科目编码", required = true) @RequestParam Long courseId,
+                                              @ApiParam(value = "考试id") @RequestParam(required = false) Long examId,
                                               @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber) {
-        tcFinalScoreService.getLock(cultureProgramId, courseId, paperNumber);
-        String lockKey = SystemConstant.REDIS_PAPER_STRUCT_PREFIX + SystemConstant.IMPORT + cultureProgramId + "_" + courseId + "_" + paperNumber;
+        tcFinalScoreService.getLock(cultureProgramId, courseId, paperNumber, examId);
+        String lockKey = SystemConstant.REDIS_PAPER_STRUCT_PREFIX + SystemConstant.IMPORT + cultureProgramId + "_" + courseId + "_" + paperNumber + "_" + examId;
         boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_PAPER_STRUCT_TIME_OUT);
         if (!lock) {
             throw ExceptionResultEnum.ERROR.exception("正在导入数据,请稍候再试!");
         }
         Map<String, String> map = null;
         try {
-            map = tcPaperStructService.paperStructExcelImport(file, cultureProgramId, courseId, paperNumber);
+            map = tcPaperStructService.paperStructExcelImport(file, cultureProgramId, courseId, paperNumber, examId);
         } catch (Exception e) {
             log.error(SystemConstant.LOG_ERROR, e);
             if (e instanceof ApiException) {
@@ -122,8 +123,8 @@ public class TCPaperStructController {
                                                      @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber,
                                                      @ApiParam(value = "培养方案id", required = true) @RequestParam Long cultureProgramId) {
         Objects.requireNonNull(paperNumber, "未查询到题和知识点对应关系请手动关联");
-        tcFinalScoreService.getLock(cultureProgramId, courseId, paperNumber);
-        String lockKey = SystemConstant.REDIS_PAPER_STRUCT_PREFIX + SystemConstant.SYNC + cultureProgramId + "_" + courseId + "_" + paperNumber;
+        tcFinalScoreService.getLock(cultureProgramId, courseId, paperNumber, examId);
+        String lockKey = SystemConstant.REDIS_PAPER_STRUCT_PREFIX + SystemConstant.SYNC + cultureProgramId + "_" + courseId + "_" + paperNumber + "_" + examId;
         boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_PAPER_STRUCT_TIME_OUT);
         if (!lock) {
             throw ExceptionResultEnum.ERROR.exception("正在同步数据,请稍候再试!");
@@ -153,7 +154,7 @@ public class TCPaperStructController {
         if (bindingResult.hasErrors()) {
             return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
         }
-        tcFinalScoreService.getLock(paperStructParams.getCultureProgramId(), paperStructParams.getCourseId(), paperStructParams.getPaperNumber());
+        tcFinalScoreService.getLock(paperStructParams.getCultureProgramId(), paperStructParams.getCourseId(), paperStructParams.getPaperNumber(), paperStructParams.getExamId());
         ObeCourseOutline obeCourseOutline = obeCourseOutlineService.findByCultureProgramIdAndCourseId(paperStructParams.getCultureProgramId(), paperStructParams.getCourseId());
 
         ObeCourseWeightResult obeCourseWeightResult = trBasicInfoService.findCourseWeightResultRmi(obeCourseOutline.getId(), true);
@@ -177,7 +178,7 @@ public class TCPaperStructController {
             }).collect(Collectors.toList());
         }
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        TCPaperStruct tcPaperStructDb = tcPaperStructService.queryPaperStruct(paperStructParams.getCultureProgramId(), paperStructParams.getCourseId(), paperStructParams.getPaperNumber());
+        TCPaperStruct tcPaperStructDb = tcPaperStructService.queryPaperStruct(paperStructParams.getCultureProgramId(), paperStructParams.getCourseId(), paperStructParams.getPaperNumber(), paperStructParams.getExamId());
         if (Objects.isNull(tcPaperStructDb)) {
             MarkPaper markPaper = printCommonService.getMarkPaper(paperStructParams.getExamId(), paperStructParams.getPaperNumber(), paperStructParams.getCourseId());
             tcPaperStructDb = new TCPaperStruct(paperStructParams.getExamId(), paperStructParams.getCultureProgramId(), paperStructParams.getCourseId(), paperStructParams.getCourseCode(), markPaper.getCourseName(), paperStructParams.getPaperNumber(), JacksonUtil.parseJson(paperStructParams.getPaperStruct()), sysUser.getId(), obeCourseWeightResult.getDimensionSign());
@@ -187,7 +188,7 @@ public class TCPaperStructController {
             BeanUtils.copyProperties(tcPaperStructDb, tcPaperStructSource);
             tcPaperStructDb.updateInfo(JacksonUtil.parseJson(paperStructParams.getPaperStruct()), sysUser.getId());
             if (!tcPaperStructDb.equals(tcPaperStructSource)) {
-                trBasicInfoService.clearReportData(tcPaperStructDb.getCultureProgramId(), tcPaperStructDb.getCourseId(), tcPaperStructDb.getPaperNumber(), false);
+                trBasicInfoService.clearReportData(tcPaperStructDb.getCultureProgramId(), tcPaperStructDb.getCourseId(), tcPaperStructDb.getPaperNumber(), tcPaperStructDb.getExamId(), false);
                 tcPaperStructDb.setDimensionSign(obeCourseWeightResult.getDimensionSign());
                 tcPaperStructService.updateById(tcPaperStructDb);
             }
@@ -206,7 +207,7 @@ public class TCPaperStructController {
         ObeCourseOutline obeCourseOutline = obeCourseOutlineService.findByCultureProgramIdAndCourseId(cultureProgramId, courseId);
 
         List<PaperStructDimensionResult> paperStructDimensionResultList = null;
-        TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(cultureProgramId, courseId, paperNumber);
+        TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(cultureProgramId, courseId, paperNumber, examId);
         if (Objects.isNull(tcPaperStruct) || (Objects.isNull(tcPaperStruct.getPaperStruct()) && Objects.isNull(tcPaperStruct.getPaperStructDimension()))) {
             List<MarkQuestion> markQuestionList = markQuestionService.listQuestionByExamIdAndPaperNumber(examId, paperNumber);
             if (CollectionUtils.isEmpty(markQuestionList)) {
@@ -219,7 +220,7 @@ public class TCPaperStructController {
         } else {
             ObeCourseWeightResult obeCourseWeightResult = trBasicInfoService.findCourseWeightResultRmi(obeCourseOutline.getId(), true);
             if (Objects.nonNull(tcPaperStruct.getDimensionSign()) && tcPaperStruct.getDimensionSign().longValue() != obeCourseWeightResult.getDimensionSign().longValue()) {
-                trBasicInfoService.clearReportData(cultureProgramId, courseId, paperNumber, false);
+                trBasicInfoService.clearReportData(cultureProgramId, courseId, paperNumber, examId, false);
                 paperStructDimensionResultList = this.getPaperStructDimensionResult(tcPaperStruct, paperStructDimensionResultList);
             } else {
                 paperStructDimensionResultList = this.getPaperStructDimensionResult(tcPaperStruct, paperStructDimensionResultList);

+ 57 - 12
distributed-print/src/main/java/com/qmth/distributed/print/api/obe/TCUsualScoreController.java

@@ -24,6 +24,7 @@ import com.qmth.teachcloud.obe.service.TCFinalScoreService;
 import com.qmth.teachcloud.obe.service.TCUsualScoreService;
 import com.qmth.teachcloud.obe.service.TRBasicInfoService;
 import io.swagger.annotations.*;
+import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.BindingResult;
@@ -73,8 +74,10 @@ public class TCUsualScoreController {
     @ApiOperation(value = "成绩管理列表")
     @RequestMapping(value = "/score/list", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "分页查询", response = ObeScoreResult.class)})
-    public Result scoreList(@ApiParam(value = "培养方案ID") @RequestParam(required = false) Long cultureProgramId, @ApiParam(value = "学期ID") @RequestParam(required = false) Long semesterId,
-                            @ApiParam(value = "课程id") @RequestParam(required = false) Long courseId, @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+    public Result scoreList(@ApiParam(value = "培养方案ID") @RequestParam(required = false) Long cultureProgramId,
+                            @ApiParam(value = "学期ID") @RequestParam(required = false) Long semesterId,
+                            @ApiParam(value = "课程id") @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) {
         return ResultUtil.ok(
                 tcFinalScoreService.scoreList(new Page<>(pageNumber, pageSize), cultureProgramId, semesterId, courseId));
@@ -85,13 +88,51 @@ public class TCUsualScoreController {
     @OperationLogDetail(operationType = OperationTypeEnum.EXPORT)
     @ApiResponses({@ApiResponse(code = 200, message = "下载成功", response = Object.class)})
     public void usualScoreTemplateDownload(@ApiParam(value = "培养方案id", required = true) @RequestParam Long cultureProgramId,
-                                           @ApiParam(value = "课程id", required = true) @RequestParam Long courseId) throws IOException {
-        List<ExcelField> excelFieldList = new ArrayList<>();
-        excelFieldList.addAll(new ArrayList<>(Arrays.asList(new ExcelField("studentCode", "学号", true), new ExcelField("name", "姓名", true))));
-        excelFieldList = this.getUsualScoreList(cultureProgramId, courseId, excelFieldList);
+                                           @ApiParam(value = "课程id", required = true) @RequestParam Long courseId,
+                                           @ApiParam(value = "考试id") @RequestParam(required = false) Long examId,
+                                           @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber
+    ) throws IOException {
+        tcUsualScoreService.getUsualScoreImportLock(cultureProgramId, courseId, paperNumber, examId);
+        List<List<ExcelField>> excelFieldRowList = new ArrayList<>();
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        List<TCUsualScore> tcUsualScoreList = tcUsualScoreService.queryUsualScore(cultureProgramId, courseId, paperNumber, examId, sysUser.getId());
+        if (CollectionUtils.isNotEmpty(tcUsualScoreList)) {
+            tcUsualScoreList.stream().peek(s -> {
+                        List<ExcelField> excelFieldList = new ArrayList<>();
+                        excelFieldList.addAll(new ArrayList<>(Arrays.asList(new ExcelField("studentCode", "学号", s.getStudentCode(), true), new ExcelField("name", "姓名", s.getName(), true))));
+                        excelFieldRowList.add(excelFieldList);
+                    }
+            ).collect(Collectors.toList());
+        } else {
+            List<ExcelField> excelFieldList = new ArrayList<>();
+            excelFieldList.addAll(new ArrayList<>(Arrays.asList(new ExcelField("studentCode", "学号", true), new ExcelField("name", "姓名", true))));
+            excelFieldRowList.add(excelFieldList);
+        }
+
+        ObeCourseOutline obeCourseOutline = obeCourseOutlineService.findByCultureProgramIdAndCourseId(
+                cultureProgramId, courseId);
+
+        ObeCourseWeightResult obeCourseWeightResult = trBasicInfoService.findCourseWeightResultRmi(obeCourseOutline.getId(), true);
+        List<CourseWeightDto> courseWeightDtoList = obeCourseWeightResult.getSubmitForm();
+
+        courseWeightDtoList.stream().peek(e -> {
+            List<CourseWeightDetailDto> courseWeightDetailDtoList = e.getEvaluationList();
+            courseWeightDetailDtoList.stream().peek(s -> {
+                if (Objects.nonNull(s.getEnable()) && s.getEnable() && !Objects.equals(s.getEvaluationName(),
+                        SystemConstant.FINAL_SCORE_STR)) {
+                    for (int y = 0; y < excelFieldRowList.size(); y++) {
+                        List<ExcelField> excelFieldList = excelFieldRowList.get(y);
+                        excelFieldList.add(new ExcelField(s.getEvaluationName(), true));
+                    }
+                }
+            }).collect(Collectors.toList());
+        }).collect(Collectors.toList());
+        if (excelFieldRowList.get(0).size() == 2) {
+            throw ExceptionResultEnum.ERROR.exception("未设置评价方式,请在课程考核设置先设置评价方式再下载平时成绩导入模版");
+        }
         printCommonService.scoreDownLoadExaminationTemplate(
                 "1、所有字段均为必填字段;\n" + "2、平时成绩各项数据均需要填写;\n" + "3、请不要删除此行,也不要删除模板中的任何列。\n" + "4、使用前请先删除样例数据。", "sheet1",
-                "平时成绩导入模版", excelFieldList);
+                "平时成绩导入模版", excelFieldRowList);
     }
 
     @ApiOperation(value = "导入平时成绩-获取作业集合")
@@ -113,19 +154,23 @@ public class TCUsualScoreController {
     public Result usualScoreImport(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file,
                                    @ApiParam(value = "培养方案id", required = true) @RequestParam Long cultureProgramId,
                                    @ApiParam(value = "课程id", required = true) @RequestParam Long courseId,
+                                   @ApiParam(value = "考试id") @RequestParam(required = false) Long examId,
+                                   @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber,
                                    @ApiParam(value = "作业分数集合") @RequestParam(required = false) String usualScoreList) throws IOException {
-        return ResultUtil.ok(tcUsualScoreService.usualScoreExcelImport(file, cultureProgramId, courseId, usualScoreList));
+        return ResultUtil.ok(tcUsualScoreService.usualScoreExcelImport(file, cultureProgramId, courseId, examId, paperNumber, usualScoreList));
     }
 
     @ApiOperation(value = "平时成绩列表")
     @RequestMapping(value = "/usual_score/list", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "分页查询", response = TCUsualScore.class)})
-    public Result usualScoreList(@ApiParam(value = "培养方案id", required = true) @RequestParam Long cultureProgramId, @ApiParam(value = "课程id", required = true) @RequestParam Long courseId,
+    public Result usualScoreList(@ApiParam(value = "培养方案id", required = true) @RequestParam Long cultureProgramId,
+                                 @ApiParam(value = "课程id", required = true) @RequestParam Long courseId,
                                  @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber,
+                                 @ApiParam(value = "考试id") @RequestParam(required = false) Long examId,
                                  @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) {
         return ResultUtil.ok(
-                tcUsualScoreService.usualScoreList(new Page<>(pageNumber, pageSize), cultureProgramId, courseId, paperNumber));
+                tcUsualScoreService.usualScoreList(new Page<>(pageNumber, pageSize), cultureProgramId, courseId, paperNumber, examId));
     }
 
     @ApiOperation(value = "平时成绩编辑")
@@ -168,7 +213,7 @@ public class TCUsualScoreController {
         tcUsualScoreDb.updateInfo(tcUsualScore, sysUser.getId());
         if (!tcUsualScoreSource.equals(tcUsualScoreDb)) {
             trBasicInfoService.clearReportData(tcUsualScoreDb.getCultureProgramId(), tcUsualScoreDb.getCourseId(),
-                    tcUsualScoreDb.getPaperNumber(), false);
+                    tcUsualScoreDb.getPaperNumber(), tcUsualScoreDb.getExamId(), false);
             tcUsualScoreService.updateById(tcUsualScoreDb);
         }
         return ResultUtil.ok(true);
@@ -190,7 +235,7 @@ public class TCUsualScoreController {
             SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
             tcUsualScoreDb.updateInfo(sysUser.getId());
             trBasicInfoService.clearReportData(tcUsualScoreDb.getCultureProgramId(), tcUsualScoreDb.getCourseId(),
-                    tcUsualScoreDb.getPaperNumber(), false);
+                    tcUsualScoreDb.getPaperNumber(), tcUsualScoreDb.getExamId(), false);
             tcUsualScoreService.updateById(tcUsualScoreDb);
         }
         return ResultUtil.ok(true);

+ 129 - 114
distributed-print/src/main/java/com/qmth/distributed/print/api/obe/TRBasicInfoController.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.deepoove.poi.XWPFTemplate;
+import com.google.common.collect.ImmutableSet;
 import com.google.gson.reflect.TypeToken;
 import com.qmth.boot.api.annotation.Aac;
 import com.qmth.boot.api.constant.ApiConstant;
@@ -12,6 +13,7 @@ import com.qmth.boot.api.exception.ApiException;
 import com.qmth.boot.core.rateLimit.annotation.RateLimit;
 import com.qmth.distributed.print.business.service.PrintCommonService;
 import com.qmth.teachcloud.common.annotation.OperationLogDetail;
+import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicCourse;
 import com.qmth.teachcloud.common.entity.BasicSchool;
@@ -22,6 +24,7 @@ import com.qmth.teachcloud.common.enums.FieldUniqueEnum;
 import com.qmth.teachcloud.common.enums.ImportTemplateEnum;
 import com.qmth.teachcloud.common.enums.log.OperationTypeEnum;
 import com.qmth.teachcloud.common.service.BasicCourseService;
+import com.qmth.teachcloud.common.service.BasicRoleDataPermissionService;
 import com.qmth.teachcloud.common.service.CommonCacheService;
 import com.qmth.teachcloud.common.service.FileUploadService;
 import com.qmth.teachcloud.common.util.*;
@@ -116,6 +119,9 @@ public class TRBasicInfoController {
     @Resource
     RedisUtil redisUtil;
 
+    @Resource
+    BasicRoleDataPermissionService basicRoleDataPermissionService;
+
     @ApiOperation(value = "报告管理列表")
     @RequestMapping(value = "/report/list", method = RequestMethod.POST)
     @ApiResponses({@ApiResponse(code = 200, message = "分页查询", response = ObeScoreResult.class)})
@@ -134,78 +140,82 @@ public class TRBasicInfoController {
     @Transactional
     public Result reportView(@ApiParam(value = "培养方案id", required = true) @RequestParam Long cultureProgramId,
                              @ApiParam(value = "课程id", required = true) @RequestParam Long courseId,
-                             @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber) {
+                             @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber,
+                             @ApiParam(value = "考试id") @RequestParam(required = false) Long examId) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         BasicCourse basicCourse = basicCourseService.getById(courseId);
-
-        TRBasicInfo trBasicInfo = trBasicInfoService.queryBasicInfo(cultureProgramId, courseId, paperNumber);
+        DataPermissionRule dpr = basicRoleDataPermissionService.findDataPermission(sysUser.getSchoolId(), sysUser.getId(), ServletUtil.getRequest().getServletPath());
+//        dpr.setOrgIdSet(ImmutableSet.of(1L));
+        Long createId = CollectionUtils.isEmpty(dpr.getOrgIdSet()) ? sysUser.getId() : -1L;
+        List<TRBasicInfo> trBasicInfoList = trBasicInfoService.queryBasicInfo(cultureProgramId, courseId, paperNumber, examId, createId);
         ObeCourseOutline obeCourseOutline = obeCourseOutlineService.findByCultureProgramIdAndCourseId(cultureProgramId,
                 courseId);
 
         ObeCourseWeightResult obeCourseWeightResult = trBasicInfoService.findCourseWeightResultRmi(obeCourseOutline.getId(), true);
-        log.info("ObeCourseWeightResult:{}", JacksonUtil.parseJson(obeCourseWeightResult));
-        TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(cultureProgramId, courseId, paperNumber);
+        TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(cultureProgramId, courseId, paperNumber, examId);
         if (Objects.isNull(tcPaperStruct) || Objects.isNull(tcPaperStruct.getPaperStructDimension())) {
             throw ExceptionResultEnum.ERROR.exception("未找到试卷蓝图信息");
         }
-        MarkPaper markPaper = printCommonService.getMarkPaper(null, tcPaperStruct.getPaperNumber(), courseId);
-        if (Objects.isNull(trBasicInfo)) {
-            trBasicInfo = trBasicInfoService.getReportView(trBasicInfo, markPaper, sysUser.getId(),
-                    obeCourseWeightResult, cultureProgramId, courseId);
+        MarkPaper markPaper = printCommonService.getMarkPaper(examId, tcPaperStruct.getPaperNumber(), courseId);
+        if (CollectionUtils.isEmpty(trBasicInfoList)) {
+            trBasicInfoList = trBasicInfoService.getReportView(markPaper, createId, obeCourseWeightResult, cultureProgramId, courseId, examId, paperNumber);
         } else {
-            ReportCourseEvaluationResultDto reportCourseEvaluationResultDto = Objects.nonNull(trBasicInfo.getCourseEvaluationResult()) ?
-                    JSONObject.parseObject(trBasicInfo.getCourseEvaluationResult(), ReportCourseEvaluationResultDto.class) :
-                    null;
-            if (Objects.nonNull(reportCourseEvaluationResultDto)
-                    && Objects.nonNull(reportCourseEvaluationResultDto.getWeightSettingSign())
-                    && Objects.nonNull(obeCourseWeightResult)
-                    && Objects.nonNull(obeCourseWeightResult.getWeightSettingSign())
-                    && reportCourseEvaluationResultDto.getWeightSettingSign().longValue() != obeCourseWeightResult.getWeightSettingSign().longValue()) {
-                trBasicInfoService.clearReportData(cultureProgramId, courseId, paperNumber,
-                        Objects.nonNull(tcPaperStruct.getDimensionSign())
-                                && tcPaperStruct.getDimensionSign().longValue()
-                                != obeCourseWeightResult.getDimensionSign().longValue());
-                trBasicInfo = trBasicInfoService.getReportView(trBasicInfo, markPaper, sysUser.getId(),
-                        obeCourseWeightResult, cultureProgramId, courseId);
-            } else {
-                ReportCourseBasicInfoDto reportCourseBasicInfoDto = new ReportCourseBasicInfoDto(trBasicInfo);
-                ReportCourseEvaluationSpreadDto reportCourseEvaluationSpreadDto = Objects.nonNull(trBasicInfo.getCourseEvaluationSpread()) ?
-                        JSONObject.parseObject(trBasicInfo.getCourseEvaluationSpread(), ReportCourseEvaluationSpreadDto.class) :
+            for (TRBasicInfo trBasicInfo : trBasicInfoList) {
+                ReportCourseEvaluationResultDto reportCourseEvaluationResultDto = Objects.nonNull(trBasicInfo.getCourseEvaluationResult()) ?
+                        JSONObject.parseObject(trBasicInfo.getCourseEvaluationResult(), ReportCourseEvaluationResultDto.class) :
                         null;
-                ReportCourseEvaluationResultDetailDto reportCourseEvaluationResultDetailDto = null;
-                List<TRExamStudent> trExamStudentList = trExamStudentService.list(
-                        new QueryWrapper<TRExamStudent>().lambda().eq(TRExamStudent::getrBasicInfoId, trBasicInfo.getId()));
-                LinkedMultiValueMap<Long, Map<String, String>> finalScatterYMap = null;
-                if (!CollectionUtils.isEmpty(trExamStudentList)) {
-                    Map<Long, ConcurrentMap<String, String>> scatterYMap = new LinkedHashMap<>();
-                    List<ReportExamStudentDto> examStudentList = new ArrayList<>(trExamStudentList.size());
-                    for (TRExamStudent trExamStudent : trExamStudentList) {
-                        if (!Objects.equals(trExamStudent.getName(), "各课程目标平均分")
-                                && !Objects.equals(trExamStudent.getName(), "平均分")
-                                && !Objects.equals(trExamStudent.getName(), "目标分")) {
-                            List<ReportExamStudentTargetDto> reportExamStudentTargetDtoList = JSONArray.parseArray(trExamStudent.getResultDetail(), ReportExamStudentTargetDto.class);
-                            for (ReportExamStudentTargetDto reportExamStudentTargetDto : reportExamStudentTargetDtoList) {
-                                if (Objects.nonNull(reportExamStudentTargetDto) && Objects.nonNull(reportExamStudentTargetDto.getMatrixDegree())) {
-                                    trBasicInfoService.getScatterValue(scatterYMap, trExamStudent.getStudentCode(), reportExamStudentTargetDto);
+                if (Objects.nonNull(reportCourseEvaluationResultDto)
+                        && Objects.nonNull(reportCourseEvaluationResultDto.getWeightSettingSign())
+                        && Objects.nonNull(obeCourseWeightResult)
+                        && Objects.nonNull(obeCourseWeightResult.getWeightSettingSign())
+                        && reportCourseEvaluationResultDto.getWeightSettingSign().longValue() != obeCourseWeightResult.getWeightSettingSign().longValue()) {
+                    trBasicInfoService.clearReportData(cultureProgramId, courseId, paperNumber, examId,
+                            Objects.nonNull(tcPaperStruct.getDimensionSign())
+                                    && tcPaperStruct.getDimensionSign().longValue()
+                                    != obeCourseWeightResult.getDimensionSign().longValue());
+                    trBasicInfoList = trBasicInfoService.getReportView(markPaper, createId, obeCourseWeightResult, cultureProgramId, courseId, examId, paperNumber);
+                } else {
+                    ReportCourseBasicInfoDto reportCourseBasicInfoDto = new ReportCourseBasicInfoDto(trBasicInfo);
+                    ReportCourseEvaluationSpreadDto reportCourseEvaluationSpreadDto = Objects.nonNull(trBasicInfo.getCourseEvaluationSpread()) ?
+                            JSONObject.parseObject(trBasicInfo.getCourseEvaluationSpread(), ReportCourseEvaluationSpreadDto.class) :
+                            null;
+                    ReportCourseEvaluationResultDetailDto reportCourseEvaluationResultDetailDto = null;
+                    List<TRExamStudent> trExamStudentList = trExamStudentService.list(
+                            new QueryWrapper<TRExamStudent>().lambda().eq(TRExamStudent::getrBasicInfoId, trBasicInfo.getId()));
+                    LinkedMultiValueMap<Long, Map<String, String>> finalScatterYMap = null;
+                    if (!CollectionUtils.isEmpty(trExamStudentList)) {
+                        Map<Long, ConcurrentMap<String, String>> scatterYMap = new LinkedHashMap<>();
+                        List<ReportExamStudentDto> examStudentList = new ArrayList<>(trExamStudentList.size());
+                        for (TRExamStudent trExamStudent : trExamStudentList) {
+                            if (!Objects.equals(trExamStudent.getName(), "各课程目标平均分")
+                                    && !Objects.equals(trExamStudent.getName(), "平均分")
+                                    && !Objects.equals(trExamStudent.getName(), "目标分")) {
+                                List<ReportExamStudentTargetDto> reportExamStudentTargetDtoList = JSONArray.parseArray(trExamStudent.getResultDetail(), ReportExamStudentTargetDto.class);
+                                for (ReportExamStudentTargetDto reportExamStudentTargetDto : reportExamStudentTargetDtoList) {
+                                    if (Objects.nonNull(reportExamStudentTargetDto) && Objects.nonNull(reportExamStudentTargetDto.getMatrixDegree())) {
+                                        trBasicInfoService.getScatterValue(scatterYMap, trExamStudent.getStudentCode(), reportExamStudentTargetDto);
+                                    }
                                 }
                             }
+                            examStudentList.add(new ReportExamStudentDto(trExamStudent));
                         }
-                        examStudentList.add(new ReportExamStudentDto(trExamStudent));
-                    }
-                    if (scatterYMap.size() > 0) {
-                        finalScatterYMap = trBasicInfoService.getFinalScatterValue(scatterYMap);
+                        if (scatterYMap.size() > 0) {
+                            finalScatterYMap = trBasicInfoService.getFinalScatterValue(scatterYMap);
+                        }
+                        reportCourseEvaluationResultDetailDto = new ReportCourseEvaluationResultDetailDto(examStudentList);
                     }
-                    reportCourseEvaluationResultDetailDto = new ReportCourseEvaluationResultDetailDto(examStudentList);
+                    trBasicInfo.setReportResult(new ReportResult(new ReportCommonDto(null, basicCourse.getCode(), markPaper.getCourseName(), paperNumber),
+                            reportCourseBasicInfoDto, reportCourseEvaluationSpreadDto, reportCourseEvaluationResultDto,
+                            reportCourseEvaluationResultDetailDto, trBasicInfo, finalScatterYMap));
+                    trBasicInfo.updateInfo(sysUser.getId());
                 }
-                trBasicInfo.setReportResult(new ReportResult(new ReportCommonDto(null, basicCourse.getCode(), markPaper.getCourseName(), paperNumber),
-                        reportCourseBasicInfoDto, reportCourseEvaluationSpreadDto, reportCourseEvaluationResultDto,
-                        reportCourseEvaluationResultDetailDto, trBasicInfo, finalScatterYMap));
             }
         }
-        trBasicInfo.updateInfo(sysUser.getId());
         //课程目标达成评价明细结果-课程目标达成评价值图
-        trBasicInfoService.saveOrUpdate(trBasicInfo);
-        return ResultUtil.ok(trBasicInfo.getReportResult());
+        trBasicInfoService.saveOrUpdateBatch(trBasicInfoList);
+        List<ReportResult> reportResultList = new ArrayList<>(trBasicInfoList.size());
+        trBasicInfoList.stream().peek(s -> reportResultList.add(s.getReportResult())).collect(Collectors.toList());
+        return ResultUtil.ok(reportResultList);
     }
 
     @ApiOperation(value = "报告重新计算")
@@ -215,39 +225,39 @@ public class TRBasicInfoController {
     @Aac(rateLimit = @RateLimit(count = 1, period = 1000L))
     public Result reportAgainCalculate(@ApiParam(value = "培养方案id", required = true) @RequestParam Long cultureProgramId,
                                        @ApiParam(value = "课程id", required = true) @RequestParam Long courseId,
-                                       @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber) {
+                                       @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber,
+                                       @ApiParam(value = "考试id") @RequestParam(required = false) Long examId) {
         String lockKey = SystemConstant.REDIS_COURSE_DEGREE_DATA_PREFIX + cultureProgramId + "_" + courseId;
         boolean lock = redisUtil.lock(lockKey, SystemConstant.REDIS_COURSE_DEGREE_DATA_TIME_OUT);
         if (!lock) {
             throw ExceptionResultEnum.ERROR.exception("正在重新计算数据,请稍候再试!");
         }
-        TRBasicInfo trBasicInfoAgainCalculate = null;
+        List<TRBasicInfo> trBasicInfoAgainCalculateList = null;
         try {
             SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-            ObeCourseOutline obeCourseOutline = obeCourseOutlineService.findByCultureProgramIdAndCourseId(cultureProgramId,
-                    courseId);
-
+            DataPermissionRule dpr = basicRoleDataPermissionService.findDataPermission(sysUser.getSchoolId(), sysUser.getId(), ServletUtil.getRequest().getServletPath());
+//            dpr.setOrgIdSet(ImmutableSet.of(1L));
+            Long createId = CollectionUtils.isEmpty(dpr.getOrgIdSet()) ? sysUser.getId() : -1L;
+            ObeCourseOutline obeCourseOutline = obeCourseOutlineService.findByCultureProgramIdAndCourseId(cultureProgramId, courseId);
             ObeCourseWeightResult obeCourseWeightResult = trBasicInfoService.findCourseWeightResultRmi(obeCourseOutline.getId(), true);
-            log.info("ObeCourseWeightResult:{}", JacksonUtil.parseJson(obeCourseWeightResult));
-            TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(cultureProgramId, courseId, paperNumber);
+            TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(cultureProgramId, courseId, paperNumber, examId);
             if (Objects.isNull(tcPaperStruct) || Objects.isNull(tcPaperStruct.getPaperStructDimension())) {
                 throw ExceptionResultEnum.ERROR.exception("未找到试卷蓝图信息");
             }
-            MarkPaper markPaper = printCommonService.getMarkPaper(null, tcPaperStruct.getPaperNumber(), courseId);
-
-            TRBasicInfo trBasicInfo = trBasicInfoService.queryBasicInfo(cultureProgramId, courseId, paperNumber);
-            trBasicInfoService.clearReportData(cultureProgramId, courseId, paperNumber,
+            MarkPaper markPaper = printCommonService.getMarkPaper(examId, tcPaperStruct.getPaperNumber(), courseId);
+            List<TRBasicInfo> trBasicInfoList = trBasicInfoService.queryBasicInfo(cultureProgramId, courseId, Objects.nonNull(paperNumber) ? paperNumber : markPaper.getPaperNumber(), Objects.nonNull(examId) ? examId : markPaper.getExamId(), createId);
+            trBasicInfoService.clearReportData(cultureProgramId, courseId, Objects.nonNull(paperNumber) ? paperNumber : markPaper.getPaperNumber(), Objects.nonNull(examId) ? examId : markPaper.getExamId(),
                     Objects.nonNull(tcPaperStruct.getDimensionSign())
                             && tcPaperStruct.getDimensionSign().longValue()
                             != obeCourseWeightResult.getDimensionSign().longValue());
 
-            trBasicInfoAgainCalculate = trBasicInfoService.getReportView(null, markPaper, sysUser.getId(),
-                    obeCourseWeightResult, cultureProgramId, courseId);
-            if (Objects.nonNull(trBasicInfo)) {
-                trBasicInfoAgainCalculate.setCalculate(trBasicInfo);
+            trBasicInfoAgainCalculateList = trBasicInfoService.getReportView(markPaper, createId,
+                    obeCourseWeightResult, cultureProgramId, courseId, Objects.nonNull(examId) ? examId : markPaper.getExamId(), Objects.nonNull(paperNumber) ? paperNumber : markPaper.getPaperNumber());
+            if (!CollectionUtils.isEmpty(trBasicInfoList) && !CollectionUtils.isEmpty(trBasicInfoAgainCalculateList)) {
+                trBasicInfoAgainCalculateList.stream().peek(s -> s.setCalculate(trBasicInfoList.get(0))).collect(Collectors.toList());
             }
             //课程目标达成评价明细结果-课程目标达成评价值图
-            trBasicInfoService.save(trBasicInfoAgainCalculate);
+            trBasicInfoService.saveOrUpdateBatch(trBasicInfoAgainCalculateList);
         } catch (Exception e) {
             log.error(SystemConstant.LOG_ERROR, e);
             if (e instanceof ApiException) {
@@ -258,7 +268,13 @@ public class TRBasicInfoController {
         } finally {
             redisUtil.releaseLock(lockKey);
         }
-        return ResultUtil.ok(Objects.nonNull(trBasicInfoAgainCalculate) ? trBasicInfoAgainCalculate.getReportResult() : trBasicInfoAgainCalculate);
+        List<ReportResult> reportResultList = null;
+        if (!CollectionUtils.isEmpty(trBasicInfoAgainCalculateList)) {
+            reportResultList = new ArrayList<>(trBasicInfoAgainCalculateList.size());
+            List<ReportResult> finalReportResultList = reportResultList;
+            trBasicInfoAgainCalculateList.stream().peek(s -> finalReportResultList.add(s.getReportResult())).collect(Collectors.toList());
+        }
+        return ResultUtil.ok(reportResultList);
     }
 
     @ApiOperation(value = "保存报告")
@@ -270,21 +286,19 @@ public class TRBasicInfoController {
         if (bindingResult.hasErrors()) {
             return ResultUtil.error(bindingResult.getAllErrors().get(0).getDefaultMessage());
         }
-        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
-        TRBasicInfo trBasicInfoDb = null;
         try {
-            trBasicInfoDb = trBasicInfoService.queryBasicInfo(trBasicInfo.getCultureProgramId(), trBasicInfo.getCourseId(), trBasicInfo.getPaperNumber());
-            ObeCourseOutline obeCourseOutline = obeCourseOutlineService.findByCultureProgramIdAndCourseId(trBasicInfo.getCultureProgramId(), trBasicInfo.getCourseId());
+            TRBasicInfo trBasicInfoDb = trBasicInfoService.getById(trBasicInfo.getId());
+            SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+            Objects.requireNonNull(trBasicInfoDb, "没有报告信息");
+            ObeCourseOutline obeCourseOutline = obeCourseOutlineService.findByCultureProgramIdAndCourseId(trBasicInfoDb.getCultureProgramId(), trBasicInfoDb.getCourseId());
             ObeCourseWeightResult obeCourseWeightResult = trBasicInfoService.findCourseWeightResultRmi(obeCourseOutline.getId(), true);
-            TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(trBasicInfo.getCultureProgramId(), trBasicInfo.getCourseId(), trBasicInfo.getPaperNumber());
-            MarkPaper markPaper = printCommonService.getMarkPaper(trBasicInfo.getExamId(), Objects.nonNull(tcPaperStruct) ? tcPaperStruct.getPaperNumber() : trBasicInfo.getPaperNumber(), trBasicInfo.getCourseId());
-            if (Objects.isNull(trBasicInfoDb)) {
-                trBasicInfoDb = new TRBasicInfo(trBasicInfo, sysUser.getId());
-                trBasicInfoDb = trBasicInfoService.getReportView(trBasicInfoDb, markPaper, sysUser.getId(), obeCourseWeightResult, trBasicInfo.getCultureProgramId(), trBasicInfo.getCourseId());
-            } else {
+            MarkPaper markPaper = printCommonService.getMarkPaper(trBasicInfoDb.getExamId(), trBasicInfoDb.getPaperNumber(), trBasicInfoDb.getCourseId());
+            List<TRBasicInfo> trBasicInfoList = trBasicInfoService.queryBasicInfo(trBasicInfoDb.getCultureProgramId(), trBasicInfoDb.getCourseId(), trBasicInfoDb.getPaperNumber(), trBasicInfoDb.getExamId(), null);
+            for (TRBasicInfo t : trBasicInfoList) {
                 ReportCourseBasicInfoDto reportCourseBasicInfoDto = trBasicInfoService.setBasicInfo(trBasicInfo, obeCourseOutline, markPaper, obeCourseWeightResult);
-                trBasicInfoDb.updateInfo(trBasicInfo, reportCourseBasicInfoDto, sysUser.getId());
+                t.updateInfo(trBasicInfo, reportCourseBasicInfoDto, sysUser.getId());
             }
+            trBasicInfoService.saveOrUpdateBatch(trBasicInfoList);
         } catch (Exception e) {
             log.error(SystemConstant.LOG_ERROR, e);
             if (e instanceof DuplicateKeyException) {
@@ -297,7 +311,7 @@ public class TRBasicInfoController {
                 ResultUtil.error(e.getMessage());
             }
         }
-        return ResultUtil.ok(trBasicInfoService.saveOrUpdate(trBasicInfoDb));
+        return ResultUtil.ok(true);
     }
 
     @ApiOperation(value = "导出报告")
@@ -305,22 +319,20 @@ public class TRBasicInfoController {
     @OperationLogDetail(operationType = OperationTypeEnum.EXPORT)
     @ApiResponses({@ApiResponse(code = 200, message = "下载成功", response = Object.class)})
     @Aac(rateLimit = @RateLimit(count = 1, period = 1000L))
-    public void reportExport(@ApiParam(value = "培养方案id", required = true) @RequestParam Long cultureProgramId,
-                             @ApiParam(value = "课程id", required = true) @RequestParam Long courseId,
-                             @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber) {
+    public void reportExport(@ApiParam(value = "报告id", required = true) @RequestParam Long id) {
         File txtFileTemp = null, fileTemp = null;
         try {
-            Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
-            ObeCourseOutline obeCourseOutline = obeCourseOutlineService.findByCultureProgramIdAndCourseId(cultureProgramId, courseId);
-            BasicSchool basicSchool = commonCacheService.schoolCache(schoolId);
-
-            TRBasicInfo trBasicInfo = trBasicInfoService.queryBasicInfo(cultureProgramId, courseId, paperNumber);
+            TRBasicInfo trBasicInfo = trBasicInfoService.getById(id);
             Objects.requireNonNull(trBasicInfo, "没有报告信息");
             Objects.requireNonNull(trBasicInfo.getCourseEvaluationResult(), "未设置课程目标,报告生成失败,请在课程大纲管理菜单设置课程目标");
             Objects.requireNonNull(trBasicInfo.getCourseEvaluationResultDetail(), "没有课程考生信息");
 
+            Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
+            ObeCourseOutline obeCourseOutline = obeCourseOutlineService.findByCultureProgramIdAndCourseId(trBasicInfo.getCultureProgramId(), trBasicInfo.getCourseId());
+            BasicSchool basicSchool = commonCacheService.schoolCache(schoolId);
+
             ObeCourseWeightResult obeCourseWeightResult = trBasicInfoService.findCourseWeightResultRmi(obeCourseOutline.getId(), true);
-            TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(cultureProgramId, courseId, paperNumber);
+            TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(trBasicInfo.getCultureProgramId(), trBasicInfo.getCourseId(), trBasicInfo.getPaperNumber(), trBasicInfo.getExamId());
             if (Objects.nonNull(tcPaperStruct) && Objects.nonNull(tcPaperStruct.getPaperStructDimension())) {
                 List<PaperStructDimensionResult> paperStructDimensionResultList = GsonUtil.fromJson(tcPaperStruct.getPaperStructDimension(), new TypeToken<List<PaperStructDimensionResult>>() {
                 }.getType());
@@ -339,24 +351,25 @@ public class TRBasicInfoController {
 
             ReportCourseEvaluationResultDto reportCourseEvaluationResultDto = JSONObject.parseObject(trBasicInfo.getCourseEvaluationResult(), ReportCourseEvaluationResultDto.class);
             if (Objects.nonNull(reportCourseEvaluationResultDto.getWeightSettingSign()) && reportCourseEvaluationResultDto.getWeightSettingSign().longValue() != obeCourseWeightResult.getWeightSettingSign().longValue()) {
-                trBasicInfoService.clearReportData(cultureProgramId, courseId, paperNumber,
+                trBasicInfoService.clearReportData(trBasicInfo.getCultureProgramId(), trBasicInfo.getCourseId(), trBasicInfo.getPaperNumber(), trBasicInfo.getExamId(),
                         Objects.nonNull(tcPaperStruct) && Objects.nonNull(tcPaperStruct.getDimensionSign())
                                 && tcPaperStruct.getDimensionSign().longValue()
                                 != obeCourseWeightResult.getDimensionSign().longValue());
-                this.reportView(cultureProgramId, courseId, paperNumber);
-                this.reportExport(cultureProgramId, courseId, paperNumber);
+                this.reportView(trBasicInfo.getCultureProgramId(), trBasicInfo.getCourseId(), trBasicInfo.getPaperNumber(), trBasicInfo.getExamId());
+                this.reportExport(trBasicInfo.getId());
             } else {
                 XWPFTemplate template = null;
                 String fileName = null;
                 InputStream inputStream = null;
                 txtFileTemp = SystemConstant.getFileTempVar(SystemConstant.WORD_PREFIX);
                 SysConfig sysConfig = commonCacheService.addSysConfigCache(schoolId, SystemConstant.SCHOOL_COURSE_DEGREE_TEMPLATE);
+                String teachClassName = Objects.nonNull(trBasicInfo.getTeachClassName()) ? trBasicInfo.getTeachClassName() : "ALL";
                 if (Objects.isNull(sysConfig)) {
                     inputStream = FileUtil.getStream("static/" + ImportTemplateEnum.STATIC_COURSE_DEGREE_REPORT.getTemplateName());
                     FileUtils.copyInputStreamToFile(inputStream, txtFileTemp);
                     CourseReportBean courseReportBean = trBasicInfoService.buildCommonCourseDegreeReport(trBasicInfo);
                     template = XWPFTemplate.compile(txtFileTemp.getAbsolutePath()).render(courseReportBean);
-                    fileName = Objects.nonNull(basicSchool) ? basicSchool.getName() + "_" + courseReportBean.getTitle1() + "_" + ImportTemplateEnum.STATIC_COURSE_DEGREE_REPORT.getFileName() + SystemConstant.WORD_PREFIX : courseReportBean.getTitle1() + "_" + ImportTemplateEnum.STATIC_COURSE_DEGREE_REPORT.getFileName() + SystemConstant.WORD_PREFIX;
+                    fileName = Objects.nonNull(basicSchool) ? basicSchool.getName() + "_" + courseReportBean.getTitle1() + "_" + ImportTemplateEnum.STATIC_COURSE_DEGREE_REPORT.getFileName() + "_" + teachClassName + SystemConstant.WORD_PREFIX : courseReportBean.getTitle1() + "_" + ImportTemplateEnum.STATIC_COURSE_DEGREE_REPORT.getFileName() + "_" + teachClassName + SystemConstant.WORD_PREFIX;
                 } else {
                     fileTemp = SystemConstant.getFileTempVar(SystemConstant.WORD_PREFIX);
                     fileTemp = fileUploadService.downloadFile(Long.parseLong(sysConfig.getConfigValue()), fileTemp.getPath());
@@ -371,11 +384,11 @@ public class TRBasicInfoController {
                             if (Objects.nonNull(text) && text.contains("xagyuCourseBasicBean")) {
                                 XagyuCourseReportBean xagyuCourseReportBean = trBasicInfoService.buildXagyuCourseDegreeReport(trBasicInfo);
                                 template = XWPFTemplate.compile(txtFileTemp.getAbsolutePath()).render(xagyuCourseReportBean);
-                                fileName = Objects.nonNull(basicSchool) ? basicSchool.getName() + "_" + xagyuCourseReportBean.getXagyuTitle1() + "_" + ImportTemplateEnum.STATIC_COURSE_DEGREE_REPORT.getFileName() + "_定制" + SystemConstant.WORD_PREFIX : xagyuCourseReportBean.getXagyuTitle1() + "_" + ImportTemplateEnum.STATIC_COURSE_DEGREE_REPORT.getFileName() + "_定制" + SystemConstant.WORD_PREFIX;
+                                fileName = Objects.nonNull(basicSchool) ? basicSchool.getName() + "_" + xagyuCourseReportBean.getXagyuTitle1() + "_" + ImportTemplateEnum.STATIC_COURSE_DEGREE_REPORT.getFileName() + "_" + teachClassName + "_定制" + SystemConstant.WORD_PREFIX : xagyuCourseReportBean.getXagyuTitle1() + "_" + ImportTemplateEnum.STATIC_COURSE_DEGREE_REPORT.getFileName() + "_" + teachClassName + "_定制" + SystemConstant.WORD_PREFIX;
                             } else {
                                 CourseReportBean courseReportBean = trBasicInfoService.buildCommonCourseDegreeReport(trBasicInfo);
                                 template = XWPFTemplate.compile(txtFileTemp.getAbsolutePath()).render(courseReportBean);
-                                fileName = Objects.nonNull(basicSchool) ? basicSchool.getName() + "_" + courseReportBean.getTitle1() + "_" + ImportTemplateEnum.STATIC_COURSE_DEGREE_REPORT.getFileName() + SystemConstant.WORD_PREFIX : courseReportBean.getTitle1() + "_" + ImportTemplateEnum.STATIC_COURSE_DEGREE_REPORT.getFileName() + SystemConstant.WORD_PREFIX;
+                                fileName = Objects.nonNull(basicSchool) ? basicSchool.getName() + "_" + courseReportBean.getTitle1() + "_" + ImportTemplateEnum.STATIC_COURSE_DEGREE_REPORT.getFileName() + "_" + teachClassName + SystemConstant.WORD_PREFIX : courseReportBean.getTitle1() + "_" + ImportTemplateEnum.STATIC_COURSE_DEGREE_REPORT.getFileName() + "_" + teachClassName + SystemConstant.WORD_PREFIX;
                             }
                         }
                     } finally {
@@ -408,16 +421,15 @@ public class TRBasicInfoController {
     public Result reportDataChange(@ApiParam(value = "培养方案id", required = true) @RequestParam Long cultureProgramId,
                                    @ApiParam(value = "课程id", required = true) @RequestParam Long courseId,
                                    @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber,
+                                   @ApiParam(value = "考试id") @RequestParam(required = false) Long examId,
                                    @ApiParam(value = "true:报告,false:成绩管理", required = true) @RequestParam boolean report) {
         ObeCourseOutline obeCourseOutline = obeCourseOutlineService.findByCultureProgramIdAndCourseId(cultureProgramId, courseId);
         ReportChangeResult reportChangeResult = new ReportChangeResult();
-        List<TCUsualScore> tcUsualScoreList = tcUsualScoreService.queryUsualScore(cultureProgramId, courseId, paperNumber);
+        List<TCUsualScore> tcUsualScoreList = tcUsualScoreService.queryUsualScore(cultureProgramId, courseId, paperNumber, examId, null);
         if (CollectionUtils.isNotEmpty(tcUsualScoreList)) {
             Set<String> usualScoreCourseSet = new LinkedHashSet<>();
             TCUsualScore tcUsualScore = tcUsualScoreList.get(0);
             List<TCUsualScoreDto> tcUsualScoreDtoList = JSONArray.parseArray(tcUsualScore.getScore(), TCUsualScoreDto.class);
-            List<String> usualScoreList = tcUsualScoreDtoList.stream().map(s -> s.getName()).collect(Collectors.toList());
-
             List<CourseWeightDto> courseWeightDtoList = trBasicInfoService.findCourseWeightDtoRmi(obeCourseOutline.getId());
             List<String> courseTargetList = new ArrayList<>(courseWeightDtoList.size());
             if (CollectionUtils.isNotEmpty(courseWeightDtoList)) {
@@ -432,16 +444,20 @@ public class TRBasicInfoController {
                 }).collect(Collectors.toList());
             }
 
-            if (CollectionUtils.isNotEmpty(usualScoreList) && CollectionUtils.isNotEmpty(usualScoreCourseSet)) {
-                List<String> usualScoreCourseList = new ArrayList<>(usualScoreCourseSet);
-                Collections.sort(usualScoreList);
-                Collections.sort(usualScoreCourseList);
-                if (!CollectionUtils.isEqualCollection(usualScoreList, usualScoreCourseList)) {
-                    reportChangeResult.setEvaluationChange(true);
+            if (CollectionUtils.isNotEmpty(tcUsualScoreDtoList)) {
+                List<String> usualScoreList = tcUsualScoreDtoList.stream().map(s -> s.getName()).collect(Collectors.toList());
+                if (CollectionUtils.isNotEmpty(usualScoreList) && CollectionUtils.isNotEmpty(usualScoreCourseSet)) {
+                    List<String> usualScoreCourseList = new ArrayList<>(usualScoreCourseSet);
+                    Collections.sort(usualScoreList);
+                    Collections.sort(usualScoreCourseList);
+                    if (!CollectionUtils.isEqualCollection(usualScoreList, usualScoreCourseList)) {
+                        reportChangeResult.setEvaluationChange(true);
+                    }
                 }
             }
 
-            TRBasicInfo trBasicInfo = trBasicInfoService.queryBasicInfo(cultureProgramId, courseId, paperNumber);
+            List<TRBasicInfo> trBasicInfoList = trBasicInfoService.queryBasicInfo(cultureProgramId, courseId, paperNumber, examId, null);
+            TRBasicInfo trBasicInfo = CollectionUtils.isNotEmpty(trBasicInfoList) ? trBasicInfoList.get(0) : null;
             if (Objects.nonNull(trBasicInfo) && Objects.nonNull(trBasicInfo.getCourseEvaluationResultDetail())) {
                 JSONObject jsonObject = JSONObject.parseObject(trBasicInfo.getCourseEvaluationResultDetail());
                 List<CourseTargetWordDto> courseTargetWordDtoList = JSONArray.parseArray(jsonObject.get("targetWordMap").toString(), CourseTargetWordDto.class);
@@ -457,7 +473,7 @@ public class TRBasicInfoController {
             }
 
             if (!report) {
-                TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(cultureProgramId, courseId, paperNumber);
+                TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(cultureProgramId, courseId, paperNumber, examId);
                 if (Objects.nonNull(tcPaperStruct) && Objects.nonNull(tcPaperStruct.getPaperStructDimension())) {
 //                    List<PaperStructDimensionResult> paperStructDimensionResultList = GsonUtil.fromJson(tcPaperStruct.getPaperStructDimension(), new TypeToken<List<PaperStructDimensionResult>>() {
 //                    }.getType());
@@ -469,7 +485,7 @@ public class TRBasicInfoController {
                         }
                     }
                     if (reportChangeResult.isTargetScoreChange()) {
-                        trBasicInfoService.clearReportData(cultureProgramId, courseId, paperNumber, false);
+                        trBasicInfoService.clearReportData(cultureProgramId, courseId, paperNumber, examId, false);
                         reportChangeResult.setTargetScoreChangeStr(stringJoiner.toString());
                     }
                 }
@@ -483,10 +499,8 @@ public class TRBasicInfoController {
     @OperationLogDetail(operationType = OperationTypeEnum.EXPORT)
     @ApiResponses({@ApiResponse(code = 200, message = "下载成功", response = Object.class)})
     @Aac(rateLimit = @RateLimit(count = 1, period = 1000L))
-    public void reportUsualscoreExport(@ApiParam(value = "培养方案id", required = true) @RequestParam Long cultureProgramId,
-                                       @ApiParam(value = "课程id", required = true) @RequestParam Long courseId,
-                                       @ApiParam(value = "试卷编号") @RequestParam(required = false) String paperNumber) {
-        TRBasicInfo trBasicInfo = trBasicInfoService.queryBasicInfo(cultureProgramId, courseId, paperNumber);
+    public void reportUsualscoreExport(@ApiParam(value = "报告id", required = true) @RequestParam Long id) {
+        TRBasicInfo trBasicInfo = trBasicInfoService.getById(id);
         Objects.requireNonNull(trBasicInfo, "没有报告信息");
         Objects.requireNonNull(trBasicInfo.getCourseEvaluationResult(), "没有课程目标信息");
         Objects.requireNonNull(trBasicInfo.getCourseEvaluationResultDetail(), "没有课程考生信息");
@@ -558,7 +572,8 @@ public class TRBasicInfoController {
 
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
         BasicSchool basicSchool = commonCacheService.schoolCache(schoolId);
-        String fileName = Objects.nonNull(basicSchool) ? basicSchool.getName() + "_" + trBasicInfo.getOpenTime() + "《" + trBasicInfo.getCourseName() + "》_平时成绩" : trBasicInfo.getOpenTime() + "《" + trBasicInfo.getCourseName() + "》_平时成绩";
+        String teachClassName = Objects.nonNull(trBasicInfo.getTeachClassName()) ? trBasicInfo.getTeachClassName() : "ALL";
+        String fileName = Objects.nonNull(basicSchool) ? basicSchool.getName() + "_" + trBasicInfo.getOpenTime() + "《" + trBasicInfo.getCourseName() + "》_" + teachClassName + "_平时成绩" : trBasicInfo.getOpenTime() + "《" + trBasicInfo.getCourseName() + "》_" + teachClassName + "_平时成绩";
 
         //姓名
         this.drawExcelFixedHead(rowOne, headerStyle, sheet, "姓名", 0, 2, 3, 0, 0, sheet.getColumnWidth(0) * 17 / 10);

+ 1 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

@@ -545,6 +545,7 @@ public class SystemConstant {
     public static final String REDIS_LOCK_CALCULATE_PREFIX = "redis:lock:calculate:";//计算锁
     public static final long REDIS_LOCK_CALCULATE_TIME_OUT = 60L * 60;
     public static final long REDIS_LOCK_PAPER_NUMBER_TIME_OUT = 60L * 2;
+    public static final String REDIS_USUAL_SCORE_DATA_PREFIX = "redis:lock:usual:score:data:";//平时成绩数据锁
     public static final String REDIS_FINAL_SCORE_DATA_PREFIX = "redis:lock:final:score:data:";//期末考试数据锁
     public static final String REDIS_PAPER_STRUCT_PREFIX = "redis:lock:final:score:paper:struct:";//期末考试试卷结构锁
     public static final String REDIS_OBE_RADAR_DATA_PREFIX = "redis:lock:obe:radar:data:";//obe雷达报表锁

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

@@ -1,11 +1,18 @@
 package com.qmth.teachcloud.mark.bean.archivescore;
 
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.teachcloud.mark.dto.mark.ScoreItem;
+import io.swagger.annotations.ApiModelProperty;
 
 import java.util.List;
 
 public class MarkStudentScoreVo {
+
+    @JsonSerialize(using = ToStringSerializer.class)
     private Long examId;
+
+    @JsonSerialize(using = ToStringSerializer.class)
     private Long courseId;
     private String courseCode;
     private String courseName;
@@ -19,6 +26,29 @@ public class MarkStudentScoreVo {
     private Double totalScore;
     private List<ScoreItem> totalScoreList;
 
+    @ApiModelProperty(value = "任课老师ID")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long teacherId;
+
+    @ApiModelProperty(value = "教学班")
+    private String teachClassName;
+
+    public Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getTeachClassName() {
+        return teachClassName;
+    }
+
+    public void setTeachClassName(String teachClassName) {
+        this.teachClassName = teachClassName;
+    }
+
     public Long getExamId() {
         return examId;
     }

+ 131 - 127
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/mark/MarkStudentVo.java

@@ -1,127 +1,131 @@
-package com.qmth.teachcloud.mark.dto.mark;
-
-import com.qmth.teachcloud.mark.entity.MarkStudent;
-import io.swagger.annotations.ApiModelProperty;
-
-import java.io.Serializable;
-
-/**
- * <p>
- * 考试考生库
- * </p>
- *
- * @author xf
- * @since 2023-09-22
- */
-public class MarkStudentVo extends MarkStudent implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    @ApiModelProperty(value = "科目代码")
-    private String courseCode;
-
-    @ApiModelProperty(value = "科目名称")
-    private String courseName;
-
-    @ApiModelProperty(value = "学号")
-    private String studentCode;
-    @ApiModelProperty(value = "姓名")
-    private String studentName;
-
-    @ApiModelProperty(value = "学院")
-    private String collegeName;
-
-    @ApiModelProperty(value = "专业")
-    private String majorName;
-    @ApiModelProperty(value = "教学班")
-    private String teachClassName;
-    @ApiModelProperty(value = "行政班")
-    private String className;
-
-    @ApiModelProperty(value = "任课老师")
-    private String teacher;
-
-    @ApiModelProperty(value = "任课老师ID")
-    private Long teacherId;
-    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;
-    }
-
-    @Override
-    public String getStudentCode() {
-        return studentCode;
-    }
-
-    @Override
-    public void setStudentCode(String studentCode) {
-        this.studentCode = studentCode;
-    }
-
-    public String getStudentName() {
-        return studentName;
-    }
-
-    public void setStudentName(String studentName) {
-        this.studentName = studentName;
-    }
-
-    public String getCollegeName() {
-        return collegeName;
-    }
-
-    public void setCollegeName(String collegeName) {
-        this.collegeName = collegeName;
-    }
-
-    public String getMajorName() {
-        return majorName;
-    }
-
-    public void setMajorName(String majorName) {
-        this.majorName = majorName;
-    }
-
-    public String getTeachClassName() {
-        return teachClassName;
-    }
-
-    public void setTeachClassName(String teachClassName) {
-        this.teachClassName = teachClassName;
-    }
-
-    public String getClassName() {
-        return className;
-    }
-
-    public void setClassName(String className) {
-        this.className = className;
-    }
-
-    public String getTeacher() {
-        return teacher;
-    }
-
-    public void setTeacher(String teacher) {
-        this.teacher = teacher;
-    }
-
-    public Long getTeacherId() {
-        return teacherId;
-    }
-
-    public void setTeacherId(Long teacherId) {
-        this.teacherId = teacherId;
-    }
-}
+package com.qmth.teachcloud.mark.dto.mark;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.mark.entity.MarkStudent;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 考试考生库
+ * </p>
+ *
+ * @author xf
+ * @since 2023-09-22
+ */
+public class MarkStudentVo extends MarkStudent implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "科目代码")
+    private String courseCode;
+
+    @ApiModelProperty(value = "科目名称")
+    private String courseName;
+
+    @ApiModelProperty(value = "学号")
+    private String studentCode;
+    @ApiModelProperty(value = "姓名")
+    private String studentName;
+
+    @ApiModelProperty(value = "学院")
+    private String collegeName;
+
+    @ApiModelProperty(value = "专业")
+    private String majorName;
+    @ApiModelProperty(value = "教学班")
+    private String teachClassName;
+    @ApiModelProperty(value = "行政班")
+    private String className;
+
+    @ApiModelProperty(value = "任课老师")
+    private String teacher;
+
+    @ApiModelProperty(value = "任课老师ID")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long teacherId;
+
+    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;
+    }
+
+    @Override
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    @Override
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public String getCollegeName() {
+        return collegeName;
+    }
+
+    public void setCollegeName(String collegeName) {
+        this.collegeName = collegeName;
+    }
+
+    public String getMajorName() {
+        return majorName;
+    }
+
+    public void setMajorName(String majorName) {
+        this.majorName = majorName;
+    }
+
+    public String getTeachClassName() {
+        return teachClassName;
+    }
+
+    public void setTeachClassName(String teachClassName) {
+        this.teachClassName = teachClassName;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public String getTeacher() {
+        return teacher;
+    }
+
+    public void setTeacher(String teacher) {
+        this.teacher = teacher;
+    }
+
+    public Long getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Long teacherId) {
+        this.teacherId = teacherId;
+    }
+}

+ 2 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java

@@ -1870,6 +1870,8 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
         List<MarkStudentScoreVo> markStudentScoreVoList = new ArrayList<>();
         for (MarkStudentVo markStudent : markStudentList) {
             MarkStudentScoreVo markStudentScoreVo = new MarkStudentScoreVo();
+            markStudentScoreVo.setTeacherId(markStudent.getTeacherId());
+            markStudentScoreVo.setTeachClassName(markStudent.getTeachClassName());
             markStudentScoreVo.setExamId(markStudent.getExamId());
             markStudentScoreVo.setCourseId(markStudent.getCourseId());
             markStudentScoreVo.setPaperNumber(markStudent.getPaperNumber());

+ 23 - 0
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/been/result/ObeScoreResult.java

@@ -54,6 +54,29 @@ public class ObeScoreResult implements Serializable {
     @ApiModelProperty(value = "学期名称")
     private String semesterName;
 
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "考试id")
+    private Long examId;
+
+    @ApiModelProperty(value = "试卷编号")
+    private String paperNumber;
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
     public Long getObeCourseOutlineId() {
         return obeCourseOutlineId;
     }

+ 32 - 8
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/been/result/report/ReportResult.java

@@ -1,6 +1,7 @@
 package com.qmth.teachcloud.obe.been.result.report;
 
-import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.qmth.teachcloud.obe.been.report.*;
 import com.qmth.teachcloud.obe.entity.TRBasicInfo;
 import io.swagger.annotations.ApiModelProperty;
@@ -18,32 +19,32 @@ import java.util.Map;
  */
 public class ReportResult implements Serializable {
 
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "主键")
+    private Long id;
+
+    @ApiModelProperty(value = "教学班")
+    private String teachClassName;
+
     @ApiModelProperty(value = "公共信息")
-    @TableField(exist = false)
     private ReportCommonDto commonInfo;
 
     @ApiModelProperty(value = "课程基本情况")
-    @TableField(exist = false)
     private ReportCourseBasicInfoDto courseBasicInfo;
 
     @ApiModelProperty(value = "课程目标考核分布")
-    @TableField(exist = false)
     private ReportCourseEvaluationSpreadDto courseEvaluationSpreadInfo;
 
     @ApiModelProperty(value = "课程考核成绩评价结果")
-    @TableField(exist = false)
     private ReportCourseEvaluationResultDto courseEvaluationResultInfo;
 
     @ApiModelProperty(value = "课程目标达成评价明细结果")
-    @TableField(exist = false)
     private ReportCourseEvaluationResultDetailDto courseEvaluationResultDetailInfo;
 
     @ApiModelProperty(value = "课程持续改进")
-    @TableField(exist = false)
     private String courseSuggest;
 
     @ApiModelProperty(value = "课程目标达成度散点图")
-    @TableField(exist = false)
     private LinkedMultiValueMap<Long, Map<String, String>> courseTargetScatterMap;
 
     public ReportResult() {
@@ -62,6 +63,29 @@ public class ReportResult implements Serializable {
         this.courseEvaluationResultDetailInfo = courseEvaluationResultDetailInfo;
         this.courseSuggest = trBasicInfo.getCourseSuggest();
         this.courseTargetScatterMap = courseTargetScatterMap;
+        this.teachClassName = trBasicInfo.getTeachClassName();
+        this.id = trBasicInfo.getId();
+    }
+
+    public void updateInfo(String teachClassName, Long id) {
+        this.teachClassName = teachClassName;
+        this.id = id;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getTeachClassName() {
+        return teachClassName;
+    }
+
+    public void setTeachClassName(String teachClassName) {
+        this.teachClassName = teachClassName;
     }
 
     public LinkedMultiValueMap<Long, Map<String, String>> getCourseTargetScatterMap() {

+ 23 - 4
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/entity/TCFinalScore.java

@@ -67,11 +67,14 @@ public class TCFinalScore extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "来源,EXCEL_IMPORT:excel导入,SYNC:数据同步")
     private SourceEnum source;
 
+    @ApiModelProperty(value = "教学班")
+    private String teachClassName;
+
     public TCFinalScore() {
 
     }
 
-    public TCFinalScore(Long cultureProgramId, Long courseId, String courseCode, String courseName, String paperNumber, SourceEnum source, Long userId) {
+    public TCFinalScore(Long cultureProgramId, Long courseId, String courseCode, String courseName, String paperNumber, SourceEnum source, Long userId, Long examId) {
         insertInfo(userId);
         this.cultureProgramId = cultureProgramId;
         this.courseId = courseId;
@@ -80,10 +83,11 @@ public class TCFinalScore extends BaseEntity implements Serializable {
         this.paperNumber = paperNumber;
         this.source = source;
         this.enable = true;
+        this.examId = examId;
     }
 
     public TCFinalScore(MarkStudentScoreVo markStudentScoreVo, String scoreDetail, SourceEnum source, Long userId, Long cultureProgramId, Long courseId) {
-        insertInfo(userId);
+        insertInfo(Objects.nonNull(markStudentScoreVo.getTeacherId()) ? markStudentScoreVo.getTeacherId() : userId);
         this.examId = markStudentScoreVo.getExamId();
         this.courseCode = markStudentScoreVo.getCourseCode();
         this.courseName = markStudentScoreVo.getCourseName();
@@ -96,6 +100,7 @@ public class TCFinalScore extends BaseEntity implements Serializable {
         this.enable = true;
         this.cultureProgramId = cultureProgramId;
         this.courseId = courseId;
+        this.teachClassName = markStudentScoreVo.getTeachClassName();
     }
 
     public void updateInfo(TCFinalScore tcFinalScore, Long userId) {
@@ -105,6 +110,20 @@ public class TCFinalScore extends BaseEntity implements Serializable {
         updateInfo(userId);
     }
 
+    public void updateExamAndPaperNumberInfo(TCFinalScore tcFinalScore) {
+        this.examId = tcFinalScore.getExamId();
+        this.paperNumber = tcFinalScore.getPaperNumber();
+        this.teachClassName = tcFinalScore.getTeachClassName();
+    }
+
+    public String getTeachClassName() {
+        return teachClassName;
+    }
+
+    public void setTeachClassName(String teachClassName) {
+        this.teachClassName = teachClassName;
+    }
+
     public Long getCultureProgramId() {
         return cultureProgramId;
     }
@@ -210,11 +229,11 @@ public class TCFinalScore extends BaseEntity implements Serializable {
             return false;
         }
         TCFinalScore that = (TCFinalScore) o;
-        return cultureProgramId.equals(that.cultureProgramId) && Objects.equals(courseCode, that.courseCode) && Objects.equals(courseName, that.courseName) && Objects.equals(paperNumber, that.paperNumber) && courseId.equals(that.courseId) && name.equals(that.name) && studentCode.equals(that.studentCode) && score.equals(that.score) && scoreDetail.equals(that.scoreDetail) && enable.equals(that.enable) && Objects.equals(getCreateId(), that.getCreateId());
+        return Objects.equals(source, that.source) && Objects.equals(teachClassName, that.teachClassName) && Objects.equals(examId, that.examId) && Objects.equals(getCreateId(), that.getCreateId()) && cultureProgramId.equals(that.cultureProgramId) && Objects.equals(courseCode, that.courseCode) && Objects.equals(courseName, that.courseName) && Objects.equals(paperNumber, that.paperNumber) && courseId.equals(that.courseId) && name.equals(that.name) && studentCode.equals(that.studentCode) && Objects.equals(score, that.score) && Objects.equals(scoreDetail, that.scoreDetail) && enable.equals(that.enable) && Objects.equals(getCreateId(), that.getCreateId());
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(cultureProgramId, courseCode, courseName, paperNumber, courseId, name, studentCode, score, scoreDetail, enable, getCreateId());
+        return Objects.hash(source, teachClassName, examId, getCreateId(), cultureProgramId, courseCode, courseName, paperNumber, courseId, name, studentCode, score, scoreDetail, enable, getCreateId());
     }
 }

+ 51 - 4
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/entity/TCUsualScore.java

@@ -2,7 +2,9 @@ package com.qmth.teachcloud.obe.entity;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.distributed.print.business.enums.SourceEnum;
 import com.qmth.teachcloud.common.base.BaseEntity;
+import com.qmth.teachcloud.mark.bean.archivescore.MarkStudentScoreVo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -58,18 +60,41 @@ public class TCUsualScore extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "是否启用,0:停用,1:启用")
     private Boolean enable;
 
+    @ApiModelProperty(value = "来源,EXCEL_IMPORT:excel导入,SYNC:数据同步")
+    private SourceEnum source;
+
+    @ApiModelProperty(value = "教学班")
+    private String teachClassName;
+
     public TCUsualScore() {
 
     }
 
-    public TCUsualScore(Long cultureProgramId, Long courseId, String courseCode, String courseName, String paperNumber, Long userId) {
+    public TCUsualScore(Long cultureProgramId, Long courseId, String courseCode, String courseName, String paperNumber, SourceEnum source, Long userId, Long examId) {
         insertInfo(userId);
         this.cultureProgramId = cultureProgramId;
         this.courseId = courseId;
         this.courseCode = courseCode;
         this.courseName = courseName;
         this.paperNumber = paperNumber;
+        this.source = source;
         this.enable = true;
+        this.examId = examId;
+    }
+
+    public TCUsualScore(MarkStudentScoreVo markStudentScoreVo, SourceEnum source, Long userId, Long cultureProgramId, Long courseId) {
+        insertInfo(Objects.nonNull(markStudentScoreVo.getTeacherId()) ? markStudentScoreVo.getTeacherId() : userId);
+        this.examId = markStudentScoreVo.getExamId();
+        this.courseCode = markStudentScoreVo.getCourseCode();
+        this.courseName = markStudentScoreVo.getCourseName();
+        this.paperNumber = markStudentScoreVo.getPaperNumber();
+        this.name = markStudentScoreVo.getStudentName();
+        this.studentCode = markStudentScoreVo.getStudentCode();
+        this.source = source;
+        this.enable = true;
+        this.cultureProgramId = cultureProgramId;
+        this.courseId = courseId;
+        this.teachClassName = markStudentScoreVo.getTeachClassName();
     }
 
     public void updateInfo(TCUsualScore tcUsualScore, Long userId) {
@@ -78,6 +103,20 @@ public class TCUsualScore extends BaseEntity implements Serializable {
         this.score = tcUsualScore.getScore();
     }
 
+    public void updateExamAndPaperNumberInfo(TCUsualScore tcUsualScore) {
+        this.examId = tcUsualScore.getExamId();
+        this.paperNumber = tcUsualScore.getPaperNumber();
+        this.teachClassName = tcUsualScore.getTeachClassName();
+    }
+
+    public SourceEnum getSource() {
+        return source;
+    }
+
+    public void setSource(SourceEnum source) {
+        this.source = source;
+    }
+
     public Long getCultureProgramId() {
         return cultureProgramId;
     }
@@ -158,6 +197,14 @@ public class TCUsualScore extends BaseEntity implements Serializable {
         this.enable = enable;
     }
 
+    public String getTeachClassName() {
+        return teachClassName;
+    }
+
+    public void setTeachClassName(String teachClassName) {
+        this.teachClassName = teachClassName;
+    }
+
     @Override
     public boolean equals(Object o) {
         if (this == o) {
@@ -167,14 +214,14 @@ public class TCUsualScore extends BaseEntity implements Serializable {
             return false;
         }
         TCUsualScore that = (TCUsualScore) o;
-        return cultureProgramId.equals(that.cultureProgramId) && Objects.equals(courseCode, that.courseCode) && Objects.equals(
-                courseName, that.courseName) && courseId.equals(that.courseId) && name.equals(that.name) && studentCode.equals(that.studentCode) && score.equals(that.score) && enable.equals(that.enable)
+        return Objects.equals(source, that.source) && Objects.equals(teachClassName, that.teachClassName) && Objects.equals(examId, that.examId) && Objects.equals(getCreateId(), that.getCreateId()) && cultureProgramId.equals(that.cultureProgramId) && Objects.equals(courseCode, that.courseCode) && Objects.equals(
+                courseName, that.courseName) && courseId.equals(that.courseId) && name.equals(that.name) && studentCode.equals(that.studentCode) && Objects.equals(score, that.score) && enable.equals(that.enable)
                 && Objects.equals(getCreateId(), that.getCreateId());
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(cultureProgramId, courseCode, courseName, courseId, name, studentCode, score, enable,
+        return Objects.hash(source, teachClassName, examId, getCreateId(), cultureProgramId, courseCode, courseName, courseId, name, studentCode, score, enable,
                 getCreateId());
     }
 }

+ 12 - 0
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/entity/TRBasicInfo.java

@@ -110,6 +110,9 @@ public class TRBasicInfo extends BaseEntity implements Serializable {
     @TableField(exist = false)
     private ReportResult reportResult;
 
+    @ApiModelProperty(value = "教学班")
+    private String teachClassName;
+
     public TRBasicInfo() {
 
     }
@@ -210,6 +213,7 @@ public class TRBasicInfo extends BaseEntity implements Serializable {
         this.courseEnName = trBasicInfo.getCourseEnName();
         this.college = trBasicInfo.getCollege();
         this.courseSuggest = trBasicInfo.getCourseSuggest();
+        this.teachClassName = trBasicInfo.getTeachClassName();
     }
 
     public void setCalculate(TRBasicInfo trBasicInfo) {
@@ -245,6 +249,14 @@ public class TRBasicInfo extends BaseEntity implements Serializable {
         this.courseSuggest = courseSuggest;
     }
 
+    public String getTeachClassName() {
+        return teachClassName;
+    }
+
+    public void setTeachClassName(String teachClassName) {
+        this.teachClassName = teachClassName;
+    }
+
     public Long getCultureProgramId() {
         return cultureProgramId;
     }

+ 19 - 4
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/mapper/TCFinalScoreMapper.java

@@ -26,18 +26,25 @@ public interface TCFinalScoreMapper extends BaseMapper<TCFinalScore> {
      * @param iPage
      * @param cultureProgramId
      * @param courseId
+     * @param examId
+     * @param paperNumber
+     * @param userId
      * @return
      */
-    public IPage<TCFinalScore> finalScoreList(IPage<Map> iPage, @Param("cultureProgramId") Long cultureProgramId, @Param("courseId") Long courseId);
+    public IPage<TCFinalScore> finalScoreList(IPage<Map> iPage, @Param("cultureProgramId") Long cultureProgramId, @Param("courseId") Long courseId, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("userId") Long userId);
 
     /**
      * 查找期末成绩分数图
      *
      * @param cultureProgramId
      * @param courseId
+     * @param examId
+     * @param paperNumber
+     * @param userId
+     * @param teachClassName
      * @return
      */
-    public FinalScoreDto finalScoreScoreOverView(@Param("cultureProgramId") Long cultureProgramId, @Param("courseId") Long courseId);
+    public FinalScoreDto finalScoreScoreOverView(@Param("cultureProgramId") Long cultureProgramId, @Param("courseId") Long courseId, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("userId") Long userId, @Param("teachClassName") String teachClassName);
 
     /**
      * 查找期末成绩分数区间
@@ -46,16 +53,24 @@ public interface TCFinalScoreMapper extends BaseMapper<TCFinalScore> {
      * @param courseId
      * @param start
      * @param end
+     * @param examId
+     * @param paperNumber
+     * @param userId
+     * @param teachClassName
      * @return
      */
-    public int getCountByScoreRange(@Param("cultureProgramId") Long cultureProgramId, @Param("courseId") Long courseId, @Param("start") Double start, @Param("end") Double end);
+    public int getCountByScoreRange(@Param("cultureProgramId") Long cultureProgramId, @Param("courseId") Long courseId, @Param("start") Double start, @Param("end") Double end, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("userId") Long userId, @Param("teachClassName") String teachClassName);
 
     /**
      * 查找考生成绩
      *
      * @param cultureProgramId
      * @param courseId
+     * @param examId
+     * @param paperNumber
+     * @param userId
+     * @param teachClassName
      * @return
      */
-    public List<FinalScoreResult> examStudentOverview(@Param("cultureProgramId") Long cultureProgramId, @Param("courseId") Long courseId);
+    public List<FinalScoreResult> examStudentOverview(@Param("cultureProgramId") Long cultureProgramId, @Param("courseId") Long courseId, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("userId") Long userId, @Param("teachClassName") String teachClassName);
 }

+ 3 - 1
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/mapper/TCUsualScoreMapper.java

@@ -39,7 +39,9 @@ public interface TCUsualScoreMapper extends BaseMapper<TCUsualScore> {
      * @param cultureProgramId
      * @param courseId
      * @param paperNumber
+     * @param examId
+     * @param userId
      * @return
      */
-    public IPage<TCUsualScore> usualScoreList(IPage<Map> iPage, @Param("cultureProgramId") Long cultureProgramId, @Param("courseId") Long courseId, @Param("paperNumber") String paperNumber);
+    public IPage<TCUsualScore> usualScoreList(IPage<Map> iPage, @Param("cultureProgramId") Long cultureProgramId, @Param("courseId") Long courseId, @Param("paperNumber") String paperNumber, @Param("examId") Long examId, @Param("userId") Long userId);
 }

+ 17 - 8
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/TCFinalScoreService.java

@@ -56,9 +56,10 @@ public interface TCFinalScoreService extends IService<TCFinalScore> {
      * @param paperNumber
      * @param cultureProgramId
      * @param courseId
+     * @param teachClassName
      * @return
      */
-    public FinalScoreDto finalScoreScoreOverView(Long examId, String courseCode, String paperNumber, Long cultureProgramId, Long courseId);
+    public FinalScoreDto finalScoreScoreOverView(Long examId, String courseCode, String paperNumber, Long cultureProgramId, Long courseId, String teachClassName);
 
     /**
      * 查找期末成绩分数区间
@@ -70,9 +71,10 @@ public interface TCFinalScoreService extends IService<TCFinalScore> {
      * @param courseId
      * @param start
      * @param end
+     * @param teachClassName
      * @return
      */
-    public int getCountByScoreRange(Long examId, String courseCode, String paperNumber, Long cultureProgramId, Long courseId, Double start, Double end);
+    public int getCountByScoreRange(Long examId, String courseCode, String paperNumber, Long cultureProgramId, Long courseId, Double start, Double end, String teachClassName);
 
     /**
      * 查找考生成绩
@@ -82,9 +84,10 @@ public interface TCFinalScoreService extends IService<TCFinalScore> {
      * @param paperNumber
      * @param cultureProgramId
      * @param courseId
+     * @param teachClassName
      * @return
      */
-    public List<FinalScoreResult> examStudentOverview(Long examId, String courseCode, String paperNumber, Long cultureProgramId, Long courseId);
+    public List<FinalScoreResult> examStudentOverview(Long examId, String courseCode, String paperNumber, Long cultureProgramId, Long courseId, String teachClassName);
 
     /**
      * 同步期末成绩
@@ -104,9 +107,10 @@ public interface TCFinalScoreService extends IService<TCFinalScore> {
      * @param cultureProgramId
      * @param courseId
      * @param paperNumber
+     * @param examId
      * @return
      */
-    public Boolean remove(Long cultureProgramId, Long courseId, String paperNumber);
+    public Boolean remove(Long cultureProgramId, Long courseId, String paperNumber, Long examId);
 
     /**
      * 根据考试id/课程编码/试卷编码查询数据库数据
@@ -114,9 +118,11 @@ public interface TCFinalScoreService extends IService<TCFinalScore> {
      * @param cultureProgramId
      * @param courseId
      * @param paperNumber
+     * @param examId
+     * @param createId
      * @return
      */
-    public List<TCFinalScore> queryFinalScore(Long cultureProgramId, Long courseId, String paperNumber);
+    public List<TCFinalScore> queryFinalScore(Long cultureProgramId, Long courseId, String paperNumber, Long examId, Long createId);
 
     /**
      * 获取期末考试同步锁
@@ -124,8 +130,9 @@ public interface TCFinalScoreService extends IService<TCFinalScore> {
      * @param cultureProgramId
      * @param courseId
      * @param paperNumber
+     * @param examId
      */
-    public void getFinalScoreSyncLock(Long cultureProgramId, Long courseId, String paperNumber);
+    public void getFinalScoreSyncLock(Long cultureProgramId, Long courseId, String paperNumber, Long examId);
 
     /**
      * 获取期末考试导入锁
@@ -133,8 +140,9 @@ public interface TCFinalScoreService extends IService<TCFinalScore> {
      * @param cultureProgramId
      * @param courseId
      * @param paperNumber
+     * @param examId
      */
-    public void getFinalScoreImportLock(Long cultureProgramId, Long courseId, String paperNumber);
+    public void getFinalScoreImportLock(Long cultureProgramId, Long courseId, String paperNumber, Long examId);
 
     /**
      * 成绩管理列表
@@ -153,8 +161,9 @@ public interface TCFinalScoreService extends IService<TCFinalScore> {
      * @param cultureProgramId
      * @param courseId
      * @param paperNumber
+     * @param examId
      */
-    public void getLock(Long cultureProgramId, Long courseId, String paperNumber);
+    public void getLock(Long cultureProgramId, Long courseId, String paperNumber, Long examId);
 
     /**
      * 校验方案下课程是否已导入成绩

+ 10 - 5
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/TCPaperStructService.java

@@ -23,9 +23,10 @@ public interface TCPaperStructService extends IService<TCPaperStruct> {
      * @param cultureProgramId
      * @param courseId
      * @param paperNumber
+     * @param examId
      * @return
      */
-    public Boolean remove(Long cultureProgramId, Long courseId, String paperNumber);
+    public Boolean remove(Long cultureProgramId, Long courseId, String paperNumber, Long examId);
 
     /**
      * 导入期末成绩-试卷结构excel
@@ -34,10 +35,11 @@ public interface TCPaperStructService extends IService<TCPaperStruct> {
      * @param cultureProgramId
      * @param courseId
      * @param paperNumber
+     * @param examId
      * @return
      * @throws IOException
      */
-    public Map<String, String> paperStructExcelImport(MultipartFile file, Long cultureProgramId, Long courseId, String paperNumber) throws IOException;
+    public Map<String, String> paperStructExcelImport(MultipartFile file, Long cultureProgramId, Long courseId, String paperNumber, Long examId) throws IOException;
 
     /**
      * 同步试卷结构
@@ -57,9 +59,10 @@ public interface TCPaperStructService extends IService<TCPaperStruct> {
      * @param cultureProgramId
      * @param courseId
      * @param paperNumber
+     * @param examId
      * @return
      */
-    public TCPaperStruct queryPaperStruct(Long cultureProgramId, Long courseId, String paperNumber);
+    public TCPaperStruct queryPaperStruct(Long cultureProgramId, Long courseId, String paperNumber, Long examId);
 
     /**
      * 获取试卷结构导入锁
@@ -67,8 +70,9 @@ public interface TCPaperStructService extends IService<TCPaperStruct> {
      * @param cultureProgramId
      * @param courseId
      * @param paperNumber
+     * @param examId
      */
-    public void getPaperStructSyncLock(Long cultureProgramId, Long courseId, String paperNumber);
+    public void getPaperStructSyncLock(Long cultureProgramId, Long courseId, String paperNumber, Long examId);
 
     /**
      * 获取试卷结构导入锁
@@ -76,6 +80,7 @@ public interface TCPaperStructService extends IService<TCPaperStruct> {
      * @param cultureProgramId
      * @param courseId
      * @param paperNumber
+     * @param examId
      */
-    public void getPaperStructImportLock(Long cultureProgramId, Long courseId, String paperNumber);
+    public void getPaperStructImportLock(Long cultureProgramId, Long courseId, String paperNumber, Long examId);
 }

+ 18 - 3
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/TCUsualScoreService.java

@@ -25,10 +25,12 @@ public interface TCUsualScoreService extends IService<TCUsualScore> {
      * @param file
      * @param cultureProgramId
      * @param courseId
+     * @param examId
+     * @param paperNumber
      * @param usualScoreList
      * @return 结果
      */
-    public Map<String, String> usualScoreExcelImport(MultipartFile file, Long cultureProgramId, Long courseId, String usualScoreList) throws IOException;
+    public Map<String, String> usualScoreExcelImport(MultipartFile file, Long cultureProgramId, Long courseId, Long examId, String paperNumber, String usualScoreList) throws IOException;
 
     /**
      * 平时成绩列表(分页)
@@ -37,9 +39,10 @@ public interface TCUsualScoreService extends IService<TCUsualScore> {
      * @param cultureProgramId
      * @param courseId
      * @param paperNumber
+     * @param examId
      * @return
      */
-    public IPage<TCUsualScore> usualScoreList(IPage<Map> iPage, Long cultureProgramId, Long courseId, String paperNumber);
+    public IPage<TCUsualScore> usualScoreList(IPage<Map> iPage, Long cultureProgramId, Long courseId, String paperNumber, Long examId);
 
     /**
      * 根据考试id/课程编码/试卷编码查询数据库数据
@@ -47,7 +50,19 @@ public interface TCUsualScoreService extends IService<TCUsualScore> {
      * @param cultureProgramId
      * @param courseId
      * @param paperNumber
+     * @param examId
+     * @param createId
      * @return
      */
-    public List<TCUsualScore> queryUsualScore(Long cultureProgramId, Long courseId, String paperNumber);
+    public List<TCUsualScore> queryUsualScore(Long cultureProgramId, Long courseId, String paperNumber, Long examId, Long createId);
+
+    /**
+     * 获取平时成绩导入锁
+     *
+     * @param cultureProgramId
+     * @param courseId
+     * @param paperNumber
+     * @param examId
+     */
+    public void getUsualScoreImportLock(Long cultureProgramId, Long courseId, String paperNumber, Long examId);
 }

+ 12 - 5
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/TRBasicInfoService.java

@@ -16,6 +16,7 @@ import com.qmth.teachcloud.obe.entity.ObeCourseOutline;
 import com.qmth.teachcloud.obe.entity.TRBasicInfo;
 import org.springframework.util.LinkedMultiValueMap;
 
+import javax.swing.*;
 import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
@@ -37,9 +38,11 @@ public interface TRBasicInfoService extends IService<TRBasicInfo> {
      * @param cultureProgramId cultureProgramId
      * @param courseId         courseId
      * @param paperNumber      paperNumber
+     * @param examId
+     * @param createId
      * @return
      */
-    public TRBasicInfo queryBasicInfo(Long cultureProgramId, Long courseId, String paperNumber);
+    public List<TRBasicInfo> queryBasicInfo(Long cultureProgramId, Long courseId, String paperNumber, Long examId, Long createId);
 
     /**
      * 获取课程目标考核分布-分数图
@@ -73,15 +76,16 @@ public interface TRBasicInfoService extends IService<TRBasicInfo> {
     /**
      * 获取报告
      *
-     * @param trBasicInfo
      * @param markPaper
      * @param userId
      * @param obeCourseWeightResult
      * @param cultureProgramId
      * @param courseId
+     * @param examId
+     * @param paperNumber
      * @return
      */
-    public TRBasicInfo getReportView(TRBasicInfo trBasicInfo, MarkPaper markPaper, Long userId, ObeCourseWeightResult obeCourseWeightResult, Long cultureProgramId, Long courseId);
+    public List<TRBasicInfo> getReportView(MarkPaper markPaper, Long userId, ObeCourseWeightResult obeCourseWeightResult, Long cultureProgramId, Long courseId, Long examId, String paperNumber);
 
     /**
      * 构建word动态表格1-课程目标与毕业要求指标点的对应关系
@@ -151,9 +155,11 @@ public interface TRBasicInfoService extends IService<TRBasicInfo> {
      * @param cultureProgramId
      * @param courseId
      * @param paperNumber
+     * @param examId
+     * @param createId
      * @return
      */
-    public Boolean remove(Long cultureProgramId, Long courseId, String paperNumber);
+    public Boolean remove(Long cultureProgramId, Long courseId, String paperNumber, Long examId, Long createId);
 
     /**
      * 查找课程评价值
@@ -179,8 +185,9 @@ public interface TRBasicInfoService extends IService<TRBasicInfo> {
      * @param courseId
      * @param paperNumber
      * @param clearDimension
+     * @param examId
      */
-    public void clearReportData(Long cultureProgramId, Long courseId, String paperNumber, boolean clearDimension);
+    public void clearReportData(Long cultureProgramId, Long courseId, String paperNumber, Long examId, boolean clearDimension);
 
     /**
      * 报表基础信息

+ 3 - 1
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/TRExamStudentService.java

@@ -44,9 +44,11 @@ public interface TRExamStudentService extends IService<TRExamStudent> {
      * @param cultureProgramId cultureProgramId
      * @param courseId         courseId
      * @param paperNumber      paperNumber
+     * @param examId
+     * @param createId
      * @return 结果
      */
-    public Boolean remove(Long cultureProgramId, Long courseId, String paperNumber);
+    public Boolean remove(Long cultureProgramId, Long courseId, String paperNumber, Long examId, Long createId);
 
     /**
      * 学生毕业要求达成度

+ 2 - 3
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/impl/ObeCourseRequirementReportServiceImpl.java

@@ -164,8 +164,6 @@ public class ObeCourseRequirementReportServiceImpl extends ServiceImpl<ObeCourse
         Map<String, Object> resultMap = new HashMap<>();
         if (!CollectionUtils.isEmpty(courseRequirementMatrixDtoList)) {
             ObeCourseWeightResult obeCourseWeightResult = trBasicInfoService.findCourseWeightResultRmi(obeCourseOutlineId, false);
-            log.info("obeCourseWeightResult:{}", JacksonUtil.parseJson(obeCourseWeightResult));
-
             List<CourseWeightDto> courseWeightDtoList = obeCourseWeightResult.getSubmitForm();
             //课程目标指标点集合map
             Map<Long, CourseWeightDto> cultureProgramRequirementIdMap = courseWeightDtoList.stream().collect(Collectors.toMap(CourseWeightDto::getObeCultureProgramRequirementId, Function.identity(), (dto1, dto2) -> dto1));
@@ -178,7 +176,8 @@ public class ObeCourseRequirementReportServiceImpl extends ServiceImpl<ObeCourse
             Objects.requireNonNull(basicCourse, "未找到课程信息");
             for (CourseRequirementMatrixDto c : courseRequirementMatrixDtoList) {
                 if (c.getCourseId().longValue() == basicCourse.getId().longValue()) {
-                    TRBasicInfo trBasicInfo = trBasicInfoService.queryBasicInfo(obeCourseOutline.getCultureProgramId(), obeCourseOutline.getCourseId(), null);
+                    List<TRBasicInfo> trBasicInfoList = trBasicInfoService.queryBasicInfo(obeCourseOutline.getCultureProgramId(), obeCourseOutline.getCourseId(), null, examId, null);
+                    TRBasicInfo trBasicInfo = !CollectionUtils.isEmpty(trBasicInfoList) ? trBasicInfoList.stream().filter(s -> Objects.nonNull(s.getTeachClassName()) && (Objects.equals(s.getTeachClassName(), "ALL") || Objects.equals(s.getTeachClassName().trim(), ""))).collect(Collectors.toList()).get(0) : null;
                     if (Objects.nonNull(trBasicInfo)) {
                         ReportCourseEvaluationResultDto reportCourseEvaluationResultDto = Objects.nonNull(trBasicInfo.getCourseEvaluationResult()) ? JSONObject.parseObject(trBasicInfo.getCourseEvaluationResult(), ReportCourseEvaluationResultDto.class) : null;
                         BigDecimal courseMatrixDegree = new BigDecimal(0);

+ 69 - 28
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/impl/TCFinalScoreServiceImpl.java

@@ -48,7 +48,6 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
-import java.io.IOException;
 import java.math.BigDecimal;
 import java.util.*;
 import java.util.function.Function;
@@ -141,7 +140,7 @@ public class TCFinalScoreServiceImpl extends ServiceImpl<TCFinalScoreMapper, TCF
                 if (Objects.isNull(basicCourse)) {
                     throw ExceptionResultEnum.ERROR.exception("课程不存在");
                 }
-                TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(cultureProgramId, courseId, paperNumber);
+                TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(cultureProgramId, courseId, paperNumber, examId);
                 Objects.requireNonNull(tcPaperStruct, "未找到试卷结构");
 
                 List<PaperStructDimensionResult> paperStructDimensionResultList = null;
@@ -166,7 +165,8 @@ public class TCFinalScoreServiceImpl extends ServiceImpl<TCFinalScoreMapper, TCF
                         }
                         boolean error = false;
                         List<TCFinalScoreDto> tcFinalScoreDtoList = new ArrayList<>();
-                        TCFinalScore tcFinalScore = new TCFinalScore(cultureProgramId, courseId, basicCourse.getCode(), basicCourse.getName(), paperNumber, SourceEnum.EXCEL_IMPORT, sysUser.getId());
+//                        TCFinalScore tcFinalScore = new TCFinalScore(cultureProgramId, courseId, basicCourse.getCode(), basicCourse.getName(), paperNumber, SourceEnum.EXCEL_IMPORT, sysUser.getId());
+                        TCFinalScore tcFinalScore = new TCFinalScore(cultureProgramId, courseId, basicCourse.getCode(), basicCourse.getName(), paperNumber, SourceEnum.SYNC, sysUser.getId(), examId);
                         BigDecimal score = new BigDecimal(0);
                         for (int j = 0; j < strs.length; j++) {
                             if (Objects.isNull(strs[j]) || Objects.equals(strs[j].trim(), "")) {
@@ -226,11 +226,12 @@ public class TCFinalScoreServiceImpl extends ServiceImpl<TCFinalScoreMapper, TCF
                 }
                 if (!CollectionUtils.isEmpty(tcFinalScoreList)) {
                     successData.add("共导入").add(tcFinalScoreList.size() + "").add("条数据");
-                    List<TCFinalScore> tcFinalScoreDbSourceList = tcFinalScoreService.queryFinalScore(cultureProgramId, courseId, paperNumber);
+                    List<TCFinalScore> tcFinalScoreDbSourceList = tcFinalScoreService.queryFinalScore(cultureProgramId, courseId, paperNumber, examId, sysUser.getId());
+                    tcFinalScoreList.stream().peek(s -> s.updateExamAndPaperNumberInfo(tcFinalScoreDbSourceList.get(0))).collect(Collectors.toList());
                     if (CollectionUtils.isEmpty(tcFinalScoreDbSourceList) || !CollectionUtils.isEqualCollection(tcFinalScoreDbSourceList, tcFinalScoreList)) {
                         tcFinalScoreService.removeByIds(tcFinalScoreDbSourceList.stream().map(s -> s.getId()).collect(Collectors.toList()));
                         tcFinalScoreService.saveBatch(tcFinalScoreList);
-                        trBasicInfoService.clearReportData(cultureProgramId, courseId, paperNumber, true);
+                        trBasicInfoService.clearReportData(cultureProgramId, courseId, paperNumber, examId, true);
                     }
                 }
             }
@@ -267,7 +268,8 @@ public class TCFinalScoreServiceImpl extends ServiceImpl<TCFinalScoreMapper, TCF
      */
     @Override
     public IPage<TCFinalScore> finalScoreList(IPage<Map> iPage, Long examId, String courseCode, String paperNumber, Long cultureProgramId, Long courseId) {
-        return this.baseMapper.finalScoreList(iPage, cultureProgramId, courseId);
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        return this.baseMapper.finalScoreList(iPage, cultureProgramId, courseId, examId, paperNumber, sysUser.getId());
     }
 
     /**
@@ -278,11 +280,13 @@ public class TCFinalScoreServiceImpl extends ServiceImpl<TCFinalScoreMapper, TCF
      * @param paperNumber
      * @param cultureProgramId
      * @param courseId
+     * @param teachClassName
      * @return
      */
     @Override
-    public FinalScoreDto finalScoreScoreOverView(Long examId, String courseCode, String paperNumber, Long cultureProgramId, Long courseId) {
-        return this.baseMapper.finalScoreScoreOverView(cultureProgramId, courseId);
+    public FinalScoreDto finalScoreScoreOverView(Long examId, String courseCode, String paperNumber, Long cultureProgramId, Long courseId, String teachClassName) {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        return this.baseMapper.finalScoreScoreOverView(cultureProgramId, courseId, examId, paperNumber, sysUser.getId(), teachClassName);
     }
 
     /**
@@ -295,11 +299,13 @@ public class TCFinalScoreServiceImpl extends ServiceImpl<TCFinalScoreMapper, TCF
      * @param courseId
      * @param start
      * @param end
+     * @param teachClassName
      * @return
      */
     @Override
-    public int getCountByScoreRange(Long examId, String courseCode, String paperNumber, Long cultureProgramId, Long courseId, Double start, Double end) {
-        return this.baseMapper.getCountByScoreRange(cultureProgramId, courseId, start, end);
+    public int getCountByScoreRange(Long examId, String courseCode, String paperNumber, Long cultureProgramId, Long courseId, Double start, Double end, String teachClassName) {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        return this.baseMapper.getCountByScoreRange(cultureProgramId, courseId, start, end, examId, paperNumber, sysUser.getId(), teachClassName);
     }
 
     /**
@@ -310,11 +316,13 @@ public class TCFinalScoreServiceImpl extends ServiceImpl<TCFinalScoreMapper, TCF
      * @param paperNumber
      * @param cultureProgramId
      * @param courseId
+     * @param teachClassName
      * @return
      */
     @Override
-    public List<FinalScoreResult> examStudentOverview(Long examId, String courseCode, String paperNumber, Long cultureProgramId, Long courseId) {
-        return this.baseMapper.examStudentOverview(cultureProgramId, courseId);
+    public List<FinalScoreResult> examStudentOverview(Long examId, String courseCode, String paperNumber, Long cultureProgramId, Long courseId, String teachClassName) {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        return this.baseMapper.examStudentOverview(cultureProgramId, courseId, examId, paperNumber, sysUser.getId(), teachClassName);
     }
 
     /**
@@ -337,6 +345,7 @@ public class TCFinalScoreServiceImpl extends ServiceImpl<TCFinalScoreMapper, TCF
             List<MarkStudentScoreVo> markStudentScoreVoList = markStudentService.listMarkStudentScoreList(examId, paperNumber);
             if (!CollectionUtils.isEmpty(markStudentScoreVoList)) {
                 List<TCFinalScore> tcFinalScoreList = new ArrayList<>(markStudentScoreVoList.size());
+                List<TCUsualScore> tcUsualScoreList = new ArrayList<>(markStudentScoreVoList.size());
                 List<PaperStructDimensionResult> paperStructDimensionResultList = new ArrayList<>(markStudentScoreVoList.size());
                 for (int i = 0; i < markStudentScoreVoList.size(); i++) {
                     MarkStudentScoreVo markStudentScoreVo = markStudentScoreVoList.get(i);
@@ -354,21 +363,34 @@ public class TCFinalScoreServiceImpl extends ServiceImpl<TCFinalScoreMapper, TCF
                         tcFinalScoreList.add(
                                 new TCFinalScore(markStudentScoreVo, JacksonUtil.parseJson(tcFinalScoreDtoList),
                                         SourceEnum.SYNC, sysUser.getId(), cultureProgramId, courseId));
+                        tcUsualScoreList.add(
+                                new TCUsualScore(markStudentScoreVo,
+                                        SourceEnum.SYNC, sysUser.getId(), cultureProgramId, courseId));
                     }
                 }
                 if (!CollectionUtils.isEmpty(tcFinalScoreList) && !CollectionUtils.isEmpty(
                         paperStructDimensionResultList)) {
                     successData.add("共同步").add(tcFinalScoreList.size() + "").add("条数据");
                     List<TCFinalScore> tcFinalScoreDbSourceList = tcFinalScoreService.queryFinalScore(cultureProgramId,
-                            courseId, null);
+                            courseId, paperNumber, examId, null);
+                    List<TCUsualScore> tcUsualScoreDbSourceList = tcUsualScoreService.queryUsualScore(cultureProgramId,
+                            courseId, paperNumber, examId, null);
+                    log.info("tcFinalScoreDbSourceList:{}", JacksonUtil.parseJson(tcFinalScoreDbSourceList));
+                    log.info("tcFinalScoreList:{}", JacksonUtil.parseJson(tcFinalScoreList));
                     if (CollectionUtils.isEmpty(tcFinalScoreDbSourceList) || !CollectionUtils.isEqualCollection(
                             tcFinalScoreDbSourceList, tcFinalScoreList)) {
                         tcFinalScoreService.removeByIds(
                                 tcFinalScoreDbSourceList.stream().map(BaseEntity::getId).collect(Collectors.toList()));
                         tcFinalScoreService.saveBatch(tcFinalScoreList);
-                        trBasicInfoService.clearReportData(cultureProgramId, courseId, paperNumber, true);
+                        trBasicInfoService.clearReportData(cultureProgramId, courseId, paperNumber, examId, true);
+                    }
+                    if (CollectionUtils.isEmpty(tcUsualScoreDbSourceList) || !CollectionUtils.isEqualCollection(
+                            tcUsualScoreDbSourceList, tcUsualScoreList)) {
+                        tcUsualScoreService.removeByIds(
+                                tcUsualScoreDbSourceList.stream().map(BaseEntity::getId).collect(Collectors.toList()));
+                        tcUsualScoreService.saveBatch(tcUsualScoreList);
                     }
-                    TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(cultureProgramId, courseId, null);
+                    TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(cultureProgramId, courseId, paperNumber, examId);
                     if (Objects.nonNull(tcPaperStruct)) {
                         tcPaperStructService.removeById(tcPaperStruct.getId());
                     }
@@ -406,16 +428,23 @@ public class TCFinalScoreServiceImpl extends ServiceImpl<TCFinalScoreMapper, TCF
      * @param cultureProgramId
      * @param courseId
      * @param paperNumber
+     * @param examId
      * @return
      */
     @Override
     @Transactional
-    public Boolean remove(Long cultureProgramId, Long courseId, String paperNumber) {
+    public Boolean remove(Long cultureProgramId, Long courseId, String paperNumber, Long examId) {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         QueryWrapper<TCFinalScore> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(TCFinalScore::getCultureProgramId, cultureProgramId).eq(TCFinalScore::getCourseId, courseId);
+        queryWrapper.lambda().eq(TCFinalScore::getCultureProgramId, cultureProgramId)
+                .eq(TCFinalScore::getCourseId, courseId)
+                .eq(TCFinalScore::getCreateId, sysUser.getId());
         if (Objects.nonNull(paperNumber)) {
             queryWrapper.lambda().and(w -> w.eq(TCFinalScore::getPaperNumber, paperNumber).or().isNull(TCFinalScore::getPaperNumber));
         }
+        if (Objects.nonNull(examId)) {
+            queryWrapper.lambda().eq(TCFinalScore::getExamId, examId);
+        }
         return tcFinalScoreService.remove(queryWrapper);
     }
 
@@ -425,15 +454,24 @@ public class TCFinalScoreServiceImpl extends ServiceImpl<TCFinalScoreMapper, TCF
      * @param cultureProgramId
      * @param courseId
      * @param paperNumber
+     * @param examId
+     * @param createId
      * @return
      */
     @Override
-    public List<TCFinalScore> queryFinalScore(Long cultureProgramId, Long courseId, String paperNumber) {
+    public List<TCFinalScore> queryFinalScore(Long cultureProgramId, Long courseId, String paperNumber, Long examId, Long createId) {
         QueryWrapper<TCFinalScore> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(TCFinalScore::getCultureProgramId, cultureProgramId).eq(TCFinalScore::getCourseId, courseId);
+        queryWrapper.lambda().eq(TCFinalScore::getCultureProgramId, cultureProgramId)
+                .eq(TCFinalScore::getCourseId, courseId);
         if (Objects.nonNull(paperNumber)) {
             queryWrapper.lambda().and(w -> w.eq(TCFinalScore::getPaperNumber, paperNumber).or().isNull(TCFinalScore::getPaperNumber));
         }
+        if (Objects.nonNull(examId)) {
+            queryWrapper.lambda().eq(TCFinalScore::getExamId, examId);
+        }
+        if (Objects.nonNull(createId) && createId.longValue() > 0) {
+            queryWrapper.lambda().eq(TCFinalScore::getCreateId, createId);
+        }
         return tcFinalScoreService.list(queryWrapper);
     }
 
@@ -443,10 +481,11 @@ public class TCFinalScoreServiceImpl extends ServiceImpl<TCFinalScoreMapper, TCF
      * @param cultureProgramId
      * @param courseId
      * @param paperNumber
+     * @param examId
      */
     @Override
-    public void getFinalScoreSyncLock(Long cultureProgramId, Long courseId, String paperNumber) {
-        String lockKey = SystemConstant.REDIS_FINAL_SCORE_DATA_PREFIX + SystemConstant.SYNC + cultureProgramId + "_" + courseId + "_" + paperNumber;
+    public void getFinalScoreSyncLock(Long cultureProgramId, Long courseId, String paperNumber, Long examId) {
+        String lockKey = SystemConstant.REDIS_FINAL_SCORE_DATA_PREFIX + SystemConstant.SYNC + cultureProgramId + "_" + courseId + "_" + paperNumber + "_" + examId;
         Object o = redisUtil.get(lockKey);
         if (Objects.nonNull(o)) {
             throw ExceptionResultEnum.ERROR.exception("正在同步期末成绩数据,请稍候再试!");
@@ -459,10 +498,11 @@ public class TCFinalScoreServiceImpl extends ServiceImpl<TCFinalScoreMapper, TCF
      * @param cultureProgramId
      * @param courseId
      * @param paperNumber
+     * @param examId
      */
     @Override
-    public void getFinalScoreImportLock(Long cultureProgramId, Long courseId, String paperNumber) {
-        String lockKey = SystemConstant.REDIS_FINAL_SCORE_DATA_PREFIX + SystemConstant.IMPORT + cultureProgramId + "_" + courseId + "_" + paperNumber;
+    public void getFinalScoreImportLock(Long cultureProgramId, Long courseId, String paperNumber, Long examId) {
+        String lockKey = SystemConstant.REDIS_FINAL_SCORE_DATA_PREFIX + SystemConstant.IMPORT + cultureProgramId + "_" + courseId + "_" + paperNumber + "_" + examId;
         Object o = redisUtil.get(lockKey);
         if (Objects.nonNull(o)) {
             throw ExceptionResultEnum.ERROR.exception("正在导入期末成绩数据,请稍候再试!");
@@ -491,13 +531,14 @@ public class TCFinalScoreServiceImpl extends ServiceImpl<TCFinalScoreMapper, TCF
      * @param cultureProgramId
      * @param courseId
      * @param paperNumber
+     * @param examId
      */
     @Override
-    public void getLock(Long cultureProgramId, Long courseId, String paperNumber) {
-        tcFinalScoreService.getFinalScoreSyncLock(cultureProgramId, courseId, paperNumber);
-        tcFinalScoreService.getFinalScoreImportLock(cultureProgramId, courseId, paperNumber);
-        tcPaperStructService.getPaperStructSyncLock(cultureProgramId, courseId, paperNumber);
-        tcPaperStructService.getPaperStructImportLock(cultureProgramId, courseId, paperNumber);
+    public void getLock(Long cultureProgramId, Long courseId, String paperNumber, Long examId) {
+        tcFinalScoreService.getFinalScoreSyncLock(cultureProgramId, courseId, paperNumber, examId);
+        tcFinalScoreService.getFinalScoreImportLock(cultureProgramId, courseId, paperNumber, examId);
+        tcPaperStructService.getPaperStructSyncLock(cultureProgramId, courseId, paperNumber, examId);
+        tcPaperStructService.getPaperStructImportLock(cultureProgramId, courseId, paperNumber, examId);
     }
 
     /**

+ 26 - 15
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/impl/TCPaperStructServiceImpl.java

@@ -19,6 +19,7 @@ import com.qmth.teachcloud.obe.been.excel.PaperStructDto;
 import com.qmth.teachcloud.obe.been.result.ObeCourseWeightResult;
 import com.qmth.teachcloud.obe.been.result.report.PaperStructDimensionResult;
 import com.qmth.teachcloud.obe.entity.ObeCourseOutline;
+import com.qmth.teachcloud.obe.entity.TCFinalScore;
 import com.qmth.teachcloud.obe.entity.TCPaperStruct;
 import com.qmth.teachcloud.obe.mapper.TCPaperStructMapper;
 import com.qmth.teachcloud.obe.service.*;
@@ -79,16 +80,20 @@ public class TCPaperStructServiceImpl extends ServiceImpl<TCPaperStructMapper, T
      * @param cultureProgramId
      * @param courseId
      * @param paperNumber
+     * @param examId
      * @return
      */
     @Override
     @Transactional
-    public Boolean remove(Long cultureProgramId, Long courseId, String paperNumber) {
+    public Boolean remove(Long cultureProgramId, Long courseId, String paperNumber, Long examId) {
         QueryWrapper<TCPaperStruct> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(TCPaperStruct::getCultureProgramId, cultureProgramId).eq(TCPaperStruct::getCourseId, courseId);
         if (Objects.nonNull(paperNumber)) {
             queryWrapper.lambda().and(w -> w.eq(TCPaperStruct::getPaperNumber, paperNumber).or().isNull(TCPaperStruct::getPaperNumber));
         }
+        if (Objects.nonNull(examId)) {
+            queryWrapper.lambda().eq(TCPaperStruct::getExamId, examId);
+        }
         return tcPaperStructService.remove(queryWrapper);
     }
 
@@ -103,7 +108,7 @@ public class TCPaperStructServiceImpl extends ServiceImpl<TCPaperStructMapper, T
      */
     @Override
     @Transactional
-    public Map<String, String> paperStructExcelImport(MultipartFile file, Long cultureProgramId, Long courseId, String paperNumber) {
+    public Map<String, String> paperStructExcelImport(MultipartFile file, Long cultureProgramId, Long courseId, String paperNumber, Long examId) {
         log.debug("导入Excel开始...");
         long start = System.currentTimeMillis();
         Map<String, String> messageMap = new LinkedHashMap<>();
@@ -164,12 +169,12 @@ public class TCPaperStructServiceImpl extends ServiceImpl<TCPaperStructMapper, T
                     successData.add("共导入").add(paperStructDtoNewList.size() + "").add("条数据");
                     paperStructDtoNewList = SDFrame.read(paperStructDtoNewList).sortDesc(Sorter.sortDescBy(PaperStructDto::getMainNumber).sortDesc(PaperStructDto::getMainNumber)).toLists();
                     TCPaperStruct tcPaperStruct = new TCPaperStruct(cultureProgramId, courseId, markPaper.getCourseCode(), markPaper.getCourseName(), paperNumber, JacksonUtil.parseJson(paperStructDtoNewList), totalScore, 60d, sysUser.getId());
-                    TCPaperStruct tcPaperStructDb = tcPaperStructService.queryPaperStruct(cultureProgramId, courseId, paperNumber);
+                    TCPaperStruct tcPaperStructDb = tcPaperStructService.queryPaperStruct(cultureProgramId, courseId, paperNumber, examId);
                     if (Objects.nonNull(tcPaperStructDb) && !tcPaperStructDb.equals(tcPaperStruct)) {
-                        tcFinalScoreService.remove(cultureProgramId, courseId, paperNumber);
-                        trBasicInfoService.clearReportData(cultureProgramId, courseId, paperNumber, true);
+                        tcFinalScoreService.remove(cultureProgramId, courseId, paperNumber, examId);
+                        trBasicInfoService.clearReportData(cultureProgramId, courseId, paperNumber, examId, true);
                     }
-                    tcPaperStructService.remove(cultureProgramId, courseId, paperNumber);
+                    tcPaperStructService.remove(cultureProgramId, courseId, paperNumber, examId);
                     tcPaperStructService.save(tcPaperStruct);
                 }
             }
@@ -226,7 +231,7 @@ public class TCPaperStructServiceImpl extends ServiceImpl<TCPaperStructMapper, T
                 paperStructList.add(p.getMainNumber() + "_" + p.getSubNumber() + "_" + p.getScore());
             }
             successData.add("共同步").add(paperStructDimensionResultList.size() + "").add("条数据");
-            TCPaperStruct tcPaperStructDb = tcPaperStructService.queryPaperStruct(cultureProgramId, courseId, paperNumber);
+            TCPaperStruct tcPaperStructDb = tcPaperStructService.queryPaperStruct(cultureProgramId, courseId, paperNumber, examId);
             TCPaperStruct tcPaperStruct = null;
             if (Objects.nonNull(tcPaperStructDb) && Objects.nonNull(tcPaperStructDb.getPaperStructDimension())) {
                 tcPaperStruct = new TCPaperStruct();
@@ -246,12 +251,12 @@ public class TCPaperStructServiceImpl extends ServiceImpl<TCPaperStructMapper, T
                     paperStructDbList = markQuestionList.stream().map(e -> e.getMainNumber() + "_" + e.getSubNumber() + "_" + e.getTotalScore()).collect(Collectors.toList());
                 }
                 if (!CollectionUtils.isEmpty(paperStructDbList) && !CollectionUtils.isEmpty(paperStructList) && !CollectionUtils.isEqualCollection(paperStructDbList, paperStructList)) {
-                    trBasicInfoService.clearReportData(cultureProgramId, courseId, paperNumber, false);
+                    trBasicInfoService.clearReportData(cultureProgramId, courseId, paperNumber, examId, false);
                     tcPaperStruct.setPaperStruct(null);
                 }
                 tcPaperStruct.updateInfo(sysUser.getId());
             } else {
-                tcPaperStructService.remove(cultureProgramId, courseId, paperNumber);
+                tcPaperStructService.remove(cultureProgramId, courseId, paperNumber, examId);
                 MarkPaper markPaper = printCommonService.getMarkPaper(examId, paperNumber, courseId);
                 ObeCourseWeightResult obeCourseWeightResult = trBasicInfoService.findCourseWeightResultRmi(obeCourseOutline.getId(), true);
                 paperStructDimensionResultList = SDFrame.read(paperStructDimensionResultList).sortDesc(Sorter.sortDescBy(PaperStructDimensionResult::getMainNumber).sortDesc(PaperStructDimensionResult::getMainNumber)).toLists();
@@ -262,7 +267,7 @@ public class TCPaperStructServiceImpl extends ServiceImpl<TCPaperStructMapper, T
                 }
                 paperStructDbList = markQuestionList.stream().map(e -> e.getMainNumber() + "_" + e.getSubNumber() + "_" + e.getTotalScore()).collect(Collectors.toList());
                 if (!CollectionUtils.isEmpty(paperStructDbList) && !CollectionUtils.isEmpty(paperStructList) && !CollectionUtils.isEqualCollection(paperStructDbList, paperStructList)) {
-                    trBasicInfoService.clearReportData(cultureProgramId, courseId, paperNumber, false);
+                    trBasicInfoService.clearReportData(cultureProgramId, courseId, paperNumber, examId, false);
                 }
             }
             tcPaperStructService.saveOrUpdate(tcPaperStruct);
@@ -289,15 +294,19 @@ public class TCPaperStructServiceImpl extends ServiceImpl<TCPaperStructMapper, T
      * @param cultureProgramId cultureProgramId
      * @param courseId         courseId
      * @param paperNumber      paperNumber
+     * @param examId
      * @return 结果
      */
     @Override
-    public TCPaperStruct queryPaperStruct(Long cultureProgramId, Long courseId, String paperNumber) {
+    public TCPaperStruct queryPaperStruct(Long cultureProgramId, Long courseId, String paperNumber, Long examId) {
         QueryWrapper<TCPaperStruct> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().eq(TCPaperStruct::getCultureProgramId, cultureProgramId).eq(TCPaperStruct::getCourseId, courseId);
         if (Objects.nonNull(paperNumber)) {
             queryWrapper.lambda().and(w -> w.eq(TCPaperStruct::getPaperNumber, paperNumber).or().isNull(TCPaperStruct::getPaperNumber));
         }
+        if (Objects.nonNull(examId)) {
+            queryWrapper.lambda().eq(TCPaperStruct::getExamId, examId);
+        }
         return tcPaperStructService.getOne(queryWrapper);
     }
 
@@ -307,10 +316,11 @@ public class TCPaperStructServiceImpl extends ServiceImpl<TCPaperStructMapper, T
      * @param cultureProgramId
      * @param courseId
      * @param paperNumber
+     * @param examId
      */
     @Override
-    public void getPaperStructSyncLock(Long cultureProgramId, Long courseId, String paperNumber) {
-        String lockKey = SystemConstant.REDIS_PAPER_STRUCT_PREFIX + SystemConstant.SYNC + cultureProgramId + "_" + courseId + "_" + paperNumber;
+    public void getPaperStructSyncLock(Long cultureProgramId, Long courseId, String paperNumber, Long examId) {
+        String lockKey = SystemConstant.REDIS_PAPER_STRUCT_PREFIX + SystemConstant.SYNC + cultureProgramId + "_" + courseId + "_" + paperNumber + "_" + examId;
         Object o = redisUtil.get(lockKey);
         if (Objects.nonNull(o)) {
             throw ExceptionResultEnum.ERROR.exception("正在同步试卷蓝图数据,请稍候再试!");
@@ -323,10 +333,11 @@ public class TCPaperStructServiceImpl extends ServiceImpl<TCPaperStructMapper, T
      * @param cultureProgramId
      * @param courseId
      * @param paperNumber
+     * @param examId
      */
     @Override
-    public void getPaperStructImportLock(Long cultureProgramId, Long courseId, String paperNumber) {
-        String lockKey = SystemConstant.REDIS_PAPER_STRUCT_PREFIX + SystemConstant.IMPORT + cultureProgramId + "_" + courseId + "_" + paperNumber;
+    public void getPaperStructImportLock(Long cultureProgramId, Long courseId, String paperNumber, Long examId) {
+        String lockKey = SystemConstant.REDIS_PAPER_STRUCT_PREFIX + SystemConstant.IMPORT + cultureProgramId + "_" + courseId + "_" + paperNumber + "_" + examId;
         Object o = redisUtil.get(lockKey);
         if (Objects.nonNull(o)) {
             throw ExceptionResultEnum.ERROR.exception("正在导入试卷蓝图数据,请稍候再试!");

+ 44 - 12
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/impl/TCUsualScoreServiceImpl.java

@@ -8,6 +8,7 @@ import com.qmth.boot.api.exception.ApiException;
 import com.qmth.boot.tools.excel.ExcelReader;
 import com.qmth.boot.tools.excel.enums.ExcelType;
 import com.qmth.distributed.print.business.bean.excel.ExcelField;
+import com.qmth.distributed.print.business.enums.SourceEnum;
 import com.qmth.teachcloud.common.base.BaseEntity;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicCourse;
@@ -15,10 +16,7 @@ import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.FieldUniqueEnum;
 import com.qmth.teachcloud.common.service.BasicCourseService;
-import com.qmth.teachcloud.common.util.GsonUtil;
-import com.qmth.teachcloud.common.util.JacksonUtil;
-import com.qmth.teachcloud.common.util.ResultUtil;
-import com.qmth.teachcloud.common.util.ServletUtil;
+import com.qmth.teachcloud.common.util.*;
 import com.qmth.teachcloud.obe.been.dto.TCUsualScoreDto;
 import com.qmth.teachcloud.obe.entity.TCUsualScore;
 import com.qmth.teachcloud.obe.mapper.TCUsualScoreMapper;
@@ -59,18 +57,23 @@ public class TCUsualScoreServiceImpl extends ServiceImpl<TCUsualScoreMapper, TCU
     @Resource
     BasicCourseService basicCourseService;
 
+    @Resource
+    RedisUtil redisUtil;
+
     /**
      * 平时成绩导入
      *
      * @param file             excel
      * @param cultureProgramId 培养方案id
      * @param courseId         课程id
+     * @param examId
+     * @param paperNumber
      * @param usualScoreList
      * @return
      */
     @Override
     @Transactional
-    public Map<String, String> usualScoreExcelImport(MultipartFile file, Long cultureProgramId, Long courseId, String usualScoreList) {
+    public Map<String, String> usualScoreExcelImport(MultipartFile file, Long cultureProgramId, Long courseId, Long examId, String paperNumber, String usualScoreList) {
         log.debug("导入Excel开始...");
         long start = System.currentTimeMillis();
         Map<String, String> messageMap = new LinkedHashMap<>();
@@ -113,7 +116,7 @@ public class TCUsualScoreServiceImpl extends ServiceImpl<TCUsualScoreMapper, TCU
                         }
                         boolean error = false;
                         List<TCUsualScoreDto> tcUsualScoreDtoList = new ArrayList<>();
-                        TCUsualScore tcUsualScore = new TCUsualScore(cultureProgramId, basicCourse.getId(), basicCourse.getCode(), basicCourse.getName(), null, sysUser.getId());
+                        TCUsualScore tcUsualScore = new TCUsualScore(cultureProgramId, basicCourse.getId(), basicCourse.getCode(), basicCourse.getName(), paperNumber, SourceEnum.SYNC, sysUser.getId(), examId);
                         for (int j = 0; j < strs.length; j++) {
                             if (Objects.isNull(strs[j]) || Objects.equals(strs[j].trim(), "")) {
                                 errorData.add("excel第").add((i + 1) + "").add("行[").add(columnNames[j] + "]为空;").add("\r\n");
@@ -163,11 +166,12 @@ public class TCUsualScoreServiceImpl extends ServiceImpl<TCUsualScoreMapper, TCU
                 }
                 if (!CollectionUtils.isEmpty(tcUsualScoreList)) {
                     successData.add("共导入").add(tcUsualScoreList.size() + "").add("条数据");
-                    List<TCUsualScore> tcUsualScoreDbSourceList = tcUsualScoreService.queryUsualScore(cultureProgramId, basicCourse.getId(), null);
+                    List<TCUsualScore> tcUsualScoreDbSourceList = tcUsualScoreService.queryUsualScore(cultureProgramId, basicCourse.getId(), paperNumber, examId, sysUser.getId());
+                    tcUsualScoreList.stream().peek(s -> s.updateExamAndPaperNumberInfo(tcUsualScoreDbSourceList.get(0))).collect(Collectors.toList());
                     if (CollectionUtils.isEmpty(tcUsualScoreDbSourceList) || !CollectionUtils.isEqualCollection(tcUsualScoreDbSourceList, tcUsualScoreList)) {
                         tcUsualScoreService.removeByIds(tcUsualScoreDbSourceList.stream().map(BaseEntity::getId).collect(Collectors.toList()));
                         tcUsualScoreService.saveBatch(tcUsualScoreList);
-                        trBasicInfoService.clearReportData(cultureProgramId, basicCourse.getId(), null
+                        trBasicInfoService.clearReportData(cultureProgramId, basicCourse.getId(), paperNumber, examId
                                 , false);
                     }
                 }
@@ -199,11 +203,13 @@ public class TCUsualScoreServiceImpl extends ServiceImpl<TCUsualScoreMapper, TCU
      * @param cultureProgramId
      * @param courseId
      * @param paperNumber
+     * @param examId
      * @return
      */
     @Override
-    public IPage<TCUsualScore> usualScoreList(IPage<Map> iPage, Long cultureProgramId, Long courseId, String paperNumber) {
-        return this.baseMapper.usualScoreList(iPage, cultureProgramId, courseId, paperNumber);
+    public IPage<TCUsualScore> usualScoreList(IPage<Map> iPage, Long cultureProgramId, Long courseId, String paperNumber, Long examId) {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        return this.baseMapper.usualScoreList(iPage, cultureProgramId, courseId, paperNumber, examId, sysUser.getId());
     }
 
     /**
@@ -212,15 +218,41 @@ public class TCUsualScoreServiceImpl extends ServiceImpl<TCUsualScoreMapper, TCU
      * @param cultureProgramId
      * @param courseId
      * @param paperNumber
+     * @param examId
+     * @param createId
      * @return
      */
     @Override
-    public List<TCUsualScore> queryUsualScore(Long cultureProgramId, Long courseId, String paperNumber) {
+    public List<TCUsualScore> queryUsualScore(Long cultureProgramId, Long courseId, String paperNumber, Long examId, Long createId) {
         QueryWrapper<TCUsualScore> queryWrapper = new QueryWrapper<>();
         if (Objects.nonNull(paperNumber)) {
             queryWrapper.lambda().and(w -> w.eq(TCUsualScore::getPaperNumber, paperNumber).or().isNull(TCUsualScore::getPaperNumber));
         }
-        queryWrapper.lambda().eq(TCUsualScore::getCultureProgramId, cultureProgramId).eq(TCUsualScore::getCourseId, courseId);
+        queryWrapper.lambda().eq(TCUsualScore::getCultureProgramId, cultureProgramId)
+                .eq(TCUsualScore::getCourseId, courseId);
+        if (Objects.nonNull(examId)) {
+            queryWrapper.lambda().eq(TCUsualScore::getExamId, examId);
+        }
+        if (Objects.nonNull(createId)) {
+            queryWrapper.lambda().eq(TCUsualScore::getCreateId, createId);
+        }
         return tcUsualScoreService.list(queryWrapper);
     }
+
+    /**
+     * 获取平时成绩导入锁
+     *
+     * @param cultureProgramId
+     * @param courseId
+     * @param paperNumber
+     * @param examId
+     */
+    @Override
+    public void getUsualScoreImportLock(Long cultureProgramId, Long courseId, String paperNumber, Long examId) {
+        String lockKey = SystemConstant.REDIS_USUAL_SCORE_DATA_PREFIX + SystemConstant.IMPORT + cultureProgramId + "_" + courseId + "_" + paperNumber + "_" + examId;
+        Object o = redisUtil.get(lockKey);
+        if (Objects.nonNull(o)) {
+            throw ExceptionResultEnum.ERROR.exception("正在导入平时成绩数据,请稍候再试!");
+        }
+    }
 }

+ 134 - 74
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/impl/TRBasicInfoServiceImpl.java

@@ -2,6 +2,7 @@ package com.qmth.teachcloud.obe.service.impl;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.aventrix.jnanoid.jnanoid.NanoIdUtils;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.deepoove.poi.data.*;
@@ -107,14 +108,31 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
     protected static final String tbPercentWidth = "100%";
     protected static final String[] scoreTitles = new String[]{"100-90", "89-80", "79-70", "69-60", "<60"};
 
+    /**
+     * 根据考试id/课程编码/试卷编码查询数据库数据
+     *
+     * @param cultureProgramId cultureProgramId
+     * @param courseId         courseId
+     * @param paperNumber      paperNumber
+     * @param examId
+     * @param createId
+     * @return
+     */
     @Override
-    public TRBasicInfo queryBasicInfo(Long cultureProgramId, Long courseId, String paperNumber) {
+    public List<TRBasicInfo> queryBasicInfo(Long cultureProgramId, Long courseId, String paperNumber, Long examId, Long createId) {
         QueryWrapper<TRBasicInfo> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(TRBasicInfo::getCultureProgramId, cultureProgramId).eq(TRBasicInfo::getCourseId, courseId);
+        queryWrapper.lambda().eq(TRBasicInfo::getCultureProgramId, cultureProgramId)
+                .eq(TRBasicInfo::getCourseId, courseId);
         if (Objects.nonNull(paperNumber)) {
             queryWrapper.lambda().and(w -> w.eq(TRBasicInfo::getPaperNumber, paperNumber).or().isNull(TRBasicInfo::getPaperNumber));
         }
-        return trBasicInfoService.getOne(queryWrapper);
+        if (Objects.nonNull(examId)) {
+            queryWrapper.lambda().eq(TRBasicInfo::getExamId, examId);
+        }
+        if (Objects.nonNull(createId)) {
+            queryWrapper.lambda().eq(TRBasicInfo::getCreateId, createId);
+        }
+        return trBasicInfoService.list(queryWrapper);
     }
 
     /**
@@ -126,7 +144,7 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
      */
     @Override
     public ReportScoreViewDto getScoreList(TRBasicInfo trBasicInfo, MarkPaper markPaper) {
-        FinalScoreDto finalScoreDto = tcFinalScoreService.finalScoreScoreOverView(trBasicInfo.getExamId(), trBasicInfo.getCourseCode(), trBasicInfo.getPaperNumber(), trBasicInfo.getCultureProgramId(), trBasicInfo.getCourseId());
+        FinalScoreDto finalScoreDto = tcFinalScoreService.finalScoreScoreOverView(trBasicInfo.getExamId(), trBasicInfo.getCourseCode(), trBasicInfo.getPaperNumber(), trBasicInfo.getCultureProgramId(), trBasicInfo.getCourseId(), trBasicInfo.getTeachClassName());
         Objects.requireNonNull(finalScoreDto, "未找到期末成绩分数信息");
 
         if (finalScoreDto.getStudentCount() == 0) {
@@ -134,12 +152,12 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
         }
 
         ReportScoreViewDto reportScoreViewDto = null;
-        TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(trBasicInfo.getCultureProgramId(), trBasicInfo.getCourseId(), trBasicInfo.getPaperNumber());
+        TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(trBasicInfo.getCultureProgramId(), trBasicInfo.getCourseId(), trBasicInfo.getPaperNumber(), trBasicInfo.getExamId());
         if (Objects.nonNull(tcPaperStruct) && Objects.nonNull(tcPaperStruct.getPaperStruct()) && Objects.nonNull(tcPaperStruct.getTotalScore())) {
             BasicCourse basicCourse = basicCourseService.getById(trBasicInfo.getCourseId());
             markPaper = new MarkPaper(markPaper.getExamId(), markPaper.getCourseCode(), basicCourse.getName(), markPaper.getPaperNumber(), tcPaperStruct.getTotalScore(), tcPaperStruct.getPassScore());
         }
-        fillScoreRange(finalScoreDto, trBasicInfo.getExamId(), trBasicInfo.getPaperNumber(), trBasicInfo.getCultureProgramId(), trBasicInfo.getCourseId(), markPaper);
+        fillScoreRange(finalScoreDto, trBasicInfo.getExamId(), trBasicInfo.getPaperNumber(), trBasicInfo.getCultureProgramId(), trBasicInfo.getCourseId(), markPaper, trBasicInfo.getTeachClassName());
         List<ScoreRangeVo> scoreRangeVoList = finalScoreDto.getScoreRange();
         if (!CollectionUtils.isEmpty(scoreRangeVoList)) {
             Integer failCount = scoreRangeVoList.get(0).getStudentCount();//第一行数据默认为不及格
@@ -165,7 +183,7 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
     public Map<String, Object> getReportCalculateParams(TRBasicInfo trBasicInfo, List<PaperStructDimensionResult> paperStructDimensionResultList, ObeCourseWeightResult obeCourseWeightResult) {
         Map<String, Object> paramsMap = new HashMap<>();
         //查询考生数据
-        List<FinalScoreResult> finalScoreResultList = tcFinalScoreService.examStudentOverview(trBasicInfo.getExamId(), trBasicInfo.getCourseCode(), trBasicInfo.getPaperNumber(), trBasicInfo.getCultureProgramId(), trBasicInfo.getCourseId());//考生成绩
+        List<FinalScoreResult> finalScoreResultList = tcFinalScoreService.examStudentOverview(trBasicInfo.getExamId(), trBasicInfo.getCourseCode(), trBasicInfo.getPaperNumber(), trBasicInfo.getCultureProgramId(), trBasicInfo.getCourseId(), trBasicInfo.getTeachClassName());//考生成绩
         if (CollectionUtils.isEmpty(finalScoreResultList)) {
             throw ExceptionResultEnum.ERROR.exception("成绩数据异常,平时成绩与期末成绩里考生名单不一致,请检查");
         }
@@ -433,84 +451,114 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
     /**
      * 获取报告
      *
-     * @param trBasicInfo
      * @param markPaper
      * @param userId
      * @param obeCourseWeightResult
      * @param cultureProgramId
      * @param courseId
+     * @param examId
+     * @param paperNumber
      * @return
      */
     @Override
     @Transactional
-    public TRBasicInfo getReportView(TRBasicInfo trBasicInfo, MarkPaper markPaper, Long userId, ObeCourseWeightResult obeCourseWeightResult, Long cultureProgramId, Long courseId) {
+    public List<TRBasicInfo> getReportView(MarkPaper markPaper, Long userId, ObeCourseWeightResult obeCourseWeightResult, Long cultureProgramId, Long courseId, Long examId, String paperNumber) {
         ObeCourseOutline obeCourseOutline = obeCourseOutlineService.findByCultureProgramIdAndCourseId(cultureProgramId, courseId);
         Objects.requireNonNull(obeCourseOutline, "未找到课程大纲信息");
         BasicSemester basicSemester = basicSemesterService.getById(obeCourseOutline.getSemesterId());
         Objects.requireNonNull(basicSemester, "未找到学期信息");
 
-        ReportCourseBasicInfoDto reportCourseBasicInfoDtoBasic = trBasicInfoService.setBasicInfo(trBasicInfo, obeCourseOutline, markPaper, obeCourseWeightResult);
-
-        TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(cultureProgramId, courseId, markPaper.getPaperNumber());
-        //课程目标考核分布-题目信息
-        if (Objects.isNull(tcPaperStruct) || Objects.isNull(tcPaperStruct.getPaperStructDimension())) {
-            throw ExceptionResultEnum.ERROR.exception("未找到试卷蓝图信息");
+        List<TCFinalScore> tcFinalScoreList = tcFinalScoreService.queryFinalScore(cultureProgramId, courseId, Objects.nonNull(paperNumber) ? paperNumber : markPaper.getPaperNumber(), Objects.nonNull(examId) ? examId : markPaper.getExamId(), userId);
+        if (CollectionUtils.isEmpty(tcFinalScoreList)) {
+            throw ExceptionResultEnum.ERROR.exception("未找到期末成绩数据");
         }
-        if (Objects.isNull(trBasicInfo)) {
-            trBasicInfo = new TRBasicInfo(cultureProgramId, courseId, markPaper.getCourseCode(), markPaper.getCourseName(), markPaper.getPaperNumber(), basicSemester.getName(), userId, Objects.nonNull(trBasicInfo) ? trBasicInfo.getCourseSuggest() : null, Objects.nonNull(trBasicInfo) ? trBasicInfo.getCourseEnName() : null, tcPaperStruct.getExamId(), reportCourseBasicInfoDtoBasic);
+        Set<String> teachClassNameSet = new LinkedHashSet<>();
+        String nid = NanoIdUtils.randomNanoId();
+        if (userId.longValue() > 0) {
+            tcFinalScoreList.stream().peek(s -> teachClassNameSet.add(s.getTeachClassName())).collect(Collectors.toSet());
+            teachClassNameSet.add("ALL" + nid);
         } else {
-            trBasicInfo.setBasicInfo(tcPaperStruct.getExamId(), markPaper.getCourseCode(), markPaper.getCourseName(), markPaper.getPaperNumber(), basicSemester.getName(), cultureProgramId, courseId, trBasicInfo.getCourseEnName(), trBasicInfo.getCourseSuggest(), reportCourseBasicInfoDtoBasic);
+            teachClassNameSet.add("ALL" + nid);
         }
-        //课程基本情况
-        ReportCourseBasicInfoDto reportCourseBasicInfoDto = new ReportCourseBasicInfoDto(trBasicInfo);
-        trBasicInfo.getReportResult().setCourseBasicInfo(reportCourseBasicInfoDto);
 
-        List<PaperStructDimensionResult> paperStructDimensionResultList = GsonUtil.fromJson(tcPaperStruct.getPaperStructDimension(), new TypeToken<List<PaperStructDimensionResult>>() {
-        }.getType());
+        List<TRBasicInfo> trBasicInfoList = new ArrayList<>();
+        for (String s : teachClassNameSet) {
+            TRBasicInfo trBasicInfo = null;
+            ReportCourseBasicInfoDto reportCourseBasicInfoDtoBasic = trBasicInfoService.setBasicInfo(trBasicInfo, obeCourseOutline, markPaper, obeCourseWeightResult);
 
-        //课程目标考核分布
-        ReportCourseEvaluationSpreadDto reportCourseEvaluationSpreadDto = new ReportCourseEvaluationSpreadDto(paperStructDimensionResultList);
-        if (Objects.nonNull(reportCourseEvaluationSpreadDto)) {
-            reportCourseEvaluationSpreadDto.setScoreList(trBasicInfoService.getScoreList(trBasicInfo, markPaper));
-            trBasicInfo.setCourseEvaluationSpread(JacksonUtil.parseJson(reportCourseEvaluationSpreadDto));
-            trBasicInfo.getReportResult().setCourseEvaluationSpreadInfo(reportCourseEvaluationSpreadDto);
-        }
+            TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(cultureProgramId, courseId, markPaper.getPaperNumber(), Objects.nonNull(trBasicInfo) ? trBasicInfo.getExamId() : null);
+            //课程目标考核分布-题目信息
+            if (Objects.isNull(tcPaperStruct) || Objects.isNull(tcPaperStruct.getPaperStructDimension())) {
+                throw ExceptionResultEnum.ERROR.exception("未找到试卷蓝图信息");
+            }
+            if (Objects.isNull(trBasicInfo)) {
+                trBasicInfo = new TRBasicInfo(cultureProgramId, courseId, markPaper.getCourseCode(), markPaper.getCourseName(), markPaper.getPaperNumber(), basicSemester.getName(), userId, Objects.nonNull(trBasicInfo) ? trBasicInfo.getCourseSuggest() : null, Objects.nonNull(trBasicInfo) ? trBasicInfo.getCourseEnName() : null, tcPaperStruct.getExamId(), reportCourseBasicInfoDtoBasic);
+            } else {
+                trBasicInfo.setBasicInfo(tcPaperStruct.getExamId(), markPaper.getCourseCode(), markPaper.getCourseName(), markPaper.getPaperNumber(), basicSemester.getName(), cultureProgramId, courseId, trBasicInfo.getCourseEnName(), trBasicInfo.getCourseSuggest(), reportCourseBasicInfoDtoBasic);
+            }
+            if (Objects.nonNull(nid) && !Objects.equals(s, "ALL" + nid)) {
+                trBasicInfo.setTeachClassName(s);
+            }
+            //课程基本情况
+            ReportCourseBasicInfoDto reportCourseBasicInfoDto = new ReportCourseBasicInfoDto(trBasicInfo);
+            trBasicInfo.getReportResult().setCourseBasicInfo(reportCourseBasicInfoDto);
 
-        Map<String, Object> paramsMap = trBasicInfoService.getReportCalculateParams(trBasicInfo, paperStructDimensionResultList, obeCourseWeightResult);
+            List<PaperStructDimensionResult> paperStructDimensionResultList = GsonUtil.fromJson(tcPaperStruct.getPaperStructDimension(), new TypeToken<List<PaperStructDimensionResult>>() {
+            }.getType());
 
-        //课程目标达成评价明细结果-考生集合
-        List<ReportExamStudentDto> examStudentNewList = trExamStudentService.getExamStudentReportDetail(trBasicInfo, paramsMap);
-        ReportCourseEvaluationResultDetailDto reportCourseEvaluationResultDetailDto = new ReportCourseEvaluationResultDetailDto(examStudentNewList);
-        if (Objects.nonNull(reportCourseEvaluationResultDetailDto)) {
-            trBasicInfo.getReportResult().setCourseEvaluationResultDetailInfo(reportCourseEvaluationResultDetailDto);
-        }
+            //课程目标考核分布
+            ReportCourseEvaluationSpreadDto reportCourseEvaluationSpreadDto = new ReportCourseEvaluationSpreadDto(paperStructDimensionResultList);
+            if (Objects.nonNull(reportCourseEvaluationSpreadDto)) {
+                reportCourseEvaluationSpreadDto.setScoreList(trBasicInfoService.getScoreList(trBasicInfo, markPaper));
+                trBasicInfo.setCourseEvaluationSpread(JacksonUtil.parseJson(reportCourseEvaluationSpreadDto));
+                trBasicInfo.getReportResult().setCourseEvaluationSpreadInfo(reportCourseEvaluationSpreadDto);
+            }
 
-        //课程考核成绩评价结果
-        ReportCourseEvaluationResultDto reportCourseEvaluationResultDto = trBasicInfoService.reportCalculateCourseEvaluationResult(trBasicInfo, paramsMap);
-        if (Objects.nonNull(reportCourseEvaluationResultDto)) {
-            trBasicInfo.setCourseEvaluationResult(JacksonUtil.parseJson(reportCourseEvaluationResultDto));
-            trBasicInfo.getReportResult().setCourseEvaluationResultInfo(reportCourseEvaluationResultDto);
-        }
+            Map<String, Object> paramsMap = trBasicInfoService.getReportCalculateParams(trBasicInfo, paperStructDimensionResultList, obeCourseWeightResult);
 
-        //存储数据
-        if (Objects.nonNull(paramsMap.get("targetWordMap"))) {
-            Map<Long, CourseTargetWordDto> targetWordMap = (Map<Long, CourseTargetWordDto>) paramsMap.get("targetWordMap");
-            List<CourseTargetWordDto> courseTargetWordDtoList = new ArrayList<>(targetWordMap.values());
-            Collections.sort(courseTargetWordDtoList);
+            //课程目标达成评价明细结果-考生集合
+            List<ReportExamStudentDto> examStudentNewList = trExamStudentService.getExamStudentReportDetail(trBasicInfo, paramsMap);
+            ReportCourseEvaluationResultDetailDto reportCourseEvaluationResultDetailDto = new ReportCourseEvaluationResultDetailDto(examStudentNewList);
+            if (Objects.nonNull(reportCourseEvaluationResultDetailDto)) {
+                trBasicInfo.getReportResult().setCourseEvaluationResultDetailInfo(reportCourseEvaluationResultDetailDto);
+            }
 
-            Map<Long, CourseTargetWebDto> targetWebMap = (Map<Long, CourseTargetWebDto>) paramsMap.get("targetWebMap");
-            List<CourseTargetWebDto> courseTargetWebDtoList = new ArrayList<>(targetWebMap.values());
-            Collections.sort(courseTargetWebDtoList);
+            //课程考核成绩评价结果
+            ReportCourseEvaluationResultDto reportCourseEvaluationResultDto = trBasicInfoService.reportCalculateCourseEvaluationResult(trBasicInfo, paramsMap);
+            if (Objects.nonNull(reportCourseEvaluationResultDto)) {
+                trBasicInfo.setCourseEvaluationResult(JacksonUtil.parseJson(reportCourseEvaluationResultDto));
+                trBasicInfo.getReportResult().setCourseEvaluationResultInfo(reportCourseEvaluationResultDto);
+            }
+
+            //存储数据
+            if (Objects.nonNull(paramsMap.get("targetWordMap"))) {
+                Map<Long, CourseTargetWordDto> targetWordMap = (Map<Long, CourseTargetWordDto>) paramsMap.get("targetWordMap");
+                List<CourseTargetWordDto> courseTargetWordDtoList = new ArrayList<>(targetWordMap.values());
+                Collections.sort(courseTargetWordDtoList);
 
-            JSONObject jsonObject = new JSONObject();
-            jsonObject.put("targetWordMap", courseTargetWordDtoList);
-            jsonObject.put("targetWebMap", courseTargetWebDtoList);
-            trBasicInfo.setCourseEvaluationResultDetail(jsonObject.toJSONString());
+                Map<Long, CourseTargetWebDto> targetWebMap = (Map<Long, CourseTargetWebDto>) paramsMap.get("targetWebMap");
+                List<CourseTargetWebDto> courseTargetWebDtoList = new ArrayList<>(targetWebMap.values());
+                Collections.sort(courseTargetWebDtoList);
+
+                JSONObject jsonObject = new JSONObject();
+                jsonObject.put("targetWordMap", courseTargetWordDtoList);
+                jsonObject.put("targetWebMap", courseTargetWebDtoList);
+                trBasicInfo.setCourseEvaluationResultDetail(jsonObject.toJSONString());
+            }
+            reportCourseBasicInfoDto.setParticipantCount(examStudentNewList.size() - 3);
+            trBasicInfo.setParticipantCount(examStudentNewList.size() - 3);
+            trBasicInfo.getReportResult().setCommonInfo(new ReportCommonDto(markPaper.getExamId(), markPaper.getCourseCode(), markPaper.getCourseName(), markPaper.getPaperNumber()));
+            trBasicInfo.getReportResult().updateInfo(s, trBasicInfo.getId());
+            if (Objects.nonNull(nid) && Objects.equals(s, "ALL" + nid)) {
+                trBasicInfo.setTeachClassName("ALL");
+                trBasicInfo.setCreateId(-1L);
+            } else {
+                trBasicInfo.setTeachClassName(s);
+            }
+            trBasicInfoList.add(trBasicInfo);
         }
-        reportCourseBasicInfoDto.setParticipantCount(examStudentNewList.size() - 3);
-        trBasicInfo.setParticipantCount(examStudentNewList.size() - 3);
-        trBasicInfo.getReportResult().setCommonInfo(new ReportCommonDto(markPaper.getExamId(), markPaper.getCourseCode(), markPaper.getCourseName(), markPaper.getPaperNumber()));
-        return trBasicInfo;
+        //课程目标达成评价明细结果-课程目标达成评价值图
+        return trBasicInfoList;
     }
 
     /**
@@ -837,16 +885,25 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
      * @param cultureProgramId
      * @param courseId
      * @param paperNumber
+     * @param examId
+     * @param createId
      * @return
      */
     @Override
     @Transactional
-    public Boolean remove(Long cultureProgramId, Long courseId, String paperNumber) {
+    public Boolean remove(Long cultureProgramId, Long courseId, String paperNumber, Long examId, Long createId) {
         QueryWrapper<TRBasicInfo> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(TRBasicInfo::getCultureProgramId, cultureProgramId).eq(TRBasicInfo::getCourseId, courseId);
+        queryWrapper.lambda().eq(TRBasicInfo::getCultureProgramId, cultureProgramId)
+                .eq(TRBasicInfo::getCourseId, courseId);
         if (Objects.nonNull(paperNumber)) {
             queryWrapper.lambda().and(w -> w.eq(TRBasicInfo::getPaperNumber, paperNumber).or().isNull(TRBasicInfo::getPaperNumber));
         }
+        if (Objects.nonNull(examId)) {
+            queryWrapper.lambda().eq(TRBasicInfo::getExamId, examId);
+        }
+        if (Objects.nonNull(createId)) {
+            queryWrapper.lambda().eq(TRBasicInfo::getCreateId, createId);
+        }
         return trBasicInfoService.remove(queryWrapper);
     }
 
@@ -874,7 +931,7 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
         }
 
         ObeCourseOutline obeCourseOutline = obeCourseOutlineService.getById(obeCourseOutlineId);
-        TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(obeCourseOutline.getCultureProgramId(), obeCourseOutline.getCourseId(), null);
+        TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(obeCourseOutline.getCultureProgramId(), obeCourseOutline.getCourseId(), null, null);
         if (Objects.nonNull(tcPaperStruct) && Objects.nonNull(tcPaperStruct.getPaperStructDimension())) {
             List<PaperStructDimensionResult> paperStructDimensionResultList = GsonUtil.fromJson(tcPaperStruct.getPaperStructDimension(), new TypeToken<List<PaperStructDimensionResult>>() {
             }.getType());
@@ -915,18 +972,19 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
      * @param cultureProgramId
      * @param courseId
      * @param paperNumber
+     * @param examId
      * @param clearDimension
      */
     @Override
     @Transactional
-    public void clearReportData(Long cultureProgramId, Long courseId, String paperNumber, boolean clearDimension) {
-        trExamStudentService.remove(cultureProgramId, courseId, paperNumber);
-        trBasicInfoService.remove(cultureProgramId, courseId, paperNumber);
+    public void clearReportData(Long cultureProgramId, Long courseId, String paperNumber, Long examId, boolean clearDimension) {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        trExamStudentService.remove(cultureProgramId, courseId, paperNumber, examId, null);
+        trBasicInfoService.remove(cultureProgramId, courseId, paperNumber, examId, null);
         if (clearDimension) {
-            TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(cultureProgramId, courseId, paperNumber);
+            TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(cultureProgramId, courseId, paperNumber, examId);
             if (Objects.nonNull(tcPaperStruct)) {
                 tcPaperStruct.setPaperStructDimension(null);
-                SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
                 tcPaperStruct.updateInfo(sysUser.getId());
                 tcPaperStructService.updateById(tcPaperStruct);
             }
@@ -1013,8 +1071,9 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
      * @param cultureProgramId
      * @param courseId
      * @param markPaper
+     * @param teachClassName
      */
-    protected void fillScoreRange(FinalScoreDto finalScoreDto, Long examId, String paperNumber, Long cultureProgramId, Long courseId, MarkPaper markPaper) {
+    protected void fillScoreRange(FinalScoreDto finalScoreDto, Long examId, String paperNumber, Long cultureProgramId, Long courseId, MarkPaper markPaper, String teachClassName) {
         //分数区间
         Double passScore = markPaper.getPassScore();//及格分
         Objects.requireNonNull(passScore, "及格分为空");
@@ -1028,20 +1087,20 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
         //开始、结束分数区间
         Double startInterval = 0.5d, endInterval = 9.5d, increaseStartScore = passScore - startInterval,
                 increaseEndScore = increaseStartScore + startInterval + endInterval;
-        scoreRange.add(getScoreRangeVo(finalScoreDto.getStudentCount(), examId, markPaper.getCourseCode(), paperNumber, cultureProgramId, courseId, 1.0d, increaseStartScore));
+        scoreRange.add(getScoreRangeVo(finalScoreDto.getStudentCount(), examId, markPaper.getCourseCode(), paperNumber, cultureProgramId, courseId, 1.0d, increaseStartScore, teachClassName));
         increaseStartScore = increaseStartScore + startInterval;
         increaseEndScore = increaseStartScore + endInterval;
         if (totalScore.doubleValue() - increaseEndScore.doubleValue() == startInterval || increaseEndScore.doubleValue() >= totalScore.doubleValue()) {
             increaseEndScore = totalScore;
-            scoreRange.add(getScoreRangeVo(finalScoreDto.getStudentCount(), examId, markPaper.getCourseCode(), paperNumber, cultureProgramId, courseId, increaseStartScore, increaseEndScore));
+            scoreRange.add(getScoreRangeVo(finalScoreDto.getStudentCount(), examId, markPaper.getCourseCode(), paperNumber, cultureProgramId, courseId, increaseStartScore, increaseEndScore, teachClassName));
         } else {
             while (increaseEndScore.doubleValue() < totalScore.doubleValue()) {
-                scoreRange.add(getScoreRangeVo(finalScoreDto.getStudentCount(), examId, markPaper.getCourseCode(), paperNumber, cultureProgramId, courseId, increaseStartScore, increaseEndScore));
+                scoreRange.add(getScoreRangeVo(finalScoreDto.getStudentCount(), examId, markPaper.getCourseCode(), paperNumber, cultureProgramId, courseId, increaseStartScore, increaseEndScore, teachClassName));
                 increaseStartScore = increaseEndScore + startInterval;
                 increaseEndScore = increaseStartScore + endInterval;
                 if (totalScore.doubleValue() - increaseEndScore.doubleValue() == startInterval || increaseEndScore.doubleValue() >= totalScore.doubleValue()) {
                     increaseEndScore = totalScore;
-                    scoreRange.add(getScoreRangeVo(finalScoreDto.getStudentCount(), examId, markPaper.getCourseCode(), paperNumber, cultureProgramId, courseId, increaseStartScore, increaseEndScore));
+                    scoreRange.add(getScoreRangeVo(finalScoreDto.getStudentCount(), examId, markPaper.getCourseCode(), paperNumber, cultureProgramId, courseId, increaseStartScore, increaseEndScore, teachClassName));
                 }
             }
         }
@@ -1179,10 +1238,11 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
      * @param courseId
      * @param start
      * @param end
+     * @param teachClassName
      * @return
      */
-    protected ScoreRangeVo getScoreRangeVo(int toltal, Long examId, String courseCode, String paperNumber, Long cultureProgramId, Long courseId, Double start, Double end) {
-        int count = tcFinalScoreService.getCountByScoreRange(examId, courseCode, paperNumber, cultureProgramId, courseId, start, end);
+    protected ScoreRangeVo getScoreRangeVo(int toltal, Long examId, String courseCode, String paperNumber, Long cultureProgramId, Long courseId, Double start, Double end, String teachClassName) {
+        int count = tcFinalScoreService.getCountByScoreRange(examId, courseCode, paperNumber, cultureProgramId, courseId, start, end, teachClassName);
         Double rate = null;
         if (toltal != 0) {
             rate = new BigDecimal(count).divide(new BigDecimal(toltal), 4, BigDecimal.ROUND_HALF_UP).multiply(SystemConstant.PERCENT).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();

+ 13 - 3
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/impl/TRExamStudentServiceImpl.java

@@ -215,11 +215,21 @@ public class TRExamStudentServiceImpl extends ServiceImpl<TRExamStudentMapper, T
         return trExamStudentService.remove(new QueryWrapper<TRExamStudent>().lambda().eq(TRExamStudent::getrBasicInfoId, rBasicInfoId));
     }
 
+    /**
+     * 根据考试id/课程编码/试卷编码删除数据
+     *
+     * @param obeCultureProgramId
+     * @param courseId            courseId
+     * @param paperNumber         paperNumber
+     * @param examId
+     * @param createId
+     * @return
+     */
     @Override
     @Transactional
-    public Boolean remove(Long obeCultureProgramId, Long courseId, String paperNumber) {
-        TRBasicInfo trBasicInfo = trBasicInfoService.queryBasicInfo(obeCultureProgramId, courseId, paperNumber);
-        return Objects.nonNull(trBasicInfo) ? trExamStudentService.remove(trBasicInfo.getId()) : false;
+    public Boolean remove(Long obeCultureProgramId, Long courseId, String paperNumber, Long examId, Long createId) {
+        List<TRBasicInfo> trBasicInfoList = trBasicInfoService.queryBasicInfo(obeCultureProgramId, courseId, paperNumber, examId, createId);
+        return !CollectionUtils.isEmpty(trBasicInfoList) ? trExamStudentService.removeByIds(trBasicInfoList.stream().map(s -> s.getId()).collect(Collectors.toList())) : false;
     }
 
     @Override

+ 45 - 0
teachcloud-obe/src/main/resources/mapper/TCFinalScoreMapper.xml

@@ -11,6 +11,15 @@
             <if test="courseId != null and courseId != ''">
                 and t.course_id = #{courseId}
             </if>
+            <if test="examId != null and examId != ''">
+                and t.exam_id = #{examId}
+            </if>
+            <if test="paperNumber != null and paperNumber != ''">
+                and t.paper_number = #{paperNumber}
+            </if>
+            <if test="userId != null and userId != ''">
+                and t.create_id = #{userId}
+            </if>
         </where>
         order by t.student_code
     </select>
@@ -28,6 +37,18 @@
             </if>
             <if test="courseId != null and courseId != ''">
                 and tcfs.course_id = #{courseId}
+            </if>
+            <if test="examId != null and examId != ''">
+                and tcfs.exam_id = #{examId}
+            </if>
+            <if test="paperNumber != null and paperNumber != ''">
+                and tcfs.paper_number = #{paperNumber}
+            </if>
+            <if test="userId != null and userId != ''">
+                and tcfs.create_id = #{userId}
+            </if>
+            <if test="teachClassName != null and teachClassName != ''">
+                and tcfs.teach_class_name = #{teachClassName}
             </if>
                 and tcfs.enable = true and tcus.enable = true
         </where>
@@ -42,6 +63,18 @@
             </if>
             <if test="courseId != null and courseId != ''">
                 and tcfs.course_id = #{courseId}
+            </if>
+            <if test="examId != null and examId != ''">
+                and tcfs.exam_id = #{examId}
+            </if>
+            <if test="paperNumber != null and paperNumber != ''">
+                and tcfs.paper_number = #{paperNumber}
+            </if>
+            <if test="userId != null and userId != ''">
+                and tcfs.create_id = #{userId}
+            </if>
+            <if test="teachClassName != null and teachClassName != ''">
+                and tcfs.teach_class_name = #{teachClassName}
             </if>
                 and tcfs.score &gt;= #{start} and tcfs.score &lt;= #{end}
                 and tcfs.enable = true and tcus.enable = true
@@ -64,6 +97,18 @@
             </if>
             <if test="courseId != null and courseId != ''">
                 and tcfs.course_id = #{courseId}
+            </if>
+            <if test="examId != null and examId != ''">
+                and tcfs.exam_id = #{examId}
+            </if>
+            <if test="paperNumber != null and paperNumber != ''">
+                and tcfs.paper_number = #{paperNumber}
+            </if>
+            <if test="userId != null and userId != ''">
+                and tcfs.create_id = #{userId}
+            </if>
+            <if test="teachClassName != null and teachClassName != ''">
+                and tcfs.teach_class_name = #{teachClassName}
             </if>
                 and tcfs.enable = true and tcus.enable = true
         </where>

+ 18 - 11
teachcloud-obe/src/main/resources/mapper/TCUsualScoreMapper.xml

@@ -3,7 +3,7 @@
 <mapper namespace="com.qmth.teachcloud.obe.mapper.TCUsualScoreMapper">
 
     <select id="scoreList" resultType="com.qmth.teachcloud.obe.been.result.ObeScoreResult">
-        SELECT
+        SELECT distinct
             oco.id AS obeCourseOutlineId,
             oco.name AS obeCourseOutlineName,
             bc.id AS courseId,
@@ -15,17 +15,18 @@
             ocp.name AS cultureProgramName,
             su.id AS userId,
             su.real_name AS userName,
-            su.login_name AS userLoginName
+            su.login_name AS userLoginName,
+            oco.create_time,
+            tcfs.exam_id as examId,
+            tcfs.paper_number as paperNumber
         FROM
             obe_course_outline oco
-        LEFT JOIN
-            basic_course bc ON oco.course_id = bc.id
-        LEFT JOIN
-            basic_semester bs ON oco.semester_id = bs.id
-        LEFT JOIN
-            sys_user su ON oco.user_id = su.id
-        LEFT JOIN
-            obe_culture_program ocp ON ocp.id = oco.culture_program_id
+        LEFT JOIN basic_course bc ON oco.course_id = bc.id
+        LEFT JOIN basic_semester bs ON oco.semester_id = bs.id
+        LEFT JOIN sys_user su ON oco.user_id = su.id
+        LEFT JOIN obe_culture_program ocp ON ocp.id = oco.culture_program_id
+        LEFT JOIN basic_exam_student bes on bes.course_id = oco.course_id and bes.school_id  = oco.school_id and bes.semester_id = bs.id
+        LEFT JOIN t_c_final_score tcfs on tcfs.culture_program_id = oco.culture_program_id and tcfs.course_id = oco.course_id
         <where>
             AND oco.school_id = #{schoolId}
             <if test="cultureProgramId != null">
@@ -39,7 +40,7 @@
             </if>
             <if test="dpr != null">
                 <if test="dpr.requestUserId != null">
-                    AND oco.user_id = #{dpr.requestUserId}
+                    AND bes.teacher_id = #{dpr.requestUserId}
                 </if>
                 <if test="dpr.courseUserId != null">
                     AND EXISTS( SELECT 1 FROM (select course_id from teach_course where user_id = #{dpr.courseUserId}) tc WHERE tc.course_id = bc.id)
@@ -67,6 +68,12 @@
             <if test="paperNumber != null and paperNumber != ''">
                 and t.paper_number = #{paperNumber}
             </if>
+            <if test="examId != null and examId != ''">
+                and t.exam_id = #{examId}
+            </if>
+            <if test="userId != null and userId != ''">
+                and t.create_id = #{userId}
+            </if>
         </where>
         order by t.student_code
     </select>