|
@@ -0,0 +1,601 @@
|
|
|
+package com.yonge.cooleshow.biz.dal.service.impl;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.baomidou.mybatisplus.extension.exceptions.ApiException;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
|
|
|
+import com.yonge.cooleshow.auth.api.entity.SysUser;
|
|
|
+import com.yonge.cooleshow.biz.dal.dao.ImNetworkRoomDao;
|
|
|
+import com.yonge.cooleshow.biz.dal.dao.SysConfigDao;
|
|
|
+import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
|
|
|
+import com.yonge.cooleshow.biz.dal.dto.*;
|
|
|
+import com.yonge.cooleshow.biz.dal.entity.*;
|
|
|
+import com.yonge.cooleshow.biz.dal.enums.*;
|
|
|
+import com.yonge.cooleshow.biz.dal.service.*;
|
|
|
+import com.yonge.cooleshow.biz.dal.support.IMHelper;
|
|
|
+import com.yonge.cooleshow.common.constant.SysConfigConstant;
|
|
|
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
|
|
|
+import com.yonge.toolset.base.exception.BizException;
|
|
|
+import com.yonge.toolset.utils.date.DateUtil;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.util.CollectionUtils;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+import static org.bouncycastle.asn1.cms.CMSObjectIdentifiers.data;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 网络教室房间(ImNetworkRoom)表服务实现类
|
|
|
+ *
|
|
|
+ * @author zx
|
|
|
+ * @since 2022-03-30 16:36:36
|
|
|
+ */
|
|
|
+@Service("imNetworkRoomService")
|
|
|
+public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNetworkRoom> implements ImNetworkRoomService {
|
|
|
+
|
|
|
+ private final static Logger log = LoggerFactory.getLogger(ImNetworkRoomServiceImpl.class);
|
|
|
+
|
|
|
+ @Resource
|
|
|
+ private SysUserFeignService sysUserFeignService;
|
|
|
+ @Resource
|
|
|
+ private TeacherDao teacherDao;
|
|
|
+ @Resource
|
|
|
+ private ImNetworkRoomMemberService imNetworkRoomMemberService;
|
|
|
+ @Resource
|
|
|
+ private CourseScheduleStudentPaymentService courseScheduleStudentPaymentService;
|
|
|
+ @Resource
|
|
|
+ private CourseScheduleStudentMusicSheetService courseScheduleStudentMusicSheetService;
|
|
|
+ @Resource
|
|
|
+ private CourseScheduleService courseScheduleService;
|
|
|
+ @Resource
|
|
|
+ private SysConfigDao sysConfigDao;
|
|
|
+ @Resource
|
|
|
+ private IMHelper imHelper;
|
|
|
+ @Resource
|
|
|
+ private MusicSheetAccompanimentService musicSheetAccompanimentService;
|
|
|
+ @Resource
|
|
|
+ private MusicSheetService musicSheetService;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ImNetworkRoomDao getDao() {
|
|
|
+ return this.baseMapper;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public HttpResponseResult<ImNetworkRoomResult> joinRoom(Long courseScheduleId, UserRoleEnum userRole) throws Exception {
|
|
|
+ log.info("joinRoom params:courseScheduleId:{},userRole:{}",courseScheduleId,userRole);
|
|
|
+ SysUser user = Optional.ofNullable(sysUserFeignService.queryUserInfo()).
|
|
|
+ orElseThrow(()-> new BizException("请登录"));
|
|
|
+ CourseSchedule courseSchedule = Optional.ofNullable(courseScheduleService.getById(courseScheduleId)).
|
|
|
+ orElseThrow(()->new BizException("房间信息不存在"));
|
|
|
+ BasicUserInfo sysUser = Optional.ofNullable(teacherDao.getBasicUserInfo(user.getId())).
|
|
|
+ orElseThrow(()-> new BizException("用户信息不存在"));
|
|
|
+ Date now = new Date();
|
|
|
+ courseSchedule.setUpdatedTime(now);
|
|
|
+ //是否提前进入教室
|
|
|
+ if (roomNotStart(courseSchedule)) {
|
|
|
+ return HttpResponseResult.failed(ImNetworkRoomErrorEnum.ROOM_NOT_START.getRemark());
|
|
|
+ }
|
|
|
+ String roomId = courseScheduleId.toString();
|
|
|
+ ImNetworkRoomResult joinRoomResult = new ImNetworkRoomResult();
|
|
|
+ //初始化房间信息
|
|
|
+ ImNetworkRoom room = this.initRoom(roomId,courseScheduleId,userRole,sysUser.getUserId(),now);
|
|
|
+ BeanUtils.copyProperties(room,joinRoomResult);
|
|
|
+ //定时销毁房间
|
|
|
+ //初始化房间用户信息
|
|
|
+ ImNetworkRoomMember roomMember = imNetworkRoomMemberService.initRoomMember(roomId,sysUser,userRole);
|
|
|
+ joinRoomResult.setRoomMember(roomMember);
|
|
|
+ //获取房间所有成员
|
|
|
+ List<ImNetworkRoomMember> roomMemberList = imNetworkRoomMemberService.getDao().queryByRoomId(roomId);
|
|
|
+ joinRoomResult.setRoomMemberList(roomMemberList);
|
|
|
+ //如果是老师,重置节拍器数据
|
|
|
+ if(userRole == UserRoleEnum.TEACHER){
|
|
|
+ courseScheduleStudentPaymentService.getDao().cleanPlayMidi(courseScheduleId);
|
|
|
+ }else {
|
|
|
+ //获取节拍器信息
|
|
|
+ joinRoomResult.setMidiJson(courseScheduleStudentPaymentService.getMemberMidi(courseScheduleId,sysUser.getUserId()));
|
|
|
+ }
|
|
|
+ //获取用户已下载的伴奏列表
|
|
|
+ List<CourseScheduleStudentMusicSheetResult> musicSheetResults = courseScheduleStudentMusicSheetService.getDao().
|
|
|
+ queryBySheetIdAndCourseId(null,courseScheduleId,sysUser.getUserId(),null,null);
|
|
|
+ joinRoomResult.setMusicSheetResults(musicSheetResults);
|
|
|
+ //课程结束后关闭教室的时间
|
|
|
+ String autoCloseNetworkRoomTime = sysConfigDao.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_PRACTICE_ROOM_MINUTE);
|
|
|
+ joinRoomResult.setAutoCloseNetworkRoomTime(autoCloseNetworkRoomTime);
|
|
|
+ //获取课程剩余时长
|
|
|
+ DateUtil.secondsBetween(now, courseSchedule.getEndTime());
|
|
|
+ //创建、加入群聊
|
|
|
+ IMApiResultInfo resultInfo = imHelper.joinGroup(new String[]{sysUser.getUserId().toString()}, roomId, roomId);
|
|
|
+ if(resultInfo.getCode() != 200){
|
|
|
+ log.error("加入群聊失败 resultInfo:{}",resultInfo);
|
|
|
+// throw new BizException("加入网络教室失败,请联系管理员");
|
|
|
+ }
|
|
|
+ return HttpResponseResult.succeed(joinRoomResult);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void joinRoomSuccess(String roomId,Long userId) throws Exception {
|
|
|
+ log.info("joinRoomSuccess: roomId={}, userId={}", roomId, userId);
|
|
|
+ CourseSchedule courseSchedule = Optional.ofNullable(courseScheduleService.getById(roomId)).
|
|
|
+ orElseThrow(()->new BizException("房间信息不存在"));
|
|
|
+ BasicUserInfo sysUser = Optional.ofNullable(teacherDao.getBasicUserInfo(userId)).
|
|
|
+ orElseThrow(()-> new BizException("用户信息不存在"));
|
|
|
+ UserRoleEnum userRole = UserRoleEnum.STUDENT;
|
|
|
+ if(Objects.equals(courseSchedule.getTeacherId(),userId)){
|
|
|
+ userRole = UserRoleEnum.TEACHER;
|
|
|
+ }
|
|
|
+ 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
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void joinRoomFailure(String roomId) {
|
|
|
+ SysUser sysUser = Optional.ofNullable(sysUserFeignService.queryUserInfo()).
|
|
|
+ orElseThrow(()-> new BizException("请登录"));
|
|
|
+ Long userId = sysUser.getId();
|
|
|
+ log.info("joinRoomFailure: roomId={}, userId={}", roomId, userId);
|
|
|
+ imNetworkRoomMemberService.getDao().delByRidAndUid(roomId, userId);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void leaveRoom(String roomId,UserRoleEnum userRole) throws Exception {
|
|
|
+ SysUser sysUser = Optional.ofNullable(sysUserFeignService.queryUserInfo()).
|
|
|
+ orElseThrow(()-> new BizException("请登录"));
|
|
|
+ Long userId = sysUser.getId();
|
|
|
+ log.info("leaveRoom: roomId={}, userId={}", roomId, userId);
|
|
|
+ long courseScheduleId = Long.parseLong(roomId);
|
|
|
+ if (userRole == UserRoleEnum.TEACHER){
|
|
|
+ //如果老师退出房间,关闭伴奏
|
|
|
+ courseScheduleStudentMusicSheetService.getDao().closePlayStatus(courseScheduleId,null);
|
|
|
+ courseScheduleStudentPaymentService.getDao().adjustPlayMidi(courseScheduleId, null, null);
|
|
|
+ courseScheduleStudentPaymentService.getDao().adjustExamSong(courseScheduleId, null, null);
|
|
|
+ }
|
|
|
+ ImNetworkRoomMember roomMember = imNetworkRoomMemberService.getDao().findByRidAndUid(roomId, userId);
|
|
|
+ //删除用户信息
|
|
|
+ imNetworkRoomMemberService.getDao().delByRidAndUid(roomId,userId);
|
|
|
+ //发送退出房间的消息
|
|
|
+ ImNetworkRoomMemberChangedMessage msg = new ImNetworkRoomMemberChangedMessage(roomMember,ImNetworkRoomMemberChangedEnum.JOIN);
|
|
|
+ imHelper.publishMessage(userId.toString(), roomId, msg);
|
|
|
+ imHelper.quit(new String[]{userId.toString()}, roomId);
|
|
|
+ //记录考勤信息
|
|
|
+ //是否删除房间信息
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void leaveRoomSuccess(String roomId, Long userId) throws Exception {
|
|
|
+ log.info("leaveRoomSuccess: roomId={}, userId={}", roomId, userId);
|
|
|
+ CourseSchedule courseSchedule = courseScheduleService.getById(roomId);
|
|
|
+ if(Objects.isNull(courseSchedule)){
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ UserRoleEnum roleEnum = UserRoleEnum.STUDENT;
|
|
|
+ if(Objects.equals(courseSchedule.getTeacherId(),userId)){
|
|
|
+ roleEnum = UserRoleEnum.TEACHER;
|
|
|
+ }
|
|
|
+ //记录考勤信息
|
|
|
+
|
|
|
+ ImNetworkRoom room = baseMapper.findByRoomId(roomId);
|
|
|
+ if (roleEnum == UserRoleEnum.TEACHER){
|
|
|
+ if (isUserDisplay(room.getDisplay(), userId)) {
|
|
|
+ room.setDisplay("");
|
|
|
+ this.updateDisplay(userId,room);
|
|
|
+ }
|
|
|
+ //老师退出房间,初始化节拍器和伴奏播放配置
|
|
|
+ courseScheduleStudentPaymentService.adjustPlayMidiAndMusicSheet(courseSchedule.getId(), null, null,"");
|
|
|
+ }
|
|
|
+ ImNetworkRoomMember roomMember = imNetworkRoomMemberService.getDao().findByRidAndUid(roomId, userId);
|
|
|
+ int memberNum = imNetworkRoomMemberService.getDao().countByRoomId(roomId);
|
|
|
+ if (memberNum <= 1) {
|
|
|
+ imHelper.dismiss(userId.toString(), roomId);
|
|
|
+ courseScheduleStudentMusicSheetService.getDao().closePlayStatus(courseSchedule.getId(),null);
|
|
|
+ log.info("leaveRoomSuccess dismiss the room: {},userId: {}", roomId, userId);
|
|
|
+ } else {
|
|
|
+ ImNetworkRoomMemberChangedMessage msg = new ImNetworkRoomMemberChangedMessage(roomMember,ImNetworkRoomMemberChangedEnum.LEAVE);
|
|
|
+ imHelper.publishMessage(userId.toString(), roomId, msg);
|
|
|
+ imHelper.quit(new String[]{userId.toString()}, roomId);
|
|
|
+ log.info("leaveRoomSuccess quit group: roomId={},userId: {}", roomId, userId);
|
|
|
+ }
|
|
|
+ //删房间用户信息
|
|
|
+ imNetworkRoomMemberService.getDao().deleteById(roomMember.getId());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void sendImPlayMidiMessage(ImNetworkCustomMessage customMessage) throws Exception {
|
|
|
+ SysUser sysUser = Optional.ofNullable(sysUserFeignService.queryUserInfo()).
|
|
|
+ orElseThrow(()-> new BizException("请登录"));
|
|
|
+ Long userId = sysUser.getId();
|
|
|
+ Long courseScheduleId = customMessage.getCourseScheduleId();
|
|
|
+ log.info("sendImPlayMidiMessage: roomId={}, userId={}", courseScheduleId, userId);
|
|
|
+ ImNetworkMetronomeMessage displayMessage = new ImNetworkMetronomeMessage(customMessage);
|
|
|
+ imHelper.publishMessage(userId.toString(), courseScheduleId.toString(), displayMessage, 0);
|
|
|
+ //记录节拍器信息
|
|
|
+ courseScheduleStudentPaymentService.getDao().adjustPlayMidi(courseScheduleId,userId,customMessage.toString());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void pushDownloadMusicSheetMsg(String roomId,Long accompanimentId) throws Exception {
|
|
|
+ SysUser sysUser = Optional.ofNullable(sysUserFeignService.queryUserInfo()).
|
|
|
+ orElseThrow(()-> new BizException("请登录"));
|
|
|
+ Long courseScheduleId = Long.parseLong(roomId);
|
|
|
+ List<CourseScheduleStudentMusicSheetResult> scheduleStudentMusicSheetResults = courseScheduleStudentMusicSheetService.getDao().
|
|
|
+ queryBySheetIdAndCourseId(accompanimentId, courseScheduleId, null, null, 0);
|
|
|
+
|
|
|
+ MusicSheetAccompaniment accompaniment = musicSheetAccompanimentService.getById(accompanimentId);
|
|
|
+ if (scheduleStudentMusicSheetResults.size() == 0) {
|
|
|
+ //第一次下载,生成数据
|
|
|
+ List<CourseScheduleStudentPayment> courseScheduleStudentPayments = courseScheduleStudentPaymentService.getDao().queryByCourseId(courseScheduleId);
|
|
|
+ Set<Long> studentIds = courseScheduleStudentPayments.stream().map(e -> e.getUserId()).collect(Collectors.toSet());
|
|
|
+ studentIds.forEach(e -> {
|
|
|
+ CourseScheduleStudentMusicSheetResult musicSheet = new CourseScheduleStudentMusicSheetResult();
|
|
|
+ musicSheet.setMusicSheetAccompanimentId(accompanimentId);
|
|
|
+ musicSheet.setSpeed(accompaniment.getSpeed());
|
|
|
+ musicSheet.setCourseScheduleId(courseScheduleId);
|
|
|
+ musicSheet.setUserId(e);
|
|
|
+ scheduleStudentMusicSheetResults.add(musicSheet);
|
|
|
+ });
|
|
|
+ CourseScheduleStudentMusicSheetResult musicSheet = new CourseScheduleStudentMusicSheetResult();
|
|
|
+ musicSheet.setMusicSheetAccompanimentId(accompanimentId);
|
|
|
+ musicSheet.setSpeed(accompaniment.getSpeed());
|
|
|
+ musicSheet.setCourseScheduleId(courseScheduleId);
|
|
|
+ musicSheet.setUserId(sysUser.getId());
|
|
|
+ musicSheet.setUserType(1);
|
|
|
+ scheduleStudentMusicSheetResults.add(musicSheet);
|
|
|
+ courseScheduleStudentMusicSheetService.getDao().batchInsert(scheduleStudentMusicSheetResults);
|
|
|
+ }
|
|
|
+ ImNetworkMusicSheetDownloadMessage msg = new ImNetworkMusicSheetDownloadMessage(
|
|
|
+ JSON.parseObject(JSON.toJSONString(accompaniment), ImNetworkMusicSheetDownloadMessageContent.class));
|
|
|
+ imHelper.publishMessage(sysUser.getId().toString(), roomId, msg, 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void display(ImNetworkDisplayDataDto displayData) throws Exception {
|
|
|
+ log.info("display in data = {}", displayData);
|
|
|
+ SysUser sysUser = Optional.ofNullable(sysUserFeignService.queryUserInfo()).
|
|
|
+ orElseThrow(()-> new BizException("请登录"));
|
|
|
+
|
|
|
+ StringBuffer display = new StringBuffer("display://type=").append(displayData.getType().ordinal()).append("?userId=");
|
|
|
+ switch (displayData.getType()) {
|
|
|
+ case NONE:
|
|
|
+ //清空当前 room 的 display
|
|
|
+ display = new StringBuffer();
|
|
|
+ break;
|
|
|
+ case TEACHER:
|
|
|
+ CourseSchedule courseSchedule = courseScheduleService.getById(displayData.getRoomId());
|
|
|
+ display.append(courseSchedule.getTeacherId()).append("?uri=");
|
|
|
+ break;
|
|
|
+ case SCREEN:
|
|
|
+ display.append(sysUser.getId()).append("?uri=");
|
|
|
+ break;
|
|
|
+ case STUDENT:
|
|
|
+ display.append(displayData.getUserId()).append("?uri=").append(displayData.getUri());
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ display.append(sysUser.getId()).append("?uri=").append(displayData.getUri());
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ ImNetworkRoom room = baseMapper.findByRoomId(displayData.getRoomId());
|
|
|
+ room.setDisplay(display.toString());
|
|
|
+ this.updateDisplay(sysUser.getId(),room);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void batchControlDevice(ImNetworkDeviceControlDto deviceControl) throws Exception {
|
|
|
+ ImNetworkDeviceTypeEnum deviceType = deviceControl.getDeviceType();
|
|
|
+ if (deviceControl.getUserId() != null) {
|
|
|
+ controlDevice(deviceControl);
|
|
|
+ } else {
|
|
|
+ if (deviceType == ImNetworkDeviceTypeEnum.EXAM_SONG ||
|
|
|
+ deviceType == ImNetworkDeviceTypeEnum.MUSIC_SHEET ||
|
|
|
+ deviceType == ImNetworkDeviceTypeEnum.ACCOMPANIMENT) {
|
|
|
+ List<CourseScheduleStudentPayment> studentPayments = courseScheduleStudentPaymentService.getDao().queryByCourseId(Long.parseLong(deviceControl.getRoomId()));
|
|
|
+ for (CourseScheduleStudentPayment studentPayment : studentPayments) {
|
|
|
+ deviceControl.setUserId(studentPayment.getUserId());
|
|
|
+ controlDevice(deviceControl);
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }else {
|
|
|
+ List<ImNetworkRoomMember> roomMembers = imNetworkRoomMemberService.getDao().findByRoomAndRole(deviceControl.getRoomId(), 0);
|
|
|
+ if (!CollectionUtils.isEmpty(roomMembers)) {
|
|
|
+ for (ImNetworkRoomMember roomMember : roomMembers) {
|
|
|
+ deviceControl.setUserId(roomMember.getUserId());
|
|
|
+ controlDevice(deviceControl);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void controlDevice(ImNetworkDeviceControlDto deviceControl) throws Exception {
|
|
|
+ log.info("controlDevice in deviceControl = {}", deviceControl);
|
|
|
+ SysUser sysUser = Optional.ofNullable(sysUserFeignService.queryUserInfo()).
|
|
|
+ orElseThrow(()-> new BizException("请登录"));
|
|
|
+ String roomId = deviceControl.getRoomId();
|
|
|
+ Long userId = deviceControl.getUserId();
|
|
|
+ if(deviceControl.getEnable()){
|
|
|
+ long scheduleId = Long.parseLong(roomId);
|
|
|
+ ImNetworkDeviceStateChangedMessage deviceResourceMessage = new ImNetworkDeviceStateChangedMessage(deviceControl.getDeviceType().ordinal(),deviceControl.getEnable());
|
|
|
+ deviceResourceMessage.setUserId(userId.toString());
|
|
|
+ switch (deviceControl.getDeviceType()) {
|
|
|
+ case EXAM_SONG:
|
|
|
+ ImNetworkRoomMusicSheetDownloadData msg = courseScheduleStudentPaymentService.getMemberExamSong(scheduleId, userId);
|
|
|
+ msg.setEnable(deviceControl.getEnable());
|
|
|
+ courseScheduleStudentPaymentService.getDao().adjustExamSong(scheduleId,userId, JSON.toJSONString(msg));
|
|
|
+ imHelper.publishMessage(userId.toString(), deviceControl.getRoomId(), deviceResourceMessage, 1);
|
|
|
+ break;
|
|
|
+ case MUSIC_SHEET:
|
|
|
+ //关闭所有曲目播放
|
|
|
+ courseScheduleStudentMusicSheetService.getDao().closePlayStatus(scheduleId,userId);
|
|
|
+ //打开原音
|
|
|
+ courseScheduleStudentMusicSheetService.getDao().openPlayStatus(scheduleId,deviceControl.getMusicScoreAccompanimentId(),userId);
|
|
|
+ deviceResourceMessage.setMusicScoreAccompanimentId(deviceControl.getMusicScoreAccompanimentId());
|
|
|
+ deviceResourceMessage.setUserId(userId.toString());
|
|
|
+ deviceResourceMessage.setSoundVolume(deviceControl.getSoundVolume());
|
|
|
+ imHelper.publishMessage(sysUser.getId().toString(), roomId, deviceResourceMessage, 1);
|
|
|
+ break;
|
|
|
+ case ACCOMPANIMENT:
|
|
|
+ //关闭所有曲目播放
|
|
|
+ courseScheduleStudentMusicSheetService.getDao().closePlayStatus(scheduleId,userId);
|
|
|
+ //打开伴奏
|
|
|
+ courseScheduleStudentMusicSheetService.getDao().openAccompanimentPlayStatus(scheduleId, deviceControl.getMusicScoreAccompanimentId(),userId);
|
|
|
+ deviceResourceMessage.setMusicScoreAccompanimentId(deviceControl.getMusicScoreAccompanimentId());
|
|
|
+ deviceResourceMessage.setUserId(userId.toString());
|
|
|
+ deviceResourceMessage.setSoundVolume(deviceControl.getSoundVolume());
|
|
|
+ imHelper.publishMessage(sysUser.getId().toString(), roomId, deviceResourceMessage, 1);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ //邀请打开指定设备权限
|
|
|
+ ImNetworkControlDeviceNotifyMessage message = new ImNetworkControlDeviceNotifyMessage(ImNetworkActionEnum.INVITE.ordinal());
|
|
|
+// msg.setTicket(ticket);
|
|
|
+ message.setType(deviceControl.getDeviceType().ordinal());
|
|
|
+ message.setOpUserId(sysUser.getId().toString());
|
|
|
+ message.setOpUserName(sysUser.getUsername());
|
|
|
+ imHelper.publishMessage(sysUser.getId().toString(), userId.toString(), roomId, message);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ ImNetworkRoomMember roomMember = imNetworkRoomMemberService.getById(roomId);
|
|
|
+ long scheduleId = Long.parseLong(roomId);
|
|
|
+ switch (deviceControl.getDeviceType()) {
|
|
|
+ case CAMERA:
|
|
|
+ roomMember.setCameraFlag(deviceControl.getEnable());
|
|
|
+ break;
|
|
|
+ case MICROPHONE:
|
|
|
+ roomMember.setMicFlag(deviceControl.getEnable());
|
|
|
+ break;
|
|
|
+ case HAND_UP:
|
|
|
+ roomMember.setHandFlag(deviceControl.getEnable());
|
|
|
+ break;
|
|
|
+ case MUSIC_MODE:
|
|
|
+ roomMember.setMusicModeFlag(deviceControl.getEnable());
|
|
|
+ break;
|
|
|
+ case EXAM_SONG:
|
|
|
+ ImNetworkRoomMusicSheetDownloadData msg = courseScheduleStudentPaymentService.getMemberExamSong(scheduleId, userId);
|
|
|
+ msg.setEnable(deviceControl.getEnable());
|
|
|
+ courseScheduleStudentPaymentService.getDao().adjustExamSong(scheduleId,userId, JSON.toJSONString(msg));
|
|
|
+ break;
|
|
|
+ case MUSIC_SHEET:
|
|
|
+ case ACCOMPANIMENT:
|
|
|
+ //关闭所有曲目播放
|
|
|
+ courseScheduleStudentMusicSheetService.getDao().closePlayStatus(scheduleId,userId);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if(deviceControl.getDeviceType() != ImNetworkDeviceTypeEnum.MUSIC_SHEET &&
|
|
|
+ deviceControl.getDeviceType() != ImNetworkDeviceTypeEnum.EXAM_SONG &&
|
|
|
+ deviceControl.getDeviceType() != ImNetworkDeviceTypeEnum.ACCOMPANIMENT){
|
|
|
+ imNetworkRoomMemberService.getDao().updateById(roomMember);
|
|
|
+ }
|
|
|
+ ImNetworkDeviceStateChangedMessage deviceResourceMessage = new ImNetworkDeviceStateChangedMessage(deviceControl.getDeviceType().ordinal(),deviceControl.getEnable());
|
|
|
+ deviceResourceMessage.setUserId(userId.toString());
|
|
|
+ BasicUserInfo basicUserInfo = teacherDao.getBasicUserInfo(userId);
|
|
|
+ if (Objects.nonNull(basicUserInfo)) {
|
|
|
+ deviceResourceMessage.setUserName(basicUserInfo.getUsername());
|
|
|
+ }
|
|
|
+ imHelper.publishMessage(sysUser.getId().toString(), roomId, deviceResourceMessage, 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void approveControlDevice(ImNetworkDeviceControlDto deviceControl) throws Exception {
|
|
|
+ log.info("approveControlDevice: deviceControl={}", deviceControl);
|
|
|
+ SysUser sysUser = Optional.ofNullable(sysUserFeignService.queryUserInfo()).
|
|
|
+ orElseThrow(()-> new BizException("请登录"));
|
|
|
+ ImNetworkRoomMember roomMember = imNetworkRoomMemberService.getById(deviceControl.getRoomId());
|
|
|
+ switch (deviceControl.getDeviceType()) {
|
|
|
+ case CAMERA:
|
|
|
+ roomMember.setCameraFlag(deviceControl.getEnable());
|
|
|
+ break;
|
|
|
+ case EXAM_SONG:
|
|
|
+ long scheduleId = Long.parseLong(deviceControl.getRoomId());
|
|
|
+ ImNetworkRoomMusicSheetDownloadData msg = courseScheduleStudentPaymentService.getMemberExamSong(scheduleId, sysUser.getId());
|
|
|
+ msg.setEnable(deviceControl.getEnable());
|
|
|
+ courseScheduleStudentPaymentService.getDao().adjustExamSong(scheduleId, sysUser.getId(), JSON.toJSONString(msg));
|
|
|
+ break;
|
|
|
+ case MICROPHONE:
|
|
|
+ roomMember.setMicFlag(deviceControl.getEnable());
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if(deviceControl.getDeviceType() == ImNetworkDeviceTypeEnum.CAMERA ||
|
|
|
+ deviceControl.getDeviceType() == ImNetworkDeviceTypeEnum.MICROPHONE){
|
|
|
+ imNetworkRoomMemberService.getDao().updateById(roomMember);
|
|
|
+ }
|
|
|
+ ImNetworkControlDeviceNotifyMessage msg = new ImNetworkControlDeviceNotifyMessage(ImNetworkActionEnum.APPROVE.ordinal());
|
|
|
+ msg.setType(deviceControl.getDeviceType().ordinal());
|
|
|
+ msg.setOpUserId(sysUser.getId().toString());
|
|
|
+ msg.setOpUserName(sysUser.getUsername());
|
|
|
+ imHelper.publishMessage(sysUser.getId().toString(),deviceControl.getUserId().toString(), deviceControl.getRoomId(), msg);
|
|
|
+
|
|
|
+ ImNetworkDeviceStateChangedMessage deviceResourceMessage = new ImNetworkDeviceStateChangedMessage(deviceControl.getDeviceType().ordinal(),deviceControl.getEnable());
|
|
|
+ deviceResourceMessage.setUserId(sysUser.getId().toString());
|
|
|
+ imHelper.publishMessage(sysUser.getId().toString(), deviceControl.getRoomId(), deviceResourceMessage, 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void deviceStatusSync(ImNetworkDeviceControlDto deviceStatusSync) throws Exception {
|
|
|
+ log.info("deviceStatusSync: deviceStatusSync={}", deviceStatusSync);
|
|
|
+ SysUser sysUser = Optional.ofNullable(sysUserFeignService.queryUserInfo()).
|
|
|
+ orElseThrow(()-> new BizException("请登录"));
|
|
|
+ ImNetworkDeviceTypeEnum deviceType = deviceStatusSync.getDeviceType();
|
|
|
+ ImNetworkRoomMember roomMember = imNetworkRoomMemberService.getById(deviceStatusSync.getRoomId());
|
|
|
+ switch (deviceType) {
|
|
|
+ case CAMERA:
|
|
|
+ roomMember.setCameraFlag(deviceStatusSync.getEnable());
|
|
|
+ break;
|
|
|
+ case MICROPHONE:
|
|
|
+ roomMember.setMicFlag(deviceStatusSync.getEnable());
|
|
|
+ break;
|
|
|
+ case HAND_UP:
|
|
|
+ roomMember.setHandFlag(deviceStatusSync.getEnable());
|
|
|
+ break;
|
|
|
+ case MUSIC_MODE:
|
|
|
+ roomMember.setMusicModeFlag(deviceStatusSync.getEnable());
|
|
|
+ break;
|
|
|
+ case EXAM_SONG:
|
|
|
+ long scheduleId = Long.parseLong(deviceStatusSync.getRoomId());
|
|
|
+ ImNetworkRoomMusicSheetDownloadData msg = courseScheduleStudentPaymentService.getMemberExamSong(scheduleId, sysUser.getId());
|
|
|
+ msg.setEnable(deviceStatusSync.getEnable());
|
|
|
+ courseScheduleStudentPaymentService.getDao().adjustExamSong(scheduleId, sysUser.getId(), JSON.toJSONString(msg));
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if(deviceType == ImNetworkDeviceTypeEnum.CAMERA ||
|
|
|
+ deviceType == ImNetworkDeviceTypeEnum.MICROPHONE ||
|
|
|
+ deviceType == ImNetworkDeviceTypeEnum.HAND_UP ||
|
|
|
+ deviceType == ImNetworkDeviceTypeEnum.MUSIC_MODE){
|
|
|
+ imNetworkRoomMemberService.getDao().updateById(roomMember);
|
|
|
+ }
|
|
|
+ ImNetworkDeviceStateChangedMessage deviceResourceMessage = new ImNetworkDeviceStateChangedMessage(deviceType.ordinal(),deviceStatusSync.getEnable());
|
|
|
+ deviceResourceMessage.setUserId(sysUser.getId().toString());
|
|
|
+ ImNetworkRoom room = this.getById(deviceStatusSync.getRoomId());
|
|
|
+ deviceResourceMessage.setSoundVolume(room.getSoundVolume());
|
|
|
+ imHelper.publishMessage(sysUser.getId().toString(), deviceStatusSync.getRoomId(), deviceResourceMessage, 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void rejectControlDevice(ImNetworkDeviceControlDto deviceControl) throws Exception {
|
|
|
+ log.info("rejectControlDevice: deviceControl={}", deviceControl);
|
|
|
+ SysUser sysUser = Optional.ofNullable(sysUserFeignService.queryUserInfo()).
|
|
|
+ orElseThrow(()-> new BizException("请登录"));
|
|
|
+ ImNetworkControlDeviceNotifyMessage msg = new ImNetworkControlDeviceNotifyMessage(ImNetworkActionEnum.REJECT.ordinal());
|
|
|
+ msg.setType(deviceControl.getDeviceType().ordinal());
|
|
|
+ msg.setOpUserId(sysUser.getId().toString());
|
|
|
+ msg.setOpUserName(sysUser.getUsername());
|
|
|
+ imHelper.publishMessage(sysUser.getId().toString(),deviceControl.getUserId().toString(), deviceControl.getRoomId(), msg);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void musicSheetDownNotify(String roomId, Long accompanimentId, Integer status) throws Exception {
|
|
|
+ log.info("musicSheetDownNotify: roomId={},accompanimentId={},status={}", roomId,accompanimentId,status);
|
|
|
+ SysUser sysUser = Optional.ofNullable(sysUserFeignService.queryUserInfo()).
|
|
|
+ orElseThrow(()-> new BizException("请登录"));
|
|
|
+ Long scheduleId = Long.parseLong(roomId);
|
|
|
+ List<CourseScheduleStudentMusicSheetResult> studentMusicSheetResults = courseScheduleStudentMusicSheetService.getDao().queryBySheetIdAndCourseId(accompanimentId, scheduleId, sysUser.getId(), null, null);
|
|
|
+ if(CollectionUtils.isEmpty(studentMusicSheetResults)){
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (accompanimentId != null) {
|
|
|
+ Optional.ofNullable(musicSheetAccompanimentService.getById(accompanimentId)).
|
|
|
+ orElseThrow(()-> new BizException("曲目信息不存在"));
|
|
|
+ //修改下载状态
|
|
|
+ CourseScheduleStudentMusicSheetResult musicSheetResult = studentMusicSheetResults.get(0);
|
|
|
+ musicSheetResult.setDownStatus(status);
|
|
|
+ courseScheduleStudentMusicSheetService.updateById(musicSheetResult);
|
|
|
+ }
|
|
|
+ //给老师发送学员曲目下载状态
|
|
|
+ CourseSchedule courseSchedule = courseScheduleService.getById(scheduleId);
|
|
|
+ ImNetworkMusicSheetDownloadStatusMessage statusMessage = new ImNetworkMusicSheetDownloadStatusMessage(status,studentMusicSheetResults);
|
|
|
+ imHelper.publishMessage(sysUser.getId().toString(), courseSchedule.getTeacherId().toString(), roomId, statusMessage);
|
|
|
+ }
|
|
|
+
|
|
|
+ //校验用户是否提前进入教室
|
|
|
+ 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);
|
|
|
+ String display = "";
|
|
|
+ if (userRole == UserRoleEnum.TEACHER) {
|
|
|
+ display = "display://type=1?userId=" + userId + "?uri=";
|
|
|
+ }
|
|
|
+ if(Objects.isNull(room)){
|
|
|
+ room = new ImNetworkRoom();
|
|
|
+ //创建房间
|
|
|
+ room.setCourseScheduleId(courseId);
|
|
|
+ room.setRoomId(roomId);
|
|
|
+ room.setCreateTime(now);
|
|
|
+ room.setUpdateTime(now);
|
|
|
+ room.setDisplay(display);
|
|
|
+ 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 {
|
|
|
+ if(userRole == UserRoleEnum.TEACHER){
|
|
|
+ //修改节拍器
|
|
|
+ room.setDisplay(display);
|
|
|
+ this.updateDisplay(userId,room);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return room;
|
|
|
+ }
|
|
|
+
|
|
|
+ //修改节拍器
|
|
|
+ public void updateDisplay(Long userId,ImNetworkRoom room) throws Exception {
|
|
|
+ baseMapper.updateById(room);
|
|
|
+ //发送display改动通知
|
|
|
+ ImNetworkDisplayMessage displayMessage = new ImNetworkDisplayMessage(room.getDisplay());
|
|
|
+ imHelper.publishMessage(userId.toString(), room.getRoomId(), displayMessage, 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ public boolean isUserDisplay(String display, Long userId) {
|
|
|
+ boolean result = false;
|
|
|
+ if (!display.isEmpty() && display.contains("userId=" + userId)) {
|
|
|
+ if (display.contains("type=0") || display.contains("type=1") || display.contains("type=3")) {
|
|
|
+ result = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+}
|