فهرست منبع

Merge branch 'feature/0803-im'

zouxuan 2 سال پیش
والد
کامیت
a30b375154

+ 2 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImNetworkRoomService.java

@@ -5,6 +5,7 @@ import com.yonge.cooleshow.biz.dal.dao.ImNetworkRoomDao;
 import com.yonge.cooleshow.biz.dal.dto.*;
 import com.yonge.cooleshow.biz.dal.entity.ImNetworkRoom;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.RoleEnum;
 import com.yonge.cooleshow.common.entity.BaseResponse;
 
 import java.util.List;
@@ -20,7 +21,7 @@ public interface ImNetworkRoomService extends IService<ImNetworkRoom> {
     ImNetworkRoomDao getDao();
 
     //加入网络教室
-    BaseResponse<ImNetworkRoomResult> joinRoom(String roomId, ClientEnum clientType) throws Exception;
+    BaseResponse<ImNetworkRoomResult> joinRoom(String roomId, RoleEnum userRole);
 
     BaseResponse<ImNetworkRoomResult> roomInfo(ImNetworkBaseDto imNetworkBaseDto);
 

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/RoomService.java

@@ -26,7 +26,7 @@ public interface RoomService extends IService<ImNetworkRoom> {
     RTCRoomConfig getRtcRoomConfig(String serviceProvider, ImNetworkRoomMember roomMember);
 
     //用户成功推出房间
-    void quitRoomSuccess(RoleEnum roleEnum, ImNetworkRoomMember roomMember, String serviceProvider) throws Exception;
+    void quitRoomSuccess(RoleEnum roleEnum,String imUserId,String roomId, String serviceProvider) throws Exception;
 
     //修改节拍器
     void updateDisplay(String imUserId, ImNetworkRoom room, String serviceProvider) throws Exception;

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupServiceImpl.java

@@ -1211,6 +1211,7 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void joinImGroup(String roomId, BasicUserInfo userInfo, String serverProvider, List<Long> studentIds) throws Exception {
 
         String joinImGroupKey = "joinImGroup:" + roomId;

+ 94 - 83
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImNetworkRoomServiceImpl.java

@@ -6,7 +6,6 @@ import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
 import com.microsvc.toolkit.middleware.rtc.RTCRoomPluginService;
-import com.microsvc.toolkit.middleware.rtc.impl.TencentCloudRTCPlugin;
 import com.microsvc.toolkit.middleware.rtc.message.TencentRequest;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.ImNetworkRoomDao;
@@ -31,6 +30,7 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.support.TransactionTemplate;
 import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
@@ -83,6 +83,8 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
     private ImNetworkRoomMemberStatusService imNetworkRoomMemberStatusService;
     @Resource
     private ImService imService;
+    @Resource
+    private TransactionTemplate transactionTemplate;
 
     @Override
     public ImNetworkRoomDao getDao() {
@@ -90,17 +92,12 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
-    public BaseResponse<ImNetworkRoomResult> joinRoom(String roomId, ClientEnum clientType) throws Exception {
+    public BaseResponse<ImNetworkRoomResult> joinRoom(String roomId, RoleEnum userRole) {
         // 当前登录用户ID
         Long userId = sysUserService.getUserId();
         CourseSchedule courseSchedule = Optional.ofNullable(courseScheduleService.getById(roomId)).
                 orElseThrow(()->new BizException("房间信息不存在"));
 
-        RoleEnum userRole = RoleEnum.RoleStudent;
-        if(clientType == ClientEnum.TEACHER){
-            userRole = RoleEnum.RoleTeacher;
-        }
         log.info("joinRoom params:roomId:{},userRole:{},userId:{}",roomId,userRole,userId);
         BasicUserInfo sysUser = Optional.ofNullable(teacherDao.getBasicUserInfo(userId)).
                 orElseThrow(()-> new BizException("用户信息不存在"));
@@ -110,62 +107,77 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
         if (roomNotStart(courseSchedule)) {
             return BaseResponse.failed(ErrorEnum.ROOM_NOT_START);
         }
+        //获取老师基本信息
+        BasicUserInfo basicUserInfo = teacherDao.getBasicUserInfo(courseSchedule.getTeacherId());
+        //XX分钟关闭房间
+        String configValue = sysConfigDao.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_PRACTICE_ROOM_MINUTE);
+
         ImNetworkRoomResult joinRoomResult = new ImNetworkRoomResult();
-        //初始化房间信息
         String imUserId = imGroupService.getImUserId(sysUser.getUserId(), userRole);
-        ImNetworkRoom room = roomService.initRoom(roomId,userRole,imUserId);
-        BeanUtils.copyProperties(room,joinRoomResult);
-        //定时销毁房间
-        //初始化房间用户信息
-        ImNetworkRoomMember roomMember = imNetworkRoomMemberService.initRoomMember(roomId,sysUser,userRole,!courseSchedule.getMuteAll());
         List<CourseScheduleStudentMusicSheetResult> studentMusicSheetResults =
-                courseScheduleStudentMusicSheetService.getDao().queryBySheetIdAndCourseId(null, Long.parseLong(roomId), null, null, null);
-        if(!CollectionUtils.isEmpty(studentMusicSheetResults)){
-            List<CourseScheduleStudentMusicSheetResult> musicScores = studentMusicSheetResults.stream().
-                    filter(e -> e.getUserId().equals(userId)).collect(Collectors.toList());
-            String toJSONString = JSON.toJSONString(musicScores, SerializerFeature.DisableCircularReferenceDetect);
-            List<CourseScheduleStudentMusicSheetResult> lists = JSON.parseArray(toJSONString, CourseScheduleStudentMusicSheetResult.class);
-            roomMember.setScheduleStudentMusicScores(lists);
-        }
-        ImNetworkRoomMemberResult memberResult = JSONObject.parseObject(JSONObject.toJSONString(roomMember), ImNetworkRoomMemberResult.class);
-        memberResult.setJoinTime(roomMember.getJoinTime().getTime());
-        memberResult.setCamera(roomMember.isCameraFlag());
-        memberResult.setMicrophone(roomMember.isMicFlag());
-        memberResult.setMusicModeOn(roomMember.isMusicModeFlag());
-        memberResult.setHandUpOn(roomMember.isHandFlag());
-        joinRoomResult.setUserInfo(memberResult);
-        //获取教室剩余时长
-        joinRoomResult.setSurplusTime(DateUtil.secondsBetween(now, courseSchedule.getEndTime()));
-        //获取房间所有成员
-        List<ImNetworkRoomMemberResult> members = imNetworkRoomMemberService.getDao().queryByRoomId(roomId);
-        //如果是老师,
-        if(userRole == RoleEnum.RoleTeacher){
-            //重置节拍器数据
-            imNetworkRoomMemberStatusService.lambdaUpdate().set(ImNetworkRoomMemberStatus::getPlayMidi,null)
-                            .eq(ImNetworkRoomMemberStatus::getRoomId,roomId).update();
-            //获取所有学员的伴奏下载详情
-            setMusicSheetList(members,Long.parseLong(roomId));
-        }else {
-            //获取节拍器信息
-            joinRoomResult.setPlayMidiJson(imNetworkRoomMemberStatusService.getMemberMidi(roomMember));
-        }
-        joinRoomResult.setMembers(members);
-        //课程结束后关闭教室的时间
-        joinRoomResult.setAutoCloseNetworkRoomTime(sysConfigDao.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_PRACTICE_ROOM_MINUTE));
-
-        // 创建IM群聊
-        //获取老师基本信息
-        BasicUserInfo basicUserInfo = teacherDao.getBasicUserInfo(courseSchedule.getTeacherId());
+                courseScheduleStudentMusicSheetService.getDao().queryBySheetIdAndCourseId(null,
+                        Long.parseLong(roomId), null, null, null);
         //获取学员列表
         List<CourseScheduleStudentPayment> studentPayments =
                 courseScheduleStudentPaymentService.lambdaQuery().eq(CourseScheduleStudentPayment::getCourseId,roomId).list();
         List<Long> studentIds = studentPayments.stream().map(CourseScheduleStudentPayment::getUserId).collect(Collectors.toList());
-        //创建并加入群组
-        basicUserInfo.setImUserId(imGroupService.getImUserId(basicUserInfo.getUserId(),RoleEnum.RoleTeacher));
-        imGroupService.joinImGroup(roomId, basicUserInfo,
-                courseSchedule.getServiceProvider(), studentIds);
-        //获取腾讯所需基本信息配置
-        joinRoomResult.setRtcRoomConfig(roomService.getRtcRoomConfig(courseSchedule.getServiceProvider(),roomMember));
+        //事务处理
+        this.transaction(() -> {
+            //初始化房间信息
+            ImNetworkRoom room = null;
+            try {
+                room = roomService.initRoom(roomId,userRole,imUserId);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+            BeanUtils.copyProperties(room,joinRoomResult);
+            //定时销毁房间
+            //初始化房间用户信息
+            ImNetworkRoomMember roomMember = imNetworkRoomMemberService.initRoomMember(roomId,sysUser,userRole,!courseSchedule.getMuteAll());
+            if(!CollectionUtils.isEmpty(studentMusicSheetResults)){
+                List<CourseScheduleStudentMusicSheetResult> musicScores = studentMusicSheetResults.stream().
+                        filter(e -> e.getUserId().equals(userId)).collect(Collectors.toList());
+                String toJSONString = JSON.toJSONString(musicScores, SerializerFeature.DisableCircularReferenceDetect);
+                roomMember.setScheduleStudentMusicScores(JSON.parseArray(toJSONString, CourseScheduleStudentMusicSheetResult.class));
+            }
+            ImNetworkRoomMemberResult memberResult = JSONObject.parseObject(JSONObject.toJSONString(roomMember), ImNetworkRoomMemberResult.class);
+            memberResult.setJoinTime(roomMember.getJoinTime().getTime());
+            memberResult.setCamera(roomMember.isCameraFlag());
+            memberResult.setMicrophone(roomMember.isMicFlag());
+            memberResult.setMusicModeOn(roomMember.isMusicModeFlag());
+            memberResult.setHandUpOn(roomMember.isHandFlag());
+            joinRoomResult.setUserInfo(memberResult);
+            //获取教室剩余时长
+            joinRoomResult.setSurplusTime(DateUtil.secondsBetween(now, courseSchedule.getEndTime()));
+            //获取房间所有成员
+            List<ImNetworkRoomMemberResult> members = imNetworkRoomMemberService.getDao().queryByRoomId(roomId);
+            //如果是老师,
+            if(userRole == RoleEnum.RoleTeacher){
+                //重置节拍器数据
+                imNetworkRoomMemberStatusService.lambdaUpdate().set(ImNetworkRoomMemberStatus::getPlayMidi,null)
+                        .eq(ImNetworkRoomMemberStatus::getRoomId,roomId).update();
+                //获取所有学员的伴奏下载详情
+                setMusicSheetList(members,Long.parseLong(roomId));
+            }else {
+                //获取节拍器信息
+                joinRoomResult.setPlayMidiJson(imNetworkRoomMemberStatusService.getMemberMidi(roomMember));
+            }
+            joinRoomResult.setMembers(members);
+            //课程结束后关闭教室的时间
+            joinRoomResult.setAutoCloseNetworkRoomTime(configValue);
+            // 创建IM群聊
+            //创建并加入群组
+            basicUserInfo.setImUserId(imGroupService.getImUserId(basicUserInfo.getUserId(),RoleEnum.RoleTeacher));
+            try {
+                imGroupService.joinImGroup(roomId, basicUserInfo,
+                        courseSchedule.getServiceProvider(), studentIds);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+            //获取腾讯所需基本信息配置
+            joinRoomResult.setRtcRoomConfig(roomService.getRtcRoomConfig(courseSchedule.getServiceProvider(),roomMember));
+        });
+
         joinRoomResult.setGroupId(roomId);
         joinRoomResult.setStudentNums(studentIds.size());
         return BaseResponse.success(joinRoomResult);
@@ -304,15 +316,12 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
     }
 
     @Override
-    @Transactional(rollbackFor = Exception.class)
-    public void quitRoomSuccess(String roomId, String imUserId) throws Exception {
+    public void quitRoomSuccess(String roomId, String imUserId) {
         // 客户端类型
         ClientEnum clientType = ClientEnum.valueOf(imGroupService.analysisImUserClient(imUserId));
         // 网络教室用户身份
-        RoleEnum userRole = RoleEnum.RoleTeacher;
-        if (ClientEnum.STUDENT == clientType) {
-            userRole = RoleEnum.RoleStudent;
-        }
+        RoleEnum userRole = clientType == ClientEnum.TEACHER ? RoleEnum.RoleTeacher : RoleEnum.RoleStudent;
+
         log.info("quitRoomSuccess: roomId={}, imUserId={}", roomId, imUserId);
         //防止幂等
         String QUIT_ROOM_SUCCESS = "quitRoomSuccess:";
@@ -321,33 +330,28 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
             log.info("quitRoomSuccess break: roomId={}, imUserId={}", roomId, imUserId);
             return;
         }
-        ImNetworkRoomMember roomMember = imNetworkRoomMemberService.lambdaQuery()
-                .eq(ImNetworkRoomMember::getUserId, imUserId)
-                .eq(ImNetworkRoomMember::getRoomId, roomId)
-                .eq(ImNetworkRoomMember::getRole, userRole.getValue())
-                .last("LIMIT 1").one();
-        if(Objects.isNull(roomMember)){
-            return;
-        }
 
         CourseSchedule courseSchedule = Optional.ofNullable(courseScheduleService.getById(roomId))
                 .orElseThrow(()->new BizException("房间信息不存在"));
         Long courseScheduleId = courseSchedule.getId();
         Long userId = Long.parseLong(imGroupService.analysisImUserId(imUserId));
-        if(RoleEnum.RoleTeacher == userRole){
-            teacherAttendanceService.signOut(userId,courseSchedule);
-        }else {
-            //记录考勤签退
-            studentAttendanceService.signOut(userId,courseSchedule);
-        }
 
-        if (RoleEnum.RoleTeacher == userRole ||
-                imNetworkRoomMemberService.lambdaQuery().eq(ImNetworkRoomMember::getRoomId,roomId).count() <= 1){
-            //如果老师退出房间,初始化节拍器和伴奏播放配置
-            courseScheduleStudentMusicSheetService.getDao().closePlayStatus(courseScheduleId,null);
-        }
-        //退出房间
-        roomService.quitRoomSuccess(userRole,roomMember,courseSchedule.getServiceProvider());
+        this.transaction(()->{
+            if(RoleEnum.RoleTeacher == userRole){
+                teacherAttendanceService.signOut(userId,courseSchedule);
+                //如果老师退出房间,初始化节拍器和伴奏播放配置
+                courseScheduleStudentMusicSheetService.getDao().closePlayStatus(courseScheduleId,null);
+            }else {
+                //记录考勤签退
+                studentAttendanceService.signOut(userId,courseSchedule);
+            }
+            //退出房间
+            try {
+                roomService.quitRoomSuccess(userRole,imUserId,roomId,courseSchedule.getServiceProvider());
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        });
     }
 
 
@@ -669,4 +673,11 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
         Date addMinutes = DateUtil.addMinutes(courseSchedule.getStartTime(), Integer.parseInt(courseBeforeBufferTime));
         return courseSchedule.getStartTime().compareTo(addMinutes) > 0;
     }
+
+    public void transaction(Runnable runnable) {
+        transactionTemplate.execute(transactionStatus -> {
+            runnable.run();
+            return Boolean.TRUE;
+        });
+    }
 }

+ 22 - 11
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/RoomServiceImpl.java

@@ -60,7 +60,7 @@ public class RoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNetworkRoom
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public ImNetworkRoom initRoom(String roomId, RoleEnum userRole, String imUserId) throws Exception {
+    public ImNetworkRoom initRoom(String roomId, RoleEnum userRole, String imUserId) {
         ImNetworkRoom room = baseMapper.findByRoomId(roomId);
         String display = "";
         if (userRole == RoleEnum.RoleTeacher) {
@@ -72,7 +72,12 @@ public class RoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNetworkRoom
             room.setRoomId(roomId);
             room.setDisplay(display);
             baseMapper.insert(room);
-            IMApiResultInfo resultInfo = imHelper.createGroup(new String[]{imUserId}, roomId, roomId);
+            IMApiResultInfo resultInfo = null;
+            try {
+                resultInfo = imHelper.createGroup(new String[]{imUserId}, roomId, roomId);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
             if(resultInfo.getCode() != 200){
                 log.error("创建群聊失败 resultInfo:{}",resultInfo);
             }
@@ -104,17 +109,16 @@ public class RoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNetworkRoom
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void quitRoomSuccess(RoleEnum roleEnum, ImNetworkRoomMember roomMember,String serviceProvider) throws Exception {
-        String roomId = roomMember.getRoomId();
+    public void quitRoomSuccess(RoleEnum roleEnum,String imUserId,String roomId,String serviceProvider) throws Exception {
         ImNetworkRoom room = baseMapper.findByRoomId(roomId);
         if (roleEnum == RoleEnum.RoleTeacher){
             //如果老师退出房间,初始化节拍器和伴奏播放配置
             imNetworkRoomMemberStatusService.lambdaUpdate().eq(ImNetworkRoomMemberStatus::getRoomId,roomId)
                     .set(ImNetworkRoomMemberStatus::getPlayMidi,null)
                     .set(ImNetworkRoomMemberStatus::getMusicSheetDownloadJson,null).update();
-            if (isUserDisplay(room.getDisplay(), roomMember.getUserId())) {
+            if (isUserDisplay(room.getDisplay(),imUserId)) {
                 room.setDisplay("");
-                this.updateDisplay(roomMember.getUserId(),room,serviceProvider);
+                this.updateDisplay(imUserId,room,serviceProvider);
             }
         }
         int memberNum = imNetworkRoomMemberService.lambdaQuery()
@@ -125,13 +129,20 @@ public class RoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNetworkRoom
             pluginService.chatRoomDestroy(roomId);
             //删除房间
             this.removeById(room.getId());
-            log.info("leaveRoomSuccess dismiss the room: {},userId: {}", roomId, roomMember.getUserId());
+            //删除房间用户
+            imNetworkRoomMemberService.lambdaUpdate().eq(ImNetworkRoomMember::getRoomId,roomId).remove();
+            log.info("leaveRoomSuccess dismiss the room: {},userId: {}", roomId, imUserId);
         } else {
-            imService.sendQuitRoomMsg(roomMember,serviceProvider);
-            log.info("leaveRoomSuccess quit group: roomId={},userId: {}", roomId, roomMember.getUserId());
+            ImNetworkRoomMember roomMember = imNetworkRoomMemberService.lambdaQuery().eq(ImNetworkRoomMember::getRoomId, roomId)
+                    .eq(ImNetworkRoomMember::getUserId, imUserId)
+                    .eq(ImNetworkRoomMember::getRole, roleEnum.getValue())
+                    .last("limit 1").one();
+            if(roomMember != null){
+                imService.sendQuitRoomMsg(roomMember,serviceProvider);
+                imNetworkRoomMemberService.removeById(roomMember.getId());
+            }
+            log.info("leaveRoomSuccess quit group: roomId={},userId: {}", roomId,imUserId);
         }
-        //删房间用户信息
-        imNetworkRoomMemberService.removeById(roomMember.getId());
     }
 
     //修改节拍器

+ 7 - 2
cooleshow-user/user-classroom/src/main/java/com/yonge/cooleshow/classroom/controller/RoomController.java

@@ -4,6 +4,7 @@ package com.yonge.cooleshow.classroom.controller;
 import com.alibaba.fastjson.JSONObject;
 import com.yonge.cooleshow.biz.dal.dto.*;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.RoleEnum;
 import com.yonge.cooleshow.biz.dal.service.ImGroupService;
 import com.yonge.cooleshow.biz.dal.service.ImNetworkRoomService;
 import com.yonge.cooleshow.biz.dal.service.SysUserService;
@@ -49,8 +50,12 @@ public class RoomController extends BaseController {
 
     @ApiOperation("加入网络教室")
     @PostMapping(value = "/join")
-    public BaseResponse<ImNetworkRoomResult> joinRoom(@RequestBody ImNetworkBaseDto imNetworkBaseDto) throws Exception {
-        return imNetworkRoomService.joinRoom(imNetworkBaseDto.getRoomId(), imNetworkBaseDto.getClientType());
+    public BaseResponse<ImNetworkRoomResult> joinRoom(@RequestBody ImNetworkBaseDto imNetworkBaseDto) {
+        RoleEnum userRole = RoleEnum.RoleStudent;
+        if(imNetworkBaseDto.getClientType() == ClientEnum.TEACHER){
+            userRole = RoleEnum.RoleTeacher;
+        }
+        return imNetworkRoomService.joinRoom(imNetworkBaseDto.getRoomId(), userRole);
     }
 
     @ApiOperation("查询网络教室信息")