1. 项目概述
社区医院管理系统是基层医疗机构数字化转型的核心工具,这个基于SpringBoot+Vue的全栈项目实现了从挂号预约到药品管理的全流程信息化。我在三甲医院信息科工作期间参与过类似系统的升级改造,深知这类系统在提升诊疗效率、优化资源配置方面的价值。
这套系统采用前后端分离架构,后端基于SpringBoot 2.7 + MyBatis-Plus 3.5构建,前端使用Vue 3 + Element Plus,数据库选用MySQL 8.0。相比传统单体架构,这种技术组合既保证了后端服务的稳定性,又能提供流畅的前端交互体验,特别适合日均接诊量在300-500人次的社区医院场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心模块设计
2.1 患者管理子系统
采用RBAC权限模型设计患者信息管理模块,核心表包括:
- patient_info(患者基础信息)
- medical_history(病史记录)
- allergy_info(过敏史)
java复制// 患者信息查询接口示例
@GetMapping("/patients")
public PageResult<PatientVO> queryPatients(
@RequestParam(required = false) String name,
@RequestParam(required = false) String idCard,
@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer size) {
LambdaQueryWrapper<Patient> wrapper = new LambdaQueryWrapper<>();
wrapper.like(StringUtils.isNotBlank(name), Patient::getName, name)
.eq(StringUtils.isNotBlank(idCard), Patient::getIdCard, idCard);
return patientService.pageQuery(wrapper, page, size);
}
关键点:身份证号字段需添加唯一索引,医疗数据查询必须做好SQL注入防护
2.2 挂号预约系统
实现分时段预约功能,核心业务逻辑包括:
- 医生排班规则校验(工作日/节假日)
- 号源库存并发控制
- 黑名单患者过滤
sql复制-- 号源表设计
CREATE TABLE `registration_schedule` (
`id` bigint NOT NULL AUTO_INCREMENT,
`doctor_id` bigint NOT NULL,
`time_slot` datetime NOT NULL,
`total_count` int DEFAULT '20',
`remaining` int DEFAULT '20',
`version` int DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_doctor_time` (`doctor_id`,`time_slot`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2.3 药品库存管理
采用进销存模型设计药品管理系统,关键特性:
- 批次管理(效期预警)
- 库存警戒线设置
- 药品-供应商关联
vue复制<!-- 药品库存预警组件 -->
<template>
<el-table :data="expiringDrugs" style="width: 100%">
<el-table-column prop="drugName" label="药品名称" />
<el-table-column prop="batchNumber" label="批次号" />
<el-table-column prop="expireDate" label="失效日期">
<template #default="{row}">
<span :class="{'warning-text': isNearExpire(row)}">
{{ formatDate(row.expireDate) }}
</span>
</template>
</el-table-column>
</el-table>
</template>
3. 关键技术实现
3.1 多租户数据隔离
考虑到社区医院可能有多个分院,采用schema级隔离方案:
- 动态数据源路由
- 租户上下文传递
- 公共数据缓存策略
java复制public class TenantDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return TenantContext.getCurrentTenant();
}
}
// 使用AOP自动添加租户条件
@Around("execution(* com..mapper.*.*(..))")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
Object param = pjp.getArgs()[0];
if(param instanceof BaseEntity) {
((BaseEntity) param).setTenantId(TenantContext.getCurrentTenant());
}
return pjp.proceed();
}
3.2 诊疗记录PDF生成
使用Flying Saucer + Thymeleaf实现:
- HTML模板设计
- CSS打印样式优化
- 数字签名防篡改
xml复制<!-- PDF生成依赖 -->
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf</artifactId>
<version>9.1.22</version>
</dependency>
避坑指南:中文字体需要额外配置,建议使用思源黑体
3.3 智能分诊建议
基于症状关键词匹配的简易分诊算法:
- 症状知识库构建
- 余弦相似度计算
- 科室权重排序
python复制# 症状匹配算法示例(Java实现类似)
def calculate_similarity(symptom, department):
vector1 = build_vector(symptom)
vector2 = knowledge_base[department]
return cosine_similarity(vector1, vector2)
4. 系统部署方案
4.1 生产环境配置
推荐服务器规格:
- 应用服务器:2核4G × 2(Docker部署)
- 数据库:4核8G(主从架构)
- Redis:2G内存(缓存会话)
yaml复制# SpringBoot关键配置
spring:
datasource:
url: jdbc:mysql://mysql-primary:3306/his?useSSL=false
hikari:
maximum-pool-size: 20
connection-timeout: 30000
redis:
host: redis-master
timeout: 5000
4.2 高可用设计
保障措施包括:
- Nginx负载均衡
- MySQL主从同步
- 关键业务接口幂等设计
sql复制-- 医嘱表添加幂等键
ALTER TABLE `medical_order`
ADD COLUMN `idempotent_key` varchar(64) NOT NULL DEFAULT '',
ADD UNIQUE INDEX `idx_idempotent` (`idempotent_key`);
5. 开发经验总结
5.1 医疗数据安全要点
- 敏感字段加密存储(如身份证号)
- 操作日志完整审计
- 接口访问频率限制
java复制// 数据脱敏处理
public String maskIdCard(String idCard) {
if(StringUtils.isBlank(idCard) || idCard.length() < 8) {
return idCard;
}
return idCard.substring(0, 3) + "****"
+ idCard.substring(idCard.length() - 4);
}
5.2 性能优化实践
- 门诊量统计使用Elasticsearch聚合
- 药品目录添加二级缓存
- 批量操作采用异步处理
java复制// 缓存注解配置
@Cacheable(value = "drugCatalog", key = "#typeId")
public List<DrugVO> getDrugsByType(Long typeId) {
return drugMapper.selectByType(typeId);
}
这套系统在落地过程中我们遇到过不少挑战,比如初期没有考虑处方打印的并发问题导致打印机队列堵塞,后来通过引入RabbitMQ实现打印任务队列化才解决。医疗信息化系统最需要关注的是数据一致性和操作可追溯性,所有核心业务变更都必须保留完整的操作日志。
