Explorar el Código

进行中学员逻辑调整:进行中课程组在读学员人数去重
沉睡:(有课程余额or排课资格)且(一年内没有课耗or未来无课程)
在读:有未开始课程或排课资格,且一年内有课耗的学员数量
在册:有课程或排课资格的
老师考勤异常优化:见文档
学员请假异常优化:见文档
班级列表导出优化
服务指标异常隐藏

zouxuan hace 2 años
padre
commit
fae2a1205f

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

@@ -68,4 +68,6 @@ public interface StudentStatisticsDao extends BaseDAO<Integer, StudentStatistics
     List<StudentOrganDto> queryNoScheduleNumStudent(@Param("organIds") List<Integer> organIds);
 
     void updateFirstOrderTime();
+
+    Integer countNormalNum(@Param("groupType") String groupType, @Param("organIdList") List<Integer> organIdList);
 }

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

@@ -34,6 +34,17 @@ public class StudentStatisticsSumDto {
     @ApiModelProperty(value = "未排课课时:活动资格【未排课】课程总数(1v多不去重)",required = false)
     private Integer noScheduleNum;
 
+    @ApiModelProperty(value = "在册:有课程或排课资格的",required = false)
+    private Integer registerNum;
+
+    public Integer getRegisterNum() {
+        return registerNum;
+    }
+
+    public void setRegisterNum(Integer registerNum) {
+        this.registerNum = registerNum;
+    }
+
     public Integer getSleepStudentNum() {
         return sleepStudentNum;
     }

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

@@ -6,9 +6,9 @@ import com.ym.mec.common.enums.BaseEnum;
  * 班级类型
  */
 public enum ClassGroupTypeEnum implements BaseEnum<String, ClassGroupTypeEnum> {
-	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", "网络基础训练课"),
+			"临时班"), COMM("COMM", "对外课程"), HIGH_ONLINE("HIGH_ONLINE", "网络基础技能班"),
 	MUSIC_NETWORK("MUSIC_NETWORK","乐团网管课");
 
 	private String code;

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -3668,6 +3668,17 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     if (!classGroup.getId().equals(classGroupTeacher.getClassGroupId())) continue;
                     classGroupTeacherMappers.add(classGroupTeacher);
                 }
+                List<ClassGroupTeacherMapper> classGroupTeacherMapperList = classGroup.getClassGroupTeacherMapperList();
+                if (classGroupTeacherMapperList.size() > 0) {
+                    List<ClassGroupTeacherMapper> teachingTeachers = classGroupTeacherMapperList.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());
+                    if (bishopTeachers.size() > 0) {
+                        classGroup.setBishopTeacherName(StringUtils.join(bishopTeachers.stream().map(e -> e.getUserName()).collect(Collectors.toList()), ","));
+                    }
+                }
                 classGroup.setClassGroupTeacherMapperList(classGroupTeacherMappers);
                 classGroup.setStudentNum(studyNums.get(classGroup.getId()));
                 int totalClassTimes = 0;

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

@@ -2764,15 +2764,15 @@ public class ExportServiceImpl implements ExportService {
         List<StudentStatisticsDto> rows = studentStatisticsService.queryStatisticsPage(queryInfo).getRows();
         try {
             HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部", "学生姓名", "学员编号", "联系电话", "声部", "学校", "年级", "学员状态", "未排课时", "总课时", "已完成课时",
-                            "剩余未开始课时","剩余课时(未开始+未排课资格)", "预收金额", "第一次课时间", "最近上课时间", "指导老师编号", "指导老师", "乐团主管编号", "乐团主管", "声部课老师编号", "声部课老师", "近30天课耗", "回访次数",
+                            "剩余未开始课时","剩余课时(未开始+未排课资格)", "预收金额", "第一次课时间", "最近上课时间", "乐团主管编号", "乐团主管", "管理老师编号", "管理老师", "近30天课耗", "回访次数",
                             "回访状态", "原因", "回访日期"},
                     new String[]{"studentBasicInfo.organName", "studentBasicInfo.userName", "studentBasicInfo.userId",
                             "studentBasicInfo.phone", "studentBasicInfo.subjectName", "studentBasicInfo.cooperationOrganName", "studentBasicInfo.grade",
                             "studentBasicInfo.studentStatus",
-                            "noScheduleNum", "totalCourseNum", "overCourseNum", "subCourseNum",  "subTotalCourse", "preCourseFee", "firstCourseTime", "lastCourseTime", "teacherId", "teacherName", "musicDirectorId", "musicDirectorName",
+                            "noScheduleNum", "totalCourseNum", "overCourseNum", "subCourseNum",  "subTotalCourse", "preCourseFee", "firstCourseTime", "lastCourseTime","musicDirectorId", "musicDirectorName",
                             "studentBasicInfo.subjectTeacherId", "studentBasicInfo.subjectTeacherName", "latelyCourseConsumer", "visitNum",
-                            "lastVisitStatus == null?'':lastVisitStatus == 'LOST' ? '流失':lastVisitStatus == 'THINKING' ? '考虑中':" +
-                                    "lastVisitStatus == 'PENDING_PAYMENT' ? '确认缴费待缴费':lastVisitStatus == 'PAUSE' ? '暂停':lastVisitStatus == 'OTHER' ? '其他':''"
+                            "lastVisitStatus == null?'':lastVisitStatus == 'LOST' ? '流失':lastVisitStatus == 'NORMAL' ? '在读':" +
+                                    "lastVisitStatus == 'SLEEPY' ? '沉睡':lastVisitStatus == 'PAUSE' ? '暂停':'其他'"
                             , "visitReason", "lastVisitTime"}, rows);
             exportManagerDownload(workbook, managerDownload);
         } catch (Exception e) {

+ 18 - 49
mec-biz/src/main/java/com/ym/mec/biz/service/impl/IndexBaseMonthDataServiceImpl.java

@@ -850,20 +850,11 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			int teacherAttendanceError = 0;
 			int studentAttendanceError = 0;
 			int noAttendance = 0;
-			//课程时间安排异常
-//			int courseTimeError = 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);
-//				String courseStartTimeError = sysTenantConfigService.getTenantConfigValue(SysConfigService.COURSE_START_TIME_ERROR, tenantId);
-//				String courseEndTimeError = sysTenantConfigService.getTenantConfigValue(SysConfigService.COURSE_END_TIME_ERROR, tenantId);
-//				if(StringUtils.isNotEmpty(courseStartTimeError) && StringUtils.isNotEmpty(courseEndTimeError)){
-//					courseTimeError = indexBaseMonthDataDao.getCourseTimeError(organIds,classGroupIds,courseStartTimeError,courseEndTimeError,tenantId);
-//				}
 			}
-//			fourChild.add(new IndexErrInfoDto(IndexErrorType.COURSE_TIME_ERROR, IndexErrorType.COURSE_TIME_ERROR.getMsg(), courseTimeError, null));
-
 			fourChild.add(new IndexErrInfoDto(IndexErrorType.TEACHER_EXCEPTION_ATTENDANCE, IndexErrorType.TEACHER_EXCEPTION_ATTENDANCE.getMsg(), teacherAttendanceError, null));
 			fourChild.add(new IndexErrInfoDto(IndexErrorType.STUDENT_EXCEPTION_ATTENDANCE, IndexErrorType.STUDENT_EXCEPTION_ATTENDANCE.getMsg(), studentAttendanceError, null));
 
@@ -871,22 +862,22 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			fourChild.add(new IndexErrInfoDto(IndexErrorType.TEACHER_NOT_A_CLASS, IndexErrorType.TEACHER_NOT_A_CLASS.getMsg(), noAttendance, null));
 
 			//只适用大雅
-			if(tenantId == 1){
-				//服务指标异常
-				Map<String, Object> params = new HashMap<>();
-				LocalDate nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
-				LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue()).plusDays(-7);
-				LocalDate sunDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.SUNDAY.getValue()).plusDays(-7);
-				params.put("organIds", organIds);
-				params.put("monday",monDayDate.toString());
-				params.put("sunday",sunDayDate.toString());
-				params.put("jobNature", JobNatureEnum.FULL_TIME);
-				params.put("unDone",1);
-				params.put("reminded",0);
-				params.put("tenantId",tenantId);
-				int serveErrTeacherNum = studentExtracurricularExercisesSituationDao.countTeacherServeInfo(params);
-				fourChild.add(new IndexErrInfoDto(IndexErrorType.TEACHER_SERVE_ERROR, IndexErrorType.TEACHER_SERVE_ERROR.getMsg(), serveErrTeacherNum, null));
-			}
+//			if(tenantId == 1){
+//				//服务指标异常
+//				Map<String, Object> params = new HashMap<>();
+//				LocalDate nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
+//				LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue()).plusDays(-7);
+//				LocalDate sunDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.SUNDAY.getValue()).plusDays(-7);
+//				params.put("organIds", organIds);
+//				params.put("monday",monDayDate.toString());
+//				params.put("sunday",sunDayDate.toString());
+//				params.put("jobNature", JobNatureEnum.FULL_TIME);
+//				params.put("unDone",1);
+//				params.put("reminded",0);
+//				params.put("tenantId",tenantId);
+//				int serveErrTeacherNum = studentExtracurricularExercisesSituationDao.countTeacherServeInfo(params);
+//				fourChild.add(new IndexErrInfoDto(IndexErrorType.TEACHER_SERVE_ERROR, IndexErrorType.TEACHER_SERVE_ERROR.getMsg(), serveErrTeacherNum, null));
+//			}
 			four.setNum(fourChild.stream().mapToInt(IndexErrInfoDto::getNum).sum());
 			four.setResult(fourChild);
 			all.add(four);
@@ -1288,15 +1279,6 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 				flag2 = true;
 			}
 		}
-//		if(!flag2){
-//			Map<String, Object> params = new HashMap<String, Object>(2);
-//			params.put("organId",organIdsStr);
-//			params.put("tenantId",tenantId);
-//			Integer hasFreeCourseTimes = musicGroupDao.countHasFreeCourseTimes(params);
-//			if(hasFreeCourseTimes != null && hasFreeCourseTimes > 0){
-//				flag2 = true;
-//			}
-//		}
 		resultMap.put("studentInfo",flag2);
 		boolean flag3 = false;
 
@@ -1326,19 +1308,6 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 		resultMap.put("teacherInfo",flag3);
 
 		boolean flag4 = false;
-/*		if(!flag4){
-			int courseTimeError = 0;
-			if(classGroupIds == null || classGroupIds.size() > 0){
-				String courseStartTimeError = sysTenantConfigService.getTenantConfigValue(SysConfigService.COURSE_START_TIME_ERROR, tenantId);
-				String courseEndTimeError = sysTenantConfigService.getTenantConfigValue(SysConfigService.COURSE_END_TIME_ERROR, tenantId);
-				if(StringUtils.isNotEmpty(courseStartTimeError) && StringUtils.isNotEmpty(courseEndTimeError)){
-					courseTimeError = indexBaseMonthDataDao.getCourseTimeError(organIds,classGroupIds,courseStartTimeError,courseEndTimeError, tenantId);
-				}
-			}
-			if(courseTimeError > 0){
-				flag4 = true;
-			}
-		}*/
 		if(!flag4){
 			int attendanceError = 0;
 			if(classGroupIds == null || classGroupIds.size() > 0){
@@ -1367,7 +1336,7 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			}
 		}
 		//服务指标只用于大雅
-		if(tenantId == 1 && !flag4){
+		/*if(tenantId == 1 && !flag4){
 			Map<String, Object> params = new HashMap<>();
 			LocalDate nowDate = LocalDateTime.now(DateUtil.zoneId).toLocalDate();
 			LocalDate monDayDate = nowDate.with(DateUtil.weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue()).plusDays(-7);
@@ -1382,7 +1351,7 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			if(serveErrTeacherNum > 0){
 				flag4 = true;
 			}
-		}
+		}*/
 		resultMap.put("attendanceServe",flag4);
 
 		boolean flag5 = false;

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

@@ -965,7 +965,7 @@ public class StudentManageServiceImpl implements StudentManageService {
         if (StringUtils.isEmpty(studentErrorLeaveNum)) {
             return pageInfo;
         }
-        Map<String, Object> params = new HashMap<>();
+        Map<String, Object> params = new HashMap<>(5);
         MapUtil.populateMap(params, queryInfo);
         params.put("offset", pageInfo.getOffset());
         String totalMonth = DateUtil.format(DateUtil.addMonths(date, -1), DateUtil.ISO_YEAR_MONTH_FORMAT);

+ 6 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentStatisticsServiceImpl.java

@@ -101,6 +101,7 @@ public class StudentStatisticsServiceImpl extends BaseServiceImpl<Integer, Stude
 			pageInfo.setTotal(count);
 			params.put("offset", pageInfo.getOffset());
 			dataList = studentStatisticsDao.queryStatistics(params);
+
 		}
 		if (count == 0) {
 			dataList = new ArrayList<>();
@@ -115,7 +116,10 @@ public class StudentStatisticsServiceImpl extends BaseServiceImpl<Integer, Stude
 		if(StringUtils.isNotEmpty(organId)){
 			organIdList = Arrays.stream(organId.split(",")).map(id -> Integer.valueOf(id)).collect(Collectors.toList());
 		}
-		return studentStatisticsDao.studentSmallClassStatisticsSum(groupType,organIdList);
+		StudentStatisticsSumDto dto = studentStatisticsDao.studentSmallClassStatisticsSum(groupType, organIdList);
+		//获取进行中的学员数量
+		dto.setNormalStudentHasNormalGroupNum(studentStatisticsDao.countNormalNum(groupType, organIdList));
+		return dto;
     }
 
     @Override
@@ -129,7 +133,7 @@ public class StudentStatisticsServiceImpl extends BaseServiceImpl<Integer, Stude
 			organIdList = Arrays.stream(organId.split(",")).map(id -> Integer.valueOf(id)).collect(Collectors.toList());
 		}
 		//获取流失人数
-		sumForDateDto.setLostNum(studentStatisticsDao.countLostStudentNum(groupType,startDate,endDate,organIdList));
+//		sumForDateDto.setLostNum(studentStatisticsDao.countLostStudentNum(groupType,startDate,endDate,organIdList));
 		//获取新增人数
 		sumForDateDto.setAddNum(studentStatisticsDao.countAddStudentNum(groupType,startDate,endDate,organIdList));
 		//获取续费人数

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

@@ -2565,7 +2565,7 @@
         <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.dispose_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.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
@@ -2579,7 +2579,7 @@
         </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.dispose_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 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>

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

@@ -1015,7 +1015,7 @@
 		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.dispose_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.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 +1093,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.dispose_content_ IS NULL
+		AND ta.sign_in_time_ IS NULL AND ta.sign_out_time_ IS NULL AND ta.complaints_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">
@@ -1762,7 +1762,8 @@
 			</foreach>
 		</if>
 		GROUP BY sa.user_id_,DATE_FORMAT(cs.class_date_,'%Y-%m')
-		HAVING COUNT(sa.id_) >= #{studentErrorLeaveNum} AND COUNT(sa.id_) > SUM(sa.leave_visit_flag_)) c
+		HAVING COUNT(distinct DATE_FORMAT(cs.class_date_,'%Y-%m-%d')) >= #{studentErrorLeaveNum}
+		   AND COUNT(distinct DATE_FORMAT(cs.class_date_,'%Y-%m-%d')) > SUM(sa.leave_visit_flag_)) c
 	</select>
 	<select id="countOrganStudentErrorLeave" resultType="map">
 		SELECT c.organ_id_ 'key',COUNT(c.user_id_) 'value' FROM (
@@ -1804,7 +1805,7 @@
 			AND (sa.user_id_ = #{search} OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.phone_ LIKE CONCAT('%',#{search},'%'))
 		</if>
 		GROUP BY sa.user_id_,DATE_FORMAT(cs.class_date_,'%Y-%m')
-		HAVING COUNT(sa.id_) >= #{studentErrorLeaveNum} AND COUNT(sa.id_) > SUM(sa.leave_visit_flag_)) c
+		HAVING COUNT(distinct DATE_FORMAT(cs.class_date_,'%Y-%m-%d')) >= #{studentErrorLeaveNum} AND COUNT(distinct DATE_FORMAT(cs.class_date_,'%Y-%m-%d')) > SUM(sa.leave_visit_flag_)) c
 	</select>
 	<resultMap id="StudentErrorLeaveDto" type="com.ym.mec.biz.dal.dto.StudentErrorLeaveDto">
 		<result property="currentNum" column="current_num_"/>

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

@@ -233,8 +233,8 @@
 			<result column="organ_name_" property="organName" />
 			<result column="cooperation_organ_id_" property="cooperationOrganId" />
 			<result column="cooperation_organ_name_" property="cooperationOrganName" />
-			<result column="subject_teacher_id_" property="subjectTeacherId" />
-			<result column="subject_teacher_name_" property="subjectTeacherName" />
+			<result column="teacher_id_" property="subjectTeacherId" />
+			<result column="real_name_" property="subjectTeacherName" />
 			<result column="course_balance_" property="courseBalance" />
 			<result column="student_status_" property="studentStatus" />
 		</association>
@@ -249,24 +249,21 @@
 			</if>
 			<if test="studentStatus != null and studentStatus != ''">
 				<if test="studentStatus == 'NORMAL'">
-					AND (ss.no_schedule_num_ > 0 OR ss.sub_course_num_ > 0) AND (ss.lately_year_course_consumer_ > 0 OR ss.over_course_num_ &lt;= 0)
+					AND (ss.last_visit_status_ = #{feedbackType} OR ((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.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_ = #{feedbackType} OR (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))
 				</if>
 				<if test="studentStatus == 'LOST'">
-					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
+					AND (ss.last_visit_status_ = #{feedbackType} OR (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))
 				</if>
 				<if test="studentStatus == 'PAUSE'">
-					AND suca.course_balance_ > 0 AND ss.sub_course_num_ &lt;= 0 AND ss.no_schedule_num_ &lt;= 0
+					AND (ss.last_visit_status_ = #{feedbackType} OR (suca.course_balance_ > 0 AND ss.sub_course_num_ &lt;= 0 AND ss.no_schedule_num_ &lt;= 0))
 				</if>
 			</if>
 			<if test="studentStatus == null or studentStatus == ''">
 				AND (ss.over_course_num_ > 0 OR ss.sub_course_num_ > 0 OR ss.no_schedule_num_ > 0 OR suca.course_balance_ > 0)
 			</if>
-			<if test="feedbackType != null and feedbackType != ''">
-				AND ss.last_visit_status_ = #{feedbackType}
-			</if>
 			<if test="latelyCourseConsumer != null">
 				AND ss.lately_course_consumer_ = #{latelyCourseConsumer}
 			</if>
@@ -335,15 +332,27 @@
 	<select id="queryStatistics" resultMap="StudentStatisticsDto">
 		SELECT *,ss.not_start_course_fee_ + ss.no_course_fee_ preCourseFee,
 		ss.no_schedule_num_ + ss.sub_course_num_ subTotalCourse,
-			CASE WHEN (ss.no_schedule_num_ > 0 OR ss.sub_course_num_ > 0) AND (ss.lately_year_course_consumer_ > 0 OR ss.over_course_num_ &lt;= 0) THEN '在读'
-			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 '沉睡'
-			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 '流失'
-			WHEN suca.course_balance_ > 0 AND ss.sub_course_num_ &lt;= 0 AND ss.no_schedule_num_ &lt;= 0 THEN '暂停' ELSE '其他' END student_status_
+			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 OR ss.over_course_num_ &lt;= 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.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_,
-			ss.last_visit_time_
+			ss.last_visit_time_,stm.teacher_id_,stm.real_name_
 		FROM student_basic_info sbi
 		LEFT JOIN student_statistics ss ON ss.user_id_ = sbi.user_id_
 		LEFT JOIN sys_user_cash_account suca ON sbi.user_id_ = suca.user_id_
+		left join (select student_id_,group_concat(stm.teacher_id_) teacher_id_,group_concat(su.real_name_)real_name_ from student_teacher_mapper stm
+		left join sys_user su ON su.id_ = stm.teacher_id_
+		<if test="groupType != null and groupType != ''">
+			<if test="groupType == 'VIP' or groupType == 'THEORY'">
+				where stm.teacher_type_ = 'VIP'
+			</if>
+			<if test="groupType == 'PRACTICE'">
+				where stm.teacher_type_ = 'PRACTICE'
+			</if>
+		</if>
+		group by stm.student_id_) stm ON sbi.user_id_ = stm.student_id_
 		<include refid="queryStatisticsSql"/>
 		<include refid="global.limit"/>
 	</select>
@@ -358,17 +367,18 @@
 		<result property="waitRenewNum" column="waitRenewNum"/>
 		<result property="subCourseNum" column="subCourseNum"/>
 		<result property="noScheduleNum" column="noScheduleNum"/>
+		<result property="registerNum" column="registerNum"/>
 	</resultMap>
 	<select id="studentSmallClassStatisticsSum" resultMap="StudentStatisticsSumDto">
 		SELECT
-		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 THEN 1 ELSE NULL END) 'sleepStudentNum',
+		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.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.no_schedule_num_ > 0 OR ss.sub_course_num_ > 0) AND (ss.lately_year_course_consumer_ > 0 OR ss.over_course_num_ &lt;= 0) THEN 1 ELSE NULL END) 'normalStudentNum',
-		COUNT(CASE WHEN ((ss.no_schedule_num_ > 0 OR ss.sub_course_num_ > 0) AND (ss.lately_year_course_consumer_ > 0 OR ss.over_course_num_ &lt;= 0)) AND ss.normal_group_num_ > 0 THEN 1 ELSE NULL END) 'normalStudentHasNormalGroupNum',
+		COUNT(CASE WHEN (ss.no_schedule_num_ > 0 OR ss.sub_course_num_ > 0) AND ss.lately_year_course_consumer_ > 0 THEN 1 ELSE NULL END) 'normalStudentNum',
 		COUNT(CASE WHEN suca.course_balance_ > 0 AND ss.sub_course_num_ &lt;= 0 AND ss.no_schedule_num_ &lt;= 0 THEN 1 ELSE NULL END) 'hasCourseBalanceAndNotSubCourseNum',
 		COUNT(CASE WHEN ((ss.no_schedule_num_ > 0 OR ss.sub_course_num_ > 0) AND (ss.lately_year_course_consumer_ > 0 OR ss.over_course_num_ &lt;= 0)) AND ss.no_schedule_num_ > 0 THEN 1 ELSE NULL END) 'normalStudentHasNoScheduleNum',
 		COUNT(CASE WHEN (ss.no_schedule_num_ + ss.sub_course_num_) &lt; 4 THEN 1 ELSE NULL END) 'waitRenewNum',
+		COUNT(CASE WHEN ss.no_schedule_num_ > 0 OR ss.sub_course_num_ > 0 OR ss.over_course_num_ > 0 THEN 1 ELSE NULL END) 'registerNum',
 		SUM(ss.sub_course_num_) 'subCourseNum',
 		SUM(ss.no_schedule_num_) 'noScheduleNum'
 		FROM student_statistics ss
@@ -504,4 +514,25 @@
         </foreach>
         group by ss.user_id_ , u.organ_id_
 	</select>
+	<select id="countNormalNum" resultType="java.lang.Integer">
+		<if test="groupType == 'VIP'">
+			select count(distinct cssp.user_id_) from vip_group vg
+			left join course_schedule_student_payment cssp ON cssp.music_group_id_ = vg.id_
+			where cssp.group_type_ = 'VIP' and vg.group_status_ = 2 AND vg.vip_group_category_id_ != 16
+		</if>
+		<if test="groupType == 'THEORY'">
+			select count(distinct cssp.user_id_) from vip_group vg
+			left join course_schedule_student_payment cssp ON cssp.music_group_id_ = vg.id_
+			where cssp.group_type_ = 'VIP' and vg.group_status_ = 2 AND vg.vip_group_category_id_ = 16
+		</if>
+		<if test="groupType == 'PRACTICE'">
+			select count(distinct cssp.user_id_) from practice_group vg
+			left join course_schedule_student_payment cssp ON cssp.music_group_id_ = vg.id_
+			where cssp.group_type_ = 'PRACTICE' and vg.group_status_ = 'NORMAL'
+		</if>
+		AND vg.organ_id_ IN
+		<foreach collection="organIdList" item="organId" open="(" close=")" separator=",">
+			#{organId}
+		</foreach>
+	</select>
 </mapper>

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

@@ -486,19 +486,19 @@ public class ExportController extends BaseController {
         queryInfo.setRows(49999);
         queryInfo.setOrganIds(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()), ","));
-                }
-            }
-        }
+//        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()), ","));
+//                }
+//            }
+//        }
         OutputStream outputStream = response.getOutputStream();
         try {
             HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"课程组编号", "课程组名称", "分部名称", "班级名称",