在医疗信息化浪潮中,电子病历系统(EMR)已成为现代医院的核心基础设施。这个基于SpringBoot的电子病历管理系统,正是针对中小型医疗机构数字化转型需求设计的轻量级解决方案。相比传统纸质病历,它能实现病历电子化存储、结构化录入、多维度检索和权限管控,将医生从繁琐的手写记录中解放出来。
我在三甲医院信息科工作期间,曾主导过多个EMR系统的落地。实际部署中发现,市面上的商业系统往往功能冗余且价格昂贵,而开源方案又存在技术陈旧、文档缺失的问题。这个项目采用SpringBoot+MyBatis主流技术栈,前后端分离架构,既保证了系统稳定性,又便于二次开发。源码包(编号23540)包含完整的前后端代码和数据库脚本,特别适合作为医疗信息化入门项目学习。
采用RBAC(基于角色的访问控制)模型设计患者信息管理模块。数据库表结构中,patient_info作为核心表,包含身份证号、医保卡号等唯一标识字段,与visit_record(就诊记录)形成一对多关系。这里有个设计细节:敏感字段如身份证号在存储时采用AES对称加密,密钥通过医院CA证书二次加密,既符合等保要求,又不影响查询效率。
在前端实现上,使用Element UI的表格组件配合自定义过滤器,支持按姓名首字母拼音速查。实测在5万条患者数据量级下,模糊查询响应时间能控制在300ms内。关键代码如下:
java复制// 患者信息加密存储示例
public String encryptIdCard(String idCard) {
return AESUtil.encrypt(idCard,
RSAUtil.decrypt(keyProperties.getPrivateKey()));
}
传统文本输入框无法满足病历书写规范要求。我们基于WangEditor二次开发,实现了:
特别值得分享的是术语补全的实现方案:利用Trie树构建本地缓存术语库,当医生输入"腹"时,自动联想"腹痛"、"腹胀"等标准术语。相比实时API查询,这种方案能减少网络延迟,在弱网环境下仍能流畅使用。
医嘱处理涉及开立、审核、执行、核对多个环节。系统采用状态机模式设计医嘱流转:
code复制[新开立] → [护士审核] → [药房配药] → [护士执行] → [医生确认]
每个状态变更都会触发MQ消息通知相关人员,同时记录操作日志。为防止医嘱重复执行,我们使用Redis分布式锁保证并发安全:
java复制// 医嘱状态变更示例
public Result changeOrderStatus(Long orderId, String newStatus) {
String lockKey = "order_lock:" + orderId;
try {
if (redisLock.tryLock(lockKey, 10, TimeUnit.SECONDS)) {
// 状态变更业务逻辑
}
} finally {
redisLock.unlock(lockKey);
}
}
系统通过三层防护保障数据安全:
特别注意:病历数据删除采用逻辑删除+定时归档策略。delete_flag标记为1的记录会在每月1号凌晨通过Spring Batch作业迁移到历史库,确保数据可追溯。
针对挂号场景的瞬时高并发,采用以下优化方案:
压测数据显示,这套方案在8核16G服务器上能支撑3000+ TPS的挂号请求。关键Lua脚本如下:
lua复制-- 号源库存扣减脚本
local remain = redis.call('GET', KEYS[1])
if remain and tonumber(remain) > 0 then
redis.call('DECR', KEYS[1])
return 1
end
return 0
病历数据统计分析面临数据量大、计算复杂的问题。我们的解决方案:
例如病种统计报表,通过预计算将原本30秒的查询优化到毫秒级响应:
sql复制-- 每日病种统计预计算
INSERT INTO disease_stats(disease_code, count_date, patient_count)
SELECT diagnosis_code, CURDATE(), COUNT(*)
FROM emr_records
WHERE create_date = CURDATE()
GROUP BY diagnosis_code;
推荐使用Docker-Compose一键部署:
yaml复制version: '3'
services:
mysql:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=emr@123
volumes:
- ./mysql/data:/var/lib/mysql
redis:
image: redis:6
app:
build: .
ports:
- "8080:8080"
depends_on:
- mysql
- redis
部署时需要特别注意:
根据实际运营经验总结以下关键点:
常见问题处理速查表:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 病历保存失败 | 数据库连接池耗尽 | 增大spring.datasource.hikari.maximum-pool-size |
| 术语补全延迟 | 本地术语库未加载 | 检查/opt/emr/terms目录权限 |
| 图片上传失败 | 存储空间不足 | 清理minio存储桶或扩容磁盘 |
系统预留了标准化的接口扩展点:
例如开发医保对接接口的典型流程:
java复制@RestController
@RequestMapping("/api/insurance")
public class InsuranceController extends AbstractController {
@BusinessLog("医保结算")
@PostMapping("/settle")
public Result settle(@Valid @RequestBody SettleDTO dto) {
// 调用医保前置机接口
}
}
现有系统可通过以下改造支持移动端:
特别提醒:移动端病历录入要考虑医生操作习惯,建议保留语音输入转文字功能,并优化手写签名组件。
在系统实际部署中必须关注:
建议在系统参数配置中设置自动合规检查:
properties复制# 病历保存年限配置
emr.retention.outpatient=15
emr.retention.inpatient=30
这套系统在我参与的社区医院项目中已稳定运行2年,日均处理病历800+份。最大的体会是:医疗信息化系统要在易用性和严谨性之间找到平衡点,既要简化医生操作流程,又要保证医疗数据的完整性和安全性。源码中的审计日志模块和权限控制设计值得重点关注,这些都是应对医疗合规检查的关键保障。