基于Java的仓库管理系统设计与实现(一)

1. 需求简介

  1. 用户管理,分为管理员用户,仓库操作员、财务人员
  2. 客户管理,仓库对接的合作商家、例如超市等联系信息
  3. 供应商管理,货物来源供应商基本信息,供应货品类别
  4. 商品类别管理
  5. 商品管理 有价格,从供应商进货价格,卖给超市的价格
  6. 入库管理 从供应商进货
  7. 出库管理 卖给商户
  8. 财务管理 入库总支出,出库总收入,出入库订单数量,出入库商品类别图表
  9. 菜单管理,设置权限
  10. 用户管理,用户基本信息,分配角色(角色决定权限)

1.1 用户管理

  • 管理员用户
    • 职责:拥有系统的最高权限,负责整个系统的全面管理和维护工作。
    • 权限:可以对系统中的所有数据和功能进行操作,包括用户管理(添加、删除、修改用户信息及分配角色)、菜单管理(设置权限)等。对各类业务数据(如客户信息、供应商信息、商品信息等)有增删改查的权限,并且可以审核重要的业务操作(如入库单、出库单的审核)。
  • 仓库操作员
    • 职责:主要负责仓库的日常货物出入库操作以及库存的管理。
    • 权限:可以进行入库管理(录入从供应商进货的信息)和出库管理(记录卖给商户的货物信息)操作。能够查看商品信息、供应商信息和客户信息,但通常没有修改和删除的权限。可以参与库存盘点工作,记录实际库存数量。
  • 财务人员
    • 职责:负责系统的财务管理工作,对出入库的财务数据进行统计和分析。
    • 权限:可以查看入库总支出、出库总收入等财务数据,生成相关的财务报表。能够查看出入库订单数量和出入库商品类别图表,进行财务分析。一般只能查看其他业务数据,不能进行修改操作。

1.2 客户管理

  • 功能描述:管理仓库对接的合作商家(如超市等)的联系信息。
  • 具体信息
    • 客户基本信息:包括客户名称、联系人姓名、联系电话、地址、邮箱等。
    • 合作信息:合作开始时间、合作结束时间。
    • 历史交易记录:记录与该客户的过往交易信息,如交易时间、交易金额、交易商品等,存放在出库明细表,方便查询和分析。

1.3 供应商管理

  • 功能描述:管理货物来源供应商的基本信息和供应货品类别。
  • 具体信息
    • 供应商基本信息:供应商名称、联系人姓名、联系电话、地址、邮箱等。
    • 供应能力信息:最小起订量等。
    • 供应货品类别:记录该供应商所提供的商品类别,方便在采购时进行筛选和选择。

1.4 商品类别管理

  • 功能描述:对商品进行分类管理,方便对商品进行统一管理和统计。
  • 具体操作
    • 商品类别添加:可以新增商品类别,如食品、日用品、电器等,并可以对类别进行多级分类(如食品下可再细分饮料、糕点等)。
    • 商品类别修改和删除:当商品类别信息发生变化时,可以对其进行修改;对于不再使用的商品类别,可以进行删除操作。

1.5 商品管理

  • 功能描述:管理商品的基本信息,包括价格信息(从供应商进货价格和卖给超市的价格)。
  • 具体信息
    • 商品基本信息:商品名称、规格、型号、单位等。
    • 价格信息:记录商品从供应商的进货价格和卖给超市的销售价格,可根据市场情况进行调整。
    • 库存信息:显示商品的当前库存数量、库存位置等。

1.6 入库管理

  • 功能描述:记录从供应商进货的相关信息。
  • 具体操作
    • 入库单录入:仓库操作员在收到货物后,录入入库单信息,包括供应商名称、商品名称、数量、进货价格、入库时间等。
    • 入库审核:管理员对入库单进行审核,审核通过后,库存数量相应增加。

1.7 出库管理

  • 功能描述:记录卖给商户的货物信息。
  • 具体操作
    • 出库单录入:根据销售订单,仓库操作员录入出库单信息,包括客户名称、商品名称、数量、销售价格、出库时间等。
    • 出库审核:管理员对出库单进行审核,审核通过后,库存数量相应减少。

1.8 财务管理

  • 功能描述:对入库总支出、出库总收入等财务数据进行统计和分析。
  • 具体功能
    • 财务统计:统计入库总支出(根据入库单的进货价格和数量计算)、出库总收入(根据出库单的销售价格和数量计算)。
    • 订单数量统计:统计出入库订单的数量,分析业务量的变化趋势。
    • 商品类别图表:生成出入库商品类别的图表,直观展示不同商品类别的销售和采购情况。

1.9 菜单管理

  • 功能描述:设置不同角色的菜单权限,控制用户可以访问的系统功能模块。
  • 具体操作
    • 菜单配置:管理员可以对系统的菜单进行配置,为不同角色分配不同的菜单权限。例如,仓库操作员只能看到入库管理、出库管理等相关菜单,而财务人员主要看到财务管理相关菜单。

1.10 用户管理(补充)

  • 用户基本信息管理:记录用户的基本信息,如用户名、密码、真实姓名、联系电话、邮箱等。
  • 角色分配:管理员可以为用户分配不同的角色(管理员用户、仓库操作员、财务人员),用户的角色决定了其在系统中的权限。
  • 密码管理:用户可以修改自己的密码,以保证账户的安全性。管理员也可以在必要时重置用户密码。

1.11 功能模块:

  • 用户管理:管理员、仓库操作员、财务人员等角色权限管理。
  • 商品管理:商品信息录入、修改、删除、查询。
  • 入库管理:商品入库操作,生成入库单。
  • 出库管理:商品出库操作,生成出库单。
  • 库存管理:库存查询、库存预警、库存盘点。
  • 报表统计:生成入库、出库、库存等报表。
  • 数据可视化:使用ECharts生成库存、销售等图表。
  • 技术栈:Spring Boot、Vue.js、MySQL、ECharts。
  • 后端使用springboot + mysql + mybatis-plus + redis
  • 前端使用vue + element UI + html +css + js

2. 数据库设计

2.1 创建数据表

首先,用户管理部分分为管理员、仓库操作员和财务人员,角色权限是关键。可能需要用户表、角色表。菜单管理也需要权限控制,所以菜单表和角色菜单关联表也是必要的。
接下来是客户管理和供应商管理,这两个都是实体,需要各自的表,记录基本信息以及合作信息。商品类别管理需要支持多级分类,所以商品类别表可能需要自关联的外键来表示层级结构。
商品管理涉及商品的基本信息、价格和库存,这里库存可能与仓库相关,所以需要仓库表,商品库存表可能包含仓库ID和商品ID作为联合主键,记录每个仓库中的库存数量。0
入库和出库管理需要记录单据信息,包括供应商或客户、商品明细,所以入库单和出库单主表,以及对应的明细表是必须的。
库存管理中的预警功能可能需要商品表中有上下限字段,或者单独的表来设置预警阈值。用户提到库存预警,所以可能在商品表中添加库存下限字段,出库时检查库存是否低于下限。
技术栈方面,后端使用Spring Boot + MyBatis-Plus,所以数据库设计要符合ORM框架的惯例,比如使用逻辑删除标志(is_deleted),创建和更新时间字段(gmt_create, gmt_modified)等。
需要注意的约束包括外键约束、唯一性约束(如用户名不能重复),以及字段的非空约束。例如,用户表中的用户名和密码必须非空,角色名称唯一等。
现在需要确保每个表的主键、外键正确,并且考虑到性能,比如频繁查询的字段是否需要索引,比如商品名称、供应商名称等可能需要添加索引。
最后,生成SQL代码时要考虑数据库引擎(如InnoDB)、字符集(utf8mb4)和排序规则,确保支持中文和表情符号。同时,注释每个表和字段的作用,方便后续维护。

总结下来,需要创建以下表:

  • 用户表(sys_user)
  • 角色表(sys_role)
  • 菜单表(sys_menu)
  • 角色菜单关联表(sys_role_menu)
  • 客户表(biz_client)
  • 供应商表(biz_supplier)
  • 商品类别表(biz_category)
  • 商品表(biz_product)
  • 仓库表(biz_warehouse)
  • 商品库存表(biz_inventory)
  • 入库单表(biz_stock_in)
  • 入库明细表(biz_stock_in_item)
  • 出库单表(biz_stock_out)
  • 出库明细表(biz_stock_out_item)
-- 用户管理模块
CREATE TABLE `sys_user` (
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
  `username` VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',
  `password` VARCHAR(100) NOT NULL COMMENT '密码',
  `real_name` VARCHAR(50) COMMENT '真实姓名',
  `phone` VARCHAR(20) COMMENT '联系电话',
  `email` VARCHAR(50) COMMENT '邮箱',
  `role_id` BIGINT NOT NULL COMMENT '角色ID(关联sys_role)',
  `is_deleted` TINYINT DEFAULT 0 COMMENT '逻辑删除标志(0-未删除,1-已删除)',
  `gmt_create` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `gmt_modified` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  INDEX `idx_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

CREATE TABLE `sys_role` (
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '角色ID',
  `role_name` VARCHAR(50) NOT NULL UNIQUE COMMENT '角色名称(管理员、仓库操作员、财务人员)',
  `description` VARCHAR(200) COMMENT '角色描述',
  `is_deleted` TINYINT DEFAULT 0 COMMENT '逻辑删除标志'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色表';

CREATE TABLE `sys_menu` (
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '菜单ID',
  `menu_name` VARCHAR(50) NOT NULL COMMENT '菜单名称',
  `path` VARCHAR(100) COMMENT '前端路由路径',
  `parent_id` BIGINT DEFAULT 0 COMMENT '父菜单ID',
  `icon` VARCHAR(50) COMMENT '菜单图标',
  `order_num` INT DEFAULT 0 COMMENT '排序号'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='菜单表';

CREATE TABLE `sys_role_menu` (
  `role_id` BIGINT NOT NULL COMMENT '角色ID',
  `menu_id` BIGINT NOT NULL COMMENT '菜单ID',
  PRIMARY KEY (`role_id`, `menu_id`),
  FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`id`),
  FOREIGN KEY (`menu_id`) REFERENCES `sys_menu` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色菜单关联表';

-- 客户与供应商管理模块
CREATE TABLE `biz_client` (
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '客户ID',
  `name` VARCHAR(100) NOT NULL COMMENT '客户名称',
  `contact` VARCHAR(50) COMMENT '联系人',
  `phone` VARCHAR(20) COMMENT '联系电话',
  `address` VARCHAR(200) COMMENT '地址',
  `coop_start_date` DATE COMMENT '合作开始时间',
  `coop_end_date` DATE COMMENT '合作结束时间',
  `is_deleted` TINYINT DEFAULT 0 COMMENT '逻辑删除标志'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户表';

CREATE TABLE `biz_supplier` (
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '供应商ID',
  `name` VARCHAR(100) NOT NULL COMMENT '供应商名称',
  `contact` VARCHAR(50) COMMENT '联系人',
  `phone` VARCHAR(20) COMMENT '联系电话',
  `address` VARCHAR(200) COMMENT '地址',
  `min_order` DECIMAL(10,2) COMMENT '最小起订量',
  `supply_category` VARCHAR(100) COMMENT '供应商品类别',
  `is_deleted` TINYINT DEFAULT 0 COMMENT '逻辑删除标志'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='供应商表';

-- 商品与库存管理模块
CREATE TABLE `biz_category` (
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '类别ID',
  `name` VARCHAR(50) NOT NULL COMMENT '类别名称',
  `parent_id` BIGINT DEFAULT 0 COMMENT '父类别ID(0表示根类别)',
  `level` INT DEFAULT 1 COMMENT '分类层级',
  `is_deleted` TINYINT DEFAULT 0 COMMENT '逻辑删除标志',
  FOREIGN KEY (`parent_id`) REFERENCES `biz_category` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品类别表';

CREATE TABLE `biz_product` (
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '商品ID',
  `name` VARCHAR(100) NOT NULL COMMENT '商品名称',
  `category_id` BIGINT NOT NULL COMMENT '类别ID(关联biz_category)',
  `spec` VARCHAR(100) COMMENT '规格',
  `unit` VARCHAR(20) COMMENT '单位',
  `purchase_price` DECIMAL(10,2) NOT NULL COMMENT '进货价',
  `sale_price` DECIMAL(10,2) NOT NULL COMMENT '销售价',
  `min_stock` INT DEFAULT 0 COMMENT '库存下限(预警阈值)',
  `is_deleted` TINYINT DEFAULT 0 COMMENT '逻辑删除标志',
  FOREIGN KEY (`category_id`) REFERENCES `biz_category` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';

CREATE TABLE `biz_warehouse` (
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '仓库ID',
  `name` VARCHAR(100) NOT NULL COMMENT '仓库名称',
  `location` VARCHAR(200) COMMENT '仓库位置',
  `purpose` VARCHAR(100) COMMENT '仓库用途',
  `is_deleted` TINYINT DEFAULT 0 COMMENT '逻辑删除标志'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='仓库表';

CREATE TABLE `biz_inventory` (
  `warehouse_id` BIGINT NOT NULL COMMENT '仓库ID',
  `product_id` BIGINT NOT NULL COMMENT '商品ID',
  `quantity` INT NOT NULL DEFAULT 0 COMMENT '库存数量',
  PRIMARY KEY (`warehouse_id`, `product_id`),
  FOREIGN KEY (`warehouse_id`) REFERENCES `biz_warehouse` (`id`),
  FOREIGN KEY (`product_id`) REFERENCES `biz_product` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品库存表';

-- 出入库管理模块
CREATE TABLE `biz_stock_in` (
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '入库单ID',
  `supplier_id` BIGINT NOT NULL COMMENT '供应商ID',
  `operator_id` BIGINT NOT NULL COMMENT '操作员ID(关联sys_user)',
  `total_amount` DECIMAL(10,2) NOT NULL COMMENT '入库总金额',
  `status` TINYINT DEFAULT 0 COMMENT '状态(0-待审核,1-已审核)',
  `remark` VARCHAR(200) COMMENT '备注',
  `gmt_create` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  FOREIGN KEY (`supplier_id`) REFERENCES `biz_supplier` (`id`),
  FOREIGN KEY (`operator_id`) REFERENCES `sys_user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='入库单表';

CREATE TABLE `biz_stock_in_item` (
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '明细ID',
  `stock_in_id` BIGINT NOT NULL COMMENT '入库单ID',
  `product_id` BIGINT NOT NULL COMMENT '商品ID',
  `quantity` INT NOT NULL COMMENT '数量',
  `price` DECIMAL(10,2) NOT NULL COMMENT '进货单价',
  FOREIGN KEY (`stock_in_id`) REFERENCES `biz_stock_in` (`id`),
  FOREIGN KEY (`product_id`) REFERENCES `biz_product` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='入库明细表';

CREATE TABLE `biz_stock_out` (
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '出库单ID',
  `client_id` BIGINT NOT NULL COMMENT '客户ID',
  `operator_id` BIGINT NOT NULL COMMENT '操作员ID(关联sys_user)',
  `total_amount` DECIMAL(10,2) NOT NULL COMMENT '出库总金额',
  `status` TINYINT DEFAULT 0 COMMENT '状态(0-待审核,1-已审核)',
  `remark` VARCHAR(200) COMMENT '备注',
  `gmt_create` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  FOREIGN KEY (`client_id`) REFERENCES `biz_client` (`id`),
  FOREIGN KEY (`operator_id`) REFERENCES `sys_user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='出库单表';

CREATE TABLE `biz_stock_out_item` (
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '明细ID',
  `stock_out_id` BIGINT NOT NULL COMMENT '出库单ID',
  `product_id` BIGINT NOT NULL COMMENT '商品ID',
  `quantity` INT NOT NULL COMMENT '数量',
  `price` DECIMAL(10,2) NOT NULL COMMENT '销售单价',
  FOREIGN KEY (`stock_out_id`) REFERENCES `biz_stock_out` (`id`),
  FOREIGN KEY (`product_id`) REFERENCES `biz_product` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='出库明细表';

2.2 插入测试数据

-- 1. 插入角色数据
INSERT INTO `sys_role` (`role_name`, `description`) VALUES
('管理员', '系统管理员,拥有所有权限'),
('仓库操作员', '负责出入库操作'),
('财务人员', '负责财务统计');

-- 2. 插入用户数据(密码均为 123456 的 BCrypt 加密值)
INSERT INTO `sys_user` (`username`, `password`, `real_name`, `role_id`) VALUES
('admin', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.QL33GZ6K3cD5tiX7pnZ7lqO', '张三', 1), -- 角色ID=1(管理员)
('operator1', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.QL33GZ6K3cD5tiX7pnZ7lqO', '李四', 2), -- 角色ID=2(仓库操作员)
('finance1', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.QL33GZ6K3cD5tiX7pnZ7lqO', '王五', 3); -- 角色ID=3(财务人员)

-- 3. 插入客户数据
INSERT INTO `biz_client` (`name`, `contact`, `phone`, `address`, `coop_start_date`) VALUES
('沃尔玛超市', '张经理', '13800138001', '北京市朝阳区', '2023-01-01'),
('家乐福超市', '李经理', '13800138002', '上海市浦东新区', '2023-02-15');

-- 4. 插入供应商数据
INSERT INTO `biz_supplier` (`name`, `contact`, `phone`, `address`, `min_order`, `supply_category`) VALUES
('可口可乐公司', '王经理', '13800138003', '广州市天河区', 1000.00, '饮料'),
('三只松鼠食品', '陈经理', '13800138004', '杭州市余杭区', 500.00, '零食');

-- 5. 插入商品类别数据(多级分类)
INSERT INTO `biz_category` (`name`, `parent_id`, `level`) VALUES
('食品', 0, 1), -- 根类别
('饮料', 1, 2), -- parent_id=1(食品的子类)
('零食', 1, 2), -- parent_id=1(食品的子类)
('日用品', 0, 1); -- 根类别

-- 6. 插入商品数据
INSERT INTO `biz_product` (`name`, `category_id`, `spec`, `unit`, `purchase_price`, `sale_price`, `min_stock`) VALUES
('可口可乐 330ml', 2, '330ml*24罐', '箱', 40.00, 60.00, 50), -- 类别ID=2(饮料)
('三只松鼠坚果礼盒', 3, '500g', '盒', 30.00, 50.00, 30), -- 类别ID=3(零食)
('蓝月亮洗衣液', 4, '3kg', '瓶', 25.00, 40.00, 20); -- 类别ID=4(日用品)

-- 7. 插入仓库数据
INSERT INTO `biz_warehouse` (`name`, `location`, `purpose`) VALUES
('一号仓库', '北京市朝阳区', '食品存储'),
('二号仓库', '上海市浦东新区', '日用品存储');

-- 8. 插入初始库存数据
INSERT INTO `biz_inventory` (`warehouse_id`, `product_id`, `quantity`) VALUES
(1, 1, 100), -- 仓库1存放可口可乐
(1, 2, 50),  -- 仓库1存放坚果礼盒
(2, 3, 80);  -- 仓库2存放洗衣液

-- 9. 插入入库单(审核通过)
INSERT INTO `biz_stock_in` (`supplier_id`, `operator_id`, `total_amount`, `status`) VALUES
(1, 2, 4000.00, 1); -- 从可口可乐公司进货,操作员ID=2(李四)

-- 入库明细(可口可乐 100箱)
INSERT INTO `biz_stock_in_item` (`stock_in_id`, `product_id`, `quantity`, `price`) VALUES
(1, 1, 100, 40.00);

-- 10. 插入出库单(审核通过)
INSERT INTO `biz_stock_out` (`client_id`, `operator_id`, `total_amount`, `status`) VALUES
(1, 2, 3000.00, 1); -- 销售给沃尔玛超市,操作员ID=2(李四)

-- 出库明细(可口可乐 50箱,售价60元/箱)
INSERT INTO `biz_stock_out_item` (`stock_out_id`, `product_id`, `quantity`, `price`) VALUES
(1, 1, 50, 60.00);
  • 用户权限验证:
    • 用户 admin(张三)拥有管理员权限,可以访问所有菜单。
    • 用户 operator1(李四)只能看到出入库管理相关功能。
    • 用户 finance1(王五)只能查看财务统计模块。
  • 库存变化验证:
    • 入库单审核后,biz_inventory 表中可口可乐库存从 100 增加到 200。
    • 出库单审核后,可口可乐库存减少到 150。
  • 财务统计验证:
    • 入库总支出:100箱 * 40元 = 4000元
    • 出库总收入:50箱 * 60元 = 3000元