From be467e32fe4bae8b614e8d4a99468c7f2ccb6371 Mon Sep 17 00:00:00 2001 From: khalil Date: Mon, 17 Jun 2024 13:47:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=88=BF=E9=97=B4-=E4=BA=91=E4=BF=A1-=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E6=9B=B4=E6=96=B0=E6=88=BF=E9=97=B4=E5=9C=A8=E7=BA=BF?= =?UTF-8?q?=E4=BA=BA=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/netease/ErBanNetEaseService.java | 16 ++++++ .../neteaseacc/result/BatchRoomRet.java | 55 +++++++++++++++++++ .../common/netease/util/NetEaseConstant.java | 1 + .../business/service/room/RoomService.java | 44 +++++++++++++++ .../scheduler/task/RefreshPersonTask.java | 9 ++- 5 files changed, 122 insertions(+), 3 deletions(-) create mode 100644 accompany-base/accompany-core/src/main/java/com/accompany/common/netease/neteaseacc/result/BatchRoomRet.java diff --git a/accompany-base/accompany-core/src/main/java/com/accompany/common/netease/ErBanNetEaseService.java b/accompany-base/accompany-core/src/main/java/com/accompany/common/netease/ErBanNetEaseService.java index 58e360089..9a48faf8c 100644 --- a/accompany-base/accompany-core/src/main/java/com/accompany/common/netease/ErBanNetEaseService.java +++ b/accompany-base/accompany-core/src/main/java/com/accompany/common/netease/ErBanNetEaseService.java @@ -135,6 +135,22 @@ public class ErBanNetEaseService extends BaseService { return gsonDefine.fromJson(result, RoomRet.class); } + + /** + * 查询聊天室信息 + */ + public BatchRoomRet getBatchRoomMessage(List roomIdList) { + String url = NetEaseConstant.basicUrl + NetEaseConstant.RoomUrl.getBatch; + NetEaseBaseClient netEaseBaseClient = new NetEaseBaseClient(NetEaseConfig.neteaseAppKey, NetEaseConfig.neteaseAppSecret, url); + Map param = Maps.newHashMap(); + param.put("roomids", roomIdList.stream().map(Object::toString).toArray(String[]::new)); + param.put("needOnlineUserCount", true); + String result = netEaseBaseClient.buildHttpPostParam(param).executePost(); + log.info("getBatchRoomMessage result: {}", result); + return gsonDefine.fromJson(result, BatchRoomRet.class); + } + + /** * 创建聊天室 * diff --git a/accompany-base/accompany-core/src/main/java/com/accompany/common/netease/neteaseacc/result/BatchRoomRet.java b/accompany-base/accompany-core/src/main/java/com/accompany/common/netease/neteaseacc/result/BatchRoomRet.java new file mode 100644 index 000000000..dc260773e --- /dev/null +++ b/accompany-base/accompany-core/src/main/java/com/accompany/common/netease/neteaseacc/result/BatchRoomRet.java @@ -0,0 +1,55 @@ +package com.accompany.common.netease.neteaseacc.result; + +import lombok.Data; + +import java.util.List; + + +@Data +public class BatchRoomRet extends BaseNetEaseRet { + /** + { + "noExistRooms": [ //不存在的聊天室id列表 + 6001 + ], + "succRooms": [ + { + "roomid": 6002, + "valid": true, + "announcement": "hi,this is announcement", + "muted": false, + "name": "6002 chatroom", + "broadcasturl": "", + "onlineusercount": 0, + "ext": "6002 ext", + "creator": "zhangsan", + "queuelevel": 0, + "ionotify": true // 聊天室进出通知是否开启 + } + ], + "failRooms": [ //失败的聊天室id,有可能是查的时候有500错误 + 6003 + ], + "code": 200 + } + */ + private List noExistRooms; + private List failRooms; + private List succRooms; + + @Data + public static class RoomInfo { + private Long roomid; + private Boolean vaild; + private String announcement; + private Boolean muted; + private String name; + private String broadcasturl; + private Integer onlineusercount; + private String ext; + private String creator; + private Integer queuelevel; + private Boolean ionotify; + } + +} diff --git a/accompany-base/accompany-core/src/main/java/com/accompany/common/netease/util/NetEaseConstant.java b/accompany-base/accompany-core/src/main/java/com/accompany/common/netease/util/NetEaseConstant.java index 12e02056f..d03d488ea 100644 --- a/accompany-base/accompany-core/src/main/java/com/accompany/common/netease/util/NetEaseConstant.java +++ b/accompany-base/accompany-core/src/main/java/com/accompany/common/netease/util/NetEaseConstant.java @@ -56,6 +56,7 @@ public class NetEaseConstant { public static class RoomUrl { public static String create = "/chatroom/create.action"; public static String get = "/chatroom/get.action"; + public static String getBatch = "/chatroom/getBatch.action"; public static String update = "/chatroom/update.action"; public static String sendMsg = "/chatroom/sendMsg.action"; public static String toggleCloseStat = "/chatroom/toggleCloseStat.action"; diff --git a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/room/RoomService.java b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/room/RoomService.java index f1bca15e0..7e7221dd8 100644 --- a/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/room/RoomService.java +++ b/accompany-business/accompany-business-service/src/main/java/com/accompany/business/service/room/RoomService.java @@ -1906,6 +1906,50 @@ public class RoomService extends BaseService { } } + /** + * 刷新房间在线人数 + */ + public void scanRoomOnline(List roomVoList) { + + Map roomVoMap = roomVoList.stream().collect(Collectors.toMap(RoomVo::getRoomId, roomVo -> roomVo)); + List roomIdList = roomVoList.stream().filter(RoomVo::getValid).map(RoomVo::getRoomId).distinct().collect(Collectors.toList()); + + BatchRoomRet batchRoomRet = erBanNetEaseService.getBatchRoomMessage(roomIdList); + for (BatchRoomRet.RoomInfo roomInfo: batchRoomRet.getSuccRooms()){ + RoomVo roomVo = roomVoMap.get(roomInfo.getRoomid()); + if (null == roomVo){ + continue; + } + int personNum = roomInfo.getOnlineusercount(); + RunningRoomVo runningRoomVo = new RunningRoomVo(); + if (personNum > 0) { + // 牌照房需要过滤机器人 + if (roomVo.getIsPermitRoom() == 1) { + if (roomCleanService.hasRealUserInRoom(roomVo.getRoomId())) { + runningRoomVo.setCount(0); + } else { + // 开房状态时,每扫描一次若在线人数为0,计数器加1 + runningRoomVo.setCount(roomVo.getCount() + 1); + } + } else { + runningRoomVo.setCount(0); + } + } else { + // 开房状态时,每扫描一次若在线人数为0,计数器加1 + runningRoomVo.setCount(roomVo.getCount() + 1); + } + runningRoomVo.setRoomId(roomVo.getRoomId()); + runningRoomVo.setUid(roomVo.getUid()); + runningRoomVo.setOnlineNum(personNum); + + String runningRoomStr = GsonUtil.getDefGson().toJson(runningRoomVo); + jedisService.hwrite(RedisKey.room_running.getKey(), roomVo.getUid().toString(), runningRoomStr); + updateRoomOnlineNumMysql(roomVo.getUid(), personNum); + // 更新房间缓存 + saveRoomCacheByUid(roomVo.getUid()); + } + } + /** * 获取房间在线人数 * diff --git a/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/RefreshPersonTask.java b/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/RefreshPersonTask.java index 92d948888..f47a1e153 100644 --- a/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/RefreshPersonTask.java +++ b/accompany-scheduler/accompany-scheduler-service/src/main/java/com/accompany/scheduler/task/RefreshPersonTask.java @@ -3,6 +3,8 @@ package com.accompany.scheduler.task; import com.accompany.business.service.room.RoomService; import com.accompany.business.vo.RoomVo; import com.accompany.scheduler.base.BaseTask; +import com.alibaba.fastjson.JSON; +import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; @@ -30,12 +32,13 @@ public class RefreshPersonTask extends BaseTask { public void execute(){ log.info("定时任务:刷新人数正在执行。"); List roomList = roomService.getHomeRunningRoomList(); - for (RoomVo roomVo : roomList) { + List> partitionList = Lists.partition(roomList, 20); + for (List list: partitionList){ bizExecutor.execute(()->{ try { - roomService.scanRoomOnline(roomVo); + roomService.scanRoomOnline(list); } catch (Exception e) { - log.error("更新房间人数失败, roomVo:{}", gson.toJson(roomVo), e); + log.error("更新房间人数失败, list:{}", JSON.toJSONString(list), e); } }); }