|
@@ -91,6 +91,10 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
|
|
|
private SysUserService sysUserService;
|
|
|
@Resource
|
|
|
private TAExamCourseDifficultService taExamCourseDifficultService;
|
|
|
+ @Resource
|
|
|
+ private TAExamCourseTeacherDifficultService taExamCourseTeacherDifficultService;
|
|
|
+ @Resource
|
|
|
+ private TAExamCourseTeacherDioService taExamCourseTeacherDioService;
|
|
|
|
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@@ -140,14 +144,14 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
|
|
|
DoubleSummaryStatistics totalStatistics = totalScoreList.stream().collect(Collectors.summarizingDouble(e -> e));
|
|
|
double avgScore = totalStatistics.getAverage();
|
|
|
long passCount = totalScoreList.stream().filter(e -> e >= passScore.doubleValue()).count();
|
|
|
- BigDecimal passRate = BigDecimal.valueOf(passCount).divide(BigDecimal.valueOf(realityCount), 4, BigDecimal.ROUND_HALF_DOWN);
|
|
|
+ BigDecimal passRate = BigDecimal.valueOf(passCount).divide(BigDecimal.valueOf(realityCount), 4, BigDecimal.ROUND_HALF_UP);
|
|
|
|
|
|
// -------------------卷面分------------------------
|
|
|
List<Double> paperTotalScoreList = totalDatasource.stream().filter(e -> !e.getAbsent()).map(e -> e.getTotalScore().doubleValue()).collect(Collectors.toList());
|
|
|
DoubleSummaryStatistics paperTotalStatistics = paperTotalScoreList.stream().collect(Collectors.summarizingDouble(e -> e));
|
|
|
double paperAvgScore = paperTotalStatistics.getAverage();
|
|
|
long paperPassCount = paperTotalScoreList.stream().filter(e -> e >= passScore.doubleValue()).count();
|
|
|
- BigDecimal paperPassRate = BigDecimal.valueOf(paperPassCount).divide(BigDecimal.valueOf(realityCount), 4, BigDecimal.ROUND_HALF_DOWN);
|
|
|
+ BigDecimal paperPassRate = BigDecimal.valueOf(paperPassCount).divide(BigDecimal.valueOf(realityCount), 4, BigDecimal.ROUND_HALF_UP);
|
|
|
|
|
|
|
|
|
|
|
@@ -163,7 +167,7 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
|
|
|
if (pastTotalCount != pastRealityCount + pastAbsentCount) {
|
|
|
throw ExceptionResultEnum.ERROR.exception("考试往届生人数数据异常");
|
|
|
}
|
|
|
- BigDecimal pastRealityRate = BigDecimal.valueOf(pastRealityCount).divide(BigDecimal.valueOf(realityCount), 4, BigDecimal.ROUND_HALF_DOWN);
|
|
|
+ BigDecimal pastRealityRate = BigDecimal.valueOf(pastRealityCount).divide(BigDecimal.valueOf(realityCount), 4, BigDecimal.ROUND_HALF_UP);
|
|
|
|
|
|
/*
|
|
|
该课程应届生成绩分析
|
|
@@ -178,13 +182,13 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
|
|
|
if (currentTotalCount != currentRealityCount + currentAbsentCount) {
|
|
|
throw ExceptionResultEnum.ERROR.exception("考试应届生人数数据异常");
|
|
|
}
|
|
|
- BigDecimal currentRealityRate = BigDecimal.valueOf(currentRealityCount).divide(BigDecimal.valueOf(realityCount), 4, BigDecimal.ROUND_HALF_DOWN);
|
|
|
+ BigDecimal currentRealityRate = BigDecimal.valueOf(currentRealityCount).divide(BigDecimal.valueOf(realityCount), 4, BigDecimal.ROUND_HALF_UP);
|
|
|
|
|
|
// 通过率统计
|
|
|
List<Double> currentScoreList = currentDatasource.stream().filter(e -> !e.getAbsent()).map(e -> e.getAssignedScore().doubleValue()).collect(Collectors.toList());
|
|
|
DoubleSummaryStatistics currentStatistics = currentScoreList.stream().collect(Collectors.summarizingDouble(e -> e));
|
|
|
long currentPassCount = currentScoreList.stream().filter(e -> e >= passScore.doubleValue()).count();
|
|
|
- BigDecimal currentPassRate = BigDecimal.valueOf(currentPassCount).divide(BigDecimal.valueOf(currentRealityCount), 4, BigDecimal.ROUND_HALF_DOWN);
|
|
|
+ BigDecimal currentPassRate = BigDecimal.valueOf(currentPassCount).divide(BigDecimal.valueOf(currentRealityCount), 4, BigDecimal.ROUND_HALF_UP);
|
|
|
|
|
|
// 描述统计
|
|
|
double currentMinScore = currentStatistics.getMin();
|
|
@@ -214,19 +218,19 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
|
|
|
BigDecimal scoreRate;
|
|
|
double standardAvgScore = currentDatasource.stream().collect(Collectors.summarizingDouble(e -> e.getTotalScore().doubleValue())).getAverage();
|
|
|
if (standardAvgScore != 0 && totalScore.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
- scoreRate = BigDecimal.valueOf(standardAvgScore).divide(totalScore, 4, BigDecimal.ROUND_HALF_DOWN);
|
|
|
+ scoreRate = BigDecimal.valueOf(standardAvgScore).divide(totalScore, 4, BigDecimal.ROUND_HALF_UP);
|
|
|
} else {
|
|
|
scoreRate = BigDecimal.ZERO;
|
|
|
}
|
|
|
// 难度系数保留1位数
|
|
|
- scoreRate = scoreRate.setScale(1, BigDecimal.ROUND_HALF_DOWN); // 难度系数保留1位有效数字
|
|
|
+ scoreRate = scoreRate.setScale(1, BigDecimal.ROUND_HALF_UP); // 难度系数保留1位有效数字
|
|
|
String difficulty = this.handleLevel(examId, effectiveCourseCode, "难度等级", scoreRate.doubleValue());
|
|
|
//--------------------------应届-卷面成绩-----------------------
|
|
|
List<Double> paperCurrentScoreList = currentDatasource.stream().filter(e -> !e.getAbsent()).map(e -> e.getTotalScore().doubleValue()).collect(Collectors.toList());
|
|
|
DoubleSummaryStatistics paperCurrentStatistics = paperCurrentScoreList.stream().collect(Collectors.summarizingDouble(e -> e));
|
|
|
double paperCurrentAvgScore = paperCurrentStatistics.getAverage();
|
|
|
long paperCurrentPassCount = paperCurrentScoreList.stream().filter(e -> e >= passScore.doubleValue()).count();
|
|
|
- BigDecimal paperCurrentPassRate = BigDecimal.valueOf(paperCurrentPassCount).divide(BigDecimal.valueOf(currentRealityCount), 4, BigDecimal.ROUND_HALF_DOWN);
|
|
|
+ BigDecimal paperCurrentPassRate = BigDecimal.valueOf(paperCurrentPassCount).divide(BigDecimal.valueOf(currentRealityCount), 4, BigDecimal.ROUND_HALF_UP);
|
|
|
|
|
|
/*
|
|
|
学院信息
|
|
@@ -331,7 +335,7 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
|
|
|
long sameCount = dataSource.stream().filter(e -> e.getTotalScore().compareTo(totalScore) == 0).count(); // 和我相同的人数
|
|
|
int totalCount = dataSource.size(); //总人数
|
|
|
// 标准回归系数
|
|
|
- BigDecimal standardizedCoefficients = (taExamCourseRecord.getAssignedScore().subtract(avgScore)).divide(standardDeviation, 4, BigDecimal.ROUND_HALF_DOWN);
|
|
|
+ BigDecimal standardizedCoefficients = (taExamCourseRecord.getAssignedScore().subtract(avgScore)).divide(standardDeviation, 4, BigDecimal.ROUND_HALF_UP);
|
|
|
|
|
|
int percentGrade = this.handlePercentGrade(BigDecimal.valueOf(lowCount), BigDecimal.valueOf(sameCount), BigDecimal.valueOf(totalCount));
|
|
|
taExamCourseRecord.setPercentGrade(percentGrade);
|
|
@@ -587,6 +591,8 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
|
|
|
for (TAExamCourseRecord taExamCourseRecord : effectiveDatasource) {
|
|
|
Long inspectCollegeId = taExamCourseRecord.getInspectCollegeId();
|
|
|
String inspectCollegeName = sysOrgService.getById(inspectCollegeId).getName();
|
|
|
+ Long teacherId = taExamCourseRecord.getTeacherId();
|
|
|
+ String teacherName = sysUserService.getById(teacherId).getRealName();
|
|
|
List<BasicAnswerDto> oneStudentAnswerDetailDataSource = answerDtoList.stream()
|
|
|
.filter(e -> taExamCourseRecord.getExamRecordId().equals(e.getExamRecordId()))
|
|
|
.collect(Collectors.toList());
|
|
@@ -645,6 +651,8 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
|
|
|
taExamCourseRecordDio.setProficiency(this.handleModuleProficiency(examId, effectiveCourseCode, dimensionType, rate));
|
|
|
taExamCourseRecordDio.setInspectCollegeId(inspectCollegeId);
|
|
|
taExamCourseRecordDio.setInspectCollegeName(inspectCollegeName);
|
|
|
+ taExamCourseRecordDio.setTeacherId(teacherId);
|
|
|
+ taExamCourseRecordDio.setTeacherName(teacherName);
|
|
|
taExamCourseRecordDioList.add(taExamCourseRecordDio);
|
|
|
}
|
|
|
// 考查模块得分率
|
|
@@ -808,6 +816,22 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
|
|
|
return "'t_a_exam_course_college_inspect_dio'表构建完成 ";
|
|
|
}
|
|
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @Override
|
|
|
+ public String buildAnalyzeExamCourseTeacherDio(Long examId, String courseCode) {
|
|
|
+ // 可分析有效课程信息
|
|
|
+ List<String> effectiveCourseCodeList = tbExamCourseService.findEffectiveByExamId(examId, courseCode);
|
|
|
+ for (String effectiveCourseCode : effectiveCourseCodeList) {
|
|
|
+ // 删除原有数据
|
|
|
+ taExamCourseTeacherDioService.remove(new QueryWrapper<TAExamCourseTeacherDio>().lambda()
|
|
|
+ .eq(TAExamCourseTeacherDio::getExamId,examId)
|
|
|
+ .eq(TAExamCourseTeacherDio::getCourseCode,effectiveCourseCode));
|
|
|
+
|
|
|
+ taExamCourseTeacherDioService.insertByTAExamCourseRecordDio(examId, effectiveCourseCode);
|
|
|
+ }
|
|
|
+ return "'t_a_exam_course_teacher_dio'表构建完成 ";
|
|
|
+ }
|
|
|
+
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
@Override
|
|
|
public String buildAnalyzePaperStruct(Long examId, String courseCode) {
|
|
@@ -849,8 +873,8 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
|
|
|
.collect(Collectors.summarizingDouble(e -> e.getScore().doubleValue()));
|
|
|
BigDecimal fullScore = paperStruct.getFullScore();
|
|
|
double scoreAvg = descriptiveStatistics.getAverage();
|
|
|
- BigDecimal scoreRate = BigDecimal.valueOf(scoreAvg).divide(fullScore, 4, BigDecimal.ROUND_HALF_DOWN);
|
|
|
- scoreRate = scoreRate.setScale(1, BigDecimal.ROUND_HALF_DOWN);
|
|
|
+ BigDecimal scoreRate = BigDecimal.valueOf(scoreAvg).divide(fullScore, 4, BigDecimal.ROUND_HALF_UP);
|
|
|
+ scoreRate = scoreRate.setScale(1, BigDecimal.ROUND_HALF_UP);
|
|
|
String difficult = this.analyzeDifficult(examId, effectiveCourseCode, scoreRate.doubleValue());
|
|
|
|
|
|
double validity = this.calculateValidity(oneQuestionAnswerDetailList, fullScore.doubleValue());
|
|
@@ -901,7 +925,9 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
|
|
|
List<TAExamCourseDifficult> taExamCourseDifficultList = new ArrayList<>();
|
|
|
|
|
|
List<TBCommonLevelConfig> configLevelDatasource = tbCommonLevelConfigService.list(new QueryWrapper<TBCommonLevelConfig>().lambda()
|
|
|
- .eq(TBCommonLevelConfig::getExamId, examId).eq(TBCommonLevelConfig::getCourseCode, effectiveCourseCode));// 该科目试题难度情况数据源
|
|
|
+ .eq(TBCommonLevelConfig::getExamId, examId)
|
|
|
+ .eq(TBCommonLevelConfig::getCourseCode, effectiveCourseCode)
|
|
|
+ .eq(TBCommonLevelConfig::getLevelType,"难度等级"));// 该科目试题难度情况数据源
|
|
|
|
|
|
List<TAPaperStruct> questionDatasource = taPaperStructService.list(new QueryWrapper<TAPaperStruct>().lambda()
|
|
|
.eq(TAPaperStruct::getExamId, examId).eq(TAPaperStruct::getCourseCode, effectiveCourseCode));// 该科目试题情况数据源
|
|
@@ -953,6 +979,8 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
|
|
|
taExamCourseDifficult.setExamId(examId);
|
|
|
taExamCourseDifficult.setCourseCode(effectiveCourseCode);
|
|
|
taExamCourseDifficult.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode).getName());
|
|
|
+ taExamCourseDifficult.setPaperId(paperId);
|
|
|
+ taExamCourseDifficult.setPaperType(tbPaperService.getById(paperId).getPaperType());
|
|
|
taExamCourseDifficult.setCollegeId(collegeId);
|
|
|
taExamCourseDifficult.setSchoolId(tbExamService.getById(examId).getSchoolId());
|
|
|
taExamCourseDifficult.setInterpret(interpret);
|
|
@@ -972,6 +1000,96 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
|
|
|
return "'t_a_exam_course_difficult' 表构建完成";
|
|
|
}
|
|
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @Override
|
|
|
+ public String buildExamPaperTeacherDifficult(Long examId, String courseCode) {
|
|
|
+ // 可分析有效课程信息
|
|
|
+ List<String> effectiveCourseCodeList = tbExamCourseService.findEffectiveByExamId(examId, courseCode);
|
|
|
+
|
|
|
+ for (String effectiveCourseCode : effectiveCourseCodeList) {
|
|
|
+ taExamCourseTeacherDifficultService.remove(new QueryWrapper<TAExamCourseTeacherDifficult>().lambda()
|
|
|
+ .eq(TAExamCourseTeacherDifficult::getExamId, examId)
|
|
|
+ .eq(TAExamCourseTeacherDifficult::getCourseCode, effectiveCourseCode));
|
|
|
+
|
|
|
+ List<TAExamCourseTeacherDifficult> taExamCourseTeacherDifficultList = new ArrayList<>();
|
|
|
+
|
|
|
+ List<TBCommonLevelConfig> configLevelDatasource = tbCommonLevelConfigService.list(new QueryWrapper<TBCommonLevelConfig>().lambda()
|
|
|
+ .eq(TBCommonLevelConfig::getExamId, examId)
|
|
|
+ .eq(TBCommonLevelConfig::getCourseCode, effectiveCourseCode)
|
|
|
+ .eq(TBCommonLevelConfig::getLevelType,"难度等级"));// 该科目试题难度情况数据源
|
|
|
+
|
|
|
+ List<TAPaperStruct> questionDatasource = taPaperStructService.list(new QueryWrapper<TAPaperStruct>().lambda()
|
|
|
+ .eq(TAPaperStruct::getExamId, examId).eq(TAPaperStruct::getCourseCode, effectiveCourseCode));// 该科目试题情况数据源
|
|
|
+
|
|
|
+ LinkedList<AnswerDetailBean> answerDetailDatasource = tbAnswerService.findValidAnswerDetailWithPap(examId, effectiveCourseCode);
|
|
|
+ Set<Long> paperTypeList = questionDatasource.stream().map(TAPaperStruct::getPaperId).collect(Collectors.toSet());
|
|
|
+
|
|
|
+ for (Long paperId : paperTypeList) {
|
|
|
+ for (TBCommonLevelConfig levelTemp : configLevelDatasource) {
|
|
|
+ String interpret = levelTemp.getInterpret();
|
|
|
+ String scope = levelTemp.getScope();
|
|
|
+
|
|
|
+ List<TAPaperStruct> questionList = questionDatasource.stream()
|
|
|
+ .filter(e -> paperId.equals(e.getPaperId()) && interpret.equals(e.getDifficult()))
|
|
|
+ .collect(Collectors.toList()); // 题目信息
|
|
|
+
|
|
|
+ List<AnswerDetailBean> answerDetailForSch = answerDetailDatasource.stream()
|
|
|
+ .filter(e -> paperId.equals(e.getPaperId()) && interpret.equals(e.getDifficult()))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ double schAvgScoreRate = answerDetailForSch.stream()
|
|
|
+ .collect(Collectors.summarizingDouble(AnswerDetailBean::getScoreRate))
|
|
|
+ .getAverage();
|
|
|
+
|
|
|
+ // 教师id集合
|
|
|
+ List<Long> teacherIdList = taExamCourseRecordService.list(new QueryWrapper<TAExamCourseRecord>().lambda()
|
|
|
+ .eq(TAExamCourseRecord::getExamId, examId)
|
|
|
+ .eq(TAExamCourseRecord::getCourseCode, effectiveCourseCode)
|
|
|
+ .eq(TAExamCourseRecord::getPaperId, paperId)
|
|
|
+ .eq(TAExamCourseRecord::getAbsent, false)
|
|
|
+ .eq(TAExamCourseRecord::getStudentCurrent, true))
|
|
|
+ .stream()
|
|
|
+ .map(TAExamCourseRecord::getTeacherId).distinct()
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ for (Long teacherId : teacherIdList) {
|
|
|
+ List<AnswerDetailBean> answerDetailForTea = answerDetailForSch.stream()
|
|
|
+ .filter(e -> teacherId.equals(e.getTeacherId())).collect(Collectors.toList());
|
|
|
+
|
|
|
+ double teaAvgScoreRate = answerDetailForTea.stream()
|
|
|
+ .collect(Collectors.summarizingDouble(AnswerDetailBean::getScoreRate))
|
|
|
+ .getAverage();
|
|
|
+
|
|
|
+ // 得分率保留2位小数处理
|
|
|
+ Integer count = questionList.size();
|
|
|
+
|
|
|
+ TAExamCourseTeacherDifficult taExamCourseTeacherDifficult = new TAExamCourseTeacherDifficult();
|
|
|
+ taExamCourseTeacherDifficult.setId(SystemConstant.getDbUuid());
|
|
|
+ taExamCourseTeacherDifficult.setExamId(examId);
|
|
|
+ taExamCourseTeacherDifficult.setPaperId(paperId);
|
|
|
+ taExamCourseTeacherDifficult.setPaperType(tbPaperService.getById(paperId).getPaperType());
|
|
|
+ taExamCourseTeacherDifficult.setCourseCode(effectiveCourseCode);
|
|
|
+ taExamCourseTeacherDifficult.setCourseName(basicCourseService.findByCourseCode(effectiveCourseCode).getName());
|
|
|
+ taExamCourseTeacherDifficult.setTeacherId(teacherId);
|
|
|
+ taExamCourseTeacherDifficult.setTeacherName(sysUserService.getById(teacherId).getRealName());
|
|
|
+ taExamCourseTeacherDifficult.setSchoolId(tbExamService.getById(examId).getSchoolId());
|
|
|
+ taExamCourseTeacherDifficult.setInterpret(interpret);
|
|
|
+ taExamCourseTeacherDifficult.setCount(count);
|
|
|
+ taExamCourseTeacherDifficult.setScope(scope);
|
|
|
+ taExamCourseTeacherDifficult.setSchAvgScoreRate(BigDecimal.valueOf(schAvgScoreRate));
|
|
|
+ taExamCourseTeacherDifficult.setTeaAvgScoreRate(BigDecimal.valueOf(teaAvgScoreRate));
|
|
|
+
|
|
|
+ taExamCourseTeacherDifficultList.add(taExamCourseTeacherDifficult);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ taExamCourseTeacherDifficultService.saveBatch(taExamCourseTeacherDifficultList);
|
|
|
+ }
|
|
|
+
|
|
|
+ return "'t_a_exam_course_teacher_difficult' 表构建完成";
|
|
|
+ }
|
|
|
+
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
@Override
|
|
|
public String buildAnalyzeExamTotal(Long examId) {
|
|
@@ -1291,8 +1409,8 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
|
|
|
private int handlePercentGrade(BigDecimal lowCount, BigDecimal sameCount, BigDecimal totalCount) {
|
|
|
// ((lowCount + sameCount * 0.5) / totalCount) * 100
|
|
|
BigDecimal percentGrade = (lowCount.add(sameCount.multiply(new BigDecimal("0.5"))))
|
|
|
- .divide(totalCount, 4, BigDecimal.ROUND_HALF_DOWN).multiply(new BigDecimal("100"));
|
|
|
- int result = percentGrade.setScale(0, BigDecimal.ROUND_HALF_DOWN).intValue();
|
|
|
+ .divide(totalCount, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"));
|
|
|
+ int result = percentGrade.setScale(0, BigDecimal.ROUND_HALF_UP).intValue();
|
|
|
if (result == 100) {
|
|
|
result = 99;
|
|
|
}
|
|
@@ -1361,7 +1479,7 @@ public class AnalyzeForReportServiceImpl implements AnalyzeForReportService {
|
|
|
double lowCount = examRecordSameCol.stream().filter(e -> e.getAssignedScore().compareTo(taExamCourseRecord.getAssignedScore()) < 0).count();
|
|
|
BigDecimal overCollegeRate;
|
|
|
if (examRecordSameCol.size() > 1) {
|
|
|
- overCollegeRate = BigDecimal.valueOf(lowCount).divide(BigDecimal.valueOf(examRecordSameCol.size() - 1), 4, BigDecimal.ROUND_HALF_DOWN);
|
|
|
+ overCollegeRate = BigDecimal.valueOf(lowCount).divide(BigDecimal.valueOf(examRecordSameCol.size() - 1), 4, BigDecimal.ROUND_HALF_UP);
|
|
|
} else {
|
|
|
overCollegeRate = BigDecimal.ONE;
|
|
|
}
|