1. 项目背景与核心价值
去年参与了一个社区卫生服务中心的数字化改造项目,其中新生儿疫苗预约环节的痛点让我印象深刻。年轻父母们常常要抱着孩子排长队填表,护士们则忙于核对纸质档案,整个流程效率低下且容易出错。这个SpringBoot社区新生儿疫苗预约小程序就是为解决这些问题而设计的。
这个小程序的核心价值在于:
- 家长端:手机预约、接种提醒、电子接种记录一键查询
- 医护端:预约管理、库存预警、数据统计自动化
- 管理端:区域接种率分析、疫苗溯源追踪
目前已在3个社区试点运行,预约效率提升70%,错种漏种率为零,护士们终于不用每天和纸质表格"搏斗"了。
2. 技术架构解析
2.1 整体技术栈选型
采用经典的SpringBoot + Vue前后端分离架构:
code复制后端:
- SpringBoot 2.7.5 (稳定版)
- MySQL 8.0 (JSON字段存储扩展信息)
- Redis 6.2 (缓存热点数据)
- Quartz 2.3.2 (定时任务)
前端:
- Uni-app (跨端方案)
- Vant Weapp (UI组件库)
- ECharts (数据可视化)
选择这套组合主要考虑:
- 社区医院IT基础设施普遍较弱,需要轻量级方案
- 医护人员电脑配置低,Web管理端必须足够流畅
- 家长用户群体年龄跨度大,操作流程要极致简单
2.2 核心业务模块设计
java复制// 领域模型核心代码示例
@Entity
public class VaccinationRecord {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
private ChildInfo child; // 关联儿童档案
@ManyToOne
private Vaccine vaccine; // 关联疫苗
private LocalDateTime scheduledTime;
private Integer status; // 0-待接种 1-已完成 2-已取消
private String batchNumber; // 疫苗批号
}
特别注意的点:
- 采用JPA而非MyBatis,因为业务逻辑相对固定
- 所有时间字段统一用LocalDateTime处理时区问题
- 批号字段预留20位长度满足不同厂商编码规则
3. 关键业务逻辑实现
3.1 智能预约排期算法
最复杂的当属自动排期逻辑,要避开以下限制条件:
- 不同疫苗之间的最小间隔天数
- 接种点工作日/节假日设置
- 医护人员排班情况
- 疫苗库存实时数量
核心算法实现:
java复制public List<LocalDateTime> getAvailableTimes(Vaccine vaccine, Child child) {
// 获取已接种记录
List<Vaccination> history = vaccinationRepository.findByChild(child);
// 计算最小间隔日
int minInterval = getMinInterval(vaccine, history);
// 生成可选时间段
return generateTimeSlots(minInterval, vaccine.getDose());
}
踩坑记录:初期没有考虑疫苗库存,导致出现预约成功但无苗可打的情况。后来改为在排期时实时检查库存余量。
3.2 接种提醒服务
采用三级提醒机制:
- 预约成功即时通知
- 接种前3天提醒
- 接种当天早间提醒
使用阿里云短信服务+微信公众号模板消息双通道保障到达率。关键配置:
yaml复制sms:
template-id: SMS_123456
sign-name: 健康社区
wechat:
template-id: WX_TMP_001
url: /pages/appointment/detail
4. 安全与合规设计
4.1 隐私数据保护
- 儿童身份证号加密存储(AES-256)
- 接种记录访问需要双重认证
- 所有接口必须携带时间戳防重放
4.2 疫苗溯源机制
java复制@Transactional
public void confirmVaccination(Long recordId, String batchNumber) {
// 1. 验证批号有效性
VaccineBatch batch = batchService.validateBatch(batchNumber);
// 2. 更新接种状态
VaccinationRecord record = recordRepository.findById(recordId).orElseThrow();
record.setStatus(1);
record.setBatchNumber(batchNumber);
// 3. 扣减库存
inventoryService.reduce(batch.getVaccineId(), 1);
}
5. 部署与运维方案
5.1 服务器配置建议
最低配置要求:
- 2核4G云服务器(CentOS 7.6)
- MySQL独立实例(4G内存)
- Redis缓存(1G内存)
实测数据:
- 2000用户并发时平均响应时间<800ms
- 日预约量3000+时CPU负载<60%
5.2 监控指标设置
Prometheus监控重点:
/actuator/health服务状态vaccine_stock库存预警appointment_rate预约成功率
6. 源码解析与二次开发
项目结构说明:
code复制src/
├── main/
│ ├── java/
│ │ ├── controller/ # 控制器层
│ │ ├── service/ # 业务逻辑
│ │ ├── repository/ # 数据访问
│ │ └── entity/ # 领域模型
│ └── resources/
│ ├── application.yml # 主配置
│ └── static/ # 前端构建产物
快速启动步骤:
- 导入SQL脚本初始化数据库
- 修改
application-prod.yml配置 - 打包部署:
bash复制mvn clean package -DskipTests
java -jar target/vaccine-app.jar --spring.profiles.active=prod
7. 典型问题解决方案
7.1 预约时间冲突
症状:家长反映可选时间段不符合预期
排查步骤:
- 检查
vaccine_schedule表配置 - 验证
vaccine_interval规则 - 查看redis缓存是否过期
7.2 短信发送失败
常见原因:
- 阿里云AK/SK配置错误
- 短信签名未审核通过
- 手机号格式不规范(需86前缀)
应急方案:
- 自动切换邮件通知
- 记录失败任务定时重试
- 管理员后台手动补发
8. 项目演进方向
- 增加人脸识别核验功能(防止代预约)
- 对接省级免疫规划平台
- 开发疫苗接种电子证照
- 引入智能客服机器人
这个项目给我最深的体会是:医疗类系统必须把稳定性放在第一位。我们做了完整的熔断设计,比如当预约服务不可用时,会自动降级到现场取号模式,保证业务连续性。