From 6569df58a7e88b4f5c733cac1f8d6c7a6941b315 Mon Sep 17 00:00:00 2001 From: "hhb@hotmail.com" Date: Tue, 11 Mar 2025 12:06:26 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E5=A4=84=E7=90=86=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E6=95=B0=E6=8D=AE(=E5=B9=B4=E7=BA=A7=E4=B8=8E?= =?UTF-8?q?=E7=8F=AD=E7=BA=A7=E5=BE=97=E5=85=B3=E7=B3=BB)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/LaborEducationServiceImpl.java | 146 +++++++++++------- .../model/dto/admin/common/GCDto.java | 5 + .../model/dto/admin/labor/LaborDto.java | 3 +- 3 files changed, 95 insertions(+), 59 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 250b1c1..8d1afd0 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 @@ -3,7 +3,9 @@ package cn.teammodel.controller.admin.service.impl; import cn.teammodel.common.ErrorCode; import cn.teammodel.common.PK; import cn.teammodel.config.exception.ServiceException; +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.RMember; import cn.teammodel.model.dto.admin.labor.LaborDto; @@ -13,6 +15,8 @@ import cn.teammodel.model.entity.common.Exam; import cn.teammodel.model.entity.common.ExamClassResult; import cn.teammodel.model.entity.school.ClassInfo; import cn.teammodel.model.entity.school.LessonRecord; +import cn.teammodel.model.entity.school.School; +import cn.teammodel.model.vo.admin.GradeAndClassVo; import cn.teammodel.model.vo.appraise.RecordVo; import cn.teammodel.repository.*; import cn.teammodel.security.utils.SecurityUtil; @@ -51,6 +55,11 @@ public class LaborEducationServiceImpl implements LaborEducationService { private AppraiseRepository appraiseRepository; @Resource private EvaluationServiceImpl evaluationService; + @Resource + private SchoolRepository schoolRepository; + @Resource + private CommonService commonService; + private static Environment environment; // 静态字段 @Autowired private Environment env; // 非静态字段 @@ -156,6 +165,10 @@ public class LaborEducationServiceImpl implements LaborEducationService { if (!examIds.isEmpty()) { examResults = examClassResultRepository.findAll(String.format(PK.CLASS_RESULT, laborDto.getCode()),examIds); } + //获取学校基础信息 + List period = schoolRepository.findPeriodById(schoolId,periodId); + + List gradeAndClassVos = commonService.getGradeAndClass(new GCDto(schoolId, periodId)); Map resMap = new HashMap<>(); //处理德育知识块和知识点的关联关系 resMap.put("subjectiveCount", res.size()); //主观评价数 @@ -174,9 +187,9 @@ public class LaborEducationServiceImpl implements LaborEducationService { classScoreRate = calculateKnowledgeScoreRateForClass(laborDto.getClassId(), examResults, knowledgeMap, appraise, point,res,request); } if (laborDto.getGrade() != null) { - gradeScoreRate = calculateKnowledgeScoreForGrade(laborDto.getGrade(), examResults, knowledgeMap,appraise, point,res); + gradeScoreRate = calculateKnowledgeScoreForGrade(laborDto.getGrade(), examResults, knowledgeMap,appraise, point,res,gradeAndClassVos); } - Map schoolScoreRate = calculateKnowledgeScoreForSchool(examResults, knowledgeMap,appraise, point,res); + Map schoolScoreRate = calculateKnowledgeScoreForSchool(examResults, knowledgeMap,appraise, point,res,period,gradeAndClassVos); resMap.put("gradeScoreRate", gradeScoreRate); resMap.put("classScoreRate", classScoreRate); resMap.put("schoolScoreRate", schoolScoreRate); @@ -705,12 +718,19 @@ public class LaborEducationServiceImpl implements LaborEducationService { Map>> knowledgeMap, Appraise appraise, Map> points, - List res) { // 新增主观评价记录 + List res, + List gradeAndClassVos) { // 1. 获取年级所有班级的客观分数 Map> classScores = new HashMap<>(); Map gradeScores = new HashMap<>(); + // 根据 gradeId 匹配并取出 classId 集合 + List classInfos = gradeAndClassVos.stream() + .filter(gradeAndClassVo -> String.valueOf(gradeAndClassVo.getGradeId()).equals(gradeId)) + .flatMap(gradeAndClassVo -> gradeAndClassVo.getClasses().stream()) + .collect(Collectors.toList()); + // 过滤出该年级的考试结果 List gradeExamResults = examResults.stream() .filter(examResult -> examResult.getGradeId().equals(gradeId)) @@ -740,64 +760,66 @@ public class LaborEducationServiceImpl implements LaborEducationService { } // 4. 遍历年级下的所有班级 - for (ExamClassResult examResult : gradeExamResults) { - String classId = examResult.getInfo().getId(); - String className = examResult.getInfo().getName(); - Map classScoreSum = new HashMap<>(); - Map classScoreCount = new HashMap<>(); + for (GradeAndClassVo.CI info : classInfos) { + String className = info.getClassName(); Map classScoresInner = new HashMap<>(); - // 获取学生状态列表 - List statuses = examResult.getStatus(); - // 遍历班级中的每个学生 - for (int i = 0; i < examResult.getStudentIds().size(); i++) { - String studentId = examResult.getStudentIds().get(i); - if (statuses.get(i) == 1) { - continue; - } + for (ExamClassResult examResult : gradeExamResults) { + if (examResult.getInfo().getId().equals(info.getClassId())) { + Map classScoreSum = new HashMap<>(); + Map classScoreCount = new HashMap<>(); + + // 获取学生状态列表 + List statuses = examResult.getStatus(); + // 遍历班级中的每个学生 + for (int i = 0; i < examResult.getStudentIds().size(); i++) { + String studentId = examResult.getStudentIds().get(i); + if (statuses.get(i) == 1) { + continue; + } - // 计算学生的知识点得分(客观分数) - Map studentObjectiveScores = calculateKnowledgeScoreRateForStudent( - studentId, examResults, knowledgeMap, appraise, points - ); + // 计算学生的知识点得分(客观分数) + Map studentObjectiveScores = calculateKnowledgeScoreRateForStudent( + studentId, examResults, knowledgeMap, appraise, points + ); + + // 获取学生的主观分数 + Map studentSubjectiveScores = subjectiveScores.getOrDefault(studentId, new HashMap<>()); + + // 计算综合得分(主观60%,客观40%) + Map studentCompositeScores = new HashMap<>(); + for (Map.Entry entry : studentObjectiveScores.entrySet()) { + String block = entry.getKey(); + double objectiveScore = entry.getValue(); + double subjectiveScore = studentSubjectiveScores.getOrDefault(block, 0.0); + double compositeScore = (subjectiveScore * 0.6) + (objectiveScore * 0.4); + studentCompositeScores.put(block, compositeScore); + } - // 获取学生的主观分数 - Map studentSubjectiveScores = subjectiveScores.getOrDefault(studentId, new HashMap<>()); - - // 计算综合得分(主观60%,客观40%) - Map studentCompositeScores = new HashMap<>(); - for (Map.Entry entry : studentObjectiveScores.entrySet()) { - String block = entry.getKey(); - double objectiveScore = entry.getValue(); - double subjectiveScore = studentSubjectiveScores.getOrDefault(block, 0.0); - double compositeScore = (subjectiveScore * 0.6) + (objectiveScore * 0.4); - studentCompositeScores.put(block, compositeScore); - } + // 累加班级整体得分 + for (Map.Entry entry : studentCompositeScores.entrySet()) { + String nodeName = entry.getKey(); + double score = entry.getValue(); + classScoreSum.put(nodeName, classScoreSum.getOrDefault(nodeName, 0.0) + score); + classScoreCount.put(nodeName, classScoreCount.getOrDefault(nodeName, 0) + 1); + } + } - // 累加班级整体得分 - for (Map.Entry entry : studentCompositeScores.entrySet()) { - String nodeName = entry.getKey(); - double score = entry.getValue(); - classScoreSum.put(nodeName, classScoreSum.getOrDefault(nodeName, 0.0) + score); - classScoreCount.put(nodeName, classScoreCount.getOrDefault(nodeName, 0) + 1); + // 计算班级平均得分 + for (Map.Entry entry : classScoreSum.entrySet()) { + String nodeName = entry.getKey(); + double totalScore = entry.getValue(); + int count = classScoreCount.get(nodeName); + classScoresInner.put(nodeName, Double.parseDouble(String.format("%.2f", totalScore / count))); // 保留小数点后两位 + } } } - // 计算班级平均得分 - for (Map.Entry entry : classScoreSum.entrySet()) { - String nodeName = entry.getKey(); - double totalScore = entry.getValue(); - int count = classScoreCount.get(nodeName); - classScoresInner.put(nodeName, Double.parseDouble(String.format("%.2f", totalScore / count))); // 保留小数点后两位 - } - // 初始化所有同层的父节点 for (AppraiseTreeNode node : appraise.getNodes()) { - if (node.getName().equals("德育")) { + if ("德育".equals(node.getName())) { for (AppraiseTreeNode child : node.getChildren()) { - if (!classScoresInner.containsKey(child.getName())) { - classScoresInner.put(child.getName(), 0.0); - } + classScoresInner.putIfAbsent(child.getName(), 0.0); } } } @@ -826,11 +848,9 @@ public class LaborEducationServiceImpl implements LaborEducationService { // 初始化所有同层的父节点 for (AppraiseTreeNode node : appraise.getNodes()) { - if (node.getName().equals("德育")) { + if ("德育".equals(node.getName())) { for (AppraiseTreeNode child : node.getChildren()) { - if (!gradeScores.containsKey(child.getName())) { - gradeScores.put(child.getName(), 0.0); - } + gradeScores.putIfAbsent(child.getName(), 0.0); } } } @@ -844,21 +864,29 @@ public class LaborEducationServiceImpl implements LaborEducationService { + public static Map calculateKnowledgeScoreForSchool( List examResults, Map>> knowledgeMap, Appraise appraise, Map> points, - List res) { // 新增主观评价记录 + List res, + List period, + List gradeAndClassVos) { // 新增主观评价记录 // 1. 获取全校所有年级的客观分数 Map> gradeScores = new HashMap<>(); Map schoolScores = new HashMap<>(); + // 获取所有年级的 ID - Set gradeIds = examResults.stream() + List gradeIds = period.stream() + .flatMap(period1 -> period1.getGrades().stream()) + .collect(Collectors.toList()); + + /*Set gradeIds = examResults.stream() .map(ExamClassResult::getGradeId) - .collect(Collectors.toSet()); + .collect(Collectors.toSet());*/ // 2. 获取全校所有学生的主观分数(次数) List> subjectiveScoresList = calculateScoresWithDetails(res, appraise); @@ -884,10 +912,11 @@ public class LaborEducationServiceImpl implements LaborEducationService { } // 4. 遍历所有年级 + int index = 0; for (String gradeId : gradeIds) { // 计算该年级的平均得分(包含主观和客观分数) Map gradeResult = calculateKnowledgeScoreForGrade( - gradeId, examResults, knowledgeMap, appraise, points, res + String.valueOf(index),examResults, knowledgeMap, appraise, points, res,gradeAndClassVos ); // 获取该年级的平均得分 @@ -903,6 +932,7 @@ public class LaborEducationServiceImpl implements LaborEducationService { schoolScores.put(nodeName, schoolScores.getOrDefault(nodeName, 0.0) + score); } } + index++; } // 5. 计算全校的平均得分 diff --git a/src/main/java/cn/teammodel/model/dto/admin/common/GCDto.java b/src/main/java/cn/teammodel/model/dto/admin/common/GCDto.java index 22c8955..7ef385c 100644 --- a/src/main/java/cn/teammodel/model/dto/admin/common/GCDto.java +++ b/src/main/java/cn/teammodel/model/dto/admin/common/GCDto.java @@ -7,4 +7,9 @@ public class GCDto { private String schoolId; private String periodId; private Long time; + + public GCDto(String schoolId, String periodId) { + this.schoolId = schoolId; + this.periodId = periodId; + } } diff --git a/src/main/java/cn/teammodel/model/dto/admin/labor/LaborDto.java b/src/main/java/cn/teammodel/model/dto/admin/labor/LaborDto.java index ce523a7..754e398 100644 --- a/src/main/java/cn/teammodel/model/dto/admin/labor/LaborDto.java +++ b/src/main/java/cn/teammodel/model/dto/admin/labor/LaborDto.java @@ -3,6 +3,8 @@ package cn.teammodel.model.dto.admin.labor; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.List; + @Data public class LaborDto { @ApiModelProperty("学校编码") @@ -22,5 +24,4 @@ public class LaborDto { public String semesterId; private String academicYearId; private String classId; - }