1. 项目背景与需求分析
药品库存管理一直是医疗行业和药店经营中的核心痛点。传统的人工记录方式不仅效率低下,还容易出现错漏,特别是在药品效期管理和库存预警方面。我在实际调研中发现,很多中小型药店还在使用Excel表格来管理药品信息,经常出现库存数据不准确、过期药品未能及时发现等问题。
这个智能药品库存管理系统正是为了解决这些实际问题而设计的。它采用当前主流的Java技术栈(SSM+Vue),实现了药品全生命周期的数字化管理。系统特别适合以下几类用户:
- 药店经营者:可以实时掌握库存情况,避免药品积压或断货
- 医院药房管理员:提高药品管理效率,减少人工差错
- 毕业设计学生:学习完整的企业级应用开发流程
系统最核心的价值在于它的"智能预警"功能。当药品库存低于设定阈值,或者临近有效期时,系统会自动发出提醒,这比人工检查要可靠得多。我在帮朋友药店部署类似系统后,他们的过期药品损失减少了70%以上。
2. 技术选型与环境搭建
2.1 技术栈组成
这个项目采用前后端分离架构,技术选型经过精心考量:
后端核心:
- Spring MVC:处理HTTP请求和路由
- MyBatis:数据库持久层框架
- Spring:IoC容器和事务管理
- Maven:项目构建和依赖管理
前端技术:
- Vue.js:前端MVVM框架
- Element UI:UI组件库
- Axios:HTTP请求库
数据库:
- MySQL 5.7:关系型数据库
选择这套技术栈主要考虑三点:一是成熟稳定,社区资源丰富;二是学习曲线平缓,适合毕业设计;三是性能足够应对中小规模的药品管理需求。
2.2 开发环境配置
这里分享一个我踩过的坑:JDK版本一定要用1.8。有次我用JDK 11就遇到了兼容性问题,折腾了半天才发现是Tomcat版本不匹配。
具体环境要求:
- JDK:1.8(其他版本可能遇到兼容性问题)
- IDE:
- IntelliJ IDEA(推荐)
- Eclipse(需要安装Spring插件)
- 数据库:MySQL 5.7+
- 构建工具:Maven 3.6+
- Web服务器:Tomcat 8.x
安装MySQL时建议设置字符集为utf8mb4,避免存储药品名称时出现乱码。创建数据库后,记得先执行项目中的SQL脚本初始化表结构。
3. 系统架构设计
3.1 整体架构
系统采用经典的三层架构:
表示层(Vue前端) ↓ 业务逻辑层(Spring MVC) ↓ 数据访问层(MyBatis)这种分层设计让代码更易于维护。比如要修改数据库访问逻辑时,完全不用改动前端代码。
3.2 数据库设计
核心表包括:
药品表(drug):
- 药品ID、名称、类别、规格、生产日期、有效期、库存量、进价、售价等
- 特别注意设置了有效期索引,方便快速查询临期药品
进货记录表(purchase):
- 记录每次进货的药品、数量、供应商、进货日期等
销售记录表(sale):
- 记录销售明细,包括药品、数量、销售员、客户等
用户表(user):
- 区分管理员和销售人员权限
数据库关系设计遵循第三范式,避免数据冗余。比如药品表只存储药品基本信息,具体的进货和销售记录通过外键关联。
4. 核心功能实现
4.1 智能预警模块
这是系统的杀手锏功能,实现逻辑如下:
// 库存预警检查 public List<Drug> checkStockWarning() { return drugMapper.selectDrugsBelowThreshold(); } // 效期预警检查 public List<Drug> checkExpiryWarning() { Date warningDate = DateUtils.addDays(new Date(), 30); // 提前30天预警 return drugMapper.selectDrugsNearExpiry(warningDate); }系统会定时执行这些检查(比如每天凌晨2点),发现异常就通过站内消息和邮件通知相关人员。我在实现时加了缓存机制,避免频繁查询数据库。
4.2 库存管理
库存变动采用"事务+版本号"机制保证数据一致性:
@Transactional public boolean updateStock(Long drugId, int changeAmount) { Drug drug = drugMapper.selectById(drugId); if(drug == null) return false; int newStock = drug.getStock() + changeAmount; if(newStock < 0) { throw new RuntimeException("库存不足"); } drug.setStock(newStock); return drugMapper.updateById(drug) > 0; }特别注意处理并发场景,比如多个销售员同时卖同一种药品时,使用乐观锁避免超卖。
4.3 智能补货算法
系统根据销售历史自动计算补货量:
public int calculateReplenishment(Long drugId) { // 获取最近30天销售数据 List<Sale> sales = saleMapper.selectLast30DaysSales(drugId); // 计算日均销量 double avgDailySales = sales.stream() .mapToInt(Sale::getAmount) .average() .orElse(0); // 建议补货量 = 日均销量 × 备货周期(7天) - 当前库存 return (int)(avgDailySales * 7) - currentStock; }这个算法虽然简单,但在实际使用中效果不错。你也可以根据需求加入季节性因素等更复杂的计算逻辑。
5. 关键代码解析
5.1 药品信息管理
药品CRUD接口的典型实现:
@RestController @RequestMapping("/api/drug") public class DrugController { @Autowired private DrugService drugService; @GetMapping("/{id}") public Result<Drug> getById(@PathVariable Long id) { return Result.success(drugService.getById(id)); } @PostMapping public Result<Void> addDrug(@Valid @RequestBody Drug drug) { return drugService.addDrug(drug) ? Result.success() : Result.error("添加失败"); } // 其他接口省略... }注意使用了@Valid注解进行参数校验,这是保证数据有效性的第一道防线。
5.2 销售业务处理
销售流程包含多个步骤,需要事务管理:
@Transactional public boolean processSale(SaleDTO saleDTO) { // 1. 检查库存 Drug drug = drugMapper.selectById(saleDTO.getDrugId()); if(drug.getStock() < saleDTO.getAmount()) { throw new RuntimeException("库存不足"); } // 2. 扣减库存 drug.setStock(drug.getStock() - saleDTO.getAmount()); drugMapper.updateById(drug); // 3. 记录销售 Sale sale = new Sale(); BeanUtils.copyProperties(saleDTO, sale); sale.setSaleTime(new Date()); return saleMapper.insert(sale) > 0; }这种将业务逻辑放在Service层的做法,比在Controller中写业务代码更规范,也更容易维护。
6. 系统部署与测试
6.1 前端部署
前端使用Vue CLI构建,部署步骤:
- 安装Node.js(建议14.x版本)
- 安装依赖:
npm install - 开发模式运行:
npm run serve - 生产构建:
npm run build
构建后会生成dist目录,可以直接部署到Nginx。记得配置API代理,解决跨域问题:
location /api { proxy_pass http://localhost:8080; proxy_set_header Host $host; }6.2 后端部署
推荐使用Spring Boot内嵌Tomcat运行:
- 打包:
mvn clean package - 运行:
java -jar target/drug-system.jar
如果需要部署到外置Tomcat,记得:
- 修改pom.xml中的packaging为war
- 排除内嵌Tomcat依赖
- 继承SpringBootServletInitializer
6.3 测试要点
重点测试以下几个场景:
- 并发销售时库存是否正确扣减
- 效期预警是否准时触发
- 补货建议计算是否合理
- 权限控制是否生效
可以使用JMeter进行压力测试,模拟多用户同时操作系统的情况。
7. 项目扩展方向
这个基础版本完成后,还可以考虑以下扩展:
- 移动端适配:开发微信小程序版本,方便随时查看库存
- 供应商管理:增加供应商评价和自动下单功能
- 数据分析:加入销售趋势分析、药品效益分析等报表
- 对接医保系统:实现医保药品的自动化管理
我在实际项目中扩展了移动端功能,药店老板可以随时用手机查看库存情况,他们反馈这个功能非常实用。