Explorar el Código

Merge remote-tracking branch 'origin/adapay_new' into adapay_new

Joburgess hace 4 años
padre
commit
11e8414b2a

+ 15 - 4
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentAttendanceDao.java

@@ -1,9 +1,6 @@
 package com.ym.mec.biz.dal.dao;
 
-import com.ym.mec.biz.dal.dto.StudentAttendanceResponse;
-import com.ym.mec.biz.dal.dto.StudentAttendanceStatusCountDto;
-import com.ym.mec.biz.dal.dto.StudentPersonalAttendanceDto;
-import com.ym.mec.biz.dal.dto.StudentStatusCountUtilEntity;
+import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.StudentAttendance;
 import com.ym.mec.biz.dal.enums.GroupType;
 import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
@@ -296,4 +293,18 @@ public interface StudentAttendanceDao extends BaseDAO<Long, StudentAttendance> {
      * @return java.lang.Long
      */
     Long findFirstSign(@Param("courseScheduleId") Long courseScheduleId, @Param("userId") Integer userId);
+
+    /**
+     * 学员考勤记录导出查询
+     * @param params
+     * @return
+     */
+    int countExportStudentAttendancesQueryPage(Map<String, Object> params);
+
+    /**
+     * 学员考勤记录导出查询
+     * @param params
+     * @return
+     */
+    List<ExportStudentAttendanceDto> exportStudentAttendancesQueryPage(Map<String, Object> params);
 }

+ 21 - 62
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/StudentManageDao.java

@@ -1,17 +1,24 @@
 package com.ym.mec.biz.dal.dao;
 
-import com.ym.mec.auth.api.entity.SysUser;
-import com.ym.mec.biz.dal.dto.*;
-
-import com.ym.mec.biz.dal.entity.StudentAttendance;
-import com.ym.mec.common.page.PageInfo;
-import com.ym.mec.common.page.QueryInfo;
-import org.apache.ibatis.annotations.Param;
-
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.ibatis.annotations.Param;
+
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.dto.BasicUserDto;
+import com.ym.mec.biz.dal.dto.MusicGroupStudentSignDto;
+import com.ym.mec.biz.dal.dto.MusicGroupStudentsDto;
+import com.ym.mec.biz.dal.dto.StudentHasCourseDto;
+import com.ym.mec.biz.dal.dto.StudentListCourseDto;
+import com.ym.mec.biz.dal.dto.StudentManageAccountBaseInfoDto;
+import com.ym.mec.biz.dal.dto.StudentManageBaseInfoOfMusicGroupDto;
+import com.ym.mec.biz.dal.dto.StudentManageCourseListDto;
+import com.ym.mec.biz.dal.dto.StudentManageListDto;
+import com.ym.mec.biz.dal.dto.StudentManageVipGroupClassDto;
+import com.ym.mec.biz.dal.dto.StudentPaymentDto;
+
 /**
  * @Author Joburgess
  * @Date 2019/9/19
@@ -172,50 +179,12 @@ public interface StudentManageDao {
     int countStudentVipGroupClass(Map<String, Object> params);
 
     /**
-     * 查询有课的学员
-     * @return
-     */
-    Set<Integer> queryHasCourse(Map<String, Object> params);
-
-    /**
-     * 查询没课的学员
-     * @return
-     */
-    Set<Integer> queryNotCourse(Map<String, Object> params);
-
-    /**
-     * 查询有课的学员
-     * @return
-     */
-    Integer countHasCourse(Map<String, Object> params);
-
-    /**
-     * 查询没课的学员
-     * @return
-     */
-    Integer countNotCourse(Map<String, Object> params);
-
-    /**
-     * 获取用户是否有课
-     * @param userIds
-     * @return
-     */
-    List<Map<Integer, Boolean>> queryStudentHasCourse(@Param("userIds") List<Integer> userIds);
-
-    /**
      * 获取未激活,有课的列表
      * @return
      */
     List<StudentManageListDto> queryHasCourseStudent(Map<String, Object> params);
 
     /**
-     * 当前用户是否有课
-     * @param userId
-     * @return
-     */
-    Integer getHasCourse(Integer userId);
-
-    /**
      * 获取签到学员数
      * @param courseScheduleId
      * @param status
@@ -237,22 +206,6 @@ public interface StudentManageDao {
      */
     Integer countRepliedNum(Integer courseScheduleId);
 
-    List<StudentHasCourseDto> queryCourseStudent(@Param("userIds") Set<Integer> userIds);
-
-    /**
-     * 有陪练课的学员列表
-     * @param params
-     * @return
-     */
-    Set<Integer> queryHasPracticeCourse(Map<String, Object> params);
-
-    /**
-     * 没有陪练课的学员列表
-     * @param params
-     * @return
-     */
-    Set<Integer> queryNotPracticeCourse(Map<String, Object> params);
-
     /**
      * 是否有课map列表
      * @param userIds
@@ -295,4 +248,10 @@ public interface StudentManageDao {
      * @return
      */
     List<Map<Integer,Integer>> queryHasCourseMap(@Param("userIds") Set<Integer> userIds);
+    
+    /**
+     * 查询学生剩余课程
+     * @return
+     */
+    List<StudentListCourseDto> queryStudentRemianCourse(@Param("userIds") Set<Integer> userIds);
 }

+ 198 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/ExportStudentAttendanceDto.java

@@ -0,0 +1,198 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.biz.dal.enums.SignInStatusEnum;
+import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @Author zouxuan
+ */
+public class ExportStudentAttendanceDto {
+    @ApiModelProperty(value = "分部编号", required = true)
+    private String organId;
+
+    @ApiModelProperty(value = "分部名称", required = true)
+    private String organName;
+
+    @ApiModelProperty(value = "课程类型", required = true)
+    private GroupType groupType;
+
+    @ApiModelProperty(value = "学生姓名", required = true)
+    private String username;
+
+    @ApiModelProperty(value = "学生编号", required = true)
+    private String userId;
+
+    @ApiModelProperty(value = "课程组编号", required = true)
+    private String groupId;
+
+    @ApiModelProperty(value = "课程组名称", required = true)
+    private String groupName;
+
+    @ApiModelProperty(value = "课程编号", required = true)
+    private Long courseScheduleId;
+
+    @ApiModelProperty(value = "课程名称", required = true)
+    private String courseScheduleName;
+
+    @ApiModelProperty(value = "上课时间", required = true)
+    private String classDate;
+
+    @ApiModelProperty(value = "上课开始时间", required = true)
+    private String startClassTime;
+
+    @ApiModelProperty(value = "上课结束时间", required = true)
+    private String endClassTime;
+
+    @ApiModelProperty(value = "指导老师名称", required = true)
+    private String guideTeacherName;
+
+    @ApiModelProperty(value = "指导老师编号", required = true)
+    private Integer guideTeacherId;
+
+    @ApiModelProperty(value = "教务老师编号", required = true)
+    private Integer educationalTeacherId;
+
+    @ApiModelProperty(value = "教务老师名称", required = true)
+    private String educationalTeacherName;
+
+    @ApiModelProperty(value = "学员考勤状态", required = true)
+    private StudentAttendanceStatusEnum studentAttendanceStatus;
+
+    public String getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(String organId) {
+        this.organId = organId;
+    }
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public GroupType getGroupType() {
+        return groupType;
+    }
+
+    public void setGroupType(GroupType groupType) {
+        this.groupType = groupType;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getUserId() {
+        return userId;
+    }
+
+    public void setUserId(String userId) {
+        this.userId = userId;
+    }
+
+    public String getGroupId() {
+        return groupId;
+    }
+
+    public void setGroupId(String groupId) {
+        this.groupId = groupId;
+    }
+
+    public String getGroupName() {
+        return groupName;
+    }
+
+    public void setGroupName(String groupName) {
+        this.groupName = groupName;
+    }
+
+    public Long getCourseScheduleId() {
+        return courseScheduleId;
+    }
+
+    public void setCourseScheduleId(Long courseScheduleId) {
+        this.courseScheduleId = courseScheduleId;
+    }
+
+    public String getCourseScheduleName() {
+        return courseScheduleName;
+    }
+
+    public void setCourseScheduleName(String courseScheduleName) {
+        this.courseScheduleName = courseScheduleName;
+    }
+
+    public String getClassDate() {
+        return classDate;
+    }
+
+    public void setClassDate(String classDate) {
+        this.classDate = classDate;
+    }
+
+    public String getStartClassTime() {
+        return startClassTime;
+    }
+
+    public void setStartClassTime(String startClassTime) {
+        this.startClassTime = startClassTime;
+    }
+
+    public String getEndClassTime() {
+        return endClassTime;
+    }
+
+    public void setEndClassTime(String endClassTime) {
+        this.endClassTime = endClassTime;
+    }
+
+    public String getGuideTeacherName() {
+        return guideTeacherName;
+    }
+
+    public void setGuideTeacherName(String guideTeacherName) {
+        this.guideTeacherName = guideTeacherName;
+    }
+
+    public Integer getGuideTeacherId() {
+        return guideTeacherId;
+    }
+
+    public void setGuideTeacherId(Integer guideTeacherId) {
+        this.guideTeacherId = guideTeacherId;
+    }
+
+    public Integer getEducationalTeacherId() {
+        return educationalTeacherId;
+    }
+
+    public void setEducationalTeacherId(Integer educationalTeacherId) {
+        this.educationalTeacherId = educationalTeacherId;
+    }
+
+    public String getEducationalTeacherName() {
+        return educationalTeacherName;
+    }
+
+    public void setEducationalTeacherName(String educationalTeacherName) {
+        this.educationalTeacherName = educationalTeacherName;
+    }
+
+    public StudentAttendanceStatusEnum getStudentAttendanceStatus() {
+        return studentAttendanceStatus;
+    }
+
+    public void setStudentAttendanceStatus(StudentAttendanceStatusEnum studentAttendanceStatus) {
+        this.studentAttendanceStatus = studentAttendanceStatus;
+    }
+}

+ 35 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentListCourseDto.java

@@ -0,0 +1,35 @@
+package com.ym.mec.biz.dal.dto;
+
+public class StudentListCourseDto {
+
+	private Integer userId;
+	
+	private Integer remainCourseNum;
+	
+	private Integer remainPracticeNum;
+
+	public Integer getUserId() {
+		return userId;
+	}
+
+	public void setUserId(Integer userId) {
+		this.userId = userId;
+	}
+
+	public Integer getRemainCourseNum() {
+		return remainCourseNum;
+	}
+
+	public void setRemainCourseNum(Integer remainCourseNum) {
+		this.remainCourseNum = remainCourseNum;
+	}
+
+	public Integer getRemainPracticeNum() {
+		return remainPracticeNum;
+	}
+
+	public void setRemainPracticeNum(Integer remainPracticeNum) {
+		this.remainPracticeNum = remainPracticeNum;
+	}
+	
+}

+ 45 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/ExportStudentAttendanceQueryInfo.java

@@ -0,0 +1,45 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+
+public class ExportStudentAttendanceQueryInfo extends QueryInfo {
+    private String organId;
+
+    private String groupType = "MUSIC";
+
+    private String classStartDate;
+
+    private String classEndDate;
+
+    public String getClassStartDate() {
+        return classStartDate;
+    }
+
+    public void setClassStartDate(String classStartDate) {
+        this.classStartDate = classStartDate;
+    }
+
+    public String getClassEndDate() {
+        return classEndDate;
+    }
+
+    public void setClassEndDate(String classEndDate) {
+        this.classEndDate = classEndDate;
+    }
+
+    public String getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(String organId) {
+        this.organId = organId;
+    }
+
+    public String getGroupType() {
+        return groupType;
+    }
+
+    public void setGroupType(String groupType) {
+        this.groupType = groupType;
+    }
+}

+ 0 - 20
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentManageQueryInfo.java

@@ -32,10 +32,6 @@ public class StudentManageQueryInfo extends QueryInfo {
 
     private Boolean isExport = false;
 
-    private Boolean hasCourse;
-
-    private Boolean hasPracticeCourse;
-
     private Integer serviceTag;
 
     private Integer operatingTag;
@@ -66,14 +62,6 @@ public class StudentManageQueryInfo extends QueryInfo {
         isExport = export;
     }
 
-    public Boolean getHasPracticeCourse() {
-        return hasPracticeCourse;
-    }
-
-    public void setHasPracticeCourse(Boolean hasPracticeCourse) {
-        this.hasPracticeCourse = hasPracticeCourse;
-    }
-
     public List<Integer> getUserIds() {
         return userIds;
     }
@@ -82,14 +70,6 @@ public class StudentManageQueryInfo extends QueryInfo {
         this.userIds = userIds;
     }
 
-    public Boolean getHasCourse() {
-        return hasCourse;
-    }
-
-    public void setHasCourse(Boolean hasCourse) {
-        this.hasCourse = hasCourse;
-    }
-
     public String getStudentName() {
         return studentName;
     }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentAttendanceService.java

@@ -1,12 +1,14 @@
 package com.ym.mec.biz.service;
 
 import com.ym.mec.biz.dal.dto.CourseScheduleResponse;
+import com.ym.mec.biz.dal.dto.ExportStudentAttendanceDto;
 import com.ym.mec.biz.dal.dto.StudentAttendanceDto;
 import com.ym.mec.biz.dal.dto.StudentPersonalAttendanceDto;
 import com.ym.mec.biz.dal.entity.StudentAttendance;
 import com.ym.mec.biz.dal.enums.SignStatusEnum;
 import com.ym.mec.biz.dal.enums.StudentAttendanceStatusEnum;
 import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
+import com.ym.mec.biz.dal.page.ExportStudentAttendanceQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.common.service.BaseService;
@@ -119,4 +121,12 @@ public interface StudentAttendanceService extends BaseService<Long, StudentAtten
 	 * @param userId
 	 */
 	void cleanCourseStudentSignOut(Long courseId, Integer userId);
+
+	/**
+	 * 学员考勤导出列表
+	 * @author zouxuan
+	 * @param queryInfo
+	 * @return
+	 */
+	PageInfo<ExportStudentAttendanceDto> exportStudentAttendancesQueryPage(ExportStudentAttendanceQueryInfo queryInfo);
 }

+ 21 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentAttendanceServiceImpl.java

@@ -7,6 +7,7 @@ import com.ym.mec.biz.dal.dto.*;
 import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.enums.*;
 import com.ym.mec.biz.dal.page.CourseHomeworkQueryInfo;
+import com.ym.mec.biz.dal.page.ExportStudentAttendanceQueryInfo;
 import com.ym.mec.biz.dal.page.StudentAttendanceQueryInfo;
 import com.ym.mec.biz.service.StudentAttendanceService;
 import com.ym.mec.biz.service.SysConfigService;
@@ -692,4 +693,24 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
     public void cleanCourseStudentSignOut(Long courseId, Integer userId) {
         studentAttendanceDao.cleanCourseStudentSignOut(courseId, userId);
     }
+
+    @Override
+    public PageInfo<ExportStudentAttendanceDto> exportStudentAttendancesQueryPage(ExportStudentAttendanceQueryInfo queryInfo) {
+        PageInfo<ExportStudentAttendanceDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+
+        List<ExportStudentAttendanceDto> dataList = null;
+        int count = studentAttendanceDao.countExportStudentAttendancesQueryPage(params);
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            params.put("offset", pageInfo.getOffset());
+            dataList = studentAttendanceDao.exportStudentAttendancesQueryPage(params);
+        }
+        if (count == 0) {
+            dataList = new ArrayList<>();
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
 }

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

@@ -39,6 +39,7 @@ import com.ym.mec.biz.dal.dto.MusicGroupStudentSignDto;
 import com.ym.mec.biz.dal.dto.MusicGroupStudentsDto;
 import com.ym.mec.biz.dal.dto.SimpleUserDto;
 import com.ym.mec.biz.dal.dto.Student4operating;
+import com.ym.mec.biz.dal.dto.StudentListCourseDto;
 import com.ym.mec.biz.dal.dto.StudentManageAccountBaseInfoDto;
 import com.ym.mec.biz.dal.dto.StudentManageBaseInfoOfMusicGroupDto;
 import com.ym.mec.biz.dal.dto.StudentManageCourseListDto;
@@ -117,58 +118,49 @@ public class StudentManageServiceImpl implements StudentManageService {
 
     @Override
     public PageInfo<StudentManageListDto> findStudentsByOrganId(StudentManageQueryInfo queryInfo) {
-        PageInfo<StudentManageListDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
-        Boolean hasCourse = queryInfo.getHasCourse();
-        Boolean hasPracticeCourse = queryInfo.getHasPracticeCourse();
-        Map<String, Object> params = new HashMap<>();
-        MapUtil.populateMap(params, queryInfo);
-        params.put("offset", pageInfo.getOffset());
-        int count = 0;
-        Set<Integer> paramUserIds = null;
-        if (hasPracticeCourse != null) {
-            //是否有陪练课
-            if (hasPracticeCourse) {
-                paramUserIds = studentManageDao.queryHasPracticeCourse(params);
-            } else {
-                paramUserIds = studentManageDao.queryNotPracticeCourse(params);
-            }
-            if (paramUserIds.size() == 0) {
-                return pageInfo;
-            }
-            params.put("userIds", paramUserIds);
-        }
-        if (hasCourse != null) {
-            if (hasCourse) {
-                paramUserIds = studentManageDao.queryHasCourse(params);
-                count = studentManageDao.countHasCourse(params);
-            } else {
-                paramUserIds = studentManageDao.queryNotCourse(params);
-                count = studentManageDao.countNotCourse(params);
-            }
-            if (paramUserIds.size() == 0) {
-                return pageInfo;
-            }
-            params.remove("offset");
-            params.put("userIds", paramUserIds);
-        } else {
-            count = studentManageDao.countStudentByOrganId(params);
-        }
-        if (queryInfo.getIsExport() && count > 50000) {
-            throw new BizException("数据集太大,不能导出.最大数据集不能超过50000");
-        }
-        List<StudentManageListDto> dataList = null;
-        if (count > 0) {
-            pageInfo.setTotal(count);
-            dataList = studentManageDao.findStudentsByOrganId(params);
-            Set<Integer> userIds = dataList.stream().map(StudentManageListDto::getUserId).collect(Collectors.toSet());
-            Set<Integer> organIds = dataList.stream().map(StudentManageListDto::getOrganId).collect(Collectors.toSet());
-            List<SysUserCashAccount> byUserIds = sysUserCashAccountDao.findByUserIds(userIds);
-            Map<Integer, SysUserCashAccount> collect = byUserIds.stream()
-                    .collect(Collectors.toMap(SysUserCashAccount::getUserId, sysUserCashAccount -> sysUserCashAccount));
-            Map<Integer, Integer> hasPracticeCourseMap = MapUtil.convertIntegerMap(studentManageDao.getHasPracticeCourse(userIds));
-            //获取用户分部
-            Map<Integer, String> organNames = MapUtil.convertMybatisMap(organizationDao.findOrganNameMapList(organIds));
-            //获取所在乐团
+        PageInfo<StudentManageListDto> pageInfo = new PageInfo<StudentManageListDto>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+		
+		List<StudentManageListDto> dataList = null;
+		int count = studentManageDao.countStudentByOrganId(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = studentManageDao.findStudentsByOrganId(params);
+		}
+		if (dataList == null) {
+			dataList = new ArrayList<StudentManageListDto>();
+		}
+		pageInfo.setRows(dataList);
+		
+        Set<Integer> userIds = dataList.stream().map(StudentManageListDto::getUserId).collect(Collectors.toSet());
+		
+		List<StudentListCourseDto> studentListCourseDtoList = studentManageDao.queryStudentRemianCourse(userIds);
+		Map<Integer,StudentListCourseDto> StudentListCourseDtoMap = studentListCourseDtoList.stream().collect(Collectors.toMap(StudentListCourseDto::getUserId, studentListCourseDto -> studentListCourseDto));
+		
+		StudentListCourseDto studentListCourseDto = null;
+		for(StudentManageListDto dto : dataList){
+			studentListCourseDto = StudentListCourseDtoMap.get(dto.getUserId());
+			if(studentListCourseDto != null){
+				if(studentListCourseDto.getRemainCourseNum() > 0){
+					dto.setHasCourse(YesOrNoEnum.YES);
+				}else{
+					dto.setHasCourse(YesOrNoEnum.NO);
+				}
+				if(studentListCourseDto.getRemainPracticeNum() > 0){
+					dto.setHasPracticeCourse(YesOrNoEnum.YES);
+				}else{
+					dto.setHasPracticeCourse(YesOrNoEnum.NO);
+				}
+			}
+		}
+		
+		if (queryInfo.getIsExport()) {
+			if (count > 50000) {
+				throw new BizException("数据集太大,不能导出.最大数据集不能超过50000");
+			}
+			//获取所在乐团
             Map<Integer, String> musicGroupNames = MapUtil.convertMybatisMap(musicGroupDao.queryUserMusicNames(userIds));
             //获取所在vip
             Map<Integer, String> vipGroupNames = MapUtil.convertMybatisMap(vipGroupDao.queryUserVipNames(userIds));
@@ -176,38 +168,14 @@ public class StudentManageServiceImpl implements StudentManageService {
             Map<Integer, String> musicGroupStatus = MapUtil.convertMybatisMap(musicGroupDao.queryUserMusicStatus(userIds));
             //获取所在vip状态
             Map<Integer, String> vipGroupStatus = MapUtil.convertMybatisMap(vipGroupDao.queryUserVipStatus(userIds));
-            //获取所在声部
-            Map<Integer, String> subjectNames = MapUtil.convertMybatisMap(studentManageDao.querySubjectNames(userIds));
-            //学员是否有课
-            Map<Integer, Integer> hasCourseMap = MapUtil.convertMybatisMap(studentManageDao.queryHasCourseMap(userIds));
+            
             dataList.forEach(e -> {
-                e.setOrganName(organNames.get(e.getOrganId()));
                 e.setMusicGroupName(musicGroupNames.get(e.getUserId().longValue()));
                 e.setVipGroupName(vipGroupNames.get(e.getUserId()));
-                e.setSubjectName(subjectNames.get(e.getUserId().longValue()));
                 e.setMusicGroupStatus(musicGroupStatus.get(e.getUserId().longValue()));
                 e.setVipGroupStatus(vipGroupStatus.get(e.getUserId()));
-                e.setHasCourse(hasCourseMap.get(e.getUserId()) == null ? YesOrNoEnum.NO : YesOrNoEnum.YES);
-                /*if(hasCourse == null){
-                    Integer course = studentManageDao.getHasCourse(e.getUserId());
-                    e.setHasCourse(course==null?YesOrNoEnum.NO:course==0?YesOrNoEnum.NO:YesOrNoEnum.YES);
-                }else {
-                    if(hasCourse){
-                        e.setHasCourse(YesOrNoEnum.YES);
-                    }else {
-                        e.setHasCourse(YesOrNoEnum.NO);
-                    }
-                }*/
-                e.setHasPracticeCourse(hasPracticeCourseMap.get(e.getUserId()) == null ? YesOrNoEnum.NO : YesOrNoEnum.YES);
-                if (collect.get(e.getUserId()) != null) {
-                    e.setCourseBalance(collect.get(e.getUserId()).getCourseBalance());
-                }
             });
-        }
-        if (count == 0) {
-            dataList = new ArrayList<>();
-        }
-        pageInfo.setRows(dataList);
+		}
         return pageInfo;
     }
 

+ 69 - 0
mec-biz/src/main/resources/config/mybatis/StudentAttendanceMapper.xml

@@ -515,4 +515,73 @@
         WHERE sa.current_schedule_id_ = #{courseScheduleId} AND sa.user_id_ = #{userId}
         AND sa.sign_in_time_ IS NOT NULL ORDER BY sa.sign_in_time_ ASC LIMIT 1
     </select>
+    <resultMap id="ExportStudentAttendanceDtoMap" type="com.ym.mec.biz.dal.dto.ExportStudentAttendanceDto">
+        <result property="classDate" column="class_date_"/>
+        <result property="courseScheduleId" column="course_schedule_id_"/>
+        <result property="courseScheduleName" column="course_schedule_name_"/>
+        <result property="educationalTeacherId" column="educational_teacher_id_"/>
+        <result property="educationalTeacherName" column="educational_teacher_name_"/>
+        <result property="endClassTime" column="end_class_time_"/>
+        <result property="groupId" column="music_group_id_"/>
+        <result property="groupName" column="music_group_name_"/>
+        <result property="groupType" column="group_type_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result property="guideTeacherId" column="guide_teacher_id_"/>
+        <result property="guideTeacherName" column="guide_teacher_name_"/>
+        <result property="organId" column="organ_id_"/>
+        <result property="organName" column="organ_name_"/>
+        <result property="startClassTime" column="start_class_time_"/>
+        <result property="studentAttendanceStatus" column="attendance_status_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result property="userId" column="user_id_"/>
+        <result property="username" column="username_"/>
+    </resultMap>
+    <select id="countExportStudentAttendancesQueryPage" resultType="java.lang.Integer">
+        SELECT COUNT(cssp.id_)
+        FROM course_schedule_student_payment cssp
+        LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
+        <include refid="exportStudentAttendancesQueryPageSql"/>
+    </select>
+    <sql id="exportStudentAttendancesQueryPageSql">
+        <where>
+            <if test="organId != null">
+                AND FIND_IN_SET(cs.organ_id_,#{organId})
+            </if>
+            <if test="groupType != null">
+                AND cssp.group_type_ = #{groupType}
+            </if>
+            <if test="classStartDate != null and classStartDate != ''">
+                AND cs.class_date_ >= #{classStartDate}
+            </if>
+            <if test="classEndDate != null and classEndDate != ''">
+                AND cs.class_date_ &lt;= #{classEndDate}
+            </if>
+        </where>
+    </sql>
+    <select id="exportStudentAttendancesQueryPage"
+            resultMap="ExportStudentAttendanceDtoMap">
+        SELECT o.name_ organ_name_,o.id_ organ_id_,cs.music_group_id_,mg.name_ music_group_name_,su.username_,cssp.user_id_,
+        cs.name_ course_schedule_name_,cs.id_ course_schedule_id_,
+        cs.class_date_,cs.start_class_time_,cs.end_class_time_,su2.real_name_ guide_teacher_name_,st.teacher_id_ guide_teacher_id_
+        ,su1.real_name_ educational_teacher_name_,mg.educational_teacher_id_,cs.group_type_,
+        CASE WHEN sa.id_ IS NULL THEN 'TRUANT' ELSE sa.status_ END attendance_status_
+        FROM course_schedule_student_payment cssp
+        LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
+        LEFT JOIN student_attendance sa ON cssp.course_schedule_id_ = sa.course_schedule_id_
+        <if test="groupType == 'MUSIC'">
+            LEFT JOIN music_group mg ON mg.id_ = cssp.music_group_id_
+        </if>
+        <if test="groupType == 'VIP'">
+            LEFT JOIN vip_group mg ON mg.id_ = cssp.music_group_id_
+        </if>
+        <if test="groupType == 'PRACTICE'">
+            LEFT JOIN practice_group mg ON mg.id_ = cssp.music_group_id_
+        </if>
+        LEFT JOIN sys_user su1 ON su1.id_ = mg.educational_teacher_id_
+        LEFT JOIN organization o ON o.id_ = cs.organ_id_
+        LEFT JOIN student st ON st.user_id_ = cssp.user_id_
+        LEFT JOIN sys_user su ON su.id_ = cssp.user_id_
+        LEFT JOIN sys_user su2 ON su2.id_ = st.teacher_id_
+        <include refid="exportStudentAttendancesQueryPageSql"/>
+        ORDER BY cssp.music_group_id_ DESC,cssp.id_ DESC
+        <include refid="global.limit"/>
+    </select>
 </mapper>

+ 60 - 176
mec-biz/src/main/resources/config/mybatis/StudentManageDao.xml

@@ -28,6 +28,42 @@
         <result property="courseBalance" column="course_balance_"/>
     </resultMap>
 
+    <resultMap id="StudentListCourseDto" type="com.ym.mec.biz.dal.dto.StudentListCourseDto">
+        <result property="userId" column="userId"/>
+        <result property="remainCourseNum" column="remainCourseNum"/>
+        <result property="remainPracticeNum" column="remainPracticeNum"/>
+    </resultMap>
+    
+    <resultMap id="studentManageListDto" type="com.ym.mec.biz.dal.dto.StudentManageListDto">
+        <result property="userId" column="user_id_"/>
+        <result property="realName" column="real_name_"/>
+        <result property="nation" column="nation_"/>
+        <result property="parentsPhone" column="parents_phone_"/>
+        <result property="parentsName" column="real_name_"/>
+        <result property="gender" column="gender_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result property="username" column="username_"/>
+        <result property="birthdate" column="birthdate_"/>
+        <result property="currentGrade" column="current_grade_"/>
+        <result property="currentClass" column="current_class_"/>
+        <result property="isActive" column="isActive_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result property="hasCourse" column="hasCourse_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result property="hasPracticeCourse" column="hasPracticeCourse_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result property="musicGroupName" column="music_group_name_"/>
+        <result property="musicGroupStatus" column="music_group_status_"/>
+        <result property="vipGroupName" column="vip_group_name_"/>
+        <result property="vipGroupStatus" column="vip_group_status_"/>
+        <result property="organName" column="organ_name_"/>
+        <result property="organId" column="organ_id_"/>
+        <result property="subjectName" column="music_group_subject_"/>
+        <result property="courseBalance" column="course_balance_"/>
+        <result property="balance" column="balance_"/>
+        <result property="serviceTag" column="service_tag_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result property="operatingTag" column="operating_tag_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+        <result property="teacherName" column="teacher_name_"/>
+        <result property="teacherId" column="teacher_id_"/>
+        <result property="subjectIdList" column="subject_id_list_"/>
+    </resultMap>
+
     <sql id="queryCondition">
         <where>
             cgsm.user_id_ IS NOT NULL
@@ -112,21 +148,20 @@
     </update>
 
     <select id="findStudentsByOrganId" resultMap="studentManageListDto">
-        SELECT su.id_ user_id_,su.username_,su.gender_,su.phone_ parents_phone_,su.real_name_,
-        su.birthdate_,su.nation_,su.organ_id_,
-        CASE WHEN su.password_ IS NULL THEN 0 ELSE 1 END isActive_,
-        IF(st.service_tag_=2,0,st.service_tag_) service_tag_,st.operating_tag_,tu.real_name_ teacher_name_,st.teacher_id_,st.subject_id_list_,suca.balance_
-        FROM sys_user su
-        LEFT JOIN student st ON st.user_id_ = su.id_
-        LEFT JOIN sys_user tu ON tu.id_ = st.teacher_id_
-        LEFT JOIN sys_user_cash_account suca ON su.id_ = suca.user_id_
+        SELECT o.`name_` organ_name_,s.`user_id_` ,su.`username_` ,su.`phone_` parents_phone_,su.`real_name_` ,su.`gender_` , 
+		tu.`username_` teacher_name_,s.`service_tag_` ,s.`operating_tag_` , suca.`course_balance_` ,sub.`name_` music_group_subject_ 
+		FROM `student` s LEFT JOIN `sys_user` su on s.`user_id_` = su.`id_`
+		LEFT JOIN `organization` o on o.`id_` = su.`organ_id_`
+		LEFT JOIN `sys_user` tu on tu.`id_` = s.`teacher_id_` 
+		LEFT JOIN `sys_user_cash_account` suca on suca.`user_id_` = s.`user_id_`
+		LEFT JOIN `subject` sub on sub.id_ = s.`subject_id_list_`
         <include refid="findStudentsByOrganIdSql"/>
         ORDER BY su.create_time_ DESC
         <include refid="global.limit"/>
     </select>
     <sql id="findStudentsByOrganIdSql">
         <where>
-                su.user_type_ LIKE '%STUDENT%' AND su.del_flag_ = 0
+                su.del_flag_ = 0
             <if test="organId != null and organId != ''">
                 AND FIND_IN_SET(su.organ_id_,#{organId})
             </if>
@@ -140,31 +175,21 @@
                 AND su.password_ is null
             </if>
             <if test="operatingTag != null">
-                AND st.operating_tag_ = #{operatingTag}
+                AND s.operating_tag_ = #{operatingTag}
             </if>
             <if test="serviceTag != null">
-                AND st.service_tag_ = #{serviceTag}
+                AND s.service_tag_ = #{serviceTag}
             </if>
             <if test="teacherId != null">
-                AND st.teacher_id_ = #{teacherId}
-            </if>
-            <if test="userIds != null">
-                AND su.id_ IN
-                <foreach collection="userIds" open="(" close=")" separator="," item="item">
-                    #{item}
-                </foreach>
+                AND s.teacher_id_ = #{teacherId}
             </if>
         </where>
     </sql>
 
     <select id="countStudentByOrganId" resultType="java.lang.Integer">
         SELECT COUNT(DISTINCT su.id_)
-        FROM sys_user su
-        LEFT JOIN student_registration sr ON su.id_ = sr.user_id_
-        LEFT JOIN practice_lesson_apply pla ON su.id_ = pla.user_id_
-        LEFT JOIN student st ON st.user_id_ = su.id_
-        WHERE su.user_type_ LIKE '%STUDENT%' AND su.del_flag_ = 0
-        <include refid="queryHasCourseSql"/>
+        FROM `student` s LEFT JOIN `sys_user` su on s.`user_id_` = su.`id_`
+       <include refid="findStudentsByOrganIdSql"/>
     </select>
     <select id="findStudentBaseInfoByUserID" resultMap="studentManageListDto">
         SELECT su.username_,su.gender_,su.birthdate_,su.real_name_,su.id_ user_id_,
@@ -610,98 +635,6 @@
             AND st.teacher_id_ = #{teacherId}
         </if>
     </sql>
-    <select id="queryHasCourse" resultType="java.lang.Integer">
-        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_
-        LEFT JOIN practice_lesson_apply pla ON su.id_ = pla.user_id_
-        LEFT JOIN student st ON st.user_id_ = su.id_
-        WHERE su.user_type_ LIKE '%STUDENT%' AND cs.status_ != 'OVER' AND su.del_flag_ = 0
-        <include refid="queryHasCourseSql"/>
-        GROUP BY su.id_
-        ORDER BY su.create_time_ DESC
-        <include refid="global.limit"/>
-    </select>
-    <select id="countHasCourse" resultType="java.lang.Integer">
-        SELECT COUNT(DISTINCT 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_
-        LEFT JOIN practice_lesson_apply pla ON su.id_ = pla.user_id_
-        LEFT JOIN student st ON st.user_id_ = su.id_
-        WHERE su.user_type_ LIKE '%STUDENT%' AND cs.status_ != 'OVER' AND su.del_flag_ = 0
-        <include refid="queryHasCourseSql"/>
-    </select>
-    <select id="queryNotCourse" resultType="java.lang.Integer">
-        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 cs.status_ != 'OVER'
-        LEFT JOIN practice_lesson_apply pla ON su.id_ = pla.user_id_
-        LEFT JOIN student st ON st.user_id_ = su.id_
-        <include refid="queryNotCourseSql"/>
-        GROUP BY su.id_
-        HAVING COUNT(cs.id_) = 0
-        ORDER BY su.create_time_ DESC
-        <include refid="global.limit"/>
-    </select>
-    <select id="countNotCourse" resultType="java.lang.Integer">
-        SELECT COUNT(e.id_) FROM (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 cs.status_ != 'OVER'
-        LEFT JOIN practice_lesson_apply pla ON su.id_ = pla.user_id_
-        LEFT JOIN student st ON st.user_id_ = su.id_
-        <include refid="queryNotCourseSql"/>
-        GROUP BY su.id_
-        HAVING COUNT(cs.id_) = 0)e
-    </select>
-    <sql id="queryNotCourseSql">
-        <where>
-                su.user_type_ LIKE '%STUDENT%' AND su.del_flag_ = 0
-            <if test="userIds != null">
-                AND su.id_ IN
-                <foreach collection="userIds" open="(" close=")" separator="," item="item">
-                    #{item}
-                </foreach>
-            </if>
-            <if test="organId != null">
-                AND FIND_IN_SET(su.organ_id_,#{organId})
-            </if>
-            <if test="search != null and search != ''">
-                AND (su.phone_ LIKE CONCAT('%',#{search},'%') OR su.username_ LIKE CONCAT('%',#{search},'%') OR su.id_ LIKE CONCAT('%',#{search},'%'))
-            </if>
-            <if test="isActive != null and isActive == true">
-                and su.password_ is not null
-            </if>
-            <if test="isActive != null and isActive == false">
-                and su.password_ is null
-            </if>
-            <if test="isMake != null and isMake == true">
-                and pla.id_ IS NOT NULL
-            </if>
-            <if test="isMake != null and isMake == false">
-                and pla.id_ IS NULL
-            </if>
-            <if test="operatingTag != null">
-                AND st.operating_tag_ = #{operatingTag}
-            </if>
-            <if test="serviceTag != null">
-                AND st.service_tag_ = #{serviceTag}
-            </if>
-        </where>
-    </sql>
-    <select id="queryStudentHasCourse" resultType="java.util.Map">
-        SELECT cssp.user_id_ 'key',CASE WHEN COUNT(cssp.id_ AND cs.status_ != 'OVER') = 0 THEN 0 ELSE 1 END 'value'
-        FROM course_schedule_student_payment cssp
-        LEFT JOIN course_schedule cs ON cs.id_ = cssp.course_schedule_id_
-        <where>
-            <if test="userIds != null">
-                cssp.user_id_ IN
-                <foreach collection="userIds" open="(" close=")" separator="," item="item">
-                    #{item}
-                </foreach>
-            </if>
-        </where>
-        GROUP BY cssp.user_id_
-    </select>
     <resultMap id="StudentHasCourseDtoMap" type="com.ym.mec.biz.dal.dto.StudentHasCourseDto">
         <result property="userName" column="username_"/>
         <result property="musicGroupName" column="music_group_name_"/>
@@ -712,47 +645,7 @@
         <result property="isActive" column="is_active_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
         <result property="isMake" column="is_make_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
     </resultMap>
-    <select id="queryCourseStudent" resultMap="StudentHasCourseDtoMap">
-        SELECT su.id_,su.username_,o.name_ organ_name_,
-        CASE WHEN su.password_ IS NULL THEN 0 ELSE 1 END is_active_,
-        CASE WHEN pla.id_ IS NULL THEN 0 ELSE 1 END is_make_
-        FROM sys_user su
-        LEFT JOIN organization o ON su.organ_id_ = o.id_
-        LEFT JOIN practice_lesson_apply pla ON pla.user_id_ = su.id_
-        WHERE su.id_ IN
-        <foreach collection="userIds" separator="," open="(" close=")" item="item">
-            #{item}
-        </foreach>
-    </select>
-    <resultMap id="studentManageListDto" type="com.ym.mec.biz.dal.dto.StudentManageListDto">
-        <result property="userId" column="user_id_"/>
-        <result property="realName" column="real_name_"/>
-        <result property="nation" column="nation_"/>
-        <result property="parentsPhone" column="parents_phone_"/>
-        <result property="parentsName" column="real_name_"/>
-        <result property="gender" column="gender_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
-        <result property="username" column="username_"/>
-        <result property="birthdate" column="birthdate_"/>
-        <result property="currentGrade" column="current_grade_"/>
-        <result property="currentClass" column="current_class_"/>
-        <result property="isActive" column="isActive_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
-        <result property="hasCourse" column="hasCourse_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
-        <result property="hasPracticeCourse" column="hasPracticeCourse_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
-        <result property="musicGroupName" column="music_group_name_"/>
-        <result property="musicGroupStatus" column="music_group_status_"/>
-        <result property="vipGroupName" column="vip_group_name_"/>
-        <result property="vipGroupStatus" column="vip_group_status_"/>
-        <result property="organName" column="organ_name_"/>
-        <result property="organId" column="organ_id_"/>
-        <result property="subjectName" column="music_group_subject_"/>
-        <result property="courseBalance" column="course_balance_"/>
-        <result property="balance" column="balance_"/>
-        <result property="serviceTag" column="service_tag_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
-        <result property="operatingTag" column="operating_tag_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
-        <result property="teacherName" column="teacher_name_"/>
-        <result property="teacherId" column="teacher_id_"/>
-        <result property="subjectIdList" column="subject_id_list_"/>
-    </resultMap>
+    
     <select id="queryHasCourseStudent" resultMap="studentManageListDto">
         SELECT su.id_ user_id_,su.username_,su.gender_,GROUP_CONCAT(DISTINCT sr.parents_name_)parents_name_,
         GROUP_CONCAT(DISTINCT sr.parents_phone_)parents_phone_,
@@ -818,12 +711,6 @@
         </if>
         GROUP BY su.id_
     </select>
-    <select id="getHasCourse" resultType="java.lang.Integer">
-        SELECT COUNT(DISTINCT 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_
-        WHERE cs.status_ != 'OVER' AND su.id_ = #{userId}
-    </select>
     <select id="countStudentSignInNum" resultType="java.lang.Integer">
         SELECT COUNT(id_) FROM student_attendance WHERE course_schedule_id_ = #{courseScheduleId} AND status_ = #{status}
     </select>
@@ -848,19 +735,6 @@
             AND su.password_ IS NULL
         </if>
     </sql>
-    <select id="queryHasPracticeCourse" resultType="java.lang.Integer">
-        SELECT DISTINCT su.id_ FROM sys_user su
-        LEFT JOIN course_schedule_student_payment cssp ON cssp.user_id_ = su.id_
-        WHERE su.user_type_ LIKE '%STUDENT%' AND su.del_flag_ = 0 AND cssp.group_type_ = 'PRACTICE'
-        <include refid="queryHasPracticeCourseSql"/>
-    </select>
-    <select id="queryNotPracticeCourse" resultType="java.lang.Integer">
-        SELECT DISTINCT su.id_ FROM sys_user su
-        WHERE su.id_ NOT IN
-        (SELECT DISTINCT cssp.user_id_ FROM course_schedule_student_payment cssp WHERE cssp.group_type_ = 'PRACTICE')
-        AND su.user_type_ LIKE '%STUDENT%' AND su.del_flag_ = 0
-        <include refid="queryHasPracticeCourseSql"/>
-    </select>
     <select id="getHasPracticeCourse" resultType="java.util.Map">
         SELECT cssp.user_id_ 'key',COUNT(DISTINCT cssp.user_id_) 'value' FROM course_schedule_student_payment cssp
         WHERE cssp.group_type_ = 'PRACTICE' AND cssp.user_id_ IN
@@ -914,5 +788,15 @@
         </foreach>
         GROUP BY su.id_
     </select>
+    
+    <select id="queryStudentRemianCourse" resultMap="StudentListCourseDto">
+    	SELECT cssp.`user_id_` ,count(cssp.`id_`) remainCourseNum,sum(case when cs.`group_type_` = 'PRACTICE' then 1 else 0 end) remainPracticeNum  
+    	FROM `course_schedule_student_payment` cssp LEFT JOIN `course_schedule` cs on cssp.`course_schedule_id_` = cs.`id_`
+		WHERE cs.`status_` = 'NOT_START' AND cssp.`user_id_` IN
+        <foreach collection="userIds" item="userId" open="(" close=")" separator=",">
+            #{userId}
+        </foreach>
+		GROUP BY cssp.`user_id_`
+    </select>
 
 </mapper>

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

@@ -12,6 +12,7 @@ import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
+import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.util.collection.MapUtil;
 import com.ym.mec.util.date.DateUtil;
 import com.ym.mec.util.excel.POIUtil;
@@ -85,6 +86,8 @@ public class ExportController extends BaseController {
     @Autowired
     private TeacherAttendanceService teacherAttendanceService;
     @Autowired
+    private StudentAttendanceService studentAttendanceService;
+    @Autowired
     private TeacherCourseRewardService teacherCourseRewardService;
     @Autowired
     private DegreeRegistrationService degreeRegistrationService;
@@ -105,10 +108,60 @@ public class ExportController extends BaseController {
     @Autowired
     private CourseScheduleStudentPaymentDao courseScheduleStudentPaymentDao;
 
+    @ApiOperation(value = "学员考勤记录导出")
+    @PostMapping("export/exportStudentAttendances")
+    @PreAuthorize("@pcs.hasPermissions('export/exportStudentAttendances')")
+    public void exportStudentAttendances(HttpServletResponse response, ExportStudentAttendanceQueryInfo queryInfo) throws IOException {
+        queryInfo.setPage(1);
+        queryInfo.setRows(49999);
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("用户信息获取失败");
+        }
+        if (!sysUser.getIsSuperAdmin()) {
+            Employee employee = employeeDao.get(sysUser.getId());
+            if (StringUtils.isEmpty(queryInfo.getOrganId())) {
+                queryInfo.setOrganId(employee.getOrganIdList());
+            } else if (StringUtils.isEmpty(employee.getOrganIdList())) {
+                throw new BizException("用户所在分部异常");
+            } else {
+                List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+                if (!list.containsAll(Arrays.asList(queryInfo.getOrganId().split(",")))) {
+                    throw new BizException("非法请求");
+                }
+            }
+        }
+        List<ExportStudentAttendanceDto> rows = studentAttendanceService.exportStudentAttendancesQueryPage(queryInfo).getRows();
+        OutputStream outputStream = response.getOutputStream();
+        try {
+            HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"分部编号", "分部名称", "课程组类型", "课程组编号", "课程组名称", "学员姓名",
+                    "学员编号", "课程编号", "课程名称", "上课日期", "上课开始时间","上课结束时间","指导老师名称","指导老师编号","教务老师名称","教务老师编号","学员考勤状态"}, new String[]{
+                    "organId", "organName", "groupType.desc", "groupId", "groupName", "username",
+                    "userId", "courseScheduleId", "courseScheduleName", "classDate", "startClassTime", "endClassTime", "guideTeacherName", "guideTeacherId"
+                    , "educationalTeacherName", "educationalTeacherId", "studentAttendanceStatus.msg"}, rows);
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-Disposition", "attachment;filename=studentAttendance-" + DateUtil.getDate(new Date()) + ".xls");
+            response.flushBuffer();
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+            outputStream.flush();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
     @ApiOperation(value = "乐团管理--修改--缴费设置--缴费记录导出")
     @PostMapping("export/musicGroupPaymentCalenderDetail")
     @PreAuthorize("@pcs.hasPermissions('export/musicGroupPaymentCalenderDetail')")
-    public void exportTeacherAttendances(HttpServletResponse response, MusicCalenderDetailQueryInfo queryInfo) throws IOException {
+    public void exportMusicGroupPaymentCalenderDetail(HttpServletResponse response, MusicCalenderDetailQueryInfo queryInfo) throws IOException {
         queryInfo.setPage(1);
         queryInfo.setRows(49999);
         List<MusicGroupPaymentCalenderDetail> rows = musicGroupPaymentCalenderDetailService.queryPage(queryInfo).getRows();