Browse Source

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

zouxuan 3 years ago
parent
commit
5337382d95
39 changed files with 1188 additions and 29 deletions
  1. 5 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CloudTeacherDao.java
  2. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  3. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/OrganizationDao.java
  4. 87 4
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  5. 9 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  6. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMusicCompareRecordDao.java
  7. 108 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EduOrganStudentDataDto.java
  8. 155 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EduOrganStudentListDto.java
  9. 50 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/MusicGroupStudentsDto.java
  10. 30 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentManageListDto.java
  11. 30 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/Student.java
  12. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java
  13. 31 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentQueryInfo.java
  14. 30 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java
  15. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
  16. 4 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  17. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  18. 7 7
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupSchoolTermCourseDetailServiceImpl.java
  19. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  20. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServeServiceImpl.java
  21. 213 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  22. 11 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java
  23. 24 1
      mec-biz/src/main/resources/config/mybatis/CloudTeacherMapper.xml
  24. 2 1
      mec-biz/src/main/resources/config/mybatis/CloudTeacherOrderMapper.xml
  25. 12 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  26. 1 1
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  27. 11 0
      mec-biz/src/main/resources/config/mybatis/OrganizationMapper.xml
  28. 14 2
      mec-biz/src/main/resources/config/mybatis/StudentManageDao.xml
  29. 191 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  30. 14 0
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  31. 11 0
      mec-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml
  32. 4 0
      mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java
  33. 5 0
      mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java
  34. 12 1
      mec-student/src/main/java/com/ym/mec/student/controller/StudentManageController.java
  35. 19 0
      mec-task/src/main/java/com/ym/mec/task/jobs/CleanStudentCloudStudySequenceDays.java
  36. 1 1
      mec-web/src/main/java/com/ym/mec/web/config/ResourceServerConfig.java
  37. 9 4
      mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java
  38. 6 0
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java
  39. 54 0
      mec-web/src/main/java/com/ym/mec/web/controller/education/EduStudentController.java

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

@@ -6,6 +6,7 @@ import com.ym.mec.common.dal.BaseDAO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
+import java.util.Map;
 
 
 public interface CloudTeacherDao extends BaseDAO<Long, CloudTeacher> {
@@ -18,4 +19,7 @@ public interface CloudTeacherDao extends BaseDAO<Long, CloudTeacher> {
      */
     CloudTeacher getByStudentId(@Param("studentId") Integer studentId);
 
-}
+    int getOrganVipStudentNum(@Param("organId") Integer organId);
+    List<Map<Integer, Integer>> getOrgansVipStudentNum(@Param("organIds") List<Integer> organId);
+
+}

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java

@@ -532,4 +532,14 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
      * @param musicGroupId
      */
     void deletePreCourse(String musicGroupId);
+
+    /**
+     * @describe 查询出指定学员中有小课的学员
+     * @author Joburgess
+     * @date 2021/8/17 0017
+     * @param studentIds:
+     * @return java.util.Set<java.lang.String>
+     */
+    Set<Integer> getHasVipCourseStudentIds(@Param("studentIds") List<Integer> studentIds);
+
 }

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/OrganizationDao.java

@@ -19,6 +19,8 @@ public interface OrganizationDao extends BaseDAO<Integer, Organization> {
 
     List<Organization> findOrgans(@Param("organIds") List<Integer> organIds);
 
+    List<Organization> getOrgans(@Param("organIds") List<Integer> organIds);
+
     /**
      * 根据分部id字符串查询
      * @param organIds

+ 87 - 4
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java

@@ -1,10 +1,7 @@
 package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dto.SimpleUserDto;
-import com.ym.mec.biz.dal.dto.Student4operating;
-import com.ym.mec.biz.dal.dto.StudentServeCourseDto;
-import com.ym.mec.biz.dal.dto.StudentServeDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.entity.Subject;
 import com.ym.mec.biz.dal.enums.GroupType;
@@ -242,6 +239,92 @@ 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
+     * @param organId:
+     * @return com.ym.mec.biz.dal.dto.EduOrganStudentDataDto
+     */
+    int getOrganStudentNum(@Param("organId") Integer organId);
+    List<Map<Integer, Integer>> getOrgansStudentNum(@Param("organIds") List<Integer> organIds);
+
+    /**
+     * @describe 统计云教练试用人数
+     * @author Joburgess
+     * @date 2021/8/17 0017
+     * @param organId:
+     * @return int
+     */
+    int getCloudStudyStudentNum(@Param("organId") Integer organId);
+    List<Map<Integer, Integer>> getOrganCloudStudyStudentNum(@Param("organIds") List<Integer> organIds);
+
+
+    int getCloudStudyLivelyStudentNum(@Param("organId") Integer organId);
+    List<Map<Integer, Integer>> getOrganCloudStudyLivelyStudentNum(@Param("organIds") List<Integer> organIds);
+
+    /**
+     * @describe 查询云教练学员列表数据
+     * @author Joburgess
+     * @date 2021/8/17 0017
+     * @param params:
+     * @return java.util.List<com.ym.mec.biz.dal.dto.EduOrganStudentListDto>
+     */
+    List<EduOrganStudentListDto> queryCloudStudyStudentData(Map<String, Object> params);
+    int countCloudStudyStudentData(Map<String, Object> params);
+
+    /**
+     * @describe 更新学员云教练连续使用天数
+     * @author Joburgess
+     * @date 2021/8/17 0017
+     * @param userId:
+     * @return int
+     */
+    int addStudentCloudStudySequenceDays(@Param("userId") Integer userId);
+
+    /**
+     * @describe 更新学员云教练连续使用天数
+     * @author Joburgess
+     * @date 2021/8/17 0017
+     * @param userId:
+     * @param days:
+     * @return int
+     */
+    int updateStudentsCloudStudySequenceDays(@Param("userIds") List<Integer> userId,
+                                             @Param("days") Integer days);
+
+    /**
+     * @describe 清理学员云教练连续使用天数
+     * @author Joburgess
+     * @date 2021/8/17 0017
+     * @return int
+     */
+    int cleanStudentCloudStudySequenceDays();
+
+    /**
+     * @describe 获取分部下试用会员数
+     * @author Joburgess
+     * @date 2021/8/17 0017
+     * @param organId:
+     * @return int
+     */
+    int getOrganEVipStudentNum(@Param("organId") Integer organId);
+    List<Map<Integer, Integer>> getOrgansEVipStudentNum(@Param("organIds") List<Integer> organIds);
 }

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java

@@ -666,4 +666,13 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
      * @return
      */
     List<Map<String,String>> queryAutoCreateStudentMap(@Param("pushMemberRenew") String pushMemberRenew);
+
+    /**
+     * @describe 查询学员乐团名称字典
+     * @author Joburgess
+     * @date 2021/8/17 0017
+     * @param studentIds:
+     * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.String>>
+     */
+    List<Map<Integer, String>> queryStudentMusicGroupNamesMap(@Param("studentIds") List<Integer> studentIds);
 }

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMusicCompareRecordDao.java

@@ -1,5 +1,6 @@
 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;
@@ -47,5 +48,7 @@ public interface SysMusicCompareRecordDao extends BaseDAO<Long, SysMusicCompareR
 
     List<MusicCompareRankingDto> queryMusicGroupStudentTrainData(Map<String, Object> params);
     int countMusicGroupStudentTrainData(Map<String, Object> params);
+
+    List<EduOrganStudentListDto> queryStudentTrainData(@Param("studentIds") List<Integer> studentIds);
 	
 }

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

@@ -0,0 +1,108 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/16 0016
+ */
+public class EduOrganStudentDataDto {
+
+    private Integer organId;
+
+    @ApiModelProperty("分部名称")
+    private String organName;
+
+    @ApiModelProperty("学员总数")
+    private int totalStudentNum;
+
+    @ApiModelProperty("付费会员数")
+    private int vipStudentNum;
+
+    @ApiModelProperty("试用会员数")
+    private int eVipStudentNum;
+
+    @ApiModelProperty("付费会员占比")
+    private float vipStudentDuty;
+
+    @ApiModelProperty("云教练试用人数")
+    private int cloudStudyUseStudentNum;
+
+    @ApiModelProperty("云教练使用人数占比")
+    private float cloudStudyUseStudentDuty;
+
+    @ApiModelProperty("活跃人数")
+    private int cloudStudyLivelyStudentNum;
+
+    public Integer getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(Integer organId) {
+        this.organId = organId;
+    }
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    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;
+    }
+
+    public int getCloudStudyLivelyStudentNum() {
+        return cloudStudyLivelyStudentNum;
+    }
+
+    public void setCloudStudyLivelyStudentNum(int cloudStudyLivelyStudentNum) {
+        this.cloudStudyLivelyStudentNum = cloudStudyLivelyStudentNum;
+    }
+}

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

@@ -0,0 +1,155 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/17 0017
+ */
+public class EduOrganStudentListDto {
+
+    @ApiModelProperty("学员编号")
+    private Integer studentId;
+
+    @ApiModelProperty("姓名")
+    private String studentName;
+
+    @ApiModelProperty("指导老师编号")
+    private Integer teacherId;
+
+    @ApiModelProperty("指导老师名称")
+    private String teacherName;
+
+    @ApiModelProperty("声部编号")
+    private Integer subjectId;
+
+    @ApiModelProperty("声部名称")
+    private String subjectName;
+
+    @ApiModelProperty("乐团名称")
+    private String musicGroupNames;
+
+    @ApiModelProperty("是否有小课")
+    private int hasVipGroup;
+
+    @ApiModelProperty("训练次数")
+    private int cloudStudyUseNum;
+
+    @ApiModelProperty("平均时长")
+    private double cloudStudyUseAvgTime;
+
+    @ApiModelProperty("总时长")
+    private  double cloudStudyUseTime;
+
+    @ApiModelProperty("连续天数")
+    private int cloudStudyRunningDays;
+
+    @ApiModelProperty("会员有效期")
+    private String membershipEndTime;
+
+    public Integer getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Integer studentId) {
+        this.studentId = studentId;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    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 Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public String getMusicGroupNames() {
+        return musicGroupNames;
+    }
+
+    public void setMusicGroupNames(String musicGroupNames) {
+        this.musicGroupNames = musicGroupNames;
+    }
+
+    public int getHasVipGroup() {
+        return hasVipGroup;
+    }
+
+    public void setHasVipGroup(int hasVipGroup) {
+        this.hasVipGroup = hasVipGroup;
+    }
+
+    public int getCloudStudyUseNum() {
+        return cloudStudyUseNum;
+    }
+
+    public void setCloudStudyUseNum(int cloudStudyUseNum) {
+        this.cloudStudyUseNum = cloudStudyUseNum;
+    }
+
+    public double getCloudStudyUseAvgTime() {
+        return cloudStudyUseAvgTime;
+    }
+
+    public void setCloudStudyUseAvgTime(double cloudStudyUseAvgTime) {
+        this.cloudStudyUseAvgTime = cloudStudyUseAvgTime;
+    }
+
+    public double getCloudStudyUseTime() {
+        return cloudStudyUseTime;
+    }
+
+    public void setCloudStudyUseTime(double cloudStudyUseTime) {
+        this.cloudStudyUseTime = cloudStudyUseTime;
+    }
+
+    public int getCloudStudyRunningDays() {
+        return cloudStudyRunningDays;
+    }
+
+    public void setCloudStudyRunningDays(int cloudStudyRunningDays) {
+        this.cloudStudyRunningDays = cloudStudyRunningDays;
+    }
+
+    public String getMembershipEndTime() {
+        return membershipEndTime;
+    }
+
+    public void setMembershipEndTime(String membershipEndTime) {
+        this.membershipEndTime = membershipEndTime;
+    }
+}

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

@@ -121,6 +121,56 @@ 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;
+
+    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;
     }

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

@@ -108,6 +108,36 @@ public class StudentManageListDto {
 
     private String activityCourseDetail;
 
+    private Integer membershipDay;
+
+    private Integer experienceMembershipDay;
+
+    private Date experienceMembershipEndTime;
+
+    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;
     }

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

+ 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", "会员续费提醒"),

+ 31 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentQueryInfo.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.page;
 
 import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
 
 import java.util.List;
 
@@ -16,8 +17,14 @@ public class StudentQueryInfo extends QueryInfo {
 
     private Integer studentId;
 
+    private Integer organId;
+
     private List<String> organIdList;
 
+    private String cloudStudyUseTime;
+
+    private String cloudStudyRunningDays;
+
     public String getGroupType() {
         return groupType;
     }
@@ -42,6 +49,14 @@ public class StudentQueryInfo extends QueryInfo {
         this.studentId = studentId;
     }
 
+    public Integer getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(Integer organId) {
+        this.organId = organId;
+    }
+
     public List<String> getOrganIdList() {
         return organIdList;
     }
@@ -49,4 +64,20 @@ public class StudentQueryInfo extends QueryInfo {
     public void setOrganIdList(List<String> organIdList) {
         this.organIdList = organIdList;
     }
+
+    public String getCloudStudyUseTime() {
+        return cloudStudyUseTime;
+    }
+
+    public void setCloudStudyUseTime(String cloudStudyUseTime) {
+        this.cloudStudyUseTime = cloudStudyUseTime;
+    }
+
+    public String getCloudStudyRunningDays() {
+        return cloudStudyRunningDays;
+    }
+
+    public void setCloudStudyRunningDays(String cloudStudyRunningDays) {
+        this.cloudStudyRunningDays = cloudStudyRunningDays;
+    }
 }

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

@@ -1,8 +1,11 @@
 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.EduOrganStudentDataDto;
+import com.ym.mec.biz.dal.dto.StatDto;
 import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
 import com.ym.mec.biz.dal.entity.CooperationOrgan;
 import com.ym.mec.biz.dal.entity.Student;
@@ -10,6 +13,7 @@ import com.ym.mec.biz.dal.enums.GradeTypeEnum;
 import com.ym.mec.biz.dal.enums.PeriodEnum;
 import com.ym.mec.biz.dal.page.StudentQueryInfo;
 import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
 
 public interface StudentService extends BaseService<Integer, Student> {
@@ -87,4 +91,30 @@ 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
+     * @param queryInfo:
+     * @return com.ym.mec.biz.dal.dto.StatDto
+     */
+    StatDto organStudentData(StudentQueryInfo queryInfo);
+
+    List<EduOrganStudentDataDto> organStudentOverView(List<Integer> organIds);
+
+    /**
+     * @describe 清理学员云教练连续使用天数
+     * @author Joburgess
+     * @date 2021/8/17 0017
+     * @param :
+     * @return void
+     */
+    void cleanStudentCloudStudySequenceDays();
 }

+ 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

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

@@ -618,7 +618,10 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
             dataList.forEach(e -> {
                 param.put("musicGroupId", e.getMusicGroupId());
                 e.setAttendanceNum(teacherPersonalAttendancesCount);
-                e.setHasRestClass(hasRestClassMap.get(Integer.parseInt(e.getClassGroupIds())).intValue());
+                Long aLong = hasRestClassMap.get(Integer.parseInt(e.getClassGroupIds()));
+                if(aLong != null){
+                    e.setHasRestClass(aLong.intValue());
+                }
             });
         }
         if (count == 0) {

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

@@ -533,6 +533,8 @@ public class ExportServiceImpl implements ExportService {
                     row.setSubjectName(practiceGroup.getSubjectName());
                     row.setEduTeacher(practiceGroup.getEduTeacherName());
                 }
+            } else if (row.getGroupType().equals(GroupType.MEMBER)) {
+                row.setCloudTeacherFee(row.getActualAmount());
             } else if (row.getGroupType().equals(GroupType.REPLACEMENT)) {
                 row.setMusicalFee(row.getActualAmount());
                 ReplacementInstrumentActivityStatDto info = replacementInstrumentActivityDao.getInfo(Integer.parseInt(row.getMusicGroupId()));

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

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

@@ -1803,7 +1803,8 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             throw new BizException("乐团找不到");
         }
 
-        if (!(musicGroup.getStatus() == MusicGroupStatusEnum.PAY ||
+        if (!(musicGroup.getStatus() == MusicGroupStatusEnum.APPLY ||
+        		musicGroup.getStatus() == MusicGroupStatusEnum.PAY ||
                 musicGroup.getStatus() == MusicGroupStatusEnum.PREPARE ||
                 musicGroup.getStatus() == MusicGroupStatusEnum.PROGRESS)) {
             throw new BizException("乐团当前状态是[{}],不能延长缴费", musicGroup.getStatus().getMsg());

+ 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

+ 213 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java

@@ -1,25 +1,31 @@
 package com.ym.mec.biz.service.impl;
 
 import com.ym.mec.biz.dal.dao.*;
-import com.ym.mec.biz.dal.dto.StudentClassInfoDto;
-import com.ym.mec.biz.dal.dto.StudentCourseTimesDto;
-import com.ym.mec.biz.dal.dto.StudentTeacherCourseDto;
+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.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;
+import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
+import sun.nio.cs.ext.Big5;
 
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -28,6 +34,8 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
 
     @Autowired
     private StudentDao studentDao;
+    @Autowired
+    private TeacherDao teacherDao;
 
     @Autowired
     private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
@@ -41,6 +49,23 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     @Autowired
     private PracticeGroupDao practiceGroupDao;
 
+    @Autowired
+    private MemberRankSettingDao memberRankSettingDao;
+
+    @Autowired
+    private SysConfigDao sysConfigDao;
+    @Autowired
+    private SysMessageService sysMessageService;
+
+    @Autowired
+    private SysMusicCompareRecordDao sysMusicCompareRecordDao;
+
+    @Autowired
+    private CloudTeacherDao cloudTeacherDao;
+
+    @Autowired
+    private OrganizationDao organizationDao;
+
     @Override
     public BaseDAO<Integer, Student> getDAO() {
         return studentDao;
@@ -362,4 +387,189 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     public void cleanMember(Integer userId) {
         studentDao.cleanMember(userId);
     }
+
+    @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("请选择学员");
+        }
+        //学员是否有会员
+        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);
+            int i = DateUtil.daysBetween(date, endTime);
+            if(i > 0){
+                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>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<EduOrganStudentListDto> dataList = new ArrayList<>();
+        int count = studentDao.countCloudStudyStudentData(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = studentDao.queryCloudStudyStudentData(params);
+            List<Integer> studentIds = dataList.stream().map(EduOrganStudentListDto::getStudentId).collect(Collectors.toList());
+            List<Map<Integer, String>> studentGroupNamesMapList = studentRegistrationDao.queryStudentMusicGroupNamesMap(studentIds);
+            Map<Integer, String> studentGroupNamesMap = MapUtil.convertIntegerMap(studentGroupNamesMapList);
+            Set<Integer> hasVipCourseStudentIds = courseScheduleStudentPaymentDao.getHasVipCourseStudentIds(studentIds);
+
+            for (EduOrganStudentListDto eduOrganStudentListDto : dataList) {
+                if(studentGroupNamesMap.containsKey(eduOrganStudentListDto.getStudentId())){
+                    eduOrganStudentListDto.setMusicGroupNames(studentGroupNamesMap.get(eduOrganStudentListDto.getStudentId()));
+                }
+                if(hasVipCourseStudentIds.contains(eduOrganStudentListDto.getSubjectId())){
+                    eduOrganStudentListDto.setHasVipGroup(1);
+                }
+                if(eduOrganStudentListDto.getCloudStudyUseNum()>0 && eduOrganStudentListDto.getCloudStudyUseTime()>0){
+                    eduOrganStudentListDto.setCloudStudyUseAvgTime(eduOrganStudentListDto.getCloudStudyUseTime()/eduOrganStudentListDto.getCloudStudyUseNum());
+                }
+                eduOrganStudentListDto.setCloudStudyUseTime(eduOrganStudentListDto.getCloudStudyUseTime()/60);
+                eduOrganStudentListDto.setCloudStudyUseAvgTime(eduOrganStudentListDto.getCloudStudyUseAvgTime()/60);
+            }
+        }
+        pageInfo.setRows(dataList);
+
+        StatDto result = new StatDto();
+        if(queryInfo.getPage()==1){
+            EduOrganStudentDataDto organStudentVipData = new EduOrganStudentDataDto();
+            organStudentVipData.setTotalStudentNum(studentDao.getOrganStudentNum(queryInfo.getOrganId()));
+            organStudentVipData.setVipStudentNum(cloudTeacherDao.getOrganVipStudentNum(queryInfo.getOrganId()));
+            organStudentVipData.seteVipStudentNum(studentDao.getOrganEVipStudentNum(queryInfo.getOrganId()));
+            organStudentVipData.setCloudStudyUseStudentNum(studentDao.getCloudStudyStudentNum(queryInfo.getOrganId()));
+            organStudentVipData.setCloudStudyLivelyStudentNum(studentDao.getCloudStudyLivelyStudentNum(queryInfo.getOrganId()));
+            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.setHead(organStudentVipData);
+        }
+        result.setDetail(pageInfo);
+
+        return result;
+    }
+
+    @Override
+    public List<EduOrganStudentDataDto> organStudentOverView(List<Integer> organIds) {
+        List<Organization> organs = organizationDao.getOrgans(organIds);
+
+        if(CollectionUtils.isEmpty(organs)){
+            return Collections.emptyList();
+        }
+
+        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<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());
+            }
+            result.add(organStudentVipData);
+        }
+        return result;
+    }
+
+    @Override
+    public void cleanStudentCloudStudySequenceDays() {
+        studentDao.cleanStudentCloudStudySequenceDays();
+    }
 }

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

@@ -2,6 +2,7 @@ package com.ym.mec.biz.service.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dao.StudentDao;
 import com.ym.mec.biz.dal.dao.SysMusicCompareRecordDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.dto.*;
@@ -31,6 +32,8 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 	private SysMusicCompareRecordDao sysMusicCompareRecordDao;
 	@Autowired
 	private TeacherDao teacherDao;
+	@Autowired
+	private StudentDao studentDao;
 
 	@Override
 	public BaseDAO<Long, SysMusicCompareRecord> getDAO() {
@@ -38,6 +41,12 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 	}
 
 	@Override
+	public long insert(SysMusicCompareRecord bean) {
+		studentDao.addStudentCloudStudySequenceDays(bean.getUserId());
+		return super.insert(bean);
+	}
+
+	@Override
 	public void saveMusicCompareData(String phone, SoundCompareHelper soundCompareInfo) {
 		SysUser user = teacherDao.getUserWithPhone(phone);
 		if(Objects.isNull(user)){
@@ -61,8 +70,9 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 		if(Objects.nonNull(soundCompareInfo.getFile())){
 			sysMusicCompareRecord.setPlayTime(soundCompareInfo.getFile().length()/(SoundCompareHandler.soundCompareConfig.audioFormat.getFrameSize()*SoundCompareHandler.soundCompareConfig.audioFormat.getFrameRate()));
 		}
-		sysMusicCompareRecord.setMonday(LocalDate.now().with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue()).toString());
+		sysMusicCompareRecord.setFeature(FeatureType.CLOUD_STUDY_EVALUATION);
 		sysMusicCompareRecordDao.insert(sysMusicCompareRecord);
+		studentDao.addStudentCloudStudySequenceDays(user.getId());
 	}
 
 	@Override

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

@@ -79,4 +79,27 @@
         FROM cloud_teacher
         WHERE student_id_ = #{studentId}
     </select>
-</mapper>
+
+    <select id="getOrganVipStudentNum" resultType="int">
+        SELECT COUNT(DISTINCT cto.student_id_)
+        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) AND su.organ_id_=#{organId}
+    </select>
+
+    <select id="getOrgansVipStudentNum" resultType="map">
+        SELECT
+            su.organ_id_ 'key',
+            COUNT(DISTINCT cto.student_id_) 'value'
+        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="organIds!=null and organIds.size()>0">
+            AND su.organ_id_ IN
+            <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                #{organId}
+            </foreach>
+        </if>
+        GROUP BY su.organ_id_
+    </select>
+</mapper>

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

@@ -39,6 +39,7 @@
         <result column="trans_status_" property="studentPaymentOrder.status"/>
         <result column="expect_amount_" property="studentPaymentOrder.expectAmount"/>
         <result column="pay_time_" property="studentPaymentOrder.payTime"/>
+        <result column="order_create_time_" property="studentPaymentOrder.createTime"/>
         <result column="name_" property="memberRankSetting.name"/>
         <result column="icon_" property="memberRankSetting.icon"/>
         <result column="music_group_id_" property="studentPaymentOrder.musicGroupId"/>
@@ -121,7 +122,7 @@
 
     <!-- 分页查询 -->
     <select id="queryPage" resultMap="CloudTeacherOrderDto" parameterType="map">
-        SELECT cto.*,spo.status_ trans_status_,spo.expect_amount_,spo.pay_time_,mrs.name_,mrs.icon_ FROM cloud_teacher_order cto
+        SELECT cto.*,spo.status_ trans_status_,spo.expect_amount_,spo.pay_time_,spo.create_time_ order_create_time_,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'

+ 12 - 0
mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml

@@ -765,4 +765,16 @@
 		AND vg.group_status_ IN (0,1,2)
 		ORDER BY vg.create_time_ DESC LIMIT 1
 	</select>
+
+    <select id="getHasVipCourseStudentIds" resultType="map">
+		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_='VIP' AND cs.del_flag_=0
+		<if test="studentIds!=null and studentIds.size()>0">
+			AND cssp.user_id_ IN
+			<foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+				#{studentId}
+			</foreach>
+		</if>
+	</select>
 </mapper>

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

@@ -906,7 +906,7 @@
     </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(MAX(cto.end_time_),NOW()) member_day_,sr.music_group_id_,MAX(sv.visit_time_) visit_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_

+ 11 - 0
mec-biz/src/main/resources/config/mybatis/OrganizationMapper.xml

@@ -148,6 +148,17 @@
         </foreach>
     </select>
 
+    <select id="getOrgans" resultMap="Organization">
+        SELECT * FROM organization
+        WHERE 1=1
+         <if test="organIds!=null and organIds.size()>0">
+             AND id_ IN
+             <foreach collection="organIds" item="organId" separator="," open="(" close=")">
+                 #{organId}
+             </foreach>
+         </if>
+    </select>
+
     <select id="getActivityOrgans" resultMap="Organization">
         SELECT o.* FROM practice_group_sell_price pgsp
         LEFT JOIN organization o ON pgsp.organ_id_=o.id_

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

@@ -74,6 +74,9 @@
         <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"/>
     </resultMap>
 
     <sql id="queryCondition">
@@ -167,7 +170,8 @@
 		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_
 		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_`
@@ -534,13 +538,21 @@
         <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"/>
     </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_
         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_

+ 191 - 0
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"/>
@@ -755,6 +758,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)
@@ -762,6 +766,170 @@
         AND DATEDIFF(MAX(cto.end_time_),NOW()) = #{pushMemberRenew}
     </select>
 
+    <select id="getOrganStudentNum" resultType="int">
+        SELECT COUNT(stu.user_id_) totalStudentNum
+        FROM student stu
+            LEFT JOIN sys_user su ON stu.user_id_=su.id_
+        WHERE su.del_flag_=0
+        <if test="organId!=null">
+            AND su.organ_id_=#{organId}
+        </if>
+    </select>
+
+    <select id="getOrgansStudentNum" resultType="map">
+        SELECT
+               su.organ_id_ 'key',
+               COUNT(stu.user_id_) 'value'
+        FROM student stu
+        LEFT JOIN sys_user su ON stu.user_id_=su.id_
+        WHERE su.del_flag_=0
+        <if test="organIds!=null and organIds.size()>0">
+            AND su.organ_id_ IN
+            <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                #{organId}
+            </foreach>
+        </if>
+        GROUP BY su.organ_id_
+    </select>
+
+    <select id="getCloudStudyStudentNum" resultType="int">
+        SELECT
+            COUNT(DISTINCT smcr.user_id_)
+        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 AND su.organ_id_=#{organId};
+    </select>
+
+    <select id="getOrganCloudStudyStudentNum" resultType="map">
+        SELECT
+            su.organ_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_
+        WHERE su.del_flag_=0 AND stu.user_id_ IS NOT NULL
+        <if test="organIds!=null and organIds.size()>0">
+            AND su.organ_id_ IN
+            <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                #{organId}
+            </foreach>
+        </if>
+        GROUP BY su.organ_id_
+    </select>
+
+    <select id="getCloudStudyLivelyStudentNum" resultType="int">
+        SELECT COUNT(user_id_)
+        FROM (SELECT
+            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 AND su.organ_id_=#{organId}
+            GROUP BY smcr.user_id_) t WHERE t.days>=5
+    </select>
+
+    <select id="getOrganCloudStudyLivelyStudentNum" resultType="map">
+        SELECT
+               t.organ_id_ 'key',
+               COUNT(user_id_) 'value'
+        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="organIds!=null and organIds.size()>0">
+                    AND su.organ_id_ IN
+                    <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                        #{organId}
+                    </foreach>
+                </if>
+              GROUP BY smcr.user_id_) t WHERE t.days>=5
+        GROUP BY t.organ_id_
+    </select>
+
+    <sql id="queryCloudStudyStudentDataCondition">
+        <where>
+            su.del_flag_=0
+            <if test="organId!=null">
+                AND su.organ_id_=#{organId}
+            </if>
+            <if test="search!=null and search!=''">
+                AND (stu.user_id_=#{search} OR su.username_ LIKE CONCAT('%', #{search}, '%'))
+            </if>
+        </where>
+    </sql>
+
+    <select id="queryCloudStudyStudentData" resultType="com.ym.mec.biz.dal.dto.EduOrganStudentListDto">
+        SELECT
+            stu.user_id_ studentId,
+            su.username_ studentName,
+            stu.teacher_id_ teacherId,
+            tea.real_name_ teacherName,
+            sub.name_	subjectName,
+            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
+        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_
+            LEFT JOIN `subject` sub ON stu.subject_id_list_ = sub.id_
+            LEFT JOIN sys_music_compare_record smcr ON stu.user_id_ = smcr.user_id_
+        <include refid="queryCloudStudyStudentDataCondition" />
+        GROUP BY stu.user_id_
+        <trim prefix="ORDER BY " suffixOverrides=",">
+            <if test="cloudStudyUseTime==null and cloudStudyRunningDays==null">
+                stu.user_id_,
+            </if>
+            <if test="cloudStudyUseTime!=null">
+                cloudStudyUseTime ${cloudStudyUseTime},
+            </if>
+            <if test="cloudStudyRunningDays!=null">
+                cloudStudyRunningDays ${cloudStudyRunningDays}
+            </if>
+        </trim>
+        <include refid="global.limit"></include>
+    </select>
+    <select id="countCloudStudyStudentData" resultType="int">
+        SELECT
+            COUNT(stu.user_id_)
+        FROM student stu
+        LEFT JOIN sys_user su ON stu.user_id_=su.id_
+        <include refid="queryCloudStudyStudentDataCondition" />
+    </select>
+
+    <select id="getOrganEVipStudentNum" resultType="int">
+        SELECT COUNT(DISTINCT stu.user_id_)
+        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 su.organ_id_=#{organId} AND stu.experience_member_rank_setting_id_ IS NOT NULL
+          AND NOT EXISTS (SELECT student_id_ FROM cloud_teacher_order WHERE student_id_=stu.user_id_ AND status_ IN (1,2))
+    </select>
+
+    <select id="getOrgansEVipStudentNum" resultType="map">
+        SELECT
+            su.organ_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 NOT EXISTS (SELECT student_id_ FROM cloud_teacher_order WHERE student_id_=stu.user_id_ AND 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=",">
+                #{organId}
+            </foreach>
+        </if>
+        GROUP BY su.organ_id_
+    </select>
+
     <update id="updateGrade"><![CDATA[
         UPDATE student SET current_grade_num_=current_grade_num_+1
         WHERE current_grade_num_>=1
@@ -780,8 +948,31 @@
         UPDATE student SET member_rank_setting_id_ = NULL,membership_start_time_ = NULL,membership_end_time_ = NULL
         WHERE DATEDIFF(NOW(),membership_end_time_) > 0
     </update>
+    <update id="cleanExperienceStudentMember">
+        UPDATE student SET experience_member_rank_setting_id_ = NULL,experience_membership_start_time_ = NULL,experience_membership_end_time_ = NULL
+        WHERE DATEDIFF(NOW(),experience_membership_end_time_) > 0
+    </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))
+    </update>
+
+    <update id="updateStudentsCloudStudySequenceDays">
+        UPDATE student SET cloud_study_sequence_days_=#{days} WHERE user_id_=#{userId}
+    </update>
+
+    <update id="cleanStudentCloudStudySequenceDays">
+        UPDATE student SET cloud_study_sequence_days_=0,cloud_study_use_last_day_=date_sub(curdate(), interval 1 day) WHERE cloud_study_use_last_day_&lt;date_sub(curdate(), interval 1 day)
+    </update>
 </mapper>

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

@@ -1674,4 +1674,18 @@
         WHERE sr.membership_end_time_ IS NOT NULL AND DATEDIFF(sr.membership_end_time_,NOW()) + 1 = #{pushMemberRenew}
         GROUP BY sr.music_group_id_
     </select>
+
+    <select id="queryStudentMusicGroupNamesMap" resultType="java.util.Map">
+        SELECT sr.user_id_ 'key',GROUP_CONCAT(mg.name_) 'value'
+        FROM student_registration sr
+             LEFT JOIN music_group mg ON sr.music_group_id_=mg.id_
+        WHERE 1=1
+        <if test="studentIds!=null and studentIds.size()>0">
+            AND sr.user_id_ IN
+            <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+                #{studentId}
+            </foreach>
+        </if>
+        GROUP BY sr.user_id_
+    </select>
 </mapper>

+ 11 - 0
mec-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml

@@ -222,4 +222,15 @@
 		LEFT JOIN student_registration sr ON sr.user_id_=smcr.user_id_
 		<include refid="queryMusicGroupStudentTrainDataConditon"></include>
 	</select>
+
+	<select id="queryStudentTrainData" resultType="com.ym.mec.biz.dal.dto.EduOrganStudentListDto">
+		SELECT
+			user_id_ studentId,
+			COUNT(DISTINCT behavior_id_) cloudStudyUseNum,
+			SUM(play_time_) cloudStudyUseTime
+		FROM
+			sys_music_compare_record
+		GROUP BY
+			user_id_
+	</select>
 </mapper>

+ 4 - 0
mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java

@@ -215,4 +215,8 @@ public interface TaskRemoteService {
 	//会员到期后清空会员信息
 	@GetMapping("task/cleanStudentMember")
     void cleanStudentMember();
+
+	/** 清理学员云教练连续使用天数 */
+	@GetMapping("task/cleanStudentCloudStudySequenceDays")
+	void cleanStudentCloudStudySequenceDays();
 }

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

@@ -267,4 +267,9 @@ public class TaskRemoteServiceFallback implements TaskRemoteService {
 	public void cleanStudentMember() {
 		logger.error("学员会员到期状态更新");
 	}
+
+	@Override
+	public void cleanStudentCloudStudySequenceDays() {
+		logger.error("清理学员云教练连续使用天数失败");
+	}
 }

+ 12 - 1
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;
@@ -179,7 +180,17 @@ public class StudentManageController extends BaseController {
 		} else {
 			datas.put("homeworkOpenFlag", Integer.parseInt(sysConfig.getParanValue()));
 		}
-
+        //是否是试用会员
+		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);
+            }
+        }
 		return succeed(datas);
 	}
 

+ 19 - 0
mec-task/src/main/java/com/ym/mec/task/jobs/CleanStudentCloudStudySequenceDays.java

@@ -0,0 +1,19 @@
+package com.ym.mec.task.jobs;
+
+import com.ym.mec.task.TaskRemoteService;
+import com.ym.mec.task.core.BaseTask;
+import com.ym.mec.task.core.TaskException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class CleanStudentCloudStudySequenceDays extends BaseTask {
+
+	@Autowired
+	private TaskRemoteService taskRemoteService;
+
+	@Override
+	public void execute() throws TaskException {
+		taskRemoteService.cleanStudentCloudStudySequenceDays();
+	}
+}

+ 1 - 1
mec-web/src/main/java/com/ym/mec/web/config/ResourceServerConfig.java

@@ -37,7 +37,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
                         "/uploadFile", "/eduContracts/queryProduceContract", "/activity/doubleEleven2020Statis", "/replacementInstrument/queryPage",
                         "/replacementInstrumentActivity/queryReplacementsStat", "/eduStudentRegistration/queryPreApplyList",
                         "/eduSubject/findSubSubjects", "/eduFinancialExpenditure/batchAdd", "/eduSendNotice/*",
-                        "/oaContracts/*").permitAll().anyRequest().authenticated().and().httpBasic();
+                        "/oaContracts/*", "/eduStudent/organStudentOverView").permitAll().anyRequest().authenticated().and().httpBasic();
     }
 
     @Override

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

@@ -24,10 +24,7 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @Api(tags = "学生管理")
 @RestController
@@ -382,6 +379,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')")

+ 6 - 0
mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

@@ -485,4 +485,10 @@ public class TaskController extends BaseController {
 	public void cleanStudentMember() {
 		studentServeService.cleanStudentMember();
 	}
+
+	@ApiOperation("清理学员云教练连续使用天数")
+	@GetMapping(value = "/cleanStudentCloudStudySequenceDays")
+	public void cleanStudentCloudStudySequenceDays(){
+		studentService.cleanStudentCloudStudySequenceDays();
+	}
 }

+ 54 - 0
mec-web/src/main/java/com/ym/mec/web/controller/education/EduStudentController.java

@@ -0,0 +1,54 @@
+package com.ym.mec.web.controller.education;
+
+import com.ym.mec.biz.dal.dto.EduOrganStudentDataDto;
+import com.ym.mec.biz.dal.dto.StatDto;
+import com.ym.mec.biz.dal.entity.Organization;
+import com.ym.mec.biz.dal.page.StudentQueryInfo;
+import com.ym.mec.biz.service.OrganizationService;
+import com.ym.mec.biz.service.StudentService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/17 0017
+ */
+@RequestMapping("eduStudent")
+@Api(tags = "学生信息服务")
+@RestController
+public class EduStudentController extends BaseController {
+
+    @Autowired
+    private StudentService studentService;
+    @Autowired
+    private OrganizationService organizationService;
+
+    @ApiOperation(value = "云教练学员数据")
+    @GetMapping("/organStudentData")
+    public HttpResponseResult<StatDto> organStudentData(StudentQueryInfo queryInfo){
+        return succeed(studentService.organStudentData(queryInfo));
+    }
+
+    @ApiOperation(value = "分部云教练学员数据预览")
+    @GetMapping("/organStudentOverView")
+    public HttpResponseResult<List<EduOrganStudentDataDto>> organStudentOverView() throws Exception {
+        List<Organization> organizations = organizationService.queryEmployeeOrgan();
+        if(CollectionUtils.isEmpty(organizations)){
+            return succeed(Collections.emptyList());
+        }
+        List<Integer> organIds = organizations.stream().map(Organization::getId).collect(Collectors.toList());
+        return succeed(studentService.organStudentOverView(organIds));
+    }
+
+}