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

JavaJavaScriptMavenHTMLCSSSSM框架MySQL
2026-02-098 浏览

文章摘要

本项目是基于SSM(Spring+SpringMVC+MyBatis)框架开发的药品进销存管理系统,旨在为中小型药店、诊所或医药流通企业提供一体化的药品信息与库存管理解决方案。系统核心解决了传统人工记录方式下药品信息更新滞后、库存数据不准确、出入库流程繁琐等痛点,通过数字化管理有效避免药品过期损耗、...

在医药流通领域,高效的库存管理直接关系到企业的运营成本和服务质量。传统人工记录方式存在数据更新滞后、库存不准、流程繁琐等痛点,尤其对中小型药店和诊所而言,药品过期损耗、缺货积压风险难以有效控制。为此,我们设计开发了这套医药流通智能管理平台,通过数字化手段实现药品从采购到销售的全流程精细化管控。

系统架构与技术栈

平台采用经典的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_idmedicine_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_1u_by_2u_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框架的有机结合,构建了稳定可靠的药品进销存管理系统。数据库设计充分考虑了业务关联性和扩展需求,核心功能实现了药品从采购、入库、销售到库存管理的全流程覆盖。控制层的精心设计确保了业务逻辑的清晰分离,服务层的事务管理保障了数据一致性。

系统的优势在于其成熟的技术栈选择、合理的架构设计以及完善的业务功能覆盖。特别是在库存同步、权限管理、数据审计等关键环节的处理上,体现了企业级应用的专业性。未来通过引入缓存、消息队列、微服务等现代化技术手段,可以进一步提升系统的性能、可扩展性和用户体验。

该平台为中小型医药流通企业提供了完整的数字化解决方案,有效解决了传统管理方式的痛点,为行业数字化转型提供了可靠的技术支撑。随着后续功能的不断完善和技术架构的持续优化,平台将在医药流通领域发挥更大的价值。

本文关键词
药品进销存管理系统SSM框架源码解析数据库设计医药流通

上下篇

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