1. 项目背景与核心需求
乡镇卫生所作为基层医疗单位,其医用物资管理长期面临三大痛点:手工台账效率低下、库存预警不及时、采购决策缺乏数据支撑。这套基于SpringBoot+Vue的进销存系统正是为解决这些问题而生。
我在实际部署中发现,系统最突出的价值在于实现了三个关键能力:
- 实时库存可视化:通过扫码枪快速完成出入库操作,库存数据自动更新
- 智能预警机制:当口罩、消毒液等高频使用物资低于安全阈值时自动触发提醒
- 采购分析看板:基于历史消耗数据生成季度采购建议,减少人为判断误差
特别提示:乡镇卫生所的网络环境往往较差,系统特别优化了离线操作模式,在网络中断时仍可进行基础出入库登记,待网络恢复后自动同步数据。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构解析
2.1 后端SpringBoot设计亮点
采用经典的MVC分层架构,但针对医疗场景做了特殊强化:
java复制// 物资批次管理核心逻辑示例
@Transactional
public BatchInfo createBatch(BatchDTO dto) {
// 1. 校验效期(医疗物资强制要求)
if(dto.getExpireDate().before(new Date())) {
throw new MedicalException("过期日期不能早于当前时间");
}
// 2. 生成唯一追溯编码
String traceCode = "M" + UUID.randomUUID().toString().substring(0,8);
// 3. 关联供应商资质(医疗行业特殊要求)
SupplierCert cert = certService.getValidCert(dto.getSupplierId());
return batchRepository.save(new BatchInfo(dto, traceCode, cert.getCertNo()));
}
数据库设计特别注意了医疗行业规范:
- 物资表增加
sterilization_level(消毒等级)字段 - 供应商表强制关联
business_license(营业执照)扫描件 - 操作日志表记录完整的
operator+operate_time+ip_address三重审计信息
2.2 前端Vue优化实践
针对乡镇工作人员电脑配置普遍不高的情况,我们做了这些性能优化:
- 采用Vue 2.x版本(兼容性更好)
- 禁用非必要的大型UI组件库
- 表格数据分页加载(每页不超过50条)
- 本地缓存常用字典数据(如物资分类)
javascript复制// 条码扫描输入优化
mounted() {
this.$nextTick(() => {
const scanner = document.getElementById('barcode-input');
scanner.addEventListener('keypress', e => {
if(e.key === 'Enter') {
this.handleBarcode(scanner.value.trim());
scanner.value = '';
}
});
});
}
3. 关键业务模块实现
3.1 智能预警子系统
采用双阈值机制确保预警准确性:
- 黄色预警:库存量 < 安全库存×1.5
- 红色预警:库存量 < 安全库存×0.8
预警算法考虑了三个维度:
- 历史消耗速度(过去90天日均用量)
- 采购周期(供应商平均交货时间)
- 季节性因素(如流感季口罩需求激增)
3.2 移动端适配方案
虽然主要使用场景是PC端,但我们仍提供了移动端适配:
- 使用vw/vh单位实现响应式布局
- 扫码功能调用手机相机API
- 离线模式采用localStorage暂存数据
踩坑记录:乡镇卫生所多使用安卓4.4系统的老旧设备,需特别注意ES6语法兼容问题,最终通过babel-polyfill解决。
4. 部署实操指南
4.1 环境准备要点
服务器最低配置要求:
- CPU:2核(推荐4核)
- 内存:4GB(推荐8GB)
- 磁盘:100GB(需考虑医疗图片存储)
软件环境:
bash复制# JDK安装(必须1.8版本)
yum install -y java-1.8.0-openjdk-devel
# 前端依赖安装
npm install --registry=https://registry.npm.taobao.org
4.2 数据库初始化
特别注意医疗行业数据规范:
sql复制CREATE TABLE `medical_material` (
`id` bigint(20) NOT NULL COMMENT '医疗器械唯一编码',
`name` varchar(100) NOT NULL COMMENT '需与医疗器械注册证一致',
`spec` varchar(50) NOT NULL COMMENT '规格型号',
`registration_no` varchar(50) DEFAULT NULL COMMENT '注册证号',
`sterilization` tinyint(1) DEFAULT 0 COMMENT '是否无菌',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='医用物资主表';
4.3 常见部署问题排查
-
扫码枪无法识别:
- 检查/dev/input/event*设备权限
- 确认内核模块hid-generic是否加载
-
打印模板错乱:
- 调整freemarker模板中的DPI设置
- 确认打印机驱动是否支持PCL5语言
-
离线模式失效:
- 检查service worker注册路径
- 验证IndexedDB存储配额
5. 医疗行业特殊处理
5.1 效期管理增强
不同于普通进销存,医疗物资必须实现:
- 近效期预警(有效期前3个月标黄)
- 批号追溯(可关联到具体供应商)
- 失效自动锁定(禁止出库)
5.2 报表合规性设计
所有统计报表必须包含:
- 医疗机构许可证编号
- 报表生成时间(精确到秒)
- 操作员电子签名
我在某乡镇卫生所实施时,发现他们特别需要"物资消耗排行"功能,于是额外开发了按科室、按病种的多维度分析模块,这个经验后来成为了系统标配功能。
6. 二次开发建议
对于想基于此系统扩展的开发者,推荐这些方向:
- 对接医保系统:实现高值耗材的医保结算
- 移动盘点功能:PDA设备快速盘点
- 智能预测:基于机器学习预测物资需求
核心扩展点:
- 在MaterialService接口添加扩展方法
- 重写ReportTemplateController生成自定义报表
- 通过Vue mixin注入新的页面组件
性能优化技巧:乡镇卫生所的服务器往往性能有限,建议将库存统计这类耗时操作转为定时任务,结果缓存到Redis中。
