仓库管理系统设计与实现
仓库管理系统设计与实现
仓库管理系统是一个典型的数据库应用系统,主要用于管理仓库的库存信息。本文将详细介绍该系统的项目需求分析、功能模块、数据库设计以及具体实现。
项目环境要求
- 设备支持:Windows7、Windows8或Windows10;
- 数据库:Mysql 8.0;
- 软件支持:eclipse、navicat
需求分析
需求分析阶段的根本任务是要明确仓库管理系统功能需求,以便提出整个系统的总体方案。在需求分析中,主要采用业务流程图,数据流程图和数据字典来描述。
业务流程图
在分析了仓库管理系统应该具有的基本功能之后,我们确定了本系统分为三个主要模块,即:基本信息维护模块、一般用户功能、库存管理模块和安全管理模块四大模块。
具体业务如下:
- 基本信息维护模块:基本信息维护模块用于系统的用户登录及身份验证。用户进入系统需要经过身份验证。
- 库存管理模块为系统的核心模块,其主要功能有:仓库信息的管理,产品入库登记、确认入库信息、删除库内信息、借出信息登记、产品分类管理、添加人员、删除人员、查询库内信息。
- 安全管理:人员权限区分、事件记录、数据警告、计划备份、即时备份、数据恢复。
- 一般用户功能:查询库内信息、查询出库信息、查询入库信息、修改本用户密码。
系统功能简介
仓库管理系统主要有两个功能,根据不同用户有着不同的功能,分为:普通用户和高级用户功能。具体功能如下:
用户登录界面
对于普通用户和高级用户两种登陆用户,有着各自的方式。每个用户都只能用自己的密码登录到系统中 。究于此系统是专门给个人设计的,鉴于隐私问题,个人相关的信息不希望别人看到,因此登录的身份就只准用户登录。且管理员拥有全部的权限。普通用户界面
(1)个人信息查询界面
主要负责:普通用户通过过个人信息查询界面查询或修改到自己的相关信息,含:姓名,地址,邮箱。
(2)出库界面
主要负责:用户输入商品供应商、商品名称、商品数量、商品价格等信息进行出库操作。此外用户还可以更改出库信息,查询出库信息,删除出库信息。
(3)入库界面
主要负责:用户输入供应商、商品名称、商品数量、商品价格等信息进行入库操作。
此外,用户可以进行查找入库信息,更改入库,删除入库的操作。高级用户界面
(1)账号管理界面
主要负责:用户可以增加员工账号,或者删除员工账号,还可以进行个人信息修改,含:员工账号,账号密码,用户名字,地址和邮箱。方便修改个人信息和增加或删除员工。
(2)商品入库界面
主要负责:用户输入供应商、商品名称、商品数量、商品价格等信息进行入库操作。此外,还可以进行查询入库,更改入库,删除入库的操作。
本界面上方通过点击查找入库用户可以进行查找入库信息。
(3)商品出库界面
主要负责:用户输入商品供应商、商品名称、商品数量、商品价格等信息进行出库操作。此外用户还可以更改出库信息,查询出库信息,删除出库信息。
在本界面的上方,通过点击查找出库用户可以进行查找出库信息。
(4)添加供应商界面
主要负责:用户输入供应商,进行添加供应商操作。此外用户还可以删除供应商,添加供应商旗下子产品。
在本界面的上方,通过点击旗下子产品用户可以进行删除供应商旗下子产品。选择供应商,通过点添加击旗下子产品用户可以进行添加供应商旗下子产品,可以保存数据或重置。
(5)查询记录
主要负责:用户输入订单号,进行查找入库、出库操作。
在本界面的上方,通过点击查找入库信息、查找记录可以查询入库信息。通过点击查找出库信息、查找记录可以查询出库信息。
(6)进库数据统计界面
主要负责:根据入库商品名称、数量、供货商生成柱状图。
(7)出库数据统计界面
主要负责:根据出库商品名称、数量、供货商生成柱状图。
(8)盈亏数据统计
主要负责:根据出入库出库信息生成扇形统计图。
(9)货物流动曲线
主要负责:根据信息生成仓库流动曲线图
在此界面,用户通过选择入库或出库,通过点击查看近三个月或查看历来数据按钮,可在图表中显示仓库货物流动情况。
系统用户及密码
系统管理员:(高级用户)
用户名:root 密码:root
普通用户:
普通用户:abc
密码:root
ER图
数据库设计实现
创建视图
CREATE VIEW instock_view AS
SELECT instock.ID AS id,
instock.supname AS supname,
instock.stockname AS stockname,
instock.intime AS intime,
instock.num AS num,
instock.pric AS pric,
product.stock AS stock
FROM instock
JOIN product
WHERE product.supname = instock.supname
AND product.name = instock.stockname;
创建存储过程
CREATE DEFINER=`root`@`localhost` PROCEDURE `finonemes`(in IDs int)
BEGIN
SELECT instock.id,
instock.supname,
instock.stockname,
instock.intime,
instock.num,
instock.pric,
product.stock
FROM instock,
product
WHERE product.supname = instock.supname
AND product.name = instock.stockname
AND instock.id = IDs;
END
创建触发器
- 建立入库库存更新过程
CREATE TRIGGER addindata
BEFORE INSERT ON instock
FOR EACH ROW BEGIN
UPDATE product
SET stock = stock + NEW.num
WHERE product.name = NEW.stockname
AND product.supname = NEW.supname;
END
- 更改出货
CREATE TRIGGER updateindata
BEFORE UPDATE ON instock
FOR EACH ROW BEGIN
SELECT stock INTO @stockn
FROM product
WHERE name = OLD.stockname
AND supname = OLD.supname;
IF (OLD.stockname != NEW.stockname OR OLD.stockname = NEW.stockname)
AND OLD.supname != NEW.supname THEN
BEGIN
IF @stockn - OLD.num >= 0 THEN
UPDATE product
SET stock = stock - OLD.num
WHERE product.name = OLD.stockname
AND product.supname = OLD.supname;
UPDATE product
SET stock = stock + NEW.num
WHERE product.name = NEW.stockname
AND product.supname = NEW.supname;
ELSE
SET @msg = "仓库库存不足不能进行更改出货";
SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = @msg;
END IF;
END;
ELSEIF OLD.stockname = NEW.stockname
AND OLD.supname = NEW.supname
AND @stockn - OLD.num >= 0 THEN
UPDATE product
SET stock = stock - OLD.num + NEW.num
WHERE product.name = NEW.stockname
AND product.supname = NEW.supname;
END IF;
END;
- 删除订单
CREATE TRIGGER delindata
BEFORE DELETE ON instock
FOR EACH ROW BEGIN
SELECT stock INTO @stockn
FROM product
WHERE name = OLD.stockname
AND supname = OLD.supname;
IF @stockn - OLD.num >= 0 THEN
UPDATE product
SET stock = stock - OLD.num
WHERE product.name = OLD.stockname
AND product.supname = OLD.supname;
ELSE
SET @msg = "仓库库存不足不能删除此订单";
SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = @msg;
END IF;
END;
- 仓库出货
DROP TRIGGER IF EXISTS addoutdata;
DELIMITER ;;
CREATE TRIGGER addoutdata
BEFORE INSERT ON outstock
FOR EACH ROW BEGIN
SELECT stock INTO @stockn
FROM product
WHERE name = NEW.stockname
AND supname = NEW.supname;
IF @stockn - NEW.num >= 0 THEN
UPDATE product
SET stock = stock - NEW.num
WHERE product.name = NEW.stockname
AND product.supname = NEW.supname;
ELSE
SET @msg = "仓库库存不足不能进行出货";
SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = @msg;
END IF;
END;;
DELIMITER ;
- 出库表更改出货
DROP TRIGGER IF EXISTS updateoutdata;
DELIMITER ;;
CREATE TRIGGER updateoutdata
BEFORE UPDATE ON outstock
FOR EACH ROW BEGIN
SELECT stock INTO @stockn
FROM product
WHERE name = NEW.stockname
AND supname = NEW.supname;
IF (OLD.stockname != NEW.stockname OR OLD.stockname = NEW.stockname)
AND OLD.supname != NEW.supname THEN
BEGIN
UPDATE product
SET stock = stock + OLD.num
WHERE product.name = OLD.stockname
AND product.supname = OLD.supname;
IF @stockn - NEW.num >= 0 THEN
UPDATE product
SET stock = stock - NEW.num
WHERE product.name = NEW.stockname
AND product.supname = NEW.supname;
ELSE
SET @msg = "仓库库存不足不能进行更改出货";
SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = @msg;
END IF;
END;
ELSEIF OLD.stockname = NEW.stockname
AND OLD.supname = NEW.supname THEN
BEGIN
SELECT stock INTO @stockn
FROM product
WHERE name = NEW.stockname
AND supname = NEW.supname;
IF @stockn - NEW.num >= 0 THEN
UPDATE product
SET stock = stock - OLD.num + NEW.num
WHERE product.name = OLD.stockname
AND product.supname = OLD.supname;
ELSE
SET @msg = "仓库库存不足不能进行更改出货";
SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = @msg;
END IF;
END;
END IF;
END;;
DELIMITER ;
- 更新库存
DROP TRIGGER IF EXISTS delloutdata;
DELIMITER ;;
CREATE TRIGGER delloutdata
BEFORE DELETE ON outstock
FOR EACH ROW BEGIN
UPDATE product
SET stock = stock + OLD.num
WHERE product.name = OLD.stockname
AND product.supname = OLD.supname;
END;;
DELIMITER ;