From 2da508646e156c0476b6408d54ecba0e1da9bc5d Mon Sep 17 00:00:00 2001 From: republicline <1464474399@qq.com> Date: Tue, 27 Aug 2024 17:31:17 +0800 Subject: [PATCH] =?UTF-8?q?style=20and=20refactor:=20=E5=88=86=E7=A6=BB?= =?UTF-8?q?=E5=87=BA=E4=B8=80=E6=9C=9F=E4=BA=8C=E6=9C=9F=E4=BB=A3=E7=A0=81?= =?UTF-8?q?,=20=E5=B9=B6=E9=92=88=E5=AF=B9=E4=BA=8C=E6=9C=9F=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=81=9A=E5=87=BA=E9=87=8D=E6=9E=84,=20token=E4=B8=AD?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86hospitalId=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...sourceOwnerBaseAuthenticationProvider.java | 9 - .../core/RaxDaoAuthenticationProvider.java | 3 - ...ceOwnerPasswordAuthenticationProvider.java | 1 - .../rax/common/log/aspect/SysLogAspect.java | 2 +- .../mybatis/MybatisAutoConfiguration.java | 2 +- .../common/file/FileAutoConfiguration.java | 2 +- .../common/file/oss/OssAutoConfiguration.java | 2 +- .../rax/common/security/service/RaxUser.java | 13 +- .../service/RaxUserDetailsService.java | 2 +- .../service/RaxUserDetailsServiceImpl.java | 1 - .../common/security/util/SecurityUtils.java | 11 +- .../swagger/annotation/EnableRaxDoc.java | 2 +- .../common/xss/RaxXssAutoConfiguration.java | 4 - .../common/xss/core/XssCleanDeserializer.java | 2 +- .../aop/ResponseExcelReturnValueHandler.java | 2 +- .../enhance/DefaultWriterBuilderEnhancer.java | 1 - .../rax/excel/handler/SheetWriteHandler.java | 1 - .../controller/DailyPlanController.java | 4 +- .../com/rax/dailyplan/dto/DailyPlanDTO.java | 1 - .../com/rax/dailyplan/entity/DailyPlan.java | 1 - .../service/impl/DailyPlanServiceImpl.java | 1 - .../java/com/rax/admin/api/dto/UserDTO.java | 13 + .../java/com/rax/admin/api/dto/UserInfo.java | 7 + .../java/com/rax/admin/api/vo/UserVO.java | 10 + .../java/com/rax/RaxAdminApplication.java | 9 + .../controller/SysHospitalController.java | 1 - .../controller/SysMessageController.java | 6 +- .../admin/controller/SysRoleController.java | 2 + .../admin/controller/SysUserController.java | 68 ++-- .../java/com/rax/admin/immu/RoleRecord.java | 11 + .../rax/admin/service/SysMessageService.java | 1 - .../service/impl/SysHospitalServiceImpl.java | 38 +- .../admin/service/impl/SysLogServiceImpl.java | 88 +++-- .../service/impl/SysMenuServiceImpl.java | 6 +- .../service/impl/SysMessageServiceImpl.java | 6 +- .../service/impl/SysMobileServiceImpl.java | 2 +- .../service/impl/SysRoleServiceImpl.java | 27 +- .../service/impl/SysUserServiceImpl.java | 24 +- .../datasource/CustomDataSource.java | 2 +- .../datasource/MongoDBSource.java | 2 +- .../{ => common}/datasource/MySQLSource.java | 2 +- .../vital/{ => common}/util/DBNameTest.java | 2 +- .../{ => common}/util/DatabaseNameUtil.java | 2 +- .../{ => common}/util/GetHttpParamUtil.java | 2 +- .../rax/vital/handler/MedicineHandlerV2.java | 29 -- .../com/rax/vital/medicine/vo/MedicineVO.java | 4 - .../rax/vital/v1/config/WebSocketConfig.java | 56 +++ .../{ => v1}/config/WebSocketStompConfig.java | 4 +- .../handler}/AddMedicineHandler.java | 7 +- .../mysql => v1/handler}/ChatHandler.java | 8 +- .../handler}/MachineFeedbackHandler.java | 4 +- .../mysql => v1/handler}/MedicineHandler.java | 14 +- .../interceptor/WSChannelInterceptor.java | 5 +- .../interceptor/WebSocketInterceptors.java | 4 +- .../medicine/controller/ChatController.java | 4 +- .../controller/MedicineController.java | 97 +++-- .../vital/v1/medicine/dto/MedicineDTO.java | 7 + .../{ => v1}/medicine/entity/AIMedicine.java | 2 +- .../medicine/entity/DoctorMedicine.java | 2 +- .../{ => v1}/medicine/entity/Revulsion.java | 2 +- .../medicine/mapper/AIMedicineMapper.java | 4 +- .../medicine/mapper/DoctorMedicineMapper.java | 4 +- .../medicine/service/AIMedicineService.java | 18 + .../medicine/service/ChatService.java | 4 +- .../service/DoctorMedicineService.java | 17 + .../medicine/service/FlagService.java | 2 +- .../medicine/service/RevulsionService.java | 2 +- .../medicine/service/VitalSignsService.java | 2 +- .../service/impl/AIMedicineServiceImpl.java | 143 +++++++ .../service/impl/ChatServiceImpl.java | 48 +-- .../impl/DoctorMedicineServiceImpl.java | 80 ++++ .../service/impl/FlagServiceImpl.java | 155 ++++++++ .../service/impl/RevulsionServiceImpl.java | 4 +- .../service/impl/VitalSignServiceImpl.java | 25 +- .../vital/{ => v1}/timer/VitalSignTimer.java | 101 ++--- .../{ => v1}/timer/VitalSignTimerWS.java | 123 ++---- .../{ => v2}/config/WebSocketConfig.java | 12 +- .../vital/v2/config/WebSocketStompConfig.java | 47 +++ .../{ => v2}/handler/AddMedicineHandler.java | 111 ++++-- .../vital/{ => v2}/handler/ChatHandler.java | 29 +- .../handler/MachineFeedbackHandler.java | 100 ++--- .../{ => v2}/handler/MedicineHandler.java | 31 +- .../v2/interceptor/WSChannelInterceptor.java | 55 +++ .../v2/interceptor/WebSocketInterceptors.java | 38 ++ .../medicine/controller/ChatController.java | 50 +++ .../controller/MedicineController.java | 104 +++++ .../{ => v2}/medicine/dto/MedicineDTO.java | 2 +- .../vital/v2/medicine/entity/AIMedicine.java | 50 +++ .../v2/medicine/entity/DoctorMedicine.java | 49 +++ .../vital/v2/medicine/entity/Revulsion.java | 49 +++ .../medicine/service/AIMedicineService.java | 2 +- .../v2/medicine/service/ChatService.java | 15 + .../service/DoctorMedicineService.java | 2 +- .../v2/medicine/service/FlagService.java | 14 + .../v2/medicine/service/RevulsionService.java | 27 ++ .../v2/medicine/service/SurgeryServiceV2.java | 102 +++++ .../service/impl/AIMedicineServiceImpl.java | 8 +- .../service/impl/ChatServiceImpl.java | 178 +++++++++ .../impl/DoctorMedicineServiceImpl.java | 7 +- .../service/impl/FlagServiceImpl.java | 4 +- .../service/impl/RevulsionServiceImpl.java | 65 ++++ .../service/impl/SurgeryServiceV2Impl.java | 357 ++++++++++++++++++ .../rax/vital/v2/medicine/vo/MedicineVO.java | 4 + .../vital/{ => v2}/timer/AIMedicineTimer.java | 102 +++-- .../rax/vital/v2/timer/VitalSignTimerV2.java | 199 ++++++++++ .../src/main/resources/application.yml | 4 + .../main/resources/mapper/SysUserMapper.xml | 24 +- 107 files changed, 2580 insertions(+), 640 deletions(-) create mode 100644 upms/upms-biz/src/main/java/com/rax/admin/immu/RoleRecord.java rename upms/upms-biz/src/main/java/com/rax/vital/{ => common}/datasource/CustomDataSource.java (92%) rename upms/upms-biz/src/main/java/com/rax/vital/{ => common}/datasource/MongoDBSource.java (98%) rename upms/upms-biz/src/main/java/com/rax/vital/{ => common}/datasource/MySQLSource.java (97%) rename upms/upms-biz/src/main/java/com/rax/vital/{ => common}/util/DBNameTest.java (90%) rename upms/upms-biz/src/main/java/com/rax/vital/{ => common}/util/DatabaseNameUtil.java (95%) rename upms/upms-biz/src/main/java/com/rax/vital/{ => common}/util/GetHttpParamUtil.java (91%) delete mode 100644 upms/upms-biz/src/main/java/com/rax/vital/handler/MedicineHandlerV2.java delete mode 100644 upms/upms-biz/src/main/java/com/rax/vital/medicine/vo/MedicineVO.java create mode 100644 upms/upms-biz/src/main/java/com/rax/vital/v1/config/WebSocketConfig.java rename upms/upms-biz/src/main/java/com/rax/vital/{ => v1}/config/WebSocketStompConfig.java (95%) rename upms/upms-biz/src/main/java/com/rax/vital/{handler/mysql => v1/handler}/AddMedicineHandler.java (95%) rename upms/upms-biz/src/main/java/com/rax/vital/{handler/mysql => v1/handler}/ChatHandler.java (94%) rename upms/upms-biz/src/main/java/com/rax/vital/{handler/mysql => v1/handler}/MachineFeedbackHandler.java (97%) rename upms/upms-biz/src/main/java/com/rax/vital/{handler/mysql => v1/handler}/MedicineHandler.java (91%) rename upms/upms-biz/src/main/java/com/rax/vital/{ => v1}/interceptor/WSChannelInterceptor.java (94%) rename upms/upms-biz/src/main/java/com/rax/vital/{ => v1}/interceptor/WebSocketInterceptors.java (94%) rename upms/upms-biz/src/main/java/com/rax/vital/{ => v1}/medicine/controller/ChatController.java (95%) rename upms/upms-biz/src/main/java/com/rax/vital/{ => v1}/medicine/controller/MedicineController.java (63%) create mode 100644 upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/dto/MedicineDTO.java rename upms/upms-biz/src/main/java/com/rax/vital/{ => v1}/medicine/entity/AIMedicine.java (96%) rename upms/upms-biz/src/main/java/com/rax/vital/{ => v1}/medicine/entity/DoctorMedicine.java (96%) rename upms/upms-biz/src/main/java/com/rax/vital/{ => v1}/medicine/entity/Revulsion.java (96%) rename upms/upms-biz/src/main/java/com/rax/vital/{ => v1}/medicine/mapper/AIMedicineMapper.java (65%) rename upms/upms-biz/src/main/java/com/rax/vital/{ => v1}/medicine/mapper/DoctorMedicineMapper.java (65%) create mode 100644 upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/AIMedicineService.java rename upms/upms-biz/src/main/java/com/rax/vital/{ => v1}/medicine/service/ChatService.java (71%) create mode 100644 upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/DoctorMedicineService.java rename upms/upms-biz/src/main/java/com/rax/vital/{ => v1}/medicine/service/FlagService.java (85%) rename upms/upms-biz/src/main/java/com/rax/vital/{ => v1}/medicine/service/RevulsionService.java (91%) rename upms/upms-biz/src/main/java/com/rax/vital/{ => v1}/medicine/service/VitalSignsService.java (97%) create mode 100644 upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/impl/AIMedicineServiceImpl.java rename upms/upms-biz/src/main/java/com/rax/vital/{ => v1}/medicine/service/impl/ChatServiceImpl.java (89%) create mode 100644 upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/impl/DoctorMedicineServiceImpl.java create mode 100644 upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/impl/FlagServiceImpl.java rename upms/upms-biz/src/main/java/com/rax/vital/{ => v1}/medicine/service/impl/RevulsionServiceImpl.java (95%) rename upms/upms-biz/src/main/java/com/rax/vital/{ => v1}/medicine/service/impl/VitalSignServiceImpl.java (97%) rename upms/upms-biz/src/main/java/com/rax/vital/{ => v1}/timer/VitalSignTimer.java (76%) rename upms/upms-biz/src/main/java/com/rax/vital/{ => v1}/timer/VitalSignTimerWS.java (71%) rename upms/upms-biz/src/main/java/com/rax/vital/{ => v2}/config/WebSocketConfig.java (83%) create mode 100644 upms/upms-biz/src/main/java/com/rax/vital/v2/config/WebSocketStompConfig.java rename upms/upms-biz/src/main/java/com/rax/vital/{ => v2}/handler/AddMedicineHandler.java (64%) rename upms/upms-biz/src/main/java/com/rax/vital/{ => v2}/handler/ChatHandler.java (74%) rename upms/upms-biz/src/main/java/com/rax/vital/{ => v2}/handler/MachineFeedbackHandler.java (69%) rename upms/upms-biz/src/main/java/com/rax/vital/{ => v2}/handler/MedicineHandler.java (73%) create mode 100644 upms/upms-biz/src/main/java/com/rax/vital/v2/interceptor/WSChannelInterceptor.java create mode 100644 upms/upms-biz/src/main/java/com/rax/vital/v2/interceptor/WebSocketInterceptors.java create mode 100644 upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/controller/ChatController.java create mode 100644 upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/controller/MedicineController.java rename upms/upms-biz/src/main/java/com/rax/vital/{ => v2}/medicine/dto/MedicineDTO.java (87%) create mode 100644 upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/entity/AIMedicine.java create mode 100644 upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/entity/DoctorMedicine.java create mode 100644 upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/entity/Revulsion.java rename upms/upms-biz/src/main/java/com/rax/vital/{ => v2}/medicine/service/AIMedicineService.java (92%) create mode 100644 upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/ChatService.java rename upms/upms-biz/src/main/java/com/rax/vital/{ => v2}/medicine/service/DoctorMedicineService.java (87%) create mode 100644 upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/FlagService.java create mode 100644 upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/RevulsionService.java create mode 100644 upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/SurgeryServiceV2.java rename upms/upms-biz/src/main/java/com/rax/vital/{ => v2}/medicine/service/impl/AIMedicineServiceImpl.java (98%) create mode 100644 upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/impl/ChatServiceImpl.java rename upms/upms-biz/src/main/java/com/rax/vital/{ => v2}/medicine/service/impl/DoctorMedicineServiceImpl.java (95%) rename upms/upms-biz/src/main/java/com/rax/vital/{ => v2}/medicine/service/impl/FlagServiceImpl.java (97%) create mode 100644 upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/impl/RevulsionServiceImpl.java create mode 100644 upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/impl/SurgeryServiceV2Impl.java create mode 100644 upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/vo/MedicineVO.java rename upms/upms-biz/src/main/java/com/rax/vital/{ => v2}/timer/AIMedicineTimer.java (70%) create mode 100644 upms/upms-biz/src/main/java/com/rax/vital/v2/timer/VitalSignTimerV2.java diff --git a/auth/src/main/java/com/rax/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java b/auth/src/main/java/com/rax/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java index 9343dcb..00ec2a9 100644 --- a/auth/src/main/java/com/rax/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java +++ b/auth/src/main/java/com/rax/auth/support/base/OAuth2ResourceOwnerBaseAuthenticationProvider.java @@ -1,19 +1,12 @@ package com.rax.auth.support.base; -import cn.hutool.core.codec.Base64; import cn.hutool.extra.spring.SpringUtil; -import com.rax.admin.api.entity.SysOauthClientDetails; import com.rax.admin.api.feign.RemoteClientDetailsService; -import com.rax.admin.api.feign.RemoteUserService; -import com.rax.common.core.constant.SecurityConstants; -import com.rax.common.core.util.R; -import com.rax.common.core.util.SpringContextHolder; import com.rax.common.security.util.OAuth2ErrorCodesExpand; import com.rax.common.security.util.ScopeException; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.context.support.MessageSourceAccessor; -import org.springframework.data.redis.core.RedisTemplate; import org.springframework.security.authentication.*; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; @@ -31,12 +24,10 @@ import org.springframework.security.oauth2.server.authorization.token.OAuth2Toke import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; import java.security.Principal; import java.time.Instant; import java.util.*; -import java.util.concurrent.TimeUnit; import java.util.function.Supplier; /** diff --git a/auth/src/main/java/com/rax/auth/support/core/RaxDaoAuthenticationProvider.java b/auth/src/main/java/com/rax/auth/support/core/RaxDaoAuthenticationProvider.java index 1e3146a..ccba95e 100644 --- a/auth/src/main/java/com/rax/auth/support/core/RaxDaoAuthenticationProvider.java +++ b/auth/src/main/java/com/rax/auth/support/core/RaxDaoAuthenticationProvider.java @@ -1,8 +1,6 @@ package com.rax.auth.support.core; import cn.hutool.core.util.StrUtil; -import cn.hutool.crypto.Mode; -import cn.hutool.crypto.Padding; import cn.hutool.crypto.symmetric.AES; import cn.hutool.extra.spring.SpringUtil; import com.rax.common.core.constant.SecurityConstants; @@ -28,7 +26,6 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; import org.springframework.security.web.authentication.www.BasicAuthenticationConverter; import org.springframework.util.Assert; -import org.springframework.util.StringUtils; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; diff --git a/auth/src/main/java/com/rax/auth/support/password/OAuth2ResourceOwnerPasswordAuthenticationProvider.java b/auth/src/main/java/com/rax/auth/support/password/OAuth2ResourceOwnerPasswordAuthenticationProvider.java index 16aaebe..61a44c3 100644 --- a/auth/src/main/java/com/rax/auth/support/password/OAuth2ResourceOwnerPasswordAuthenticationProvider.java +++ b/auth/src/main/java/com/rax/auth/support/password/OAuth2ResourceOwnerPasswordAuthenticationProvider.java @@ -1,7 +1,6 @@ package com.rax.auth.support.password; import com.rax.admin.api.feign.RemoteClientDetailsService; -import com.rax.admin.api.feign.RemoteUserService; import com.rax.auth.support.base.OAuth2ResourceOwnerBaseAuthenticationProvider; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/common/common-log/src/main/java/com/rax/common/log/aspect/SysLogAspect.java b/common/common-log/src/main/java/com/rax/common/log/aspect/SysLogAspect.java index b3d756b..d0091e6 100644 --- a/common/common-log/src/main/java/com/rax/common/log/aspect/SysLogAspect.java +++ b/common/common-log/src/main/java/com/rax/common/log/aspect/SysLogAspect.java @@ -2,11 +2,11 @@ package com.rax.common.log.aspect; import cn.hutool.core.util.StrUtil; import com.rax.common.core.util.SpringContextHolder; +import com.rax.common.log.annotation.SysLog; import com.rax.common.log.event.SysLogEvent; import com.rax.common.log.event.SysLogEventSource; import com.rax.common.log.util.LogTypeEnum; import com.rax.common.log.util.SysLogUtils; -import com.rax.common.log.annotation.SysLog; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; diff --git a/common/common-mybatis/src/main/java/com/rax/common/mybatis/MybatisAutoConfiguration.java b/common/common-mybatis/src/main/java/com/rax/common/mybatis/MybatisAutoConfiguration.java index 608bbae..838dfba 100644 --- a/common/common-mybatis/src/main/java/com/rax/common/mybatis/MybatisAutoConfiguration.java +++ b/common/common-mybatis/src/main/java/com/rax/common/mybatis/MybatisAutoConfiguration.java @@ -18,8 +18,8 @@ package com.rax.common.mybatis; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; -import com.rax.common.mybatis.plugins.RaxPaginationInnerInterceptor; import com.rax.common.mybatis.config.MybatisPlusMetaObjectHandler; +import com.rax.common.mybatis.plugins.RaxPaginationInnerInterceptor; import com.rax.common.mybatis.resolver.SqlFilterArgumentResolver; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/common/common-oss/src/main/java/com/rax/common/file/FileAutoConfiguration.java b/common/common-oss/src/main/java/com/rax/common/file/FileAutoConfiguration.java index d237cb4..417472a 100644 --- a/common/common-oss/src/main/java/com/rax/common/file/FileAutoConfiguration.java +++ b/common/common-oss/src/main/java/com/rax/common/file/FileAutoConfiguration.java @@ -1,8 +1,8 @@ package com.rax.common.file; import com.rax.common.file.core.FileProperties; -import com.rax.common.file.oss.OssAutoConfiguration; import com.rax.common.file.local.LocalFileAutoConfiguration; +import com.rax.common.file.oss.OssAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Import; diff --git a/common/common-oss/src/main/java/com/rax/common/file/oss/OssAutoConfiguration.java b/common/common-oss/src/main/java/com/rax/common/file/oss/OssAutoConfiguration.java index c2e0c2e..4d8505c 100644 --- a/common/common-oss/src/main/java/com/rax/common/file/oss/OssAutoConfiguration.java +++ b/common/common-oss/src/main/java/com/rax/common/file/oss/OssAutoConfiguration.java @@ -1,8 +1,8 @@ package com.rax.common.file.oss; import com.rax.common.file.core.FileProperties; -import com.rax.common.file.oss.http.OssEndpoint; import com.rax.common.file.core.FileTemplate; +import com.rax.common.file.oss.http.OssEndpoint; import com.rax.common.file.oss.service.OssTemplate; import lombok.AllArgsConstructor; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; diff --git a/common/common-security/src/main/java/com/rax/common/security/service/RaxUser.java b/common/common-security/src/main/java/com/rax/common/security/service/RaxUser.java index 07918de..ca35265 100644 --- a/common/common-security/src/main/java/com/rax/common/security/service/RaxUser.java +++ b/common/common-security/src/main/java/com/rax/common/security/service/RaxUser.java @@ -19,6 +19,7 @@ package com.rax.common.security.service; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import lombok.Getter; +import lombok.Setter; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.SpringSecurityCoreVersion; import org.springframework.security.core.userdetails.User; @@ -26,6 +27,7 @@ import org.springframework.security.oauth2.core.OAuth2AuthenticatedPrincipal; import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -59,6 +61,14 @@ public class RaxUser extends User implements OAuth2AuthenticatedPrincipal { @JsonSerialize(using = ToStringSerializer.class) private final Long hospitalId; + /** + * 角色Code集合 + */ + @Getter + @Setter + @JsonSerialize(using = ToStringSerializer.class) + private List roleCodeList; + /** * 手机号 */ @@ -68,10 +78,11 @@ public class RaxUser extends User implements OAuth2AuthenticatedPrincipal { @Getter private final String chineseName; - public RaxUser(Long id, Long deptId, Long hospitalId, String username, String password, String phone, boolean enabled, + public RaxUser(Long id, Long deptId, Long hospitalId, String username, String password, String phone,List roleCodeList,boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, String chineseName, Collection authorities) { super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities); + this.roleCodeList = roleCodeList; this.id = id; this.deptId = deptId; this.hospitalId = hospitalId; diff --git a/common/common-security/src/main/java/com/rax/common/security/service/RaxUserDetailsService.java b/common/common-security/src/main/java/com/rax/common/security/service/RaxUserDetailsService.java index 4d15e89..0a6f0e6 100644 --- a/common/common-security/src/main/java/com/rax/common/security/service/RaxUserDetailsService.java +++ b/common/common-security/src/main/java/com/rax/common/security/service/RaxUserDetailsService.java @@ -67,7 +67,7 @@ public interface RaxUserDetailsService extends UserDetailsService, Ordered { // 构造security用户 return new RaxUser(user.getUserId(), user.getDeptId(), user.getHospitalId(), user.getUsername(), - SecurityConstants.BCRYPT + user.getPassword(), user.getPhone(), true, true, true, + SecurityConstants.BCRYPT + user.getPassword(), user.getPhone(),info.getRoleCodeList(), true, true, true, StrUtil.equals(user.getLockFlag(), CommonConstants.STATUS_NORMAL), user.getName(), authorities); } diff --git a/common/common-security/src/main/java/com/rax/common/security/service/RaxUserDetailsServiceImpl.java b/common/common-security/src/main/java/com/rax/common/security/service/RaxUserDetailsServiceImpl.java index 54ab525..456166d 100644 --- a/common/common-security/src/main/java/com/rax/common/security/service/RaxUserDetailsServiceImpl.java +++ b/common/common-security/src/main/java/com/rax/common/security/service/RaxUserDetailsServiceImpl.java @@ -29,7 +29,6 @@ import org.springframework.cache.Cache; import org.springframework.cache.CacheManager; import org.springframework.context.annotation.Primary; import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UsernameNotFoundException; /** * 用户详细信息 diff --git a/common/common-security/src/main/java/com/rax/common/security/util/SecurityUtils.java b/common/common-security/src/main/java/com/rax/common/security/util/SecurityUtils.java index 6fa63ec..3b6052b 100644 --- a/common/common-security/src/main/java/com/rax/common/security/util/SecurityUtils.java +++ b/common/common-security/src/main/java/com/rax/common/security/util/SecurityUtils.java @@ -17,8 +17,8 @@ package com.rax.common.security.util; import cn.hutool.core.util.StrUtil; -import com.rax.common.security.service.RaxUser; import com.rax.common.core.constant.SecurityConstants; +import com.rax.common.security.service.RaxUser; import lombok.experimental.UtilityClass; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; @@ -83,4 +83,13 @@ public class SecurityUtils { return roleIds; } + /** + * 判断用户的角色标识信息 + */ + public Boolean hasRoleCode(String roleCode) { + Authentication authentication = getAuthentication(); + RaxUser user = getUser(authentication); + List roleCodeList = user.getRoleCodeList(); + return roleCodeList.contains(roleCode); + } } diff --git a/common/common-swagger/src/main/java/com/rax/common/swagger/annotation/EnableRaxDoc.java b/common/common-swagger/src/main/java/com/rax/common/swagger/annotation/EnableRaxDoc.java index 0088e97..23b334f 100644 --- a/common/common-swagger/src/main/java/com/rax/common/swagger/annotation/EnableRaxDoc.java +++ b/common/common-swagger/src/main/java/com/rax/common/swagger/annotation/EnableRaxDoc.java @@ -16,8 +16,8 @@ package com.rax.common.swagger.annotation; -import com.rax.common.swagger.config.OpenAPIDefinitionImportSelector; import com.rax.common.core.factory.YamlPropertySourceFactory; +import com.rax.common.swagger.config.OpenAPIDefinitionImportSelector; import com.rax.common.swagger.support.SwaggerProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Import; diff --git a/common/common-xss/src/main/java/com/rax/common/xss/RaxXssAutoConfiguration.java b/common/common-xss/src/main/java/com/rax/common/xss/RaxXssAutoConfiguration.java index 1b34047..dc10994 100644 --- a/common/common-xss/src/main/java/com/rax/common/xss/RaxXssAutoConfiguration.java +++ b/common/common-xss/src/main/java/com/rax/common/xss/RaxXssAutoConfiguration.java @@ -18,10 +18,6 @@ package com.rax.common.xss; import com.rax.common.xss.config.RaxXssProperties; import com.rax.common.xss.core.*; -import com.rax.common.xss.core.DefaultXssCleaner; -import com.rax.common.xss.core.FormXssClean; -import com.rax.common.xss.core.JacksonXssClean; -import com.rax.common.xss.core.XssCleaner; import lombok.RequiredArgsConstructor; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; diff --git a/common/common-xss/src/main/java/com/rax/common/xss/core/XssCleanDeserializer.java b/common/common-xss/src/main/java/com/rax/common/xss/core/XssCleanDeserializer.java index f3de78b..c4446f4 100644 --- a/common/common-xss/src/main/java/com/rax/common/xss/core/XssCleanDeserializer.java +++ b/common/common-xss/src/main/java/com/rax/common/xss/core/XssCleanDeserializer.java @@ -16,9 +16,9 @@ package com.rax.common.xss.core; +import com.rax.common.core.util.SpringContextHolder; import com.rax.common.xss.config.RaxXssProperties; import com.rax.common.xss.utils.XssUtil; -import com.rax.common.core.util.SpringContextHolder; import lombok.extern.slf4j.Slf4j; import java.io.IOException; diff --git a/common/excel-spring-boot-starter/src/main/java/com/rax/excel/aop/ResponseExcelReturnValueHandler.java b/common/excel-spring-boot-starter/src/main/java/com/rax/excel/aop/ResponseExcelReturnValueHandler.java index b3208d1..6a315d2 100644 --- a/common/excel-spring-boot-starter/src/main/java/com/rax/excel/aop/ResponseExcelReturnValueHandler.java +++ b/common/excel-spring-boot-starter/src/main/java/com/rax/excel/aop/ResponseExcelReturnValueHandler.java @@ -2,6 +2,7 @@ package com.rax.excel.aop; import com.rax.excel.annotation.ResponseExcel; import com.rax.excel.handler.SheetWriteHandler; +import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.core.MethodParameter; @@ -10,7 +11,6 @@ import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodReturnValueHandler; import org.springframework.web.method.support.ModelAndViewContainer; -import jakarta.servlet.http.HttpServletResponse; import java.util.List; /** diff --git a/common/excel-spring-boot-starter/src/main/java/com/rax/excel/enhance/DefaultWriterBuilderEnhancer.java b/common/excel-spring-boot-starter/src/main/java/com/rax/excel/enhance/DefaultWriterBuilderEnhancer.java index 7c1e958..0914666 100644 --- a/common/excel-spring-boot-starter/src/main/java/com/rax/excel/enhance/DefaultWriterBuilderEnhancer.java +++ b/common/excel-spring-boot-starter/src/main/java/com/rax/excel/enhance/DefaultWriterBuilderEnhancer.java @@ -4,7 +4,6 @@ import com.alibaba.excel.write.builder.ExcelWriterBuilder; import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder; import com.rax.excel.annotation.ResponseExcel; import com.rax.excel.head.HeadGenerator; - import jakarta.servlet.http.HttpServletResponse; /** diff --git a/common/excel-spring-boot-starter/src/main/java/com/rax/excel/handler/SheetWriteHandler.java b/common/excel-spring-boot-starter/src/main/java/com/rax/excel/handler/SheetWriteHandler.java index 09d8632..3e7b9b4 100644 --- a/common/excel-spring-boot-starter/src/main/java/com/rax/excel/handler/SheetWriteHandler.java +++ b/common/excel-spring-boot-starter/src/main/java/com/rax/excel/handler/SheetWriteHandler.java @@ -1,7 +1,6 @@ package com.rax.excel.handler; import com.rax.excel.annotation.ResponseExcel; - import jakarta.servlet.http.HttpServletResponse; /** diff --git a/daily-plan/src/main/java/com/rax/dailyplan/controller/DailyPlanController.java b/daily-plan/src/main/java/com/rax/dailyplan/controller/DailyPlanController.java index f5695e6..7afdd2f 100644 --- a/daily-plan/src/main/java/com/rax/dailyplan/controller/DailyPlanController.java +++ b/daily-plan/src/main/java/com/rax/dailyplan/controller/DailyPlanController.java @@ -9,7 +9,9 @@ import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/dailyPlan") diff --git a/daily-plan/src/main/java/com/rax/dailyplan/dto/DailyPlanDTO.java b/daily-plan/src/main/java/com/rax/dailyplan/dto/DailyPlanDTO.java index 6847d42..cc115a7 100644 --- a/daily-plan/src/main/java/com/rax/dailyplan/dto/DailyPlanDTO.java +++ b/daily-plan/src/main/java/com/rax/dailyplan/dto/DailyPlanDTO.java @@ -1,6 +1,5 @@ package com.rax.dailyplan.dto; -import com.baomidou.mybatisplus.annotation.*; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/daily-plan/src/main/java/com/rax/dailyplan/entity/DailyPlan.java b/daily-plan/src/main/java/com/rax/dailyplan/entity/DailyPlan.java index 7c9fcca..f58fbcc 100644 --- a/daily-plan/src/main/java/com/rax/dailyplan/entity/DailyPlan.java +++ b/daily-plan/src/main/java/com/rax/dailyplan/entity/DailyPlan.java @@ -5,7 +5,6 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.io.Serializable; -import java.sql.Timestamp; @Data @Schema(description = "日常计划") diff --git a/daily-plan/src/main/java/com/rax/dailyplan/service/impl/DailyPlanServiceImpl.java b/daily-plan/src/main/java/com/rax/dailyplan/service/impl/DailyPlanServiceImpl.java index b453ed1..f46c70e 100644 --- a/daily-plan/src/main/java/com/rax/dailyplan/service/impl/DailyPlanServiceImpl.java +++ b/daily-plan/src/main/java/com/rax/dailyplan/service/impl/DailyPlanServiceImpl.java @@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.rax.common.core.util.R; import com.rax.common.security.service.RaxUser; -import com.rax.common.security.util.SecurityUtils; import com.rax.dailyplan.dto.DailyPlanDTO; import com.rax.dailyplan.entity.DailyPlan; import com.rax.dailyplan.mapper.DailyPlanMapper; diff --git a/upms/upms-api/src/main/java/com/rax/admin/api/dto/UserDTO.java b/upms/upms-api/src/main/java/com/rax/admin/api/dto/UserDTO.java index f75696f..b24d703 100644 --- a/upms/upms-api/src/main/java/com/rax/admin/api/dto/UserDTO.java +++ b/upms/upms-api/src/main/java/com/rax/admin/api/dto/UserDTO.java @@ -51,4 +51,17 @@ public class UserDTO extends SysUser { @Schema(description = "随机值") private String randomStr; + @Override + public String toString() { + return "UserDTO{" + + "userId=" + getUserId() + '\'' + + ", username='" + getUsername() + '\'' + + "role=" + role + + ", deptId=" + deptId + + ", post=" + post + + ", newpassword1='" + newpassword1 + '\'' + + ", code='" + code + '\'' + + ", randomStr='" + randomStr + '\'' + + '}'; + } } diff --git a/upms/upms-api/src/main/java/com/rax/admin/api/dto/UserInfo.java b/upms/upms-api/src/main/java/com/rax/admin/api/dto/UserInfo.java index 05a1ed5..0e8064c 100644 --- a/upms/upms-api/src/main/java/com/rax/admin/api/dto/UserInfo.java +++ b/upms/upms-api/src/main/java/com/rax/admin/api/dto/UserInfo.java @@ -5,6 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.io.Serializable; +import java.util.List; /** * @author lengleng @@ -32,4 +33,10 @@ public class UserInfo implements Serializable { @Schema(description = "角色标识集合") private Long[] roles; + /** + * 角色Code集合 + */ + @Schema(description = "角色Code集合") + private List roleCodeList; + } diff --git a/upms/upms-api/src/main/java/com/rax/admin/api/vo/UserVO.java b/upms/upms-api/src/main/java/com/rax/admin/api/vo/UserVO.java index 3f90cac..0b8f278 100644 --- a/upms/upms-api/src/main/java/com/rax/admin/api/vo/UserVO.java +++ b/upms/upms-api/src/main/java/com/rax/admin/api/vo/UserVO.java @@ -132,4 +132,14 @@ public class UserVO implements Serializable { @Schema(description = "邮箱") private String email; + /** + * 所属医院相关信息 + */ + private String hospitalName; + + /** + * 医院ID + */ + private Long hospitalId; + } diff --git a/upms/upms-biz/src/main/java/com/rax/RaxAdminApplication.java b/upms/upms-biz/src/main/java/com/rax/RaxAdminApplication.java index 22767e0..fcd4577 100644 --- a/upms/upms-biz/src/main/java/com/rax/RaxAdminApplication.java +++ b/upms/upms-biz/src/main/java/com/rax/RaxAdminApplication.java @@ -5,6 +5,9 @@ import com.rax.common.swagger.annotation.EnableRaxDoc; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.FilterType; +import org.springframework.scheduling.annotation.EnableScheduling; /** * @author lengleng @@ -15,7 +18,13 @@ import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; */ @EnableRaxDoc(value = "admin") @EnableRaxResourceServer +@EnableScheduling // 开启定时任务 -> 清除日志相关内容 @SpringBootApplication(exclude = MongoAutoConfiguration.class) +@ComponentScan( + basePackages = {"com.rax"}, + excludeFilters = { + @ComponentScan.Filter(type = FilterType.REGEX, pattern = "com.rax.vital.v1.*") + }) public class RaxAdminApplication { public static void main(String[] args) { diff --git a/upms/upms-biz/src/main/java/com/rax/admin/controller/SysHospitalController.java b/upms/upms-biz/src/main/java/com/rax/admin/controller/SysHospitalController.java index 2aa0e4b..85247d5 100644 --- a/upms/upms-biz/src/main/java/com/rax/admin/controller/SysHospitalController.java +++ b/upms/upms-biz/src/main/java/com/rax/admin/controller/SysHospitalController.java @@ -14,7 +14,6 @@ import org.springframework.http.HttpHeaders; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; diff --git a/upms/upms-biz/src/main/java/com/rax/admin/controller/SysMessageController.java b/upms/upms-biz/src/main/java/com/rax/admin/controller/SysMessageController.java index 97dee52..6c805da 100644 --- a/upms/upms-biz/src/main/java/com/rax/admin/controller/SysMessageController.java +++ b/upms/upms-biz/src/main/java/com/rax/admin/controller/SysMessageController.java @@ -8,6 +8,8 @@ import com.rax.admin.api.vo.SysMessageVO; import com.rax.admin.service.SysHospitalService; import com.rax.admin.service.SysMessageService; import com.rax.common.core.util.R; +import com.rax.common.security.service.RaxUser; +import com.rax.common.security.util.SecurityUtils; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; @@ -41,13 +43,13 @@ public class SysMessageController { @PostMapping("/page") public R page(Page page, SysMessageVO sysMessageVO) { - String hospitalId = sysHospitalService.getCurrentHospital(); + RaxUser user = SecurityUtils.getUser(); return R.ok(sysMessageService.page(page, Wrappers.lambdaQuery() .eq(StringUtils.hasText(sysMessageVO.getCategory()), SysMessage::getCategory, sysMessageVO.getCategory()) .eq(SysMessage::getDelFlag, 0) - .eq(SysMessage::getHospital, hospitalId) + .eq(SysMessage::getHospital, user.getHospitalId()) .like(StringUtils.hasText(sysMessageVO.getMessage()), SysMessage::getMessage, sysMessageVO.getMessage())) diff --git a/upms/upms-biz/src/main/java/com/rax/admin/controller/SysRoleController.java b/upms/upms-biz/src/main/java/com/rax/admin/controller/SysRoleController.java index 496d899..371e707 100644 --- a/upms/upms-biz/src/main/java/com/rax/admin/controller/SysRoleController.java +++ b/upms/upms-biz/src/main/java/com/rax/admin/controller/SysRoleController.java @@ -39,6 +39,8 @@ public class SysRoleController { private final SysRoleService sysRoleService; + + /** * 通过ID查询角色信息 * @param id ID diff --git a/upms/upms-biz/src/main/java/com/rax/admin/controller/SysUserController.java b/upms/upms-biz/src/main/java/com/rax/admin/controller/SysUserController.java index 0503cab..bcd71c6 100644 --- a/upms/upms-biz/src/main/java/com/rax/admin/controller/SysUserController.java +++ b/upms/upms-biz/src/main/java/com/rax/admin/controller/SysUserController.java @@ -1,10 +1,10 @@ package com.rax.admin.controller; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.rax.admin.api.dto.UserDTO; -import com.rax.admin.api.entity.SysRole; import com.rax.admin.api.entity.SysUser; import com.rax.admin.api.vo.UserExcelVO; import com.rax.admin.service.SysHospitalService; @@ -29,8 +29,6 @@ import org.springdoc.core.annotations.ParameterObject; import org.springframework.beans.BeanUtils; import org.springframework.http.HttpHeaders; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.util.StringUtils; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; @@ -72,32 +70,24 @@ public class SysUserController { .lambda() .eq(StrUtil.isNotBlank(username), SysUser::getUsername, username) .eq(StrUtil.isNotBlank(phone), SysUser::getPhone, phone)); - SysUser user1 = userService.getOne(Wrappers.query() - .lambda() - .eq(StrUtil.isNotBlank(username), SysUser::getUsername, username) - .eq(StrUtil.isNotBlank(phone), SysUser::getPhone, phone)); if (user == null) { - if (user1 == null) { - return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERINFO_EMPTY, username)); - } else { - List rolesByUserId = roleService.findRolesByUserId(user1.getUserId()); - boolean isAdmin = false; - for (SysRole role: rolesByUserId) { - if (ADMIN_ROLE_CODE.equals(role.getRoleCode())) { - isAdmin = true; - break; - } - } - if (isAdmin) { - sysHospitalService.changeHospital("", String.valueOf(user1.getUserId())); - return R.ok(userService.findUserInfo(user1)); - } else { - return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERINFO_EMPTY, username)); - } - } + return R.failed(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERINFO_EMPTY, username)); + } else { +// List rolesByUserId = roleService.findRolesByUserId(user.getUserId()); +// boolean isAdmin = false; +// for (SysRole role : rolesByUserId) { +// if (ADMIN_ROLE_CODE.equals(role.getRoleCode())) { +// isAdmin = true; +// break; +// } +// } +// if (isAdmin) { +// sysHospitalService.changeHospital("", String.valueOf(user.getUserId())); +// } else { +// sysHospitalService.changeHospital(String.valueOf(user.getHospitalId()), String.valueOf(user.getUserId())); +// } + return R.ok(userService.findUserInfo(user)); } - sysHospitalService.changeHospital(String.valueOf(user.getHospitalId()), String.valueOf(user.getUserId())); - return R.ok(userService.findUserInfo(user)); } /** @@ -192,28 +182,20 @@ public class SysUserController { } /** - * 分页查询用户 - * + * 分页查询用户信息, 查询当前医院, 如果当前医院为null且具有管理员权限, 则查询所有 + * 只能查询到当前医院的医生信息. * @param page 参数集 * @param userDTO 查询参数列表 * @return 用户集合 */ @PostMapping("/page") public R getUserPage(Page page, UserDTO userDTO) { - String hospitalId = sysHospitalService.getCurrentHospital(); - if (StringUtils.hasText(hospitalId) && !"null".equals(hospitalId)) { - userDTO.setHospitalId(Long.valueOf(hospitalId)); + RaxUser user = SecurityUtils.getUser(); + if (ObjectUtil.isNotNull(user.getHospitalId())) { + userDTO.setHospitalId(user.getHospitalId()); } else { - RaxUser raxUser = (RaxUser) SecurityUtils.getAuthentication().getPrincipal(); - List rolesByUserId = roleService.findRolesByUserId(raxUser.getId()); - boolean isAdmin = false; - for (SysRole role: rolesByUserId) { - if (ADMIN_ROLE_CODE.equals(role.getRoleCode())) { - isAdmin = true; - break; - } - } - if (!isAdmin) { + Boolean adminRole = SecurityUtils.hasRoleCode(ADMIN_ROLE_CODE); + if (!adminRole) { return R.ok(new Page<>()); } } @@ -222,7 +204,7 @@ public class SysUserController { /** * 分页查询用户 - * + * 查询所有的用户信息, 属于系统后台管理功能 * @return 用户集合 */ @PostMapping("/list") diff --git a/upms/upms-biz/src/main/java/com/rax/admin/immu/RoleRecord.java b/upms/upms-biz/src/main/java/com/rax/admin/immu/RoleRecord.java new file mode 100644 index 0000000..ba98232 --- /dev/null +++ b/upms/upms-biz/src/main/java/com/rax/admin/immu/RoleRecord.java @@ -0,0 +1,11 @@ +package com.rax.admin.immu; + +/** + * project_name:remote-control-backend + * time:2024/8/27 16:42 + */ + +public record RoleRecord() { + public static final String ADMIN_ROLE_CODE = "ROLE_ADMIN"; + public static final String SITE_ROLE_CODE = "ROLE_CHIEF"; +} diff --git a/upms/upms-biz/src/main/java/com/rax/admin/service/SysMessageService.java b/upms/upms-biz/src/main/java/com/rax/admin/service/SysMessageService.java index 8165048..656f338 100644 --- a/upms/upms-biz/src/main/java/com/rax/admin/service/SysMessageService.java +++ b/upms/upms-biz/src/main/java/com/rax/admin/service/SysMessageService.java @@ -1,6 +1,5 @@ package com.rax.admin.service; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.rax.admin.api.entity.SysMessage; import com.rax.admin.api.vo.SysMessageVO; diff --git a/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysHospitalServiceImpl.java b/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysHospitalServiceImpl.java index 4108882..38e86ac 100644 --- a/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysHospitalServiceImpl.java +++ b/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysHospitalServiceImpl.java @@ -5,16 +5,15 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.rax.admin.api.dto.HospitalDTO; import com.rax.admin.api.entity.SysHospital; -import com.rax.admin.api.entity.SysRole; import com.rax.admin.mapper.SysHospitalMapper; import com.rax.admin.service.SysHospitalService; import com.rax.admin.service.SysRoleService; import com.rax.common.core.constant.CacheConstants; import com.rax.common.core.util.R; import com.rax.common.security.service.RaxUser; +import com.rax.common.security.util.SecurityUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cache.annotation.CacheEvict; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; @@ -96,28 +95,21 @@ public class SysHospitalServiceImpl extends ServiceImpl roleList = roleService.findRolesByUserId(raxUser.getId()); - List adminRoleList = roleList.stream().filter(predicate -> ADMIN_ROLE_CODE.contains(predicate.getRoleCode())).toList(); - List sysHospitals = null; - if (!adminRoleList.isEmpty()) { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("del_flag", 0); - queryWrapper.orderByDesc("create_time"); - queryWrapper.select(new String[]{"id", "name", "code", "status", "domain", "province", "city"}); - sysHospitals = sysHospitalMapper.selectMaps(queryWrapper); - SysHospital hospital = new SysHospital(); - hospital.setName("无"); - sysHospitals.add(0, hospital); - } else { - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("id", raxUser.getHospitalId()); - queryWrapper.eq("del_flag", 0); - queryWrapper.orderByDesc("create_time"); - queryWrapper.select(new String[]{"id", "name", "code", "status", "domain", "province", "city"}); - sysHospitals = sysHospitalMapper.selectMaps(queryWrapper); + Long hospitalId = SecurityUtils.getUser().getHospitalId(); + if (hospitalId != null) { + List oneHospitalList = this.lambdaQuery() + .eq(SysHospital::getId, hospitalId) + .list(); + return oneHospitalList; } - return sysHospitals; + if (SecurityUtils.hasRoleCode(ADMIN_ROLE_CODE)) { + List list = this.lambdaQuery().list(); + SysHospital sysHospital = new SysHospital(); + sysHospital.setName("全部医院"); + list.add(0,sysHospital); + return list; + } + return null; } @Override diff --git a/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysLogServiceImpl.java b/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysLogServiceImpl.java index b4bfa73..5b59621 100644 --- a/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysLogServiceImpl.java +++ b/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysLogServiceImpl.java @@ -1,25 +1,22 @@ package com.rax.admin.service.impl; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.rax.admin.api.dto.SysLogDTO; import com.rax.admin.api.entity.SysLog; -import com.rax.admin.api.entity.SysRole; -import com.rax.admin.api.entity.SysUser; +import com.rax.admin.immu.RoleRecord; import com.rax.admin.mapper.SysLogMapper; import com.rax.admin.service.SysLogService; import com.rax.admin.service.SysRoleService; import com.rax.admin.service.SysUserService; import com.rax.common.security.service.RaxUser; +import com.rax.common.security.util.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; +import java.time.temporal.TemporalAdjusters; import java.util.List; import java.util.Map; @@ -43,48 +40,71 @@ public class SysLogServiceImpl extends ServiceImpl impleme @Autowired private SysUserService userService; + + /** + * 三种情况 + * 系统管理员可以查看全部的日志信息 + * 站点管理员可以查看自己所属医院的日志信息 + * 普通用户只能查看自己的日志信息 + */ @Override public Page getLogByPage(Page page, SysLogDTO sysLog) { - RaxUser raxUser = (RaxUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - List roleList = roleService.findRolesByUserId(raxUser.getId()); - List adminRoleList = roleList.stream().filter(predicate -> ADMIN_ROLE_CODE.contains(predicate.getRoleCode())).toList(); - List siteRoleList = roleList.stream().filter(predicate -> SITE_ROLE_CODE.contains(predicate.getRoleCode())).toList(); - - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - if (StrUtil.isNotBlank(sysLog.getLogType())) { - wrapper.eq(SysLog::getLogType, sysLog.getLogType()); + RaxUser user = SecurityUtils.getUser(); + List roleCodeList = user.getRoleCodeList(); + if (roleCodeList.isEmpty()) { + return null; } - - if (adminRoleList.isEmpty()) { - if (siteRoleList.isEmpty()) { - wrapper.eq(SysLog::getCreateBy, raxUser.getName()); - } else { - SysUser sysUser = userService.getById(raxUser.getId()); - wrapper.eq(SysLog::getHospitalId, sysUser.getHospitalId()); - } + // 获取当前日期时间 + LocalDateTime now = LocalDateTime.now(); + // 获取当月的第一天 + LocalDateTime firstDayOfMonth = now.with(TemporalAdjusters.firstDayOfMonth()); + // 当月的最后一天 + LocalDateTime lastDayOfMonth = now.with(TemporalAdjusters.lastDayOfMonth()); + if (roleCodeList.contains(RoleRecord.ADMIN_ROLE_CODE)) { + // 查看三十天的所有日志信息 + List list = this.lambdaQuery() + .ge(SysLog::getCreateTime, firstDayOfMonth) + .le(SysLog::getCreateTime, lastDayOfMonth) + .orderByDesc(SysLog::getCreateTime).list(); + Page logPage = new Page<>(); + logPage.setRecords(list) + .setTotal(list.size()); + return logPage; } - - if (ArrayUtil.isNotEmpty(sysLog.getTimeInterval())) { - wrapper.ge(SysLog::getCreateTime, sysLog.getTimeInterval()[0]) - .le(SysLog::getCreateTime, sysLog.getTimeInterval()[1]); + if (roleCodeList.contains(RoleRecord.SITE_ROLE_CODE)) { + // 查看自己所属医院的日志信息 + List list = this.lambdaQuery() + .eq(SysLog::getHospitalId, user.getHospitalId()) + .ge(SysLog::getCreateTime, firstDayOfMonth) + .le(SysLog::getCreateTime, lastDayOfMonth) + .orderByDesc(SysLog::getCreateTime).list(); + Page logPage = new Page<>(); + logPage.setRecords(list) + .setTotal(list.size()); + return logPage; } - - wrapper.orderByDesc(SysLog::getCreateTime); - - return baseMapper.selectPage(page, wrapper); + // 返回自己的日志信息 + List list = this.lambdaQuery() + .eq(SysLog::getCreateBy, user.getName()) + .ge(SysLog::getCreateTime, firstDayOfMonth) + .le(SysLog::getCreateTime, lastDayOfMonth) + .orderByDesc(SysLog::getCreateTime).list(); + Page logPage = new Page<>(); + logPage.setRecords(list) + .setTotal(list.size()); + return logPage; } /** * 插入日志 + * * @param sysLog 日志对象 * @return true/false */ @Override @Transactional(rollbackFor = Exception.class) public Boolean saveLog(SysLog sysLog) { - System.out.println("sysLog = " + sysLog); - SysUser sysUser = userService.getOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, sysLog.getCreateBy())); - sysLog.setHospitalId(sysUser.getHospitalId()); + sysLog.setHospitalId(SecurityUtils.getUser().getHospitalId()); baseMapper.insert(sysLog); return Boolean.TRUE; } diff --git a/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysMenuServiceImpl.java b/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysMenuServiceImpl.java index 62e818e..9a24d77 100644 --- a/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysMenuServiceImpl.java +++ b/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysMenuServiceImpl.java @@ -24,11 +24,13 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.cache.annotation.CacheEvict; -import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; diff --git a/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysMessageServiceImpl.java b/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysMessageServiceImpl.java index b7e0bca..d1cc695 100644 --- a/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysMessageServiceImpl.java +++ b/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysMessageServiceImpl.java @@ -14,6 +14,7 @@ import com.rax.admin.service.SysMessageUserService; import com.rax.admin.service.SysUserService; import com.rax.common.core.util.R; import com.rax.common.security.service.RaxUser; +import com.rax.common.security.util.SecurityUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.context.SecurityContextHolder; @@ -36,14 +37,15 @@ public class SysMessageServiceImpl extends ServiceImpl impl private SysRoleMenuService roleMenuService; + private final String ROLE_ADMIN = "ROLE_ADMIN"; + @Override public R saveRole(SysRole sysRole, String menuIds) { boolean saveStatus = save(sysRole); @@ -115,10 +114,22 @@ public class SysRoleServiceImpl extends ServiceImpl impl } public R getRoleTree(Page page, String roleName) { - List roleTree = baseMapper.getRoleTree(page, roleName); + List roleTree = baseMapper.getRoleTree(page, roleName); Integer total = baseMapper.getTotal(roleName); - page.setRecords(roleTree); - page.setTotal(total); + if (SecurityUtils.hasRoleCode(ROLE_ADMIN)) { + page.setRecords(roleTree) + .setTotal(total); + }else { + List roleTreeFilter = new ArrayList<>(); + for (Map map : roleTree) { + if (!ROLE_ADMIN.equals(map.get("roleCode"))) { + roleTreeFilter.add(map); + } + } + total-=1; + page.setRecords(roleTreeFilter) + .setTotal(total); + } return R.ok(page); } diff --git a/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysUserServiceImpl.java b/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysUserServiceImpl.java index 9ac4882..8a2d4fa 100644 --- a/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysUserServiceImpl.java +++ b/upms/upms-biz/src/main/java/com/rax/admin/service/impl/SysUserServiceImpl.java @@ -96,10 +96,16 @@ public class SysUserServiceImpl extends ServiceImpl impl sysUser.setDelFlag(CommonConstants.STATUS_NORMAL); sysUser.setCreateBy(userDto.getUsername()); sysUser.setPassword(ENCODER.encode(userDto.getPassword())); - String hosptital = sysHospitalService.getCurrentHospital(); - if (StringUtils.hasText(hosptital) && !"null".equals(hosptital)) { - sysUser.setHospitalId(Long.valueOf(hosptital)); +// String hosptital = sysHospitalService.getCurrentHospital(); +// if (StringUtils.hasText(hosptital) && !"null".equals(hosptital)) { +// sysUser.setHospitalId(Long.valueOf(hospitalId)); +// } + Long hospitalId = SecurityUtils.getUser().getHospitalId(); + + if (hospitalId != null){ + sysUser.setHospitalId(hospitalId); } + baseMapper.insert(sysUser); // 保存用户岗位信息 Optional.ofNullable(userDto.getPost()).ifPresent(posts -> { @@ -141,13 +147,23 @@ public class SysUserServiceImpl extends ServiceImpl impl public UserInfo findUserInfo(SysUser sysUser) { UserInfo userInfo = new UserInfo(); userInfo.setSysUser(sysUser); + // 设置角色列表 (ID) - List roleIds = sysRoleService.findRolesByUserId(sysUser.getUserId()) + List roleList = sysRoleService.findRolesByUserId(sysUser.getUserId()); + List roleIds = roleList .stream() .map(SysRole::getRoleId) .collect(Collectors.toList()); userInfo.setRoles(ArrayUtil.toArray(roleIds, Long.class)); + // 设置user的roleCodeList + List roleCodeList = roleList.stream() + .map(SysRole::getRoleCode) + .toList(); + userInfo.setRoleCodeList(roleCodeList); + + + // 设置权限列表(menu.permission) Set permissions = new HashSet<>(); roleIds.forEach(roleId -> { diff --git a/upms/upms-biz/src/main/java/com/rax/vital/datasource/CustomDataSource.java b/upms/upms-biz/src/main/java/com/rax/vital/common/datasource/CustomDataSource.java similarity index 92% rename from upms/upms-biz/src/main/java/com/rax/vital/datasource/CustomDataSource.java rename to upms/upms-biz/src/main/java/com/rax/vital/common/datasource/CustomDataSource.java index 8c177a0..f5104bd 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/datasource/CustomDataSource.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/common/datasource/CustomDataSource.java @@ -1,4 +1,4 @@ -package com.rax.vital.datasource; +package com.rax.vital.common.datasource; import lombok.Getter; diff --git a/upms/upms-biz/src/main/java/com/rax/vital/datasource/MongoDBSource.java b/upms/upms-biz/src/main/java/com/rax/vital/common/datasource/MongoDBSource.java similarity index 98% rename from upms/upms-biz/src/main/java/com/rax/vital/datasource/MongoDBSource.java rename to upms/upms-biz/src/main/java/com/rax/vital/common/datasource/MongoDBSource.java index b82cdac..90dfd58 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/datasource/MongoDBSource.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/common/datasource/MongoDBSource.java @@ -1,4 +1,4 @@ -package com.rax.vital.datasource; +package com.rax.vital.common.datasource; import com.mongodb.ConnectionString; import com.mongodb.MongoClientSettings; diff --git a/upms/upms-biz/src/main/java/com/rax/vital/datasource/MySQLSource.java b/upms/upms-biz/src/main/java/com/rax/vital/common/datasource/MySQLSource.java similarity index 97% rename from upms/upms-biz/src/main/java/com/rax/vital/datasource/MySQLSource.java rename to upms/upms-biz/src/main/java/com/rax/vital/common/datasource/MySQLSource.java index a27bc6c..77336ec 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/datasource/MySQLSource.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/common/datasource/MySQLSource.java @@ -1,4 +1,4 @@ -package com.rax.vital.datasource; +package com.rax.vital.common.datasource; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.pool.DruidPooledConnection; diff --git a/upms/upms-biz/src/main/java/com/rax/vital/util/DBNameTest.java b/upms/upms-biz/src/main/java/com/rax/vital/common/util/DBNameTest.java similarity index 90% rename from upms/upms-biz/src/main/java/com/rax/vital/util/DBNameTest.java rename to upms/upms-biz/src/main/java/com/rax/vital/common/util/DBNameTest.java index 3f9805b..679cc4a 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/util/DBNameTest.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/common/util/DBNameTest.java @@ -1,4 +1,4 @@ -package com.rax.vital.util; +package com.rax.vital.common.util; diff --git a/upms/upms-biz/src/main/java/com/rax/vital/util/DatabaseNameUtil.java b/upms/upms-biz/src/main/java/com/rax/vital/common/util/DatabaseNameUtil.java similarity index 95% rename from upms/upms-biz/src/main/java/com/rax/vital/util/DatabaseNameUtil.java rename to upms/upms-biz/src/main/java/com/rax/vital/common/util/DatabaseNameUtil.java index 93ac14f..05439f8 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/util/DatabaseNameUtil.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/common/util/DatabaseNameUtil.java @@ -1,4 +1,4 @@ -package com.rax.vital.util; +package com.rax.vital.common.util; import org.springframework.util.StringUtils; diff --git a/upms/upms-biz/src/main/java/com/rax/vital/util/GetHttpParamUtil.java b/upms/upms-biz/src/main/java/com/rax/vital/common/util/GetHttpParamUtil.java similarity index 91% rename from upms/upms-biz/src/main/java/com/rax/vital/util/GetHttpParamUtil.java rename to upms/upms-biz/src/main/java/com/rax/vital/common/util/GetHttpParamUtil.java index b9d5910..8468bf5 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/util/GetHttpParamUtil.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/common/util/GetHttpParamUtil.java @@ -1,4 +1,4 @@ -package com.rax.vital.util; +package com.rax.vital.common.util; import java.util.HashMap; import java.util.Map; diff --git a/upms/upms-biz/src/main/java/com/rax/vital/handler/MedicineHandlerV2.java b/upms/upms-biz/src/main/java/com/rax/vital/handler/MedicineHandlerV2.java deleted file mode 100644 index 7cc63c9..0000000 --- a/upms/upms-biz/src/main/java/com/rax/vital/handler/MedicineHandlerV2.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.rax.vital.handler; - -import org.springframework.web.socket.CloseStatus; -import org.springframework.web.socket.WebSocketMessage; -import org.springframework.web.socket.WebSocketSession; -import org.springframework.web.socket.handler.AbstractWebSocketHandler; - -public class MedicineHandlerV2 extends AbstractWebSocketHandler { - - @Override - public void afterConnectionEstablished(WebSocketSession session) throws Exception { - super.afterConnectionEstablished(session); - } - - @Override - public void handleMessage(WebSocketSession session, WebSocketMessage message) throws Exception { - super.handleMessage(session, message); - } - - @Override - public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { - super.handleTransportError(session, exception); - } - - @Override - public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { - super.afterConnectionClosed(session, status); - } -} diff --git a/upms/upms-biz/src/main/java/com/rax/vital/medicine/vo/MedicineVO.java b/upms/upms-biz/src/main/java/com/rax/vital/medicine/vo/MedicineVO.java deleted file mode 100644 index 16c0f7c..0000000 --- a/upms/upms-biz/src/main/java/com/rax/vital/medicine/vo/MedicineVO.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.rax.vital.medicine.vo; - -public class MedicineVO { -} diff --git a/upms/upms-biz/src/main/java/com/rax/vital/v1/config/WebSocketConfig.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/config/WebSocketConfig.java new file mode 100644 index 0000000..39489c4 --- /dev/null +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/config/WebSocketConfig.java @@ -0,0 +1,56 @@ +package com.rax.vital.v1.config; + +import com.rax.vital.v1.handler.AddMedicineHandler; +import com.rax.vital.v1.handler.ChatHandler; +import com.rax.vital.v1.handler.MachineFeedbackHandler; +import com.rax.vital.v1.handler.MedicineHandler; +import com.rax.vital.v1.interceptor.WebSocketInterceptors; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.config.annotation.EnableWebSocket; +import org.springframework.web.socket.config.annotation.WebSocketConfigurer; +import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; +import org.springframework.web.socket.server.HandshakeInterceptor; +import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor; + +@EnableWebSocket +@Configuration +public class WebSocketConfig implements WebSocketConfigurer { + + @Override + public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { + registry.addHandler(medicineHandler(), "/rax/vitalSignsMedicine") + .addHandler(chatHandler(), "/rax/chatRoom") + .addHandler(addMedicineHandler(), "/rax/addMedicine") + .addHandler(machineFeedbackHandler(),"/rax/getMedicine") + .addInterceptors(new HttpSessionHandshakeInterceptor()) + .addInterceptors(webSocketInterceptors()) + .setAllowedOrigins("*"); + } + + @Bean + public WebSocketHandler medicineHandler() { + return new MedicineHandler(); + } + + @Bean + public WebSocketHandler chatHandler() { + return new ChatHandler(); + } + + @Bean + public WebSocketHandler addMedicineHandler() { + return new AddMedicineHandler(); + } + + @Bean + public WebSocketHandler machineFeedbackHandler() { + return new MachineFeedbackHandler(); + } + + @Bean + public HandshakeInterceptor webSocketInterceptors() { + return new WebSocketInterceptors(); + } +} diff --git a/upms/upms-biz/src/main/java/com/rax/vital/config/WebSocketStompConfig.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/config/WebSocketStompConfig.java similarity index 95% rename from upms/upms-biz/src/main/java/com/rax/vital/config/WebSocketStompConfig.java rename to upms/upms-biz/src/main/java/com/rax/vital/v1/config/WebSocketStompConfig.java index 757a054..08a5afb 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/config/WebSocketStompConfig.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/config/WebSocketStompConfig.java @@ -1,6 +1,6 @@ -package com.rax.vital.config; +package com.rax.vital.v1.config; -import com.rax.vital.interceptor.WSChannelInterceptor; +import com.rax.vital.v1.interceptor.WSChannelInterceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.ChannelRegistration; diff --git a/upms/upms-biz/src/main/java/com/rax/vital/handler/mysql/AddMedicineHandler.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/handler/AddMedicineHandler.java similarity index 95% rename from upms/upms-biz/src/main/java/com/rax/vital/handler/mysql/AddMedicineHandler.java rename to upms/upms-biz/src/main/java/com/rax/vital/v1/handler/AddMedicineHandler.java index 7eb93b4..a3bb83c 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/handler/mysql/AddMedicineHandler.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/handler/AddMedicineHandler.java @@ -1,13 +1,12 @@ -package com.rax.vital.handler.mysql; +package com.rax.vital.v1.handler; import com.alibaba.fastjson.JSONObject; -import com.rax.vital.timer.VitalSignTimerWS; -import com.rax.vital.util.GetHttpParamUtil; +import com.rax.vital.common.util.GetHttpParamUtil; +import com.rax.vital.v1.timer.VitalSignTimerWS; 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.stereotype.Component; import org.springframework.web.socket.*; import java.io.IOException; diff --git a/upms/upms-biz/src/main/java/com/rax/vital/handler/mysql/ChatHandler.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/handler/ChatHandler.java similarity index 94% rename from upms/upms-biz/src/main/java/com/rax/vital/handler/mysql/ChatHandler.java rename to upms/upms-biz/src/main/java/com/rax/vital/v1/handler/ChatHandler.java index d3f3072..5faaf44 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/handler/mysql/ChatHandler.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/handler/ChatHandler.java @@ -1,8 +1,8 @@ -package com.rax.vital.handler.mysql; +package com.rax.vital.v1.handler; import com.alibaba.fastjson.JSONObject; -import com.rax.vital.medicine.service.ChatService; -import com.rax.vital.util.GetHttpParamUtil; +import com.rax.vital.common.util.GetHttpParamUtil; +import com.rax.vital.v1.medicine.service.ChatService; import jakarta.annotation.Resource; import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; @@ -11,8 +11,6 @@ import org.springframework.web.socket.*; import java.net.URLDecoder; import java.util.Map; -import java.util.Timer; -import java.util.TimerTask; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; diff --git a/upms/upms-biz/src/main/java/com/rax/vital/handler/mysql/MachineFeedbackHandler.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/handler/MachineFeedbackHandler.java similarity index 97% rename from upms/upms-biz/src/main/java/com/rax/vital/handler/mysql/MachineFeedbackHandler.java rename to upms/upms-biz/src/main/java/com/rax/vital/v1/handler/MachineFeedbackHandler.java index 5c564c4..979efe6 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/handler/mysql/MachineFeedbackHandler.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/handler/MachineFeedbackHandler.java @@ -1,7 +1,7 @@ -package com.rax.vital.handler.mysql; +package com.rax.vital.v1.handler; import com.alibaba.fastjson.JSONObject; -import com.rax.vital.timer.VitalSignTimerWS; +import com.rax.vital.v1.timer.VitalSignTimerWS; import jakarta.annotation.Resource; import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; import org.springframework.web.socket.*; diff --git a/upms/upms-biz/src/main/java/com/rax/vital/handler/mysql/MedicineHandler.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/handler/MedicineHandler.java similarity index 91% rename from upms/upms-biz/src/main/java/com/rax/vital/handler/mysql/MedicineHandler.java rename to upms/upms-biz/src/main/java/com/rax/vital/v1/handler/MedicineHandler.java index d4e9613..af10a9d 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/handler/mysql/MedicineHandler.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/handler/MedicineHandler.java @@ -1,20 +1,20 @@ -package com.rax.vital.handler.mysql; +package com.rax.vital.v1.handler; import com.alibaba.fastjson.JSONObject; -import com.rax.vital.timer.VitalSignTimerWS; -import com.rax.vital.util.GetHttpParamUtil; +import com.rax.vital.common.util.GetHttpParamUtil; +import com.rax.vital.v1.timer.VitalSignTimerWS; 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.*; -import java.io.IOException; import java.net.URLDecoder; import java.util.Map; -import java.util.Timer; -import java.util.TimerTask; -import java.util.concurrent.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; public class MedicineHandler implements WebSocketHandler { diff --git a/upms/upms-biz/src/main/java/com/rax/vital/interceptor/WSChannelInterceptor.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/interceptor/WSChannelInterceptor.java similarity index 94% rename from upms/upms-biz/src/main/java/com/rax/vital/interceptor/WSChannelInterceptor.java rename to upms/upms-biz/src/main/java/com/rax/vital/v1/interceptor/WSChannelInterceptor.java index a8538ad..7ba8ee6 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/interceptor/WSChannelInterceptor.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/interceptor/WSChannelInterceptor.java @@ -1,7 +1,6 @@ -package com.rax.vital.interceptor; +package com.rax.vital.v1.interceptor; -import com.rax.vital.medicine.service.ChatService; -import com.rax.vital.timer.VitalSignTimer; +import com.rax.vital.v1.medicine.service.ChatService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.Message; diff --git a/upms/upms-biz/src/main/java/com/rax/vital/interceptor/WebSocketInterceptors.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/interceptor/WebSocketInterceptors.java similarity index 94% rename from upms/upms-biz/src/main/java/com/rax/vital/interceptor/WebSocketInterceptors.java rename to upms/upms-biz/src/main/java/com/rax/vital/v1/interceptor/WebSocketInterceptors.java index 7fc88a8..cfcf387 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/interceptor/WebSocketInterceptors.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/interceptor/WebSocketInterceptors.java @@ -1,6 +1,6 @@ -package com.rax.vital.interceptor; +package com.rax.vital.v1.interceptor; -import com.rax.vital.util.GetHttpParamUtil; +import com.rax.vital.common.util.GetHttpParamUtil; import jakarta.annotation.Resource; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; diff --git a/upms/upms-biz/src/main/java/com/rax/vital/medicine/controller/ChatController.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/controller/ChatController.java similarity index 95% rename from upms/upms-biz/src/main/java/com/rax/vital/medicine/controller/ChatController.java rename to upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/controller/ChatController.java index 0569331..1c75ad6 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/medicine/controller/ChatController.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/controller/ChatController.java @@ -1,7 +1,7 @@ -package com.rax.vital.medicine.controller; +package com.rax.vital.v1.medicine.controller; import com.alibaba.fastjson.JSONObject; -import com.rax.vital.medicine.service.ChatService; +import com.rax.vital.v1.medicine.service.ChatService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.MessageHeaders; import org.springframework.messaging.handler.annotation.MessageMapping; diff --git a/upms/upms-biz/src/main/java/com/rax/vital/medicine/controller/MedicineController.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/controller/MedicineController.java similarity index 63% rename from upms/upms-biz/src/main/java/com/rax/vital/medicine/controller/MedicineController.java rename to upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/controller/MedicineController.java index 5ef3f5a..515ca39 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/medicine/controller/MedicineController.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/controller/MedicineController.java @@ -1,11 +1,11 @@ -package com.rax.vital.medicine.controller; +package com.rax.vital.v1.medicine.controller; import com.alibaba.fastjson.JSONObject; import com.rax.common.core.util.R; -import com.rax.vital.medicine.service.DoctorMedicineService; -import com.rax.vital.medicine.service.VitalSignsService; -import com.rax.vital.timer.VitalSignTimer; -import com.rax.vital.util.DatabaseNameUtil; +import com.rax.vital.common.util.DatabaseNameUtil; +import com.rax.vital.v1.medicine.service.DoctorMedicineService; +import com.rax.vital.v1.medicine.service.VitalSignsService; +import com.rax.vital.v1.timer.VitalSignTimer; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; @@ -33,8 +33,8 @@ import java.util.ArrayList; @RequestMapping("/medicine") public class MedicineController { -// @Autowired -// private VitalSignTimer vitalSignTimer; + @Autowired + private VitalSignTimer vitalSignTimer; @Autowired private OAuth2AuthorizationService authorizationService; @@ -45,52 +45,51 @@ public class MedicineController { @Autowired private DoctorMedicineService doctorMedicineService; -// @MessageMapping("/getSurgeryData") -// public void doctorMedicine(MessageHeaders messageHeaders, String body) { -// LinkedMultiValueMap nativeHeaders = (LinkedMultiValueMap) messageHeaders.get("nativeHeaders"); -// ArrayList tokenList = (ArrayList) nativeHeaders.get("token"); -// String token = (String) tokenList.get(0); -// OAuth2Authorization authorization = authorizationService.findByToken(token, OAuth2TokenType.ACCESS_TOKEN); -// -// String username = authorization.getPrincipalName(); -// String simpSessionId = messageHeaders.get("simpSessionId", String.class); -// -// JSONObject params = JSONObject.parseObject(body); -// // 病人名 -// String patientName = params.getString("patientName"); -// // 病人身份证 -// String idNum = params.getString("idNum"); -// // yyyyMMdd -// String date = params.getString("date"); -// String databaseName = DatabaseNameUtil.encrypt(patientName) + "_" + DatabaseNameUtil.encrypt(idNum) + "_" + date; -// vitalSignTimer.createAndSendMessageMongo(databaseName, username, simpSessionId); -// } + @MessageMapping("/getSurgeryData") + public void doctorMedicine(MessageHeaders messageHeaders, String body) { + LinkedMultiValueMap nativeHeaders = (LinkedMultiValueMap) messageHeaders.get("nativeHeaders"); + ArrayList tokenList = (ArrayList) nativeHeaders.get("token"); + String token = (String) tokenList.get(0); + OAuth2Authorization authorization = authorizationService.findByToken(token, OAuth2TokenType.ACCESS_TOKEN); -// @MessageMapping("/changeAIFlag") -// public void changeAIFlag(MessageHeaders messageHeaders, String body) { -// LinkedMultiValueMap nativeHeaders = (LinkedMultiValueMap) messageHeaders.get("nativeHeaders"); -// ArrayList tokenList = (ArrayList) nativeHeaders.get("token"); -// String token = (String) tokenList.get(0); -// OAuth2Authorization authorization = authorizationService.findByToken(token, OAuth2TokenType.ACCESS_TOKEN); -// -// String username = authorization.getPrincipalName(); -// String simpSessionId = messageHeaders.get("simpSessionId", String.class); -// -// JSONObject params = JSONObject.parseObject(body); -// // 病人名 -// String patientName = params.getString("patientName"); -// // 病人身份证 -// String idNum = params.getString("idNum"); -// // yyyyMMdd -// String date = params.getString("date"); -// String databaseName = DatabaseNameUtil.encrypt(patientName) + "_" + DatabaseNameUtil.encrypt(idNum) + "_" + date; -// vitalSignTimer.changeAIFlag(databaseName, username, simpSessionId, params.getString("flag"), -// params.getString("medicine"), params.getString("value")); -// } + String username = authorization.getPrincipalName(); + String simpSessionId = messageHeaders.get("simpSessionId", String.class); + + JSONObject params = JSONObject.parseObject(body); + // 病人名 + String patientName = params.getString("patientName"); + // 病人身份证 + String idNum = params.getString("idNum"); + // yyyyMMdd + String date = params.getString("date"); + String databaseName = DatabaseNameUtil.encrypt(patientName) + "_" + DatabaseNameUtil.encrypt(idNum) + "_" + date; + vitalSignTimer.createAndSendMessageMongo(databaseName, username, simpSessionId); + } + + @MessageMapping("/changeAIFlag") + public void changeAIFlag(MessageHeaders messageHeaders, String body) { + LinkedMultiValueMap nativeHeaders = (LinkedMultiValueMap) messageHeaders.get("nativeHeaders"); + ArrayList tokenList = (ArrayList) nativeHeaders.get("token"); + String token = (String) tokenList.get(0); + OAuth2Authorization authorization = authorizationService.findByToken(token, OAuth2TokenType.ACCESS_TOKEN); + + String username = authorization.getPrincipalName(); + String simpSessionId = messageHeaders.get("simpSessionId", String.class); + + JSONObject params = JSONObject.parseObject(body); + // 病人名 + String patientName = params.getString("patientName"); + // 病人身份证 + String idNum = params.getString("idNum"); + // yyyyMMdd + String date = params.getString("date"); + String databaseName = DatabaseNameUtil.encrypt(patientName) + "_" + DatabaseNameUtil.encrypt(idNum) + "_" + date; + vitalSignTimer.changeAIFlag(databaseName, username, simpSessionId, params.getString("flag"), + params.getString("medicine"), params.getString("value")); + } @PostMapping("/getPatientInfo") public R getPatientInfo(String patientName, String idNum, String date) { - // todo : 存疑 String databaseName = DatabaseNameUtil.encrypt(patientName) + "_" + DatabaseNameUtil.encrypt(idNum) + "_" + date; return vitalSignsService.getPatientInfo(databaseName); } diff --git a/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/dto/MedicineDTO.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/dto/MedicineDTO.java new file mode 100644 index 0000000..0a46630 --- /dev/null +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/dto/MedicineDTO.java @@ -0,0 +1,7 @@ +package com.rax.vital.v1.medicine.dto; + +import lombok.Data; + +@Data +public class MedicineDTO { +} diff --git a/upms/upms-biz/src/main/java/com/rax/vital/medicine/entity/AIMedicine.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/entity/AIMedicine.java similarity index 96% rename from upms/upms-biz/src/main/java/com/rax/vital/medicine/entity/AIMedicine.java rename to upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/entity/AIMedicine.java index f3a7127..92c75f0 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/medicine/entity/AIMedicine.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/entity/AIMedicine.java @@ -1,4 +1,4 @@ -package com.rax.vital.medicine.entity; +package com.rax.vital.v1.medicine.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; diff --git a/upms/upms-biz/src/main/java/com/rax/vital/medicine/entity/DoctorMedicine.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/entity/DoctorMedicine.java similarity index 96% rename from upms/upms-biz/src/main/java/com/rax/vital/medicine/entity/DoctorMedicine.java rename to upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/entity/DoctorMedicine.java index d4a1239..5db4f5a 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/medicine/entity/DoctorMedicine.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/entity/DoctorMedicine.java @@ -1,4 +1,4 @@ -package com.rax.vital.medicine.entity; +package com.rax.vital.v1.medicine.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; diff --git a/upms/upms-biz/src/main/java/com/rax/vital/medicine/entity/Revulsion.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/entity/Revulsion.java similarity index 96% rename from upms/upms-biz/src/main/java/com/rax/vital/medicine/entity/Revulsion.java rename to upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/entity/Revulsion.java index a181c59..5abd6ad 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/medicine/entity/Revulsion.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/entity/Revulsion.java @@ -1,4 +1,4 @@ -package com.rax.vital.medicine.entity; +package com.rax.vital.v1.medicine.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; diff --git a/upms/upms-biz/src/main/java/com/rax/vital/medicine/mapper/AIMedicineMapper.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/mapper/AIMedicineMapper.java similarity index 65% rename from upms/upms-biz/src/main/java/com/rax/vital/medicine/mapper/AIMedicineMapper.java rename to upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/mapper/AIMedicineMapper.java index c62d587..6b0d4f8 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/medicine/mapper/AIMedicineMapper.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/mapper/AIMedicineMapper.java @@ -1,7 +1,7 @@ -package com.rax.vital.medicine.mapper; +package com.rax.vital.v1.medicine.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.rax.vital.medicine.entity.AIMedicine; +import com.rax.vital.v1.medicine.entity.AIMedicine; import org.apache.ibatis.annotations.Mapper; @Mapper diff --git a/upms/upms-biz/src/main/java/com/rax/vital/medicine/mapper/DoctorMedicineMapper.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/mapper/DoctorMedicineMapper.java similarity index 65% rename from upms/upms-biz/src/main/java/com/rax/vital/medicine/mapper/DoctorMedicineMapper.java rename to upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/mapper/DoctorMedicineMapper.java index e54f427..06054bf 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/medicine/mapper/DoctorMedicineMapper.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/mapper/DoctorMedicineMapper.java @@ -1,7 +1,7 @@ -package com.rax.vital.medicine.mapper; +package com.rax.vital.v1.medicine.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.rax.vital.medicine.entity.DoctorMedicine; +import com.rax.vital.v1.medicine.entity.DoctorMedicine; import org.apache.ibatis.annotations.Mapper; @Mapper diff --git a/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/AIMedicineService.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/AIMedicineService.java new file mode 100644 index 0000000..98f522b --- /dev/null +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/AIMedicineService.java @@ -0,0 +1,18 @@ +package com.rax.vital.v1.medicine.service; + +import org.springframework.data.mongodb.core.MongoTemplate; + +import java.sql.Connection; +import java.util.List; +import java.util.Map; + +/** + * AI给药 + */ +public interface AIMedicineService { + List getAIMedicine(MongoTemplate template); + + List getAIMedicine(Connection connection); + + void changeAIFlagMedicine(MongoTemplate template, String flag, String medicine, String value); +} diff --git a/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/ChatService.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/ChatService.java similarity index 71% rename from upms/upms-biz/src/main/java/com/rax/vital/medicine/service/ChatService.java rename to upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/ChatService.java index 9657134..4381475 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/ChatService.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/ChatService.java @@ -1,4 +1,4 @@ -package com.rax.vital.medicine.service; +package com.rax.vital.v1.medicine.service; import org.springframework.web.socket.WebSocketSession; @@ -7,7 +7,7 @@ import java.io.IOException; public interface ChatService { void sendMessage(String username, String patientName, String idNum, String date, String simpSessionId, String msg); - void sendMessage(String dbName, String username, WebSocketSession session, String msg) throws IOException; + void sendMessage(String username, String patientName, String idNum, String date, WebSocketSession session, String msg) throws IOException; void sendMessageMysql(String username, String patientName, String idNum, String date, WebSocketSession session, String msg) throws Exception; diff --git a/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/DoctorMedicineService.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/DoctorMedicineService.java new file mode 100644 index 0000000..458ff8e --- /dev/null +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/DoctorMedicineService.java @@ -0,0 +1,17 @@ +package com.rax.vital.v1.medicine.service; + +import org.springframework.data.mongodb.core.MongoTemplate; + +import java.sql.Connection; +import java.util.List; +import java.util.Map; + +/** + * 医生给药 + */ +public interface DoctorMedicineService { + + List getDocMedicine(MongoTemplate template); + + List getDocMedicine(Connection connection); +} diff --git a/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/FlagService.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/FlagService.java similarity index 85% rename from upms/upms-biz/src/main/java/com/rax/vital/medicine/service/FlagService.java rename to upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/FlagService.java index 9c65649..f43be28 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/FlagService.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/FlagService.java @@ -1,4 +1,4 @@ -package com.rax.vital.medicine.service; +package com.rax.vital.v1.medicine.service; import org.springframework.data.mongodb.core.MongoTemplate; diff --git a/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/RevulsionService.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/RevulsionService.java similarity index 91% rename from upms/upms-biz/src/main/java/com/rax/vital/medicine/service/RevulsionService.java rename to upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/RevulsionService.java index 81dcf01..59057ed 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/RevulsionService.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/RevulsionService.java @@ -1,4 +1,4 @@ -package com.rax.vital.medicine.service; +package com.rax.vital.v1.medicine.service; import org.springframework.data.mongodb.core.MongoTemplate; diff --git a/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/VitalSignsService.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/VitalSignsService.java similarity index 97% rename from upms/upms-biz/src/main/java/com/rax/vital/medicine/service/VitalSignsService.java rename to upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/VitalSignsService.java index aac38f0..48d7c67 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/VitalSignsService.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/VitalSignsService.java @@ -1,4 +1,4 @@ -package com.rax.vital.medicine.service; +package com.rax.vital.v1.medicine.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.rax.common.core.util.R; diff --git a/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/impl/AIMedicineServiceImpl.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/impl/AIMedicineServiceImpl.java new file mode 100644 index 0000000..c2761d6 --- /dev/null +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/impl/AIMedicineServiceImpl.java @@ -0,0 +1,143 @@ +package com.rax.vital.v1.medicine.service.impl; + +import com.mongodb.BasicDBObject; +import com.rax.vital.v1.medicine.service.AIMedicineService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * AI给药 + */ +@Slf4j +@Service +@AllArgsConstructor +public class AIMedicineServiceImpl implements AIMedicineService { + + private static final Map doctorMedicineKeyMap = new HashMap() { + { + put("丙泊酚", "丙泊酚"); + put("舒芬太尼", "舒芬太尼"); + put("瑞芬太尼", "瑞芬太尼"); + put("顺阿曲库胺", "顺阿曲库胺"); + put("尼卡地平", "尼卡地平"); + put("艾司洛尔", "艾司洛尔"); + put("麻黄素", "麻黄素"); + put("阿托品", "阿托品"); + } + }; + + @Override + public List getAIMedicine(MongoTemplate template) { + Query query = new Query(); + query.limit(1); + query.with(Sort.by(Sort.Order.desc("Time"))); + List aiMedicines = template.find(query, Map.class, "aimedicinetable"); + return aiMedicines; + } + + @Override + public List getAIMedicine(Connection connection) { + List medicineList = new ArrayList<>(); + try { + Statement statement = connection.createStatement(); + /*ResultSet resultSet = statement.executeQuery("SELECT id, phase, `丙泊酚`, `舒芬太尼`, `瑞芬太尼`, `顺阿曲库胺`, `尼卡地平`, `艾司洛尔`, `麻黄素`, `阿托品`, time FROM `aimedicinetable` ORDER BY time DESC LIMIT 1;"); + Map medicine = new HashMap(); + while (resultSet.next()) { + medicine.put("id", resultSet.getString("id")); + medicine.put("phase", resultSet.getString("phase")); + medicine.put("丙泊酚", resultSet.getString("丙泊酚")); + medicine.put("舒芬太尼", resultSet.getString("舒芬太尼")); + medicine.put("瑞芬太尼", resultSet.getString("瑞芬太尼")); + medicine.put("顺阿曲库胺", resultSet.getString("顺阿曲库胺")); + medicine.put("尼卡地平", resultSet.getString("尼卡地平")); + medicine.put("艾司洛尔", resultSet.getString("艾司洛尔")); + medicine.put("麻黄素", resultSet.getString("麻黄素")); + medicine.put("阿托品", resultSet.getString("阿托品")); + medicine.put("Time", resultSet.getString("time")); + } + String sql = "SELECT sum(`丙泊酚`) \"丙泊酚sum\", sum(`舒芬太尼`) \"舒芬太尼sum\", " + + "sum(`瑞芬太尼`) \"瑞芬太尼sum\", sum(`顺阿曲库胺`) \"顺阿曲库胺sum\", " + + "sum(`尼卡地平`) \"尼卡地平sum\", sum(`艾司洛尔`) \"艾司洛尔sum\", " + + "sum(`麻黄素`) \"麻黄素sum\", sum(`阿托品`) \"阿托品sum\" FROM `aimedicinetable`"; + ResultSet sumSet = statement.executeQuery(sql); + while (sumSet.next()) { + medicine.put("丙泊酚sum", sumSet.getString("丙泊酚sum")); + medicine.put("舒芬太尼sum", sumSet.getString("舒芬太尼sum")); + medicine.put("瑞芬太尼sum", sumSet.getString("瑞芬太尼sum")); + medicine.put("顺阿曲库胺sum", sumSet.getString("顺阿曲库胺sum")); + medicine.put("尼卡地平sum", sumSet.getString("尼卡地平sum")); + medicine.put("艾司洛尔sum", sumSet.getString("艾司洛尔sum")); + medicine.put("麻黄素sum", sumSet.getString("麻黄素sum")); + medicine.put("阿托品sum", sumSet.getString("阿托品sum")); + }*/ + + String sql = " SELECT " + + "rate_1, cumu_1, rate_2, cumu_2,rate_3, cumu_3,rate_4, cumu_4, rate_5, cumu_5,rate_6, cumu_6,rate_7, cumu_7,rate_8, cumu_8, time " + + " FROM fktable " + + " ORDER BY time DESC LIMIT 1; "; + ResultSet resultSet = statement.executeQuery(sql); + Map medicine = new HashMap(); + while (resultSet.next()) { + medicine.put("丙泊酚", resultSet.getString("rate_1")); + medicine.put("丙泊酚sum", resultSet.getString("cumu_1")); + medicine.put("舒芬太尼", resultSet.getString("rate_2")); + medicine.put("舒芬太尼sum", resultSet.getString("cumu_2")); + medicine.put("瑞芬太尼", resultSet.getString("rate_3")); + medicine.put("瑞芬太尼sum", resultSet.getString("cumu_3")); + medicine.put("顺阿曲库胺", resultSet.getString("rate_4")); + medicine.put("顺阿曲库胺sum", resultSet.getString("cumu_4")); + medicine.put("尼卡地平", resultSet.getString("rate_5")); + medicine.put("尼卡地平sum", resultSet.getString("cumu_5")); + medicine.put("艾司洛尔", resultSet.getString("rate_6")); + medicine.put("艾司洛尔sum", resultSet.getString("cumu_6")); + medicine.put("麻黄素", resultSet.getString("rate_7")); + medicine.put("麻黄素sum", resultSet.getString("cumu_7")); + medicine.put("阿托品", resultSet.getString("rate_8")); + medicine.put("阿托品sum", resultSet.getString("cumu_8")); + medicine.put("Time", resultSet.getString("time")); + } + medicineList.add(medicine); + } catch (SQLException e) { + throw new RuntimeException(e); + } + return medicineList; + } + + @Override + public void changeAIFlagMedicine(MongoTemplate template, String flag, String medicine, String value) { + BasicDBObject obj = new BasicDBObject(); + obj.put("Flag", flag); + obj.put("Time", LocalDateTime.now()); + obj.put("ConvertFlag", "2".equals(flag) ? 1 : 0); + template.insert(obj, "aiflagtable"); + + if (StringUtils.hasText(value) && StringUtils.hasText(medicine)) { + BasicDBObject medicineObj = new BasicDBObject(); + for (String key : doctorMedicineKeyMap.keySet()) { + if (key.equals(medicine)) { + medicineObj.put(medicine, value); + } else { + medicineObj.put(key, 0); + } + } + medicineObj.put("phase", ""); + medicineObj.put("Time", LocalDateTime.now()); + template.insert(medicineObj, "doctormedicinetable"); + } + } +} diff --git a/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/impl/ChatServiceImpl.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/impl/ChatServiceImpl.java similarity index 89% rename from upms/upms-biz/src/main/java/com/rax/vital/medicine/service/impl/ChatServiceImpl.java rename to upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/impl/ChatServiceImpl.java index ed36175..9f337b4 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/impl/ChatServiceImpl.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/impl/ChatServiceImpl.java @@ -1,15 +1,15 @@ -package com.rax.vital.medicine.service.impl; +package com.rax.vital.v1.medicine.service.impl; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.rax.admin.api.entity.SysUser; import com.rax.admin.service.SysUserService; -import com.rax.vital.datasource.CustomDataSource; -import com.rax.vital.datasource.MongoDBSource; -import com.rax.vital.datasource.MySQLSource; -import com.rax.vital.medicine.service.ChatService; -import com.rax.vital.util.DatabaseNameUtil; +import com.rax.vital.common.datasource.CustomDataSource; +import com.rax.vital.common.datasource.MongoDBSource; +import com.rax.vital.common.datasource.MySQLSource; +import com.rax.vital.common.util.DatabaseNameUtil; +import com.rax.vital.v1.medicine.service.ChatService; import org.bson.Document; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -71,7 +71,6 @@ public class ChatServiceImpl implements ChatService { @Override public void sendMessage(String username, String patientName, String idNum, String date, String simpSessionId, String msg) { CustomDataSource mongoDBSource = datasourceMap.get(simpSessionId); - if (mongoDBSource == null) { String databaseName = DatabaseNameUtil.encrypt(patientName) + "_" + DatabaseNameUtil.encrypt(idNum) + "_" + date; mongoDBSource = new MongoDBSource(mongoDBHost, mongoPassword, mongoUsername, databaseName); @@ -79,6 +78,7 @@ public class ChatServiceImpl implements ChatService { mongoDBSource.open(); } + SysUser sysUser = SysUserService.getOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, username)); Map param = new HashMap(); @@ -102,31 +102,31 @@ public class ChatServiceImpl implements ChatService { } @Override - public void sendMessage(String databaseName,String username, WebSocketSession session, String msg) throws IOException { + public void sendMessage(String username, String patientName, String idNum, String date, WebSocketSession session, String msg) throws IOException { CustomDataSource mongoDBSource = datasourceMap.get(session.getId()); -// 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())) { + 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); + } } + } } -// } SysUser sysUser = SysUserService.getOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, username)); - - // 将聊天消息保存在mongo中 if (StringUtils.hasText(msg)) { JSONObject param = new JSONObject(); MongoTemplate template = mongoDBSource.getConnection(); diff --git a/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/impl/DoctorMedicineServiceImpl.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/impl/DoctorMedicineServiceImpl.java new file mode 100644 index 0000000..dc6781d --- /dev/null +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/impl/DoctorMedicineServiceImpl.java @@ -0,0 +1,80 @@ +package com.rax.vital.v1.medicine.service.impl; + +import com.rax.vital.v1.medicine.service.DoctorMedicineService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 医生给药 + */ +@Slf4j +@Service +@AllArgsConstructor +public class DoctorMedicineServiceImpl implements DoctorMedicineService { + + @Override + public List getDocMedicine(MongoTemplate template) { + Query query = new Query(); + query.limit(1); + query.with(Sort.by(Sort.Order.desc("Time"))); + List doctorMedicineTable = template.find(query, Map.class, "doctormedicinetable"); + return doctorMedicineTable; + } + + @Override + public List getDocMedicine(Connection connection) { + List medicineList = new ArrayList<>(); + try { + Map medicine = new HashMap(); + Statement statement = connection.createStatement(); + ResultSet resultSet = statement.executeQuery("SELECT id, phase, `丙泊酚`, `舒芬太尼`, `瑞芬太尼`, `顺阿曲库胺`, `尼卡地平`, `艾司洛尔`, `麻黄素`, `阿托品`, time FROM `doctormedicinetable` ORDER BY time DESC LIMIT 1;"); + while (resultSet.next()) { + medicine.put("id", resultSet.getString("id")); + medicine.put("phase", resultSet.getString("phase")); + medicine.put("丙泊酚", resultSet.getString("丙泊酚")); + medicine.put("舒芬太尼", resultSet.getString("舒芬太尼")); + medicine.put("瑞芬太尼", resultSet.getString("瑞芬太尼")); + medicine.put("顺阿曲库胺", resultSet.getString("顺阿曲库胺")); + medicine.put("尼卡地平", resultSet.getString("尼卡地平")); + medicine.put("艾司洛尔", resultSet.getString("艾司洛尔")); + medicine.put("麻黄素", resultSet.getString("麻黄素")); + medicine.put("阿托品", resultSet.getString("阿托品")); + medicine.put("Time", resultSet.getString("time")); + } + + String sql = "SELECT sum(`丙泊酚`) \"丙泊酚sum\", sum(`舒芬太尼`) \"舒芬太尼sum\", " + + "sum(`瑞芬太尼`) \"瑞芬太尼sum\", sum(`顺阿曲库胺`) \"顺阿曲库胺sum\", " + + "sum(`尼卡地平`) \"尼卡地平sum\", sum(`艾司洛尔`) \"艾司洛尔sum\", " + + "sum(`麻黄素`) \"麻黄素sum\", sum(`阿托品`) \"阿托品sum\" FROM `doctormedicinetable`"; + ResultSet sumSet = statement.executeQuery(sql); + while (sumSet.next()) { + medicine.put("丙泊酚sum", sumSet.getString("丙泊酚sum")); + medicine.put("舒芬太尼sum", sumSet.getString("舒芬太尼sum")); + medicine.put("瑞芬太尼sum", sumSet.getString("瑞芬太尼sum")); + medicine.put("顺阿曲库胺sum", sumSet.getString("顺阿曲库胺sum")); + medicine.put("尼卡地平sum", sumSet.getString("尼卡地平sum")); + medicine.put("艾司洛尔sum", sumSet.getString("艾司洛尔sum")); + medicine.put("麻黄素sum", sumSet.getString("麻黄素sum")); + medicine.put("阿托品sum", sumSet.getString("阿托品sum")); + } + + medicineList.add(medicine); + } catch (SQLException e) { + throw new RuntimeException(e); + } + return medicineList; + } +} diff --git a/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/impl/FlagServiceImpl.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/impl/FlagServiceImpl.java new file mode 100644 index 0000000..84fc3a1 --- /dev/null +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/impl/FlagServiceImpl.java @@ -0,0 +1,155 @@ +package com.rax.vital.v1.medicine.service.impl; + +import com.rax.vital.v1.medicine.service.FlagService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 标志位 + */ +@Slf4j +@Service +@AllArgsConstructor +public class FlagServiceImpl implements FlagService { + + /** + * 新标志位接口MongoDB + * flag 0:诱导期给药 1:维持期AI给药 2:维持期人工给药 + * + * @param template + * @return + */ + @Override + public Map getFlags(MongoTemplate template) { + Map flagMap = new HashMap(); + Query query = new Query(); + query.limit(1); + query.with(Sort.by(Sort.Order.desc("_id"))); + List linkTable = template.find(query, Map.class, "linktable"); + flagMap.put("linktable", linkTable); + List aiFlagTable = template.find(query, Map.class, "aiflagtable"); + flagMap.put("aiflagtable", aiFlagTable); + List endFlagTable = template.find(query, Map.class, "endflagtable"); + flagMap.put("endflagtable", endFlagTable); + return flagMap; + } + + /** + * 标志位接口MongoDB + * + * @param template + * @return + */ + @Deprecated + @Override + public Map getFlag(MongoTemplate template) { + Map allFlag = new HashMap(); + + Query query1 = new Query(); + query1.limit(1); + query1.with(Sort.by(Sort.Order.desc("_id"))); + List endFlagTable = template.find(query1, Map.class, "EndFlagTable"); + if (!endFlagTable.isEmpty()) { + allFlag.put("endFlag", endFlagTable.get(1)); + } + + Query query2 = new Query(); + query2.limit(1); + query2.with(Sort.by(Sort.Order.desc("_id"))); + List aiFlagTable = template.find(query2, Map.class, "AIFlagTable"); + if (!aiFlagTable.isEmpty()) { + allFlag.put("aiFlag", aiFlagTable); + } + + Query query3 = new Query(); + query3.limit(1); + query3.with(Sort.by(Sort.Order.desc("_id"))); + List reFlagTable = template.find(query3, Map.class, "ReFlagTable"); + if (!reFlagTable.isEmpty()) { + allFlag.put("reFlagTable", reFlagTable); + } + + return allFlag; + } + + /** + * 标志位接口MySQL + * + * @param connection + * @return + */ + @Override + @Deprecated + public Map getFlag(Connection connection) { + Map allFlag = new HashMap(); + try { + Statement statement = connection.createStatement(); + // 0代表手术未开始或已结束、1代表手术进行中 + ResultSet resultSet = statement.executeQuery("SELECT * FROM `endflagtable` ORDER BY time DESC LIMIT 1;"); + List endFlagList = new ArrayList<>(); + while (resultSet.next()) { + Map flag = new HashMap(); + flag.put("id", resultSet.getString(1)); + flag.put("Flag", resultSet.getString(2)); + flag.put("Time", resultSet.getString(3)); + endFlagList.add(flag); + } + allFlag.put("endflagtable", endFlagList); + + // Flag默认为1:0代表诱导期给药、1代表维持期AI给药、2代表维持期医生给药 + // ConvertFlag默认为0:0代表无需切换、1代表由AI给药转为医生给药 + ResultSet aiRe = statement.executeQuery("SELECT * FROM `aiflagtable` ORDER BY time DESC LIMIT 1;"); + List aiFlagList = new ArrayList<>(); + while (aiRe.next()) { + Map flag = new HashMap(); + flag.put("id", aiRe.getString(1)); + flag.put("Flag", aiRe.getString(2)); + flag.put("ConvertFlag", aiRe.getString(3)); + flag.put("Time", aiRe.getString(4)); + aiFlagList.add(flag); + } + allFlag.put("aiflagtable", aiFlagList); + + // 诱导期标志符 0是诱导期 1是维持期 + ResultSet reRe = statement.executeQuery("SELECT * FROM `reflagtable` ORDER BY time DESC LIMIT 1;"); + List reFlagList = new ArrayList<>(); + while (reRe.next()) { + Map flag = new HashMap(); + flag.put("id", reRe.getString(1)); + flag.put("Flag", reRe.getString(2)); + flag.put("Time", reRe.getString(3)); + reFlagList.add(flag); + } + allFlag.put("reflagtable", reFlagList); + + // Flag默认为1: 0代表泵站通讯正常、1代表泵站通讯异常 + ResultSet link = statement.executeQuery("SELECT * FROM `linktable` ORDER BY time DESC LIMIT 1;"); + List linkFlagList = new ArrayList<>(); + while (link.next()) { + Map flag = new HashMap(); + flag.put("id", link.getString(1)); + flag.put("Flag", link.getString(2)); + flag.put("Time", link.getString(3)); + linkFlagList.add(flag); + } + allFlag.put("linktable", linkFlagList); + + } catch (SQLException e) { + throw new RuntimeException(e); + } + return allFlag; + } +} diff --git a/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/impl/RevulsionServiceImpl.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/impl/RevulsionServiceImpl.java similarity index 95% rename from upms/upms-biz/src/main/java/com/rax/vital/medicine/service/impl/RevulsionServiceImpl.java rename to upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/impl/RevulsionServiceImpl.java index 25a13b1..c47b3cb 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/impl/RevulsionServiceImpl.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/impl/RevulsionServiceImpl.java @@ -1,6 +1,6 @@ -package com.rax.vital.medicine.service.impl; +package com.rax.vital.v1.medicine.service.impl; -import com.rax.vital.medicine.service.RevulsionService; +import com.rax.vital.v1.medicine.service.RevulsionService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Sort; diff --git a/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/impl/VitalSignServiceImpl.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/impl/VitalSignServiceImpl.java similarity index 97% rename from upms/upms-biz/src/main/java/com/rax/vital/medicine/service/impl/VitalSignServiceImpl.java rename to upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/impl/VitalSignServiceImpl.java index b98e3ad..ddbc962 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/impl/VitalSignServiceImpl.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/medicine/service/impl/VitalSignServiceImpl.java @@ -1,4 +1,4 @@ -package com.rax.vital.medicine.service.impl; +package com.rax.vital.v1.medicine.service.impl; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.mongodb.ConnectionString; @@ -7,15 +7,14 @@ import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import com.mongodb.client.MongoIterable; import com.rax.common.core.util.R; -import com.rax.vital.datasource.MongoDBSource; -import com.rax.vital.datasource.MySQLSource; -import com.rax.vital.medicine.service.VitalSignsService; -import com.rax.vital.util.DatabaseNameUtil; +import com.rax.vital.common.datasource.MongoDBSource; +import com.rax.vital.common.datasource.MySQLSource; +import com.rax.vital.common.util.DatabaseNameUtil; +import com.rax.vital.v1.medicine.service.VitalSignsService; import lombok.extern.slf4j.Slf4j; import org.bson.BsonRegularExpression; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; -import org.springframework.data.domain.ScrollPosition; import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.SpringDataMongoDB; import org.springframework.data.mongodb.core.MongoTemplate; @@ -80,17 +79,17 @@ public class VitalSignServiceImpl implements VitalSignsService { if (vitalList != null && vitalList.size() > 0) { Map map = vitalList.get(0); - Double bis = Double.valueOf((String) map.get("BIS")); + Double bis = (Double) map.get("BIS"); map.put("BIS_except", bis <= 40 || bis >= 60); - Double hr = Double.valueOf((String) map.get("HR")); + Double hr = (Double) map.get("HR"); map.put("HR_except", hr <= 50 || hr >= 80); - Double sbp = Double.valueOf((String) map.get("SBP")); + Double sbp = (Double) map.get("SBP"); map.put("SBP_except", sbp <= 90 || sbp >= 120); - Double dbp = Double.valueOf((String) map.get("DBP")); + Double dbp = (Double) map.get("DBP"); map.put("DBP_except", dbp <= 60 || dbp >= 90); - Double st = Double.valueOf((String) map.get("ST")); + Double st = (Double) map.get("ST"); map.put("ST_except", st <= -0.2 || st >= 0.2); - Double etCO2 = Double.valueOf((String) map.get("EtCO2")); + Double etCO2 = (Double) map.get("EtCO2"); map.put("EtCO2_except", etCO2 <= 30 || etCO2 >= 45); } return vitalList; @@ -121,7 +120,7 @@ public class VitalSignServiceImpl implements VitalSignsService { vital.put("ABG", resultSet.getString("ABG")); vital.put("TOF", resultSet.getString("TOF")); vital.put("Time", resultSet.getString("Time")); - Double bis = resultSet.getDouble("BIS"); + Double bis = resultSet.getDouble("BIS"); vital.put("BIS_except", bis <= 40 || bis >= 60); Double hr = resultSet.getDouble("HR"); vital.put("HR_except", hr <= 50 || hr >= 80); diff --git a/upms/upms-biz/src/main/java/com/rax/vital/timer/VitalSignTimer.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/timer/VitalSignTimer.java similarity index 76% rename from upms/upms-biz/src/main/java/com/rax/vital/timer/VitalSignTimer.java rename to upms/upms-biz/src/main/java/com/rax/vital/v1/timer/VitalSignTimer.java index a980dd8..085e499 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/timer/VitalSignTimer.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/timer/VitalSignTimer.java @@ -1,9 +1,9 @@ -package com.rax.vital.timer; +package com.rax.vital.v1.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 com.rax.vital.common.datasource.MongoDBSource; +import com.rax.vital.common.datasource.MySQLSource; +import com.rax.vital.v1.medicine.service.*; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; @@ -22,6 +22,7 @@ import java.util.concurrent.ConcurrentHashMap; * @date 2024/2/29 */ @RefreshScope +@Component @RequiredArgsConstructor public class VitalSignTimer { @@ -80,52 +81,52 @@ public class VitalSignTimer { * * @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.getConnection(); -// HashMap 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); -// Map 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); -// } + 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.getConnection(); + HashMap 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); + Map 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); + } /** diff --git a/upms/upms-biz/src/main/java/com/rax/vital/timer/VitalSignTimerWS.java b/upms/upms-biz/src/main/java/com/rax/vital/v1/timer/VitalSignTimerWS.java similarity index 71% rename from upms/upms-biz/src/main/java/com/rax/vital/timer/VitalSignTimerWS.java rename to upms/upms-biz/src/main/java/com/rax/vital/v1/timer/VitalSignTimerWS.java index 0db056d..d802c80 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/timer/VitalSignTimerWS.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v1/timer/VitalSignTimerWS.java @@ -1,11 +1,10 @@ -package com.rax.vital.timer; +package com.rax.vital.v1.timer; import com.alibaba.fastjson.JSONObject; -import com.rax.vital.datasource.CustomDataSource; -import com.rax.vital.datasource.MongoDBSource; -import com.rax.vital.datasource.MySQLSource; -import com.rax.vital.medicine.dto.MedicineDTO; -import com.rax.vital.medicine.service.*; +import com.rax.vital.common.datasource.CustomDataSource; +import com.rax.vital.common.datasource.MongoDBSource; +import com.rax.vital.common.datasource.MySQLSource; +import com.rax.vital.v1.medicine.service.*; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; @@ -17,7 +16,10 @@ import org.springframework.web.socket.WebSocketSession; import java.io.IOException; import java.sql.Connection; -import java.util.*; +import java.util.List; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; import java.util.concurrent.ConcurrentHashMap; @RefreshScope @@ -52,22 +54,22 @@ public class VitalSignTimerWS { // 定时任务容器 private static final Map timerTaskMap = new ConcurrentHashMap<>(); - // 链接工具类容器 ket + // 链接工具类容器 private static final Map dataSourceMap = new ConcurrentHashMap<>(); - // 主控人员容器, 建立连接放入存值,生命体征信息 key:数据库名 value:网页解析的token用户名 + // 主控人员容器 private static final Map masterControlMap = new ConcurrentHashMap<>(); - // session容器,网站端操作员 + // session容器 private static final Map userSessionMap = new ConcurrentHashMap<>(); // sessionId容器,(数据库名, sessionId) private static final Map userDatabaseSessionMap = new ConcurrentHashMap<>(); - // 设备端session容器,U3D + // 设备端session容器 private static final Map machineSessionMap = new ConcurrentHashMap<>(); - // sessionId容器,(数据库名, sessionId) 数据库名称, u3d获取药物的sessionId + // sessionId容器,(数据库名, sessionId) private static final Map machineDatabaseSessionMap = new ConcurrentHashMap<>(); private final VitalSignsService vitalSignsService; @@ -81,9 +83,13 @@ public class VitalSignTimerWS { private final RevulsionService revulsionService; public void createAndSendWSMessageMongo(String database, String username, WebSocketSession session) { - if (!masterControlMap.containsKey(database)) { - masterControlMap.put(database, username); + + synchronized (username) { + if (!masterControlMap.containsKey(database)) { + masterControlMap.put(database, username); + } } + String sessionId = session.getId(); TimerTask task = timerTaskMap.get(sessionId); @@ -97,7 +103,7 @@ public class VitalSignTimerWS { dataSourceMap.put(sessionId, dataSource); dataSource.open(); } - System.out.println("mongoDBName = " + database); + CustomDataSource finalMongoDBSource = dataSource; TimerTask timerTask = new TimerTask() { @Override @@ -105,71 +111,19 @@ public class VitalSignTimerWS { MongoTemplate template = finalMongoDBSource.getConnection(); JSONObject jsonObject = new JSONObject(); - // 生命体征信息 List vitalSignsList = vitalSignsService.getVitalSignsList(template); jsonObject.put("vitalSignsList", vitalSignsList); - -// // 诱导期给药信息 -// List revulsionList = revulsionService.getRevulsionServiceList(template); -// jsonObject.put("revulsionList", revulsionList); - // 标记信息 + List aiMedicineList = aiMedicineService.getAIMedicine(template); + jsonObject.put("aiMedicineList", aiMedicineList); + List docMedicineList = doctorMedicineService.getDocMedicine(template); + jsonObject.put("docMedicineList", docMedicineList); + List revulsionList = revulsionService.getRevulsionServiceList(template); + jsonObject.put("revulsionList", revulsionList); Map flags = flagService.getFlags(template); - // flag -// aiFlag 1代表AI给药 0代表医生给药 -// reFlag 1代表维持期 0代表诱导期 -// endFlag 1代表手术进行 0代表手术结束 -// linkFlag 1泵异常 0正常 jsonObject.put("flags", flags); - Map medicineRateMap = new HashMap<>(); - if (flags.get("aiFlag") != null && flags.get("aiFlag").equals("1")) { - // ai给药信息 - medicineRateMap = aiMedicineService.getAiMedicine(template); - } else if (flags.get("aiFlag") != null && flags.get("aiFlag").equals("0")) { - // 医生给药信息 - medicineRateMap = doctorMedicineService.getDocMedicine(template); - } - System.out.println("medicineRateMap = " + medicineRateMap); - // 写上面会存在线程安全问题 - ArrayList medicineList = new ArrayList<>(); - medicineList.add(new MedicineDTO("1", "丙泊酚", "0", "0")); - medicineList.add(new MedicineDTO("2", "舒芬太尼", "0", "0")); - medicineList.add(new MedicineDTO("3", "瑞芬太尼", "0", "0")); - medicineList.add(new MedicineDTO("4", "顺阿曲库胺", "0", "0")); - medicineList.add(new MedicineDTO("5", "尼卡地平", "0", "0")); - medicineList.add(new MedicineDTO("6", "艾司洛尔", "0", "0")); - medicineList.add(new MedicineDTO("7", "麻黄素", "0", "0")); - medicineList.add(new MedicineDTO("8", "阿托品", "0", "0")); - - if (medicineRateMap != null && !medicineRateMap.isEmpty()) { - for (String key : medicineRateMap.keySet()) { - for (MedicineDTO medicineDTO : medicineList) { - if (medicineDTO.getMedicineName().equals(key)) { - medicineDTO.setMedicineRate(medicineRateMap.get(key).toString()); - } - } - } - jsonObject.put("rateModTime",medicineRateMap.get("Time")); - }else { - jsonObject.put("rateModTime","0"); - } - // 总的药量信息 - Map countMedicineMap = aiMedicineService.getCountMedicine(template); - if (countMedicineMap != null && !countMedicineMap.isEmpty()) { - for (String key : countMedicineMap.keySet()) { - for (MedicineDTO medicineDTO : medicineList) { - if ((medicineDTO.getMedicineName() + "Sum").equals(key)) { - medicineDTO.setMedicineRate(countMedicineMap.get(key).toString()); - } - } - } - } - - jsonObject.put("medicineList", medicineList); jsonObject.put("msgType", "msg"); - System.out.println("medicineList = " + medicineList); - // 如果是人工给药展示人工给药的内容 - WebSocketMessage message = new TextMessage(jsonObject.toJSONString().getBytes()); + WebSocketMessage message = new TextMessage(jsonObject.toJSONString().getBytes()); try { session.sendMessage(message); } catch (IOException e) { @@ -185,7 +139,7 @@ public class VitalSignTimerWS { } public void createAndSendMessageMySQL(String database, String username, WebSocketSession session) { - synchronized (this) { + synchronized (username) { if (!masterControlMap.containsKey(database)) { masterControlMap.put(database, username); } @@ -269,21 +223,19 @@ public class VitalSignTimerWS { } public void changeWSAIFlag(String database, String username, WebSocketSession session, String flag, String medicine, String value) throws IOException { - synchronized (this) { + synchronized (username) { JSONObject result = new JSONObject(); if (masterControlMap.containsKey(database) && masterControlMap.get(database).equals(username)) { if (!userDatabaseSessionMap.containsKey(database)) { userDatabaseSessionMap.put(database, session.getId()); } - // machineDatabaseSessionMap.containsKey(database) if (machineDatabaseSessionMap.containsKey(database)) { String sessionId = machineDatabaseSessionMap.get(database); WebSocketSession machineSession = machineSessionMap.get(sessionId); if (machineSession != null) { - result.put("medicine",medicine); - result.put("value",value); + result.put(medicine, value); result.put("flag", flag); - result.put("msgType", "addMedicine"); + result.put("msgType", "msg"); machineSession.sendMessage(new TextMessage(result.toJSONString().getBytes())); } else { result.put("flag", flag); @@ -349,7 +301,7 @@ public class VitalSignTimerWS { String userSessionId = userDatabaseSessionMap.get(database); WebSocketSession webSocketSession = userSessionMap.get(userSessionId); result.put("status", code); - result.put("msg", "网站已进行远程连接"); + result.put("msg", ""); result.put("msgType", "msg"); webSocketSession.sendMessage(new TextMessage(result.toJSONString().getBytes())); } else { @@ -376,13 +328,4 @@ public class VitalSignTimerWS { } } - public void initUnity(String databaseName, WebSocketSession session) { - machineDatabaseSessionMap.put(databaseName, session.getId()); - machineSessionMap.put(session.getId(), session); - } - - public void initWeb(String databaseName, WebSocketSession session) { - userDatabaseSessionMap.put(databaseName, session.getId()); - userSessionMap.put(session.getId(), session); - } } diff --git a/upms/upms-biz/src/main/java/com/rax/vital/config/WebSocketConfig.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/config/WebSocketConfig.java similarity index 83% rename from upms/upms-biz/src/main/java/com/rax/vital/config/WebSocketConfig.java rename to upms/upms-biz/src/main/java/com/rax/vital/v2/config/WebSocketConfig.java index 7c66b6b..bdac6f0 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/config/WebSocketConfig.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/config/WebSocketConfig.java @@ -1,10 +1,10 @@ -package com.rax.vital.config; +package com.rax.vital.v2.config; -import com.rax.vital.handler.AddMedicineHandler; -import com.rax.vital.handler.ChatHandler; -import com.rax.vital.handler.MachineFeedbackHandler; -import com.rax.vital.handler.MedicineHandler; -import com.rax.vital.interceptor.WebSocketInterceptors; +import com.rax.vital.v2.handler.AddMedicineHandler; +import com.rax.vital.v2.handler.ChatHandler; +import com.rax.vital.v2.handler.MachineFeedbackHandler; +import com.rax.vital.v2.handler.MedicineHandler; +import com.rax.vital.v2.interceptor.WebSocketInterceptors; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.WebSocketHandler; diff --git a/upms/upms-biz/src/main/java/com/rax/vital/v2/config/WebSocketStompConfig.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/config/WebSocketStompConfig.java new file mode 100644 index 0000000..09bbd3a --- /dev/null +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/config/WebSocketStompConfig.java @@ -0,0 +1,47 @@ +package com.rax.vital.v2.config; + +import com.rax.vital.v2.interceptor.WSChannelInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.simp.config.ChannelRegistration; +import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; +import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; +import org.springframework.web.socket.config.annotation.StompEndpointRegistry; +import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; + +@Configuration +@EnableWebSocketMessageBroker +public class WebSocketStompConfig implements WebSocketMessageBrokerConfigurer { + + @Autowired + private WSChannelInterceptor wsChannelInterceptor; + + @Override + public void registerStompEndpoints(StompEndpointRegistry registry) { + registry.addEndpoint("/rax/chat", "/rax/SurgeryData") + .setAllowedOrigins("*"); + } + + @Override + public void configureMessageBroker(MessageBrokerRegistry registry) { + // 第一个值表示客户端发送心跳消息的间隔时间,第二个值表示服务端发送心跳消息的间隔时间 + long [] heartbeat = {60000, 60000}; + ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); + threadPoolTaskScheduler.initialize(); + registry.enableSimpleBroker("/topic").setTaskScheduler(threadPoolTaskScheduler).setHeartbeatValue(heartbeat); + registry.setApplicationDestinationPrefixes("/front"); + registry.setUserDestinationPrefix("/topic/user"); + } + + /** + * stomp未登录验证 + * + * @param registration + */ + @Override + public void configureClientInboundChannel(ChannelRegistration registration) { + registration.interceptors(wsChannelInterceptor); + } + +} diff --git a/upms/upms-biz/src/main/java/com/rax/vital/handler/AddMedicineHandler.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/handler/AddMedicineHandler.java similarity index 64% rename from upms/upms-biz/src/main/java/com/rax/vital/handler/AddMedicineHandler.java rename to upms/upms-biz/src/main/java/com/rax/vital/v2/handler/AddMedicineHandler.java index 20c0d41..c608fa8 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/handler/AddMedicineHandler.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/handler/AddMedicineHandler.java @@ -1,11 +1,12 @@ -package com.rax.vital.handler; +package com.rax.vital.v2.handler; import com.alibaba.fastjson.JSONObject; -import com.rax.vital.timer.AIMedicineTimer; -import com.rax.vital.timer.VitalSignTimerWS; -import com.rax.vital.util.DatabaseNameUtil; -import com.rax.vital.util.GetHttpParamUtil; +import com.rax.vital.common.util.DatabaseNameUtil; +import com.rax.vital.common.util.GetHttpParamUtil; +import com.rax.vital.v2.timer.AIMedicineTimer; +import com.rax.vital.v2.timer.VitalSignTimerV2; import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; @@ -15,17 +16,17 @@ import org.springframework.web.socket.*; import java.net.URLDecoder; import java.util.Date; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.*; /** * 网站发送给仪器给药信息 */ +@Slf4j public class AddMedicineHandler implements WebSocketHandler { - @Resource - private VitalSignTimerWS vitalSignTimerWS; + + + @Autowired + private VitalSignTimerV2 vitalSignTimerV2; @Resource private OAuth2AuthorizationService authorizationService; @@ -33,13 +34,13 @@ public class AddMedicineHandler implements WebSocketHandler { // 发送心跳任务的定时任务容器 private Map timerTaskMap = new ConcurrentHashMap<>(); + @Autowired private AIMedicineTimer aiMedicineTimer; @Override public void afterConnectionEstablished(WebSocketSession session) { - vitalSignTimerWS.setWSAIFlagSession(session); startHeartbeat(session); } @@ -65,7 +66,6 @@ public class AddMedicineHandler implements WebSocketHandler { // 将网站端的dbName作为key session作为Value存入Map 以便后续判断状态 if ("init".equals(msgType)) { aiMedicineTimer.initWeb(databaseName, session); - vitalSignTimerWS.initWeb(databaseName, session); } // 处理网页端接收到消息后的相应内容 @@ -81,37 +81,36 @@ public class AddMedicineHandler implements WebSocketHandler { aiMedicineTimer.sendWebRequestConnectionMsg(patientName, idNum, date, databaseName, webRequestFlag); } - if (aiMedicineTimer.getUnitySession(databaseName) != null) { - JSONObject result = new JSONObject(); - result.put("msg", "unity端已登录"); - result.put("msgType", "msg"); - session.sendMessage(new TextMessage(result.toJSONString().getBytes())); - } else { - JSONObject result = new JSONObject(); - result.put("msg", "unity端未登录"); - result.put("msgType", "msg"); - session.sendMessage(new TextMessage(result.toJSONString().getBytes())); - } - - if (aiMedicineTimer.getWebSession(databaseName) != null) { - JSONObject result = new JSONObject(); - result.put("msg", "网页端已登录"); - result.put("msgType", "msg"); - session.sendMessage(new TextMessage(result.toJSONString().getBytes())); - WebSocketSession unitySession = aiMedicineTimer.getUnitySession(databaseName); - if (unitySession != null) { - unitySession.sendMessage(new TextMessage(result.toJSONString().getBytes())); - } - } +// if (aiMedicineTimer.getUnitySession(databaseName) != null) { +// JSONObject result = new JSONObject(); +// result.put("msg", "unity端已登录"); +// result.put("msgType", "msg"); +// session.sendMessage(new TextMessage(result.toJSONString().getBytes())); +// } else { +// JSONObject result = new JSONObject(); +// result.put("msg", "unity端未登录"); +// result.put("msgType", "msg"); +// session.sendMessage(new TextMessage(result.toJSONString().getBytes())); +// } +// +// if (aiMedicineTimer.getWebSession(databaseName) != null) { +// JSONObject result = new JSONObject(); +// result.put("msg", "网页端已登录"); +// result.put("msgType", "msg"); +// session.sendMessage(new TextMessage(result.toJSONString().getBytes())); +// WebSocketSession unitySession = aiMedicineTimer.getUnitySession(databaseName); +// if (unitySession != null) { +// unitySession.sendMessage(new TextMessage(result.toJSONString().getBytes())); +// } +// } // 处理发送给药相关 if ("addMedicine".equals(msgType) && aiMedicineTimer.getWebSession(databaseName) != null && aiMedicineTimer.getUnitySession(databaseName) != null && aiMedicineTimer.isReady(databaseName)) { // todo 注意修改 // flag 0 代表人工给药, 1代表AI给药 - vitalSignTimerWS.changeWSAIFlag(databaseName, username, session, jsonObject.getString("flag"), + vitalSignTimerV2.sendMedicalMessageToUnity(databaseName, username, session, jsonObject.getString("flag"), jsonObject.getString("medicine"), jsonObject.getString("value")); - } // 展示网页端延迟信息 @@ -119,24 +118,35 @@ public class AddMedicineHandler implements WebSocketHandler { Long timeStamp = jsonObject.getLong("msg"); JSONObject result = new JSONObject(); result.put("msgType", "pong"); + if (aiMedicineTimer.getWebSession(databaseName) != null) { + result.put("webMsg", "网页端已登陆"); + } else { + result.put("webMsg", "网页端未登陆"); + } + + if (aiMedicineTimer.getUnitySession(databaseName) != null) { + result.put("unityMsg", "unity端已登录"); + } else { + result.put("unityMsg", "unity端未登录"); + } // 当前时间戳 Long diff = new Date().getTime() - timeStamp; result.put("msg", diff); - session.sendMessage(new TextMessage(result.toJSONString().getBytes())); + sendMsgAsync(session,result); } - } } @Override public void handleTransportError(WebSocketSession session, Throwable exception) { + stopHeartbeat(session); + aiMedicineTimer.closeConnection(session); } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) { stopHeartbeat(session); - vitalSignTimerWS.removeWSAIFlagSession(session); aiMedicineTimer.closeConnection(session); } @@ -156,7 +166,7 @@ public class AddMedicineHandler implements WebSocketHandler { session.sendMessage(new TextMessage(jsonObject.toJSONString().getBytes())); } else { stopHeartbeat(session); - vitalSignTimerWS.removeWSAIFlagSession(session); + aiMedicineTimer.closeConnection(session); session.close(); } } catch (Exception e) { @@ -173,5 +183,24 @@ public class AddMedicineHandler implements WebSocketHandler { heartbeatExecutor.shutdownNow(); } + // 异步发送消息 + private void sendMsgAsync(WebSocketSession session, JSONObject jsonObject) { + CompletableFuture.runAsync(() -> { + try { + if (session.isOpen()) { + session.sendMessage(new TextMessage(jsonObject.toJSONString().getBytes())); + }else { + stopHeartbeat(session); + aiMedicineTimer.closeConnection(session); + session.close(); + } + }catch (Exception e) { + stopHeartbeat(session); + aiMedicineTimer.closeConnection(session); + log.error("addMedicineHandler-sendMsgAsync error: {}", e.getMessage()); + } + }); + + } } diff --git a/upms/upms-biz/src/main/java/com/rax/vital/handler/ChatHandler.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/handler/ChatHandler.java similarity index 74% rename from upms/upms-biz/src/main/java/com/rax/vital/handler/ChatHandler.java rename to upms/upms-biz/src/main/java/com/rax/vital/v2/handler/ChatHandler.java index 09f5ca2..025e64d 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/handler/ChatHandler.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/handler/ChatHandler.java @@ -1,16 +1,12 @@ -package com.rax.vital.handler; +package com.rax.vital.v2.handler; import com.alibaba.fastjson.JSONObject; -import com.rax.vital.medicine.service.ChatService; -import com.rax.vital.util.DatabaseNameUtil; -import com.rax.vital.util.GetHttpParamUtil; +import com.rax.vital.common.util.DatabaseNameUtil; +import com.rax.vital.v2.medicine.service.ChatService; 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.*; -import java.net.URLDecoder; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; @@ -33,13 +29,12 @@ public class ChatHandler implements WebSocketHandler { @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 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); if (!"heartbeat".equals(jsonObject.getString("msgType"))) { @@ -48,12 +43,10 @@ public class ChatHandler implements WebSocketHandler { String date = jsonObject.getString("date"); // 消息内容 String msg = jsonObject.getString("msg"); - System.out.println("chatHandler-jsonObject = " + jsonObject.toJSONString()); String databaseName = DatabaseNameUtil.encrypt(patientName) + "_" + DatabaseNameUtil.encrypt(idNum) + "_" + date; - System.out.println("chatHandler-databaseName = " + databaseName); - chatService.sendMessage(databaseName,username,session, msg); + chatService.sendMessage(databaseName,"admin",session, msg); } - } +// } } @Override diff --git a/upms/upms-biz/src/main/java/com/rax/vital/handler/MachineFeedbackHandler.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/handler/MachineFeedbackHandler.java similarity index 69% rename from upms/upms-biz/src/main/java/com/rax/vital/handler/MachineFeedbackHandler.java rename to upms/upms-biz/src/main/java/com/rax/vital/v2/handler/MachineFeedbackHandler.java index 2bf46e5..d934a32 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/handler/MachineFeedbackHandler.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/handler/MachineFeedbackHandler.java @@ -1,28 +1,26 @@ -package com.rax.vital.handler; +package com.rax.vital.v2.handler; import com.alibaba.fastjson.JSONObject; -import com.rax.vital.timer.AIMedicineTimer; -import com.rax.vital.timer.VitalSignTimerWS; -import com.rax.vital.util.DatabaseNameUtil; -import jakarta.annotation.Resource; +import com.rax.vital.common.util.DatabaseNameUtil; +import com.rax.vital.v2.timer.AIMedicineTimer; +import com.rax.vital.v2.timer.VitalSignTimerV2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.socket.*; +import java.io.IOException; import java.util.Date; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.*; /** * 仪器获取网站给药信息 */ +@Slf4j public class MachineFeedbackHandler implements WebSocketHandler { - @Resource - private VitalSignTimerWS vitalSignTimerWS; - + @Autowired + private VitalSignTimerV2 vitalSignTimerV2; private Map timerTaskMap = new ConcurrentHashMap(); @@ -30,8 +28,11 @@ public class MachineFeedbackHandler implements WebSocketHandler { private AIMedicineTimer aiMedicineTimer; @Override - public void afterConnectionEstablished(WebSocketSession session) { - vitalSignTimerWS.setMachineSessionMap(session); + public void afterConnectionEstablished(WebSocketSession session) throws IOException { + JSONObject msg = new JSONObject(); + msg.put("msgType", "msg"); + msg.put("msg", "已成功连接服务器!"); + session.sendMessage(new TextMessage(msg.toJSONString().getBytes())); startHeartbeat(session); } @@ -53,7 +54,7 @@ public class MachineFeedbackHandler implements WebSocketHandler { if ("init".equals(msgType)) { aiMedicineTimer.initUnity(databaseName, session); - vitalSignTimerWS.initUnity(databaseName, session); +// vitalSignTimerWS.initUnity(databaseName, session); } // Unity获取到给药信息后回复 @@ -81,33 +82,15 @@ public class MachineFeedbackHandler implements WebSocketHandler { aiMedicineTimer.sendConnectionResponseToWeb(patientName, idNum, date,databaseName, unityConnectionFlag); } - if (aiMedicineTimer.getWebSession(databaseName) != null) { - JSONObject result = new JSONObject(); - result.put("msg", "网页端已登录"); - result.put("msgType", "msg"); - session.sendMessage(new TextMessage(result.toJSONString().getBytes())); - } else { - JSONObject result = new JSONObject(); - result.put("msg", "网页端未登录"); - result.put("msgType", "msg"); - session.sendMessage(new TextMessage(result.toJSONString().getBytes())); - } - - if (aiMedicineTimer.getUnitySession(databaseName) != null) { - JSONObject result = new JSONObject(); - result.put("msg", "unity端已登录"); - result.put("msgType", "msg"); - session.sendMessage(new TextMessage(result.toJSONString().getBytes())); - WebSocketSession webSession = aiMedicineTimer.getWebSession(databaseName); - if (webSession != null) { - webSession.sendMessage(new TextMessage(result.toJSONString().getBytes())); - } - } - - if (aiMedicineTimer.getUnitySession(databaseName) != null && aiMedicineTimer.getWebSession(databaseName) != null && aiMedicineTimer.isReady(databaseName)) { - vitalSignTimerWS.sendMachineFlag(databaseName, code, session); + // vitalSignTimerWS.sendMachineFlag(databaseName, code, session); + JSONObject msg = new JSONObject(); + msg.put("status", code); + msg.put("msg", "网站已进行远程连接"); + msg.put("msgType", "msg"); + WebSocketSession unitySession = aiMedicineTimer.getUnitySession(databaseName); + unitySession.sendMessage(new TextMessage(msg.toJSONString().getBytes())); } // 展示unity端延迟信息 @@ -115,10 +98,21 @@ public class MachineFeedbackHandler implements WebSocketHandler { Long timeStamp = jsonObject.getLong("msg"); JSONObject result = new JSONObject(); result.put("msgType", "pong"); + if (aiMedicineTimer.getWebSession(databaseName) != null) { + result.put("webMsg", "网页端已登陆"); + } else { + result.put("webMsg", "网页端未登陆"); + } + + if (aiMedicineTimer.getUnitySession(databaseName) != null) { + result.put("unityMsg", "unity端已登录"); + }else { + result.put("unityMsg", "unity端未登录"); + } // 当前时间戳 Long diff = new Date().getTime() - timeStamp; result.put("msg", diff); - session.sendMessage(new TextMessage(result.toJSONString().getBytes())); + sendMsgAsync(session, result); } // unity收到给药信息后回复把此消息推送给web @@ -139,12 +133,13 @@ public class MachineFeedbackHandler implements WebSocketHandler { @Override public void handleTransportError(WebSocketSession session, Throwable exception) { + stopHeartbeat(session); + aiMedicineTimer.closeConnection(session); } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) { stopHeartbeat(session); - vitalSignTimerWS.removeMachineSessionMap(session); aiMedicineTimer.closeConnection(session); } @@ -164,7 +159,7 @@ public class MachineFeedbackHandler implements WebSocketHandler { session.sendMessage(new TextMessage(jsonObject.toJSONString().getBytes())); } else { stopHeartbeat(session); - vitalSignTimerWS.removeMachineSessionMap(session); + aiMedicineTimer.closeConnection(session); session.close(); } } catch (Exception e) { @@ -180,4 +175,23 @@ public class MachineFeedbackHandler implements WebSocketHandler { ScheduledExecutorService heartbeatExecutor = timerTaskMap.get(session.getId()); heartbeatExecutor.shutdownNow(); } + + // 异步发送消息 + private void sendMsgAsync(WebSocketSession session, JSONObject jsonObject) { + CompletableFuture.runAsync(() -> { + try { + if (session.isOpen()) { + session.sendMessage(new TextMessage(jsonObject.toJSONString().getBytes())); + } else { + stopHeartbeat(session); + aiMedicineTimer.closeConnection(session); + session.close(); + } + } catch (Exception e) { + stopHeartbeat(session); + aiMedicineTimer.closeConnection(session); + log.error("addMedicineHandler-sendMsgAsync error: {}", e.getMessage()); + } + }); + } } diff --git a/upms/upms-biz/src/main/java/com/rax/vital/handler/MedicineHandler.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/handler/MedicineHandler.java similarity index 73% rename from upms/upms-biz/src/main/java/com/rax/vital/handler/MedicineHandler.java rename to upms/upms-biz/src/main/java/com/rax/vital/v2/handler/MedicineHandler.java index 14c89f0..4fb211e 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/handler/MedicineHandler.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/handler/MedicineHandler.java @@ -1,12 +1,16 @@ -package com.rax.vital.handler; +package com.rax.vital.v2.handler; import com.alibaba.fastjson.JSONObject; -import com.rax.vital.timer.VitalSignTimerWS; -import com.rax.vital.util.DatabaseNameUtil; +import com.rax.vital.common.util.DatabaseNameUtil; +import com.rax.vital.common.util.GetHttpParamUtil; +import com.rax.vital.v2.timer.VitalSignTimerV2; 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.*; +import java.net.URLDecoder; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; @@ -18,8 +22,9 @@ import java.util.concurrent.TimeUnit; */ public class MedicineHandler implements WebSocketHandler { + @Resource - private VitalSignTimerWS vitalSignTimerWS; + private VitalSignTimerV2 vitalSignTimerV2; @Resource private OAuth2AuthorizationService authorizationService; @@ -33,11 +38,11 @@ public class MedicineHandler implements WebSocketHandler { @Override public void handleMessage(WebSocketSession session, WebSocketMessage message) { -// 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); -// String username = authorization.getPrincipalName(); + 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); + String username = authorization.getPrincipalName(); String payload = (String) message.getPayload(); JSONObject jsonObject = JSONObject.parseObject(payload); @@ -47,20 +52,22 @@ public class MedicineHandler implements WebSocketHandler { String idNum = jsonObject.getString("idNum"); String date = jsonObject.getString("date"); String databaseName = DatabaseNameUtil.encrypt(patientName) + "_" + DatabaseNameUtil.encrypt(idNum) + "_" + date; - vitalSignTimerWS.createAndSendWSMessageMongo(databaseName, "admin", session); + vitalSignTimerV2.sendMedicalMessage(databaseName, username, session); } } @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { System.out.println("Error: " + exception.getMessage()); + stopHeartbeat(session); + vitalSignTimerV2.stopTimerTask(session.getId()); } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { System.out.println("MedicineHandler Connection closed:" + closeStatus.getReason()); stopHeartbeat(session); - vitalSignTimerWS.stopTimerTask(session.getId()); + vitalSignTimerV2.stopTimerTask(session.getId()); } @Override @@ -80,7 +87,7 @@ public class MedicineHandler implements WebSocketHandler { } else { session.close(); stopHeartbeat(session); - vitalSignTimerWS.stopTimerTask(session.getId()); + vitalSignTimerV2.stopTimerTask(session.getId()); } } catch (Exception e) { e.printStackTrace(); diff --git a/upms/upms-biz/src/main/java/com/rax/vital/v2/interceptor/WSChannelInterceptor.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/interceptor/WSChannelInterceptor.java new file mode 100644 index 0000000..4cab64b --- /dev/null +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/interceptor/WSChannelInterceptor.java @@ -0,0 +1,55 @@ +package com.rax.vital.v2.interceptor; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.Message; +import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.simp.stomp.StompCommand; +import org.springframework.messaging.simp.stomp.StompHeaderAccessor; +import org.springframework.messaging.support.ChannelInterceptor; +import org.springframework.messaging.support.MessageHeaderAccessor; +import org.springframework.security.access.AccessDeniedException; +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.stereotype.Component; + +import java.util.List; + +@Slf4j +@Component +public class WSChannelInterceptor implements ChannelInterceptor { + @Autowired + private OAuth2AuthorizationService authorizationService; + + @Override + public Message preSend(Message message, MessageChannel channel) { + + StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class); + + if (accessor != null) { + + List accessToken = accessor.getNativeHeader("token"); + + if (accessToken != null && !accessToken.isEmpty()) { + + String token = accessToken.get(0); + OAuth2Authorization authorization = authorizationService.findByToken(token, OAuth2TokenType.ACCESS_TOKEN); + + if (StompCommand.CONNECT.equals(accessor.getCommand()) || StompCommand.SEND.equals(accessor.getCommand())) { + if (authorization == null) { + throw new AccessDeniedException("Access is denied"); + } + } + } + + if (StompCommand.DISCONNECT.equals(accessor.getCommand()) + || StompCommand.UNSUBSCRIBE.equals(accessor.getCommand()) || StompCommand.ABORT.equals(accessor.getCommand())) { +// String simpSessionId = (String) accessor.getHeader("simpSessionId"); +// vitalSignTimer.stopTimerTaskMongo(simpSessionId); +// chatService.stopTimerTask(simpSessionId); + } + } + return message; + } +} diff --git a/upms/upms-biz/src/main/java/com/rax/vital/v2/interceptor/WebSocketInterceptors.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/interceptor/WebSocketInterceptors.java new file mode 100644 index 0000000..0272f79 --- /dev/null +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/interceptor/WebSocketInterceptors.java @@ -0,0 +1,38 @@ +package com.rax.vital.v2.interceptor; + +import com.rax.vital.common.util.GetHttpParamUtil; +import jakarta.annotation.Resource; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +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.WebSocketHandler; +import org.springframework.web.socket.server.HandshakeInterceptor; + +import java.net.URLDecoder; +import java.util.Map; + +public class WebSocketInterceptors implements HandshakeInterceptor { + + @Resource + private OAuth2AuthorizationService authorizationService; + + + @Override + public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map attributes) throws Exception { + String decode = URLDecoder.decode(request.getURI().getQuery()); + Map params = GetHttpParamUtil.getParams(decode); + String token = (String) params.get("token"); + OAuth2Authorization authorization = authorizationService.findByToken(token, OAuth2TokenType.ACCESS_TOKEN); + if (authorization == null ) { + return false; + } + return true; + } + + @Override + public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) { + System.out.println("request = " + request + ", response = " + response + ", wsHandler = " + wsHandler + ", exception = " + exception); + } +} diff --git a/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/controller/ChatController.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/controller/ChatController.java new file mode 100644 index 0000000..f68572f --- /dev/null +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/controller/ChatController.java @@ -0,0 +1,50 @@ +package com.rax.vital.v2.medicine.controller; + +import com.alibaba.fastjson.JSONObject; +import com.rax.vital.v2.medicine.service.ChatService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.MessageHeaders; +import org.springframework.messaging.handler.annotation.MessageMapping; +import org.springframework.security.access.AccessDeniedException; +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.stereotype.Controller; +import org.springframework.util.LinkedMultiValueMap; + +import java.util.ArrayList; + +@Controller +public class ChatController { + + @Autowired + private ChatService chatService; + + @Autowired + private OAuth2AuthorizationService authorizationService; + + @MessageMapping("/sendMessage") + public void sendMessage(MessageHeaders messageHeaders, String body) { + LinkedMultiValueMap nativeHeaders = (LinkedMultiValueMap) messageHeaders.get("nativeHeaders"); + ArrayList tokenList = (ArrayList) nativeHeaders.get("token"); + String token = (String) tokenList.get(0); + OAuth2Authorization authorization = authorizationService.findByToken(token, OAuth2TokenType.ACCESS_TOKEN); + if (authorization != null) { + String username = authorization.getPrincipalName(); + String simpSessionId = messageHeaders.get("simpSessionId", String.class); + JSONObject params = JSONObject.parseObject(body); + // 病人名 + String patientName = params.getString("patientName"); + // 病人身份证 + String idNum = params.getString("idNum"); + // yyyyMMdd + String date = params.getString("date"); + // 消息内容 + String msg = params.getString("msg"); + chatService.sendMessage(username, patientName, idNum, date, simpSessionId, msg); + } else { + throw new AccessDeniedException("Access is denied"); + } + } + +} diff --git a/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/controller/MedicineController.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/controller/MedicineController.java new file mode 100644 index 0000000..9a26647 --- /dev/null +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/controller/MedicineController.java @@ -0,0 +1,104 @@ +package com.rax.vital.v2.medicine.controller; + +import com.rax.common.core.util.R; +import com.rax.vital.common.util.DatabaseNameUtil; +import com.rax.vital.v2.medicine.service.DoctorMedicineService; +import com.rax.vital.v2.medicine.service.SurgeryServiceV2; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 用药 + * + * @date 2024.2.19 + */ +@RestController +@Tag(description = "medicine", name = "人工和AI用药管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +@RequestMapping("/medicine") +public class MedicineController { + +// @Autowired +// private VitalSignTimer vitalSignTimer; + + @Autowired + private OAuth2AuthorizationService authorizationService; + + @Autowired + private DoctorMedicineService doctorMedicineService; + + @Autowired + private SurgeryServiceV2 surgeryServiceV2; + + + @PostMapping("/getPatientInfo") + public R getPatientInfo(String patientName, String idNum, String date) { + // todo : 存疑 + String databaseName = DatabaseNameUtil.encrypt(patientName) + "_" + DatabaseNameUtil.encrypt(idNum) + "_" + date; + return surgeryServiceV2.getPatientInfo(databaseName); + } + + + + @PostMapping("/getPatientPage") + public R getPatientPage(String name, String dept, long offset, int limit) { + return R.ok(surgeryServiceV2.getPatientPage(name, dept, offset, limit)); + } + + /** + * 某月手术每天台数 + */ + @PostMapping("/getSurgeryCount") + public R getSurgeryCount(String start, String end) { + return R.ok(surgeryServiceV2.getSurgeryCount(start, end)); + } + + + /** + * 某月手术每天时长 + */ + @PostMapping("/getSurgeryDuration") + public R getSurgeryDuration(String start, String end) { + return R.ok(surgeryServiceV2.getSurgeryDuration(start, end)); + } + + /** + * 某月手术类型数量 + */ + @PostMapping("/getSurgeryTypeProportion") + public R getSurgeryTypeProportion(String start, String end) { + return R.ok(surgeryServiceV2.getSurgeryTypeProportion(start, end)); + } + + /** + * 某周的麻醉和人工给药时长 + */ + @PostMapping("/getSurgeryOtherDuration") + public R getSurgeryOtherDuration(String start, String end) { + return R.ok(surgeryServiceV2.getSurgeryOtherDuration(start, end)); + } + + + /** + * 获取用户的手术列表 + */ + @PostMapping("/getPatientSurgeryList") + public R getPatientSurgeryList(String name, String code, String surgery, String type) { + return R.ok(surgeryServiceV2.getPatientSurgeryList(name, code, surgery, type)); + } + + /** + * 根据手术表名来获取所有数据 + */ + @PostMapping("/getSurgeryTableData") + public R getSurgeryTableData(String name, String code, String date, String table) { + return R.ok(surgeryServiceV2.getSurgeryTableData(name, code, date, table)); + } + +} diff --git a/upms/upms-biz/src/main/java/com/rax/vital/medicine/dto/MedicineDTO.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/dto/MedicineDTO.java similarity index 87% rename from upms/upms-biz/src/main/java/com/rax/vital/medicine/dto/MedicineDTO.java rename to upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/dto/MedicineDTO.java index 7814df0..7dd025c 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/medicine/dto/MedicineDTO.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/dto/MedicineDTO.java @@ -1,4 +1,4 @@ -package com.rax.vital.medicine.dto; +package com.rax.vital.v2.medicine.dto; import lombok.AllArgsConstructor; diff --git a/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/entity/AIMedicine.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/entity/AIMedicine.java new file mode 100644 index 0000000..a308337 --- /dev/null +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/entity/AIMedicine.java @@ -0,0 +1,50 @@ +package com.rax.vital.v2.medicine.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Timestamp; + +@Data +@Schema(description = "AI给药") +public class AIMedicine implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "id") + private Long id; + + @Schema(description = "phase") + private Long phase; + + @Schema(description = "丙泊酚") + private Double 丙泊酚; + + @Schema(description = "舒芬太尼") + private Double 舒芬太尼; + + @Schema(description = "瑞芬太尼") + private Double 瑞芬太尼; + + @Schema(description = "顺阿曲库胺") + private Double 顺阿曲库胺; + + @Schema(description = "尼卡地平") + private Double 尼卡地平; + + @Schema(description = "艾司洛尔") + private Double 艾司洛尔; + + @Schema(description = "麻黄素") + private Double 麻黄素; + + @Schema(description = "阿托品") + private Double 阿托品; + + @Schema(description = "创建时间") + private Timestamp time; + +} diff --git a/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/entity/DoctorMedicine.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/entity/DoctorMedicine.java new file mode 100644 index 0000000..e6eeee2 --- /dev/null +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/entity/DoctorMedicine.java @@ -0,0 +1,49 @@ +package com.rax.vital.v2.medicine.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Timestamp; + +@Data +@Schema(description = "医生给药") +public class DoctorMedicine implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "id") + private Long id; + + @Schema(description = "phase") + private Long phase; + + @Schema(description = "丙泊酚") + private Double 丙泊酚; + + @Schema(description = "舒芬太尼") + private Double 舒芬太尼; + + @Schema(description = "瑞芬太尼") + private Double 瑞芬太尼; + + @Schema(description = "顺阿曲库胺") + private Double 顺阿曲库胺; + + @Schema(description = "尼卡地平") + private Double 尼卡地平; + + @Schema(description = "艾司洛尔") + private Double 艾司洛尔; + + @Schema(description = "麻黄素") + private Double 麻黄素; + + @Schema(description = "阿托品") + private Double 阿托品; + + @Schema(description = "创建时间") + private Timestamp time; +} diff --git a/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/entity/Revulsion.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/entity/Revulsion.java new file mode 100644 index 0000000..fc72683 --- /dev/null +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/entity/Revulsion.java @@ -0,0 +1,49 @@ +package com.rax.vital.v2.medicine.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.sql.Timestamp; + +@Data +@Schema(description = "诱导期给药") +public class Revulsion implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "id") + private Long id; + + @Schema(description = "phase") + private Long phase; + + @Schema(description = "丙泊酚") + private Double 丙泊酚; + + @Schema(description = "舒芬太尼") + private Double 舒芬太尼; + + @Schema(description = "瑞芬太尼") + private Double 瑞芬太尼; + + @Schema(description = "顺阿曲库胺") + private Double 顺阿曲库胺; + + @Schema(description = "尼卡地平") + private Double 尼卡地平; + + @Schema(description = "艾司洛尔") + private Double 艾司洛尔; + + @Schema(description = "麻黄素") + private Double 麻黄素; + + @Schema(description = "阿托品") + private Double 阿托品; + + @Schema(description = "创建时间") + private Timestamp time; +} diff --git a/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/AIMedicineService.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/AIMedicineService.java similarity index 92% rename from upms/upms-biz/src/main/java/com/rax/vital/medicine/service/AIMedicineService.java rename to upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/AIMedicineService.java index f5d6585..e2208ac 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/AIMedicineService.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/AIMedicineService.java @@ -1,4 +1,4 @@ -package com.rax.vital.medicine.service; +package com.rax.vital.v2.medicine.service; import org.springframework.data.mongodb.core.MongoTemplate; diff --git a/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/ChatService.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/ChatService.java new file mode 100644 index 0000000..f43a8b3 --- /dev/null +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/ChatService.java @@ -0,0 +1,15 @@ +package com.rax.vital.v2.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 dbName, String username, WebSocketSession session, String msg) throws IOException; + + void stopTimerTask(String simpSessionId); + + void stopTask(String simpSessionId); +} diff --git a/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/DoctorMedicineService.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/DoctorMedicineService.java similarity index 87% rename from upms/upms-biz/src/main/java/com/rax/vital/medicine/service/DoctorMedicineService.java rename to upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/DoctorMedicineService.java index 8eaecc8..348562f 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/DoctorMedicineService.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/DoctorMedicineService.java @@ -1,4 +1,4 @@ -package com.rax.vital.medicine.service; +package com.rax.vital.v2.medicine.service; import org.springframework.data.mongodb.core.MongoTemplate; diff --git a/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/FlagService.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/FlagService.java new file mode 100644 index 0000000..d3d6934 --- /dev/null +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/FlagService.java @@ -0,0 +1,14 @@ +package com.rax.vital.v2.medicine.service; + +import org.springframework.data.mongodb.core.MongoTemplate; + +import java.sql.Connection; +import java.util.Map; + +public interface FlagService { + Map getFlags(MongoTemplate template); + + Map getFlag(MongoTemplate template); + + Map getFlag(Connection connection); +} diff --git a/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/RevulsionService.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/RevulsionService.java new file mode 100644 index 0000000..a3d5a50 --- /dev/null +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/RevulsionService.java @@ -0,0 +1,27 @@ +package com.rax.vital.v2.medicine.service; + +import org.springframework.data.mongodb.core.MongoTemplate; + +import java.sql.Connection; +import java.util.List; +import java.util.Map; + +/** + * 诱导期给药数据 + */ +public interface RevulsionService { + + /** + * 获取诱导期给药数据MongoDB + * + * @return + */ + List getRevulsionServiceList(MongoTemplate template); + + /** + * 获取诱导期给药数据MySQL + * + * @return + */ + List getRevulsionServiceList(Connection connection); +} diff --git a/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/SurgeryServiceV2.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/SurgeryServiceV2.java new file mode 100644 index 0000000..8f735cf --- /dev/null +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/SurgeryServiceV2.java @@ -0,0 +1,102 @@ +package com.rax.vital.v2.medicine.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.rax.common.core.util.R; +import org.springframework.data.mongodb.core.MongoTemplate; + +import java.util.List; +import java.util.Map; + +/** + * project_name:remote-control-backend + * time:2024/8/23 16:00 + * author: republicline + * 二期版本: 获取术中过程中的各种信息接口 + */ +public interface SurgeryServiceV2 { + + /** + * 获取MongoDB最新一条生命体征数据 + * + * @return + */ + List getVitalSignsList(MongoTemplate template); + + /** + * 获取患者基本信息 + * + * @param databaseName + * @return + */ + R getPatientInfo(String databaseName); + + /** + * 获取患者列表, informationDB中获取, 查询 surgery_info 表 + * + * @param name + * @param dept + * @param offset + * @param limit + * @return + */ + Page getPatientPage(String name, String dept, long offset, int limit); + + /** + * 统计手术的数量 + * + * @param start + * @param end + * @return + */ + List getSurgeryCount(String start, String end); + + /** + * 统计手术时长 + * + * @param start + * @param end + * @return + */ + List getSurgeryDuration(String start, String end); + + /** + * 统计手术类型比例 + * + * @param start + * @param end + * @return + */ + List getSurgeryTypeProportion(String start, String end); + + /** + * 代补充 + * + * @param start + * @param end + * @return + */ + List getSurgeryOtherDuration(String start, String end); + + /** + * 获取患者手术列表 + * + * @param name + * @param code + * @param surgery + * @param type + * @return + */ + List getPatientSurgeryList(String name, String code, String surgery, String type); + + /** + * 根据患者名称 or 入院号, 查询术后患者的各项信息 -> 用药信息, 给药信息, 生命体征信息 + * + * @param name + * @param code + * @param date + * @param table + * @return + */ + List getSurgeryTableData(String name, String code, String date, String table); + +} diff --git a/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/impl/AIMedicineServiceImpl.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/impl/AIMedicineServiceImpl.java similarity index 98% rename from upms/upms-biz/src/main/java/com/rax/vital/medicine/service/impl/AIMedicineServiceImpl.java rename to upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/impl/AIMedicineServiceImpl.java index 5c432e7..d2afedb 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/impl/AIMedicineServiceImpl.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/impl/AIMedicineServiceImpl.java @@ -1,8 +1,7 @@ -package com.rax.vital.medicine.service.impl; +package com.rax.vital.v2.medicine.service.impl; -import cn.hutool.core.collection.ListUtil; import com.mongodb.BasicDBObject; -import com.rax.vital.medicine.service.AIMedicineService; +import com.rax.vital.v2.medicine.service.AIMedicineService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Sort; @@ -200,6 +199,9 @@ public class AIMedicineServiceImpl implements AIMedicineService { query.limit(1); query.with(Sort.by(Sort.Order.desc("Time"))); List aimedicinetable = template.find(query, Map.class, "aimedicinetable"); + if (aimedicinetable.isEmpty()) { + return null; + } return aimedicinetable.get(0); } } diff --git a/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/impl/ChatServiceImpl.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/impl/ChatServiceImpl.java new file mode 100644 index 0000000..9de206d --- /dev/null +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/impl/ChatServiceImpl.java @@ -0,0 +1,178 @@ +package com.rax.vital.v2.medicine.service.impl; + +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.rax.admin.api.entity.SysUser; +import com.rax.admin.service.SysUserService; +import com.rax.vital.common.datasource.CustomDataSource; +import com.rax.vital.common.datasource.MongoDBSource; +import com.rax.vital.common.util.DatabaseNameUtil; +import com.rax.vital.v2.medicine.service.ChatService; +import org.bson.Document; +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.util.StringUtils; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketSession; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +@RefreshScope +@Service +public class ChatServiceImpl implements ChatService { + + @Autowired + private SimpMessagingTemplate simpMessagingTemplate; + + @Autowired + private SysUserService SysUserService; + + private static final Map datasourceMap = new ConcurrentHashMap<>(); + + // key: databaseName, value: Map + private static final Map> databaseSessionMap = new ConcurrentHashMap<>(); + + private static final Map sessionDatabaseMap = new ConcurrentHashMap<>(); + + // 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; + + @Override + public void sendMessage(String username, String patientName, String idNum, String date, String simpSessionId, String msg) { + CustomDataSource mongoDBSource = datasourceMap.get(simpSessionId); + + if (mongoDBSource == null) { + String databaseName = DatabaseNameUtil.encrypt(patientName) + "_" + DatabaseNameUtil.encrypt(idNum) + "_" + date; + mongoDBSource = new MongoDBSource(mongoDBHost, mongoPassword, mongoUsername, databaseName); + datasourceMap.put(simpSessionId, mongoDBSource); + mongoDBSource.open(); + } + + SysUser sysUser = SysUserService.getOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, username)); + + Map param = new HashMap(); + + MongoTemplate template = mongoDBSource.getConnection(); + 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 = sysUser.getName(); + document.put("create_name", name); + param.put("createName", name); + document.put("deleted", 0); + document.put("revoked", 0); + template.insert(document, "t_chat"); + + simpMessagingTemplate.convertAndSendToUser(patientName + idNum + date, "/chatroomMessage", param); + } + + @Override + public void sendMessage(String databaseName, String username, WebSocketSession session, String msg) throws IOException { + CustomDataSource mongoDBSource = datasourceMap.get(session.getId()); + 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); + } + } + } + + SysUser sysUser = SysUserService.getOne(Wrappers.lambdaQuery().eq(SysUser::getUsername, username)); + + // 将聊天消息保存在mongo中 + if (StringUtils.hasText(msg)) { + JSONObject param = new JSONObject(); + MongoTemplate template = mongoDBSource.getConnection(); + 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 = sysUser.getName(); + document.put("create_name", name); + param.put("createName", name); + document.put("deleted", 0); + document.put("revoked", 0); + template.insert(document, "t_chat"); + param.put("msgType", "msg"); + + 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 stopTimerTask(String simpSessionId) { + CustomDataSource mongoDBSource = datasourceMap.get(simpSessionId); + if (mongoDBSource != null) { + mongoDBSource.close(); + datasourceMap.remove(simpSessionId); + } + } + + @Override + public synchronized void stopTask(String simpSessionId) { + CustomDataSource 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); + } + } + } +} diff --git a/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/impl/DoctorMedicineServiceImpl.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/impl/DoctorMedicineServiceImpl.java similarity index 95% rename from upms/upms-biz/src/main/java/com/rax/vital/medicine/service/impl/DoctorMedicineServiceImpl.java rename to upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/impl/DoctorMedicineServiceImpl.java index a1f19df..0ffd427 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/impl/DoctorMedicineServiceImpl.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/impl/DoctorMedicineServiceImpl.java @@ -1,6 +1,6 @@ -package com.rax.vital.medicine.service.impl; +package com.rax.vital.v2.medicine.service.impl; -import com.rax.vital.medicine.service.DoctorMedicineService; +import com.rax.vital.v2.medicine.service.DoctorMedicineService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Sort; @@ -31,6 +31,9 @@ public class DoctorMedicineServiceImpl implements DoctorMedicineService { query.limit(1); query.with(Sort.by(Sort.Order.desc("Time"))); List doctorMedicineTable = template.find(query, Map.class, "doctormedicinetable"); + if (doctorMedicineTable.isEmpty()){ + return null; + } return doctorMedicineTable.get(0); } diff --git a/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/impl/FlagServiceImpl.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/impl/FlagServiceImpl.java similarity index 97% rename from upms/upms-biz/src/main/java/com/rax/vital/medicine/service/impl/FlagServiceImpl.java rename to upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/impl/FlagServiceImpl.java index 1a92299..18daa8d 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/medicine/service/impl/FlagServiceImpl.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/impl/FlagServiceImpl.java @@ -1,6 +1,6 @@ -package com.rax.vital.medicine.service.impl; +package com.rax.vital.v2.medicine.service.impl; -import com.rax.vital.medicine.service.FlagService; +import com.rax.vital.v2.medicine.service.FlagService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Sort; diff --git a/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/impl/RevulsionServiceImpl.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/impl/RevulsionServiceImpl.java new file mode 100644 index 0000000..38dfb02 --- /dev/null +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/impl/RevulsionServiceImpl.java @@ -0,0 +1,65 @@ +package com.rax.vital.v2.medicine.service.impl; + +import com.rax.vital.v2.medicine.service.RevulsionService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 诱导期给药数据 + */ + +@Slf4j +@Service +@AllArgsConstructor +public class RevulsionServiceImpl implements RevulsionService { + + + @Override + public List getRevulsionServiceList(MongoTemplate template) { + Query query = new Query(); + query.limit(1); + query.with(Sort.by(Sort.Order.desc("Time"))); + List revulsionTable = template.find(query, Map.class, "revulsiontable"); + return revulsionTable; + } + + @Override + public List getRevulsionServiceList(Connection connection) { + List medicineList = new ArrayList<>(); + try { + Statement statement = connection.createStatement(); + ResultSet resultSet = statement.executeQuery("SELECT id, phase, `丙泊酚`, `舒芬太尼`, `瑞芬太尼`, `顺阿曲库胺`, `尼卡地平`, `艾司洛尔`, `麻黄素`, `阿托品`, time FROM `revulsiontable` ORDER BY time DESC LIMIT 1;"); + while (resultSet.next()) { + Map medicine = new HashMap(); + medicine.put("id", resultSet.getString("id")); + medicine.put("phase", resultSet.getString("phase")); + medicine.put("丙泊酚", resultSet.getString("丙泊酚")); + medicine.put("舒芬太尼", resultSet.getString("舒芬太尼")); + medicine.put("瑞芬太尼", resultSet.getString("瑞芬太尼")); + medicine.put("顺阿曲库胺", resultSet.getString("顺阿曲库胺")); + medicine.put("尼卡地平", resultSet.getString("尼卡地平")); + medicine.put("艾司洛尔", resultSet.getString("艾司洛尔")); + medicine.put("麻黄素", resultSet.getString("麻黄素")); + medicine.put("阿托品", resultSet.getString("阿托品")); + medicine.put("Time", resultSet.getString("time")); + medicineList.add(medicine); + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + return medicineList; + } +} diff --git a/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/impl/SurgeryServiceV2Impl.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/impl/SurgeryServiceV2Impl.java new file mode 100644 index 0000000..f2ce0bc --- /dev/null +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/service/impl/SurgeryServiceV2Impl.java @@ -0,0 +1,357 @@ +package com.rax.vital.v2.medicine.service.impl; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.rax.common.core.util.R; +import com.rax.vital.common.datasource.MongoDBSource; +import com.rax.vital.common.util.DatabaseNameUtil; +import com.rax.vital.v2.medicine.service.SurgeryServiceV2; +import org.bson.BsonRegularExpression; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.domain.Sort; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.aggregation.*; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * project_name:remote-control-backend + * time:2024/8/23 16:23 + * author:republicline + * 术中信息服务实现 + */ +@Component +public class SurgeryServiceV2Impl implements SurgeryServiceV2 { + @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; + + @Value("${vital-sign.except-database}") + private String exceptDatabase; + + @Value("${vital-sign.information-database}") + private String informationDatabase; + + @Override + public List getVitalSignsList(MongoTemplate template) { + Query query = new Query(); + query.limit(1); + query.with(Sort.by(Sort.Order.desc("Time"))); + List vitalList = template.find(query, Map.class, "featuretable"); + + if (vitalList != null && vitalList.size() > 0) { + Map map = vitalList.get(0); + Double bis = Double.valueOf((String) map.get("BIS")); + map.put("BIS_except", bis <= 40 || bis >= 60); + Double hr = Double.valueOf((String) map.get("HR")); + map.put("HR_except", hr <= 50 || hr >= 80); + Double sbp = Double.valueOf((String) map.get("SBP")); + map.put("SBP_except", sbp <= 90 || sbp >= 120); + Double dbp = Double.valueOf((String) map.get("DBP")); + map.put("DBP_except", dbp <= 60 || dbp >= 90); + Double st = Double.valueOf((String) map.get("ST")); + map.put("ST_except", st <= -0.2 || st >= 0.2); + Double etCO2 = Double.valueOf((String) map.get("EtCO2")); + map.put("EtCO2_except", etCO2 <= 30 || etCO2 >= 45); + } + return vitalList; + } + + @Override + public R getPatientInfo(String databaseName) { + MongoDBSource mongoDBSource = new MongoDBSource(mongoDBHost, mongoPassword, mongoUsername, databaseName); + mongoDBSource.open(); + MongoTemplate template = mongoDBSource.getConnection(); + Query query = new Query(); + query.limit(1); + query.with(Sort.by(Sort.Order.desc("Time"))); + List vitalList = template.find(query, Map.class, "patienttable"); + mongoDBSource.close(); + return R.ok(vitalList); + } + + @Override + public Page getPatientPage(String name, String dept, long offset, int limit) { + MongoDBSource mongoDBSource = new MongoDBSource(mongoDBHost, mongoPassword, mongoUsername, informationDatabase); + mongoDBSource.open(); + MongoTemplate template = mongoDBSource.getConnection(); + Query query = new Query(); + + if (StringUtils.hasText(name)) { + Criteria criteria = new Criteria("姓名"); + criteria.regex(new BsonRegularExpression(".*" + name + ".*")); + query.addCriteria(criteria); + } + + if (StringUtils.hasText(dept)) { + Criteria criteria = new Criteria("科室"); + criteria.regex(new BsonRegularExpression(dept)); + query.addCriteria(criteria); + } + + query.with(Sort.by(Sort.Order.desc("住院时间"))); + query.skip(offset).limit(limit); + List list = template.find(query, Map.class, "patient_info"); + long count = template.count(query, "patient_info"); + Page page = new Page(); + page.setRecords(list); + page.setTotal(count); + mongoDBSource.close(); + return page; + } + + @Override + public List getSurgeryCount(String start, String end) { + MongoDBSource mongoDBSource = new MongoDBSource(mongoDBHost, mongoPassword, mongoUsername, informationDatabase); + mongoDBSource.open(); + MongoTemplate template = mongoDBSource.getConnection(); + List operations = new ArrayList<>(); + + Criteria criteria = new Criteria("Time"); + criteria.gte(start); + criteria.lte(end); + operations.add(Aggregation.match(criteria)); + + ProjectionOperation timeToDateOperation = Aggregation.project() + .andExpression("Time").as("Time") + .andExpression("{$toDate: '$Time'}").as("time"); + operations.add(timeToDateOperation); + + ProjectionOperation timeFormatOperation = Aggregation.project() + .andExpression("{ $dateToString: { format: '%Y-%m-%d', date: '$time' } }").as("time"); + operations.add(timeFormatOperation); + + operations.add(Aggregation.group("$time").count().as("count")); + + operations.add(Aggregation.project() + .andInclude("count") + .andExpression("{$toDate: '$_id'}").as("time")); + + operations.add(Aggregation.project() + .andInclude("count") + .andExpression("{ $dateToString: { format: '%d', date: '$time' } }").as("time")); + + operations.add(Aggregation.sort(Sort.Direction.ASC, "time")); + + TypedAggregation typedAggregation = new TypedAggregation(Map.class, operations); + AggregationResults aggregate = template.aggregate(typedAggregation, "surgery_info", Map.class); + List mappedResults = aggregate.getMappedResults(); + mongoDBSource.close(); + return mappedResults; + } + + @Override + public List getSurgeryDuration(String start, String end) { + MongoDBSource mongoDBSource = new MongoDBSource(mongoDBHost, mongoPassword, mongoUsername, informationDatabase); + mongoDBSource.open(); + MongoTemplate template = mongoDBSource.getConnection(); + List operations = new ArrayList<>(); + + Criteria criteria = new Criteria("Time"); + criteria.gte(start); + criteria.lte(end); + operations.add(Aggregation.match(criteria)); + + + ProjectionOperation timeToDateOperation = Aggregation.project() + .andExpression("{$toLong: '$Surgery_duration(min)'}").as("Surgery_duration(min)") + .andExpression("{$toDate: '$Time'}").as("day"); + operations.add(timeToDateOperation); + + ProjectionOperation timeFormatOperation = Aggregation.project() + .andInclude("Surgery_duration(min)") + .andExpression("{ $dateToString: { format: '%Y-%m-%d', date: '$day' } }").as("time"); + operations.add(timeFormatOperation); + + operations.add(Aggregation.group("$time").sum("Surgery_duration(min)").as("count")); + + operations.add(Aggregation.project() + .andInclude("_id") + .andExpression("count").divide(60).as("count")); + + operations.add(Aggregation.project() + .andInclude("_id") + .andExpression("{$round: {'$count', 1}}").as("duration")); + + operations.add(Aggregation.project() + .andInclude("duration") + .andExpression("{$toDate: '$_id'}").as("time")); + + operations.add(Aggregation.project() + .andInclude("duration") + .andExpression("{ $dateToString: { format: '%d', date: '$time' } }").as("_id")); + + operations.add(Aggregation.sort(Sort.Direction.ASC, "_id")); + + TypedAggregation typedAggregation = new TypedAggregation(Map.class, operations); + AggregationResults aggregate = template.aggregate(typedAggregation, "surgery_info", Map.class); + List mappedResults = aggregate.getMappedResults(); + mongoDBSource.close(); + return mappedResults; + } + + @Override + public List getSurgeryTypeProportion(String start, String end) { + MongoDBSource mongoDBSource = new MongoDBSource(mongoDBHost, mongoPassword, mongoUsername, informationDatabase); + mongoDBSource.open(); + MongoTemplate template = mongoDBSource.getConnection(); + List operations = new ArrayList<>(); + + Criteria criteria = new Criteria("Time"); + criteria.gte(start); + criteria.lte(end); + operations.add(Aggregation.match(criteria)); + + operations.add(Aggregation.group("$Surgery_type").count().as("count")); + + TypedAggregation typedAggregation = new TypedAggregation(Map.class, operations); + AggregationResults aggregate = template.aggregate(typedAggregation, "surgery_info", Map.class); + List mappedResults = aggregate.getMappedResults(); + mongoDBSource.close(); + return mappedResults; + } + + @Override + public List getSurgeryOtherDuration(String start, String end) { + MongoDBSource mongoDBSource = new MongoDBSource(mongoDBHost, mongoPassword, mongoUsername, informationDatabase); + mongoDBSource.open(); + MongoTemplate template = mongoDBSource.getConnection(); + List operations = new ArrayList<>(); + + Criteria criteria = new Criteria("Time"); + criteria.gte(start); + criteria.lte(end); + operations.add(Aggregation.match(criteria)); + + ProjectionOperation timeToDateOperation = Aggregation.project() + .andExpression("{$toLong: '$Aianaesthesia_duration(min)'}").as("Aianaesthesia_duration(min)") + .andExpression("{$toLong: '$Doctoranaesthesia_duration(min)'}").as("Doctoranaesthesia_duration(min)") + .andExpression("{$toDate: '$Time'}").as("time"); + operations.add(timeToDateOperation); + + ProjectionOperation timeFormatOperation = Aggregation.project() + .andInclude("Aianaesthesia_duration(min)") + .andInclude("Doctoranaesthesia_duration(min)") + .andExpression("{ $dateToString: { format: '%Y-%m-%d', date: '$time' } }").as("time"); + operations.add(timeFormatOperation); + + operations.add(Aggregation.group("$time") + .sum("Aianaesthesia_duration(min)").as("aicount") + .sum("Doctoranaesthesia_duration(min)").as("doccount")); + + operations.add(Aggregation.project() + .andInclude("_id") + .andExpression("aicount").divide(60).as("aicount") + .andExpression("doccount").divide(60).as("doccount")); + + operations.add(Aggregation.project() + .andInclude("_id") + .andExpression("{$round: {'$aicount', 1}}").as("aicount") + .andExpression("{$round: {'$doccount', 1}}").as("doccount")); + + operations.add(Aggregation.sort(Sort.Direction.ASC, "_id")); + + TypedAggregation typedAggregation = new TypedAggregation(Map.class, operations); + AggregationResults aggregate = template.aggregate(typedAggregation, "surgery_info", Map.class); + List mappedResults = aggregate.getMappedResults(); + mongoDBSource.close(); + return mappedResults; + } + + @Override + public List getPatientSurgeryList(String name, String code, String surgery, String type) { + if (StringUtils.hasText(code)) { + MongoDBSource mongoDBSource = new MongoDBSource(mongoDBHost, mongoPassword, mongoUsername, informationDatabase); + mongoDBSource.open(); + MongoTemplate template = mongoDBSource.getConnection(); + + if (!StringUtils.hasText(name)) { + Query query = new Query(); + Criteria criteria = new Criteria("住院号"); + criteria.regex(new BsonRegularExpression(code)); + query.addCriteria(criteria); + List list = template.find(query, Map.class, "patient_info"); + if (!list.isEmpty()) { + Map patient = list.get(0); + name = (String) patient.get("姓名"); + } else { + mongoDBSource.close(); + return List.of(); + } + } + + Query query = new Query(); + String databasePrefix = DatabaseNameUtil.encrypt(name) + "_" + DatabaseNameUtil.encrypt(code) + "_"; + Criteria criteria = new Criteria("Databasename"); + criteria.regex(new BsonRegularExpression("^" + databasePrefix)); + query.addCriteria(criteria); + + if (StringUtils.hasText(surgery)) { + Criteria surgeryCriteria = new Criteria("Surgery_name"); + surgeryCriteria.regex(new BsonRegularExpression(surgery)); + query.addCriteria(surgeryCriteria); + } + + if (StringUtils.hasText(type)) { + Criteria anesthesiaCriteria = new Criteria("Anesthesia_way"); + anesthesiaCriteria.regex(new BsonRegularExpression(type)); + query.addCriteria(anesthesiaCriteria); + } + + query.with(Sort.by(Sort.Order.desc("Time"))); + List surgeryInfoList = template.find(query, Map.class, "surgery_info"); + mongoDBSource.close(); + return surgeryInfoList; + } else { + return List.of(); + } + } + + @Override + public List getSurgeryTableData(String name, String code, String date, String table) { + if (StringUtils.hasText(code)) { + if (!StringUtils.hasText(name)) { + MongoDBSource mongoDBSource = new MongoDBSource(mongoDBHost, mongoPassword, mongoUsername, informationDatabase); + mongoDBSource.open(); + MongoTemplate template = mongoDBSource.getConnection(); +// Query query = new Query(); +// Criteria criteria = new Criteria("住院号"); +// criteria.regex(new BsonRegularExpression(code)); +// query.addCriteria(criteria); + Query query = new Query( + Criteria.where("住院号").is(code) + ); + List list = template.find(query, Map.class, "patient_info"); + if (!list.isEmpty()) { + Map patient = list.get(0); + name = (String) patient.get("姓名"); + } + mongoDBSource.close(); + } + String database = DatabaseNameUtil.encrypt(name) + "_" + DatabaseNameUtil.encrypt(code) + "_" + date; + MongoDBSource mongoDBSource = new MongoDBSource(mongoDBHost, mongoPassword, mongoUsername, database); + mongoDBSource.open(); + MongoTemplate template = mongoDBSource.getConnection(); + Query query = new Query(); + query.with(Sort.by(Sort.Order.asc("_id"))); + List list = template.find(query, Map.class, table); + System.out.println("list = " + list); + mongoDBSource.close(); + return list; + } else { + return new ArrayList<>(); + } + } +} diff --git a/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/vo/MedicineVO.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/vo/MedicineVO.java new file mode 100644 index 0000000..81c58d9 --- /dev/null +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/medicine/vo/MedicineVO.java @@ -0,0 +1,4 @@ +package com.rax.vital.v2.medicine.vo; + +public class MedicineVO { +} diff --git a/upms/upms-biz/src/main/java/com/rax/vital/timer/AIMedicineTimer.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/timer/AIMedicineTimer.java similarity index 70% rename from upms/upms-biz/src/main/java/com/rax/vital/timer/AIMedicineTimer.java rename to upms/upms-biz/src/main/java/com/rax/vital/v2/timer/AIMedicineTimer.java index 0e8879a..14471e0 100644 --- a/upms/upms-biz/src/main/java/com/rax/vital/timer/AIMedicineTimer.java +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/timer/AIMedicineTimer.java @@ -1,4 +1,4 @@ -package com.rax.vital.timer; +package com.rax.vital.v2.timer; import com.alibaba.fastjson.JSONObject; @@ -12,6 +12,12 @@ import java.io.IOException; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +/** + * project_name:remote-control-backend + * time:2024/8/14 15:09 + * author:republicline + * 联调给药2.0 网页端和unity端互相确认连接状态 + */ @RefreshScope @Component @RequiredArgsConstructor @@ -68,26 +74,36 @@ public class AIMedicineTimer { public void sendUnityRequestConnectionMsg(String patientName,String idNum,String date,String databaseName, String flag) throws IOException { WebSocketSession webSession = getWebSession(databaseName); JSONObject jsonObject = new JSONObject(); - if ("1".equals(flag)) { - jsonObject.put("patientName",patientName); - jsonObject.put("idNum",idNum); - jsonObject.put("date",date); - jsonObject.put("msgType", "unityRequestConnection"); - jsonObject.put("unityConnectionFlag", "1"); - webSession.sendMessage(new TextMessage(jsonObject.toJSONString().getBytes())); - setU3DStatus(databaseName, true); - } - if ("0".equals(flag)) { - jsonObject.put("patientName",patientName); - jsonObject.put("idNum",idNum); - jsonObject.put("date",date); - jsonObject.put("msgType", "unityRequestConnection"); - jsonObject.put("unityConnectionFlag", "0"); - webSession.sendMessage(new TextMessage(jsonObject.toJSONString().getBytes())); - setU3DStatus(databaseName, false); - // 把网页端的sessionStatus置为false - setWebStatus(databaseName, false); + if (webSession != null) { + if ("1".equals(flag)) { + jsonObject.put("patientName",patientName); + jsonObject.put("idNum",idNum); + jsonObject.put("date",date); + jsonObject.put("msgType", "unityRequestConnection"); + jsonObject.put("unityConnectionFlag", "1"); + webSession.sendMessage(new TextMessage(jsonObject.toJSONString().getBytes())); + setU3DStatus(databaseName, true); + } + if ("0".equals(flag)) { + jsonObject.put("patientName",patientName); + jsonObject.put("idNum",idNum); + jsonObject.put("date",date); + jsonObject.put("msgType", "unityRequestConnection"); + jsonObject.put("unityConnectionFlag", "0"); + webSession.sendMessage(new TextMessage(jsonObject.toJSONString().getBytes())); + setU3DStatus(databaseName, false); + // 把网页端的sessionStatus置为false + setWebStatus(databaseName, false); + } + }else { + // 告知u3d,网页端尚未初始化 + WebSocketSession u3dSession = u3DDbSessionMap.get(databaseName); + JSONObject msg = new JSONObject(); + msg.put("msgType","connectionMsg"); + msg.put("msg","网页端尚未初始化,无法发送连接请求消息"); + u3dSession.sendMessage(new TextMessage(msg.toJSONString().getBytes())); } + } public WebSocketSession getUnitySession(String databaseName) { @@ -107,25 +123,35 @@ public class AIMedicineTimer { public void sendWebRequestConnectionMsg(String patientName,String idNum, String date,String databaseName, String flag) throws IOException { WebSocketSession unitySession = getUnitySession(databaseName); JSONObject jsonObject = new JSONObject(); - if ("1".equals(flag)) { - jsonObject.put("patientName",patientName); - jsonObject.put("idNum",idNum); - jsonObject.put("date",date); - jsonObject.put("msgType", "webRequestConnection"); - jsonObject.put("webConnectionFlag", "1"); - unitySession.sendMessage(new TextMessage(jsonObject.toJSONString().getBytes())); - setWebStatus(databaseName,true); - } - if ("0".equals(flag)) { - jsonObject.put("patientName",patientName); - jsonObject.put("idNum",idNum); - jsonObject.put("date",date); - jsonObject.put("msgType", "webRequestConnection"); - jsonObject.put("webConnectionFlag", "0"); - unitySession.sendMessage(new TextMessage(jsonObject.toJSONString().getBytes())); - setU3DStatus(databaseName, false); - setWebStatus(databaseName, false); + if (unitySession != null) { + if ("1".equals(flag)) { + jsonObject.put("patientName",patientName); + jsonObject.put("idNum",idNum); + jsonObject.put("date",date); + jsonObject.put("msgType", "webRequestConnection"); + jsonObject.put("webConnectionFlag", "1"); + unitySession.sendMessage(new TextMessage(jsonObject.toJSONString().getBytes())); + setWebStatus(databaseName,true); + } + if ("0".equals(flag)) { + jsonObject.put("patientName",patientName); + jsonObject.put("idNum",idNum); + jsonObject.put("date",date); + jsonObject.put("msgType", "webRequestConnection"); + jsonObject.put("webConnectionFlag", "0"); + unitySession.sendMessage(new TextMessage(jsonObject.toJSONString().getBytes())); + setU3DStatus(databaseName, false); + setWebStatus(databaseName, false); + } + }else { + // 告知网页端U3d尚未初始化 + WebSocketSession webSocketSession = webDbSessionMap.get(databaseName); + JSONObject msg = new JSONObject(); + msg.put("msgType","connectionMsg"); + msg.put("msg","客户端尚未初始化,无法发送连接请求消息"); + webSocketSession.sendMessage(new TextMessage(msg.toJSONString().getBytes())); } + } public void sendConnectionResponseToUnity(String patientName,String idNum,String date,String databaseName, String flag) throws IOException { diff --git a/upms/upms-biz/src/main/java/com/rax/vital/v2/timer/VitalSignTimerV2.java b/upms/upms-biz/src/main/java/com/rax/vital/v2/timer/VitalSignTimerV2.java new file mode 100644 index 0000000..a723669 --- /dev/null +++ b/upms/upms-biz/src/main/java/com/rax/vital/v2/timer/VitalSignTimerV2.java @@ -0,0 +1,199 @@ +package com.rax.vital.v2.timer; + +import com.alibaba.fastjson.JSONObject; +import com.rax.vital.common.datasource.CustomDataSource; +import com.rax.vital.common.datasource.MongoDBSource; +import com.rax.vital.v2.medicine.dto.MedicineDTO; +import com.rax.vital.v2.medicine.service.AIMedicineService; +import com.rax.vital.v2.medicine.service.DoctorMedicineService; +import com.rax.vital.v2.medicine.service.FlagService; +import com.rax.vital.v2.medicine.service.SurgeryServiceV2; +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.stereotype.Component; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketMessage; +import org.springframework.web.socket.WebSocketSession; + +import java.io.IOException; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +/** + * project_name:remote-control-backend + * time:2024/8/20 15:09 + * author:republicline + * 新的计时器任务, 和一期代码解耦 + */ +@RefreshScope +@Component +@RequiredArgsConstructor +public class VitalSignTimerV2 { + // 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; + + private final SurgeryServiceV2 surgeryServiceV2; + + private final AIMedicineService aiMedicineService; + + private final AIMedicineTimer aiMedicineTimer; + + private final DoctorMedicineService doctorMedicineService; + + private final FlagService flagService; + + // 定时任务容器 + private static final Map timerTaskMap = new ConcurrentHashMap<>(); + + // 主控人员容器, 建立连接放入存值,生命体征信息 key:数据库名 value:网页解析的token用户名 + private static final Map masterControlMap = new ConcurrentHashMap<>(); + + // 链接工具类容器 ket, 主要用于关闭数据库连接 + private static final Map dataSourceMap = new ConcurrentHashMap<>(); + + + // 推送生命体征数据和药物信息数据 + public void sendMedicalMessage(String database, String username, WebSocketSession session) { + if (!masterControlMap.containsKey(database)) { + masterControlMap.put(database, username); + } + String sessionId = session.getId(); + + TimerTask task = timerTaskMap.get(sessionId); + if (task != null) { + return; + } + + CustomDataSource dataSource = dataSourceMap.get(sessionId); + if (dataSource == null) { + dataSource = new MongoDBSource(mongoDBHost, mongoPassword, mongoUsername, database); + dataSourceMap.put(sessionId, dataSource); + dataSource.open(); + } + CustomDataSource finalMongoDBSource = dataSource; + TimerTask timerTask = new TimerTask() { + @Override + public void run() { + + MongoTemplate template = finalMongoDBSource.getConnection(); + JSONObject jsonObject = new JSONObject(); + // 生命体征信息 + List vitalSignsList = surgeryServiceV2.getVitalSignsList(template); + jsonObject.put("vitalSignsList", vitalSignsList); + + // 标记信息 + Map flags = flagService.getFlags(template); + // flag +// aiFlag 1代表AI给药 0代表医生给药 +// reFlag 1代表维持期 0代表诱导期 +// endFlag 1代表手术进行 0代表手术结束 +// linkFlag 1泵异常 0正常 + jsonObject.put("flags", flags); + Map medicineRateMap = new HashMap<>(); + if (flags.get("aiFlag") != null && flags.get("aiFlag").equals("1")) { + // ai给药信息 + medicineRateMap = aiMedicineService.getAiMedicine(template); + } else if (flags.get("aiFlag") != null && flags.get("aiFlag").equals("0")) { + // 医生给药信息 + medicineRateMap = doctorMedicineService.getDocMedicine(template); + } + + ArrayList medicineList = new ArrayList<>(8); + medicineList.add(new MedicineDTO("1", "丙泊酚", "0", "0")); + medicineList.add(new MedicineDTO("2", "舒芬太尼", "0", "0")); + medicineList.add(new MedicineDTO("3", "瑞芬太尼", "0", "0")); + medicineList.add(new MedicineDTO("4", "顺阿曲库胺", "0", "0")); + medicineList.add(new MedicineDTO("5", "尼卡地平", "0", "0")); + medicineList.add(new MedicineDTO("6", "艾司洛尔", "0", "0")); + medicineList.add(new MedicineDTO("7", "麻黄素", "0", "0")); + medicineList.add(new MedicineDTO("8", "阿托品", "0", "0")); + + if (medicineRateMap != null && !medicineRateMap.isEmpty()) { + for (String key : medicineRateMap.keySet()) { + for (MedicineDTO medicineDTO : medicineList) { + if (medicineDTO.getMedicineName().equals(key)) { + medicineDTO.setMedicineRate(medicineRateMap.get(key).toString()); + } + } + } + jsonObject.put("rateModTime", medicineRateMap.get("Time")); + } else { + jsonObject.put("rateModTime", "0"); + } + // 总的药量信息 + Map countMedicineMap = aiMedicineService.getCountMedicine(template); + if (countMedicineMap != null && !countMedicineMap.isEmpty()) { + for (String key : countMedicineMap.keySet()) { + for (MedicineDTO medicineDTO : medicineList) { + if ((medicineDTO.getMedicineName() + "Sum").equals(key)) { + medicineDTO.setMedicineRate(countMedicineMap.get(key).toString()); + } + } + } + } + + jsonObject.put("medicineList", medicineList); + jsonObject.put("msgType", "msg"); + // 如果是人工给药展示人工给药的内容 + WebSocketMessage message = new TextMessage(jsonObject.toJSONString().getBytes()); + + try { + session.sendMessage(message); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + }; + + // 定时任务,设置1秒 + Timer timer = new Timer(); + timer.schedule(timerTask, 0, 2000); + timerTaskMap.put(sessionId, timerTask); + } + + + // 发送给药数据到unity + public void sendMedicalMessageToUnity(String database, String username, WebSocketSession session, String flag, String medicine, String value) throws IOException { + JSONObject result = new JSONObject(); + if (masterControlMap.containsKey(database) && masterControlMap.get(database).equals(username)) { + // 给药到unity + WebSocketSession unitySession = aiMedicineTimer.getUnitySession(database); + result.put("medicine",medicine); + result.put("value",value); + result.put("flag", flag); + result.put("msgType", "addMedicine"); + unitySession.sendMessage(new TextMessage(result.toJSONString().getBytes())); + } else { + result.put("flag", flag); + result.put("medicine", medicine); + result.put("status", 1); + result.put("msg", "不是主控人员"); + result.put("msgType", "msg"); + session.sendMessage(new TextMessage(result.toJSONString().getBytes())); + } + } + + // 指定停止定时任务 + public void stopTimerTask(String sessionId) { + TimerTask timerTask = timerTaskMap.get(sessionId); + if (timerTask != null) { + timerTask.cancel(); + CustomDataSource dataSource = dataSourceMap.get(sessionId); + dataSource.close(); + timerTaskMap.remove(sessionId); + dataSourceMap.remove(sessionId); + } + } + +} diff --git a/upms/upms-biz/src/main/resources/application.yml b/upms/upms-biz/src/main/resources/application.yml index 6061082..346f6ac 100644 --- a/upms/upms-biz/src/main/resources/application.yml +++ b/upms/upms-biz/src/main/resources/application.yml @@ -83,6 +83,10 @@ aliyun: signName: AAceshi #阿里云签名名 templateCode: SMS_471660037 # 模板code +# 配置版本信息 +project: + version: v1 + #--------------如下配置尽量不要变动------------- # mybatis-plus 配置 mybatis-plus: diff --git a/upms/upms-biz/src/main/resources/mapper/SysUserMapper.xml b/upms/upms-biz/src/main/resources/mapper/SysUserMapper.xml index e77bf44..3428e2c 100644 --- a/upms/upms-biz/src/main/resources/mapper/SysUserMapper.xml +++ b/upms/upms-biz/src/main/resources/mapper/SysUserMapper.xml @@ -20,12 +20,14 @@ + + - - + + + @@ -109,11 +111,12 @@ u.nickname, u.name, u.email, - d.name dept_name + h.name hospital_name, + h.id hospital_id FROM sys_user u - LEFT JOIN sys_dept d ON d.dept_id = u.dept_id - - u.del_flag = '0' and u.user_id != '1' + LEFT JOIN sys_hospital h ON h.id = u.hospital_id + where + u.del_flag = 0 and u.user_id != '1' and u.hospital_id = #{query.hospitalId} @@ -132,11 +135,10 @@ AND u.phone LIKE #{phoneLike} - - - ORDER BY u.create_time DESC - + + +