diff --git a/src/main/java/cn/teammodel/controller/admin/service/impl/LaborEducationServiceImpl.java b/src/main/java/cn/teammodel/controller/admin/service/impl/LaborEducationServiceImpl.java index ac44cc5..03f7600 100644 --- a/src/main/java/cn/teammodel/controller/admin/service/impl/LaborEducationServiceImpl.java +++ b/src/main/java/cn/teammodel/controller/admin/service/impl/LaborEducationServiceImpl.java @@ -223,10 +223,10 @@ public class LaborEducationServiceImpl implements LaborEducationService { List exams; List res; try { - exams = examRepository.findExamByClassId(String.format(PK.EXAM, findDto.getTmdId()), findDto.getClassId(), findDto.getPeriodId(), findDto.getSubjectId()); - res= appraiseRecordRepository.getRecords(String.format(PK.PK_APPRAISE_RECORD, findDto.getCode()),findDto.getAcademicYearId(), findDto.getClassId(), findDto.getStudentId()); - resMap.put("exams",exams); - resMap.put("res", res); + exams = examRepository.findExamByClassId(String.format(PK.EXAM, findDto.getTmdId()), findDto.getClassId(), findDto.getPeriodId(), findDto.getSubjectId()); + res= appraiseRecordRepository.getRecords(String.format(PK.PK_APPRAISE_RECORD, findDto.getCode()),findDto.getAcademicYearId(), findDto.getClassId(), findDto.getStudentId()); + resMap.put("exams",exams); + resMap.put("res", res); }catch (Exception e){ throw new ServiceException(ErrorCode.SYSTEM_ERROR.getCode(), "数据查询异常"); } @@ -293,9 +293,6 @@ public class LaborEducationServiceImpl implements LaborEducationService { // 获取对应知识块的客观成绩,并转换为基于60分加分的分数 double objectiveScore = knowledgeBlockScores.get(knowledgeBlock); - // 转换为正确率的小数形式(假设原始分是百分比) - double correctRate = objectiveScore / 100.0; - objectiveScore = 60.0 + correctRate * 40.0; // 确保不超过100分 objectiveScore = Math.min(100.0, objectiveScore); // 保留两位小数 @@ -339,21 +336,22 @@ public class LaborEducationServiceImpl implements LaborEducationService { return scores; } - private static @NotNull Map> getStringMapMap(Map> knowledgeBlockToPointsMap, Map> studentKnowledgePointScores) { + private static Map> getStringMapMap( + Map> knowledgeBlockToPointsMap, + Map> studentKnowledgePointScores) { + Map> studentKnowledgeBlockScores = new HashMap<>(); for (Map.Entry> entry : studentKnowledgePointScores.entrySet()) { String studentId = entry.getKey(); Map pointScores = entry.getValue(); Map blockScores = studentKnowledgeBlockScores.computeIfAbsent(studentId, k -> new HashMap<>()); - // 遍历知识块和知识点的映射关系 for (Map.Entry> blockEntry : knowledgeBlockToPointsMap.entrySet()) { String knowledgeBlock = blockEntry.getKey(); List knowledgePoints = blockEntry.getValue(); - // 计算该知识块的总得分和知识点数量 double totalScore = 0.0; - int validPointCount = 0; // 有效知识点数量(有实际得分的知识点) + int validPointCount = 0; for (String knowledgePoint : knowledgePoints) { if (pointScores.containsKey(knowledgePoint)) { totalScore += pointScores.get(knowledgePoint); @@ -361,10 +359,14 @@ public class LaborEducationServiceImpl implements LaborEducationService { } } - // 计算知识块的平均分 - double averageScore = (validPointCount > 0) ? totalScore / validPointCount : 60.0; // 无有效知识点时默认60分 - averageScore = Math.max(60.0, Math.min(100.0, averageScore)); // 确保得分在60-100之间 - blockScores.put(knowledgeBlock, averageScore); + // 关键修改:统一分数转换逻辑 + double averageScore = (validPointCount > 0) ? totalScore / validPointCount : 0.0; // 原始正确率 + double correctRate = averageScore / 100.0; + double convertedScore = 60.0 + (correctRate * 40.0); + convertedScore = Math.min(100.0, convertedScore); + convertedScore = Double.parseDouble(String.format("%.2f", convertedScore)); + + blockScores.put(knowledgeBlock, convertedScore); } } return studentKnowledgeBlockScores; @@ -520,13 +522,13 @@ public class LaborEducationServiceImpl implements LaborEducationService { Map knowledgeTotalScore = new HashMap<>(); // 计算学生的知识点得分率 - List studentScoreRates = calculateStudentScoreRates(studentId, examResults, knowledgeMap, points, knowledgeTotalScore); + List studentScoreRates = calculateStudentScoreRates(studentId, examResults, knowledgeMap, points, knowledgeTotalScore); // 查找知识点对应的节点及其父节点 Map parentNodeScoreRates = new HashMap<>(); Map parentNodeScoreCount = new HashMap<>(); // 记录每个父节点的知识点数量 - for (KnowledgeScoreRate scoreRate : studentScoreRates) { + for (LaborEducationServiceImpl.KnowledgeScoreRate scoreRate : studentScoreRates) { AppraiseTreeNode node = findKnowledgeNode(appraise.getNodes(), scoreRate.getKnowledge()); if (node != null) { AppraiseTreeNode parentNode = findParentNode(appraise.getNodes(), node.getId()); @@ -646,7 +648,7 @@ public class LaborEducationServiceImpl implements LaborEducationService { if (examResults != null && !examResults.isEmpty()) { // 遍历班级中的每个学生 for (ExamClassResult examResult : examResults) { - if (!examResult.getInfo().getId().equals(classId)) continue; // 过滤出该班级的考试 + if (!examResult.getInfo().getId().equals(classId)) continue; List statuses = examResult.getStatus(); for (int i = 0; i < examResult.getStudentIds().size(); i++) { String studentId = examResult.getStudentIds().get(i); @@ -656,15 +658,12 @@ public class LaborEducationServiceImpl implements LaborEducationService { .map(RMember::getName) .orElse("未知"); int status = statuses.get(i); - if (status == 1) continue; // 跳过 status 为 1 的记录 + if (status == 1) continue; - // 计算父节点得分率(客观分数) + // 正确获取已转换的客观分数(无需二次截断) Map scoreRates = calculateKnowledgeScoreRateForStudent( studentId, examResults, knowledgeMap, appraise, points ); - scoreRates.replaceAll((k, v) -> - Math.min(100.0, Math.max(60.0, v)) // 60分打底,最高100分 - ); studentScoreRates.put(name, scoreRates); // 累加班级整体得分率 @@ -673,7 +672,7 @@ public class LaborEducationServiceImpl implements LaborEducationService { } } } - } else { + }else { // 无考试数据时,初始化所有学生的默认分数为60 if (groupList != null) { for (RMember member : groupList.members) { @@ -821,7 +820,7 @@ public class LaborEducationServiceImpl implements LaborEducationService { } - private static List calculateStudentScoreRates( + private static List calculateStudentScoreRates( String studentId, List examResults, Map>> knowledgeMap, @@ -840,7 +839,7 @@ public class LaborEducationServiceImpl implements LaborEducationService { knowledgeTotalScore.put(knowledge, 60.0); // 默认60分 } return knowledgeTotalScore.entrySet().stream() - .map(entry -> new KnowledgeScoreRate(entry.getKey(), entry.getValue())) + .map(entry -> new LaborEducationServiceImpl.KnowledgeScoreRate(entry.getKey(), entry.getValue())) .collect(Collectors.toList()); } @@ -921,7 +920,7 @@ public class LaborEducationServiceImpl implements LaborEducationService { } return knowledgeTotalScore.entrySet().stream() - .map(entry -> new KnowledgeScoreRate(entry.getKey(), entry.getValue())) + .map(entry -> new LaborEducationServiceImpl.KnowledgeScoreRate(entry.getKey(), entry.getValue())) .collect(Collectors.toList()); } diff --git a/src/main/java/cn/teammodel/controller/admin/service/impl/MoralEducationServiceImpl.java b/src/main/java/cn/teammodel/controller/admin/service/impl/MoralEducationServiceImpl.java index 2cb7184..c466ed6 100644 --- a/src/main/java/cn/teammodel/controller/admin/service/impl/MoralEducationServiceImpl.java +++ b/src/main/java/cn/teammodel/controller/admin/service/impl/MoralEducationServiceImpl.java @@ -293,9 +293,6 @@ public class MoralEducationServiceImpl implements MoralEducationService { // 获取对应知识块的客观成绩,并转换为基于60分加分的分数 double objectiveScore = knowledgeBlockScores.get(knowledgeBlock); - // 转换为正确率的小数形式(假设原始分是百分比) - double correctRate = objectiveScore / 100.0; - objectiveScore = 60.0 + correctRate * 40.0; // 确保不超过100分 objectiveScore = Math.min(100.0, objectiveScore); // 保留两位小数 @@ -339,21 +336,22 @@ public class MoralEducationServiceImpl implements MoralEducationService { return scores; } - private static @NotNull Map> getStringMapMap(Map> knowledgeBlockToPointsMap, Map> studentKnowledgePointScores) { + private static Map> getStringMapMap( + Map> knowledgeBlockToPointsMap, + Map> studentKnowledgePointScores) { + Map> studentKnowledgeBlockScores = new HashMap<>(); for (Map.Entry> entry : studentKnowledgePointScores.entrySet()) { String studentId = entry.getKey(); Map pointScores = entry.getValue(); Map blockScores = studentKnowledgeBlockScores.computeIfAbsent(studentId, k -> new HashMap<>()); - // 遍历知识块和知识点的映射关系 for (Map.Entry> blockEntry : knowledgeBlockToPointsMap.entrySet()) { String knowledgeBlock = blockEntry.getKey(); List knowledgePoints = blockEntry.getValue(); - // 计算该知识块的总得分和知识点数量 double totalScore = 0.0; - int validPointCount = 0; // 有效知识点数量(有实际得分的知识点) + int validPointCount = 0; for (String knowledgePoint : knowledgePoints) { if (pointScores.containsKey(knowledgePoint)) { totalScore += pointScores.get(knowledgePoint); @@ -361,10 +359,14 @@ public class MoralEducationServiceImpl implements MoralEducationService { } } - // 计算知识块的平均分 - double averageScore = (validPointCount > 0) ? totalScore / validPointCount : 60.0; // 无有效知识点时默认60分 - averageScore = Math.max(60.0, Math.min(100.0, averageScore)); // 确保得分在60-100之间 - blockScores.put(knowledgeBlock, averageScore); + // 关键修改:统一分数转换逻辑 + double averageScore = (validPointCount > 0) ? totalScore / validPointCount : 0.0; // 原始正确率 + double correctRate = averageScore / 100.0; + double convertedScore = 60.0 + (correctRate * 40.0); + convertedScore = Math.min(100.0, convertedScore); + convertedScore = Double.parseDouble(String.format("%.2f", convertedScore)); + + blockScores.put(knowledgeBlock, convertedScore); } } return studentKnowledgeBlockScores; @@ -646,7 +648,7 @@ public class MoralEducationServiceImpl implements MoralEducationService { if (examResults != null && !examResults.isEmpty()) { // 遍历班级中的每个学生 for (ExamClassResult examResult : examResults) { - if (!examResult.getInfo().getId().equals(classId)) continue; // 过滤出该班级的考试 + if (!examResult.getInfo().getId().equals(classId)) continue; List statuses = examResult.getStatus(); for (int i = 0; i < examResult.getStudentIds().size(); i++) { String studentId = examResult.getStudentIds().get(i); @@ -656,15 +658,12 @@ public class MoralEducationServiceImpl implements MoralEducationService { .map(RMember::getName) .orElse("未知"); int status = statuses.get(i); - if (status == 1) continue; // 跳过 status 为 1 的记录 + if (status == 1) continue; - // 计算父节点得分率(客观分数) + // 正确获取已转换的客观分数(无需二次截断) Map scoreRates = calculateKnowledgeScoreRateForStudent( studentId, examResults, knowledgeMap, appraise, points ); - scoreRates.replaceAll((k, v) -> - Math.min(100.0, Math.max(60.0, v)) // 60分打底,最高100分 - ); studentScoreRates.put(name, scoreRates); // 累加班级整体得分率 @@ -673,7 +672,7 @@ public class MoralEducationServiceImpl implements MoralEducationService { } } } - } else { + }else { // 无考试数据时,初始化所有学生的默认分数为60 if (groupList != null) { for (RMember member : groupList.members) {