Przeglądaj źródła

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

zouxuan 3 lat temu
rodzic
commit
448309ed3f
62 zmienionych plików z 2291 dodań i 254 usunięć
  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. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CloudTeacherOrderDao.java
  4. 17 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/IndexBaseMonthDataDao.java
  5. 25 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  6. 16 5
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMusicCompareRecordDao.java
  7. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TeacherDao.java
  8. 97 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CountStudentTrainDataDto.java
  9. 32 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EduOrganStudentDataDto.java
  10. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EduOrganStudentListDto.java
  11. 79 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupStudentsDto.java
  12. 32 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SoundCheckInfoDto.java
  13. 51 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentManageListDto.java
  14. 98 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/TeacherStudentDataDto.java
  15. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MemberRankSetting.java
  16. 20 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicMemberDto.java
  17. 30 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Student.java
  18. 3 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/IndexDataType.java
  19. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java
  20. 34 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/WebsocketTypeEnum.java
  21. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/MusicGroupStudentQueryInfo.java
  22. 137 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/OrganCloudStudyStudentDataQueryInfo.java
  23. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentManageQueryInfo.java
  24. 21 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysMusicCompareRecordQueryInfo.java
  25. 10 12
      mec-biz/src/main/java/com/ym/mec/biz/handler/WebSocketHandler.java
  26. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/CloudTeacherOrderService.java
  27. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/IndexBaseMonthDataService.java
  28. 4 3
      mec-biz/src/main/java/com/ym/mec/biz/service/OrganizationService.java
  29. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java
  30. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
  31. 8 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicCompareRecordService.java
  32. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TeacherService.java
  33. 13 12
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/CloudTeacherOrderServiceImpl.java
  34. 158 38
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java
  35. 7 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSchoolTermCourseDetailServiceImpl.java
  36. 24 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  37. 77 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SoundCheckHandler.java
  38. 4 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SoundCompareHandler.java
  39. 39 26
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java
  40. 20 20
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentRegistrationServiceImpl.java
  41. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServeServiceImpl.java
  42. 222 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  43. 17 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java
  44. 64 14
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TeacherServiceImpl.java
  45. 1 1
      mec-biz/src/main/resources/config/mybatis/ClassGroupMapper.xml
  46. 20 0
      mec-biz/src/main/resources/config/mybatis/CloudTeacherMapper.xml
  47. 6 3
      mec-biz/src/main/resources/config/mybatis/CloudTeacherOrderMapper.xml
  48. 168 17
      mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml
  49. 6 2
      mec-biz/src/main/resources/config/mybatis/MemberRankSettingMapper.xml
  50. 27 28
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  51. 2 2
      mec-biz/src/main/resources/config/mybatis/MusicGroupPaymentCalenderDetailMapper.xml
  52. 71 2
      mec-biz/src/main/resources/config/mybatis/StudentManageDao.xml
  53. 116 4
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  54. 11 12
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  55. 64 5
      mec-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml
  56. 28 0
      mec-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  57. 20 8
      mec-student/src/main/java/com/ym/mec/student/controller/StudentManageController.java
  58. 24 1
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/CloudStudyController.java
  59. 212 10
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  60. 27 10
      mec-web/src/main/java/com/ym/mec/web/controller/IndexController.java
  61. 17 5
      mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java
  62. 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);
+
 }

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CloudTeacherOrderDao.java

@@ -49,5 +49,5 @@ public interface CloudTeacherOrderDao extends BaseDAO<Long, CloudTeacherOrder> {
      */
     CloudTeacherOrderDto queryOrderInfoByOrderId(Long orderId);
 
-    List<Map<Long, String>> queryNoStartByUserIds(@Param("userIds") Set<Integer> userIds);
+    List<Map<Long, String>> queryNoStartByUserIds(@Param("userIds") Set<Integer> userIds, @Param("isMusicMember") Boolean isMusicMember);
 }

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

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

@@ -239,10 +239,24 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
      * 清空学员会员
      */
     void cleanStudentMember();
+    /**
+     * 清空学员会员
+     */
+    void cleanExperienceStudentMember();
 
     void cleanMember(Integer userId);
 
     /**
+     * 修改学员会员试用
+     * @param studentIds
+     * @param rankId
+     * @param endTime
+     */
+    int updateMemberExperience(@Param("studentIds") String studentIds,
+                                @Param("rankId") Integer rankId,
+                                @Param("endTime") Date endTime);
+
+    /**
      * @describe 统计分部会员学员数据
      * @author Joburgess
      * @date 2021/8/16 0016
@@ -253,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
@@ -264,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
@@ -326,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);
 }

+ 16 - 5
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMusicCompareRecordDao.java

@@ -1,15 +1,13 @@
 package com.ym.mec.biz.dal.dao;
 
-import com.ym.mec.biz.dal.dto.EduOrganStudentListDto;
-import com.ym.mec.biz.dal.dto.MusicCompareRankingDto;
-import com.ym.mec.biz.dal.dto.StudentTrainChartDto;
-import com.ym.mec.biz.dal.dto.StudentTrainOverviewDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 public interface SysMusicCompareRecordDao extends BaseDAO<Long, SysMusicCompareRecord> {
 
@@ -52,6 +50,20 @@ public interface SysMusicCompareRecordDao extends BaseDAO<Long, SysMusicCompareR
     List<EduOrganStudentListDto> queryStudentTrainData(@Param("studentIds") List<Integer> studentIds);
 
     /**
+     * 老师端首页学员训练统计
+     * @param params
+     * @return
+     */
+    int countStudentTrain(Map<String, Object> params);
+
+    /**
+     * 老师端首页学员训练统计
+     * @param params
+     * @return
+     */
+    List<CountStudentTrainDataDto> queryStudentTrain(Map<String, Object> params);
+
+    /**
      * @describe 统计分部云教练新增人数
      * @author Joburgess
      * @date 2021/8/18 0018
@@ -61,5 +73,4 @@ public interface SysMusicCompareRecordDao extends BaseDAO<Long, SysMusicCompareR
     int getOrganNewCloudStudyNum(@Param("organId") Integer organId);
     int getOrgansTotalNewCloudStudyNum(@Param("organIds") List<Integer> organIds);
     List<Map<Integer, Integer>> getOrgansNewCloudStudyNum(@Param("organIds") List<Integer> organIds);
-	
 }

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

+ 97 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CountStudentTrainDataDto.java

@@ -0,0 +1,97 @@
+package com.ym.mec.biz.dal.dto;
+
+public class CountStudentTrainDataDto {
+    private Integer userId;
+
+    private String avatar;
+
+    private String phone;
+
+    private String username;
+
+    //训练总时长
+    private Integer totalPlayTime;
+
+    //训练天数
+    private Integer trainDay;
+
+    //训练次数
+    private Integer trainNum;
+
+    //评测次数
+    private Integer recordNum;
+
+    private String musicGroupName;
+
+    public String getMusicGroupName() {
+        return musicGroupName;
+    }
+
+    public void setMusicGroupName(String musicGroupName) {
+        this.musicGroupName = musicGroupName;
+    }
+
+    public Integer getRecordNum() {
+        return recordNum;
+    }
+
+    public void setRecordNum(Integer recordNum) {
+        this.recordNum = recordNum;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getAvatar() {
+        return avatar;
+    }
+
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public Integer getTotalPlayTime() {
+        return totalPlayTime;
+    }
+
+    public void setTotalPlayTime(Integer totalPlayTime) {
+        this.totalPlayTime = totalPlayTime;
+    }
+
+    public Integer getTrainDay() {
+        return trainDay;
+    }
+
+    public void setTrainDay(Integer trainDay) {
+        this.trainDay = trainDay;
+    }
+
+    public Integer getTrainNum() {
+        return trainNum;
+    }
+
+    public void setTrainNum(Integer trainNum) {
+        this.trainNum = trainNum;
+    }
+}

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

+ 79 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupStudentsDto.java

@@ -121,6 +121,85 @@ public class MusicGroupStudentsDto{
     @ApiModelProperty(value = "会员截止时间",required = false)
     private Date membershipEndTime;
 
+    @ApiModelProperty(value = "乐团会员时间,下次续费时间",required = false)
+    private Date musicMembershipEndTime;
+
+    @ApiModelProperty(value = "试用会员截止时间",required = false)
+    private Date experienceMembershipEndTime;
+
+    private Integer experienceMembershipDay;
+    private Integer membershipDay;
+    private Integer musicMembershipDay;
+    private Integer musicMembershipDay1;
+    //是否有未生效的云教练订单
+    private Boolean hasNoStartCloudTeacher = false;
+
+    private Integer memberRankSettingId;
+
+    public Integer getMusicMembershipDay1() {
+        return musicMembershipDay1;
+    }
+
+    public void setMusicMembershipDay1(Integer musicMembershipDay1) {
+        this.musicMembershipDay1 = musicMembershipDay1;
+    }
+
+    public Integer getMemberRankSettingId() {
+        return memberRankSettingId;
+    }
+
+    public void setMemberRankSettingId(Integer memberRankSettingId) {
+        this.memberRankSettingId = memberRankSettingId;
+    }
+
+    public Boolean getHasNoStartCloudTeacher() {
+        return hasNoStartCloudTeacher;
+    }
+
+    public void setHasNoStartCloudTeacher(Boolean hasNoStartCloudTeacher) {
+        this.hasNoStartCloudTeacher = hasNoStartCloudTeacher;
+    }
+
+    public Integer getExperienceMembershipDay() {
+        return experienceMembershipDay;
+    }
+
+    public void setExperienceMembershipDay(Integer experienceMembershipDay) {
+        this.experienceMembershipDay = experienceMembershipDay;
+    }
+
+    public Integer getMembershipDay() {
+        return membershipDay;
+    }
+
+    public void setMembershipDay(Integer membershipDay) {
+        this.membershipDay = membershipDay;
+    }
+
+    public Integer getMusicMembershipDay() {
+        return musicMembershipDay;
+    }
+
+    public void setMusicMembershipDay(Integer musicMembershipDay) {
+        this.musicMembershipDay = musicMembershipDay;
+    }
+
+    public Date getMusicMembershipEndTime() {
+        return musicMembershipEndTime;
+    }
+
+    public void setMusicMembershipEndTime(Date musicMembershipEndTime) {
+        this.musicMembershipEndTime = musicMembershipEndTime;
+    }
+
+    public Date getExperienceMembershipEndTime() {
+        return experienceMembershipEndTime;
+    }
+
+    public void setExperienceMembershipEndTime(Date experienceMembershipEndTime) {
+        this.experienceMembershipEndTime = experienceMembershipEndTime;
+    }
+
     public Date getMembershipEndTime() {
         return membershipEndTime;
     }

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

+ 51 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentManageListDto.java

@@ -108,6 +108,57 @@ public class StudentManageListDto {
 
     private String activityCourseDetail;
 
+    private Integer membershipDay;
+
+    private Integer experienceMembershipDay;
+
+    private Date experienceMembershipEndTime;
+
+    //是否有未生效的云教练订单
+    private Boolean hasNoStartCloudTeacher = false;
+
+    private Integer recordUserId;
+
+    public Integer getRecordUserId() {
+        return recordUserId;
+    }
+
+    public void setRecordUserId(Integer recordUserId) {
+        this.recordUserId = recordUserId;
+    }
+
+    public Boolean getHasNoStartCloudTeacher() {
+        return hasNoStartCloudTeacher;
+    }
+
+    public void setHasNoStartCloudTeacher(Boolean hasNoStartCloudTeacher) {
+        this.hasNoStartCloudTeacher = hasNoStartCloudTeacher;
+    }
+
+    public Integer getMembershipDay() {
+        return membershipDay;
+    }
+
+    public void setMembershipDay(Integer membershipDay) {
+        this.membershipDay = membershipDay;
+    }
+
+    public Integer getExperienceMembershipDay() {
+        return experienceMembershipDay;
+    }
+
+    public void setExperienceMembershipDay(Integer experienceMembershipDay) {
+        this.experienceMembershipDay = experienceMembershipDay;
+    }
+
+    public Date getExperienceMembershipEndTime() {
+        return experienceMembershipEndTime;
+    }
+
+    public void setExperienceMembershipEndTime(Date experienceMembershipEndTime) {
+        this.experienceMembershipEndTime = experienceMembershipEndTime;
+    }
+
     public Integer getMemberRankSettingId() {
         return memberRankSettingId;
     }

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

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MemberRankSetting.java

@@ -26,6 +26,9 @@ public class MemberRankSetting {
 	
 	/**  */
 	private String icon;
+
+	/** 试用会员图片 */
+	private String experienceIcon;
 	
 	private Boolean isDefault;
 
@@ -44,6 +47,14 @@ public class MemberRankSetting {
 	
 	private MemberFeeSetting memberFeeSetting;
 
+	public String getExperienceIcon() {
+		return experienceIcon;
+	}
+
+	public void setExperienceIcon(String experienceIcon) {
+		this.experienceIcon = experienceIcon;
+	}
+
 	public Integer getOperator() {
 		return operator;
 	}

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/MusicMemberDto.java

@@ -23,8 +23,28 @@ public class MusicMemberDto {
 
 	private Date visitTime;
 
+	private Date membershipEndTime;
+
 	private Integer courseViewType;
 
+	private Boolean hasNoStartCloudTeacher;
+
+	public Boolean getHasNoStartCloudTeacher() {
+		return hasNoStartCloudTeacher;
+	}
+
+	public void setHasNoStartCloudTeacher(Boolean hasNoStartCloudTeacher) {
+		this.hasNoStartCloudTeacher = hasNoStartCloudTeacher;
+	}
+
+	public Date getMembershipEndTime() {
+		return membershipEndTime;
+	}
+
+	public void setMembershipEndTime(Date membershipEndTime) {
+		this.membershipEndTime = membershipEndTime;
+	}
+
 	public Integer getCourseViewType() {
 		return courseViewType;
 	}

+ 30 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Student.java

@@ -64,6 +64,12 @@ public class Student extends SysUser {
 	private Date membershipStartTime;
 	
 	private Date membershipEndTime;
+
+	private Integer experienceMemberRankSettingId;
+
+	private Date experienceMembershipStartTime;
+
+	private Date experienceMembershipEndTime;
 	
 	private String memberRankImg;
 
@@ -75,6 +81,30 @@ public class Student extends SysUser {
 		this.subjectIdList = subjectIdList;
 	}
 
+	public Integer getExperienceMemberRankSettingId() {
+		return experienceMemberRankSettingId;
+	}
+
+	public void setExperienceMemberRankSettingId(Integer experienceMemberRankSettingId) {
+		this.experienceMemberRankSettingId = experienceMemberRankSettingId;
+	}
+
+	public Date getExperienceMembershipStartTime() {
+		return experienceMembershipStartTime;
+	}
+
+	public void setExperienceMembershipStartTime(Date experienceMembershipStartTime) {
+		this.experienceMembershipStartTime = experienceMembershipStartTime;
+	}
+
+	public Date getExperienceMembershipEndTime() {
+		return experienceMembershipEndTime;
+	}
+
+	public void setExperienceMembershipEndTime(Date experienceMembershipEndTime) {
+		this.experienceMembershipEndTime = experienceMembershipEndTime;
+	}
+
 	public String getActivityCourseDetail() {
 		return activityCourseDetail;
 	}

+ 3 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/IndexDataType.java

@@ -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),

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

@@ -6,6 +6,7 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     SMS_APPLY_MESSAGE("SMS_APPLY_MESSAGE", "报名通知"),
     SYSTEM_REMIND_EDUCATION_COURSE_TIME("SYSTEM_REMIND_EDUCATION_COURSE_TIME", "排课提醒"),
     STUDENT_MEMBER_RENEW_MESSAGE("STUDENT_MEMBER_RENEW_MESSAGE", "会员续费提醒"),
+    PUSH_EXPERIENCE_MEMBERSHIP_MESSAGE("PUSH_EXPERIENCE_MEMBERSHIP_MESSAGE", "会员试用提醒"),
     SMS_AUTO_STUDENT_MEMBER_RENEW_MESSAGE("SMS_AUTO_STUDENT_MEMBER_RENEW_MESSAGE", "会员续费提醒"),
     PUSH_AUTO_STUDENT_MEMBER_RENEW_MESSAGE("PUSH_AUTO_STUDENT_MEMBER_RENEW_MESSAGE", "会员续费提醒"),
     STUDENT_MEMBER_RENEW_QUIT_MESSAGE("STUDENT_MEMBER_RENEW_QUIT_MESSAGE", "会员续费提醒"),

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

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/MusicGroupStudentQueryInfo.java

@@ -48,6 +48,17 @@ public class MusicGroupStudentQueryInfo extends QueryInfo {
   private String createYear;
 
   private boolean isExport = false;
+  //是否有会员
+  @ApiModelProperty(value = "0否1是2未生效")
+  private Integer hasMember;
+
+  public Integer getHasMember() {
+    return hasMember;
+  }
+
+  public void setHasMember(Integer hasMember) {
+    this.hasMember = hasMember;
+  }
 
   public Boolean getOweFlag() {
     return oweFlag;

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

+ 22 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentManageQueryInfo.java

@@ -49,6 +49,28 @@ public class StudentManageQueryInfo extends QueryInfo {
     //是否有会员
     private Integer hasMember;
 
+    //是否有指导老师
+    private Integer hasTeacher;
+
+    //是否使用过云教练
+    private Integer isRecord;
+
+    public Integer getIsRecord() {
+        return isRecord;
+    }
+
+    public void setIsRecord(Integer isRecord) {
+        this.isRecord = isRecord;
+    }
+
+    public Integer getHasTeacher() {
+        return hasTeacher;
+    }
+
+    public void setHasTeacher(Integer hasTeacher) {
+        this.hasTeacher = hasTeacher;
+    }
+
     public Integer getHasMember() {
         return hasMember;
     }

+ 21 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysMusicCompareRecordQueryInfo.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.dal.page;
 
+import com.ym.mec.biz.dal.enums.FeatureType;
 import com.ym.mec.common.page.QueryInfo;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.ibatis.annotations.Param;
@@ -12,6 +13,8 @@ public class SysMusicCompareRecordQueryInfo extends QueryInfo {
 
     private Integer userId;
 
+    private Integer teacherId;
+
     private String startTime;
 
     private String endTime;
@@ -21,6 +24,24 @@ public class SysMusicCompareRecordQueryInfo extends QueryInfo {
     @ApiModelProperty("排序字段:TRAINDAYS(训练天数);TRAINTIME(训练时长);TRAINNUM(训练次数)")
     private String sortField = "TRAINDAYS";
 
+    private FeatureType featureType;
+
+    public FeatureType getFeatureType() {
+        return featureType;
+    }
+
+    public void setFeatureType(FeatureType featureType) {
+        this.featureType = featureType;
+    }
+
+    public Integer getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Integer teacherId) {
+        this.teacherId = teacherId;
+    }
+
     public Integer getUserId() {
         return userId;
     }

+ 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

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

@@ -86,5 +86,5 @@ public interface CloudTeacherOrderService extends BaseService<Long, CloudTeacher
      */
     CloudTeacherOrderDto queryOrderInfoByOrderId(Long orderId);
 
-    List<Map<Long, String>> queryNoStartByUserIds(Set<Integer> userIds);
+    List<Map<Long, String>> queryNoStartByUserIds(Set<Integer> userIds,Boolean isMusicMember);
 }

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

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

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.service;
 
 import java.text.ParseException;
+import java.util.Date;
 import java.util.List;
 
 import com.ym.mec.biz.dal.dto.CloudStudyStudentDataDto;
@@ -11,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;
@@ -92,6 +94,13 @@ public interface StudentService extends BaseService<Integer, Student> {
     void cleanMember(Integer userId);
 
     /**
+     * 延长会员试用期
+     * @param studentIds
+     * @param rankId
+     * @param endTime
+     */
+    void updateMemberExperience(String studentIds, Integer rankId, Date endTime);
+    /**
      * @describe 分部各类型学员数据统计
      * @author Joburgess
      * @date 2021/8/16 0016
@@ -102,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);
 
     /**

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

@@ -219,6 +219,9 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
     //会员结束前15天提醒学员续费(默认提前15天)
     String PUSH_MEMBER_RENEW = "push_member_renew";
 
+    //试用会员结束前3天提醒学员续费(默认提前3天)
+    String EXPERIENCE_PUSH_MEMBER_RENEW = "experience_push_member_renew";
+
     //会员结束前15天自动创建乐团续费(默认提前15天)
     String AUTO_CREATE_MEMBER_RENEW = "auto_create_member_renew";
 
@@ -239,6 +242,9 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
     //乐团问卷调查编号
     String MUSIC_GROUP_TOPIC_ID = "music_group_topic_id";
 
+    //云教练试用时间最晚截止时间
+    String EXPERIENCE_MEMBERSHIP_END_TIME = "experience_membership_end_time";
+
     /**
      * @return com.ym.mec.biz.dal.entity.SysConfig
      * @params paramName

+ 8 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicCompareRecordService.java

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dto.CountStudentTrainDataDto;
 import com.ym.mec.biz.dal.dto.MusicCompareRankingDto;
 import com.ym.mec.biz.dal.dto.SoundCompareHelper;
 import com.ym.mec.biz.dal.dto.StatDto;
@@ -58,4 +59,11 @@ public interface SysMusicCompareRecordService extends BaseService<Long, SysMusic
      * @return com.ym.mec.common.page.PageInfo<com.ym.mec.biz.dal.entity.SysMusicCompareRecord>
      */
     PageInfo<SysMusicCompareRecord> queryStudentTrainData(SysMusicCompareRecordQueryInfo queryInfo);
+
+    /**
+     * 老师端首页学员训练统计
+     * @param queryInfo
+     * @return
+     */
+    PageInfo<CountStudentTrainDataDto> countStudentTrain(SysMusicCompareRecordQueryInfo queryInfo);
 }

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

+ 13 - 12
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 {
@@ -244,7 +245,7 @@ public class CloudTeacherOrderServiceImpl extends BaseServiceImpl<Long, CloudTea
 	}
 
     @Override
-    public List<Map<Long, String>> queryNoStartByUserIds(Set<Integer> userIds) {
-        return cloudTeacherOrderDao.queryNoStartByUserIds(userIds);
+    public List<Map<Long, String>> queryNoStartByUserIds(Set<Integer> userIds,Boolean isMusicMember) {
+        return cloudTeacherOrderDao.queryNoStartByUserIds(userIds,isMusicMember);
     }
 }

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

+ 7 - 7
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSchoolTermCourseDetailServiceImpl.java

@@ -210,13 +210,13 @@ public class MusicGroupSchoolTermCourseDetailServiceImpl extends BaseServiceImpl
 			memberName = memberRankSetting.getName();
 		}
 		Date date = new Date();
-		//会员结束前15天提醒学员续
-		/*String pushMemberRenew = sysConfigDao.findConfigValue(SysConfigService.PUSH_MEMBER_RENEW);
-		if(StringUtils.isEmpty(pushMemberRenew)){
-			pushMemberRenew = "15";
-		}
-		List<Integer> studentIds = studentDao.queryPushMemberRenew(pushMemberRenew);
-		if(studentIds.size() > 0){
+		//试用会员结束3天提醒学员缴
+//		String experiencePushMemberRenew = sysConfigDao.findConfigValue(SysConfigService.EXPERIENCE_PUSH_MEMBER_RENEW);
+//		if(StringUtils.isEmpty(experiencePushMemberRenew)){
+//			experiencePushMemberRenew = "3";
+//		}
+//		List<Integer> studentIds = studentDao.queryPushMemberRenew(experiencePushMemberRenew);
+		/*if(studentIds.size() > 0){
 			Map<Integer, String> studentPhoneMap = MapUtil.convertMybatisMap(teacherDao.queryPhoneByIds(StringUtils.join(studentIds,",")));
 			Map<Integer,String> userMap = new HashMap<>(studentIds.size());
 			Map<Integer,String> userMap1 = new HashMap<>(studentIds.size());

+ 24 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -2168,6 +2168,14 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                     amount = amount.add(cloudTeacherAmount);
                     //清除学员云教练
                     studentService.cleanMember(userId);
+                    //如果有试用会员,不清除
+                    Student student = studentDao.get(userId);
+                    if(student.getExperienceMemberRankSettingId() != null){
+                        student.setMemberRankSettingId(student.getExperienceMemberRankSettingId());
+                        student.setMembershipStartTime(student.getExperienceMembershipStartTime());
+                        student.setMembershipEndTime(student.getExperienceMembershipEndTime());
+                        studentDao.update(student);
+                    }
                 }
             }else {
                 //删除乐团会员时长
@@ -2462,6 +2470,14 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
                 amount = amount.add(cloudTeacherAmount);
                 //清除学员云教练
                 studentService.cleanMember(userId);
+                //如果有试用会员,不清除
+                Student student = studentDao.get(userId);
+                if(student.getExperienceMemberRankSettingId() != null){
+                    student.setMemberRankSettingId(student.getExperienceMemberRankSettingId());
+                    student.setMembershipStartTime(student.getExperienceMembershipStartTime());
+                    student.setMembershipEndTime(student.getExperienceMembershipEndTime());
+                    studentDao.update(student);
+                }
             }
         }else {
             //删除乐团会员时长
@@ -3661,7 +3677,15 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             List<CloudTeacherOrder> studentCloudTeacherOrders = cloudTeacherOrderService.getStudentCloudTeacherOrders(collect,musicGroupId);
             Map<Integer, List<CloudTeacherOrder>> studentCloudTeacherMap = studentCloudTeacherOrders.stream().collect(Collectors.groupingBy(CloudTeacherOrder::getStudentId));
             Date date = new Date();
+            Map<Long,String> cloudMap = MapUtil.convertMybatisMap(cloudTeacherOrderService.queryNoStartByUserIds(new HashSet<>(collect),true));
             dataList.forEach(e->{
+                //如果会员已过期、是否有未生效的会员
+                if(e.getMembershipEndTime() == null || date.after(e.getMembershipEndTime())){
+                    String s = cloudMap.get(e.getUserId().longValue());
+                    if(StringUtils.isNotEmpty(s)){
+                        e.setHasNoStartCloudTeacher(true);
+                    }
+                }
                 if (studentCloudTeacherMap.containsKey(e.getUserId())) {
                     List<CloudTeacherOrder> cloudTeacherOrders = studentCloudTeacherMap.get(e.getUserId());
                     if(cloudTeacherOrders != null && cloudTeacherOrders.size() > 0){

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

+ 39 - 26
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentManageServiceImpl.java

@@ -1,7 +1,6 @@
 package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.auth.api.entity.SysUserRole;
@@ -25,7 +24,6 @@ import com.ym.mec.im.ImFeignService;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.web.WebFeignService;
-
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -116,6 +114,11 @@ public class StudentManageServiceImpl implements StudentManageService {
 
         List<StudentManageListDto> dataList = null;
         int count = studentManageDao.countStudentByOrganId(params);
+        if (queryInfo.getIsExport()) {
+            if (count > 50000) {
+                throw new BizException("数据集太大,不能导出.最大数据集不能超过50000");
+            }
+        }
         if (count > 0) {
             pageInfo.setTotal(count);
             params.put("offset", pageInfo.getOffset());
@@ -141,10 +144,34 @@ public class StudentManageServiceImpl implements StudentManageService {
         if(!CollectionUtils.isEmpty(userAllContract)){
             userContractVersionMap = userAllContract.stream().collect(Collectors.groupingBy(SysUserContracts::getUserId, Collectors.mapping(SysUserContracts::getVersion, Collectors.toSet())));
         }
-        Map<Long,String> cloudMap = MapUtil.convertMybatisMap(cloudTeacherOrderService.queryNoStartByUserIds(userIds));
+        Map<Long,String> cloudMap = MapUtil.convertMybatisMap(cloudTeacherOrderService.queryNoStartByUserIds(userIds,null));
         //List<Subject> studentSubject = studentManageDao.getStudentSubject(userIds);
         StudentListCourseDto studentListCourseDto = null;
+        //获取所在乐团
+        Map<Integer, String> musicGroupNames = null;
+        //获取所在vip
+        Map<Integer, String> vipGroupNames = null;
+        //获取所在乐团状态
+        Map<Integer, String> musicGroupStatus = null;
+        //获取所在vip状态
+        Map<Integer, String> vipGroupStatus = null;
+        if (queryInfo.getIsExport()) {
+            //获取所在乐团
+            musicGroupNames = MapUtil.convertMybatisMap(musicGroupDao.queryUserMusicNames(userIds));
+            //获取所在vip
+            vipGroupNames = MapUtil.convertMybatisMap(vipGroupDao.queryUserVipNames(userIds));
+            //获取所在乐团状态
+            musicGroupStatus = MapUtil.convertMybatisMap(musicGroupDao.queryUserMusicStatus(userIds));
+            //获取所在vip状态
+            vipGroupStatus = MapUtil.convertMybatisMap(vipGroupDao.queryUserVipStatus(userIds));
+        }
         for (StudentManageListDto dto : dataList) {
+            if (queryInfo.getIsExport()) {
+                dto.setMusicGroupName(musicGroupNames.get(dto.getUserId()));
+                dto.setVipGroupName(vipGroupNames.get(dto.getUserId()));
+                dto.setMusicGroupStatus(musicGroupStatus.get(dto.getUserId()));
+                dto.setVipGroupStatus(vipGroupStatus.get(dto.getUserId()));
+            }
             studentListCourseDto = StudentListCourseDtoMap.get(dto.getUserId());
             if (studentListCourseDto != null) {
                 if (studentListCourseDto.getRemainCourseNum() > 0) {
@@ -169,7 +196,7 @@ public class StudentManageServiceImpl implements StudentManageService {
             if(dto.getMemberRankSettingId() == null){
                 String s = cloudMap.get(dto.getUserId().longValue());
                 if(StringUtils.isNotEmpty(s)){
-                    dto.setMembershipEndTime(DateUtil.toDateTime(s));
+                    dto.setHasNoStartCloudTeacher(true);
                 }
             }
 
@@ -186,27 +213,6 @@ public class StudentManageServiceImpl implements StudentManageService {
             //年级
             dto.setCurrentGrade(studentService.getStudentGrade(dto.getGradeType(),dto.getCurrentGradeNum()));
         }
-
-        if (queryInfo.getIsExport()) {
-            if (count > 50000) {
-                throw new BizException("数据集太大,不能导出.最大数据集不能超过50000");
-            }
-            //获取所在乐团
-            Map<Integer, String> musicGroupNames = MapUtil.convertMybatisMap(musicGroupDao.queryUserMusicNames(userIds));
-            //获取所在vip
-            Map<Integer, String> vipGroupNames = MapUtil.convertMybatisMap(vipGroupDao.queryUserVipNames(userIds));
-            //获取所在乐团状态
-            Map<Integer, String> musicGroupStatus = MapUtil.convertMybatisMap(musicGroupDao.queryUserMusicStatus(userIds));
-            //获取所在vip状态
-            Map<Integer, String> vipGroupStatus = MapUtil.convertMybatisMap(vipGroupDao.queryUserVipStatus(userIds));
-
-            dataList.forEach(e -> {
-                e.setMusicGroupName(musicGroupNames.get(e.getUserId()));
-                e.setVipGroupName(vipGroupNames.get(e.getUserId()));
-                e.setMusicGroupStatus(musicGroupStatus.get(e.getUserId()));
-                e.setVipGroupStatus(vipGroupStatus.get(e.getUserId()));
-            });
-        }
         pageInfo.setRows(dataList);
         return pageInfo;
     }
@@ -508,8 +514,15 @@ public class StudentManageServiceImpl implements StudentManageService {
             List<CloudTeacherOrder> studentCloudTeacherOrders = cloudTeacherOrderService.getStudentCloudTeacherOrders(collect, queryInfo.getMusicGroupId());
             Map<Integer, List<CloudTeacherOrder>> studentCloudTeacherMap = studentCloudTeacherOrders.stream().collect(Collectors.groupingBy(CloudTeacherOrder::getStudentId));
             Date nowDate = new Date();
-
+            Map<Long,String> cloudMap = MapUtil.convertMybatisMap(cloudTeacherOrderService.queryNoStartByUserIds(new HashSet<>(collect),null));
             dataList.forEach(e->{
+                //如果会员已过期、是否有未生效的会员
+                if(e.getMemberRankSettingId() == null){
+                    String s = cloudMap.get(e.getUserId().longValue());
+                    if(StringUtils.isNotEmpty(s)){
+                        e.setHasNoStartCloudTeacher(true);
+                    }
+                }
                 e.setHasCourse(hasCourseStudent.contains(e.getUserId()));
                 e.setNoPaymentAmount(totalAmountMap.get(e.getUserId()));
                 if (studentWaitPayChange.containsKey(e.getUserId())) {

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

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServeServiceImpl.java

@@ -1043,6 +1043,8 @@ public class StudentServeServiceImpl implements StudentServeService {
     @Override
     public void cleanStudentMember() {
         studentDao.cleanStudentMember();
+        //试用会员清除
+        studentDao.cleanExperienceStudentMember();
     }
 
     @Override

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

@@ -4,14 +4,18 @@ 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;
+import com.ym.mec.biz.service.SysMessageService;
 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.page.QueryInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
@@ -31,6 +35,8 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
 
     @Autowired
     private StudentDao studentDao;
+    @Autowired
+    private TeacherDao teacherDao;
 
     @Autowired
     private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
@@ -45,6 +51,14 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     private PracticeGroupDao practiceGroupDao;
 
     @Autowired
+    private MemberRankSettingDao memberRankSettingDao;
+
+    @Autowired
+    private SysConfigDao sysConfigDao;
+    @Autowired
+    private SysMessageService sysMessageService;
+
+    @Autowired
     private SysMusicCompareRecordDao sysMusicCompareRecordDao;
 
     @Autowired
@@ -376,6 +390,69 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateMemberExperience(String studentIds, Integer rankId, Date endTime) {
+        //会员是否存在
+        MemberRankSetting memberRankSetting = memberRankSettingDao.get(rankId);
+        if(memberRankSetting == null){
+            throw new BizException("会员信息不存在");
+        }
+        if(StringUtils.isEmpty(studentIds)){
+            throw new BizException("请选择学员");
+        }
+        endTime = DateUtil.addSeconds(DateUtil.addDays(endTime,1),-1);
+        //学员是否有会员
+        List<Integer> studentIdList = Arrays.stream(studentIds.split(",")).map(Integer::parseInt).collect(Collectors.toList());
+        List<Student> studentList = studentDao.findByStudentIds(studentIdList);
+        List<Student> collect = studentList.stream().filter(e -> e.getMemberRankSettingId() != null).collect(Collectors.toList());
+        if(collect.size() > 0){
+            StringBuffer sb = new StringBuffer("操作失败:学员 ");
+            List<Integer> studentId = collect.stream().map(e -> e.getUserId()).collect(Collectors.toList());
+            Map<Integer, String> maps = MapUtil.convertMybatisMap(teacherDao.queryUserNameByIdList(studentId));
+            for (Integer integer : studentId) {
+                sb.append(maps.get(integer)).append(" ");
+            }
+            sb.append("已有会员权限");
+            throw new BizException(sb.toString());
+        }
+        //最多到10月1号
+        String configValue = sysConfigDao.findConfigValue(SysConfigService.EXPERIENCE_MEMBERSHIP_END_TIME);
+        if(StringUtils.isNotEmpty(configValue)){
+            Date date = DateUtil.stringToDate(configValue, DateUtil.ISO_EXPANDED_DATE_FORMAT);
+            if(endTime.after(date)){
+                throw new BizException("操作失败:会员试用期不可超过{}",configValue);
+            }
+        }
+
+        int i = studentDao.updateMemberExperience(studentIds, rankId, endTime);
+
+        if(studentIdList.size() == i){
+            Map<Integer, String> studentPhoneMap = MapUtil.convertMybatisMap(teacherDao.queryPhoneByIds(studentIds));
+            Map<Integer,String> userMap = new HashMap<>(studentIdList.size());
+            Map<Integer,String> userMap1 = new HashMap<>(studentIdList.size());
+            for (Integer studentId : studentIdList) {
+                userMap.put(studentId,studentPhoneMap.get(studentId));
+                userMap1.put(studentId,studentId.toString());
+            }
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS,
+                    MessageTypeEnum.PUSH_EXPERIENCE_MEMBERSHIP_MESSAGE,
+                    userMap,
+                    null,
+                    0,
+                    null,
+                    null);
+
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
+                    MessageTypeEnum.PUSH_EXPERIENCE_MEMBERSHIP_MESSAGE,
+                    userMap1,
+                    null,
+                    0,
+                    null,
+                    "STUDENT");
+        }
+    }
+
+    @Override
     public StatDto organStudentData(StudentQueryInfo queryInfo) {
         PageInfo<EduOrganStudentListDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
         Map<String, Object> params = new HashMap<String, Object>();
@@ -502,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));

+ 17 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java

@@ -183,4 +183,21 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 		pageInfo.setRows(dataList);
 		return pageInfo;
 	}
+
+    @Override
+    public PageInfo<CountStudentTrainDataDto> countStudentTrain(SysMusicCompareRecordQueryInfo queryInfo) {
+		PageInfo<CountStudentTrainDataDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<CountStudentTrainDataDto> dataList = new ArrayList<>();
+		int count = sysMusicCompareRecordDao.countStudentTrain(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList =sysMusicCompareRecordDao.queryStudentTrain(params);
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+    }
 }

+ 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>

+ 6 - 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">
@@ -203,6 +203,9 @@
                 #{userId}
             </foreach>
         </if>
+        <if test="isMusicMember = 'true'">
+            AND music_group_id_ IS NOT NULL
+        </if>
         GROUP BY student_id_
     </select>
 </mapper>

+ 168 - 17
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_,
@@ -800,7 +826,7 @@
 		LEFT JOIN student_registration sr ON sr.music_group_id_ = mgpc.music_group_id_ AND mgpcd.user_id_ = sr.user_id_
 		WHERE
 		mg.status_ = 'PROGRESS'
-		AND ((mgpc.member_rank_setting_id_ IS NOT NULL AND (DATEDIFF(sr.membership_end_time_,NOW()) &lt; 0 OR sr.membership_end_time_ IS NULL)) OR mgpc.member_rank_setting_id_ IS NULL)
+		AND ((mgpc.member_rank_setting_id_ IS NOT NULL AND (sr.membership_end_time_ &lt; NOW() OR sr.membership_end_time_ IS NULL)) OR mgpc.member_rank_setting_id_ IS NULL)
 		<if test="noPaymentType==null or noPaymentType==0">
 			AND DATE_FORMAT(NOW(),'%Y-%m-%d') > DATE_FORMAT(mgpc.deadline_payment_date_,'%Y-%m-%d')
 		</if>
@@ -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>

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

@@ -11,6 +11,7 @@
 		<result column="name_" property="name" />
 		<result column="intro_" property="intro" />
 		<result column="icon_" property="icon" />
+		<result column="experience_icon_" property="experienceIcon" />
 		<result column="is_default_" property="isDefault" javaType="java.lang.Boolean" />
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
@@ -34,13 +35,16 @@
 	
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.MemberRankSetting" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		INSERT INTO member_rank_setting (name_,intro_,icon_,is_default_,create_time_,update_time_,operator_)
-		VALUES(#{name},#{intro},#{icon},#{isDefault},NOW(),NOW(),#{operator})
+		INSERT INTO member_rank_setting (name_,intro_,icon_,is_default_,create_time_,update_time_,operator_,experience_icon_)
+		VALUES(#{name},#{intro},#{icon},#{isDefault},NOW(),NOW(),#{operator},#{experienceIcon})
 	</insert>
 
 	<update id="update" parameterType="com.ym.mec.biz.dal.entity.MemberRankSetting">
 		UPDATE member_rank_setting
 		<set>
+		<if test="experienceIcon != null">
+			experience_icon_ = #{experienceIcon},
+		</if>
 		<if test="operator != null">
 			operator_ = #{operator},
 		</if>

+ 27 - 28
mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml

@@ -872,26 +872,16 @@
         </if>
     </select>
     <select id="countMusicMemberList" resultType="java.lang.Integer">
-        SELECT COUNT(c.user_id_) FROM
-        (SELECT sr.user_id_ FROM student_registration sr
+        SELECT COUNT(DISTINCT sr.user_id_)
+        FROM student_registration sr
         LEFT JOIN music_group mg ON mg.id_ = sr.music_group_id_
-        LEFT JOIN cloud_teacher_order cto ON cto.student_id_ = sr.user_id_ AND cto.status_ IN (1,2)
         LEFT JOIN sys_user su ON su.id_ = sr.user_id_
         LEFT JOIN organization o ON o.id_ = mg.organ_id_
         LEFT JOIN student_visit sv ON sv.student_id_ = sr.user_id_ AND sv.purpose_ = '会员续费'
-        <include refid="queryMusicMemberListSql"/>
-        GROUP BY sr.user_id_ HAVING (MAX(cto.id_) IS NULL OR MIN(cto.status_) > 1)
         <if test="hasMember != null">
-            <if test="hasMember == 0">
-                AND (MAX(cto.id_) IS NULL OR DATEDIFF(MAX(cto.end_time_),NOW()) &lt; 0)
-            </if>
-            <if test="hasMember == 1">
-                AND DATEDIFF(MAX(cto.end_time_),NOW()) &lt;= #{memberEndAutoQuitMusic} AND DATEDIFF(MAX(cto.end_time_),NOW()) >= 0
-            </if>
+            LEFT JOIN cloud_teacher_order cto ON cto.student_id_ = sr.user_id_ AND cto.music_group_id_ IS NOT NULL AND cto.status_ = 1
         </if>
-        <if test="visitStartTime != null">
-            AND MAX(sv.visit_time_) BETWEEN #{visitStartTime} AND #{visitEndTime}
-        </if>) c
+        <include refid="queryMusicMemberListSql"/>
     </select>
     <resultMap id="MusicMemberDto" type="com.ym.mec.biz.dal.entity.MusicMemberDto">
         <result property="organName" column="organ_name_"/>
@@ -903,28 +893,22 @@
         <result property="visitTime" column="visit_time_"/>
         <result property="phone" column="phone_"/>
         <result property="courseViewType" column="course_view_type_"/>
+        <result property="membershipEndTime" column="membership_end_time_"/>
     </resultMap>
     <select id="queryMusicMemberList" resultMap="MusicMemberDto">
         SELECT sr.user_id_,su.username_,su.phone_,o.name_ organ_name_,mg.name_ music_group_name_,mg.course_view_type_,
-        DATEDIFF(MAX(cto.end_time_),NOW()) + 1 member_day_,sr.music_group_id_,MAX(sv.visit_time_) visit_time_ FROM student_registration sr
+        DATEDIFF(sr.membership_end_time_,NOW()) member_day_,sr.music_group_id_,MAX(sv.visit_time_) visit_time_,sr.membership_end_time_
+        FROM student_registration sr
         LEFT JOIN music_group mg ON mg.id_ = sr.music_group_id_
-        LEFT JOIN cloud_teacher_order cto ON cto.student_id_ = sr.user_id_ AND cto.status_ IN (1,2)
         LEFT JOIN sys_user su ON su.id_ = sr.user_id_
         LEFT JOIN organization o ON o.id_ = mg.organ_id_
         LEFT JOIN student_visit sv ON sv.student_id_ = sr.user_id_ AND sv.purpose_ = '会员续费'
-        <include refid="queryMusicMemberListSql"/>
-        GROUP BY sr.user_id_ HAVING (MAX(cto.id_) IS NULL OR MIN(cto.status_) > 1)
         <if test="hasMember != null">
-            <if test="hasMember == 0">
-                AND (MAX(cto.id_) IS NULL OR DATEDIFF(MAX(cto.end_time_),NOW()) &lt; 0)
-            </if>
-            <if test="hasMember == 1">
-                AND DATEDIFF(MAX(cto.end_time_),NOW()) &lt;= #{memberEndAutoQuitMusic} AND DATEDIFF(MAX(cto.end_time_),NOW()) >= 0
-            </if>
-        </if>
-        <if test="visitStartTime != null">
-            AND MAX(sv.visit_time_) BETWEEN #{visitStartTime} AND #{visitEndTime}
+            LEFT JOIN cloud_teacher_order cto ON cto.student_id_ = sr.user_id_ AND cto.music_group_id_ IS NOT NULL AND cto.status_ = 1
         </if>
+        <include refid="queryMusicMemberListSql"/>
+        GROUP BY sr.user_id_
+        ORDER BY member_day_
         <include refid="global.limit"/>
     </select>
     <sql id="queryMusicMemberListSql">
@@ -932,7 +916,8 @@
             sr.music_group_status_ = 'NORMAL' AND mg.course_view_type_ = 2
             AND mg.status_ = 'PROGRESS'
             <if test="search != null and search != ''">
-                AND (mg.name_ LIKE CONCAT('%',#{search},'%') OR mg.id_ LIKE CONCAT('%',#{search},'%') OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.id_ = #{search})
+                AND (mg.name_ LIKE CONCAT('%',#{search},'%') OR mg.id_ LIKE CONCAT('%',#{search},'%')
+                OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.id_ = #{search})
             </if>
             <if test="organId != null and organId != ''">
                 AND FIND_IN_SET(mg.organ_id_,#{organId})
@@ -940,6 +925,20 @@
             <if test="educationUserId != null">
                 AND mg.educational_teacher_id_ = #{educationUserId}
             </if>
+            <if test="hasMember != null">
+                <if test="hasMember == 0">
+                    AND cto.id_ IS NULL AND (sr.membership_end_time_ IS NULL OR sr.membership_end_time_ &lt; NOW())
+                </if>
+                <if test="hasMember == 1">
+                    AND cto.id_ IS NULL AND DATEDIFF(sr.membership_end_time_,NOW()) &lt;= #{memberEndAutoQuitMusic} AND sr.membership_end_time_ > NOW()
+                </if>
+                <if test="hasMember == 2">
+                    AND cto.id_ IS NOT NULL
+                </if>
+            </if>
+            <if test="visitStartTime != null">
+                AND MAX(sv.visit_time_) BETWEEN #{visitStartTime} AND #{visitEndTime}
+            </if>
         </where>
     </sql>
     

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

@@ -403,7 +403,7 @@
 		LEFT JOIN student_registration sr ON sr.user_id_ = mgpcd.user_id_ AND sr.music_group_id_ = mgpc.music_group_id_
 		WHERE mgpc.batch_no_ IS NOT NULL AND mgpcd.payment_status_ = 'NON_PAYMENT' AND (mgpcd.expect_amount_ + mgpcd.expect_member_amount_) > 0
 		  AND mgpc.music_group_id_ = #{musicGroupId} AND mgpc.status_ IN ('OPEN','OVER','PAID') AND mgpc.pay_user_type_ = 'STUDENT'
-		  AND ((mgpc.member_rank_setting_id_ IS NOT NULL AND (DATEDIFF(sr.membership_end_time_,NOW()) &lt; 0 OR sr.membership_end_time_ IS NULL)) OR mgpc.member_rank_setting_id_ IS NULL)
+		  AND ((mgpc.member_rank_setting_id_ IS NOT NULL AND (sr.membership_end_time_ &lt; NOW() OR sr.membership_end_time_ IS NULL)) OR mgpc.member_rank_setting_id_ IS NULL)
 		GROUP BY mgpcd.user_id_
 	</select>
 
@@ -439,7 +439,7 @@
 	<sql id="queryArrearageStudentsCondition">
 		<where>
 			mg.status_ = 'PROGRESS'
-			AND ((mgpc.member_rank_setting_id_ IS NOT NULL AND (DATEDIFF(sr.membership_end_time_,NOW()) &lt; 0 OR sr.membership_end_time_ IS NULL)) OR mgpc.member_rank_setting_id_ IS NULL)
+			AND ((mgpc.member_rank_setting_id_ IS NOT NULL AND (sr.membership_end_time_ &lt; NOW() OR sr.membership_end_time_ IS NULL)) OR mgpc.member_rank_setting_id_ IS NULL)
 			<if test="noPaymentType==null or noPaymentType==0">
 				AND DATE_FORMAT(NOW(),'%Y-%m-%d') > DATE_FORMAT(mgpc.deadline_payment_date_,'%Y-%m-%d')
 			</if>

+ 71 - 2
mec-biz/src/main/resources/config/mybatis/StudentManageDao.xml

@@ -74,6 +74,10 @@
         <result column="cooperation_organ_name_" property="cooperationOrganName"/>
         <result column="membership_end_time_" property="membershipEndTime"/>
         <result column="activity_course_detail_" property="activityCourseDetail"/>
+        <result column="membership_day_" property="membershipDay"/>
+        <result column="experience_membership_day_" property="experienceMembershipDay"/>
+        <result column="experience_membership_end_time_" property="experienceMembershipEndTime"/>
+        <result column="record_user_id_" property="recordUserId"/>
     </resultMap>
 
     <sql id="queryCondition">
@@ -167,7 +171,9 @@
 		sub.`name_` music_group_subject_ ,su.birthdate_,s.subject_id_list_,s.teacher_id_,s.current_grade_num_,s.current_class_,s.member_rank_setting_id_,
         CASE WHEN su.password_ IS NULL THEN FALSE ELSE TRUE END isActive_,s.is_new_user_,
         s.membership_end_time_,CASE WHEN sut.user_id_ IS NULL THEN 0 ELSE 1 END is_signed_contract_,
-        s.cooperation_organ_id_,co.name_ cooperation_organ_name_,s.activity_course_detail_
+        s.cooperation_organ_id_,co.name_ cooperation_organ_name_,s.activity_course_detail_,s.experience_membership_end_time_,
+        DATEDIFF(s.experience_membership_end_time_,NOW()) experience_membership_day_,DATEDIFF(s.membership_end_time_,NOW()) membership_day_,
+        smcr.user_id_ record_user_id_
 		FROM `student` s LEFT JOIN `sys_user` su ON s.`user_id_` = su.`id_`
 		LEFT JOIN `organization` o ON o.`id_` = su.`organ_id_`
 		LEFT JOIN `sys_user` tu ON tu.`id_` = s.`teacher_id_`
@@ -175,6 +181,12 @@
 		LEFT JOIN `subject` sub ON sub.id_ = s.`subject_id_list_`
 		LEFT JOIN sys_user_tsign sut ON sut.user_id_ = s.user_id_
         LEFT JOIN cooperation_organ co ON s.cooperation_organ_id_=co.id_
+        LEFT JOIN (SELECT DISTINCT user_id_ FROM sys_music_compare_record) smcr ON smcr.user_id_ = s.user_id_
+        <if test="hasMember != null">
+            <if test="hasMember == 2">
+                LEFT JOIN cloud_teacher_order cto ON cto.student_id_ = s.user_id_
+            </if>
+        </if>
         <include refid="findStudentsByOrganIdSql"/>
         ORDER BY su.create_time_ DESC
         <include refid="global.limit"/>
@@ -188,6 +200,14 @@
                     #{organId}
                 </foreach>
             </if>
+            <if test="isRecord != null">
+                <if test="isRecord == 0">
+                    AND smcr.user_id_ IS NULL
+                </if>
+                <if test="isRecord == 1">
+                    AND smcr.user_id_ IS NOT NULL
+                </if>
+            </if>
             <if test="search != null and search != ''">
                 AND (su.phone_ LIKE CONCAT('%',#{search},'%') OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.id_ LIKE CONCAT('%',#{search},'%'))
             </if>
@@ -208,6 +228,14 @@
                     AND s.service_tag_ = 1
                 </if>
             </if>
+            <if test="hasTeacher != null">
+                <if test="hasTeacher == 0">
+                    AND s.teacher_id_ IS NULL
+                </if>
+                <if test="hasTeacher == 1">
+                    AND s.teacher_id_ IS NOT NULL
+                </if>
+            </if>
             <if test="hasMember != null">
                 <if test="hasMember == 0">
                     AND s.member_rank_setting_id_ IS NULL
@@ -215,6 +243,9 @@
                 <if test="hasMember == 1">
                     AND s.member_rank_setting_id_ IS NOT NULL
                 </if>
+                <if test="hasMember == 2">
+                    AND cto.status_ = 1
+                </if>
             </if>
             <if test="teacherId != null">
                 AND s.teacher_id_ = #{teacherId}
@@ -240,6 +271,14 @@
     <select id="countStudentByOrganId" resultType="java.lang.Integer">
         SELECT COUNT(DISTINCT su.id_)
         FROM `student` s LEFT JOIN `sys_user` su on s.`user_id_` = su.`id_`
+        <if test="hasMember != null">
+            <if test="hasMember == 2">
+                LEFT JOIN cloud_teacher_order cto ON cto.student_id_ = s.user_id_
+            </if>
+        </if>
+        <if test="isRecord != null">
+            LEFT JOIN (SELECT DISTINCT user_id_ FROM sys_music_compare_record) smcr ON smcr.user_id_ = s.user_id_
+        </if>
        <include refid="findStudentsByOrganIdSql"/>
     </select>
     <select id="findStudentBaseInfoByUserID" resultMap="studentManageListDto">
@@ -463,6 +502,17 @@
 
     <sql id="queryMusicGroupStudentSql">
         <where>
+            <if test="hasMember != null">
+                <if test="hasMember == 0">
+                    AND stu.member_rank_setting_id_ IS NULL
+                </if>
+                <if test="hasMember == 1">
+                    AND stu.member_rank_setting_id_ IS NOT NULL
+                </if>
+                <if test="hasMember == 2">
+                    AND cto.status_ = 1
+                </if>
+            </if>
             <if test="search != null and search != ''">
                 AND (su.id_ = #{search} OR su.username_ LIKE CONCAT("%",#{search},"%") OR su.phone_ LIKE CONCAT("%",#{search},"%"))
             </if>
@@ -534,13 +584,22 @@
         <result column="registerTime" property="registerTime"/>
         <result column="remark_" property="remark"/>
         <result column="membership_end_time_" property="membershipEndTime"/>
+        <result column="music_membership_end_time_" property="musicMembershipEndTime"/>
+        <result column="experience_membership_end_time_" property="experienceMembershipEndTime"/>
+        <result column="experience_membership_day_" property="experienceMembershipDay"/>
+        <result column="membership_day_" property="membershipDay"/>
+        <result column="music_membership_day_" property="musicMembershipDay"/>
+        <result column="member_rank_setting_id_" property="memberRankSettingId"/>
     </resultMap>
     <select id="queryMusicGroupStudent" resultMap="MusicGroupStudentsDto">
         SELECT sr.id_ student_registration_id_,sr.user_id_,su.username_ real_name_,su.gender_,su.phone_ parents_phone_,sr.current_grade_,sr.current_grade_date_,
         sr.current_class_,sr.music_group_status_ student_status_,sr.payment_status_,sr.subject_id_ reg_subject_id_,rs.name_ regSubjectName,sr.remark_,
         sr.actual_subject_id_ subject_id_,s.name_ subject_name_,sr.music_group_id_,CASE WHEN su.password_ IS NULL THEN 0 ELSE 1 END isActive_,
         IF(DATE_FORMAT(sr.create_time_,'%Y-%m-%d') > DATE_FORMAT(mg.payment_expire_date_,'%Y-%m-%d'),1,0) is_new_student_,
-        stu.care_package_,stu.come_on_package_,sr.create_time_ registerTime,sr.membership_end_time_
+        stu.care_package_,stu.come_on_package_,sr.create_time_ registerTime,
+        sr.membership_end_time_ music_membership_end_time_,stu.membership_end_time_,stu.experience_membership_end_time_,
+        DATEDIFF(stu.experience_membership_end_time_,NOW()) experience_membership_day_,DATEDIFF(stu.membership_end_time_,NOW()) membership_day_
+        ,DATEDIFF(sr.membership_end_time_,NOW()) music_membership_day_,stu.member_rank_setting_id_
         FROM student_registration sr
         LEFT JOIN sys_user su ON sr.user_id_ = su.id_
         LEFT JOIN subject s ON s.id_ = sr.actual_subject_id_
@@ -550,6 +609,11 @@
         <if test="classGroupId != null">
             LEFT JOIN class_group_student_mapper cgsm ON cgsm.music_group_id_ = sr.music_group_id_
         </if>
+        <if test="hasMember != null">
+            <if test="hasMember == 2">
+                LEFT JOIN cloud_teacher_order cto ON cto.student_id_ = sr.user_id_
+            </if>
+        </if>
         <include refid="queryMusicGroupStudentSql"/>
         ORDER BY sr.id_ DESC
         <include refid="global.limit"/>
@@ -567,6 +631,11 @@
         <if test="carePackage != null or comeOnPackage != null">
             LEFT JOIN student stu ON sr.user_id_ = stu.user_id_
         </if>
+        <if test="hasMember != null">
+            <if test="hasMember == 2">
+                LEFT JOIN cloud_teacher_order cto ON cto.student_id_ = sr.user_id_
+            </if>
+        </if>
         <include refid="queryMusicGroupStudentSql"/>
     </select>
 

+ 116 - 4
mec-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -25,6 +25,9 @@
         <result column="member_rank_setting_id_" property="memberRankSettingId"/>
         <result column="membership_start_time_" property="membershipStartTime"/>
         <result column="membership_end_time_" property="membershipEndTime"/>
+        <result column="experience_member_rank_setting_id_" property="experienceMemberRankSettingId"/>
+        <result column="experience_membership_start_time_" property="experienceMembershipStartTime"/>
+        <result column="experience_membership_end_time_" property="experienceMembershipEndTime"/>
         <result column="activity_course_detail_" property="activityCourseDetail"/>
         <result column="organ_name_" property="organName"/>
         <result column="phone_" property="phone"/>
@@ -136,6 +139,15 @@
             <if test="membershipEndTime != null">
                 membership_end_time_=#{membershipEndTime},
             </if>
+            <if test="experienceMemberRankSettingId != null">
+                experience_member_rank_setting_id_=#{experienceMemberRankSettingId},
+            </if>
+            <if test="experienceMembershipStartTime != null">
+                experience_membership_start_time_=#{experienceMembershipStartTime},
+            </if>
+            <if test="experienceMembershipEndTime != null">
+                experience_membership_end_time_=#{experienceMembershipEndTime},
+            </if>
             <if test="activityCourseDetail != null">
                 activity_course_detail_=#{activityCourseDetail},
             </if>
@@ -755,6 +767,7 @@
     <select id="getMemberNum" resultType="int">
         SELECT COUNT(0) FROM student WHERE member_rank_setting_id_ IS NOT NULL AND FIND_IN_SET(user_id_,#{studentIdsStr})
     </select>
+
     <select id="queryPushMemberRenew" resultType="java.lang.Integer">
         SELECT s.user_id_ FROM student s
         LEFT JOIN cloud_teacher_order cto ON cto.student_id_ = s.user_id_ AND cto.status_ IN (1,2)
@@ -766,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
@@ -788,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
@@ -820,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
@@ -844,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_)
@@ -875,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=",">
@@ -900,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
@@ -974,7 +1056,8 @@
             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,
-            DATE_FORMAT(stu.membership_end_time_, '%Y-%m-%d') membershipEndTime
+            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_
             LEFT JOIN sys_user tea ON stu.teacher_id_=tea.id_
@@ -1034,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=",">
@@ -1044,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
@@ -1059,13 +1162,22 @@
         </foreach>
     </update>
     <update id="cleanStudentMember">
-        UPDATE student SET member_rank_setting_id_ = NULL,membership_start_time_ = NULL,membership_end_time_ = NULL
-        WHERE DATEDIFF(NOW(),membership_end_time_) > 0
+        UPDATE student SET member_rank_setting_id_ = NULL WHERE NOW() > membership_end_time_
+    </update>
+    <update id="cleanExperienceStudentMember">
+        UPDATE student SET experience_member_rank_setting_id_ = NULL WHERE NOW() > experience_membership_end_time_
     </update>
     <update id="cleanMember">
         UPDATE student SET member_rank_setting_id_ = NULL,membership_start_time_ = NULL,membership_end_time_ = NULL
         WHERE user_id_ = #{userId}
     </update>
+    <update id="updateMemberExperience">
+        UPDATE student SET
+        member_rank_setting_id_ = #{rankId},membership_start_time_ = NOW(),membership_end_time_ = #{endTime},
+        experience_member_rank_setting_id_ = #{rankId},experience_membership_start_time_ = NOW(),experience_membership_end_time_ = #{endTime}
+        WHERE member_rank_setting_id_ IS NULL AND experience_member_rank_setting_id_ IS NULL
+        AND FIND_IN_SET(user_id_,#{studentIds})
+    </update>
 
     <update id="addStudentCloudStudySequenceDays">
         UPDATE student SET cloud_study_sequence_days_=cloud_study_sequence_days_+1,cloud_study_use_last_day_=curdate() WHERE user_id_=#{userId} AND (cloud_study_use_last_day_ IS NULL OR cloud_study_use_last_day_=date_sub(curdate(), interval 1 day))

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

@@ -1570,33 +1570,32 @@
     <select id="queryMemberEndAutoQuitMusic" resultMap="StudentRegistration">
         SELECT sr.music_group_id_,sr.user_id_ FROM student_registration sr
         LEFT JOIN music_group mg ON mg.id_ = sr.music_group_id_
-        LEFT JOIN cloud_teacher_order cto ON cto.student_id_ = sr.user_id_ AND cto.status_ IN (1,2)
-        WHERE sr.music_group_status_ = 'NORMAL' AND mg.course_view_type_ = 2
-        AND mg.status_ = 'PROGRESS'
+        LEFT JOIN cloud_teacher_order cto ON cto.student_id_ = sr.user_id_ AND cto.status_ = 1 AND cto.music_group_id_ IS NOT NULL
+        WHERE sr.music_group_status_ = 'NORMAL' AND mg.course_view_type_ = 2 AND mg.status_ = 'PROGRESS'
         <if test="educationUserId != null">
             AND mg.educational_teacher_id_ = #{educationUserId}
         </if>
         <if test="organIds != null and organIds != ''">
             AND FIND_IN_SET(mg.organ_id_,#{organIds})
         </if>
-        GROUP BY sr.user_id_ HAVING (MAX(cto.id_) IS NULL OR MIN(cto.status_) > 1)
         <if test="memberEndAutoQuitMusic != null">
-            AND DATEDIFF(MAX(cto.end_time_),NOW()) &lt;= #{memberEndAutoQuitMusic} AND DATEDIFF(MAX(cto.end_time_),NOW()) >= 0
+            AND cto.id_ IS NULL AND DATEDIFF(sr.membership_end_time_,NOW()) &lt;= #{memberEndAutoQuitMusic} AND sr.membership_end_time_ > NOW()
         </if>
         <if test="memberEndAutoQuitMusic == null">
-            AND (MAX(cto.id_) IS NULL OR DATEDIFF(MAX(cto.end_time_),NOW()) &lt; 0)
+            AND cto.id_ IS NULL AND (sr.membership_end_time_ IS NULL OR sr.membership_end_time_ &lt; NOW())
         </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>
     
@@ -1656,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,

+ 64 - 5
mec-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml

@@ -103,8 +103,14 @@
 			<if test="userId!=null">
 				AND smcr.user_id_=#{userId}
 			</if>
-			<if test="startTime!=null and endTime!=null">
-				AND DATE_FORMAT(smcr.create_time_, '%Y-%m-%d') BETWEEN #{startTime} AND #{endTime}
+			<if test="featureType != null">
+				AND smcr.feature_ = #{featureType,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+			</if>
+			<if test="startTime != null and startTime != ''">
+				AND DATE_FORMAT(smcr.create_time_, '%Y-%m-%d') >= #{startTime}
+			</if>
+			<if test="endTime != null and endTime != ''">
+				AND DATE_FORMAT(smcr.create_time_, '%Y-%m-%d') &lt;= #{endTime}
 			</if>
 		</where>
 	</sql>
@@ -118,7 +124,7 @@
 			sms.name_ sys_music_score_name_
 		FROM sys_music_compare_record smcr
 		LEFT JOIN sys_music_score sms on smcr.sys_music_score_id_ = sms.id_
-		<include refid="queryCondition"></include>
+		<include refid="queryCondition"/>
 		ORDER BY id_ DESC
 		<include refid="global.limit"/>
 	</select>
@@ -126,7 +132,7 @@
 	<!-- 查询当前表的总记录数 -->
 	<select id="queryCount" resultType="int">
 		SELECT COUNT(*) FROM sys_music_compare_record smcr
-		<include refid="queryCondition"></include>
+		<include refid="queryCondition"/>
 	</select>
 
     <select id="getUserTrainStat" resultType="com.ym.mec.biz.dal.dto.MusicCompareRankingDto">
@@ -220,7 +226,7 @@
 		LEFT JOIN sys_user su ON smcr.user_id_ = su.id_
 		LEFT JOIN student stu ON stu.user_id_ = smcr.user_id_
 		LEFT JOIN student_registration sr ON sr.user_id_=smcr.user_id_
-		<include refid="queryMusicGroupStudentTrainDataConditon"></include>
+		<include refid="queryMusicGroupStudentTrainDataConditon"/>
 	</select>
 
 	<select id="queryStudentTrainData" resultType="com.ym.mec.biz.dal.dto.EduOrganStudentListDto">
@@ -233,6 +239,59 @@
 		GROUP BY
 			user_id_
 	</select>
+    <select id="countStudentTrain" resultType="java.lang.Integer">
+		SELECT COUNT(DISTINCT s.user_id_)
+		FROM teacher t
+				 LEFT JOIN student s ON t.id_ = s.teacher_id_
+				 LEFT JOIN sys_user su ON su.id_ = s.user_id_
+				 LEFT JOIN sys_music_compare_record mcr ON mcr.user_id_ = s.user_id_
+		<if test="startTime != null and startTime != ''">
+			AND (DATE_FORMAT(mcr.create_time_, '%Y-%m-%d') >= #{startTime} OR mcr.id_ IS NULL)
+		</if>
+		<if test="endTime != null and endTime != ''">
+			AND (DATE_FORMAT(mcr.create_time_, '%Y-%m-%d') &lt;= #{endTime} OR mcr.id_ IS NULL)
+		</if>
+		WHERE s.teacher_id_ = #{teacherId}
+		<if test="search != null and search != ''">
+			AND (su.phone_ LIKE CONCAT('%',#{search},'%') OR su.username_ LIKE CONCAT('%',#{search},'%'))
+		</if>
+	</select>
+	<resultMap id="CountStudentTrainDataDto" type="com.ym.mec.biz.dal.dto.CountStudentTrainDataDto">
+		<result property="trainNum" column="train_num_"/>
+		<result property="recordNum" column="record_num_"/>
+		<result property="avatar" column="avatar_"/>
+		<result property="userId" column="user_id_"/>
+		<result property="username" column="username_"/>
+		<result property="phone" column="phone_"/>
+		<result property="totalPlayTime" column="total_play_time_"/>
+		<result property="trainDay" column="train_day_"/>
+		<result property="musicGroupName" column="music_group_name_"/>
+	</resultMap>
+	<select id="queryStudentTrain" resultMap="CountStudentTrainDataDto">
+		SELECT s.user_id_,su.avatar_,su.phone_,su.username_,ROUND(SUM(mcr.play_time_) / 60) total_play_time_,
+			   COUNT(DISTINCT DATE_FORMAT(mcr.create_time_,"%Y-%m-%d")) train_day_,
+			   COUNT(DISTINCT mcr.behavior_id_) train_num_,
+		COUNT(CASE WHEN mcr.feature_ = 'CLOUD_STUDY_EVALUATION' THEN mcr.behavior_id_ ELSE NULL END) record_num_,GROUP_CONCAT(DISTINCT mg.name_) music_group_name_
+		FROM teacher t
+				 LEFT JOIN student s ON t.id_ = s.teacher_id_
+				 LEFT JOIN student_registration sr ON sr.user_id_ = s.user_id_ AND sr.music_group_status_ = 'NORMAL'
+				 LEFT JOIN music_group mg ON mg.id_ = sr.music_group_id_ AND mg.status_ = 'PROGRESS'
+				 LEFT JOIN sys_user su ON su.id_ = s.user_id_
+				 LEFT JOIN sys_music_compare_record mcr ON mcr.user_id_ = s.user_id_
+		<if test="startTime != null and startTime != ''">
+			AND (DATE_FORMAT(mcr.create_time_, '%Y-%m-%d') >= #{startTime} OR mcr.id_ IS NULL)
+		</if>
+		<if test="endTime != null and endTime != ''">
+			AND (DATE_FORMAT(mcr.create_time_, '%Y-%m-%d') &lt;= #{endTime} OR mcr.id_ IS NULL)
+		</if>
+		WHERE s.teacher_id_ = #{teacherId}
+		<if test="search != null and search != ''">
+			AND (su.phone_ LIKE CONCAT('%',#{search},'%') OR su.username_ LIKE CONCAT('%',#{search},'%'))
+		</if>
+		GROUP BY s.user_id_
+		ORDER BY total_play_time_ DESC
+		<include refid="global.limit"/>
+	</select>
 
 	<select id="getOrganNewCloudStudyNum" resultType="int">
 		SELECT

+ 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>

+ 20 - 8
mec-student/src/main/java/com/ym/mec/student/controller/StudentManageController.java

@@ -1,6 +1,7 @@
 package com.ym.mec.student.controller;
 
 import com.ym.mec.biz.dal.enums.SuggestionType;
+import com.ym.mec.util.date.DateUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -144,13 +145,6 @@ public class StudentManageController extends BaseController {
 		student.setRealName(user.getRealName());
 		student.setIdCardNo(user.getIdCardNo());
 		student.setImToken(user.getImToken());
-		if (student != null) {
-			// 获取会员等级图标
-			MemberRankSetting memberRankSetting = memberRankSettingService.get(student.getMemberRankSettingId());
-			if (memberRankSetting != null) {
-				student.setMemberRankImg(memberRankSetting.getIcon());
-			}
-		}
 
 		Map<String, Object> datas = new HashMap<String, Object>();
 		datas.put("student", student);
@@ -179,7 +173,25 @@ public class StudentManageController extends BaseController {
 		} else {
 			datas.put("homeworkOpenFlag", Integer.parseInt(sysConfig.getParanValue()));
 		}
-
+        // 获取会员等级图标
+        MemberRankSetting memberRankSetting = memberRankSettingService.get(student.getMemberRankSettingId());
+        if (memberRankSetting != null) {
+            student.setMemberRankImg(memberRankSetting.getIcon());
+        }
+        //是否是试用会员
+		if(student.getExperienceMemberRankSettingId() == null){
+            datas.put("isExperience", 0);
+        }else {
+            int i = DateUtil.daysBetween(student.getExperienceMembershipEndTime(),student.getMembershipEndTime());
+            if(i > 0){
+                datas.put("isExperience", 0);
+            }else {
+                datas.put("isExperience", 1);
+                if (memberRankSetting != null) {
+                    student.setMemberRankImg(memberRankSetting.getExperienceIcon());
+                }
+            }
+        }
 		return succeed(datas);
 	}
 

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

@@ -2,21 +2,24 @@ package com.ym.mec.teacher.controller;
 
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dto.CountStudentTrainDataDto;
 import com.ym.mec.biz.dal.dto.MusicCompareRankingDto;
 import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
 import com.ym.mec.biz.dal.page.SysMusicCompareRecordQueryInfo;
 import com.ym.mec.biz.service.SysMusicCompareRecordService;
 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 io.swagger.annotations.Api;
-import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import static com.ym.mec.biz.dal.enums.FeatureType.CLOUD_STUDY_EVALUATION;
+
 /**
  * @Author Joburgess
  * @Date 2021/8/11 0011
@@ -43,4 +46,24 @@ public class CloudStudyController extends BaseController {
         return succeed(sysMusicCompareRecordService.queryStudentTrainData(queryInfo));
     }
 
+    @ApiOperation("学员训练统计")
+    @GetMapping("countStudentTrain")
+    public HttpResponseResult<PageInfo<CountStudentTrainDataDto>> countStudentTrain(SysMusicCompareRecordQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(sysUser == null){
+            throw new BizException("请登录");
+        }
+        queryInfo.setTeacherId(sysUser.getId());
+        return succeed(sysMusicCompareRecordService.countStudentTrain(queryInfo));
+    }
+
+    @ApiOperation("学员评测列表")
+    @GetMapping("queryMusicCompareRecord")
+    public HttpResponseResult<PageInfo<SysMusicCompareRecord>> queryMusicCompareRecord(SysMusicCompareRecordQueryInfo queryInfo){
+        if(queryInfo.getFeatureType() == null){
+            queryInfo.setFeatureType(CLOUD_STUDY_EVALUATION);
+        }
+        return succeed(sysMusicCompareRecordService.queryPage(queryInfo));
+    }
+
 }

+ 212 - 10
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")
@@ -970,10 +972,12 @@ public class ExportController extends BaseController {
         try {
             HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部", "学员编号", "学员姓名", "性别", "家长姓名",
                     "家长联系电话", "是否激活", "是否有课", "是否有网管课","网管课剩余课时","VIP课剩余课时", "课程余额(元)", "账户余额(元)",
-                    "所在乐团", "乐团所属声部", "所在乐团状态", "所在vip课", "所在VIP状态", "服务标签", "运营标签", "指导老师", "是否签订协议"}, new String[]{
+                    "所在乐团", "乐团所属声部", "所在乐团状态", "所在vip课", "所在VIP状态", "服务标签", "运营标签", "指导老师", "是否签订协议", "是否使用云教练", "会员截止日期", "会员剩余天数", "会员试用结束日期", "会员试用剩余天数"}, new String[]{
                     "organName", "userId", "username", "gender.description", "parentsName", "parentsPhone",
                     "isActive.msg", "hasCourse.msg", "hasPracticeCourse.msg","noStartPracticeCourseNum","noStartVipCourseNum", "courseBalance", "balance", "musicGroupName",
-                    "subjectName", "musicGroupStatus", "vipGroupName", "vipGroupStatus", "serviceTag.msg", "operatingTag.msg", "teacherName", "isSignedContract ? '是' : '否'"}, rows);
+                    "subjectName", "musicGroupStatus", "vipGroupName", "vipGroupStatus", "serviceTag.msg", "operatingTag.msg", "teacherName", "isSignedContract ? '是' : '否'", "recordUserId == null ? '否' : '是'",
+                    "membershipEndTime","membershipEndTime == null ? hasNoStartCloudTeacher ? \"未生效\" : \"未购买\" : membershipDay >= 0 ? membershipDay : hasNoStartCloudTeacher ? \"未生效\" : \"会员已过期\"",
+                    "experienceMembershipEndTime","membershipEndTime == null ? \"未试用\" : membershipDay >= 0 ? membershipDay : \"已失效\""}, rows);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls");
             response.flushBuffer();
@@ -1431,19 +1435,23 @@ public class ExportController extends BaseController {
                 } else {
                     row.setActiveName("否");
                 }
-                if (row.getIsNewStudent().equals(1)) {
-                    row.setIsNewStudentStr("是");
-                } else {
-                    row.setIsNewStudentStr("否");
+                if (row.getMusicMembershipDay() != null && row.getMusicMembershipDay() < 0) {
+                    row.setMusicMembershipDay1(Math.abs(row.getMusicMembershipDay()));
                 }
                 if (row.getNextPaymentDate() != null) {
                     row.setNextPaymentDateStr(DateUtil.format(row.getNextPaymentDate(), DateUtil.DEFAULT_PATTERN));
                 }
             }
-            String[] header = {"学员编号", "学员姓名", "性别", "联系电话", "年级", "班级", "专业", "学员状态", "新增学员", "缴费金额",
-                    "下次缴费日期", "报名缴费状态", "是否激活", "是否有剩余VIP", "是否有剩余网管课", "欠费总额"};
-            String[] body = {"userId", "realName", "gender", "phone", "currentGrade", "currentClass", "subjectName", "studentStatus", "isNewStudentStr",
-                    "courseFee", "nextPaymentDateStr", "paymentStatus.desc", "activeName", "hasVip ? '是' : '否'", "hasPractice ? '是' : '否'", "noPaymentAmount"};
+            String[] header = {"学员编号", "学员姓名", "性别", "联系电话","入团时间", "年级", "班级", "入团专业", "学员状态", "报名缴费", "缴费金额", "是否激活",
+                    "VIP/网管是否有课","关心包","加油包", "欠费金额(元)", "退团原因",
+                    "下次续费时间", "下次续费剩余天数", "会员截止时间", "会员剩余天数", "试用会员截止时间", "试用会员剩余天数"};
+            String[] body = {"userId", "realName", "gender", "phone","registerTime", "currentGrade", "currentClass", "subjectName", "studentStatus", "paymentStatus.desc"
+                    ,"courseFee", "activeName", "hasCourse ? '是' : '否'"
+                    ,"carePackage == null || carePackage == 0 ? \"不可用\" : carePackage == 1 ? \"可用\" : \"已使用\""
+                    ,"comeOnPackage == null || comeOnPackage == 0 ? \"不可用\" : comeOnPackage == 1 ? \"可用\" : \"已使用\""
+                    ,"noPaymentAmount == null ? 0 : noPaymentAmount", "quitReason", "musicMembershipEndTime", "musicMembershipEndTime == null ? '' : musicMembershipDay >= 0 ? musicMembershipDay : '已欠费' + musicMembershipDay1 + '天'",
+                    "membershipEndTime","membershipEndTime == null ? hasNoStartCloudTeacher ? \"未生效\" : \"未购买\" : membershipDay >= 0 ? membershipDay : hasNoStartCloudTeacher ? \"未生效\" : \"会员已过期\"",
+                    "experienceMembershipEndTime","membershipEndTime == null ? \"未试用\" : membershipDay >= 0 ? membershipDay : \"已失效\""};
             HSSFWorkbook workbook = POIUtil.exportExcel(header, body, musicGroupStudentsDtoPageInfo.getRows());
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attachment;filename=lender-" + DateUtil.getDate(new Date()) + ".xls");
@@ -3098,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();
+                }
+            }
+        }
+    }
 }

+ 27 - 10
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()
@@ -159,17 +164,17 @@ public class IndexController extends BaseController {
 		if (sysUser == null) {
 			return failed("用户信息获取失败");
 		}
-			Employee employee = employeeService.get(sysUser.getId());
-			if (StringUtils.isBlank(organId)) {
-				organId = employee.getOrganIdList();
-			}else if(StringUtils.isEmpty(employee.getOrganIdList())){
-				return failed("用户所在分部异常");
-			}else {
-				List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
-				if(!list.containsAll(Arrays.asList(organId.split(",")))){
-					return failed("非法请求");
-				}
+		Employee employee = employeeService.get(sysUser.getId());
+		if (StringUtils.isBlank(organId)) {
+			organId = employee.getOrganIdList();
+		}else if(StringUtils.isEmpty(employee.getOrganIdList())){
+			return failed("用户所在分部异常");
+		}else {
+			List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+			if(!list.containsAll(Arrays.asList(organId.split(",")))){
+				return failed("非法请求");
 			}
+		}
 		return succeed(indexService.getIndexErrData(organId, errorType));
 	}
 
@@ -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));
+	}
 }

+ 17 - 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;
@@ -383,6 +384,14 @@ public class StudentManageController extends BaseController {
         return succeed(studentManageService.getOperatingStudents(queryInfo));
     }
 
+    @ApiOperation(value = "新增会员试用")
+    @PostMapping("/updateMemberExperience")
+    @PreAuthorize("@pcs.hasPermissions('studentManage/updateMemberExperience')")
+    public HttpResponseResult updateMemberExperience(String studentIds, Integer rankId, Date endTime){
+        studentService.updateMemberExperience(studentIds,rankId,endTime);
+        return succeed();
+    }
+
     @ApiOperation(value = "初始化教师编号")
     @GetMapping("/initTeacherId")
     @PreAuthorize("@pcs.hasPermissions('studentManage/initTeacherId')")
@@ -440,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));
+    }
 }