|
@@ -215,7 +215,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
String ymd = DateUtil.format(startTime, DateUtil.DEFAULT_PATTERN);
|
|
|
//查询老师当天未开始、进行中的课程
|
|
|
List<CourseSchedule> list = getTeacherCourseTime(teacherId, ymd, ymd);
|
|
|
- return checkCourseTime(list, CourseSchedule::getStartTime, CourseSchedule::getEndTime, startTime, endTime);
|
|
|
+ return checkCourseTime(list, CourseSchedule::getStartTime, CourseSchedule::getFreeEndTime, startTime, endTime);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -375,6 +375,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
.in(CourseSchedule::getStatus, statusList)
|
|
|
.ge(CourseSchedule::getClassDate, startDate)
|
|
|
.le(CourseSchedule::getClassDate, endDate)
|
|
|
+ .orderByAsc(CourseSchedule::getStartTime)
|
|
|
);
|
|
|
}
|
|
|
|
|
@@ -467,7 +468,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 生成陪练课日历-用于学生购买指定老师陪练课
|
|
|
+ * 生成趣纠课日历-用于学生购买指定老师趣纠课
|
|
|
*
|
|
|
* @param param 传入参数
|
|
|
* <p> - teacherId 老师id
|
|
@@ -482,31 +483,200 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
Long studentId = WrapperUtil.toLong(param, "studentId", "学生id不能为空!");
|
|
|
Integer year = WrapperUtil.toInt(param, "year", "日历的时间年份不能为空!");
|
|
|
Integer month = WrapperUtil.toInt(param, "month", "日历的时间月份不能为空!");
|
|
|
+ Integer teacherSubjectPriceId = WrapperUtil.toInt(param, "teacherSubjectPriceId", "老师声部价格ID不能为空!");
|
|
|
|
|
|
//获取开始日期
|
|
|
LocalDate firstDay = LocalDate.of(year, month, 1);
|
|
|
//根据firstDay计算出该月的最后一天
|
|
|
LocalDate lastDay = firstDay.with(TemporalAdjusters.lastDayOfMonth());
|
|
|
- //查询老师陪练课设置
|
|
|
+ //查询老师趣纠课设置
|
|
|
TeacherFreeTime teacherTime = teacherFreeTimeService.getOne(Wrappers.<TeacherFreeTime>lambdaQuery()
|
|
|
.eq(TeacherFreeTime::getTeacherId, teacherId)
|
|
|
);
|
|
|
- Optional.ofNullable(teacherTime).orElseThrow(() -> new BizException("未查询到老师陪练课设置!"));
|
|
|
- //根据老师设置的陪练课时间生成当月日历
|
|
|
+ TeacherSubjectPrice teacherSubjectPrice = teacherSubjectPriceService.getById(teacherSubjectPriceId);
|
|
|
+
|
|
|
+ Optional.ofNullable(teacherSubjectPrice).orElseThrow(() -> new BizException("未查询到老师课程设置!"));
|
|
|
+ Optional.ofNullable(teacherTime).orElseThrow(() -> new BizException("未查询到老师课程设置!"));
|
|
|
+ //根据老师设置的趣纠课时间生成当月日历
|
|
|
List<CourseCalendarEntity> courseCalendarEntities = generatePracticeCalendar(teacherTime, firstDay, lastDay);
|
|
|
//查询老师及当前学生的课时
|
|
|
Map<String, List<CourseTimeEntity>> nowCourseMap = getAllPracticeCourseTime(teacherId, studentId, firstDay.toString(), lastDay.toString());
|
|
|
//和生成的日历对比,筛选出空余的课程时间
|
|
|
- opsCourseCalendarData(nowCourseMap, courseCalendarEntities, teacherTime.getSkipHolidayFlag() ? 1 : 0);
|
|
|
+ opsNewCourseCalendarData(nowCourseMap, courseCalendarEntities, Boolean.TRUE.equals(teacherTime.getSkipHolidayFlag()) ? 1 : 0 ,
|
|
|
+ teacherSubjectPrice.getCourseMinutes()+teacherSubjectPrice.getFreeMinutes());
|
|
|
return courseCalendarEntities;
|
|
|
}
|
|
|
|
|
|
+ private void opsNewCourseCalendarData(Map<String, List<CourseTimeEntity>> nowCourseMap, List<CourseCalendarEntity> courseCalendarEntities,
|
|
|
+ Integer skipHoliday,Integer courseMinutes) {
|
|
|
+ //储存节假日数据,避免重复查询
|
|
|
+ Map<Integer, List<String>> holidayMap = new HashMap<>();
|
|
|
+ courseCalendarEntities.forEach(calendarEntity -> {
|
|
|
+ //获取课程数据,并剔除交集时间段数据
|
|
|
+ List<CourseTimeEntity> nowCourse = nowCourseMap.get(calendarEntity.getDate());
|
|
|
+ if (CollectionUtils.isEmpty(nowCourse)) {
|
|
|
+ //当日没课
|
|
|
+ calendarEntity.setFullCourse(0);// 0:未满 1满
|
|
|
+ } else {
|
|
|
+ //将日历时间与课程时间进行对比,如果有交集则将日历的时间数据删除
|
|
|
+ if (CollectionUtils.isEmpty(calendarEntity.getCourseTime())) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ nowCourse = mergeTime(nowCourse);
|
|
|
+
|
|
|
+ List<CourseTimeEntity> courseTime = new ArrayList<>();
|
|
|
+ Iterator<CourseTimeEntity> iterator = calendarEntity.getCourseTime().iterator();
|
|
|
+ while (iterator.hasNext()) {
|
|
|
+ CourseTimeEntity next = iterator.next();
|
|
|
+ // 去除 next 上 有交集的时间段
|
|
|
+ courseTime.addAll(delOverlapTime(nowCourse, next));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查时间段是否满足课程时间,不满足则删除,满足 并且可多段的情况下,将时间段拆分
|
|
|
+ courseTime = splitTime(courseTime,courseMinutes);
|
|
|
+ calendarEntity.setCourseTime(courseTime);
|
|
|
+
|
|
|
+ //如果日历时间集合数据删没了,那么就证明当天课程已经满了 0:未满 1满
|
|
|
+ if (CollectionUtils.isEmpty(calendarEntity.getCourseTime())) {
|
|
|
+ calendarEntity.setFullCourse(1);
|
|
|
+ } else {
|
|
|
+ calendarEntity.setFullCourse(0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //获取节假日信息
|
|
|
+ int calendarYear = LocalDate.parse(calendarEntity.getDate()).getYear();
|
|
|
+ List<String> holiday = Optional.of(calendarYear)
|
|
|
+ .map(holidayMap::get)
|
|
|
+ .filter(CollectionUtils::isNotEmpty)
|
|
|
+ .orElseGet(() -> {
|
|
|
+ List<String> list = getHoliday(calendarYear);
|
|
|
+ holidayMap.put(calendarYear, list);
|
|
|
+ return list;
|
|
|
+ });
|
|
|
+ //是否是节假日 1是 0:不是
|
|
|
+ int holidayFlag = holiday.contains(calendarEntity.getDate()) ? 1 : 0;
|
|
|
+ calendarEntity.setHoliday(holidayFlag);
|
|
|
+
|
|
|
+ //是节假日又有需要跳过节假日
|
|
|
+ if (holidayFlag == 1 && skipHoliday == 1) {
|
|
|
+ calendarEntity.setSkipHoliday(1);//跳过节假日
|
|
|
+ calendarEntity.setCourseTime(null);//清空课程时间
|
|
|
+ } else {
|
|
|
+ calendarEntity.setSkipHoliday(0);//不跳过节假日
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查时间段是否满足课程时间,不满足则删除,满足 并且可多段的情况下,将时间段拆分
|
|
|
+ private List<CourseTimeEntity> splitTime(List<CourseTimeEntity> courseTime, Integer courseMinutes) {
|
|
|
+ List<CourseTimeEntity> result = new ArrayList<>();
|
|
|
+ for (CourseTimeEntity courseTimeEntity : courseTime) {
|
|
|
+ if (courseTimeEntity.getEndTime().getTime() - courseTimeEntity.getStartTime().getTime() >= courseMinutes * 60 * 1000) {
|
|
|
+ long time = courseTimeEntity.getEndTime().getTime() - courseTimeEntity.getStartTime().getTime();
|
|
|
+ long startTime = courseTimeEntity.getStartTime().getTime();
|
|
|
+ while (time >= courseMinutes * 60 * 1000) {
|
|
|
+ CourseTimeEntity entity = new CourseTimeEntity();
|
|
|
+ entity.setStartTime(new Date(startTime));
|
|
|
+ entity.setEndTime(new Date(startTime + courseMinutes * 60 * 1000));
|
|
|
+ result.add(entity);
|
|
|
+ startTime = startTime + courseMinutes * 60 * 1000;
|
|
|
+ time = time - courseMinutes * 60 * 1000;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<CourseTimeEntity> delOverlapTime(List<CourseTimeEntity> nowCourse, CourseTimeEntity next) {
|
|
|
+ List<CourseTimeEntity> result = new ArrayList<>();
|
|
|
+ result.addAll(getPlanTime(nowCourse,next));
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
- * 生成老师陪练课日历
|
|
|
- * <p>陪练课的日历需要查询老师设置的陪练课时间,根据设置的时间来生成日历
|
|
|
+ *
|
|
|
+ * 获取可排课时间段
|
|
|
+ * @param timeList 已被使用时间
|
|
|
+ * @param time 待排课时间
|
|
|
+ *
|
|
|
+ */
|
|
|
+ private List<CourseTimeEntity> getPlanTime(List<CourseTimeEntity> timeList, CourseTimeEntity time) {
|
|
|
+ List<CourseTimeEntity> result = new ArrayList<>(timeList);
|
|
|
+ if (CollectionUtils.isEmpty(timeList)) {
|
|
|
+ result.add(time);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ for (CourseTimeEntity trainingPlanTimeDetail : timeList) {
|
|
|
+ if (time.getStartTime().compareTo(trainingPlanTimeDetail.getStartTime()) < 0) {
|
|
|
+ if (time.getEndTime().compareTo(trainingPlanTimeDetail.getStartTime()) <= 0) {
|
|
|
+ result.add(time);
|
|
|
+ return result;
|
|
|
+ } else if (time.getEndTime().compareTo(trainingPlanTimeDetail.getEndTime()) <= 0) {
|
|
|
+ CourseTimeEntity trainingPlanTimeDetail1 = new CourseTimeEntity();
|
|
|
+ trainingPlanTimeDetail1.setStartTime(time.getStartTime());
|
|
|
+ trainingPlanTimeDetail1.setEndTime(trainingPlanTimeDetail.getStartTime());
|
|
|
+ result.add(trainingPlanTimeDetail1);
|
|
|
+ return result;
|
|
|
+ } else {
|
|
|
+ CourseTimeEntity trainingPlanTimeDetail1 = new CourseTimeEntity();
|
|
|
+ trainingPlanTimeDetail1.setStartTime(time.getStartTime());
|
|
|
+ trainingPlanTimeDetail1.setEndTime(trainingPlanTimeDetail.getStartTime());
|
|
|
+ result.add(trainingPlanTimeDetail1);
|
|
|
+ time.setStartTime(trainingPlanTimeDetail.getEndTime());
|
|
|
+ }
|
|
|
+ } else if (time.getStartTime().compareTo(trainingPlanTimeDetail.getEndTime()) <= 0) {
|
|
|
+ if (time.getEndTime().compareTo(trainingPlanTimeDetail.getEndTime()) > 0) {
|
|
|
+ time.setStartTime(trainingPlanTimeDetail.getEndTime());
|
|
|
+ } else {
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (time.getStartTime().compareTo(time.getEndTime()) < 0) {
|
|
|
+ result.add(time);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 将多个时间段合并
|
|
|
+ private List<CourseTimeEntity> mergeTime(List<CourseTimeEntity> timeList) {
|
|
|
+ List<CourseTimeEntity> result = new ArrayList<>();
|
|
|
+
|
|
|
+ // 按开始时间排序
|
|
|
+ timeList.sort(Comparator.comparing(CourseTimeEntity::getStartTime));
|
|
|
+
|
|
|
+ // 从第一个开始
|
|
|
+ CourseTimeEntity time = timeList.get(0);
|
|
|
+ for (int i = 1; i < timeList.size(); i++) {
|
|
|
+ CourseTimeEntity nextTime = timeList.get(i);
|
|
|
+ // 如果下一个时间段的开始时间小于等于上一个时间段的结束时间
|
|
|
+ if (nextTime.getStartTime().compareTo(time.getEndTime()) <= 0 ) {
|
|
|
+ // 合并时间段
|
|
|
+ if (nextTime.getEndTime().compareTo(time.getEndTime()) >= 0) {
|
|
|
+ time.setEndTime(nextTime.getEndTime());
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 保存上一个时间段
|
|
|
+ result.add(time);
|
|
|
+ // 重置时间段
|
|
|
+ if (nextTime.getEndTime().compareTo(time.getEndTime()) >= 0) {
|
|
|
+ time = nextTime;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 保存最后一个时间段
|
|
|
+ result.add(time);
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成老师趣纠课日历
|
|
|
+ * <p>趣纠课的日历需要查询老师设置的趣纠课时间,根据设置的时间来生成日历
|
|
|
*/
|
|
|
private List<CourseCalendarEntity> generatePracticeCalendar(TeacherFreeTime teacherTime, LocalDate firstDay, LocalDate lastDay) {
|
|
|
- //将老师设置的陪练课时间结构化 key::数字周几 1~7 value:具体的时间 开始时间-结束时间
|
|
|
+ //将老师设置的趣纠课时间结构化 key::数字周几 1~7 value:具体的时间 开始时间-结束时间
|
|
|
Map<Integer, JSONArray> teacherPracticeTime = getTeacherPracticeTime(teacherTime);
|
|
|
//每日日期数据
|
|
|
List<CourseCalendarEntity> list = new ArrayList<>();
|
|
@@ -577,13 +747,13 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 将老师设置的陪练课时间结构化
|
|
|
+ * 将老师设置的趣纠课时间结构化
|
|
|
*
|
|
|
* @return key::数字周几 1~7 value:具体的时间 开始时间-结束时间
|
|
|
*/
|
|
|
private Map<Integer, JSONArray> getTeacherPracticeTime(TeacherFreeTime teacherTime) {
|
|
|
Map<Integer, JSONArray> teacherPracticeTime = new HashMap<>();
|
|
|
- //将老师设置的陪练课时间放入map中
|
|
|
+ //将老师设置的趣纠课时间放入map中
|
|
|
BiConsumer<String, Integer> timeCon = (timeStr, weekNum) -> {
|
|
|
Optional.ofNullable(timeStr)
|
|
|
.map(JSONObject::parseArray)
|
|
@@ -621,6 +791,11 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
param.put("endClassDate", endDate);
|
|
|
param.put("statusList", Lists.newArrayList(CourseScheduleEnum.NOT_START.getCode(), CourseScheduleEnum.ING.getCode()));
|
|
|
List<CourseSchedule> studentCourse = baseMapper.queryStudentCourse(param);
|
|
|
+ // 学生不计算课间时间
|
|
|
+ studentCourse.forEach(course -> {
|
|
|
+ course.setFreeEndTime(course.getEndTime());
|
|
|
+ });
|
|
|
+
|
|
|
//将数据合并
|
|
|
if (CollectionUtils.isNotEmpty(studentCourse)) {
|
|
|
courseList.addAll(studentCourse);
|
|
@@ -662,7 +837,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
v.forEach(course -> {
|
|
|
CourseTimeEntity courseTimeEntity = new CourseTimeEntity();
|
|
|
courseTimeEntity.setStartTime(course.getStartTime());
|
|
|
- courseTimeEntity.setEndTime(course.getEndTime());
|
|
|
+ courseTimeEntity.setEndTime(course.getFreeEndTime());
|
|
|
value.add(courseTimeEntity);
|
|
|
});
|
|
|
nowCourse.put(DateUtil.dateToString(k), value);
|
|
@@ -673,7 +848,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
|
|
|
|
|
|
/**
|
|
|
- * 老师端-首页-我的课程-陪练课
|
|
|
+ * 老师端-首页-我的课程-趣纠课
|
|
|
* search:{"classMonth":"2022-03","status":"COMPLETE","subjectId":1}
|
|
|
* <p>
|
|
|
* 老师端-首页-课后评价
|
|
@@ -686,7 +861,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
* search:{"classDate":"2022-03-27"}
|
|
|
* search:{"classMonth":"2022-03"}
|
|
|
* <p>
|
|
|
- * 老师端-课表-陪练课
|
|
|
+ * 老师端-课表-趣纠课
|
|
|
* search:{"classDate":"2022-03-27"}
|
|
|
*
|
|
|
* @Description: 根据老师id查询购课学员
|
|
@@ -727,7 +902,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
@Override
|
|
|
public Integer countTeacherNoDecorateHomework(HomeworkSearch homeworkSearch) {
|
|
|
|
|
|
- // 陪练课 课程状态为完成,有学生考勤记录 没有布置作业
|
|
|
+ // 趣纠课 课程状态为完成,有学生考勤记录 没有布置作业
|
|
|
return baseMapper.countTeacherNoDecorateHomework(homeworkSearch);
|
|
|
}
|
|
|
|
|
@@ -774,7 +949,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
|
|
|
List<MyCourseVo> records = baseMapper.queryStudentPracticeCourse(page, monthToDate(search));
|
|
|
|
|
|
- // 陪练课老师IM聊天ID
|
|
|
+ // 趣纠课老师IM聊天ID
|
|
|
if (CollectionUtils.isNotEmpty(records)) {
|
|
|
|
|
|
for (MyCourseVo item : records) {
|
|
@@ -841,7 +1016,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
sysConfig.put("vipEndTime", sysConfigService.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_VIP_ROOM_MINUTE));
|
|
|
//提前XX分钟创建/进入陪练课房间时间
|
|
|
sysConfig.put("practiceStartTime", sysConfigService.findConfigValue(SysConfigConstant.PRE_CREATE_PRACTICE_ROOM_MINUTE));
|
|
|
- //陪练课结束后,XX分钟关闭房间
|
|
|
+ //趣纠课结束后,XX分钟关闭房间
|
|
|
sysConfig.put("practiceEndTime", sysConfigService.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_PRACTICE_ROOM_MINUTE));
|
|
|
//提前XX分钟创建/进入直播房间的时间
|
|
|
sysConfig.put("liveStartTime", sysConfigService.findConfigValue(SysConfigConstant.PRE_CREATE_LIVE_ROOM_MINUTE));
|
|
@@ -859,7 +1034,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * @Description: 学生端-首页-陪练课老师列表
|
|
|
+ * @Description: 学生端-首页-趣纠课老师列表
|
|
|
* @Author: cy
|
|
|
* @Date: 2022/4/19
|
|
|
*/
|
|
@@ -895,9 +1070,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
}
|
|
|
|
|
|
Map<String, String> sysConfig = new HashMap<>();
|
|
|
- //提前XX分钟创建/进入陪练课房间时间
|
|
|
+ //提前XX分钟创建/进入趣纠课房间时间
|
|
|
sysConfig.put("practiceStartTime", sysConfigService.findConfigValue(SysConfigConstant.PRE_CREATE_PRACTICE_ROOM_MINUTE));
|
|
|
- //陪练课结束后,XX分钟关闭房间
|
|
|
+ //趣纠课结束后,XX分钟关闭房间
|
|
|
sysConfig.put("practiceEndTime", sysConfigService.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_PRACTICE_ROOM_MINUTE));
|
|
|
//提前XX分钟创建/进入直播房间的时间
|
|
|
sysConfig.put("liveStartTime", sysConfigService.findConfigValue(SysConfigConstant.PRE_CREATE_LIVE_ROOM_MINUTE));
|
|
@@ -967,7 +1142,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * @Description: 陪练课购买记录
|
|
|
+ * @Description: 趣纠课购买记录
|
|
|
* @Author: cy
|
|
|
* @Date: 2022/5/16
|
|
|
*/
|
|
@@ -984,34 +1159,22 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
List<CourseScheduleDate> dateList = scheduleDto.getClassTime();
|
|
|
Integer courseNum = scheduleDto.getCourseNum();//课程数
|
|
|
|
|
|
+ if (scheduleDto.getTeacherSubjectPriceId() ==null) {
|
|
|
+ throw new BizException("老师声部价格ID不能为空");
|
|
|
+ }
|
|
|
//校验课时数
|
|
|
if (dateList.size() != courseNum) {
|
|
|
throw new BizException("课程数与课时数不符");
|
|
|
}
|
|
|
- BigDecimal price = baseMapper.selectPrice(scheduleDto.getTeacherId(), scheduleDto.getSubjectId());//老师设置声部价格
|
|
|
+ TeacherSubjectPrice teacherSubjectPrice = teacherSubjectPriceService.getById(scheduleDto.getTeacherSubjectPriceId());//老师设置声部价格
|
|
|
BigDecimal decimal = new BigDecimal(courseNum);//选购课程节数
|
|
|
- BigDecimal multiply = price.multiply(decimal);//预计总价
|
|
|
+ BigDecimal multiply = teacherSubjectPrice.getSubjectPrice().multiply(decimal);//预计总价
|
|
|
if (multiply.compareTo(scheduleDto.getCoursePrice()) != 0) {
|
|
|
throw new BizException("价格异常。预计价格:{},实际价格:{}", multiply, orderReqInfo.getActualPrice());
|
|
|
}
|
|
|
|
|
|
//获取老师锁课缓存
|
|
|
- RMap<Long, List<CourseTimeEntity>> map = courseGroupService.getExpireLiveLockTimeCache(scheduleDto.getTeacherId());
|
|
|
- if (map.isExists()) {
|
|
|
- List<CourseTimeEntity> courseTimeCache = map.get(scheduleDto.getTeacherId());
|
|
|
- //校验缓存中的时间和当前自动生成的时间有没有重复
|
|
|
- dateList.forEach(item ->
|
|
|
- {
|
|
|
- if (checkCourseTime(courseTimeCache, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime, item.getStartTime(), item.getEndTime())) {
|
|
|
- throw new BizException("与缓存中时间存在冲突");
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- //批量检查老师课时在数据库是否重复
|
|
|
- batchCheckTeacherCourseTime(scheduleDto.getTeacherId(), dateList, CourseScheduleDate::getStartTime, CourseScheduleDate::getEndTime);
|
|
|
- //批量检查学生课时在数据库是否重复
|
|
|
- batchCheckStudentCourseTime(studentId, dateList, CourseScheduleDate::getStartTime, CourseScheduleDate::getEndTime);
|
|
|
+ checkCourseTime(scheduleDto, dateList, studentId);
|
|
|
|
|
|
String orderNo = orderReqInfo.getOrderNo();
|
|
|
scheduleDto.setType(CourseScheduleEnum.PRACTICE.getCode());
|
|
@@ -1024,10 +1187,6 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
Long groupId = scheduleDto.getGroupId();
|
|
|
|
|
|
//根据老师id获取默认配置声部原价
|
|
|
- TeacherSubjectPrice teacherSubjectPrice = teacherSubjectPriceService.lambdaQuery()
|
|
|
- .eq(TeacherSubjectPrice::getTeacherId, scheduleDto.getTeacherId())
|
|
|
- .eq(TeacherSubjectPrice::getSubjectId, scheduleDto.getSubjectId())
|
|
|
- .eq(TeacherSubjectPrice::getCourseType, CourseScheduleEnum.PRACTICE.getCode()).one();
|
|
|
BigDecimal subjectPrice = teacherSubjectPrice.getSubjectPrice();
|
|
|
|
|
|
//每课实际价格
|
|
@@ -1080,7 +1239,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * @Description: 学生购买陪练课
|
|
|
+ * @Description: 学生购买趣纠课
|
|
|
* @Author: cy
|
|
|
* @Date: 2022/4/21
|
|
|
*/
|
|
@@ -1094,7 +1253,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
return buyPracticeCourseTran(orderReqInfo);
|
|
|
}
|
|
|
} catch (InterruptedException e) {
|
|
|
- throw new BizException("创建陪练课失败:{}", e.getMessage());
|
|
|
+ throw new BizException("创建趣纠课失败:{}", e.getMessage());
|
|
|
} finally {
|
|
|
if (lock.isLocked() && lock.isHeldByCurrentThread()) {
|
|
|
lock.unlock();
|
|
@@ -1104,7 +1263,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 学生购买陪练课-成功-回调
|
|
|
+ * 学生购买趣纠课-成功-回调
|
|
|
*/
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void buyPracticeCourseSuccess(UserOrderDetailVo orderParam) {
|
|
@@ -1122,7 +1281,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
warp.set("status_", "ING").eq("id_", paymentList.get(0).getCourseGroupId());
|
|
|
courseGroupService.update(warp);
|
|
|
|
|
|
- //查询陪练课服务费
|
|
|
+ //查询趣纠课服务费
|
|
|
String practiceServiceRateStr = sysConfigService.findConfigValue(SysConfigConstant.PRACTICE_SERVICE_FEE);
|
|
|
BigDecimal practiceServiceRate = new BigDecimal(practiceServiceRateStr).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
|
|
|
|
|
@@ -1182,7 +1341,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
try {
|
|
|
practiceSend(paymentList.get(0).getTeacherId(), orderParam.getUserId(), paymentList.size() + "", orderNo);
|
|
|
} catch (Exception e) {
|
|
|
- log.error("陪练课消息推送失败");
|
|
|
+ log.error("趣纠课消息推送失败");
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1213,7 +1372,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 学生购买陪练课-失败-回调
|
|
|
+ * 学生购买趣纠课-失败-回调
|
|
|
*/
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void buyPracticeCourseFailed(UserOrderDetailVo orderParam) {
|
|
@@ -1314,9 +1473,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
sendCourseAdjustMessage(teacherId,studentPayment.getUserId(),adjustVo.getCourseId(),adjustVo.getStartTime());
|
|
|
}
|
|
|
|
|
|
- //{老师昵称}已将{课程类型陪练课、琴房课}{课程名称}课调整到{上课时间yyyy-MM-dd HH:mm:ss},请注意查看
|
|
|
+ //{老师昵称}已将{课程类型趣纠课、琴房课}{课程名称}课调整到{上课时间yyyy-MM-dd HH:mm:ss},请注意查看
|
|
|
private void sendCourseAdjustMessage(Long teacherId,Long studentId,Integer courseScheduleId,Date date) {
|
|
|
- // 陪练课调整模板
|
|
|
+ // 趣纠课调整模板
|
|
|
try {
|
|
|
// 发送消息
|
|
|
SysUser teacher = sysUserService.getByUserId(teacherId);
|
|
@@ -1334,10 +1493,10 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
receivers.put(studentId, student.getPhone());
|
|
|
|
|
|
sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PRACTICE_ADJUST, receivers, null,
|
|
|
- 0, null, ClientEnum.STUDENT.getCode(), teacher.getUsername(),"陪练课",courseName,dateString);
|
|
|
+ 0, null, ClientEnum.STUDENT.getCode(), teacher.getUsername(),"趣纠课",courseName,dateString);
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
- log.error("陪练课调整发送消息失败--> {}", e.fillInStackTrace());
|
|
|
+ log.error("趣纠课调整发送消息失败--> {}", e.fillInStackTrace());
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1364,7 +1523,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
homePage.setRecentCourses(baseMapper.selectRecentCourses(studentId));
|
|
|
}
|
|
|
if (studentId == null) {
|
|
|
- //vip课和陪练课
|
|
|
+ //vip课和趣纠课
|
|
|
StudentHomePage.RecentCourses coursesPractice = baseMapper.selectRecentCoursesPractice(teacherId);
|
|
|
StudentHomePage.RecentCourses coursesLive = baseMapper.selectRecentCoursesLive(teacherId);//直播课&琴房课共用coursesLive
|
|
|
|
|
@@ -1390,14 +1549,14 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * @Description: 查询老师陪练课配置
|
|
|
+ * @Description: 查询老师趣纠课配置
|
|
|
* @Author: cy
|
|
|
* @Date: 2022/4/26
|
|
|
*/
|
|
|
public List<TeacherSubjectPrice> teacherSubjectPrice(Long teacherId) {
|
|
|
TeacherFreeTime teacherFreeTime = teacherFreeTimeService.lambdaQuery().eq(TeacherFreeTime::getTeacherId, teacherId).one();
|
|
|
if (teacherFreeTime == null) {
|
|
|
- log.info("未查到陪练课配置,老师id:{}", teacherId);
|
|
|
+ log.info("未查到趣纠课配置,老师id:{}", teacherId);
|
|
|
return new ArrayList<>();
|
|
|
}
|
|
|
|
|
@@ -1449,18 +1608,23 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
teacherReceivers, null, 0, null, ClientEnum.TEACHER.getCode(),
|
|
|
info.getRepliedNum(), info.getDecorateNum());
|
|
|
} catch (Exception e) {
|
|
|
- log.warn("老师当日陪练课未评价/布置作业消息发送失败,{}", e.getMessage());
|
|
|
+ log.warn("老师当日趣纠课未评价/布置作业消息发送失败,{}", e.getMessage());
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void practiceSend(Long teacherId, Long studentId, String courseNum, String orderNo) {
|
|
|
+ practiceSend(teacherId, studentId, courseNum, orderNo, CourseScheduleEnum.PRACTICE);
|
|
|
+ }
|
|
|
/**
|
|
|
- * @Description: 购买陪练课消息推送
|
|
|
+ * @Description: 购买趣纠课消息推送
|
|
|
* @Author: cy
|
|
|
* @Date: 2022/5/6
|
|
|
*/
|
|
|
@Override
|
|
|
- public void practiceSend(Long teacherId, Long studentId, String courseNum, String orderNo) {
|
|
|
+ public void practiceSend(Long teacherId, Long studentId, String courseNum, String orderNo, CourseScheduleEnum type) {
|
|
|
//查询老师&学生信息
|
|
|
SysUser teacher = sysUserService.getByUserId(teacherId);
|
|
|
SysUser student = sysUserService.getByUserId(studentId);
|
|
@@ -1470,51 +1634,14 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
teacherReceivers.put(teacherId, teacher.getPhone());
|
|
|
Map<Long, String> studentReceivers = new HashMap<>();
|
|
|
studentReceivers.put(studentId, student.getPhone());
|
|
|
- Map<Long, String> teacherSms = new HashMap<>();
|
|
|
- teacherSms.put(teacherId, teacher.getPhone());
|
|
|
- Map<Long, String> studentSms = new HashMap<>();
|
|
|
- studentSms.put(studentId, student.getPhone());
|
|
|
-
|
|
|
- //老师端-学生买陪练课
|
|
|
- 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);
|
|
|
- log.info("send success {}", MessageTypeEnum.STUDENT_BUY_PRACTICE);
|
|
|
-
|
|
|
- //老师端-学生买陪练课(短信)
|
|
|
- sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_STUDENT_BUY_PRACTICE,
|
|
|
- teacherSms, null, 0, null, null,
|
|
|
- student.getUsername(), courseNum);
|
|
|
- log.info("send success {}", MessageTypeEnum.SMS_STUDENT_BUY_PRACTICE);
|
|
|
-
|
|
|
- //学生端-买陪练课
|
|
|
- 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);
|
|
|
- log.info("send success {}", MessageTypeEnum.PRACTICE_BUY);
|
|
|
-
|
|
|
- //学生端-买陪练课(短信)
|
|
|
- String studentSmsUrl = sysMessageService.selectConfigUrl(MessageTypeEnum.SMS_PRACTICE_BUY.getCode());
|
|
|
- sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.SMS_PRACTICE_BUY,
|
|
|
- studentSms, null, 0, null, null,
|
|
|
- teacher.getUsername(), courseNum, studentSmsUrl);
|
|
|
- log.info("send success {}", MessageTypeEnum.SMS_PRACTICE_BUY);
|
|
|
-
|
|
|
- List<String> startTimeList = baseMapper.selectStartTime(orderNo);
|
|
|
- for (String startTime : startTimeList) {
|
|
|
- //老师端-陪练课开课提醒
|
|
|
- sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_PRACTICE_REMINDER,
|
|
|
- teacherReceivers, DateUtil.offsetMinute(startTime, -20), 0, null, ClientEnum.TEACHER.getCode(),
|
|
|
- student.getUsername());
|
|
|
-
|
|
|
- //学生端-陪练课开课提醒
|
|
|
- sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.PRACTICE_REMIND,
|
|
|
- studentReceivers, DateUtil.offsetMinute(startTime, -20), 0, null, ClientEnum.STUDENT.getCode(),
|
|
|
- teacher.getUsername());
|
|
|
- }
|
|
|
- log.info("send success {}", MessageTypeEnum.PRACTICE_REMIND);
|
|
|
+
|
|
|
+ sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_BUY_COURSE_TO_STUDENT,
|
|
|
+ studentReceivers, null, 0, null, ClientEnum.STUDENT.getCode(),
|
|
|
+ teacher.getUsername(), courseNum,type.getMsg());
|
|
|
+
|
|
|
+ sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.STUDENT_BUY_COURSE_TO_TEACHER,
|
|
|
+ teacherReceivers, null, 0, null, ClientEnum.TEACHER.getCode(),
|
|
|
+ student.getUsername(), courseNum,type.getMsg());
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -1578,7 +1705,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
sysConfig.put("vipEndTime", sysConfigService.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_VIP_ROOM_MINUTE));
|
|
|
//提前XX分钟创建/进入陪练课房间时间
|
|
|
sysConfig.put("practiceStartTime", sysConfigService.findConfigValue(SysConfigConstant.PRE_CREATE_PRACTICE_ROOM_MINUTE));
|
|
|
- //陪练课结束后,XX分钟关闭房间
|
|
|
+ //趣纠课结束后,XX分钟关闭房间
|
|
|
sysConfig.put("practiceEndTime", sysConfigService.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_PRACTICE_ROOM_MINUTE));
|
|
|
//提前XX分钟创建/进入直播房间的时间
|
|
|
sysConfig.put("liveStartTime", sysConfigService.findConfigValue(SysConfigConstant.PRE_CREATE_LIVE_ROOM_MINUTE));
|
|
@@ -1779,7 +1906,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
List<CourseScheduleStudentVo> userList = paymentDao.selectUser();
|
|
|
if (CollectionUtils.isNotEmpty(userList)) {
|
|
|
List<CourseScheduleStudentVo> practiceList = userList.stream().filter(s -> s.getType().equals(CourseScheduleEnum.PRACTICE.getCode())).collect(Collectors.toList());
|
|
|
- if (CollectionUtils.isNotEmpty(practiceList)) {//陪练课
|
|
|
+ if (CollectionUtils.isNotEmpty(practiceList)) {//趣纠课
|
|
|
//老师课酬状态改为待结算
|
|
|
courseScheduleTeacherSalaryService.update(null, Wrappers.<CourseScheduleTeacherSalary>lambdaUpdate()
|
|
|
.set(CourseScheduleTeacherSalary::getStatus, TeacherSalaryEnum.WAIT.getCode())
|
|
@@ -1956,6 +2083,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
Integer consumTime = classNum * singleClassTime * n;//消耗时长 课程数*单课时长*人数
|
|
|
|
|
|
List<CourseTimeEntity> timeList = arrangeCourseVo.getTimeList();//选课时间
|
|
|
+ for (CourseTimeEntity courseTimeEntity : timeList) {
|
|
|
+ courseTimeEntity.setFreeEndTime(DateUtil.offsetMinute(courseTimeEntity.getEndTime(), arrangeCourseVo.getCourseFreeMinutes()));
|
|
|
+ }
|
|
|
Integer consumeTime = arrangeCourseVo.getConsumeTime();
|
|
|
|
|
|
log.info("classNum:" + classNum);
|
|
@@ -2020,7 +2150,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
}
|
|
|
CourseTimeEntity o = timeList.get(i);
|
|
|
List<CourseTimeEntity> newList = timeList.subList(i + 1, timeList.size());
|
|
|
- boolean checkParamTime = this.checkCourseTime(newList, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime, o.getStartTime(), o.getEndTime());
|
|
|
+ boolean checkParamTime = this.checkCourseTime(newList, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime, o.getStartTime(), o.getFreeEndTime());
|
|
|
if (checkParamTime) {
|
|
|
throw new BizException(DateUtil.dateToString(o.getStartTime(), "yyyy年MM月dd号 HH点mm分") + "的课程时间重复!");
|
|
|
}
|
|
@@ -2028,7 +2158,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
}
|
|
|
|
|
|
//批量检查老师课时在数据库是否重复
|
|
|
- this.batchCheckTeacherCourseTime(teacherId, timeList, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime);
|
|
|
+ this.batchCheckTeacherCourseTime(teacherId, timeList, CourseTimeEntity::getStartTime, CourseTimeEntity::getFreeEndTime);
|
|
|
|
|
|
//校验购买的课程组每节课时间是否和自己的课时冲突
|
|
|
for (Long studentId : studentIds) {
|
|
@@ -2058,6 +2188,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
schedule.setClassDate(DateUtil.trunc(courseTimeEntity.getStartTime()));
|
|
|
schedule.setStartTime(courseTimeEntity.getStartTime());
|
|
|
schedule.setEndTime(courseTimeEntity.getEndTime());
|
|
|
+ schedule.setFreeEndTime(courseTimeEntity.getFreeEndTime());
|
|
|
schedule.setLock(0);
|
|
|
schedule.setStatus(CourseScheduleEnum.NOT_START.getCode());
|
|
|
schedule.setCreatedBy(teacherId);
|
|
@@ -2486,47 +2617,37 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
|
|
|
|
|
|
/**
|
|
|
- * 购买陪练课后
|
|
|
+ * 购买趣纠课后
|
|
|
*
|
|
|
*/
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public void buyPracticeCourseAfter(UserPaymentOrderWrapper.OrderGoodsInfo orderGoodsInfo) {
|
|
|
+ CourseScheduleEnum courseScheduleEnum = null;
|
|
|
+ if (orderGoodsInfo.getGoodType() == GoodTypeEnum.PRACTICE) {
|
|
|
+ courseScheduleEnum = CourseScheduleEnum.PRACTICE;
|
|
|
+ } else if (orderGoodsInfo.getGoodType() == GoodTypeEnum.VIP_COURSE) {
|
|
|
+ courseScheduleEnum = CourseScheduleEnum.VIP;
|
|
|
+ } else {
|
|
|
+ throw new BizException("课程类型错误");
|
|
|
+ }
|
|
|
|
|
|
ObjectMapper objectMapper = new ObjectMapper();
|
|
|
PracticeScheduleDto scheduleDto = objectMapper.convertValue(orderGoodsInfo.getBizContent(), PracticeScheduleDto.class);
|
|
|
List<CourseScheduleDate> dateList = scheduleDto.getClassTime();
|
|
|
- Integer courseNum = scheduleDto.getCourseNum();//课程数
|
|
|
|
|
|
- //校验课时数
|
|
|
- if (dateList.size() != courseNum) {
|
|
|
- throw new BizException("课程数与课时数不符");
|
|
|
+ TeacherSubjectPrice teacherSubjectPrice = teacherSubjectPriceService.getById(scheduleDto.getTeacherSubjectPriceId());//老师设置声部价格
|
|
|
+ for (CourseScheduleDate courseScheduleDate : dateList) {
|
|
|
+ courseScheduleDate.setFreeEndTime(DateUtil.offsetMinute(courseScheduleDate.getEndTime(), teacherSubjectPrice.getFreeMinutes()));
|
|
|
}
|
|
|
|
|
|
RLock lock = redissonClient.getLock("teacherId:" + scheduleDto.getTeacherId());
|
|
|
try {
|
|
|
if (lock.tryLock(10, 60, TimeUnit.SECONDS)) {
|
|
|
- //获取老师锁课缓存
|
|
|
- RMap<Long, List<CourseTimeEntity>> map = courseGroupService.getExpireLiveLockTimeCache(scheduleDto.getTeacherId());
|
|
|
- if (map.isExists()) {
|
|
|
- List<CourseTimeEntity> courseTimeCache = map.get(scheduleDto.getTeacherId());
|
|
|
- //校验缓存中的时间和当前自动生成的时间有没有重复
|
|
|
- dateList.forEach(item ->
|
|
|
- {
|
|
|
- if (checkCourseTime(courseTimeCache, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime, item.getStartTime(), item.getEndTime())) {
|
|
|
- throw new BizException("与缓存中时间存在中途");
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- //批量检查老师课时在数据库是否重复
|
|
|
- batchCheckTeacherCourseTime(scheduleDto.getTeacherId(), dateList, CourseScheduleDate::getStartTime, CourseScheduleDate::getEndTime);
|
|
|
- //批量检查学生课时在数据库是否重复
|
|
|
- batchCheckStudentCourseTime(orderGoodsInfo.getUserId(), dateList, CourseScheduleDate::getStartTime, CourseScheduleDate::getEndTime);
|
|
|
-
|
|
|
+ checkCourseTime(scheduleDto, dateList, orderGoodsInfo.getUserId());
|
|
|
|
|
|
String orderNo = orderGoodsInfo.getOrderNo();
|
|
|
- scheduleDto.setType(CourseScheduleEnum.PRACTICE.getCode());
|
|
|
+ scheduleDto.setType(courseScheduleEnum.getCode());
|
|
|
scheduleDto.setStatus(CourseGroupEnum.NOT_SALE.getCode());
|
|
|
scheduleDto.setMixStudentNum(1);
|
|
|
scheduleDto.setStudentId(orderGoodsInfo.getUserId());
|
|
@@ -2535,11 +2656,6 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
baseMapper.addCourseGroup(scheduleDto);
|
|
|
Long groupId = scheduleDto.getGroupId();
|
|
|
|
|
|
- //根据老师id获取默认配置声部原价
|
|
|
- TeacherSubjectPrice teacherSubjectPrice = teacherSubjectPriceService.lambdaQuery()
|
|
|
- .eq(TeacherSubjectPrice::getTeacherId, scheduleDto.getTeacherId())
|
|
|
- .eq(TeacherSubjectPrice::getSubjectId, scheduleDto.getSubjectId())
|
|
|
- .eq(TeacherSubjectPrice::getCourseType, CourseScheduleEnum.PRACTICE.getCode()).one();
|
|
|
BigDecimal subjectPrice = teacherSubjectPrice.getSubjectPrice();
|
|
|
|
|
|
//每课实际价格
|
|
@@ -2553,8 +2669,9 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
schedule.setClassDate(date.getClassDate());
|
|
|
schedule.setStartTime(date.getStartTime());
|
|
|
schedule.setEndTime(date.getEndTime());
|
|
|
+ schedule.setFreeEndTime(date.getFreeEndTime());
|
|
|
schedule.setCourseGroupId(groupId);
|
|
|
- schedule.setType(CourseScheduleEnum.PRACTICE.getCode());
|
|
|
+ schedule.setType(courseScheduleEnum.getCode());
|
|
|
schedule.setClassNum(i + 1);
|
|
|
schedule.setTeacherId(scheduleDto.getTeacherId());
|
|
|
schedule.setLock(1);
|
|
@@ -2568,7 +2685,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
payment.setUserId(scheduleDto.getStudentId());
|
|
|
payment.setCourseId(scheduleId);
|
|
|
payment.setCourseGroupId(groupId);
|
|
|
- payment.setCourseType(CourseScheduleEnum.PRACTICE.getCode());
|
|
|
+ payment.setCourseType(courseScheduleEnum.getCode());
|
|
|
payment.setOrderNo(orderNo);
|
|
|
payment.setOriginalPrice(subjectPrice);//原价
|
|
|
payment.setExpectPrice(subjectPrice);//预计价格
|
|
@@ -2578,7 +2695,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
}
|
|
|
}
|
|
|
} catch (InterruptedException e) {
|
|
|
- throw new BizException("创建陪练课失败:{}", e.getMessage());
|
|
|
+ throw new BizException("创建课程失败:{}", e.getMessage());
|
|
|
} finally {
|
|
|
if (lock.isLocked() && lock.isHeldByCurrentThread()) {
|
|
|
lock.unlock();
|
|
@@ -2760,6 +2877,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
|
|
|
private UserOrderDetail buyPracticeCourseTranV2(UserPaymentOrderWrapper.OrderGoodsInfo orderGoodsInfo) {
|
|
|
log.info("buyPracticeCourse param:{}", JSON.toJSONString(orderGoodsInfo));
|
|
|
+
|
|
|
Long studentId = orderGoodsInfo.getUserId();
|
|
|
|
|
|
//校验学生信息
|
|
@@ -2769,12 +2887,34 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
PracticeScheduleDto scheduleDto = objectMapper.convertValue(orderGoodsInfo.getBizContent(), PracticeScheduleDto.class);
|
|
|
List<CourseScheduleDate> dateList = scheduleDto.getClassTime();
|
|
|
Integer courseNum = scheduleDto.getCourseNum();//课程数
|
|
|
-
|
|
|
+ if (scheduleDto.getTeacherSubjectPriceId() ==null) {
|
|
|
+ throw new BizException("老师声部价格ID不能为空");
|
|
|
+ }
|
|
|
//校验课时数
|
|
|
if (dateList.size() != courseNum) {
|
|
|
throw new BizException("课程数与课时数不符");
|
|
|
}
|
|
|
+ checkCourseTime(scheduleDto, dateList, studentId);
|
|
|
|
|
|
+ TeacherSubjectPrice teacherSubjectPrice = teacherSubjectPriceService.getById(scheduleDto.getTeacherSubjectPriceId());//老师设置声部价格
|
|
|
+ BigDecimal decimal = new BigDecimal(courseNum);//选购课程节数
|
|
|
+ BigDecimal multiply = teacherSubjectPrice.getSubjectPrice().multiply(decimal);//预计总价
|
|
|
+
|
|
|
+ UserOrderDetail userOrderDetail = JSON.parseObject(JSON.toJSONString(orderGoodsInfo), UserOrderDetail.class);
|
|
|
+
|
|
|
+ userOrderDetail.setGoodUrl(userOrderService.getGoodUrlByType(orderGoodsInfo.getGoodType()));
|
|
|
+ userOrderDetail.setMerchId(scheduleDto.getTeacherId());
|
|
|
+ userOrderDetail.setGoodNum(scheduleDto.getCourseNum());
|
|
|
+ userOrderDetail.setOriginalPrice(multiply);
|
|
|
+ userOrderDetail.setCouponAmount(BigDecimal.ZERO);
|
|
|
+ userOrderDetail.setExpectPrice(multiply);
|
|
|
+ userOrderDetail.setActualPrice(userOrderDetail.getExpectPrice());
|
|
|
+
|
|
|
+ log.info("buyPracticeCourse return {}", userOrderDetail);
|
|
|
+ return userOrderDetail;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void checkCourseTime(PracticeScheduleDto scheduleDto, List<CourseScheduleDate> dateList, Long studentId) {
|
|
|
//获取老师锁课缓存
|
|
|
RMap<Long, List<CourseTimeEntity>> map = courseGroupService.getExpireLiveLockTimeCache(scheduleDto.getTeacherId());
|
|
|
if (map.isExists()) {
|
|
@@ -2782,35 +2922,16 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
//校验缓存中的时间和当前自动生成的时间有没有重复
|
|
|
dateList.forEach(item ->
|
|
|
{
|
|
|
- if (checkCourseTime(courseTimeCache, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime, item.getStartTime(), item.getEndTime())) {
|
|
|
+ if (checkCourseTime(courseTimeCache, CourseTimeEntity::getStartTime, CourseTimeEntity::getEndTime, item.getStartTime(), item.getFreeEndTime())) {
|
|
|
throw new BizException("与缓存中时间存在冲突");
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
|
|
|
//批量检查老师课时在数据库是否重复
|
|
|
- batchCheckTeacherCourseTime(scheduleDto.getTeacherId(), dateList, CourseScheduleDate::getStartTime, CourseScheduleDate::getEndTime);
|
|
|
+ batchCheckTeacherCourseTime(scheduleDto.getTeacherId(), dateList, CourseScheduleDate::getStartTime, CourseScheduleDate::getFreeEndTime);
|
|
|
//批量检查学生课时在数据库是否重复
|
|
|
batchCheckStudentCourseTime(studentId, dateList, CourseScheduleDate::getStartTime, CourseScheduleDate::getEndTime);
|
|
|
-
|
|
|
-
|
|
|
- BigDecimal price = baseMapper.selectPrice(scheduleDto.getTeacherId(), scheduleDto.getSubjectId());//老师设置声部价格
|
|
|
- BigDecimal decimal = new BigDecimal(courseNum);//选购课程节数
|
|
|
- BigDecimal multiply = price.multiply(decimal);//预计总价
|
|
|
-
|
|
|
- UserOrderDetail userOrderDetail = JSON.parseObject(JSON.toJSONString(orderGoodsInfo), UserOrderDetail.class);
|
|
|
-
|
|
|
- userOrderDetail.setGoodUrl(userOrderService.getGoodUrlByType(orderGoodsInfo.getGoodType()));
|
|
|
- userOrderDetail.setMerchId(scheduleDto.getTeacherId());
|
|
|
- userOrderDetail.setGoodNum(scheduleDto.getCourseNum());
|
|
|
- userOrderDetail.setOriginalPrice(multiply);
|
|
|
- userOrderDetail.setCouponAmount(BigDecimal.ZERO);
|
|
|
- userOrderDetail.setExpectPrice(multiply);
|
|
|
- userOrderDetail.setActualPrice(userOrderDetail.getExpectPrice());
|
|
|
-
|
|
|
-
|
|
|
- log.info("buyPracticeCourse return {}", userOrderDetail);
|
|
|
- return userOrderDetail;
|
|
|
}
|
|
|
|
|
|
@Override
|