shangke 1 年之前
父节点
当前提交
0ab03f703f

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/ETencentTRTCCallbackCommand.java

@@ -11,10 +11,20 @@ import lombok.Getter;
 @Getter
 public enum ETencentTRTCCallbackCommand {
 
+    // 房间事件
     EVENT_TYPE_CREATE_ROOM("101", "创建房间"),
     EVENT_TYPE_DISMISS_ROOM("102", "解散房间"),
     EVENT_TYPE_ENTER_ROOM("103", "进入房间"),
     EVENT_TYPE_EXIT_ROOM("104", "退出房间"),
+
+    // 媒体事件
+    EVENT_TYPE_START_VIDEO("201", "开始推送视频数据"),
+    EVENT_TYPE_STOP_VIDEO("202", "停止推送视频数据"),
+    EVENT_TYPE_START_AUDIO("203", "开始推送音频数据"),
+    EVENT_TYPE_STOP_AUDIO("204", "停止推送音频数据"),
+    EVENT_TYPE_START_ASSIT("205", "开始推送辅路数据"),
+    EVENT_TYPE_STOP_ASSIT("206", "停止推送辅路数据"),
+
     EVENT_DEFAULT("-1", "默认无效事件"),
     ;
 

+ 1 - 1
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -3644,7 +3644,7 @@
         AND status_ = 'NOT_START'
     </select>
     <select id="getLock" resultMap="CourseSchedule">
-        SELECT * FROM course_schedule WHERE id_ = #{courseId} FOR UPDATE
+        SELECT * FROM course_schedule WHERE id_ = #{courseId}
     </select>
 
     <select id="countCourseMergeCourseNum" resultType="java.util.Map">

+ 27 - 1
mec-im/src/main/java/com/ym/controller/RoomController.java

@@ -154,7 +154,33 @@ public class RoomController{
                 }
             }
 
-            // 直播回调整消息, roomId.startsWith("LIVE")
+            // 直播课回调消息, roomId.startsWith("LIVE")
+            if (roomId.startsWith("LIVE")) {
+                String[] values = roomId.split("-");
+                if (values.length < 2 || !values[1].startsWith("S")) {
+                    return;
+                }
+
+                roomId = values[1];
+                // 直播课回调事件处理, 课程编号
+                switch (ETencentTRTCCallbackCommand.get(eventInfo.getEventType())){
+                    case EVENT_TYPE_START_VIDEO:
+                    case EVENT_TYPE_START_AUDIO:
+                    case EVENT_TYPE_START_ASSIT:
+                        //成员加入
+                        roomService.joinRoomSuccess(roomId, eventInfo.getEventInfo().getUserId(), null);
+                        break;
+                    case EVENT_TYPE_STOP_VIDEO:
+                    case EVENT_TYPE_STOP_AUDIO:
+                    case EVENT_TYPE_STOP_ASSIT:
+                        //成员退出
+                        roomService.leaveRoomSuccess(roomId, eventInfo.getEventInfo().getUserId(),null, eventInfo.getCallbackTs());
+                        break;
+                    default:
+                        // 默认事件,直接忽略
+                        break;
+                }
+            }
 
         }catch (Exception e){
             log.error("statusSyncTencent event={}", eventInfo.jsonString(), e);

+ 45 - 4
mec-im/src/main/java/com/ym/controller/UserController.java

@@ -12,9 +12,11 @@ import com.ym.mec.biz.dal.enums.ETencentImCallbackCommand;
 import com.ym.mec.biz.service.ImLiveBroadcastRoomService;
 import com.ym.mec.common.entity.ImUserState;
 import com.ym.service.LiveRoomService;
+import com.ym.service.RoomService;
 import com.ym.service.UserService;
 import io.rong.models.user.UserModel;
 import io.swagger.annotations.ApiOperation;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -26,7 +28,6 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
@@ -42,8 +43,10 @@ public class UserController {
     private ImLiveBroadcastRoomService imLiveBroadcastRoomService;
     @Autowired
     private LiveRoomService liveRoomService;
-  @Autowired
-  private LivePluginContext livePluginContext;
+    @Autowired
+    private LivePluginContext livePluginContext;
+    @Autowired
+    private RoomService roomService;
 
     @RequestMapping(value = "/register", method = RequestMethod.POST)
     public Object register(@RequestBody UserModel userModel) throws Exception {
@@ -115,6 +118,7 @@ public class UserController {
 
 
         if(request.getParameter("CallbackCommand").equals(ETencentImCallbackCommand.GROUP_CALLBACKONMEMBERSTATECHANGE.getCommand())) {
+            // 直播群成员在线状态回调
             TencentData.CallbackOnMemberStateChange callbackOnMemberStateChange = TencentData.CallbackOnMemberStateChange.toObject(
                 body);
 
@@ -127,6 +131,7 @@ public class UserController {
 
 
         } else if(request.getParameter("CallbackCommand").equals(ETencentImCallbackCommand.GROUP_CALLBACKAFTERMEMBEREXIT.getCommand())) {
+            // 群成员离开之后回调
             TencentData.CallbackAfterMemberExit callbackAfterMemberExit = TencentData.CallbackAfterMemberExit.toObject(
                 body);
 
@@ -136,8 +141,27 @@ public class UserController {
 
             if (callbackAfterMemberExit.getGroupId().startsWith("LIVE")) {
                 imLiveBroadcastRoomService.callbackAfterMemberExit(callbackAfterMemberExit);
+
+                // 直播课学生签退
+                String[] values = callbackAfterMemberExit.getGroupId().split("-");
+                String roomId = values.length > 2 ? values[1] : "";
+
+                if ((roomId.startsWith("S") || roomId.startsWith("I"))
+                        && CollectionUtils.isNotEmpty(callbackAfterMemberExit.getExitMemberList())) {
+
+                    // 学生编号
+                    String userId = callbackAfterMemberExit.getExitMemberList().get(0).getMemberAccount();
+                    try {
+                        roomService.leaveRoomSuccess(roomId, userId, null);
+                    } catch (Exception e) {
+                        log.error("tencentImCallback leaveRoomSuccess error, roomId={}, userId={}", roomId, userId, e);
+                    }
+
+                }
+
             }
-        }  else if(request.getParameter("CallbackCommand").equals(ETencentImCallbackCommand.GROUP_CALLBACKAFTERNEWMEMBERJOIN.getCommand())) {
+        } else if(request.getParameter("CallbackCommand").equals(ETencentImCallbackCommand.GROUP_CALLBACKAFTERNEWMEMBERJOIN.getCommand())) {
+            // 新成员入群之后回调
             TencentData.CallbackAfterNewMemberJoin callbackAfterNewMemberJoin = TencentData.CallbackAfterNewMemberJoin.toObject(
                 body);
 
@@ -147,6 +171,23 @@ public class UserController {
 
             if (callbackAfterNewMemberJoin.getGroupId().startsWith("LIVE")) {
                 imLiveBroadcastRoomService.callbackAfterNewMemberJoin(callbackAfterNewMemberJoin);
+
+                // 直播课学生签到
+                String[] values = callbackAfterNewMemberJoin.getGroupId().split("-");
+                String roomId = values.length > 2 ? values[1] : "";
+
+                if ((roomId.startsWith("S") || roomId.startsWith("I"))
+                        && CollectionUtils.isNotEmpty(callbackAfterNewMemberJoin.getNewMemberList())) {
+
+                    // 学生编号
+                    String userId = callbackAfterNewMemberJoin.getNewMemberList().get(0).getMemberAccount();
+                    try {
+                        roomService.joinRoomSuccess(roomId, userId, null);
+                    } catch (Exception e) {
+                        log.error("tencentImCallback joinRoomSuccess error, roomId={}, userId={}", roomId, userId, e);
+                    }
+
+                }
             }
         }
 

+ 0 - 1
mec-im/src/main/java/com/ym/pojo/RoomResult.java

@@ -4,7 +4,6 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.microsvc.toolkit.middleware.rtc.message.RTCRoomConfig;
 import com.ym.mec.biz.dal.entity.CourseScheduleStudentMusicScore;
-import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.Getter;

+ 92 - 87
mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java

@@ -731,8 +731,8 @@ public class RoomServiceImpl implements RoomService {
             roomMember = saveRoomMember(roomId, userId);
         }
         String joinSuccessKey = "joinRoomSuccess" + roomId + userId;
-        Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent(joinSuccessKey, roomId, 1L, TimeUnit.SECONDS);
-        if (!aBoolean) {
+        Boolean exist = redisTemplate.opsForValue().setIfAbsent(joinSuccessKey, roomId, 1L, TimeUnit.SECONDS);
+        if (Boolean.FALSE.equals(exist)) {
             RoleEnum roleEnum = RoleEnum.getEnumByValue(roomMember.getRole());
             if (roleEnum == RoleTeacher && StringUtils.isNotEmpty(deviceNum)) {
                 teacherAttendanceService.updateDeviceNum(Integer.parseInt(roomId.substring(1)), userId, deviceNum, null);
@@ -744,99 +744,104 @@ public class RoomServiceImpl implements RoomService {
         RoleEnum roleEnum = RoleEnum.getEnumByValue(roomMember.getRole());
         CourseSchedule schedule = courseScheduleDao.getLock(Long.parseLong(roomId.substring(1)));
 
-        String display = "";
-        if (roleEnum == RoleTeacher) {
-            //如果是老师加入房间,调整节拍器状态
-            courseScheduleStudentPaymentDao.adjustPlayMidi(schedule.getId(), null, null);
-            display = "display://type=1?userId=" + userId + "?uri=";
-        } else if (roleEnum == RoleEnum.RoleAssistant) {
-            display = "display://type=0?userId=" + userId + "?uri=";
-        }
-        Date curTime = DateTimeUtils.currentUTC();
-        Room room = roomDao.findByRid(roomId);
-        log.info("joinRoomSuccess: roomId={}, userId={}, roleEnum={}, room={}", roomId, userId, roleEnum.name(), Objects.isNull(room));
-        if (room == null) {
-            saveRoom(roomId, roomId, curTime, display);
-            this.joinImGroup(roomId, schedule.getActualTeacherId(), schedule);
-        } else {
-            if (roleEnum == RoleTeacher || roleEnum == RoleEnum.RoleAssistant) {
-                updateDisplay(roomId, userId, display, 0);
-            }
-        }
+        // 非直播课执行流程;VIP课、网管课
+        if (GroupType.LIVE != schedule.getGroupType()) {
 
-        UserInfo userInfo = userDao.findByUid(userId);
-        if (userInfo == null) {
-            userInfo = new UserInfo();
-            userInfo.setUid(userId);
-            userInfo.setName(roomMember.getName());
-            userInfo.setCreateDt(curTime);
-            userInfo.setUpdateDt(curTime);
-            userDao.save(userInfo);
-        }
-        MemberChangedMessage msg = new MemberChangedMessage(MemberChangedMessage.Action_Join, userId, roleEnum.getValue());
-        msg.setTimestamp(curTime);
-        msg.setUserName(roomMember.getName());
-        msg.setCamera(true);
-        Boolean playMidi = false;
-        Boolean examSong = false;
-        if (roleEnum == RoleStudent) {
-            String midiByCourseIdAndUserId = courseScheduleStudentPaymentDao.getMidiByCourseIdAndUserId(schedule.getId().toString(), userId);
-            //获取节拍器信息
-            if (StringUtils.isNotEmpty(midiByCourseIdAndUserId)) {
-                JSONObject jsonObject = JSONObject.parseObject(midiByCourseIdAndUserId);
-                if (jsonObject.get("enable") != null) {
-                    playMidi = Boolean.parseBoolean(jsonObject.get("enable").toString());
+            String display = "";
+            if (roleEnum == RoleTeacher) {
+                //如果是老师加入房间,调整节拍器状态
+                courseScheduleStudentPaymentDao.adjustPlayMidi(schedule.getId(), null, null);
+                display = "display://type=1?userId=" + userId + "?uri=";
+            } else if (roleEnum == RoleEnum.RoleAssistant) {
+                display = "display://type=0?userId=" + userId + "?uri=";
+            }
+            Date curTime = DateTimeUtils.currentUTC();
+            Room room = roomDao.findByRid(roomId);
+            log.info("joinRoomSuccess: roomId={}, userId={}, roleEnum={}, room={}", roomId, userId, roleEnum.name(), Objects.isNull(room));
+            if (room == null) {
+                saveRoom(roomId, roomId, curTime, display);
+                this.joinImGroup(roomId, schedule.getActualTeacherId(), schedule);
+            } else {
+                if (roleEnum == RoleTeacher || roleEnum == RoleEnum.RoleAssistant) {
+                    updateDisplay(roomId, userId, display, 0);
                 }
             }
-            String examJson = courseScheduleStudentPaymentDao.getExamJsonByCourseIdAndUserId(schedule.getId(), Integer.parseInt(userId));
-            if (StringUtils.isNotEmpty(examJson)) {
-                ExamSongDownloadData examSongDownloadData = JSON.parseObject(examJson, ExamSongDownloadData.class);
-                examSong = examSongDownloadData.getEnable();
+
+            UserInfo userInfo = userDao.findByUid(userId);
+            if (userInfo == null) {
+                userInfo = new UserInfo();
+                userInfo.setUid(userId);
+                userInfo.setName(roomMember.getName());
+                userInfo.setCreateDt(curTime);
+                userInfo.setUpdateDt(curTime);
+                userDao.save(userInfo);
             }
-        }
-        msg.setHandUpOn(roomMember.isHand());
-        msg.setMetronomeSwitch(playMidi);
-        msg.setExamSongSwitch(examSong);
+            MemberChangedMessage msg = new MemberChangedMessage(MemberChangedMessage.Action_Join, userId, roleEnum.getValue());
+            msg.setTimestamp(curTime);
+            msg.setUserName(roomMember.getName());
+            msg.setCamera(true);
+            Boolean playMidi = false;
+            Boolean examSong = false;
+            if (roleEnum == RoleStudent) {
+                String midiByCourseIdAndUserId = courseScheduleStudentPaymentDao.getMidiByCourseIdAndUserId(schedule.getId().toString(), userId);
+                //获取节拍器信息
+                if (StringUtils.isNotEmpty(midiByCourseIdAndUserId)) {
+                    JSONObject jsonObject = JSONObject.parseObject(midiByCourseIdAndUserId);
+                    if (jsonObject.get("enable") != null) {
+                        playMidi = Boolean.parseBoolean(jsonObject.get("enable").toString());
+                    }
+                }
+                String examJson = courseScheduleStudentPaymentDao.getExamJsonByCourseIdAndUserId(schedule.getId(), Integer.parseInt(userId));
+                if (StringUtils.isNotEmpty(examJson)) {
+                    ExamSongDownloadData examSongDownloadData = JSON.parseObject(examJson, ExamSongDownloadData.class);
+                    examSong = examSongDownloadData.getEnable();
+                }
+            }
+            msg.setHandUpOn(roomMember.isHand());
+            msg.setMetronomeSwitch(playMidi);
+            msg.setExamSongSwitch(examSong);
 
 
-        // 获取RTC服务提供方
-        String rtcServiceProvider = Optional.ofNullable(schedule.getServiceProvider()).orElse("rongCloud");
+            // 获取RTC服务提供方
+            String rtcServiceProvider = Optional.ofNullable(schedule.getServiceProvider()).orElse("rongCloud");
 
-        RTCRoomPluginService pluginService = rtcRoomPluginContext.getPluginService(rtcServiceProvider);
-        if (rtcServiceProvider.equals(TencentCloudRTCPlugin.PLUGIN_NAME)) {
-            // 腾讯云RTC服务
-            RTCRoomMessage.MessageContent.MessageContentBuilder action = RTCRoomMessage.MessageContent.builder()
-                    .action(EMemberAction.JOIN.getValue());
+            RTCRoomPluginService pluginService = rtcRoomPluginContext.getPluginService(rtcServiceProvider);
+            if (rtcServiceProvider.equals(TencentCloudRTCPlugin.PLUGIN_NAME)) {
+                // 腾讯云RTC服务
+                RTCRoomMessage.MessageContent.MessageContentBuilder action = RTCRoomMessage.MessageContent.builder()
+                        .action(EMemberAction.JOIN.getValue());
 
-            if (roleEnum == RoleTeacher) {
-                action.role(roleEnum.getValue());
-            } else {
-                action.role(roleEnum.getValue());
-            }
-            action.handUpOn(roomMember.isHand())
-                    .microphone(roomMember.isMic())
-                    .timestamp(curTime.getTime())
-                    .camera(true)
-                    .sendUserInfo(getSendUser(userId,roleEnum));
-
-            // 开启全员静音,重置学员状态
-            if (schedule.getMuteAll()) {
-                action.microphone(false);
-            }
+                if (roleEnum == RoleTeacher) {
+                    action.role(roleEnum.getValue());
+                } else {
+                    action.role(roleEnum.getValue());
+                }
+                action.handUpOn(roomMember.isHand())
+                        .microphone(roomMember.isMic())
+                        .timestamp(curTime.getTime())
+                        .camera(true)
+                        .sendUserInfo(getSendUser(userId,roleEnum));
+
+                // 开启全员静音,重置学员状态
+                if (schedule.getMuteAll()) {
+                    action.microphone(false);
+                }
 
-            RTCRoomMessage roomMessage = RTCRoomMessage.builder()
-                    .objectName(RTCRoomMessage.MEMBER_CHANGE_MESSAGE)
-                    .fromUserId(userId)
-                    .content(action.build())
-                    .toChatRoomId(roomId)
-                    .isPersisted(1)
-                    .isIncludeSender(1)
-                    .build();
+                RTCRoomMessage roomMessage = RTCRoomMessage.builder()
+                        .objectName(RTCRoomMessage.MEMBER_CHANGE_MESSAGE)
+                        .fromUserId(userId)
+                        .content(action.build())
+                        .toChatRoomId(roomId)
+                        .isPersisted(1)
+                        .isIncludeSender(1)
+                        .build();
 
-            pluginService.sendChatRoomMessage(roomMessage);
-        } else {
-            imHelper.publishMessage(userId, roomId, msg);
+                pluginService.sendChatRoomMessage(roomMessage);
+            } else {
+                imHelper.publishMessage(userId, roomId, msg);
+            }
         }
+
         log.info("join room success: roomId = {}, userId = {}, role = {}", roomId, userId, roleEnum);
         signInSuccess(roomMember, deviceNum);
     }
@@ -922,9 +927,9 @@ public class RoomServiceImpl implements RoomService {
         }
 
         String leaveSuccessKey = "leaveRoomSuccess" + roomId + userId;
-        Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent(leaveSuccessKey, roomId, 1L, TimeUnit.SECONDS);
-        log.info("leaveRoomSuccess: roomId={}, userId={},deviceNum={},aBoolean={}", roomId, userId, deviceNum, aBoolean);
-        if (Boolean.FALSE.equals(aBoolean)) {
+        Boolean exist = redisTemplate.opsForValue().setIfAbsent(leaveSuccessKey, roomId, 1L, TimeUnit.SECONDS);
+        log.info("leaveRoomSuccess: roomId={}, userId={},deviceNum={},aBoolean={}", roomId, userId, deviceNum, exist);
+        if (Boolean.FALSE.equals(exist)) {
             if (StringUtils.isNotEmpty(deviceNum)) {
                 //如果设备号不为空,更新设备号
                 if (roleEnum == RoleTeacher) {