feat(surgery): 增加手术室确认信息和次要手术功能
- 添加手术室确认时间和确认人字段显示 - 实现次要手术的添加、编辑和删除功能 - 增加急诊标志和植入高值耗材开关选项 - 添加手术费用和麻醉费用计算功能 - 实现手术和麻醉项目的远程搜索功能 - 增加第一助手和第二助手选择功能 - 优化医生列表加载逻辑,支持多接口获取 - 添加按钮图标提升界面体验 - 修复encounterId为空时的接口调用问题
This commit is contained in:
120
手术和麻醉信息Redis缓存实现说明.md
Normal file
120
手术和麻醉信息Redis缓存实现说明.md
Normal file
@@ -0,0 +1,120 @@
|
||||
# 手术和麻醉信息Redis缓存实现说明
|
||||
|
||||
## 概述
|
||||
为提高手术和麻醉信息的查询性能,已将手术信息缓存到Redis中。接口查询时先从Redis缓存获取,如果没有则从数据库查询并更新到Redis缓存。
|
||||
|
||||
## 实现细节
|
||||
|
||||
### 1. Redis缓存Key定义
|
||||
在 `openhis-common/src/main/java/com/openhis/common/utils/RedisKeys.java` 中定义了以下缓存Key:
|
||||
|
||||
```java
|
||||
// 单个手术信息缓存
|
||||
public static String getSurgeryKey(Long surgeryId)
|
||||
|
||||
// 按患者ID查询的手术列表缓存
|
||||
public static String getSurgeryListByPatientKey(Long patientId)
|
||||
|
||||
// 按就诊ID查询的手术列表缓存
|
||||
public static String getSurgeryListByEncounterKey(Long encounterId)
|
||||
```
|
||||
|
||||
### 2. 缓存实现
|
||||
|
||||
#### 2.1 SurgeryServiceImpl (Domain层)
|
||||
- **getSurgeryById(Long id)**: 根据手术ID查询单个手术信息
|
||||
- 先从Redis缓存获取
|
||||
- 缓存未命中则从数据库查询
|
||||
- 查询结果存入Redis缓存(30分钟过期)
|
||||
|
||||
- **getSurgeryListByPatientId(Long patientId)**: 根据患者ID查询手术列表
|
||||
- 先从Redis缓存获取
|
||||
- 缓存未命中则从数据库查询
|
||||
- 查询结果存入Redis缓存(30分钟过期)
|
||||
|
||||
- **getSurgeryListByEncounterId(Long encounterId)**: 根据就诊ID查询手术列表
|
||||
- 先从Redis缓存获取
|
||||
- 缓存未命中则从数据库查询
|
||||
- 查询结果存入Redis缓存(30分钟过期)
|
||||
|
||||
- **insertSurgery(Surgery surgery)**: 新增手术信息
|
||||
- 插入成功后清除相关缓存
|
||||
|
||||
- **updateSurgery(Surgery surgery)**: 更新手术信息
|
||||
- 更新成功后清除相关缓存
|
||||
|
||||
- **deleteSurgery(Long id)**: 删除手术信息
|
||||
- 删除成功后清除相关缓存
|
||||
|
||||
- **updateSurgeryStatus(Long id, Integer statusEnum)**: 更新手术状态
|
||||
- 更新成功后清除相关缓存
|
||||
|
||||
#### 2.2 SurgeryAppServiceImpl (Application层)
|
||||
- **getSurgeryDetail(Long id)**: 根据ID查询手术详情
|
||||
- 先从Redis缓存获取
|
||||
- 缓存未命中则从数据库查询
|
||||
- 查询结果存入Redis缓存(30分钟过期)
|
||||
|
||||
- **addSurgery(SurgeryDto surgeryDto)**: 新增手术信息
|
||||
- 插入成功后清除相关缓存
|
||||
|
||||
- **updateSurgery(SurgeryDto surgeryDto)**: 更新手术信息
|
||||
- 更新成功后清除相关缓存
|
||||
|
||||
- **deleteSurgery(Long id)**: 删除手术信息
|
||||
- 删除成功后清除相关缓存
|
||||
|
||||
- **updateSurgeryStatus(Long id, Integer statusEnum)**: 更新手术状态
|
||||
- 更新成功后清除相关缓存
|
||||
|
||||
### 3. 缓存清除策略
|
||||
当手术信息发生变化时(新增、更新、删除),会清除以下相关缓存:
|
||||
1. 单个手术信息缓存
|
||||
2. 患者手术列表缓存
|
||||
3. 就诊手术列表缓存
|
||||
|
||||
### 4. 缓存配置
|
||||
- **缓存时间**: 30分钟
|
||||
- **时间单位**: TimeUnit.MINUTES
|
||||
- **序列化**: 使用RedisTemplate默认序列化方式
|
||||
|
||||
## 关于麻醉信息
|
||||
当前项目中,麻醉信息是手术表(`cli_surgery`)中的字段,包括:
|
||||
- 麻醉医生ID (anesthetistId)
|
||||
- 麻醉医生姓名 (anesthetistName)
|
||||
- 麻醉方式编码 (anesthesiaTypeEnum)
|
||||
- 麻醉费用 (anesthesiaFee)
|
||||
|
||||
这些字段已经包含在手术实体的缓存中,无需单独实现麻醉信息的缓存。
|
||||
|
||||
## 使用示例
|
||||
|
||||
### 查询手术信息(自动使用缓存)
|
||||
```java
|
||||
// 自动从缓存获取,未命中则查询数据库
|
||||
Surgery surgery = surgeryService.getSurgeryById(surgeryId);
|
||||
```
|
||||
|
||||
### 更新手术信息(自动清除缓存)
|
||||
```java
|
||||
// 更新数据库,同时清除相关缓存
|
||||
surgeryService.updateSurgery(surgery);
|
||||
```
|
||||
|
||||
### 手动清除缓存(如需要)
|
||||
```java
|
||||
String cacheKey = RedisKeys.getSurgeryKey(surgeryId);
|
||||
redisCache.deleteObject(cacheKey);
|
||||
```
|
||||
|
||||
## 性能优化建议
|
||||
1. 对于频繁访问的手术信息,缓存命中率高,可显著提升查询性能
|
||||
2. 对于不常访问的手术信息,30分钟缓存时间可避免占用过多Redis内存
|
||||
3. 如需调整缓存时间,可修改代码中的 `30, TimeUnit.MINUTES` 参数
|
||||
4. 如需更精细的缓存控制,可考虑使用不同的缓存时间策略(如根据手术状态设置不同过期时间)
|
||||
|
||||
## 监控建议
|
||||
建议监控以下指标:
|
||||
- Redis缓存命中率
|
||||
- Redis内存使用情况
|
||||
- 查询响应时间对比(缓存命中 vs 缓存未命中)
|
||||
Reference in New Issue
Block a user