Pārlūkot izejas kodu

修改直播时关闭房间人员还在直播间未签退的bug

hgw 3 gadi atpakaļ
vecāks
revīzija
f33fc1afa9

+ 38 - 21
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/LiveRoomServiceImpl.java

@@ -35,6 +35,7 @@ import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.function.BiFunction;
 import java.util.function.BiPredicate;
+import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -447,23 +448,6 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
         String speakerIdStr = room.getSpeakerId().toString();
         String roomUid = room.getRoomUid();
 
-        //删除房间全部人员缓存
-        this.getTotalUserCache(roomUid).deleteAsync();
-        //获取在线人员信息
-        RMap<Long, String> onlineUserCache = this.getOnlineUserCache(roomUid);
-        //删除人员对应直播间编号信息
-        onlineUserCache.forEach((id, s) -> redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, id.toString())).deleteAsync());
-        //删除房间在线人员缓存
-        onlineUserCache.deleteAsync();
-        //删除房间信息
-        this.getLiveRoomInfo(room.getRoomUid()).deleteAsync();
-        //删除点赞数
-        redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, room.getRoomUid())).deleteAsync();
-        //删除当前主讲人最后一次进入房间的ip
-        redissonClient.getBucket(LIVE_USER_LAST_CLIENT_IP.replace(ROOM_UID, roomUid).replace(USER_ID, speakerIdStr)).deleteAsync();
-        //删除当前主讲人最后一次心跳
-        redissonClient.getBucket(LIVE_ROOM_HEART_BEAT.replace(ROOM_UID, roomUid)).deleteAsync();
-
         //关闭直播间发送消息
         ImRoomMessage message = new ImRoomMessage();
         message.setFromUserId(speakerIdStr);
@@ -476,8 +460,40 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
         } catch (Exception e) {
             log.error("destroyLiveRoom>>>>  FORCED_OFFLINE {}", e.getMessage());
         }
-        //删除房间
-//        this.ImDestroyLiveRoom(room.getRoomUid());
+
+        Date now = new Date();
+        //删除人员与房间关联关系缓存的方法
+        Consumer<String> deleteUserRoomCache = (id) -> redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, id)).deleteAsync();
+        //给老师签退
+        teacherAttendanceService.update(Wrappers.<TeacherAttendance>lambdaUpdate()
+                .eq(TeacherAttendance::getTeacherId, room.getSpeakerId())
+                .eq(TeacherAttendance::getCourseScheduleId, room.getCourseId())
+                .set(TeacherAttendance::getSignOutTime, now));
+        //删除老师与房间关联关系
+        deleteUserRoomCache.accept(speakerIdStr);
+        //获取在线人员信息
+        RMap<Long, String> onlineUserCache = this.getOnlineUserCache(roomUid);
+        onlineUserCache.forEach((id, s) -> {
+            //删除观看者对应直播间编号的缓存
+            deleteUserRoomCache.accept(id.toString());
+            //观看者签退
+            studentAttendanceService.update(Wrappers.<StudentAttendance>lambdaUpdate()
+                    .eq(StudentAttendance::getStudentId, id)
+                    .eq(StudentAttendance::getCourseScheduleId, room.getCourseId())
+                    .set(StudentAttendance::getSignOutTime, now));
+        });
+        //删除房间在线人员缓存
+        onlineUserCache.deleteAsync();
+        //删除房间信息
+        this.getLiveRoomInfo(room.getRoomUid()).deleteAsync();
+        //删除点赞数
+        redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, room.getRoomUid())).deleteAsync();
+        //删除当前主讲人最后一次进入房间的ip
+        redissonClient.getBucket(LIVE_USER_LAST_CLIENT_IP.replace(ROOM_UID, roomUid).replace(USER_ID, speakerIdStr)).deleteAsync();
+        //删除当前主讲人最后一次心跳
+        redissonClient.getBucket(LIVE_ROOM_HEART_BEAT.replace(ROOM_UID, roomUid)).deleteAsync();
+        //删除房间全部人员缓存
+        this.getTotalUserCache(roomUid).deleteAsync();
     }
 
     /**
@@ -731,9 +747,9 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
             userInfo.setUserId(sysUser.getId());
             userInfo.setUserName(sysUser.getRealName());
             userInfo.setFirstJoinTime(now);
-            //查询学生是否有进入过,没有则写学生考勤表的进入时间
-            this.setStudentAttendance(userId, roomInfo.getCourseGroupId(), roomInfo.getCourseId());
         }
+        //查询学生是否有进入过,没有则写学生考勤表的进入时间
+        this.setStudentAttendance(userId, roomInfo.getCourseGroupId(), roomInfo.getCourseId());
         userInfo.setDynamicJoinTime(now);
         //用户json信息
         String userJsonStr = JSONObject.toJSONString(userInfo);
@@ -812,6 +828,7 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
             studentAttendance.setSignInTime(now);
             studentAttendance.setCreateTime(now);
             studentAttendanceService.save(studentAttendance);
+            log.info("SignInTime >>>  user {} courseId {}", studentId, courseId);
         }
     }