|
@@ -70,6 +70,8 @@ import java.time.format.DateTimeFormatter;
|
|
import java.time.temporal.TemporalAdjusters;
|
|
import java.time.temporal.TemporalAdjusters;
|
|
import java.util.*;
|
|
import java.util.*;
|
|
import java.util.concurrent.CompletableFuture;
|
|
import java.util.concurrent.CompletableFuture;
|
|
|
|
+import java.util.concurrent.ExecutorService;
|
|
|
|
+import java.util.concurrent.Executors;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
import static com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType.MUSIC_NETWORK;
|
|
import static com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType.MUSIC_NETWORK;
|
|
@@ -2339,8 +2341,15 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
|
|
.stream().map(Long::parseLong).collect(Collectors.toList());
|
|
.stream().map(Long::parseLong).collect(Collectors.toList());
|
|
//所有的课程
|
|
//所有的课程
|
|
List<CourseSchedule> courseSchedules = courseScheduleDao.findByCourseScheduleIds(courseScheduleIds);
|
|
List<CourseSchedule> courseSchedules = courseScheduleDao.findByCourseScheduleIds(courseScheduleIds);
|
|
|
|
+ //校验可排课时间
|
|
|
|
+ this.checkLiveAdjust(courseSchedules);
|
|
|
|
+
|
|
//校验机构线上课人数上限
|
|
//校验机构线上课人数上限
|
|
this.checkOnlineCategory(courseSchedules,vipGroupCourseAdjustInfo.getTeachMode());
|
|
this.checkOnlineCategory(courseSchedules,vipGroupCourseAdjustInfo.getTeachMode());
|
|
|
|
+ //重置连堂课标记
|
|
|
|
+ List<CourseSchedule> liveCourseSchedules = Lists.newArrayList();
|
|
|
|
+ //拷贝历史直播课
|
|
|
|
+ BeanUtils.copyProperties(courseSchedules,liveCourseSchedules);
|
|
courseSchedules.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
|
|
courseSchedules.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
|
|
//获取操作日志
|
|
//获取操作日志
|
|
List<CourseScheduleModifyLog> modifyLogs = getModifyLogs(courseScheduleIds, courseSchedules, user.getId(), now);
|
|
List<CourseScheduleModifyLog> modifyLogs = getModifyLogs(courseScheduleIds, courseSchedules, user.getId(), now);
|
|
@@ -2494,17 +2503,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
|
|
|
|
|
|
// courseScheduleTeacherSalaryDao.batchUpdateCourseSalarys(courseScheduleIds, teacherSalary);
|
|
// courseScheduleTeacherSalaryDao.batchUpdateCourseSalarys(courseScheduleIds, teacherSalary);
|
|
|
|
|
|
- // 直播课数据清除
|
|
|
|
- for (CourseSchedule item : courseSchedules) {
|
|
|
|
- if (LIVE == item.getGroupType()) {
|
|
|
|
- // 消息提醒
|
|
|
|
- item.setLiveRemind(0);
|
|
|
|
- // 直播间关联
|
|
|
|
- item.setLiveRoomId("");
|
|
|
|
- // 连堂课标识
|
|
|
|
- item.setContinuousCourse(false);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
}
|
|
}
|
|
|
|
|
|
courseScheduleDao.batchUpdate(courseSchedules);
|
|
courseScheduleDao.batchUpdate(courseSchedules);
|
|
@@ -2525,6 +2523,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
|
|
// courseScheduleStudentPaymentService.updateVipGiveCourse(vipGroup.getId());
|
|
// courseScheduleStudentPaymentService.updateVipGiveCourse(vipGroup.getId());
|
|
//保存操作日志
|
|
//保存操作日志
|
|
saveModifyLog(modifyLogs,courseScheduleIds);
|
|
saveModifyLog(modifyLogs,courseScheduleIds);
|
|
|
|
+ //发送直播课调整通知
|
|
|
|
+ this.sendChatRoomMessage(liveCourseSchedules);
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@@ -3048,6 +3048,7 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
|
|
Map<Long, CourseSchedule> oldCourseScheduleMap = oldCourseScheduleList.stream().collect(Collectors.toMap(CourseSchedule::getId, c -> c));
|
|
Map<Long, CourseSchedule> oldCourseScheduleMap = oldCourseScheduleList.stream().collect(Collectors.toMap(CourseSchedule::getId, c -> c));
|
|
|
|
|
|
List<CourseSchedule> liveCourseSchedules = Lists.newArrayList();
|
|
List<CourseSchedule> liveCourseSchedules = Lists.newArrayList();
|
|
|
|
+ BeanUtils.copyProperties(oldCourseScheduleList,liveCourseSchedules);
|
|
for(CourseSchedule newCourseSchedule : newCourseSchedules){
|
|
for(CourseSchedule newCourseSchedule : newCourseSchedules){
|
|
|
|
|
|
//获取数据库中的记录
|
|
//获取数据库中的记录
|
|
@@ -3103,17 +3104,6 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- // 直播课发送推送消息
|
|
|
|
- if (LIVE.equals(oldCourseSchedule.getGroupType())) {
|
|
|
|
- // 日期,时间,时长,主教老师不一致时,发送消息
|
|
|
|
- if (newCourseSchedule.getClassDate() != oldCourseSchedule.getClassDate()
|
|
|
|
- || newCourseSchedule.getStartClassTime() != oldCourseSchedule.getStartClassTime()
|
|
|
|
- || newCourseSchedule.getEndClassTime() != oldCourseSchedule.getEndClassTime()
|
|
|
|
- || newCourseSchedule.getActualTeacherId() != oldCourseSchedule.getActualTeacherId().intValue()) {
|
|
|
|
- liveCourseSchedules.add(oldCourseSchedule);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
if(!CollectionUtils.isEmpty(newCourseSchedule.getTeachingTeacherIdList())){
|
|
if(!CollectionUtils.isEmpty(newCourseSchedule.getTeachingTeacherIdList())){
|
|
if (newCourseSchedule.getTeachingTeacherIdList().contains(newCourseSchedule.getActualTeacherId())){
|
|
if (newCourseSchedule.getTeachingTeacherIdList().contains(newCourseSchedule.getActualTeacherId())){
|
|
throw new BizException("主教和助教不可重复");
|
|
throw new BizException("主教和助教不可重复");
|
|
@@ -3556,66 +3546,8 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
-
|
|
|
|
// 直播课消息推送
|
|
// 直播课消息推送
|
|
- if (CollectionUtils.isNotEmpty(liveCourseSchedules)) {
|
|
|
|
-
|
|
|
|
- CompletableFuture.runAsync(() ->
|
|
|
|
-
|
|
|
|
- liveCourseSchedules.parallelStream().forEach(item -> {
|
|
|
|
-
|
|
|
|
- // 是否是连堂课
|
|
|
|
- String continueCourseTime = sysTenantConfigService.getTenantConfigValue(SysConfigService.ONLINE_CONTINUE_COURSE_TIME, item.getTenantId());
|
|
|
|
- if (StringUtils.isEmpty(continueCourseTime)) {
|
|
|
|
- continueCourseTime = "5";
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- // 查询最新课程信息
|
|
|
|
- CourseSchedule newCourseSchedule = courseScheduleDao.get(item.getId());
|
|
|
|
- if (newCourseSchedule.getClassDate().getTime() > item.getClassDate().getTime()) {
|
|
|
|
- newCourseSchedule = item;
|
|
|
|
- }
|
|
|
|
- // 直播课关联直播间编号
|
|
|
|
- String liveRoomId = getCourseScheduleLiveRoomId(newCourseSchedule, continueCourseTime, Lists.newArrayList(), Lists.newArrayList());
|
|
|
|
-
|
|
|
|
- if (StringUtils.isBlank(liveRoomId)) {
|
|
|
|
- liveRoomId = item.getLiveRoomId();
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- ImLiveBroadcastRoom liveRoom = imLiveBroadcastRoomService.getByRoomUid(liveRoomId);
|
|
|
|
- if (Objects.isNull(liveRoom)) {
|
|
|
|
- log.warn("liveRoom is null, liveRoomId:{}", liveRoomId);
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- try {
|
|
|
|
- LivePluginService pluginService = livePluginContext.getPluginService(liveRoom.getServiceProvider());
|
|
|
|
-
|
|
|
|
- LiveRoomMessage message = new LiveRoomMessage();
|
|
|
|
- message.setIsIncludeSender(1);
|
|
|
|
- message.setFromUserId(newCourseSchedule.getActualTeacherId().toString());
|
|
|
|
- message.setToChatRoomId(liveRoom.getRoomUid());
|
|
|
|
- message.setObjectName(LiveRoomMessage.LIVE_STATUS_CHANGE);
|
|
|
|
-
|
|
|
|
- // 发送用户信息
|
|
|
|
- LiveRoomMessage.MessageUser messageUser = LiveRoomMessage.MessageUser.builder()
|
|
|
|
- .sendUserId("")
|
|
|
|
- .sendUserName("")
|
|
|
|
- .avatarUrl("")
|
|
|
|
- .build();
|
|
|
|
-
|
|
|
|
- message.setContent(LiveRoomMessage.MessageContent.builder()
|
|
|
|
- .sendUserInfo(messageUser).build());
|
|
|
|
-
|
|
|
|
- pluginService.sendChatRoomMessage(message);
|
|
|
|
- log.info("liveRoom sendChatRoomMessage success, liveRoomId:{}", liveRoomId);
|
|
|
|
- } catch (Exception e) {
|
|
|
|
- log.error("liveRoom error", e);
|
|
|
|
- }
|
|
|
|
- })
|
|
|
|
- );
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
|
|
+ this.sendChatRoomMessage(liveCourseSchedules);
|
|
return BaseController.succeed();
|
|
return BaseController.succeed();
|
|
}
|
|
}
|
|
|
|
|
|
@@ -6124,7 +6056,94 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
|
|
|
+ @Override
|
|
|
|
+ public void checkLiveAdjust(CourseSchedule oldCourseSchedule,String startRemindTime) {
|
|
|
|
+ // 直播课
|
|
|
|
+ if (GroupType.LIVE.equals(oldCourseSchedule.getGroupType())){
|
|
|
|
+ if(org.springframework.util.StringUtils.isEmpty(startRemindTime)){
|
|
|
|
+ startRemindTime = sysConfigDao.findConfigValue("live_class_start_remind_time");
|
|
|
|
+ }
|
|
|
|
+ if(org.springframework.util.StringUtils.isEmpty(startRemindTime)){
|
|
|
|
+ startRemindTime = "30";
|
|
|
|
+ }
|
|
|
|
+ if(DateUtil.minutesBetween(new Date(),oldCourseSchedule.getStartClassTime()) < Integer.parseInt(startRemindTime)
|
|
|
|
+ && DateUtil.minutesBetween(new Date(),oldCourseSchedule.getEndClassTime()) >= 0){
|
|
|
|
+ throw new BizException("直播课课程开始前{}分钟不允许调整",startRemindTime);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void checkLiveAdjust(List<CourseSchedule> courseSchedules) {
|
|
|
|
+ String startRemindTime = sysConfigDao.findConfigValue("live_class_start_remind_time");
|
|
|
|
+ courseSchedules.forEach(e->checkLiveAdjust(e,startRemindTime));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void resetLiveRemind(CourseSchedule courseSchedule) {
|
|
|
|
+ if (GroupType.LIVE.equals(courseSchedule.getGroupType())) {
|
|
|
|
+ // 重置连堂课,关联直播间,消息推送状态
|
|
|
|
+ courseSchedule.setLiveRemind(0);
|
|
|
|
+ courseSchedule.setContinuousCourse(false);
|
|
|
|
+ courseSchedule.setLiveRoomId("");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void resetLiveRemind(List<CourseSchedule> courseSchedules) {
|
|
|
|
+ courseSchedules.forEach(e->resetLiveRemind(e));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void sendChatRoomMessage(List<CourseSchedule> courseSchedules) {
|
|
|
|
+ // 直播课消息推送
|
|
|
|
+ ExecutorService executor = Executors.newCachedThreadPool();
|
|
|
|
+ CompletableFuture.runAsync(() ->
|
|
|
|
+ courseSchedules.parallelStream().filter(e->e.getGroupType() == LIVE).forEach(item -> {
|
|
|
|
+ // 是否是连堂课
|
|
|
|
+ String continueCourseTime = sysTenantConfigService.getTenantConfigValue(SysConfigService.ONLINE_CONTINUE_COURSE_TIME, item.getTenantId());
|
|
|
|
+ if (StringUtils.isEmpty(continueCourseTime)) {
|
|
|
|
+ continueCourseTime = "5";
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 直播课关联直播间编号
|
|
|
|
+ String liveRoomId = getCourseScheduleLiveRoomId(item, continueCourseTime, Lists.newArrayList(), Lists.newArrayList());
|
|
|
|
+
|
|
|
|
+ ImLiveBroadcastRoom liveRoom = imLiveBroadcastRoomService.getByRoomUid(liveRoomId);
|
|
|
|
+ if (Objects.isNull(liveRoom)) {
|
|
|
|
+ log.warn("liveRoom is null, liveRoomId:{}", item.getLiveRoomId());
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ LivePluginService pluginService = livePluginContext.getPluginService(liveRoom.getServiceProvider());
|
|
|
|
+
|
|
|
|
+ LiveRoomMessage message = new LiveRoomMessage();
|
|
|
|
+ message.setIsIncludeSender(1);
|
|
|
|
+ message.setFromUserId(item.getActualTeacherId().toString());
|
|
|
|
+ message.setToChatRoomId(item.getLiveRoomId());
|
|
|
|
+ message.setObjectName(LiveRoomMessage.LIVE_STATUS_CHANGE);
|
|
|
|
+
|
|
|
|
+ // 发送用户信息
|
|
|
|
+ LiveRoomMessage.MessageUser messageUser = LiveRoomMessage.MessageUser.builder()
|
|
|
|
+ .sendUserId("")
|
|
|
|
+ .sendUserName("")
|
|
|
|
+ .avatarUrl("")
|
|
|
|
+ .build();
|
|
|
|
+
|
|
|
|
+ message.setContent(LiveRoomMessage.MessageContent.builder()
|
|
|
|
+ .sendUserInfo(messageUser).build());
|
|
|
|
+
|
|
|
|
+ pluginService.sendChatRoomMessage(message);
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ log.error("liveRoom error", e);
|
|
|
|
+ }
|
|
|
|
+ }),executor
|
|
|
|
+ );
|
|
|
|
+ executor.shutdown();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
public List<CourseScheduleStudentDto> queryDetailList(CourseDetailQueryInfo courseDetailQueryInfo) {
|
|
public List<CourseScheduleStudentDto> queryDetailList(CourseDetailQueryInfo courseDetailQueryInfo) {
|
|
|
|
|
|
|
|
|