update 完成个人考试数据分析

develop
hhb@hotmail.com 3 weeks ago
parent dbd9aed46f
commit 1bae224374

@ -50,4 +50,10 @@ public class LaborEducationController {
Map<String,List<Map<String, Object>>> res = laborEducationService.getStudentMonthlyScores(laborDto,request); Map<String,List<Map<String, Object>>> res = laborEducationService.getStudentMonthlyScores(laborDto,request);
return R.success(res); return R.success(res);
} }
@PostMapping("getExamDetails")
@ApiOperation("获取指定考试数据")
public R<Map<String, Object>> getExamDetails(@Valid @RequestBody LaborDto laborDto, HttpServletRequest request) {
Map<String, Object> res = laborEducationService.getExamDetails(laborDto,request);
return R.success(res);
}
} }

@ -48,4 +48,11 @@ public class MoralEducationController {
Map<String,List<Map<String, Object>>> res = moralEducationService.getStudentMonthlyScores(laborDto,request); Map<String,List<Map<String, Object>>> res = moralEducationService.getStudentMonthlyScores(laborDto,request);
return R.success(res); return R.success(res);
} }
@PostMapping("getExamDetails")
@ApiOperation("获取指定考试数据")
public R<Map<String, Object>> getExamDetails(@Valid @RequestBody LaborDto laborDto, HttpServletRequest request) {
Map<String, Object> res = moralEducationService.getExamDetails(laborDto,request);
return R.success(res);
}
} }

@ -14,4 +14,5 @@ public interface LaborEducationService {
Map<String,Object> getDetails(FindDto findDto, HttpServletRequest request); Map<String,Object> getDetails(FindDto findDto, HttpServletRequest request);
Map<String,Object> getStudentSemesterScores(LaborDto laborDto, HttpServletRequest request); Map<String,Object> getStudentSemesterScores(LaborDto laborDto, HttpServletRequest request);
Map<String,List<Map<String, Object>>> getStudentMonthlyScores(LaborDto laborDto,HttpServletRequest request); Map<String,List<Map<String, Object>>> getStudentMonthlyScores(LaborDto laborDto,HttpServletRequest request);
Map<String,Object> getExamDetails(LaborDto laborDto,HttpServletRequest request);
} }

@ -12,4 +12,5 @@ public interface MoralEducationService {
Map<String,Object> getDetails(FindDto findDto, HttpServletRequest request); Map<String,Object> getDetails(FindDto findDto, HttpServletRequest request);
Map<String,Object> getStudentSemesterScores(LaborDto laborDto, HttpServletRequest request); Map<String,Object> getStudentSemesterScores(LaborDto laborDto, HttpServletRequest request);
Map<String,List<Map<String, Object>>> getStudentMonthlyScores(LaborDto laborDto,HttpServletRequest request); Map<String,List<Map<String, Object>>> getStudentMonthlyScores(LaborDto laborDto,HttpServletRequest request);
Map<String,Object> getExamDetails(LaborDto laborDto,HttpServletRequest request);
} }

@ -92,7 +92,7 @@ public class LaborEducationServiceImpl implements LaborEducationService {
Long startTime = laborDto.getStartTime(); Long startTime = laborDto.getStartTime();
Long endTime = laborDto.getEndTime(); Long endTime = laborDto.getEndTime();
String subjectId = laborDto.getSubjectId(); String subjectId = laborDto.getSubjectId();
String tmdId = laborDto.getTmdId(); //String tmdId = laborDto.getTmdId();
String grade = laborDto.getGrade(); String grade = laborDto.getGrade();
String periodId = laborDto.getPeriodId(); String periodId = laborDto.getPeriodId();
String academicYearId = laborDto.getAcademicYearId(); String academicYearId = laborDto.getAcademicYearId();
@ -241,6 +241,79 @@ public class LaborEducationServiceImpl implements LaborEducationService {
} }
return resMap; return resMap;
} }
@Override
public Map<String, Object> getExamDetails(LaborDto laborDto, HttpServletRequest request) {
Map<String, Object> resMap = new HashMap<>();
try {
List<ExamClassResult> examResults = new ArrayList<>();
if (!laborDto.getExamId().isEmpty()) {
Map<String, List<List<String>>> knowledgeMap = new HashMap<>();
Map<String, List<Double>> points = new HashMap<>();
// 1. 查询考试信息
Exam exam = examRepository.findExamById(String.format(PK.EXAM, laborDto.getTmdId()), laborDto.getExamId()).get(0);
if (exam.getPapers() != null && !exam.getPapers().isEmpty()) {
knowledgeMap.put(exam.getId(), exam.getPapers().get(0).getKnowledge());
points.put(exam.getId(), exam.getPapers().get(0).getPoint());
}
// 2. 查询考试结果
examResults = examClassResultRepository.findById(
String.format(PK.CLASS_RESULT, laborDto.getCode()),
laborDto.getClassId(),
laborDto.getExamId()
);
// 3. 查询知识块-知识点映射关系
Appraise appraise = appraiseRepository.findAppraiseBySchoolIdAndPeriodIdAndCode(
laborDto.getCode(),
laborDto.getPeriodId(),
PK.PK_APPRAISE
);
appraise = evaluationService.buildTree(appraise);
Map<String, List<String>> knowledgeBlockToPointsMap = getKnowledgeBlockToPointsMap(appraise);
// 4. 计算每个知识点的得分(调用 calculateStudentScoreRates
Map<String, Double> knowledgeTotalScore = new HashMap<>();
if (!examResults.isEmpty()) {
// 假设计算所有学生的平均分(或指定某个学生)
String studentId = laborDto.getStudentId(); // 如果传入了学生ID
calculateStudentScoreRates(studentId, examResults, knowledgeMap, points, knowledgeTotalScore);
} else {
// 如果没有考试数据默认所有知识点60分
knowledgeMap.values().stream()
.flatMap(List::stream)
.flatMap(List::stream)
.forEach(knowledge -> knowledgeTotalScore.put(knowledge, 60.0));
}
// 5. 按知识块分组,计算每个知识块下知识点的得分
List<Map<String, Object>> knowledgeBlockScores = new ArrayList<>();
for (Map.Entry<String, List<String>> entry : knowledgeBlockToPointsMap.entrySet()) {
String blockName = entry.getKey();
List<String> knowledgePoints = entry.getValue();
List<Map<String, Object>> pointScores = new ArrayList<>();
for (String point : knowledgePoints) {
double score = knowledgeTotalScore.getOrDefault(point, 60.0); // 默认60分
pointScores.add(new HashMap<String, Object>() {{
put("name", point);
put("score", score);
}});
}
knowledgeBlockScores.add(new HashMap<String, Object>() {{
put("name", blockName);
put("children", pointScores);
}});
}
resMap.put("data", knowledgeBlockScores);
}
} catch (Exception e) {
throw new ServiceException(ErrorCode.SYSTEM_ERROR.getCode(), "数据查询异常");
}
return resMap;
}
public List<Map<String, Object>> combineScoresWithExamResults( public List<Map<String, Object>> combineScoresWithExamResults(
List<Map<String, Object>> scores, List<Map<String, Object>> scores,

@ -1465,6 +1465,81 @@ public class MoralEducationServiceImpl implements MoralEducationService {
); );
} }
@Override
public Map<String, Object> getExamDetails(LaborDto laborDto, HttpServletRequest request) {
Map<String, Object> resMap = new HashMap<>();
try {
List<ExamClassResult> examResults = new ArrayList<>();
if (!laborDto.getExamId().isEmpty()) {
Map<String, List<List<String>>> knowledgeMap = new HashMap<>();
Map<String, List<Double>> points = new HashMap<>();
// 1. 查询考试信息
Exam exam = examRepository.findExamById(String.format(PK.EXAM, laborDto.getTmdId()), laborDto.getExamId()).get(0);
if (exam.getPapers() != null && !exam.getPapers().isEmpty()) {
knowledgeMap.put(exam.getId(), exam.getPapers().get(0).getKnowledge());
points.put(exam.getId(), exam.getPapers().get(0).getPoint());
}
// 2. 查询考试结果
examResults = examClassResultRepository.findById(
String.format(PK.CLASS_RESULT, laborDto.getCode()),
laborDto.getClassId(),
laborDto.getExamId()
);
// 3. 查询知识块-知识点映射关系
Appraise appraise = appraiseRepository.findAppraiseBySchoolIdAndPeriodIdAndCode(
laborDto.getCode(),
laborDto.getPeriodId(),
PK.PK_APPRAISE
);
appraise = evaluationService.buildTree(appraise);
Map<String, List<String>> knowledgeBlockToPointsMap = getKnowledgeBlockToPointsMap(appraise);
// 4. 计算每个知识点的得分(调用 calculateStudentScoreRates
Map<String, Double> knowledgeTotalScore = new HashMap<>();
if (!examResults.isEmpty()) {
// 假设计算所有学生的平均分(或指定某个学生)
String studentId = laborDto.getStudentId(); // 如果传入了学生ID
calculateStudentScoreRates(studentId, examResults, knowledgeMap, points, knowledgeTotalScore);
} else {
// 如果没有考试数据默认所有知识点60分
knowledgeMap.values().stream()
.flatMap(List::stream)
.flatMap(List::stream)
.forEach(knowledge -> knowledgeTotalScore.put(knowledge, 60.0));
}
// 5. 按知识块分组,计算每个知识块下知识点的得分
List<Map<String, Object>> knowledgeBlockScores = new ArrayList<>();
for (Map.Entry<String, List<String>> entry : knowledgeBlockToPointsMap.entrySet()) {
String blockName = entry.getKey();
List<String> knowledgePoints = entry.getValue();
List<Map<String, Object>> pointScores = new ArrayList<>();
for (String point : knowledgePoints) {
double score = knowledgeTotalScore.getOrDefault(point, 60.0); // 默认60分
pointScores.add(new HashMap<String, Object>() {{
put("name", point);
put("score", score);
}});
}
knowledgeBlockScores.add(new HashMap<String, Object>() {{
put("name", blockName);
put("children", pointScores);
}});
}
resMap.put("data", knowledgeBlockScores);
}
} catch (Exception e) {
throw new ServiceException(ErrorCode.SYSTEM_ERROR.getCode(), "数据查询异常");
}
return resMap;
}
// 新增方法:添加综合得分 // 新增方法:添加综合得分
private List<Map<String, Object>> addOverallScore( private List<Map<String, Object>> addOverallScore(

@ -26,4 +26,5 @@ public class LaborDto {
private String source = "1"; private String source = "1";
private String studentId; private String studentId;
private String targetType; // "student" 或 "class" private String targetType; // "student" 或 "class"
private String examId;
} }

Loading…
Cancel
Save