Browse Source

网络教室

zouxuan 3 năm trước cách đây
mục cha
commit
cc87e0811c

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

@@ -28,11 +28,8 @@ public interface ImNetworkRoomService extends IService<ImNetworkRoom> {
     //加入网络教室失败
     void joinRoomFailure(String roomId);
 
-    //退出房间
-    void leaveRoom(String roomId) throws Exception;
-
     //退出房间成功
-    void leaveRoomSuccess(String roomId, Long userId) throws Exception;
+    void quitRoomSuccess(String roomId, Long userId) throws Exception;
 
     //控制用户节拍器
     void sendImPlayMidiMessage(ImNetworkCustomMessage customMessage) throws Exception;

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

@@ -7,6 +7,7 @@ import com.yonge.cooleshow.biz.dal.dto.BasicUserInfo;
 import com.yonge.cooleshow.biz.dal.entity.ImNetworkRoomMember;
 import com.yonge.cooleshow.biz.dal.enums.UserRoleEnum;
 import com.yonge.cooleshow.biz.dal.service.ImNetworkRoomMemberService;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
 import org.slf4j.Logger;
@@ -15,6 +16,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.util.Date;
 import java.util.Objects;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 网络教室成员(ImNetworkRoomMember)表服务实现类
@@ -32,6 +34,72 @@ public class ImNetworkRoomMemberServiceImpl extends ServiceImpl<ImNetworkRoomMem
         return this.baseMapper;
     }
 
+    public void leaveRoomSuccess(String roomId, String userId, String deviceNum) throws Exception {
+        log.info("leaveRoomSuccess: roomId={}, userId={},deviceNum={}", roomId, userId, deviceNum);
+        Integer firstCourseId = Integer.parseInt(roomId.substring(1));
+        RoleEnum roleEnum;
+        int parseInt = Integer.parseInt(userId);
+        Teacher teacher = teacherDao.get(parseInt);
+        CourseSchedule courseSchedule = courseScheduleDao.get(firstCourseId.longValue());
+        if (teacher != null && teacher.getId().equals(courseSchedule.getActualTeacherId())) {
+            roleEnum = RoleTeacher;
+            courseScheduleStudentMusicScoreDao.closePlayStatus(courseSchedule.getId(), null, null);
+        } else {
+            roleEnum = RoleStudent;
+        }
+
+        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 (!aBoolean) {
+            if (StringUtils.isNotEmpty(deviceNum)) {
+                //如果设备号不为空,更新设备号
+                if (roleEnum == RoleTeacher) {
+                    teacherAttendanceService.updateDeviceNum(firstCourseId, userId, null, deviceNum);
+//                    teacherAttendanceService.addTeacherAttendanceSignOut(firstCourseId.longValue(),parseInt,deviceNum);
+                }
+            }
+            return;
+        }
+
+        String username;
+        SysUser sysUser = sysUserFeignService.queryUserById(parseInt);
+        if (roleEnum == RoleTeacher) {
+            username = sysUser.getRealName();
+            courseScheduleStudentPaymentDao.adjustPlayMidi(firstCourseId, null, null);
+            courseScheduleStudentPaymentDao.adjustExamSong(firstCourseId.longValue(), null, null);
+            teacherAttendanceService.addTeacherAttendanceSignOut(firstCourseId.longValue(), parseInt, deviceNum);
+        } else {
+            username = sysUser.getUsername();
+            studentAttendanceService.addStudentAttendanceSignOut(firstCourseId.longValue(), parseInt);
+        }
+        Room room = roomDao.findByRid(roomId);
+        if (room == null) {
+            roomMemberDao.deleteUserByRidAndUid(roomId, userId);
+            userDao.deleteByUid(userId);
+            return;
+        }
+        if (roleEnum != RoleStudent && isUserDisplay(room, userId)) {
+            updateDisplay(roomId, userId, "", 0);
+        }
+        if (roomMemberDao.countByRid(roomId) <= 1) {
+            roomMemberDao.deleteUserByRidAndUid(roomId, userId);
+            roomDao.deleteByRid(roomId);
+            deleteWhiteboardByUser(roomId, userId);
+            imHelper.dismiss(userId, roomId);
+            courseScheduleStudentMusicScoreDao.closePlayStatus(courseSchedule.getId(), null, null);
+            log.info("leaveRoomSuccess dismiss the room: {},userId: {}", roomId, userId);
+        } else {
+            roomMemberDao.deleteUserByRidAndUid(roomId, userId);
+            MemberChangedMessage msg = new MemberChangedMessage(MemberChangedMessage.Action_Leave, userId, roleEnum.getValue());
+            msg.setUserName(username);
+            imHelper.publishMessage(userId, roomId, msg);
+            imHelper.quit(new String[]{userId}, roomId);
+            log.info("leaveRoomSuccess quit group: roomId={},userId: {}", roomId, userId);
+        }
+        userDao.deleteByUid(userId);
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public ImNetworkRoomMember initRoomMember(String roomId, BasicUserInfo sysUser, UserRoleEnum userRole) {

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

@@ -16,6 +16,7 @@ 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.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -25,6 +26,7 @@ import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
@@ -58,6 +60,10 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
     private IMHelper imHelper;
     @Resource
     private MusicSheetAccompanimentService musicSheetAccompanimentService;
+    @Resource
+    private RedissonClient redissonClient;
+
+    private String QUIT_ROOM_SUCCESS = "quitRoomSuccess:";
 
     @Override
     public ImNetworkRoomDao getDao() {
@@ -180,40 +186,16 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void leaveRoom(String roomId) throws Exception {
-        Long userId = sysUserService.getUserId();
-        log.info("leaveRoom: roomId={}, userId={}", roomId, userId);
-        long courseScheduleId = Long.parseLong(roomId);
-        Long teacherId = Optional.ofNullable(courseScheduleService.getById(courseScheduleId)).
-                map(CourseSchedule::getTeacherId).
-                orElseThrow(()->new BizException("房间信息不存在"));
-        UserRoleEnum userRole = UserRoleEnum.STUDENT;
-        if(teacherId.equals(userId)){
-            userRole = UserRoleEnum.TEACHER;
-        }
-        if (userRole == UserRoleEnum.TEACHER){
-            //如果老师退出房间,关闭伴奏
-            courseScheduleStudentMusicSheetService.getDao().closePlayStatus(courseScheduleId,null);
-            courseScheduleStudentPaymentService.getDao().adjustPlayMidi(courseScheduleId, null, null);
-            courseScheduleStudentPaymentService.getDao().adjustExamSong(courseScheduleId, null, null);
+    public void quitRoomSuccess(String roomId, Long userId) throws Exception {
+        log.info("quitRoomSuccess: roomId={}, userId={}", roomId, userId);
+        //防止幂等
+        StringBuffer sb  = new StringBuffer(QUIT_ROOM_SUCCESS).append(roomId).append(userId);
+        if (!redissonClient.getBucket(sb.toString()).setIfExists(userId,3, TimeUnit.SECONDS)){
+            log.info("quitRoomSuccess break: roomId={}, userId={}", roomId, userId);
         }
-        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 = Optional.ofNullable(courseScheduleService.getById(roomId))
                 .orElseThrow(()->new BizException("房间信息不存在"));
+        Long courseScheduleId = courseSchedule.getId();
         UserRoleEnum roleEnum = UserRoleEnum.STUDENT;
         if(Objects.equals(courseSchedule.getTeacherId(),userId)){
             roleEnum = UserRoleEnum.TEACHER;
@@ -222,6 +204,10 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
 
         ImNetworkRoom room = baseMapper.findByRoomId(roomId);
         if (roleEnum == UserRoleEnum.TEACHER){
+            //如果老师退出房间,关闭伴奏
+            courseScheduleStudentMusicSheetService.getDao().closePlayStatus(courseScheduleId,null);
+            courseScheduleStudentPaymentService.getDao().adjustPlayMidi(courseScheduleId, null, null);
+            courseScheduleStudentPaymentService.getDao().adjustExamSong(courseScheduleId, null, null);
             if (isUserDisplay(room.getDisplay(), userId)) {
                 room.setDisplay("");
                 this.updateDisplay(userId,room);

+ 6 - 3
cooleshow-user/user-classroom/src/main/java/com/yonge/cooleshow/classroom/controller/ImNetworkRoomController.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.service.ImNetworkRoomService;
+import com.yonge.cooleshow.biz.dal.service.SysUserService;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.exception.BizException;
@@ -36,6 +37,8 @@ public class ImNetworkRoomController extends BaseController {
      */
     @Resource
     private ImNetworkRoomService imNetworkRoomService;
+    @Resource
+    private SysUserService sysUserService;
 
     @ApiOperation("加入网络教室")
     @PostMapping(value = "/join")
@@ -73,7 +76,7 @@ public class ImNetworkRoomController extends BaseController {
                 break;
             case 12:
                 //成员退出
-                imNetworkRoomService.leaveRoomSuccess(notify.getRoomId(),Long.parseLong(notify.getUserId()));
+                imNetworkRoomService.quitRoomSuccess(notify.getRoomId(),Long.parseLong(notify.getUserId()));
                 break;
         }
     }
@@ -81,9 +84,9 @@ public class ImNetworkRoomController extends BaseController {
     @ApiOperation("退出网络教室")
     @PostMapping(value = "/leave")
     public HttpResponseResult leaveRoom(@RequestBody ImNetworkBaseDto imNetworkBaseDto) throws Exception {
-        imNetworkRoomService.leaveRoom(Optional.ofNullable(imNetworkBaseDto)
+        imNetworkRoomService.quitRoomSuccess(Optional.ofNullable(imNetworkBaseDto)
                 .map(ImNetworkBaseDto::getRoomId)
-                .orElseThrow(()->new BizException("房间号不可为空")).toString());
+                .orElseThrow(()->new BizException("房间号不可为空")).toString(),sysUserService.getUserId());
         return succeed();
     }