| 
					
				 | 
			
			
				@@ -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); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |