diff --git a/vital-signs/src/main/java/com/rax/vital/handler/AddMedicineHandler.java b/vital-signs/src/main/java/com/rax/vital/handler/AddMedicineHandler.java index 4e9f004..e34dc9d 100644 --- a/vital-signs/src/main/java/com/rax/vital/handler/AddMedicineHandler.java +++ b/vital-signs/src/main/java/com/rax/vital/handler/AddMedicineHandler.java @@ -16,6 +16,9 @@ import org.springframework.web.socket.WebSocketSession; import java.net.URLDecoder; import java.util.Map; +/** + * 网站发送给仪器给药信息 + */ public class AddMedicineHandler implements WebSocketHandler { @Resource private VitalSignTimer vitalSignTimer; diff --git a/vital-signs/src/main/java/com/rax/vital/handler/ChatHandler.java b/vital-signs/src/main/java/com/rax/vital/handler/ChatHandler.java index e237168..a95547f 100644 --- a/vital-signs/src/main/java/com/rax/vital/handler/ChatHandler.java +++ b/vital-signs/src/main/java/com/rax/vital/handler/ChatHandler.java @@ -1,29 +1,60 @@ package com.rax.vital.handler; +import com.alibaba.fastjson.JSONObject; +import com.rax.vital.medicine.service.ChatService; +import com.rax.vital.util.GetHttpParamUtil; +import jakarta.annotation.Resource; +import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; +import org.springframework.security.oauth2.server.authorization.OAuth2TokenType; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.WebSocketMessage; import org.springframework.web.socket.WebSocketSession; +import java.net.URLDecoder; +import java.util.Map; + public class ChatHandler implements WebSocketHandler { + @Resource + private OAuth2AuthorizationService authorizationService; + + @Resource + private ChatService chatService; + @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { - } @Override public void handleMessage(WebSocketSession session, WebSocketMessage message) throws Exception { + String decode = URLDecoder.decode(session.getUri().getQuery()); + Map params = GetHttpParamUtil.getParams(decode); + String token = (String) params.get("token"); + OAuth2Authorization authorization = authorizationService.findByToken(token, OAuth2TokenType.ACCESS_TOKEN); + if (authorization != null) { + String username = authorization.getPrincipalName(); + String payload = (String) message.getPayload(); + JSONObject jsonObject = JSONObject.parseObject(payload); + String patientName = jsonObject.getString("patientName"); + String idNum = jsonObject.getString("idNum"); + String date = jsonObject.getString("date"); + // 消息内容 + String msg = jsonObject.getString("msg"); + chatService.sendMessage(username, patientName, idNum, date, session, msg); + } else { + + } } @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { - } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { - + chatService.stopTaskMongo(session.getId()); } @Override diff --git a/vital-signs/src/main/java/com/rax/vital/handler/MachineFeedbackHandler.java b/vital-signs/src/main/java/com/rax/vital/handler/MachineFeedbackHandler.java index 3bc2b64..4153b54 100644 --- a/vital-signs/src/main/java/com/rax/vital/handler/MachineFeedbackHandler.java +++ b/vital-signs/src/main/java/com/rax/vital/handler/MachineFeedbackHandler.java @@ -2,6 +2,7 @@ package com.rax.vital.handler; import com.alibaba.fastjson.JSONObject; import com.rax.vital.timer.VitalSignTimer; +import com.rax.vital.util.DatabaseNameUtil; import jakarta.annotation.Resource; import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; import org.springframework.web.socket.CloseStatus; @@ -9,6 +10,9 @@ import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.WebSocketMessage; import org.springframework.web.socket.WebSocketSession; +/** + * 仪器获取网站给药信息 + */ public class MachineFeedbackHandler implements WebSocketHandler { @Resource private OAuth2AuthorizationService authorizationService; @@ -24,9 +28,16 @@ public class MachineFeedbackHandler implements WebSocketHandler { @Override public void handleMessage(WebSocketSession session, WebSocketMessage message) throws Exception { JSONObject jsonObject = JSONObject.parseObject((String) message.getPayload()); - String database = jsonObject.getString("database"); + // 病人名 + String patientName = jsonObject.getString("patientName"); + // 病人身份证 + String idNum = jsonObject.getString("idNum"); + // yyyyMMdd + String date = jsonObject.getString("date"); + String databaseName = DatabaseNameUtil.encrypt(patientName) + "_" + DatabaseNameUtil.encrypt(idNum) + "_" + date; jsonObject.getBoolean("status"); - vitalSignTimer.sendMachineFlag(database, session); + + vitalSignTimer.sendMachineFlag(databaseName, session); } @Override diff --git a/vital-signs/src/main/java/com/rax/vital/medicine/service/ChatService.java b/vital-signs/src/main/java/com/rax/vital/medicine/service/ChatService.java index 2e74a76..bf342a7 100644 --- a/vital-signs/src/main/java/com/rax/vital/medicine/service/ChatService.java +++ b/vital-signs/src/main/java/com/rax/vital/medicine/service/ChatService.java @@ -1,7 +1,15 @@ package com.rax.vital.medicine.service; +import org.springframework.web.socket.WebSocketSession; + +import java.io.IOException; + public interface ChatService { void sendMessage(String username, String patientName, String idNum, String date, String simpSessionId, String msg); + void sendMessage(String username, String patientName, String idNum, String date, WebSocketSession session, String msg) throws IOException; + void stopTimerTaskMongo(String simpSessionId); + + void stopTaskMongo(String simpSessionId); } diff --git a/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/ChatServiceImpl.java b/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/ChatServiceImpl.java index ac12c86..818aaa4 100644 --- a/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/ChatServiceImpl.java +++ b/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/ChatServiceImpl.java @@ -1,6 +1,7 @@ package com.rax.vital.medicine.service.impl; import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSONObject; import com.rax.admin.api.dto.UserDTO; import com.rax.admin.api.dto.UserInfo; import com.rax.admin.api.feign.RemoteUserService; @@ -10,14 +11,16 @@ import com.rax.vital.datasource.MongoDBSource; import com.rax.vital.medicine.service.ChatService; import com.rax.vital.util.DatabaseNameUtil; import org.bson.Document; -import org.checkerframework.checker.units.qual.A; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Service; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketSession; +import java.io.IOException; import java.util.HashMap; import java.util.Map; @@ -31,7 +34,11 @@ public class ChatServiceImpl implements ChatService { @Autowired private RemoteUserService remoteUserService; - private static final Map datasourceMap = new HashMap<>(100); + private static final Map datasourceMap = new HashMap<>(); + + private static final Map> databaseSessionMap = new HashMap<>(); + + private static final Map sessionDatabaseMap = new HashMap<>(); // MongoDB的地址 @Value("${vital-sign.mongodb.host}") @@ -80,6 +87,59 @@ public class ChatServiceImpl implements ChatService { simpMessagingTemplate.convertAndSendToUser(patientName + idNum + date, "/chatroomMessage", param); } + @Override + public void sendMessage(String username, String patientName, String idNum, String date, WebSocketSession session, String msg) throws IOException { + MongoDBSource mongoDBSource = datasourceMap.get(session.getId()); + String databaseName = DatabaseNameUtil.encrypt(patientName) + "_" + DatabaseNameUtil.encrypt(idNum) + "_" + date; + synchronized (username) { + if (mongoDBSource == null) { + mongoDBSource = new MongoDBSource(mongoDBHost, mongoPassword, mongoUsername, databaseName); + mongoDBSource.open(); + datasourceMap.put(session.getId(), mongoDBSource); + sessionDatabaseMap.put(session.getId(), databaseName); + Map sessionMap = databaseSessionMap.get(databaseName); + if (sessionMap == null) { + sessionMap = new HashMap(); + sessionMap.put(session.getId(), session); + databaseSessionMap.put(databaseName, sessionMap); + } else { + if (!sessionMap.containsKey(session.getId())) { + sessionMap.put(session.getId(), session); + } + } + + } + } + + UserDTO userDTO = new UserDTO(); + userDTO.setUsername(username); + R info = remoteUserService.info(userDTO, SecurityConstants.FROM_IN); + UserInfo userInfo = info.getData(); + + JSONObject param = new JSONObject(); + + MongoTemplate template = mongoDBSource.getTemplate(); + Document document = new Document(); + document.put("content", msg); + param.put("content", msg); + String now = DateUtil.now(); + document.put("create_time", now); + param.put("createTime", now); + document.put("create_user", username); + String name = userInfo.getSysUser().getName(); + document.put("create_name", name); + param.put("createName", name); + document.put("deleted", 0); + document.put("revoked", 0); + template.insert(document, "t_chat"); + + Map sessionMap = databaseSessionMap.get(databaseName); + for (Map.Entry entry : sessionMap.entrySet()) { + WebSocketSession value = entry.getValue(); + value.sendMessage(new TextMessage(param.toJSONString().getBytes())); + } + } + @Override public synchronized void stopTimerTaskMongo(String simpSessionId) { MongoDBSource mongoDBSource = datasourceMap.get(simpSessionId); @@ -88,4 +148,22 @@ public class ChatServiceImpl implements ChatService { datasourceMap.remove(simpSessionId); } } + + @Override + public synchronized void stopTaskMongo(String simpSessionId) { + MongoDBSource mongoDBSource = datasourceMap.get(simpSessionId); + if (mongoDBSource != null) { + mongoDBSource.close(); + datasourceMap.remove(simpSessionId); + } + String databaseName = sessionDatabaseMap.get(simpSessionId); + if (databaseName != null) { + sessionDatabaseMap.remove(simpSessionId); + Map stringWebSocketSessionMap = databaseSessionMap.get(databaseName); + stringWebSocketSessionMap.remove(simpSessionId); + if (stringWebSocketSessionMap.isEmpty()) { + databaseSessionMap.remove(databaseName); + } + } + } }