Przeglądaj źródła

Merge branch 'feature/0414-trtc' into master_saas

Eric 2 lat temu
rodzic
commit
bb97524ded

+ 99 - 64
mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import com.microsvc.toolkit.middleware.rtc.RTCRoomPluginContext;
 import com.microsvc.toolkit.middleware.rtc.RTCRoomPluginService;
 import com.microsvc.toolkit.middleware.rtc.enums.EMemberAction;
@@ -267,6 +268,9 @@ public class RoomServiceImpl implements RoomService {
 
         // 获取RTC服务提供方
         String rtcServiceProvider = Optional.ofNullable(sysConfigDao.findConfigValue("rtc_service_provider")).orElse("rongCloud");
+        if (StringUtils.isBlank(courseSchedule.getServiceProvider())) {
+            courseSchedule.setServiceProvider(rtcServiceProvider);
+        }
 
         RTCRoomPluginService pluginService = rtcRoomPluginContext.getPluginService(rtcServiceProvider);
         if (TencentCloudRTCPlugin.PLUGIN_NAME.equals(pluginService.pluginName())) {
@@ -274,7 +278,7 @@ public class RoomServiceImpl implements RoomService {
             // 用户IM帐号创建
             String userSig = "";
             try {
-                userSig = pluginService.register(String.valueOf(sysUser.getId()), sysUser.getUsername(), sysUser.getAvatar());
+                userSig = pluginService.register(String.valueOf(sysUser.getId()), sysUser.getRealName(), sysUser.getAvatar());
             } catch (Exception e) {
                 log.error("直播房间用户注册失败: userId={}", sysUser.getId(), e);
             }
@@ -283,56 +287,10 @@ public class RoomServiceImpl implements RoomService {
             roomResult.userSig(userSig)
                     .rtcRoomConfig(rtcRoomPluginContext.getPluginService().getRTCRoomConfig(String.valueOf(sysUser.getId())))
                     .setGroupId(roomId);
-        } else {
-            // 融云RTC
-            // TODO:创建IM群聊,后续注释掉,统一使用后续流程
-            this.joinImGroup(roomId, courseSchedule.getActualTeacherId());
         }
 
-        // 创建网络课聊天室
-        {
-            String joinImGroupKey = "joinImGroup:" + roomId;
-            // VIP课或网络课,IM群聊已创建标识
-            Boolean exists = redisTemplate.opsForValue().setIfAbsent(joinImGroupKey, roomId, 1L, TimeUnit.DAYS);
-
-            if (Optional.ofNullable(exists).orElse(false)) {
-
-                // 生成群组,更新服务提供方
-                if (StringUtils.isBlank(courseSchedule.getServiceProvider())) {
-
-                    // 创建群组
-                    log.info("createImGroup: roomId = {}, userId = {}", roomId, teacherInfo.getId());
-                    pluginService.chatRoomCreate(roomId, courseSchedule.getName(), teacherInfo.getId().toString());
-
-                    // 更新网络课服务提供方
-                    courseScheduleDao.updateServiceProvider(courseSchedule.getId(), rtcServiceProvider);
-                }
-
-                // 群组老师信息
-                List<ImGroupMemberWrapper.ImGroupMember> groupMembers = Lists.newArrayList(ImGroupMemberWrapper.ImGroupMember
-                        .builder()
-                        .userId(Long.valueOf(teacherInfo.getId()))
-                        .imUserIdFormat(false)
-                        .build());
-
-                List<CourseScheduleStudentPayment> payments = courseScheduleStudentPaymentDao.findByCourseSchedule(Long.parseLong(roomId.substring(1)));
-                // 群组学生信息
-                if (CollectionUtils.isNotEmpty(payments)) {
-                    for (CourseScheduleStudentPayment item : payments) {
-                        groupMembers.add(ImGroupMemberWrapper.ImGroupMember
-                                .builder()
-                                .userId(Long.valueOf(item.getUserId()))
-                                .imUserIdFormat(false)
-                                .build());
-                    }
-                }
-
-                // 加入群组成员
-                log.info("joinImGroup: roomId = {}, serviceProvider={}, userIds = {}", roomId, courseSchedule.getServiceProvider(), groupMembers);
-                pluginService.chatRoomGroupJoin(roomId, courseSchedule.getName(), groupMembers);
-
-            }
-        }
+        // 创建IM群聊
+        this.joinImGroup(roomId, courseSchedule.getActualTeacherId(), courseSchedule);
 
         List<CourseScheduleStudentMusicScore> scheduleStudentMusicScores = courseScheduleStudentMusicScoreDao.queryByScoreIdAndCourseId(null, courseId, null, null, null);
         Room room = roomDao.findByRid(roomId);
@@ -405,23 +363,78 @@ public class RoomServiceImpl implements RoomService {
         return new BaseResponse(roomResult);
     }
 
-    private void joinImGroup(String roomId,Integer actualTeacherId) throws Exception {
+    private void joinImGroup(String roomId, Integer actualTeacherId, CourseSchedule courseSchedule) throws Exception {
+
         String joinImGroupKey = "joinImGroup:" + roomId;
-        Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent(joinImGroupKey, roomId, 1l, TimeUnit.DAYS);
-        if (aBoolean) {
-            log.info("joinImGroup: roomId = {}, userId = {}", roomId, actualTeacherId);
-            List<CourseScheduleStudentPayment> payments = courseScheduleStudentPaymentDao.findByCourseSchedule(Long.parseLong(roomId.substring(1)));
-            List<String> collect = payments.stream().map(e -> e.getUserId().toString()).collect(Collectors.toList());
-            collect.add(actualTeacherId.toString());
-            String[] integers = collect.toArray(new String[]{});
-            imHelper.joinGroup(integers, roomId, roomId);
+        // VIP课或网络课,IM群聊已创建标识
+        Boolean exists = redisTemplate.opsForValue().setIfAbsent(joinImGroupKey, roomId, 1L, TimeUnit.DAYS);
+
+        RTCRoomPluginService pluginService = rtcRoomPluginContext.getPluginService(courseSchedule.getServiceProvider());
+        if (Optional.ofNullable(exists).orElse(false)) {
+
+            // 创建群组
+            log.info("createImGroup: roomId = {}, userId = {}", roomId, actualTeacherId);
+            if (TencentCloudRTCPlugin.PLUGIN_NAME.equals(pluginService.pluginName())) {
+
+                try {
+                    // 生成群组,更新服务提供方
+                    pluginService.chatRoomCreate(roomId, courseSchedule.getName(), actualTeacherId.toString());
+                } catch (Exception e) {
+                    log.error("joinImGroup TENCENT_CLOUD error: roomId = {}, userId = {}", roomId, actualTeacherId, e);
+                }
+
+                // 更新网络课服务提供方
+                courseScheduleDao.updateServiceProvider(courseSchedule.getId(), courseSchedule.getServiceProvider());
+
+                // 群组老师信息
+                List<ImGroupMemberWrapper.ImGroupMember> groupMembers = Lists.newArrayList(ImGroupMemberWrapper.ImGroupMember
+                        .builder()
+                        .userId(Long.valueOf(actualTeacherId))
+                        .imUserIdFormat(false)
+                        .build());
+
+                List<CourseScheduleStudentPayment> payments = courseScheduleStudentPaymentDao.findByCourseSchedule(Long.parseLong(roomId.substring(1)));
+                // 群组学生信息
+                if (CollectionUtils.isNotEmpty(payments)) {
+                    for (CourseScheduleStudentPayment item : payments) {
+                        groupMembers.add(ImGroupMemberWrapper.ImGroupMember
+                                .builder()
+                                .userId(Long.valueOf(item.getUserId()))
+                                .imUserIdFormat(false)
+                                .build());
+                    }
+                }
+
+                // 加入群组成员
+                log.info("joinImGroup: roomId = {}, serviceProvider={}, userIds = {}", roomId, courseSchedule.getServiceProvider(), groupMembers);
+                pluginService.chatRoomGroupJoin(roomId, courseSchedule.getName(), groupMembers);
+            } else {
+
+                List<CourseScheduleStudentPayment> payments = courseScheduleStudentPaymentDao.findByCourseSchedule(Long.parseLong(roomId.substring(1)));
+                List<String> collect = payments.stream().map(e -> e.getUserId().toString()).collect(Collectors.toList());
+                collect.add(actualTeacherId.toString());
+                String[] integers = collect.toArray(new String[]{});
+                imHelper.joinGroup(integers, roomId, roomId);
+            }
+
         }
+
     }
-    private void dismissImGroup(String userId,String roomId) throws Exception {
+    private void dismissImGroup(String userId,String roomId, String serviceProvider) throws Exception {
         log.info("dismissImGroup: roomId = {}, userId = {}", roomId, userId);
         String joinImGroupKey = "joinImGroup:" + roomId;
         redisTemplate.delete(joinImGroupKey);
-        imHelper.dismiss(userId, roomId);
+
+        RTCRoomPluginService pluginService = rtcRoomPluginContext.getPluginService(serviceProvider);
+        if (TencentCloudRTCPlugin.PLUGIN_NAME.equals(pluginService.pluginName())) {
+            // 腾讯云群销毁
+            pluginService.chatRoomDestroy(roomId);
+        } else {
+            // 融云群销毁
+            // 销毁群组
+            imHelper.dismiss(userId, roomId);
+        }
+
     }
 
 
@@ -496,7 +509,7 @@ public class RoomServiceImpl implements RoomService {
         Room room = roomDao.findByRid(roomId);
         if (room == null) {
             saveRoom(roomId, roomId, curTime, display);
-            this.joinImGroup(roomId,schedule.getActualTeacherId());
+            this.joinImGroup(roomId, schedule.getActualTeacherId(), schedule);
         } else {
             if (roleEnum == RoleTeacher || roleEnum == RoleEnum.RoleAssistant) {
                 updateDisplay(roomId, userId, display, 0);
@@ -685,7 +698,7 @@ public class RoomServiceImpl implements RoomService {
             roomMemberDao.deleteUserByRidAndUid(roomId, userId);
             roomDao.deleteByRid(roomId);
             deleteWhiteboardByUser(roomId, userId);
-            this.dismissImGroup(userId, roomId);
+            this.dismissImGroup(userId, roomId, courseSchedule.getServiceProvider());
             courseScheduleStudentMusicScoreDao.closePlayStatus(courseSchedule.getId(), null, null);
             log.info("leaveRoomSuccess dismiss the room: {},userId: {}", roomId, userId);
         } else {
@@ -742,13 +755,20 @@ public class RoomServiceImpl implements RoomService {
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     @Override
     public void destroyRoom(String roomId) {
+
+        // 查询课程信息
+        CourseSchedule courseSchedule = courseScheduleDao.get(Long.parseLong(roomId.substring(1)));
+        if (Objects.isNull(courseSchedule)) {
+            throw new BizException("无效的课程编号");
+        }
+
         whiteboardDao.deleteByRid(roomId);
         Room room = roomDao.findByRid(roomId);
         if (room == null) {
             List<RoomMember> list = roomMemberDao.findByRid(roomId);
             if (!list.isEmpty()) {
                 try {
-                    this.dismissImGroup(list.get(0).getUid(), roomId);
+                    this.dismissImGroup(list.get(0).getUid(), roomId, courseSchedule.getServiceProvider());
                 } catch (Exception e) {
                     log.error("destroyRoom: {}", e.getMessage());
                     e.printStackTrace();
@@ -2026,6 +2046,18 @@ public class RoomServiceImpl implements RoomService {
     @Transactional(rollbackFor = Exception.class)
     public void userIMOfflineKick(String userId) {
         List<RoomMember> members = roomMemberDao.findByUid(userId);
+
+        // 查询课程信息
+        List<Long> collect = members.stream()
+                .map(x -> x.getRid().substring(1))
+                .map(Long::valueOf).distinct().collect(Collectors.toList());
+
+        Map<String, String> serviceProviderMap = Maps.newHashMap();
+        if (CollectionUtils.isNotEmpty(collect)) {
+            serviceProviderMap = courseScheduleDao.findByCourseScheduleIds(collect).stream()
+                    .collect(Collectors.toMap(x -> x.getId().toString(), CourseSchedule::getServiceProvider, (o, n) -> n));
+        }
+
         for (RoomMember member : members) {
             int userRole = member.getRole();
             log.info("userIMOfflineKick: roomId={}, {}, role={}", member.getRid(), userId, RoleEnum.getEnumByValue(userRole));
@@ -2041,7 +2073,10 @@ public class RoomServiceImpl implements RoomService {
                     }
                 }
                 if (roomMemberDao.countByRid(member.getRid()) == 1) {
-                    this.dismissImGroup(member.getUid(), member.getRid());
+                    // 群组当前人数为1时,解散群组
+                    this.dismissImGroup(member.getUid(), member.getRid(),
+                            serviceProviderMap.getOrDefault(member.getRid().substring(1), "rongCloud"));
+
                     roomMemberDao.deleteUserByRidAndUid(member.getRid(), member.getUid());
                     roomDao.deleteByRid(member.getRid());
                     deleteWhiteboardByUser(member.getRid(), member.getUid());