| 
					
				 | 
			
			
				@@ -75,6 +75,174 @@ public class TeacherAttendanceServiceImpl extends BaseServiceImpl<Long, TeacherA 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return teacherAttendanceDao; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	@Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	public Map<String, Object> addTeacherAttendanceRecord(TeacherSignOutDto teacherSignOutDto) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		SysUser user = sysUserFeignService.queryUserInfo(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		teacherDao.getLocked(user.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if(Objects.isNull(user)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			throw new BizException("请登录"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if(Objects.isNull(teacherSignOutDto.getTeacherAttendanceInfo().getCourseScheduleId())){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			throw new BizException("请选择课程!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Map<String,Object> result=new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		TeacherAttendance teacherAttendance=teacherAttendanceDao.findByTeacherAttendanceInfo(user.getId().longValue(),teacherSignOutDto.getTeacherAttendanceInfo().getCourseScheduleId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Date date = new Date(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if(Objects.isNull(teacherAttendance)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			teacherAttendance=teacherSignOutDto.getTeacherAttendanceInfo(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			teacherAttendance.setTeacherId(user.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			teacherAttendance.setCreateTime(date); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}else if(teacherAttendance.getSignInTime() != null && teacherAttendance.getSignOutTime() != null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			throw new BizException("当前课程已签到"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		TeacherAttendanceDto currentCourseDetail = courseScheduleDao.getCurrentCourseDetail(teacherSignOutDto.getTeacherAttendanceInfo().getCourseScheduleId(),user.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if(Objects.isNull(currentCourseDetail)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			throw new BizException("课程不存在"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		teacherAttendance.setMusicGroupId(currentCourseDetail.getMusicGroupId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		teacherAttendance.setClassGroupId(currentCourseDetail.getClassId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		teacherAttendance.setRemark(teacherSignOutDto.getTeacherAttendanceInfo().getRemark()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		int advanceSignMinutes = Integer.parseInt(sysConfigDao.findConfigValue(SysConfigService.ADVANCE_SIGN_IN_MINUTES)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		CourseSchedule courseSchedule = courseScheduleDao.get(teacherAttendance.getCourseScheduleId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		teacherAttendance.setGroupType(courseSchedule.getGroupType()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if(courseSchedule == null){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			throw new BizException("课程信息不存在"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Date tomorrow = DateUtil.addDays1(date, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if(tomorrow.before(courseSchedule.getStartClassTime())){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			throw new BizException("明天的课程不能进行签到"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		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); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Date classEndDateAdd60Minutes = DateUtil.addMinutes(classEndDateTime, 180); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Date add20Minutes = DateUtil.addMinutes(classStartDateTime, advanceSignMinutes * -1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if(teacherAttendance.getSignInTime() == null && teacherSignOutDto.getTeacherAttendanceInfo().getStatus().equals(SignStatusEnum.SIGN_IN.getCode())){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if(StringUtils.isBlank(teacherSignOutDto.getTeacherAttendanceInfo().getSignInLongitudeLatitude())){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				throw new BizException("未获取到您的位置"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			School school = schoolDao.get(courseSchedule.getSchoolId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//是否在范围内 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			boolean isInScore = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if(StringUtils.isBlank(school.getLongitudeLatitude())){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(teacherSignOutDto.getTeacherAttendanceInfo().getUpdate().equals(YesOrNoEnum.YES.getCode())){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					school.setLongitudeLatitude(teacherSignOutDto.getTeacherAttendanceInfo().getSignInLongitudeLatitude()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					schoolDao.update(school); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				}else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					isInScore = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				SysConfig sysConfig = sysConfigService.findByParamName(SysConfigService.ATTENDANCE_RANGE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				double attendanceRange = Double.valueOf(sysConfig.getParanValue()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				double distance = MapUtil.distance(teacherSignOutDto.getTeacherAttendanceInfo().getSignInLongitudeLatitude(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						school.getLongitudeLatitude()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(distance>attendanceRange){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					isInScore=false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			teacherAttendance.setCurrentClassTimes(courseScheduleDao.countCurrentTimes(teacherAttendance.getClassGroupId(),courseSchedule.getStartClassTime()) + 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			teacherAttendance.setSignInLongitudeLatitude(teacherSignOutDto.getTeacherAttendanceInfo().getSignInLongitudeLatitude()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (currentCourseDetail.getEndClassTime().before(date)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				throw new BizException("该课程已结束,不能进行签到!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			YesOrNoEnum yesOrNoEnum = YesOrNoEnum.NO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if(Objects.nonNull(courseSchedule.getSchoolId())){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				yesOrNoEnum = courseScheduleService.enableOnlyNormalAttendance(currentCourseDetail.getStartClassTime(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						user.getId().longValue(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						currentCourseDetail.getSchoolId().intValue()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			teacherAttendance.setSignInTime(date); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			teacherAttendance.setSignInStatus(YesOrNoEnum.YES); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			result.put("signInStatus",0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if(yesOrNoEnum == YesOrNoEnum.YES){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				//连堂课 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}else if(DateUtil.minutesBetween(date,add20Minutes) >= 0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				//正常签到范围(开始前60分钟  ~  开始之前20分钟) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(!isInScore){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					teacherAttendance.setSignInStatus(YesOrNoEnum.NO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}else if(DateUtil.minutesBetween(add20Minutes,date) > 0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				if(StringUtils.isEmpty(teacherAttendance.getRemark())&&!teacherSignOutDto.isNotRturnErrorInfo()){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					//当前为异常签到,请填写原因! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					result.put("status",2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				//异常签到范围(开始之后  ~  结束之前) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				teacherAttendance.setSignInStatus(YesOrNoEnum.NO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				result.put("signInStatus",1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				throw new BizException("签到时间异常"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if(Objects.nonNull(teacherAttendance.getId())){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				teacherAttendanceDao.update(teacherAttendance); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				teacherAttendanceDao.insert(teacherAttendance); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}else if(teacherAttendance.getSignOutTime() == null && teacherSignOutDto.getTeacherAttendanceInfo().getStatus().equals(SignStatusEnum.SIGN_OUT.getCode())){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//正常签退范围(结束后1小时内) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			teacherAttendance.setSignOutTime(date); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			ClassGroup classGroup = classGroupDao.get(courseSchedule.getClassGroupId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			teacherAttendance.setCurrentClassTimes(classGroup.getCurrentClassTimes() + 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if(DateUtil.minutesBetween(classEndDateTime,date) >= 0 && DateUtil.minutesBetween(date,classEndDateAdd60Minutes) >= 0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				teacherAttendance.setSignOutStatus(YesOrNoEnum.YES); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				result.put("signInStatus",0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}else if(DateUtil.minutesBetween(classEndDateAdd60Minutes,date) > 0){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				teacherAttendance.setSignOutStatus(YesOrNoEnum.NO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				result.put("signInStatus",1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				throw new BizException("签退时间异常"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if(Objects.nonNull(teacherAttendance.getId())){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				teacherAttendanceDao.update(teacherAttendance); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			}else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				teacherAttendanceDao.insert(teacherAttendance); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//新增课堂作业 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			CourseHomework courseHomework=teacherSignOutDto.getCourseHomeworkInfo(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			courseHomework.setCourseScheduleId(teacherAttendance.getCourseScheduleId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			courseHomework.setMusicGroupId(currentCourseDetail.getMusicGroupId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			courseHomework.setGroupType(teacherAttendance.getGroupType()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			courseHomework.setClassGroupId(currentCourseDetail.getClassId().intValue()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			courseHomework.setExpiryDate(DateUtil.addDays(date,7)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			courseHomework.setExpectNum(courseScheduleDao.countCourseStudentNum(teacherAttendance.getCourseScheduleId())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			courseHomeworkService.insert(courseHomework); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			List<StudentCourseHomework> studentCourseHomeworks = studentCourseHomeworkDao 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					.constructInitialStudentHomeworkRecordsWithPayment(teacherAttendance.getCourseScheduleId(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+							courseHomework.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if(CollectionUtils.isEmpty(studentCourseHomeworks)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				throw new BizException("此课程没有学生"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			studentCourseHomeworkDao.batchInsertStudentCourseHomeworkRecord(studentCourseHomeworks); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		result.put("status",0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		result.put("currentTime",date); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	@Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	@Transactional(rollbackFor = Exception.class) 
			 |