diff --git a/upms/upms-biz/src/main/resources/application.yml b/upms/upms-biz/src/main/resources/application.yml index ffeb0fb..31e83c5 100644 --- a/upms/upms-biz/src/main/resources/application.yml +++ b/upms/upms-biz/src/main/resources/application.yml @@ -12,11 +12,6 @@ spring: data: redis: host: localhost - mongodb: - host: localhost - password: root - username: root - authentication-database: admin # 数据库相关配置 datasource: driver-class-name: com.mysql.cj.jdbc.Driver @@ -105,3 +100,9 @@ mybatis-plus: jdbc-type-for-null: 'null' call-setters-on-nulls: true shrink-whitespaces-in-sql: true + +vital-sign: + mongodb: + host: localhost:27017 + password: root + username: root diff --git a/upms/upms-biz/src/main/resources/static/html/app.js b/upms/upms-biz/src/main/resources/static/html/app.js index 4324c5d..9299e61 100644 --- a/upms/upms-biz/src/main/resources/static/html/app.js +++ b/upms/upms-biz/src/main/resources/static/html/app.js @@ -5,12 +5,14 @@ const stompClient = new StompJs.Client({ brokerURL: "ws://localhost:8080/test-guide" })*/ +let user = "" + stompClient.onConnect = (frame) => { setConnected(true); console.log('Connected: ' + frame); - stompClient.subscribe('/topic/doctorMedicine', (greeting) => { + /*stompClient.subscribe('/topic/user/'+user+'/doctorMedicine', (greeting) => { showGreeting(greeting.body); - }); + });*/ }; /*testClient.onConnect = (data) => { @@ -55,13 +57,22 @@ function disconnect() { } function sendName() { + user = Math.random() + $("#user-id").val(user) sendNameToServer(); } function sendNameToServer(status) { - stompClient.publish({ + /*stompClient.publish({ destination: "/front/doctorMedicine", body: status ? status : $("#name").val() + });*/ + stompClient.publish({ + destination: "/front/doctorMedicine", + body: JSON.stringify({'status': status, "db": "test", user}) + }); + stompClient.subscribe('/topic/user/'+user+'/doctorMedicine', (greeting) => { + showGreeting(greeting.body); }); /*testClient.publish({ destination: "/app/test-hello", diff --git a/upms/upms-biz/src/main/resources/static/html/index.html b/upms/upms-biz/src/main/resources/static/html/index.html index 5c2f072..314aa04 100644 --- a/upms/upms-biz/src/main/resources/static/html/index.html +++ b/upms/upms-biz/src/main/resources/static/html/index.html @@ -29,6 +29,7 @@
+
diff --git a/vital-signs/pom.xml b/vital-signs/pom.xml index 1104875..f773173 100644 --- a/vital-signs/pom.xml +++ b/vital-signs/pom.xml @@ -49,6 +49,12 @@ org.springframework.boot spring-boot-starter-data-mongodb + + com.alibaba + druid-spring-boot-starter + 1.2.21 + + \ No newline at end of file diff --git a/vital-signs/src/main/java/com/rax/vital/config/WebSocketConfig.java b/vital-signs/src/main/java/com/rax/vital/config/WebSocketConfig.java index 4f97f54..d763b01 100644 --- a/vital-signs/src/main/java/com/rax/vital/config/WebSocketConfig.java +++ b/vital-signs/src/main/java/com/rax/vital/config/WebSocketConfig.java @@ -19,6 +19,7 @@ public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { public void configureMessageBroker(MessageBrokerRegistry registry) { registry.enableSimpleBroker("/topic"); registry.setApplicationDestinationPrefixes("/front"); + registry.setUserDestinationPrefix("/topic/user"); } } diff --git a/vital-signs/src/main/java/com/rax/vital/datasource/MongoDBSource.java b/vital-signs/src/main/java/com/rax/vital/datasource/MongoDBSource.java index 3c808c8..47b90d6 100644 --- a/vital-signs/src/main/java/com/rax/vital/datasource/MongoDBSource.java +++ b/vital-signs/src/main/java/com/rax/vital/datasource/MongoDBSource.java @@ -4,37 +4,44 @@ import com.mongodb.ConnectionString; import com.mongodb.MongoClientSettings; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; +import lombok.Getter; import org.springframework.data.mongodb.SpringDataMongoDB; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory; -import org.springframework.util.StringUtils; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; import java.util.concurrent.TimeUnit; +/** + * mongoDB链接工具类 + */ public class MongoDBSource { + + // 地址 private String host; + + // 密码 private String password; + + // 用户名称 private String username; + private static final String authenticationDatabase = "admin"; + + // 数据库名称 private String database; + + // mongo的客户端 private MongoClient mongoClient; - private static final Map datasourceList = new HashMap(300); + // 被使用的数量 + @Getter + private int count = 0; public MongoDBSource(String host, String password, String username, String database) { - String url = datasourceList.get(database); - if (StringUtils.hasText(url)) { - - } else { - this.host = host; - this.password = password; - this.username = username; - this.database = database; - } + this.host = host; + this.password = password; + this.username = username; + this.database = database; } public MongoTemplate open() { @@ -63,4 +70,13 @@ public class MongoDBSource { public void close() { mongoClient.close(); } + + public synchronized void increaseCount() { + count++; + } + + public synchronized void decreaseCount() { + count--; + } + } diff --git a/vital-signs/src/main/java/com/rax/vital/datasource/MySQLSource.java b/vital-signs/src/main/java/com/rax/vital/datasource/MySQLSource.java new file mode 100644 index 0000000..7b2ff49 --- /dev/null +++ b/vital-signs/src/main/java/com/rax/vital/datasource/MySQLSource.java @@ -0,0 +1,69 @@ +package com.rax.vital.datasource; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.pool.DruidPooledConnection; +import lombok.Getter; +import lombok.SneakyThrows; + +import java.sql.Connection; + +public class MySQLSource { + + private String host; + + private String password; + + private String username; + + private String database; + + private String driver = "com.mysql.cj.jdbc.Driver"; + + @Getter + private int count = 0; + + private DruidDataSource dataSource; + + private DruidPooledConnection druidPooledConnection; + + private Connection connection; + + public MySQLSource(String host, String password, String username, String database) { + this.host = host; + this.password = password; + this.username = username; + this.database = database; + } + + @SneakyThrows + public Connection open() { + dataSource = new DruidDataSource(); + dataSource.setUrl("jdbc:mysql://" + this.host + "/" + this.database); + dataSource.setUsername(this.username); + dataSource.setPassword(this.password); + dataSource.setMinIdle(10); + dataSource.setMaxActive(120); + dataSource.setMaxWait(60000); + druidPooledConnection = dataSource.getConnection(); + connection = druidPooledConnection.getConnection(); + return connection; + } + + public void close() { + try { + connection.close(); + druidPooledConnection.close(); + dataSource.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public synchronized void increaseCount() { + count++; + } + + public synchronized void decreaseCount() { + count--; + } +} diff --git a/vital-signs/src/main/java/com/rax/vital/medicine/controller/MedicineController.java b/vital-signs/src/main/java/com/rax/vital/medicine/controller/MedicineController.java index 394f032..f8c46cd 100644 --- a/vital-signs/src/main/java/com/rax/vital/medicine/controller/MedicineController.java +++ b/vital-signs/src/main/java/com/rax/vital/medicine/controller/MedicineController.java @@ -1,17 +1,14 @@ package com.rax.vital.medicine.controller; -import com.rax.common.core.util.R; +import com.alibaba.fastjson.JSONObject; import com.rax.vital.medicine.service.AIMedicineService; import com.rax.vital.medicine.service.DoctorMedicineService; import com.rax.vital.timer.VitalSignTimer; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; -import org.quartz.Scheduler; import org.springframework.http.HttpHeaders; import org.springframework.messaging.handler.annotation.MessageMapping; -import org.springframework.messaging.handler.annotation.SendTo; -import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -30,16 +27,15 @@ public class MedicineController { private final DoctorMedicineService doctorMedicineService; - private final Scheduler scheduler; - private final VitalSignTimer vitalSignTimer; @MessageMapping("/doctorMedicine") - public void doctorMedicine(String msg) { - if ("stop".equals(msg)) { - vitalSignTimer.stopTimerTask("test"); + public void doctorMedicine(String body) { + JSONObject params = JSONObject.parseObject(body); + if ("stop".equals(params.getString("status"))) { + vitalSignTimer.stopTimerTask(params.getString("db"), params.getString("user")); } else { - vitalSignTimer.createAndSendMessage("test"); + vitalSignTimer.createAndSendMessage(params.getString("db")); } } diff --git a/vital-signs/src/main/java/com/rax/vital/medicine/service/AIMedicineService.java b/vital-signs/src/main/java/com/rax/vital/medicine/service/AIMedicineService.java index 6f44ed2..104ca99 100644 --- a/vital-signs/src/main/java/com/rax/vital/medicine/service/AIMedicineService.java +++ b/vital-signs/src/main/java/com/rax/vital/medicine/service/AIMedicineService.java @@ -3,5 +3,8 @@ package com.rax.vital.medicine.service; import com.baomidou.mybatisplus.extension.service.IService; import com.rax.vital.medicine.entity.AIMedicine; +/** + * AI给药 + */ public interface AIMedicineService extends IService { } diff --git a/vital-signs/src/main/java/com/rax/vital/medicine/service/DoctorMedicineService.java b/vital-signs/src/main/java/com/rax/vital/medicine/service/DoctorMedicineService.java index c3a87e3..664af1a 100644 --- a/vital-signs/src/main/java/com/rax/vital/medicine/service/DoctorMedicineService.java +++ b/vital-signs/src/main/java/com/rax/vital/medicine/service/DoctorMedicineService.java @@ -3,5 +3,8 @@ package com.rax.vital.medicine.service; import com.baomidou.mybatisplus.extension.service.IService; import com.rax.vital.medicine.entity.DoctorMedicine; +/** + * 医生给药 + */ public interface DoctorMedicineService extends IService { } diff --git a/vital-signs/src/main/java/com/rax/vital/medicine/service/RevulsionService.java b/vital-signs/src/main/java/com/rax/vital/medicine/service/RevulsionService.java index e02532d..6803580 100644 --- a/vital-signs/src/main/java/com/rax/vital/medicine/service/RevulsionService.java +++ b/vital-signs/src/main/java/com/rax/vital/medicine/service/RevulsionService.java @@ -1,4 +1,7 @@ package com.rax.vital.medicine.service; +/** + * 诱导期给药数据 + */ public interface RevulsionService { } diff --git a/vital-signs/src/main/java/com/rax/vital/medicine/service/VitalSignsService.java b/vital-signs/src/main/java/com/rax/vital/medicine/service/VitalSignsService.java new file mode 100644 index 0000000..a98ee2c --- /dev/null +++ b/vital-signs/src/main/java/com/rax/vital/medicine/service/VitalSignsService.java @@ -0,0 +1,20 @@ +package com.rax.vital.medicine.service; + +import com.rax.vital.datasource.MongoDBSource; + +import java.util.List; +import java.util.Map; + +/** + * 生命体征数据 + */ +public interface VitalSignsService { + + /** + * 获取最新一条生命体征数据 + * + * @param mongoDBSource + * @return + */ + List getVitalSignsList(MongoDBSource mongoDBSource); +} diff --git a/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/AIMedicineServiceImpl.java b/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/AIMedicineServiceImpl.java index 2310765..bdf5a42 100644 --- a/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/AIMedicineServiceImpl.java +++ b/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/AIMedicineServiceImpl.java @@ -8,6 +8,9 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +/** + * AI给药 + */ @Slf4j @Service @AllArgsConstructor diff --git a/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/DoctorMedicineServiceImpl.java b/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/DoctorMedicineServiceImpl.java index b763da6..3f8938b 100644 --- a/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/DoctorMedicineServiceImpl.java +++ b/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/DoctorMedicineServiceImpl.java @@ -8,6 +8,9 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +/** + * 医生给药 + */ @Slf4j @Service @AllArgsConstructor diff --git a/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/RevulsionServiceImpl.java b/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/RevulsionServiceImpl.java index 7f87a92..319411e 100644 --- a/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/RevulsionServiceImpl.java +++ b/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/RevulsionServiceImpl.java @@ -1,4 +1,15 @@ package com.rax.vital.medicine.service.impl; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 诱导期给药数据 + */ + +@Slf4j +@Service +@AllArgsConstructor public class RevulsionServiceImpl { } diff --git a/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/VitalSignServiceImpl.java b/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/VitalSignServiceImpl.java new file mode 100644 index 0000000..9ab1014 --- /dev/null +++ b/vital-signs/src/main/java/com/rax/vital/medicine/service/impl/VitalSignServiceImpl.java @@ -0,0 +1,41 @@ +package com.rax.vital.medicine.service.impl; + +import com.rax.vital.datasource.MongoDBSource; +import com.rax.vital.medicine.service.VitalSignsService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * 生命体征数据 + */ +@Slf4j +@Service +@AllArgsConstructor +public class VitalSignServiceImpl implements VitalSignsService { + + /** + * 获取生命体征最新一条数据 + * + * @param mongoDBSource + * @author zhaoyz + * @date 2024/2/29 + */ + @Override + public List getVitalSignsList(MongoDBSource mongoDBSource) { + MongoTemplate template = mongoDBSource.open(); + Query query = new Query(); + Criteria criteria = new Criteria(); + criteria.where(""); + query.addCriteria(criteria); + query.limit(1); + List cs = template.find(query, Map.class, "cs"); + return cs; + } +} diff --git a/vital-signs/src/main/java/com/rax/vital/timer/VitalSignTimer.java b/vital-signs/src/main/java/com/rax/vital/timer/VitalSignTimer.java index 86aa41a..ee3369f 100644 --- a/vital-signs/src/main/java/com/rax/vital/timer/VitalSignTimer.java +++ b/vital-signs/src/main/java/com/rax/vital/timer/VitalSignTimer.java @@ -1,57 +1,109 @@ package com.rax.vital.timer; +import com.rax.common.security.util.SecurityUtils; +import com.rax.vital.datasource.MongoDBSource; +import com.rax.vital.medicine.service.VitalSignsService; import lombok.RequiredArgsConstructor; +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.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Component; -import java.util.HashMap; -import java.util.Map; -import java.util.Timer; -import java.util.TimerTask; +import java.util.*; +/** + * 生命体征和用药信息推送 + * + * @author zhaoyz + * @date 2024/2/29 + */ +@RefreshScope @Component @RequiredArgsConstructor public class VitalSignTimer { private final SimpMessagingTemplate simpMessagingTemplate; - private TimerTask timerTask = null; - private static final Map timerTaskMap = new HashMap(300); + private final VitalSignsService vitalSignsService; + + // 定时任务容器 + private static final Map timerTaskMap = new HashMap<>(300); + + // mongoDB链接工具类容器 + private static final Map mongoDBSourceMap = new HashMap<>(300); + + // MongoDB的地址 + @Value("${vital-sign.mongodb.host}") + private String mongoDBHost; + + // MongoDB的用户名 + @Value("${vital-sign.mongodb.username}") + private String username; + + // MongoDB的用户的密码 + @Value("${vital-sign.mongodb.password}") + private String password; + + /** + * 根据当前用户和患者数据库进行查询生命体征和用药信息并推送 + * + * @author zhaoyz + */ public void createAndSendMessage(String database) { - TimerTask task = timerTaskMap.get(database); - + String account = SecurityUtils.getUser().getUsername(); + TimerTask task = timerTaskMap.get(account + "-" + database); if (task != null) { return; } - Timer timer = new Timer(); + MongoDBSource mongoDBSource = mongoDBSourceMap.get(database); + if (mongoDBSource == null) { + mongoDBSource = new MongoDBSource(mongoDBHost, password, username, database); + mongoDBSourceMap.put(database, mongoDBSource); + mongoDBSource.increaseCount(); + } + + MongoDBSource finalMongoDBSource = mongoDBSource; TimerTask timerTask = new TimerTask() { @Override public void run() { -// MongoDBSource mongoDBSource = new MongoDBSource("localhost:27017", "root", "root", "ceshi"); -// MongoTemplate template = mongoDBSource.open(); -// Query query = new Query(); -// Criteria criteria = new Criteria(); -// criteria.where(""); -// query.addCriteria(criteria); -// query.limit(1); -// List cs = template.find(query, Map.class, "cs"); - try { - simpMessagingTemplate.convertAndSend("/topic/doctorMedicine", "111111111"); - } catch (Exception e) { - e.printStackTrace(); - } + List vitalSignsList = vitalSignsService.getVitalSignsList(finalMongoDBSource); + HashMap result = new HashMap(); + result.put("vitalSignsList", vitalSignsList); + simpMessagingTemplate.convertAndSendToUser(account, "/doctorMedicine", vitalSignsList); + } }; + // 定时任务,设置1秒 + Timer timer = new Timer(); timer.schedule(timerTask, 0, 1000); - timerTaskMap.put(database, timerTask); + + timerTaskMap.put(account + "-" + database, timerTask); } - public void stopTimerTask(String database) { - TimerTask timerTask = timerTaskMap.get(database); + /** + * 停止指定的某个用户查询的患者数据库定时器 + * + * @param database + * @param user + * @author zhaoyz + */ + public synchronized void stopTimerTask(String database, String user) { + TimerTask timerTask = timerTaskMap.get(user + "-" + database); if (timerTask != null) { timerTask.cancel(); - timerTaskMap.remove(database); + timerTaskMap.remove(user + "-" + database); + + MongoDBSource mongoDBSource = mongoDBSourceMap.get(database); + mongoDBSource.decreaseCount(); + int count = mongoDBSource.getCount(); + if (count == 0) { + mongoDBSource.close(); + mongoDBSourceMap.remove(database); + } } }