Ver código fonte

feat:
新增订阅未读数量

18339543638 2 anos atrás
pai
commit
74c04b758a

+ 5 - 0
nb-common/ws-common/src/main/java/com/nb/common/websocket/WebSocketConstant.java

@@ -30,6 +30,8 @@ public class WebSocketConstant {
 
     public static final String IM ="im";
 
+    public static final String IM_UNREAD ="imUnread";
+
     public static final String IM_ALL ="im-all";
     /**
      * 病人监控订阅
@@ -55,6 +57,9 @@ public class WebSocketConstant {
         return TopicWrapper.of(id+"-"+productName+"-"+param+"-"+tenantId,param);
     }
 
+    public static TopicWrapper getImUnreadTopic(String userId){
+        return getTopic(IM_UNREAD,null,userId,null);
+    }
 
     /**
      * 获取 设备状态变化主题

+ 1 - 1
nb-common/ws-common/src/main/java/com/nb/common/websocket/handler/Subscribe.java

@@ -1,6 +1,7 @@
 package com.nb.common.websocket.handler;
 
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.nb.auth.bean.LoginUser;
 import com.nb.common.websocket.*;
@@ -30,7 +31,6 @@ public abstract class Subscribe implements WsHandler {
 
     public TopicWrapper getTopic(String productName,String param,String tenantId){
         return  WebSocketConstant.getTopic(this.getId(),productName, param, tenantId);
-
     };
 
 

+ 1 - 20
nb-im/src/main/java/com/nb/im/controller/ImRoomController.java

@@ -153,26 +153,7 @@ public class ImRoomController implements BaseSaveController<ImRoomEntity,String>
     @PostMapping("/read/unread")
     @ApiOperation("获取未读消息总数量")
     public R<Long> unReadCount(@RequestBody UnreadVo vo){
-        if (StrUtil.isEmpty(vo.getAssistId()) && StrUtil.isEmpty(vo.getDoctorId())) {
-            throw new CustomException("看护人id和医生id不能同时为空");
-        }
-        String userId=StrUtil.isEmpty(vo.getAssistId())?vo.getDoctorId():vo.getAssistId();
-        AtomicLong result=new AtomicLong(0);
-        List<ImRoomEntity> rooms = imRoomService.list(new QueryWrapper<ImRoomEntity>()
-                .lambda()
-                .select(ImRoomEntity::getId)
-                .eq(StrUtil.isNotEmpty(vo.getAssistId()), ImRoomEntity::getAssistId, vo.getAssistId())
-                .eq(StrUtil.isNotEmpty(vo.getDoctorId()), ImRoomEntity::getDoctorId, vo.getDoctorId())
-                .eq(ImRoomEntity::getStatus,ImStatusEnum.SUCCESS)
-        );
-        if(CollectionUtil.isNotEmpty(rooms)){
-            rooms.stream()
-                    .map(ImRoomEntity::getId).map(roomOperatorManager::getRoomOperator)
-                    .forEach(operator->{
-                        result.addAndGet(operator.unReadCount(userId));
-                    });
-        }
-        return R.success(result.get());
+        return R.success(msgService.unReadCount(vo));
     }
 
     @Override

+ 41 - 0
nb-im/src/main/java/com/nb/im/service/LocalImMsgService.java

@@ -1,20 +1,31 @@
 package com.nb.im.service;
 
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.nb.app.msg.enums.MsgEnum;
 import com.nb.auth.enums.StpTypeEnum;
 import com.nb.common.crud.BaseService;
+import com.nb.core.exception.CustomException;
+import com.nb.im.controller.vo.UnreadVo;
 import com.nb.im.entity.ImMsgEntity;
+import com.nb.im.entity.ImRoomEntity;
 import com.nb.im.enums.ImMsgType;
+import com.nb.im.enums.ImStatusEnum;
 import com.nb.im.enums.SponsorEnum;
 import com.nb.im.event.ImMsgEvent;
 import com.nb.im.mapper.ImRoomMsgMapper;
+import com.nb.im.room.ImRoomOperatorManager;
 import com.nb.im.utils.ImUtils;
 import com.nb.im.ws.PubMsgInfo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+import java.util.concurrent.atomic.AtomicLong;
+
 /**
  * @author lifang
  * @version 1.0.0
@@ -25,6 +36,13 @@ import org.springframework.stereotype.Service;
 @Service
 public class LocalImMsgService extends BaseService<ImRoomMsgMapper, ImMsgEntity,String> {
 
+    @Autowired
+    @Lazy
+    private LocalImRoomService imRoomService;
+
+    @Autowired
+    @Lazy
+    private ImRoomOperatorManager roomOperatorManager;
 
     @Override
     public void validateBeforeSave(ImMsgEntity entity) {
@@ -46,4 +64,27 @@ public class LocalImMsgService extends BaseService<ImRoomMsgMapper, ImMsgEntity,
     public void validateBeforeDelete(String id) {
 
     }
+
+    public Long unReadCount(UnreadVo vo){
+        if (StrUtil.isEmpty(vo.getAssistId()) && StrUtil.isEmpty(vo.getDoctorId())) {
+            throw new CustomException("看护人id和医生id不能同时为空");
+        }
+        String userId=StrUtil.isEmpty(vo.getAssistId())?vo.getDoctorId():vo.getAssistId();
+        AtomicLong result=new AtomicLong(0);
+        List<ImRoomEntity> rooms = imRoomService.list(new QueryWrapper<ImRoomEntity>()
+                .lambda()
+                .select(ImRoomEntity::getId)
+                .eq(StrUtil.isNotEmpty(vo.getAssistId()), ImRoomEntity::getAssistId, vo.getAssistId())
+                .eq(StrUtil.isNotEmpty(vo.getDoctorId()), ImRoomEntity::getDoctorId, vo.getDoctorId())
+                .eq(ImRoomEntity::getStatus, ImStatusEnum.SUCCESS)
+        );
+        if(CollectionUtil.isNotEmpty(rooms)){
+            rooms.stream()
+                    .map(ImRoomEntity::getId).map(roomOperatorManager::getRoomOperator)
+                    .forEach(operator->{
+                        result.addAndGet(operator.unReadCount(userId));
+                    });
+        }
+        return result.get();
+    }
 }

+ 17 - 5
nb-im/src/main/java/com/nb/im/utils/ImUtils.java

@@ -2,6 +2,7 @@ package com.nb.im.utils;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.nb.common.websocket.PubResponse;
@@ -9,6 +10,7 @@ import com.nb.common.websocket.TopicMessage;
 import com.nb.common.websocket.WebSocketConstant;
 import com.nb.common.websocket.handler.TopicWrapper;
 import com.nb.common.websocket.msg.MessageResponse;
+import com.nb.im.controller.vo.UnreadVo;
 import com.nb.im.entity.ImMsgEntity;
 import com.nb.im.entity.ImRoomEntity;
 import com.nb.im.entity.ImRoomUserEntity;
@@ -26,6 +28,7 @@ import org.redisson.api.RedissonClient;
 import org.springframework.stereotype.Component;
 import org.tio.core.ChannelContext;
 import org.tio.core.Tio;
+import org.tio.core.utils.TioUtils;
 import org.tio.websocket.common.WsPacket;
 import org.tio.websocket.common.WsResponse;
 
@@ -127,14 +130,23 @@ public class ImUtils {
                     }
                 });
 
-        if(!pubMsgInfo.isTmp()){
-            String senderId = pubMsgInfo.getSenderId();
-            roomOperator.addUnreadMsg(senderId.equals(roomOperator.getAssitId())?roomOperator.getDoctorId():roomOperator.getAssitId(),Arrays.asList(pubMsgInfo.getKey()));
-            //消息发送给个人
-            String receiveId=senderId.equals(roomOperator.getAssitId())?roomOperator.getDoctorId():roomOperator.getAssitId();
+        String senderId = pubMsgInfo.getSenderId();
+        roomOperator.addUnreadMsg(senderId.equals(roomOperator.getAssitId())?roomOperator.getDoctorId():roomOperator.getAssitId(),Arrays.asList(pubMsgInfo.getKey()));
+        //消息发送给个人
+        String receiveId=senderId.equals(roomOperator.getAssitId())?roomOperator.getDoctorId():roomOperator.getAssitId();
 
+        if(!pubMsgInfo.isTmp()){
             pubTopicMap.computeIfAbsent( WebSocketConstant.getAllImByUserId(receiveId).getTopic(), k->redissonClient.getTopic(k))
                     .publishAsync( TopicMessage.of(roomMsg,param,pubMsgInfo.getKey()));
         }
+
+        UnreadVo unreadVo = new UnreadVo();
+        if(StrUtil.equals(pubMsgInfo.getSenderId(),roomOperator.getAssitId())){
+            unreadVo.setDoctorId(receiveId);
+        }else {
+            unreadVo.setAssistId(receiveId);
+        }
+        Long unReadCount = imRoomMsgService.unReadCount(unreadVo);
+        redissonClient.getTopic(WebSocketConstant.getImUnreadTopic(receiveId).getTopic()).publishAsync(TopicMessage.of(unReadCount,receiveId,pubMsgInfo.getKey()));
     }
 }

+ 31 - 0
nb-im/src/main/java/com/nb/im/ws/ImUnreadSubscribe.java

@@ -0,0 +1,31 @@
+package com.nb.im.ws;
+
+import com.nb.common.websocket.WebSocketConstant;
+import com.nb.common.websocket.handler.Subscribe;
+import org.springframework.stereotype.Component;
+import org.tio.core.ChannelContext;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName ImSubscribe.java
+ * @Description 即时通信未读消息主题
+ * @createTime 2022年08月16日 14:01:00
+ */
+@Component
+public class ImUnreadSubscribe extends Subscribe {
+    @Override
+    public String getId() {
+        return WebSocketConstant.IM_UNREAD;
+    }
+
+    @Override
+    public void close(ChannelContext channelContext) {
+
+    }
+
+    @Override
+    public boolean needParam() {
+        return true;
+    }
+}