Prechádzať zdrojové kódy

新增报告数据发生改变接口

wangliang 1 rok pred
rodič
commit
fb5c74cfd6

+ 22 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/TCFinalScoreDto.java

@@ -0,0 +1,22 @@
+package com.qmth.distributed.print.business.bean.dto;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 期末考试成绩dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2024/3/15
+ */
+public class TCFinalScoreDto extends TCUsualScoreDto implements Serializable {
+
+    public TCFinalScoreDto() {
+
+    }
+
+    public TCFinalScoreDto(String score, String name) {
+        setScore(score);
+        setName(name);
+    }
+}

+ 9 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/TCUsualScoreDto.java

@@ -19,6 +19,15 @@ public class TCUsualScoreDto implements Serializable {
     @ApiModelProperty(value = "名称")
     private String name;
 
+    public TCUsualScoreDto() {
+
+    }
+
+    public TCUsualScoreDto(String score, String name) {
+        this.score = score;
+        this.name = name;
+    }
+
     public String getScore() {
         return score;
     }

+ 63 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/report/ReportChangeResult.java

@@ -0,0 +1,63 @@
+package com.qmth.distributed.print.business.bean.result.report;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 报告是否发生变化result
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2024/3/15
+ */
+public class ReportChangeResult implements Serializable {
+
+    @ApiModelProperty(value = "课程目标是否发生变化")
+    private boolean courseTargetChange;
+
+    @ApiModelProperty(value = "评价方式是否发生变化")
+    private boolean evaluationChange;
+
+    @ApiModelProperty(value = "知识点是否发生变化")
+    private boolean dimensionChange;
+
+    @ApiModelProperty(value = "权重是否发生变化")
+    private boolean weightChange;
+
+    public ReportChangeResult(){
+
+    }
+
+    public boolean isCourseTargetChange() {
+        return courseTargetChange;
+    }
+
+    public void setCourseTargetChange(boolean courseTargetChange) {
+        this.courseTargetChange = courseTargetChange;
+    }
+
+    public boolean isEvaluationChange() {
+        return evaluationChange;
+    }
+
+    public void setEvaluationChange(boolean evaluationChange) {
+        this.evaluationChange = evaluationChange;
+    }
+
+    public boolean isDimensionChange() {
+        return dimensionChange;
+    }
+
+    public void setDimensionChange(boolean dimensionChange) {
+        this.dimensionChange = dimensionChange;
+    }
+
+    public boolean isWeightChange() {
+        return weightChange;
+    }
+
+    public void setWeightChange(boolean weightChange) {
+        this.weightChange = weightChange;
+    }
+}

+ 0 - 12
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TCUsualScore.java

@@ -51,10 +51,6 @@ public class TCUsualScore extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "是否启用,0:停用,1:启用")
     private Boolean enable;
 
-    @ApiModelProperty(value = "评价方式是否发生变化")
-    @TableField(exist = false)
-    private boolean change;
-
     public TCUsualScore() {
 
     }
@@ -74,14 +70,6 @@ public class TCUsualScore extends BaseEntity implements Serializable {
         this.score = tcUsualScore.getScore();
     }
 
-    public boolean isChange() {
-        return change;
-    }
-
-    public void setChange(boolean change) {
-        this.change = change;
-    }
-
     public Long getExamId() {
         return examId;
     }

+ 8 - 15
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TCFinalScoreServiceImpl.java

@@ -1,7 +1,5 @@
 package com.qmth.distributed.print.business.service.impl;
 
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -9,6 +7,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.dto.FinalScoreDto;
+import com.qmth.distributed.print.business.bean.dto.TCFinalScoreDto;
 import com.qmth.distributed.print.business.bean.result.FinalScoreResult;
 import com.qmth.distributed.print.business.entity.TCFinalScore;
 import com.qmth.distributed.print.business.enums.SourceEnum;
@@ -122,11 +121,10 @@ public class TCFinalScoreServiceImpl extends ServiceImpl<TCFinalScoreMapper, TCF
                             throw ExceptionResultEnum.ERROR.exception("excel列和数据不匹配");
                         }
                         boolean error = false;
-                        JSONArray jsonArray = new JSONArray();
+                        List<TCFinalScoreDto> tcFinalScoreDtoList = new ArrayList<>();
                         TCFinalScore tcFinalScore = new TCFinalScore(examId, courseCode, markPaper.getCourseName(), paperNumber, SourceEnum.EXCEL_IMPORT, sysUser.getId());
                         BigDecimal score = new BigDecimal(0);
                         for (int j = 0; j < strs.length; j++) {
-                            JSONObject jsonObject = new JSONObject();
                             if (Objects.isNull(strs[j]) || Objects.equals(strs[j].trim(), "")) {
                                 errorData.add("excel第").add((i + 1) + "").add("行[").add(columnNames[j] + "]为空;").add("\r\n");
                                 error = true;
@@ -139,20 +137,18 @@ public class TCFinalScoreServiceImpl extends ServiceImpl<TCFinalScoreMapper, TCF
                                     tcFinalScore.setScore(Double.valueOf(strs[j]));
                                 } else {
                                     score = score.add(new BigDecimal(strs[j]));
-                                    jsonObject.put("name", columnNames[j]);
-                                    jsonObject.put("score", strs[j]);
-                                    jsonArray.add(jsonObject);
+                                    tcFinalScoreDtoList.add(new TCFinalScoreDto(strs[j], columnNames[j]));
                                 }
                             }
                         }
-                        if (jsonArray.size() > 0) {
+                        if (CollectionUtils.isNotEmpty(tcFinalScoreDtoList)) {
                             if (score.doubleValue() > totalScore.doubleValue()) {
                                 errorData.add("excel第").add((i + 1) + "").add("行[总分大于试卷总分]").add("\r\n");
                                 error = true;
                             } else {
                                 score = score.setScale(2, BigDecimal.ROUND_HALF_UP);
                                 tcFinalScore.setScore(score.doubleValue());
-                                tcFinalScore.setScoreDetail(jsonArray.toJSONString());
+                                tcFinalScore.setScoreDetail(JacksonUtil.parseJson(tcFinalScoreDtoList));
                             }
                         }
                         if (!error) {
@@ -270,15 +266,12 @@ public class TCFinalScoreServiceImpl extends ServiceImpl<TCFinalScoreMapper, TCF
                 List<TCFinalScore> tcFinalScoreList = new ArrayList<>(markStudentScoreVoList.size());
                 for (MarkStudentScoreVo markStudentScoreVo : markStudentScoreVoList) {
                     if (!CollectionUtils.isEmpty(markStudentScoreVo.getTotalScoreList())) {
-                        JSONArray jsonArray = new JSONArray();
+                        List<TCFinalScoreDto> tcFinalScoreDtoList = new ArrayList<>();
                         for (ScoreItem scoreItem : markStudentScoreVo.getTotalScoreList()) {
-                            JSONObject jsonObject = new JSONObject();
                             String name = scoreItem.getMainNumber() + "-" + scoreItem.getSubNumber();
-                            jsonObject.put("name", name);
-                            jsonObject.put("score", scoreItem.getScore());
-                            jsonArray.add(jsonObject);
+                            tcFinalScoreDtoList.add(new TCFinalScoreDto(scoreItem.getScore().toString(), name));
                         }
-                        tcFinalScoreList.add(new TCFinalScore(markStudentScoreVo, jsonArray.toJSONString(), SourceEnum.SYNC, sysUser.getId()));
+                        tcFinalScoreList.add(new TCFinalScore(markStudentScoreVo, JacksonUtil.parseJson(tcFinalScoreDtoList), SourceEnum.SYNC, sysUser.getId()));
                     }
                 }
                 if (!CollectionUtils.isEmpty(tcFinalScoreList)) {

+ 5 - 10
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TCUsualScoreServiceImpl.java

@@ -1,13 +1,12 @@
 package com.qmth.distributed.print.business.service.impl;
 
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 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.dto.TCUsualScoreDto;
 import com.qmth.distributed.print.business.entity.TCUsualScore;
 import com.qmth.distributed.print.business.mapper.TCUsualScoreMapper;
 import com.qmth.distributed.print.business.service.PrintCommonService;
@@ -101,10 +100,9 @@ public class TCUsualScoreServiceImpl extends ServiceImpl<TCUsualScoreMapper, TCU
                             throw ExceptionResultEnum.ERROR.exception("excel列和数据不匹配");
                         }
                         boolean error = false;
-                        JSONArray jsonArray = new JSONArray();
+                        List<TCUsualScoreDto> tcUsualScoreDtoList = new ArrayList<>();
                         TCUsualScore tcUsualScore = new TCUsualScore(examId, courseCode, markPaper.getCourseName(), paperNumber, sysUser.getId());
                         for (int j = 0; j < strs.length; j++) {
-                            JSONObject jsonObject = new JSONObject();
                             if (Objects.isNull(strs[j]) || Objects.equals(strs[j].trim(), "")) {
                                 errorData.add("excel第").add((i + 1) + "").add("行[").add(columnNames[j] + "]为空;").add("\r\n");
                                 error = true;
@@ -119,16 +117,13 @@ public class TCUsualScoreServiceImpl extends ServiceImpl<TCUsualScoreMapper, TCU
                                         errorData.add("excel第").add((i + 1) + "").add("行[").add(columnNames[j]).add("总分大于试卷总分]").add("\r\n");
                                         error = true;
                                     } else {
-                                        jsonObject.put("name", columnNames[j]);
-                                        jsonObject.put("score", strs[j]);
-                                        jsonArray.add(jsonObject);
+                                        tcUsualScoreDtoList.add(new TCUsualScoreDto(strs[j], columnNames[j]));
                                     }
                                 }
                             }
                         }
-                        if (jsonArray.size() > 0) {
-//                            jsonArray.sort(Comparator.comparing(obj -> ((JSONObject) obj).getString("name")));
-                            tcUsualScore.setScore(jsonArray.toJSONString());
+                        if (CollectionUtils.isNotEmpty(tcUsualScoreDtoList)) {
+                            tcUsualScore.setScore(JacksonUtil.parseJson(tcUsualScoreDtoList));
                         }
                         if (!error) {
                             tcUsualScoreList.add(tcUsualScore);

+ 12 - 15
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TRBasicInfoServiceImpl.java

@@ -9,10 +9,7 @@ import com.deepoove.poi.data.style.CellStyle;
 import com.deepoove.poi.data.style.ParagraphStyle;
 import com.deepoove.poi.data.style.RowStyle;
 import com.google.gson.reflect.TypeToken;
-import com.qmth.distributed.print.business.bean.dto.CourseWeightDetailDto;
-import com.qmth.distributed.print.business.bean.dto.CourseWeightDto;
-import com.qmth.distributed.print.business.bean.dto.ExamStudentDto;
-import com.qmth.distributed.print.business.bean.dto.FinalScoreDto;
+import com.qmth.distributed.print.business.bean.dto.*;
 import com.qmth.distributed.print.business.bean.dto.report.*;
 import com.qmth.distributed.print.business.bean.result.CourseWeightResult;
 import com.qmth.distributed.print.business.bean.result.FinalScoreResult;
@@ -194,11 +191,11 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
             examStudentList = new ArrayList<>(finalScoreResultList.size());
             for (FinalScoreResult finalScoreResult : finalScoreResultList) {
                 //解析期末成绩知识点
-                JSONArray finalScoreDetailJsonArray = JSONArray.parseArray(finalScoreResult.getFinalScoreDetail());
-                for (int i = 0; i < finalScoreDetailJsonArray.size(); i++) {
-                    JSONObject jsonObject = finalScoreDetailJsonArray.getJSONObject(i);
-                    Double score = Objects.nonNull(jsonObject.get("score")) ? Double.parseDouble(jsonObject.get("score").toString()) : 0d;
-                    PaperStructResult paperStructResult = paperStructResultMap.get(jsonObject.get("name").toString());
+                List<TCFinalScoreDto> tcFinalScoreDtoList = GsonUtil.fromJson(finalScoreResult.getFinalScoreDetail(), new TypeToken<List<TCFinalScoreDto>>() {
+                }.getType());
+                for (TCFinalScoreDto t : tcFinalScoreDtoList) {
+                    Double score = Objects.nonNull(t.getScore()) ? Double.parseDouble(t.getScore().toString()) : 0d;
+                    PaperStructResult paperStructResult = paperStructResultMap.get(t.getName().toString());
                     if (Objects.nonNull(paperStructResult)) {
                         List<CourseTargetWebDto> courseTargetDtoList = paperStructResult.getTargetList();
                         for (CourseTargetWebDto courseTargetDto : courseTargetDtoList) {
@@ -955,16 +952,16 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
                                                                               Map<String, ReportEvaluationDto> usualScoreMap,
                                                                               Map<Long, CourseTargetWordDto> targetWordMap) {
         BigDecimal bigDecimal = new BigDecimal(100);
-        JSONArray usualScoreJsonArray = JSONArray.parseArray(finalScoreResult.getUsualScore());
+        List<TCUsualScoreDto> tcUsualScoreDtoList = GsonUtil.fromJson(finalScoreResult.getUsualScore(), new TypeToken<List<TCUsualScoreDto>>() {
+        }.getType());
         Map<Long, List<ReportExamStudentUsualScoreObjDto>> scoreListMap = new LinkedHashMap<>();
         ReportExamStudentUsualScoreDto reportExamStudentUsualScoreDto = new ReportExamStudentUsualScoreDto(scoreListMap);
-        for (int i = 0; i < usualScoreJsonArray.size(); i++) {
-            JSONObject jsonObject = usualScoreJsonArray.getJSONObject(i);
-            if (usualScoreMap.containsKey(jsonObject.get("name"))) {
-                ReportEvaluationDto reportEvaluationDto = usualScoreMap.get(jsonObject.get("name").toString());
+        for (TCUsualScoreDto t : tcUsualScoreDtoList) {
+            if (usualScoreMap.containsKey(t.getName())) {
+                ReportEvaluationDto reportEvaluationDto = usualScoreMap.get(t.getName());
                 List<ReportExamStudentUsualScoreObjDto> reportExamStudentUsualScoreObjDtoList = !scoreListMap.containsKey(reportEvaluationDto.getTargetId()) ? new ArrayList<>() : scoreListMap.get(reportEvaluationDto.getTargetId());
                 //计算平时作业转换
-                Double score = Objects.nonNull(jsonObject.get("score")) ? Double.parseDouble(jsonObject.get("score").toString()) : 0d;
+                Double score = Objects.nonNull(t.getScore()) ? Double.parseDouble(t.getScore()) : 0d;
                 CourseTargetWordDto courseTargetWordDto = targetWordMap.get(reportEvaluationDto.getTargetId());
                 UsualScoreWordDto usualScoreWordDto = courseTargetWordDto.getUsualScoreDto();
                 Double matrixScore = new BigDecimal(score).divide(bigDecimal, 2, BigDecimal.ROUND_HALF_UP).multiply(reportEvaluationDto.getTargetScore()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();

+ 12 - 1
distributed-print/install/mysql/upgrade/3.3.1.sql

@@ -612,4 +612,15 @@ ALTER TABLE `teach_course`
     ADD COLUMN `dimension_sign` BIGINT NULL COMMENT '知识点标识' AFTER `weight_setting_sign`;
 
 ALTER TABLE t_c_paper_struct ADD dimension_sign BIGINT NULL COMMENT '知识点变化id';
-ALTER TABLE t_c_paper_struct CHANGE dimension_sign dimension_sign BIGINT NULL COMMENT '知识点变化id' AFTER enable;
+ALTER TABLE t_c_paper_struct CHANGE dimension_sign dimension_sign BIGINT NULL COMMENT '知识点变化id' AFTER enable;
+
+-- 2014/03/15
+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', enable=1, default_auth=0, front_display=1
+WHERE id=2006;
+UPDATE sys_privilege
+SET name='查看报告', url='View', `type`='LINK', parent_id=2002, `sequence`=1, property='AUTH', related='2026,2027,2028,2031', enable=1, default_auth=0, front_display=1
+WHERE id=2025;
+INSERT INTO sys_privilege
+(id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display)
+VALUES(2031, '报告数据发生变化', '/api/admin/course/degree/report/change', 'URL', 2006, 1, 'AUTH', NULL, 1, 1, 1);

+ 5 - 37
distributed-print/src/main/java/com/qmth/distributed/print/api/TCUsualScoreController.java

@@ -1,12 +1,9 @@
 package com.qmth.distributed.print.api;
 
-import com.alibaba.fastjson.JSONArray;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.distributed.print.business.bean.dto.CourseWeightDetailDto;
 import com.qmth.distributed.print.business.bean.dto.CourseWeightDto;
-import com.qmth.distributed.print.business.bean.dto.TCUsualScoreDto;
 import com.qmth.distributed.print.business.bean.excel.ExcelField;
 import com.qmth.distributed.print.business.bean.result.CourseWeightResult;
 import com.qmth.distributed.print.business.bean.result.EditResult;
@@ -22,7 +19,6 @@ import com.qmth.teachcloud.common.enums.log.CustomizedOperationTypeEnum;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import io.swagger.annotations.*;
-import org.apache.commons.collections4.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -36,7 +32,10 @@ import javax.validation.Valid;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 import java.io.IOException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 /**
@@ -119,38 +118,7 @@ public class TCUsualScoreController {
                                  @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber,
                                  @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 {
-        IPage<TCUsualScore> tcUsualScoreIPage = tcUsualScoreService.usualScoreList(new Page<>(pageNumber, pageSize), examId, courseCode, paperNumber);
-        if (Objects.nonNull(tcUsualScoreIPage) && CollectionUtils.isNotEmpty(tcUsualScoreIPage.getRecords())) {
-            Set<String> usualScoreSet = new LinkedHashSet<>();
-            Set<String> usualScoreCourseSet = new LinkedHashSet<>();
-            tcUsualScoreIPage.getRecords().stream().peek(e -> {
-                List<TCUsualScoreDto> tcUsualScoreDtoList = JSONArray.parseArray(e.getScore(), TCUsualScoreDto.class);
-                usualScoreSet.addAll(tcUsualScoreDtoList.stream().map(s -> s.getName()).collect(Collectors.toList()));
-            }).collect(Collectors.toSet());
-
-            List<CourseWeightDto> courseWeightDtoList = trBasicInfoService.findCourseWeightDtoRmi(examId, courseCode);
-            if (CollectionUtils.isNotEmpty(courseWeightDtoList)) {
-                courseWeightDtoList.stream().peek(e -> {
-                    List<CourseWeightDetailDto> courseWeightDetailDtoList = e.getEvaluationList();
-                    courseWeightDetailDtoList.stream().peek(s -> {
-                        if (!Objects.equals(s.getEvaluationName(), "期末考试")) {
-                            usualScoreCourseSet.add(s.getEvaluationName());
-                        }
-                    }).collect(Collectors.toList());
-                }).collect(Collectors.toList());
-            }
-
-            if (CollectionUtils.isNotEmpty(usualScoreSet) && CollectionUtils.isNotEmpty(usualScoreCourseSet)) {
-                List<String> usualScoreList = new ArrayList<>(usualScoreSet);
-                List<String> usualScoreCourseList = new ArrayList<>(usualScoreCourseSet);
-                Collections.sort(usualScoreList);
-                Collections.sort(usualScoreCourseList);
-                if (!CollectionUtils.isEqualCollection(usualScoreList, usualScoreCourseList)) {
-                    tcUsualScoreIPage.getRecords().get(0).setChange(true);
-                }
-            }
-        }
-        return ResultUtil.ok(tcUsualScoreIPage);
+        return ResultUtil.ok(tcUsualScoreService.usualScoreList(new Page<>(pageNumber, pageSize), examId, courseCode, paperNumber));
     }
 
     @ApiOperation(value = "平时成绩编辑")

+ 64 - 6
distributed-print/src/main/java/com/qmth/distributed/print/api/TRBasicInfoController.java

@@ -8,19 +8,21 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.deepoove.poi.XWPFTemplate;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.boot.api.exception.ApiException;
+import com.qmth.distributed.print.business.bean.dto.CourseWeightDetailDto;
+import com.qmth.distributed.print.business.bean.dto.CourseWeightDto;
+import com.qmth.distributed.print.business.bean.dto.TCUsualScoreDto;
 import com.qmth.distributed.print.business.bean.dto.report.*;
 import com.qmth.distributed.print.business.bean.result.CourseWeightResult;
 import com.qmth.distributed.print.business.bean.result.ScoreResult;
+import com.qmth.distributed.print.business.bean.result.report.ReportChangeResult;
 import com.qmth.distributed.print.business.bean.result.report.ReportResult;
 import com.qmth.distributed.print.business.bean.result.report.word.CourseBasicBean;
 import com.qmth.distributed.print.business.bean.result.report.word.CourseReportBean;
 import com.qmth.distributed.print.business.entity.TCPaperStruct;
+import com.qmth.distributed.print.business.entity.TCUsualScore;
 import com.qmth.distributed.print.business.entity.TRBasicInfo;
 import com.qmth.distributed.print.business.entity.TRExamStudent;
-import com.qmth.distributed.print.business.service.PrintCommonService;
-import com.qmth.distributed.print.business.service.TCPaperStructService;
-import com.qmth.distributed.print.business.service.TRBasicInfoService;
-import com.qmth.distributed.print.business.service.TRExamStudentService;
+import com.qmth.distributed.print.business.service.*;
 import com.qmth.teachcloud.common.annotation.OperationLogDetail;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicSchool;
@@ -36,9 +38,9 @@ import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
 import com.qmth.teachcloud.mark.service.MarkPaperService;
 import io.swagger.annotations.*;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.io.FileUtils;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
 import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
 
@@ -87,6 +89,9 @@ public class TRBasicInfoController {
     @Resource
     TCPaperStructService tcPaperStructService;
 
+    @Resource
+    TCUsualScoreService tcUsualScoreService;
+
     @ApiOperation(value = "报告管理列表")
     @RequestMapping(value = "/report/list", method = RequestMethod.POST)
     @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.SEARCH)
@@ -200,7 +205,6 @@ public class TRBasicInfoController {
 
                 JSONObject jsonObject = JSONObject.parseObject(trBasicInfo.getCourseEvaluationResultDetail());
                 List<CourseTargetWordDto> courseTargetWordDtoList = JSONArray.parseArray(jsonObject.get("targetWordMap").toString(), CourseTargetWordDto.class);
-                List<CourseTargetWebDto> courseTargetWebDtoList = JSONArray.parseArray(jsonObject.get("targetWebMap").toString(), CourseTargetWebDto.class);
 
                 StringJoiner courseTarget = new StringJoiner("");
                 courseTargetWordDtoList.stream().peek(s -> {
@@ -262,4 +266,58 @@ public class TRBasicInfoController {
             }
         }
     }
+
+    @ApiOperation(value = "报告发生改变")
+    @RequestMapping(value = "/report/change", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "下载成功", response = Object.class)})
+    public Object reportDataChange(@ApiParam(value = "考试id", required = true) @RequestParam Long examId,
+                                   @ApiParam(value = "科目编码", required = true) @RequestParam String courseCode,
+                                   @ApiParam(value = "试卷编号", required = true) @RequestParam String paperNumber) throws IOException {
+        ReportChangeResult reportChangeResult = new ReportChangeResult();
+        List<TCUsualScore> tcUsualScoreList = tcUsualScoreService.list(new QueryWrapper<TCUsualScore>().lambda().eq(TCUsualScore::getExamId, examId).eq(TCUsualScore::getCourseCode, courseCode).eq(TCUsualScore::getPaperNumber, paperNumber));
+        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(examId, courseCode);
+            List<String> courseTargetList = new ArrayList<>(courseWeightDtoList.size());
+            if (CollectionUtils.isNotEmpty(courseWeightDtoList)) {
+                courseWeightDtoList.stream().peek(e -> {
+                    courseTargetList.add(e.getCourseTargetName());
+                    List<CourseWeightDetailDto> courseWeightDetailDtoList = e.getEvaluationList();
+                    courseWeightDetailDtoList.stream().peek(s -> {
+                        if (!Objects.equals(s.getEvaluationName(), "期末考试")) {
+                            usualScoreCourseSet.add(s.getEvaluationName());
+                        }
+                    }).collect(Collectors.toList());
+                }).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.getOne(new QueryWrapper<TRBasicInfo>().lambda().eq(TRBasicInfo::getExamId, examId).eq(TRBasicInfo::getCourseCode, courseCode).eq(TRBasicInfo::getPaperNumber, paperNumber));
+            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);
+                List<String> courseTargetDbList = courseTargetWordDtoList.stream().map(s -> s.getTargetName()).collect(Collectors.toList());
+                if (CollectionUtils.isNotEmpty(courseTargetList) && CollectionUtils.isNotEmpty(courseTargetDbList)) {
+                    Collections.sort(courseTargetList);
+                    Collections.sort(courseTargetDbList);
+                    if (!CollectionUtils.isEqualCollection(courseTargetList, courseTargetDbList)) {
+                        reportChangeResult.setCourseTargetChange(true);
+                    }
+                }
+            }
+        }
+        return ResultUtil.ok(reportChangeResult);
+    }
 }