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)
添加时请备注:简道云
都看到这里了
如果您觉得有用
赞一个呗
赏一个呗
偶会更有动力哈 |