소스 검색

feat:教务端学员云教练数据统计

Joburgess 3 년 전
부모
커밋
545f180a28

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

@@ -332,4 +332,6 @@ public interface IndexBaseMonthDataDao extends BaseDAO<Long, IndexBaseMonthData>
     List<IndexBaseMonthData> getCloudStudyDayUseStudentNumData(@Param("dayStr") String dayStr);
 
     List<IndexBaseMonthData> getCloudStudyLivelyStudentNumData(@Param("dayStr") String dayStr);
+
+    List<IndexBaseMonthData> getCloudStudyNewStudentNumData(@Param("dayStr") String dayStr);
 }

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

@@ -74,6 +74,7 @@ public enum IndexDataType implements BaseEnum<String, IndexDataType> {
     ORGAN_TOTAL_STUDENT_NUM("ORGAN_TOTAL_STUDENT_NUM", "分部学员总数", false, false),
     CLOUD_STUDY_LIVELY_STUDENT_NUM("CLOUD_STUDY_LIVELY_STUDENT_NUM", "活跃用户", false, false),
     CLOUD_STUDY_DAY_USE_STUDENT_NUM("CLOUD_STUDY_DAY_USE_STUDENT_NUM", "云教练使用用户", false, false),
+    CLOUD_STUDY_NEW_STUDENT_NUM("CLOUD_STUDY_NEW_STUDENT_NUM", "云教练新增用户", false, false),
     MEMBER_STUDENT_NUM("MEMBER_STUDENT_NUM", "会员数量", false, false),
     EXPERIENCE_MEMBER_STUDENT_NUM("EXPERIENCE_MEMBER_STUDENT_NUM", "试用会员数量", false, false),
     NEW_MEMBER_STUDENT_NUM("NEW_MEMBER_STUDENT_NUM", "新增会员数量", false, false),

+ 65 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/OrganCloudStudyStudentDataQueryInfo.java

@@ -7,6 +7,11 @@ public class OrganCloudStudyStudentDataQueryInfo extends QueryInfo {
 
     private String date;
 
+    private String organIds;
+
+    @ApiModelProperty("学员总数")
+    private String totalStudentNum;
+
     @ApiModelProperty("付费会员数")
     private String vipStudentNum;
 
@@ -16,12 +21,24 @@ public class OrganCloudStudyStudentDataQueryInfo extends QueryInfo {
     @ApiModelProperty("新增会员数")
     private String newMemberStudentNum;
 
+    @ApiModelProperty("付费会员占比")
+    private String vipStudentDuty;
+
+    @ApiModelProperty("云教练试用人数")
+    private String cloudStudyUseStudentNum;
+
+    @ApiModelProperty("云教练使用人数占比")
+    private String cloudStudyUseStudentDuty;
+
     @ApiModelProperty("活跃人数")
     private String cloudStudyLivelyStudentNum;
 
     @ApiModelProperty("活跃人数占比")
     private String cloudStudyLivelyStudentDuty;
 
+    @ApiModelProperty("云教练新增人数")
+    private String newCloudStudyStudentNum;
+
     public String getDate() {
         return date;
     }
@@ -30,6 +47,22 @@ public class OrganCloudStudyStudentDataQueryInfo extends QueryInfo {
         this.date = date;
     }
 
+    public String getOrganIds() {
+        return organIds;
+    }
+
+    public void setOrganIds(String organIds) {
+        this.organIds = organIds;
+    }
+
+    public String getTotalStudentNum() {
+        return totalStudentNum;
+    }
+
+    public void setTotalStudentNum(String totalStudentNum) {
+        this.totalStudentNum = totalStudentNum;
+    }
+
     public String getVipStudentNum() {
         return vipStudentNum;
     }
@@ -54,6 +87,30 @@ public class OrganCloudStudyStudentDataQueryInfo extends QueryInfo {
         this.newMemberStudentNum = newMemberStudentNum;
     }
 
+    public String getVipStudentDuty() {
+        return vipStudentDuty;
+    }
+
+    public void setVipStudentDuty(String vipStudentDuty) {
+        this.vipStudentDuty = vipStudentDuty;
+    }
+
+    public String getCloudStudyUseStudentNum() {
+        return cloudStudyUseStudentNum;
+    }
+
+    public void setCloudStudyUseStudentNum(String cloudStudyUseStudentNum) {
+        this.cloudStudyUseStudentNum = cloudStudyUseStudentNum;
+    }
+
+    public String getCloudStudyUseStudentDuty() {
+        return cloudStudyUseStudentDuty;
+    }
+
+    public void setCloudStudyUseStudentDuty(String cloudStudyUseStudentDuty) {
+        this.cloudStudyUseStudentDuty = cloudStudyUseStudentDuty;
+    }
+
     public String getCloudStudyLivelyStudentNum() {
         return cloudStudyLivelyStudentNum;
     }
@@ -69,4 +126,12 @@ public class OrganCloudStudyStudentDataQueryInfo extends QueryInfo {
     public void setCloudStudyLivelyStudentDuty(String cloudStudyLivelyStudentDuty) {
         this.cloudStudyLivelyStudentDuty = cloudStudyLivelyStudentDuty;
     }
+
+    public String getNewCloudStudyStudentNum() {
+        return newCloudStudyStudentNum;
+    }
+
+    public void setNewCloudStudyStudentNum(String newCloudStudyStudentNum) {
+        this.newCloudStudyStudentNum = newCloudStudyStudentNum;
+    }
 }

+ 4 - 3
mec-biz/src/main/java/com/ym/mec/biz/service/OrganizationService.java

@@ -5,11 +5,12 @@ import com.ym.mec.biz.dal.page.OrganizationQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 public interface OrganizationService extends BaseService<Integer, Organization> {
 
+    Set<Integer>  EXCLUDE_ORGAN_IDS = new HashSet<>(Arrays.asList(36,39,41,42,43,44,45,46,47,48,49,50,52,54,55,56));
+
     /**
      * 获取节点树状结构
      * @param queryInfo
@@ -40,4 +41,4 @@ public interface OrganizationService extends BaseService<Integer, Organization>
      * @param id
      */
     Map<Integer, String> getGradeList(Integer id);
-}
+}

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

@@ -11,6 +11,7 @@ import com.ym.mec.biz.dal.entity.CooperationOrgan;
 import com.ym.mec.biz.dal.entity.Student;
 import com.ym.mec.biz.dal.enums.GradeTypeEnum;
 import com.ym.mec.biz.dal.enums.PeriodEnum;
+import com.ym.mec.biz.dal.page.OrganCloudStudyStudentDataQueryInfo;
 import com.ym.mec.biz.dal.page.StudentQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
@@ -102,6 +103,8 @@ public interface StudentService extends BaseService<Integer, Student> {
 
     List<EduOrganStudentDataDto> organStudentOverView(List<Integer> organIds);
 
+    PageInfo<EduOrganStudentDataDto> queryOrganStudentOverView(List<Integer> organIds, OrganCloudStudyStudentDataQueryInfo queryInfo);
+
     CloudStudyStudentDataDto getCloudStudyStudentOverView(List<Integer> organIds);
 
     /**

+ 15 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java

@@ -535,6 +535,11 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			saveData(indexBaseMonthDataDao.getCloudStudyLivelyStudentNumData(dayStr), dayStr, IndexDataType.CLOUD_STUDY_LIVELY_STUDENT_NUM);
 		}
 
+		//云教练新增人数
+		if(CollectionUtils.isEmpty(dataTypes)||dataTypes.contains(IndexDataType.CLOUD_STUDY_NEW_STUDENT_NUM)) {
+			saveData(indexBaseMonthDataDao.getCloudStudyLivelyStudentNumData(dayStr), dayStr, IndexDataType.CLOUD_STUDY_NEW_STUDENT_NUM);
+		}
+
 	}
 
 	/**
@@ -1233,7 +1238,7 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 		}
 		Set<String> dataTypes = new HashSet<String>(){{
 			add(CLOUD_STUDY_LIVELY_STUDENT_NUM.getCode());add(MEMBER_STUDENT_NUM.getCode());add(EXPERIENCE_MEMBER_STUDENT_NUM.getCode());
-			add(NEW_MEMBER_STUDENT_NUM.getCode());add(ORGAN_TOTAL_STUDENT_NUM.getCode());}};
+			add(NEW_MEMBER_STUDENT_NUM.getCode());add(ORGAN_TOTAL_STUDENT_NUM.getCode());add(CLOUD_STUDY_NEW_STUDENT_NUM.getCode());}};
 
 
 		List<IndexBaseMonthData> indexBaseDatas = indexBaseMonthDataDao.getIndexBaseData(new HashSet<>(organIds), dataTypes, queryInfo.getDate(), queryInfo.getDate());
@@ -1248,6 +1253,8 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 
 		Map<Integer, Integer> organsNewMemberStudentNumMap = indexBaseDatas.stream().filter(i->NEW_MEMBER_STUDENT_NUM.equals(i.getDataType())).collect(Collectors.toMap(IndexBaseMonthData::getOrganId, i->i.getActivateNum().intValue(), (i1, i2)->i1));
 
+		Map<Integer, Integer> organsNewCloudStudyStudentNumMap = indexBaseDatas.stream().filter(i->CLOUD_STUDY_NEW_STUDENT_NUM.equals(i.getDataType())).collect(Collectors.toMap(IndexBaseMonthData::getOrganId, i->i.getActivateNum().intValue(), (i1, i2)->i1));
+
 		List<EduOrganStudentDataDto> result = new ArrayList<>();
 
 		for (Organization organ : organs) {
@@ -1267,11 +1274,17 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 				organStudentVipData.setCloudStudyLivelyStudentNum(organCloudStudyLivelyStudentNumMap.get(organ.getId()));
 			}
 			if(organsNewMemberStudentNumMap.containsKey(organ.getId())){
-				organStudentVipData.setCloudStudyLivelyStudentNum(organsNewMemberStudentNumMap.get(organ.getId()));
+				organStudentVipData.setNewMemberStudentNum(organsNewMemberStudentNumMap.get(organ.getId()));
+			}
+			if(organsNewCloudStudyStudentNumMap.containsKey(organ.getId())){
+				organStudentVipData.setNewCloudStudyStudentNum(organsNewCloudStudyStudentNumMap.get(organ.getId()));
 			}
 			if(organStudentVipData.getCloudStudyLivelyStudentNum()>0&&organStudentVipData.getTotalStudentNum()>0){
 				organStudentVipData.setCloudStudyLivelyStudentDuty(new BigDecimal(organStudentVipData.getCloudStudyLivelyStudentNum()).divide(new BigDecimal(organStudentVipData.getTotalStudentNum()), 4, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)).floatValue());
 			}
+			if(organStudentVipData.getCloudStudyUseStudentNum()>0&&organStudentVipData.getTotalStudentNum()>0){
+				organStudentVipData.setCloudStudyUseStudentDuty(new BigDecimal(organStudentVipData.getCloudStudyUseStudentNum()).divide(new BigDecimal(organStudentVipData.getTotalStudentNum()), 4, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)).floatValue());
+			}
 			result.add(organStudentVipData);
 		}
 

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

@@ -4,6 +4,7 @@ import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
+import com.ym.mec.biz.dal.page.OrganCloudStudyStudentDataQueryInfo;
 import com.ym.mec.biz.dal.page.StudentQueryInfo;
 import com.ym.mec.biz.service.StudentService;
 import com.ym.mec.common.constant.CommonConstants;
@@ -502,6 +503,146 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     }
 
     @Override
+    public PageInfo<EduOrganStudentDataDto> queryOrganStudentOverView(List<Integer> organIds, OrganCloudStudyStudentDataQueryInfo queryInfo) {
+        PageInfo<EduOrganStudentDataDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        List<Organization> organs = organizationDao.getOrgans(organIds);
+        pageInfo.setTotal(organs.size());
+
+        if(CollectionUtils.isEmpty(organs)){
+            return pageInfo;
+        }
+
+        List<Map<Integer, Integer>> organsStudentNumMapList = studentDao.getOrgansStudentNum(organIds);
+        Map<String, Long> organsStudentNumMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(organsStudentNumMapList)){
+            organsStudentNumMap = MapUtil.convertIntegerMap(organsStudentNumMapList);
+        }
+        List<Map<Integer, Integer>> organsVipStudentNumMapList = cloudTeacherDao.getOrgansVipStudentNum(organIds);
+        Map<String, Long> organsVipStudentNumMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(organsVipStudentNumMapList)){
+            organsVipStudentNumMap = MapUtil.convertIntegerMap(organsVipStudentNumMapList);
+        }
+        List<Map<Integer, Integer>> organsEVipStudentNumMapList = studentDao.getOrgansEVipStudentNum(organIds);
+        Map<String, Long> organsEVipStudentNumMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(organsEVipStudentNumMapList)){
+            organsEVipStudentNumMap = MapUtil.convertIntegerMap(organsEVipStudentNumMapList);
+        }
+        List<Map<Integer, Integer>> organCloudStudyStudentNumMapList = studentDao.getOrganCloudStudyStudentNum(organIds);
+        Map<String, Long> organCloudStudyStudentNumMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(organCloudStudyStudentNumMapList)){
+            organCloudStudyStudentNumMap = MapUtil.convertIntegerMap(organCloudStudyStudentNumMapList);
+        }
+        List<Map<Integer, Integer>> organCloudStudyLivelyStudentNumMapList = studentDao.getOrganCloudStudyLivelyStudentNum(organIds);
+        Map<String, Long> organCloudStudyLivelyStudentNumMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(organCloudStudyLivelyStudentNumMapList)){
+            organCloudStudyLivelyStudentNumMap = MapUtil.convertIntegerMap(organCloudStudyLivelyStudentNumMapList);
+        }
+        List<Map<Integer, Integer>> organsNewCloudStudyNumMapList = sysMusicCompareRecordDao.getOrgansNewCloudStudyNum(organIds);
+        Map<String, Long> organsNewCloudStudyNumMap = new HashMap<>();
+        if(!CollectionUtils.isEmpty(organsNewCloudStudyNumMapList)){
+            organsNewCloudStudyNumMap = MapUtil.convertIntegerMap(organsNewCloudStudyNumMapList);
+        }
+
+        List<EduOrganStudentDataDto> result = new ArrayList<>();
+
+        for (Organization organ : organs) {
+            EduOrganStudentDataDto organStudentVipData = new EduOrganStudentDataDto();
+            organStudentVipData.setOrganId(organ.getId());
+            organStudentVipData.setOrganName(organ.getName());
+            if(organsStudentNumMap.containsKey(organ.getId().toString())){
+                organStudentVipData.setTotalStudentNum(organsStudentNumMap.get(organ.getId().toString()).intValue());
+            }
+            if(organsVipStudentNumMap.containsKey(organ.getId().toString())){
+                organStudentVipData.setVipStudentNum(organsVipStudentNumMap.get(organ.getId().toString()).intValue());
+            }
+            if(organsEVipStudentNumMap.containsKey(organ.getId().toString())){
+                organStudentVipData.seteVipStudentNum(organsEVipStudentNumMap.get(organ.getId().toString()).intValue());
+            }
+            if(organCloudStudyStudentNumMap.containsKey(organ.getId().toString())){
+                organStudentVipData.setCloudStudyUseStudentNum(organCloudStudyStudentNumMap.get(organ.getId().toString()).intValue());
+            }
+            if(organCloudStudyLivelyStudentNumMap.containsKey(organ.getId().toString())){
+                organStudentVipData.setCloudStudyLivelyStudentNum(organCloudStudyLivelyStudentNumMap.get(organ.getId().toString()).intValue());
+            }
+            if(organStudentVipData.getVipStudentNum()>0&&organStudentVipData.getTotalStudentNum()>0){
+                organStudentVipData.setVipStudentDuty(new BigDecimal(organStudentVipData.getVipStudentNum()).divide(new BigDecimal(organStudentVipData.getTotalStudentNum()), 4, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)).floatValue());
+            }
+            if(organStudentVipData.getCloudStudyUseStudentNum()>0&&organStudentVipData.getTotalStudentNum()>0){
+                organStudentVipData.setCloudStudyUseStudentDuty(new BigDecimal(organStudentVipData.getCloudStudyUseStudentNum()).divide(new BigDecimal(organStudentVipData.getTotalStudentNum()), 4, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100)).floatValue());
+            }
+            if(organsNewCloudStudyNumMap.containsKey(organ.getId().toString())){
+                organStudentVipData.setNewCloudStudyStudentNum(organsNewCloudStudyNumMap.get(organ.getId().toString()).intValue());
+            }
+            result.add(organStudentVipData);
+        }
+        Comparator<EduOrganStudentDataDto> comparing = null;
+        if(StringUtils.isNotBlank(queryInfo.getTotalStudentNum())){
+            if(Objects.isNull(comparing)){
+                comparing = Comparator.comparing(EduOrganStudentDataDto::getTotalStudentNum, "ASC".equals(queryInfo.getTotalStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }else{
+                comparing.thenComparing(EduOrganStudentDataDto::getTotalStudentNum, "ASC".equals(queryInfo.getTotalStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }
+        }
+        if(StringUtils.isNotBlank(queryInfo.getCloudStudyLivelyStudentNum())){
+            if(Objects.isNull(comparing)){
+                comparing = Comparator.comparing(EduOrganStudentDataDto::getCloudStudyLivelyStudentNum, "ASC".equals(queryInfo.getCloudStudyLivelyStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }else{
+                comparing.thenComparing(EduOrganStudentDataDto::getCloudStudyLivelyStudentNum, "ASC".equals(queryInfo.getCloudStudyLivelyStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }
+        }
+        if(StringUtils.isNotBlank(queryInfo.getCloudStudyUseStudentDuty())){
+            if(Objects.isNull(comparing)){
+                comparing = Comparator.comparing(EduOrganStudentDataDto::getCloudStudyUseStudentDuty, "ASC".equals(queryInfo.getCloudStudyUseStudentDuty())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }else{
+                comparing.thenComparing(EduOrganStudentDataDto::getCloudStudyUseStudentDuty, "ASC".equals(queryInfo.getCloudStudyUseStudentDuty())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }
+        }
+        if(StringUtils.isNotBlank(queryInfo.getVipStudentNum())){
+            if(Objects.isNull(comparing)){
+                comparing = Comparator.comparing(EduOrganStudentDataDto::getVipStudentNum, "ASC".equals(queryInfo.getVipStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }else{
+                comparing.thenComparing(EduOrganStudentDataDto::getVipStudentNum, "ASC".equals(queryInfo.getVipStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }
+        }
+        if(StringUtils.isNotBlank(queryInfo.getVipStudentDuty())){
+            if(Objects.isNull(comparing)){
+                comparing = Comparator.comparing(EduOrganStudentDataDto::getVipStudentDuty, "ASC".equals(queryInfo.getVipStudentDuty())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }else{
+                comparing.thenComparing(EduOrganStudentDataDto::getVipStudentDuty, "ASC".equals(queryInfo.getVipStudentDuty())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }
+        }
+        if(StringUtils.isNotBlank(queryInfo.geteVipStudentNum())){
+            if(Objects.isNull(comparing)){
+                comparing = Comparator.comparing(EduOrganStudentDataDto::geteVipStudentNum, "ASC".equals(queryInfo.geteVipStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }else{
+                comparing.thenComparing(EduOrganStudentDataDto::geteVipStudentNum, "ASC".equals(queryInfo.geteVipStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }
+        }
+        if(StringUtils.isNotBlank(queryInfo.getNewMemberStudentNum())){
+            if(Objects.isNull(comparing)){
+                comparing = Comparator.comparing(EduOrganStudentDataDto::getNewMemberStudentNum, "ASC".equals(queryInfo.getNewMemberStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }else{
+                comparing.thenComparing(EduOrganStudentDataDto::getNewMemberStudentNum, "ASC".equals(queryInfo.getNewMemberStudentNum())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }
+        }
+        if(StringUtils.isNotBlank(queryInfo.getCloudStudyLivelyStudentDuty())){
+            if(Objects.isNull(comparing)){
+                comparing = Comparator.comparing(EduOrganStudentDataDto::getCloudStudyLivelyStudentDuty, "ASC".equals(queryInfo.getCloudStudyLivelyStudentDuty())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }else{
+                comparing.thenComparing(EduOrganStudentDataDto::getCloudStudyLivelyStudentDuty, "ASC".equals(queryInfo.getCloudStudyLivelyStudentDuty())?Comparator.naturalOrder():Comparator.reverseOrder());
+            }
+        }
+
+        if(Objects.isNull(comparing)){
+            comparing = Comparator.comparing(EduOrganStudentDataDto::getOrganId);
+        }
+
+        result = result.stream().skip(pageInfo.getOffset()).limit(pageInfo.getLimit()).sorted(comparing).collect(Collectors.toList());
+        pageInfo.setRows(result);
+        return pageInfo;
+    }
+
+    @Override
     public CloudStudyStudentDataDto getCloudStudyStudentOverView(List<Integer> organIds) {
         CloudStudyStudentDataDto result = new CloudStudyStudentDataDto();
         result.setTotalStudentNum(studentDao.getOrgansTotalStudentNum(organIds));

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

@@ -1770,4 +1770,25 @@
 			GROUP BY smcr.user_id_) t WHERE t.days>=5
 		GROUP BY t.organ_id_
 	</select>
+
+	<select id="getCloudStudyNewStudentNumData" resultMap="IndexBaseMonthData">
+		SELECT
+			organ_id_,
+			#{dayStr} month_,
+			COUNT( DISTINCT user_id_ ) total_num_,
+			COUNT( DISTINCT user_id_ ) activate_num_,
+			COUNT( DISTINCT user_id_ ) percent_
+		FROM
+		(
+		SELECT
+			su.organ_id_,
+			smcr.user_id_
+		FROM
+			sys_music_compare_record smcr
+			LEFT JOIN sys_user su ON smcr.user_id_ = su.id_
+		WHERE su.del_flag_ = 0
+		GROUP BY user_id_
+		HAVING MIN(DATE( smcr.create_time_ ))= #{dayStr}) t
+		GROUP BY t.organ_id_
+	</select>
 </mapper>

+ 106 - 0
mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

@@ -137,6 +137,8 @@ public class ExportController extends BaseController {
     private IndexErrDataRecordService indexErrDataRecordService;
     @Autowired
     private EmployeeInfoService employeeInfoService;
+    @Autowired
+    private StudentService studentService;
 
     @ApiOperation(value = "21年暑期考级活动统计页面详情导出")
     @PostMapping("export/statisticsDetail")
@@ -3137,4 +3139,108 @@ public class ExportController extends BaseController {
             }
         }
     }
+
+    @ApiOperation(value = "分部云教练学员数据预览导出")
+    @RequestMapping("export/organStudentOverView")
+    @PreAuthorize("@pcs.hasPermissions('export/organStudentOverView')")
+    public void organStudentOverView(OrganCloudStudyStudentDataQueryInfo queryInfo,HttpServletResponse response) throws IOException {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("用户信息获取失败");
+        }
+        Employee employee = employeeDao.get(sysUser.getId());
+        queryInfo.setPage(1);
+        queryInfo.setRows(49999);
+
+        List<Integer> organIds = new ArrayList<>();
+        if(StringUtils.isNotBlank(queryInfo.getOrganIds())){
+            organIds = Arrays.stream(queryInfo.getOrganIds().split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toList());
+        }else if(StringUtils.isNotBlank(employee.getOrganIdList())){
+            organIds = Arrays.stream(employee.getOrganIdList().split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toList());
+        }
+
+        List<EduOrganStudentDataDto> rows = studentService.queryOrganStudentOverView(organIds, queryInfo).getRows();
+        if (CollectionUtils.isEmpty(rows)) {
+            response.setStatus(200);
+            response.setContentType("Content-Type: application/json;charset=UTF-8");
+            response.getOutputStream().write("{\"data\": null, \"code\": 500, \"status\": false, \"msg\": \"没有可导出的记录\"}".getBytes());
+            response.flushBuffer();
+            return;
+        }
+        OutputStream outputStream = response.getOutputStream();
+        try {
+            String[] header = {"分部", "老师姓名", "学员总数", "付费学员数量",
+                    "试用会员", "会员占比"};
+            String[] body = {"teacherId", "teacherName", "totalStudentNum", "vipStudentNum", "eVipStudentNum", "vipStudentDuty"};
+            HSSFWorkbook workbook = POIUtil.exportExcel(header, body, rows);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=employeeInfo-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    @ApiOperation(value = "分部云教练学员数据预览导出")
+    @RequestMapping("export/cloudStudyStudentOverView")
+    @PreAuthorize("@pcs.hasPermissions('export/cloudStudyStudentOverView')")
+    public void cloudStudyStudentOverView(OrganCloudStudyStudentDataQueryInfo queryInfo,HttpServletResponse response) throws IOException {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("用户信息获取失败");
+        }
+        Employee employee = employeeDao.get(sysUser.getId());
+        queryInfo.setPage(1);
+        queryInfo.setRows(49999);
+
+        List<Integer> organIds = new ArrayList<>();
+        if(StringUtils.isNotBlank(queryInfo.getOrganIds())){
+            organIds = Arrays.stream(queryInfo.getOrganIds().split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toList());
+        }else if(StringUtils.isNotBlank(employee.getOrganIdList())){
+            organIds = Arrays.stream(employee.getOrganIdList().split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toList());
+        }
+
+        List<EduOrganStudentDataDto> rows = indexService.organStudentOverView(organIds, queryInfo).getRows();
+        if (CollectionUtils.isEmpty(rows)) {
+            response.setStatus(200);
+            response.setContentType("Content-Type: application/json;charset=UTF-8");
+            response.getOutputStream().write("{\"data\": null, \"code\": 500, \"status\": false, \"msg\": \"没有可导出的记录\"}".getBytes());
+            response.flushBuffer();
+            return;
+        }
+        OutputStream outputStream = response.getOutputStream();
+        try {
+            String[] header = {"分部", "老师姓名", "学员总数", "付费学员数量",
+                    "试用会员", "会员占比"};
+            String[] body = {"teacherId", "teacherName", "totalStudentNum", "vipStudentNum", "eVipStudentNum", "vipStudentDuty"};
+            HSSFWorkbook workbook = POIUtil.exportExcel(header, body, rows);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=employeeInfo-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
 }

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

@@ -12,6 +12,7 @@ import com.ym.mec.biz.service.*;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
 import io.swagger.annotations.*;
 import org.apache.commons.lang3.StringUtils;
@@ -436,13 +437,16 @@ public class StudentManageController extends BaseController {
     @ApiOperation(value = "分部云教练学员数据预览")
     @GetMapping("/organStudentOverView")
     @PreAuthorize("@pcs.hasPermissions('studentManage/organStudentOverView')")
-    public HttpResponseResult<List<EduOrganStudentDataDto>> organStudentOverView() throws Exception {
+    public HttpResponseResult<PageInfo<EduOrganStudentDataDto>> organStudentOverView(OrganCloudStudyStudentDataQueryInfo queryInfo) throws Exception {
         List<Organization> organizations = organizationService.queryEmployeeOrgan();
-        if(CollectionUtils.isEmpty(organizations)){
-            return succeed(Collections.emptyList());
+        List<Integer> organIds = new ArrayList<>();
+        if(StringUtils.isNotBlank(queryInfo.getOrganIds())){
+            organIds = Arrays.stream(queryInfo.getOrganIds().split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toList());
+        }else if(!CollectionUtils.isEmpty(organizations)){
+            organIds = organizations.stream().map(Organization::getId).collect(Collectors.toList());
         }
-        List<Integer> organIds = organizations.stream().map(Organization::getId).collect(Collectors.toList());
-        return succeed(studentService.organStudentOverView(organIds));
+        List<Integer> ids = organIds.stream().filter(id -> !OrganizationService.EXCLUDE_ORGAN_IDS.contains(id)).collect(Collectors.toList());
+        return succeed(studentService.queryOrganStudentOverView(ids, queryInfo));
     }
 
     @ApiOperation(value = "云教练学员数据")