DESKTOP-0GD05B0\Administrator 2 лет назад
Родитель
Сommit
7a9a5e7c45

+ 49 - 0
src/main/java/thyyxxk/webserver/controller/zhuyuanyizheng/EmrWebSocketController.java

@@ -0,0 +1,49 @@
+package thyyxxk.webserver.controller.zhuyuanyizheng;
+
+import org.springframework.web.bind.annotation.*;
+import thyyxxk.webserver.entity.ResultVo;
+import thyyxxk.webserver.entity.login.UserInfo;
+import thyyxxk.webserver.entity.zhuyuanyisheng.emr.EmrSocketMessage;
+import thyyxxk.webserver.service.zhuyuanyisheng.EmrWebSocketServer;
+
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/emrSocket")
+public class EmrWebSocketController {
+
+    private final EmrWebSocketServer server;
+
+    public EmrWebSocketController(EmrWebSocketServer server) {
+        this.server = server;
+    }
+
+
+    @GetMapping("/getRoomPeople")
+    public ResultVo<Map<String, UserInfo>> getRoomPeople(@RequestParam("sid") String sid) {
+        return server.getRoomPeople(sid);
+    }
+
+    @GetMapping("/sendAMessage")
+    public ResultVo<String> sendAMessage(@RequestParam("sid") String sid,
+                                         @RequestParam("message") String message) {
+        return server.sendAMessage(sid, message);
+    }
+
+    @GetMapping("/getChatHistoryBySid")
+    public ResultVo<List<EmrSocketMessage>> getChatHistoryBySid(@RequestParam("sid") String sid) {
+        return server.getChatHistoryBySid(sid);
+    }
+
+    @GetMapping("/lockMedicalRecords")
+    public ResultVo<UserInfo> lockMedicalRecords(@RequestParam("id") String id) {
+        return server.lockMedicalRecords(id);
+    }
+
+    @GetMapping("/clearTheCurrentMedicalRecordUser")
+    public ResultVo<Boolean> clearTheCurrentMedicalRecordUser(@RequestParam("id") String id) {
+        return server.clearTheCurrentMedicalRecordUser(id);
+    }
+
+}

+ 21 - 0
src/main/java/thyyxxk/webserver/dao/his/zhuyuanyisheng/EmrSocketDao.java

@@ -0,0 +1,21 @@
+package thyyxxk.webserver.dao.his.zhuyuanyisheng;
+
+import org.apache.ibatis.annotations.Delete;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+@Mapper
+public interface EmrSocketDao {
+
+    @Insert("insert into emr_editor_people_limit (id, code) " +
+            "values (#{id},#{code})")
+    void insertTheUser(String id, String code);
+
+
+    @Select("select code from emr_editor_people_limit where id = #{id}  ")
+    String selectUserById(String id);
+
+    @Delete("delete emr_editor_people_limit where id = #{id} and code = #{code} ")
+    int deleteUserById(String id, String code);
+}

+ 17 - 0
src/main/java/thyyxxk/webserver/entity/zhuyuanyisheng/emr/EmrSocketMessage.java

@@ -0,0 +1,17 @@
+package thyyxxk.webserver.entity.zhuyuanyisheng.emr;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+@Data
+@Accessors(chain = true)
+public class EmrSocketMessage {
+    private String name;
+    private String avatar;
+    private String message;
+    private String date;
+    private String deptName;
+    private String code;
+
+
+}

+ 99 - 0
src/main/java/thyyxxk/webserver/service/zhuyuanyisheng/EmrWebSocketServer.java

@@ -0,0 +1,99 @@
+package thyyxxk.webserver.service.zhuyuanyisheng;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import thyyxxk.webserver.config.exception.ExceptionEnum;
+import thyyxxk.webserver.dao.his.zhuyuanyisheng.EmrSocketDao;
+import thyyxxk.webserver.entity.ResultVo;
+import thyyxxk.webserver.entity.login.UserInfo;
+import thyyxxk.webserver.entity.zhuyuanyisheng.emr.EmrSocketMessage;
+import thyyxxk.webserver.service.redislike.RedisLikeService;
+import thyyxxk.webserver.utils.DateUtil;
+import thyyxxk.webserver.utils.ResultVoUtil;
+import thyyxxk.webserver.utils.TokenUtil;
+import thyyxxk.webserver.websocket.WebSocketServer;
+
+import javax.websocket.Session;
+import java.util.*;
+
+@Service
+@Slf4j
+public class EmrWebSocketServer {
+    private final RedisLikeService redisLikeService;
+    private final EmrSocketDao dao;
+    private static final Map<String, List<EmrSocketMessage>> CHAT_ROOM = new HashMap<>();
+
+    public EmrWebSocketServer(RedisLikeService redisLikeService, EmrSocketDao dao) {
+        this.redisLikeService = redisLikeService;
+        this.dao = dao;
+    }
+
+    public ResultVo<Map<String, UserInfo>> getRoomPeople(String sid) {
+        List<Session> lists = WebSocketServer.getEmrMap(sid);
+        Map<String, UserInfo> map = new HashMap<>(lists.size());
+        for (Session item : lists) {
+            String code = sessionParseUserCode(item);
+            map.put(code, redisLikeService.getUserInfoByCode(code));
+        }
+
+        return ResultVoUtil.success(map);
+    }
+
+    public static String sessionParseUserCode(Session session) {
+        String query = session.getQueryString();
+        return query.substring(query.indexOf("=") + 1);
+    }
+
+    public ResultVo<String> sendAMessage(String sid, String message) {
+        EmrSocketMessage esm = new EmrSocketMessage();
+        UserInfo us = redisLikeService.getUserInfoByToken();
+
+        esm.setName(us.getName())
+                .setMessage(message)
+                .setAvatar(us.getAvatar())
+                .setDate(DateUtil.formatDatetime(new Date()))
+                .setDeptName(us.getDeptName())
+                .setCode(us.getCode());
+
+        if (CHAT_ROOM.containsKey(sid)) {
+            CHAT_ROOM.get(sid).add(esm);
+        } else {
+            List<EmrSocketMessage> list = new ArrayList<>();
+            list.add(esm);
+            CHAT_ROOM.put(sid, list);
+        }
+
+        List<Session> lists = WebSocketServer.getEmrMap(sid);
+        lists.forEach(item -> {
+            String code = sessionParseUserCode(item);
+            if (!code.equals(us.getCode())) {
+                WebSocketServer.emrSendMessage(item, String.format("{\"message\" : \"%s\"}", message));
+            }
+        });
+        return ResultVoUtil.success();
+    }
+
+    public ResultVo<List<EmrSocketMessage>> getChatHistoryBySid(String sid) {
+        return ResultVoUtil.success(CHAT_ROOM.get(sid));
+    }
+
+    public static void clearChatHistoryBySid(String sid) {
+        log.info("清除聊天记录根据sid:{}", sid);
+        CHAT_ROOM.remove(sid);
+    }
+
+    public ResultVo<UserInfo> lockMedicalRecords(String id) {
+        String user = dao.selectUserById(id);
+        UserInfo us = redisLikeService.getUserInfoByCode(user);
+        if (user != null) {
+            return ResultVoUtil.success(us);
+        }
+        dao.insertTheUser(id, TokenUtil.getTokenUserId());
+        return ResultVoUtil.success(us);
+    }
+
+    public ResultVo<Boolean> clearTheCurrentMedicalRecordUser(String id) {
+        dao.deleteUserById(id, TokenUtil.getTokenUserId());
+        return ResultVoUtil.success();
+    }
+}

+ 67 - 21
src/main/java/thyyxxk/webserver/websocket/WebSocketServer.java

@@ -4,7 +4,8 @@ import com.alibaba.fastjson.JSONObject;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 import thyyxxk.webserver.config.exception.ExceptionEnum;
-import thyyxxk.webserver.entity.inpatient.patient.Patient;
+import thyyxxk.webserver.service.zhuyuanyisheng.EmrWebSocketServer;
+import thyyxxk.webserver.utils.ListUtil;
 import thyyxxk.webserver.utils.TokenUtil;
 
 import javax.websocket.*;
@@ -26,22 +27,21 @@ import java.util.concurrent.atomic.AtomicInteger;
 public class WebSocketServer {
     private static final AtomicInteger ONLINE_COUNT = new AtomicInteger();
     private static final ConcurrentHashMap<String, Session> SESSION_MAP = new ConcurrentHashMap<>();
-    private static final ConcurrentHashMap<String, Session> EMR_MAP = new ConcurrentHashMap<>();
-    private static final AtomicInteger EMR_COUNT = new AtomicInteger();
+    private static final ConcurrentHashMap<String, List<Session>> EMR_MAP = new ConcurrentHashMap<>();
 
     @OnOpen
     public void onOpen(Session session, @PathParam("sid") String sid) {
+
         if ("update".equals(sid)) {
             return;
         }
 
-        if (sid.endsWith("Emr")) {
-            EMR_MAP.put(sid, session);
-            EMR_COUNT.incrementAndGet();
-            log.info("有新的电子病历连接加入:{},当前在线人数为:{}", sid, ONLINE_COUNT.get());
+        if (sid.startsWith("emr")) {
+            emrOnOpen(session, sid);
             return;
         }
 
+
         if (!sid.endsWith("Screen")) {
             SESSION_MAP.forEach((item, index) -> {
                 if (sid.split("-")[0].equals(item.split("-")[0])) {
@@ -56,10 +56,9 @@ public class WebSocketServer {
     }
 
     @OnClose
-    public void onClose(@PathParam("sid") String sid) {
-        if (sid.endsWith("Emr")) {
-            EMR_MAP.remove(sid);
-            EMR_COUNT.decrementAndGet();
+    public void onClose(Session session, @PathParam("sid") String sid) {
+        if (sid.startsWith("emr")) {
+            emrClose(session, sid);
             return;
         }
         SESSION_MAP.remove(sid);
@@ -67,6 +66,16 @@ public class WebSocketServer {
         log.info("有一连接关闭:{},当前在线人数为:{}", sid, ONLINE_COUNT.get());
     }
 
+
+    public static void emrSendMessage(Session session, String msg) {
+        try {
+            session.getBasicRemote().sendText(msg);
+        } catch (Exception ignored) {
+        }
+
+    }
+
+
     @OnMessage
     public void onMessage(String message) {
         log.info("收到信息:{}", message);
@@ -77,16 +86,6 @@ public class WebSocketServer {
         log.error("【session id: " + session.getId() + "】Socket连接发生错误", error);
     }
 
-    public static List<Patient> getEditorUsersByPatNo() {
-        List<Patient> p = new ArrayList<>();
-
-        for (Map.Entry<String, Session> item : EMR_MAP.entrySet()) {
-            log.info("数据:{}", item.getKey());
-        }
-
-        return p;
-    }
-
     public static String getSid() {
         String token = TokenUtil.getTokenUserId();
         for (Map.Entry<String, Session> entry : SESSION_MAP.entrySet()) {
@@ -181,4 +180,51 @@ public class WebSocketServer {
     public static int getOnlineCount() {
         return ONLINE_COUNT.get();
     }
+
+    public static List<Session> getEmrMap(String sid) {
+        return EMR_MAP.get(sid);
+    }
+
+    private void emrOnOpen(Session session, String sid) {
+        if (EMR_MAP.containsKey(sid)) {
+            List<Session> temp = EMR_MAP.get(sid);
+            temp.add(session);
+            EMR_MAP.replace(sid, temp);
+        } else {
+            List<Session> temp = new ArrayList<>();
+            temp.add(session);
+            EMR_MAP.put(sid, temp);
+        }
+        List<Session> temp = EMR_MAP.get(sid);
+        for (Session item : temp) {
+            if (!item.getQueryString().equals(session.getQueryString())) {
+                emrSendMessage(item, String.format("{\"connectToJoin\": \"%s\"}", EmrWebSocketServer.sessionParseUserCode(session)));
+            }
+        }
+        emrSendMessage(session, "{\"connect\": true}");
+        log.info("有新的电子病历连接加入:{}", sid);
+    }
+
+
+    private void emrClose(Session session, String sid) {
+        List<Session> temp = EMR_MAP.get(sid);
+
+        temp.removeIf(item -> {
+            if (item.getQueryString().equals(session.getQueryString())) {
+                return true;
+            } else {
+                emrSendMessage(item, String.format("{\"exitEmrEditor\": \"%s\"}", EmrWebSocketServer.sessionParseUserCode(session)));
+                return false;
+            }
+        });
+
+        if (ListUtil.isBlank(temp)) {
+            EMR_MAP.remove(sid);
+            EmrWebSocketServer.clearChatHistoryBySid(sid);
+        } else {
+            EMR_MAP.replace(sid, temp);
+        }
+        log.info("电子病历关闭:{} ", sid);
+    }
+
 }