浏览代码

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

 Conflicts:
	mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
	mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java
	mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
	mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
zouxuan 3 年之前
父节点
当前提交
2331b5a0fa
共有 25 个文件被更改,包括 905 次插入11 次删除
  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. 73 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. 31 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentQueryInfo.java
  10. 22 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java
  11. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  12. 137 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  13. 11 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java
  14. 24 1
      mec-biz/src/main/resources/config/mybatis/CloudTeacherMapper.xml
  15. 12 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  16. 11 0
      mec-biz/src/main/resources/config/mybatis/OrganizationMapper.xml
  17. 176 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  18. 14 0
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  19. 11 0
      mec-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml
  20. 4 0
      mec-client-api/src/main/java/com/ym/mec/task/TaskRemoteService.java
  21. 5 0
      mec-client-api/src/main/java/com/ym/mec/task/fallback/TaskRemoteServiceFallback.java
  22. 19 0
      mec-task/src/main/java/com/ym/mec/task/jobs/CleanStudentCloudStudySequenceDays.java
  23. 1 1
      mec-web/src/main/java/com/ym/mec/web/config/ResourceServerConfig.java
  24. 6 0
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java
  25. 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

+ 73 - 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;
@@ -258,4 +255,76 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
     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;
+    }
+}

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

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

@@ -4,6 +4,8 @@ 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;
@@ -11,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> {
@@ -95,4 +98,23 @@ public interface StudentService extends BaseService<Integer, Student> {
      * @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();
 }

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

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

@@ -1,28 +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;
 
@@ -54,6 +57,15 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     @Autowired
     private SysMessageService sysMessageService;
 
+    @Autowired
+    private SysMusicCompareRecordDao sysMusicCompareRecordDao;
+
+    @Autowired
+    private CloudTeacherDao cloudTeacherDao;
+
+    @Autowired
+    private OrganizationDao organizationDao;
+
     @Override
     public BaseDAO<Integer, Student> getDAO() {
         return studentDao;
@@ -438,4 +450,126 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
                     "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>

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

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

+ 176 - 0
mec-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -766,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
@@ -799,4 +963,16 @@
         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("清理学员云教练连续使用天数失败");
+	}
 }

+ 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

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