|
@@ -0,0 +1,187 @@
|
|
|
+package com.ym.mec.biz.service.impl;
|
|
|
+
|
|
|
+import com.ym.mec.biz.dal.dao.*;
|
|
|
+import com.ym.mec.biz.dal.dto.SchoolIndexStatDto;
|
|
|
+import com.ym.mec.biz.dal.entity.LessonExamination;
|
|
|
+import com.ym.mec.biz.dal.entity.StudentRegistration;
|
|
|
+import com.ym.mec.biz.dal.entity.Subject;
|
|
|
+import com.ym.mec.biz.dal.enums.StudentMusicGroupStatusEnum;
|
|
|
+import com.ym.mec.biz.dal.wrapper.SchoolIndexStatWrapper;
|
|
|
+import com.ym.mec.biz.service.SchoolIndexStatService;
|
|
|
+import com.ym.mec.util.collection.MapUtil;
|
|
|
+import org.apache.commons.collections.CollectionUtils;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+@Service
|
|
|
+public class SchoolIndexStatServiceImpl implements SchoolIndexStatService {
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private MusicGroupDao musicGroupDao;
|
|
|
+ @Resource
|
|
|
+ private StudentRegistrationDao studentRegistrationDao;
|
|
|
+ @Resource
|
|
|
+ private SubjectDao subjectDao;
|
|
|
+ @Resource
|
|
|
+ private StudentAttendanceDao studentAttendanceDao;
|
|
|
+ @Resource
|
|
|
+ private LessonExaminationDao lessonExaminationDao;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public SchoolIndexStatDto stat(SchoolIndexStatWrapper.QueryDto queryDto) {
|
|
|
+ List<String> musicGroupIds = new ArrayList<>();
|
|
|
+ if(StringUtils.isNotEmpty(queryDto.getMusicGroupId())){
|
|
|
+ musicGroupIds.add(queryDto.getMusicGroupId());
|
|
|
+ }else {
|
|
|
+ musicGroupIds = musicGroupDao.findNormalByCooperationId(queryDto.getCoopId());
|
|
|
+ }
|
|
|
+ SchoolIndexStatDto result = new SchoolIndexStatDto();
|
|
|
+ if(CollectionUtils.isEmpty(musicGroupIds)){
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ List<StudentRegistration> studentRegistrations = studentRegistrationDao.findByMusicGroupIds(musicGroupIds, StudentMusicGroupStatusEnum.NORMAL);
|
|
|
+ if(CollectionUtils.isEmpty(studentRegistrations)){
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ Map<String, String> musicNameMap = MapUtil.convertMybatisMap(musicGroupDao.queryMusicGroupNameMap(new HashSet<>(musicGroupIds)));
|
|
|
+
|
|
|
+ List<Integer> subjectIdList = studentRegistrations.stream().map(e -> e.getActualSubjectId()).collect(Collectors.toList());
|
|
|
+ Map<Integer, String> subjectMap = subjectDao.findBySubjectIds(subjectIdList).stream().collect(Collectors.toMap(Subject::getId, s -> s.getName(), (s1, s2) -> s1));
|
|
|
+ //年级分布
|
|
|
+ List<SchoolIndexStatWrapper.GradeDistribution> gradeDistributions = studentRegistrations.stream()
|
|
|
+ .collect(Collectors.groupingBy(
|
|
|
+ e -> e.getCurrentGrade(),
|
|
|
+ Collectors.collectingAndThen(
|
|
|
+ Collectors.toList(),
|
|
|
+ v -> v.stream().map(e -> e.getUserId()).distinct().count()
|
|
|
+ )
|
|
|
+ ))
|
|
|
+ .entrySet().stream()
|
|
|
+ .map(entry -> {
|
|
|
+ SchoolIndexStatWrapper.GradeDistribution distribution = new SchoolIndexStatWrapper.GradeDistribution();
|
|
|
+ distribution.setGrade(entry.getKey());
|
|
|
+ distribution.setStudentNum(entry.getValue());
|
|
|
+ return distribution;
|
|
|
+ })
|
|
|
+ .sorted(Comparator.comparing(SchoolIndexStatWrapper.GradeDistribution::getGrade))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ result.setGradeDistributions(gradeDistributions);
|
|
|
+ //声部分布
|
|
|
+ List<SchoolIndexStatWrapper.SubjectDistribution> subjectDistributions = studentRegistrations.stream()
|
|
|
+ .collect(Collectors.groupingBy(
|
|
|
+ e -> e.getActualSubjectId(),
|
|
|
+ Collectors.collectingAndThen(
|
|
|
+ Collectors.toList(),
|
|
|
+ v -> v.stream().map(e -> e.getUserId()).distinct().count()
|
|
|
+ )
|
|
|
+ ))
|
|
|
+ .entrySet().stream()
|
|
|
+ .map(entry -> {
|
|
|
+ SchoolIndexStatWrapper.SubjectDistribution distribution = new SchoolIndexStatWrapper.SubjectDistribution();
|
|
|
+ distribution.setSubjectName(subjectMap.get(entry.getKey()));
|
|
|
+ distribution.setStudentNum(entry.getValue());
|
|
|
+ return distribution;
|
|
|
+ })
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ result.setSubjectDistributions(subjectDistributions);
|
|
|
+ //乐团年级分布
|
|
|
+ List<SchoolIndexStatWrapper.MusicGradeDistribution> musicGradeDistributions = new ArrayList<>();
|
|
|
+ //按乐团分组
|
|
|
+ Map<String, List<StudentRegistration>> musicGroupMap = studentRegistrations.stream().collect(Collectors.groupingBy(StudentRegistration::getMusicGroupId));
|
|
|
+ musicGroupMap.forEach((musicGroupId, registrations) -> {
|
|
|
+ //按年级分组
|
|
|
+ Map<String, List<StudentRegistration>> gradeMap = registrations.stream().collect(Collectors.groupingBy(StudentRegistration::getCurrentGrade));
|
|
|
+ gradeMap.forEach((grade, registrationList) -> {
|
|
|
+ SchoolIndexStatWrapper.MusicGradeDistribution gradeDistribution = new SchoolIndexStatWrapper.MusicGradeDistribution();
|
|
|
+ gradeDistribution.setGrade(grade);
|
|
|
+ gradeDistribution.setStudentNum(registrationList.stream().map(StudentRegistration::getUserId).distinct().count());
|
|
|
+ gradeDistribution.setMusicGroupName(musicNameMap.get(musicGroupId));
|
|
|
+ gradeDistribution.setSubjectId(0);
|
|
|
+ musicGradeDistributions.add(gradeDistribution);
|
|
|
+
|
|
|
+ //按声部分组
|
|
|
+ Map<Integer, Long> registrationSubjectMap = registrationList.stream()
|
|
|
+ .collect(Collectors.groupingBy(StudentRegistration::getActualSubjectId,
|
|
|
+ Collectors.collectingAndThen(
|
|
|
+ Collectors.toList(),
|
|
|
+ v -> v.stream().map(StudentRegistration::getUserId).distinct().count())
|
|
|
+ ));
|
|
|
+ registrationSubjectMap.forEach((subjectId, studentNum) -> {
|
|
|
+ SchoolIndexStatWrapper.MusicGradeDistribution musicGradeDistribution = new SchoolIndexStatWrapper.MusicGradeDistribution();
|
|
|
+ musicGradeDistribution.setGrade(grade);
|
|
|
+ musicGradeDistribution.setStudentNum(studentNum);
|
|
|
+ musicGradeDistribution.setSubjectName(subjectMap.get(subjectId));
|
|
|
+ musicGradeDistribution.setMusicGroupName(musicNameMap.get(musicGroupId));
|
|
|
+ musicGradeDistribution.setSubjectId(subjectId);
|
|
|
+ musicGradeDistributions.add(musicGradeDistribution);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ });
|
|
|
+ result.setMusicGradeDistributions(musicGradeDistributions);
|
|
|
+
|
|
|
+ //声部年级分组
|
|
|
+ List<SchoolIndexStatWrapper.SubjectGradeDistribution> subjectGradeDistributions = new ArrayList<>();
|
|
|
+ Map<Integer, List<StudentRegistration>> subjectGradeMap = studentRegistrations.stream().collect(Collectors.groupingBy(e -> e.getActualSubjectId()));
|
|
|
+ for (Integer subjectId : subjectGradeMap.keySet()) {
|
|
|
+ List<StudentRegistration> registrations = subjectGradeMap.get(subjectId);
|
|
|
+ SchoolIndexStatWrapper.SubjectGradeDistribution subjectGradeDistribution = new SchoolIndexStatWrapper.SubjectGradeDistribution();
|
|
|
+ subjectGradeDistribution.setGrade("总人数");
|
|
|
+ subjectGradeDistribution.setStudentNum(registrations.stream().map(e-> e.getUserId()).distinct().count());
|
|
|
+ subjectGradeDistribution.setSubjectName(subjectMap.get(subjectId));
|
|
|
+ subjectGradeDistribution.setSubjectId(subjectId);
|
|
|
+ subjectGradeDistributions.add(subjectGradeDistribution);
|
|
|
+ //按年级分组
|
|
|
+ Map<String, List<StudentRegistration>> gradeMap = registrations.stream().collect(Collectors.groupingBy(e -> e.getCurrentGrade()));
|
|
|
+ for (String grade : gradeMap.keySet()) {
|
|
|
+ SchoolIndexStatWrapper.SubjectGradeDistribution gradeDistribution = new SchoolIndexStatWrapper.SubjectGradeDistribution();
|
|
|
+ gradeDistribution.setGrade(grade);
|
|
|
+ gradeDistribution.setStudentNum(gradeMap.get(grade).stream().map(e-> e.getUserId()).distinct().count());
|
|
|
+ gradeDistribution.setSubjectName(subjectMap.get(subjectId));
|
|
|
+ gradeDistribution.setSubjectId(subjectId);
|
|
|
+ subjectGradeDistributions.add(gradeDistribution);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ result.setSubjectGradeDistributions(subjectGradeDistributions);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public SchoolIndexStatWrapper.StudentAttendance attendanceStat(SchoolIndexStatWrapper.QueryDto queryDto) {
|
|
|
+ List<String> musicGroupIds = new ArrayList<>();
|
|
|
+ if(StringUtils.isNotEmpty(queryDto.getMusicGroupId())){
|
|
|
+ musicGroupIds.add(queryDto.getMusicGroupId());
|
|
|
+ }else {
|
|
|
+ musicGroupIds = musicGroupDao.findNormalByCooperationId(queryDto.getCoopId());
|
|
|
+ }
|
|
|
+ if(CollectionUtils.isEmpty(musicGroupIds)){
|
|
|
+ return new SchoolIndexStatWrapper.StudentAttendance();
|
|
|
+ }
|
|
|
+ //获取学员考勤数据
|
|
|
+ SchoolIndexStatWrapper.StudentAttendance studentAttendance = studentAttendanceDao.statCoopAttendance(musicGroupIds,queryDto);
|
|
|
+ if(Objects.nonNull(studentAttendance)){
|
|
|
+ int num = studentAttendance.getNormalNum() + studentAttendance.getLateNum();
|
|
|
+ if(num > 0){
|
|
|
+ studentAttendance.setAttendanceRate(num / studentAttendance.getTotalNum());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return studentAttendance;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public SchoolIndexStatWrapper.StudentLesson lessonStat(SchoolIndexStatWrapper.QueryDto queryDto) {
|
|
|
+ List<String> musicGroupIds = new ArrayList<>();
|
|
|
+ if(StringUtils.isNotEmpty(queryDto.getMusicGroupId())){
|
|
|
+ musicGroupIds.add(queryDto.getMusicGroupId());
|
|
|
+ }else {
|
|
|
+ musicGroupIds = musicGroupDao.findNormalByCooperationId(queryDto.getCoopId());
|
|
|
+ }
|
|
|
+ if(CollectionUtils.isEmpty(musicGroupIds)){
|
|
|
+ return new SchoolIndexStatWrapper.StudentLesson();
|
|
|
+ }
|
|
|
+ return lessonExaminationDao.schoolLessonStat(musicGroupIds,queryDto);
|
|
|
+ }
|
|
|
+}
|