瀏覽代碼

Merge branch 'zx_2022-11-22' of http://git.dayaedu.com/yonge/mec into master_saas

zouxuan 2 年之前
父節點
當前提交
36c9a35751
共有 19 個文件被更改,包括 439 次插入62 次删除
  1. 3 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CloudTeacherOrderDao.java
  2. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  3. 8 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentStatisticsDao.java
  4. 33 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CloudStudyStudentDataDto.java
  5. 33 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EduOrganStudentListDto.java
  6. 32 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EduOrganStudentListExportDto.java
  7. 102 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/IndexCloudStudySumDto.java
  8. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentCourseConsumerQueryInfo.java
  9. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentCourseConsumerService.java
  10. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java
  11. 14 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  12. 37 6
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseConsumerServiceImpl.java
  13. 36 26
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  14. 12 0
      mec-biz/src/main/resources/config/mybatis/CloudTeacherOrderMapper.xml
  15. 53 4
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  16. 24 6
      mec-biz/src/main/resources/config/mybatis/StudentStatisticsMapper.xml
  17. 3 2
      mec-web/src/main/java/com/ym/mec/web/controller/StudentCourseConsumerController.java
  18. 34 4
      mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java
  19. 2 2
      mec-web/src/main/resources/exportColumnMapper.ini

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

@@ -105,4 +105,7 @@ public interface CloudTeacherOrderDao extends BaseDAO<Long, CloudTeacherOrder> {
     List<Mapper> findUserNameByOrderId(@Param("platformOrderId")Integer platformOrderId);
 
     void batchInsert(@Param("bean") CloudTeacherOrder cloudTeacherOrder, @Param("userIds") List<Integer> userIds);
+
+    //获取待激活学员数
+    List<Map<Integer, Integer>> getWaitActivateMap(@Param("organIds") List<Integer> organIds);
 }

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

@@ -212,8 +212,11 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
     List<Map<Integer, Integer>> getOrganCloudStudyLivelyStudentNum(@Param("organIds") List<Integer> organIds);
     
     List<IndexCloudStudyListDto> getCloudStudyStudentOverViewList(@Param("organIds") List<Integer> organIds);
+
+    List<IndexCloudStudySumDto> getCloudStudyStudentOverViewList1(@Param("organIds") List<Integer> organIds);
     
     List<Mapper> getOrganActiveCloudStudyStudentNum(@Param("organIds") List<Integer> organIds, @Param("startTime") Date startTime, @Param("endTime") Date endTime);
+    List<Map<Integer,Integer>> getOrganActiveCloudStudyStudentNum1(@Param("organIds") List<Integer> organIds, @Param("startTime") Date startTime, @Param("endTime") Date endTime);
     
     List<Mapper> getOrganCloudTeacherStudentNum(@Param("organIds") List<Integer> organIds);
 
@@ -345,4 +348,7 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
 
     //统计训练时长
     List<CloudTeacherSumDto> cloudTeacherSum(@Param("queryInfo") StudentCourseConsumerQueryInfo queryInfo);
+
+    //统计重复购买人数
+    List<Map<Integer,Integer>> getAgainBuyNum(@Param("organIds") List<Integer> organIds);
 }

+ 8 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentStatisticsDao.java

@@ -80,8 +80,14 @@ public interface StudentStatisticsDao extends BaseDAO<Integer, StudentStatistics
     List<StudentCourseConsumerSumDto> queryCourseConsumerSum(@Param("queryInfo") StudentCourseConsumerQueryInfo queryInfo);
 
     //获取实际课耗学员详情列表
-    List<StudentCourseConsumerDetailDto> queryCourseConsumerDetail(@Param("queryInfo") StudentCourseConsumerQueryInfo queryInfo);
+    List<StudentCourseConsumerDetailDto> queryCourseConsumerDetail(Map<String, Object> params);
+
+    //获取实际课耗学员详情列表
+    int countCourseConsumerDetail(Map<String, Object> params);
+
+    //获取预计课耗学员详情列表
+    List<StudentCourseConsumerDetailDto> queryPreCourseConsumerDetail(Map<String, Object> params);
 
     //获取预计课耗学员详情列表
-    List<StudentCourseConsumerDetailDto> queryPreCourseConsumerDetail(@Param("queryInfo") StudentCourseConsumerQueryInfo queryInfo);
+    int countPreCourseConsumerDetail(Map<String, Object> params);
 }

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

@@ -47,6 +47,39 @@ public class CloudStudyStudentDataDto {
     @ApiModelProperty("云教练新增人数")
     private int newCloudStudyStudentNum;
 
+    @ApiModelProperty("重复购买云教练的用户")
+    private int againBuyNum;
+
+    //重复购买率
+    private double againBuyRate;
+
+    //购买率
+    private double buyRate;
+
+    public double getAgainBuyRate() {
+        return againBuyRate;
+    }
+
+    public void setAgainBuyRate(double againBuyRate) {
+        this.againBuyRate = againBuyRate;
+    }
+
+    public double getBuyRate() {
+        return buyRate;
+    }
+
+    public void setBuyRate(double buyRate) {
+        this.buyRate = buyRate;
+    }
+
+    public int getAgainBuyNum() {
+        return againBuyNum;
+    }
+
+    public void setAgainBuyNum(int againBuyNum) {
+        this.againBuyNum = againBuyNum;
+    }
+
     public Integer getOrganId() {
         return organId;
     }

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

@@ -10,6 +10,12 @@ import java.util.Date;
  */
 public class EduOrganStudentListDto {
 
+    @ApiModelProperty("分部")
+    private Integer organId;
+
+    @ApiModelProperty("分部")
+    private String organName;
+
     @ApiModelProperty("学员编号")
     private Integer studentId;
 
@@ -46,12 +52,39 @@ public class EduOrganStudentListDto {
     @ApiModelProperty("会员有效期")
     private String membershipEndTime;
 
+    @ApiModelProperty("是否会员")
+    private boolean memberFlag;
+
     private String currentGradeNum;
 
     private String currentClass;
 
     private Integer countFlag;
 
+    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 boolean isMemberFlag() {
+        return memberFlag;
+    }
+
+    public void setMemberFlag(boolean memberFlag) {
+        this.memberFlag = memberFlag;
+    }
+
     public String getCurrentGradeNum() {
         return currentGradeNum;
     }

+ 32 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EduOrganStudentListExportDto.java

@@ -9,6 +9,14 @@ import java.math.BigDecimal;
  * @Date 2021/8/17 0017
  */
 public class EduOrganStudentListExportDto {
+    @ApiModelProperty("分部")
+    private Integer organId;
+
+    @ApiModelProperty("分部")
+    private String organName;
+
+    @ApiModelProperty("是否会员")
+    private boolean memberFlag;
 
     @ApiModelProperty("学员编号")
     private Integer studentId;
@@ -89,6 +97,30 @@ public class EduOrganStudentListExportDto {
     @ApiModelProperty("会员有效期")
     private String membershipEndTime;
 
+    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 boolean isMemberFlag() {
+        return memberFlag;
+    }
+
+    public void setMemberFlag(boolean memberFlag) {
+        this.memberFlag = memberFlag;
+    }
+
     public String getSubjectTeacherName() {
         return subjectTeacherName;
     }

+ 102 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/IndexCloudStudySumDto.java

@@ -0,0 +1,102 @@
+package com.ym.mec.biz.dal.dto;
+
+public class IndexCloudStudySumDto {
+
+	private Integer organId;
+	
+	private String organName;
+
+	//在读学员数
+	private int totalStudentNum;
+
+	//会员总数
+	private int vipStudentNum;
+
+	//会员人数占比
+	private double vipStudentRate;
+
+	//生效中的学员数
+	private int effectiveVipStudentNum;
+
+	//待激活学员数
+	private int waitActivateVipStudentNum;
+
+	//活跃人数
+	private int activeStudentNum;
+
+	//重复购买人数
+	private int againBuyNum;
+
+	public int getAgainBuyNum() {
+		return againBuyNum;
+	}
+
+	public void setAgainBuyNum(int againBuyNum) {
+		this.againBuyNum = againBuyNum;
+	}
+
+	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 double getVipStudentRate() {
+		return vipStudentRate;
+	}
+
+	public void setVipStudentRate(double vipStudentRate) {
+		this.vipStudentRate = vipStudentRate;
+	}
+
+	public int getEffectiveVipStudentNum() {
+		return effectiveVipStudentNum;
+	}
+
+	public void setEffectiveVipStudentNum(int effectiveVipStudentNum) {
+		this.effectiveVipStudentNum = effectiveVipStudentNum;
+	}
+
+	public int getWaitActivateVipStudentNum() {
+		return waitActivateVipStudentNum;
+	}
+
+	public void setWaitActivateVipStudentNum(int waitActivateVipStudentNum) {
+		this.waitActivateVipStudentNum = waitActivateVipStudentNum;
+	}
+
+	public int getActiveStudentNum() {
+		return activeStudentNum;
+	}
+
+	public void setActiveStudentNum(int activeStudentNum) {
+		this.activeStudentNum = activeStudentNum;
+	}
+
+}

+ 2 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentCourseConsumerQueryInfo.java

@@ -1,8 +1,9 @@
 package com.ym.mec.biz.dal.page;
 
+import com.ym.mec.common.page.QueryInfo;
 import io.swagger.annotations.ApiModelProperty;
 
-public class StudentCourseConsumerQueryInfo{
+public class StudentCourseConsumerQueryInfo extends QueryInfo {
 
     @ApiModelProperty(value = "分部")
     private String organId;

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

@@ -4,22 +4,22 @@ import com.ym.mec.biz.dal.dto.StudentCourseConsumerDetailDto;
 import com.ym.mec.biz.dal.dto.StudentCourseConsumerDto;
 import com.ym.mec.biz.dal.dto.StudentCourseConsumerSumDto;
 import com.ym.mec.biz.dal.page.StudentCourseConsumerQueryInfo;
+import com.ym.mec.common.page.PageInfo;
 
 import java.util.List;
 
 public interface StudentCourseConsumerService{
-
     //实际课耗列表
     List<StudentCourseConsumerDto> queryCourseConsumer(StudentCourseConsumerQueryInfo queryInfo);
 
     //实际课耗学员详情列表
-    List<StudentCourseConsumerDetailDto> queryCourseConsumerDetail(StudentCourseConsumerQueryInfo queryInfo);
+    PageInfo<StudentCourseConsumerDetailDto> queryCourseConsumerDetail(StudentCourseConsumerQueryInfo queryInfo);
 
     //预计课耗列表
     List<StudentCourseConsumerDto> queryPreCourseConsumer(StudentCourseConsumerQueryInfo queryInfo);
 
     //预计课耗学员详情列表
-    List<StudentCourseConsumerDetailDto> queryPreCourseConsumerDetail(StudentCourseConsumerQueryInfo queryInfo);
+    PageInfo<StudentCourseConsumerDetailDto> queryPreCourseConsumerDetail(StudentCourseConsumerQueryInfo queryInfo);
 
     //课耗统计
     List<StudentCourseConsumerSumDto> queryCourseConsumerSum(StudentCourseConsumerQueryInfo queryInfo);

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

@@ -194,4 +194,6 @@ public interface StudentService extends BaseService<Integer, Student> {
 
     //统计训练时长
     List<CloudTeacherSumDto> cloudTeacherSum(StudentCourseConsumerQueryInfo queryInfo);
+
+    List<IndexCloudStudySumDto> getCloudStudyStudentOverViewList1(List<Integer> organIdsList);
 }

+ 14 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java

@@ -184,6 +184,8 @@ public class ExportServiceImpl implements ExportService {
     @Autowired
     private StudentCourseConsumerService studentCourseConsumerService;
     @Autowired
+    private StudentStatisticsDao studentStatisticsDao;
+    @Autowired
     private StudentTeacherMapperDao studentTeacherMapperDao;
 
     private static final ExecutorService exportExecutorService = Executors.newFixedThreadPool(10);
@@ -1511,10 +1513,13 @@ public class ExportServiceImpl implements ExportService {
         StudentCourseConsumerQueryInfo queryInfo = JSONObject.parseObject(JSONObject.toJSONString(info), StudentCourseConsumerQueryInfo.class);
         SysUser user = sysUserService.getUser();
         queryInfo.setOrganId(organizationService.getEmployeeOrgan(user.getId(), queryInfo.getOrganId(), user.getIsSuperAdmin()));
-        List<StudentCourseConsumerDetailDto> dtos = studentCourseConsumerService.queryCourseConsumerDetail(queryInfo);
-        checkRows(dtos);
+        Map<String, Object> params = new HashMap<String, Object>();
+        queryInfo.setRows(65535);
+        MapUtil.populateMap(params, queryInfo);
+        int count = studentStatisticsDao.countCourseConsumerDetail(params);
+        checkRows(count);
         ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.EXPORT_COURSE_CONSUMER_DETAIL,user.getId());
-        return this.asyncExport(() -> this.initExportInfo(dtos, managerDownload,ExportEnum.EXPORT_COURSE_CONSUMER_DETAIL),
+        return this.asyncExport(() -> this.initExportInfo(studentStatisticsDao.queryCourseConsumerDetail(params), managerDownload,ExportEnum.EXPORT_COURSE_CONSUMER_DETAIL),
                 managerDownload.getName());
     }
     private HttpResponseResult exportPreCourseConsumer(Map<String, Object> info){
@@ -1531,10 +1536,13 @@ public class ExportServiceImpl implements ExportService {
         StudentCourseConsumerQueryInfo queryInfo = JSONObject.parseObject(JSONObject.toJSONString(info), StudentCourseConsumerQueryInfo.class);
         SysUser user = sysUserService.getUser();
         queryInfo.setOrganId(organizationService.getEmployeeOrgan(user.getId(), queryInfo.getOrganId(), user.getIsSuperAdmin()));
-        List<StudentCourseConsumerDetailDto> dtos = studentCourseConsumerService.queryPreCourseConsumerDetail(queryInfo);
-        checkRows(dtos);
+        Map<String, Object> params = new HashMap<String, Object>();
+        queryInfo.setRows(65535);
+        MapUtil.populateMap(params, queryInfo);
+        int count = studentStatisticsDao.countPreCourseConsumerDetail(params);
+        checkRows(count);
         ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.EXPORT_PRE_COURSE_CONSUMER_DETAIL,user.getId());
-        return this.asyncExport(() -> this.initExportInfo(dtos, managerDownload,ExportEnum.EXPORT_PRE_COURSE_CONSUMER_DETAIL),
+        return this.asyncExport(() -> this.initExportInfo(studentStatisticsDao.queryPreCourseConsumerDetail(params), managerDownload,ExportEnum.EXPORT_PRE_COURSE_CONSUMER_DETAIL),
                 managerDownload.getName());
     }
     private HttpResponseResult exportCourseConsumerSum(Map<String, Object> info){

+ 37 - 6
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentCourseConsumerServiceImpl.java

@@ -7,14 +7,15 @@ import com.ym.mec.biz.dal.dto.StudentCourseConsumerSumDto;
 import com.ym.mec.biz.dal.page.StudentCourseConsumerQueryInfo;
 import com.ym.mec.biz.service.StudentCourseConsumerService;
 import com.ym.mec.common.constant.CommonConstants;
+import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
 @Service
 public class StudentCourseConsumerServiceImpl implements StudentCourseConsumerService {
@@ -29,8 +30,23 @@ public class StudentCourseConsumerServiceImpl implements StudentCourseConsumerSe
     }
 
     @Override
-    public List<StudentCourseConsumerDetailDto> queryCourseConsumerDetail(StudentCourseConsumerQueryInfo queryInfo) {
-        return studentStatisticsDao.queryCourseConsumerDetail(queryInfo);
+    public PageInfo<StudentCourseConsumerDetailDto> queryCourseConsumerDetail(StudentCourseConsumerQueryInfo queryInfo) {
+        PageInfo<StudentCourseConsumerDetailDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<StudentCourseConsumerDetailDto> dataList = null;
+        int count = studentStatisticsDao.countCourseConsumerDetail(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = studentStatisticsDao.queryCourseConsumerDetail(params);
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
     }
 
     @Override
@@ -39,8 +55,23 @@ public class StudentCourseConsumerServiceImpl implements StudentCourseConsumerSe
     }
 
     @Override
-    public List<StudentCourseConsumerDetailDto> queryPreCourseConsumerDetail(StudentCourseConsumerQueryInfo queryInfo) {
-        return studentStatisticsDao.queryPreCourseConsumerDetail(queryInfo);
+    public PageInfo<StudentCourseConsumerDetailDto> queryPreCourseConsumerDetail(StudentCourseConsumerQueryInfo queryInfo) {
+        PageInfo<StudentCourseConsumerDetailDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<StudentCourseConsumerDetailDto> dataList = null;
+        int count = studentStatisticsDao.countPreCourseConsumerDetail(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = studentStatisticsDao.queryPreCourseConsumerDetail(params);
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
     }
 
     @Override

+ 36 - 26
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java

@@ -566,6 +566,8 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
             params.put("offset", pageInfo.getOffset());
             dataList1 = studentDao.queryCloudStudyStudentData(params);
             List<Integer> studentIds = dataList1.stream().map(EduOrganStudentListDto::getStudentId).collect(Collectors.toList());
+            Set<Integer> organIds = dataList1.stream().map(EduOrganStudentListDto::getOrganId).collect(Collectors.toSet());
+            Map<Integer,String> organMap = MapUtil.convertMybatisMap(organizationDao.findOrganNameMapList(organIds));
 
             List<Map<Integer, String>> studentGroupNamesMapList = studentRegistrationDao.queryStudentMusicGroupNamesMap(studentIds);
             Map<Integer, String> studentGroupNamesMap = MapUtil.convertIntegerMap(studentGroupNamesMapList);
@@ -613,6 +615,7 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
             for (EduOrganStudentListDto eduOrganStudentListDto : dataList1) {
                 EduOrganStudentListExportDto data = new EduOrganStudentListExportDto();
                 BeanUtils.copyProperties(eduOrganStudentListDto, data);
+                data.setOrganName(organMap.get(data.getOrganId()));
                 if (StringUtils.isNotEmpty(eduOrganStudentListDto.getCurrentGradeNum())) {
                     data.setCurrentGradeNum(eduOrganStudentListDto.getCurrentGradeNum());
                     String grade = gradeList.get(Integer.parseInt(eduOrganStudentListDto.getCurrentGradeNum()));
@@ -961,33 +964,8 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     @Override
     public CloudStudyStudentDataDto getCloudStudyStudentOverView(List<Integer> organIds) {
         CloudStudyStudentDataDto result = new CloudStudyStudentDataDto();
-        
-        /*IndexCloudStudyListDto dto = studentDao.getOrgansCloudTeacherStudent(organIds);
-        result.setTotalStudentNum(dto.getTotalStudentNum());
-        result.setEffectiveVipStudentNum(dto.getEffectiveVipStudentNum());
-        result.setWaitActivateVipStudentNum(dto.getWaitActivateVipStudentNum());
-        
-        result.setVipStudentNum(cloudTeacherDao.getOrgansTotalVipStudentNum(organIds));*/
-//        result.seteVipStudentNum(studentDao.getOrgansTotalEVipStudentNum(organIds));
-        result.setCloudStudyUseStudentNum(studentDao.getOrgansTotalCloudStudyStudentNum(organIds));
+//        result.setCloudStudyUseStudentNum(studentDao.getOrgansTotalCloudStudyStudentNum(organIds));
         result.setCloudStudyTodayUseStudentNum(studentDao.getOrgansTodayTotalCloudStudyStudentNum(organIds));
-        
-        Calendar cal = Calendar.getInstance();    
-        cal.setTime(new Date());    
-        //cal.add(Calendar.WEEK_OF_YEAR, -1);// 一周    
-        cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
-        Date endTime = cal.getTime();
-        
-        cal.setTime(new Date());    
-        cal.add(Calendar.WEEK_OF_YEAR, -4);// 一周    
-        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
-        Date startTime = cal.getTime();
-        
-        //result.setCloudStudyLivelyStudentNum(studentDao.getOrganTotalCloudStudyLivelyStudentNum(organIds, startTime, endTime));
-        //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;
     }
 
@@ -1334,6 +1312,38 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
         return cloudTeacherSumDtos;
     }
 
+    @Override
+    public List<IndexCloudStudySumDto> getCloudStudyStudentOverViewList1(List<Integer> organIdsList) {
+        List<IndexCloudStudySumDto> list = studentDao.getCloudStudyStudentOverViewList1(organIdsList);
+        //获取待激活学员数
+        Map<Integer,Integer> waitMap = MapUtil.convertIntegerMap(cloudTeacherOrderDao.getWaitActivateMap(organIdsList));
+        //获取活跃学员数
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(new Date());
+        //cal.add(Calendar.WEEK_OF_YEAR, -1);// 一周
+        cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
+        Date endTime = cal.getTime();
+
+        cal.setTime(new Date());
+        cal.add(Calendar.WEEK_OF_YEAR, -4);// 一周
+        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
+        Date startTime = cal.getTime();
+
+        Map<Integer,Integer> activeMap = MapUtil.convertIntegerMap(studentDao.getOrganActiveCloudStudyStudentNum1(organIdsList, startTime, endTime));
+        //获取重复购买人数
+        Map<Integer,Integer> againBuyMap = MapUtil.convertIntegerMap(studentDao.getAgainBuyNum(organIdsList));
+        for (IndexCloudStudySumDto dto : list) {
+            dto.setWaitActivateVipStudentNum(waitMap.get(dto.getOrganId()));
+            dto.setAgainBuyNum(againBuyMap.get(dto.getOrganId()));
+            dto.setActiveStudentNum(activeMap.get(dto.getOrganId()));
+            dto.setTotalStudentNum(dto.getWaitActivateVipStudentNum() + dto.getVipStudentNum());
+//            double studentNum = (double)dto.getVipStudentNum();
+//            dto.setVipStudentRate(studentNum / dto.getTotalStudentNum());
+//            dto.setAgainBuyRate(dto.getAgainBuyNum() / studentNum);
+        }
+        return list;
+    }
+
     @Transactional(rollbackFor = Exception.class)
     public  <T extends BaseStudentDto> void insertStudent(T baseStudent){
         Student student = new Student();

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

@@ -486,4 +486,16 @@
     <select id="queryByUserIdAndStatus" resultMap="CloudTeacherOrder">
         select cto.* from cloud_teacher_order cto where cto.student_id_ = #{userId} and cto.status_ = #{status}
     </select>
+    <select id="getWaitActivateMap" resultType="java.util.Map">
+        select cto.organ_id_,COUNT(DISTINCT cto.student_id_) from cloud_teacher_order cto
+        left join student s ON s.user_id_ = cto.student_id_
+        where cto.status_ = 1 AND (s.membership_end_time_ &lt; NOW() OR s.membership_end_time_ IS NULL)
+        <if test="organIds != null and organIds.size > 0">
+            AND cto.organ_id_ IN
+            <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                #{organId}
+            </foreach>
+        </if>
+        group by cto.organ_id_
+    </select>
 </mapper>

+ 53 - 4
mec-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -633,11 +633,11 @@
         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
+        LEFT JOIN student_registration sr ON smcr.user_id_ = sr.user_id_
+        LEFT JOIN music_group mg ON mg.id_ = sr.music_group_id_
+        WHERE sr.music_group_status_ = 'NORMAL' AND mg.status_ = 'PROGRESS'
         AND smcr.create_time_ > date_sub(curdate(),INTERVAL 0 day)
-            AND su.organ_id_ IN
+            AND mg.organ_id_ IN
             <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
                 #{organId}
             </foreach>
@@ -698,6 +698,23 @@
         </foreach>
 		GROUP BY u.`organ_id_` 
     </select>
+    <select id="getOrganActiveCloudStudyStudentNum1" resultType="java.util.Map">
+        SELECT mg.`organ_id_` 'key',count(a.user_id_) 'value' FROM
+        (
+        SELECT wd.`user_id_` FROM `sys_music_compare_week_data` wd
+        WHERE wd.`train_time_` >= 3600 AND wd.`monday_` BETWEEN date(#{startTime}) and date(#{endTime})  GROUP BY `user_id_` HAVING count(*) >= 3
+        ) a
+        LEFT JOIN student_registration sr ON a.user_id_ = sr.user_id_
+        LEFT JOIN music_group mg ON mg.id_ = sr.music_group_id_
+        WHERE sr.music_group_status_ = 'NORMAL' AND mg.status_ = 'PROGRESS'
+        <if test="organIds != null and organIds.size > 0">
+            AND mg.organ_id_ IN
+            <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                #{organId}
+            </foreach>
+        </if>
+        GROUP BY mg.`organ_id_`
+    </select>
 
     <select id="getCloudStudyStudentOverViewList" resultType="com.ym.mec.biz.dal.dto.IndexCloudStudyListDto">
         SELECT o.`name_` organName,o.`id_` organId,count(s.`user_id_`) totalStudentNum,
@@ -714,6 +731,21 @@
         </foreach>
 		GROUP BY u.`organ_id_` 
     </select>
+    <select id="getCloudStudyStudentOverViewList1" resultType="com.ym.mec.biz.dal.dto.IndexCloudStudySumDto">
+        select mg.organ_id_ organId,COUNT(DISTINCT sr.user_id_) totalStudentNum,
+               COUNT(DISTINCT CASE WHEN s.membership_end_time_ >= NOW() THEN sr.user_id_ END) effectiveStudentNum
+        from student_registration sr
+        left join music_group mg ON mg.id_ = sr.music_group_id_
+        left join student s ON s.user_id_ = sr.user_id_
+        where sr.music_group_status_ = 'NORMAL' AND mg.status_ = 'PROGRESS'
+        <if test="organIds != null and organIds.size > 0">
+            AND mg.organ_id_ IN
+            <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                #{organId}
+            </foreach>
+        </if>
+        group by mg.organ_id_;
+    </select>
 
     <select id="getOrganCloudStudyLivelyStudentNum" resultType="map">
         SELECT
@@ -756,6 +788,7 @@
     <select id="queryCloudStudyStudentData" resultType="com.ym.mec.biz.dal.dto.EduOrganStudentListDto">
         SELECT
             stu.user_id_ studentId,
+            su.organ_id_ organId,
             su.username_ studentName,
             sub.name_	subjectName,
             stu.cloud_study_sequence_days_ cloudStudyRunningDays,
@@ -763,6 +796,7 @@
             SUM(CASE WHEN smcr.play_time_ IS NULL THEN 0 ELSE play_time_ END) cloudStudyUseTime,
             COUNT(DISTINCT DATE(smcr.create_time_)) cloudStudyUseDays,
             stu.membership_end_time_ membershipEndTime,
+        CASE WHEN stu.membership_end_time_ >= NOW() THEN 1 ELSE 0 END memberFlag,
             stu.current_grade_num_ currentGradeNum,stu.current_class_ currentClass,stu.count_flag_ countFlag
         FROM (SELECT DISTINCT t1.user_id_ FROM ((
                 SELECT
@@ -1191,6 +1225,21 @@
         </if>
         group by mg.organ_id_
     </select>
+    <select id="getAgainBuyNum" resultType="java.util.Map">
+        select mg.organ_id_ 'key',COUNT(DISTINCT sr.user_id_) 'value' from student_registration sr
+        left join music_group mg ON mg.id_ = sr.music_group_id_
+        left join student s ON s.user_id_ = sr.user_id_
+        where s.membership_end_time_ >= NOW() AND sr.user_id_ IN
+        (select cto.student_id_ from cloud_teacher_order cto where cto.amount_ > 0 AND cto.status_ IN (1,2) group by cto.student_id_ HAVING COUNT(id_) > 1)
+          AND sr.music_group_status_ = 'NORMAL' AND mg.status_ = 'PROGRESS'
+        <if test="organIds!=null and organIds.size() > 0">
+            AND mg.organ_id_ IN
+            <foreach collection="organIds" item="organId" open="(" close=")" separator=",">
+                #{organId}
+            </foreach>
+        </if>
+        group by mg.organ_id_
+    </select>
     <sql id="queryStudentBasicInfoSql">
         <where>
             AND su.lock_flag_ = 0 AND su.del_flag_ = 0

+ 24 - 6
mec-biz/src/main/resources/config/mybatis/StudentStatisticsMapper.xml

@@ -602,7 +602,7 @@
 		from student_statistics ss
 		left join (select COUNT(cssp.id_) course_sum_,cssp.user_id_,COUNT(distinct cssp.course_schedule_id_) course_num_ from course_schedule cs
 		left join course_schedule_student_payment cssp ON cssp.course_schedule_id_ = cs.id_
-		where DATE_FORMAT(cs.class_date_,'%Y-%m-%d') BETWEEN #{queryInfo.startDate} AND #{queryInfo.endDate} AND cs.status_ = 'OVER' AND cs.type_ = 'VIP'
+		where DATE_FORMAT(cs.class_date_,'%Y-%m-%d') BETWEEN #{startDate} AND #{queryInfo.endDate} AND cs.status_ = 'OVER' AND cs.type_ = 'VIP'
 		<include refid="com.ym.mec.biz.dal.dao.CourseScheduleDao.courseIgnore"/>
 		group by cssp.user_id_) cs ON cs.user_id_ = ss.user_id_
 		left join sys_user su ON su.id_ = ss.user_id_
@@ -628,17 +628,26 @@
 		from student_statistics ss
 		left join (select cssp.user_id_,COUNT(distinct cssp.course_schedule_id_) consumerNum from course_schedule cs
 		left join course_schedule_student_payment cssp ON cssp.course_schedule_id_ = cs.id_
-		where DATE_FORMAT(cs.class_date_,'%Y-%m') = #{queryInfo.month} AND cs.status_ = 'OVER' AND cs.type_ = 'VIP'
+		where DATE_FORMAT(cs.class_date_,'%Y-%m') = #{month} AND cs.status_ = 'OVER' AND cs.type_ = 'VIP'
 		<include refid="com.ym.mec.biz.dal.dao.CourseScheduleDao.courseIgnore"/>
 		group by cssp.user_id_) cs ON cs.user_id_ = ss.user_id_
 		left join sys_user su ON su.id_ = ss.user_id_
 		left join organization o ON o.id_ = su.organ_id_
 		where ss.group_type_ = 'VIP' AND (ss.no_schedule_num_ > 0 OR ss.sub_course_num_) AND ss.lately_year_course_consumer_ > 0
-		<if test="queryInfo.organId != null and queryInfo.organId != ''">
+		<if test="organId != null and organId != ''">
 			AND FIND_IN_SET(su.organ_id_,#{queryInfo.organId})
 		</if>
 		group by ss.user_id_ order by su.organ_id_;
 	</select>
+	<select id="countCourseConsumerDetail" resultType="java.lang.Integer">
+		select COUNT(DISTINCT ss.user_id_)
+		from student_statistics ss
+		left join sys_user su ON su.id_ = ss.user_id_
+		where ss.group_type_ = 'VIP' AND (ss.no_schedule_num_ > 0 OR ss.sub_course_num_) AND ss.lately_year_course_consumer_ > 0
+		<if test="organId != null and organId != ''">
+			AND FIND_IN_SET(su.organ_id_,#{organId})
+		</if>
+	</select>
 	<select id="queryPreCourseConsumerDetail" resultMap="StudentCourseConsumerDetailDto">
 		select o.name_ organName,su.username_,ss.user_id_,su.phone_,
 		CASE WHEN ss.no_schedule_num_ + CASE WHEN cs.course_num_ IS NULL THEN 0 ELSE cs.course_num_ END > 3
@@ -648,15 +657,24 @@
 		left join (
 		select cssp.user_id_,COUNT(distinct cssp.course_schedule_id_) course_num_ from course_schedule cs
 		left join course_schedule_student_payment cssp ON cssp.course_schedule_id_ = cs.id_
-		where DATE_FORMAT(cs.class_date_,'%Y-%m') BETWEEN #{queryInfo.startDate} AND #{queryInfo.endDate} AND cs.type_ = 'VIP'
+		where DATE_FORMAT(cs.class_date_,'%Y-%m') BETWEEN #{startDate} AND #{endDate} AND cs.type_ = 'VIP'
 		<include refid="com.ym.mec.biz.dal.dao.CourseScheduleDao.courseIgnore"/>
 		group by cssp.user_id_) cs ON ss.user_id_ = cs.user_id_
 		left join sys_user su ON su.id_ = ss.user_id_
 		left join organization o ON o.id_ = su.organ_id_
 		where ss.group_type_ = 'VIP' AND (ss.no_schedule_num_ > 0 OR ss.sub_course_num_) AND ss.lately_year_course_consumer_ > 0
-		<if test="queryInfo.organId != null and queryInfo.organId != ''">
-			AND FIND_IN_SET(su.organ_id_,#{queryInfo.organId})
+		<if test="organId != null and organId != ''">
+			AND FIND_IN_SET(su.organ_id_,#{organId})
 		</if>
 		ORDER BY su.organ_id_
 	</select>
+	<select id="countPreCourseConsumerDetail" resultType="java.lang.Integer">
+		select COUNT(DISTINCT ss.user_id_)
+		from student_statistics ss
+		left join sys_user su ON su.id_ = ss.user_id_
+		where ss.group_type_ = 'VIP' AND (ss.no_schedule_num_ > 0 OR ss.sub_course_num_) AND ss.lately_year_course_consumer_ > 0
+		<if test="organId != null and organId != ''">
+			AND FIND_IN_SET(su.organ_id_,#{organId})
+		</if>
+	</select>
 </mapper>

+ 3 - 2
mec-web/src/main/java/com/ym/mec/web/controller/StudentCourseConsumerController.java

@@ -8,6 +8,7 @@ import com.ym.mec.biz.service.OrganizationService;
 import com.ym.mec.biz.service.StudentCourseConsumerService;
 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.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -40,7 +41,7 @@ public class StudentCourseConsumerController extends BaseController {
     @ApiOperation(value = "实际课耗学员详情列表")
     @PostMapping("/queryCourseConsumerDetail")
     @PreAuthorize("@pcs.hasPermissions('studentCourseConsumer/queryCourseConsumerDetail')")
-    public HttpResponseResult<List<StudentCourseConsumerDetailDto>> queryCourseConsumerDetail(@RequestBody StudentCourseConsumerQueryInfo queryInfo){
+    public HttpResponseResult<PageInfo<StudentCourseConsumerDetailDto>> queryCourseConsumerDetail(@RequestBody StudentCourseConsumerQueryInfo queryInfo){
         queryInfo.setOrganId(organizationService.getEmployeeOrgan(queryInfo.getOrganId()));
         return succeed(studentCourseConsumerService.queryCourseConsumerDetail(queryInfo));
     }
@@ -56,7 +57,7 @@ public class StudentCourseConsumerController extends BaseController {
     @ApiOperation(value = "预计课耗学员详情列表")
     @PostMapping("/queryPreCourseConsumerDetail")
     @PreAuthorize("@pcs.hasPermissions('studentCourseConsumer/queryPreCourseConsumerDetail')")
-    public HttpResponseResult<List<StudentCourseConsumerDetailDto>> queryPreCourseConsumerDetail(@RequestBody StudentCourseConsumerQueryInfo queryInfo){
+    public HttpResponseResult<PageInfo<StudentCourseConsumerDetailDto>> queryPreCourseConsumerDetail(@RequestBody StudentCourseConsumerQueryInfo queryInfo){
         queryInfo.setOrganId(organizationService.getEmployeeOrgan(queryInfo.getOrganId()));
         return succeed(studentCourseConsumerService.queryPreCourseConsumerDetail(queryInfo));
     }

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

@@ -18,6 +18,7 @@ import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
 @Api(tags = "学生管理")
@@ -332,8 +333,8 @@ public class StudentManageController extends BaseController {
     }
 
     @ApiOperation(value = "云教练学员数据预览")
-    @GetMapping("/getCloudStudyStudentOverView")
-    public HttpResponseResult<Object> getCloudStudyStudentOverView(String organIds) throws Exception {
+    @GetMapping("/getCloudStudyStudentOverView1")
+    public HttpResponseResult<Object> getCloudStudyStudentOverView1(String organIds) throws Exception {
         List<Integer> organIdsList;
         if(StringUtils.isNotBlank(organIds)){
             organIdsList = Arrays.stream(organIds.split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toList());
@@ -368,7 +369,7 @@ public class StudentManageController extends BaseController {
 		});
         
         result.put("list", list);
-        
+
         CloudStudyStudentDataDto cloudStudyStudentDataDto = studentService.getCloudStudyStudentOverView(organIdsList);
 
         cloudStudyStudentDataDto.setCloudStudyLivelyStudentNum(list.stream().collect(Collectors.summingInt(IndexCloudStudyListDto :: getActiveStudentNum)));
@@ -379,7 +380,36 @@ public class StudentManageController extends BaseController {
         cloudStudyStudentDataDto.setVipStudentNum(list.stream().collect(Collectors.summingInt(IndexCloudStudyListDto :: getVipStudentNum)));
 
         result.put("overView", cloudStudyStudentDataDto);
-        
+
+        return succeed(result);
+    }
+
+    @ApiOperation(value = "云教练学员数据预览")
+    @GetMapping("/getCloudStudyStudentOverView")
+    public HttpResponseResult<Map<String,Object>> getCloudStudyStudentOverView(String organIds) throws Exception {
+        organIds = organizationService.getEmployeeOrgan(organIds);
+        List<Integer> organIdsList = null;
+        if(StringUtils.isNotBlank(organIds)){
+            organIdsList = Arrays.stream(organIds.split(",")).map(id->Integer.valueOf(id)).collect(Collectors.toList());
+            List<Integer> ingnoreOrganIdList = Arrays.asList(36,39,41,42,43,44,45,46,47,48,49,50,52,54,56);
+            organIdsList.removeAll(ingnoreOrganIdList);
+        }
+        List<IndexCloudStudySumDto> list = studentService.getCloudStudyStudentOverViewList1(organIdsList);
+        list = list.stream().sorted(Comparator.comparing(IndexCloudStudySumDto::getVipStudentRate).reversed()).collect(Collectors.toList());
+
+        Map<String,Object> result = new HashMap<String, Object>(2);
+        result.put("list",list);
+        CloudStudyStudentDataDto cloudStudyStudentDataDto = studentService.getCloudStudyStudentOverView(organIdsList);
+
+        cloudStudyStudentDataDto.setCloudStudyLivelyStudentNum(list.stream().collect(Collectors.summingInt(IndexCloudStudySumDto :: getActiveStudentNum)));
+        cloudStudyStudentDataDto.setTotalStudentNum(list.stream().collect(Collectors.summingInt(IndexCloudStudySumDto :: getTotalStudentNum)));
+        cloudStudyStudentDataDto.setEffectiveVipStudentNum(list.stream().collect(Collectors.summingInt(IndexCloudStudySumDto :: getEffectiveVipStudentNum)));
+        cloudStudyStudentDataDto.setWaitActivateVipStudentNum(list.stream().collect(Collectors.summingInt(IndexCloudStudySumDto :: getWaitActivateVipStudentNum)));
+        cloudStudyStudentDataDto.setVipStudentNum(list.stream().collect(Collectors.summingInt(IndexCloudStudySumDto :: getVipStudentNum)));
+        double studentNum = (double)cloudStudyStudentDataDto.getVipStudentNum();
+        cloudStudyStudentDataDto.setBuyRate(studentNum / cloudStudyStudentDataDto.getTotalStudentNum());
+        cloudStudyStudentDataDto.setAgainBuyRate(cloudStudyStudentDataDto.getAgainBuyNum() / studentNum);
+        result.put("overView",cloudStudyStudentDataDto);
         return succeed(result);
     }
 

+ 2 - 2
mec-web/src/main/resources/exportColumnMapper.ini

@@ -243,8 +243,8 @@ headColumns = ["排名", "分部", "学员总数", "活跃人数", "活跃人数
 fieldColumns = ["index", "organName", "totalStudentNum", "cloudStudyLivelyStudentNum", "cloudStudyLivelyStudentDuty+'%'", "cloudStudyUseStudentNum", "newCloudStudyStudentNum", "cloudStudyUseStudentDuty+'%'", "vipStudentNum", "vipStudentDuty+'%'", "newMemberStudentNum"]
 
 [分部云教练学员训练数据导出]
-headColumns = ["学员编号", "学员","年级","班级", "手机号", "是否新用户", "是否激活", "训练总时长", "连续训练天数", "乐团", "乐团主管", "所属学校", "声部",  "声部老师", "是否有小课","训练次数", "训练天数", "训练平均时长", "会员有效期", "是否服务", "是否运营", "是否云教练活动目标学员", "活动消费金额", "关心包", "加油包", "未上课数", "vip课剩余课时", "网管课剩余课时"]
-fieldColumns = ["studentId", "studentName","currentGradeNum","currentClass", "phone", "newUser?'是':'否'", "enable?'是':'否'", "cloudStudyUseTime+'分钟'", "cloudStudyRunningDays+'天'", "musicGroupNames", "educationName", "schoolNames","subjectName", "subjectTeacherName", "hasVipGroup>0?'是':'否'", "cloudStudyUseNum+'次'", "cloudStudyUseDays+'天'",         "cloudStudyUseAvgTime+'分钟'", "membershipEndTime", "serviceTag>0?'是':'否'", "operatingTag>0?'是':'否'","countFlag == null?'否':countFlag == 1?'是':'否'","activeAmount",         "carePackage>0?carePackage>1?'已使用':'可用':'不可用'", "comeOnPackage>0?comeOnPackage>1?'已使用':'可用':'不可用'",         "notStartCourseNum", "notStartVipCourseNum", "notStartPracticeCourseNum"]
+headColumns = ["分部", "学员编号", "学员","年级","班级", "手机号", "是否新用户", "是否激活", "是否会员", "训练总时长", "连续训练天数", "乐团", "乐团主管", "所属学校", "声部", "声部老师",  "是否有小课","训练次数", "训练天数", "训练平均时长", "会员有效期", "是否服务", "是否运营", "是否云教练活动目标学员", "活动消费金额", "关心包", "加油包", "未上课数", "vip课剩余课时", "网管课剩余课时"]
+fieldColumns = ["organName","studentId", "studentName","currentGradeNum","currentClass", "phone", "newUser?'是':'否'", "enable?'是':'否'", "memberFlag?'是':'否'", "cloudStudyUseTime+'分钟'", "cloudStudyRunningDays+'天'", "musicGroupNames", "educationName", "schoolNames","subjectName","subjectTeacherName",  "hasVipGroup>0?'是':'否'", "cloudStudyUseNum+'次'", "cloudStudyUseDays+'天'",         "cloudStudyUseAvgTime+'分钟'", "membershipEndTime", "serviceTag>0?'是':'否'", "operatingTag>0?'是':'否'","countFlag == null?'否':countFlag == 1?'是':'否'","activeAmount",         "carePackage>0?carePackage>1?'已使用':'可用':'不可用'", "comeOnPackage>0?comeOnPackage>1?'已使用':'可用':'不可用'",         "notStartCourseNum", "notStartVipCourseNum", "notStartPracticeCourseNum"]
 
 [分部云教练活动统计数据导出]
 headColumns = ["分部", "购买人数", "购买金额", "目标金额", "人均购买金额", "目标人数", "目标达成率"]