基于SSM框架的药品进销存信息管理系统 - 源码深度解析

JavaJavaScriptHTMLCSSSSM框架MySQL
2026-02-0745 浏览

文章摘要

本系统是针对医药流通企业设计的药品进销存一体化管理平台,旨在解决传统人工记录方式效率低下、数据易出错、库存状态不透明等核心业务痛点。系统通过药品全生命周期管理,实现了从采购入库、销售出库到库存盘点的数字化闭环,有效帮助企业精准控制库存成本、减少资金占用,并确保药品信息可追溯,满足医药行业对数据准确性...

基于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='药品表'

设计亮点分析:

  1. 国际化支持cNameeName字段支持中英文药品名称,满足国际化业务需求
  2. 价格追踪机制:通过price(当前价格)和oldPrice(历史价格)实现价格变动追踪
  3. 药品安全管控productDate(生产日期)和safeDate(保质期)确保药品有效期管理
  4. 查询性能优化:为typeIdcName字段建立索引,显著提升分类查询和名称搜索效率

销售订单表(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框架的有机整合,实现了医药行业进销存管理的全面数字化。系统不仅解决了传统管理方式的痛点,更通过智能预警、事务保障等技术创新,为医药企业提供了可靠、高效的管理工具。源码设计体现了良好的软件工程实践,具有较高的学习参考价值和技术示范意义。

本文关键词
SSM框架药品进销存系统源码解析医药供应链管理MyBatis持久层

上下篇

上一篇
没有更多文章
下一篇
没有更多文章