在医药流通领域,高效的库存管理直接关系到企业的运营成本和服务质量。传统人工记录方式存在数据更新滞后、库存不准、流程繁琐等痛点,尤其对中小型药店和诊所而言,药品过期损耗、缺货积压风险难以有效控制。为此,我们设计开发了这套医药流通智能管理平台,通过数字化手段实现药品从采购到销售的全流程精细化管控。
系统架构与技术栈
平台采用经典的SSM(Spring+SpringMVC+MyBatis)框架组合,构建了清晰的三层架构体系。表现层基于SpringMVC框架,通过注解驱动控制器实现灵活的请求映射;业务层依托Spring IoC容器统一管理服务组件,利用声明式事务确保药品出入库等核心操作的原子性;数据持久层采用MyBatis框架,通过XML配置实现SQL映射,结合PageHelper插件优化分页查询性能。
技术选型上,后端使用Java 8作为开发语言,Maven进行依赖管理,MySQL 5.7作为数据存储。前端采用HTML+CSS+JavaScript传统三件套,配合Bootstrap框架保证界面的一致性和响应式体验。整个项目遵循MVC设计模式,确保了代码的可维护性和扩展性。
数据库设计亮点
订单管理表的关联设计
CREATE TABLE `t_ordermanage` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`t_code` varchar(255) DEFAULT NULL COMMENT '销售编号',
`t_num` int(11) DEFAULT NULL COMMENT '销售数量',
`t_time` varchar(255) DEFAULT NULL COMMENT '销售时间',
`t_xprice` double DEFAULT NULL COMMENT '销售单价',
`t_tel` varchar(255) DEFAULT NULL COMMENT '联系电话',
`t_bz` longtext DEFAULT NULL COMMENT '备注',
`addTime` datetime DEFAULT NULL COMMENT '插入数据库时间',
`user_id` int(11) DEFAULT NULL COMMENT '对应User表的ID,在这里作为外键',
`medicine_id` int(11) DEFAULT NULL COMMENT '对应Medicine表的ID,在这里作为外键',
PRIMARY KEY (`id`),
KEY `FKA79AD6E8AFC3CB84` (`medicine_id`),
KEY `FKA79AD6E82D852AE4` (`user_id`),
CONSTRAINT `FKA79AD6E82D852AE4` FOREIGN KEY (`user_id`) REFERENCES `t_user` (`id`),
CONSTRAINT `FKA79AD6E8AFC3CB84` FOREIGN KEY (`medicine_id`) REFERENCES `t_medicine` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单管理表'
该表设计体现了良好的规范化思想。通过user_id和medicine_id两个外键字段,分别关联用户表和药品表,建立了完整的销售业务链条。索引的创建优化了查询性能,而外键约束确保了数据的引用完整性。t_code字段采用varchar类型存储销售编号,支持灵活的编码规则;t_xprice使用double类型精确记录销售单价,满足财务核算需求。
用户表的扩展性设计
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`u_username` varchar(255) DEFAULT NULL COMMENT '用户名',
`u_password` varchar(255) DEFAULT NULL COMMENT '密码',
`u_name` varchar(255) DEFAULT NULL COMMENT '姓名',
`u_birthday` varchar(255) DEFAULT NULL COMMENT '生日',
`u_sex` varchar(255) DEFAULT NULL COMMENT '性别',
`u_tel` varchar(255) DEFAULT NULL COMMENT '电话',
`u_qq` varchar(255) DEFAULT NULL COMMENT 'QQ',
`u_phone` varchar(255) DEFAULT NULL COMMENT '手机',
`u_jg` varchar(255) DEFAULT NULL COMMENT '机构',
`u_address` varchar(255) DEFAULT NULL COMMENT '地址',
`u_bm` varchar(255) DEFAULT NULL COMMENT '部门',
`u_type` varchar(255) DEFAULT NULL COMMENT '类型',
`u_by_1` int(11) DEFAULT NULL COMMENT '自定义1',
`u_by_2` varchar(255) DEFAULT NULL COMMENT '自定义2',
`u_by_3` varchar(255) DEFAULT NULL COMMENT '自定义3',
`u_bz` varchar(255) DEFAULT NULL COMMENT '备注',
`u_photo` varchar(255) DEFAULT NULL COMMENT '照片',
`u_percent` varchar(255) DEFAULT NULL COMMENT '比例',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表'
用户表设计充分考虑了系统未来的扩展需求。除了基本的人员信息字段外,特意预留了u_by_1、u_by_2、u_by_3三个自定义字段,为后续业务扩展提供了灵活性。u_type字段用于区分用户角色(管理员、采购员、销售员等),实现基于角色的权限控制。u_photo字段存储用户头像路径,增强系统个性化体验。

核心功能实现
出库管理控制器的设计
@Controller
@RequestMapping(value = "Chuku")
public class ChukuController {
@Autowired
private ChukuService chukuService;
@Autowired
private UserService userService;
@Autowired
private OrderManageService orderManageService;
@Autowired
private MedicineService medicineService;
@RequestMapping(value = "/initPage.do")
public String initPage(HttpServletRequest request, Model model) {
List<User> listUser = new ArrayList<>();
int id = Integer.parseInt(String.valueOf(request.getSession().getAttribute("user_id")));
User user = userService.getById(id);
listUser.add(user);
model.addAttribute("listUser", listUser);
List<OrderManage> listOrderManage = orderManageService.getList(null, null);
model.addAttribute("listOrderManage", listOrderManage);
List<Medicine> listMedicine = medicineService.getList(null, null);
model.addAttribute("listMedicine", listMedicine);
return "Chuku/saveOrUpdate";
}
}
出库控制器采用SpringMVC的注解驱动模式,@RequestMapping定义了统一的访问路径,@Autowired实现了依赖的自动注入。initPage方法在出库操作初始化时加载相关数据:从会话中获取当前用户ID,查询用户信息;获取所有订单和药品数据,为出库单填写提供基础数据支持。
订单管理与库存联动
@Service
public class OrderManageServiceImpl implements OrderManageService {
@Autowired
private OrderManageMapper orderManageMapper;
@Autowired
private MedicineMapper medicineMapper;
@Transactional
public void saveOrder(OrderManage order) {
// 保存订单记录
orderManageMapper.insert(order);
// 同步更新药品库存
Medicine medicine = medicineMapper.selectById(order.getMedicineId());
medicine.setStock(medicine.getStock() - order.getTNum());
medicineMapper.updateById(medicine);
}
}
订单服务采用声明式事务管理,确保订单创建与库存更新的原子性。当新增销售订单时,系统自动扣减相应药品的库存数量,避免超卖情况发生。这种设计保证了数据的一致性,是进销存系统的核心逻辑之一。

药品类型分类管理
CREATE TABLE `t_medicinetype` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`t_mtype` varchar(255) DEFAULT NULL COMMENT '类型',
`t_bz` longtext DEFAULT NULL COMMENT '备注',
`addTime` datetime DEFAULT NULL COMMENT '插入数据库时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='药品类型表'
药品类型表采用简单的树形结构设计,支持药品的多级分类。t_mtype字段存储类型名称,t_bz字段提供详细的分类说明,addTime记录创建时间便于审计追踪。这种设计使得药品可以按药理作用、剂型、管理类别等多个维度进行分类管理。

仓库管理模块
@RestController
@RequestMapping("/api/warehouse")
public class WarehouseController {
@PostMapping("/allocate")
public ResponseEntity<?> allocateStock(@RequestBody AllocationRequest request) {
try {
warehouseService.allocateStock(request);
return ResponseEntity.ok("库存分配成功");
} catch (InsufficientStockException e) {
return ResponseEntity.badRequest().body("库存不足");
}
}
}
仓库管理提供RESTful API接口,支持库存分配、调拨等操作。采用异常处理机制应对库存不足等业务异常,返回恰当的HTTP状态码和错误信息,便于前端统一处理。

实体模型设计
系统采用贫血模型设计,实体类主要承担数据载体功能。以用户实体为例:
public class User {
private Integer id;
private String uUsername;
private String uPassword;
private String uName;
private String uBirthday;
private String uSex;
private String uTel;
private String uQq;
private String uPhone;
private String uJg;
private String uAddress;
private String uBm;
private String uType;
private Integer uBy1;
private String uBy2;
private String uBy3;
private String uBz;
private String uPhoto;
private String uPercent;
// getter和setter方法
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
public String getUUsername() { return uUsername; }
public void setUUsername(String uUsername) { this.uUsername = uUsername; }
// 其他getter/setter方法...
}
实体类与数据库表字段一一对应,采用JavaBean规范,便于MyBatis进行ORM映射。字段命名与数据库列名保持一致性,通过简单的转换规则(如u_username对应`uUsername)实现自动映射。
功能展望与优化
1. 引入Redis缓存提升性能
当前系统频繁查询药品信息、用户数据等基础信息,可以考虑引入Redis作为缓存层。将热点数据如药品目录、用户权限信息缓存到Redis中,显著减少数据库访问压力。
@Service
public class MedicineServiceWithCache {
@Autowired
private RedisTemplate<String, Medicine> redisTemplate;
@Cacheable(value = "medicines", key = "#id")
public Medicine getById(Integer id) {
// 先查询缓存,缓存不存在再查询数据库
Medicine medicine = redisTemplate.opsForValue().get("medicine:" + id);
if (medicine == null) {
medicine = medicineMapper.selectById(id);
redisTemplate.opsForValue().set("medicine:" + id, medicine, 30, TimeUnit.MINUTES);
}
return medicine;
}
}
2. 增加消息队列实现异步处理
对于库存同步、报表生成等耗时操作,可以引入RabbitMQ或Kafka消息队列,实现异步处理,提升系统响应速度。
@Component
public class InventoryMessageProducer {
@Autowired
private AmqpTemplate rabbitTemplate;
public void sendInventoryUpdate(InventoryUpdateMessage message) {
rabbitTemplate.convertAndSend("inventory.exchange", "inventory.update", message);
}
}
@Component
public class InventoryMessageConsumer {
@RabbitListener(queues = "inventory.queue")
public void processInventoryUpdate(InventoryUpdateMessage message) {
// 异步处理库存更新逻辑
inventoryService.asyncUpdateInventory(message);
}
}
3. 微服务架构改造
随着业务复杂度增加,可以将单体应用拆分为微服务架构:药品服务、订单服务、用户服务、库存服务等。每个服务独立部署,通过Spring Cloud实现服务治理。
# 药品服务配置
spring:
application:
name: medicine-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
# 订单服务配置
spring:
application:
name: order-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
4. 移动端适配与PWA支持
开发响应式前端界面,支持PWA(渐进式Web应用)特性,使系统在移动设备上具备原生应用般的体验。采用Vue.js或React重构前端,提升交互体验。
5. 智能化预警与决策支持
引入机器学习算法,基于历史销售数据预测药品需求,实现智能补货预警。同时构建数据可视化看板,为管理者提供决策支持。
# 需求预测算法示例
from sklearn.ensemble import RandomForestRegressor
import pandas as pd
def predict_demand(sales_data):
model = RandomForestRegressor()
# 训练模型预测未来需求
# 实现智能补货建议
return predicted_demand
总结
医药流通智能管理平台通过SSM框架的有机结合,构建了稳定可靠的药品进销存管理系统。数据库设计充分考虑了业务关联性和扩展需求,核心功能实现了药品从采购、入库、销售到库存管理的全流程覆盖。控制层的精心设计确保了业务逻辑的清晰分离,服务层的事务管理保障了数据一致性。
系统的优势在于其成熟的技术栈选择、合理的架构设计以及完善的业务功能覆盖。特别是在库存同步、权限管理、数据审计等关键环节的处理上,体现了企业级应用的专业性。未来通过引入缓存、消息队列、微服务等现代化技术手段,可以进一步提升系统的性能、可扩展性和用户体验。
该平台为中小型医药流通企业提供了完整的数字化解决方案,有效解决了传统管理方式的痛点,为行业数字化转型提供了可靠的技术支撑。随着后续功能的不断完善和技术架构的持续优化,平台将在医药流通领域发挥更大的价值。