|  | @@ -668,7 +668,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              if (replied == 1) {
 | 
	
		
			
				|  |  | -                search.setRepliedIds(studentList);
 | 
	
		
			
				|  |  | +                if (CollectionUtils.isEmpty(studentList)) {
 | 
	
		
			
				|  |  | +                    search.setRepliedIds(null);
 | 
	
		
			
				|  |  | +                } else search.setRepliedIds(studentList);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          return page.setRecords(baseMapper.queryTeacherPracticeCourse(page, monthToDate(search)));
 | 
	
	
		
			
				|  | @@ -901,9 +903,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 | 
	
		
			
				|  |  |          //批量检查学生课时在数据库是否重复
 | 
	
		
			
				|  |  |          batchCheckStudentCourseTime(studentId, dateList, CourseScheduleDate::getStartTime, CourseScheduleDate::getEndTime);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        RLock lock = redissonClient.getLock("buyPractice:teacherId:"+scheduleDto.getTeacherId());
 | 
	
		
			
				|  |  | +        RLock lock = redissonClient.getLock("buyPractice:teacherId:" + scheduleDto.getTeacherId());
 | 
	
		
			
				|  |  |          try {
 | 
	
		
			
				|  |  | -            if(lock.tryLock(20,10, TimeUnit.SECONDS)){
 | 
	
		
			
				|  |  | +            if (lock.tryLock(20, 10, TimeUnit.SECONDS)) {
 | 
	
		
			
				|  |  |                  String orderNo = orderReqInfo.getOrderNo();
 | 
	
		
			
				|  |  |                  scheduleDto.setType(CourseScheduleEnum.PRACTICE.getCode());
 | 
	
		
			
				|  |  |                  scheduleDto.setStatus(CourseGroupEnum.NOT_SALE.getCode());
 | 
	
	
		
			
				|  | @@ -966,8 +968,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 | 
	
		
			
				|  |  |                  return httpResponseResult;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          } catch (InterruptedException e) {
 | 
	
		
			
				|  |  | -            log.error("runIfLockCanGet error lockName : {}", "buyPractice:teacherId:"+scheduleDto.getTeacherId(), e);
 | 
	
		
			
				|  |  | -            throw new RuntimeException("runIfLockCanGet error lockName :" + "buyPractice:teacherId:"+scheduleDto.getTeacherId(), e);
 | 
	
		
			
				|  |  | +            log.error("runIfLockCanGet error lockName : {}", "buyPractice:teacherId:" + scheduleDto.getTeacherId(), e);
 | 
	
		
			
				|  |  | +            throw new RuntimeException("runIfLockCanGet error lockName :" + "buyPractice:teacherId:" + scheduleDto.getTeacherId(), e);
 | 
	
		
			
				|  |  |          } finally {
 | 
	
		
			
				|  |  |              lock.unlock();
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -990,7 +992,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 | 
	
		
			
				|  |  |          List<Long> scheduleIds = paymentList.stream().map(CourseScheduleStudentPayment::getCourseId).collect(Collectors.toList());
 | 
	
		
			
				|  |  |          baseMapper.updateLock(scheduleIds);
 | 
	
		
			
				|  |  |          UpdateWrapper<CourseGroup> warp = new UpdateWrapper<>();
 | 
	
		
			
				|  |  | -        warp.set("status_","ING").eq("id_",paymentList.get(0).getCourseGroupId());
 | 
	
		
			
				|  |  | +        warp.set("status_", "ING").eq("id_", paymentList.get(0).getCourseGroupId());
 | 
	
		
			
				|  |  |          courseGroupService.update(warp);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          //查询陪练课服务费
 | 
	
	
		
			
				|  | @@ -1135,14 +1137,23 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 | 
	
		
			
				|  |  |              StudentHomePage.RecentCourses coursesPractice = baseMapper.selectRecentCoursesPractice(teacherId);
 | 
	
		
			
				|  |  |              StudentHomePage.RecentCourses coursesLive = baseMapper.selectRecentCoursesLive(teacherId);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            Date practiceTime = coursesPractice.getCourseStartTime();
 | 
	
		
			
				|  |  | -            Date liveTime = coursesLive.getCourseStartTime();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            if (practiceTime.compareTo(liveTime)==-1){
 | 
	
		
			
				|  |  | -                homePage.setRecentCourses(coursesPractice);
 | 
	
		
			
				|  |  | -            } else {
 | 
	
		
			
				|  |  | +            if (coursesPractice == null && coursesLive != null) {
 | 
	
		
			
				|  |  |                  homePage.setRecentCourses(coursesLive);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | +            if (coursesPractice != null && coursesLive == null) {
 | 
	
		
			
				|  |  | +                homePage.setRecentCourses(coursesPractice);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            if (coursesPractice != null && coursesLive != null) {
 | 
	
		
			
				|  |  | +                Date practiceTime = coursesPractice.getCourseStartTime();
 | 
	
		
			
				|  |  | +                Date liveTime = coursesLive.getCourseStartTime();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                if (practiceTime.compareTo(liveTime) == -1) {
 | 
	
		
			
				|  |  | +                    homePage.setRecentCourses(coursesPractice);
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    homePage.setRecentCourses(coursesLive);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          return homePage;
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -1219,7 +1230,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 | 
	
		
			
				|  |  |          String teacherUrl = sysMessageService.selectConfigUrl(MessageTypeEnum.STUDENT_BUY_PRACTICE.getCode());
 | 
	
		
			
				|  |  |          sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_BUY_PRACTICE,
 | 
	
		
			
				|  |  |                  teacherReceivers, null, 0, teacherUrl, ClientEnum.TEACHER.getCode(),
 | 
	
		
			
				|  |  | -                student.getUsername(), courseNum );
 | 
	
		
			
				|  |  | +                student.getUsername(), courseNum);
 | 
	
		
			
				|  |  |          log.info("send success {}", MessageTypeEnum.STUDENT_BUY_PRACTICE);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          //老师端-学生买陪练课(短信)
 | 
	
	
		
			
				|  | @@ -1232,7 +1243,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 | 
	
		
			
				|  |  |          String studentUrl = sysMessageService.selectConfigUrl(MessageTypeEnum.PRACTICE_BUY.getCode());
 | 
	
		
			
				|  |  |          sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PRACTICE_BUY,
 | 
	
		
			
				|  |  |                  studentReceivers, null, 0, studentUrl, ClientEnum.STUDENT.getCode(),
 | 
	
		
			
				|  |  | -                teacher.getUsername(), courseNum );
 | 
	
		
			
				|  |  | +                teacher.getUsername(), courseNum);
 | 
	
		
			
				|  |  |          log.info("send success {}", MessageTypeEnum.PRACTICE_BUY);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          //学生端-买陪练课(短信)
 | 
	
	
		
			
				|  | @@ -1289,7 +1300,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 | 
	
		
			
				|  |  |                  String teacherUrl = sysMessageService.selectConfigUrl(MessageTypeEnum.TOMORROW_COURSE_REMINDER.getCode());
 | 
	
		
			
				|  |  |                  sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.TOMORROW_COURSE_REMINDER,
 | 
	
		
			
				|  |  |                          teacherReceivers, null, 0, teacherUrl, ClientEnum.TEACHER.getCode(),
 | 
	
		
			
				|  |  | -                        practiceCount.toString(), liveCount.toString() );
 | 
	
		
			
				|  |  | +                        practiceCount.toString(), liveCount.toString());
 | 
	
		
			
				|  |  |                  log.info("send success {}", MessageTypeEnum.TOMORROW_COURSE_REMINDER);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  //老师端-明日课程提醒(短信)
 | 
	
	
		
			
				|  | @@ -1318,4 +1329,70 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
 | 
	
		
			
				|  |  |          sysConfig.put("liveEndTime", sysConfigService.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_LIVE_ROOM_MINUTE));
 | 
	
		
			
				|  |  |          return sysConfig;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public void test() {
 | 
	
		
			
				|  |  | +        //1.查询所有过审的老师
 | 
	
		
			
				|  |  | +        List<TeacherFreeTime> teacherFreeTime = teacherFreeTimeDao.getTeacherFreeTime();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //2.根据配置是否跳过节假日分组
 | 
	
		
			
				|  |  | +        //跳过节假日
 | 
	
		
			
				|  |  | +        List<TeacherFreeTime> skipHoliday = teacherFreeTime.stream().filter(item -> item.getSkipHolidayFlag()).collect(Collectors.toList());
 | 
	
		
			
				|  |  | +        //不跳过节假日
 | 
	
		
			
				|  |  | +        List<TeacherFreeTime> noSkipHoliday = teacherFreeTime.stream().filter(item -> !item.getSkipHolidayFlag()).collect(Collectors.toList());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //3.查询节假日
 | 
	
		
			
				|  |  | +        HolidaysFestivals holidays = holidaysFestivalsDao.queryByYear(Integer.parseInt(DateUtil.getYear(new Date())));
 | 
	
		
			
				|  |  | +        String[] strs = holidays.getHolidaysFestivalsJson().split(",");
 | 
	
		
			
				|  |  | +        List<String> holiday = Arrays.asList(strs);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //4.获取未来30天日期
 | 
	
		
			
				|  |  | +        List<String> futureDays = DateUtil.getFutureDays(30);
 | 
	
		
			
				|  |  | +        //5.获取未来30天日期(剔除节假日)
 | 
	
		
			
				|  |  | +        List<String> futureDaysNoVacation = futureDays.stream().filter(item -> !holiday.contains(item)).collect(Collectors.toList());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Map<Long, Object> map = new HashMap<>();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //6.遍历老师获取周1-7配置
 | 
	
		
			
				|  |  | +        for (TeacherFreeTime freeTimeConfig : skipHoliday) {//跳过节假日
 | 
	
		
			
				|  |  | +            String mondayConfig = freeTimeConfig.getMonday();
 | 
	
		
			
				|  |  | +            List<DateVo> mondayConfigList = JSONObject.parseArray(mondayConfig, DateVo.class);
 | 
	
		
			
				|  |  | +            List<DateChangeVo> rList = new ArrayList<>();//未来30天所有周一排课时间
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            map.put(freeTimeConfig.getId(), rList);
 | 
	
		
			
				|  |  | +            for (String day : futureDaysNoVacation) {//遍历未来30天跳过节假日
 | 
	
		
			
				|  |  | +                String week = DateUtil.getWeek(day);
 | 
	
		
			
				|  |  | +                if (week.equals("monday")) {//当前时间为周一
 | 
	
		
			
				|  |  | +                    splicingDate(day, mondayConfigList, rList);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        System.out.println(map);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //7.遍历30天日期拼接配置 生成日历
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //8.根据老师id查询未来课程时间
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //9.遍历7.8校验区间是否重合
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        //10.记录没重合老师id
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /**
 | 
	
		
			
				|  |  | +     * 拼接日期时间
 | 
	
		
			
				|  |  | +     *
 | 
	
		
			
				|  |  | +     * @param day         日期
 | 
	
		
			
				|  |  | +     * @param strDateList 时间集合
 | 
	
		
			
				|  |  | +     * @param rList       接受容器
 | 
	
		
			
				|  |  | +     * @return
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +    public List<DateChangeVo> splicingDate(String day, List<DateVo> strDateList, List<DateChangeVo> rList) {
 | 
	
		
			
				|  |  | +        for (DateVo vo : strDateList) {
 | 
	
		
			
				|  |  | +            DateChangeVo dateChange = new DateChangeVo();
 | 
	
		
			
				|  |  | +            dateChange.setStartTime(DateUtil.strToDate(day + " " + vo.getStartTime()));
 | 
	
		
			
				|  |  | +            dateChange.setEndTime(DateUtil.strToDate(day + " " + vo.getEndTime()));
 | 
	
		
			
				|  |  | +            rList.add(dateChange);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return rList;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  }
 |