|
@@ -1,30 +1,30 @@
|
|
package com.yonge.cooleshow.biz.dal.service.impl;
|
|
package com.yonge.cooleshow.biz.dal.service.impl;
|
|
|
|
|
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
|
|
import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
|
|
import com.yonge.cooleshow.auth.api.entity.SysUser;
|
|
import com.yonge.cooleshow.auth.api.entity.SysUser;
|
|
import com.yonge.cooleshow.biz.dal.constant.SysConfigConstant;
|
|
import com.yonge.cooleshow.biz.dal.constant.SysConfigConstant;
|
|
import com.yonge.cooleshow.biz.dal.dao.ImNetworkRoomDao;
|
|
import com.yonge.cooleshow.biz.dal.dao.ImNetworkRoomDao;
|
|
-import com.yonge.cooleshow.biz.dal.dao.ImNetworkRoomMemberDao;
|
|
|
|
import com.yonge.cooleshow.biz.dal.dao.SysConfigDao;
|
|
import com.yonge.cooleshow.biz.dal.dao.SysConfigDao;
|
|
-import com.yonge.cooleshow.biz.dal.dto.CourseScheduleStudentMusicScoreResult;
|
|
|
|
-import com.yonge.cooleshow.biz.dal.dto.ImNetworkRoomResult;
|
|
|
|
-import com.yonge.cooleshow.biz.dal.dto.NetworkRoomResult;
|
|
|
|
|
|
+import com.yonge.cooleshow.biz.dal.dto.*;
|
|
import com.yonge.cooleshow.biz.dal.entity.CourseSchedule;
|
|
import com.yonge.cooleshow.biz.dal.entity.CourseSchedule;
|
|
|
|
+import com.yonge.cooleshow.biz.dal.entity.IMApiResultInfo;
|
|
import com.yonge.cooleshow.biz.dal.entity.ImNetworkRoom;
|
|
import com.yonge.cooleshow.biz.dal.entity.ImNetworkRoom;
|
|
import com.yonge.cooleshow.biz.dal.entity.ImNetworkRoomMember;
|
|
import com.yonge.cooleshow.biz.dal.entity.ImNetworkRoomMember;
|
|
import com.yonge.cooleshow.biz.dal.enums.ImNetworkRoomErrorEnum;
|
|
import com.yonge.cooleshow.biz.dal.enums.ImNetworkRoomErrorEnum;
|
|
|
|
+import com.yonge.cooleshow.biz.dal.enums.ImNetworkRoomMemberChangedEnum;
|
|
import com.yonge.cooleshow.biz.dal.enums.UserRoleEnum;
|
|
import com.yonge.cooleshow.biz.dal.enums.UserRoleEnum;
|
|
import com.yonge.cooleshow.biz.dal.service.*;
|
|
import com.yonge.cooleshow.biz.dal.service.*;
|
|
|
|
+import com.yonge.cooleshow.biz.dal.support.IMHelper;
|
|
import com.yonge.cooleshow.common.entity.HttpResponseResult;
|
|
import com.yonge.cooleshow.common.entity.HttpResponseResult;
|
|
import com.yonge.cooleshow.common.exception.BizException;
|
|
import com.yonge.cooleshow.common.exception.BizException;
|
|
import com.yonge.toolset.utils.date.DateUtil;
|
|
import com.yonge.toolset.utils.date.DateUtil;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
-import org.springframework.beans.BeanUtils;
|
|
|
|
-import org.springframework.stereotype.Service;
|
|
|
|
-
|
|
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
import javax.annotation.Resource;
|
|
@@ -56,6 +56,8 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
private CourseScheduleService courseScheduleService;
|
|
private CourseScheduleService courseScheduleService;
|
|
@Resource
|
|
@Resource
|
|
private SysConfigDao sysConfigDao;
|
|
private SysConfigDao sysConfigDao;
|
|
|
|
+ @Resource
|
|
|
|
+ private IMHelper imHelper;
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public ImNetworkRoomDao getDao() {
|
|
public ImNetworkRoomDao getDao() {
|
|
@@ -64,29 +66,25 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@Transactional(rollbackFor = Exception.class)
|
|
- public HttpResponseResult<ImNetworkRoomResult> joinRoom(Long courseScheduleId, UserRoleEnum userRole) {
|
|
|
|
|
|
+ public HttpResponseResult<ImNetworkRoomResult> joinRoom(Long courseScheduleId, UserRoleEnum userRole) throws Exception {
|
|
|
|
+ log.info("joinRoom params:courseScheduleId:{},userRole:{}",courseScheduleId,userRole);
|
|
CourseSchedule courseSchedule = Optional.ofNullable(courseScheduleService.getDao().findOne(courseScheduleId)).
|
|
CourseSchedule courseSchedule = Optional.ofNullable(courseScheduleService.getDao().findOne(courseScheduleId)).
|
|
orElseThrow(()-> new BizException("课程信息不存在"));
|
|
orElseThrow(()-> new BizException("课程信息不存在"));
|
|
Date now = new Date();
|
|
Date now = new Date();
|
|
|
|
+ courseSchedule.setUpdatedTime(now);
|
|
//是否提前进入教室
|
|
//是否提前进入教室
|
|
- String courseBeforeBufferTime = sysConfigDao.findConfigValue(SysConfigConstant.PRE_CREATE_PRACTICE_ROOM_MINUTE);
|
|
|
|
- if (StringUtils.isEmpty(courseBeforeBufferTime)) {
|
|
|
|
- courseBeforeBufferTime = "5";
|
|
|
|
- }
|
|
|
|
- Date addMinutes = DateUtil.addMinutes(now, Integer.parseInt(courseBeforeBufferTime));
|
|
|
|
- if (courseSchedule.getStartClassTime().compareTo(addMinutes) > 0) {
|
|
|
|
|
|
+ if (roomNotStart(courseSchedule)) {
|
|
return HttpResponseResult.failed(ImNetworkRoomErrorEnum.ROOM_NOT_START.getRemark());
|
|
return HttpResponseResult.failed(ImNetworkRoomErrorEnum.ROOM_NOT_START.getRemark());
|
|
}
|
|
}
|
|
SysUser sysUser = Optional.ofNullable(sysUserFeignService.queryUserInfo()).
|
|
SysUser sysUser = Optional.ofNullable(sysUserFeignService.queryUserInfo()).
|
|
orElseThrow(()-> new BizException("请登录"));
|
|
orElseThrow(()-> new BizException("请登录"));
|
|
String roomId = courseScheduleId.toString();
|
|
String roomId = courseScheduleId.toString();
|
|
ImNetworkRoomResult joinRoomResult = new ImNetworkRoomResult();
|
|
ImNetworkRoomResult joinRoomResult = new ImNetworkRoomResult();
|
|
- //获取房间
|
|
|
|
- ImNetworkRoom room = initRoom(roomId,courseScheduleId,userRole,sysUser.getId());
|
|
|
|
|
|
+ //初始化房间信息
|
|
|
|
+ ImNetworkRoom room = this.initRoom(roomId,courseScheduleId,userRole,sysUser.getId(),now);
|
|
BeanUtils.copyProperties(room,joinRoomResult);
|
|
BeanUtils.copyProperties(room,joinRoomResult);
|
|
- //创建群聊
|
|
|
|
//定时销毁房间
|
|
//定时销毁房间
|
|
- //获取房间用户信息
|
|
|
|
|
|
+ //初始化房间用户信息
|
|
ImNetworkRoomMember roomMember = imNetworkRoomMemberService.initRoomMember(roomId,sysUser,userRole);
|
|
ImNetworkRoomMember roomMember = imNetworkRoomMemberService.initRoomMember(roomId,sysUser,userRole);
|
|
joinRoomResult.setRoomMember(roomMember);
|
|
joinRoomResult.setRoomMember(roomMember);
|
|
//获取房间所有成员
|
|
//获取房间所有成员
|
|
@@ -95,39 +93,90 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
|
|
//如果是老师,重置节拍器数据
|
|
//如果是老师,重置节拍器数据
|
|
if(userRole == UserRoleEnum.TEACHER){
|
|
if(userRole == UserRoleEnum.TEACHER){
|
|
courseScheduleStudentPaymentService.getDao().cleanPlayMidi(courseScheduleId);
|
|
courseScheduleStudentPaymentService.getDao().cleanPlayMidi(courseScheduleId);
|
|
|
|
+ }else {
|
|
|
|
+ //获取节拍器信息
|
|
|
|
+ joinRoomResult.setMidiJson(courseScheduleStudentPaymentService.getMemberMidi(courseScheduleId,sysUser.getId()));
|
|
}
|
|
}
|
|
//获取用户已下载的伴奏列表
|
|
//获取用户已下载的伴奏列表
|
|
List<CourseScheduleStudentMusicScoreResult> musicScoreResults = courseScheduleStudentMusicScoreService.getDao().
|
|
List<CourseScheduleStudentMusicScoreResult> musicScoreResults = courseScheduleStudentMusicScoreService.getDao().
|
|
queryByScoreIdAndCourseId(null,courseScheduleId,sysUser.getId(),null,null);
|
|
queryByScoreIdAndCourseId(null,courseScheduleId,sysUser.getId(),null,null);
|
|
joinRoomResult.setMusicScoreResults(musicScoreResults);
|
|
joinRoomResult.setMusicScoreResults(musicScoreResults);
|
|
- //网络教室配置项
|
|
|
|
|
|
+ //课程结束后关闭教室的时间
|
|
String autoCloseNetworkRoomTime = sysConfigDao.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_PRACTICE_ROOM_MINUTE);
|
|
String autoCloseNetworkRoomTime = sysConfigDao.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_PRACTICE_ROOM_MINUTE);
|
|
- return null;
|
|
|
|
|
|
+ joinRoomResult.setAutoCloseNetworkRoomTime(autoCloseNetworkRoomTime);
|
|
|
|
+ //获取课程剩余时长
|
|
|
|
+ DateUtil.secondsBetween(now, courseSchedule.getEndTime());
|
|
|
|
+ //创建、加入群聊
|
|
|
|
+ IMApiResultInfo resultInfo = imHelper.joinGroup(new String[]{sysUser.getId().toString()}, roomId, roomId);
|
|
|
|
+ if(resultInfo.getCode() != 200){
|
|
|
|
+ log.error("加入群聊失败 resultInfo:{}",resultInfo);
|
|
|
|
+ throw new BizException("加入网络教室失败,请联系管理员");
|
|
|
|
+ }
|
|
|
|
+ return HttpResponseResult.succeed(joinRoomResult);
|
|
}
|
|
}
|
|
|
|
|
|
- public ImNetworkRoom initRoom(String roomId,Long courseId,UserRoleEnum userRole,Long userId){
|
|
|
|
|
|
+ @Override
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
|
+ public void joinRoomSuccess(String roomId, Long userId,UserRoleEnum userRole) throws Exception {
|
|
|
|
+ log.info("joinRoomSuccess: roomId={}, userId={}", roomId, userId);
|
|
|
|
+ SysUser sysUser = Optional.ofNullable(sysUserFeignService.queryUserInfo()).
|
|
|
|
+ orElseThrow(()-> new BizException("请登录"));
|
|
|
|
+ Date now = new Date();
|
|
|
|
+ //获取房间信息
|
|
|
|
+ this.initRoom(roomId, Long.parseLong(roomId), userRole, userId, now);
|
|
|
|
+ //获取房间用户信息
|
|
|
|
+ ImNetworkRoomMember roomMember = imNetworkRoomMemberService.initRoomMember(roomId,sysUser,userRole);
|
|
|
|
+ //发送加入房间的消息
|
|
|
|
+ ImNetworkRoomMemberChangedMessage msg = new ImNetworkRoomMemberChangedMessage(roomMember,ImNetworkRoomMemberChangedEnum.JOIN);
|
|
|
|
+ //获取节拍器信息
|
|
|
|
+ ImNetworkCustomMessage imNetworkCustomMessage = courseScheduleStudentPaymentService.getMemberMidi(Long.parseLong(roomId), userId);
|
|
|
|
+ msg.setMetronomeSwitch(imNetworkCustomMessage.getEnable());
|
|
|
|
+ //获取伴奏信息
|
|
|
|
+ ImNetworkRoomMusicSheetDownloadData musicSheetDownloadData = courseScheduleStudentPaymentService.getMemberExamSong(Long.parseLong(roomId), userId);
|
|
|
|
+ msg.setExamSongSwitch(musicSheetDownloadData.getEnable());
|
|
|
|
+ imHelper.publishMessage(userId.toString(), roomId, msg);
|
|
|
|
+ //记录考勤
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public void joinRoomFailure(String roomId, Long userId) {
|
|
|
|
+ log.info("joinRoomSuccess: roomId={}, userId={}", roomId, userId);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //校验用户是否提前进入教室
|
|
|
|
+ private boolean roomNotStart(CourseSchedule courseSchedule){
|
|
|
|
+ //是否提前进入教室
|
|
|
|
+ String courseBeforeBufferTime = sysConfigDao.findConfigValue(SysConfigConstant.PRE_CREATE_PRACTICE_ROOM_MINUTE);
|
|
|
|
+ if (StringUtils.isEmpty(courseBeforeBufferTime)) {
|
|
|
|
+ courseBeforeBufferTime = "5";
|
|
|
|
+ }
|
|
|
|
+ Date addMinutes = DateUtil.addMinutes(courseSchedule.getUpdatedTime(), Integer.parseInt(courseBeforeBufferTime));
|
|
|
|
+ return courseSchedule.getStartTime().compareTo(addMinutes) > 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public ImNetworkRoom initRoom(String roomId,Long courseId,UserRoleEnum userRole,Long userId,Date now) throws Exception {
|
|
ImNetworkRoom room = baseMapper.findByRoomId(roomId);
|
|
ImNetworkRoom room = baseMapper.findByRoomId(roomId);
|
|
if(Objects.isNull(room)){
|
|
if(Objects.isNull(room)){
|
|
- Date date = new Date();
|
|
|
|
room = new ImNetworkRoom();
|
|
room = new ImNetworkRoom();
|
|
//创建房间
|
|
//创建房间
|
|
room.setCourseScheduleId(courseId);
|
|
room.setCourseScheduleId(courseId);
|
|
room.setRoomId(roomId);
|
|
room.setRoomId(roomId);
|
|
- room.setCreateTime(date);
|
|
|
|
- room.setUpdateTime(date);
|
|
|
|
|
|
+ room.setCreateTime(now);
|
|
|
|
+ room.setUpdateTime(now);
|
|
baseMapper.insert(room);
|
|
baseMapper.insert(room);
|
|
|
|
+ IMApiResultInfo resultInfo = imHelper.createGroup(new String[]{userId.toString()}, roomId, roomId);
|
|
|
|
+ if(resultInfo.getCode() != 200){
|
|
|
|
+ log.error("创建群聊失败 resultInfo:{}",resultInfo);
|
|
|
|
+ throw new BizException("加入网络教室失败,请联系管理员");
|
|
|
|
+ }
|
|
}else {
|
|
}else {
|
|
if(userRole == UserRoleEnum.TEACHER){
|
|
if(userRole == UserRoleEnum.TEACHER){
|
|
room.setDisplay(new StringBuilder("display://type=1?userId=")
|
|
room.setDisplay(new StringBuilder("display://type=1?userId=")
|
|
.append(userId)
|
|
.append(userId)
|
|
.append("?uri=").toString());
|
|
.append("?uri=").toString());
|
|
|
|
+ baseMapper.updateById(room);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return room;
|
|
return room;
|
|
}
|
|
}
|
|
-
|
|
|
|
- public void updateDisplay(){
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
}
|
|
}
|