基于Java的仓库管理系统设计与实现(一)
基于Java的仓库管理系统设计与实现(一)
1. 需求简介
- 用户管理,分为管理员用户,仓库操作员、财务人员
- 客户管理,仓库对接的合作商家、例如超市等联系信息
- 供应商管理,货物来源供应商基本信息,供应货品类别
- 商品类别管理
- 商品管理 有价格,从供应商进货价格,卖给超市的价格
- 入库管理 从供应商进货
- 出库管理 卖给商户
- 财务管理 入库总支出,出库总收入,出入库订单数量,出入库商品类别图表
- 菜单管理,设置权限
- 用户管理,用户基本信息,分配角色(角色决定权限)
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元
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 枫月Blog
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果