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

JavaJavaScriptMavenHTMLCSSSSM框架MySQL
2026-02-0910 浏览

文章摘要

本系统是基于SSM(Spring+SpringMVC+MyBatis)框架构建的仓库进销存一体化管理解决方案,旨在解决中小型企业库存数据不透明、业务流转效率低下、销售决策缺乏数据支撑等核心痛点。系统通过整合库存管理、入库出库流程、销售数据分析三大模块,将分散的仓储信息与销售业务串联,实现库存状态实时...

在企业数字化转型的浪潮中,仓储与供应链管理的信息化升级已成为提升企业核心竞争力的关键环节。传统的手工记账或零散的系统无法满足现代企业对库存准确性、业务流程效率和数据分析实时性的高要求。针对这一市场需求,我们设计并实现了一套企业级智能仓储管理平台,该平台深度融合了库存管理、采购销售、财务核算等核心业务,为企业提供一体化的进销存解决方案。

系统架构与技术栈

该平台采用经典的SSM(Spring + SpringMVC + MyBatis)三层架构,结合Maven进行项目依赖管理,前端使用HTML、CSS和JavaScript构建用户界面,数据库选用稳定可靠的MySQL。

技术架构层次分明:

  • 表现层:SpringMVC框架采用前端控制器模式,通过注解驱动简化控制器开发,统一处理HTTP请求和响应
  • 业务逻辑层:Spring框架负责依赖注入和事务管理,通过AOP机制实现日志记录、权限验证等横切关注点
  • 数据持久层:MyBatis作为ORM框架,通过XML映射文件灵活配置SQL语句,支持动态SQL实现复杂查询
// SpringMVC控制器示例 - 登录认证模块
@Controller
public class AdminController {
    @Resource
    private EmployeeDAO empDao;
    
    @RequestMapping(value="/login",method={RequestMethod.POST})
    public String login(String empNo,String password,HttpServletRequest request){
        if(StringUtils.isBlank(empNo)||StringUtils.isBlank(password)){
            request.setAttribute("errorInfo", "用户名密码不能为空");
            return "jsp/login";
        }
        Employee emp=new Employee();
        emp.setEmpNo(empNo);
        emp.setPassword(password);
        emp=empDao.login(emp);
        if(emp==null){
            request.setAttribute("errorInfo", "用户名密码错误");
            return "jsp/login";
        }
        WebUtils.setCurrentEmployee(emp, request.getSession());
        return "redirect:/index.htm";
    }
}

数据库设计亮点

数据库设计是系统稳定性的基石,本系统包含28张业务表,涵盖了从基础数据到业务流转的全流程。以下重点分析几个核心表的设计亮点:

采购订单表(in_purchase_order)设计分析

CREATE TABLE `in_purchase_order` (
  `purchaseOrderNo` varchar(255) NOT NULL COMMENT '采购订单号',
  `customerId` int(255) DEFAULT NULL COMMENT '客户ID',
  `deliverDate` datetime DEFAULT NULL COMMENT '交货日期',
  `currencyType` varchar(255) DEFAULT NULL COMMENT '货币类型',
  `purchasePerson` varchar(255) DEFAULT NULL COMMENT '采购员',
  `address` varchar(255) DEFAULT NULL COMMENT '交货地址',
  `operater` varchar(20) DEFAULT NULL COMMENT '操作员',
  `reviewer` varchar(20) DEFAULT NULL COMMENT '审核员',
  `status` int(11) DEFAULT NULL COMMENT '状态',
  `amount` decimal(10,2) DEFAULT NULL COMMENT '金额',
  `purchasePlanNo` varchar(255) DEFAULT NULL COMMENT '采购计划单号',
  `createTime` datetime DEFAULT NULL COMMENT '创建时间',
  `updateTime` timestamp NULL DEFAULT NULL ON UPDATE current_timestamp() COMMENT '更新时间',
  PRIMARY KEY (`purchaseOrderNo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='采购订单表'

设计亮点:

  1. 主键选择:采用业务意义的purchaseOrderNo作为主键,便于业务查询和关联
  2. 金额精度amount字段使用decimal(10,2)类型,确保财务计算的精确性
  3. 时间戳管理updateTime字段设置自动更新,便于数据变更追踪
  4. 状态字段status字段使用整型,通过代码枚举管理订单生命周期状态

出库明细表(in_out_store_item)设计优化

CREATE TABLE `in_out_store_item` (
  `outStoreItemId` int(11) NOT NULL AUTO_INCREMENT COMMENT '出库明细ID',
  `productId` int(11) DEFAULT NULL COMMENT '产品ID',
  `storeId` int(11) DEFAULT NULL COMMENT '仓库ID',
  `num` int(11) DEFAULT NULL COMMENT '数量',
  `outStoreNo` varchar(20) DEFAULT NULL COMMENT '出库单号',
  PRIMARY KEY (`outStoreItemId`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='出库明细表'

优化策略:

  1. 自增主键:采用代理主键outStoreItemId,提高插入性能并简化关联操作
  2. 索引设计:在实际应用中应为productIdstoreIdoutStoreNo建立复合索引,优化查询性能
  3. 数量控制num字段可增加CHECK约束确保非负值,保证业务逻辑正确性

出库管理

核心功能实现

1. 库存管理模块

库存管理是系统的核心功能,实现了多仓库、多批次的精细化管理。通过实时库存监控、安全库存预警、库存周转分析等功能,帮助企业降低库存成本。

// 库存服务接口定义
public interface InventoryService {
    /**
     * 更新库存数量
     * @param productId 产品ID
     * @param storeId 仓库ID  
     * @param changeAmount 变化数量(正数表示入库,负数表示出库)
     * @return 更新后的库存数量
     */
    int updateInventory(int productId, int storeId, int changeAmount);
    
    /**
     * 检查库存是否充足
     * @param productId 产品ID
     * @param requiredAmount 需求数量
     * @return 库存充足返回true,否则返回false
     */
    boolean checkInventorySufficient(int productId, int requiredAmount);
    
    /**
     * 获取库存周转率报表
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 周转率数据列表
     */
    List<InventoryTurnover> getTurnoverReport(Date startDate, Date endDate);
}

产品管理

2. 采购销售一体化流程

系统实现了从采购计划→采购订单→入库管理→销售订单→出库管理的完整业务流程,确保数据流转的连贯性和准确性。

// 采购订单业务逻辑实现
@Service
@Transactional
public class PurchaseOrderServiceImpl implements PurchaseOrderService {
    
    @Autowired
    private PurchaseOrderMapper purchaseOrderMapper;
    
    @Autowired
    private InventoryService inventoryService;
    
    @Override
    public boolean createPurchaseOrder(PurchaseOrder order, List<PurchaseOrderItem> items) {
        // 1. 验证数据完整性
        if (order == null || items == null || items.isEmpty()) {
            throw new BusinessException("采购订单数据不完整");
        }
        
        // 2. 生成订单号
        String orderNo = generateOrderNo();
        order.setPurchaseOrderNo(orderNo);
        order.setCreateTime(new Date());
        order.setStatus(OrderStatus.PENDING_APPROVAL);
        
        // 3. 计算总金额
        BigDecimal totalAmount = calculateTotalAmount(items);
        order.setAmount(totalAmount);
        
        // 4. 保存订单主表和明细
        purchaseOrderMapper.insert(order);
        for (PurchaseOrderItem item : items) {
            item.setPurchaseOrderNo(orderNo);
            purchaseOrderMapper.insertItem(item);
        }
        
        return true;
    }
    
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean approvePurchaseOrder(String orderNo, String reviewer) {
        // 事务性操作:审核通过后自动生成入库任务
        PurchaseOrder order = purchaseOrderMapper.selectByNo(orderNo);
        if (order == null) {
            throw new BusinessException("采购订单不存在");
        }
        
        // 更新订单状态
        order.setStatus(OrderStatus.APPROVED);
        order.setReviewer(reviewer);
        order.setReviewDate(new Date());
        purchaseOrderMapper.update(order);
        
        // 生成入库计划
        generateInStorePlan(orderNo);
        
        return true;
    }
}

采购订单管理

3. 财务收款管理

收款管理模块实现了多类型收款(销售订单收款、采购退货收款)的统一处理,支持部分收款、延期收款等复杂场景。

-- 收款表结构支持多种业务场景
CREATE TABLE `in_receipt` (
  `receiptNo` varchar(255) NOT NULL,
  `receiptMaxDate` datetime NOT NULL COMMENT '收款期限',
  `customerId` int(11) NOT NULL,
  `amount` decimal(10,2) NOT NULL,
  `readyAmount` decimal(10,2) DEFAULT NULL,
  `operater` varchar(20) NOT NULL,
  `reviewer` varchar(20) DEFAULT NULL,
  `status` int(11) NOT NULL,
  `receiptType` int(11) NOT NULL COMMENT '1出售订单收款2采购退货收款',
  `remarks` varchar(255) DEFAULT NULL,
  `createTime` datetime NOT NULL,
  `updateTime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE current_timestamp(),
  PRIMARY KEY (`receiptNo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci
// 收款业务服务类
@Service
public class ReceiptServiceImpl implements ReceiptService {
    
    @Autowired
    private ReceiptMapper receiptMapper;
    
    @Autowired
    private CustomerMapper customerMapper;
    
    @Override
    public Receipt createReceipt(Receipt receipt) {
        // 验证客户信息
        Customer customer = customerMapper.selectById(receipt.getCustomerId());
        if (customer == null || customer.getStatus() != 1) {
            throw new BusinessException("客户状态异常,无法创建收款单");
        }
        
        // 设置默认值
        if (receipt.getReadyAmount() == null) {
            receipt.setReadyAmount(BigDecimal.ZERO);
        }
        
        receipt.setCreateTime(new Date());
        receipt.setStatus(ReceiptStatus.PENDING);
        
        receiptMapper.insert(receipt);
        return receipt;
    }
    
    @Override
    @Transactional
    public boolean processPartialPayment(String receiptNo, BigDecimal paymentAmount) {
        Receipt receipt = receiptMapper.selectByNo(receiptNo);
        if (receipt == null) {
            throw new BusinessException("收款单不存在");
        }
        
        // 更新已收金额
        BigDecimal newReadyAmount = receipt.getReadyAmount().add(paymentAmount);
        receipt.setReadyAmount(newReadyAmount);
        
        // 检查是否完成收款
        if (newReadyAmount.compareTo(receipt.getAmount()) >= 0) {
            receipt.setStatus(ReceiptStatus.COMPLETED);
        }
        
        receiptMapper.update(receipt);
        
        // 记录收款流水
        createPaymentRecord(receiptNo, paymentAmount);
        
        return true;
    }
}

收款管理

4. 报价单管理

报价单模块支持多产品、多价格的灵活配置,为销售决策提供数据支持。

// 报价单实体关系映射
public class Quote {
    private Integer quoteId;
    private String quoteNo;
    private Integer customerId;
    private Date quoteDate;
    private Date expireDate;
    private BigDecimal totalAmount;
    private Integer status;
    private List<QuoteItem> items;
    
    // 计算总金额的方法
    public void calculateTotal() {
        if (items != null && !items.isEmpty()) {
            this.totalAmount = items.stream()
                .map(item -> item.getPrice().multiply(BigDecimal.valueOf(item.getNum())))
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        }
    }
}

// MyBatis映射文件配置
```xml
<!-- 报价单明细查询映射 -->
<select id="selectQuoteWithItems" resultMap="quoteResultMap">
    SELECT q.*, qi.* 
    FROM in_quote q 
    LEFT JOIN in_quote_item qi ON q.quoteId = qi.quoteId 
    WHERE q.quoteId = #{quoteId}
</select>

<resultMap id="quoteResultMap" type="com.edu.inventory.entity.Quote">
    <id property="quoteId" column="quoteId"/>
    <result property="quoteNo" column="quoteNo"/>
    <result property="customerId" column="customerId"/>
    <result property="quoteDate" column="quoteDate"/>
    <result property="expireDate" column="expireDate"/>
    <result property="totalAmount" column="totalAmount"/>
    <result property="status" column="status"/>
    <collection property="items" ofType="com.edu.inventory.entity.QuoteItem">
        <id property="quoteItemId" column="quoteItemId"/>
        <result property="productId" column="productId"/>
        <result property="price" column="price"/>
        <result property="num" column="num"/>
    </collection>
</resultMap>

实体模型设计

系统采用面向对象的设计思想,通过实体类精确映射业务概念。以下以客户实体为例展示模型设计的完整性:

package com.edu.inventory.entity;

import java.util.Date;

/**
 * 客户实体类
 */
public class Customer {
    private Integer customerid;
    private String name;          // 客户名称
    private String contactman;    // 客户联系人
    private String position;      // 职务
    private String address;       // 地址
    private String tel;           // 联系电话
    private String depositbank;   // 开户银行
    private String bankaccount;   // 账号
    private String taxnum;        // 税号
    private String website;       // 官网
    private String email;         // 邮箱
    private String remarks;
    private Integer status;       // 状态1正常使用2暂停
    private Date createtime;
    private Date updatetime;

    // Getter和Setter方法
    public Integer getCustomerid() {
        return customerid;
    }

    public void setCustomerid(Integer customerid) {
        this.customerid = customerid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name == null ? null : name.trim();
    }
    
    // 其他getter/setter方法...
    
    /**
     * 客户状态验证
     * @return 客户是否可用
     */
    public boolean isActive() {
        return status != null && status == 1;
    }
    
    /**
     * 客户信息完整性验证
     * @return 信息是否完整
     */
    public boolean validate() {
        return name != null && !name.trim().isEmpty() 
            && contactman != null && !contactman.trim().isEmpty()
            && tel != null && !tel.trim().isEmpty();
    }
}

客户信息管理

功能展望与优化

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

1. 引入Redis缓存提升性能

实现思路:将频繁访问但更新不频繁的数据(如产品分类、客户基本信息、仓库信息等)缓存到Redis中,减少数据库访问压力。

// 缓存配置示例
@Configuration
@EnableCaching
public class RedisConfig {
    
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        return template;
    }
}

@Service
public class ProductService {
    
    @Autowired
    private ProductMapper productMapper;
    
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    @Cacheable(value = "products", key = "#productId")
    public Product getProductById(Integer productId) {
        return productMapper.selectById(productId);
    }
    
    @CacheEvict(value = "products", key = "#product.productId")
    public void updateProduct(Product product) {
        productMapper.update(product);
    }
}

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

实现思路:使用RabbitMQ或Kafka处理耗时操作,如库存同步、报表生成、邮件通知等,提升系统响应速度。

3. 微服务架构改造

实现思路:将单体应用拆分为库存服务、订单服务、用户服务、报表服务等微服务,通过Spring Cloud实现服务治理。

4. 移动端适配与PWA支持

实现思路:开发响应式前端界面,支持PWA(渐进式Web应用),使系统在移动设备上有更好的使用体验。

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

实现思路:集成大数据分析平台,实现销售预测、库存优化建议、客户行为分析等智能功能。

总结

该企业级智能仓储管理平台通过SSM框架的稳健架构,实现了仓储管理、进销存业务、财务核算的全流程数字化。系统在设计上注重业务逻辑的完整性和数据的一致性,在技术实现上充分利用了Spring的IoC和AOP特性、MyBatis的灵活SQL映射能力。数据库设计合理,表结构清晰,为系统的扩展性和维护性奠定了良好基础。

未来的优化方向主要集中在性能提升、架构演进和智能分析等方面,通过引入现代技术栈和架构模式,可以进一步提升系统的竞争力和用户体验。该系统为中小型企业提供了可靠的数字化管理工具,有助于提升运营效率和数据驱动决策能力。

本文关键词
SSM框架仓库进销存管理系统源码解析企业数字化转型仓储管理

上下篇

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