Selaa lähdekoodia

Merge branch 'saas' of http://git.dayaedu.com/yonge/mec into master_saas

zouxuan 2 vuotta sitten
vanhempi
commit
6e47bae80e
22 muutettua tiedostoa jossa 150 lisäystä ja 136 poistoa
  1. 4 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java
  2. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentPaymentOrderExportDto.java
  3. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java
  4. 2 2
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroup.java
  5. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ClassGroupTypeEnum.java
  6. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportTypeEnum.java
  7. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/OrderDetailTypeEnum.java
  8. 2 0
      mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java
  9. 0 9
      mec-biz/src/main/java/com/ym/mec/biz/service/ExportService.java
  10. 18 17
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java
  11. 1 1
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupStudentMapperServiceImpl.java
  12. 21 31
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java
  13. 23 13
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java
  14. 3 3
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentServiceImpl.java
  15. 4 2
      mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  16. 2 2
      mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml
  17. 12 12
      mec-biz/src/main/resources/config/mybatis/IndexBaseMonthDataMapper.xml
  18. 12 0
      mec-biz/src/main/resources/config/mybatis/StudentMapper.xml
  19. 6 6
      mec-biz/src/main/resources/config/mybatis/StudentStatisticsMapper.xml
  20. 23 25
      mec-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml
  21. 1 1
      mec-web/src/main/java/com/ym/mec/web/controller/ExportController.java
  22. 7 3
      mec-web/src/main/resources/exportColumnMapper.ini

+ 4 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentDao.java

@@ -216,7 +216,7 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
     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<Map<Integer,Long>> getOrganActiveCloudStudyStudentNum1(@Param("organIds") List<Integer> organIds, @Param("startTime") Date startTime, @Param("endTime") Date endTime);
     
     List<Mapper> getOrganCloudTeacherStudentNum(@Param("organIds") List<Integer> organIds);
 
@@ -349,6 +349,9 @@ public interface StudentDao extends com.ym.mec.common.dal.BaseDAO<Integer, Stude
     //统计训练时长
     List<CloudTeacherSumDto> cloudTeacherSum(@Param("queryInfo") StudentCourseConsumerQueryInfo queryInfo);
 
+    //统计训练时长
+    int countTeacherSum(@Param("queryInfo") StudentCourseConsumerQueryInfo queryInfo);
+
     //统计重复购买人数
     List<Map<Integer,Long>> getAgainBuyNum(@Param("organIds") List<Integer> organIds);
 }

+ 1 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentPaymentOrderExportDto.java

@@ -47,7 +47,7 @@ public class StudentPaymentOrderExportDto extends StudentPaymentOrderRouteDto {
     private BigDecimal courseSchoolBuyAmount = BigDecimal.ZERO;
 
     //网络基础训练课程费用
-    @ApiModelProperty(value = "网络基础训练课程费用",required = true)
+    @ApiModelProperty(value = "线上基础技能课程费用",required = true)
     private BigDecimal highCourseFee = BigDecimal.ZERO;
 
     //VIP课程费用

+ 2 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CourseSchedule.java

@@ -32,7 +32,7 @@ public class CourseSchedule  extends BaseEntity{
 
         SINGLE("SINGLE", "声部课"),
         MIX("MIX", "合奏课"),
-        HIGH("HIGH", "小班课"),
+        HIGH("HIGH", "基础技能课"),
         VIP("VIP", "vip课"),
         DEMO("DEMO", "试听课"),
         COMPREHENSIVE("COMPREHENSIVE", "综合课"),
@@ -42,7 +42,7 @@ public class CourseSchedule  extends BaseEntity{
         TRAINING_MIX("TRAINING_MIX", "集训合奏课"),
         CLASSROOM("CLASSROOM", "课堂课"),
         COMM("COMM", "对外课程"),
-        HIGH_ONLINE("HIGH_ONLINE", "网络基础训练课"),
+        HIGH_ONLINE("HIGH_ONLINE", "线上基础技能课"),
         MUSIC_NETWORK("MUSIC_NETWORK", "乐团网管课");
 
 		private String code;

+ 2 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ImGroup.java

@@ -33,9 +33,9 @@ public class ImGroup extends BaseEntity {
 	private String type;
 
 	public enum GroupTypeEnum implements BaseEnum<String,GroupTypeEnum> {
-		NORMAL("NORMAL", "普通班级"), MIX("MIX", "合奏班级"), HIGH("HIGH", "提高班"),
+		NORMAL("NORMAL", "普通班级"), MIX("MIX", "合奏班级"), HIGH("HIGH", "基础技能班"),
 		VIP("VIP", "vip课"), DEMO("DEMO", "试听课"), PRACTICE("PRACTICE", "网管课"),
-		SNAP("SNAP","临时班级"), COMM("COMM", "对外课程"), HIGH_ONLINE("HIGH_ONLINE", "网络基础训练课"),
+		SNAP("SNAP","临时班级"), COMM("COMM", "对外课程"), HIGH_ONLINE("HIGH_ONLINE", "线上基础技能课"),
 		MUSIC_NETWORK("MUSIC_NETWORK","乐团网管课"),PARENT_MEETING("PARENT_MEETING","家长会"),
 		TRAINING("TRAINING","训练营"),REPERTOIRE_PLAY("REPERTOIRE_PLAY","曲目演奏课");
 

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

@@ -8,7 +8,7 @@ import com.ym.mec.common.enums.BaseEnum;
 public enum ClassGroupTypeEnum implements BaseEnum<String, ClassGroupTypeEnum> {
 	NORMAL("NORMAL", "声部班"), MIX("MIX", "合奏班"), HIGH("HIGH", "基础技能班"),
 	VIP("VIP", "vip课"), DEMO("DEMO", "试听课"), PRACTICE("PRACTICE", "网管课"), SNAP("SNAP",
-			"临时班"), COMM("COMM", "对外课程"), HIGH_ONLINE("HIGH_ONLINE", "网络基础技能班"),
+			"临时班"), COMM("COMM", "对外课程"), HIGH_ONLINE("HIGH_ONLINE", "线上基础技能班"),
 	MUSIC_NETWORK("MUSIC_NETWORK","乐团网管课");
 
 	private String code;

+ 2 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ExportTypeEnum.java

@@ -23,7 +23,8 @@ public enum ExportTypeEnum implements BaseEnum<Integer, ExportTypeEnum> {
 	EXPORT_PRE_COURSE_CONSUMER(17, "预计课耗导出"),
 	EXPORT_PRE_COURSE_CONSUMER_DETAIL(18, "预计课耗学员详情导出"),
 	EXPORT_COURSE_CONSUMER_SUM(19, "课耗统计导出"),
-	EXPORT_CLOUD_TEACHER_SUM(20, "云教练统计导出")
+	EXPORT_CLOUD_TEACHER_SUM(20, "云教练统计导出"),
+	CLASS_GROUP(21, "班级列表导出")
 	;
 
 	private Integer code;

+ 3 - 3
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/OrderDetailTypeEnum.java

@@ -11,10 +11,10 @@ public enum OrderDetailTypeEnum implements BaseEnum<String, OrderDetailTypeEnum>
     TEACHING("TEACHING", "教谱"),
     OTHER("OTHER", "其他"),
     COURSE("COURSE", "乐团课"),
-    HIGH_ONLINE_COURSE("HIGH_ONLINE_COURSE", "网络基础训练"),
+    HIGH_ONLINE_COURSE("HIGH_ONLINE_COURSE", "线上基础技能课"),
     SINGLE("SINGLE", "声部课"),
     MIX("MIX", "合奏课"),
-    HIGH("HIGH", "小班课"),
+    HIGH("HIGH", "基础技能课"),
     VIP("VIP", "vip课"),
     PRACTICE("PRACTICE", "网管课"),
     DEMO("DEMO", "试听课"),
@@ -22,7 +22,7 @@ public enum OrderDetailTypeEnum implements BaseEnum<String, OrderDetailTypeEnum>
     ENLIGHTENMENT("ENLIGHTENMENT", "启蒙课"),
     TRAINING_SINGLE("TRAINING_SINGLE", "集训单技课"),
     TRAINING_MIX("TRAINING_MIX", "集训合奏课"),
-    HIGH_ONLINE("HIGH_ONLINE", "网络基础训练课"),
+    HIGH_ONLINE("HIGH_ONLINE", "线上基础技能课"),
     MUSIC_NETWORK("MUSIC_NETWORK", "乐团网管课"),
     CLASSROOM("CLASSROOM", "课堂课"),
 	DEGREE_REGISTRATION("DEGREE_REGISTRATION", "考级报名"),

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

@@ -389,6 +389,8 @@ public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
      */
     PageInfo<ClassGroupTeachersDto> queryClassGroupPage(ClassGroupQueryInfo queryInfo);
 
+    int countClassGroupPage(Map<String, Object> params,ClassGroupQueryInfo queryInfo);
+
     /**
      * 添加IM群组
      * @param classGroup

+ 0 - 9
mec-biz/src/main/java/com/ym/mec/biz/service/ExportService.java

@@ -47,15 +47,6 @@ public interface ExportService {
     List exportStudentInstrument(Map<String, Object> info);
 
     /**
-    * @description: 班级列表导出
-     * @param info
-    * @return java.util.List
-    * @author zx
-    * @date 2022/2/10 12:18
-    */
-    List exportClassGroup(Map<String, Object> info);
-
-    /**
     * @description: 导出老师结转奖励
      * @param info
     * @return java.util.List

+ 18 - 17
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -3625,30 +3625,32 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
         return classGroups;
     }
 
-    @Override
-    public PageInfo<ClassGroupTeachersDto> queryClassGroupPage(ClassGroupQueryInfo queryInfo) {
-        if (queryInfo.getGroupType() == null) {
-            queryInfo.setGroupType(MUSIC);
-        }
-        PageInfo<ClassGroupTeachersDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
-        Map<String, Object> params = new HashMap<String, Object>();
+    public int countClassGroupPage(Map<String, Object> params,ClassGroupQueryInfo queryInfo){
         MapUtil.populateMap(params, queryInfo);
         params.put("groupType", queryInfo.getGroupType().getCode());
-
-        List<ClassGroupTeachersDto> dataList = null;
-        int count;
         if (Objects.nonNull(queryInfo.getLessThenThreeHighOnline())) {
             List<Long> lessThenThreeClassGroupIds = classGroupStudentMapperDao.getLessThenThreeClassGroupIds(queryInfo.getOrganIds(),queryInfo.getLessThenThreeHighOnline());
             params.put("classGroupIds", lessThenThreeClassGroupIds);
             if (CollectionUtils.isEmpty(lessThenThreeClassGroupIds)) {
-                count = 0;
+                return 0;
             } else {
-                count = classGroupDao.countClassGroup(params);
+                return classGroupDao.countClassGroup(params);
             }
         } else {
-            count = classGroupDao.countClassGroup(params);
+            return classGroupDao.countClassGroup(params);
         }
+    }
 
+    @Override
+    public PageInfo<ClassGroupTeachersDto> queryClassGroupPage(ClassGroupQueryInfo queryInfo) {
+        if (queryInfo.getGroupType() == null) {
+            queryInfo.setGroupType(MUSIC);
+        }
+        PageInfo<ClassGroupTeachersDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<String, Object>();
+        int count = this.countClassGroupPage(params,queryInfo);
+
+        List<ClassGroupTeachersDto> dataList = null;
         if (count > 0) {
             pageInfo.setTotal(count);
             params.put("offset", pageInfo.getOffset());
@@ -3668,13 +3670,12 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     if (!classGroup.getId().equals(classGroupTeacher.getClassGroupId())) continue;
                     classGroupTeacherMappers.add(classGroupTeacher);
                 }
-                List<ClassGroupTeacherMapper> classGroupTeacherMapperList = classGroup.getClassGroupTeacherMapperList();
-                if (!CollectionUtils.isEmpty(classGroupTeacherMapperList)) {
-                    List<ClassGroupTeacherMapper> teachingTeachers = classGroupTeacherMapperList.stream().filter(e -> e.getTeacherRole() == TeachTypeEnum.TEACHING).collect(Collectors.toList());
+                if (!CollectionUtils.isEmpty(classGroupTeacherMappers)) {
+                    List<ClassGroupTeacherMapper> teachingTeachers = classGroupTeacherMappers.stream().filter(e -> e.getTeacherRole() == TeachTypeEnum.TEACHING).collect(Collectors.toList());
                     if (teachingTeachers.size() > 0) {
                         classGroup.setTeachingTeacherName(StringUtils.join(teachingTeachers.stream().map(e -> e.getUserName()).collect(Collectors.toList()), ","));
                     }
-                    List<ClassGroupTeacherMapper> bishopTeachers = classGroupTeacherMapperList.stream().filter(e -> e.getTeacherRole() == TeachTypeEnum.BISHOP).collect(Collectors.toList());
+                    List<ClassGroupTeacherMapper> bishopTeachers = classGroupTeacherMappers.stream().filter(e -> e.getTeacherRole() == TeachTypeEnum.BISHOP).collect(Collectors.toList());
                     if (bishopTeachers.size() > 0) {
                         classGroup.setBishopTeacherName(StringUtils.join(bishopTeachers.stream().map(e -> e.getUserName()).collect(Collectors.toList()), ","));
                     }

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

@@ -258,7 +258,7 @@ public class ClassGroupStudentMapperServiceImpl extends BaseServiceImpl<Long, Cl
         Integer studentNum = classGroupStudentMapperDao.countClassGroupNormalStudentNum(classGroupId);
         if (classGroup.getType().equals(ClassGroupTypeEnum.HIGH_ONLINE) &&
                 ((studentNum + userIdStrSet.size()) < 3 || (studentNum + userIdStrSet.size()) > 5)) {
-            throw new BizException("网络基础训练课班级人数不能小于3大于5");
+            throw new BizException("线上基础技能课班级人数不能小于3大于5");
         }
 
         //1、班级关系添加

+ 21 - 31
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ExportServiceImpl.java

@@ -299,7 +299,7 @@ public class ExportServiceImpl implements ExportService {
         exportFuncMap.put(ExportEnum.ORGAN_DOUBLE_ELEVEN2021_STATIS, info -> vipGroupActivityService.organDoubleEleven2021Statis(getQueryInfo(info, OrganDoubleEleven2021StatisDto.class, false)));
         exportFuncMap.put(ExportEnum.USER_CASH_ACCOUNT_DETAIL, info -> sysUserCashAccountDetailDao.exportDetail(getQueryInfo(info, ExportUserAccountQueryInfo.class, true)));
         exportFuncMap.put(ExportEnum.USER_COURSES_ACCOUNT, info -> sysUserCoursesAccountDetailDao.exportDetail(getQueryInfo(info, ExportUserAccountQueryInfo.class, true)));
-        exportFuncMap.put(ExportEnum.CLASS_GROUP, info -> exportClassGroup(info));
+
         exportFuncMap.put(ExportEnum.GOODS, info -> goodsService.queryPage(getQueryInfo(info, GoodsQueryInfo.class, false)).getRows());
         exportFuncMap.put(ExportEnum.VIP_GROUP_ACTIVITY, info -> vipGroupActivityService.exportVipGroupActivity(getQueryInfo(info, VipGroupActivityQueryInfo.class, true)));
         exportFuncMap.put(ExportEnum.EXPORT_STUDENT_ATTENDANCES, info -> studentAttendanceService.exportStudentAttendancesQueryPage(getQueryInfo(info, ExportStudentAttendanceQueryInfo.class, true)).getRows());
@@ -376,6 +376,7 @@ public class ExportServiceImpl implements ExportService {
         exportManageFuncMap.put(ExportEnum.EXPORT_PRE_COURSE_CONSUMER_DETAIL, (info) -> exportPreCourseConsumerDetail(info));
         exportManageFuncMap.put(ExportEnum.EXPORT_COURSE_CONSUMER_SUM, (info) -> exportCourseConsumerSum(info));
         exportManageFuncMap.put(ExportEnum.EXPORT_CLOUD_TEACHER_SUM, (info) -> exportCloudTeacherSum(info));
+        exportManageFuncMap.put(ExportEnum.CLASS_GROUP, info -> exportClassGroup(info));
     }
 
     private List<StudentServeExportDto> exportStudentServeInfo(Map<String, Object> info) {
@@ -552,28 +553,6 @@ public class ExportServiceImpl implements ExportService {
         return instruments;
     }
 
-    //班级列表导出
-    @Override
-    public List exportClassGroup(Map<String, Object> info) {
-        ClassGroupQueryInfo queryInfo = JSONObject.parseObject(JSONObject.toJSONString(info), ClassGroupQueryInfo.class);
-        queryInfo.setOrganId(organizationService.getEmployeeOrgan(queryInfo.getOrganId()));
-        List<ClassGroupTeachersDto> rows = classGroupService.queryClassGroupPage(queryInfo).getRows();
-        for (ClassGroupTeachersDto row : rows) {
-            List<ClassGroupTeacherMapper> classGroupTeacherMapperList = row.getClassGroupTeacherMapperList();
-            if (classGroupTeacherMapperList.size() > 0) {
-                List<ClassGroupTeacherMapper> teachingTeachers = classGroupTeacherMapperList.stream().filter(e -> e.getTeacherRole() == TeachTypeEnum.TEACHING).collect(Collectors.toList());
-                if (teachingTeachers.size() > 0) {
-                    row.setTeachingTeacherName(StringUtils.join(teachingTeachers.stream().map(e -> e.getUserName()).collect(Collectors.toList()), ","));
-                }
-                List<ClassGroupTeacherMapper> bishopTeachers = classGroupTeacherMapperList.stream().filter(e -> e.getTeacherRole() == TeachTypeEnum.BISHOP).collect(Collectors.toList());
-                if (bishopTeachers.size() > 0) {
-                    row.setBishopTeacherName(StringUtils.join(bishopTeachers.stream().map(e -> e.getUserName()).collect(Collectors.toList()), ","));
-                }
-            }
-        }
-        return rows;
-    }
-
     //导出老师结转奖励
     @Override
     public List teacherCourseReward(Map<String, Object> info) {
@@ -1555,14 +1534,26 @@ public class ExportServiceImpl implements ExportService {
         return this.asyncExport(() -> this.initExportInfo(dtos, managerDownload,ExportEnum.EXPORT_COURSE_CONSUMER_SUM),
                 managerDownload.getName());
     }
+
+    private HttpResponseResult exportClassGroup(Map<String, Object> info){
+        SysUser user = sysUserService.getUser();
+        ClassGroupQueryInfo queryInfo = JSONObject.parseObject(JSONObject.toJSONString(info), ClassGroupQueryInfo.class);
+        queryInfo.setOrganId(organizationService.getEmployeeOrgan(queryInfo.getOrganId()));
+        List<ClassGroupTeachersDto> rows = classGroupService.queryClassGroupPage(queryInfo).getRows();
+        checkRows(rows);
+        ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.CLASS_GROUP,user.getId());
+        return this.asyncExport(() -> this.initExportInfo(rows, managerDownload,ExportEnum.CLASS_GROUP),
+                managerDownload.getName());
+    }
+
     private HttpResponseResult exportCloudTeacherSum(Map<String, Object> info){
         StudentCourseConsumerQueryInfo queryInfo = JSONObject.parseObject(JSONObject.toJSONString(info), StudentCourseConsumerQueryInfo.class);
         SysUser user = sysUserService.getUser();
         queryInfo.setOrganId(organizationService.getEmployeeOrgan(user.getId(), queryInfo.getOrganId(), user.getIsSuperAdmin()));
-        List<CloudTeacherSumDto> dtos = studentService.cloudTeacherSum(queryInfo);
-        checkRows(dtos);
+        int count = studentService.getDao().countTeacherSum(queryInfo);
+        checkRows(count);
         ManagerDownload managerDownload = saveManagerDownload(ExportTypeEnum.EXPORT_CLOUD_TEACHER_SUM,user.getId());
-        return this.asyncExport(() -> this.initExportInfo(dtos, managerDownload,ExportEnum.EXPORT_CLOUD_TEACHER_SUM),
+        return this.asyncExport(() -> this.initExportInfo(studentService.cloudTeacherSum(queryInfo), managerDownload,ExportEnum.EXPORT_CLOUD_TEACHER_SUM),
                 managerDownload.getName());
     }
 
@@ -2847,15 +2838,14 @@ public class ExportServiceImpl implements ExportService {
         try {
             HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部", "学生姓名", "学员编号", "联系电话", "声部", "学校", "年级", "学员状态", "未排课时", "总课时", "已完成课时",
                             "剩余未开始课时","剩余课时(未开始+未排课资格)", "预收金额", "第一次课时间", "最近上课时间", "乐团主管编号", "乐团主管", "管理老师编号", "管理老师", "近30天课耗", "回访次数",
-                            "回访状态", "原因", "回访日期"},
+                            "原因", "回访日期"},
                     new String[]{"studentBasicInfo.organName", "studentBasicInfo.userName", "studentBasicInfo.userId",
                             "studentBasicInfo.phone", "studentBasicInfo.subjectName", "studentBasicInfo.cooperationOrganName", "studentBasicInfo.grade",
-                            "studentBasicInfo.studentStatus",
+                            "studentBasicInfo.studentStatus == null?'':studentBasicInfo.studentStatus == 'LOST' ? '流失':studentBasicInfo.studentStatus == 'NORMAL' ? " +
+                                    "'在读':studentBasicInfo.studentStatus == 'SLEEPY' ? '沉睡':studentBasicInfo.studentStatus == 'PAUSE' ? '暂停':'其他'",
                             "noScheduleNum", "totalCourseNum", "overCourseNum", "subCourseNum",  "subTotalCourse", "preCourseFee", "firstCourseTime", "lastCourseTime","musicDirectorId", "musicDirectorName",
                             "studentBasicInfo.subjectTeacherId", "studentBasicInfo.subjectTeacherName", "latelyCourseConsumer", "visitNum",
-                            "lastVisitStatus == null?'':lastVisitStatus == 'LOST' ? '流失':lastVisitStatus == 'NORMAL' ? '在读':" +
-                                    "lastVisitStatus == 'SLEEPY' ? '沉睡':lastVisitStatus == 'PAUSE' ? '暂停':'其他'"
-                            , "visitReason", "lastVisitTime"}, rows);
+                            "visitReason", "lastVisitTime"}, rows);
             exportManagerDownload(workbook, managerDownload);
         } catch (Exception e) {
             e.printStackTrace();

+ 23 - 13
mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java

@@ -862,20 +862,30 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 				int currentCourseError = indexBaseMonthDataDao.getCurrentCourseError(month,organIdList);
 				fourChild.add(new IndexErrInfoDto(IndexErrorType.CURRENT_COURSE_ERROR, currentCourseError));
 			});
-
-			//课程考勤异常
-			int teacherAttendanceError = 0;
-			int studentAttendanceError = 0;
-			int noAttendance = 0;
-			if(classGroupIds == null || classGroupIds.size() > 0){
-				teacherAttendanceError = indexBaseMonthDataDao.getTeacherAttendanceError(organIds,startTime,classGroupIds,tenantId);
-				studentAttendanceError = indexBaseMonthDataDao.getStudentAttendanceError(organIds,startTime,classGroupIds,tenantId);
-				noAttendance = indexBaseMonthDataDao.getNoAttendance(organIds,startTime,classGroupIds,tenantId);
+			CompletableFuture future2 = null;
+			CompletableFuture future3 = null;
+			if(classGroupIds == null || classGroupIds.size() > 0) {
+				future2 = this.async(() -> {
+					//课程考勤异常
+					int teacherAttendanceError = indexBaseMonthDataDao.getTeacherAttendanceError(organIdList, startTime, classGroupIdList, tenantId);
+					int studentAttendanceError = indexBaseMonthDataDao.getStudentAttendanceError(organIdList, startTime, classGroupIdList, tenantId);
+					fourChild.add(new IndexErrInfoDto(IndexErrorType.TEACHER_EXCEPTION_ATTENDANCE, teacherAttendanceError));
+					fourChild.add(new IndexErrInfoDto(IndexErrorType.STUDENT_EXCEPTION_ATTENDANCE, studentAttendanceError));
+				});
+				future3 = this.async(() -> {
+					int noAttendance = indexBaseMonthDataDao.getNoAttendance(organIdList, startTime, classGroupIdList, tenantId);
+					//课程异常
+					fourChild.add(new IndexErrInfoDto(IndexErrorType.TEACHER_NOT_A_CLASS, noAttendance));
+				});
+			}else {
+				fourChild.add(new IndexErrInfoDto(IndexErrorType.TEACHER_EXCEPTION_ATTENDANCE, 0));
+				fourChild.add(new IndexErrInfoDto(IndexErrorType.STUDENT_EXCEPTION_ATTENDANCE, 0));
+				//课程异常
+				fourChild.add(new IndexErrInfoDto(IndexErrorType.TEACHER_NOT_A_CLASS, 0));
+			}
+			if(classGroupIds == null || classGroupIds.size() > 0) {
+				future2.join();future3.join();
 			}
-			fourChild.add(new IndexErrInfoDto(IndexErrorType.TEACHER_EXCEPTION_ATTENDANCE, teacherAttendanceError));
-			fourChild.add(new IndexErrInfoDto(IndexErrorType.STUDENT_EXCEPTION_ATTENDANCE, studentAttendanceError));
-			//课程异常
-			fourChild.add(new IndexErrInfoDto(IndexErrorType.TEACHER_NOT_A_CLASS,noAttendance));
 			future1.join();
 			four.setNum(fourChild.stream().mapToInt(IndexErrInfoDto::getNum).sum());
 			four.setResult(fourChild);

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

@@ -1332,7 +1332,7 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
         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,Long> activeMap = MapUtil.convertIntegerMap(studentDao.getOrganActiveCloudStudyStudentNum1(organIdsList, startTime, endTime));
         //获取重复购买人数
         Map<Integer,Long> againBuyMap = MapUtil.convertIntegerMap(studentDao.getAgainBuyNum(organIdsList));
         for (IndexCloudStudySumDto dto : list) {
@@ -1341,8 +1341,8 @@ public class StudentServiceImpl extends BaseServiceImpl<Integer, Student> implem
             dto.setWaitActivateVipStudentNum(aLong==null?0:aLong.intValue());
             Long aLong1 = againBuyMap.get(dto.getOrganId());
             dto.setAgainBuyNum(aLong1==null?0:aLong1.intValue());
-            Integer integer = activeMap.get(dto.getOrganId());
-            dto.setActiveStudentNum(integer==null?0:integer);
+            Long integer = activeMap.get(dto.getOrganId());
+            dto.setActiveStudentNum(integer==null?0:integer.intValue());
             dto.setVipStudentNum(dto.getEffectiveVipStudentNum() + dto.getWaitActivateVipStudentNum());
             double studentNum = (double)dto.getVipStudentNum();
             dto.setVipStudentRate(studentNum / dto.getTotalStudentNum() * 100d);

+ 4 - 2
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -2573,7 +2573,8 @@
         <if test="searchType == 'TEACHER_ERR_ATTENDANCE'">
             AND ta.teacher_id_ = cs.actual_teacher_id_
             AND cs.status_ = 'OVER'
-            AND ((ta.sign_in_status_ = 0 OR ta.sign_in_status_ IS NULL OR ta.sign_out_status_ = 0 OR ta.sign_out_status_ IS NULL) AND ta.complaints_content_ IS NULL)
+            AND ((ta.sign_in_status_ = 0 OR ta.sign_in_status_ IS NULL OR ta.sign_out_status_ = 0 OR ta.sign_out_status_ IS NULL)
+            AND ta.complaints_content_ IS NULL AND ta.dispose_content_ IS NULL)
             AND (ta.sign_out_status_ IS NOT NULL OR ta.sign_in_status_ IS NOT NULL)
             AND EXISTS (SELECT id_ FROM course_schedule_teacher_salary WHERE cs.id_=course_schedule_id_ AND settlement_time_ IS NULL)
             AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_) AND cssp.id_ IS NOT NULL
@@ -2587,7 +2588,8 @@
         </if>
         <if test="searchType == 'NO_ATTENDANCE'">
             AND ta.teacher_id_ = cs.actual_teacher_id_
-            AND cs.status_ = 'OVER' AND ta.sign_in_time_ IS NULL AND ta.sign_out_time_ IS NULL AND ta.complaints_content_ IS NULL
+            AND cs.status_ = 'OVER' AND ta.sign_in_time_ IS NULL AND ta.sign_out_time_ IS NULL
+            AND ta.complaints_content_ IS NULL AND ta.dispose_content_ IS NULL
             AND EXISTS (SELECT id_ FROM course_schedule_teacher_salary WHERE cs.id_=course_schedule_id_ AND settlement_time_ IS NULL)
             AND (cs.new_course_id_ IS NULL OR cs.new_course_id_ = cs.id_)
         </if>

+ 2 - 2
mec-biz/src/main/resources/config/mybatis/CourseScheduleTeacherSalaryMapper.xml

@@ -732,10 +732,10 @@
 		ct.name_ changeType,u.real_name_ teacherName,o.name_ teacherOrganName,cs.music_group_id_ group_id_,
 		CASE WHEN cs.teach_mode_ = 'OFFLINE' THEN '线下' WHEN cs.teach_mode_ = 'ONLINE' THEN '线上' END teach_mode_,
 		CASE WHEN t.job_nature_ = 'PART_TIME' THEN '兼职' WHEN t.job_nature_ = 'FULL_TIME' THEN '全职' ELSE '零时工' END jobType,
-		CASE WHEN cs.type_ = 'SINGLE' THEN '单技课' WHEN cs.type_ = 'MIX' THEN '合奏课' WHEN cs.type_ = 'HIGH' THEN '小班课'  WHEN cs.type_ = 'VIP' THEN 'vip课'
+		CASE WHEN cs.type_ = 'SINGLE' THEN '单技课' WHEN cs.type_ = 'MIX' THEN '合奏课' WHEN cs.type_ = 'HIGH' THEN '基础技能课'  WHEN cs.type_ = 'VIP' THEN 'vip课'
 		WHEN cs.type_ = 'DEMO' THEN '试听课'  WHEN cs.type_ = 'COMPREHENSIVE' THEN '综合课'  WHEN cs.type_ = 'PRACTICE' THEN '练习课'  WHEN cs.type_ = 'ENLIGHTENMENT' THEN '启蒙课'
 		WHEN cs.type_ = 'TRAINING_SINGLE' THEN '集训单技课'  WHEN cs.type_ = 'TRAINING_MIX' THEN '集训合奏课' WHEN cs.type_ = 'CLASSROOM' THEN '课堂课'
-		WHEN cs.type_ = 'COMM' THEN '对外课程'  WHEN cs.type_ = 'HIGH_ONLINE' THEN '网络基础训练课'  ELSE '乐团网管课' END courseScheduleType,
+		WHEN cs.type_ = 'COMM' THEN '对外课程'  WHEN cs.type_ = 'HIGH_ONLINE' THEN '线上基础技能课'  ELSE '乐团网管课' END courseScheduleType,
 		cs.class_date_ classDate,cs.start_class_time_ courseScheduleStartTime,cs.end_class_time_ courseScheduleEndTime,
 		ROUND((UNIX_TIMESTAMP(cs.end_class_time_)-UNIX_TIMESTAMP(cs.start_class_time_))/60) signCourseScheduleTime,
 		ts.actual_salary_ price,CASE WHEN s.name_ IS NULL THEN '网络教室' ELSE s.name_ END address,

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

@@ -1015,7 +1015,8 @@
 		LEFT JOIN course_schedule_student_payment cssp ON cssp.course_schedule_id_ = cs.id_
 		WHERE ta.teacher_id_ = cs.actual_teacher_id_ AND cs.pre_course_flag_ = 0 and cs.tenant_id_ = #{tenantId}
 		AND cs.status_ = 'OVER' AND cs.del_flag_ = 0 AND cs.class_date_ >= #{startTime}
-		AND ((ta.sign_in_status_ = 0 OR ta.sign_in_status_ IS NULL OR ta.sign_out_status_ = 0 OR ta.sign_out_status_ IS NULL) AND ta.complaints_content_ IS NULL)
+		AND ((ta.sign_in_status_ = 0 OR ta.sign_in_status_ IS NULL OR ta.sign_out_status_ = 0 OR ta.sign_out_status_ IS NULL)
+		         AND ta.complaints_content_ IS NULL AND ta.dispose_content_ IS NULL)
 		AND (ta.sign_out_status_ IS NOT NULL OR ta.sign_in_status_ IS NOT NULL)
 		AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_) AND cssp.id_ IS NOT NULL
 		AND EXISTS (SELECT id_ FROM course_schedule_teacher_salary WHERE cs.id_=course_schedule_id_ AND settlement_time_ IS NULL)
@@ -1093,7 +1094,7 @@
 		LEFT JOIN teacher_attendance ta ON ta.course_schedule_id_ = cs.id_
 		WHERE ta.teacher_id_ = cs.actual_teacher_id_ and cs.tenant_id_ = #{tenantId}
 		AND cs.status_ = 'OVER' AND cs.del_flag_ = 0 AND cs.class_date_>=#{startTime} AND cs.pre_course_flag_ = 0
-		AND ta.sign_in_time_ IS NULL AND ta.sign_out_time_ IS NULL AND ta.complaints_content_ IS NULL
+		AND ta.sign_in_time_ IS NULL AND ta.sign_out_time_ IS NULL AND ta.complaints_content_ IS NULL AND ta.dispose_content_ IS NULL
 		AND (cs.new_course_id_ IS NULL OR cs.new_course_id_ = cs.id_)
 		AND EXISTS (SELECT id_ FROM course_schedule_teacher_salary WHERE cs.id_=course_schedule_id_ AND settlement_time_ IS NULL)
 		<if test="classGroupIds != null and classGroupIds.size() > 0">
@@ -2142,21 +2143,20 @@
 		GROUP BY spo.user_id_,spo.create_time_,spo.organ_id_;
 	</select>
     <select id="getCurrentCourseError" resultType="java.lang.Integer">
-		select COUNT(DISTINCT ss.user_id_) from student_statistics ss
-		left join (select su.id_ from sys_user su
-		left join course_schedule_student_payment cssp ON cssp.user_id_ = su.id_
-		left join course_schedule cs ON cs.id_ = cssp.course_schedule_id_
-		AND DATE_FORMAT(cs.class_date_,'%Y-%m') = #{month} AND cs.type_ = 'VIP' AND cssp.group_type_ = 'VIP' and cssp.user_id_ IS NOT NULL
-		where
+		select COUNT(cs.user_id_) from (
+		select DISTINCT ss.user_id_ from student_statistics ss
+		left join course_schedule_student_payment cssp ON cssp.user_id_ = ss.user_id_
+		left join course_schedule cs ON cs.id_ = cssp.course_schedule_id_ AND DATE_FORMAT(cs.class_date_,'%Y-%m') = #{month} AND cssp.group_type_ = 'VIP'
+		where ss.no_schedule_num_ + ss.sub_course_num_ > 4 and
+		(((ss.no_schedule_num_ > 0 OR ss.sub_course_num_) AND ss.lately_year_course_consumer_ > 0 AND ss.last_visit_status_ IS NULL) OR ss.last_visit_status_ = 'NORMAL')
+		and ss.group_type_ = 'VIP'
 		<if test="organIdList != null and organIdList.size > 0">
-			su.organ_id_ IN
+			AND cs.organ_id_ IN
 			<foreach collection="organIdList" open="(" close=")" item="item" separator=",">
 				#{item}
 			</foreach>
 		</if>
-		group by su.id_ having COUNT(distinct cs.id_) &lt; 4 OR COUNT(distinct cs.id_) IS NULL) cs ON cs.id_ = ss.user_id_
-		where ss.no_schedule_num_ + ss.sub_course_num_ > 4 and (((ss.no_schedule_num_ > 0 OR ss.sub_course_num_) AND ss.lately_year_course_consumer_ > 0 AND ss.last_visit_status_ IS NULL) OR ss.last_visit_status_ = 'NORMAL')
-		AND cs.id_ = ss.user_id_ and ss.group_type_ = 'VIP'
+		group by ss.user_id_ having COUNT(distinct cs.id_) &lt; 4) cs
 	</select>
 	<select id="getWaitRenewInfo" resultType="java.lang.Integer">
 		select COUNT(ss.user_id_) from student_statistics ss

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

@@ -1227,6 +1227,18 @@
         </if>
         group by su.organ_id_
     </select>
+
+    <select id="countTeacherSum" resultType="java.lang.Integer">
+        select COUNT(distinct su.organ_id_)
+        from music_group mg
+        left join student_registration sr ON mg.id_ = sr.music_group_id_
+        left join student s ON sr.user_id_ = s.user_id_
+        left JOIN sys_user su ON su.id_ = sr.user_id_
+        where mg.status_ = 'PROGRESS' AND sr.music_group_status_ = 'NORMAL' AND s.membership_end_time_ >= NOW()
+        <if test="queryInfo.organId != null and queryInfo.organId != ''">
+            AND FIND_IN_SET(su.organ_id_,#{queryInfo.organId})
+        </if>
+    </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_

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

@@ -253,7 +253,7 @@
 					AND (ss.no_schedule_num_ > 0 OR ss.sub_course_num_ > 0) AND ss.lately_year_course_consumer_ > 0))
 				</if>
 				<if test="studentStatus == 'SLEEPY'">
-					AND (ss.last_visit_status_ = #{studentStatus} OR (ss.last_visit_status_ IS NULL AND ss.over_course_num_ > 0 AND (ss.sub_course_num_ > 0 OR ss.no_schedule_num_ > 0) AND ss.lately_year_course_consumer_ &lt;= 0))
+					AND (ss.last_visit_status_ = #{studentStatus} OR (ss.last_visit_status_ IS NULL AND (ss.no_schedule_num_ > 0 OR suca.course_balance_ > 0) AND (ss.over_course_num_ &lt;= 0 OR ss.lately_year_course_consumer_ &lt;= 0)))
 				</if>
 				<if test="studentStatus == 'LOST'">
 					AND (ss.last_visit_status_ = #{studentStatus} OR (ss.last_visit_status_ IS NULL AND ss.over_course_num_ > 0 AND ss.sub_course_num_ &lt;= 0 AND ss.no_schedule_num_ &lt;= 0 AND suca.course_balance_ &lt;= 0))
@@ -335,7 +335,7 @@
 		ss.no_schedule_num_ + ss.sub_course_num_ subTotalCourse,
 			CASE WHEN ss.last_visit_status_ IN ('NORMAL','PAUSE','SLEEPY','LOST') THEN ss.last_visit_status_
 			WHEN (ss.no_schedule_num_ > 0 OR ss.sub_course_num_ > 0) AND ss.lately_year_course_consumer_ > 0 THEN 'NORMAL'
-			WHEN ss.over_course_num_ > 0 AND (ss.sub_course_num_ > 0 OR ss.no_schedule_num_ > 0) AND ss.lately_year_course_consumer_ &lt;= 0 THEN 'SLEEPY'
+			WHEN (ss.no_schedule_num_ > 0 OR suca.course_balance_ > 0) AND (ss.over_course_num_ &lt;= 0 OR ss.lately_year_course_consumer_ &lt;= 0) THEN 'SLEEPY'
 			WHEN ss.over_course_num_ > 0 AND ss.sub_course_num_ &lt;= 0 AND ss.no_schedule_num_ &lt;= 0 AND suca.course_balance_ &lt;= 0 THEN 'LOST'
 			WHEN suca.course_balance_ > 0 AND ss.sub_course_num_ &lt;= 0 AND ss.no_schedule_num_ &lt;= 0 THEN 'PAUSE' ELSE 'OTHER' END student_status_
 			,suca.course_balance_,
@@ -372,7 +372,7 @@
 	</resultMap>
 	<select id="studentSmallClassStatisticsSum" resultMap="StudentStatisticsSumDto">
 		SELECT
-		COUNT(CASE WHEN (ss.no_schedule_num_ > 0 OR suca.course_balance_ > 0) AND (ss.over_course_num_ &lt;= 0 OR ss.lately_year_course_consumer_ &lt;= 0) THEN 1 ELSE NULL END) 'sleepStudentNum',
+		COUNT(CASE WHEN ss.last_visit_status_ = 'SLEEPY' OR (ss.last_visit_status_ IS NULL AND (ss.no_schedule_num_ > 0 OR suca.course_balance_ > 0) AND (ss.over_course_num_ &lt;= 0 OR ss.lately_year_course_consumer_ &lt;= 0)) THEN 1 ELSE NULL END) 'sleepStudentNum',
 		COUNT(CASE WHEN ss.over_course_num_ > 0 AND (ss.sub_course_num_ > 0 OR ss.no_schedule_num_ > 0) AND ss.lately_year_course_consumer_ &lt;= 0 AND ss.no_schedule_num_ > 0 THEN 1 ELSE NULL END) 'sleepStudentHasNotSchedule',
 		COUNT(CASE WHEN ss.over_course_num_ > 0 AND (ss.sub_course_num_ > 0 OR ss.no_schedule_num_ > 0) AND ss.lately_year_course_consumer_ &lt;= 0 AND ss.no_schedule_num_ &lt;= 0 THEN 1 ELSE NULL END) 'sleepStudentNoNotSchedule',
 		COUNT(CASE WHEN ss.last_visit_status_ = 'NORMAL' OR (ss.last_visit_status_ IS NULL AND (ss.no_schedule_num_ > 0 OR ss.sub_course_num_ > 0) AND ss.lately_year_course_consumer_ > 0) THEN 1 ELSE NULL END) 'normalStudentNum',
@@ -664,9 +664,9 @@
 		</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
-		THEN 4 ELSE ss.no_schedule_num_ + CASE WHEN cs.course_num_ IS NULL THEN 0 ELSE cs.course_num_ END END preConsumerNum,
+		select o.name_ organName,su.username_,ss.user_id_,su.phone_,ss.no_schedule_num_,ss.sub_course_num_,
+		CASE WHEN ss.no_schedule_num_ + ss.sub_course_num_ + CASE WHEN cs.course_num_ IS NULL THEN 0 ELSE cs.course_num_ END > 3
+		THEN 4 ELSE ss.no_schedule_num_ + ss.sub_course_num_ + CASE WHEN cs.course_num_ IS NULL THEN 0 ELSE cs.course_num_ END END preConsumerNum,
 		CASE WHEN cs.course_num_ IS NULL THEN 0 ELSE cs.course_num_ END course_num_
 		from student_statistics ss
 		left join (

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

@@ -283,23 +283,19 @@
 		<result property="trainDay" column="train_day_"/>
 	</resultMap>
 	<select id="queryStudentTrain" resultMap="CountStudentTrainDataDto">
-		SELECT su.id_ 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_
+		SELECT su.id_ user_id_,su.avatar_,su.phone_,su.username_,mcr.total_play_time_,mcr.train_day_,
+		mcr.train_num_,mcr.record_num_
 		FROM sys_user su
-		LEFT JOIN sys_music_compare_record mcr ON mcr.user_id_ = su.id_
+		LEFT JOIN (select user_id_,ROUND(SUM(play_time_) / 60) total_play_time_,COUNT(DISTINCT behavior_id_) train_num_,
+		COUNT(DISTINCT DATE_FORMAT(create_time_,'%Y-%m-%d')) train_day_,
+		COUNT(CASE WHEN feature_ = 'CLOUD_STUDY_EVALUATION' THEN behavior_id_ END) record_num_
+		from sys_music_compare_record
+		where user_id_ IS NOT NULL
 		<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)
+			AND DATE_FORMAT(create_time_, '%Y-%m-%d') BETWEEN #{startTime} AND #{endTime}
 		</if>
+		group by user_id_) mcr ON mcr.user_id_ = su.id_
 		<include refid="queryStudentTrainSql"/>
-		GROUP BY su.id_
-		<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}
@@ -308,7 +304,7 @@
 			</if>
 		</if>
 		<if test="sort == null or sort == ''">
-			total_play_time_ DESC
+			mcr.total_play_time_ DESC
 		</if>
 		,su.id_
 		<include refid="global.limit"/>
@@ -316,23 +312,22 @@
 	<select id="countStudentTrain" resultType="int">
 		SELECT COUNT(distinct su.id_)
 		FROM sys_user su
-		LEFT JOIN sys_music_compare_record mcr ON mcr.user_id_ = su.id_
+		LEFT JOIN (select user_id_,ROUND(SUM(play_time_) / 60) total_play_time_,COUNT(DISTINCT behavior_id_) train_num_,
+		COUNT(DISTINCT DATE_FORMAT(create_time_,'%Y-%m-%d')) train_day_,
+		COUNT(CASE WHEN feature_ = 'CLOUD_STUDY_EVALUATION' THEN behavior_id_ END) record_num_
+		from sys_music_compare_record
+		where user_id_ IS NOT NULL
 		<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)
+			AND DATE_FORMAT(create_time_, '%Y-%m-%d') BETWEEN #{startTime} AND #{endTime}
 		</if>
+		group by user_id_) mcr ON mcr.user_id_ = su.id_
 		<include refid="queryStudentTrainSql"/>
-		<if test="having == 1">
-			AND total_play_time_ &lt; ${totalTime} OR train_num_ &lt; ${trainNum}
-		</if>
 	</select>
 
 	<sql id="queryStudentTrainSql">
 		<where>
 			<if test="studentIdList != null and studentIdList.size > 0">
-				AND su.id_ IN
+				AND mcr.user_id_ IN
 				<foreach collection="studentIdList" open="(" close=")" item="userId" separator=",">
 					#{userId}
 				</foreach>
@@ -341,17 +336,20 @@
 				AND (su.phone_ LIKE CONCAT('%',#{search},'%') OR su.username_ LIKE CONCAT('%',#{search},'%'))
 			</if>
 			<if test="visitStudents != null and visitStudents.size > 0">
-				AND su.id_ NOT IN
+				AND mcr.user_id_ NOT IN
 				<foreach collection="visitStudents" open="(" close=")" item="userId" separator=",">
 					#{userId}
 				</foreach>
 			</if>
 			<if test="hasCourseUserIds != null and hasCourseUserIds.size > 0">
-				AND su.id_ IN
+				AND mcr.user_id_ IN
 				<foreach collection="hasCourseUserIds" open="(" close=")" item="userId" separator=",">
 					#{userId}
 				</foreach>
 			</if>
+			<if test="having == 1">
+				AND mcr.total_play_time_ &lt; ${totalTime} OR mcr.train_num_ &lt; ${trainNum}
+			</if>
 		</where>
 	</sql>
 

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

@@ -1895,7 +1895,7 @@ public class ExportController extends BaseController {
                     "基础技能课3.0(主教)"
                     , "单技课2.0(助教)", "合奏课2.0(助教)", "综合课2.0(助教)", "集训单技课2.0(助教)", "集训合奏课2.0(助教)",
                     "基础技能课2.0(助教)", "课堂课(助教)", "单技课3.0(助教)", "合奏课3.0(助教)", "综合课3.0(助教)", "集训单技课3.0(助教)", "集训合奏课3.0(助教)",
-                    "基础技能课3.0(助教)", "网络基础训练课1v3", "网络基础训练课1v4", "网络基础训练课1v5", "乐团网管课1v1"};
+                    "基础技能课3.0(助教)", "线上基础技能课1v3", "线上基础技能课1v4", "线上基础技能课1v5", "乐团网管课1v1"};
             String[] body = {"userId", "realName", "organName", "jobNature", "demissionStatus", "status", "vip1", "vip2", "vip3", "vip4", "vip5", "vip6", "vip7",
                     "practiceSalary", "mainSingleSalary2", "mainMixSalary2", "mainComprehensiveSalary2", "mainTraningSigleSalary2", "mainTraningMixSalary2",
                     "mainHighSalary2", "mainClassroomSalary2", "mainSingleSalary", "mainMixSalary", "mainComprehensiveSalary", "mainTraningSigleSalary", "mainTraningMixSalary",

+ 7 - 3
mec-web/src/main/resources/exportColumnMapper.ini

@@ -183,7 +183,7 @@ headColumns = ["序号", "业务分部", "学生编号", "学生姓名", "交易
 fieldColumns = ["id", "userOrganName", "userId", "user.username", "transNo", "orderNo", "paymentChannel", "merNos", "orderAmount" , "expectAmount", "actualAmount", "balancePaymentAmount", "routeMerNo", "routeAmount", "routeBalance",  "couponRemitFee",     "musicGroupCourseFee", "vipCourseFee", "practiceCourseFee", "theoryCourseFee", "degreeFee", "repairFee", "maintenanceFee", "cloudTeacherFee", "leaseFee", "musicalFee", "teachingFee", "visitFee", "rechargeFee", "otherFee", "platformFee", "payTime", "musicGroupId", "groupType.desc","typeDesc","feeMusicGroupId","feeMusicGroupName", "sporadicType", "subjectName", "organName", "schoolName", "cooperationOrganName", "eduTeacher", "memo"]
 
 [老师默认课酬导出]
-headColumns = ["老师编号", "姓名", "分部", "工作类型", "在职状态", "老师状态", "1v1", "1v2", "1v3", "1v4", "1v5", "1v6", "1v7","网管课", "单技课2.0(主教)", "合奏课2.0(主教)", "综合课2.0(主教)", "集训单技课2.0(主教)", "集训合奏课2.0(主教)","基础技能课2.0(主教)", "课堂课(主教)", "单技课3.0(主教)", "合奏课3.0(主教)", "综合课3.0(主教)", "集训单技课3.0(主教)", "集训合奏课3.0(主教)","基础技能课3.0(主教)", "单技课2.0(助教)", "合奏课2.0(助教)", "综合课2.0(助教)", "集训单技课2.0(助教)", "集训合奏课2.0(助教)","基础技能课2.0(助教)", "课堂课(助教)", "单技课3.0(助教)", "合奏课3.0(助教)", "综合课3.0(助教)", "集训单技课3.0(助教)", "集训合奏课3.0(助教)","基础技能课3.0(助教)", "网络基础训练课1v3", "网络基础训练课1v4", "网络基础训练课1v5", "乐团网管课1v1"]
+headColumns = ["老师编号", "姓名", "分部", "工作类型", "在职状态", "老师状态", "1v1", "1v2", "1v3", "1v4", "1v5", "1v6", "1v7","网管课", "单技课2.0(主教)", "合奏课2.0(主教)", "综合课2.0(主教)", "集训单技课2.0(主教)", "集训合奏课2.0(主教)","基础技能课2.0(主教)", "课堂课(主教)", "单技课3.0(主教)", "合奏课3.0(主教)", "综合课3.0(主教)", "集训单技课3.0(主教)", "集训合奏课3.0(主教)","基础技能课3.0(主教)", "单技课2.0(助教)", "合奏课2.0(助教)", "综合课2.0(助教)", "集训单技课2.0(助教)", "集训合奏课2.0(助教)","基础技能课2.0(助教)", "课堂课(助教)", "单技课3.0(助教)", "合奏课3.0(助教)", "综合课3.0(助教)", "集训单技课3.0(助教)", "集训合奏课3.0(助教)","基础技能课3.0(助教)", "线上基础技能课1v3", "线上基础技能课1v4", "线上基础技能课1v5", "乐团网管课1v1"]
 fieldColumns = ["userId", "realName", "organName", "jobNature", "demissionStatus", "status", "vip1", "vip2", "vip3", "vip4", "vip5", "vip6", "vip7", "practiceSalary", "mainSingleSalary2", "mainMixSalary2", "mainComprehensiveSalary2", "mainTraningSigleSalary2", "mainTraningMixSalary2", "mainHighSalary2", "mainClassroomSalary2", "mainSingleSalary", "mainMixSalary", "mainComprehensiveSalary", "mainTraningSigleSalary", "mainTraningMixSalary", "mainHighSalary", "assistantSingleSalary2", "assistantMixSalary2", "assistantComprehensiveSalary2", "assistantTraningSigleSalary2", "assistantTraningMixSalary2", "assistantHighSalary2", "assistantClassroomSalary2", "assistantSingleSalary", "assistantMixSalary", "assistantComprehensiveSalary", "assistantTraningSigleSalary", "assistantTraningMixSalary", "assistantHighSalary", "highOnline3Salary", "highOnline4Salary", "highOnline5Salary", "musicNetwork1Salary"]
 
 [报名中缴费中乐团缴费情况导出]
@@ -320,8 +320,12 @@ fieldColumns = ["organName","username","userId","phone","preConsumerNum","course
 
 [课耗统计导出]
 headColumns = ["分部", "在读人数", "应有课耗", "实际课耗","课耗达标率","实际课耗大于等于5节", "4节","3节","2节","1节","0节","达标占比"]
-fieldColumns = ["organName","normalNum","courseConsumerNum","courseSum","courseConsumerRate","num5","num4","num3","num2","num1","num0","standRate"]
+fieldColumns = ["organName","normalNum","courseConsumerNum","courseSum","courseConsumerRate+'%'","num5","num4","num3","num2","num1","num0","standRate+'%'"]
 
 [云教练统计导出]
 headColumns = ["分部", "在读人数","练习人数","练习率","<60分钟", "60~120分钟","120~240分钟",">240分钟","平均练习时长","练习达标占比"]
-fieldColumns = ["organName","normalNum","trainStudentNum","trainRate","train1","train2","train3","train4","avgTrainTime","trainStandRate"]
+fieldColumns = ["organName","normalNum","trainStudentNum","trainRate+'%'","train1","train2","train3","train4","avgTrainTime","trainStandRate+'%'"]
+
+[班级列表导出]
+headColumns = ["课程组编号", "课程组名称", "分部名称", "班级名称","班级类型", "班级人数", "主教老师", "助教老师", "已上课时", "总课数"]
+fieldColumns = ["musicGroupId", "musicGroupName", "organName", "name","type.msg", "studentNum == NUll?0:studentNum", "bishopTeacherName", "teachingTeacherName", "currentClassTimes","totalClassTimes"]