rax-remote-2/vital-signs/src/main/java/com/rax/vital/timer/VitalSignTimer.java
zhaoyz 8d176fc965 生命体征数据
统一账户登录只能一个人
2024-04-10 09:24:16 +08:00

239 lines
7.8 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.rax.vital.timer;
import com.rax.common.security.util.SecurityUtils;
import com.rax.vital.datasource.MongoDBSource;
import com.rax.vital.datasource.MySQLSource;
import com.rax.vital.medicine.service.*;
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.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Component;
import java.sql.Connection;
import java.util.*;
/**
* 生命体征和用药信息推送
*
* @author zhaoyz
* @date 2024/2/29
*/
@RefreshScope
@Component
@RequiredArgsConstructor
public class VitalSignTimer {
private final SimpMessagingTemplate simpMessagingTemplate;
private final VitalSignsService vitalSignsService;
private final AIMedicineService aiMedicineService;
private final DoctorMedicineService doctorMedicineService;
private final FlagService flagService;
private final RevulsionService revulsionService;
// mongoDB定时任务容器
private static volatile Map<String, TimerTask> timerMongoTaskMap = new HashMap<>(300);
// mongoDB链接工具类容器
private static volatile Map<String, MongoDBSource> mongoDBSourceMap = new HashMap<>(300);
// mysql定时任务容器
private static volatile Map<String, TimerTask> timerMysqlTaskMap = new HashMap<>(300);
// mysql链接容器
private static volatile Map<String, MySQLSource> mysqlConnectionMap = new HashMap(300);
// MongoDB的地址
@Value("${vital-sign.mongodb.host}")
private String mongoDBHost;
// MongoDB的用户名
@Value("${vital-sign.mongodb.username}")
private String mongoUsername;
// MongoDB的用户的密码
@Value("${vital-sign.mongodb.password}")
private String mongoPassword;
// mysql地址
@Value("${vital-sign.mysql.host}")
private String mysqlHost;
// mysql用户名
@Value("${vital-sign.mysql.username}")
private String mysqlUsername;
// mysql用户密码
@Value("${vital-sign.mysql.password}")
private String mysqlPassword;
private static volatile Map<String, String> masterControlMap = new HashMap(300);
/**
* 根据当前用户和患者数据库进行查询生命体征和用药信息并推送数据库类型是MongoDB
*
* @author zhaoyz
*/
public void createAndSendMessageMongo(String database, String username, String simpSessionId) {
synchronized (username) {
if (!masterControlMap.containsKey(database)) {
masterControlMap.put(database, username);
}
}
TimerTask task = timerMongoTaskMap.get(simpSessionId);
if (task != null) {
return;
}
MongoDBSource mongoDBSource = mongoDBSourceMap.get(simpSessionId);
if (mongoDBSource == null) {
mongoDBSource = new MongoDBSource(mongoDBHost, mongoPassword, mongoUsername, database);
mongoDBSourceMap.put(simpSessionId, mongoDBSource);
mongoDBSource.open();
}
MongoDBSource finalMongoDBSource = mongoDBSource;
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
MongoTemplate template = finalMongoDBSource.getTemplate();
HashMap<String, Object> result = new HashMap();
List vitalSignsList = vitalSignsService.getVitalSignsList(template);
result.put("vitalSignsList", vitalSignsList);
List aiMedicineList = aiMedicineService.getAIMedicine(template);
result.put("aiMedicineList", aiMedicineList);
List docMedicineList = doctorMedicineService.getDocMedicine(template);
result.put("docMedicineList", docMedicineList);
List revulsionList = revulsionService.getRevulsionServiceList(template);
result.put("revulsionList", revulsionList);
List flags = flagService.getFlags(template);
result.put("flags", flags);
simpMessagingTemplate.convertAndSendToUser(username + ":" + database, "/surgeryData", result);
}
};
// 定时任务设置1秒
Timer timer = new Timer();
timer.schedule(timerTask, 0, 1000);
timerMongoTaskMap.put(simpSessionId, timerTask);
}
/**
* 根据当前用户和患者数据库进行查询生命体征和用药信息并推送数据库类型是MySQL
*
* @param database
*/
public void createAndSendMessageMySQL(String database) {
String account = SecurityUtils.getUser().getUsername();
TimerTask task = timerMysqlTaskMap.get(account + "-" + database);
if (task != null) {
return;
}
MySQLSource mySQLSource = mysqlConnectionMap.get(database);
if (mySQLSource == null) {
mySQLSource = new MySQLSource(mysqlHost, mysqlPassword, mysqlUsername, database);
mysqlConnectionMap.put(database, mySQLSource);
mySQLSource.open();
mySQLSource.increaseCount();
}
MySQLSource finalMySQLSource = mySQLSource;
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
HashMap<String, Object> result = new HashMap();
Connection connection = finalMySQLSource.getConnection();
List<Map> vitalSignsList = vitalSignsService.getVitalSignsList(connection);
result.put("vitalSignsList", vitalSignsList);
List<Map> aiMedicineList = aiMedicineService.getAIMedicine(connection);
result.put("aiMedicineList", aiMedicineList);
List<Map> docMedicineList = doctorMedicineService.getDocMedicine(connection);
result.put("docMedicineList", docMedicineList);
Map flag = flagService.getFlag(connection);
result.put("flag", flag);
simpMessagingTemplate.convertAndSendToUser(account, "/doctorMedicine", result);
}
};
// 定时任务设置1秒
Timer timer = new Timer();
timer.schedule(timerTask, 0, 1000);
timerMysqlTaskMap.put(account + "-" + database, timerTask);
}
/**
* 停止指定的某个用户查询的患者数据库定时器数据库类型是MongoDB
*
* @author zhaoyz
*/
public synchronized void stopTimerTaskMongo(String simpSessionId) {
TimerTask timerTask = timerMongoTaskMap.get(simpSessionId);
if (timerTask != null) {
timerTask.cancel();
MongoDBSource mongoDBSource = mongoDBSourceMap.get(simpSessionId);
mongoDBSource.close();
timerMongoTaskMap.remove(simpSessionId);
mongoDBSourceMap.remove(simpSessionId);
}
}
/**
* 停止指定的某个用户查询的患者数据库定时器数据库类型是MySQL
*
* @param database
* @param user
*/
public synchronized void stopTimerTaskMySQL(String database, String user) {
TimerTask timerTask = timerMysqlTaskMap.get(user + "-" + database);
if (timerTask != null) {
timerTask.cancel();
timerMysqlTaskMap.remove(user + "-" + database);
MySQLSource mySQLSource = mysqlConnectionMap.get(database);
mySQLSource.decreaseCount();
int count = mySQLSource.getCount();
if (count == 0) {
mySQLSource.close();
mysqlConnectionMap.remove(database);
}
}
}
public void changeAIFlag(String database, String username, String simpSessionId, String flag, String medicine, String value) {
synchronized (username) {
if (masterControlMap.containsKey(database) && masterControlMap.get(database).equals(username)) {
MongoDBSource mongoDBSource = mongoDBSourceMap.get(simpSessionId);
if (mongoDBSource == null) {
mongoDBSource = new MongoDBSource(mongoDBHost, mongoPassword, mongoUsername, database);
mongoDBSourceMap.put(simpSessionId, mongoDBSource);
mongoDBSource.open();
}
MongoTemplate template = mongoDBSource.getTemplate();
aiMedicineService.changeAIFlagMedicine(template, flag, medicine, value);
HashMap<String, Object> result = new HashMap();
result.put("status", 0);
result.put("flag", flag);
result.put("msg", "");
simpMessagingTemplate.convertAndSendToUser(username + ":" + database, "/medicineData", result);
} else {
HashMap<String, Object> result = new HashMap();
result.put("status", 1);
result.put("msg", "不是主控人员");
simpMessagingTemplate.convertAndSendToUser(username + ":" + database, "/medicineData", result);
}
}
}
}