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