From 6e938227cbb540a7ffbf9051b02c4035edb76f31 Mon Sep 17 00:00:00 2001 From: "hhb@hotmail.com" Date: Tue, 11 Mar 2025 17:25:22 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E8=B0=83=E6=95=B4=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E5=BE=97=E5=86=85=E5=AE=B9=E5=92=8C=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/LaborEducationServiceImpl.java | 248 +++++++++++++++--- 1 file changed, 210 insertions(+), 38 deletions(-) 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 8d1afd0..fd82f48 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 @@ -7,6 +7,7 @@ import cn.teammodel.controller.admin.service.CommonService; import cn.teammodel.controller.admin.service.LaborEducationService; import cn.teammodel.model.dto.admin.common.GCDto; import cn.teammodel.model.dto.admin.common.GroupDto; +import cn.teammodel.model.dto.admin.common.RGroupList; import cn.teammodel.model.dto.admin.common.RMember; import cn.teammodel.model.dto.admin.labor.LaborDto; import cn.teammodel.model.entity.appraise.Appraise; @@ -27,6 +28,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import lombok.AllArgsConstructor; import lombok.Data; +import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.stereotype.Service; @@ -171,6 +173,7 @@ public class LaborEducationServiceImpl implements LaborEducationService { List gradeAndClassVos = commonService.getGradeAndClass(new GCDto(schoolId, periodId)); Map resMap = new HashMap<>(); //处理德育知识块和知识点的关联关系 + resMap.put("exams",exams);//评测明细 resMap.put("subjectiveCount", res.size()); //主观评价数 resMap.put("examCount", exams.size());//评测数量 resMap.put("lessonCount", records.size());//班会课数量 @@ -310,7 +313,6 @@ public class LaborEducationServiceImpl implements LaborEducationService { } - public static List> calculateScoresWithDetails(List res, Appraise appraise) { // 1. 构建知识点到知识块的映射 (一个知识块对应多个知识点) Map> knowledgeBlockToPointsMap = getKnowledgeBlockToPointsMap(appraise); @@ -336,6 +338,8 @@ public class LaborEducationServiceImpl implements LaborEducationService { // 4. 遍历评价记录并统计得分 Map> studentScores = new HashMap<>(); + Map>> studentAppraises = new HashMap<>(); // 存储每个学生的评价记录 + for (RecordVo record : res) { String studentId = record.getTargetId(); // 学生 ID String studentName = record.getTargetName(); // 学生名称 @@ -355,10 +359,16 @@ public class LaborEducationServiceImpl implements LaborEducationService { Map studentScoreMap = studentScores.get(studentKey); // 计分 -// 计分 int score = isPraise ? 1 : -1; int currentScore = studentScoreMap.getOrDefault(knowledgeBlock, 0) + score; - studentScoreMap.put(knowledgeBlock, Math.max(currentScore, 0)); + studentScoreMap.put(knowledgeBlock, currentScore); + + // 存储每个学生的评价记录 + studentAppraises.putIfAbsent(studentKey, new ArrayList<>()); + Map appraiseRecord = new HashMap<>(); + appraiseRecord.put("appraiseName", appraiseName); + appraiseRecord.put("isPraise", isPraise); + studentAppraises.get(studentKey).add(appraiseRecord); } // 5. 初始化缺失的二级知识块分数 @@ -370,9 +380,39 @@ public class LaborEducationServiceImpl implements LaborEducationService { } // 6. 整理并返回结果 - return getMaps(studentScores); + return getMaps(studentScores, studentAppraises); } + // 整理并返回结果 + private static List> getMaps(Map> studentScores, Map>> studentAppraises) { + List> result = new ArrayList<>(); + + for (Map.Entry> entry : studentScores.entrySet()) { + String studentKey = entry.getKey(); + Map scoreMap = entry.getValue(); + List> appraiseList = studentAppraises.get(studentKey); // 获取学生的评价记录 + + // 解析学生唯一标识 + String[] studentInfo = studentKey.split("\\|"); + String studentId = studentInfo[0]; + String studentName = studentInfo[1]; + String className = studentInfo[2]; + + // 构建返回结果 + Map studentResult = new HashMap<>(); + studentResult.put("studentId", studentId); + studentResult.put("studentName", studentName); + studentResult.put("className", className); + studentResult.put("scores", scoreMap); + studentResult.put("appraises", appraiseList); // 添加评价记录 + + result.add(studentResult); + } + + return result; + } + + // 整理并返回结果 private static List> getMaps(Map> studentScores) { List> result = new ArrayList<>(); @@ -495,24 +535,35 @@ public class LaborEducationServiceImpl implements LaborEducationService { Map>> knowledgeMap, Appraise appraise, Map> points, - List res - , HttpServletRequest request) { // 新增主观评价记录 + List res, + HttpServletRequest request) { + // 将 classId 转换为 List List classIds = Collections.singletonList(classId); GroupDto groupDto = new GroupDto(); groupDto.setIds(classIds); groupDto.setSchoolId(appraise.getSchoolId()); String url = environment.getProperty("ies.server-url-group"); - Map groupId = GroupUtil.getGroupId(groupDto,new GroupUtil(environment), request,url); + Map groupId = GroupUtil.getGroupId(groupDto, new GroupUtil(environment), request, url); + List rGroupList = new ArrayList<>(); List rMembers = new ArrayList<>(); for (Map.Entry entry : groupId.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); + if (key.equals("groups")) { + String jsonGroups = JSON.toJSONString(value); + rGroupList = JSON.parseObject(jsonGroups, new TypeReference>() {}); + } if (key.equals("members")) { String jsonGroups = JSON.toJSONString(value); rMembers = JSON.parseObject(jsonGroups, new TypeReference>() {}); } } + String className = rGroupList.stream() + .filter(rGroupList1 -> rGroupList1.getId().equals(classId)) + .findFirst() + .map(RGroupList::getName) + .orElse("未知班级"); // 如果未找到则返回默认值 "未知班级" // 1. 获取班级所有学生的客观分数 Map> studentScoreRates = new HashMap<>(); @@ -552,7 +603,6 @@ public class LaborEducationServiceImpl implements LaborEducationService { Map> subjectiveScores = new HashMap<>(); for (Map studentScore : subjectiveScoresList) { String studentId = (String) studentScore.get("studentId"); - // 修改这里:假设 scores 是 Map @SuppressWarnings("unchecked") Map scores = (Map) studentScore.get("scores"); Map convertedScores = new HashMap<>(); @@ -614,10 +664,44 @@ public class LaborEducationServiceImpl implements LaborEducationService { } } - // 7. 返回结果 + // 7. 转换 classScoreRates 和 studentScoreRates 为新的数据结构 + List> adjustedClassScoreRates = new ArrayList<>(); + Map classScore = new HashMap<>(); + classScore.put("className", className); // 设置班级名称 + + List> classBlocks = new ArrayList<>(); + for (Map.Entry entry : compositeClassScoreRates.entrySet()) { + Map block = new HashMap<>(); + block.put("name", entry.getKey()); + block.put("score", entry.getValue()); + classBlocks.add(block); + } + classScore.put("blocks", classBlocks); + adjustedClassScoreRates.add(classScore); + + List> adjustedStudentScoreRates = new ArrayList<>(); + for (Map.Entry> entry : compositeStudentScores.entrySet()) { + String studentId = entry.getKey(); + Map scores = entry.getValue(); + + Map studentScore = new HashMap<>(); + studentScore.put("studentName", studentId); // 设置学生名称 + + List> studentBlocks = new ArrayList<>(); + for (Map.Entry scoreEntry : scores.entrySet()) { + Map block = new HashMap<>(); + block.put("name", scoreEntry.getKey()); + block.put("score", scoreEntry.getValue()); + studentBlocks.add(block); + } + studentScore.put("blocks", studentBlocks); + adjustedStudentScoreRates.add(studentScore); + } + + // 8. 返回结果 Map result = new HashMap<>(); - result.put("classScoreRates", compositeClassScoreRates); // 班级整体得分率 - result.put("studentScoreRates", compositeStudentScores); // 每个学生的综合得分率 + result.put("classScoreRates", adjustedClassScoreRates); // 班级整体得分率 + result.put("studentScoreRates", adjustedStudentScoreRates); // 每个学生的综合得分率 return result; } @@ -730,7 +814,11 @@ public class LaborEducationServiceImpl implements LaborEducationService { .filter(gradeAndClassVo -> String.valueOf(gradeAndClassVo.getGradeId()).equals(gradeId)) .flatMap(gradeAndClassVo -> gradeAndClassVo.getClasses().stream()) .collect(Collectors.toList()); - + String gradeName = gradeAndClassVos.stream() + .filter(gradeAndClassVo -> String.valueOf(gradeAndClassVo.getGradeId()).equals(gradeId)) + .findFirst() + .map(GradeAndClassVo::getGradeName) + .orElse(""); // 过滤出该年级的考试结果 List gradeExamResults = examResults.stream() .filter(examResult -> examResult.getGradeId().equals(gradeId)) @@ -743,7 +831,6 @@ public class LaborEducationServiceImpl implements LaborEducationService { Map> subjectiveScores = new HashMap<>(); for (Map studentScore : subjectiveScoresList) { String studentId = (String) studentScore.get("studentId"); - // 修改这里:假设 scores 是 Map @SuppressWarnings("unchecked") Map scores = (Map) studentScore.get("scores"); Map convertedScores = new HashMap<>(); @@ -854,17 +941,52 @@ public class LaborEducationServiceImpl implements LaborEducationService { } } } + // 6. 转换 gradeScores 和 classScores 为新的数据结构 + return getStringObjectMap(gradeName, gradeScores, classScores); + } + + private static @NotNull Map getStringObjectMap(String gradeName, Map gradeScores, Map> classScores) { + List> adjustedGradeScores = new ArrayList<>(); + Map gradeScore = new HashMap<>(); + gradeScore.put("gradeName", gradeName); // 设置年级名称 + + List> gradeBlocks = new ArrayList<>(); + for (Map.Entry entry : gradeScores.entrySet()) { + Map block = new HashMap<>(); + block.put("name", entry.getKey()); + block.put("score", entry.getValue()); + gradeBlocks.add(block); + } + gradeScore.put("blocks", gradeBlocks); + adjustedGradeScores.add(gradeScore); + + List> adjustedClassScores = new ArrayList<>(); + for (Map.Entry> entry : classScores.entrySet()) { + String className = entry.getKey(); + Map scores = entry.getValue(); + + Map classScore = new HashMap<>(); + classScore.put("className", className); // 设置班级名称 + + List> classBlocks = new ArrayList<>(); + for (Map.Entry scoreEntry : scores.entrySet()) { + Map block = new HashMap<>(); + block.put("name", scoreEntry.getKey()); + block.put("score", scoreEntry.getValue()); + classBlocks.add(block); + } + classScore.put("blocks", classBlocks); + adjustedClassScores.add(classScore); + } - // 6. 返回结果 + // 7. 返回结果 Map result = new HashMap<>(); - result.put("gradeScores", gradeScores); // 年级平均得分 - result.put("classScores", classScores); // 每个班级的平均得分 + result.put("gradeScores", adjustedGradeScores); // 年级平均得分 + result.put("classScores", adjustedClassScores); // 每个班级的平均得分 return result; } - - public static Map calculateKnowledgeScoreForSchool( List examResults, Map>> knowledgeMap, @@ -872,22 +994,17 @@ public class LaborEducationServiceImpl implements LaborEducationService { Map> points, List res, List period, - List gradeAndClassVos) { // 新增主观评价记录 + List gradeAndClassVos) { // 1. 获取全校所有年级的客观分数 Map> gradeScores = new HashMap<>(); Map schoolScores = new HashMap<>(); - // 获取所有年级的 ID List gradeIds = period.stream() .flatMap(period1 -> period1.getGrades().stream()) .collect(Collectors.toList()); - /*Set gradeIds = examResults.stream() - .map(ExamClassResult::getGradeId) - .collect(Collectors.toSet());*/ - // 2. 获取全校所有学生的主观分数(次数) List> subjectiveScoresList = calculateScoresWithDetails(res, appraise); @@ -895,7 +1012,6 @@ public class LaborEducationServiceImpl implements LaborEducationService { Map> subjectiveScores = new HashMap<>(); for (Map studentScore : subjectiveScoresList) { String studentId = (String) studentScore.get("studentId"); - // 修改这里:假设 scores 是 Map @SuppressWarnings("unchecked") Map scores = (Map) studentScore.get("scores"); Map convertedScores = new HashMap<>(); @@ -914,24 +1030,45 @@ public class LaborEducationServiceImpl implements LaborEducationService { // 4. 遍历所有年级 int index = 0; for (String gradeId : gradeIds) { - // 计算该年级的平均得分(包含主观和客观分数) + // 调用改造后的方法,返回的 gradeResult 包含列表结构的 gradeScores 和 classScores Map gradeResult = calculateKnowledgeScoreForGrade( - String.valueOf(index),examResults, knowledgeMap, appraise, points, res,gradeAndClassVos + String.valueOf(index), examResults, knowledgeMap, appraise, points, res, gradeAndClassVos ); - // 获取该年级的平均得分 - Map gradeScoresInner = (Map) gradeResult.get("gradeScores"); + // 1. 提取年级平均得分(gradeScores) + List> adjustedGradeScores = (List>) gradeResult.get("gradeScores"); + Map gradeScoresInner = new HashMap<>(); + + // 遍历年级得分列表(通常只有一个元素) + for (Map gradeScoreEntry : adjustedGradeScores) { + String gradeName = (String) gradeScoreEntry.get("gradeName"); + List> blocks = (List>) gradeScoreEntry.get("blocks"); + + // 将 blocks 转换为 Map + for (Map block : blocks) { + String nodeName = (String) block.get("name"); + Double score = (Double) block.get("score"); + gradeScoresInner.put(nodeName, score); + } + } + + // 保存年级得分 gradeScores.put(gradeId, gradeScoresInner); - // 累加全校的得分总和 - Map> classScores = (Map>) gradeResult.get("classScores"); - for (Map classScoresInner : classScores.values()) { - for (Map.Entry entry : classScoresInner.entrySet()) { - String nodeName = entry.getKey(); - double score = entry.getValue(); + // 2. 累加全校得分总和(从 classScores 中提取) + List> adjustedClassScores = (List>) gradeResult.get("classScores"); + + for (Map classScoreEntry : adjustedClassScores) { + List> classBlocks = (List>) classScoreEntry.get("blocks"); + + // 遍历班级的每个评分项 + for (Map block : classBlocks) { + String nodeName = (String) block.get("name"); + Double score = (Double) block.get("score"); schoolScores.put(nodeName, schoolScores.getOrDefault(nodeName, 0.0) + score); } } + index++; } @@ -959,10 +1096,45 @@ public class LaborEducationServiceImpl implements LaborEducationService { } } - // 7. 返回结果 + // 7. 转换 gradeScores 为新的数据结构 + List> adjustedGradeScores = new ArrayList<>(); + for (Map.Entry> entry : gradeScores.entrySet()) { + String gradeName = entry.getKey(); + Map scores = entry.getValue(); + + List> blocks = new ArrayList<>(); + for (Map.Entry scoreEntry : scores.entrySet()) { + Map block = new HashMap<>(); + block.put("name", scoreEntry.getKey()); + block.put("score", scoreEntry.getValue()); + blocks.add(block); + } + + Map gradeScore = new HashMap<>(); + gradeScore.put("gradeName", gradeName); + gradeScore.put("blocks", blocks); + adjustedGradeScores.add(gradeScore); + } + + // 8. 转换 schoolScores 为新的数据结构 + List> adjustedSchoolScores = new ArrayList<>(); + Map schoolScore = new HashMap<>(); + schoolScore.put("gradeName", "全校"); // 全校的 gradeName 设置为 "全校" + + List> schoolBlocks = new ArrayList<>(); + for (Map.Entry entry : schoolScores.entrySet()) { + Map block = new HashMap<>(); + block.put("name", entry.getKey()); + block.put("score", entry.getValue()); + schoolBlocks.add(block); + } + schoolScore.put("blocks", schoolBlocks); + adjustedSchoolScores.add(schoolScore); + + // 9. 返回结果 Map result = new HashMap<>(); - result.put("schoolScores", schoolScores); // 全校平均得分 - result.put("gradeScores", gradeScores); // 每个年级的平均得分 + result.put("schoolScores", adjustedSchoolScores); // 全校平均得分 + result.put("gradeScores", adjustedGradeScores); // 每个年级的平均得分 return result; }