Skip to content

处理大量库存数据统计

场景概述

根据出库和入库单按时间统计库存记录并生成页面

支持筛选时间物品以及仓库

统计时调用最近一次的记录,避免数据过多查询缓慢

效果展示:

注意

点击获取本教程所用: 示例应用Demo

点击跳转应用导入教程: 导入应用教程

1.创建表单

1.1 物品/仓库表

物品表用于筛选物品以及在工作流中快速拿到所有物品

包含以下字段:

  • 物品编号: 自动编号,设置编号规则固定字符WP+自增位数
  • 物品名称: 文本类型

类似的,创建仓库表如下:

1.2 出/入库记录

记录仓库中的某商品在某时间点的出入库情况

以出库单为例,包含字段:

  • 自动编号: 设置编号规则固定字符CK+自增位数
  • 仓库名称: 关联字段,关联仓库表中的仓库名称
  • 物品名称:关联字段,关联物品表中的物品名称
  • 出库时间: 日期类型
  • 出库数量: 数值类型

同样的方式构建入库单如下:

提示

设置自动编号,有利于后续在工作流中连接数据时对出/入库进行区分

避免了同一时刻既有出库又有入库的冲突


1.3期初库存记录

该表单记录在截止日期时刻,仓库商品的结余量

后续统计出入库数据时,会优先通过该表单获取最近一次的结余量

在3中会创建循环定时工作流,定期对该表单进行自动更新

通过上面措施,提高数据的统计效率

表单包含字段:

  • 仓库名称: 关联字段.关联仓库表中的仓库名称
  • 截至日期: 日期,日期类型设置为年-月
  • 截至日期结余量: 数值类型,表示到截止日期时该仓库中该商品的数量
  • 物品: 关联字段,关联物品表中的物品名称

2.自动更新期初库存

在进行数据统计时需要根据时间段去查询期初库存表

为了确保查询的效率,需要定期对期初库存表进行更新

下面使用定时触发工作流,每隔一个季度添加一次期初库存表

说明

本节调用下面3中的3.1物品数据统计业务流程来得到当前时间点各个仓库,各个物品的结余量

根据期初库存记录表单,我们需要获取的数据如下:

序号名称来源说明
1仓库名称3.1业务流程3.1业务流程传入仓库名称为空时默认查询所有仓库
2物品名称3.1业务流程3.1业务流程传入物品名称为空时默认查询所有物品
3截止日期流程传入参数直接取业务流程的触发时间
4截止日期结余量由3.1业务流程计算得到筛选3.1业务流程的计算结果,只取期末结存

2.1 定时触发工作流


通过设置定时出发工作流每隔一个季度统计一次库存,并更新到期初库存记录表单,提高统计效率

2.1.1 循环时间设置

创建循环定时工作流,配置如下:


2.1.2 统计库存

调用下面3中的3.1物品数据统计业务流程来得到当前时间点各个仓库,各个物品的结余量

提示

物品出入库统计业务流程将在下面3.1物品数据统计章节具体实现

该业务流程会根据传入的时间段,物品以及仓库信息计算出时间段最后对应仓库中物品的结余量

从而供本节后续更新对应的结余量数据

配置业务流程如下:

:::

这里传入选择物品名称和仓库名称为空,默认即为查询所有物品和仓库

详见3.1.2特殊情况处理

:::

然后再使用代码块读期末结存:

代码块返回一个子表:

json
[{
"仓库名称":"1231",
"商品名":"苹果",
"结余数量":123
}]

2.1.3 新增记录

创建新增记录节点,选择期初库存表单:

勾选保存多条

新增字段:

  • 仓库名称/截止日期结余量/物品: 由代码块传入
  • 截止日期: 循环定时的触发时间

3.创建数据统计工作流

本节将创建业务流程,完成对本示例主要数据的获取以及返回

3.1 物品数据统计

需要的数据如图所示:

序号内容来源说明
1仓库名业务流程输入参数默认为空时视为选择全部
2物品名业务流程输入参数默认为空时视为选择全部
3开始时间业务流程输入参数默认为空时视为三个月前
4结束时间业务流程输入参数默认为空时视为当前时间
5期初库存期初库存记录通过工作流调整
6期间出入库记录出/入库记录通过工作流查询
7出入库后的结余数量工作流计算
8期末库存工作流计算
9分隔空行工作流构建

本节使用后面3.2 仓库物品统计工作流实现对单个仓库单个商品进行统计

并对返回结果进行拼接即可获取到最终结果

提示

3.2 仓库物品统计工作流传入时间段单一的仓库和物品名称

业务流程查询时间段内的出/入库记录以及初始时刻的结余量

3.1.1业务流程传入参数

创建业务流程,配置输入参数如下:


3.1.2 仓库名/物品名/时间处理

3.1.1中传入了对应的数据

在对数据进行查询之前,有必要对输入参数的一些特殊情况作处理:

1.仓库/物品名为空

通常我们会希望在传入的仓库和物品名为空时默认显示所有仓库和物品的记录

说明

由于这里可能需要获取到多条数据

如果使用分支来判断后续流程参数无法更新多个参数

因此推荐使用代码块来实现

下面使用代码块来对这一情况进行处理:

使用查询节点查询所有的仓库/物品名称:

输入参数和查询结果一同传入代码块:

代码块会判断输入参数的仓库/物品名是否为空,如果为空则返回所有的物品/仓库

返回子表如:

json
[{
"仓库名称":"武汉仓"
}]

2.非法时间处理

主要针对传入的时间段为空,或部分为空的情况

使用代码块传入流程输入起始时间结束时间

代码块完成下面逻辑:

  • 时间都为空: 取近三个月的时间
  • 结束时间为空: 取当前时间为结束时间
  • 仅开始时间为空: 取结束时间前三个月的时间

返回示例:

json
{"开始时间":1760247639993,"结束时间":1768196439993}

注意

代码块返回日期时必须设置为数值类型,并返回按毫秒时间戳

不然后续的查询节点查询不到

3.1.3 获取最近期初库存

查询期初库存记录,获取离传入时间段的起始时间最近的一次统计记录

后面会继续在3.2.4中进一步处理,得到起始时间点时的期初库存

使用查询记录节点,查询期初库存记录,并勾选查询多条

查询条件:

  • 物品/仓库 任意属于 2.2.2中代码块返回的物品/仓库名称
  • 截止日期 小于等于 2.2.2中处理后的日期

提示

由于需要查询多个物品,多个仓库的最近结余量

不宜使用排序规则来拿到每个仓库,每个商品的最近一次记录

下面使用代码块来获取每个物品/仓库最近一次记录的列表

使用代码块筛选最新的记录,配置代码块如下:

返回要查询的信息子表:

json
[{
"仓库名称":"成都仓",
"商品名称":"苹果",
"截止时间":1735401600000,
"结余数量":3
}]

3.1.4 计算期初库存/期末库存

前面已经获取到了仓库物品统计流程所需要的所有参数

接下来调用流程即可获取到对应的结果

创建业务流程节点

选择仓库数据统计业务流程,执行次数选择多次执行

数据源选择子表字段:3.1.3获取最近期初库存中代码块返回的结果

参数传递:

  • 仓库(商品)名称/截止时间以及结余数量:3.1.3获取最近期初库存代码块返回的结果
  • 起始/结束时间: 业务流程的传入参数

3.1.5 排列数据并创建标题和空行

使用代码块对2.2.4中业务流程返回的数据进行合并处理

并创建标题(物品名),将同一物品排列在一起

以及不同物品之间用空行分隔

创建代码块,勾选输入多个对象

数据源选择数据节点:4.调用业务流程中返回的值

输入参数:

  • data:业务流程传入的字符串结果
  • product_name:流程传入的物品名称,用于添加表头

代码块中完成:

  • 将数据整合为一张子表

  • 对数据进行分类处理,同一物品的记录排列在一起

  • 首行插入物品名称作为标题

  • 在每组数据之间插入空行作为分隔

最后返回单条数据,结果为一张子表:

[{
  "单据号": "RK000012312",
  "单据类型": "出库单",
  "日期": 18273189237,
  "入库数量": 2,
  "出库数量": 3,
  "结余数量": 100
}]

3.1.6 数据返回

使用数据返回节点返回结果:

选择返回多条数据,数据源为子表字段: 代码块返回结果

3.2 仓库物品统计

使用业务流程统计特定仓库特定商品在时间段内的出/入库记录

说明

本工作流只完成基础的对单一商品,单一仓库的出/入库数据统计

并通过传入的截止时间,计算起始时的结余量

后续由其他工作流调用该业务流程实现多组数据的统计

本节要获取的数据如下:

序号内容说明
1仓库名例如:武汉仓-苹果,作为每个仓库记录的标题
2期初库存计算出的开始时间点时的库存数量
3结余库存计算出的结束时间点时的库存数量
4期间出入库记录查询节点查询到的开始时间---结束时间对应商品和仓库的出入库记录,并按时间排序

3.2.1 业务流程传入参数

  • 仓库名称: 文本类型,指定要查询的仓库
  • 商品名称: 文本类型,指定要查询的商品名称
  • 结余数量: 数值类型,查询期初库存记录得到的最近的结余数量
  • 起始/结束时间: 日期类型,表示要展示的记录的时间段
  • 最近截止时间:用于获取在截止时间起始时间之间的数据,结合结余数量计算得到初始时刻准确的结余量

提示

最近截止时间/结余数量,指的是在所有期初库存记录表单中,距离时间段中的起始时间最近的记录

由2.2.3中工作流进行查找和处理得到


3.2.2 查询期间出入库记录

使用两个查询记录节点查询入库单和出库单

从而获取对应的出/入库数据,方便后面整理

查询数量勾选查询多条

查询条件:

  • 物品/仓库名称 等于 传入的物品/仓库名称
  • 出/入库时间 大于等于 最近截止时间
  • 出/入库时间 小于 最近截止时间

提示

设置出/入库时间 大于等于 最近截止时间

后面只需要处理从最近截止时间~起始时间的记录,加上传入的结余数量,就可以得到起始时间点的结余量

从而避免了对前面的所有数据进行统计

查询字段: 自动编号/仓库名称/物品/出(入)库时间和数量

查询节点详细配置如下:


3.2.3 合并出/入库记录

使用数据工厂节点连接查询的出/入库单数据,方便后续传入代码块中进行处理

使用横向连接全连接

详细配置如下:


3.2.4. 排序记录并添加仓库名

使用代码块处理合并的数据格式化后返回

选择输入多个对象,数据源选择数据节点--->前面数据工厂合并的数据

详细配置如下:

代码块完成下面任务:

  • 统计传入的结余数量截止日期~起始时间之间的记录,得出初始结余量
  • 统计结束时间前,起始时间后的出入库记录,并计算每次操作后的结余数量
  • 起始时间开始时间之间的数据按时间先后进行排序
  • 在列表开始和末尾加入统计信息(如期初/期末结存)并按,页面要求返回对应字段

返回字段示例如下,对应我们最终要在页面中显示的字段:

json
{
    "单据号": "期初结存",
    "单据类型": "出库单",
    "日期": 1735401600000,
    "入库数量": 20,
    "出库数量": null,
    "结余数量": 30
}

代码块结果示例:

json
"[
{"单据号":"武汉仓-苹果","单据类型":"","日期":null,"入库数量":null,"出库数量":null,"结余数量":null},
{"单据号":"期初结存","单据类型":"","日期":null,"入库数量":null,"出库数量":null,"结余数量":43},
{"单据号":"CK00000002","单据类型":"出库单","日期":1765382400000,"入库数量":null,"出库数量":43,"结余数量":0}
]"

3.2.5 数据返回

将3.2.4中代码块的结果返回

配置返回节点如下:

提示

该流程最后得到的结果只是对于单个仓库,单个物品中间结果,不是最终结果

可以简单设置代码块json模板为""交由数据返回节点直接返回单个字符串方便后续合并处理

4. 创建页面视图

4.1 创建页面

创建页面,新增业务明细,选择页面调用业务流程

将业务流程的返回值填入显示字段


4.2 设置筛选器

选择刚刚创建的页面,编辑页面,点击左上角的筛选器

新增筛选器,选择筛选流程输入参数

选择对应的图表,筛选参数起始时间,设置好筛选器的名称默认值(设为空)

同样的方式设置结束时间物品筛选器

最终效果展示: