Selaa lähdekoodia

Merge branch 'first_leave' of http://git.dayaedu.com/yonge/mec

zouxuan 4 vuotta sitten
vanhempi
commit
491e67b0a8

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/IndexBaseMonthDataDao.java

@@ -1,6 +1,8 @@
 package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.biz.dal.dto.OrganVipGroupCategoryCourseNumDto;
+import com.ym.mec.biz.dal.dto.StudentErrorLeaveDto;
+import com.ym.mec.biz.dal.dto.StudentLeaveCourseDto;
 import com.ym.mec.biz.dal.entity.IndexBaseMonthData;
 import com.ym.mec.biz.dal.entity.IndexErrInfoDto;
 import com.ym.mec.biz.dal.enums.*;
@@ -285,4 +287,14 @@ public interface IndexBaseMonthDataDao extends BaseDAO<Long, IndexBaseMonthData>
     List<IndexBaseMonthData> getTotalAmountDataWithTimely(@Param("startDate") String startDate,
                                                             @Param("endDate") String endDate,
                                                             @Param("organIds") List<Integer> organIds);
+
+    int countStudentErrorLeave(@Param("organIdList") Set<Integer> organIdList, @Param("format") String format, @Param("classGroupIds") List<Long> classGroupIds);
+
+    int countStudentErrorLeave1(Map<String, Object> params);
+
+    List<StudentErrorLeaveDto> queryStudentErrorLeave(Map<String, Object> params);
+
+    int countStudentLeaveCourseList(Map<String, Object> params);
+
+    List<StudentLeaveCourseDto> queryStudentLeaveCourseList(Map<String, Object> params);
 }

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

@@ -343,4 +343,10 @@ public interface StudentAttendanceDao extends BaseDAO<Long, StudentAttendance> {
      * @return
      */
     List<Map<Integer, Long>> queryLeaveNum(@Param("userIds") Set<Integer> userIds, @Param("month") String month);
+
+    /**
+     * 修改学员请假回访
+     * @param userId
+     */
+    void updateLeaveVisitFlag(Integer userId);
 }

+ 74 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentErrorLeaveDto.java

@@ -0,0 +1,74 @@
+package com.ym.mec.biz.dal.dto;
+
+public class StudentErrorLeaveDto {
+
+    private String phone;
+
+    private Integer organId;
+
+    private String organName;
+
+    private String studentName;
+
+    private Integer userId;
+
+    private Integer totalNum;
+
+    private Integer currentNum;
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Integer getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(Integer organId) {
+        this.organId = organId;
+    }
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public String getStudentName() {
+        return studentName;
+    }
+
+    public void setStudentName(String studentName) {
+        this.studentName = studentName;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getTotalNum() {
+        return totalNum;
+    }
+
+    public void setTotalNum(Integer totalNum) {
+        this.totalNum = totalNum;
+    }
+
+    public Integer getCurrentNum() {
+        return currentNum;
+    }
+
+    public void setCurrentNum(Integer currentNum) {
+        this.currentNum = currentNum;
+    }
+}

+ 117 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/StudentLeaveCourseDto.java

@@ -0,0 +1,117 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.enums.GroupType;
+
+public class StudentLeaveCourseDto {
+
+    private Long courseScheduleId;
+
+    private String courseName;
+
+    private String groupId;
+
+    private GroupType groupType;
+
+    private CourseSchedule.CourseScheduleType courseScheduleType;
+
+    private Integer actualTeacherId;
+
+    private String teacherName;
+
+    private String classDate;
+
+    private String startClassTime;
+
+    private String endClassTime;
+
+    private Integer leaveVisitFlag;
+
+    public String getGroupId() {
+        return groupId;
+    }
+
+    public void setGroupId(String groupId) {
+        this.groupId = groupId;
+    }
+
+    public Long getCourseScheduleId() {
+        return courseScheduleId;
+    }
+
+    public void setCourseScheduleId(Long courseScheduleId) {
+        this.courseScheduleId = courseScheduleId;
+    }
+
+    public String getCourseName() {
+        return courseName;
+    }
+
+    public void setCourseName(String courseName) {
+        this.courseName = courseName;
+    }
+
+    public GroupType getGroupType() {
+        return groupType;
+    }
+
+    public void setGroupType(GroupType groupType) {
+        this.groupType = groupType;
+    }
+
+    public CourseSchedule.CourseScheduleType getCourseScheduleType() {
+        return courseScheduleType;
+    }
+
+    public void setCourseScheduleType(CourseSchedule.CourseScheduleType courseScheduleType) {
+        this.courseScheduleType = courseScheduleType;
+    }
+
+    public Integer getActualTeacherId() {
+        return actualTeacherId;
+    }
+
+    public void setActualTeacherId(Integer actualTeacherId) {
+        this.actualTeacherId = actualTeacherId;
+    }
+
+    public String getTeacherName() {
+        return teacherName;
+    }
+
+    public void setTeacherName(String teacherName) {
+        this.teacherName = teacherName;
+    }
+
+    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 Integer getLeaveVisitFlag() {
+        return leaveVisitFlag;
+    }
+
+    public void setLeaveVisitFlag(Integer leaveVisitFlag) {
+        this.leaveVisitFlag = leaveVisitFlag;
+    }
+}

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

@@ -15,6 +15,7 @@ public enum IndexErrorType implements BaseEnum<String, IndexErrorType> {
     STUDENT_INFO("STUDENT_INFO", "学员处理"),
     STUDENT_ARREARAGE("STUDENT_ARREARAGE", "欠费学员数"),
     STUDENT_NOT_PAYMENT("STUDENT_NOT_PAYMENT", "未缴费学员数"),
+    STUDENT_ERROR_LEAVE("STUDENT_ERROR_LEAVE", "学员异常请假"),
     STUDENT_APPLY_FOR_QUIT_MUSIC_GROUP("STUDENT_APPLY_FOR_QUIT_MUSIC_GROUP", "申请退团学员数"),
     WAIT_CREATE_PAYMENT_CALENDER("WAIT_CREATE_PAYMENT_CALENDER", "待创建缴费项目"),
     ATTENDANCE_ERR_STUDENT_NUM("COURSE_TRUANT_STUDENT_NUM", "学员考勤异常"),

+ 48 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/StudentErrorLeaveQueryInfo.java

@@ -0,0 +1,48 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+
+public class StudentErrorLeaveQueryInfo extends QueryInfo {
+    private Integer userId;
+
+    private String organId;
+
+    @ApiModelProperty(value = "是否回访")
+    private Integer leaveVisitFlag;
+
+    @ApiModelProperty(value = "学员编号")
+    private String courseType;
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(String organId) {
+        this.organId = organId;
+    }
+
+    public Integer getLeaveVisitFlag() {
+        return leaveVisitFlag;
+    }
+
+    public void setLeaveVisitFlag(Integer leaveVisitFlag) {
+        this.leaveVisitFlag = leaveVisitFlag;
+    }
+
+    public String getCourseType() {
+        return courseType;
+    }
+
+    public void setCourseType(String courseType) {
+        this.courseType = courseType;
+    }
+}

+ 4 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/StudentManageService.java

@@ -206,4 +206,8 @@ public interface StudentManageService {
      * @return
      */
     List<StudentSubTotalCourseTimesDto> queryStudentSubTotalCourseTimes(String musicGroupId);
+
+    PageInfo<StudentErrorLeaveDto> queryStudentErrorLeaveList(StudentErrorLeaveQueryInfo queryInfo);
+
+    PageInfo<StudentLeaveCourseDto> queryStudentLeaveCourseList(StudentErrorLeaveQueryInfo queryInfo);
 }

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

@@ -8,7 +8,6 @@ import com.ym.mec.biz.dal.entity.StudentVisit;
 import com.ym.mec.biz.dal.page.StudentVisitQueryInfo;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.BaseService;
-
 import java.util.List;
 
 public interface StudentVisitService extends BaseService<Integer, StudentVisit> {

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

@@ -485,6 +485,9 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 			two.setErrorType(IndexErrorType.STUDENT_INFO);
 			two.setDesc(IndexErrorType.STUDENT_INFO.getMsg());
 			List<IndexErrInfoDto> twoChild = new ArrayList<>();
+			//学员请假异常提醒(获取前两个月的)
+			String format1 = DateUtil.format(DateUtil.addMonths(new Date(), -1), DateUtil.ISO_YEAR_MONTH_FORMAT);
+			twoChild.add(new IndexErrInfoDto(IndexErrorType.STUDENT_ERROR_LEAVE, IndexErrorType.STUDENT_ERROR_LEAVE.getMsg(), indexBaseMonthDataDao.countStudentErrorLeave(organIds,format1,classGroupIds), null));
 
 			//未缴费学员数
 			twoChild.add(new IndexErrInfoDto(IndexErrorType.STUDENT_ARREARAGE, IndexErrorType.STUDENT_ARREARAGE.getMsg(), indexBaseMonthDataDao.countNoPaymentStudentNum(organIds,educationUserId,0), Arrays.asList(educationUserId)));
@@ -824,6 +827,7 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 		List<Integer> userRole = employeeDao.queryUserRole(sysUser.getId());
 		Integer educationUserId = null;
 		if (!sysUser.getIsSuperAdmin() && userRole.size() == 1 && userRole.contains(SysUserRole.EDUCATIONAL_TEACHER)) {
+			//获取教务老师关联的班级列表
 			educationUserId = sysUser.getId();
 		}
 		//获取关联的乐团列表
@@ -848,7 +852,6 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 		//未缴费学员数
 		result.add(new IndexErrInfoDto(IndexErrorType.STUDENT_NOT_PAYMENT, IndexErrorType.STUDENT_NOT_PAYMENT.getMsg(), indexBaseMonthDataDao.countNoPaymentStudentNum(organIdSet,educationUserId, 1), Arrays.asList(educationUserId)));
 
-
 		String monthStr = DateUtil.format(date, DateUtil.ISO_YEAR_MONTH_FORMAT);
 		//全职未离职老师
 		//预计课酬较低
@@ -899,6 +902,14 @@ public class IndexBaseMonthDataServiceImpl extends BaseServiceImpl<Long, IndexBa
 		resultMap.put("musicPatrol",flag1);
 		boolean flag2 = false;
 		if(!flag2){
+			//学员请假异常提醒(获取前两个月的)
+			String format1 = DateUtil.format(DateUtil.addMonths(date, -1), DateUtil.ISO_YEAR_MONTH_FORMAT);
+			int studentErrorLeaveNum = indexBaseMonthDataDao.countStudentErrorLeave(organIds,format1,classGroupIds);
+			if(studentErrorLeaveNum > 0){
+				flag2 = true;
+			}
+		}
+		if(!flag2){
 			List<Long> quitGroupNum = indexBaseMonthDataDao.queryApplyForQuitGroupNum(organIds,educationUserId);
 			if(quitGroupNum.size() > 0){
 				flag2 = true;

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

@@ -7,13 +7,13 @@ import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import com.ym.mec.auth.api.entity.SysUserRole;
 import com.ym.mec.biz.dal.dao.*;
 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.*;
-import com.ym.mec.biz.service.CloudTeacherOrderService;
-import com.ym.mec.biz.service.SysConfigService;
+import com.ym.mec.biz.service.*;
 
 import com.ym.mec.common.page.QueryInfo;
 import com.ym.mec.im.WebFeignService;
@@ -47,8 +47,6 @@ import com.ym.mec.biz.dal.entity.StudentRegistration;
 import com.ym.mec.biz.dal.entity.SubjectChange;
 import com.ym.mec.biz.dal.entity.SysUserCashAccount;
 import com.ym.mec.biz.dal.entity.Teacher;
-import com.ym.mec.biz.service.StudentManageService;
-import com.ym.mec.biz.service.StudentService;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.ImResult;
 import com.ym.mec.common.entity.ImUserModel;
@@ -113,11 +111,13 @@ public class StudentManageServiceImpl implements StudentManageService {
     @Autowired
     private StudentCourseHomeworkDao studentCourseHomeworkDao;
     @Autowired
-    private StudentAttendanceDao studentAttendanceDao;
+    private IndexBaseMonthDataDao indexBaseMonthDataDao;
     @Autowired
     private StudentInstrumentDao studentInstrumentDao;
     @Autowired
     private CloudTeacherOrderService cloudTeacherOrderService;
+    @Autowired
+    private EmployeeDao employeeDao;
 
     @Override
     public PageInfo<StudentManageListDto> findStudentsByOrganId(StudentManageQueryInfo queryInfo) {
@@ -851,4 +851,50 @@ public class StudentManageServiceImpl implements StudentManageService {
     public List<StudentSubTotalCourseTimesDto> queryStudentSubTotalCourseTimes(String musicGroupId) {
         return musicGroupPaymentStudentCourseDetailDao.queryStudentSubTotalCourseTimes(musicGroupId);
     }
+
+    @Override
+    public PageInfo<StudentErrorLeaveDto> queryStudentErrorLeaveList(StudentErrorLeaveQueryInfo queryInfo) {
+        //学员请假异常提醒(获取前两个月的)
+        Date date = new Date();
+        PageInfo<StudentErrorLeaveDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+        params.put("offset", pageInfo.getOffset());
+        String totalMonth = DateUtil.format(DateUtil.addMonths(date, -1), DateUtil.ISO_YEAR_MONTH_FORMAT);
+        String currentMonth = DateUtil.format(date, DateUtil.ISO_YEAR_MONTH_FORMAT);
+        params.put("totalMonth", totalMonth);
+        params.put("currentMonth", currentMonth);
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        //当前用户是否是分部经理
+        List<Integer> userRole = employeeDao.queryUserRole(sysUser.getId());
+        if (!sysUser.getIsSuperAdmin() && userRole.size() == 1 && userRole.contains(SysUserRole.EDUCATIONAL_TEACHER)) {
+            //获取教务老师关联的班级列表
+            List<Long> classGroupIds = classGroupDao.queryGroupClassGroupIds(sysUser.getId());
+            params.put("classGroupIds", classGroupIds);
+        }
+        int count = indexBaseMonthDataDao.countStudentErrorLeave1(params);
+        List<StudentErrorLeaveDto> dataList = new ArrayList<>();
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            dataList = indexBaseMonthDataDao.queryStudentErrorLeave(params);
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
+
+    @Override
+    public PageInfo<StudentLeaveCourseDto> queryStudentLeaveCourseList(StudentErrorLeaveQueryInfo queryInfo) {
+        PageInfo<StudentLeaveCourseDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+        Map<String, Object> params = new HashMap<>();
+        MapUtil.populateMap(params, queryInfo);
+        params.put("offset", pageInfo.getOffset());
+        int count = indexBaseMonthDataDao.countStudentLeaveCourseList(params);
+        List<StudentLeaveCourseDto> dataList = new ArrayList<>();
+        if (count > 0) {
+            pageInfo.setTotal(count);
+            dataList = indexBaseMonthDataDao.queryStudentLeaveCourseList(params);
+        }
+        pageInfo.setRows(dataList);
+        return pageInfo;
+    }
 }

+ 28 - 23
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentVisitServiceImpl.java

@@ -55,30 +55,35 @@ public class StudentVisitServiceImpl extends BaseServiceImpl<Integer, StudentVis
         SysUser user = teacherDao.getUser(studentVisit.getStudentId());
         studentVisit.setOrganId(user.getOrganId());
         studentVisit.setCreateTime(now);
-        if(Objects.nonNull(studentVisit.getObjectId()) && "考勤申诉".equals(studentVisit.getPurpose())){
-            CourseScheduleStudentPayment courseScheduleStudentPayment = courseScheduleStudentPaymentDao.get(studentVisit.getObjectId());
-            if(Objects.isNull(courseScheduleStudentPayment)){
-                throw new BizException("学员课程信息不存在");
-            }
-            StudentAttendance studentAttendance = studentAttendanceDao.findByStatusAndCourseScheduleId(courseScheduleStudentPayment.getUserId(), courseScheduleStudentPayment.getCourseScheduleId().intValue());
-            if (studentAttendance == null) {
-                studentAttendance = new StudentAttendance();
-                studentAttendance.setClassGroupId(courseScheduleStudentPayment.getClassGroupId());
-                studentAttendance.setCourseScheduleId(courseScheduleStudentPayment.getCourseScheduleId());
-                studentAttendance.setGroupType(courseScheduleStudentPayment.getGroupType());
-                studentAttendance.setMusicGroupId(courseScheduleStudentPayment.getMusicGroupId());
-                studentAttendance.setUserId(courseScheduleStudentPayment.getUserId());
-                studentAttendance.setCreateTime(now);
-                studentAttendance.setUpdateTime(now);
-                studentAttendance.setVisitFlag(YesOrNoEnum.YES);
-                studentAttendanceDao.insert(studentAttendance);
-            } else {
-                studentAttendance.setVisitFlag(YesOrNoEnum.YES);
-                studentAttendance.setUpdateTime(now);
-                studentAttendanceDao.update(studentAttendance);
+        if(Objects.nonNull(studentVisit.getObjectId())){
+            if("考勤申诉".equals(studentVisit.getPurpose())){
+                CourseScheduleStudentPayment courseScheduleStudentPayment = courseScheduleStudentPaymentDao.get(studentVisit.getObjectId());
+                if(Objects.isNull(courseScheduleStudentPayment)){
+                    throw new BizException("学员课程信息不存在");
+                }
+                StudentAttendance studentAttendance = studentAttendanceDao.findByStatusAndCourseScheduleId(courseScheduleStudentPayment.getUserId(), courseScheduleStudentPayment.getCourseScheduleId().intValue());
+                if (studentAttendance == null) {
+                    studentAttendance = new StudentAttendance();
+                    studentAttendance.setClassGroupId(courseScheduleStudentPayment.getClassGroupId());
+                    studentAttendance.setCourseScheduleId(courseScheduleStudentPayment.getCourseScheduleId());
+                    studentAttendance.setGroupType(courseScheduleStudentPayment.getGroupType());
+                    studentAttendance.setMusicGroupId(courseScheduleStudentPayment.getMusicGroupId());
+                    studentAttendance.setUserId(courseScheduleStudentPayment.getUserId());
+                    studentAttendance.setCreateTime(now);
+                    studentAttendance.setUpdateTime(now);
+                    studentAttendance.setVisitFlag(YesOrNoEnum.YES);
+                    studentAttendanceDao.insert(studentAttendance);
+                } else {
+                    studentAttendance.setVisitFlag(YesOrNoEnum.YES);
+                    studentAttendance.setUpdateTime(now);
+                    studentAttendanceDao.update(studentAttendance);
+                }
+                CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleStudentPayment.getCourseScheduleId());
+                studentVisit.setOrganId(courseSchedule.getOrganId());
+            }else if("异常请假回访".equals(studentVisit.getPurpose())){
+                //处理所有的请假考勤为已回访
+                studentAttendanceDao.updateLeaveVisitFlag(user.getId());
             }
-            CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleStudentPayment.getCourseScheduleId());
-            studentVisit.setOrganId(courseSchedule.getOrganId());
         }
         studentVisitDao.insert(studentVisit);
         return studentVisit;

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

@@ -2584,7 +2584,7 @@
         <if test="searchType == 'ERR_ATTENDANCE'">
             AND ta.teacher_id_ = cs.actual_teacher_id_
             AND cs.status_ = 'OVER'
-            AND (((ta.sign_in_status_ = 0 OR ta.sign_out_status_ = 0) AND ta.dispose_content_ IS NULL) OR (sa.id_ IS NULL OR (sa.status_ != 'NORMAL' AND sa.visit_flag_ = 0)))
+            AND (((ta.sign_in_status_ = 0 OR ta.sign_out_status_ = 0) AND ta.dispose_content_ IS NULL) OR (sa.id_ IS NULL OR (sa.status_ = 'TRUANT' AND sa.visit_flag_ = 0)))
             AND EXISTS (SELECT id_ FROM course_schedule_teacher_salary WHERE cs.id_=course_schedule_id_ AND settlement_time_ IS NULL)
             AND ta.sign_in_status_ IS NOT NULL AND ta.sign_out_status_ IS NOT NULL
             AND (cs.new_course_id_ IS NULL OR cs.new_course_id_=cs.id_) AND cssp.id_ IS NOT NULL

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

@@ -947,7 +947,7 @@
 		LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cssp.course_schedule_id_ AND cssp.user_id_ = sa.user_id_
 		WHERE ta.teacher_id_ = cs.actual_teacher_id_
 		AND cs.status_ = 'OVER' AND cs.del_flag_ = 0 AND cs.class_date_ >= '2021-02-01'
-		AND (((ta.sign_in_status_ = 0 OR ta.sign_out_status_ = 0) AND ta.dispose_content_ IS NULL) OR (sa.id_ IS NULL OR (sa.status_ != 'NORMAL' AND sa.visit_flag_ = 0)))
+		AND (((ta.sign_in_status_ = 0 OR ta.sign_out_status_ = 0) AND ta.dispose_content_ IS NULL) OR (sa.id_ IS NULL OR (sa.status_ = 'TRUANT' AND sa.visit_flag_ = 0)))
 		AND ta.sign_in_status_ IS NOT NULL AND ta.sign_out_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)
@@ -976,7 +976,7 @@
 		LEFT JOIN student_attendance sa ON sa.course_schedule_id_ = cssp.course_schedule_id_ AND cssp.user_id_ = sa.user_id_
 		WHERE ta.teacher_id_ = cs.actual_teacher_id_
 		AND cs.status_ = 'OVER' AND cs.del_flag_ = 0 AND cs.class_date_ >= '2021-02-01'
-		AND (((ta.sign_in_status_ = 0 OR ta.sign_out_status_ = 0) AND ta.dispose_content_ IS NULL) OR (sa.id_ IS NULL OR (sa.status_ != 'NORMAL' AND sa.visit_flag_ = 0)))
+		AND (((ta.sign_in_status_ = 0 OR ta.sign_out_status_ = 0) AND ta.dispose_content_ IS NULL) OR (sa.id_ IS NULL OR (sa.status_ = 'TRUANT' AND sa.visit_flag_ = 0)))
 		AND ta.sign_in_status_ IS NOT NULL AND ta.sign_out_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)
@@ -1387,4 +1387,124 @@
 		ORDER BY sees.monday_,sees.sunday_,sees.teacher_id_
 		) e GROUP BY e.organ_id_
 	</select>
+	<select id="countStudentErrorLeave" resultType="java.lang.Integer">
+		SELECT COUNT(DISTINCT c.user_id_) FROM (
+		SELECT sa.user_id_ FROM student_attendance sa
+		LEFT JOIN course_schedule cs ON cs.id_ = sa.course_schedule_id_
+		WHERE DATE_FORMAT(cs.class_date_,'%Y-%m') >= #{format} AND sa.status_ = 'LEAVE'
+		<if test="organIdList != null and organIdList.size > 0">
+			AND cs.organ_id_ IN
+			<foreach collection="organIdList" open="(" close=")" item="item" separator=",">
+				#{item}
+			</foreach>
+		</if>
+		<if test="classGroupIds != null and classGroupIds.size() > 0">
+			AND cs.class_group_id_ IN
+			<foreach collection="classGroupIds" item="classGroupId" open="(" close=")" separator=",">
+				#{classGroupId}
+			</foreach>
+		</if>
+		GROUP BY sa.user_id_,DATE_FORMAT(cs.class_date_,'%Y-%m')
+		HAVING COUNT(sa.id_) > 1 AND COUNT(sa.id_) > SUM(sa.leave_visit_flag_)) c
+	</select>
+	<select id="countStudentErrorLeave1" resultType="java.lang.Integer">
+		SELECT COUNT(DISTINCT c.user_id_) FROM (
+		SELECT sa.user_id_ FROM student_attendance sa
+		LEFT JOIN course_schedule cs ON cs.id_ = sa.course_schedule_id_
+		LEFT JOIN sys_user su ON su.id_ = sa.user_id_
+		WHERE DATE_FORMAT(cs.class_date_,'%Y-%m') >= #{totalMonth} AND sa.status_ = 'LEAVE'
+		<if test="organId != null">
+			AND FIND_IN_SET(cs.organ_id_,#{organId})
+		</if>
+		<if test="classGroupIds != null and classGroupIds.size() > 0">
+			AND cs.class_group_id_ IN
+			<foreach collection="classGroupIds" item="classGroupId" open="(" close=")" separator=",">
+				#{classGroupId}
+			</foreach>
+		</if>
+		<if test="search != null and search != ''">
+			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_) > 1 AND COUNT(sa.id_) > SUM(sa.leave_visit_flag_)) c
+	</select>
+	<resultMap id="StudentErrorLeaveDto" type="com.ym.mec.biz.dal.dto.StudentErrorLeaveDto">
+		<result property="currentNum" column="current_num_"/>
+		<result property="totalNum" column="total_num_"/>
+		<result property="userId" column="user_id_"/>
+		<result property="studentName" column="username_"/>
+		<result property="phone" column="phone_"/>
+		<result property="organId" column="organ_id_"/>
+		<result property="organName" column="organ_name_"/>
+	</resultMap>
+	<select id="queryStudentErrorLeave" resultMap="StudentErrorLeaveDto">
+		SELECT organ_id_,organ_name_,user_id_,username_,phone_,total_num_,MIN(current_num_) current_num_,class_date_
+		FROM (SELECT cs.organ_id_,o.name_ organ_name_,sa.user_id_,su.username_,su.phone_,COUNT(sa.id_) total_num_,
+		COUNT(CASE WHEN DATE_FORMAT(cs.class_date_,'%Y-%m') = #{currentMonth} THEN 1 ELSE NULL END) current_num_,cs.class_date_
+		FROM student_attendance sa
+		LEFT JOIN course_schedule cs ON cs.id_ = sa.course_schedule_id_
+		LEFT JOIN organization o ON o.id_ = cs.organ_id_
+		LEFT JOIN sys_user su ON su.id_ = sa.user_id_
+		WHERE DATE_FORMAT(cs.class_date_,'%Y-%m') >= #{totalMonth} AND sa.status_ = 'LEAVE'
+		<if test="organId != null">
+			AND FIND_IN_SET(cs.organ_id_,#{organId})
+		</if>
+		<if test="classGroupIds != null and classGroupIds.size() > 0">
+			AND cs.class_group_id_ IN
+			<foreach collection="classGroupIds" item="classGroupId" open="(" close=")" separator=",">
+				#{classGroupId}
+			</foreach>
+		</if>
+		<if test="search != null and search != ''">
+			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_) > 1 AND COUNT(sa.id_) > SUM(sa.leave_visit_flag_))c
+		GROUP BY c.user_id_
+		<include refid="global.limit"/>
+	</select>
+	<select id="countStudentLeaveCourseList" resultType="java.lang.Integer">
+		SELECT COUNT(sa.id_)
+		FROM student_attendance sa
+		LEFT JOIN course_schedule cs ON cs.id_ = sa.course_schedule_id_
+		LEFT JOIN sys_user su ON su.id_ = cs.actual_teacher_id_
+		<include refid="queryStudentLeaveCourseListSql"/>
+	</select>
+	<sql id="queryStudentLeaveCourseListSql">
+		<where>
+			sa.user_id_ = #{userId} AND sa.status_ = 'LEAVE'
+			<if test="search != null and search != ''">
+				AND (cs.id_ = #{search} OR cs.actual_teacher_id_ = #{search} OR su.real_name_ LIKE CONCAT('%',#{search},'%'))
+			</if>
+			<if test="leaveVisitFlag != null">
+				AND sa.leave_visit_flag_ = #{leaveVisitFlag}
+			</if>
+			<if test="courseType != null">
+				AND cs.type_ = #{courseType}
+			</if>
+		</where>
+	</sql>
+	<resultMap id="StudentLeaveCourseDto" type="com.ym.mec.biz.dal.dto.StudentLeaveCourseDto">
+		<result property="leaveVisitFlag" column="leave_visit_flag_"/>
+		<result property="classDate" column="class_date_"/>
+		<result property="startClassTime" column="start_class_time_"/>
+		<result property="endClassTime" column="end_class_time_"/>
+		<result property="teacherName" column="teacher_name_"/>
+		<result property="actualTeacherId" column="actual_teacher_id_"/>
+		<result property="courseScheduleId" column="course_schedule_id_"/>
+		<result property="groupType" column="group_type_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+		<result property="courseScheduleType" column="type_" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+		<result property="courseName" column="name_"/>
+		<result property="groupId" column="music_group_id_"/>
+	</resultMap>
+	<select id="queryStudentLeaveCourseList" resultMap="StudentLeaveCourseDto">
+		SELECT sa.leave_visit_flag_,cs.class_date_,cs.start_class_time_,
+		       cs.end_class_time_,su.real_name_ teacher_name_,cs.actual_teacher_id_,
+		       sa.course_schedule_id_,cs.group_type_,cs.type_,cs.name_,cs.music_group_id_
+		FROM student_attendance sa
+		 LEFT JOIN course_schedule cs ON cs.id_ = sa.course_schedule_id_
+		 LEFT JOIN sys_user su ON su.id_ = cs.actual_teacher_id_
+		<include refid="queryStudentLeaveCourseListSql"/>
+		ORDER BY cs.class_date_ DESC,cs.start_class_time_ DESC
+		<include refid="global.limit"/>
+	</select>
 </mapper>

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

@@ -137,6 +137,9 @@
         SET sign_out_time_= NULL
     	WHERE course_schedule_id_=#{courseId} AND user_id_ = #{userId}
     </update>
+    <update id="updateLeaveVisitFlag">
+        UPDATE student_attendance SET leave_visit_flag_ = 1 WHERE user_id_ = #{userId} AND status_ = 'LEAVE'
+    </update>
 
     <!-- 根据主键删除一条记录 -->
     <delete id="delete">

+ 31 - 8
mec-web/src/main/java/com/ym/mec/web/controller/StudentManageController.java

@@ -1,5 +1,6 @@
 package com.ym.mec.web.controller;
 
+import com.ym.mec.biz.dal.page.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -27,14 +28,6 @@ import com.ym.mec.biz.dal.dao.EmployeeDao;
 import com.ym.mec.biz.dal.dto.UpdateStudentFeeDto;
 import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.biz.dal.entity.Student;
-import com.ym.mec.biz.dal.page.MusicGroupStudentQueryInfo;
-import com.ym.mec.biz.dal.page.StudentManageAttendanceQueryInfo;
-import com.ym.mec.biz.dal.page.StudentManageCourseQueryInfo;
-import com.ym.mec.biz.dal.page.StudentManageQueryInfo;
-import com.ym.mec.biz.dal.page.StudentManageVipClassQueryInfo;
-import com.ym.mec.biz.dal.page.StudentOperatingQueryInfo;
-import com.ym.mec.biz.dal.page.StudentSignQueryInfo;
-import com.ym.mec.biz.dal.page.TeacherPaymentRecordInfo;
 import com.ym.mec.biz.service.MusicGroupStudentFeeService;
 import com.ym.mec.biz.service.StudentCourseHomeworkService;
 import com.ym.mec.biz.service.StudentManageService;
@@ -66,6 +59,36 @@ public class StudentManageController extends BaseController {
     private StudentService studentService;
 
     private final Logger LOGGER = LoggerFactory.getLogger(this.getClass());
+
+    @ApiOperation(value = "获取学生请假异常列表")
+    @GetMapping("/queryStudentErrorLeaveList")
+    @PreAuthorize("@pcs.hasPermissions('studentManage/queryStudentErrorLeaveList')")
+    public Object queryStudentErrorLeaveList(StudentErrorLeaveQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("用户信息获取失败");
+        }
+        Employee employee = employeeDao.get(sysUser.getId());
+        if (StringUtils.isEmpty(queryInfo.getOrganId())) {
+            queryInfo.setOrganId(employee.getOrganIdList());
+        }else if(StringUtils.isEmpty(employee.getOrganIdList())){
+            return failed("用户所在分部异常");
+        }else {
+            List<String> list = Arrays.asList(employee.getOrganIdList().split(","));
+            if(!list.containsAll(Arrays.asList(queryInfo.getOrganId().split(",")))){
+                return failed("非法请求");
+            }
+        }
+        return succeed(studentManageService.queryStudentErrorLeaveList(queryInfo));
+    }
+
+    @ApiOperation(value = "获取学生请假课程列表")
+    @GetMapping("/queryStudentLeaveCourseList")
+    @PreAuthorize("@pcs.hasPermissions('studentManage/queryStudentLeaveCourseList')")
+    public Object queryStudentLeaveCourseList(StudentErrorLeaveQueryInfo queryInfo){
+        return succeed(studentManageService.queryStudentLeaveCourseList(queryInfo));
+    }
+
     @ApiOperation(value = "获取学生列表")
     @GetMapping("/queryStudentList")
     @PreAuthorize("@pcs.hasPermissions('studentManage/queryStudentList')")