Browse Source

Merge branch 'cloud_study_export' into cloud_study_video

Joburgess 3 years ago
parent
commit
e780c73493
26 changed files with 618 additions and 56 deletions
  1. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleStudentPaymentDao.java
  2. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java
  3. 7 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  4. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentRegistrationDao.java
  5. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentVisitDao.java
  6. 0 7
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysMusicCompareRecordDao.java
  7. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CountStudentTrainDataDto.java
  8. 279 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/EduOrganStudentListExportDto.java
  9. 10 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysMusicCompareRecordQueryInfo.java
  10. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/service/StudentService.java
  11. 6 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java
  12. 4 3
      mec-biz/src/main/java/com/ym/mec/biz/service/SysMusicCompareRecordService.java
  13. 11 2
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java
  14. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SporadicChargeInfoImpl.java
  15. 110 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  16. 60 5
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java
  17. 14 0
      mec-biz/src/main/resources/config/mybatis/CourseScheduleStudentPaymentMapper.xml
  18. 10 0
      mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml
  19. 15 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  20. 15 0
      mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml
  21. 6 0
      mec-biz/src/main/resources/config/mybatis/StudentVisitMapper.xml
  22. 27 27
      mec-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml
  23. 2 2
      mec-common/common-core/src/main/java/com/ym/mec/common/page/QueryInfo.java
  24. 0 2
      mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java
  25. 0 2
      mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupPaymentCalenderController.java
  26. 9 5
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java

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

@@ -316,6 +316,8 @@ public interface CourseScheduleStudentPaymentDao extends BaseDAO<Long, CourseSch
      */
     int countStudentNotStartCourseNumWithCourseType(@Param("studentId") Integer studentId,
                                                     @Param("courseScheduleType") CourseSchedule.CourseScheduleType courseScheduleType);
+    List<Map<Integer, Integer>> countStudentsNotStartCourseNumWithCourseType(@Param("studentIds") List<Integer> studentIds,
+                                                    @Param("courseScheduleType") CourseSchedule.CourseScheduleType courseScheduleType);
 
     /**
      * 批量操作节拍器状态

+ 7 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MusicGroupDao.java

@@ -469,4 +469,11 @@ public interface MusicGroupDao extends BaseDAO<String, MusicGroup> {
 	 * @return java.util.List<java.lang.String>
 	 */
     List<TeacherMusicStudentOverViewDto> queryTeacherMusicStudentOverView(@Param("musicGroupIds") List<String> musicGroupIds);
+
+    /**
+     * 获取在读,进行中的乐团名称
+     * @param studentIds
+     * @return
+     */
+    List<Map<Integer, String>> queryNormalGroupName(@Param("studentIds") List<Integer> studentIds);
 }

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

@@ -372,4 +372,11 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
      * @return java.util.Set<java.lang.Integer>
      */
     Set<Integer> getValidVipStudentIds();
+
+    /**
+     * 获取老师关联的有课的学员列表
+     * @param teacherId
+     * @return
+     */
+    List<Integer> getStudentByHasCourse(Integer teacherId);
 }

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

@@ -675,6 +675,7 @@ public interface StudentRegistrationDao extends BaseDAO<Long, StudentRegistratio
      * @return java.util.List<java.util.Map<java.lang.Integer,java.lang.String>>
      */
     List<Map<Integer, String>> queryStudentMusicGroupNamesMap(@Param("studentIds") List<Integer> studentIds);
+    List<Map<Integer, String>> queryStudentSchoolNamesMap(@Param("studentIds") List<Integer> studentIds);
 
     /**
      * 获取进行中在读的学员列表

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

@@ -64,4 +64,15 @@ public interface StudentVisitDao extends BaseDAO<Integer, StudentVisit> {
      * @return
      */
     List<TeacherVisitDto> getTeacherVisitCount(@Param("teacherIds") List<Integer> teacherIds, @Param("startTime") Date startTime, @Param("endTime") Date endTime);
+
+    /**
+     * 时间段内是否有训练统计的回访
+     * @param teacherId
+     * @param addDays1
+     * @param addDays3
+     * @return
+     */
+    List<Integer> queryRecordVisitStudentIds(@Param("teacherId") Integer teacherId,
+                                             @Param("addDays1") Date addDays1,
+                                             @Param("addDays3") Date addDays3);
 }

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

@@ -65,13 +65,6 @@ public interface SysMusicCompareRecordDao extends BaseDAO<Long, SysMusicCompareR
      * @param params
      * @return
      */
-    int countStudentTrain(Map<String, Object> params);
-
-    /**
-     * 老师端首页学员训练统计
-     * @param params
-     * @return
-     */
     List<CountStudentTrainDataDto> queryStudentTrain(Map<String, Object> params);
 
     /**

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CountStudentTrainDataDto.java

@@ -23,6 +23,16 @@ public class CountStudentTrainDataDto {
 
     private String musicGroupName;
 
+    private Integer visitFlag;
+
+    public Integer getVisitFlag() {
+        return visitFlag;
+    }
+
+    public void setVisitFlag(Integer visitFlag) {
+        this.visitFlag = visitFlag;
+    }
+
     public String getMusicGroupName() {
         return musicGroupName;
     }

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

@@ -0,0 +1,279 @@
+package com.ym.mec.biz.dal.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/8/17 0017
+ */
+public class EduOrganStudentListExportDto {
+
+    @ApiModelProperty("学员编号")
+    private Integer studentId;
+
+    @ApiModelProperty("姓名")
+    private String studentName;
+
+    @ApiModelProperty("手机号")
+    private String phone;
+
+    @ApiModelProperty("指导老师编号")
+    private Integer teacherId;
+
+    @ApiModelProperty("指导老师名称")
+    private String teacherName;
+
+    @ApiModelProperty("声部编号")
+    private Integer subjectId;
+
+    @ApiModelProperty("声部名称")
+    private String subjectName;
+
+    @ApiModelProperty("乐团名称")
+    private String musicGroupNames;
+
+    @ApiModelProperty("所属学校")
+    private String schoolNames;
+
+    private boolean newUser;
+
+    @ApiModelProperty(value = "关心包:0:默认不可用;1:可用;2:已使用;")
+    private int carePackage;
+
+    @ApiModelProperty(value = "加油包:0:默认不可用;1:可用;2:已使用;")
+    private int comeOnPackage;
+
+    @ApiModelProperty("是否激活")
+    private boolean enable;
+
+    private int serviceTag;
+
+    private int operatingTag;
+
+    private int notStartCourseNum;
+
+    private int notStartVipCourseNum;
+
+    private int notStartPracticeCourseNum;
+
+    @ApiModelProperty("是否有小课")
+    private int hasVipGroup;
+
+    @ApiModelProperty("训练次数")
+    private int cloudStudyUseNum;
+
+    @ApiModelProperty("平均时长")
+    private double cloudStudyUseAvgTime;
+
+    @ApiModelProperty("总时长")
+    private  double cloudStudyUseTime;
+
+    @ApiModelProperty("连续天数")
+    private int cloudStudyRunningDays;
+
+    @ApiModelProperty("使用天数")
+    private int cloudStudyUseDays;
+
+    @ApiModelProperty("会员有效期")
+    private String membershipEndTime;
+
+    public Integer getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Integer studentId) {
+        this.studentId = studentId;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public Integer getTeacherId() {
+        return teacherId;
+    }
+
+    public void setTeacherId(Integer teacherId) {
+        this.teacherId = teacherId;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    public Integer getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Integer subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public String getMusicGroupNames() {
+        return musicGroupNames;
+    }
+
+    public void setMusicGroupNames(String musicGroupNames) {
+        this.musicGroupNames = musicGroupNames;
+    }
+
+    public int getHasVipGroup() {
+        return hasVipGroup;
+    }
+
+    public void setHasVipGroup(int hasVipGroup) {
+        this.hasVipGroup = hasVipGroup;
+    }
+
+    public int getCloudStudyUseNum() {
+        return cloudStudyUseNum;
+    }
+
+    public void setCloudStudyUseNum(int cloudStudyUseNum) {
+        this.cloudStudyUseNum = cloudStudyUseNum;
+    }
+
+    public double getCloudStudyUseAvgTime() {
+        return cloudStudyUseAvgTime;
+    }
+
+    public void setCloudStudyUseAvgTime(double cloudStudyUseAvgTime) {
+        this.cloudStudyUseAvgTime = cloudStudyUseAvgTime;
+    }
+
+    public double getCloudStudyUseTime() {
+        return cloudStudyUseTime;
+    }
+
+    public void setCloudStudyUseTime(double cloudStudyUseTime) {
+        this.cloudStudyUseTime = cloudStudyUseTime;
+    }
+
+    public int getCloudStudyRunningDays() {
+        return cloudStudyRunningDays;
+    }
+
+    public void setCloudStudyRunningDays(int cloudStudyRunningDays) {
+        this.cloudStudyRunningDays = cloudStudyRunningDays;
+    }
+
+    public String getMembershipEndTime() {
+        return membershipEndTime;
+    }
+
+    public void setMembershipEndTime(String membershipEndTime) {
+        this.membershipEndTime = membershipEndTime;
+    }
+
+    public int getCloudStudyUseDays() {
+        return cloudStudyUseDays;
+    }
+
+    public void setCloudStudyUseDays(int cloudStudyUseDays) {
+        this.cloudStudyUseDays = cloudStudyUseDays;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public String getSchoolNames() {
+        return schoolNames;
+    }
+
+    public void setSchoolNames(String schoolNames) {
+        this.schoolNames = schoolNames;
+    }
+
+    public boolean isNewUser() {
+        return newUser;
+    }
+
+    public void setNewUser(boolean newUser) {
+        this.newUser = newUser;
+    }
+
+    public int getCarePackage() {
+        return carePackage;
+    }
+
+    public void setCarePackage(int carePackage) {
+        this.carePackage = carePackage;
+    }
+
+    public int getComeOnPackage() {
+        return comeOnPackage;
+    }
+
+    public void setComeOnPackage(int comeOnPackage) {
+        this.comeOnPackage = comeOnPackage;
+    }
+
+    public boolean isEnable() {
+        return enable;
+    }
+
+    public void setEnable(boolean enable) {
+        this.enable = enable;
+    }
+
+    public int getServiceTag() {
+        return serviceTag;
+    }
+
+    public void setServiceTag(int serviceTag) {
+        this.serviceTag = serviceTag;
+    }
+
+    public int getOperatingTag() {
+        return operatingTag;
+    }
+
+    public void setOperatingTag(int operatingTag) {
+        this.operatingTag = operatingTag;
+    }
+
+    public int getNotStartCourseNum() {
+        return notStartCourseNum;
+    }
+
+    public void setNotStartCourseNum(int notStartCourseNum) {
+        this.notStartCourseNum = notStartCourseNum;
+    }
+
+    public int getNotStartVipCourseNum() {
+        return notStartVipCourseNum;
+    }
+
+    public void setNotStartVipCourseNum(int notStartVipCourseNum) {
+        this.notStartVipCourseNum = notStartVipCourseNum;
+    }
+
+    public int getNotStartPracticeCourseNum() {
+        return notStartPracticeCourseNum;
+    }
+
+    public void setNotStartPracticeCourseNum(int notStartPracticeCourseNum) {
+        this.notStartPracticeCourseNum = notStartPracticeCourseNum;
+    }
+}

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysMusicCompareRecordQueryInfo.java

@@ -31,6 +31,16 @@ public class SysMusicCompareRecordQueryInfo extends QueryInfo {
 
     private HeardLevelEnum heardLevel;
 
+    private Boolean visitFlag;
+
+    public Boolean getVisitFlag() {
+        return visitFlag;
+    }
+
+    public void setVisitFlag(Boolean visitFlag) {
+        this.visitFlag = visitFlag;
+    }
+
     public FeatureType getFeatureType() {
         return featureType;
     }

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

@@ -108,6 +108,7 @@ public interface StudentService extends BaseService<Integer, Student> {
      * @return com.ym.mec.biz.dal.dto.StatDto
      */
     StatDto organStudentData(StudentQueryInfo queryInfo);
+    StatDto exportOrganStudentData(StudentQueryInfo queryInfo);
 
     List<EduOrganStudentDataDto> organStudentOverView(List<Integer> organIds);
 

+ 6 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java

@@ -245,6 +245,12 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
     //云教练试用时间最晚截止时间
     String EXPERIENCE_MEMBERSHIP_END_TIME = "experience_membership_end_time";
 
+    //云教练训练时长小于80分钟需要回访
+    String STUDENT_CLOUD_TEACHER_TOTAL_PLAY_TIME = "student_cloud_teacher_total_play_time";
+
+    //云教练训练次数小于4次需要回访
+    String STUDENT_CLOUD_TEACHER_TRAIN_NUM = "student_cloud_teacher_train_num";
+
     /**
      * @return com.ym.mec.biz.dal.entity.SysConfig
      * @params paramName

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

@@ -1,13 +1,14 @@
 package com.ym.mec.biz.service;
 
-import com.alibaba.fastjson.JSONObject;
-import com.ym.mec.biz.dal.dto.*;
+import com.ym.mec.biz.dal.dto.CountStudentTrainDataDto;
+import com.ym.mec.biz.dal.dto.MusicCompareRankingDto;
+import com.ym.mec.biz.dal.dto.SoundCompareHelper;
+import com.ym.mec.biz.dal.dto.StatDto;
 import com.ym.mec.biz.dal.entity.SysMusicCompareRecord;
 import com.ym.mec.biz.dal.page.SysMusicCompareRecordQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
 
-import java.util.List;
 import java.util.Map;
 
 public interface SysMusicCompareRecordService extends BaseService<Long, SysMusicCompareRecord> {

+ 11 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MusicGroupServiceImpl.java

@@ -2627,6 +2627,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         studentPaymentOrder.setUpdateTime(date);
         studentPaymentOrder.setVersion(0);
         studentPaymentOrderService.insert(studentPaymentOrder);
+        calenderDetail.setPaymentStatus(PaymentStatus.PROCESSING);
         calenderDetail.setPaymentOrderId(studentPaymentOrder.getId());
         musicGroupPaymentCalenderDetailDao.update(calenderDetail);
         
@@ -2746,9 +2747,11 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         Map<Integer, String> push = new HashMap<>(1);
         push.put(userId, userId.toString());
         yimei.put(userId, studentRegistration.getParentsPhone());
+
+        MusicGroupPaymentCalenderDetail calenderDetail = musicGroupPaymentCalenderDetailDao.findByOrderId(studentPaymentOrder.getId());
+        
         if (studentPaymentOrder.getStatus() == SUCCESS) {
             //当前乐团报名是否赠送乐团网管课
-            MusicGroupPaymentCalenderDetail calenderDetail = musicGroupPaymentCalenderDetailDao.findByOrderId(studentPaymentOrder.getId());
             MusicGroupStudentFee musicGroupStudentFee = musicGroupPaymentCalenderService.updateCalender(calenderDetail.getId(), studentRegistration.getUserId());
             if (musicGroupStudentFee != null) {
                 musicGroupStudentFee.setUpdateTime(date);
@@ -2918,6 +2921,12 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
             }
             return true;
         } else {
+
+    		//更新学生的缴费记录状态
+    		calenderDetail.setPaymentStatus(MusicGroupStudentFee.PaymentStatus.NON_PAYMENT);
+    		calenderDetail.setUpdateTime(date);
+    		musicGroupPaymentCalenderDetailDao.update(calenderDetail);
+    		
             if (studentPaymentOrder.getBalancePaymentAmount() != null && studentPaymentOrder.getBalancePaymentAmount().doubleValue() > 0) {
                 sysUserCashAccountService.updateBalance(userId, studentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS,
                         "乐团续费失败");
@@ -3249,7 +3258,7 @@ public class MusicGroupServiceImpl extends BaseServiceImpl<String, MusicGroup> i
         }
         //课程团和amr可以互相修改,但不可以改为会员团
         if(group.getCourseViewType() != musicGroup.getCourseViewType()){
-            if(group.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE){
+            if(group.getStatus() == MusicGroupStatusEnum.PROGRESS && group.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE){
                 throw new BizException("会员收费乐团不可更改收费模式");
             }
             if(musicGroup.getCourseViewType() == CourseViewTypeEnum.MEMBER_FEE){

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SporadicChargeInfoImpl.java

@@ -72,8 +72,8 @@ public class SporadicChargeInfoImpl extends BaseServiceImpl<Integer, SporadicCha
         SporadicChargeInfo info = sporadicChargeInfoDao.get(Integer.parseInt(studentPaymentOrder.getMusicGroupId()));
 
         Map<Integer, String> map = new HashMap<>();
-        map.put(userId, sysUser.getPhone());
         Map<Integer, String> yimei = new HashMap<>();
+        yimei.put(userId, sysUser.getPhone());
         map.put(userId, userId.toString());
         if (studentPaymentOrder.getStatus() == DealStatusEnum.SUCCESS) {
             try {

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

@@ -1,5 +1,6 @@
 package com.ym.mec.biz.service.impl;
 
+import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.*;
 import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
@@ -20,6 +21,7 @@ import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.ss.formula.functions.T;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -74,6 +76,9 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     @Autowired
     private IndexBaseMonthDataDao indexBaseMonthDataDao;
 
+    @Autowired
+    private EmployeeDao employeeDao;
+
     @Override
     public BaseDAO<Integer, Student> getDAO() {
         return studentDao;
@@ -511,6 +516,111 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
     }
 
     @Override
+    public StatDto exportOrganStudentData(StudentQueryInfo queryInfo) {
+        PageInfo<EduOrganStudentListExportDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<EduOrganStudentListDto> dataList1 = new ArrayList<>();
+        List<EduOrganStudentListExportDto> dataList = new ArrayList<>();
+        int count = studentDao.countCloudStudyStudentData(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList1 = studentDao.queryCloudStudyStudentData(params);
+            List<Integer> studentIds = dataList1.stream().map(EduOrganStudentListDto::getStudentId).collect(Collectors.toList());
+
+
+            List<Map<Integer, String>> studentGroupNamesMapList = studentRegistrationDao.queryStudentMusicGroupNamesMap(studentIds);
+            Map<Integer, String> studentGroupNamesMap = MapUtil.convertIntegerMap(studentGroupNamesMapList);
+            Set<Integer> hasVipCourseStudentIds = courseScheduleStudentPaymentDao.getHasVipCourseStudentIds(studentIds);
+
+            List<Map<Integer, String>> studentSchoolNamesMapList = studentRegistrationDao.queryStudentSchoolNamesMap(studentIds);
+            Map<Integer, String> studentSchoolNamesMap = MapUtil.convertIntegerMap(studentSchoolNamesMapList);
+
+            List<SysUser> users = employeeDao.getUsers(studentIds);
+            Map<Integer, SysUser> idUserMap = new HashMap<>();
+            if(!CollectionUtils.isEmpty(users)){
+                idUserMap = users.stream().collect(Collectors.toMap(SysUser::getId, u -> u, (u1, u2) -> u1));
+            }
+
+            List<Student> students = studentDao.findByStudentIds(studentIds);
+            Map<Integer, Student> idStudentMap = new HashMap<>();
+            if(!CollectionUtils.isEmpty(students)){
+                idStudentMap = students.stream().collect(Collectors.toMap(Student::getUserId, s->s, (s1, s2)->s1));
+            }
+
+            List<Map<Integer, Integer>> studentNotStartCourseNumMapList = courseScheduleStudentPaymentDao.countStudentsNotStartCourseNumWithCourseType(studentIds, null);
+            Map<Integer, Long> studentNotStartCourseNumMap = new HashMap<>();
+            if(!CollectionUtils.isEmpty(studentNotStartCourseNumMapList)){
+                studentNotStartCourseNumMap = MapUtil.convertIntegerMap(studentNotStartCourseNumMapList);
+            }
+            List<Map<Integer, Integer>> studentNotStartVipCourseNumMapList = courseScheduleStudentPaymentDao.countStudentsNotStartCourseNumWithCourseType(studentIds, CourseSchedule.CourseScheduleType.VIP);
+            Map<Integer, Long> studentNotStartVipCourseNumMap = new HashMap<>();
+            if(!CollectionUtils.isEmpty(studentNotStartVipCourseNumMapList)){
+                studentNotStartVipCourseNumMap = MapUtil.convertIntegerMap(studentNotStartVipCourseNumMapList);
+            }
+            List<Map<Integer, Integer>> studentNotStartPracticeCourseNumMapList = courseScheduleStudentPaymentDao.countStudentsNotStartCourseNumWithCourseType(studentIds, CourseSchedule.CourseScheduleType.PRACTICE);
+            Map<Integer, Long> studentNotStartPracticeCourseNumMap = new HashMap<>();
+            if(!CollectionUtils.isEmpty(studentNotStartPracticeCourseNumMapList)){
+                studentNotStartPracticeCourseNumMap = MapUtil.convertIntegerMap(studentNotStartPracticeCourseNumMapList);
+            }
+
+            for (EduOrganStudentListDto eduOrganStudentListDto : dataList1) {
+                EduOrganStudentListExportDto data = new EduOrganStudentListExportDto();
+                BeanUtils.copyProperties(eduOrganStudentListDto, data);
+                if(studentGroupNamesMap.containsKey(data.getStudentId())){
+                    data.setMusicGroupNames(studentGroupNamesMap.get(data.getStudentId()));
+                }
+                if(studentSchoolNamesMap.containsKey(data.getStudentId())){
+                    data.setSchoolNames(studentSchoolNamesMap.get(data.getStudentId()));
+                }
+                if(hasVipCourseStudentIds.contains(data.getStudentId())){
+                    data.setHasVipGroup(1);
+                }
+                if(data.getCloudStudyUseNum()>0 && data.getCloudStudyUseTime()>0){
+                    data.setCloudStudyUseAvgTime(data.getCloudStudyUseTime()/data.getCloudStudyUseNum());
+                }
+                data.setCloudStudyUseTime(data.getCloudStudyUseTime()/60);
+                data.setCloudStudyUseAvgTime(data.getCloudStudyUseAvgTime()/60);
+
+                if(idUserMap.containsKey(eduOrganStudentListDto.getStudentId())){
+                    SysUser sysUser = idUserMap.get(data.getStudentId());
+                    data.setPhone(sysUser.getPhone());
+                    data.setEnable(StringUtils.isNotBlank(sysUser.getPassword()));
+                }
+
+                if(idStudentMap.containsKey(data.getStudentId())){
+                    Student student = idStudentMap.get(data.getStudentId());
+                    data.setNewUser(student.getIsNewUser());
+                    data.setServiceTag(Objects.isNull(student.getServiceTag())?0:student.getServiceTag());
+                    data.setOperatingTag(Objects.isNull(student.getOperatingTag())?0:student.getOperatingTag());
+                    data.setCarePackage(Objects.nonNull(student.getCarePackage())?student.getCarePackage():0);
+                    data.setComeOnPackage(Objects.isNull(student.getComeOnPackage())?0:student.getComeOnPackage());
+                }
+
+                if(studentNotStartCourseNumMap.containsKey(data.getStudentId())){
+                    data.setNotStartCourseNum(studentNotStartCourseNumMap.get(data.getStudentId()).intValue());
+                }
+                if(studentNotStartVipCourseNumMap.containsKey(data.getStudentId())){
+                    data.setNotStartVipCourseNum(studentNotStartVipCourseNumMap.get(data.getStudentId()).intValue());
+                }
+                if(studentNotStartPracticeCourseNumMap.containsKey(data.getStudentId())){
+                    data.setNotStartPracticeCourseNum(studentNotStartPracticeCourseNumMap.get(data.getStudentId()).intValue());
+                }
+
+                dataList.add(data);
+            }
+        }
+        pageInfo.setRows(dataList);
+
+        StatDto result = new StatDto();
+        result.setDetail(pageInfo);
+
+        return result;
+    }
+
+    @Override
     public List<EduOrganStudentDataDto> organStudentOverView(List<Integer> organIds) {
         List<Organization> organs = organizationDao.getOrgans(organIds);
 

+ 60 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysMusicCompareRecordServiceImpl.java

@@ -17,6 +17,7 @@ import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.biz.service.SysMusicCompareRecordService;
 import com.ym.mec.biz.service.SysMusicCompareWeekDataService;
 import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
@@ -49,11 +50,16 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 	@Autowired
 	private StudentDao studentDao;
 	@Autowired
+	private StudentVisitDao studentVisitDao;
+	@Autowired
 	private SysMessageService sysMessageService;
 
 	@Autowired
 	private SysConfigDao sysConfigDao;
 
+	@Autowired
+	private MusicGroupDao musicGroupDao;
+
 	@Override
 	public BaseDAO<Long, SysMusicCompareRecord> getDAO() {
 		return sysMusicCompareRecordDao;
@@ -341,16 +347,65 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 
     @Override
     public PageInfo<CountStudentTrainDataDto> countStudentTrain(SysMusicCompareRecordQueryInfo queryInfo) {
+		if(queryInfo.getStartTime() == null || queryInfo.getEndTime() == null){
+			throw new BizException("请选择训练时间");
+		}
 		PageInfo<CountStudentTrainDataDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
 		Map<String, Object> params = new HashMap<String, Object>();
+		String sort = queryInfo.getSort();
+		if(StringUtils.isNotEmpty(sort)){
+			queryInfo.setSort(sort.equals("trainNum")?"train_num_":sort.equals("totalPlayTime")?"total_play_time_":sort.equals("recordNum")?"record_num_":"train_day_");
+		}
 		MapUtil.populateMap(params, queryInfo);
-
+		Integer visitFlag = 0;
+		if(queryInfo.getVisitFlag() != null && queryInfo.getVisitFlag()){
+			//获取乐团在读,有vip网管课的学员列表
+			List<Integer> hasCourseUserIds = studentDao.getStudentByHasCourse(queryInfo.getTeacherId());
+			if(hasCourseUserIds == null || hasCourseUserIds.size() == 0){
+				return pageInfo;
+			}
+			params.put("hasCourseUserIds",hasCourseUserIds);
+			//获取所选时间段下一周的日期
+			Date addDays1 = DateUtil.addDays(DateUtil.toDate(queryInfo.getEndTime()), 1);
+			Date addDays3 = DateUtil.addDays(DateUtil.toDate(queryInfo.getEndTime()), 3);
+			//有回访过的学员列表
+			List<Integer> studentIds = studentVisitDao.queryRecordVisitStudentIds(queryInfo.getTeacherId(),addDays1,addDays3);
+			if(studentIds != null && studentIds.size() > 0){
+				params.put("visitStudents",studentIds);
+			}
+			Date date = DateUtil.toDate(DateUtil.format(new Date(),DateUtil.ISO_EXPANDED_DATE_FORMAT));
+			int daysBetween = DateUtil.daysBetween(addDays1, date);
+			//每周只有前三天可以回访
+			if(daysBetween >= 0 && daysBetween <= 2){
+				visitFlag = 1;
+			}
+			params.put("having",1);
+		}
+		String totalTime = sysConfigDao.findConfigValue(SysConfigService.STUDENT_CLOUD_TEACHER_TOTAL_PLAY_TIME);
+		if(StringUtils.isEmpty(totalTime)){
+			totalTime = "80";
+		}
+		params.put("totalTime",Integer.parseInt(totalTime));
+		String trainNum = sysConfigDao.findConfigValue(SysConfigService.STUDENT_CLOUD_TEACHER_TRAIN_NUM);
+		if(StringUtils.isEmpty(trainNum)){
+			trainNum = "4";
+		}
+		params.put("trainNum",Integer.parseInt(trainNum));
+		int count = sysMusicCompareRecordDao.queryStudentTrain(params).size();
 		List<CountStudentTrainDataDto> dataList = new ArrayList<>();
-		int count = sysMusicCompareRecordDao.countStudentTrain(params);
-		if (count > 0) {
-			pageInfo.setTotal(count);
+		if(count > 0){
 			params.put("offset", pageInfo.getOffset());
-			dataList =sysMusicCompareRecordDao.queryStudentTrain(params);
+			dataList = sysMusicCompareRecordDao.queryStudentTrain(params);
+			List<Integer> studentIds = dataList.stream().map(e -> e.getUserId()).collect(Collectors.toList());
+			//获取学员在读,进行中的乐团名称
+			Map<Integer,String> groupNameMap = MapUtil.convertMybatisMap(musicGroupDao.queryNormalGroupName(studentIds));
+			pageInfo.setTotal(count);
+			for (CountStudentTrainDataDto e : dataList) {
+				e.setMusicGroupName(groupNameMap.get(e.getUserId()));
+				if(visitFlag == 1){
+					e.setVisitFlag(visitFlag);
+				}
+			}
 		}
 		pageInfo.setRows(dataList);
 		return pageInfo;

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

@@ -492,6 +492,20 @@
 		</if>
 		AND CONCAT(cs.class_date_, ' ', cs.start_class_time_) &gt; NOW() AND cs.pre_course_flag_ = 0
 	</select>
+	<select id="countStudentsNotStartCourseNumWithCourseType" resultType="map">
+		SELECT cssp.user_id_ 'key',COUNT(DISTINCT cssp.course_schedule_id_) 'value'
+		FROM course_schedule_student_payment cssp
+		LEFT JOIN course_schedule cs ON cs.id_=cssp.course_schedule_id_
+		WHERE cssp.user_id_ IN
+		<foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+			#{studentId}
+		</foreach>
+		<if test="courseScheduleType != null">
+			AND cs.type_= #{courseScheduleType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+		</if>
+		AND CONCAT(cs.class_date_, ' ', cs.start_class_time_) &gt; NOW() AND cs.pre_course_flag_ = 0
+		GROUP BY cssp.user_id_
+	</select>
 	<select id="queryMidiByUserIdsAndCourseId" resultType="java.util.Map">
 		SELECT cssp.user_id_ 'key',CASE WHEN cssp.open_play_midi_ IS NULL THEN '' ELSE cssp.open_play_midi_ END 'value' FROM course_schedule_student_payment cssp
 		WHERE cssp.user_id_ IN

+ 10 - 0
mec-biz/src/main/resources/config/mybatis/MusicGroupMapper.xml

@@ -964,4 +964,14 @@
         GROUP BY sr.music_group_id_
         ORDER BY mg.create_time_ DESC, mg.id_
     </select>
+    <select id="queryNormalGroupName" resultType="java.util.Map">
+        SELECT sr.user_id_ 'key',GROUP_CONCAT(mg.name_) 'value' FROM student_registration sr
+        LEFT JOIN music_group mg ON mg.id_ = sr.music_group_id_
+        WHERE mg.status_ = 'PROGRESS' AND sr.music_group_status_ = 'NORMAL'
+        AND sr.user_id_ IN
+        <foreach collection="studentIds" item="userId" open="(" close=")" separator=",">
+            #{userId}
+        </foreach>
+        GROUP BY sr.user_id_
+    </select>
 </mapper>

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

@@ -1220,6 +1220,21 @@
     <select id="getValidVipStudentIds" resultType="java.lang.Integer">
         SELECT user_id_ FROM student WHERE member_rank_setting_id_ IS NOT NULl OR experience_member_rank_setting_id_ IS NOT NULL
     </select>
+    <select id="getStudentByHasCourse" resultType="java.lang.Integer">
+        SELECT s.user_id_ FROM student s WHERE s.teacher_id_ = #{teacherId} AND s.user_id_ IN (SELECT t.user_id_ FROM (
+        (SELECT sr.user_id_
+        FROM student_registration sr
+        LEFT JOIN music_group mg ON sr.music_group_id_=mg.id_
+        WHERE mg.status_='PROGRESS'
+        AND sr.music_group_status_='NORMAL')
+        UNION ALL
+        (SELECT
+        cssp.user_id_
+        FROM course_schedule_student_payment cssp
+        LEFT JOIN course_schedule cs ON cssp.course_schedule_id_=cs.id_
+        WHERE cssp.group_type_ IN ('VIP', 'PRACTICE')
+        AND cs.status_='NOT_START'))t)
+    </select>
 
     <update id="updateGrade"><![CDATA[
         UPDATE student SET current_grade_num_=current_grade_num_+1

+ 15 - 0
mec-biz/src/main/resources/config/mybatis/StudentRegistrationMapper.xml

@@ -1687,6 +1687,21 @@
         </if>
         GROUP BY sr.user_id_
     </select>
+
+    <select id="queryStudentSchoolNamesMap" resultType="java.util.Map">
+        SELECT sr.user_id_ 'key',GROUP_CONCAT(sch.name_) 'value'
+        FROM student_registration sr
+        LEFT JOIN music_group mg ON sr.music_group_id_=mg.id_
+        LEFT JOIN school sch ON mg.school_id_=sch.id_
+        WHERE mg.status_='PROGRESS'
+        <if test="studentIds!=null and studentIds.size()>0">
+            AND sr.user_id_ IN
+            <foreach collection="studentIds" item="studentId" open="(" close=")" separator=",">
+                #{studentId}
+            </foreach>
+        </if>
+        GROUP BY sr.user_id_
+    </select>
     <select id="findStudentIds" resultType="java.lang.Integer">
         SELECT DISTINCT sr.user_id_ FROM student_registration sr
         LEFT JOIN music_group mg ON sr.music_group_id_ = mg.id_

+ 6 - 0
mec-biz/src/main/resources/config/mybatis/StudentVisitMapper.xml

@@ -195,4 +195,10 @@
         <![CDATA[ AND visit_time_ <= #{endTime} ]]>
         GROUP BY teacher_id_,date_format(visit_time_, '%Y-%m')
     </select>
+    <select id="queryRecordVisitStudentIds" resultType="java.lang.Integer">
+        SELECT DISTINCT st.user_id_ FROM student st
+        LEFT JOIN student_visit sv ON st.user_id_ = sv.student_id_
+        WHERE sv.type_ = '云教练' AND st.teacher_id_ = #{teacherId}
+        AND sv.visit_time_ BETWEEN DATE_FORMAT(#{addDays1}, '%Y%m%d') AND DATE_FORMAT(#{addDays3}, '%Y%m%d')
+    </select>
 </mapper>

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

@@ -43,11 +43,6 @@
 
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.SysMusicCompareRecord" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		<!--
-		<selectKey resultClass="int" keyProperty="id" > 
-		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
-		</selectKey>
-		-->
 		INSERT INTO sys_music_compare_record (id_,user_id_,sys_music_score_id_,heard_level_,behavior_id_,score_data_,score_,intonation_,cadence_,integrity_,
 		                                      record_file_path_,video_file_path_,device_type_,client_id_,play_time_,speed_,monday_,
 												source_time_,feature_,create_time_,update_time_)
@@ -272,23 +267,6 @@
 		GROUP BY
 			user_id_
 	</select>
-    <select id="countStudentTrain" resultType="java.lang.Integer">
-		SELECT COUNT(DISTINCT s.user_id_)
-		FROM teacher t
-				 LEFT JOIN student s ON t.id_ = s.teacher_id_
-				 LEFT JOIN sys_user su ON su.id_ = s.user_id_
-				 LEFT JOIN sys_music_compare_record mcr ON mcr.user_id_ = s.user_id_
-		<if test="startTime != null and startTime != ''">
-			AND (DATE_FORMAT(mcr.create_time_, '%Y-%m-%d') >= #{startTime} OR mcr.id_ IS NULL)
-		</if>
-		<if test="endTime != null and endTime != ''">
-			AND (DATE_FORMAT(mcr.create_time_, '%Y-%m-%d') &lt;= #{endTime} OR mcr.id_ IS NULL)
-		</if>
-		WHERE s.teacher_id_ = #{teacherId}
-		<if test="search != null and search != ''">
-			AND (su.phone_ LIKE CONCAT('%',#{search},'%') OR su.username_ LIKE CONCAT('%',#{search},'%'))
-		</if>
-	</select>
 	<resultMap id="CountStudentTrainDataDto" type="com.ym.mec.biz.dal.dto.CountStudentTrainDataDto">
 		<result property="trainNum" column="train_num_"/>
 		<result property="recordNum" column="record_num_"/>
@@ -298,17 +276,14 @@
 		<result property="phone" column="phone_"/>
 		<result property="totalPlayTime" column="total_play_time_"/>
 		<result property="trainDay" column="train_day_"/>
-		<result property="musicGroupName" column="music_group_name_"/>
 	</resultMap>
 	<select id="queryStudentTrain" resultMap="CountStudentTrainDataDto">
 		SELECT s.user_id_,su.avatar_,su.phone_,su.username_,ROUND(SUM(mcr.play_time_) / 60) total_play_time_,
 			   COUNT(DISTINCT DATE_FORMAT(mcr.create_time_,"%Y-%m-%d")) train_day_,
 			   COUNT(DISTINCT mcr.behavior_id_) train_num_,
-		COUNT(CASE WHEN mcr.feature_ = 'CLOUD_STUDY_EVALUATION' THEN mcr.behavior_id_ ELSE NULL END) record_num_,GROUP_CONCAT(DISTINCT mg.name_) music_group_name_
+		COUNT(CASE WHEN mcr.feature_ = 'CLOUD_STUDY_EVALUATION' THEN mcr.behavior_id_ ELSE NULL END) record_num_
 		FROM teacher t
 				 LEFT JOIN student s ON t.id_ = s.teacher_id_
-				 LEFT JOIN student_registration sr ON sr.user_id_ = s.user_id_ AND sr.music_group_status_ = 'NORMAL'
-				 LEFT JOIN music_group mg ON mg.id_ = sr.music_group_id_ AND mg.status_ = 'PROGRESS'
 				 LEFT JOIN sys_user su ON su.id_ = s.user_id_
 				 LEFT JOIN sys_music_compare_record mcr ON mcr.user_id_ = s.user_id_
 		<if test="startTime != null and startTime != ''">
@@ -321,8 +296,33 @@
 		<if test="search != null and search != ''">
 			AND (su.phone_ LIKE CONCAT('%',#{search},'%') OR su.username_ LIKE CONCAT('%',#{search},'%'))
 		</if>
+		<if test="visitStudents != null and visitStudents.size > 0">
+			AND s.user_id_ NOT IN
+			<foreach collection="visitStudents" open="(" close=")" item="userId" separator=",">
+				#{userId}
+			</foreach>
+		</if>
+		<if test="hasCourseUserIds != null and hasCourseUserIds.size > 0">
+			AND s.user_id_ IN
+			<foreach collection="hasCourseUserIds" open="(" close=")" item="userId" separator=",">
+				#{userId}
+			</foreach>
+		</if>
 		GROUP BY s.user_id_
-		ORDER BY total_play_time_ DESC
+		<if test="having == 1">
+			HAVING total_play_time_ &lt; ${totalTime} OR train_num_ &lt; ${trainNum}
+		</if>
+		ORDER BY
+		<if test="sort != null and sort != ''">
+			${sort}
+			<if test="order != null and order != ''">
+				${order}
+			</if>
+		</if>
+		<if test="sort == null or sort == ''">
+			total_play_time_ DESC
+		</if>
+		,s.user_id_
 		<include refid="global.limit"/>
 	</select>
 

+ 2 - 2
mec-common/common-core/src/main/java/com/ym/mec/common/page/QueryInfo.java

@@ -22,11 +22,11 @@ public class QueryInfo {
 	/**
 	 * 默认排序列
 	 */
-	private String sort = "create_time_";
+	private String sort;
 	/**
 	 * 默认排序方向
 	 */
-	private String order = "desc";
+	private String order = "DESC";
 	
 	private String search;
 	

+ 0 - 2
mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupController.java

@@ -270,8 +270,6 @@ public class MusicGroupController extends BaseController {
         }
         if (calenderDetail.getPaymentStatus() == PaymentStatus.PAID_COMPLETED) {
             throw new BizException("您已缴费,请勿重复提交");
-        } else if (calenderDetail.getPaymentStatus() == PaymentStatus.PROCESSING) {
-            throw new BizException("存在待处理的订单,请稍候尝试");
         }
         //缴费项目已开启或者单独开启
         Map renew;

+ 0 - 2
mec-student/src/main/java/com/ym/mec/student/controller/MusicGroupPaymentCalenderController.java

@@ -69,8 +69,6 @@ public class MusicGroupPaymentCalenderController extends BaseController {
         }
         if(calenderDetail.getPaymentStatus() == PaymentStatus.PAID_COMPLETED){
             throw new BizException("您已缴费,请勿重复提交");
-        }else if(calenderDetail.getPaymentStatus() == PaymentStatus.PROCESSING){
-            throw new BizException("存在待处理的订单,请稍候尝试");
         }
         if(calender.getStatus() == PaymentCalenderStatusEnum.OPEN || calenderDetail.getOpen() == 1){
             StudentRegistration studentRegistration = studentRegistrationService.queryByUserIdAndMusicGroupId(userId,musicGroupId);

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

@@ -3264,7 +3264,7 @@ public class ExportController extends BaseController {
         queryInfo.setPage(1);
         queryInfo.setRows(49999);
 
-        List<EduOrganStudentListDto> rows = ((PageInfo<EduOrganStudentListDto>)studentService.organStudentData(queryInfo).getDetail()).getRows();
+        List<EduOrganStudentListExportDto> rows = ((PageInfo<EduOrganStudentListExportDto>)studentService.exportOrganStudentData(queryInfo).getDetail()).getRows();
         if (CollectionUtils.isEmpty(rows)) {
             response.setStatus(200);
             response.setContentType("Content-Type: application/json;charset=UTF-8");
@@ -3272,16 +3272,20 @@ public class ExportController extends BaseController {
             response.flushBuffer();
             return;
         }
-        for (EduOrganStudentListDto row : rows) {
+        for (EduOrganStudentListExportDto row : rows) {
             row.setCloudStudyUseTime(Math.round(row.getCloudStudyUseTime()));
             row.setCloudStudyUseAvgTime(Math.round(row.getCloudStudyUseAvgTime()));
         }
         OutputStream outputStream = response.getOutputStream();
         try {
-            String[] header = {"学员编号", "学员", "训练总时长", "连续训练天数", "乐团", "指导老师", "声部", "是否有小课", "训练次数", "训练天数", "训练平均时长", "会员有效期"};
-            String[] body = {"studentId", "studentName", "cloudStudyUseTime+\"分钟\"", "cloudStudyRunningDays+\"天\"", "musicGroupNames",
+            String[] header = {"学员编号", "学员", "手机号", "是否新用户", "是否激活", "训练总时长", "连续训练天数", "乐团", "所属学校", "指导老师", "声部", "是否有小课",
+                    "训练次数", "训练天数", "训练平均时长", "会员有效期", "是否服务", "是否运营", "关心包", "加油包", "未上课数", "vip课剩余课时", "网管课剩余课时"};
+            String[] body = {"studentId", "studentName", "phone", "newUser?\"是\":\"否\"", "enable?\"是\":\"否\"",
+                            "cloudStudyUseTime+\"分钟\"", "cloudStudyRunningDays+\"天\"", "musicGroupNames", "schoolNames",
                             "teacherName", "subjectName", "hasVipGroup>0?\"是\":\"否\"", "cloudStudyUseNum+\"次\"", "cloudStudyUseDays+\"天\"",
-                            "cloudStudyUseAvgTime+\"分钟\"", "membershipEndTime"};
+                            "cloudStudyUseAvgTime+\"分钟\"", "membershipEndTime", "serviceTag>0?\"是\":\"否\"", "operatingTag>0?\"是\":\"否\"",
+                            "carePackage>0?carePackage>1?\"已使用\":\"可用\":\"不可用\"", "comeOnPackage>0?comeOnPackage>1?\"已使用\":\"可用\":\"不可用\"",
+                            "notStartCourseNum", "notStartVipCourseNum", "notStartPracticeCourseNum"};
             HSSFWorkbook workbook = POIUtil.exportExcel(header, body, rows);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attachment;filename=employeeInfo-" + DateUtil.getDate(new Date()) + ".xls");