基于SSM框架的商品供应与库存管理系统 - 源码深度解析

JavaJavaScriptHTMLCSSSSM框架MavenThymeleafMySQL
2026-02-0711 浏览

文章摘要

本项目是一款基于SSM(Spring + Spring MVC + MyBatis)框架构建的商品供应与库存管理系统,旨在为中小型商贸或生产企业提供一体化的供应链核心数据管理能力。系统核心业务价值在于打通商品从采购供应到入库、存储再到出库的全链路数据流,解决传统手工记录或Excel表格管理方式带来的...

在现代商业运营中,供应链与库存管理的高效性直接决定了企业的市场竞争力。传统的手工记录或Excel表格管理方式存在数据更新延迟、信息孤岛以及库存盘点不准确等核心痛点,严重制约了中小型企业的运营效率。针对这一市场需求,我们设计并实现了一套基于SSM框架的智能供应链管理平台,该系统为企业提供从商品采购、入库存储到销售出库的全链路数据管理能力。

系统架构与技术栈

该平台采用经典的SSM(Spring + Spring MVC + MyBatis)三层架构,结合Maven进行项目构建管理。前端使用JSP与jQuery实现动态页面渲染和交互,后端采用Spring框架作为核心容器,负责业务层对象依赖管理与事务控制。Spring MVC承担Web层的请求调度与响应处理,通过注解驱动的控制器接收前端请求。数据持久化层由MyBatis实现,利用其动态SQL能力高效完成复杂的数据查询操作。

数据库选用MySQL 5.7,连接池配置采用DBCP2,确保在高并发场景下的稳定性能。系统配置文件展示了完整的技术栈集成方案:

# 数据库连接配置
spring.datasource.url=jdbc:mysql://www.csbishe.cn/boot_gysys?useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=boot_gysys
spring.datasource.password=boot_gysys
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver

# MyBatis配置
mybatis.mapper-locations=classpath:com/learn/dao/*.xml
mybatis.type-aliases-package=com.learn.entity
mybatis.configuration.map-underscore-to-camel-case=true

# 文件上传配置
spring.servlet.multipart.maxFileSize=100MB
spring.servlet.multipart.maxRequestSize=100MB

数据库设计亮点分析

商品信息表的核心设计

商品表(product)作为系统的核心数据载体,其设计体现了业务需求的全面考量:

CREATE TABLE `product` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL COMMENT '名称',
  `type` bigint(20) DEFAULT NULL COMMENT '分类',
  `xh` varchar(255) DEFAULT NULL COMMENT '型号',
  `img` varchar(255) DEFAULT NULL COMMENT '图片',
  `price` double(10,2) DEFAULT NULL COMMENT '进价',
  `sale` double(10,2) DEFAULT NULL COMMENT '卖价',
  `num` double(10,2) DEFAULT NULL COMMENT '库存',
  `gmtTime` datetime DEFAULT NULL COMMENT '添加时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COMMENT='商品信息'

该表设计的亮点在于:

  • 精确的数值处理:使用double(10,2)类型存储价格和库存数量,确保财务计算的精确性
  • 完善的商品属性:包含型号(xh)、图片路径(img)等字段,支持商品信息的完整展示
  • 时间戳管理:gmtTime字段自动记录商品添加时间,便于追溯管理
  • 外键关联设计:type字段关联商品分类表,实现数据的规范化管理

出货记录表的业务逻辑设计

出货记录表(outrecord)的设计充分体现了供应链业务的核心逻辑:

CREATE TABLE `outrecord` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `product` bigint(20) DEFAULT NULL COMMENT '商品',
  `num` double(10,2) DEFAULT NULL COMMENT '出货数量',
  `price` double(10,2) DEFAULT NULL COMMENT '出货成本',
  `sale` double(10,2) DEFAULT NULL COMMENT '出货销售额',
  `gmtTime` datetime DEFAULT NULL COMMENT '添加时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='出货信息'

该表的关键设计特点:

  • 成本与销售分离:分别记录出货成本(price)和销售额(sale),便于毛利计算
  • 实时库存联动:通过product外键关联,确保出货操作实时更新商品库存
  • 事务一致性:结合Spring声明式事务,保证出货记录与库存更新的原子性

权限管理系统的RBAC模型

系统采用标准的RBAC(基于角色的访问控制)模型,通过三张核心表实现精细化的权限管理:

CREATE TABLE `sys_menu` (
  `menu_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `parent_id` bigint(20) DEFAULT NULL COMMENT '父菜单ID',
  `name` varchar(50) DEFAULT NULL COMMENT '菜单名称',
  `url` varchar(200) DEFAULT NULL COMMENT '菜单URL',
  `perms` varchar(500) DEFAULT NULL COMMENT '授权',
  `type` int(11) DEFAULT NULL COMMENT '类型',
  `icon` varchar(50) DEFAULT NULL COMMENT '菜单图标',
  `order_num` int(11) DEFAULT NULL COMMENT '排序',
  PRIMARY KEY (`menu_id`)
) COMMENT='菜单管理'

CREATE TABLE `sys_role_menu` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `role_id` bigint(20) DEFAULT NULL COMMENT '角色ID',
  `menu_id` bigint(20) DEFAULT NULL COMMENT '菜单ID',
  PRIMARY KEY (`id`)
) COMMENT='角色与菜单对应关系'

CREATE TABLE `sys_user_role` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) DEFAULT NULL COMMENT '用户ID',
  `role_id` bigint(20) DEFAULT NULL COMMENT '角色ID',
  PRIMARY KEY (`id`)
) COMMENT='用户与角色对应关系'

这种设计支持灵活的权限分配,管理员可以基于角色配置不同的菜单访问权限。

权限管理界面

核心功能实现深度解析

商品库存管理模块

商品库存管理是系统的核心功能,实现了商品的增删改查、库存调整等操作。实体类设计体现了完整的业务属性:

public class InrecordEntity implements Serializable {
    private static final long serialVersionUID = 1L;
    
    private Long id;
    private Long product;
    private ProductEntity productEntity;
    private Double num;
    private Double price;
    private String remark;
    private Date gmttime = new Date();
    
    // Getter和Setter方法
    public ProductEntity getProductEntity() {
        return productEntity;
    }
    
    public void setProductEntity(ProductEntity productEntity) {
        this.productEntity = productEntity;
    }
    
    public Double getNum() {
        return num;
    }
    
    public void setNum(Double num) {
        this.num = num;
    }
}

库存更新服务采用Spring声明式事务管理,确保数据一致性:

@Service
public class ProductService {
    
    @Autowired
    private ProductMapper productMapper;
    
    @Autowired
    private InrecordMapper inrecordMapper;
    
    @Transactional
    public void updateStock(Long productId, Double quantity) {
        // 更新商品库存
        productMapper.updateStock(productId, quantity);
        
        // 记录库存变更流水
        StockRecord record = new StockRecord();
        record.setProductId(productId);
        record.setChangeQuantity(quantity);
        record.setChangeTime(new Date());
        stockRecordMapper.insert(record);
    }
}

商品管理界面

采购信息管理功能

采购管理模块实现了从采购计划到入库确认的全流程管理。控制器层采用抽象的基类设计,提高代码复用性:

public abstract class AbstractController {
    protected Logger logger = LoggerFactory.getLogger(getClass());
    
    protected SysUserEntity getUser() {
        return ShiroUtils.getUserEntity();
    }

    protected Long getUserId() {
        return getUser().getUserId();
    }
}

@RestController
@RequestMapping("/purchase")
public class PurchaseController extends AbstractController {
    
    @Autowired
    private PurchaseService purchaseService;
    
    @PostMapping("/create")
    public R createPurchase(@RequestBody PurchaseEntity purchase) {
        purchase.setCreateUserId(getUserId());
        purchaseService.createPurchase(purchase);
        return R.ok();
    }
    
    @GetMapping("/list")
    public R getPurchaseList(@RequestParam Map<String, Object> params) {
        PageUtils page = purchaseService.queryPage(params);
        return R.ok().put("page", page);
    }
}

MyBatis的XML映射文件展示了复杂的动态查询能力:

<!-- 采购记录多条件查询 -->
<select id="selectPurchaseList" resultType="com.learn.entity.PurchaseEntity">
    SELECT p.*, s.supplier_name, u.username as create_user_name
    FROM purchase p
    LEFT JOIN supplier s ON p.supplier_id = s.id
    LEFT JOIN sys_user u ON p.create_user_id = u.user_id
    <where>
        <if test="supplierId != null">
            AND p.supplier_id = #{supplierId}
        </if>
        <if test="startDate != null and startDate != ''">
            AND p.create_time >= #{startDate}
        </if>
        <if test="endDate != null and endDate != ''">
            AND p.create_time &lt;= #{endDate}
        </if>
        <if test="status != null">
            AND p.status = #{status}
        </if>
    </where>
    ORDER BY p.create_time DESC
</select>

采购信息管理

出货管理与销售统计

出货管理模块集成了成本计算和销售分析功能,实体类设计包含完整的业务逻辑:

@Entity
@Table(name = "outrecord")
public class OutRecordEntity {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @ManyToOne
    @JoinColumn(name = "product")
    private ProductEntity product;
    
    private Double num;        // 出货数量
    private Double price;      // 出货成本
    private Double sale;       // 出货销售额
    private Date gmtTime;      // 出货时间
    
    // 计算毛利润的方法
    public Double getProfit() {
        return sale - (price * num);
    }
    
    // 计算毛利率的方法
    public Double getProfitMargin() {
        if (sale == 0) return 0.0;
        return ((sale - (price * num)) / sale) * 100;
    }
}

出货服务的业务逻辑确保库存数据的实时更新:

@Service
public class OutRecordService {
    
    @Transactional
    public void processOutRecord(OutRecordEntity outRecord) {
        // 验证库存是否充足
        ProductEntity product = productService.getById(outRecord.getProduct().getId());
        if (product.getNum() < outRecord.getNum()) {
            throw new RuntimeException("库存不足");
        }
        
        // 更新商品库存
        product.setNum(product.getNum() - outRecord.getNum());
        productService.update(product);
        
        // 保存出货记录
        outRecord.setGmtTime(new Date());
        outRecordMapper.insert(outRecord);
        
        // 记录操作日志
        logService.recordOperation("出货", getUserId(), outRecord);
    }
}

出货管理界面

权限控制与安全管理

系统采用Shiro安全框架实现身份认证和权限控制,基础控制器提供统一的用户信息获取:

public abstract class AbstractController {
    protected Logger logger = LoggerFactory.getLogger(getClass());
    
    protected SysUserEntity getUser() {
        return ShiroUtils.getUserEntity();
    }

    protected Long getUserId() {
        return getUser().getUserId();
    }
    
    protected String getUsername() {
        return getUser().getUsername();
    }
}

// 具体的业务控制器继承基类
@Controller
@RequestMapping("/admin")
public class AdminController extends AbstractController {
    
    @RequiresPermissions("sys:user:list")
    @GetMapping("/users")
    public String userManagement(Model model) {
        model.addAttribute("currentUser", getUsername());
        return "admin/user_list";
    }
    
    @RequiresPermissions("sys:role:edit")
    @PostMapping("/role/update")
    @ResponseBody
    public R updateRole(@RequestBody RoleEntity role) {
        role.setUpdateUserId(getUserId());
        roleService.updateRole(role);
        return R.ok("角色更新成功");
    }
}

实体模型设计的精妙之处

系统的实体模型设计体现了面向对象的思想和业务领域的完整性。以进货信息实体为例:

public class InrecordEntity implements Serializable {
    private static final long serialVersionUID = 1L;
    
    private Long id;
    private Long product;
    private ProductEntity productEntity;  // 关联的商品实体
    private Double num;
    private Double price;
    private String remark;
    private Date gmttime = new Date();
    
    // 业务逻辑方法
    public Double getTotalAmount() {
        return num * price;
    }
    
    public boolean isValid() {
        return product != null && num != null && num > 0 && price != null && price >= 0;
    }
    
    // 关联对象的懒加载处理
    public ProductEntity loadProductEntity() {
        if (productEntity == null && product != null) {
            // 从服务层加载关联的商品信息
            productEntity = productService.getById(product);
        }
        return productEntity;
    }
}

这种设计支持对象关系的灵活处理,既保持了数据的完整性,又避免了不必要的关联查询。

功能展望与系统优化方向

基于当前系统架构,未来可以从以下几个方面进行优化和功能扩展:

1. 引入Redis缓存提升性能

@Service
public class ProductServiceWithCache {
    
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    private static final String PRODUCT_CACHE_KEY = "product:";
    private static final long CACHE_EXPIRE_TIME = 30 * 60; // 30分钟
    
    public ProductEntity getProductWithCache(Long productId) {
        String cacheKey = PRODUCT_CACHE_KEY + productId;
        ProductEntity product = (ProductEntity) redisTemplate.opsForValue().get(cacheKey);
        
        if (product == null) {
            product = productMapper.selectById(productId);
            if (product != null) {
                redisTemplate.opsForValue().set(cacheKey, product, CACHE_EXPIRE_TIME, TimeUnit.SECONDS);
            }
        }
        return product;
    }
}

2. 消息队列实现异步处理

对于库存同步、报表生成等耗时操作,可以引入RabbitMQ或Kafka实现异步处理,提升系统响应速度。

3. 微服务架构改造

将单体应用拆分为商品服务、库存服务、订单服务、用户服务等微服务,提高系统的可维护性和扩展性。

4. 移动端适配与PWA支持

开发响应式界面,支持PWA(渐进式Web应用)技术,使系统在移动设备上获得原生应用般的体验。

5. 大数据分析与预测功能

集成数据分析平台,实现销售预测、库存优化建议等智能功能:

@Service
public class SalesForecastService {
    
    public ForecastResult predictSales(Long productId, int days) {
        // 基于历史销售数据进行时间序列分析
        List<SalesData> historyData = salesMapper.getSalesHistory(productId, 365);
        
        // 使用ARIMA或LSTM算法进行预测
        return timeSeriesAnalyzer.forecast(historyData, days);
    }
}

统计分析报表

总结

该智能供应链管理平台通过SSM框架的成熟技术组合,实现了商品供应与库存管理的全面数字化。系统采用分层的架构设计,具有良好的可扩展性和维护性。数据库设计充分考虑了业务需求的复杂性和数据一致性要求,实体模型体现了面向对象的设计思想。

核心功能模块包括商品管理、采购管理、出货管理、权限控制等,每个模块都实现了完整的业务逻辑和数据验证。通过Shiro安全框架实现了细粒度的权限控制,确保系统数据的安全性。

未来的优化方向包括引入缓存机制提升性能、采用微服务架构提高系统弹性、集成智能算法实现业务预测等。这些优化将使系统能够更好地适应企业业务的发展需求,为中小型企业提供更加智能、高效的供应链管理解决方案。

用户管理界面

系统的成功实施将显著提升企业的库存周转率,降低运营成本,为企业的数字化转型提供坚实的技术支撑。

本文关键词
SSM框架商品供应系统库存管理源码解析供应链管理

上下篇

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