教程:多功能云函数在【BOM汇总场景】中的应用

简道云应用场景探索者

 

BOM即物料清单,在各种生产计划类的功能中会被广泛使用到,会涉及到成品、半成品、原材料等的统计汇总。

 

在官方【简单和多级BOM表的使用方法】中已给出两种类别的使用方式

链接:https://bbs.fanruan.com/thread-138269-1-1.html

 

基于子表单BOM汇总计算所存在的问题

 

通过分析表单结构会发现,本实例将每个产品所涉及到的半成品与原料解析一个辅助的子表单,然后再结合相对应的数量进行汇总计算,举例:

 

A产品由Y01、Y02 共计2种原料构成

B产品由Y01、Y02、Y03 共计3种原料构成

C产品由Y01、Y02、Y03、Y04 、Y05共计5种原料构成

D产品由Y01、Y02、Y03、Y04、Y05、Y06 共计6种原料构成

E产品由Y01、Y02、Y03、Y04、Y05、Y06、Y07、Y08 、Y09共计9种原料构成

 

测试中发现,一次性将所有产品全部添加,在子表单中所形成的计算量不是5条数据,而是25条数据 ,即每个产品所涉及到的每一种原料都将是辅助表单的一条数据,其中同一种原料,因在不同的产品中都曾涉及到,也会多次重复出现,经常使用子表单的道友都知道,目前子表单的上限是200条数据,那么就会出现“可计算的上限由原料出现的次数决定”这一问题,且如果每个产品所涉及到原料数量如果不同,那么极有可能这个上限便是不可预估的。

 

在测试BOM功能时,使用的场景是餐厅,即:

对给定量的餐品汇总所要用到的原料各是多少?

 

 

  

餐品原料一般会涉及到主料与辅料,单一餐品合下来,需要个10余种原料的也不少,可能还会更多,当同时添加10多个餐品计划时,这时所涉及到的原料次数可能就已经小200次了,如果是宴席,还会涉及到凉菜与热菜,这样一样预估,明显仅是做一次餐品计划极有可能支撑不住一次宴会。

 

破解“可计算的上限由原料出现的次数决定”的基本逻辑

 

那么,如何解决“可计算的上限由原料出现的次数决定”这一问题?

 

第一步,在原表单中,计算出每一个指定量餐品所需的原料数量;

第二步,不通过子表单,对所有餐品,所需的原料进行汇总计算。

 

因涉及到对一组数据的实时计算,如果不用子表单,在简道云可能暂不易实现,

以下为,借助“云函数”的基本实现逻辑:

 

通过“云函数”实现BOM汇总计算的基本逻辑

 

计算指定量餐品所需原料数量

 

假设有如下一份餐品:

餐品:西红柿炒鸡蛋

原料:鸡蛋清150g,鸡蛋黄150g,西红柿150g,香葱50g

份数:10 

 

原料可分解为:

鸡蛋清#g,鸡蛋黄#g,西红柿#g,香葱#g

150,150,150,50

注:可在另一份表单中提前制作好,用的时候直接调取过来。

 

云函数中的计算方式为:

dict(zip('鸡蛋清#g,鸡蛋黄#g,西红柿#g,香葱#g'.split(','),[i*10 for i in [150,150,150,50]]))

 

通过云函数会收到以下结果:

{
    "release": {
        "鸡蛋清#g": 1500,
        "鸡蛋黄#g": 1500,
        "西红柿#g": 1500,
        "香葱#g": 500
    },
    "string": "{'鸡蛋清#g': 1500, '鸡蛋黄#g': 1500, '西红柿#g': 1500, '香葱#g': 500}"
}

 

汇总现所有餐品所需原料数量

 

这里有两种方式均可

 

方式一:对数据进新重构和解析

 

基本会涉及到UNION()、SPLIT()、CONCATENATE()、COUNT()这四个函数的灵活使用。可参考以下资料,方法尚未实测,逻辑上应该是行的通,以下是两份参考资料。

 

汇总当前表单内多个子表单的数字字段值

https://bbs.fanruan.com/thread-138467-1-1.html

 

一张表单“ 搞懂 ”子表单,内含多种子表单操作

https://bbs.fanruan.com/thread-138159-1-1.html

 

方式二:通过云函数

 

为呈现计算方式,另加入了10份回锅肉与10份芹菜炒肉丝

 

在云函数中的计算方式为:

dict(functools.reduce(operator.add,map(collections.Counter,[{'鸡蛋清#g': 1500, '鸡蛋黄#g': 1500, '西红柿#g': 1500, '香葱#g': 500},{'肥肉#g': 1500, '瘦肉#g': 2000, '青椒#g': 1000, '红椒#g': 500},{'瘦肉#g': 2000, '青椒#g': 500, '芹菜茎#g': 2000, '红椒#g': 500}])))

尾部每一个{}都代表一个餐品所涉及到的原料,另需要在原代码头部添加如下代码:

import collections, functools, operator

 

通过云函数会收到以下结果:

{
    "release": {
        "鸡蛋清#g": 1500,
        "鸡蛋黄#g": 1500,
        "西红柿#g": 1500,
        "香葱#g": 500,
        "肥肉#g": 1500,
        "瘦肉#g": 4000,
        "青椒#g": 1500,
        "红椒#g": 1000,
        "芹菜茎#g": 2000
    },
    "string": "{'鸡蛋清#g': 1500, '鸡蛋黄#g': 1500, '西红柿#g': 1500, '香葱#g': 500, '肥肉#g': 1500, '瘦肉#g': 4000, '青椒#g': 1500, '红椒#g': 1000, '芹菜茎#g': 2000}"
}

 

至此,基于云函数的实现逻辑已分享完毕,单次可计算的上限由【原料出现总次数】转变为【原料类别总个数】,理论上不超过200个就没问题,但需注意可传参数长度上限的问题,最好结合场景实测或咨询下官方。

 

注:在实际应用中,可将第一步与第二步的云函数计算合并为一,可降低云函数的调用次数。

dict(functools.reduce(operator.add,map(collections.Counter,[dict(zip('鸡蛋清#g,鸡蛋黄#g,西红柿#g,香葱#g'.split(','),[i*10 for i in [150,150,150,50]])),dict(zip('肥肉#g,瘦肉#g,青椒#g,红椒#g'.split(','),[i*10 for i in [150,200,100,50]])),dict(zip('瘦肉#g,青椒#g,芹菜茎#g,红椒#g'.split(','),[i*10 for i in [200,50,200,50]]))])))

 

参考资料

 

python 如何将列表中的每个元素乘以一个数字

https://blog.csdn.net/weixin_39717026/article/details/111481122

 

python 将两个列表中的元素一一对应转化为字典的方法

https://blog.csdn.net/qq_27381427/article/details/111769150

 

Python 列表套字典把具有相同键的值进行求和

https://blog.csdn.net/weixin_43997319/article/details/124255237

 

两种计算方式对比

 

通过子表单汇总计算

当计划添加至近30条(子表单内容108条)后,会逐渐出现卡顿的问题,因上限问题最后添加至计划55条(子表单198条)。

 

 

通过云函数汇总计算

本次测试共添加100条,尚未触及可传递上限,理论上可达200条(须实测),点击【开始汇总】后无太过明显卡顿。

 

 

延伸思考

 

自去年6月份,写下【多功能云函数,让后台走到前端,激活更多灵活性】这个贴子,至今已有小一年了,曾也有所怀疑过,莫非它所能支撑的也就是获取正序序列、随机序列这些简单的功能吗?故而,在本次案例中,没有像传统的那样,单独去写一个云函数,而是基于“多功能云函数”再次进行了探索,在测试过程中,发现了更多的用法,以及最后所呈现的复合性命令,之于简道云,愚觉得其价值尚被低估中,仅“一次搭建多场景复用”这一特性就决定了在简道云中它会更便于传播与使用,如果官方可以推出一个类“多功能函数”的功能或插件,将会更便于道友间的分享。

 

快速搞定百度云函数 每月100万次免费调用

https://bbs.fanruan.com/thread-139916-1-1.html

  

更多内容

导航:云函数&前端事件 内容集 

汇总:论坛中发表过的所有帖子

 

更多沟通交流可添加微信(zmlnow)

添加时请备注:简道云

 

 

 

都看到这里了

如果您觉得有用

赞一个呗

赏一个呗

偶会更有动力哈

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0回帖数 2关注人数 18410浏览人数
最后回复于:2022-11-21 15:06

返回顶部 返回列表