Browse Source

fix ws授权模块

18339543638 3 years ago
parent
commit
b6d6c02fa4
20 changed files with 361 additions and 34 deletions
  1. 5 0
      nb-admin/pom.xml
  2. 0 20
      nb-common/ws-common/src/main/java/com/nb/common/websocket/DefaultRedisCallBack.java
  3. 9 0
      nb-common/ws-common/src/main/java/com/nb/common/websocket/DefaultWebSocketMsgHandler.java
  4. 68 0
      nb-common/ws-common/src/main/java/com/nb/common/websocket/WebSocketSessionLifeCycleManage.java
  5. 24 0
      nb-common/ws-common/src/main/java/com/nb/common/websocket/event/ConnectedEvent.java
  6. 24 0
      nb-common/ws-common/src/main/java/com/nb/common/websocket/event/DisConnectedEvent.java
  7. 44 0
      nb-common/ws-common/src/main/java/com/nb/common/websocket/handler/DefaultCloseHandler.java
  8. 1 1
      nb-core/src/main/java/com/nb/core/Constants.java
  9. 9 2
      nb-core/src/main/java/com/nb/core/cache/manager/ClusterStorageManager.java
  10. 1 0
      nb-core/src/main/java/com/nb/core/cache/manager/ConfigStorageManager.java
  11. 21 0
      nb-im/pom.xml
  12. 16 0
      nb-im/src/main/java/com/nb/im/ImAutoConfiguration.java
  13. 30 0
      nb-im/src/main/java/com/nb/im/doc/ImDocConfig.java
  14. 3 0
      nb-im/src/main/resources/META-INF/spring.factories
  15. 3 2
      nb-service/app-assistant/src/main/java/com/nb/app/assistant/service/LocalAssistantUserBindService.java
  16. 34 4
      nb-service/app-doctor/src/main/java/com/nb/app/doctor/controller/PatientMonitorController.java
  17. 41 0
      nb-service/app-doctor/src/main/java/com/nb/app/doctor/service/AssistLifeCycleService.java
  18. 22 0
      nb-service/app-doctor/src/main/java/com/nb/app/doctor/service/dto/PatientMonitorConsultResult.java
  19. 0 5
      nb-service/web-service/src/main/java/com/nb/web/service/bus/websocket/topic/WebSocketCloseHandler.java
  20. 6 0
      pom.xml

+ 5 - 0
nb-admin/pom.xml

@@ -12,6 +12,11 @@
     <artifactId>nb-admin</artifactId>
     <artifactId>nb-admin</artifactId>
 
 
     <dependencies>
     <dependencies>
+        <dependency>
+            <groupId>com.tuoren</groupId>
+            <artifactId>nb-im</artifactId>
+            <version>${nb.version}</version>
+        </dependency>
         <dependency>
         <dependency>
             <groupId>com.tuoren</groupId>
             <groupId>com.tuoren</groupId>
             <artifactId>app-msg</artifactId>
             <artifactId>app-msg</artifactId>

+ 0 - 20
nb-common/ws-common/src/main/java/com/nb/common/websocket/DefaultRedisCallBack.java

@@ -1,20 +0,0 @@
-package com.nb.common.websocket;
-
-import org.springframework.dao.DataAccessException;
-import org.springframework.data.redis.connection.RedisConnection;
-import org.springframework.data.redis.core.RedisCallback;
-
-/**
- * @author lifang
- * @version 1.0.0
- * @ClassName DefaultRedisCallBack.java
- * @Description TODO
- * @createTime 2022年03月25日 16:14:00
- */
-public class DefaultRedisCallBack implements RedisCallback<Object> {
-    @Override
-    public Object doInRedis(RedisConnection connection) throws DataAccessException {
-
-        return null;
-    }
-}

+ 9 - 0
nb-common/ws-common/src/main/java/com/nb/common/websocket/DefaultWebSocketMsgHandler.java

@@ -3,7 +3,10 @@ package com.nb.common.websocket;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.text.CharSequenceUtil;
 import cn.hutool.core.text.CharSequenceUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.extra.spring.SpringUtil;
 import cn.hutool.json.JSONUtil;
 import cn.hutool.json.JSONUtil;
+import com.nb.auth.bean.LoginUser;
+import com.nb.common.websocket.event.ConnectedEvent;
 import com.nb.common.websocket.handler.HisMsgHandler;
 import com.nb.common.websocket.handler.HisMsgHandler;
 import com.nb.common.websocket.ws.IWebSocketAuthFilter;
 import com.nb.common.websocket.ws.IWebSocketAuthFilter;
 import com.nb.core.Constants;
 import com.nb.core.Constants;
@@ -25,6 +28,8 @@ import org.tio.websocket.server.handler.IWsMsgHandler;
 import java.util.*;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
+import static com.nb.core.Constants.LOGIN_USER_KEY;
+
 @Component
 @Component
 @Slf4j
 @Slf4j
 @AllArgsConstructor
 @AllArgsConstructor
@@ -54,6 +59,10 @@ public class DefaultWebSocketMsgHandler implements IWsMsgHandler {
         }
         }
         boolean match = authFilters.stream().anyMatch(filter -> Boolean.TRUE.equals(filter.auth(httpRequest, httpResponse, channelContext)));
         boolean match = authFilters.stream().anyMatch(filter -> Boolean.TRUE.equals(filter.auth(httpRequest, httpResponse, channelContext)));
         if(match){
         if(match){
+            Object loginUser = channelContext.get(LOGIN_USER_KEY);
+            if(loginUser!=null&&loginUser instanceof LoginUser){
+                SpringUtil.publishEvent(new ConnectedEvent(this, (LoginUser) loginUser,channelContext));
+            }
             Tio.send(channelContext,WsResponse.fromText(JSONUtil.toJsonStr(R.success("连接成功")),"utf-8"));
             Tio.send(channelContext,WsResponse.fromText(JSONUtil.toJsonStr(R.success("连接成功")),"utf-8"));
         }else {
         }else {
             Tio.send(channelContext,WsResponse.fromText(JSONUtil.toJsonStr(R.fail("授权失败")), WsPacket.CHARSET_NAME));
             Tio.send(channelContext,WsResponse.fromText(JSONUtil.toJsonStr(R.fail("授权失败")), WsPacket.CHARSET_NAME));

+ 68 - 0
nb-common/ws-common/src/main/java/com/nb/common/websocket/WebSocketSessionLifeCycleManage.java

@@ -0,0 +1,68 @@
+package com.nb.common.websocket;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.nb.auth.bean.LoginUser;
+import com.nb.common.websocket.event.ConnectedEvent;
+import com.nb.common.websocket.event.DisConnectedEvent;
+import com.nb.core.cache.ConfigStorage;
+import com.nb.core.cache.manager.ConfigStorageManager;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName WebSocketSessionLifeCycleManage.java
+ * @Description websocket生命周期管理
+ * @createTime 2022年08月13日 16:46:00
+ */
+@Component
+public class WebSocketSessionLifeCycleManage {
+    private final ConfigStorage configStorage;
+
+    public WebSocketSessionLifeCycleManage (ConfigStorageManager configStorageManager){
+        configStorage=configStorageManager.getStorage("ws-lifecycle",false);
+    }
+
+
+    public boolean isOnline(String userId){
+        List channelIds = configStorage.getConfig(userId).as(ArrayList.class);
+        return CollectionUtil.isNotEmpty(channelIds);
+    }
+
+    /**
+     * 描述: 看护人上线
+     * @author lifang
+     * @date 2022/8/13 16:41
+     * @param event
+     * @return void
+     */
+    @EventListener
+    public void connected(ConnectedEvent event){
+        LoginUser loginUser = event.getLoginUser();
+        String key=String.valueOf(loginUser.getId());
+        List channelIds = Optional.ofNullable(configStorage.getConfig(key).as(ArrayList.class)).orElse(new ArrayList());
+        channelIds.add(key);
+        configStorage.setConfig(key,channelIds);
+    }
+
+    /**
+     * 描述: 看护人下线
+     * @author lifang
+     * @date 2022/8/13 16:41
+     * @param event
+     * @return void
+     */
+    @EventListener
+    public void disconnected(DisConnectedEvent event){
+        LoginUser loginUser = event.getLoginUser();
+        String key=String.valueOf(loginUser.getId());
+        List channelIds = configStorage.getConfig(key).as(ArrayList.class);
+        if (CollectionUtil.isNotEmpty(channelIds)) {
+            channelIds.remove(key);
+            configStorage.setConfig(key,channelIds);
+        }
+    }
+}

+ 24 - 0
nb-common/ws-common/src/main/java/com/nb/common/websocket/event/ConnectedEvent.java

@@ -0,0 +1,24 @@
+package com.nb.common.websocket.event;
+
+import com.nb.auth.bean.LoginUser;
+import lombok.Getter;
+import org.springframework.context.ApplicationEvent;
+import org.tio.core.ChannelContext;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName ConnectEvent.java
+ * @Description TODO
+ * @createTime 2022年08月13日 16:35:00
+ */
+@Getter
+public class ConnectedEvent  extends ApplicationEvent {
+    private LoginUser loginUser;
+    private ChannelContext channelContext;
+    public ConnectedEvent(Object source, LoginUser loginUser, ChannelContext channelContext) {
+        super(source);
+        this.channelContext=channelContext;
+        this.loginUser=loginUser;
+    }
+}

+ 24 - 0
nb-common/ws-common/src/main/java/com/nb/common/websocket/event/DisConnectedEvent.java

@@ -0,0 +1,24 @@
+package com.nb.common.websocket.event;
+
+import com.nb.auth.bean.LoginUser;
+import lombok.Getter;
+import org.springframework.context.ApplicationEvent;
+import org.tio.core.ChannelContext;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName ConnectEvent.java
+ * @Description TODO
+ * @createTime 2022年08月13日 16:35:00
+ */
+@Getter
+public class DisConnectedEvent extends ApplicationEvent {
+    private LoginUser loginUser;
+    private ChannelContext channelContext;
+    public DisConnectedEvent(Object source, LoginUser loginUser, ChannelContext channelContext) {
+        super(source);
+        this.channelContext=channelContext;
+        this.loginUser=loginUser;
+    }
+}

+ 44 - 0
nb-common/ws-common/src/main/java/com/nb/common/websocket/handler/DefaultCloseHandler.java

@@ -0,0 +1,44 @@
+package com.nb.common.websocket.handler;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.nb.auth.bean.LoginUser;
+import com.nb.common.websocket.MessagingRequest;
+import com.nb.common.websocket.event.ConnectedEvent;
+import com.nb.common.websocket.event.DisConnectedEvent;
+import org.springframework.stereotype.Component;
+import org.tio.core.ChannelContext;
+
+import static com.nb.core.Constants.LOGIN_USER_KEY;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName DefaultCloseHandler.java
+ * @Description TODO
+ * @createTime 2022年08月13日 16:38:00
+ */
+@Component
+public class DefaultCloseHandler implements WsHandler {
+    @Override
+    public String getId() {
+        return null;
+    }
+
+    @Override
+    public void onMessage(MessagingRequest message, ChannelContext channelContext) {
+
+    }
+
+    @Override
+    public void close(ChannelContext channelContext) {
+        Object loginUser = channelContext.get(LOGIN_USER_KEY);
+        if(loginUser!=null&&loginUser instanceof LoginUser){
+            SpringUtil.publishEvent(new DisConnectedEvent(this, (LoginUser) loginUser,channelContext));
+        }
+    }
+
+    @Override
+    public boolean needParam() {
+        return false;
+    }
+}

+ 1 - 1
nb-core/src/main/java/com/nb/core/Constants.java

@@ -15,7 +15,7 @@ public class Constants {
     /**
     /**
      * sa token, token session, user key
      * sa token, token session, user key
      */
      */
-    public static final String LOGIN_USER_KEY = "user";
+    public static final String LOGIN_USER_KEY = "loginUser";
 
 
     public static final String HOSPITAL_ID = "hospital_id";
     public static final String HOSPITAL_ID = "hospital_id";
 
 

+ 9 - 2
nb-core/src/main/java/com/nb/core/cache/manager/ClusterStorageManager.java

@@ -26,7 +26,7 @@ public class ClusterStorageManager implements ConfigStorageManager {
 
 
     private final AppProperties appProperties;
     private final AppProperties appProperties;
 
 
-    private Map<String,ClusterConfigStorage > storageMap=new ConcurrentHashMap<>();
+    private Map<String,ConfigStorage > storageMap=new ConcurrentHashMap<>();
 
 
     public ClusterStorageManager(RedisTemplate redisTemplate,AppProperties appProperties) {
     public ClusterStorageManager(RedisTemplate redisTemplate,AppProperties appProperties) {
         this.redisTemplate=redisTemplate;
         this.redisTemplate=redisTemplate;
@@ -35,7 +35,14 @@ public class ClusterStorageManager implements ConfigStorageManager {
 
 
     @Override
     @Override
     public ConfigStorage getStorage(String id) {
     public ConfigStorage getStorage(String id) {
-        return  storageMap.computeIfAbsent(id, __ -> new ClusterConfigStorage(redisTemplate, appProperties.getCachePrefix()+":"+id));
+        return  getStorage(id,false);
+    }
+
+    @Override
+    public ConfigStorage getStorage(String id, boolean ignorePrefix) {
+        return ignorePrefix?
+                storageMap.computeIfAbsent(id, __ -> new ClusterConfigStorage(redisTemplate, id)):
+                storageMap.computeIfAbsent(id, __ -> new ClusterConfigStorage(redisTemplate, appProperties.getCachePrefix()+":"+id));
     }
     }
 
 
 }
 }

+ 1 - 0
nb-core/src/main/java/com/nb/core/cache/manager/ConfigStorageManager.java

@@ -14,4 +14,5 @@ public interface ConfigStorageManager {
 
 
     ConfigStorage getStorage(String id);
     ConfigStorage getStorage(String id);
 
 
+    ConfigStorage getStorage(String id,boolean ignorePrefix);
 }
 }

+ 21 - 0
nb-im/pom.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>nb-root</artifactId>
+        <groupId>com.tuoren</groupId>
+        <version>1.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>nb-im</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.tuoren</groupId>
+            <artifactId>ws-common</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>

+ 16 - 0
nb-im/src/main/java/com/nb/im/ImAutoConfiguration.java

@@ -0,0 +1,16 @@
+package com.nb.im;
+
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName ConfigAutoConfiguration.java
+ * @Description TODO
+ * @createTime 2022年08月02日 10:03:00
+ */
+@Configuration
+@ComponentScan("com.nb.im")
+public class ImAutoConfiguration {
+}

+ 30 - 0
nb-im/src/main/java/com/nb/im/doc/ImDocConfig.java

@@ -0,0 +1,30 @@
+package com.nb.im.doc;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName SwaggerDocConfig.java
+ * @Description TODO
+ * @createTime 2022年08月01日 22:01:00
+ */
+@Component
+public class ImDocConfig {
+
+    @Bean
+    public Docket imDoc(){
+        return new Docket(DocumentationType.SWAGGER_2)
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.nb.im.controller"))
+                .paths(PathSelectors.any())
+                .build()
+                .groupName("即时通信模块");
+    }
+
+}

+ 3 - 0
nb-im/src/main/resources/META-INF/spring.factories

@@ -0,0 +1,3 @@
+# RedisDelayQueueAutoConfiguration ×Ô¶¯×°ÅäÉùÃ÷
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+com.nb.im.ImAutoConfiguration

+ 3 - 2
nb-service/app-assistant/src/main/java/com/nb/app/assistant/service/LocalAssistantUserBindService.java

@@ -4,6 +4,7 @@ import cn.hutool.extra.spring.SpringUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.nb.app.assistant.api.entity.AssistantUserBindEntity;
 import com.nb.app.assistant.api.entity.AssistantUserBindEntity;
 import com.nb.app.assistant.api.feign.IAssistantUserBindClient;
 import com.nb.app.assistant.api.feign.IAssistantUserBindClient;
+import com.nb.app.assistant.api.feign.result.AssistantUserResult;
 import com.nb.app.assistant.entity.AssistantUserEntity;
 import com.nb.app.assistant.entity.AssistantUserEntity;
 import com.nb.app.assistant.api.enums.ApplyEnum;
 import com.nb.app.assistant.api.enums.ApplyEnum;
 import com.nb.app.assistant.api.enums.BindEnum;
 import com.nb.app.assistant.api.enums.BindEnum;
@@ -51,7 +52,7 @@ public class LocalAssistantUserBindService extends BaseService<AssistantUserBind
     @Override
     @Override
     public boolean save(AssistantUserBindEntity entity) {
     public boolean save(AssistantUserBindEntity entity) {
         String id = String.valueOf(SecurityUtil.getId());
         String id = String.valueOf(SecurityUtil.getId());
-        AssistantUserEntity currentUser = userService.getById(id);
+        AssistantUserResult currentUser = userService.getById(id);
         entity.setStatus(BindEnum.WAITING);
         entity.setStatus(BindEnum.WAITING);
         entity.setAssistId(currentUser.getId());
         entity.setAssistId(currentUser.getId());
         entity.setAssistNickname(currentUser.getNickname());
         entity.setAssistNickname(currentUser.getNickname());
@@ -89,7 +90,7 @@ public class LocalAssistantUserBindService extends BaseService<AssistantUserBind
     public void painCall(String bindId) {
     public void painCall(String bindId) {
         //todo
         //todo
         AssistantUserBindEntity userBind = this.getById(bindId);
         AssistantUserBindEntity userBind = this.getById(bindId);
-        AssistantUserEntity user = userService.getById(userBind.getAssistId());
+        AssistantUserResult user = userService.getById(userBind.getAssistId());
         SpringUtil.publishEvent(new SaveMsgEvent(
         SpringUtil.publishEvent(new SaveMsgEvent(
                 this,
                 this,
                 MsgBean.builder()
                 MsgBean.builder()

+ 34 - 4
nb-service/app-doctor/src/main/java/com/nb/app/doctor/controller/PatientMonitorController.java

@@ -5,10 +5,15 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.json.JSONUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.nb.app.assistant.api.entity.AssistantEvalEntity;
 import com.nb.app.assistant.api.entity.AssistantEvalEntity;
+import com.nb.app.assistant.api.entity.AssistantUserBindEntity;
 import com.nb.app.assistant.api.feign.IAssistantEvalClient;
 import com.nb.app.assistant.api.feign.IAssistantEvalClient;
+import com.nb.app.assistant.api.feign.IAssistantUserBindClient;
 import com.nb.app.doctor.controller.vo.InviteCodeVo;
 import com.nb.app.doctor.controller.vo.InviteCodeVo;
 import com.nb.app.doctor.controller.vo.MonitorEvalVo;
 import com.nb.app.doctor.controller.vo.MonitorEvalVo;
 import com.nb.app.doctor.enums.EvalEnum;
 import com.nb.app.doctor.enums.EvalEnum;
+import com.nb.app.doctor.service.dto.PatientMonitorConsultResult;
+import com.nb.auth.utils.SecurityUtil;
+import com.nb.common.websocket.WebSocketSessionLifeCycleManage;
 import com.nb.core.entity.GenericEntity;
 import com.nb.core.entity.GenericEntity;
 import com.nb.core.result.R;
 import com.nb.core.result.R;
 import com.nb.web.api.entity.BusDeviceAlarmEntity;
 import com.nb.web.api.entity.BusDeviceAlarmEntity;
@@ -20,7 +25,6 @@ import com.nb.web.api.feign.query.AlarmQuery;
 import com.nb.web.api.feign.query.PatientMonitorQuery;
 import com.nb.web.api.feign.query.PatientMonitorQuery;
 import com.nb.web.api.feign.result.InviteCodeResult;
 import com.nb.web.api.feign.result.InviteCodeResult;
 import com.nb.web.api.feign.result.PatientMonitorDetailResult;
 import com.nb.web.api.feign.result.PatientMonitorDetailResult;
-import com.nb.web.api.feign.result.PatientMonitorResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import io.swagger.annotations.ApiParam;
@@ -30,6 +34,7 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
 import java.util.*;
 import java.util.*;
+import java.util.stream.Collectors;
 
 
 /**
 /**
  * @author lifang
  * @author lifang
@@ -48,12 +53,37 @@ public class PatientMonitorController {
     private final IDeviceAlarmClient deviceAlarmClient;
     private final IDeviceAlarmClient deviceAlarmClient;
     private final IClinicEvalClient clinicEvalClient;
     private final IClinicEvalClient clinicEvalClient;
     private final IAssistantEvalClient assistantEvalClient;
     private final IAssistantEvalClient assistantEvalClient;
+    //判断是否在线
+    private final WebSocketSessionLifeCycleManage lifeCycleManage;
+    private final IAssistantUserBindClient userBindClient;
 
 
-    @PostMapping("/monitor/no_page")
+    @PostMapping("/monitor/{consult}/no_page")
     @ApiOperation(value = "输注监控列表")
     @ApiOperation(value = "输注监控列表")
-    public R<List<PatientMonitorResult>> selectPagePatient(@RequestBody PatientMonitorQuery query) {
+    public R<List<PatientMonitorConsultResult>> selectPagePatient(@PathVariable("consult")@ApiParam("是否为咨询模式") boolean consult,@RequestBody PatientMonitorQuery query) {
         log.info("医生查看输注监控列表,【{}】", JSONUtil.toJsonStr(query));
         log.info("医生查看输注监控列表,【{}】", JSONUtil.toJsonStr(query));
-        return R.success(patientClient.selectAll(query));
+        List<PatientMonitorConsultResult> results = BeanUtil.copyToList(patientClient.selectAll(query), PatientMonitorConsultResult.class);
+        if(consult){
+            if (CollectionUtil.isNotEmpty(results)) {
+                Map<String, List<PatientMonitorConsultResult>> resultGroupByPatientId = results.stream().collect(Collectors.groupingBy(PatientMonitorConsultResult::getPatientId));
+                //获取该与该医生有绑定的所有绑定关系
+                List<AssistantUserBindEntity> userBinds = userBindClient.list(String.valueOf(SecurityUtil.getId()));
+                if(CollectionUtil.isNotEmpty(userBinds)){
+                    userBinds.parallelStream()
+                            .forEach(bind->{
+                                String patientId = bind.getPatientId();
+                                String assistId = bind.getAssistId();
+                                if (lifeCycleManage.isOnline(assistId)) {
+                                    resultGroupByPatientId.get(patientId)
+                                            .forEach(consultResult->{
+                                                consultResult.setAssistId(assistId);
+                                                consultResult.setOnline(true);
+                                            });
+                                }
+                            });
+                }
+            }
+        }
+        return R.success(results);
     }
     }
 
 
     @PostMapping("/monitor/{patientId}")
     @PostMapping("/monitor/{patientId}")

+ 41 - 0
nb-service/app-doctor/src/main/java/com/nb/app/doctor/service/AssistLifeCycleService.java

@@ -0,0 +1,41 @@
+package com.nb.app.doctor.service;
+
+import com.nb.common.websocket.event.ConnectedEvent;
+import com.nb.common.websocket.event.DisConnectedEvent;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName AssistLifeCycleService.java
+ * @Description TODO
+ * @createTime 2022年08月13日 16:40:00
+ */
+@Component
+public class AssistLifeCycleService {
+
+    /**
+     * 描述: 看护人上线
+     * @author lifang
+     * @date 2022/8/13 16:41
+     * @param event
+     * @return void
+     */
+    @EventListener
+    public void connected(ConnectedEvent event){
+
+    }
+
+    /**
+     * 描述: 看护人下线
+     * @author lifang
+     * @date 2022/8/13 16:41
+     * @param event
+     * @return void
+     */
+    @EventListener
+    public void disconnected(DisConnectedEvent event){
+
+    }
+}

+ 22 - 0
nb-service/app-doctor/src/main/java/com/nb/app/doctor/service/dto/PatientMonitorConsultResult.java

@@ -0,0 +1,22 @@
+package com.nb.app.doctor.service.dto;
+
+import com.nb.web.api.feign.result.PatientMonitorResult;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName PatientMonitorConsultResult.java
+ * @Description 病人监护咨询模式
+ * @createTime 2022年08月13日 17:06:00
+ */
+@Data
+@ApiModel("病人监护咨询模式")
+public class PatientMonitorConsultResult extends PatientMonitorResult {
+    @ApiModelProperty("看护人id")
+    private String assistId;
+    @ApiModelProperty("看护人是否在线")
+    private boolean isOnline;
+}

+ 0 - 5
nb-service/web-service/src/main/java/com/nb/web/service/bus/websocket/topic/WebSocketCloseHandler.java

@@ -1,7 +1,6 @@
 package com.nb.web.service.bus.websocket.topic;
 package com.nb.web.service.bus.websocket.topic;
 
 
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.ObjectUtil;
-import com.nb.auth.bean.LoginUser;
 import com.nb.web.service.bus.hospital.his.HisScriptSessionManager;
 import com.nb.web.service.bus.hospital.his.HisScriptSessionManager;
 import com.nb.core.Constants;
 import com.nb.core.Constants;
 import com.nb.common.websocket.handler.Subscribe;
 import com.nb.common.websocket.handler.Subscribe;
@@ -9,10 +8,6 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 import org.tio.core.ChannelContext;
 import org.tio.core.ChannelContext;
-import reactor.core.publisher.Flux;
-import reactor.core.publisher.Mono;
-
-import static com.nb.core.Constants.LOGIN_USER_KEY;
 
 
 /**
 /**
  * @author lifang
  * @author lifang

+ 6 - 0
pom.xml

@@ -52,6 +52,7 @@
         <module>nb-core</module>
         <module>nb-core</module>
         <module>nb-service-api</module>
         <module>nb-service-api</module>
         <module>nb-service</module>
         <module>nb-service</module>
+        <module>nb-im</module>
     </modules>
     </modules>
 
 
     <dependencies>
     <dependencies>
@@ -69,6 +70,11 @@
     <!-- 依赖管理 -->
     <!-- 依赖管理 -->
     <dependencyManagement>
     <dependencyManagement>
         <dependencies>
         <dependencies>
+            <dependency>
+                <groupId>com.tuoren</groupId>
+                <artifactId>nb-im</artifactId>
+                <version>${nb.version}</version>
+            </dependency>
             <dependency>
             <dependency>
                 <groupId>com.tuoren</groupId>
                 <groupId>com.tuoren</groupId>
                 <artifactId>app-msg-api</artifactId>
                 <artifactId>app-msg-api</artifactId>