|
|
|
@ -75,21 +75,31 @@ public class ExamTaskStatisticsDomainServiceImpl implements ExamTaskStatisticsDo |
|
|
|
.divide(BigDecimal.valueOf(totalUserCount), 2, RoundingMode.HALF_UP); |
|
|
|
dto.setParticipationRate(formatValue(participationRate.doubleValue())); |
|
|
|
|
|
|
|
// 6. 计算平均得分 = 累加考试得分 / 已提交记录数
|
|
|
|
double totalScore = submittedRecordList.stream() |
|
|
|
// 6. 每人只取最新一次考试记录,用于计算平均分和通过率
|
|
|
|
List<ExamRecordEntity> latestRecordPerUser = submittedRecordList.stream() |
|
|
|
.collect(Collectors.toMap( |
|
|
|
ExamRecordEntity::getTaskUserId, |
|
|
|
record -> record, |
|
|
|
(r1, r2) -> r1.getSubmitTime().compareTo(r2.getSubmitTime()) >= 0 ? r1 : r2 |
|
|
|
)) |
|
|
|
.values().stream() |
|
|
|
.toList(); |
|
|
|
|
|
|
|
// 7. 计算平均得分 = 每人最新一次得分的累加 / 人数
|
|
|
|
double totalScore = latestRecordPerUser.stream() |
|
|
|
.mapToDouble(record -> record.getScore() != null ? record.getScore() : 0.0) |
|
|
|
.sum(); |
|
|
|
BigDecimal averageScore = BigDecimal.valueOf(totalScore) |
|
|
|
.divide(BigDecimal.valueOf(submittedRecordList.size()), 2, RoundingMode.HALF_UP); |
|
|
|
.divide(BigDecimal.valueOf(latestRecordPerUser.size()), 2, RoundingMode.HALF_UP); |
|
|
|
dto.setAverageScore(formatValue(averageScore.doubleValue())); |
|
|
|
|
|
|
|
// 7. 计算通过率 = 通过的记录数 / 已提交记录数 * 100
|
|
|
|
long passCount = submittedRecordList.stream() |
|
|
|
// 8. 计算通过率 = 最新一次通过的记录数 / 人数 * 100
|
|
|
|
long passCount = latestRecordPerUser.stream() |
|
|
|
.filter(record -> Boolean.TRUE.equals(record.getPass())) |
|
|
|
.count(); |
|
|
|
BigDecimal passRate = BigDecimal.valueOf(passCount) |
|
|
|
.multiply(BigDecimal.valueOf(100)) |
|
|
|
.divide(BigDecimal.valueOf(submittedRecordList.size()), 2, RoundingMode.HALF_UP); |
|
|
|
.divide(BigDecimal.valueOf(latestRecordPerUser.size()), 2, RoundingMode.HALF_UP); |
|
|
|
dto.setPassRate(formatValue(passRate.doubleValue())); |
|
|
|
|
|
|
|
return Result.success(dto); |
|
|
|
|