瀏覽代碼

优化 聊天室列表

18339543638 3 年之前
父節點
當前提交
11bb344aee

+ 9 - 10
nb-im/src/main/java/com/nb/im/controller/ImRoomController.java

@@ -9,7 +9,6 @@ import com.baomidou.mybatisplus.core.mapper.Mapper;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicLong;
 
-import com.nb.app.assistant.api.feign.IAssistantUserBindClient;
 import com.nb.auth.utils.SecurityUtil;
 import com.nb.common.crud.BaseService;
 import com.nb.common.crud.controller.BaseSaveController;
@@ -23,8 +22,8 @@ import com.nb.im.entity.ImRoomEntity;
 import com.nb.im.room.ImRoomOperator;
 import com.nb.im.room.ImRoomOperatorManager;
 import com.nb.im.service.LocalImMsgService;
-import com.nb.im.service.dto.ImRoomDetailDto;
-import com.nb.im.service.dto.ImRoomDto;
+import com.nb.im.service.dto.ImRoomDTO;
+import com.nb.im.service.dto.ImRoomDetailDTO;
 import com.nb.im.enums.ImStatusEnum;
 import com.nb.im.enums.SponsorEnum;
 import com.nb.im.service.LocalImRoomService;
@@ -62,7 +61,7 @@ public class ImRoomController implements BaseSaveController<ImRoomEntity,String>
 
     @ApiOperation(value = "查询并自动创建与病人看护人的聊天室",notes = "若存在,则返回聊天室信息,若不存在,则返回空")
     @PostMapping("/look")
-    public R<ImRoomEntity> getChatRoom(@RequestBody@Validated ImRoomDto source){
+    public R<ImRoomEntity> getChatRoom(@RequestBody@Validated ImRoomDTO source){
         log.info("查询并自动创建与病人看护人的聊天室,{}", JSONUtil.toJsonStr(source));
         if(Boolean.TRUE.equals(source.isAutoCreate())&&StrUtil.isEmpty(source.getDoctorNickname())){
             throw new CustomException("医生昵称不可为空");
@@ -98,17 +97,17 @@ public class ImRoomController implements BaseSaveController<ImRoomEntity,String>
     public R<List<ImRoomResult>> list(@RequestBody @Validated ImRoomQuery query){
         List<ImRoomResult> result= imRoomService.getBaseMapper().queryPageNoneMsgBlurry(query);
         String userId = String.valueOf(SecurityUtil.getId());
-        result.forEach(room->
-                room.setUnreadCount( roomOperatorManager.getRoomOperator(room.getId())
-                        .unReadCount(userId))
-        );
+        result.parallelStream().forEach(room->
+                room.setUnreadCount( roomOperatorManager.getRoomOperator(room)
+                        .unReadCount(userId)
+        ));
         return R.success(result);
     }
 
     @GetMapping("/view/{id}")
     @ApiOperation(value = "根据id查询聊天室")
-    public R<ImRoomDetailDto> getById(@PathVariable("id") String id){
-        ImRoomDetailDto result= BeanUtil.toBean(imRoomService.getById(id),ImRoomDetailDto.class);
+    public R<ImRoomDetailDTO> getById(@PathVariable("id") String id){
+        ImRoomDetailDTO result= BeanUtil.toBean(imRoomService.getById(id), ImRoomDetailDTO.class);
         if(result!=null){
             result.setUnreadCount( roomOperatorManager.getRoomOperator(result.getId())
                     .unReadCount( String.valueOf(SecurityUtil.getId())));

+ 8 - 12
nb-im/src/main/java/com/nb/im/listener/ConsultMsgListener.java

@@ -1,11 +1,11 @@
 package com.nb.im.listener;
 
-import cn.hutool.core.date.DateUnit;
-import cn.hutool.core.date.DateUtil;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.nb.app.msg.bean.MsgBean;
 import com.nb.app.msg.enums.MsgEnum;
 import com.nb.app.msg.event.SaveMsgEvent;
+import com.nb.core.exception.CustomException;
 import com.nb.im.entity.ImRoomEntity;
 import com.nb.im.entity.ImMsgEntity;
 import com.nb.im.entity.ImRoomUserEntity;
@@ -17,13 +17,12 @@ import com.nb.im.service.LocalImRoomUserService;
 import com.nb.im.utils.ImUtils;
 import com.nb.im.ws.PubMsgInfo;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.event.EventListener;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Date;
-
 /**
  * @author lifang
  * @version 1.0.0
@@ -32,6 +31,7 @@ import java.util.Date;
  * @createTime 2022年08月16日 10:29:00
  */
 @Configuration
+@Slf4j
 @AllArgsConstructor
 public class ConsultMsgListener {
 
@@ -64,12 +64,12 @@ public class ConsultMsgListener {
         if(existRoom==null){
             if (chatRoomService.save(room)) {
                 createRoomUser(payload, room);
+            }else {
+                log.error("创建聊天室失败,{}", JSONUtil.toJsonStr(source));
+                throw new CustomException("创建聊天室失败");
             }
         }else {
-            Date createTime = existRoom.getCreateTime();
-            if(DateUtil.between(new Date(),createTime, DateUnit.HOUR)<24){
-                room=existRoom;
-            }
+            room=existRoom;
         }
 
         ImMsgEntity roomMsg = ImMsgEntity.createRoomMsg(payload, room);
@@ -91,10 +91,6 @@ public class ConsultMsgListener {
                 .build()
         );
         room.setLastMsgId(roomMsg.getId());
-        if (!roomOperator.isOnlineDoctor()) {
-            //医生不在线,发送短信通知
-
-        }
     }
 
 

+ 22 - 15
nb-im/src/main/java/com/nb/im/room/ImRoomOperator.java

@@ -1,6 +1,5 @@
 package com.nb.im.room;
 
-import com.nb.im.entity.ImRoomEntity;
 import lombok.Getter;
 import org.redisson.api.*;
 
@@ -9,6 +8,8 @@ import java.time.temporal.ChronoUnit;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.*;
+import java.util.function.Function;
+
 /**
  * @author lifang
  * @version 1.0.0
@@ -25,7 +26,7 @@ public class ImRoomOperator {
     private final String assitId;
     @Getter
     private final String doctorId;
-
+    private  Function<String,Long> supplierMaxSort;
     @Getter
     private final Date startTime;
 
@@ -36,26 +37,31 @@ public class ImRoomOperator {
     private Map<String, RSet<String>> unReadMap=new HashMap<>();
 
 
-    public ImRoomOperator(String id, RedissonClient redissonClient, ImRoomEntity room,long maxSort, List<String> userIds) {
+    public ImRoomOperator(String id, RedissonClient redissonClient, Function<String,Long> supplierMaxSort, String assitId, String doctorId) {
         this.id=id;
         this.msgKeyFilter = redissonClient.getBloomFilter("im:msg-key."+id);
         this.msgKeyFilter.tryInit(55000000L, 0.03);
-        this.atomicLong = redissonClient.getAtomicLong("im:incr." + id);
         this.redissonClient=redissonClient;
-        this.assitId=room.getAssistId();
-        this.doctorId=room.getDoctorId();
         this.startTime=new Date();
-        userIds
-                .forEach(userId-> unReadMap.computeIfAbsent(userId,k->redissonClient.getSet("im:unread:"+id+":"+userId)));
+        this.assitId=assitId;
+        this.doctorId=doctorId;
+        this.supplierMaxSort=supplierMaxSort;
 
-        atomicLong.getAsync()
-                .thenAcceptAsync(count->{
-                    if(count==null){
-                        atomicLong.set(maxSort);
-                    }
-                });
+        Arrays.asList(assitId,doctorId)
+                .forEach(userId-> unReadMap.computeIfAbsent(userId,k->redissonClient.getSet("im:unread:"+id+":"+userId)));
     }
 
+    private synchronized void initMaxSort(){
+        if(this.atomicLong==null){
+            this.atomicLong = redissonClient.getAtomicLong("im:incr." + id);
+            atomicLong.getAsync()
+                    .thenAcceptAsync(count->{
+                        if(count==null){
+                            atomicLong.set(supplierMaxSort.apply(id ));
+                        }
+                    });
+        }
+    }
 
     /**
      * 描述: 用户发送了消息,对该房间其他人进行未读消息设置
@@ -124,6 +130,7 @@ public class ImRoomOperator {
      * @return Long
      */
     public Long generateSortId(){
+        initMaxSort();
         return atomicLong.addAndGet(1);
     }
 
@@ -162,6 +169,6 @@ public class ImRoomOperator {
     }
 
     public void setDoctorOnline(boolean online){
-         this.doctorOnline=online;
+        this.doctorOnline=online;
     }
 }

+ 24 - 17
nb-im/src/main/java/com/nb/im/room/ImRoomOperatorManager.java

@@ -3,9 +3,11 @@ package com.nb.im.room;
 import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.nb.im.entity.ImRoomEntity;
 import com.nb.im.entity.ImRoomUserEntity;
 import com.nb.im.service.LocalImRoomService;
 import com.nb.im.service.LocalImRoomUserService;
+import com.nb.im.service.dto.ImRoomResult;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -36,14 +38,10 @@ public class ImRoomOperatorManager {
     @Autowired
     private LocalImRoomService roomService;
 
-    @Autowired
-    private LocalImRoomUserService roomUserService;
-
     private final ScheduledExecutorService singleThreadEventExecutor = Executors.newSingleThreadScheduledExecutor();
-    public ImRoomOperatorManager(RedissonClient redissonClient, LocalImRoomService roomService, LocalImRoomUserService roomUserService) {
+    public ImRoomOperatorManager(RedissonClient redissonClient, LocalImRoomService roomService) {
         this.redissonClient = redissonClient;
         this.roomService = roomService;
-        this.roomUserService = roomUserService;
     }
 
     @PostConstruct
@@ -67,21 +65,30 @@ public class ImRoomOperatorManager {
         },24,24, TimeUnit.HOURS);
     }
 
-    public ImRoomOperator getRoomOperator(String roomId){
-        return imRoomOperatorMap.computeIfAbsent(new String(roomId),k->
-                new ImRoomOperator(roomId,
+    public ImRoomOperator getRoomOperator(ImRoomResult room){
+        return imRoomOperatorMap.computeIfAbsent(room.getId(),k->
+                new ImRoomOperator(room.getId(),
                         redissonClient,
-                        roomService.getById(roomId),
-                        roomService.getMasSort(roomId),
-                        roomUserService.list(new QueryWrapper<ImRoomUserEntity>()
-                                .lambda()
-                                .eq(ImRoomUserEntity::getImRoomId,roomId))
-                                .stream()
-                                .map(ImRoomUserEntity::getUserId)
-                                .collect(Collectors.toList())
-
+                        roomId->roomService.getMasSort(room.getId()),
+                        room.getAssistId(),
+                        room.getDoctorId()
                 )
         );
     }
 
+    public ImRoomOperator getRoomOperator(String roomId){
+        return imRoomOperatorMap.computeIfAbsent(roomId,k->{
+            ImRoomEntity room = roomService.getById(roomId);
+                    return  new ImRoomOperator(roomId,
+                            redissonClient,
+                            _roomId->roomService.getMasSort(roomId),
+                            room.getAssistId(),
+                            room.getDoctorId()
+
+                    );
+                }
+
+        );
+    }
+
 }

+ 3 - 2
nb-im/src/main/java/com/nb/im/service/LocalImRoomService.java

@@ -29,13 +29,14 @@ import com.nb.im.event.ImFinishedEvent;
 import com.nb.im.mapper.ImRoomMapper;
 import com.nb.im.room.ImRoomOperator;
 import com.nb.im.room.ImRoomOperatorManager;
-import com.nb.im.service.dto.ImRoomDto;
+import com.nb.im.service.dto.ImRoomDTO;
 import com.nb.im.utils.ImUtils;
 import com.nb.im.ws.PubMsgInfo;
 import com.nb.web.api.feign.IPatientClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.context.event.EventListener;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -179,7 +180,7 @@ public class LocalImRoomService extends BaseService<ImRoomMapper, ImRoomEntity,S
      * @return void
      */
     @Transactional(rollbackFor = Exception.class)
-    public ImRoomEntity createChatRoom(ImRoomDto source) {
+    public ImRoomEntity createChatRoom(ImRoomDTO source) {
         ImRoomEntity result = new ImRoomEntity();
         result.setAssistId(source.getAssistId());
         result.setPatientId(source.getPatientId());

+ 2 - 2
nb-im/src/main/java/com/nb/im/service/dto/ImRoomDto.java → nb-im/src/main/java/com/nb/im/service/dto/ImRoomDTO.java

@@ -15,13 +15,13 @@ import javax.validation.constraints.NotNull;
 /**
  * @author lifang
  * @version 1.0.0
- * @ClassName ImRoomDto.java
+ * @ClassName ImRoomDTO.java
  * @Description TODO
  * @createTime 2022年08月16日 16:35:00
  */
 @Data
 @ApiModel("聊天室")
-public class ImRoomDto {
+public class ImRoomDTO {
     @ApiModelProperty(value = "医生id",required = true)
     @NotNull(message = "医生id不能为空")
     private String doctorId;

+ 2 - 2
nb-im/src/main/java/com/nb/im/service/dto/ImRoomDetailDto.java → nb-im/src/main/java/com/nb/im/service/dto/ImRoomDetailDTO.java

@@ -14,12 +14,12 @@ import java.util.Date;
 /**
  * @author lifang
  * @version 1.0.0
- * @ClassName ImRoomDetailDto.java
+ * @ClassName ImRoomDetailDTO.java
  * @Description TODO
  * @createTime 2022年09月06日 10:11:00
  */
 @Data
-public class ImRoomDetailDto {
+public class ImRoomDetailDTO {
 
     private String id;