update 调整算法

develop
hhb@hotmail.com 2 months ago
parent 523de5aed6
commit 8ec3179cbb

@ -311,10 +311,12 @@ public class LaborEducationServiceImpl implements LaborEducationService {
*/ */
double finalCount = convertedScore; double finalCount = convertedScore;
double finalScore = score / knowledgeBlockCount; double finalScore = score / knowledgeBlockCount;
finalScore = Double.parseDouble(String.format("%.2f", finalScore));
double finalScore1 = finalScore;
combinedScores.put(knowledgeBlock, new HashMap<String, Object>() {{ combinedScores.put(knowledgeBlock, new HashMap<String, Object>() {{
put("count", finalCount); put("count", finalCount);
put("objectiveScore", objectiveScore); put("objectiveScore", objectiveScore);
put("compositeScore", finalScore); put("compositeScore", finalScore1);
}}); }});
//combinedScores.put(knowledgeBlock, objectiveScore); //combinedScores.put(knowledgeBlock, objectiveScore);
@ -741,7 +743,8 @@ public class LaborEducationServiceImpl implements LaborEducationService {
Map<String, List<Double>> points, Map<String, List<Double>> points,
Map<String, Double> knowledgeTotalScore) { Map<String, Double> knowledgeTotalScore) {
// 记录每个知识点的考试次数 // 记录每个知识点在所有考试中的平均分总和及考试次数
Map<String, Double> knowledgeTotalAverage = new HashMap<>();
Map<String, Integer> knowledgeExamCount = new HashMap<>(); Map<String, Integer> knowledgeExamCount = new HashMap<>();
// 过滤出当前学生的考试结果 // 过滤出当前学生的考试结果
@ -749,52 +752,57 @@ public class LaborEducationServiceImpl implements LaborEducationService {
int studentIndex = examResult.getStudentIds().indexOf(studentId); int studentIndex = examResult.getStudentIds().indexOf(studentId);
if (studentIndex == -1) continue; if (studentIndex == -1) continue;
int status = examResult.getStatus().get(studentIndex); int status = examResult.getStatus().get(studentIndex);
if (status == 1) continue; if (status == 1) continue; // 跳过无效考试
// 获取该考试的知识点 // 获取当前考试的知识点和题目分数
List<List<String>> knowledgeList = knowledgeMap.get(examResult.getExamId()); List<List<String>> knowledgeList = knowledgeMap.get(examResult.getExamId());
List<Double> point = points.get(examResult.getExamId()); List<Double> pointList = points.get(examResult.getExamId());
if (knowledgeList == null) continue; if (knowledgeList == null || pointList == null) continue;
// 检查 studentScores 是否为空或越界 // 获取学生的得分列表
List<List<Double>> studentScores = examResult.getStudentScores(); List<List<Double>> studentScores = examResult.getStudentScores();
if (studentIndex >= studentScores.size() || studentScores.get(studentIndex) == null) { if (studentIndex >= studentScores.size() || studentScores.get(studentIndex) == null) continue;
continue;
}
// 获取当前学生的成绩列表
List<Double> studentScoreList = studentScores.get(studentIndex); List<Double> studentScoreList = studentScores.get(studentIndex);
// 确保知识列表、分数列表和学生成绩列表的大小一致 // 确保数据一致性
if (knowledgeList.size() != point.size() || knowledgeList.size() != studentScoreList.size()) { if (knowledgeList.size() != studentScoreList.size()) continue;
continue;
}
// 遍历每道题的得分和知识点 // 记录当前考试中每个知识点的总得分和题目数量
Map<String, Double> currentExamKnowledgeTotal = new HashMap<>();
Map<String, Integer> currentExamKnowledgeCount = new HashMap<>();
// 遍历每道题
for (int i = 0; i < studentScoreList.size(); i++) { for (int i = 0; i < studentScoreList.size(); i++) {
String knowledge = knowledgeList.get(i).get(0); // 每题的第一个知识点 String knowledge = knowledgeList.get(i).get(0); // 取第一个知识点
double studentScore = studentScoreList.get(i); // 学生的得分 double score = studentScoreList.get(i);
// 累加当前考试中该知识点的总得分和题目数量
currentExamKnowledgeTotal.merge(knowledge, score, Double::sum);
currentExamKnowledgeCount.merge(knowledge, 1, Integer::sum);
}
// 累加知识点总分 // 计算当前考试中每个知识点的平均分,并累加到总平均分
knowledgeTotalScore.put(knowledge, knowledgeTotalScore.getOrDefault(knowledge, 0.0) + studentScore); for (String knowledge : currentExamKnowledgeTotal.keySet()) {
double total = currentExamKnowledgeTotal.get(knowledge);
int count = currentExamKnowledgeCount.get(knowledge);
double average = total / count; // 当前考试内该知识点的平均分
// 记录该知识点的考试次数 // 将该考试的平均分累加到总平均分中,并增加考试次数
knowledgeExamCount.put(knowledge, knowledgeExamCount.getOrDefault(knowledge, 0) + 1); knowledgeTotalAverage.merge(knowledge, average, Double::sum);
knowledgeExamCount.merge(knowledge, 1, Integer::sum);
} }
} }
// 计算每个知识点的平均分 // 计算每个知识点的最终平均分(所有考试平均分的平均)
Map<String, Double> knowledgeAverageScore = new HashMap<>(); for (String knowledge : knowledgeTotalAverage.keySet()) {
for (Map.Entry<String, Double> entry : knowledgeTotalScore.entrySet()) { double totalAverage = knowledgeTotalAverage.get(knowledge);
String knowledge = entry.getKey(); int examCount = knowledgeExamCount.getOrDefault(knowledge, 1);
double totalScore = entry.getValue(); double finalAverage = totalAverage / examCount;
int examCount = knowledgeExamCount.getOrDefault(knowledge, 1); // 避免除零 knowledgeTotalScore.put(knowledge, finalAverage);
double averageScore = totalScore / examCount;
knowledgeAverageScore.put(knowledge, averageScore);
} }
// 返回知识点平均分 // 返回知识点平均分对象列表
return knowledgeAverageScore.entrySet().stream() return knowledgeTotalScore.entrySet().stream()
.map(entry -> new KnowledgeScoreRate(entry.getKey(), entry.getValue())) .map(entry -> new KnowledgeScoreRate(entry.getKey(), entry.getValue()))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }

@ -72,7 +72,7 @@ public interface AppraiseRecordRepository extends CosmosRepository<AppraiseRecor
/** /**
* , * ,
*/ */
@Query("select c.id as recordId, c.name as targetName, c.avatar, c.classId,c.className, n.id as recordNodeId, c.targetId, c.targetType, n.creator, n.createTime, n.appraiseNode.name as appraiseName, n.appraiseNode.isPraise, n.device from Student as c join n in c.nodes where " + @Query("select c.id as recordId, c.name as targetName, c.avatar, c.classId,c.className, n.id as recordNodeId, c.targetId, c.targetType, n.creator, n.createTime, n.appraiseNode.name as appraiseName, n.appraiseNode.isPraise, n.device ,n.appraiseNode.path from Student as c join n in c.nodes where " +
"c.code = @code and " + "c.code = @code and " +
"c.academicYearId = @academicYearId and " + "c.academicYearId = @academicYearId and " +
"(IS_NULL(@startTime) or n.createTime >= @startTime) and " + "(IS_NULL(@startTime) or n.createTime >= @startTime) and " +

Loading…
Cancel
Save