基于SSM框架的药品进销存信息管理系统 - 源码深度解析
行业背景与业务痛点
在医药流通行业,传统的人工记录方式面临着效率低下、数据易出错、库存状态不透明等核心业务痛点。随着医药行业监管日益严格和市场竞争加剧,医药企业亟需对药品的采购、销售和库存进行全面精准的数字化管理,以确保药品安全、控制运营成本并满足GSP等行业监管要求。
针对这一市场需求,我们基于SSM框架开发了一套医药供应链智能管理平台,通过数字化手段实现药品从采购、入库、销售到库存监控的全生命周期精细化管控。
技术架构选型与设计理念
SSM框架组合优势分析
本系统采用业界经典的SSM(Spring+Spring MVC+MyBatis)框架组合,构建了一个稳定可靠的企业级管理解决方案:
- Spring框架:作为核心容器,通过IoC(控制反转)机制统一管理业务对象和依赖注入,提供声明式事务管理能力
- Spring MVC:基于MVC模式的Web层框架,以DispatcherServlet为核心控制器,实现请求分发和视图解析
- MyBatis:轻量级ORM框架,通过XML映射文件实现Java对象与关系数据库的灵活映射
分层架构设计
系统采用标准的分层架构模式,确保各层职责单一、耦合度低:
| 层级 | 技术实现 | 核心职责 |
|---|---|---|
| 表现层 | JSP+JSTL+Bootstrap | 响应式界面渲染,用户交互处理 |
| 控制层 | Spring MVC注解驱动 | 请求映射,参数绑定,业务逻辑调度 |
| 业务层 | Spring Service组件 | 核心业务逻辑实现,事务控制 |
| 持久层 | MyBatis Mapper | 数据持久化操作,SQL映射管理 |
核心代码实现解析
Spring MVC控制器设计
@Controller
@RequestMapping("/medicine")
public class MedicineController {
@Autowired
private MedicineService medicineService;
/**
* 药品分页查询 - 支持分页参数和查询条件
* @param pageNum 当前页码,默认第1页
* @param pageSize 每页记录数,默认10条
* @param model Spring MVC模型对象,用于视图数据传递
* @return 药品列表视图路径
*/
@RequestMapping("/list")
public String list(@RequestParam(defaultValue="1")Integer pageNum,
@RequestParam(defaultValue="10")Integer pageSize,
Model model) {
PageInfo<Medicine> pageInfo = medicineService.findByPage(pageNum, pageSize);
model.addAttribute("pageInfo", pageInfo);
return "medicine/list";
}
/**
* 药品入库操作 - RESTful风格接口
* @param inOrder 入库订单对象,通过@RequestBody自动绑定JSON数据
* @return 操作结果JSON响应
*/
@RequestMapping(value = "/stockIn", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> stockIn(@RequestBody InOrder inOrder) {
Map<String, Object> result = new HashMap<>();
try {
medicineService.stockIn(inOrder);
result.put("success", true);
result.put("message", "入库成功");
} catch (Exception e) {
result.put("success", false);
result.put("message", "入库失败:" + e.getMessage());
}
return result;
}
}
数据库设计亮点分析
药品表(t_medicine)的精细化设计
药品作为系统的核心业务实体,表结构设计充分考虑了医药行业的特殊需求:
CREATE TABLE `t_medicine` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`cName` varchar(20) NOT NULL COMMENT '药品中文名',
`eName` varchar(20) NOT NULL COMMENT '药品英文名',
`price` double(11,2) NOT NULL COMMENT '药品价格',
`nums` int(11) NOT NULL COMMENT '库存数量',
`manufacturer` varchar(30) NOT NULL COMMENT '生产厂家',
`describle` varchar(100) NOT NULL COMMENT '药品描述',
`productDate` date NOT NULL COMMENT '生产日期',
`safeDate` varchar(20) NOT NULL COMMENT '保质期',
`standard` varchar(50) NOT NULL COMMENT '药品规格',
`typeId` int(11) NOT NULL COMMENT '药品类型ID',
`oldPrice` double(11,2) NOT NULL COMMENT '原价',
PRIMARY KEY (`id`),
KEY `idx_type` (`typeId`),
KEY `idx_name` (`cName`)
) ENGINE=InnoDB AUTO_INCREMENT=43 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='药品表'
设计亮点分析:
- 国际化支持:
cName和eName字段支持中英文药品名称,满足国际化业务需求 - 价格追踪机制:通过
price(当前价格)和oldPrice(历史价格)实现价格变动追踪 - 药品安全管控:
productDate(生产日期)和safeDate(保质期)确保药品有效期管理 - 查询性能优化:为
typeId和cName字段建立索引,显著提升分类查询和名称搜索效率
销售订单表(t_sellorder)的事务完整性设计
CREATE TABLE `t_sellorder` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`cName` varchar(40) NOT NULL COMMENT '药品中文名',
`price` double(11,2) NOT NULL COMMENT '销售价格',
`buyNums` int(11) NOT NULL COMMENT '购买数量',
`totalMoney` double(11,2) NOT NULL COMMENT '总金额',
`createDate` datetime NOT NULL COMMENT '创建日期',
`status` int(11) NOT NULL COMMENT '订单状态',
`userId` int(11) NOT NULL COMMENT '用户ID',
PRIMARY KEY (`id`),
KEY `idx_user_date` (`userId`,`createDate`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='销售订单表'
索引优化策略:
- 复合索引:
idx_user_date索引优化了按用户维度和时间范围的联合查询 - 状态索引:
idx_status索引支持订单状态的高效筛选和统计 - 事务完整性:InnoDB存储引擎确保ACID特性,支持高并发场景下的数据一致性

核心业务功能深度解析
药品库存智能预警机制
系统实现了基于动态阈值的智能库存预警功能,通过算法分析历史销售数据,自动计算合理的安全库存水平:
@Service
@Transactional
public class MedicineServiceImpl implements MedicineService {
@Autowired
private MedicineDao medicineDao;
@Autowired
private InventoryAlertDao alertDao;
/**
* 库存预警检查 - 基于销售数据分析的动态阈值计算
*/
@Override
public void checkInventoryAlert() {
List<Medicine> medicines = medicineDao.findAll();
for (Medicine medicine : medicines) {
// 动态计算安全库存阈值(基于近期销售数据模式分析)
int safeThreshold = calculateSafeThreshold(medicine.getId());
if (medicine.getNums() < safeThreshold) {
// 生成库存预警记录
InventoryAlert alert = new InventoryAlert();
alert.setMedicineId(medicine.getId());
alert.setMedicineName(medicine.getCName());
alert.setCurrentStock(medicine.getNums());
alert.setSafeThreshold(safeThreshold);
alert.setAlertTime(new Date());
alert.setStatus(0); // 预警状态:未处理
alertDao.save(alert);
// 可扩展:发送预警通知(邮件、短信等)
sendAlertNotification(alert);
}
}
}
/**
* 安全库存阈值计算算法
* @param medicineId 药品ID
* @return 计算得出的安全库存阈值
*/
private int calculateSafeThreshold(int medicineId) {
// 基于近30天销售数据计算日均销量
Double avgDailySales = medicineDao.getAverageDailySales(medicineId, 30);
// 安全库存 = 日均销量 × 安全天数(默认7天)
return (int) (avgDailySales * 7);
}
private void sendAlertNotification(InventoryAlert alert) {
// 预警通知发送逻辑(可集成消息队列异步处理)
// 实现邮件、短信、系统通知等多渠道预警
}
}
采购入库的事务一致性保障
采购入库是系统的核心业务流程,涉及多个数据表的原子性操作,系统通过Spring声明式事务确保业务一致性:
@Service
@Transactional(rollbackFor = Exception.class)
public class PurchaseServiceImpl implements PurchaseService {
@Autowired
private MedicineDao medicineDao;
@Autowired
private PurchaseOrderDao purchaseOrderDao;
@Autowired
private InventoryDao inventoryDao;
/**
* 采购入库操作 - 多表更新的事务一致性保障
* @param purchaseOrder 采购订单对象
*/
@Override
public void processPurchase(PurchaseOrder purchaseOrder) {
try {
// 1. 保存采购订单记录
purchaseOrderDao.save(purchaseOrder);
// 2. 更新药品库存数量
Medicine medicine = medicineDao.findById(purchaseOrder.getMedicineId());
medicine.setNums(medicine.getNums() + purchaseOrder.getQuantity());
medicineDao.update(medicine);
// 3. 记录库存变更流水
InventoryRecord record = new InventoryRecord();
record.setMedicineId(purchaseOrder.getMedicineId());
record.setChangeQuantity(purchaseOrder.getQuantity());
record.setChangeType("PURCHASE_IN");
record.setCreateTime(new Date());
inventoryDao.saveRecord(record);
// 4. 触发库存预警重新检查
checkInventoryAlert();
} catch (Exception e) {
// 事务自动回滚
throw new BusinessException("采购入库操作失败", e);
}
}
}
系统特色与技术创新
1. 智能预警算法优化
采用基于历史销售数据的动态阈值计算,相比固定阈值更加精准合理
2. 事务一致性保障
通过Spring声明式事务管理,确保复杂业务操作的数据完整性
3. 性能优化策略
- 数据库索引优化,提升查询效率
- 分页查询机制,避免大数据量加载
- 连接池配置优化,提高系统并发能力
4. 可扩展性设计
- 模块化架构设计,便于功能扩展
- 接口抽象化,支持多数据源接入
- 配置外部化,适应不同部署环境
总结
本系统通过SSM框架的有机整合,实现了医药行业进销存管理的全面数字化。系统不仅解决了传统管理方式的痛点,更通过智能预警、事务保障等技术创新,为医药企业提供了可靠、高效的管理工具。源码设计体现了良好的软件工程实践,具有较高的学习参考价值和技术示范意义。