基于SSM框架的在线药品进销存管理平台 - 源码深度解析
在医药零售行业数字化转型的浪潮中,高效精准的药品管理已成为企业提升运营效率、降低运营成本的核心竞争力。传统手工记录方式面临着信息不透明、库存更新滞后、手工操作易出错等痛点,难以满足现代医药流通企业的管理需求。为此,我们开发了这款企业级医药流通管理平台,通过数字化手段为中小型药店、诊所及医药流通企业提供一体化的药品销售与库存管理解决方案。
系统架构与技术栈
该平台采用业界成熟的SSM(Spring + Spring MVC + MyBatis)框架组合,构建了稳定可靠的三层架构体系:
后端技术架构
- Spring框架:作为核心IoC容器,通过依赖注入(DI)和面向切面编程(AOP)管理业务逻辑层和数据访问层的对象生命周期,确保各组件间的松耦合
- Spring MVC:基于模型-视图-控制器设计模式,负责请求分发、参数绑定和视图渲染,提供清晰的Web层解决方案
- MyBatis:作为轻量级持久层框架,通过灵活的XML映射文件完成数据库操作,支持动态SQL和存储过程
前端与工具链
- 视图层:采用JSP结合JSTL标签库进行动态数据展示,配合Ajax技术实现无刷新操作体验
- 项目管理:使用Maven进行依赖管理和项目构建,确保依赖版本一致性
- 数据库:MySQL作为关系型数据存储引擎,保证事务ACID特性
<!-- Spring核心依赖配置 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.22</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
数据库设计亮点
药品库存转移表设计
kucunzhuanyi表的设计体现了对药品流通环节的精细化管理,确保库存数据的准确性和可追溯性:
CREATE TABLE `kucunzhuanyi` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`addtime` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '创建时间',
`zhuanyibianhao` varchar(200) DEFAULT NULL COMMENT '转移编号',
`yaopinmingcheng` varchar(200) DEFAULT NULL COMMENT '药品名称',
`yaopinfenlei` varchar(200) DEFAULT NULL COMMENT '药品分类',
`jixing` varchar(200) DEFAULT NULL COMMENT '剂型',
`shuliang` int(11) DEFAULT NULL COMMENT '数量',
`zhuanyididian` varchar(200) DEFAULT NULL COMMENT '转移地点',
`zhuanyishijian` date DEFAULT NULL COMMENT '转移时间',
`yuangonggonghao` varchar(200) DEFAULT NULL COMMENT '员工工号',
`yuangongxingming` varchar(200) DEFAULT NULL COMMENT '员工姓名',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `zhuanyibianhao` (`zhuanyibianhao`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1682224928778 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='库存转移'
设计亮点深度分析:
数据唯一性保障
zhuanyibianhao字段设置唯一索引,确保每次库存转移操作都有唯一标识,防止数据重复录入- 采用雪花算法生成分布式ID,避免单点故障和ID冲突
时间维度精细化设计
addtime记录系统创建时间,用于操作审计和系统监控zhuanyishijian记录实际业务发生时间,满足不同业务场景的时间查询需求
数据完整性与关联性
- 通过
yuangonggonghao和yuangongxingming双字段记录操作人员,既便于关联查询又保证数据冗余备份 - 采用外键约束确保员工信息的引用完整性
- 通过
存储性能优化
- 采用
ROW_FORMAT=DYNAMIC格式,优化可变长度行的存储效率 - 使用UTF8字符集支持多语言环境,确保药品名称国际化的兼容性
- 采用
购买订单表的事务一致性设计
goumaidingdan表的设计充分考虑了电商场景下的数据一致性需求和业务扩展性:
CREATE TABLE `goumaidingdan` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`addtime` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '创建时间',
`dingdanbianhao` varchar(200) DEFAULT NULL COMMENT '订单编号',
`yaopinmingcheng` varchar(200) DEFAULT NULL COMMENT '药品名称',
`yaopinfenlei` varchar(200) DEFAULT NULL COMMENT '药品分类',
`jixing` varchar(200) DEFAULT NULL COMMENT '剂型',
`shuliang` int(11) DEFAULT NULL COMMENT '数量',
`jiage` int(11) DEFAULT NULL COMMENT '价格',
`zongjiage` int(11) DEFAULT NULL COMMENT '总价格',
`xiadanshijian` date DEFAULT NULL COMMENT '下单时间',
`yonghuzhanghao` varchar(200) DEFAULT NULL COMMENT '用户账号',
`yonghuxingming` varchar(200) DEFAULT NULL COMMENT '用户姓名',
`yuangonggonghao` varchar(200) DEFAULT NULL COMMENT '员工工号',
`yuangongxingming` varchar(200) DEFAULT NULL COMMENT '员工姓名',
`ispay` varchar(200) DEFAULT '未支付' COMMENT '是否支付',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `dingdanbianhao` (`dingdanbianhao`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1686672013019 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC COMMENT='购买订单'
业务逻辑深度设计:
价格计算策略
- 独立存储
jiage(单价)和zongjiage(总价),避免实时计算带来的性能开销 - 支持价格历史追溯,便于后续审计和价格变动分析
- 独立存储
订单状态机设计
ispay字段默认值为'未支付',通过状态机模式管理订单生命周期- 支持订单状态的幂等性操作,防止重复状态变更
多方关联记录机制
- 同时记录用户信息和员工信息,便于后续的售后追踪和绩效统计
- 采用软关联设计,支持用户信息变更时的历史数据保持

核心功能实现
1. 通用数据查询接口设计
系统通过通用控制器实现灵活的数据查询,采用策略模式减少重复代码编写,提高代码复用性:
@RequestMapping("/option/{tableName}/{columnName}")
@IgnoreAuth
public R getOption(@PathVariable("tableName") String tableName,
@PathVariable("columnName") String columnName,
@RequestParam(required = false) String conditionColumn,
@RequestParam(required = false) String conditionValue,
String level, String parent) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("table", tableName);
params.put("column", columnName);
// 多级联动查询支持
if(StringUtils.isNotBlank(level)) {
params.put("level", level);
}
if(StringUtils.isNotBlank(parent)) {
params.put("parent", parent);
}
// 条件查询支持
if(StringUtils.isNotBlank(conditionColumn)) {
params.put("conditionColumn", conditionColumn);
}
if(StringUtils.isNotBlank(conditionValue)) {
params.put("conditionValue", conditionValue);
}
List<String> data = commonService.getOption(params);
return R.ok().put("data", data);
}
接口设计优势:
- 支持多条件组合查询,满足复杂业务场景需求
- 提供层级数据获取能力,支持前端级联选择器
- 统一的异常处理机制,保证接口稳定性
2. 药品信息管理模块
药品信息管理采用完整的CRUD操作,结合数据验证和业务规则校验,确保数据准确性和业务合规性:
@RestController
@RequestMapping("/yaopin")
public class YaopinController {
@Autowired
private YaopinService yaopinService;
/**
* 分页查询药品信息
*/
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params) {
PageUtils page = yaopinService.queryPage(params);
return R.ok().put("page", page);
}
/**
* 保存药品信息
*/
@RequestMapping("/save")
public R save(@RequestBody YaopinEntity yaopin) {
// 数据验证逻辑
ValidatorUtils.validateEntity(yaopin);
// 业务规则校验
if(yaopinService.existsByYaopinBianhao(yaopin.getYaopinbianhao())) {
return R.error("药品编号已存在");
}
yaopinService.save(yaopin);
return R.ok();
}
}
模块特色功能:
- 支持药品图片上传和预览功能
- 实现药品批次管理和有效期追踪
- 提供库存预警和缺货提醒机制
- 支持药品分类多级管理
该药品进销存管理平台通过合理的架构设计和精细的业务实现,为医药流通企业提供了完整的数字化解决方案,有效提升了药品管理的效率和准确性。