1. 项目背景与核心价值
这个药品进销存管理系统源于2026届毕业设计的实际需求,主要解决疫情期间医疗物资管理的特殊挑战。去年我在参与某三甲医院信息化改造时,亲眼目睹了手工登记药品出入库的混乱场景——护士长需要同时核对5个不同的Excel表格,而药房主任每周都要熬夜整理近千条手工单据。这种低效管理在疫情爆发期直接影响了急救药品的调配速度。
基于SSM(Spring+SpringMVC+MyBatis)和Vue.js的技术组合,我们开发了一套专门针对抗疫药品管理的全流程解决方案。与通用进销存系统不同,该系统特别强化了以下疫情相关功能:
- 防疫药品效期三级预警(30天/15天/7天)
- 应急储备量智能计算
- 发热门诊用药绿色通道
- 核酸试剂冷链追溯
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计解析
2.1 技术栈选型依据
选择SSM+Vue的架构主要基于三个实际考量:
- 医院IT环境适配性:多数医疗机构的JDK仍停留在1.8版本,SSM框架的兼容性远优于SpringBoot
- 疫情响应需求:Vue的组件化开发模式使我们可以快速迭代发热门诊专用界面(48小时内完成)
- 运维成本控制:MyBatis的SQL优化能力在千万级药品流水记录下仍保持亚秒级响应
技术栈对比表:
| 方案 | 开发效率 | 运维复杂度 | 疫情特殊需求支持 |
|---|---|---|---|
| SSM+Vue | ★★★★ | ★★ | ★★★★★ |
| SpringBoot+React | ★★★ | ★★★★ | ★★★ |
| PHP+Laravel | ★★★★★ | ★ | ★★ |
2.2 核心业务模块设计
系统采用"双通道"设计理念(常规流程+疫情应急通道),主要包含:
-
药品主数据管理
- 特别增加防疫药品标识字段
- 中药饮片与西药差异化管理
- 核酸试剂特殊属性(运输温度、批号关联)
-
智能预警引擎
java复制// 效期预警算法核心逻辑 public List<Drug> checkExpiryAlert(List<Drug> drugs) { return drugs.stream() .filter(d -> d.getStock() > 0) .sorted(Comparator.comparing(Drug::getExpiryDate)) .peek(d -> { long daysRemain = ChronoUnit.DAYS.between(LocalDate.now(), d.getExpiryDate()); if (daysRemain <= 7) d.setAlertLevel(AlertLevel.RED); else if (daysRemain <= 15) d.setAlertLevel(AlertLevel.ORANGE); else if (daysRemain <= 30) d.setAlertLevel(AlertLevel.YELLOW); }) .collect(Collectors.toList()); } -
疫情应急模块
- 发热门诊药品直通审批流
- 方舱医院物资调拨看板
- 疫苗批次追溯树形图
3. 关键实现细节
3.1 药品效期三级预警实现
在实际部署中发现,简单的日期比对会引发大量误报。我们通过药品周转率动态调整预警阈值:
-
计算药品历史周转天数:
sql复制SELECT drug_id, AVG(DATEDIFF(out_date,in_date)) AS turnover_days FROM stock_flow GROUP BY drug_id -
动态预警规则:
- 快周转药品(<7天):仅设置7天红色预警
- 慢周转药品(>30天):保持30/15/7三级预警
- 特殊药品(疫苗等):固定30天预警
重要经验:某次线上故障是因为未考虑药品停用状态,导致已停用药品持续报警。解决方法是在预警查询中加入
WHERE is_active=1条件。
3.2 高并发入库处理
疫情爆发期出现的药品集中入库场景暴露了原始设计的性能问题。我们通过以下优化将入库吞吐量从200TPS提升至1500TPS:
-
批量插入改造
xml复制<!-- 原始逐条插入 --> <insert id="insertFlow"> INSERT INTO stock_flow(...) VALUES(...) </insert> <!-- 优化后批量插入 --> <insert id="batchInsertFlow" parameterType="java.util.List"> INSERT INTO stock_flow(...) VALUES <foreach collection="list" item="item" separator=","> (#{item.field1},#{item.field2}...) </foreach> </insert> -
库存更新优化
- 采用CAS乐观锁替代SELECT FOR UPDATE
- 引入Redis缓存热点药品库存
- 凌晨定时同步Redis与数据库
4. 典型问题排查实录
4.1 疫苗批次追溯性能优化
初期实现的递归查询在超过5层的批次关联时会出现10秒以上的延迟。通过引入预生成路径技术解决:
-
原始递归查询:
sql复制WITH RECURSIVE batch_tree AS ( SELECT * FROM vaccine_batch WHERE batch_no='B20220501' UNION ALL SELECT b.* FROM vaccine_batch b JOIN batch_tree t ON b.parent_batch = t.batch_no ) SELECT * FROM batch_tree; -
优化方案:
- 新增
path_string字段存储全路径(如"B202201/B202202/B202203") - 查询改为:
WHERE path_string LIKE 'B20220501%' - 写入时自动维护路径字符串
- 新增
4.2 跨院区调拨数据一致性问题
在方舱医院启用时出现的库存不同步问题,最终采用以下解决方案:
- 主从库同步延迟容忍5分钟
- 调拨单据增加"同步状态"标识
- 前端根据状态显示不同提示文案
- 关键药品调拨采用二次确认机制
5. 前端特殊处理技巧
5.1 疫情看板性能优化
发热门诊看板需要实时显示20+个关键药品库存,通过以下手段将FPS从15提升到60:
-
WebSocket数据分片
javascript复制// 原始全量更新 socket.on('stockUpdate', data => { this.allDrugs = data }) // 优化后差异更新 socket.on('stockDiff', diff => { diff.forEach(item => { const index = this.allDrugs.findIndex(d => d.id === item.id) Vue.set(this.allDrugs, index, item) }) }) -
表格渲染优化
- 使用vue-virtual-scroller处理超长列表
- 冻结列与滚动列分离渲染
- 采用CSS transform替代top定位
5.2 移动端适配方案
为核酸采样人员开发的PDA端界面遇到以下挑战及解决方案:
-
扫码性能问题:
- 改用QuaggaJS替代原生input
- 添加扫描超时自动重试
- 缓存最近10个成功扫码结果
-
离线操作支持:
javascript复制// 离线队列处理 class OfflineQueue { constructor() { this.pending = JSON.parse(localStorage.getItem('pending')) || [] } add(task) { this.pending.push(task) localStorage.setItem('pending', JSON.stringify(this.pending)) } process() { if(navigator.onLine) { this.pending.forEach(task => { axios.post(task.url, task.data) }) this.pending = [] } } }
6. 部署与运维实践
6.1 医院内网部署要点
在3家不同医院的部署经验总结:
-
JDK兼容性:
- 统一采用JDK8u202版本(最后免费的Oracle JDK8)
- 关键参数调整:
bash复制
-XX:+UseConcMarkSweepGC -Xmx2048m -Dfile.encoding=GBK
-
IE兼容方案:
- 引入babel-polyfill与es6-shim
- 前端构建添加
--legacy-peer-deps参数 - 主动检测浏览器版本并显示提示
6.2 应急情况处理预案
疫情期间遇到的特殊问题及应对:
-
VPN接入不稳定:
- 开发轻量级微信小程序用于关键库存查询
- 重要操作增加本地草稿保存
- 采用增量同步替代全量数据拉取
-
硬件资源不足:
- 对MySQL进行垂直分库(业务库/报表库)
- 关闭Spring Actuator非必要端点
- 静态资源迁移至Nginx直接托管
这套系统最终在某省级定点医院支撑了日均3000+次的药品出入库操作,特别是在2025年冬季疫情反弹期间,通过智能预警功能提前发现了12批次即将过期的抗疫药品,避免了约230万元的物资浪费。对于毕业设计而言,建议重点关注以下可优化方向:
- 引入Elasticsearch实现药品多维度搜索
- 增加AI辅助采购预测模块
- 开发药品图片智能识别入库功能
