|  | @@ -482,8 +482,80 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
 | 
	
		
			
				|  |  |  				courseScheduleDao.update(courseSchedule);
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  		}else if(signStatusEnum == SignStatusEnum.SIGN_OUT){
 | 
	
		
			
				|  |  | -			studentAttendance.setStatus(statusEnum);
 | 
	
		
			
				|  |  | -			studentAttendance.setSignOutTime(date);
 | 
	
		
			
				|  |  | +			String classDate = DateUtil.format(courseSchedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
 | 
	
		
			
				|  |  | +			String startClassTime = DateUtil.format(courseSchedule.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
 | 
	
		
			
				|  |  | +			String endClassTime = DateUtil.format(courseSchedule.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
 | 
	
		
			
				|  |  | +			//上课时间
 | 
	
		
			
				|  |  | +			Date classStartDateTime = DateUtil.stringToDate(classDate + " " + startClassTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
 | 
	
		
			
				|  |  | +			Date classEndDateTime = DateUtil.stringToDate(classDate + " " + endClassTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
 | 
	
		
			
				|  |  | +			if(DateUtil.minutesBetween(classEndDateTime,date) >= 0){
 | 
	
		
			
				|  |  | +				String continueCourseTime = sysConfigDao.findConfigValue(SysConfigService.ONLINE_CONTINUE_COURSE_TIME);
 | 
	
		
			
				|  |  | +				if(StringUtils.isEmpty(continueCourseTime)){
 | 
	
		
			
				|  |  | +					continueCourseTime = "10";
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				List<CourseSchedule> courseSchedules = new ArrayList<>();
 | 
	
		
			
				|  |  | +				CourseSchedule cs = courseSchedule;
 | 
	
		
			
				|  |  | +				while (true){
 | 
	
		
			
				|  |  | +					//获取当前课程的所有连堂课列表
 | 
	
		
			
				|  |  | +					String courseClassDate = DateUtil.format(cs.getClassDate(), DateUtil.DEFAULT_PATTERN);
 | 
	
		
			
				|  |  | +					String courseEndDateTime = DateUtil.format(cs.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
 | 
	
		
			
				|  |  | +					cs = courseScheduleDao.queryContinueCourse(cs,continueCourseTime,courseClassDate + " " + courseEndDateTime);
 | 
	
		
			
				|  |  | +					//存在连堂课
 | 
	
		
			
				|  |  | +					if(cs != null){
 | 
	
		
			
				|  |  | +						courseSchedules.add(cs);
 | 
	
		
			
				|  |  | +					}else {
 | 
	
		
			
				|  |  | +						break;
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				if(courseSchedules.size() > 0){
 | 
	
		
			
				|  |  | +					//获取总上课时长
 | 
	
		
			
				|  |  | +					int totalMinutes = DateUtil.minutesBetween(classStartDateTime, date);
 | 
	
		
			
				|  |  | +					//减去第一节课时长
 | 
	
		
			
				|  |  | +					int firstMinutes = courseScheduleDao.getSingleClassMinutes(courseScheduleId.longValue());
 | 
	
		
			
				|  |  | +					totalMinutes -= firstMinutes;
 | 
	
		
			
				|  |  | +					if(totalMinutes > 0){
 | 
	
		
			
				|  |  | +						String courseClassDate;
 | 
	
		
			
				|  |  | +						String courseStartDateTime;
 | 
	
		
			
				|  |  | +						String courseEndDateTime;
 | 
	
		
			
				|  |  | +						for (CourseSchedule e:courseSchedules) {
 | 
	
		
			
				|  |  | +							//获取当前课程的单节课时长
 | 
	
		
			
				|  |  | +							int signClassMinutes = courseScheduleDao.getSingleClassMinutes(e.getId());
 | 
	
		
			
				|  |  | +							totalMinutes -= signClassMinutes;
 | 
	
		
			
				|  |  | +							if(totalMinutes >= 0){
 | 
	
		
			
				|  |  | +								//补充签到签退时间
 | 
	
		
			
				|  |  | +								courseClassDate = DateUtil.format(e.getClassDate(), DateUtil.DEFAULT_PATTERN);
 | 
	
		
			
				|  |  | +								courseStartDateTime = DateUtil.format(e.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
 | 
	
		
			
				|  |  | +								courseEndDateTime = DateUtil.format(e.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
 | 
	
		
			
				|  |  | +								Date startDateTime = DateUtil.stringToDate(courseClassDate + " " + courseStartDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
 | 
	
		
			
				|  |  | +								Date endDateTime = DateUtil.stringToDate(courseClassDate + " " + courseEndDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
 | 
	
		
			
				|  |  | +								StudentAttendance byStatusAndCourseScheduleId = studentAttendanceDao.findByStatusAndCourseScheduleId(userId, e.getId().intValue());
 | 
	
		
			
				|  |  | +								if(byStatusAndCourseScheduleId != null){
 | 
	
		
			
				|  |  | +									byStatusAndCourseScheduleId.setSignOutTime(date);
 | 
	
		
			
				|  |  | +									byStatusAndCourseScheduleId.setStatus(statusEnum);
 | 
	
		
			
				|  |  | +									byStatusAndCourseScheduleId.setUpdateTime(date);
 | 
	
		
			
				|  |  | +									studentAttendanceDao.update(byStatusAndCourseScheduleId);
 | 
	
		
			
				|  |  | +								}else {
 | 
	
		
			
				|  |  | +									byStatusAndCourseScheduleId.setSignOutTime(endDateTime);
 | 
	
		
			
				|  |  | +									byStatusAndCourseScheduleId.setStatus(statusEnum);
 | 
	
		
			
				|  |  | +									byStatusAndCourseScheduleId.setSignInTime(startDateTime);
 | 
	
		
			
				|  |  | +									byStatusAndCourseScheduleId.setUpdateTime(date);
 | 
	
		
			
				|  |  | +									byStatusAndCourseScheduleId.setUserId(userId);
 | 
	
		
			
				|  |  | +									byStatusAndCourseScheduleId.setTeacherId(courseSchedule.getActualTeacherId());
 | 
	
		
			
				|  |  | +									byStatusAndCourseScheduleId.setClassGroupId(classGroup.getId());
 | 
	
		
			
				|  |  | +									byStatusAndCourseScheduleId.setCourseScheduleId(courseScheduleId.longValue());
 | 
	
		
			
				|  |  | +									byStatusAndCourseScheduleId.setCurrentClassTimes(classGroup.getCurrentClassTimes() + 1);
 | 
	
		
			
				|  |  | +									studentAttendanceDao.insert(byStatusAndCourseScheduleId);
 | 
	
		
			
				|  |  | +								}
 | 
	
		
			
				|  |  | +							}else {
 | 
	
		
			
				|  |  | +								break;
 | 
	
		
			
				|  |  | +							}
 | 
	
		
			
				|  |  | +						}
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			}else {
 | 
	
		
			
				|  |  | +				studentAttendance.setStatus(statusEnum);
 | 
	
		
			
				|  |  | +				studentAttendance.setSignOutTime(date);
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  		studentAttendanceDao.update(studentAttendance);
 | 
	
		
			
				|  |  |  	}
 | 
	
	
		
			
				|  | @@ -507,4 +579,78 @@ public class StudentAttendanceServiceImpl extends BaseServiceImpl<Long, StudentA
 | 
	
		
			
				|  |  |  		pageInfo.setRows(dataList);
 | 
	
		
			
				|  |  |  		return pageInfo;
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	@Override
 | 
	
		
			
				|  |  | +	@Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +	public void repairStudentAttendance(Integer month) {
 | 
	
		
			
				|  |  | +		//获取所有有老师考勤的课程记录,正常签退,当月线上课,有学员签到记录
 | 
	
		
			
				|  |  | +		List<CourseSchedule> courseScheduleList = courseScheduleDao.queryScheduleByAttendance(month);
 | 
	
		
			
				|  |  | +		//是否是连堂课
 | 
	
		
			
				|  |  | +		String continueCourseTime = sysConfigDao.findConfigValue(SysConfigService.ONLINE_CONTINUE_COURSE_TIME);
 | 
	
		
			
				|  |  | +		if(StringUtils.isEmpty(continueCourseTime)){
 | 
	
		
			
				|  |  | +			continueCourseTime = "10";
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		Date date = new Date();
 | 
	
		
			
				|  |  | +		for (CourseSchedule courseSchedule : courseScheduleList) {
 | 
	
		
			
				|  |  | +			List<CourseSchedule> courseSchedules = new ArrayList<>();
 | 
	
		
			
				|  |  | +			CourseSchedule cs = courseSchedule;
 | 
	
		
			
				|  |  | +			while (true){
 | 
	
		
			
				|  |  | +				//获取当前课程的所有连堂课列表
 | 
	
		
			
				|  |  | +				String courseClassDate = DateUtil.format(cs.getClassDate(), DateUtil.DEFAULT_PATTERN);
 | 
	
		
			
				|  |  | +				String courseEndDateTime = DateUtil.format(cs.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
 | 
	
		
			
				|  |  | +				cs = courseScheduleDao.queryRepairContinueCourse(cs,continueCourseTime,courseClassDate + " " + courseEndDateTime);
 | 
	
		
			
				|  |  | +				//存在连堂课
 | 
	
		
			
				|  |  | +				if(cs != null){
 | 
	
		
			
				|  |  | +					courseSchedules.add(cs);
 | 
	
		
			
				|  |  | +				}else {
 | 
	
		
			
				|  |  | +					break;
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			//只会修复签到的学员考勤
 | 
	
		
			
				|  |  | +			List<BasicUserDto> students = courseScheduleStudentPaymentDao.findStudents(courseSchedule.getId());
 | 
	
		
			
				|  |  | +			if(courseSchedules.size() > 0) {
 | 
	
		
			
				|  |  | +				//获取当前课程老师总上课时长
 | 
	
		
			
				|  |  | +				int totalMinutes = teacherAttendanceDao.getTotalMinutes(courseSchedule.getId(),courseSchedule.getActualTeacherId());
 | 
	
		
			
				|  |  | +				int firstMinutes = courseScheduleDao.getSingleClassMinutes(courseSchedule.getId());
 | 
	
		
			
				|  |  | +				totalMinutes -= firstMinutes;
 | 
	
		
			
				|  |  | +				if (totalMinutes > 0) {
 | 
	
		
			
				|  |  | +					String courseClassDate;
 | 
	
		
			
				|  |  | +					String courseStartDateTime;
 | 
	
		
			
				|  |  | +					String courseEndDateTime;
 | 
	
		
			
				|  |  | +					for (CourseSchedule e:courseSchedules) {
 | 
	
		
			
				|  |  | +						//获取当前课程的单节课时长
 | 
	
		
			
				|  |  | +						int signClassMinutes = courseScheduleDao.getSingleClassMinutes(e.getId());
 | 
	
		
			
				|  |  | +						totalMinutes -= signClassMinutes;
 | 
	
		
			
				|  |  | +						if (totalMinutes >= 0) {
 | 
	
		
			
				|  |  | +							//补充签到签退时间
 | 
	
		
			
				|  |  | +							courseClassDate = DateUtil.format(e.getClassDate(), DateUtil.DEFAULT_PATTERN);
 | 
	
		
			
				|  |  | +							courseStartDateTime = DateUtil.format(e.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
 | 
	
		
			
				|  |  | +							courseEndDateTime = DateUtil.format(e.getEndClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
 | 
	
		
			
				|  |  | +							Date startDateTime = DateUtil.stringToDate(courseClassDate + " " + courseStartDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
 | 
	
		
			
				|  |  | +							Date endDateTime = DateUtil.stringToDate(courseClassDate + " " + courseEndDateTime, DateUtil.EXPANDED_DATE_TIME_FORMAT);
 | 
	
		
			
				|  |  | +							if(students != null && students.size() > 0){
 | 
	
		
			
				|  |  | +								students.forEach(student->{
 | 
	
		
			
				|  |  | +									StudentAttendance byStatusAndCourseScheduleId = studentAttendanceDao.findByStatusAndCourseScheduleId(student.getUserId(), e.getId().intValue());
 | 
	
		
			
				|  |  | +									if(byStatusAndCourseScheduleId == null){
 | 
	
		
			
				|  |  | +										byStatusAndCourseScheduleId = new StudentAttendance();
 | 
	
		
			
				|  |  | +										byStatusAndCourseScheduleId.setSignOutTime(endDateTime);
 | 
	
		
			
				|  |  | +										byStatusAndCourseScheduleId.setStatus(StudentAttendanceStatusEnum.NORMAL);
 | 
	
		
			
				|  |  | +										byStatusAndCourseScheduleId.setSignInTime(startDateTime);
 | 
	
		
			
				|  |  | +										byStatusAndCourseScheduleId.setUpdateTime(date);
 | 
	
		
			
				|  |  | +										byStatusAndCourseScheduleId.setUserId(student.getUserId());
 | 
	
		
			
				|  |  | +										byStatusAndCourseScheduleId.setTeacherId(e.getActualTeacherId());
 | 
	
		
			
				|  |  | +										byStatusAndCourseScheduleId.setClassGroupId(e.getClassGroupId());
 | 
	
		
			
				|  |  | +										byStatusAndCourseScheduleId.setMusicGroupId(e.getMusicGroupId());
 | 
	
		
			
				|  |  | +										byStatusAndCourseScheduleId.setGroupType(e.getGroupType());
 | 
	
		
			
				|  |  | +										byStatusAndCourseScheduleId.setCourseScheduleId(e.getId());
 | 
	
		
			
				|  |  | +										studentAttendanceDao.insert(byStatusAndCourseScheduleId);
 | 
	
		
			
				|  |  | +									}
 | 
	
		
			
				|  |  | +								});
 | 
	
		
			
				|  |  | +							}
 | 
	
		
			
				|  |  | +						}
 | 
	
		
			
				|  |  | +					}
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  }
 |