update 处理主客观算法

develop
hhb@hotmail.com 1 month ago
parent 8edae6b9a2
commit c1ce2d0be6

@ -885,6 +885,7 @@ public class LaborEducationServiceImpl implements LaborEducationService {
.findFirst() .findFirst()
.map(GradeAndClassVo::getGradeName) .map(GradeAndClassVo::getGradeName)
.orElse(""); .orElse("");
// 过滤出该年级的考试结果 // 过滤出该年级的考试结果
List<ExamClassResult> gradeExamResults = examResults.stream() List<ExamClassResult> gradeExamResults = examResults.stream()
.filter(examResult -> examResult.getGradeId().equals(gradeId)) .filter(examResult -> examResult.getGradeId().equals(gradeId))
@ -893,8 +894,13 @@ public class LaborEducationServiceImpl implements LaborEducationService {
// 2. 获取年级所有学生的主观分数(次数) // 2. 获取年级所有学生的主观分数(次数)
List<Map<String, Object>> subjectiveScoresList = calculateScoresWithDetails(res, appraise); List<Map<String, Object>> subjectiveScoresList = calculateScoresWithDetails(res, appraise);
// 3. 将主观次数转换为0-100分数 // 3. 将主观次数转换为0-100分数,并收集学生班级信息
Map<String, Map<String, Double>> subjectiveScores = new HashMap<>(); Map<String, Map<String, Double>> subjectiveScores = new HashMap<>();
Map<String, String> studentClassMap = new HashMap<>(); // 学生ID到班级ID的映射
for (RecordVo record : res) {
// 假设RecordVo中有getStudentId()和getClassId()方法
studentClassMap.put(record.getTargetId(), record.getClassId());
}
for (Map<String, Object> studentScore : subjectiveScoresList) { for (Map<String, Object> studentScore : subjectiveScoresList) {
String studentId = (String) studentScore.get("studentId"); String studentId = (String) studentScore.get("studentId");
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@ -905,115 +911,107 @@ public class LaborEducationServiceImpl implements LaborEducationService {
String block = entry.getKey(); String block = entry.getKey();
int count = entry.getValue(); int count = entry.getValue();
double maxCount = 50.0; double maxCount = 50.0;
double convertedScore; double convertedScore = (count > maxCount) ? 100.0 : (count / maxCount) * 100;
if (count > maxCount) { convertedScore = Double.parseDouble(String.format("%.2f", convertedScore));
convertedScore = 100.0; // 如果次数超过最大次数,设置为满分
} else {
convertedScore = (count / maxCount) * 100;
convertedScore = Double.parseDouble(String.format("%.2f", convertedScore));
}
convertedScores.put(block, convertedScore); convertedScores.put(block, convertedScore);
} }
subjectiveScores.put(studentId, convertedScores); subjectiveScores.put(studentId, convertedScores);
} }
// 4. 遍历年级下的所有班级 // 4. 遍历年级下的所有班级
for (GradeAndClassVo.CI info : classInfos) { for (GradeAndClassVo.CI info : classInfos) {
String classId = info.getClassId();
String className = info.getClassName(); String className = info.getClassName();
Map<String, Double> classScoresInner = new HashMap<>(); Map<String, Double> classScoresInner = new HashMap<>();
for (ExamClassResult examResult : gradeExamResults) { // 获取该班级的所有学生ID来自res记录
if (examResult.getInfo().getId().equals(info.getClassId())) { List<String> studentIdsInClass = studentClassMap.entrySet().stream()
Map<String, Double> classScoreSum = new HashMap<>(); .filter(entry -> entry.getValue().equals(classId))
Map<String, Integer> classScoreCount = new HashMap<>(); .map(Map.Entry::getKey)
.collect(Collectors.toList());
// 获取学生状态列表
List<Integer> statuses = examResult.getStatus(); Map<String, Double> classScoreSum = new HashMap<>();
// 遍历班级中的每个学生 Map<String, Integer> classScoreCount = new HashMap<>();
for (int i = 0; i < examResult.getStudentIds().size(); i++) {
String studentId = examResult.getStudentIds().get(i); for (String studentId : studentIdsInClass) {
if (statuses.get(i) == 1) { // 获取学生状态(从考试结果中查找,默认为有效)
continue; int status = 0;
} for (ExamClassResult examResult : gradeExamResults) {
int index = examResult.getStudentIds().indexOf(studentId);
// 计算学生的知识点得分(客观分数) if (index != -1) {
Map<String, Double> studentObjectiveScores = calculateKnowledgeScoreRateForStudent( status = examResult.getStatus().get(index);
studentId, examResults, knowledgeMap, appraise, points break;
);
// 获取学生的主观分数
Map<String, Double> studentSubjectiveScores = subjectiveScores.getOrDefault(studentId, new HashMap<>());
// 计算综合得分主观60%客观40%
Map<String, Double> studentCompositeScores = new HashMap<>();
for (Map.Entry<String, Double> 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<String, Double> 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<String, Double> 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))); // 保留小数点后两位
} }
} }
if (status == 1) continue;
// 计算学生的知识点得分(客观分数)
Map<String, Double> studentObjectiveScores = calculateKnowledgeScoreRateForStudent(
studentId, examResults, knowledgeMap, appraise, points
);
// 获取学生的主观分数
Map<String, Double> studentSubjectiveScores = subjectiveScores.getOrDefault(studentId, new HashMap<>());
// 确定所有需要处理的评分块(合并主客观的块)
Set<String> allBlocks = new HashSet<>();
allBlocks.addAll(studentObjectiveScores.keySet());
allBlocks.addAll(studentSubjectiveScores.keySet());
// 计算综合得分主观60%客观40%
for (String block : allBlocks) {
double objectiveScore = studentObjectiveScores.getOrDefault(block, 0.0);
double subjectiveScore = studentSubjectiveScores.getOrDefault(block, 0.0);
double compositeScore = (subjectiveScore * 0.6) + (objectiveScore * 0.4);
compositeScore = Double.parseDouble(String.format("%.2f", compositeScore));
// 累加班级得分
classScoreSum.put(block, classScoreSum.getOrDefault(block, 0.0) + compositeScore);
classScoreCount.put(block, classScoreCount.getOrDefault(block, 0) + 1);
}
} }
// 初始化所有同层的父节点 // 计算班级平均得分
for (String block : classScoreSum.keySet()) {
double total = classScoreSum.get(block);
int count = classScoreCount.getOrDefault(block, 1);
classScoresInner.put(block, Double.parseDouble(String.format("%.2f", total / count)));
}
// 初始化所有同层的父节点(确保结构完整)
for (AppraiseTreeNode node : appraise.getNodes()) { for (AppraiseTreeNode node : appraise.getNodes()) {
if ("德育".equals(node.getName())) { if ("德育".equals(node.getName())) {
for (AppraiseTreeNode child : node.getChildren()) { node.getChildren().forEach(child ->
classScoresInner.putIfAbsent(child.getName(), 0.0); classScoresInner.putIfAbsent(child.getName(), 0.0));
}
} }
} }
// 存储班级的平均得分
classScores.put(className, classScoresInner); classScores.put(className, classScoresInner);
} }
// 5. 计算年级的平均得分 // 5. 计算年级的平均得分
Map<String, Double> gradeScoreSum = new HashMap<>(); Map<String, Double> gradeScoreSum = new HashMap<>();
Map<String, Integer> gradeScoreCount = new HashMap<>(); Map<String, Integer> gradeScoreCount = new HashMap<>();
for (Map<String, Double> classScore : classScores.values()) { classScores.values().forEach(classScore ->
for (Map.Entry<String, Double> entry : classScore.entrySet()) { classScore.forEach((block, score) -> {
String nodeName = entry.getKey(); gradeScoreSum.put(block, gradeScoreSum.getOrDefault(block, 0.0) + score);
double score = entry.getValue(); gradeScoreCount.put(block, gradeScoreCount.getOrDefault(block, 0) + 1);
gradeScoreSum.put(nodeName, gradeScoreSum.getOrDefault(nodeName, 0.0) + score); }));
gradeScoreCount.put(nodeName, gradeScoreCount.getOrDefault(nodeName, 0) + 1);
} gradeScoreSum.forEach((block, total) -> {
} int count = gradeScoreCount.getOrDefault(block, 1);
for (Map.Entry<String, Double> entry : gradeScoreSum.entrySet()) { gradeScores.put(block, Double.parseDouble(String.format("%.2f", total / count)));
String nodeName = entry.getKey(); });
double totalScore = entry.getValue();
int count = gradeScoreCount.get(nodeName); // 初始化年级层级的父节点
gradeScores.put(nodeName, Double.parseDouble(String.format("%.2f", totalScore / count))); // 保留小数点后两位
}
// 初始化所有同层的父节点
for (AppraiseTreeNode node : appraise.getNodes()) { for (AppraiseTreeNode node : appraise.getNodes()) {
if ("德育".equals(node.getName())) { if ("德育".equals(node.getName())) {
for (AppraiseTreeNode child : node.getChildren()) { node.getChildren().forEach(child ->
gradeScores.putIfAbsent(child.getName(), 0.0); gradeScores.putIfAbsent(child.getName(), 0.0));
}
} }
} }
// 6. 转换 gradeScores 和 classScores 为新的数据结构
// 6. 转换数据结构并返回
return getStringObjectMap(gradeName, gradeScores, classScores); return getStringObjectMap(gradeName, gradeScores, classScores);
} }

@ -885,6 +885,7 @@ public class MoralEducationServiceImpl implements MoralEducationService {
.findFirst() .findFirst()
.map(GradeAndClassVo::getGradeName) .map(GradeAndClassVo::getGradeName)
.orElse(""); .orElse("");
// 过滤出该年级的考试结果 // 过滤出该年级的考试结果
List<ExamClassResult> gradeExamResults = examResults.stream() List<ExamClassResult> gradeExamResults = examResults.stream()
.filter(examResult -> examResult.getGradeId().equals(gradeId)) .filter(examResult -> examResult.getGradeId().equals(gradeId))
@ -893,8 +894,13 @@ public class MoralEducationServiceImpl implements MoralEducationService {
// 2. 获取年级所有学生的主观分数(次数) // 2. 获取年级所有学生的主观分数(次数)
List<Map<String, Object>> subjectiveScoresList = calculateScoresWithDetails(res, appraise); List<Map<String, Object>> subjectiveScoresList = calculateScoresWithDetails(res, appraise);
// 3. 将主观次数转换为0-100分数 // 3. 将主观次数转换为0-100分数,并收集学生班级信息
Map<String, Map<String, Double>> subjectiveScores = new HashMap<>(); Map<String, Map<String, Double>> subjectiveScores = new HashMap<>();
Map<String, String> studentClassMap = new HashMap<>(); // 学生ID到班级ID的映射
for (RecordVo record : res) {
// 假设RecordVo中有getStudentId()和getClassId()方法
studentClassMap.put(record.getTargetId(), record.getClassId());
}
for (Map<String, Object> studentScore : subjectiveScoresList) { for (Map<String, Object> studentScore : subjectiveScoresList) {
String studentId = (String) studentScore.get("studentId"); String studentId = (String) studentScore.get("studentId");
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@ -905,115 +911,107 @@ public class MoralEducationServiceImpl implements MoralEducationService {
String block = entry.getKey(); String block = entry.getKey();
int count = entry.getValue(); int count = entry.getValue();
double maxCount = 50.0; double maxCount = 50.0;
double convertedScore; double convertedScore = (count > maxCount) ? 100.0 : (count / maxCount) * 100;
if (count > maxCount) { convertedScore = Double.parseDouble(String.format("%.2f", convertedScore));
convertedScore = 100.0; // 如果次数超过最大次数,设置为满分
} else {
convertedScore = (count / maxCount) * 100;
convertedScore = Double.parseDouble(String.format("%.2f", convertedScore));
}
convertedScores.put(block, convertedScore); convertedScores.put(block, convertedScore);
} }
subjectiveScores.put(studentId, convertedScores); subjectiveScores.put(studentId, convertedScores);
} }
// 4. 遍历年级下的所有班级 // 4. 遍历年级下的所有班级
for (GradeAndClassVo.CI info : classInfos) { for (GradeAndClassVo.CI info : classInfos) {
String classId = info.getClassId();
String className = info.getClassName(); String className = info.getClassName();
Map<String, Double> classScoresInner = new HashMap<>(); Map<String, Double> classScoresInner = new HashMap<>();
for (ExamClassResult examResult : gradeExamResults) { // 获取该班级的所有学生ID来自res记录
if (examResult.getInfo().getId().equals(info.getClassId())) { List<String> studentIdsInClass = studentClassMap.entrySet().stream()
Map<String, Double> classScoreSum = new HashMap<>(); .filter(entry -> entry.getValue().equals(classId))
Map<String, Integer> classScoreCount = new HashMap<>(); .map(Map.Entry::getKey)
.collect(Collectors.toList());
// 获取学生状态列表
List<Integer> statuses = examResult.getStatus(); Map<String, Double> classScoreSum = new HashMap<>();
// 遍历班级中的每个学生 Map<String, Integer> classScoreCount = new HashMap<>();
for (int i = 0; i < examResult.getStudentIds().size(); i++) {
String studentId = examResult.getStudentIds().get(i); for (String studentId : studentIdsInClass) {
if (statuses.get(i) == 1) { // 获取学生状态(从考试结果中查找,默认为有效)
continue; int status = 0;
} for (ExamClassResult examResult : gradeExamResults) {
int index = examResult.getStudentIds().indexOf(studentId);
// 计算学生的知识点得分(客观分数) if (index != -1) {
Map<String, Double> studentObjectiveScores = calculateKnowledgeScoreRateForStudent( status = examResult.getStatus().get(index);
studentId, examResults, knowledgeMap, appraise, points break;
);
// 获取学生的主观分数
Map<String, Double> studentSubjectiveScores = subjectiveScores.getOrDefault(studentId, new HashMap<>());
// 计算综合得分主观60%客观40%
Map<String, Double> studentCompositeScores = new HashMap<>();
for (Map.Entry<String, Double> 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<String, Double> 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<String, Double> 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))); // 保留小数点后两位
} }
} }
if (status == 1) continue;
// 计算学生的知识点得分(客观分数)
Map<String, Double> studentObjectiveScores = calculateKnowledgeScoreRateForStudent(
studentId, examResults, knowledgeMap, appraise, points
);
// 获取学生的主观分数
Map<String, Double> studentSubjectiveScores = subjectiveScores.getOrDefault(studentId, new HashMap<>());
// 确定所有需要处理的评分块(合并主客观的块)
Set<String> allBlocks = new HashSet<>();
allBlocks.addAll(studentObjectiveScores.keySet());
allBlocks.addAll(studentSubjectiveScores.keySet());
// 计算综合得分主观60%客观40%
for (String block : allBlocks) {
double objectiveScore = studentObjectiveScores.getOrDefault(block, 0.0);
double subjectiveScore = studentSubjectiveScores.getOrDefault(block, 0.0);
double compositeScore = (subjectiveScore * 0.6) + (objectiveScore * 0.4);
compositeScore = Double.parseDouble(String.format("%.2f", compositeScore));
// 累加班级得分
classScoreSum.put(block, classScoreSum.getOrDefault(block, 0.0) + compositeScore);
classScoreCount.put(block, classScoreCount.getOrDefault(block, 0) + 1);
}
} }
// 初始化所有同层的父节点 // 计算班级平均得分
for (String block : classScoreSum.keySet()) {
double total = classScoreSum.get(block);
int count = classScoreCount.getOrDefault(block, 1);
classScoresInner.put(block, Double.parseDouble(String.format("%.2f", total / count)));
}
// 初始化所有同层的父节点(确保结构完整)
for (AppraiseTreeNode node : appraise.getNodes()) { for (AppraiseTreeNode node : appraise.getNodes()) {
if ("劳育".equals(node.getName())) { if ("劳育".equals(node.getName())) {
for (AppraiseTreeNode child : node.getChildren()) { node.getChildren().forEach(child ->
classScoresInner.putIfAbsent(child.getName(), 0.0); classScoresInner.putIfAbsent(child.getName(), 0.0));
}
} }
} }
// 存储班级的平均得分
classScores.put(className, classScoresInner); classScores.put(className, classScoresInner);
} }
// 5. 计算年级的平均得分 // 5. 计算年级的平均得分
Map<String, Double> gradeScoreSum = new HashMap<>(); Map<String, Double> gradeScoreSum = new HashMap<>();
Map<String, Integer> gradeScoreCount = new HashMap<>(); Map<String, Integer> gradeScoreCount = new HashMap<>();
for (Map<String, Double> classScore : classScores.values()) { classScores.values().forEach(classScore ->
for (Map.Entry<String, Double> entry : classScore.entrySet()) { classScore.forEach((block, score) -> {
String nodeName = entry.getKey(); gradeScoreSum.put(block, gradeScoreSum.getOrDefault(block, 0.0) + score);
double score = entry.getValue(); gradeScoreCount.put(block, gradeScoreCount.getOrDefault(block, 0) + 1);
gradeScoreSum.put(nodeName, gradeScoreSum.getOrDefault(nodeName, 0.0) + score); }));
gradeScoreCount.put(nodeName, gradeScoreCount.getOrDefault(nodeName, 0) + 1);
} gradeScoreSum.forEach((block, total) -> {
} int count = gradeScoreCount.getOrDefault(block, 1);
for (Map.Entry<String, Double> entry : gradeScoreSum.entrySet()) { gradeScores.put(block, Double.parseDouble(String.format("%.2f", total / count)));
String nodeName = entry.getKey(); });
double totalScore = entry.getValue();
int count = gradeScoreCount.get(nodeName); // 初始化年级层级的父节点
gradeScores.put(nodeName, Double.parseDouble(String.format("%.2f", totalScore / count))); // 保留小数点后两位
}
// 初始化所有同层的父节点
for (AppraiseTreeNode node : appraise.getNodes()) { for (AppraiseTreeNode node : appraise.getNodes()) {
if ("劳育".equals(node.getName())) { if ("劳育".equals(node.getName())) {
for (AppraiseTreeNode child : node.getChildren()) { node.getChildren().forEach(child ->
gradeScores.putIfAbsent(child.getName(), 0.0); gradeScores.putIfAbsent(child.getName(), 0.0));
}
} }
} }
// 6. 转换 gradeScores 和 classScores 为新的数据结构
// 6. 转换数据结构并返回
return getStringObjectMap(gradeName, gradeScores, classScores); return getStringObjectMap(gradeName, gradeScores, classScores);
} }

@ -14,6 +14,7 @@ public class RecordVo {
private String targetName; // 评价对象的名字 private String targetName; // 评价对象的名字
private String avatar; private String avatar;
private String className; private String className;
private String classId;
private String appraiseName; private String appraiseName;
private String targetId; // 评价对象 id private String targetId; // 评价对象 id
private String targetType; // 评价对象类型 private String targetType; // 评价对象类型

Loading…
Cancel
Save