Browse Source

学员小课数据统计

zouxuan 3 years ago
parent
commit
bf922c1933

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

@@ -389,4 +389,15 @@ public interface IndexBaseMonthDataDao extends BaseDAO<Long, IndexBaseMonthData>
      */
     List<CloudTeacherActiveTargetDto> countCloudTeacherActive(Map<String, Object> params);
 
+    //获取vip课订单数量
+    List<IndexBaseMonthData> getStudentVipOrderNum(@Param("dayStr") String dayStr,@Param("tenantId") Integer tenantId);
+
+    //获取乐理课订单数量
+    List<IndexBaseMonthData> getStudentTheoryOrderNum(@Param("dayStr") String dayStr,@Param("tenantId") Integer tenantId);
+
+    //获取网管课订单数量
+    List<IndexBaseMonthData> getStudentPracticeOrderNum(@Param("dayStr") String dayStr,@Param("tenantId") Integer tenantId);
+
+    //小课回访数量
+    List<IndexBaseMonthData> getStudentLostNum(@Param("dayStr") String dayStr, @Param("purpose") String purpose,@Param("tenantId") Integer tenantId);
 }

+ 18 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentStatisticsDao.java

@@ -4,6 +4,7 @@ import com.ym.mec.biz.dal.dto.StudentStatisticsDto;
 import com.ym.mec.biz.dal.dto.StudentStatisticsSumDto;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.biz.dal.entity.StudentStatistics;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
@@ -37,4 +38,21 @@ public interface StudentStatisticsDao extends BaseDAO<Integer, StudentStatistics
 
     //汇总小课数据
     StudentStatisticsSumDto studentSmallClassStatisticsSum(String groupType);
+
+    //统计新增人数
+    Integer countAddStudentNum(@Param("groupType") String groupType, @Param("startDate") String startDate, @Param("endDate") String endDate);
+
+    //统计续费人数
+    Integer countRenewStudentNum(@Param("groupType") String groupType, @Param("endDate") String endDate);
+
+    //统计回访人数
+    Integer countVisitNum(@Param("groupType") String groupType, @Param("startDate") String startDate, @Param("endDate") String endDate);
+
+    Integer countLostStudentNum(@Param("groupType") String groupType, @Param("startDate") String startDate, @Param("endDate") String endDate);
+
+    //获取指导老师列表
+    List<Integer> queryTeacherIds(@Param("groupType") String groupType);
+
+    //获取乐团主管
+    List<Integer> queryDirectorList(@Param("groupType") String groupType);
 }

+ 0 - 44
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentStatisticsSumDto.java

@@ -34,18 +34,6 @@ public class StudentStatisticsSumDto {
     @ApiModelProperty(value = "未排课课时:活动资格【未排课】课程总数(1v多不去重)",required = false)
     private Integer noScheduleNum;
 
-    @ApiModelProperty(value = "流失人数",required = false)
-    private Integer lostNum;
-
-    @ApiModelProperty(value = "新增人数:以前没课,所选时间段内新增课程或排课资格的学员",required = false)
-    private Integer addNum;
-
-    @ApiModelProperty(value = "续费人数:所选结束时间之前有多笔大于0元的付费订单(活动赠送不算)",required = false)
-    private Integer renewNum;
-
-    @ApiModelProperty(value = "回访人数",required = false)
-    private Integer visitNum;
-
     public Integer getSleepStudentNum() {
         return sleepStudentNum;
     }
@@ -125,36 +113,4 @@ public class StudentStatisticsSumDto {
     public void setNoScheduleNum(Integer noScheduleNum) {
         this.noScheduleNum = noScheduleNum;
     }
-
-    public Integer getLostNum() {
-        return lostNum;
-    }
-
-    public void setLostNum(Integer lostNum) {
-        this.lostNum = lostNum;
-    }
-
-    public Integer getAddNum() {
-        return addNum;
-    }
-
-    public void setAddNum(Integer addNum) {
-        this.addNum = addNum;
-    }
-
-    public Integer getRenewNum() {
-        return renewNum;
-    }
-
-    public void setRenewNum(Integer renewNum) {
-        this.renewNum = renewNum;
-    }
-
-    public Integer getVisitNum() {
-        return visitNum;
-    }
-
-    public void setVisitNum(Integer visitNum) {
-        this.visitNum = visitNum;
-    }
 }

+ 49 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentStatisticsSumForDateDto.java

@@ -0,0 +1,49 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+public class StudentStatisticsSumForDateDto {
+    @ApiModelProperty(value = "流失人数",required = false)
+    private Integer lostNum;
+
+    @ApiModelProperty(value = "新增人数:以前没课,所选时间段内新增课程或排课资格的学员",required = false)
+    private Integer addNum;
+
+    @ApiModelProperty(value = "续费人数:所选结束时间之前有多笔大于0元的付费订单(活动赠送不算)",required = false)
+    private Integer renewNum;
+
+    @ApiModelProperty(value = "回访人数",required = false)
+    private Integer visitNum;
+
+    public Integer getLostNum() {
+        return lostNum;
+    }
+
+    public void setLostNum(Integer lostNum) {
+        this.lostNum = lostNum;
+    }
+
+    public Integer getAddNum() {
+        return addNum;
+    }
+
+    public void setAddNum(Integer addNum) {
+        this.addNum = addNum;
+    }
+
+    public Integer getRenewNum() {
+        return renewNum;
+    }
+
+    public void setRenewNum(Integer renewNum) {
+        this.renewNum = renewNum;
+    }
+
+    public Integer getVisitNum() {
+        return visitNum;
+    }
+
+    public void setVisitNum(Integer visitNum) {
+        this.visitNum = visitNum;
+    }
+}

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

@@ -83,6 +83,14 @@ public enum IndexDataType implements BaseEnum<String, IndexDataType> {
 
     CLOUD_STUDY_TRAIN_NUM("CLOUD_STUDY_TRAIN_NUM", "团练宝训练次数", false, false),
     CLOUD_STUDY_TRAIN_TIME("CLOUD_STUDY_TRAIN_TIME", "团练宝训练时长", false, false),
+
+    //小课数据统计
+    STUDENT_VIP_ORDER_NUM("STUDENT_VIP_ORDER_NUM", "学员vip课订单数量", false, false),
+    STUDENT_THEORY_ORDER_NUM("STUDENT_THEORY_ORDER_NUM", "学员乐理课订单数量", false, false),
+    STUDENT_PRACTICE_ORDER_NUM("STUDENT_PRACTICE_ORDER_NUM", "学员网管课订单数量", false, false),
+    STUDENT_VIP_LOST_NUM("STUDENT_VIP_LOST_NUM", "学员vip课流失数量", false, false),
+    STUDENT_THEORY_LOST_NUM("STUDENT_THEORY_LOST_NUM", "学员乐理课流失数量", false, false),
+    STUDENT_PRACTICE_LOST_NUM("STUDENT_PRACTICE_LOST_NUM", "学员网管课流失数量", false, false),
     ;
 
     private String code;

+ 16 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentStatisticsService.java

@@ -2,17 +2,33 @@ package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.StudentStatisticsDto;
 import com.ym.mec.biz.dal.dto.StudentStatisticsSumDto;
+import com.ym.mec.biz.dal.dto.StudentStatisticsSumForDateDto;
 import com.ym.mec.biz.dal.entity.StudentStatistics;
 import com.ym.mec.biz.dal.page.StudentStatisticsQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
 
+import java.util.List;
+import java.util.Map;
+
 public interface StudentStatisticsService extends BaseService<Integer, StudentStatistics> {
 
+    //定时任务
     void updateStudentStatistics();
 
+    //分页查询学员小课数据
     PageInfo<StudentStatisticsDto> queryStatisticsPage(StudentStatisticsQueryInfo queryInfo);
 
+    //获取小课数据统计汇总
     StudentStatisticsSumDto studentSmallClassStatisticsSum(String groupType);
+
+    //按时间获取统计数据
+    StudentStatisticsSumForDateDto studentSmallClassStatisticsSumForDate(String groupType, String startDate, String endDate);
+
+    //获取指导老师列表
+    List<Map<Integer, String>> queryTeacherList(String groupType);
+
+    //获取乐团主管列表
+    List<Map<Integer, String>> queryDirectorList(String groupType);
 }

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

@@ -458,6 +458,26 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			saveData(indexBaseMonthDataDao.getGroupCourseDataWithGroup(dayStr, null, null, GroupType.MUSIC, null, null, null,tenantId), dayStr, IndexDataType.MUSIC_GROUP_COURSE, tenantId);
 		}
 
+		//小课数据统计
+		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(STUDENT_VIP_ORDER_NUM)) {
+			saveData(indexBaseMonthDataDao.getStudentVipOrderNum(dayStr,tenantId), dayStr, IndexDataType.STUDENT_VIP_ORDER_NUM, tenantId);
+		}
+		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(STUDENT_THEORY_ORDER_NUM)) {
+			saveData(indexBaseMonthDataDao.getStudentTheoryOrderNum(dayStr,tenantId), dayStr, IndexDataType.STUDENT_THEORY_ORDER_NUM, tenantId);
+		}
+		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(STUDENT_PRACTICE_ORDER_NUM)) {
+			saveData(indexBaseMonthDataDao.getStudentPracticeOrderNum(dayStr,tenantId), dayStr, IndexDataType.STUDENT_PRACTICE_ORDER_NUM, tenantId);
+		}
+		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(STUDENT_VIP_LOST_NUM)) {
+			saveData(indexBaseMonthDataDao.getStudentLostNum(dayStr,"VIP课回访",tenantId), dayStr, IndexDataType.STUDENT_VIP_LOST_NUM, tenantId);
+		}
+		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(STUDENT_THEORY_LOST_NUM)) {
+			saveData(indexBaseMonthDataDao.getStudentLostNum(dayStr, "乐理课回访",tenantId), dayStr, IndexDataType.STUDENT_THEORY_LOST_NUM, tenantId);
+		}
+		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(STUDENT_PRACTICE_LOST_NUM)) {
+			saveData(indexBaseMonthDataDao.getStudentLostNum(dayStr, "网管课回访",tenantId), dayStr, IndexDataType.STUDENT_PRACTICE_LOST_NUM, tenantId);
+		}
+
 		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.VIP_GROUP_COURSE)) {
 			List<IndexBaseMonthData> vipCourseData = indexBaseMonthDataDao.getGroupCourseDataWithGroup(dayStr, null, null, GroupType.VIP, null, null, null,tenantId);
 			List<OrganVipGroupCategoryCourseNumDto> vipGroupCategoryCourseData = indexBaseMonthDataDao.getVipGroupCategoryCourseData(dayStr, null, null, GroupType.VIP, null, null, null,tenantId);

+ 40 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentStatisticsServiceImpl.java

@@ -1,9 +1,12 @@
 package com.ym.mec.biz.service.impl;
 
+import com.ym.mec.biz.dal.dao.IndexBaseMonthDataDao;
 import com.ym.mec.biz.dal.dao.StudentBasicInfoDao;
 import com.ym.mec.biz.dal.dao.StudentStatisticsDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.dto.StudentStatisticsDto;
 import com.ym.mec.biz.dal.dto.StudentStatisticsSumDto;
+import com.ym.mec.biz.dal.dto.StudentStatisticsSumForDateDto;
 import com.ym.mec.biz.dal.entity.StudentStatistics;
 import com.ym.mec.biz.dal.page.StudentStatisticsQueryInfo;
 import com.ym.mec.biz.service.StudentStatisticsService;
@@ -11,14 +14,13 @@ import com.ym.mec.common.dal.BaseDAO;
 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.common.tenant.TenantContextHolder;
 import com.ym.mec.util.collection.MapUtil;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @Service
 public class StudentStatisticsServiceImpl extends BaseServiceImpl<Integer, StudentStatistics>  implements StudentStatisticsService {
@@ -26,6 +28,8 @@ public class StudentStatisticsServiceImpl extends BaseServiceImpl<Integer, Stude
 	@Autowired
 	private StudentStatisticsDao studentStatisticsDao;
 	@Autowired
+	private TeacherDao teacherDao;
+	@Autowired
 	private StudentBasicInfoDao studentBasicInfoDao;
 
 	@Override
@@ -77,4 +81,36 @@ public class StudentStatisticsServiceImpl extends BaseServiceImpl<Integer, Stude
     public StudentStatisticsSumDto studentSmallClassStatisticsSum(String groupType) {
 		return studentStatisticsDao.studentSmallClassStatisticsSum(groupType);
     }
+
+    @Override
+    public StudentStatisticsSumForDateDto studentSmallClassStatisticsSumForDate(String groupType, String startDate, String endDate) {
+		StudentStatisticsSumForDateDto sumForDateDto = new StudentStatisticsSumForDateDto();
+		//获取流失人数
+		sumForDateDto.setLostNum(studentStatisticsDao.countLostStudentNum(groupType,startDate,endDate));
+		//获取新增人数
+		sumForDateDto.setAddNum(studentStatisticsDao.countAddStudentNum(groupType,startDate,endDate));
+		//获取续费人数
+		sumForDateDto.setRenewNum(studentStatisticsDao.countRenewStudentNum(groupType,endDate));
+		//获取回访人数
+		sumForDateDto.setVisitNum(studentStatisticsDao.countVisitNum(groupType,startDate,endDate));
+        return sumForDateDto;
+    }
+
+	@Override
+	public List<Map<Integer, String>> queryTeacherList(String groupType) {
+		List<Integer> teacherIds = studentStatisticsDao.queryTeacherIds(groupType);
+		if(CollectionUtils.isNotEmpty(teacherIds)){
+			return teacherDao.queryNameByIdList(teacherIds);
+		}
+		return new ArrayList<>();
+	}
+
+	@Override
+	public List<Map<Integer, String>> queryDirectorList(String groupType) {
+		List<Integer> teacherIds = studentStatisticsDao.queryDirectorList(groupType);
+		if(CollectionUtils.isNotEmpty(teacherIds)){
+			return teacherDao.queryNameByIdList(teacherIds);
+		}
+		return new ArrayList<>();
+	}
 }

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

@@ -1873,4 +1873,64 @@
 		</if>
 		GROUP BY su.organ_id_
 	</select>
+	<select id="getStudentVipOrderNum"  resultMap="IndexBaseMonthData">
+		SELECT spo.create_time_ month_,spo.organ_id_,
+		       COUNT(DISTINCT spo.id_) total_num_,
+		       'STUDENT_VIP_ORDER_NUM' data_type_,spo.user_id_ extend_info_,spo.tenant_id_
+		FROM (SELECT id_,user_id_,organ_id_,activity_id_,music_group_id_,calender_id_,type_,group_type_,
+		             DATE_FORMAT(pay_time_,'%Y-%m-%d') create_time_,tenant_id_ FROM student_payment_order
+		WHERE status_ = 'SUCCESS' AND DATE_FORMAT(pay_time_,'%Y-%m-%d') = #{dayStr} AND tenant_id_ = #{tenantId}) spo
+		LEFT JOIN student_payment_order_detail spod ON spod.payment_order_id_ = spo.id_
+		LEFT JOIN vip_group_activity vga ON FIND_IN_SET(vga.id_,spo.activity_id_)
+		LEFT JOIN vip_group_category vgc ON vgc.id_ = vga.vip_group_category_id_list_
+		LEFT JOIN vip_group vg ON vg.id_ = spo.music_group_id_
+		LEFT JOIN vip_group_category vgc1 ON vgc1.id_ = vg.vip_group_category_id_
+		LEFT JOIN music_group_payment_calender_activity mgpca ON mgpca.calender_id_ = spo.calender_id_
+		LEFT JOIN vip_group_activity vga1 ON vga1.id_ = mgpca.activity_id_
+		LEFT JOIN vip_group_category vgc2 ON vgc2.id_ = vga1.vip_group_category_id_list_
+		WHERE (spo.group_type_ = 'SPORADIC' AND spo.type_ = 'DEGREE_REGISTRATION' AND spod.type_ = 'DEGREE_REGISTRATION')
+		OR (spo.group_type_ = 'SPORADIC' AND spo.type_ = 'DOUBLE_ELEVEN2020') OR (spo.group_type_ = 'DEGREE' AND spod.type_ = 'VIP')
+		OR (spo.type_ = 'SMALL_CLASS_TO_BUY' AND vgc1.name_ != '乐理课') OR (spo.group_type_ = 'MUSIC' AND spod.type_ = 'VIP' AND vgc2.name_ != '乐理课')
+		OR (spo.type_ = 'DOUBLE_ELEVEN2021' AND vgc.name_ != '乐理课')
+		GROUP BY spo.user_id_,spo.create_time_,spo.organ_id_;
+	</select>
+	<select id="getStudentTheoryOrderNum" resultMap="IndexBaseMonthData">
+		SELECT spo.create_time_ month_,spo.organ_id_,
+			   COUNT(DISTINCT spo.id_) total_num_,
+			   'STUDENT_THEORY_ORDER_NUM' data_type_,spo.user_id_ extend_info_,spo.tenant_id_
+		FROM (SELECT id_,user_id_,organ_id_,activity_id_,music_group_id_,calender_id_,type_,group_type_,
+					 DATE_FORMAT(pay_time_,'%Y-%m-%d') create_time_,tenant_id_ FROM student_payment_order
+			  WHERE status_ = 'SUCCESS' AND DATE_FORMAT(pay_time_,'%Y-%m-%d') = #{dayStr} AND tenant_id_ = #{tenantId}) spo
+				 LEFT JOIN student_payment_order_detail spod ON spod.payment_order_id_ = spo.id_
+				 LEFT JOIN vip_group_activity vga ON FIND_IN_SET(vga.id_,spo.activity_id_)
+				 LEFT JOIN vip_group_category vgc ON vgc.id_ = vga.vip_group_category_id_list_
+				 LEFT JOIN vip_group vg ON vg.id_ = spo.music_group_id_
+				 LEFT JOIN vip_group_category vgc1 ON vgc1.id_ = vg.vip_group_category_id_
+				 LEFT JOIN music_group_payment_calender_activity mgpca ON mgpca.calender_id_ = spo.calender_id_
+				 LEFT JOIN vip_group_activity vga1 ON vga1.id_ = mgpca.activity_id_
+				 LEFT JOIN vip_group_category vgc2 ON vgc2.id_ = vga1.vip_group_category_id_list_
+		WHERE (spo.group_type_ = 'DEGREE' AND spod.type_ = 'THEORY_COURSE')
+		   OR (spo.type_ = 'SMALL_CLASS_TO_BUY' AND vgc1.name_ = '乐理课') OR (spo.group_type_ = 'MUSIC' AND spod.type_ = 'VIP' AND vgc2.name_ = '乐理课')
+		   OR (spo.type_ = 'DOUBLE_ELEVEN2021' AND vgc.name_ = '乐理课')
+		GROUP BY spo.user_id_,spo.create_time_,spo.organ_id_;
+	</select>
+	<select id="getStudentPracticeOrderNum" resultMap="IndexBaseMonthData">
+		SELECT spo.create_time_ month_,spo.organ_id_,
+			   COUNT(DISTINCT spo.id_) total_num_,
+			   'STUDENT_PRACTICE_ORDER_NUM' data_type_,spo.user_id_ extend_info_,spo.tenant_id_
+		FROM (SELECT id_,user_id_,organ_id_,activity_id_,music_group_id_,calender_id_,type_,group_type_,
+					 DATE_FORMAT(pay_time_,'%Y-%m-%d') create_time_,tenant_id_ FROM student_payment_order
+			  WHERE status_ = 'SUCCESS' AND DATE_FORMAT(pay_time_,'%Y-%m-%d') = #{dayStr} AND tenant_id_ = #{tenantId}) spo
+				 LEFT JOIN student_payment_order_detail spod ON spod.payment_order_id_ = spo.id_
+		WHERE spo.type_ = 'PRACTICE_GROUP_BUY' OR spo.type_ = 'PRACTICE_GROUP_RENEW' OR (spo.group_type_ = 'MUSIC' AND spod.type_ = 'PRACTICE')
+		GROUP BY spo.user_id_,spo.create_time_,spo.organ_id_;
+	</select>
+	<select id="getStudentLostNum" resultMap="IndexBaseMonthData">
+		SELECT sv.create_time_ month_,sv.organ_id_,COUNT(sv.id_) total_num_,sv.tenant_id_ FROM (
+		SELECT DATE_FORMAT(create_time_,'%Y-%m-%d') create_time_,organ_id_,id_,tenant_id_ FROM student_visit
+		WHERE id_ IN (SELECT MAX(id_) FROM student_visit
+		WHERE type_ = '小课回访' AND purpose_ = #{purpose} AND feedback_type_ = 'LOST' AND DATE_FORMAT(create_time_,'%Y-%m-%d') = #{dayStr} AND tenant_id_ = #{tenantId}
+		GROUP BY student_id_))sv
+		GROUP BY sv.create_time_
+	</select>
 </mapper>

+ 85 - 0
mec-biz/src/main/resources/config/mybatis/StudentStatisticsMapper.xml

@@ -266,4 +266,89 @@
 		LEFT JOIN sys_user_cash_account suca ON ss.user_id_ = suca.user_id_
 		WHERE ss.group_type_ = #{groupType}
 	</select>
+    <select id="countAddStudentNum" resultType="java.lang.Integer">
+		SELECT COUNT(extend_info_) FROM (
+		SELECT extend_info_ FROM index_base_month_data
+		WHERE data_type_ =
+		<if test="groupType == 'VIP'">
+			'STUDENT_VIP_ORDER_NUM'
+		</if>
+		<if test="groupType == 'THEORY'">
+			'STUDENT_THEORY_ORDER_NUM'
+		</if>
+		<if test="groupType == 'PRACTICE'">
+			'STUDENT_PRACTICE_ORDER_NUM'
+		</if>
+		AND extend_info_ IS NOT NULL
+		GROUP BY extend_info_
+		<if test="startDate != null and startDate != '' and endDate != null and endDate != ''">
+			HAVING COUNT(CASE WHEN month_ &lt; #{startDate} THEN 1 ELSE NULL END) &lt; 1
+			AND COUNT(CASE WHEN month_ BETWEEN #{startDate} AND #{endDate} THEN 1 ELSE NULL END) > 0
+		</if>
+		)a
+	</select>
+	<select id="countRenewStudentNum" resultType="java.lang.Integer">
+		SELECT COUNT(extend_info_) FROM (
+		SELECT extend_info_ FROM index_base_month_data
+		<include refid="dateTypeSql"/>
+			AND extend_info_ IS NOT NULL
+		<if test="endDate != null and endDate != ''">
+			AND month_ &lt;= #{endDate}
+		</if>
+		GROUP BY extend_info_
+		HAVING SUM(total_num_) > 1)a
+	</select>
+	<select id="countVisitNum" resultType="java.lang.Integer">
+		SELECT COUNT(DISTINCT student_id_) FROM student_visit
+		WHERE type_ = '小课回访' AND purpose_ =
+		<if test="groupType == 'VIP'">
+			'VIP课回访'
+		</if>
+		<if test="groupType == 'THEORY'">
+			'乐理课回访'
+		</if>
+		<if test="groupType == 'PRACTICE'">
+			'网管课回访'
+		</if>
+	</select>
+	<select id="countLostStudentNum" resultType="java.lang.Integer">
+		SELECT SUM(total_num_) FROM index_base_month_data
+		<include refid="lostDateTypeSql"/>
+		<if test="startDate != null and startDate != ''">
+			AND month_ >= #{startDate}
+		</if>
+		<if test="endDate != null and endDate != ''">
+			AND month_ &lt;= #{startDate}
+		</if>
+	</select>
+	<select id="queryTeacherIds" resultType="java.lang.Integer">
+		SELECT DISTINCT teacher_id_ FROM student_statistics WHERE group_type_ = #{groupType} AND teacher_id_ IS NOT NULL
+	</select>
+	<select id="queryDirectorList" resultType="java.lang.Integer">
+		SELECT DISTINCT music_director_id_ FROM student_statistics WHERE group_type_ = #{groupType} AND music_director_id_ IS NOT NULL
+	</select>
+	<sql id="dateTypeSql">
+		WHERE data_type_ =
+		<if test="groupType == 'VIP'">
+			'STUDENT_VIP_ORDER_NUM'
+		</if>
+		<if test="groupType == 'THEORY'">
+			'STUDENT_THEORY_ORDER_NUM'
+		</if>
+		<if test="groupType == 'PRACTICE'">
+			'STUDENT_PRACTICE_ORDER_NUM'
+		</if>
+	</sql>
+	<sql id="lostDateTypeSql">
+		WHERE data_type_ =
+		<if test="groupType == 'VIP'">
+			'STUDENT_VIP_LOST_NUM'
+		</if>
+		<if test="groupType == 'THEORY'">
+			'STUDENT_THEORY_LOST_NUM'
+		</if>
+		<if test="groupType == 'PRACTICE'">
+			'STUDENT_PRACTICE_LOST_NUM'
+		</if>
+	</sql>
 </mapper>

+ 35 - 0
mec-web/src/main/java/com/ym/mec/web/controller/StudentStatisticsController.java

@@ -2,12 +2,15 @@ package com.ym.mec.web.controller;
 
 import com.ym.mec.biz.dal.dto.StudentStatisticsDto;
 import com.ym.mec.biz.dal.dto.StudentStatisticsSumDto;
+import com.ym.mec.biz.dal.dto.StudentStatisticsSumForDateDto;
 import com.ym.mec.biz.dal.page.StudentStatisticsQueryInfo;
 import com.ym.mec.biz.service.StudentStatisticsService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.page.PageInfo;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -16,6 +19,9 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+import java.util.Map;
+
 @RequestMapping("studentStatistics")
 @Api(tags = "学员小课统计")
 @RestController
@@ -34,7 +40,36 @@ public class StudentStatisticsController extends BaseController {
     @ApiOperation(value = "小课学员管理汇总")
     @GetMapping("/studentSmallClassStatisticsSum")
     @PreAuthorize("@pcs.hasPermissions('studentStatistics/studentSmallClassStatisticsSum')")
+    @ApiImplicitParam(name = "groupType", value = "VIP、THEORY、PRACTICE", required = true, dataType = "String")
     public HttpResponseResult<StudentStatisticsSumDto> studentSmallClassStatisticsSum(String groupType) {
         return succeed(studentStatisticsService.studentSmallClassStatisticsSum(groupType));
     }
+
+    @ApiOperation(value = "小课学员管理按时间汇总")
+    @PostMapping("/studentSmallClassStatisticsSumForDate")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "groupType", value = "VIP、THEORY、PRACTICE", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "startDate", value = "开始时间-年月日", dataType = "String"),
+            @ApiImplicitParam(name = "endDate", value = "结束时间-年月日", dataType = "String"),
+    })
+    @PreAuthorize("@pcs.hasPermissions('studentStatistics/studentSmallClassStatisticsSumForDate')")
+    public HttpResponseResult<StudentStatisticsSumForDateDto> studentSmallClassStatisticsSumForDate(String groupType, String startDate, String endDate) {
+        return succeed(studentStatisticsService.studentSmallClassStatisticsSumForDate(groupType,startDate,endDate));
+    }
+
+    @ApiOperation(value = "获取指导老师列表")
+    @GetMapping("/queryTeacherList")
+    @PreAuthorize("@pcs.hasPermissions('studentStatistics/queryTeacherList')")
+    @ApiImplicitParam(name = "groupType", value = "VIP、THEORY、PRACTICE", required = true, dataType = "String")
+    public HttpResponseResult<List<Map<Integer, String>>> queryTeacherList(String groupType) {
+        return succeed(studentStatisticsService.queryTeacherList(groupType));
+    }
+
+    @ApiOperation(value = "获取乐团主管列表")
+    @GetMapping("/queryDirectorList")
+    @PreAuthorize("@pcs.hasPermissions('studentStatistics/queryDirectorList')")
+    @ApiImplicitParam(name = "groupType", value = "VIP、THEORY、PRACTICE", required = true, dataType = "String")
+    public HttpResponseResult<List<Map<Integer, String>>> queryDirectorList(String groupType) {
+        return succeed(studentStatisticsService.queryDirectorList(groupType));
+    }
 }