diff --git a/src/main/java/cn/teammodel/controller/admin/service/impl/AdminAppraiseServiceImpl.java b/src/main/java/cn/teammodel/controller/admin/service/impl/AdminAppraiseServiceImpl.java index 85d8ca4..212ff8c 100644 --- a/src/main/java/cn/teammodel/controller/admin/service/impl/AdminAppraiseServiceImpl.java +++ b/src/main/java/cn/teammodel/controller/admin/service/impl/AdminAppraiseServiceImpl.java @@ -165,7 +165,8 @@ public class AdminAppraiseServiceImpl implements AdminAppraiseService { academicYearId, startTime, endTime, - classIds + classIds, + "德育" ); if (res != null) { 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 e2c8bd4..ee48dc5 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 @@ -126,7 +126,8 @@ public class LaborEducationServiceImpl implements LaborEducationService { academicYearId, startTime, endTime, - classIds + classIds, + "德育" ); //表扬的次数 int rightCount = (int) res.stream().filter(RecordVo::isPraise).count(); @@ -138,6 +139,11 @@ public class LaborEducationServiceImpl implements LaborEducationService { .filter(Objects::nonNull) // 过滤掉 null 值 .distinct() .count(); + List targetId = res.stream() + .map(RecordVo::getTargetId) + .filter(Objects::nonNull) // 过滤掉 null 值 + .distinct() + .collect(Collectors.toList()); List recordIds = new ArrayList<>(); for (LessonRecord record : records) { @@ -298,6 +304,7 @@ public class LaborEducationServiceImpl implements LaborEducationService { convertedScore = 100.0; // 如果次数超过最大次数,设置为满分 } else { convertedScore = (count / maxCount) * 100; + convertedScore = Double.parseDouble(String.format("%.2f", convertedScore)); } subjectiveTotal += convertedScore; @@ -310,7 +317,7 @@ public class LaborEducationServiceImpl implements LaborEducationService { String combinedScore = count + "/" + objectiveScore; */ double finalCount = convertedScore; - double finalScore = score / knowledgeBlockCount; + double finalScore = score; finalScore = Double.parseDouble(String.format("%.2f", finalScore)); double finalScore1 = finalScore; combinedScores.put(knowledgeBlock, new HashMap() {{ @@ -324,15 +331,19 @@ public class LaborEducationServiceImpl implements LaborEducationService { } // 计算客观平均分 - double objectiveAverage = (knowledgeBlockCount > 0) ? objectiveTotal : 0.0; + double objectiveAverage = (knowledgeBlockCount > 0) ? objectiveTotal / knowledgeBlockCount : 0.0; + objectiveAverage = Double.parseDouble(String.format("%.2f", objectiveAverage)); + //计算主观平均分 + double subjectiveAverage = (subjectiveTotal > 0) ? subjectiveTotal / knowledgeBlockCount : 0.0; + subjectiveAverage = Double.parseDouble(String.format("%.2f", subjectiveAverage)); // 计算综合得分(主观占 60%,客观占 40%) - double compositeScore = (subjectiveTotal * 0.6) + (objectiveAverage * 0.4); + double compositeScore = (subjectiveAverage * 0.6) + (objectiveAverage * 0.4); compositeScore = Double.parseDouble(String.format("%.2f", compositeScore)); // 更新返回数据 studentResult.put("scores", combinedScores); - studentResult.put("subjectiveTotal", subjectiveTotal); + studentResult.put("subjectiveTotal", subjectiveAverage); studentResult.put("objectiveTotal", objectiveAverage); studentResult.put("compositeScore", compositeScore); } @@ -639,7 +650,13 @@ public class LaborEducationServiceImpl implements LaborEducationService { String block = entry.getKey(); int count = entry.getValue(); double maxCount = 50.0; - double convertedScore = (count / maxCount) * 100; + double convertedScore; + if (count > maxCount) { + convertedScore = 100.0; // 如果次数超过最大次数,设置为满分 + } else { + convertedScore = (count / maxCount) * 100; + convertedScore = Double.parseDouble(String.format("%.2f", convertedScore)); + } convertedScores.put(block, convertedScore); } @@ -743,65 +760,68 @@ public class LaborEducationServiceImpl implements LaborEducationService { Map> points, Map knowledgeTotalScore) { - // 记录每个知识点在所有考试中的平均分总和及考试次数 Map knowledgeTotalAverage = new HashMap<>(); Map knowledgeExamCount = new HashMap<>(); - // 过滤出当前学生的考试结果 for (ExamClassResult examResult : examResults) { int studentIndex = examResult.getStudentIds().indexOf(studentId); if (studentIndex == -1) continue; int status = examResult.getStatus().get(studentIndex); - if (status == 1) continue; // 跳过无效考试 + if (status == 1) continue; - // 获取当前考试的知识点和题目分数 List> knowledgeList = knowledgeMap.get(examResult.getExamId()); List pointList = points.get(examResult.getExamId()); if (knowledgeList == null || pointList == null) continue; - // 获取学生的得分列表 List> studentScores = examResult.getStudentScores(); if (studentIndex >= studentScores.size() || studentScores.get(studentIndex) == null) continue; List studentScoreList = studentScores.get(studentIndex); - // 确保数据一致性 if (knowledgeList.size() != studentScoreList.size()) continue; - // 记录当前考试中每个知识点的总得分和题目数量 Map currentExamKnowledgeTotal = new HashMap<>(); Map currentExamKnowledgeCount = new HashMap<>(); // 遍历每道题 for (int i = 0; i < studentScoreList.size(); i++) { - String knowledge = knowledgeList.get(i).get(0); // 取第一个知识点 + List knowledgePoints = knowledgeList.get(i); // 题目对应的知识点列表 double score = studentScoreList.get(i); - // 累加当前考试中该知识点的总得分和题目数量 - currentExamKnowledgeTotal.merge(knowledge, score, Double::sum); - currentExamKnowledgeCount.merge(knowledge, 1, Integer::sum); + // 如果题目没有知识点或得分为空,跳过 + if (knowledgePoints.isEmpty() || score < 0) continue; + + // 将题目得分分摊到每个知识点 + double scorePerKnowledge = score / knowledgePoints.size(); + + // 遍历该题的所有知识点 + for (String knowledge : knowledgePoints) { + // 累加当前考试中该知识点的总得分和题目数量 + currentExamKnowledgeTotal.merge(knowledge, scorePerKnowledge, Double::sum); + currentExamKnowledgeCount.merge(knowledge, 1, Integer::sum); + } } - // 计算当前考试中每个知识点的平均分,并累加到总平均分 + // 计算当前考试中每个知识点的平均分(总得分/题目数量) for (String knowledge : currentExamKnowledgeTotal.keySet()) { double total = currentExamKnowledgeTotal.get(knowledge); int count = currentExamKnowledgeCount.get(knowledge); - double average = total / count; // 当前考试内该知识点的平均分 + double average = total / count; - // 将该考试的平均分累加到总平均分中,并增加考试次数 + // 累加跨考试的总平均分和考试次数 knowledgeTotalAverage.merge(knowledge, average, Double::sum); knowledgeExamCount.merge(knowledge, 1, Integer::sum); } } - // 计算每个知识点的最终平均分(所有考试平均分的平均) + // 计算最终平均分(所有考试平均分的平均) for (String knowledge : knowledgeTotalAverage.keySet()) { double totalAverage = knowledgeTotalAverage.get(knowledge); - int examCount = knowledgeExamCount.getOrDefault(knowledge, 1); + int examCount = knowledgeExamCount.get(knowledge); double finalAverage = totalAverage / examCount; + finalAverage = Double.parseDouble(String.format("%.2f", finalAverage)); knowledgeTotalScore.put(knowledge, finalAverage); } - // 返回知识点平均分对象列表 return knowledgeTotalScore.entrySet().stream() .map(entry -> new KnowledgeScoreRate(entry.getKey(), entry.getValue())) .collect(Collectors.toList()); @@ -873,7 +893,13 @@ public class LaborEducationServiceImpl implements LaborEducationService { String block = entry.getKey(); int count = entry.getValue(); double maxCount = 50.0; - double convertedScore = (count / maxCount) * 100; + double convertedScore; + if (count > maxCount) { + convertedScore = 100.0; // 如果次数超过最大次数,设置为满分 + } else { + convertedScore = (count / maxCount) * 100; + convertedScore = Double.parseDouble(String.format("%.2f", convertedScore)); + } convertedScores.put(block, convertedScore); } @@ -1054,7 +1080,13 @@ public class LaborEducationServiceImpl implements LaborEducationService { String block = entry.getKey(); int count = entry.getValue(); double maxCount = 50.0; - double convertedScore = (count / maxCount) * 100; + double convertedScore; + if (count > maxCount) { + convertedScore = 100.0; // 如果次数超过最大次数,设置为满分 + } else { + convertedScore = (count / maxCount) * 100; + convertedScore = Double.parseDouble(String.format("%.2f", convertedScore)); + } convertedScores.put(block, convertedScore); } diff --git a/src/main/java/cn/teammodel/repository/AppraiseRecordRepository.java b/src/main/java/cn/teammodel/repository/AppraiseRecordRepository.java index 5f22bdc..c801b29 100644 --- a/src/main/java/cn/teammodel/repository/AppraiseRecordRepository.java +++ b/src/main/java/cn/teammodel/repository/AppraiseRecordRepository.java @@ -77,9 +77,10 @@ public interface AppraiseRecordRepository extends CosmosRepository= @startTime) and " + "(IS_NULL(@endTime) or n.createTime <= @endTime) and " + - "c.classId in (@ids)" + "c.classId in (@ids) and " + + "array_contains(n.appraiseNode.path ,@typeName)" ) - List latestRecords(String code, String academicYearId, Long startTime, Long endTime, Collection ids); + List latestRecords(String code, String academicYearId, Long startTime, Long endTime, Collection ids,String typeName); /**