Przeglądaj źródła

Merge branch 'music_score' into online1

Joburgess 3 lat temu
rodzic
commit
33ffbca6c8

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

@@ -20,6 +20,7 @@ public interface CloudTeacherDao extends BaseDAO<Long, CloudTeacher> {
     CloudTeacher getByStudentId(@Param("studentId") Integer studentId);
 
     int getOrganVipStudentNum(@Param("organId") Integer organId);
+    int getOrgansTotalVipStudentNum(@Param("organIds") List<Integer> organIds);
     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

@@ -542,4 +542,14 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
      */
     Set<Integer> getHasVipCourseStudentIds(@Param("studentIds") List<Integer> studentIds);
 
+    /**
+     * @describe 查询分部还有小课和网管课的学员数量
+     * @author Joburgess
+     * @date 2021/8/18 0018
+     * @param studentIds:
+     * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.Integer>>
+     */
+    int getHasVPCourseStudentNum(@Param("organId") Integer organId);
+    List<Map<Integer, Integer>> getOrganHasVPCourseStudentNum(@Param("organIds") List<Integer> organIds);
+
 }

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

@@ -320,4 +320,6 @@ public interface IndexBaseMonthDataDao extends BaseDAO<Long, IndexBaseMonthData>
     List<StudentLeaveCourseDto> queryStudentLeaveCourseList(Map<String, Object> params);
 
     List<Map<Integer, BigDecimal>> getStudentErrorLeaveNumMap(Map<String, Object> params);
+
+    List<IndexBaseMonthData> getOrgansStudentNumData(@Param("dayStr") String dayStr);
 }

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

@@ -250,6 +250,7 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
      * @return com.ym.mec.biz.dal.dto.EduOrganStudentDataDto
      */
     int getOrganStudentNum(@Param("organId") Integer organId);
+    int getOrgansTotalStudentNum(@Param("organIds") List<Integer> organIds);
     List<Map<Integer, Integer>> getOrgansStudentNum(@Param("organIds") List<Integer> organIds);
 
     /**
@@ -260,10 +261,21 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
      * @return int
      */
     int getCloudStudyStudentNum(@Param("organId") Integer organId);
+    int getOrgansTotalCloudStudyStudentNum(@Param("organIds") List<Integer> organIds);
     List<Map<Integer, Integer>> getOrganCloudStudyStudentNum(@Param("organIds") List<Integer> organIds);
 
+    /**
+     * @describe 统计云教练今日使用人数
+     * @author Joburgess
+     * @date 2021/8/18 0018
+     * @param organIds:
+     * @return int
+     */
+    int getOrgansTodayTotalCloudStudyStudentNum(@Param("organIds") List<Integer> organIds);
+
 
     int getCloudStudyLivelyStudentNum(@Param("organId") Integer organId);
+    int getOrganTotalCloudStudyLivelyStudentNum(@Param("organIds") List<Integer> organIds);
     List<Map<Integer, Integer>> getOrganCloudStudyLivelyStudentNum(@Param("organIds") List<Integer> organIds);
 
     /**
@@ -312,5 +324,6 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
      * @return int
      */
     int getOrganEVipStudentNum(@Param("organId") Integer organId);
+    int getOrgansTotalEVipStudentNum(@Param("organIds") List<Integer> organIds);
     List<Map<Integer, Integer>> getOrgansEVipStudentNum(@Param("organIds") List<Integer> organIds);
 }

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

@@ -50,5 +50,16 @@ public interface SysMusicCompareRecordDao extends BaseDAO<Long, SysMusicCompareR
     int countMusicGroupStudentTrainData(Map<String, Object> params);
 
     List<EduOrganStudentListDto> queryStudentTrainData(@Param("studentIds") List<Integer> studentIds);
+
+    /**
+     * @describe 统计分部云教练新增人数
+     * @author Joburgess
+     * @date 2021/8/18 0018
+     * @param organId:
+     * @return int
+     */
+    int getOrganNewCloudStudyNum(@Param("organId") Integer organId);
+    int getOrgansTotalNewCloudStudyNum(@Param("organIds") List<Integer> organIds);
+    List<Map<Integer, Integer>> getOrgansNewCloudStudyNum(@Param("organIds") List<Integer> organIds);
 	
 }

+ 130 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CloudStudyStudentDataDto.java

@@ -0,0 +1,130 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/16 0016
+ */
+public class CloudStudyStudentDataDto {
+
+    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 int cloudStudyTodayUseStudentNum;
+
+    @ApiModelProperty("云教练使用人数占比")
+    private float cloudStudyUseStudentDuty;
+
+    @ApiModelProperty("活跃人数")
+    private int cloudStudyLivelyStudentNum;
+
+    @ApiModelProperty("云教练新增人数")
+    private int newCloudStudyStudentNum;
+
+    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 getCloudStudyTodayUseStudentNum() {
+        return cloudStudyTodayUseStudentNum;
+    }
+
+    public void setCloudStudyTodayUseStudentNum(int cloudStudyTodayUseStudentNum) {
+        this.cloudStudyTodayUseStudentNum = cloudStudyTodayUseStudentNum;
+    }
+
+    public int getCloudStudyLivelyStudentNum() {
+        return cloudStudyLivelyStudentNum;
+    }
+
+    public void setCloudStudyLivelyStudentNum(int cloudStudyLivelyStudentNum) {
+        this.cloudStudyLivelyStudentNum = cloudStudyLivelyStudentNum;
+    }
+
+    public int getNewCloudStudyStudentNum() {
+        return newCloudStudyStudentNum;
+    }
+
+    public void setNewCloudStudyStudentNum(int newCloudStudyStudentNum) {
+        this.newCloudStudyStudentNum = newCloudStudyStudentNum;
+    }
+}

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

@@ -34,6 +34,9 @@ public class EduOrganStudentDataDto {
     @ApiModelProperty("活跃人数")
     private int cloudStudyLivelyStudentNum;
 
+    @ApiModelProperty("云教练新增人数")
+    private int newCloudStudyStudentNum;
+
     public Integer getOrganId() {
         return organId;
     }
@@ -105,4 +108,12 @@ public class EduOrganStudentDataDto {
     public void setCloudStudyLivelyStudentNum(int cloudStudyLivelyStudentNum) {
         this.cloudStudyLivelyStudentNum = cloudStudyLivelyStudentNum;
     }
+
+    public int getNewCloudStudyStudentNum() {
+        return newCloudStudyStudentNum;
+    }
+
+    public void setNewCloudStudyStudentNum(int newCloudStudyStudentNum) {
+        this.newCloudStudyStudentNum = newCloudStudyStudentNum;
+    }
 }

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/IndexDataType.java

@@ -69,6 +69,13 @@ public enum IndexDataType implements BaseEnum<String, IndexDataType> {
     QUIT_MUSIC_GROUP_STUDENT_NUM("QUIT_MUSIC_GROUP_STUDENT_NUM","退团学员", false, true),
     VIP_PRACTICE_STUDENT_NUM("VIP_PRACTICE_STUDENT_NUM", "VIP/网管在读", false, false),
     VIP_PRACTICE_ADD_STUDENT_NUM("VIP_PRACTICE_ADD_STUDENT_NUM", "VIP/网管新增", false, true),
+
+    //活跃用户统计
+    ORGAN_TOTAL_STUDENT_NUM("ORGAN_TOTAL_STUDENT_NUM", "分部学员总数", false, false),
+    CLOUD_STUDY_LIVELY_STUDENT_NUM("CLOUD_STUDY_LIVELY_STUDENT_NUM", "会员数量", false, false),
+    MEMBER_STUDENT_NUM("MEMBER_STUDENT_NUM", "会员数量", false, false),
+    EXPERIENCE_MEMBER_STUDENT_NUM("EXPERIENCE_MEMBER_STUDENT_NUM", "试用会员数量", false, false),
+    NEW_MEMBER_STUDENT_NUM("NEW_MEMBER_STUDENT_NUM", "新增会员数量", false, false),
     ;
 
     private String code;

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

@@ -3,6 +3,7 @@ package com.ym.mec.biz.service;
 import java.text.ParseException;
 import java.util.List;
 
+import com.ym.mec.biz.dal.dto.CloudStudyStudentDataDto;
 import com.ym.mec.biz.dal.dto.EduOrganStudentDataDto;
 import com.ym.mec.biz.dal.dto.StatDto;
 import com.ym.mec.biz.dal.entity.CloudTeacherOrder;
@@ -101,6 +102,8 @@ public interface StudentService extends BaseService<Integer, Student> {
 
     List<EduOrganStudentDataDto> organStudentOverView(List<Integer> organIds);
 
+    CloudStudyStudentDataDto getCloudStudyStudentOverView(List<Integer> organIds);
+
     /**
      * @describe 清理学员云教练连续使用天数
      * @author Joburgess

+ 35 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java

@@ -67,6 +67,8 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 	private StudentRegistrationDao studentRegistrationDao;
 	@Autowired
 	private MusicGroupPerformanceDao musicGroupPerformanceDao;
+	@Autowired
+	private StudentDao studentDao;
 
 	private static ThreadLocal<Set<Integer>> organIds = new ThreadLocal<Set<Integer>>(){
 		@Override
@@ -501,6 +503,39 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.VIP_PRACTICE_ADD_STUDENT_NUM)) {
 			saveData(indexBaseMonthDataDao.getVipPracticeAddStudentData(dayStr), dayStr, IndexDataType.VIP_PRACTICE_ADD_STUDENT_NUM);
 		}
+
+		//云教练相关
+//		List<Map<Integer, Integer>> organsStudentNumMapList = studentDao.getOrgansStudentNum(organIds);
+//		Map<String, Long> organsStudentNumMap = new HashMap<>();
+//		if(!CollectionUtils.isEmpty(organsStudentNumMapList)){
+//			organsStudentNumMap = MapUtil.convertIntegerMap(organsStudentNumMapList);
+//		}
+//		List<Map<Integer, Integer>> organsVipStudentNumMapList = cloudTeacherDao.getOrgansVipStudentNum(organIds);
+//		Map<String, Long> organsVipStudentNumMap = new HashMap<>();
+//		if(!CollectionUtils.isEmpty(organsVipStudentNumMapList)){
+//			organsVipStudentNumMap = MapUtil.convertIntegerMap(organsVipStudentNumMapList);
+//		}
+//		List<Map<Integer, Integer>> organsEVipStudentNumMapList = studentDao.getOrgansEVipStudentNum(organIds);
+//		Map<String, Long> organsEVipStudentNumMap = new HashMap<>();
+//		if(!CollectionUtils.isEmpty(organsEVipStudentNumMapList)){
+//			organsEVipStudentNumMap = MapUtil.convertIntegerMap(organsEVipStudentNumMapList);
+//		}
+//		List<Map<Integer, Integer>> organCloudStudyStudentNumMapList = studentDao.getOrganCloudStudyStudentNum(organIds);
+//		Map<String, Long> organCloudStudyStudentNumMap = new HashMap<>();
+//		if(!CollectionUtils.isEmpty(organCloudStudyStudentNumMapList)){
+//			organCloudStudyStudentNumMap = MapUtil.convertIntegerMap(organCloudStudyStudentNumMapList);
+//		}
+//		List<Map<Integer, Integer>> organCloudStudyLivelyStudentNumMapList = studentDao.getOrganCloudStudyLivelyStudentNum(organIds);
+//		Map<String, Long> organCloudStudyLivelyStudentNumMap = new HashMap<>();
+//		if(!CollectionUtils.isEmpty(organCloudStudyLivelyStudentNumMapList)){
+//			organCloudStudyLivelyStudentNumMap = MapUtil.convertIntegerMap(organCloudStudyLivelyStudentNumMapList);
+//		}
+//		List<Map<Integer, Integer>> organsNewCloudStudyNumMapList = sysMusicCompareRecordDao.getOrgansNewCloudStudyNum(organIds);
+//		Map<String, Long> organsNewCloudStudyNumMap = new HashMap<>();
+//		if(!CollectionUtils.isEmpty(organsNewCloudStudyNumMapList)){
+//			organsNewCloudStudyNumMap = MapUtil.convertIntegerMap(organsNewCloudStudyNumMapList);
+//		}
+
 	}
 
 	/**

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

@@ -416,6 +416,7 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
             organStudentVipData.seteVipStudentNum(studentDao.getOrganEVipStudentNum(queryInfo.getOrganId()));
             organStudentVipData.setCloudStudyUseStudentNum(studentDao.getCloudStudyStudentNum(queryInfo.getOrganId()));
             organStudentVipData.setCloudStudyLivelyStudentNum(studentDao.getCloudStudyLivelyStudentNum(queryInfo.getOrganId()));
+            organStudentVipData.setNewCloudStudyStudentNum(sysMusicCompareRecordDao.getOrganNewCloudStudyNum(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());
             }
@@ -459,6 +460,11 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
         if(!CollectionUtils.isEmpty(organCloudStudyLivelyStudentNumMapList)){
             organCloudStudyLivelyStudentNumMap = MapUtil.convertIntegerMap(organCloudStudyLivelyStudentNumMapList);
         }
+        List<Map<Integer, Integer>> organsNewCloudStudyNumMapList = sysMusicCompareRecordDao.getOrgansNewCloudStudyNum(organIds);
+        Map<String, Long> organsNewCloudStudyNumMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(organsNewCloudStudyNumMapList)){
+            organsNewCloudStudyNumMap = MapUtil.convertIntegerMap(organsNewCloudStudyNumMapList);
+        }
 
         List<EduOrganStudentDataDto> result = new ArrayList<>();
 
@@ -487,12 +493,31 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
             if(organStudentVipData.getCloudStudyUseStudentNum()>0&&organStudentVipData.getTotalStudentNum()>0){
                 organStudentVipData.setCloudStudyUseStudentDuty(new BigDecimal(organStudentVipData.getCloudStudyUseStudentNum()).divide(new BigDecimal(organStudentVipData.getTotalStudentNum()), 4, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)).floatValue());
             }
+            if(organsNewCloudStudyNumMap.containsKey(organ.getId().toString())){
+                organStudentVipData.setNewCloudStudyStudentNum(organsNewCloudStudyNumMap.get(organ.getId().toString()).intValue());
+            }
             result.add(organStudentVipData);
         }
         return result;
     }
 
     @Override
+    public CloudStudyStudentDataDto getCloudStudyStudentOverView(List<Integer> organIds) {
+        CloudStudyStudentDataDto result = new CloudStudyStudentDataDto();
+        result.setTotalStudentNum(studentDao.getOrgansTotalStudentNum(organIds));
+        result.setVipStudentNum(cloudTeacherDao.getOrgansTotalVipStudentNum(organIds));
+        result.seteVipStudentNum(studentDao.getOrgansTotalEVipStudentNum(organIds));
+        result.setCloudStudyUseStudentNum(studentDao.getOrgansTotalCloudStudyStudentNum(organIds));
+        result.setCloudStudyTodayUseStudentNum(studentDao.getOrgansTodayTotalCloudStudyStudentNum(organIds));
+        result.setCloudStudyLivelyStudentNum(studentDao.getOrganTotalCloudStudyLivelyStudentNum(organIds));
+        result.setNewCloudStudyStudentNum(sysMusicCompareRecordDao.getOrgansTotalNewCloudStudyNum(organIds));
+        if(result.getVipStudentNum()>0&&result.getTotalStudentNum()>0){
+            result.setVipStudentDuty(new BigDecimal(result.getVipStudentNum()).divide(new BigDecimal(result.getTotalStudentNum()), 4, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)).floatValue());
+        }
+        return result;
+    }
+
+    @Override
     public void cleanStudentCloudStudySequenceDays() {
         studentDao.cleanStudentCloudStudySequenceDays();
     }

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

@@ -87,6 +87,19 @@
         WHERE su.del_flag_=0 AND cto.status_ IN (1,2) AND su.organ_id_=#{organId}
     </select>
 
+    <select id="getOrgansTotalVipStudentNum" 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)
+        <if test="organIds!=null and organIds.size()>0">
+            AND su.organ_id_ IN
+            <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                #{organId}
+            </foreach>
+        </if>
+    </select>
+
     <select id="getOrgansVipStudentNum" resultType="map">
         SELECT
             su.organ_id_ 'key',

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

@@ -777,4 +777,40 @@
 			</foreach>
 		</if>
 	</select>
+
+	<select id="getHasVPCourseStudentNum" resultType="int">
+		SELECT
+			COUNT( DISTINCT cssp.user_id_ )
+		FROM
+			course_schedule_student_payment cssp
+			LEFT JOIN course_schedule cs ON cssp.course_schedule_id_=cs.id_
+			LEFT JOIN sys_user su ON cssp.user_id_ = su.id_
+		WHERE
+			cssp.group_type_ IN ('VIP', 'PRACTICE')
+			AND cs.status_='NOT_START'
+			AND su.del_flag_ = 0
+			AND su.organ_id_ = #{organId}
+	</select>
+
+    <select id="getOrganHasVPCourseStudentNum" resultType="map">
+		SELECT
+			su.organ_id_ 'key',
+			COUNT( DISTINCT cssp.user_id_ ) 'value'
+		FROM
+			course_schedule_student_payment cssp
+				LEFT JOIN course_schedule cs ON cssp.course_schedule_id_=cs.id_
+				LEFT JOIN sys_user su ON cssp.user_id_ = su.id_
+		WHERE
+			cssp.group_type_ IN ('VIP', 'PRACTICE')
+			  AND cs.status_='NOT_START'
+			  AND su.del_flag_ = 0
+			<if test="studentIds!=null and studentIds.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>

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

@@ -1643,4 +1643,29 @@
 		GROUP BY sa.user_id_,DATE_FORMAT(cs.class_date_,'%Y-%m') HAVING COUNT(sa.id_) > 1 AND COUNT(sa.id_) > SUM(sa.leave_visit_flag_) ORDER BY cs.class_date_ DESC)c
 		GROUP BY c.user_id_
 	</select>
+
+	<select id="getOrgansStudentNumData" resultMap="IndexBaseMonthData">
+		SELECT
+		su.organ_id_,
+		#{dayStr} month_,
+		COUNT( DISTINCT s.user_id_ ) total_num_,
+		COUNT( DISTINCT s.user_id_ ) activate_num_,
+		COUNT( DISTINCT s.user_id_ ) percent_
+		FROM
+		sys_user su
+		LEFT JOIN course_schedule_student_payment s ON su.id_=s.user_id_
+		LEFT JOIN course_schedule_student_payment cssp1 ON s.user_id_=cssp1.user_id_ AND cssp1.create_time_&lt;#{dayStr}
+		LEFT JOIN course_schedule m ON s.course_schedule_id_=m.id_
+		WHERE
+		m.del_flag_ = 0
+		AND (m.is_lock_ = 0 OR m.is_lock_ IS NULL)
+		AND cssp1.id_ IS NULL
+		AND su.organ_id_ IS NOT NULL
+		AND m.group_type_ IN ('VIP', 'PRACTICE')
+		<if test="dayStr!=null and dayStr!=''">
+			AND DATE_FORMAT(s.create_time_, '%Y-%m-%d') = #{dayStr}
+		</if>
+		GROUP BY su.organ_id_
+		ORDER BY su.organ_id_;
+	</select>
 </mapper>

+ 137 - 14
mec-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -763,29 +763,90 @@
     </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 COUNT(DISTINCT user_id_)
+        FROM ((SELECT sr.user_id_
+               FROM student_registration sr
+                        LEFT JOIN sys_user su ON sr.user_id_=su.id_
+               WHERE su.del_flag_=0
+                 AND sr.music_group_status_='NORMAL'
+                 AND su.organ_id_ = #{organId})
+              UNION ALL
+              (SELECT
+                   cssp.user_id_
+               FROM
+                   course_schedule_student_payment cssp
+                       LEFT JOIN course_schedule cs ON cssp.course_schedule_id_=cs.id_
+                       LEFT JOIN sys_user su ON cssp.user_id_ = su.id_
+               WHERE
+                   cssp.group_type_ IN ('VIP', 'PRACTICE')
+                 AND cs.status_='NOT_START'
+                 AND su.del_flag_ = 0
+                 AND su.organ_id_ = #{organId})) t
+    </select>
+
+    <select id="getOrgansTotalStudentNum" resultType="int">
+        SELECT COUNT(DISTINCT user_id_)
+        FROM ((SELECT sr.user_id_
+               FROM student_registration sr
+                        LEFT JOIN sys_user su ON sr.user_id_=su.id_
+               WHERE su.del_flag_=0
+                 AND sr.music_group_status_='NORMAL'
+                <if test="organIds!=null and organIds.size()>0">
+                    AND su.organ_id_ IN
+                    <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                        #{organId}
+                    </foreach>
+                </if>)
+              UNION ALL
+              (SELECT
+                   cssp.user_id_
+               FROM
+                   course_schedule_student_payment cssp
+                       LEFT JOIN course_schedule cs ON cssp.course_schedule_id_=cs.id_
+                       LEFT JOIN sys_user su ON cssp.user_id_ = su.id_
+               WHERE
+                   cssp.group_type_ IN ('VIP', 'PRACTICE')
+                 AND cs.status_='NOT_START'
+                 AND su.del_flag_ = 0
+                <if test="organIds!=null and organIds.size()>0">
+                    AND su.organ_id_ IN
+                    <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                        #{organId}
+                    </foreach>
+                </if>)) t
     </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_
+        SELECT t.organ_id_ 'key',COUNT(DISTINCT user_id_) 'value'
+        FROM ((SELECT su.organ_id_,sr.user_id_
+        FROM student_registration sr
+        LEFT JOIN sys_user su ON sr.user_id_=su.id_
         WHERE su.del_flag_=0
+        AND sr.music_group_status_='NORMAL'
         <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_
+        </if>)
+        UNION ALL
+        (SELECT
+        su.organ_id_,cssp.user_id_
+        FROM
+        course_schedule_student_payment cssp
+        LEFT JOIN course_schedule cs ON cssp.course_schedule_id_=cs.id_
+        LEFT JOIN sys_user su ON cssp.user_id_ = su.id_
+        WHERE
+        cssp.group_type_ IN ('VIP', 'PRACTICE')
+        AND cs.status_='NOT_START'
+        AND su.del_flag_ = 0
+        <if test="organIds!=null and organIds.size()>0">
+            AND su.organ_id_ IN
+            <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                #{organId}
+            </foreach>
+        </if>)) t
+        GROUP BY t.organ_id_
     </select>
 
     <select id="getCloudStudyStudentNum" resultType="int">
@@ -797,6 +858,36 @@
         WHERE su.del_flag_=0 AND stu.user_id_ IS NOT NULL AND su.organ_id_=#{organId};
     </select>
 
+    <select id="getOrgansTotalCloudStudyStudentNum" 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
+        <if test="organIds!=null and organIds.size()>0">
+            AND su.organ_id_ IN
+            <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                #{organId}
+            </foreach>
+        </if>
+    </select>
+
+    <select id="getOrgansTodayTotalCloudStudyStudentNum" 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
+        <if test="organIds!=null and organIds.size()>0">
+            AND su.organ_id_ IN
+            <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                #{organId}
+            </foreach>
+        </if>
+    </select>
+
     <select id="getOrganCloudStudyStudentNum" resultType="map">
         SELECT
             su.organ_id_ 'key',
@@ -826,6 +917,24 @@
             GROUP BY smcr.user_id_) t WHERE t.days>=5
     </select>
 
+    <select id="getOrganTotalCloudStudyLivelyStudentNum" 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
+                <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
+    </select>
+
     <select id="getOrganCloudStudyLivelyStudentNum" resultType="map">
         SELECT
                t.organ_id_ 'key',
@@ -908,6 +1017,20 @@
           AND NOT EXISTS (SELECT student_id_ FROM cloud_teacher_order WHERE student_id_=stu.user_id_ AND status_ IN (1,2))
     </select>
 
+    <select id="getOrgansTotalEVipStudentNum" 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 stu.experience_member_rank_setting_id_ IS NOT NULL AND (cto.id_ IS NULL OR cto.status_ NOT 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>
+    </select>
+
     <select id="getOrgansEVipStudentNum" resultType="map">
         SELECT
             su.organ_id_ 'key',

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

@@ -233,4 +233,81 @@
 		GROUP BY
 			user_id_
 	</select>
+
+	<select id="getOrganNewCloudStudyNum" resultType="int">
+		SELECT
+			COUNT( DISTINCT user_id_ )
+		FROM
+			(
+				SELECT
+					smcr.user_id_
+				FROM
+					sys_music_compare_record smcr
+						LEFT JOIN sys_user su ON smcr.user_id_ = su.id_
+				WHERE
+					su.del_flag_ = 0
+					AND su.organ_id_ = #{organId}
+				GROUP BY
+					user_id_
+				HAVING
+						COUNT(
+								DISTINCT DATE( smcr.create_time_ ))= 1
+				   AND MAX(
+							   DATE( smcr.create_time_ ))= CURDATE()) t
+	</select>
+
+	<select id="getOrgansTotalNewCloudStudyNum" resultType="int">
+		SELECT
+			COUNT( DISTINCT user_id_ )
+		FROM
+			(
+				SELECT
+					smcr.user_id_
+				FROM
+					sys_music_compare_record smcr
+						LEFT JOIN sys_user su ON smcr.user_id_ = su.id_
+				WHERE
+					su.del_flag_ = 0
+					<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
+					user_id_
+				HAVING
+						COUNT(DISTINCT DATE( smcr.create_time_ ))= 1
+				   AND MAX(DATE( smcr.create_time_ ))= CURDATE()) t
+	</select>
+
+	<select id="getOrgansNewCloudStudyNum" resultType="map">
+		SELECT
+			organ_id_ 'key',
+			COUNT( DISTINCT user_id_ ) 'value'
+		FROM
+			(
+				SELECT
+					su.organ_id_,
+					smcr.user_id_
+				FROM
+					sys_music_compare_record smcr
+						LEFT JOIN sys_user su ON smcr.user_id_ = su.id_
+				WHERE
+					su.del_flag_ = 0
+					<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
+					user_id_
+				HAVING
+						COUNT(
+								DISTINCT DATE( smcr.create_time_ ))= 1
+				   AND MAX(
+							   DATE( smcr.create_time_ ))= CURDATE()) t
+		GROUP BY t.organ_id_
+	</select>
 </mapper>

+ 43 - 6
mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java

@@ -3,9 +3,9 @@ package com.ym.mec.web.controller;
 import com.ym.mec.auth.api.client.SysUserFeignService;
 import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.EmployeeDao;
-import com.ym.mec.biz.dal.dto.ActivityCourseDetailDto;
-import com.ym.mec.biz.dal.dto.UpdateStudentFeeDto;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.Employee;
+import com.ym.mec.biz.dal.entity.Organization;
 import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.page.*;
 import com.ym.mec.biz.service.*;
@@ -19,15 +19,14 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.GetMapping;
 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.*;
+import java.util.stream.Collectors;
 
 @Api(tags = "学生管理")
 @RestController
@@ -48,6 +47,8 @@ public class StudentManageController extends BaseController {
     private EmployeeDao employeeDao;
     @Autowired
     private StudentService studentService;
+    @Autowired
+    private OrganizationService organizationService;
 
     private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
 
@@ -414,4 +415,40 @@ public class StudentManageController extends BaseController {
         }
         return succeed(false);
     }
+
+    @ApiOperation(value = "云教练学员数据预览")
+    @GetMapping("/getCloudStudyStudentOverView")
+    @PreAuthorize("@pcs.hasPermissions('studentManage/getCloudStudyStudentOverView')")
+    public HttpResponseResult<CloudStudyStudentDataDto> getCloudStudyStudentOverView(String organIds) throws Exception {
+        List<Integer> organIdsList = new ArrayList<>();
+        if(StringUtils.isNotBlank(organIds)){
+            organIdsList = Arrays.stream(organIds.split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toList());
+        }else{
+            List<Organization> organizations = organizationService.queryEmployeeOrgan();
+            if(CollectionUtils.isEmpty(organizations)){
+                return succeed();
+            }
+            organIdsList = organizations.stream().map(Organization::getId).collect(Collectors.toList());
+        }
+        return succeed(studentService.getCloudStudyStudentOverView(organIdsList));
+    }
+
+    @ApiOperation(value = "分部云教练学员数据预览")
+    @GetMapping("/organStudentOverView")
+    @PreAuthorize("@pcs.hasPermissions('studentManage/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));
+    }
+
+    @ApiOperation(value = "云教练学员数据")
+    @GetMapping("/organStudentData")
+    @PreAuthorize("@pcs.hasPermissions('studentManage/organStudentData')")
+    public HttpResponseResult<StatDto> organStudentData(StudentQueryInfo queryInfo){
+        return succeed(studentService.organStudentData(queryInfo));
+    }
 }