Просмотр исходного кода

Merge branch 'online1' of http://git.dayaedu.com/yonge/mec into system_fee_update

 Conflicts:
	mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
zouxuan 3 лет назад
Родитель
Сommit
e6e33e2012
45 измененных файлов с 1488 добавлено и 177 удалено
  1. 1 1
      codegen/src/main/resources/generateConfigration.xml
  2. 4 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CloudTeacherDao.java
  3. 17 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/IndexBaseMonthDataDao.java
  4. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  5. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDao.java
  6. 32 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EduOrganStudentDataDto.java
  7. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EduOrganStudentListDto.java
  8. 32 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SoundCheckInfoDto.java
  9. 98 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherStudentDataDto.java
  10. 6 4
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/IndexDataType.java
  11. 21 21
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java
  12. 34 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/WebsocketTypeEnum.java
  13. 137 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/OrganCloudStudyStudentDataQueryInfo.java
  14. 10 12
      mec-biz/src/main/java/com/ym/mec/biz/handler/WebSocketHandler.java
  15. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/IndexBaseMonthDataService.java
  16. 4 3
      mec-biz/src/main/java/com/ym/mec/biz/service/OrganizationService.java
  17. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java
  18. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
  19. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TeacherService.java
  20. 11 10
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CloudTeacherOrderServiceImpl.java
  21. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseHomeworkServiceImpl.java
  22. 158 38
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java
  23. 77 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SoundCheckHandler.java
  24. 4 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SoundCompareHandler.java
  25. 20 20
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  26. 146 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  27. 64 14
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherServiceImpl.java
  28. 1 1
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  29. 20 0
      mec-biz/src/main/resources/config/mybatis/CloudTeacherMapper.xml
  30. 3 3
      mec-biz/src/main/resources/config/mybatis/CloudTeacherOrderMapper.xml
  31. 167 16
      mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml
  32. 91 1
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  33. 6 6
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  34. 28 0
      mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  35. 2 2
      mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java
  36. 2 2
      mec-student/src/main/java/com/ym/mec/student/controller/SysMessageController.java
  37. 3 3
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/CourseHomeworkController.java
  38. 1 1
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/ExtracurricularExercisesController.java
  39. 1 1
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/SysMessageController.java
  40. 202 6
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  41. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/ExtracurricularExercisesController.java
  42. 17 0
      mec-web/src/main/java/com/ym/mec/web/controller/IndexController.java
  43. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/InspectionItemPlanConclusionController.java
  44. 9 5
      mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java
  45. 9 0
      mec-web/src/main/java/com/ym/mec/web/controller/TeacherController.java

+ 1 - 1
codegen/src/main/resources/generateConfigration.xml

@@ -8,7 +8,7 @@
 		<catalog>mec_dev</catalog>
 		<schema>mec_dev</schema>
 	</dbConfiguration>
-	<srcBase>/Users/chenxiaoyu/Documents/javabean</srcBase>
+	<srcBase>e:/javabean</srcBase>
 	<pojoPackageName>com.ym.mec.biz.dal.entity</pojoPackageName>
 	<daoPackageName>com.ym.mec.biz.dal.dao</daoPackageName>
 	<servicePackageName>com.ym.mec.biz.service</servicePackageName>

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

@@ -23,4 +23,8 @@ public interface CloudTeacherDao extends BaseDAO<Long, CloudTeacher> {
     int getOrgansTotalVipStudentNum(@Param("organIds") List<Integer> organIds);
     List<Map<Integer, Integer>> getOrgansVipStudentNum(@Param("organIds") List<Integer> organId);
 
+
+    List<Map<Integer, Integer>> getTeachersMemberStudentNum(@Param("teacherIds") List<Integer> teacherIds,
+                                                            @Param("organId") Integer organId);
+
 }

+ 17 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/IndexBaseMonthDataDao.java

@@ -42,6 +42,11 @@ public interface IndexBaseMonthDataDao extends BaseDAO<Long, IndexBaseMonthData>
                                               @Param("startMonth") String startMonth,
                                               @Param("endMonth") String endMonth);
 
+	List<IndexBaseMonthData> getAllIndexBaseData(@Param("organIds") Set<Integer> organIds,
+                                                 @Param("dataTypes") Set<String> dataTypes,
+                                                 @Param("startMonth") String startMonth,
+                                                 @Param("endMonth") String endMonth);
+
     List<IndexBaseMonthData> getVipCourseDataList(@Param("organIds") Set<Integer> organIds,
                                               @Param("dataTypes") Set<String> dataTypes,
                                               @Param("startMonth") String startMonth,
@@ -322,4 +327,16 @@ public interface IndexBaseMonthDataDao extends BaseDAO<Long, IndexBaseMonthData>
     List<Map<Integer, BigDecimal>> getStudentErrorLeaveNumMap(Map<String, Object> params);
 
     List<IndexBaseMonthData> getOrgansStudentNumData(@Param("dayStr") String dayStr);
+
+    List<IndexBaseMonthData> getMemberStudentNumData(@Param("dayStr") String dayStr);
+
+    List<IndexBaseMonthData> getNewMemberStudentNumData(@Param("dayStr") String dayStr);
+
+    List<IndexBaseMonthData> getExperienceMemberStudentNumData(@Param("dayStr") String dayStr);
+
+    List<IndexBaseMonthData> getCloudStudyDayUseStudentNumData(@Param("dayStr") String dayStr);
+
+    List<IndexBaseMonthData> getCloudStudyLivelyStudentNumData(@Param("dayStr") String dayStr);
+
+    List<IndexBaseMonthData> getCloudStudyNewStudentNumData(@Param("dayStr") String dayStr);
 }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java

@@ -267,6 +267,11 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
     int getOrgansTotalStudentNum(@Param("organIds") List<Integer> organIds);
     List<Map<Integer, Integer>> getOrgansStudentNum(@Param("organIds") List<Integer> organIds);
 
+    List<Map<Integer, Integer>> getOrganTeacherStudentNum(@Param("teacherIds") List<Integer> teacherIds,
+                                                          @Param("organId") Integer organId);
+
+    int getOrganNoTeacherStudentNum(@Param("organId") Integer organId);
+
     /**
      * @describe 统计云教练试用人数
      * @author Joburgess
@@ -278,6 +283,9 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
     int getOrgansTotalCloudStudyStudentNum(@Param("organIds") List<Integer> organIds);
     List<Map<Integer, Integer>> getOrganCloudStudyStudentNum(@Param("organIds") List<Integer> organIds);
 
+    List<Map<Integer, Integer>> getOrganTeacherCloudStudyStudentNum(@Param("teacherIds") List<Integer> teacherIds,
+                                                                    @Param("organId") Integer organId);
+
     /**
      * @describe 统计云教练今日使用人数
      * @author Joburgess
@@ -340,4 +348,7 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
     int getOrganEVipStudentNum(@Param("organId") Integer organId);
     int getOrgansTotalEVipStudentNum(@Param("organIds") List<Integer> organIds);
     List<Map<Integer, Integer>> getOrgansEVipStudentNum(@Param("organIds") List<Integer> organIds);
+
+    List<Map<Integer, Integer>> getTeacherExperienceMemberStudentNum(@Param("teacherIds") List<Integer> teacherIds,
+                                                                     @Param("organId") Integer organId);
 }

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDao.java

@@ -514,4 +514,12 @@ public interface TeacherDao extends BaseDAO<Integer, Teacher> {
      */
     List<String> queryTeacherMusicIds(Map<String, Object> params);
     int countTeacherMusics(Map<String, Object> params);
+
+    /**
+     * 查询分部下教师关联的会员数据
+     * @param params
+     * @return
+     */
+    List<TeacherStudentDataDto> queryMemberStudentData(Map<String, Object> params);
+    int countMemberStudentData(Map<String, Object> params);
 }

+ 32 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EduOrganStudentDataDto.java

@@ -8,6 +8,8 @@ import io.swagger.annotations.ApiModelProperty;
  */
 public class EduOrganStudentDataDto {
 
+    private int index;
+
     private Integer organId;
 
     @ApiModelProperty("分部名称")
@@ -22,6 +24,9 @@ public class EduOrganStudentDataDto {
     @ApiModelProperty("试用会员数")
     private int eVipStudentNum;
 
+    @ApiModelProperty("新增会员数")
+    private int newMemberStudentNum;
+
     @ApiModelProperty("付费会员占比")
     private float vipStudentDuty;
 
@@ -34,9 +39,20 @@ public class EduOrganStudentDataDto {
     @ApiModelProperty("活跃人数")
     private int cloudStudyLivelyStudentNum;
 
+    @ApiModelProperty("活跃人数占比")
+    private float cloudStudyLivelyStudentDuty;
+
     @ApiModelProperty("云教练新增人数")
     private int newCloudStudyStudentNum;
 
+    public int getIndex() {
+        return index;
+    }
+
+    public void setIndex(int index) {
+        this.index = index;
+    }
+
     public Integer getOrganId() {
         return organId;
     }
@@ -116,4 +132,20 @@ public class EduOrganStudentDataDto {
     public void setNewCloudStudyStudentNum(int newCloudStudyStudentNum) {
         this.newCloudStudyStudentNum = newCloudStudyStudentNum;
     }
+
+    public int getNewMemberStudentNum() {
+        return newMemberStudentNum;
+    }
+
+    public void setNewMemberStudentNum(int newMemberStudentNum) {
+        this.newMemberStudentNum = newMemberStudentNum;
+    }
+
+    public float getCloudStudyLivelyStudentDuty() {
+        return cloudStudyLivelyStudentDuty;
+    }
+
+    public void setCloudStudyLivelyStudentDuty(float cloudStudyLivelyStudentDuty) {
+        this.cloudStudyLivelyStudentDuty = cloudStudyLivelyStudentDuty;
+    }
 }

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EduOrganStudentListDto.java

@@ -46,6 +46,9 @@ public class EduOrganStudentListDto {
     @ApiModelProperty("连续天数")
     private int cloudStudyRunningDays;
 
+    @ApiModelProperty("使用天数")
+    private int cloudStudyUseDays;
+
     @ApiModelProperty("会员有效期")
     private String membershipEndTime;
 
@@ -152,4 +155,12 @@ public class EduOrganStudentListDto {
     public void setMembershipEndTime(String membershipEndTime) {
         this.membershipEndTime = membershipEndTime;
     }
+
+    public int getCloudStudyUseDays() {
+        return cloudStudyUseDays;
+    }
+
+    public void setCloudStudyUseDays(int cloudStudyUseDays) {
+        this.cloudStudyUseDays = cloudStudyUseDays;
+    }
 }

+ 32 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SoundCheckInfoDto.java

@@ -0,0 +1,32 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/19 0019
+ */
+public class SoundCheckInfoDto {
+
+    private int curIndex;
+
+    private List<Double> frequencyList;
+
+    public int getCurIndex() {
+        return curIndex;
+    }
+
+    public void setCurIndex(int curIndex) {
+        this.curIndex = curIndex;
+    }
+
+    public List<Double> getFrequencyList() {
+        return frequencyList;
+    }
+
+    public void setFrequencyList(List<Double> frequencyList) {
+        this.frequencyList = frequencyList;
+    }
+}

+ 98 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherStudentDataDto.java

@@ -0,0 +1,98 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/16 0016
+ */
+public class TeacherStudentDataDto {
+
+    @ApiModelProperty("教师编号")
+    private Integer teacherId;
+
+    @ApiModelProperty("教师名称")
+    private String teacherName;
+
+    @ApiModelProperty("学员总数")
+    private int totalStudentNum;
+
+    @ApiModelProperty("付费会员数")
+    private int vipStudentNum;
+
+    @ApiModelProperty("试用会员数")
+    private int eVipStudentNum;
+
+    @ApiModelProperty("付费会员占比")
+    private float vipStudentDuty;
+
+    @ApiModelProperty("云教练试用人数")
+    private int cloudStudyUseStudentNum;
+
+    @ApiModelProperty("云教练使用人数占比")
+    private float cloudStudyUseStudentDuty;
+
+    public Integer getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Integer teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public int getTotalStudentNum() {
+        return totalStudentNum;
+    }
+
+    public void setTotalStudentNum(int totalStudentNum) {
+        this.totalStudentNum = totalStudentNum;
+    }
+
+    public int getVipStudentNum() {
+        return vipStudentNum;
+    }
+
+    public void setVipStudentNum(int vipStudentNum) {
+        this.vipStudentNum = vipStudentNum;
+    }
+
+    public int geteVipStudentNum() {
+        return eVipStudentNum;
+    }
+
+    public void seteVipStudentNum(int eVipStudentNum) {
+        this.eVipStudentNum = eVipStudentNum;
+    }
+
+    public float getVipStudentDuty() {
+        return vipStudentDuty;
+    }
+
+    public void setVipStudentDuty(float vipStudentDuty) {
+        this.vipStudentDuty = vipStudentDuty;
+    }
+
+    public int getCloudStudyUseStudentNum() {
+        return cloudStudyUseStudentNum;
+    }
+
+    public void setCloudStudyUseStudentNum(int cloudStudyUseStudentNum) {
+        this.cloudStudyUseStudentNum = cloudStudyUseStudentNum;
+    }
+
+    public float getCloudStudyUseStudentDuty() {
+        return cloudStudyUseStudentDuty;
+    }
+
+    public void setCloudStudyUseStudentDuty(float cloudStudyUseStudentDuty) {
+        this.cloudStudyUseStudentDuty = cloudStudyUseStudentDuty;
+    }
+}

+ 6 - 4
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/IndexDataType.java

@@ -51,9 +51,9 @@ public enum IndexDataType implements BaseEnum<String, IndexDataType> {
     OTHER_AMOUNT("OTHER_AMOUNT","其他收入", false, false),
 
     //业务数据
-    HOMEWORK_CREATE_RATE("HOMEWORK_CREATE_RATE","作业布置率", true, true),
-    HOMEWORK_SUBMIT_RATE("HOMEWORK_SUBMIT_RATE","作业提交率", true, true),
-    HOMEWORK_COMMENT_RATE("HOMEWORK_COMMENT_RATE","作业点评率", true, true),
+    HOMEWORK_CREATE_RATE("HOMEWORK_CREATE_RATE","训练布置率", true, true),
+    HOMEWORK_SUBMIT_RATE("HOMEWORK_SUBMIT_RATE","训练提交率", true, true),
+    HOMEWORK_COMMENT_RATE("HOMEWORK_COMMENT_RATE","训练点评率", true, true),
 
     //课程数据
     MUSIC_GROUP_COURSE("MUSIC_GROUP_COURSE","乐团课", false, true),
@@ -72,7 +72,9 @@ public enum IndexDataType implements BaseEnum<String, IndexDataType> {
 
     //活跃用户统计
     ORGAN_TOTAL_STUDENT_NUM("ORGAN_TOTAL_STUDENT_NUM", "分部学员总数", false, false),
-    CLOUD_STUDY_LIVELY_STUDENT_NUM("CLOUD_STUDY_LIVELY_STUDENT_NUM", "会员数量", false, false),
+    CLOUD_STUDY_LIVELY_STUDENT_NUM("CLOUD_STUDY_LIVELY_STUDENT_NUM", "活跃用户", false, false),
+    CLOUD_STUDY_DAY_USE_STUDENT_NUM("CLOUD_STUDY_DAY_USE_STUDENT_NUM", "云教练使用用户", false, false),
+    CLOUD_STUDY_NEW_STUDENT_NUM("CLOUD_STUDY_NEW_STUDENT_NUM", "云教练新增用户", false, false),
     MEMBER_STUDENT_NUM("MEMBER_STUDENT_NUM", "会员数量", false, false),
     EXPERIENCE_MEMBER_STUDENT_NUM("EXPERIENCE_MEMBER_STUDENT_NUM", "试用会员数量", false, false),
     NEW_MEMBER_STUDENT_NUM("NEW_MEMBER_STUDENT_NUM", "新增会员数量", false, false),

+ 21 - 21
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java

@@ -32,7 +32,7 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     SYSTEM_PUSH_NAMES_ACHIEVE("SYSTEM_PUSH_NAMES_ACHIEVE", "点名完成"),
     //    SCHEDULE_CHANGE("SCHEDULE_CHANGE", "课表变动"),
 //    STUDENT_SMS_TEACHING_SCHOOL_CHANGE("STUDENT_SMS_TEACHING_SCHOOL_CHANGE", "教学点变动"),
-    STUDENT_PUSH_JOB_MESSAGE("STUDENT_PUSH_JOB_MESSAGE", "作业提醒"),
+    STUDENT_PUSH_JOB_MESSAGE("STUDENT_PUSH_JOB_MESSAGE", "训练提醒"),
     //    STUDENT_PUSH_CLASS_MESSAGE("STUDENT_PUSH_CLASS_MESSAGE", "班级消息"),
     TEACHER_PUSH_MUSIC_GROUP_COURSE_ADD_PLAN("TEACHER_PUSH_MUSIC_GROUP_COURSE_ADD_PLAN", "乐团课新增安排"),
     TEACHER_SMS_PUSH_VIP_COURSE_APPLY_RESULT("TEACHER_SMS_PUSH_VIP_COURSE_APPLY_RESULT", "VIP课申请结果"),
@@ -44,7 +44,7 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     //    TEACHER_PUSH_SIGN_IN_MESSAGE("TEACHER_PUSH_SIGN_IN_MESSAGE", "签到提醒"),
 //    TEACHER_PUSH_NAMES_MESSAGE("TEACHER_PUSH_NAMES_MESSAGE", "点名提醒"),
     TEACHER_PUSH_SIGN_OUT_MESSAGE("TEACHER_PUSH_SIGN_OUT_MESSAGE", "签退提醒"),
-    TEACHER_PUSH_JOB_WAIT_REPLY("TEACHER_PUSH_JOB_WAIT_REPLY", "作业待回复"),
+    TEACHER_PUSH_JOB_WAIT_REPLY("TEACHER_PUSH_JOB_WAIT_REPLY", "训练待回复"),
     //    TEACHER_PUSH_SUBSTITUTE_PLAN("TEACHER_PUSH_SUBSTITUTE_PLAN", "代课安排"),
     TEACHER_PUSH_LEAVE_RESULT("TEACHER_PUSH_LEAVE_RESULT", "请假结果"),
     TEACHER_PUSH_COURSE_SCHEDULE_CHANGE_RESULT("TEACHER_PUSH_COURSE_SCHEDULE_CHANGE_RESULT", "课时调整结果"),
@@ -65,31 +65,31 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     STUDENT_SMS_PUSH_PRACTICE_COMPLETED_STUDY_REPORT("STUDENT_SMS_PUSH_PRACTICE_COMPLETED_STUDY_REPORT", "网管课完成学习报告"),
     STUDENT_SMS_PUSH_FREE_PRACTICE_APPLY_PUSH("STUDENT_SMS_PUSH_FREE_PRACTICE_APPLY_PUSH", "免费陪练课预约推送"),
     TEACHER_PUSH_NEED_POST_STUDY_REPORT("TEACHER_PUSH_NEED_POST_STUDY_REPORT", "新增待填写月报"),
-    STUDENT_PUSH_HOMEWORK_REMIND("STUDENT_PUSH_HOMEWORK_REMIND", "作业提醒-网管课"),
+    STUDENT_PUSH_HOMEWORK_REMIND("STUDENT_PUSH_HOMEWORK_REMIND", "训练提醒-网管课"),
     TEACHER_PUSH_COMM_NO_STUDENTS_PUSH("TEACHER_PUSH_COMM_NO_STUDENTS_PUSH", "对外课程组无学生提醒"),
-    TEACHER_PUSH_HOMEWORK_SUBMIT("TEACHER_PUSH_HOMEWORK_SUBMIT", "学生提交作业提醒"),
-    TEACHER_PUSH_HOMEWORK_REPLY("TEACHER_PUSH_HOMEWORK_REPLY", "学生作业回复提醒"),
-    STUDENT_PUSH_HOMEWORK_REPLY("STUDENT_PUSH_HOMEWORK_REPLY", "教师回复作业提醒"),
+    TEACHER_PUSH_HOMEWORK_SUBMIT("TEACHER_PUSH_HOMEWORK_SUBMIT", "学生提交训练提醒"),
+    TEACHER_PUSH_HOMEWORK_REPLY("TEACHER_PUSH_HOMEWORK_REPLY", "学生训练回复提醒"),
+    STUDENT_PUSH_HOMEWORK_REPLY("STUDENT_PUSH_HOMEWORK_REPLY", "教师回复训练提醒"),
 
-    IM_HOMEWORK_REMIND("IM_HOMEWORK_REMIND", "作业提醒"),
-    IM_HOMEWORK_SUBMIT_PUSH("IM_HOMEWORK_SUBMIT_PUSH", "作业提交提醒"),
-    IM_HOMEWORK_SUBMIT_PUSH_GROUP("IM_HOMEWORK_SUBMIT_PUSH_GROUP", "作业提交提醒"),
-    IM_HOMEWORK_STUDENT_REPLY_PUSH("IM_HOMEWORK_STUDENT_REPLY_PUSH", "作业回复提醒"),
-    IM_HOMEWORK_TEACHER_REPLY_PUSH("IM_HOMEWORK_TEACHER_REPLY_PUSH", "作业点评提醒"),
-    IM_HOMEWORK_REMIND_DETAIL("IM_HOMEWORK_REMIND_DETAIL", "作业提醒"),
+    IM_HOMEWORK_REMIND("IM_HOMEWORK_REMIND", "训练提醒"),
+    IM_HOMEWORK_SUBMIT_PUSH("IM_HOMEWORK_SUBMIT_PUSH", "训练提交提醒"),
+    IM_HOMEWORK_SUBMIT_PUSH_GROUP("IM_HOMEWORK_SUBMIT_PUSH_GROUP", "训练提交提醒"),
+    IM_HOMEWORK_STUDENT_REPLY_PUSH("IM_HOMEWORK_STUDENT_REPLY_PUSH", "训练回复提醒"),
+    IM_HOMEWORK_TEACHER_REPLY_PUSH("IM_HOMEWORK_TEACHER_REPLY_PUSH", "训练点评提醒"),
+    IM_HOMEWORK_REMIND_DETAIL("IM_HOMEWORK_REMIND_DETAIL", "训练提醒"),
 
     /**
      * 课外训练消息
      */
-    STUDENT_PUSH_EXTRA_REMIND("STUDENT_PUSH_EXTRA_REMIND", "作业提醒"),
-    EXTRA_REMIND_IM("EXTRA_REMIND_IM", "作业提醒"),
-    EXTRA_REMIND_IM_DETAIL("EXTRA_REMIND_IM_DETAIL", "作业提醒"),
-    STUDENT_PUSH_EXTRA_REPLY("STUDENT_PUSH_EXTRA_REPLY", "作业点评提醒"),
-    EXTRA_TEACHER_REPLY_IM("EXTRA_TEACHER_REPLY_IM", "作业点评提醒"),
-    TEACHER_PUSH_EXTRA_SUBMIT("TEACHER_PUSH_EXTRA_SUBMIT", "作业提交提醒"),
-    EXTRA_SUBMIT_IM("EXTRA_SUBMIT_IM", "作业提交提醒"),
-    TEACHER_PUSH_EXTRA_REPLY("TEACHER_PUSH_EXTRA_REPLY", "作业回复提醒"),
-    EXTRA_STUDENT_REPLY_IM("EXTRA_STUDENT_REPLY_IM", "作业回复提醒"),
+    STUDENT_PUSH_EXTRA_REMIND("STUDENT_PUSH_EXTRA_REMIND", "训练提醒"),
+    EXTRA_REMIND_IM("EXTRA_REMIND_IM", "训练提醒"),
+    EXTRA_REMIND_IM_DETAIL("EXTRA_REMIND_IM_DETAIL", "训练提醒"),
+    STUDENT_PUSH_EXTRA_REPLY("STUDENT_PUSH_EXTRA_REPLY", "训练点评提醒"),
+    EXTRA_TEACHER_REPLY_IM("EXTRA_TEACHER_REPLY_IM", "训练点评提醒"),
+    TEACHER_PUSH_EXTRA_SUBMIT("TEACHER_PUSH_EXTRA_SUBMIT", "训练提交提醒"),
+    EXTRA_SUBMIT_IM("EXTRA_SUBMIT_IM", "训练提交提醒"),
+    TEACHER_PUSH_EXTRA_REPLY("TEACHER_PUSH_EXTRA_REPLY", "训练回复提醒"),
+    EXTRA_STUDENT_REPLY_IM("EXTRA_STUDENT_REPLY_IM", "训练回复提醒"),
 
     TEACHER_PUSH_COURSE_SALARY_COMPLAINTS_RESULT("TEACHER_PUSH_COURSE_SALARY_COMPLAINTS_RESULT", "课酬申述结果"),
     TEACHER_PUSH_SALARY_CONFIRM("TEACHER_PUSH_SALARY_CONFIRM", "课酬确认"),

+ 34 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/WebsocketTypeEnum.java

@@ -0,0 +1,34 @@
+package com.ym.mec.biz.dal.enums;
+
+import com.ym.mec.common.enums.BaseEnum;
+
+public enum WebsocketTypeEnum implements BaseEnum<String, WebsocketTypeEnum> {
+	SOUND_COMPARE("SOUND_COMPARE", "评测"),
+	SOUND_CHECK("SOUND_CHECK", "校音");
+
+	private String code;
+
+	private String msg;
+
+	WebsocketTypeEnum(String code, String msg) {
+		this.code = code;
+		this.msg = msg;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	public String getMsg() {
+		return msg;
+	}
+
+	public void setMsg(String msg) {
+		this.msg = msg;
+	}
+
+	@Override
+	public String getCode() {
+		return this.code;
+	}
+}

+ 137 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/OrganCloudStudyStudentDataQueryInfo.java

@@ -0,0 +1,137 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+public class OrganCloudStudyStudentDataQueryInfo extends QueryInfo {
+
+    private String date;
+
+    private String organIds;
+
+    @ApiModelProperty("学员总数")
+    private String totalStudentNum;
+
+    @ApiModelProperty("付费会员数")
+    private String vipStudentNum;
+
+    @ApiModelProperty("试用会员数")
+    private String eVipStudentNum;
+
+    @ApiModelProperty("新增会员数")
+    private String newMemberStudentNum;
+
+    @ApiModelProperty("付费会员占比")
+    private String vipStudentDuty;
+
+    @ApiModelProperty("云教练试用人数")
+    private String cloudStudyUseStudentNum;
+
+    @ApiModelProperty("云教练使用人数占比")
+    private String cloudStudyUseStudentDuty;
+
+    @ApiModelProperty("活跃人数")
+    private String cloudStudyLivelyStudentNum;
+
+    @ApiModelProperty("活跃人数占比")
+    private String cloudStudyLivelyStudentDuty;
+
+    @ApiModelProperty("云教练新增人数")
+    private String newCloudStudyStudentNum;
+
+    public String getDate() {
+        return date;
+    }
+
+    public void setDate(String date) {
+        this.date = date;
+    }
+
+    public String getOrganIds() {
+        return organIds;
+    }
+
+    public void setOrganIds(String organIds) {
+        this.organIds = organIds;
+    }
+
+    public String getTotalStudentNum() {
+        return totalStudentNum;
+    }
+
+    public void setTotalStudentNum(String totalStudentNum) {
+        this.totalStudentNum = totalStudentNum;
+    }
+
+    public String getVipStudentNum() {
+        return vipStudentNum;
+    }
+
+    public void setVipStudentNum(String vipStudentNum) {
+        this.vipStudentNum = vipStudentNum;
+    }
+
+    public String geteVipStudentNum() {
+        return eVipStudentNum;
+    }
+
+    public void seteVipStudentNum(String eVipStudentNum) {
+        this.eVipStudentNum = eVipStudentNum;
+    }
+
+    public String getNewMemberStudentNum() {
+        return newMemberStudentNum;
+    }
+
+    public void setNewMemberStudentNum(String newMemberStudentNum) {
+        this.newMemberStudentNum = newMemberStudentNum;
+    }
+
+    public String getVipStudentDuty() {
+        return vipStudentDuty;
+    }
+
+    public void setVipStudentDuty(String vipStudentDuty) {
+        this.vipStudentDuty = vipStudentDuty;
+    }
+
+    public String getCloudStudyUseStudentNum() {
+        return cloudStudyUseStudentNum;
+    }
+
+    public void setCloudStudyUseStudentNum(String cloudStudyUseStudentNum) {
+        this.cloudStudyUseStudentNum = cloudStudyUseStudentNum;
+    }
+
+    public String getCloudStudyUseStudentDuty() {
+        return cloudStudyUseStudentDuty;
+    }
+
+    public void setCloudStudyUseStudentDuty(String cloudStudyUseStudentDuty) {
+        this.cloudStudyUseStudentDuty = cloudStudyUseStudentDuty;
+    }
+
+    public String getCloudStudyLivelyStudentNum() {
+        return cloudStudyLivelyStudentNum;
+    }
+
+    public void setCloudStudyLivelyStudentNum(String cloudStudyLivelyStudentNum) {
+        this.cloudStudyLivelyStudentNum = cloudStudyLivelyStudentNum;
+    }
+
+    public String getCloudStudyLivelyStudentDuty() {
+        return cloudStudyLivelyStudentDuty;
+    }
+
+    public void setCloudStudyLivelyStudentDuty(String cloudStudyLivelyStudentDuty) {
+        this.cloudStudyLivelyStudentDuty = cloudStudyLivelyStudentDuty;
+    }
+
+    public String getNewCloudStudyStudentNum() {
+        return newCloudStudyStudentNum;
+    }
+
+    public void setNewCloudStudyStudentNum(String newCloudStudyStudentNum) {
+        this.newCloudStudyStudentNum = newCloudStudyStudentNum;
+    }
+}

+ 10 - 12
mec-biz/src/main/java/com/ym/mec/biz/handler/WebSocketHandler.java

@@ -3,6 +3,7 @@ package com.ym.mec.biz.handler;
 import com.alibaba.fastjson.JSON;
 import com.ym.mec.biz.dal.dto.WebSocketClientDetail;
 import com.ym.mec.biz.dal.dto.WebSocketInfo;
+import com.ym.mec.biz.dal.enums.WebsocketTypeEnum;
 import com.ym.mec.biz.service.SoundSocketService;
 import com.ym.mec.biz.service.WebSocketEventHandler;
 import org.apache.commons.lang3.StringUtils;
@@ -30,21 +31,21 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
      */
     public static final Map<String, WebSocketClientDetail> WS_CLIENTS = new ConcurrentHashMap<>();
 
-    private static Map<String, WebSocketEventHandler> appMap = new ConcurrentHashMap<>();
+    private static Map<WebsocketTypeEnum, WebSocketEventHandler> appMap = new ConcurrentHashMap<>();
 
     /**
      * @describe 注册应用
      * @author Joburgess
      * @date 2021/8/5 0005
-     * @param tag:
+     * @param websocketType:
      * @param webSocketEventHandler:
      * @return boolean
      */
-    public static boolean regist(String tag, WebSocketEventHandler webSocketEventHandler){
-        if (appMap.containsKey(tag)){
+    public static boolean regist(WebsocketTypeEnum websocketType, WebSocketEventHandler webSocketEventHandler){
+        if (appMap.containsKey(websocketType)){
             return false;
         }
-        appMap.put(tag, webSocketEventHandler);
+        appMap.put(websocketType, webSocketEventHandler);
         return true;
     }
 
@@ -67,15 +68,12 @@ public class WebSocketHandler extends AbstractWebSocketHandler {
         String phone = session.getPrincipal().getName().split(":")[1];
         LOGGER.info("{}: {}", phone, message.getPayload());
         WebSocketInfo webSocketInfo = JSON.parseObject(message.getPayload(), WebSocketInfo.class);
-        String tag = "";
+
+        WebsocketTypeEnum websocketType = WebsocketTypeEnum.SOUND_COMPARE;
         if(webSocketInfo.getHeader().containsKey(SoundSocketService.TAG)){
-            tag = webSocketInfo.getHeader().get(SoundSocketService.TAG);
-        }
-        if(StringUtils.isNotBlank(tag)){
-            appMap.get(tag).receiveTextMessage(session, phone, message);
-        }else{
-            appMap.values().forEach(e->e.receiveTextMessage(session, phone, message));
+            websocketType = WebsocketTypeEnum.valueOf(webSocketInfo.getHeader().get(SoundSocketService.TAG));
         }
+        appMap.get(websocketType).receiveTextMessage(session, phone, message);
     }
 
     @Override

+ 6 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/IndexBaseMonthDataService.java

@@ -4,6 +4,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import com.ym.mec.biz.dal.dto.EduOrganStudentDataDto;
 import com.ym.mec.biz.dal.dto.IndexBaseDto;
 import com.ym.mec.biz.dal.dto.IndexErrorDataExportDto;
 import com.ym.mec.biz.dal.entity.IndexBaseMonthData;
@@ -11,6 +12,9 @@ import com.ym.mec.biz.dal.entity.IndexErrInfoDto;
 import com.ym.mec.biz.dal.enums.IndexDataType;
 import com.ym.mec.biz.dal.enums.IndexErrorType;
 import com.ym.mec.biz.dal.page.IndexDataQueryInfo;
+import com.ym.mec.biz.dal.page.OrganCloudStudyStudentDataQueryInfo;
+import com.ym.mec.biz.dal.page.OrganizationQueryInfo;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 
 public interface IndexBaseMonthDataService extends BaseService<Long, IndexBaseMonthData> {
@@ -36,4 +40,6 @@ public interface IndexBaseMonthDataService extends BaseService<Long, IndexBaseMo
      * @return
      */
     Map<String,Boolean> hasIndexErrData(String organIds);
+
+    PageInfo<EduOrganStudentDataDto> organStudentOverView(List<Integer> organIds, OrganCloudStudyStudentDataQueryInfo queryInfo);
 }

+ 4 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/OrganizationService.java

@@ -5,11 +5,12 @@ import com.ym.mec.biz.dal.page.OrganizationQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 public interface OrganizationService extends BaseService<Integer, Organization> {
 
+    Set<Integer>  EXCLUDE_ORGAN_IDS = new HashSet<>(Arrays.asList(36,39,41,42,43,44,45,46,47,48,49,50,52,54,55,56));
+
     /**
      * 获取节点树状结构
      * @param queryInfo
@@ -40,4 +41,4 @@ public interface OrganizationService extends BaseService<Integer, Organization>
      * @param id
      */
     Map<Integer, String> getGradeList(Integer id);
-}
+}

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java

@@ -12,6 +12,7 @@ import com.ym.mec.biz.dal.entity.CooperationOrgan;
 import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.enums.GradeTypeEnum;
 import com.ym.mec.biz.dal.enums.PeriodEnum;
+import com.ym.mec.biz.dal.page.OrganCloudStudyStudentDataQueryInfo;
 import com.ym.mec.biz.dal.page.StudentQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
@@ -110,6 +111,8 @@ public interface StudentService extends BaseService<Integer, Student> {
 
     List<EduOrganStudentDataDto> organStudentOverView(List<Integer> organIds);
 
+    PageInfo<EduOrganStudentDataDto> queryOrganStudentOverView(List<Integer> organIds, OrganCloudStudyStudentDataQueryInfo queryInfo);
+
     CloudStudyStudentDataDto getCloudStudyStudentOverView(List<Integer> organIds);
 
     /**

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java

@@ -192,7 +192,7 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
 
     String PRACTICE_PROMOTION_ACTIVITY_START_DATE = "practice_promotion_activity_start_date";
 
-    String NEW_MSG_PUSH = "您收到一条作业回复,请点击查看";
+    String NEW_MSG_PUSH = "您收到一条训练回复,请点击查看";
 
     /**
      * @describe 教务端baseUrl

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/TeacherService.java

@@ -224,4 +224,11 @@ public interface TeacherService extends BaseService<Integer, Teacher> {
      * @return com.ym.mec.common.page.PageInfo<com.ym.mec.biz.dal.dto.TeacherMusicStudentOverViewDto>
      */
     PageInfo<TeacherMusicStudentOverViewDto> queryTeacherMusicStudentOverView(TeacherServeQueryInfo queryInfo);
+
+    /**
+     * 查询分部下教师关联的会员数据
+     * @param queryInfo
+     * @return
+     */
+    PageInfo<TeacherStudentDataDto> queryMemberStudentData(TeacherServeQueryInfo queryInfo);
 }

+ 11 - 10
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CloudTeacherOrderServiceImpl.java

@@ -1,5 +1,16 @@
 package com.ym.mec.biz.service.impl;
 
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
 import com.ym.mec.biz.dal.dao.CloudTeacherDao;
 import com.ym.mec.biz.dal.dao.CloudTeacherOrderDao;
 import com.ym.mec.biz.dal.dao.CourseScheduleDao;
@@ -15,16 +26,6 @@ import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.util.date.DateUtil;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.math.BigDecimal;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
 
 @Service
 public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTeacherOrder> implements CloudTeacherOrderService {

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

@@ -61,7 +61,7 @@ public class CourseHomeworkServiceImpl extends BaseServiceImpl<Long, CourseHomew
 			throw new BizException("课程不存在");
 		}
 		if(StringUtils.isBlank(courseHomework.getContent())){
-			throw new BizException("请填写作业内容");
+			throw new BizException("请填写训练内容");
 		}
 		CourseSchedule courseSchedule = courseScheduleDao.get(courseHomework.getCourseScheduleId());
 		if(Objects.isNull(courseSchedule)){

+ 158 - 38
mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java

@@ -5,25 +5,22 @@ import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.entity.SysUserRole;
 import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.dto.IndexBaseDto;
-import com.ym.mec.biz.dal.dto.IndexErrorDataExportDto;
-import com.ym.mec.biz.dal.dto.OrganVipGroupCategoryCourseNumDto;
-import com.ym.mec.biz.dal.dto.SimpleUserDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.IndexDataQueryInfo;
-import com.ym.mec.biz.service.EmployeeService;
-import com.ym.mec.biz.service.StudentExtracurricularExercisesSituationService;
-import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.biz.dal.page.OrganCloudStudyStudentDataQueryInfo;
+import com.ym.mec.biz.dal.page.OrganizationQueryInfo;
+import com.ym.mec.biz.service.*;
 import com.ym.mec.common.constant.CommonConstants;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import com.ym.mec.biz.service.IndexBaseMonthDataService;
 import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -104,6 +101,9 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 		if(StringUtils.isNotBlank(queryInfo.getOrganId())){
 			organIds = Arrays.stream(queryInfo.getOrganId().split(",")).map(Integer::new).collect(Collectors.toSet());
 		}
+		if("MEMBER_STUDENT_NUM,CLOUD_STUDY_LIVELY_STUDENT_NUM,CLOUD_STUDY_DAY_USE_STUDENT_NUM,CLOUD_STUDY_NEW_STUDENT_NUM".equals(queryInfo.getDataTypes())){
+			organIds = organIds.stream().filter(id -> !OrganizationService.EXCLUDE_ORGAN_IDS.contains(id)).collect(Collectors.toSet());
+		}
 		Set<String> dataTypes = new HashSet<>();
 		if(StringUtils.isNotBlank(queryInfo.getDataTypes())){
 			dataTypes = Arrays.stream(queryInfo.getDataTypes().split(",")).collect(Collectors.toSet());
@@ -505,36 +505,40 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 		}
 
 		//云教练相关
-//		List<Map<Integer, Integer>> organsStudentNumMapList = studentDao.getOrgansStudentNum(organIds);
-//		Map<String, Long> organsStudentNumMap = new HashMap<>();
-//		if(!CollectionUtils.isEmpty(organsStudentNumMapList)){
-//			organsStudentNumMap = MapUtil.convertIntegerMap(organsStudentNumMapList);
-//		}
-//		List<Map<Integer, Integer>> organsVipStudentNumMapList = cloudTeacherDao.getOrgansVipStudentNum(organIds);
-//		Map<String, Long> organsVipStudentNumMap = new HashMap<>();
-//		if(!CollectionUtils.isEmpty(organsVipStudentNumMapList)){
-//			organsVipStudentNumMap = MapUtil.convertIntegerMap(organsVipStudentNumMapList);
-//		}
-//		List<Map<Integer, Integer>> organsEVipStudentNumMapList = studentDao.getOrgansEVipStudentNum(organIds);
-//		Map<String, Long> organsEVipStudentNumMap = new HashMap<>();
-//		if(!CollectionUtils.isEmpty(organsEVipStudentNumMapList)){
-//			organsEVipStudentNumMap = MapUtil.convertIntegerMap(organsEVipStudentNumMapList);
-//		}
-//		List<Map<Integer, Integer>> organCloudStudyStudentNumMapList = studentDao.getOrganCloudStudyStudentNum(organIds);
-//		Map<String, Long> organCloudStudyStudentNumMap = new HashMap<>();
-//		if(!CollectionUtils.isEmpty(organCloudStudyStudentNumMapList)){
-//			organCloudStudyStudentNumMap = MapUtil.convertIntegerMap(organCloudStudyStudentNumMapList);
-//		}
-//		List<Map<Integer, Integer>> organCloudStudyLivelyStudentNumMapList = studentDao.getOrganCloudStudyLivelyStudentNum(organIds);
-//		Map<String, Long> organCloudStudyLivelyStudentNumMap = new HashMap<>();
-//		if(!CollectionUtils.isEmpty(organCloudStudyLivelyStudentNumMapList)){
-//			organCloudStudyLivelyStudentNumMap = MapUtil.convertIntegerMap(organCloudStudyLivelyStudentNumMapList);
-//		}
-//		List<Map<Integer, Integer>> organsNewCloudStudyNumMapList = sysMusicCompareRecordDao.getOrgansNewCloudStudyNum(organIds);
-//		Map<String, Long> organsNewCloudStudyNumMap = new HashMap<>();
-//		if(!CollectionUtils.isEmpty(organsNewCloudStudyNumMapList)){
-//			organsNewCloudStudyNumMap = MapUtil.convertIntegerMap(organsNewCloudStudyNumMapList);
-//		}
+		//分部学员数量
+		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.ORGAN_TOTAL_STUDENT_NUM)) {
+			saveData(indexBaseMonthDataDao.getOrgansStudentNumData(dayStr), dayStr, IndexDataType.ORGAN_TOTAL_STUDENT_NUM);
+		}
+
+		//会员数量
+		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.MEMBER_STUDENT_NUM)) {
+			saveData(indexBaseMonthDataDao.getMemberStudentNumData(dayStr), dayStr, IndexDataType.MEMBER_STUDENT_NUM);
+		}
+
+		//新增会员数量
+		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.NEW_MEMBER_STUDENT_NUM)) {
+			saveData(indexBaseMonthDataDao.getNewMemberStudentNumData(dayStr), dayStr, IndexDataType.NEW_MEMBER_STUDENT_NUM);
+		}
+
+		//试用会员数量
+		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.EXPERIENCE_MEMBER_STUDENT_NUM)) {
+			saveData(indexBaseMonthDataDao.getExperienceMemberStudentNumData(dayStr), dayStr, IndexDataType.EXPERIENCE_MEMBER_STUDENT_NUM);
+		}
+
+		//云教练使用用户
+		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.CLOUD_STUDY_DAY_USE_STUDENT_NUM)) {
+			saveData(indexBaseMonthDataDao.getCloudStudyDayUseStudentNumData(dayStr), dayStr, IndexDataType.CLOUD_STUDY_DAY_USE_STUDENT_NUM);
+		}
+
+		//活跃用户
+		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.CLOUD_STUDY_LIVELY_STUDENT_NUM)) {
+			saveData(indexBaseMonthDataDao.getCloudStudyLivelyStudentNumData(dayStr), dayStr, IndexDataType.CLOUD_STUDY_LIVELY_STUDENT_NUM);
+		}
+
+		//云教练新增人数
+		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.CLOUD_STUDY_NEW_STUDENT_NUM)) {
+			saveData(indexBaseMonthDataDao.getCloudStudyNewStudentNumData(dayStr), dayStr, IndexDataType.CLOUD_STUDY_NEW_STUDENT_NUM);
+		}
 
 	}
 
@@ -1222,4 +1226,120 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 
 		return resultMap;
 	}
+
+	@Override
+	public PageInfo<EduOrganStudentDataDto> organStudentOverView(List<Integer> organIds, OrganCloudStudyStudentDataQueryInfo queryInfo) {
+		PageInfo<EduOrganStudentDataDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		List<Organization> organs = organizationDao.getOrgans(organIds);
+		pageInfo.setTotal(organs.size());
+
+		if(CollectionUtils.isEmpty(organs)){
+			return pageInfo;
+		}
+		Set<String> dataTypes = new HashSet<String>(){{
+			add(CLOUD_STUDY_LIVELY_STUDENT_NUM.getCode());add(MEMBER_STUDENT_NUM.getCode());add(NEW_MEMBER_STUDENT_NUM.getCode());
+			add(ORGAN_TOTAL_STUDENT_NUM.getCode());add(CLOUD_STUDY_NEW_STUDENT_NUM.getCode());add(CLOUD_STUDY_DAY_USE_STUDENT_NUM.getCode());}};
+
+
+		List<IndexBaseMonthData> indexBaseDatas = indexBaseMonthDataDao.getAllIndexBaseData(new HashSet<>(organIds), dataTypes, queryInfo.getDate(), queryInfo.getDate());
+
+		Map<Integer, Integer> organsStudentNumMap = indexBaseDatas.stream().filter(i->ORGAN_TOTAL_STUDENT_NUM.equals(i.getDataType())).collect(Collectors.toMap(IndexBaseMonthData::getOrganId, i->i.getActivateNum().intValue(), (i1, i2)->i1));
+
+		Map<Integer, Integer> organsVipStudentNumMap = indexBaseDatas.stream().filter(i->MEMBER_STUDENT_NUM.equals(i.getDataType())).collect(Collectors.toMap(IndexBaseMonthData::getOrganId, i->i.getActivateNum().intValue(), (i1, i2)->i1));
+
+//		Map<Integer, Integer> organsEVipStudentNumMap = indexBaseDatas.stream().filter(i->EXPERIENCE_MEMBER_STUDENT_NUM.equals(i.getDataType())).collect(Collectors.toMap(IndexBaseMonthData::getOrganId, i->i.getActivateNum().intValue(), (i1, i2)->i1));
+
+		Map<Integer, Integer> organCloudStudyLivelyStudentNumMap =indexBaseDatas.stream().filter(i->CLOUD_STUDY_LIVELY_STUDENT_NUM.equals(i.getDataType())).collect(Collectors.toMap(IndexBaseMonthData::getOrganId, i->i.getActivateNum().intValue(), (i1, i2)->i1));
+
+		Map<Integer, Integer> organsNewMemberStudentNumMap = indexBaseDatas.stream().filter(i->NEW_MEMBER_STUDENT_NUM.equals(i.getDataType())).collect(Collectors.toMap(IndexBaseMonthData::getOrganId, i->i.getActivateNum().intValue(), (i1, i2)->i1));
+
+		Map<Integer, Integer> organsNewCloudStudyStudentNumMap = indexBaseDatas.stream().filter(i->CLOUD_STUDY_NEW_STUDENT_NUM.equals(i.getDataType())).collect(Collectors.toMap(IndexBaseMonthData::getOrganId, i->i.getActivateNum().intValue(), (i1, i2)->i1));
+
+		Map<Integer, Integer> organsCloudStudyDayUseStudentNumMap = indexBaseDatas.stream().filter(i->CLOUD_STUDY_DAY_USE_STUDENT_NUM.equals(i.getDataType())).collect(Collectors.toMap(IndexBaseMonthData::getOrganId, i->i.getActivateNum().intValue(), (i1, i2)->i1));
+
+		List<EduOrganStudentDataDto> result = new ArrayList<>();
+
+		for (Organization organ : organs) {
+			EduOrganStudentDataDto organStudentVipData = new EduOrganStudentDataDto();
+			organStudentVipData.setOrganId(organ.getId());
+			organStudentVipData.setOrganName(organ.getName());
+			if(organsStudentNumMap.containsKey(organ.getId())){
+				organStudentVipData.setTotalStudentNum(organsStudentNumMap.get(organ.getId()));
+			}
+			if(organsVipStudentNumMap.containsKey(organ.getId())){
+				organStudentVipData.setVipStudentNum(organsVipStudentNumMap.get(organ.getId()));
+			}
+			if(organCloudStudyLivelyStudentNumMap.containsKey(organ.getId())){
+				organStudentVipData.setCloudStudyLivelyStudentNum(organCloudStudyLivelyStudentNumMap.get(organ.getId()));
+			}
+			if(organsNewMemberStudentNumMap.containsKey(organ.getId())){
+				organStudentVipData.setNewMemberStudentNum(organsNewMemberStudentNumMap.get(organ.getId()));
+			}
+			if(organsCloudStudyDayUseStudentNumMap.containsKey(organ.getId())){
+				organStudentVipData.setCloudStudyUseStudentNum(organsCloudStudyDayUseStudentNumMap.get(organ.getId()));
+			}
+			if(organsNewCloudStudyStudentNumMap.containsKey(organ.getId())){
+				organStudentVipData.setNewCloudStudyStudentNum(organsNewCloudStudyStudentNumMap.get(organ.getId()));
+			}
+			if(organStudentVipData.getCloudStudyLivelyStudentNum()>0&&organStudentVipData.getTotalStudentNum()>0){
+				organStudentVipData.setCloudStudyLivelyStudentDuty(new BigDecimal(organStudentVipData.getCloudStudyLivelyStudentNum()).divide(new BigDecimal(organStudentVipData.getTotalStudentNum()), 4, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)).floatValue());
+			}
+			if(organStudentVipData.getCloudStudyUseStudentNum()>0&&organStudentVipData.getTotalStudentNum()>0){
+				organStudentVipData.setCloudStudyUseStudentDuty(new BigDecimal(organStudentVipData.getCloudStudyUseStudentNum()).divide(new BigDecimal(organStudentVipData.getTotalStudentNum()), 4, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)).floatValue());
+			}
+			if(organStudentVipData.getVipStudentNum()>0&&organStudentVipData.getTotalStudentNum()>0){
+				organStudentVipData.setVipStudentDuty(new BigDecimal(organStudentVipData.getVipStudentNum()).divide(new BigDecimal(organStudentVipData.getTotalStudentNum()), 4, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)).floatValue());
+			}
+			result.add(organStudentVipData);
+		}
+
+		Comparator<EduOrganStudentDataDto> comparing = null;
+		if(StringUtils.isNotBlank(queryInfo.getCloudStudyLivelyStudentNum())){
+			if(Objects.isNull(comparing)){
+				comparing = Comparator.comparing(EduOrganStudentDataDto::getCloudStudyLivelyStudentNum, "ASC".equals(queryInfo.getCloudStudyLivelyStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+			}else{
+				comparing.thenComparing(EduOrganStudentDataDto::getCloudStudyLivelyStudentNum, "ASC".equals(queryInfo.getCloudStudyLivelyStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+			}
+		}
+		if(StringUtils.isNotBlank(queryInfo.getVipStudentNum())){
+			if(Objects.isNull(comparing)){
+				comparing = Comparator.comparing(EduOrganStudentDataDto::getVipStudentNum, "ASC".equals(queryInfo.getVipStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+			}else{
+				comparing.thenComparing(EduOrganStudentDataDto::getVipStudentNum, "ASC".equals(queryInfo.getVipStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+			}
+		}
+		if(StringUtils.isNotBlank(queryInfo.geteVipStudentNum())){
+			if(Objects.isNull(comparing)){
+				comparing = Comparator.comparing(EduOrganStudentDataDto::geteVipStudentNum, "ASC".equals(queryInfo.geteVipStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+			}else{
+				comparing.thenComparing(EduOrganStudentDataDto::geteVipStudentNum, "ASC".equals(queryInfo.geteVipStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+			}
+		}
+		if(StringUtils.isNotBlank(queryInfo.getNewMemberStudentNum())){
+			if(Objects.isNull(comparing)){
+				comparing = Comparator.comparing(EduOrganStudentDataDto::getNewMemberStudentNum, "ASC".equals(queryInfo.getNewMemberStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+			}else{
+				comparing.thenComparing(EduOrganStudentDataDto::getNewMemberStudentNum, "ASC".equals(queryInfo.getNewMemberStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+			}
+		}
+		if(StringUtils.isNotBlank(queryInfo.getCloudStudyLivelyStudentDuty())){
+			if(Objects.isNull(comparing)){
+				comparing = Comparator.comparing(EduOrganStudentDataDto::getCloudStudyLivelyStudentDuty, "ASC".equals(queryInfo.getCloudStudyLivelyStudentDuty())?Comparator.naturalOrder():Comparator.reverseOrder());
+			}else{
+				comparing.thenComparing(EduOrganStudentDataDto::getCloudStudyLivelyStudentDuty, "ASC".equals(queryInfo.getCloudStudyLivelyStudentDuty())?Comparator.naturalOrder():Comparator.reverseOrder());
+			}
+		}
+
+		if(Objects.isNull(comparing)){
+			comparing = Comparator.comparing(EduOrganStudentDataDto::getOrganId);
+		}
+
+		result.sort(comparing);
+		for (int i = 0; i < result.size(); i++) {
+			result.get(i).setIndex(i+1);
+		}
+		result = result.stream().skip(pageInfo.getOffset()).limit(pageInfo.getLimit()).sorted(Comparator.comparing(EduOrganStudentDataDto::getIndex)).collect(Collectors.toList());
+		pageInfo.setRows(result);
+		return pageInfo;
+	}
 }

+ 77 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SoundCheckHandler.java

@@ -0,0 +1,77 @@
+package com.ym.mec.biz.service.impl;
+
+import be.tarsos.dsp.AudioDispatcher;
+import be.tarsos.dsp.AudioEvent;
+import be.tarsos.dsp.io.jvm.AudioDispatcherFactory;
+import be.tarsos.dsp.pitch.PitchDetectionHandler;
+import be.tarsos.dsp.pitch.PitchDetectionResult;
+import be.tarsos.dsp.pitch.PitchProcessor;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.ym.mec.biz.dal.dto.MusicPitchDetailDto;
+import com.ym.mec.biz.dal.dto.SoundCheckInfoDto;
+import com.ym.mec.biz.dal.dto.WebSocketInfo;
+import com.ym.mec.biz.dal.enums.WebsocketTypeEnum;
+import com.ym.mec.biz.handler.WebSocketHandler;
+import com.ym.mec.biz.service.SoundSocketService;
+import com.ym.mec.biz.service.WebSocketEventHandler;
+import com.ym.mec.common.exception.BizException;
+import org.springframework.stereotype.Service;
+import org.springframework.web.socket.BinaryMessage;
+import org.springframework.web.socket.TextMessage;
+import org.springframework.web.socket.WebSocketSession;
+
+import javax.sound.sampled.UnsupportedAudioFileException;
+import java.io.File;
+import java.io.IOException;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/19 0019
+ */
+@Service
+public class SoundCheckHandler implements WebSocketEventHandler {
+
+    private static final double COMPARE_FREQUENCY = 442;
+
+    /** 校音数据 */
+    private Map<String, Integer> userSoundCheckInfo = new ConcurrentHashMap<>();
+
+    public SoundCheckHandler() {
+        WebSocketHandler.regist(WebsocketTypeEnum.SOUND_CHECK, this);
+    }
+
+    @Override
+    public void afterConnectionEstablished(WebSocketSession session, String phone) {
+
+    }
+
+    @Override
+    public void receiveTextMessage(WebSocketSession session, String phone, TextMessage message) {
+        userSoundCheckInfo.put(phone, 0);
+    }
+
+    @Override
+    public void receiveBinaryMessage(WebSocketSession session, String phone, BinaryMessage message) {
+        if(!userSoundCheckInfo.containsKey(phone)){
+            return;
+        }
+        try {
+            AudioDispatcher dispatcher = AudioDispatcherFactory.fromByteArray(message.getPayload().array(), SoundCompareHandler.soundCompareConfig.audioFormat, SoundCompareHandler.soundCompareConfig.simpleSize, SoundCompareHandler.soundCompareConfig.overlap);
+            dispatcher.addAudioProcessor(new PitchProcessor(SoundCompareHandler.soundCompareConfig.algo, SoundCompareHandler.soundCompareConfig.simpleRate, SoundCompareHandler.soundCompareConfig.simpleSize, (pitchDetectionResult, audioEvent) -> {
+
+            }));
+            dispatcher.run();
+        } catch (UnsupportedAudioFileException e) {
+            throw new BizException("{}校音异常:{}", phone, e);
+        }
+    }
+
+    @Override
+    public void afterConnectionClosed(WebSocketSession session, String phone) {
+
+    }
+}

+ 4 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SoundCompareHandler.java

@@ -13,6 +13,7 @@ import com.ym.mec.biz.dal.dto.SoundCompareHelper;
 import com.ym.mec.biz.dal.dto.WavHeader;
 import com.ym.mec.biz.dal.dto.WebSocketInfo;
 import com.ym.mec.biz.dal.enums.DeviceTypeEnum;
+import com.ym.mec.biz.dal.enums.WebsocketTypeEnum;
 import com.ym.mec.biz.handler.WebSocketHandler;
 import com.ym.mec.biz.service.SoundSocketService;
 import com.ym.mec.biz.service.SysMusicCompareRecordService;
@@ -56,7 +57,7 @@ public class SoundCompareHandler implements WebSocketEventHandler {
 
     private BigDecimal oneHundred = new BigDecimal(100);
 
-    private final String tmpDir = FileUtils.getTempDirectoryPath() + "/soundCompare/";
+    private final String tmpDir = "/mdata/soundCompare/";
     /**
      * @describe 用户对应评分信息
      */
@@ -74,7 +75,7 @@ public class SoundCompareHandler implements WebSocketEventHandler {
     private SysMusicScoreAccompanimentDao sysMusicScoreAccompanimentDao;
 
     public SoundCompareHandler() {
-        WebSocketHandler.regist("SOUND_COMPARE", this);
+        WebSocketHandler.regist(WebsocketTypeEnum.SOUND_COMPARE, this);
         File soundDir = new File(tmpDir);
         if(!soundDir.exists()){
             soundDir.mkdir();
@@ -269,7 +270,7 @@ public class SoundCompareHandler implements WebSocketEventHandler {
         sysMusicCompareRecordService.saveMusicCompareData(phone, userSoundInfoMap.get(phone));
 
         if(Objects.nonNull(userSoundInfoMap.get(phone).getFile())){
-            userSoundInfoMap.get(phone).getFile().deleteOnExit();
+            userSoundInfoMap.get(phone).getFile().delete();
         }
 
         userSoundInfoMap.remove(phone);

+ 20 - 20
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java

@@ -2063,26 +2063,6 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
     }
 
 	@Override
-	public PageInfo<StudentRegisterInstrumentsDetailDto> queryStudentRegisterInstrumentsDetailList(MusicGroupRecordStudentQueryInfo queryInfo) {
-		PageInfo<StudentRegisterInstrumentsDetailDto> pageInfo = new PageInfo<StudentRegisterInstrumentsDetailDto>(queryInfo.getPage(), queryInfo.getRows());
-		Map<String, Object> params = new HashMap<String, Object>();
-		MapUtil.populateMap(params, queryInfo);
-
-		List<StudentRegisterInstrumentsDetailDto> dataList = null;
-		int count = studentRegistrationDao.queryStudentRegisterInstrumentsDetailCount(params);
-		if (count > 0) {
-			pageInfo.setTotal(count);
-			params.put("offset", pageInfo.getOffset());
-			dataList = studentRegistrationDao.queryStudentRegisterInstrumentsDetailList(params);
-		}
-		if (count == 0) {
-			dataList = new ArrayList<StudentRegisterInstrumentsDetailDto>();
-		}
-		pageInfo.setRows(dataList);
-		return pageInfo;
-	}
-
-	@Override
     @Transactional(rollbackFor = Exception.class)
 	public Boolean setCloudTeacherToFailed(StudentRegistration studentRegistration) {
         
@@ -2116,4 +2096,24 @@ public class StudentRegistrationServiceImpl extends BaseServiceImpl<Long, Studen
 		
 		return true;
 	}
+
+	@Override
+	public PageInfo<StudentRegisterInstrumentsDetailDto> queryStudentRegisterInstrumentsDetailList(MusicGroupRecordStudentQueryInfo queryInfo) {
+		PageInfo<StudentRegisterInstrumentsDetailDto> pageInfo = new PageInfo<StudentRegisterInstrumentsDetailDto>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<StudentRegisterInstrumentsDetailDto> dataList = null;
+		int count = studentRegistrationDao.queryStudentRegisterInstrumentsDetailCount(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = studentRegistrationDao.queryStudentRegisterInstrumentsDetailList(params);
+		}
+		if (count == 0) {
+			dataList = new ArrayList<StudentRegisterInstrumentsDetailDto>();
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
 }

+ 146 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java

@@ -4,6 +4,7 @@ import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.biz.dal.page.OrganCloudStudyStudentDataQueryInfo;
 import com.ym.mec.biz.dal.page.StudentQueryInfo;
 import com.ym.mec.biz.service.StudentService;
 import com.ym.mec.biz.service.SysConfigService;
@@ -578,6 +579,151 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     }
 
     @Override
+    public PageInfo<EduOrganStudentDataDto> queryOrganStudentOverView(List<Integer> organIds, OrganCloudStudyStudentDataQueryInfo queryInfo) {
+        PageInfo<EduOrganStudentDataDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+
+        if(StringUtils.isNotBlank(queryInfo.getOrganIds())&&CollectionUtils.isEmpty(organIds)){
+            return pageInfo;
+        }
+
+        List<Organization> organs = organizationDao.getOrgans(organIds);
+        pageInfo.setTotal(organs.size());
+
+        if(CollectionUtils.isEmpty(organs)){
+            return pageInfo;
+        }
+
+        List<Map<Integer, Integer>> organsStudentNumMapList = studentDao.getOrgansStudentNum(organIds);
+        Map<String, Long> organsStudentNumMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(organsStudentNumMapList)){
+            organsStudentNumMap = MapUtil.convertIntegerMap(organsStudentNumMapList);
+        }
+        List<Map<Integer, Integer>> organsVipStudentNumMapList = cloudTeacherDao.getOrgansVipStudentNum(organIds);
+        Map<String, Long> organsVipStudentNumMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(organsVipStudentNumMapList)){
+            organsVipStudentNumMap = MapUtil.convertIntegerMap(organsVipStudentNumMapList);
+        }
+//        List<Map<Integer, Integer>> organsEVipStudentNumMapList = studentDao.getOrgansEVipStudentNum(organIds);
+//        Map<String, Long> organsEVipStudentNumMap = new HashMap<>();
+//        if(!CollectionUtils.isEmpty(organsEVipStudentNumMapList)){
+//            organsEVipStudentNumMap = MapUtil.convertIntegerMap(organsEVipStudentNumMapList);
+//        }
+        List<Map<Integer, Integer>> organCloudStudyStudentNumMapList = studentDao.getOrganCloudStudyStudentNum(organIds);
+        Map<String, Long> organCloudStudyStudentNumMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(organCloudStudyStudentNumMapList)){
+            organCloudStudyStudentNumMap = MapUtil.convertIntegerMap(organCloudStudyStudentNumMapList);
+        }
+        List<Map<Integer, Integer>> organCloudStudyLivelyStudentNumMapList = studentDao.getOrganCloudStudyLivelyStudentNum(organIds);
+        Map<String, Long> organCloudStudyLivelyStudentNumMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(organCloudStudyLivelyStudentNumMapList)){
+            organCloudStudyLivelyStudentNumMap = MapUtil.convertIntegerMap(organCloudStudyLivelyStudentNumMapList);
+        }
+        List<Map<Integer, Integer>> organsNewCloudStudyNumMapList = sysMusicCompareRecordDao.getOrgansNewCloudStudyNum(organIds);
+        Map<String, Long> organsNewCloudStudyNumMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(organsNewCloudStudyNumMapList)){
+            organsNewCloudStudyNumMap = MapUtil.convertIntegerMap(organsNewCloudStudyNumMapList);
+        }
+
+        List<EduOrganStudentDataDto> result = new ArrayList<>();
+
+        for (Organization organ : organs) {
+            EduOrganStudentDataDto organStudentVipData = new EduOrganStudentDataDto();
+            organStudentVipData.setOrganId(organ.getId());
+            organStudentVipData.setOrganName(organ.getName());
+            if(organsStudentNumMap.containsKey(organ.getId().toString())){
+                organStudentVipData.setTotalStudentNum(organsStudentNumMap.get(organ.getId().toString()).intValue());
+            }
+            if(organsVipStudentNumMap.containsKey(organ.getId().toString())){
+                organStudentVipData.setVipStudentNum(organsVipStudentNumMap.get(organ.getId().toString()).intValue());
+            }
+//            if(organsEVipStudentNumMap.containsKey(organ.getId().toString())){
+//                organStudentVipData.seteVipStudentNum(organsEVipStudentNumMap.get(organ.getId().toString()).intValue());
+//            }
+            if(organCloudStudyStudentNumMap.containsKey(organ.getId().toString())){
+                organStudentVipData.setCloudStudyUseStudentNum(organCloudStudyStudentNumMap.get(organ.getId().toString()).intValue());
+            }
+            if(organCloudStudyLivelyStudentNumMap.containsKey(organ.getId().toString())){
+                organStudentVipData.setCloudStudyLivelyStudentNum(organCloudStudyLivelyStudentNumMap.get(organ.getId().toString()).intValue());
+            }
+            if(organStudentVipData.getVipStudentNum()>0&&organStudentVipData.getTotalStudentNum()>0){
+                organStudentVipData.setVipStudentDuty(new BigDecimal(organStudentVipData.getVipStudentNum()).divide(new BigDecimal(organStudentVipData.getTotalStudentNum()), 4, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)).floatValue());
+            }
+            if(organStudentVipData.getCloudStudyUseStudentNum()>0&&organStudentVipData.getTotalStudentNum()>0){
+                organStudentVipData.setCloudStudyUseStudentDuty(new BigDecimal(organStudentVipData.getCloudStudyUseStudentNum()).divide(new BigDecimal(organStudentVipData.getTotalStudentNum()), 4, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)).floatValue());
+            }
+            if(organsNewCloudStudyNumMap.containsKey(organ.getId().toString())){
+                organStudentVipData.setNewCloudStudyStudentNum(organsNewCloudStudyNumMap.get(organ.getId().toString()).intValue());
+            }
+            result.add(organStudentVipData);
+        }
+        Comparator<EduOrganStudentDataDto> comparing = null;
+        if(StringUtils.isNotBlank(queryInfo.getTotalStudentNum())){
+            if(Objects.isNull(comparing)){
+                comparing = Comparator.comparing(EduOrganStudentDataDto::getTotalStudentNum, "ASC".equals(queryInfo.getTotalStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }else{
+                comparing.thenComparing(EduOrganStudentDataDto::getTotalStudentNum, "ASC".equals(queryInfo.getTotalStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }
+        }
+        if(StringUtils.isNotBlank(queryInfo.getCloudStudyLivelyStudentNum())){
+            if(Objects.isNull(comparing)){
+                comparing = Comparator.comparing(EduOrganStudentDataDto::getCloudStudyLivelyStudentNum, "ASC".equals(queryInfo.getCloudStudyLivelyStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }else{
+                comparing.thenComparing(EduOrganStudentDataDto::getCloudStudyLivelyStudentNum, "ASC".equals(queryInfo.getCloudStudyLivelyStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }
+        }
+        if(StringUtils.isNotBlank(queryInfo.getCloudStudyUseStudentDuty())){
+            if(Objects.isNull(comparing)){
+                comparing = Comparator.comparing(EduOrganStudentDataDto::getCloudStudyUseStudentDuty, "ASC".equals(queryInfo.getCloudStudyUseStudentDuty())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }else{
+                comparing.thenComparing(EduOrganStudentDataDto::getCloudStudyUseStudentDuty, "ASC".equals(queryInfo.getCloudStudyUseStudentDuty())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }
+        }
+        if(StringUtils.isNotBlank(queryInfo.getVipStudentNum())){
+            if(Objects.isNull(comparing)){
+                comparing = Comparator.comparing(EduOrganStudentDataDto::getVipStudentNum, "ASC".equals(queryInfo.getVipStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }else{
+                comparing.thenComparing(EduOrganStudentDataDto::getVipStudentNum, "ASC".equals(queryInfo.getVipStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }
+        }
+        if(StringUtils.isNotBlank(queryInfo.getVipStudentDuty())){
+            if(Objects.isNull(comparing)){
+                comparing = Comparator.comparing(EduOrganStudentDataDto::getVipStudentDuty, "ASC".equals(queryInfo.getVipStudentDuty())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }else{
+                comparing.thenComparing(EduOrganStudentDataDto::getVipStudentDuty, "ASC".equals(queryInfo.getVipStudentDuty())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }
+        }
+        if(StringUtils.isNotBlank(queryInfo.geteVipStudentNum())){
+            if(Objects.isNull(comparing)){
+                comparing = Comparator.comparing(EduOrganStudentDataDto::geteVipStudentNum, "ASC".equals(queryInfo.geteVipStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }else{
+                comparing.thenComparing(EduOrganStudentDataDto::geteVipStudentNum, "ASC".equals(queryInfo.geteVipStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }
+        }
+        if(StringUtils.isNotBlank(queryInfo.getNewMemberStudentNum())){
+            if(Objects.isNull(comparing)){
+                comparing = Comparator.comparing(EduOrganStudentDataDto::getNewMemberStudentNum, "ASC".equals(queryInfo.getNewMemberStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }else{
+                comparing.thenComparing(EduOrganStudentDataDto::getNewMemberStudentNum, "ASC".equals(queryInfo.getNewMemberStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }
+        }
+        if(StringUtils.isNotBlank(queryInfo.getCloudStudyLivelyStudentDuty())){
+            if(Objects.isNull(comparing)){
+                comparing = Comparator.comparing(EduOrganStudentDataDto::getCloudStudyLivelyStudentDuty, "ASC".equals(queryInfo.getCloudStudyLivelyStudentDuty())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }else{
+                comparing.thenComparing(EduOrganStudentDataDto::getCloudStudyLivelyStudentDuty, "ASC".equals(queryInfo.getCloudStudyLivelyStudentDuty())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }
+        }
+
+        if(Objects.isNull(comparing)){
+            comparing = Comparator.comparing(EduOrganStudentDataDto::getOrganId);
+        }
+
+        result = result.stream().skip(pageInfo.getOffset()).limit(pageInfo.getLimit()).sorted(comparing).collect(Collectors.toList());
+        pageInfo.setRows(result);
+        return pageInfo;
+    }
+
+    @Override
     public CloudStudyStudentDataDto getCloudStudyStudentOverView(List<Integer> organIds) {
         CloudStudyStudentDataDto result = new CloudStudyStudentDataDto();
         result.setTotalStudentNum(studentDao.getOrgansTotalStudentNum(organIds));

+ 64 - 14
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherServiceImpl.java

@@ -16,6 +16,7 @@ import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.page.*;
 import org.apache.commons.lang3.StringUtils;
@@ -30,20 +31,6 @@ import com.alibaba.fastjson.JSONObject;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.enums.YesOrNoEnum;
-import com.ym.mec.biz.dal.dao.ClassGroupDao;
-import com.ym.mec.biz.dal.dao.DemoGroupDao;
-import com.ym.mec.biz.dal.dao.ImGroupDao;
-import com.ym.mec.biz.dal.dao.ImUserFriendDao;
-import com.ym.mec.biz.dal.dao.MusicGroupDao;
-import com.ym.mec.biz.dal.dao.OrganizationDao;
-import com.ym.mec.biz.dal.dao.SchoolDao;
-import com.ym.mec.biz.dal.dao.StudentDao;
-import com.ym.mec.biz.dal.dao.StudentExtracurricularExercisesSituationDao;
-import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
-import com.ym.mec.biz.dal.dao.StudentRegistrationDao;
-import com.ym.mec.biz.dal.dao.SubjectDao;
-import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
-import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.entity.CourseHomework;
 import com.ym.mec.biz.dal.entity.ImUserFriend;
 import com.ym.mec.biz.dal.entity.MusicGroup;
@@ -109,6 +96,8 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher>  imple
 	private ImUserFriendDao imUserFriendDao;
 	@Autowired
 	private RedisTemplate<String,String> redisTemplate;
+	@Autowired
+	private CloudTeacherDao cloudTeacherDao;
 
 
 	@Override
@@ -781,4 +770,65 @@ public class TeacherServiceImpl extends BaseServiceImpl<Integer, Teacher>  imple
 		pageInfo.setRows(dataList);
 		return pageInfo;
 	}
+
+	@Override
+	public PageInfo<TeacherStudentDataDto> queryMemberStudentData(TeacherServeQueryInfo queryInfo) {
+		PageInfo<TeacherStudentDataDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<TeacherStudentDataDto> dataList = new ArrayList<>();
+		int count = teacherDao.countMemberStudentData(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = teacherDao.queryMemberStudentData(params);
+			List<Integer> teacherIds = dataList.stream().map(TeacherStudentDataDto::getTeacherId).collect(Collectors.toList());
+
+			List<Map<Integer, Integer>> teachersStudentNumMapList = studentDao.getOrganTeacherStudentNum(teacherIds, Integer.valueOf(queryInfo.getOrganId()));
+			Map<Integer, Long> teachersStudentNumMap = new HashMap<>();
+			if(!CollectionUtils.isEmpty(teachersStudentNumMapList)){
+				teachersStudentNumMap = MapUtil.convertIntegerMap(teachersStudentNumMapList);
+			}
+
+			List<Map<Integer, Integer>> teachersMemberStudentNumMapList = cloudTeacherDao.getTeachersMemberStudentNum(teacherIds, Integer.valueOf(queryInfo.getOrganId()));
+			Map<Integer, Long> teachersMemberStudentNumMap = new HashMap<>();
+			if(!CollectionUtils.isEmpty(teachersMemberStudentNumMapList)){
+				teachersMemberStudentNumMap = MapUtil.convertIntegerMap(teachersMemberStudentNumMapList);
+			}
+			List<Map<Integer, Integer>> teacherExperienceMemberStudentNumMapList = studentDao.getTeacherExperienceMemberStudentNum(teacherIds, Integer.valueOf(queryInfo.getOrganId()));
+			Map<Integer, Long> teacherExperienceMemberStudentNumMap = new HashMap<>();
+			if(!CollectionUtils.isEmpty(teacherExperienceMemberStudentNumMapList)){
+				teacherExperienceMemberStudentNumMap = MapUtil.convertIntegerMap(teacherExperienceMemberStudentNumMapList);
+			}
+			List<Map<Integer, Integer>> organTeacherCloudStudyStudentNumMapList = studentDao.getOrganTeacherCloudStudyStudentNum(teacherIds, Integer.valueOf(queryInfo.getOrganId()));
+			Map<String, Long> organTeacherCloudStudyStudentNumMap = new HashMap<>();
+			if(!CollectionUtils.isEmpty(organTeacherCloudStudyStudentNumMapList)){
+				organTeacherCloudStudyStudentNumMap = MapUtil.convertIntegerMap(organTeacherCloudStudyStudentNumMapList);
+			}
+			for (TeacherStudentDataDto teacherStudentDataDto : dataList) {
+				if(teachersStudentNumMap.containsKey(teacherStudentDataDto.getTeacherId())){
+					teacherStudentDataDto.setTotalStudentNum(teachersStudentNumMap.get(teacherStudentDataDto.getTeacherId()).intValue());
+				}
+				if(teachersMemberStudentNumMap.containsKey(teacherStudentDataDto.getTeacherId())){
+					teacherStudentDataDto.setVipStudentNum(teachersMemberStudentNumMap.get(teacherStudentDataDto.getTeacherId()).intValue());
+				}
+				if(teacherExperienceMemberStudentNumMap.containsKey(teacherStudentDataDto.getTeacherId())){
+					teacherStudentDataDto.seteVipStudentNum(teacherExperienceMemberStudentNumMap.get(teacherStudentDataDto.getTeacherId()).intValue());
+				}
+				if(teacherStudentDataDto.getVipStudentNum()>0&&teacherStudentDataDto.getTotalStudentNum()>0){
+					teacherStudentDataDto.setVipStudentDuty(new BigDecimal(teacherStudentDataDto.getVipStudentNum()).divide(new BigDecimal(teacherStudentDataDto.getTotalStudentNum()), 4, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)).floatValue());
+				}
+				if(organTeacherCloudStudyStudentNumMap.containsKey(teacherStudentDataDto.getTeacherId())){
+					teacherStudentDataDto.setCloudStudyUseStudentNum(organTeacherCloudStudyStudentNumMap.get(teacherStudentDataDto.getTeacherId()).intValue());
+				}
+				if(teacherStudentDataDto.getCloudStudyUseStudentNum()>0&&teacherStudentDataDto.getTotalStudentNum()>0){
+					teacherStudentDataDto.setCloudStudyUseStudentDuty(new BigDecimal(teacherStudentDataDto.getCloudStudyUseStudentNum()).divide(new BigDecimal(teacherStudentDataDto.getTotalStudentNum()), 4, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)).floatValue());
+				}
+			}
+		}
+		pageInfo.setStatInfo(new HashMap<String, Object>(){{put("noTeacherStudentNum", studentDao.getOrganNoTeacherStudentNum(Integer.valueOf(queryInfo.getOrganId())));}});
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
 }

+ 1 - 1
mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml

@@ -1529,7 +1529,7 @@
         UNION
         SELECT cg.id_ FROM practice_group pg
         LEFT JOIN class_group cg ON cg.music_group_id_ = pg.id_
-        WHERE pg.educational_teacher_id_ = #{userId} AND cg.group_type_ = 'PRACTICE' AND cg.del_flag_ = 0
+        WHERE pg.educational_teacher_id_ = #{userId} AND cg.del_flag_ = 0
     </select>
     <select id="countCourseNum" resultType="int">
         SELECT COUNT(id_) FROM course_schedule WHERE class_group_id_ = #{classGroupId} AND teach_mode_ = #{teachMode} AND pre_course_flag_ = 0

+ 20 - 0
mec-biz/src/main/resources/config/mybatis/CloudTeacherMapper.xml

@@ -115,4 +115,24 @@
         </if>
         GROUP BY su.organ_id_
     </select>
+
+    <select id="getTeachersMemberStudentNum" resultType="map">
+        SELECT
+        stu.teacher_id_ 'key',
+        COUNT(DISTINCT cto.student_id_) 'value'
+        FROM cloud_teacher_order cto
+        LEFT JOIN student stu ON cto.student_id_=stu.user_id_
+        LEFT JOIN sys_user su ON cto.student_id_=su.id_
+        WHERE su.del_flag_=0 AND cto.status_ IN (1,2)
+        <if test="organId!=null">
+            AND su.organ_id_=#{organId}
+        </if>
+        <if test="teacherIds!=null and teacherIds.size()>0">
+            AND stu.teacher_id_ IN
+            <foreach collection="teacherIds" item="teacherId" open="(" close=")" separator=",">
+                #{teacherId}
+            </foreach>
+        </if>
+        GROUP BY stu.teacher_id_
+    </select>
 </mapper>

+ 3 - 3
mec-biz/src/main/resources/config/mybatis/CloudTeacherOrderMapper.xml

@@ -189,9 +189,9 @@
     </select>
     
     <select id="queryOrderInfoByOrderId" resultMap="CloudTeacherOrderDto">
-        SELECT cto.*,spo.status_ trans_status_,spo.expect_amount_,mrs.name_,mrs.icon_ FROM cloud_teacher_order cto
-       left join student_payment_order spo on cto.order_id_ = spo.id_
-       left join member_rank_setting mrs on mrs.id_ = cto.level_
+	SELECT cto.*,spo.status_ trans_status_,spo.expect_amount_,mrs.name_,mrs.icon_ FROM cloud_teacher_order cto
+        left join student_payment_order spo on cto.order_id_ = spo.id_
+        left join member_rank_setting mrs on mrs.id_ = cto.level_
         where spo.type_ = 'MEMBER' and order_id_ = #{orderId}
     </select>
     <select id="queryNoStartByUserIds" resultType="java.util.Map">

+ 167 - 16
mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml

@@ -149,6 +149,32 @@
 		GROUP BY month_,data_type_
 	</select>
 
+	<select id="getAllIndexBaseData" resultMap="IndexBaseMonthData">
+		SELECT
+			*
+		FROM index_base_month_data
+		<where>
+			<if test="dataTypes!=null and dataTypes.size()>0">
+				AND data_type_ IN
+				<foreach collection="dataTypes" item="dataType" open="(" close=")" separator=",">
+					#{dataType}
+				</foreach>
+			</if>
+			<if test="organIds!=null and organIds.size()>0">
+				AND organ_id_ IN
+				<foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+					#{organId}
+				</foreach>
+			</if>
+			<if test="startMonth!=null and startMonth!=''">
+				AND month_&gt;=#{startMonth}
+			</if>
+			<if test="endMonth!=null and endMonth!=''">
+				AND month_&lt;=#{endMonth}
+			</if>
+		</where>
+	</select>
+
 	<select id="getVipCourseDataList" resultMap="IndexBaseMonthData">
 		SELECT
 			month_,
@@ -1646,26 +1672,151 @@
 
 	<select id="getOrgansStudentNumData" resultMap="IndexBaseMonthData">
 		SELECT
+			t.organ_id_,
+			#{dayStr} month_,
+			COUNT( DISTINCT t.user_id_ ) total_num_,
+			COUNT( DISTINCT t.user_id_ ) activate_num_,
+			COUNT( DISTINCT t.user_id_ ) percent_
+		FROM((
+			SELECT
+				su.organ_id_,
+				sr.user_id_
+			FROM
+				student_registration sr
+				LEFT JOIN music_group mg ON sr.music_group_id_=mg.id_
+				LEFT JOIN sys_user su ON sr.user_id_ = su.id_
+			WHERE
+				su.del_flag_ = 0
+				AND mg.status_='PROGRESS'
+				AND sr.music_group_status_ = 'NORMAL'
+				<if test="dayStr!=null and dayStr!=''">
+					AND DATE(sr.create_time_)&lt;= #{dayStr}
+				</if>)
+		UNION ALL
+		(
+			SELECT
+				su.organ_id_,
+				cssp.user_id_
+			FROM
+				course_schedule_student_payment cssp
+				LEFT JOIN course_schedule cs ON cssp.course_schedule_id_ = cs.id_
+				LEFT JOIN sys_user su ON cssp.user_id_ = su.id_
+			WHERE
+				cssp.group_type_ IN ( 'VIP', 'PRACTICE' )
+				AND cs.status_ = 'NOT_START'
+				AND su.del_flag_ = 0
+				<if test="dayStr!=null and dayStr!=''">
+					AND DATE(cssp.create_time_)&lt;= #{dayStr}
+				</if>)) t
+		GROUP BY t.organ_id_
+	</select>
+
+	<select id="getMemberStudentNumData" resultMap="IndexBaseMonthData">
+		SELECT
+			su.organ_id_,
+			#{dayStr} month_,
+			COUNT(DISTINCT cto.student_id_) total_num_,
+			COUNT(DISTINCT cto.student_id_) activate_num_,
+			COUNT(DISTINCT cto.student_id_) percent_
+		FROM cloud_teacher_order cto
+			LEFT JOIN sys_user su ON cto.student_id_=su.id_
+		WHERE su.del_flag_=0 AND cto.status_ IN (1,2)
+			<if test="dayStr!=null and dayStr!=''">
+				AND DATE(cto.create_time_)&lt;= #{dayStr}
+			</if>
+		GROUP BY su.organ_id_
+	</select>
+
+	<select id="getNewMemberStudentNumData" resultMap="IndexBaseMonthData">
+		SELECT
 		su.organ_id_,
 		#{dayStr} month_,
-		COUNT( DISTINCT s.user_id_ ) total_num_,
-		COUNT( DISTINCT s.user_id_ ) activate_num_,
-		COUNT( DISTINCT s.user_id_ ) percent_
-		FROM
-		sys_user su
-		LEFT JOIN course_schedule_student_payment s ON su.id_=s.user_id_
-		LEFT JOIN course_schedule_student_payment cssp1 ON s.user_id_=cssp1.user_id_ AND cssp1.create_time_&lt;#{dayStr}
-		LEFT JOIN course_schedule m ON s.course_schedule_id_=m.id_
-		WHERE
-		m.del_flag_ = 0
-		AND (m.is_lock_ = 0 OR m.is_lock_ IS NULL)
-		AND cssp1.id_ IS NULL
-		AND su.organ_id_ IS NOT NULL
-		AND m.group_type_ IN ('VIP', 'PRACTICE')
+		COUNT(DISTINCT cto.student_id_) total_num_,
+		COUNT(DISTINCT cto.student_id_) activate_num_,
+		COUNT(DISTINCT cto.student_id_) percent_
+		FROM cloud_teacher_order cto
+		LEFT JOIN sys_user su ON cto.student_id_=su.id_
+		WHERE su.del_flag_=0 AND cto.status_ IN (1,2)
 		<if test="dayStr!=null and dayStr!=''">
-			AND DATE_FORMAT(s.create_time_, '%Y-%m-%d') = #{dayStr}
+			AND DATE(cto.create_time_)= #{dayStr}
 		</if>
 		GROUP BY su.organ_id_
-		ORDER BY su.organ_id_;
+	</select>
+
+	<select id="getExperienceMemberStudentNumData" resultMap="IndexBaseMonthData">
+		SELECT
+		su.organ_id_,
+		#{dayStr} month_,
+		COUNT(DISTINCT stu.user_id_) total_num_,
+		COUNT(DISTINCT stu.user_id_) activate_num_,
+		COUNT(DISTINCT stu.user_id_) percent_
+		FROM student stu
+		LEFT JOIN cloud_teacher_order cto ON stu.user_id_=cto.student_id_
+		LEFT JOIN sys_user su ON su.id_=stu.user_id_
+		WHERE su.del_flag_=0 AND stu.experience_member_rank_setting_id_ IS NOT NULL AND (cto.id_ IS NULL OR cto.status_ NOT IN (1, 2))
+		<if test="dayStr!=null and dayStr!=''">
+			AND DATE(stu.experience_membership_start_time_)&lt;= #{dayStr}
+		</if>
+		GROUP BY su.organ_id_
+	</select>
+
+	<select id="getCloudStudyDayUseStudentNumData" resultMap="IndexBaseMonthData">
+		SELECT
+			su.organ_id_,
+			#{dayStr} month_,
+			COUNT(DISTINCT smcr.user_id_) total_num_,
+			COUNT(DISTINCT smcr.user_id_) activate_num_,
+			COUNT(DISTINCT smcr.user_id_) percent_
+		FROM sys_music_compare_record smcr
+			LEFT JOIN sys_user su ON smcr.user_id_=su.id_
+			LEFT JOIN student stu ON smcr.user_id_=stu.user_id_
+		WHERE su.del_flag_=0 AND stu.user_id_ IS NOT NULL
+			<if test="dayStr!=null and dayStr!=''">
+				AND DATE(smcr.create_time_)= #{dayStr}
+			</if>
+		GROUP BY su.organ_id_
+	</select>
+
+	<select id="getCloudStudyLivelyStudentNumData" resultMap="IndexBaseMonthData">
+		SELECT
+			t.organ_id_,
+			#{dayStr} month_,
+			COUNT(user_id_) total_num_,
+			COUNT(user_id_) activate_num_,
+			COUNT(user_id_) percent_
+		FROM (SELECT
+			su.organ_id_,
+			smcr.user_id_,
+			COUNT(DISTINCT(CASE WHEN DATEDIFF(NOW(), smcr.create_time_)&lt;=15 THEN DATE_FORMAT(smcr.create_time_, '%Y-%m-%d') ELSE NULL END)) days
+			FROM sys_music_compare_record smcr
+			LEFT JOIN sys_user su ON smcr.user_id_=su.id_
+			LEFT JOIN student stu ON smcr.user_id_=stu.user_id_
+			WHERE su.del_flag_=0 AND stu.user_id_ IS NOT NULL
+			<if test="dayStr!=null and dayStr!=''">
+				AND DATE(smcr.create_time_) &lt;= #{dayStr}
+			</if>
+			GROUP BY smcr.user_id_) t WHERE t.days>=5
+		GROUP BY t.organ_id_
+	</select>
+
+	<select id="getCloudStudyNewStudentNumData" resultMap="IndexBaseMonthData">
+		SELECT
+			organ_id_,
+			#{dayStr} month_,
+			COUNT( DISTINCT user_id_ ) total_num_,
+			COUNT( DISTINCT user_id_ ) activate_num_,
+			COUNT( DISTINCT user_id_ ) percent_
+		FROM
+		(
+		SELECT
+			su.organ_id_,
+			smcr.user_id_
+		FROM
+			sys_music_compare_record smcr
+			LEFT JOIN sys_user su ON smcr.user_id_ = su.id_
+		WHERE su.del_flag_ = 0
+		GROUP BY user_id_
+		HAVING MIN(DATE( smcr.create_time_ ))= #{dayStr}) t
+		GROUP BY t.organ_id_
 	</select>
 </mapper>

+ 91 - 1
mec-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -779,8 +779,10 @@
         SELECT COUNT(DISTINCT user_id_)
         FROM ((SELECT sr.user_id_
                FROM student_registration sr
+                        LEFT JOIN music_group mg ON sr.music_group_id_=mg.id_
                         LEFT JOIN sys_user su ON sr.user_id_=su.id_
                WHERE su.del_flag_=0
+                 AND mg.status_='PROGRESS'
                  AND sr.music_group_status_='NORMAL'
                  AND su.organ_id_ = #{organId})
               UNION ALL
@@ -801,8 +803,10 @@
         SELECT COUNT(DISTINCT user_id_)
         FROM ((SELECT sr.user_id_
                FROM student_registration sr
+                    LEFT JOIN music_group mg ON sr.music_group_id_=mg.id_
                         LEFT JOIN sys_user su ON sr.user_id_=su.id_
                WHERE su.del_flag_=0
+                AND mg.status_='PROGRESS'
                  AND sr.music_group_status_='NORMAL'
                 <if test="organIds!=null and organIds.size()>0">
                     AND su.organ_id_ IN
@@ -833,8 +837,10 @@
         SELECT t.organ_id_ 'key',COUNT(DISTINCT user_id_) 'value'
         FROM ((SELECT su.organ_id_,sr.user_id_
         FROM student_registration sr
+        LEFT JOIN music_group mg ON sr.music_group_id_=mg.id_
         LEFT JOIN sys_user su ON sr.user_id_=su.id_
         WHERE su.del_flag_=0
+        AND mg.status_='PROGRESS'
         AND sr.music_group_status_='NORMAL')
         UNION ALL
         (SELECT
@@ -857,6 +863,47 @@
         GROUP BY t.organ_id_
     </select>
 
+    <select id="getOrganTeacherStudentNum" resultType="map">
+        SELECT stu.teacher_id_ 'key',COUNT(DISTINCT t.user_id_) 'value'
+        FROM ((SELECT sr.user_id_
+        FROM student_registration sr
+        LEFT JOIN music_group mg ON sr.music_group_id_=mg.id_
+        WHERE mg.status_='PROGRESS' AND sr.music_group_status_='NORMAL')
+        UNION ALL
+        (SELECT
+        cssp.user_id_
+        FROM
+        course_schedule_student_payment cssp
+        LEFT JOIN course_schedule cs ON cssp.course_schedule_id_=cs.id_
+        WHERE
+            cssp.group_type_ IN ('VIP', 'PRACTICE')
+            AND cs.status_='NOT_START')) t
+        LEFT JOIN student stu ON t.user_id_=stu.user_id_
+        LEFT JOIN sys_user su ON t.user_id_ = su.id_
+        LEFT JOIN teacher tea ON stu.teacher_id_=tea.id_
+        WHERE su.del_flag_=0
+        <if test="organId!=null">
+            AND tea.organ_id_=#{organId}
+        </if>
+        <if test="teacherIds!=null and teacherIds.size()>0">
+            AND stu.teacher_id_ IN
+            <foreach collection="teacherIds" item="teacherId" open="(" close=")" separator=",">
+                #{teacherId}
+            </foreach>
+        </if>
+        GROUP BY stu.teacher_id_
+    </select>
+
+    <select id="getOrganNoTeacherStudentNum" resultType="int">
+        SELECT COUNT(DISTINCT stu.user_id_)
+        FROM student stu
+        LEFT JOIN sys_user su ON stu.user_id_ = su.id_
+        WHERE su.del_flag_=0 AND stu.teacher_id_ IS NULL
+        <if test="organId!=null">
+            AND su.organ_id_=#{organId}
+        </if>
+    </select>
+
     <select id="getCloudStudyStudentNum" resultType="int">
         SELECT
             COUNT(DISTINCT smcr.user_id_)
@@ -888,6 +935,7 @@
         LEFT JOIN sys_user su ON smcr.user_id_=su.id_
         LEFT JOIN student stu ON smcr.user_id_=stu.user_id_
         WHERE su.del_flag_=0 AND stu.user_id_ IS NOT NULL
+        AND DATE(smcr.create_time_) = CURDATE()
         <if test="organIds!=null and organIds.size()>0">
             AND su.organ_id_ IN
             <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
@@ -913,6 +961,27 @@
         GROUP BY su.organ_id_
     </select>
 
+    <select id="getOrganTeacherCloudStudyStudentNum" resultType="map">
+        SELECT
+        stu.teacher_id_ 'key',
+        COUNT(DISTINCT smcr.user_id_) 'value'
+        FROM sys_music_compare_record smcr
+        LEFT JOIN sys_user su ON smcr.user_id_=su.id_
+        LEFT JOIN student stu ON smcr.user_id_=stu.user_id_
+        LEFT JOIN teacher tea ON stu.teacher_id_=tea.id_
+        WHERE su.del_flag_=0 AND stu.user_id_ IS NOT NULL
+        <if test="organId!=null">
+            AND tea.organ_id_=#{organId}
+        </if>
+        <if test="teacherIds!=null and teacherIds.size()>0">
+            AND stu.teacher_id_ IN
+            <foreach collection="teacherIds" item="teacherId" open="(" close=")" separator=",">
+                #{teacherId}
+            </foreach>
+        </if>
+        GROUP BY stu.teacher_id_
+    </select>
+
     <select id="getCloudStudyLivelyStudentNum" resultType="int">
         SELECT COUNT(user_id_)
         FROM (SELECT
@@ -987,6 +1056,7 @@
             stu.cloud_study_sequence_days_ cloudStudyRunningDays,
             COUNT(DISTINCT smcr.behavior_id_) cloudStudyUseNum,
             SUM(CASE WHEN smcr.play_time_ IS NULL THEN 0 ELSE play_time_ END) cloudStudyUseTime,
+            COUNT(DISTINCT DATE(smcr.create_time_)) cloudStudyUseDays,
             stu.membership_end_time_ membershipEndTime
         FROM student stu
             LEFT JOIN sys_user su ON stu.user_id_=su.id_
@@ -1047,7 +1117,7 @@
                  LEFT JOIN cloud_teacher_order cto ON stu.user_id_=cto.student_id_
                  LEFT JOIN sys_user su ON su.id_=stu.user_id_
         WHERE su.del_flag_=0 AND stu.experience_member_rank_setting_id_ IS NOT NULL
-        AND NOT IN (SELECT DISTINCT student_id_ FROM cloud_teacher_order WHERE status_ IN (1,2))
+        AND stu.user_id_ NOT IN (SELECT DISTINCT student_id_ FROM cloud_teacher_order WHERE status_ IN (1,2))
         <if test="organIds!=null and organIds.size()>0">
             AND su.organ_id_ IN
             <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
@@ -1057,6 +1127,26 @@
         GROUP BY su.organ_id_
     </select>
 
+    <select id="getTeacherExperienceMemberStudentNum" resultType="map">
+        SELECT
+        stu.teacher_id_ 'key',
+        COUNT(DISTINCT stu.user_id_) 'value'
+        FROM student stu
+        LEFT JOIN cloud_teacher_order cto ON stu.user_id_=cto.student_id_
+        LEFT JOIN sys_user su ON su.id_=stu.user_id_
+        WHERE su.del_flag_=0 AND stu.experience_member_rank_setting_id_ IS NOT NULL AND (cto.id_ IS NULL OR cto.status_ NOT IN (1, 2))
+        <if test="organId!=null">
+            AND su.organ_id_=#{organId}
+        </if>
+        <if test="teacherIds!=null and teacherIds.size()>0">
+            AND stu.teacher_id_ IN
+            <foreach collection="teacherIds" item="teacherId" open="(" close=")" separator=",">
+                #{teacherId}
+            </foreach>
+        </if>
+        GROUP BY stu.teacher_id_
+    </select>
+
     <update id="updateGrade"><![CDATA[
         UPDATE student SET current_grade_num_=current_grade_num_+1
         WHERE current_grade_num_>=1

+ 6 - 6
mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml

@@ -1586,16 +1586,16 @@
         </if>
         GROUP BY sr.user_id_
     </select>
-    
+
     <select id="countStudentWithSubjectByMusicGroupId" resultMap="Mapper">
-        select sr.actual_subject_id_ subject_id_, s.name_ key_,count(sr.id_) value_ from student_registration sr LEFT JOIN subject s on sr.actual_subject_id_ = s.id_ 
-		where sr.music_group_status_ = 'NORMAL' and sr.music_group_id_ = #{musicGroupId} 
+        select sr.actual_subject_id_ subject_id_, s.name_ key_,count(sr.id_) value_ from student_registration sr LEFT JOIN subject s on sr.actual_subject_id_ = s.id_
+		where sr.music_group_status_ = 'NORMAL' and sr.music_group_id_ = #{musicGroupId}
 		group by sr.actual_subject_id_
     </select>
-    
+
     <select id="countStudentWithGradeByMusicGroupId" resultMap="Mapper">
         select s.current_grade_num_ key_,count(sr.id_) value_ from student_registration sr LEFT JOIN student s on sr.user_id_= s.user_id_
-		where sr.music_group_status_ = 'NORMAL' and sr.music_group_id_ = #{musicGroupId} 
+		where sr.music_group_status_ = 'NORMAL' and sr.music_group_id_ = #{musicGroupId}
 		group by s.current_grade_num_
     </select>
     
@@ -1655,7 +1655,7 @@
         ORDER BY sr.create_time_ desc
         <include refid="global.limit"/>
     </select>
-    
+
     <select id="queryStudentApplyDetail" resultType="com.ym.mec.biz.dal.dto.SubjectApplyDetailDto">
         SELECT music_group_id_ musicGroupId,actual_subject_id_ subjectId, COUNT(*) applyStudentNum,SUM(IF(payment_status_ = '2',1,0)) payNum,
         SUM(IF(paying_status_='2',1,0)) checkNum,SUM(IF((payment_status_= '2' and has_cloud_teacher_=1),1,0)) buyCloudTeacherNum,

+ 28 - 0
mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml

@@ -1394,4 +1394,32 @@
         LEFT JOIN music_group mg ON csts.music_group_id_=mg.id_
         <include refid="queryTeacherMusicIdsCondition"></include>
     </select>
+
+    <sql id="queryMemberStudentDataCondition">
+        <where>
+            su.del_flag_=0 AND su.lock_flag_=0
+            <if test="organId!=null and organId!=''">
+                AND tea.organ_id_ = #{organId}
+            </if>
+        </where>
+    </sql>
+
+    <select id="queryMemberStudentData" resultType="com.ym.mec.biz.dal.dto.TeacherStudentDataDto">
+        select tea.id_ teacherId,
+               su.real_name_ teacherName
+        from teacher tea
+        LEFT JOIN sys_user su ON su.id_=tea.id_
+        <include refid="queryMemberStudentDataCondition"></include>
+        group by tea.id_
+        ORDER BY tea.id_
+        <include refid="global.limit"></include>
+    </select>
+
+    <select id="countMemberStudentData" resultType="int">
+        select count(tea.id_)
+        from teacher tea
+        LEFT JOIN sys_user su ON su.id_=tea.id_
+        <include refid="queryMemberStudentDataCondition"></include>
+        <include refid="global.limit"></include>
+    </select>
 </mapper>

+ 2 - 2
mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java

@@ -65,7 +65,7 @@ public class TaskRemoteServiceFallback implements TaskRemoteService {
 
 	@Override
 	public void studentHomeworkRemind() {
-		logger.info("学生作业提醒的服务调用失败");
+		logger.info("学生训练提醒的服务调用失败");
 	}
 
 	@Override
@@ -80,7 +80,7 @@ public class TaskRemoteServiceFallback implements TaskRemoteService {
 
 	@Override
 	public void homeworkNoReplyRemind() {
-		logger.info("老师未回复作业提醒的服务调用失败");
+		logger.info("老师未回复训练提醒的服务调用失败");
 	}
 
 	@Override

+ 2 - 2
mec-student/src/main/java/com/ym/mec/student/controller/SysMessageController.java

@@ -67,14 +67,14 @@ public class SysMessageController extends BaseController {
 			if(currentVersion > defaultVersion){
 				return succeed(JSON.parseArray("[{\"value\":\"全部\",\"key\":\"ALL\"}," +
 						"{\"value\":\"课程信息\",\"key\":\"COURSE\"}," +
-						"{\"value\":\"作业信息\",\"key\":\"WORK\"}," +
+						"{\"value\":\"训练信息\",\"key\":\"WORK\"}," +
 						"{\"value\":\"其他\",\"key\":\"DEFAULT\"}]"));
 			}
 		}
 		return succeed(JSON.parseArray("[{\"value\":\"全部\",\"key\":\"ALL\"}," +
 				"{\"value\":\"缴费信息\",\"key\":\"PAY\"}," +
 				"{\"value\":\"课程信息\",\"key\":\"COURSE\"}," +
-				"{\"value\":\"作业信息\",\"key\":\"WORK\"}," +
+				"{\"value\":\"训练信息\",\"key\":\"WORK\"}," +
 				"{\"value\":\"其他\",\"key\":\"DEFAULT\"}]"));
 	}
 

+ 3 - 3
mec-teacher/src/main/java/com/ym/mec/teacher/controller/CourseHomeworkController.java

@@ -89,7 +89,7 @@ public class CourseHomeworkController extends BaseController {
     public Object findCourseHomeworkStudentDetail(Long courseScheduleID,Long userId){
         StudentCourseHomework studentCourseHomework1 = studentCourseHomeworkService.get(courseScheduleID);
         if(Objects.isNull(studentCourseHomework1)){
-            return failed("作业不存在");
+            return failed("训练不存在");
         }
         CourseHomeworkStudentDetailDto courseHomeworkStudentDetail = studentCourseHomeworkService.findCourseHomeworkStudentDetail(studentCourseHomework1.getCourseScheduleId(), userId);
         if(Objects.nonNull(courseHomeworkStudentDetail)){
@@ -107,7 +107,7 @@ public class CourseHomeworkController extends BaseController {
         if(!extra){
             StudentCourseHomework studentCourseHomework1 = studentCourseHomeworkService.get(courseScheduleID);
             if(Objects.isNull(studentCourseHomework1)){
-                return failed("作业不存在");
+                return failed("训练不存在");
             }
             CourseHomeworkStudentDetailDto courseHomeworkStudentDetail = studentCourseHomeworkService.findCourseHomeworkStudentDetail(studentCourseHomework1.getCourseScheduleId(), userId);
             if(Objects.nonNull(courseHomeworkStudentDetail)&&Objects.nonNull(courseHomeworkStudentDetail.getAttachments())){
@@ -120,7 +120,7 @@ public class CourseHomeworkController extends BaseController {
         }else{
             CourseHomeworkStudentDetailDto studentExtraExerciseDetail = extracurricularExercisesReplyService.findStudentExtraExerciseDetail(courseScheduleID);
             if(Objects.isNull(studentExtraExerciseDetail)){
-                return failed("作业不存在");
+                return failed("训练不存在");
             }
             if(Objects.nonNull(studentExtraExerciseDetail.getAttachments())&&studentExtraExerciseDetail.getStatus().equals(YesOrNoEnum.YES)){
                 ExtracurricularExercisesReply extracurricularExercisesReply=new ExtracurricularExercisesReply();

+ 1 - 1
mec-teacher/src/main/java/com/ym/mec/teacher/controller/ExtracurricularExercisesController.java

@@ -79,7 +79,7 @@ public class ExtracurricularExercisesController extends BaseController {
     @GetMapping("/findStudentExtraExerciseDetail")
     private HttpResponseResult findStudentExtraExerciseDetail(Long studentExerciseId){
         if(Objects.isNull(studentExerciseId)){
-            return failed("请选择课外训练作业");
+            return failed("请选择课外训练");
         }
         return succeed(extracurricularExercisesReplyService.findStudentExtraExerciseDetail(studentExerciseId));
     }

+ 1 - 1
mec-teacher/src/main/java/com/ym/mec/teacher/controller/SysMessageController.java

@@ -61,7 +61,7 @@ public class SysMessageController extends BaseController {
 		return succeed(JSON.parseArray("[{\"value\":\"全部\",\"key\":\"ALL\"}," +
 				"{\"value\":\"考勤信息\",\"key\":\"ATTENDANCE\"}," +
 				"{\"value\":\"课程信息\",\"key\":\"COURSE\"}," +
-				"{\"value\":\"作业信息\",\"key\":\"WORK\"}," +
+				"{\"value\":\"训练信息\",\"key\":\"WORK\"}," +
 				"{\"value\":\"其他\",\"key\":\"DEFAULT\"}]"));
 	}
 

+ 202 - 6
mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

@@ -137,6 +137,8 @@ public class ExportController extends BaseController {
     private IndexErrDataRecordService indexErrDataRecordService;
     @Autowired
     private EmployeeInfoService employeeInfoService;
+    @Autowired
+    private StudentService studentService;
 
     @ApiOperation(value = "21年暑期考级活动统计页面详情导出")
     @PostMapping("export/statisticsDetail")
@@ -1533,7 +1535,7 @@ public class ExportController extends BaseController {
                 }
             }
 
-            String[] header = {"分部", "上课日期", "学生编号", "课程编号", "学员是否到课", "课程班名称", "老师", "教材内容", "发音", "节奏", "乐理", "曲目", "评价备注", "回访日期(布置作业)", "完成app双向沟通", "学员评分", "是否布置作业", "是否提交作业", "是否回复作业", "教务老师", "教务评价"};
+            String[] header = {"分部", "上课日期", "学生编号", "课程编号", "学员是否到课", "课程班名称", "老师", "教材内容", "发音", "节奏", "乐理", "曲目", "评价备注", "回访日期(布置训练)", "完成app双向沟通", "学员评分", "是否布置训练", "是否提交训练", "是否回复训练", "教务老师", "教务评价"};
             String[] body = {"organName", "classDateStr", "studentId", "id", "attendanceStr", "courseName", "teacherName", "teachingMaterial", "pronunciationStr", "tempoStr", "musicTheoryStr", "song", "memo", "createTimeStr", "hasLiaison", "studentReview", "assignHomeworkStr", "handHomeworkStr", "homeWorkReplied", "eduTeacherName", "courseReview"};
             HSSFWorkbook workbook = POIUtil.exportExcel(header, body, practiceGroupReviews.getRows());
             response.setContentType("application/octet-stream");
@@ -1745,7 +1747,7 @@ public class ExportController extends BaseController {
         OutputStream ouputStream = null;
         try {
             HSSFWorkbook workbook = POIUtil.exportExcel(
-                    new String[]{"布置时间", "截至时间", "训练标题", "老师名字", "分部", "学生姓名", "学生编号", "提交作业", "提交作业时间", "是否评价", "是否有vip", "及时评价"},
+                    new String[]{"布置时间", "截至时间", "训练标题", "老师名字", "分部", "学生姓名", "学生编号", "提交训练", "提交训练时间", "是否评价", "是否有vip", "及时评价"},
                     new String[]{"createTime", "expireDate", "title", "teacherName", "organName", "user.username", "userId", "statusStr", "submitTime", "isRepliedStr", "existVipCourseStr", "isRepliedTimelyStr"}, rows);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls");
@@ -1797,7 +1799,7 @@ public class ExportController extends BaseController {
         OutputStream ouputStream = null;
         try {
             HSSFWorkbook workbook = POIUtil.exportExcel(
-                    new String[]{"学员编号", "学员姓名", "所属分部", "乐团名称", "指导老师", "教务老师", "服务课程", "预期安排", "实际安排", "提交次数", "评价次数", "及时评价次数", "付费网管课", "VIP课", "作业提交时间"},
+                    new String[]{"学员编号", "学员姓名", "所属分部", "乐团名称", "指导老师", "教务老师", "服务课程", "预期安排", "实际安排", "提交次数", "评价次数", "及时评价次数", "付费网管课", "VIP课", "训练提交时间"},
                     new String[]{"studentId", "studentName", "organName", "groupNames", "teacherName", "educationalTeacherName", "serveType == 'EXERCISE' ? '课外训练':courseIds", "expectExercisesNum", "actualExercisesNum", "exercisesReplyNum",
                             "exercisesMessageNum", "exercisesMessageTimelyNum", "existPracticeCourse", "existVipCourse", "lastSubmitTime"}, rows);
             response.setContentType("application/octet-stream");
@@ -2042,7 +2044,7 @@ public class ExportController extends BaseController {
                 }
             }
 
-            String[] header = {"分部", "上课日期", "课程编号", "课程班名称", "老师", "教材内容", "发音", "节奏", "乐理", "曲目", "评价备注", "回访日期(布置作业)", "是否布置作业", "是否提交作业", "教务老师", "教务评价"};
+            String[] header = {"分部", "上课日期", "课程编号", "课程班名称", "老师", "教材内容", "发音", "节奏", "乐理", "曲目", "评价备注", "回访日期(布置训练)", "是否布置训练", "是否提交训练", "教务老师", "教务评价"};
             String[] body = {"organName", "classDateStr", "id", "courseName", "teacherName", "teachingMaterial", "pronunciationStr", "tempoStr", "musicTheoryStr", "song", "memo", "createTimeStr", "assignHomeworkStr", "handHomeworkStr", "eduTeacherName", "courseReview"};
             HSSFWorkbook workbook = POIUtil.exportExcel(header, body, practiceGroupReviews.getRows());
             response.setContentType("application/octet-stream");
@@ -2810,8 +2812,8 @@ public class ExportController extends BaseController {
         }
 
         try {
-            String[] header = {"分部", "老师编号", "老师姓名", "服务周期", "课后作业(节)", "课外作业(人)",
-                    "作业布置", "作业点评", "作业提交率",
+            String[] header = {"分部", "老师编号", "老师姓名", "服务周期", "课后训练(节)", "课外训练(人)",
+                    "训练布置", "训练点评", "训练提交率",
                     "提醒时间", "操作人"};
             String[] body = {"organName", "teacherId", "teacherName", "dateRange", "homeworkNum", "exerciseNum",
                     "expectExercisesNum>actualExercisesNum?'异常':'正常'", "exercisesReplyNum>exercisesMessageNum?'异常':'正常'", "submitRate",
@@ -3104,4 +3106,198 @@ public class ExportController extends BaseController {
             }
         }
     }
+
+    @ApiOperation(value = "分部下教师关联的会员数据导出")
+    @RequestMapping("export/organTeacherMemberStudentData")
+    @PreAuthorize("@pcs.hasPermissions('export/organTeacherMemberStudentData')")
+    public void exportEmployeeInfo(TeacherServeQueryInfo queryInfo,HttpServletResponse response) throws IOException {
+        queryInfo.setPage(1);
+        queryInfo.setRows(49999);
+        List<TeacherStudentDataDto> rows = teacherService.queryMemberStudentData(queryInfo).getRows();
+        if (CollectionUtils.isEmpty(rows)) {
+            response.setStatus(200);
+            response.setContentType("Content-Type: application/json;charset=UTF-8");
+            response.getOutputStream().write("{\"data\": null, \"code\": 500, \"status\": false, \"msg\": \"没有可导出的记录\"}".getBytes());
+            response.flushBuffer();
+            return;
+        }
+        OutputStream outputStream = response.getOutputStream();
+        try {
+            String[] header = {"老师编号", "老师姓名", "学员总数", "使用人数", "使用人数比", "付费学员数量", "会员占比"};
+            String[] body = {"teacherId", "teacherName", "totalStudentNum", "cloudStudyUseStudentNum", "cloudStudyUseStudentDuty+\"%\"",
+                    "vipStudentNum", "vipStudentDuty+\"%\""};
+            HSSFWorkbook workbook = POIUtil.exportExcel(header, body, rows);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=employeeInfo-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    @ApiOperation(value = "分部云教练学员数据预览导出")
+    @RequestMapping("export/organStudentOverView")
+    @PreAuthorize("@pcs.hasPermissions('export/organStudentOverView')")
+    public void organStudentOverView(OrganCloudStudyStudentDataQueryInfo queryInfo,HttpServletResponse response) throws IOException {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("用户信息获取失败");
+        }
+        Employee employee = employeeDao.get(sysUser.getId());
+        queryInfo.setPage(1);
+        queryInfo.setRows(49999);
+
+        List<Integer> organIds = new ArrayList<>();
+        if(StringUtils.isNotBlank(queryInfo.getOrganIds())){
+            organIds = Arrays.stream(queryInfo.getOrganIds().split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toList());
+        }else if(StringUtils.isNotBlank(employee.getOrganIdList())){
+            organIds = Arrays.stream(employee.getOrganIdList().split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toList());
+        }
+        List<Integer> ids = organIds.stream().filter(id -> !OrganizationService.EXCLUDE_ORGAN_IDS.contains(id)).collect(Collectors.toList());
+
+        List<EduOrganStudentDataDto> rows = studentService.queryOrganStudentOverView(ids, queryInfo).getRows();
+        if (CollectionUtils.isEmpty(rows)) {
+            response.setStatus(200);
+            response.setContentType("Content-Type: application/json;charset=UTF-8");
+            response.getOutputStream().write("{\"data\": null, \"code\": 500, \"status\": false, \"msg\": \"没有可导出的记录\"}".getBytes());
+            response.flushBuffer();
+            return;
+        }
+        OutputStream outputStream = response.getOutputStream();
+        try {
+            String[] header = {"分部", "学员总数", "活跃人数", "使用人数", "新增使用人数", "使用比例", "付费会员数", "付费会员占比"};
+            String[] body = {"organName", "totalStudentNum", "cloudStudyLivelyStudentNum", "cloudStudyUseStudentNum", "newCloudStudyStudentNum",
+                    "cloudStudyUseStudentDuty+\"%\"", "vipStudentNum", "vipStudentDuty+\"%\""};
+            HSSFWorkbook workbook = POIUtil.exportExcel(header, body, rows);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=employeeInfo-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    @ApiOperation(value = "分部云教练学员数据预览导出")
+    @RequestMapping("export/cloudStudyStudentOverView")
+    @PreAuthorize("@pcs.hasPermissions('export/cloudStudyStudentOverView')")
+    public void cloudStudyStudentOverView(OrganCloudStudyStudentDataQueryInfo queryInfo,HttpServletResponse response) throws IOException {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("用户信息获取失败");
+        }
+        Employee employee = employeeDao.get(sysUser.getId());
+        queryInfo.setPage(1);
+        queryInfo.setRows(49999);
+
+        List<Integer> organIds = new ArrayList<>();
+        if(StringUtils.isNotBlank(queryInfo.getOrganIds())){
+            organIds = Arrays.stream(queryInfo.getOrganIds().split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toList());
+        }else if(StringUtils.isNotBlank(employee.getOrganIdList())){
+            organIds = Arrays.stream(employee.getOrganIdList().split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toList());
+        }
+        List<Integer> ids = organIds.stream().filter(id -> !OrganizationService.EXCLUDE_ORGAN_IDS.contains(id)).collect(Collectors.toList());
+
+        List<EduOrganStudentDataDto> rows = indexService.organStudentOverView(ids, queryInfo).getRows();
+        if (CollectionUtils.isEmpty(rows)) {
+            response.setStatus(200);
+            response.setContentType("Content-Type: application/json;charset=UTF-8");
+            response.getOutputStream().write("{\"data\": null, \"code\": 500, \"status\": false, \"msg\": \"没有可导出的记录\"}".getBytes());
+            response.flushBuffer();
+            return;
+        }
+        OutputStream outputStream = response.getOutputStream();
+        try {
+            String[] header = {"排名", "分部", "学员总数", "活跃人数", "活跃人数比", "当日使用人数", "当日新增使用人数", "使用人数占比", "付费会员数量","付费会员占比", "新增付费会员"};
+            String[] body = {"index", "organName", "totalStudentNum", "cloudStudyLivelyStudentNum", "cloudStudyLivelyStudentDuty+\"%\"",
+                    "cloudStudyUseStudentNum", "newCloudStudyStudentNum", "cloudStudyUseStudentDuty+\"%\"", "vipStudentNum", "vipStudentDuty+\"%\"", "newCloudStudyStudentNum"};
+            HSSFWorkbook workbook = POIUtil.exportExcel(header, body, rows);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=employeeInfo-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    @ApiOperation(value = "分部云教练学员训练数据导出")
+    @RequestMapping("export/cloudStudyStudentTrainData")
+    @PreAuthorize("@pcs.hasPermissions('export/cloudStudyStudentTrainData')")
+    public void cloudStudyStudentTrainData(StudentQueryInfo queryInfo,HttpServletResponse response) throws IOException {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("用户信息获取失败");
+        }
+        queryInfo.setPage(1);
+        queryInfo.setRows(49999);
+
+        List<EduOrganStudentListDto> rows = ((PageInfo<EduOrganStudentListDto>)studentService.organStudentData(queryInfo).getDetail()).getRows();
+        if (CollectionUtils.isEmpty(rows)) {
+            response.setStatus(200);
+            response.setContentType("Content-Type: application/json;charset=UTF-8");
+            response.getOutputStream().write("{\"data\": null, \"code\": 500, \"status\": false, \"msg\": \"没有可导出的记录\"}".getBytes());
+            response.flushBuffer();
+            return;
+        }
+        for (EduOrganStudentListDto row : rows) {
+            row.setCloudStudyUseTime(Math.round(row.getCloudStudyUseTime()));
+            row.setCloudStudyUseAvgTime(Math.round(row.getCloudStudyUseAvgTime()));
+        }
+        OutputStream outputStream = response.getOutputStream();
+        try {
+            String[] header = {"学员编号", "学员", "训练总时长", "连续训练天数", "乐团", "指导老师", "声部", "是否有小课", "训练次数", "训练天数", "训练平均时长", "会员有效期"};
+            String[] body = {"studentId", "studentName", "cloudStudyUseTime+\"分钟\"", "cloudStudyRunningDays+\"天\"", "musicGroupNames",
+                            "teacherName", "subjectName", "hasVipGroup>0?\"是\":\"否\"", "cloudStudyUseNum+\"次\"", "cloudStudyUseDays+\"天\"",
+                            "cloudStudyUseAvgTime+\"分钟\"", "membershipEndTime"};
+            HSSFWorkbook workbook = POIUtil.exportExcel(header, body, rows);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=employeeInfo-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
 }

+ 1 - 1
mec-web/src/main/java/com/ym/mec/web/controller/ExtracurricularExercisesController.java

@@ -60,7 +60,7 @@ public class ExtracurricularExercisesController extends BaseController {
     @GetMapping("/findStudentExtraExerciseDetail")
     private HttpResponseResult findStudentExtraExerciseDetail(Long studentExerciseId){
         if(Objects.isNull(studentExerciseId)){
-            return failed("请选择课外训练作业");
+            return failed("请选择课外训练");
         }
         return succeed(extracurricularExercisesReplyService.findStudentExtraExerciseDetail(studentExerciseId));
     }

+ 17 - 0
mec-web/src/main/java/com/ym/mec/web/controller/IndexController.java

@@ -3,13 +3,17 @@ package com.ym.mec.web.controller;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
+import com.ym.mec.biz.dal.dto.EduOrganStudentDataDto;
 import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.biz.dal.enums.IndexErrorType;
 import com.ym.mec.biz.dal.page.IndexDataQueryInfo;
+import com.ym.mec.biz.dal.page.OrganCloudStudyStudentDataQueryInfo;
 import com.ym.mec.biz.service.EmployeeService;
 import com.ym.mec.biz.service.IndexBaseMonthDataService;
+import com.ym.mec.biz.service.OrganizationService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
@@ -23,6 +27,7 @@ import org.springframework.web.bind.annotation.RestController;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 @Api(tags = "首页")
 @RequestMapping()
@@ -212,4 +217,16 @@ public class IndexController extends BaseController {
 			}
 		return succeed(indexService.getRemindMatterData(organId));
 	}
+
+	@ApiOperation("查询分部云教练学员汇总数据")
+	@GetMapping("/organStudentOverView")
+	public HttpResponseResult<PageInfo<EduOrganStudentDataDto>> organStudentOverView(OrganCloudStudyStudentDataQueryInfo queryInfo){
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("用户信息获取失败");
+		}
+		Employee employee = employeeService.get(sysUser.getId());
+		List<Integer> organIds = Arrays.stream(employee.getOrganIdList().split(",")).map(id -> Integer.valueOf(id)).filter(id -> !OrganizationService.EXCLUDE_ORGAN_IDS.contains(id)).collect(Collectors.toList());
+		return succeed(indexService.organStudentOverView(organIds, queryInfo));
+	}
 }

+ 1 - 1
mec-web/src/main/java/com/ym/mec/web/controller/InspectionItemPlanConclusionController.java

@@ -76,7 +76,7 @@ public class InspectionItemPlanConclusionController extends BaseController {
             String[] header2 = {"处理方式", planInfo.getMemo(), "", "", "", "", "", "", "", "", "", "", "", "", "", ""};
             String[] header3 = {"", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""};
             String[] header4 = {"巡查项目", "课前管理", "", "", "", "", "课中管理", "", "", "", "", "", "", "课后管理", "", ""};
-            String[] header5 = {"", "老师是否提前准备板书(本课内容、作业)", "老师是否佩戴工牌", "老师是否仪容仪表整洁", "老师是否携带乐器", "老师是否携带教学资料、设备", "老师是否合理安排学员座位", "乐器箱包、书包是否摆放整齐", "课堂纪律是否保持良好", "老师是否全程站立教学", "老师是否全程使用节拍器或教学音频", "未发现私换乐器", "老师是否将上课照片/视频发送到声部群", "老师是否保持教室环境卫生", "老师是否关好所有电源、门窗", "老师是否有序组织学员放学"};
+            String[] header5 = {"", "老师是否提前准备板书(本课内容、训练)", "老师是否佩戴工牌", "老师是否仪容仪表整洁", "老师是否携带乐器", "老师是否携带教学资料、设备", "老师是否合理安排学员座位", "乐器箱包、书包是否摆放整齐", "课堂纪律是否保持良好", "老师是否全程站立教学", "老师是否全程使用节拍器或教学音频", "未发现私换乐器", "老师是否将上课照片/视频发送到声部群", "老师是否保持教室环境卫生", "老师是否关好所有电源、门窗", "老师是否有序组织学员放学"};
 
             List<String[]> headers = new LinkedList<>();
             headers.add(header);

+ 9 - 5
mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java

@@ -12,6 +12,7 @@ import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
 import io.swagger.annotations.*;
 import org.apache.commons.lang3.StringUtils;
@@ -448,17 +449,20 @@ public class StudentManageController extends BaseController {
     @ApiOperation(value = "分部云教练学员数据预览")
     @GetMapping("/organStudentOverView")
     @PreAuthorize("@pcs.hasPermissions('studentManage/organStudentOverView')")
-    public HttpResponseResult<List<EduOrganStudentDataDto>> organStudentOverView() throws Exception {
+    public HttpResponseResult<PageInfo<EduOrganStudentDataDto>> organStudentOverView(OrganCloudStudyStudentDataQueryInfo queryInfo) throws Exception {
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null) {
             return failed("用户信息获取失败");
         }
         List<Organization> organizations = organizationService.queryEmployeeOrgan(sysUser.getId());
-        if(CollectionUtils.isEmpty(organizations)){
-            return succeed(Collections.emptyList());
+        List<Integer> organIds = new ArrayList<>();
+        if(StringUtils.isNotBlank(queryInfo.getOrganIds())){
+            organIds = Arrays.stream(queryInfo.getOrganIds().split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toList());
+        }else if(!CollectionUtils.isEmpty(organizations)){
+            organIds = organizations.stream().map(Organization::getId).collect(Collectors.toList());
         }
-        List<Integer> organIds = organizations.stream().map(Organization::getId).collect(Collectors.toList());
-        return succeed(studentService.organStudentOverView(organIds));
+        List<Integer> ids = organIds.stream().filter(id -> !OrganizationService.EXCLUDE_ORGAN_IDS.contains(id)).collect(Collectors.toList());
+        return succeed(studentService.queryOrganStudentOverView(ids, queryInfo));
     }
 
     @ApiOperation(value = "云教练学员数据")

+ 9 - 0
mec-web/src/main/java/com/ym/mec/web/controller/TeacherController.java

@@ -3,6 +3,7 @@ package com.ym.mec.web.controller;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.EmployeeDao;
+import com.ym.mec.biz.dal.dto.TeacherStudentDataDto;
 import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.biz.dal.entity.Teacher;
 import com.ym.mec.biz.dal.page.*;
@@ -10,6 +11,7 @@ import com.ym.mec.biz.service.ClassGroupService;
 import com.ym.mec.biz.service.TeacherService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
 import com.yonge.log.model.AuditLogAnnotation;
 import io.swagger.annotations.*;
@@ -234,4 +236,11 @@ public class TeacherController extends BaseController {
     public Object queryStudent(QueryInfo queryInfo){
         return succeed(teacherService.queryStudent(queryInfo));
     }
+
+    @ApiOperation(value = "查询分部下教师关联的会员数据")
+    @GetMapping("/queryMemberStudentData")
+    @PreAuthorize("@pcs.hasPermissions('teacher/queryMemberStudentData')")
+    public HttpResponseResult<PageInfo<TeacherStudentDataDto>> queryMemberStudentData(TeacherServeQueryInfo queryInfo){
+        return succeed(teacherService.queryMemberStudentData(queryInfo));
+    }
 }