|
@@ -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)
|