Leo
1
仓库管理(Warehouse Management,简称WM)是企业进销存管理中非常重要的一环,做好仓库管理可以精准掌握库存状况、货品动销情况等,确保企业生产经营活动的稳定进行。
很多管理者常规使用的仓库管理办法有:
- 采用传统的纸质文档表格来记录相关的出入库信息,这种方式很容易出错,经常会有文件丢失的现象出现。
- 采用Excel表格来管理仓库,虽然解决了文件保存问题,但此方式无法做到相关数据的实时更新,也很容易出现电脑系统崩溃的情况,导致文件无法恢复。
一个企业在发展的过程中,仓库管理的复杂度和多元化程度都会不断提升,单纯靠人工记忆和手工录入的方式来管理,容易出错又无法准确监管,严重时甚至会给公司造成损失。企业的管理者都在寻找能够匹配企业需求的管理软件进行自动化的仓库管理,同时这样的管理软件一定要满足以下要求:
- 简单上手快:再昂贵的系统,员工不会用都是白搭。
- 高性价比:花最少的钱获得最大的收益,是每个企业所追求的。尤其对中小型企业来说,没有必要去花大价钱搭建一个重型的系统。
SeaTable 给出了最佳答案,通过本文的案例”在SeaTable中实现库存管理系统”希望能给大家提供一些使用时的参考。
模板链接
业务逻辑
通过与市面上常见的库存管理软件进行调研对比,在SeaTable中实现的库存管理系统应用逻辑如下:
数据逻辑
数据逻辑如下图所示:
- 在库存管理系统Base内分别建立「入库表」、「出库表」、「库存流水表」、「库存表」、「商品表」五个table
- 基于「商品表」可创建 新增商品表单 ,录入商品的名称、规格、价格等基础信息,与「库存表」进行数据关联
- 基于「入库/出库表」可创建 入库单/出库单 ,商品基础信息与 「库存表」关联,直接选择库存中的商品进行出/入库单的录入,输入入库数量后,在「库存表」查找当前库存。
- 通过使用脚本,当录入 入库单/出库单 ,并且审核通过后,在库存流水表中增加一条记录,计算出新的库存更新到「库存表」中。
实现方法
首先完成Base和Table的建立:
- 「商品表」,用于录入商品的基础信息(可以直接在表格中录入,也可以通过表单或者通用app进行录入),每一个商品对应一个货品的编码。
录入后,通过脚本配合自动化规则将「商品表」中的基础信息同步到「库存表」中,并生成库存编码进行区分,保证每一个新增的商品都有独立的编码,并标记为 可用 (后续由系统管理员根据实际情况设置货品是否可用)。
「库存表」通过库存编码关联库存表,在库存表中选择商品,自动关联填入商品的基础信息
填写效果如下图所示:
选择完库存商品信息后,只需要填写入库数量,结合工作流功能,发起入库审批流程:
当入库审批通过后,锁定该行记录,可以通过按钮列配合脚本,在库存流水表中添加一条入库记录,并计算出最新库存更新库存表中的库存数量,如下如图所示:
当「入库表」和「出库表」中的审批通过后,也可以通过脚本配合自动化规则,同步至「库存流水表」中作为库存流水的记录,并将计算出的最新库存更新到「库存表」中去,记录如下图所示:
总结
库存管理系统的功能可以通过脚本与自动化规则的配合使用在表格内进行实现,相比于市面上其他的CRM管理软件,数据处理更加透明,任何功能都可以根据用户需求自行搭建,适用于各种规模的企业。根据库存管理系统的实现,可以延伸出销售订单、采购订单、供应商信息、BOM表等不同管理系统的功能,帮助企业优化改进业务流程,既能满足企业生存的需要,也能保证每一个企业的长久可持续发展。
这里有个问题,如果库存材料是一种还好,如果库存材料有N种,比如最简单的成品,半成品,原材料,这三种的字段结构是不一样的,如果是按照以上的结构,就需要N类*(出库,入库,库存,流水)个
我的做法是合并出入,入库,流水,三表合一,如下图
效果图
这个库存进出相当于路由的功能,通过选择入库类型,在一个界面内完成,包括采购出入,工单领料,入库,销售出库,退回,库存调整,不良品隔离等不同类型的操作.通过视图来控制显示和不显示字段,输入完成后点击生效,写入相应的库存,并且锁当前行.
不过有一个希望可以改进,就是锁视图分两个权限,一个是隐藏字段的权限,一个是过滤排序的权限.现在锁了视图后,不能过滤,这个数据多了就挺麻烦的
2 个赞
不好意思,还没有更新完,没完全用uml格式,根据seatable类型自己设的
所有的库存操作,都是通过库存进出作为路由,有手工的,有自动
对应的入库脚本
from seatable_api import Base, context
server_url = context.server_url or 'https://cloud.seatable.cn'
api_token = context.api_token or 'c3c75dca2c369849455a39f4436147639cf02b2d'
base = Base(api_token, server_url)
base.auth()
print(context.current_row)
if not context.current_row:
print("没有当前记录,请在对应的行上点击按钮")
exit()
input_stock_approval_result = context.current_row.get("入库审批结果")
input_stock_number = context.current_row.get("表单编号")
input_stock_count = context.current_row.get("入库数量")
goods_name = context.current_row.get("货品名称")
goods_category = context.current_row.get("货品类别")
goods_model = context.current_row.get("规格型号")
input_stock_row_id = context.current_row.get("_id")
input_stock_stock_flow = context.current_row.get("库存流水表")
if input_stock_approval_result != '审批通过':
print("审批未通过,不生成流水记录")
exit()
if input_stock_stock_flow:
print("库存流水已经存在,不生成流水记录")
exit()
# 查找对应的库存信息
sql = 'select _id, 当前库存 from 库存表 where 货品名称="%s" and 规格型号="%s" and 货品类别="%s"' \
%(goods_name, goods_model, goods_category)
query_stock_info = base.query(sql)
if not query_stock_info:
print("库存商品不存在,不生成流水记录")
exit()
stock_goods_id = query_stock_info[0].get("_id")
current_stock_count = query_stock_info[0].get("当前库存")
after_stock_count = current_stock_count + input_stock_count
stock_flow_to_stock_link_id = base.get_column_link_id("库存流水表", '库存记录', view_name=None)
stock_flow_to_input_stock_link_id = base.get_column_link_id("库存流水表", '入库记录', view_name=None)
row_data = {
"操作类型": '入库',
"关联出入库表单编号": input_stock_number,
"之前库存": current_stock_count,
"数量": input_stock_count,
"之后库存": after_stock_count,
}
flow_table_row = base.append_row("库存流水表", row_data)
stock_row_data = {
"当前库存": after_stock_count
}
base.update_row("库存表", stock_goods_id, stock_row_data)
row_id = flow_table_row['_id']
# 添加库存流水表到入库表的链接
base.add_link(stock_flow_to_input_stock_link_id, "库存流水表", "入库表", row_id, input_stock_row_id)
# 添加库存流水表到库存表的链接
base.add_link(stock_flow_to_stock_link_id, "库存流水表", "库存表", row_id, stock_goods_id)
1 个赞
可扩展性:
库存流水表、入库表、出库表随着使用的时间会产生比较多的记录。而且它们到库存表都有一个链接,随着时间,库存表中的一个记录可能有上千个链接的记录。
这个时候可以使用归档功能,把入库表、出库表、库存流水表中的往年的记录归档到大数据存储中。对应的链接也会被归档。归档的数据可以通过 SQL 接口或者大数据视图查看。