فهرست منبع

Merge branch 'feature/0427-school' of http://git.dayaedu.com/yonge/mec into feature/0427-school

liujc 2 سال پیش
والد
کامیت
e0f2d2ebd2

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/LessonExaminationDao.java

@@ -7,6 +7,7 @@ import com.ym.mec.biz.dal.dto.LessonExaminationResultDto2;
 import com.ym.mec.biz.dal.dto.LessonExaminationSaveDto;
 import com.ym.mec.biz.dal.entity.LessonExamination;
 import com.ym.mec.biz.dal.entity.Subject;
+import com.ym.mec.biz.dal.wrapper.SchoolIndexStatWrapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.Date;
@@ -40,5 +41,8 @@ public interface LessonExaminationDao extends BaseMapper<LessonExamination> {
     List<LessonExamination> queryEndList();
 
     List<Subject> querySubject(@Param("lessonExaminationId") Long lessonExaminationId);
+
+    SchoolIndexStatWrapper.StudentLesson schoolLessonStat(@Param("musicGroupIds") List<String> musicGroupIds,
+                                                          @Param("queryDto") SchoolIndexStatWrapper.QueryDto queryDto);
 }
 

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentAttendanceDao.java

@@ -6,6 +6,7 @@ import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
 import com.ym.mec.biz.dal.school.dto.ClassesForDayDto;
 import com.ym.mec.biz.dal.school.dto.CourseStudentDto;
+import com.ym.mec.biz.dal.wrapper.SchoolIndexStatWrapper;
 import com.ym.mec.biz.dal.wrapper.StudentWrapper;
 import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Delete;
@@ -381,4 +382,15 @@ public interface StudentAttendanceDao extends BaseDAO<Long, StudentAttendance> {
      * @return
      */
     List<StudentAttendance> getStudentAttendance(@Param("param") StudentWrapper.StudentAttendanceQuery studentAttendanceQuery);
+
+    /**
+    * @description: 统计学校端学员考勤信息
+     * @param musicGroupIds
+     * @param queryDto
+    * @return java.util.List<com.ym.mec.biz.dal.wrapper.SchoolIndexStatWrapper.StudentAttendance>
+    * @author zx
+    * @date 2023/5/12 16:25
+    */
+    SchoolIndexStatWrapper.StudentAttendance statCoopAttendance(@Param("musicGroupIds") List<String> musicGroupIds,
+                                                                      @Param("queryDto") SchoolIndexStatWrapper.QueryDto queryDto);
 }

+ 29 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SchoolIndexStatDto.java

@@ -0,0 +1,29 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.wrapper.SchoolIndexStatWrapper;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class SchoolIndexStatDto {
+
+    @ApiModelProperty("年级分布")
+    private List<SchoolIndexStatWrapper.GradeDistribution> gradeDistributions;
+
+    @ApiModelProperty("声部分布")
+    private List<SchoolIndexStatWrapper.SubjectDistribution> subjectDistributions;
+
+    @ApiModelProperty("乐团年级分布")
+    private List<SchoolIndexStatWrapper.MusicGradeDistribution> musicGradeDistributions;
+
+    @ApiModelProperty("年级声部分布")
+    private List<SchoolIndexStatWrapper.SubjectGradeDistribution> subjectGradeDistributions;
+
+    @ApiModelProperty("学员出勤")
+    private SchoolIndexStatWrapper.StudentAttendance studentAttendance;
+
+    @ApiModelProperty("学员练习")
+    private SchoolIndexStatWrapper.StudentLesson studentLessons;
+}

+ 0 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/school/dto/ClassesForDayDto.java

@@ -49,9 +49,6 @@ public class ClassesForDayDto {
     @ApiModelProperty(value = "旷课人数",required = false)
     private Integer attendanceTruantNum;
 
-    @ApiModelProperty(value = "退学人数",required = false)
-    private Integer attendanceDropNum;
-
     @ApiModelProperty(value = "教学模式",required = false)
     private TeachModeEnum teachMode;
 

+ 127 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/SchoolIndexStatWrapper.java

@@ -0,0 +1,127 @@
+package com.ym.mec.biz.dal.wrapper;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+public class SchoolIndexStatWrapper {
+
+    @Data
+    @ApiModel(" QueryDto-查询接口参数")
+    public static class QueryDto {
+
+        @ApiModelProperty("合作单位编号")
+        private Integer coopId;
+
+        @ApiModelProperty("乐团编号")
+        private String musicGroupId;
+
+        @ApiModelProperty("开始时间(年月日)")
+        private String startTime;
+
+        @ApiModelProperty("截止时间(年月日)")
+        private String endTime;
+    }
+
+    @Data
+    @ApiModel(" GradeDistribution-年级分布")
+    public static class GradeDistribution {
+
+        @ApiModelProperty("年级")
+        private String grade;
+
+        @ApiModelProperty("在读人数")
+        private Long studentNum;
+    }
+
+    @Data
+    @ApiModel(" GradeDistribution-声部分布")
+    public static class SubjectDistribution {
+
+        @ApiModelProperty("声部")
+        private String subjectName;
+
+        @ApiModelProperty("在读人数")
+        private Long studentNum;
+    }
+
+    @Data
+    @ApiModel(" MusicGradeDistribution-乐团年级分布")
+    public static class MusicGradeDistribution {
+
+        @ApiModelProperty("乐团名称")
+        private String musicGroupName;
+
+        @ApiModelProperty("声部名称")
+        private String subjectName;
+
+        @ApiModelProperty("声部编号")
+        private Integer subjectId;
+
+        @ApiModelProperty("年级")
+        private String grade;
+
+        @ApiModelProperty("在读人数")
+        private Long studentNum;
+    }
+
+    @Data
+    @ApiModel(" MusicGradeDistribution-声部年级分布")
+    public static class SubjectGradeDistribution {
+
+        @ApiModelProperty("声部编号")
+        private Integer subjectId;
+
+        @ApiModelProperty("声部名称")
+        private String subjectName;
+
+        @ApiModelProperty("年级")
+        private String grade;
+
+        @ApiModelProperty("在读人数")
+        private Long studentNum;
+    }
+
+    @Data
+    @ApiModel(" StudentAttendance-学员考勤数据")
+    public static class StudentAttendance {
+
+        @ApiModelProperty("正常人数")
+        private Integer normalNum = 0;
+
+        @ApiModelProperty("迟到人数")
+        private Integer lateNum = 0;
+
+        @ApiModelProperty("旷课人数")
+        private Integer truantNum = 0;
+
+        @ApiModelProperty("请假人数")
+        private Integer leaveNum = 0;
+
+        @ApiModelProperty("总人数")
+        private Integer totalNum = 0;
+
+        @ApiModelProperty("出勤率")
+        private Integer attendanceRate = 0;
+    }
+
+    @Data
+    @ApiModel(" StudentLesson-学员练习数据")
+    public static class StudentLesson {
+
+        @ApiModelProperty("应交人数")
+        private Integer expectNum;
+
+        @ApiModelProperty("实际提交人数")
+        private Integer actualNum;
+
+        @ApiModelProperty("合格提交人数")
+        private Integer passNum;
+
+        @ApiModelProperty("提交率")
+        private Integer commitRate;
+
+        @ApiModelProperty("合格率")
+        private Integer passRate;
+    }
+}

+ 34 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SchoolIndexStatService.java

@@ -0,0 +1,34 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.dto.SchoolIndexStatDto;
+import com.ym.mec.biz.dal.wrapper.SchoolIndexStatWrapper;
+
+public interface SchoolIndexStatService{
+
+    /**
+    * @description: 学校首页统计
+     * @param queryDto
+    * @return com.ym.mec.biz.dal.dto.SchoolIndexStatDto
+    * @author zx
+    * @date 2023/5/12 10:57
+    */
+    SchoolIndexStatDto stat(SchoolIndexStatWrapper.QueryDto queryDto);
+
+    /**
+    * @description: 学员出勤统计
+     * @param queryDto
+    * @return com.ym.mec.biz.dal.wrapper.SchoolIndexStatWrapper.StudentAttendance
+    * @author zx
+    * @date 2023/5/12 17:05
+    */
+    SchoolIndexStatWrapper.StudentAttendance attendanceStat(SchoolIndexStatWrapper.QueryDto queryDto);
+
+    /**
+    * @description: 学员练习统计
+     * @param queryDto
+    * @return com.ym.mec.biz.dal.wrapper.SchoolIndexStatWrapper.StudentLesson
+    * @author zx
+    * @date 2023/5/12 17:05
+    */
+    SchoolIndexStatWrapper.StudentLesson lessonStat(SchoolIndexStatWrapper.QueryDto queryDto);
+}

+ 0 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -6267,7 +6267,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 					dto.setAttendanceLateNum(dayDto.getAttendanceLateNum());
 					dto.setAttendanceLeaveNum(dayDto.getAttendanceLeaveNum());
 					dto.setAttendanceTruantNum(dayDto.getAttendanceTruantNum());
-					dto.setAttendanceDropNum(dayDto.getAttendanceDropNum());
 				}
 				Long homeworkId = homeworkMap.get(dayDto.getCourseId());
 				if(homeworkId != null){

+ 187 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SchoolIndexStatServiceImpl.java

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

+ 25 - 0
mec-biz/src/main/resources/config/mybatis/LessonExaminationMapper.xml

@@ -161,5 +161,30 @@
         where sle.lesson_examination_id_ = #{lessonExaminationId}
         group by s.id_
     </select>
+    <select id="schoolLessonStat" resultType="com.ym.mec.biz.dal.wrapper.SchoolIndexStatWrapper$StudentLesson">
+        select SUM(cs.expectNum) expectNum,SUM(cs.actualNum) actualNum,SUM(cs.passNum) passNum,
+        TRUNCATE(SUM(cs.actualNum)/SUM(cs.expectNum),1) commitRate,
+        TRUNCATE(SUM(cs.passNum)/SUM(cs.expectNum),1) passRate
+        from (
+        select ch.expect_num_ expectNum,ch.completed_num_ actualNum,ch.completed_num_ passNum from
+        course_homework ch
+        left join course_schedule cs ON cs.id_ = ch.course_schedule_id_
+        where CONCAT(cs.class_date_,' ',cs.start_class_time_) &lt; NOW()
+        AND cs.music_group_id_ IN
+        <foreach collection="musicGroupIds" close=")" open="(" separator="," item="item">
+            #{item}
+        </foreach>
+        AND cs.class_date_ BETWEEN #{queryDto.startTime} AND #{queryDto.endTime}
+        UNION ALL
+        select le.expect_num_ expectNum,le.training_num_ actualNum,le.standard_num_ passNum from lesson_examination le
+        left join course_schedule cs ON cs.id_ = le.course_schedule_id_
+        where CONCAT(cs.class_date_,' ',cs.start_class_time_) &lt; NOW()
+        AND cs.music_group_id_ IN
+        <foreach collection="musicGroupIds" close=")" open="(" separator="," item="item">
+            #{item}
+        </foreach>
+        AND cs.class_date_ BETWEEN #{queryDto.startTime} AND #{queryDto.endTime}
+        )
+    </select>
 
 </mapper>

+ 18 - 2
mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml

@@ -679,7 +679,6 @@
                COUNT(CASE WHEN sa.status_ = 'NORMAL' THEN 1 END) attendanceNormalNum,
                COUNT(CASE WHEN sa.status_ = 'TRUANT' OR sa.id_ IS NULL THEN 1 END) attendanceTruantNum,
                COUNT(CASE WHEN sa.status_ = 'LEAVE' THEN 1 END) attendanceLeaveNum,
-               COUNT(CASE WHEN sa.status_ = 'DROP_OUT' THEN 1 END) attendanceDropNum,
                COUNT(CASE WHEN sa.status_ = 'LATE' THEN 1 END) attendanceLateNum,
         cssp.course_schedule_id_ courseId
         from course_schedule_student_payment cssp
@@ -726,4 +725,21 @@
             </if>
         </where>
     </select>
-</mapper>
+    <select id="statCoopAttendance"
+            resultType="com.ym.mec.biz.dal.wrapper.SchoolIndexStatWrapper$StudentAttendance">
+        select COUNT(cssp.user_id_) totalNum,
+        COUNT(CASE WHEN sa.status_ = 'NORMAL' THEN 1 END) normalNum,
+        COUNT(CASE WHEN sa.status_ = 'TRUANT' OR sa.id_ IS NULL THEN 1 END) truantNum,
+        COUNT(CASE WHEN sa.status_ = 'LEAVE' THEN 1 END) leaveNum,
+        COUNT(CASE WHEN sa.status_ = 'LATE' THEN 1 END) lateNum
+        from course_schedule cs
+        left join course_schedule_student_payment cssp ON cssp.course_schedule_id_ = cs.id_
+        left join student_attendance sa ON sa.course_schedule_id_ = cssp.course_schedule_id_ AND cssp.user_id_ = sa.user_id_
+        where CONCAT(cs.class_date_,' ',cs.start_class_time_) &lt; NOW()
+        AND cs.music_group_id_ IN
+        <foreach collection="musicGroupIds" close=")" open="(" separator="," item="item">
+            #{item}
+        </foreach>
+        AND cs.class_date_ BETWEEN #{queryDto.startTime} AND #{queryDto.endTime}
+    </select>
+</mapper>

+ 14 - 0
mec-web/src/main/java/com/ym/mec/web/controller/open/OpenSchoolController.java

@@ -5,6 +5,7 @@ import com.ym.mec.biz.dal.entity.CooperationOrgan;
 import com.ym.mec.biz.dal.wrapper.SchoolStaffWrapper;
 import com.ym.mec.biz.service.CooperationOrganService;
 import com.ym.mec.biz.service.SchoolStaffService;
+import com.ym.mec.biz.service.SysConfigService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
@@ -14,7 +15,9 @@ import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -37,6 +40,8 @@ public class OpenSchoolController extends BaseController {
     private SchoolStaffService schoolStaffService;
     @Autowired
     private CooperationOrganService cooperationOrganService;
+    @Autowired
+    private SysConfigService sysConfigService;
 
 
     @ApiOperation(value = "学校员工新增", notes = "学校员工- 传入 SchoolStaffWrapper.SchoolStaff")
@@ -81,4 +86,13 @@ public class OpenSchoolController extends BaseController {
         return succeed(schoolCooperation);
     }
 
+    @ApiOperation(value = "查询参数")
+    @GetMapping(value = "queryByParamName")
+    public Object queryByParamName(String paramName) {
+        if(StringUtils.isBlank(paramName)){
+            return failed("参数不能为空");
+        }
+        return succeed(sysConfigService.findByParamName(paramName));
+    }
+
 }

+ 45 - 0
mec-web/src/main/java/com/ym/mec/web/controller/school/SchoolIndexController.java

@@ -0,0 +1,45 @@
+package com.ym.mec.web.controller.school;
+
+import com.ym.mec.biz.dal.dto.SchoolIndexStatDto;
+import com.ym.mec.biz.dal.wrapper.SchoolIndexStatWrapper;
+import com.ym.mec.biz.service.SchoolIndexStatService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("/schoolIndex")
+@Api(tags = "学校端首页")
+public class SchoolIndexController extends BaseController {
+
+    @Autowired
+    private SchoolIndexStatService schoolIndexStatService;
+
+	@ApiOperation(value = "统计", notes = "学校端首页数据统计")
+    @PostMapping("/stat")
+    public HttpResponseResult<SchoolIndexStatDto> stat(@RequestBody SchoolIndexStatWrapper.QueryDto queryDto, @RequestHeader Integer coopId) {
+        queryDto.setCoopId(coopId);
+        return succeed(schoolIndexStatService.stat(queryDto));
+	}
+
+	@ApiOperation(value = "学员出勤统计")
+    @PostMapping("/attendanceStat")
+    public HttpResponseResult<SchoolIndexStatWrapper.StudentAttendance> attendanceStat(@RequestBody SchoolIndexStatWrapper.QueryDto queryDto, @RequestHeader Integer coopId) {
+        queryDto.setCoopId(coopId);
+        return succeed(schoolIndexStatService.attendanceStat(queryDto));
+	}
+
+	@ApiOperation(value = "学员练习统计")
+    @PostMapping("/lessonStat")
+    public HttpResponseResult<SchoolIndexStatWrapper.StudentLesson> lessonStat(@RequestBody SchoolIndexStatWrapper.QueryDto queryDto, @RequestHeader Integer coopId) {
+        queryDto.setCoopId(coopId);
+        return succeed(schoolIndexStatService.lessonStat(queryDto));
+	}
+}