最简单的库存管理开发(一)

第一步、简单设计

需求场景:
小型个体商户、门店库存管理。
功能需求:
门店信息、商品分类、商品管理、出库管理、入库管理、库存盘点。
应用模式:
SaaS多客户服务系统。
数据库:有效云平台内置SQLite库。

第二步、创建应用

在这里插入图片描述

第三步、创建数据库

登录有效云开发中心,创建一个名为《简易库管》的应用,模板选择【电子文档】——该模板内置在下帮助功能。应用中心,点击<简易库管>进入平台集成开发环境,从左侧菜单栏中选择【链接管理】,选择【应用库】,选择【表管理】新建需要的 6 个数据表:tb_shop、tb_goods_type、tb_goods、tb_store、tb_stroe_in、tb_stroe_out。
在这里插入图片描述

创建完第一个表感觉还是写语句吧。

DROP TABLE IF EXISTS "tb_shop";
-- 店铺信息
CREATE TABLE "tb_shop" (
			"id"  INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
			"name"  TEXT(60),
			"mobile"  TEXT(21),
			"manager"  TEXT(60),
			"address"  TEXT(255),
			"email"    TEXT(255),
			"logtime" TEXT(24),
			"state"    INTEGER  DEFAULT 0
		);
-- 商品分类
CREATE TABLE "tb_goods_type" (
			"id"  INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
			"pid"    INTEGER,
			"name"  TEXT(60),
			"pic"  TEXT(255),
			"memo"  TEXT(500),
			"state"    INTEGER  DEFAULT 0
		);
-- 商品信息
CREATE TABLE "tb_goods" (
			"id"  INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
			"type_pid"    INTEGER,
			"type_id"    INTEGER,            
			"name"  TEXT(120),
			"alias"  TEXT(60),
			"price"  REAL,
            "unit" TEXT(20),
			"pic"  TEXT(255),
			"code"    TEXT(60),
			"memo" TEXT(500),
			"state"    INTEGER  DEFAULT 0
		);
-- 库存信息
CREATE TABLE "tb_store" (
			"id"  INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
			"type_pid"    INTEGER,
			"type_id"    INTEGER,
			"goods_id"    INTEGER,
			"goods_count"  INTEGER,			
			"memo"    TEXT(500),
			"logtime" TEXT(24)
		);
-- 入库日志
CREATE TABLE "tb_store_in" (
			"id"  INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
			"type_pid"    INTEGER,
			"type_id"    INTEGER,
			"goods_id"    INTEGER,
			"goods_count"  INTEGER,			
			"goods_unit"   TEXT(20),
			"uid"  INTEGER,
			"uname"  TEXT(60),
			"memo"    TEXT(500),
			"logtime" TEXT(24)			
		);
-- 出库日志
CREATE TABLE "tb_store_out" (
			"id"  INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
			"type_pid"    INTEGER,
			"type_id"    INTEGER,
			"goods_id"    INTEGER,
			"goods_count"  INTEGER,			
			"goods_unit"   TEXT(20),
			"uid"  INTEGER,
			"uname"  TEXT(60),
			"memo"    TEXT(500),
			"logtime" TEXT(24)
		);

在这里插入图片描述
还是语句效率高,同时有了版本控制的SQL脚本。

第四步、创建应用模块

从左侧菜单栏选择【模块管理】,工具栏【新建】:店铺管理、商品分类管理、商品管理、库存管理、入库管理几个模块——先不创建出库模块!
模块数据库选择【应用库】,表选择相应的数据表,创建模块时增加一个模块分类<库管>,创建完后如下:
在这里插入图片描述
我们可以看到,系统已经有编号为1-6的模块,这是系统内置的角色、账号管理的,稍后我们在此基础上稍加设置,角色权限功能就OK啦。接下来一次设置几个模块的【字段】,把字段全部选入:
在这里插入图片描述
此时,开发的模块已经可以进行单元测试预览了,点选工具栏【预览】按钮:
在这里插入图片描述
这就是用户使用时的界面了,可以看到字段除了名称外,其他字段都是英文,而且列宽很宽,接下来我们就对前端样式进行设置:
选中模块,点选工具栏【表单】,修改各项参数——可视化设置,无需代码编写。
在这里插入图片描述
设置后,点击【预览】再点<店铺管理>的【新建】,如上所示。

无需一行代码一个模块基本管理功能完备,其中填写项名称前带有 * 的为必填项。按照设计,逐一对各模块进行设置,根据业务逻辑,设置各字段对应的组件类型,是否必填等。
都设置好后,是否还记得还有一个模块没有创建——出库管理,现在选中入库管理,点击工具栏【复制】,确定保存,编辑修改模块名称,表名选择:tb_store_out,出库模块OK!
程序员怎么能不编写代码呢?下面用到模块的两个编程接口:按钮事件和模块扩展。

第五步、业务逻辑处理

(1)、前端设置

给【库存管理】模块增加三个工具栏按钮:【商品管理】、【入库】【出库】并分别设置链接参数为:

商品管理:/adm/d/{{APPID}}/list/zli2ezvtsv
入库:/adm/d/{{APPID}}/add/zidrti9cmyin
出库:/adm/d/{{APPID}}/add/zidrti9cmyout

(2)、数据库处理

设置号前端,我们开始编写业务数据处理的代码:

【入库管理】模块,增加一个<新建><提交后>的SQL_execute扩展:

-- 该系统使用了SQLite 数据库表联合操作略显复杂。
-- 如果库存表无当前入库商品,自动创建
insert into tb_store(type_pid,type_id,goods_id,goods_count,memo,logtime) 
select type_pid,type_id,goods_id,0,memo,logtime from tb_store_in where not exists( select id from tb_store where goods_id = {{.goods_id}} ) and id ={{.id}};
-- 更新库存中当前入库商品数量、更新事件、及操作人员相关信息。
update tb_store set 
goods_count = ifnull(goods_count,0) + (select tb_store_in.goods_count from tb_store_in where tb_store.goods_id=tb_store_in.goods_id and tb_store_in.id={{.id}}),
memo =  (select tb_store_in.uid || '-' || tb_store_in.uname || '-' || tb_store_in.goods_count from tb_store_in where tb_store.goods_id=tb_store_in.goods_id and tb_store_in.id={{.id}}),
logtime=(select tb_store_in.logtime from tb_store_in where tb_store.goods_id=tb_store_in.goods_id and tb_store_in.id={{.id}})
where goods_id={{.goods_id}} ;
-- 同步入库记录中单位信息,设计时数据冗余了该字段,可以采用表联合查询方式,省去该字段。
update tb_store_in set goods_unit = (select unit from tb_goods where tb_store_in.goods_id=tb_goods.id) where id = {{.id}};

【出库管理】模块,增加一个<新建><提交后>的SQL_execute扩展:

-- 没有入库必然不能有出库,所以直接更新库存数量
update tb_store set 
goods_count = goods_count - (select goods_count from tb_store_out where tb_store.goods_id=tb_store_out.goods_id and tb_store_out.id={{.id}}),
memo =  (select uid || '-' || uname || '-' || goods_count from tb_store_out where tb_store.goods_id=tb_store_out.goods_id and tb_store_out.id={{.id}}),
logtime=(select logtime from tb_store_out where tb_store.goods_id=tb_store_out.goods_id and tb_store_out.id={{.id}}) where goods_id={{.goods_id}}; 
update tb_store_out set goods_unit = (select unit from tb_goods where tb_store_out.goods_id=tb_goods.id) and id = {{.id}};

(3)、出库商品选择

出库操作时,只显示库存商品大于0的商品,出库商品选择下拉框绑定SQL设置如下:

select b.id ,b.name as val from tb_store a,tb_goods b where a.goods_id=b.id and a.goods_count > 0

当商品库存量小于出库数时是不能出库的,负库存暂不允许哦,继续代码实现,先创建一个接口:/storeapp/getstorecount:

//定义参数 goods_id,必填,不能小于零
//定义参数 r,用来获取商品库存,SQL如下:
select goods_id,goods_count from tb_store where goods_id={{.goods_id}} limit 1;
//接口定义:
{{if .r}}
{
 "code": 100, 
 "goods_id":"{{.r.goods_id}}",
 "goods_count":"{{.r.goods_count}}",
  "msg": "ok",  "extra": "", 
 "result": []
 }
{{else}}
{
 "code": 104, 
  "msg": "查询失败",  "extra": "系统异常,未能获得库存数量", 
 "result": []
 }
{{end}}

模块【出库管理】增加<表单事件> 校验库存, 字段选择:<出库数量> ;范围选择:PC端;事件选择:blur ——当出库数量输入框失去焦点时,代码如下:

here = this;
if(here.form["goods_id"]!="" && here.form["goods_count"]!=""){    
    var data=new FormData();
    data.append("goods_id",here.form["goods_id"]);
    axios.post('/api/{{APPID}}/storeapp/getstorecount',data).then(function (res) {
        if(res.data.code==100){
            var out_count=parseInt(here.form["goods_count"]);
            var store_count=parseInt(res.data.goods_count);
            //console.log("出库数量out_count:",out_count);
            //console.log("库存数量goods_count:",store_count);
            if( out_count > store_count ){
                here.form["goods_count"] = "";
                window.top.vm.$message.error('当前库存不足,请重新输入出库数量!');
            }            
        }else{
           window.top.vm.$message.error('商品库存校验失败,请人工核验当前库存!');
        }
    }).catch(function (error) {});
}

到此,开发的主要工作完成,打开【菜单管理】为新开发的模块创建用户访问菜单:
在这里插入图片描述
从集成开发环境右上角头像下拉菜单选择:【登录预览】,先通过超级管理员设置角色账号:
在这里插入图片描述
创建:库管、入库员、出库员,分别指定不用的菜单访问权限:

创建好角色,再创建一个 库管1 的账号,用库管正好再次登录——模拟预览,应用的实际效果:
在这里插入图片描述
单用户功能基本开发完成!

库 存 管 理 系 统 ----系统设计 一 功能设计 总原则: 首先要保证系统总目标的实现,其次注意模块的独立性要强。各模块的接口应简单明了 。 系统结构图:功能模块的划分,数据录入、库存分析、查询系统 各功能模块的描述:输入,输出,功能。 二 数据库设计 1. 数据模型抽象层次 2. E-R方法的基本思想 在设计过程中引入一个中间步骤,即先设计一个企业模式(该模式纯粹是现实世界的 反映,与存储结构、存取方式无关),再将企业模式转换为某个DBMS上可以实现的数据 模型。多数是关系数据模型。 3. 库存管理系统采用这种方法,先设计出概念数据模型,即E-R模型。 3.1库存管理系统局部E-R视图 (1) 物料与入库单之间 (2) 物料与领料单之间 (3) 物料与退料单之间 (4) 物料与仓库之间 3.2库存管理系统集成E-R视图 4. ER模型到关系模式的转换 功能要求: 入库单登录 领料单登录 退料单登录 物资短缺/超储分析 物资积压分析 相关数据库表 入库台帐 领料台帐 退料台帐 库存总帐 4.1 实体集的转换 一个实体型转换为一个关系,实体的属性就是关系的属性,实体的关键字就是关系 的关键字。 4.2 联系的转换 (1)M:N联系 一个联系转换为一个关系,相关实体的关键字与联系的属性组合成关系的属性,相 关实体的关键字组合成关系的关键字。 (2)1:N联系 N端实体的关键字构成关系的关键字,可以与N端合并。 (3)1:1联系 任一端实体的关键字构成关系的关键字,可以与任一端合并 5.参考数据库结构 (1)入库台帐(入库单编号,仓库号,进货日期,供货单位,入库数量,材料编号, 进货单价,检验员,记账员,备注) input "列名 "数据类型 "长度 "可否为空 "注释 " "rk_id "varchar "10 "否 "入库单编号 " "ck_id "varchar "10 "否 "仓库号 " "in_date "date " "否 "进库日期 " "cl_from "varchar "10 "否 "供货单位 " "rk_num "smallint "10 "否 "入库数量 " "cl_id "varchar " "否 "材料编号 " "price "double " "否 "进货单价 " "jyy "varchar "10 "否 "检验员 " "jzy "varchar "10 "否 "记帐员 " "bz "varchar "30 "是 "备注 " (2)领料台帐(领料单编号,仓库号,领料日期,领料部门,领料用途,材料编号, 实发数量,领料员,发料员,备注) 入库台帐和领料台帐中只有材料编号,其它信息存放在材料编码库中,避免了数据冗 余。 "列名 "数据类型 "长度 "可否为空 "注释 " "ll_id "varchar " "否 "领料单编号 " "ck_id "varchar " "否 "仓库号 " "ll_date "date " "否 "领料日期 " "ll_bm "varchar " "否 "领料部门 " "yt "varchar "100 "否 "领料用途 " "cl_id "varchar " "否 "材料编号 " "num "smallint " "否 "实发数量 " "lly "varchar "10 "否 "领料员 " "fly "varchar "10 "否 "发料员 " "bz "varchar "50 "是 "备注 " (3)库存总帐(材料编号,仓库号,库存数量) total "列名 "数据类型 "长度 "可否为空 "注释 " "total_id "varchar "10 "否 "材料编号 " "ck_id "varchar "10 "否 "仓库号 " "total_num "smallint " "否 "库存数量 " (4)退料台帐(退料单编号,仓库号,退料日期,材料编号,退料数量,退料人,经 手人,退料原因) back "列名 "数据类型 "长度 "可否为空 "注释 " "b_id "varchar "10 "否 "退料单编号 " "ckid "varchar "10 "否 "仓库号 " "tl_date "date " "否 "退料日期 " "cl_id "varchar "10 "否 "材料编号 " "num "smallint " "否 "退料数量 " "tlr "varchar "10 "否 "退料人 " "jsr "varchar "10 "否 "经手人 " "reason "varchar "30 "否 "退料原因 " (5)材料库(材料编号,材料名称,单价,最低库存量,最高库存量) material "列名 "数据类型 "长度 "可否为空 "注释 " "cl_id "varcha
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ti-蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值