最近在给社区医院做信息化升级时,发现儿童疫苗接种预约这个场景存在不少痛点。传统电话预约方式经常占线,家长要反复确认时间,医护人员手工登记也容易出错。微信小程序天然适合解决这个问题——家长不用额外安装APP,扫码就能操作,后台数据还能和医院系统打通。
这个"儿童预防接种预约系统"我们团队从需求分析到上线打磨了三个月,现在日均处理200+预约,错误率降到了0.3%以下。今天把完整方案拆解给大家,包括前后端架构设计、微信接口的坑、以及如何解决高并发时段的库存超卖问题。文末会分享调试时发现的5个隐蔽Bug和对应的解决方案。
初期考虑过三种方案:
后端用Node.js + MySQL组合,主要看中:
设计了6张关键表:
特别注意:疫苗表必须记录批号和有效期,我们遇到过家长要求查询三年前接种的疫苗批次,好在数据库保留了完整记录。
采用二级库存机制防止超卖:
javascript复制// 伪代码示例
async function createOrder(vaccineId) {
const lockKey = `vaccine:${vaccineId}`;
const locked = await redis.setnx(lockKey, 1);
if (!locked) throw new Error('当前预约人数过多');
try {
const stock = await db.query(`
UPDATE vaccine_stock
SET hold = hold + 1
WHERE id = ? AND total > hold
RETURNING *
`, [vaccineId]);
if (!stock) throw new Error('库存不足');
// 创建订单逻辑...
} finally {
await redis.del(lockKey);
}
}
三个必接的微信API:
wx.login 获取openid绑定儿童信息wx.getPhoneNumber 一键获取监护人手机号wx.requestSubscribeMessage 接种提醒订阅踩坑记录:
<button open-type="getPhoneNumber">采用Swagger UI自动生成文档,特别注意:
华为手机特有问题:
json复制"hwapi": {
"payment": {
"minVersion": 1050
}
}
性能优化数据:
遇到家长同时预约两种疫苗的情况,需要检测:
解决方案:
sql复制SELECT * FROM vaccine_rules
WHERE (vaccine_id IN (?,?) OR group_id IN (
SELECT group_id FROM vaccine_group
WHERE vaccine_id IN (?,?)
))
AND DATEDIFF(?, last_date) < interval_days
最初直接用微信模版消息,遇到两个问题:
改进方案:
给没有专业IT团队的社区医院准备了一键部署包:
用Grafana搭建了三个关键仪表盘:
核心目录:
code复制/src
/components # 复用组件
vaccine-card # 疫苗信息卡片
calendar # 带库存显示的日历
/pages
appointment # 预约流程
record # 接种记录
/services
api.js # 接口封装
cache.js # 本地缓存
特别提醒:儿童生日组件不要用picker默认模式,建议:
javascript复制// 更好的日期选择实现
const years = Array.from({length: 10}, (_,i) => 2023-i);
const months = Array.from({length: 12}, (_,i) => 1+i);
const days = Array.from({length: 31}, (_,i) => 1+i);
上线半年后的关键指标:
最受欢迎的增值功能:
正在开发的三个进阶功能:
有个细节值得分享:在预约成功页添加"分享给朋友"按钮后,自然传播带来了23%的新用户增长。建议在设计时预留分享入口的位置,这个改动成本低但效果显著。