一种EBOM到CBOM的映射方法技术领域
本发明涉及生产制造管理领域,具体涉及一种BOM到CBOM的映射技术。
背景技术
BOM是一个用来表示产品的层次结构,它包含有组件、原材料、数量、生产
指令和损耗率等重要数据。BOM的主要目的是定义最终产品与它的组件、半成品、
原材料(采购物料)之间的父子关系。BOM的最基本形式是工程BOM(Engineering
BOM,EBOM),通常在一件产品设计完成时由产品工程师生成。在产品生命周期
中,BOM除了用于产品设计外,还会被用于产品计划、工艺、采购、生产和维修
等方面,根据产品生命周期各个阶段的不同需求,各个部门产生了各种各样的
文件,这些文件就是产品生命周期中的BOM文件。例如,工艺工序阶段由设计
部门生成工艺BOM(PlanProcessBOM,PPBOM),购买阶段由采购部门生成采
购BOM(BuyingBOM,BBOM),生产阶段由生产部门生成制造BOM(Manufacturing
BOM,MBOM),维修阶段由维修部门生成维修BOM(RepairBOM,RBOM)。EBOM作
为BOM的最基本形式在ERP系统里面是一定存在的,而PPBOM、BBOM、MBOM、RBOM
等其它形式的BOM需要从EBOM进行映射。国内外研究人员对产品全生命周期的
各种BOM视图进行了深入研究,提出了多种产品BOM建模方法及模型,EBOM
与PPBOM、BBOM、MBOM、RBOM之间的映射技术在很多公开的文献里面可以查询
得到。
由上面的介绍可知,产品生产过程可能会为分若干阶段,各个阶段具有一
定时序性,某个阶段产品在前一阶段产品的基础上进行生产。因此,各个阶段
的产品之间有某种数量上的包含关系,我们把记录这种包含关系的文件叫做包
含BOM(ContainingBOM,CBOM)。
CBOM在实际生产中的一个典型应用就是保税加工物料的统计。保税加工是
指相关企业经过海关批准,对未办理纳税手续进境的货物进行实质性的加工装
配和制造以及相关配套业务的生产性经营行为。由于生产原料未办理纳税手续
直接存入企业的仓库,为了防止企业把这种原料挪为它用,造成关税流失,海
关必须对其进行严格的监管。目前主要的监管方法是企业定期(如每月)向海
关报告库存情况。库存统计公式为:期初原料数量(O)+本期进料数量(I)=
在手原料数量(H1)+已加工产品相当原料数量(H2)+本期已出口成品相
当原料数量(H3)。如果该公式立,则说明保税加工物料没有被挪为它用。在公
式中,O、I和H1可以从库存系统中直接获得,但H2与H3需要对半成品或成品
进行折算统计,这时就需要使用到CBOM。当今全球化经济环境下,生产企业更
多的是采用订单生产、面向产品的生产方式,这种生产方式要求生产企业根据
客户的需求对已设计好的产品进行定制,这意味着EBOM会根据不同的客户订单
产生变化,EBOM变化会引起CBOM产生变化,因此,建立固定的CBOM比较困难。
在保税加工企业中,为了获得准确的报关数据,一般的做法是每次进行统计时,
对每一种成品或者半成品的BOM文件进行遍历,重新建立成品、半成品与保税
物料之间的数量关系,最后再根据库存情况进行统计。这种做法虽然可行,但
是计算起来比较费时费力。如果能找到EBOM向CBOM的映射技术,就能在更新
EBOM时,同步快速更新CBOM相应记录的数据,也即当EBOM更新时,就能同步
快速重新建立成品、半成品与保税物料之间的数量关系,即有了实时CBOM的支
持,就能可以设计出比目前更为高效的保税物料的统计方法,也为其它类似的
库存统计项目提供借鉴。
发明内容
本发明的目的是解决现有技术的缺陷,提供一种当更新EBOM时,能同步快
速更新CBOM相应记录的数据的EBOM到CBOM的映射技术,采取的技术方案如下:
一种EBOM到CBOM的映射方法,包括:
初始化CBOM;
当改动EBOM时级联更新CBOM的相关项,具体包括:
当在EBOM中添加BOM结点时按如下步骤级联更新CBOM的相关项:
S11.令当前给BOM子结点添加的记录为R,令PN为R的父亲、CN=R、vQty=0,
创建两个新的列表lstValues和lstQtys;
S12.在CBOM中查询所有满足条件:pValue=R.mValue的记录,设查找的
结果集合为RS1,对RS1中的每一条记录R1,执行S13;
S13.令vQty=R.qty×R1.qty,将R1.cValue添加到lstValues,将vQty添加到
lstQtys,然后更新CBOM的相关项;
S14.进行对PN祖先结点的迭代,更新包含数量,然后结束。
作为优选,当删除EBOM的BOM结点时,按如下步骤级联更新CBOM的相关
项:
S21.令当前从BOM子结点中删除的记录为R,令PN为R的父亲、CN=R、
vQty=0,创建两个新的列表lstValues和lstQtys;
S22.在CBOM中查询所有满足条件:pValue=R.mValue的记录,设查找的
结果集合为RS1,对RS1中的每一条记录R1,执行S23;
S23.令vQty=R.qty×R1.qty×(-1),将R1.cValue添加到lstValues,将vQty
添加到lstQtys,然后更新CBOM的相关项;
S24.进行对PN祖先结点的迭代,更新包含数量,然后结束。
作为优选,当修改EBOM的BOM结点时按如下步骤级联更新CBOM的相关项:
S31.令当前从BOM子结点中删除的记录为R,令PN为R的父亲、CN=R、
vQty=0,创建两个新的列表lstValues和lstQtys;
S32.判断R中被修改的字段,若只是修改R的qty字段,则执行S33,如果
修改的是R的mValue字段,则执行S35,否则结束;
S33.在CBOM中查询所有满足pValue=R.mValue的记录,设查找的结果集
合为RS1,对RS1中的每一条记录R1,执行S34;
S34.令vQty=(R.qty-R.lod_qty)×R1.qty,将R1.cValue添加到lstValues,将
vQty添加到lstQtys,然后更新CBOM的相关项,R.lod_qty表示R记录qty字段被
修改前的值,转S39;
S35.在CBOM中查询所有满足pValue=R.old_mValue的记录,设查找的结
果集合为RS1,对RS1中的每一条记录R1,执行S36,R.old_mValue表示修改
前R的物料编码;
S36.令vQty=R.lod_qty×R1.qty×(-1),将R1.cValue添加到lstValues,将vQty
添加到lstQtys,然后更新CBOM的相关项,进行对PN祖先结点的迭代,更新
包含数量;
S37.清空RS1、lst_Values和lst_Qtys,在CBOM中查询所有满足pValue=R.
mValue的记录,将结果集合放入RS1,对RS1中的每一条记录R1执行S38;
S38.令vQty=R.qty×R1.qty,将R1.cValue添加到lstValues,将vQty添加到
lstQtys,然后更新CBOM的相关项,转S39;
S39.进行对PN祖先结点的迭代,更新包含数量,然后结束。
作为优选,所述更新CBOM的相关项具体为:在CBOM中查询是否存在符
合pValue=PN.mValue和cValue=CN.mValue的记录,如果不存在,则在CBOM
中新增记录(PN.mValue,CN.mValue,vQty),如果存在,则更新该记录的数量qty:
qty=qty+vQty。
本发明中,相关的数据及其结构模式为:
物料主文件(序号,物料编码,物料名称,物料分类,单位,低阶码)
BOM父结点(序号,物料编码,BOM类型)
BOM子结点(序号,物料编码,数量,父结点序号)
CBOM(序号,父物料编码,统计物料编码,数量)
库存(序号,物料编码,在手数量)
统计结果(序号,父物料编码,子物料编码,数量),
其中,序号为id,物料编码为mValue,物料分类为mCategory,单位为mUOM,
低阶码为mLowlevel,父物料编码为pValue,子物料编码为cValue,数量为qty,
父节点pBom,X.Y形式表示对象X中属性Y的值。
假设M为物料主文件中所有物料组成的集合,R为实数集,建立从M×M到R
的映射关系:
即:f(m1,m2)=r,m1,m2∈M,r∈R
该映射函数表示m1中包含m2的数量为r,单位为该物料的标准单位,在物料
主文件中规定。
令P(m)为m在BOM结构树中所有祖先的组成的集合,pm为m的直接父亲,
显然有pm∈P(m)。由BOM和f的定义可知该映射具有以下性质:
f(m,m)=1,m∈M
f ( m 1 , m 2 ) = 0 , m 1 , m 2 ∈ M , m 1 ∉ P ( m 2 ) ]]>
设m,m1,v∈M,如果有m,m1∈P(v),m=pm1,则有f(m,v)=f(m,m1)×f(m1,v)。
从以上式子可以看出,要获得f(m,v)的值,可以通过计算f(m,m1)×f(m1,v)的
值获得。因为f(m,m1)在BOM子结点可以直接得到,如果已经知道f(m1,v),那
么f(m,m1)×f(m1,v)就可以计算出来。
上述性质说明如果已经知道了儿子的物料包含情况,则便可计算出父亲的包
含情况,本申请将这个特性叫做逆传递性。利用这个性质,当要进行BOM到
CBOM的映射时,可以从BOM的叶子结点开始,逆向遍历BOM结构树,快速
建立映射结果。而在物料主文件中,每一种物料都有一个低阶码属性mLowlevel,
该属性标识该物料在整个系统的BOM树组成的森林中所处的最深层次,用大于
等于0的整数表示。mLowlevel的数值越大,说明该料件在BOM树中的层次越
深,利用该属性可以帮助决定所有的叶子节点。
在实际的应用中,计算所有物料两两之间的包含关系是没有意义。根据实际
的需用,一般是计算所有物料与某些特定物料之间的包含关系,例如,所有物
料与贵重物料、所有物料与保税物料。我们将特定物料组成的集合记为V,显然,
V∈M,因此映射关系f在M×V上同样是成立的,因此也可以用同样的方法快
速建立映射结果。
在对CBOM进行初始化以后,如果EBOM不再产生变化,那么CBOM就
可以固定下来。然而事实并非如此。在单件小批量的生产方式下,EBOM是经
常要产生变化的。这就要考虑CBOM与EBOM之间同步的问题。每次对EBOM
进行改动后进行一次初始化操作虽然可行,但是时间花费很大。如果找到改动
EBOM时能够级联修改CBOM且仅修改CBOM相关项的方法,则此方法比做
一次初始化操作的效率高,CBOM与EBOM的数据同步的实时性也会提高。可
能改动EBOM的方式有添加、删除和修改BOM结构树的结点。
在添加结点时,如果仅仅是添加父结点,即只在BOM父结点中添加记录,
由于没有建立父子关系,没有涉及到包含关系的建立,因此这种情况可以不考
虑。在添加子结点时,即在BOM子结点中添加记录时,必定要建立结点间的父
子关系,这时要考虑父亲与儿子间包含关系的变化。按照BOM的数据结构,添
加的逻辑顺序是先建立父结点,再建立子结点,最后建立父子关系。以上三个
步骤中父结点和子结点也有可能是已经存在的。因此,可以分为4种情形:1、
父结点已经存在,子结点不存在;2、父节点不存在,子结点存在;3、父子结
点均存在;4、父子结点均不存在。
以上4种情中,情形1、情形3和情形4的情况类似,均为将一个节点添加
到另一节点之上,处理方法本质上均为将子节点的包含数量累加到直接父节点
及其它祖先节点。情形2较其它三种情形复杂,但是给父节点添加子节点时是
按顺序进行的,因此可以分解为两步情形3的操作。
删除结点是添加节点的逆过程。假设要将结点x从结点y的儿子中删除,如
果且x中包含有v′,需要将y包含v′的量相应减少,即做
f(y,v′)=f(y,v′)-f(x,v′)*f(y,x),且f(y,v′)、f(y,v′)、f(y,x)均为已知。
对y的祖先结点做类似操作。删除结点时级联更新CBOM的执行时刻为从BOM
子结点中删除一条记录成功之后。
修改结点中涉及到包含关系的操作有修改用料或修改用量,即修改BOM子
结点的mValue或qty字段。修改用料相当于执行了先删除再添加的操作,因此,
在处理时,把旧记录的物料和用量记录下来,当修改完成后,先对旧记录执行
删除结点的算法,然后针对修改后记录执行添加结点算法。修改用量则相对简
单,只需要在原来基础上对包含数量做相应减少即可。
进行对PN祖先结点的迭代更新包含数量时,待更新的包含物料为
lst_Values,更新的数量为lst_Qtys。
作为优选,初始化CBOM包括:
a.清空CBOM;
b.对特定物料组成的集合V中的每一个元素v,更新CBOM,具体为:在CBOM
中查询是否存在符合pValue=v.mValue,cValue=CN.mValue的记录,如果不存在,
则在CBOM中新增记录(v.mValue,v.mValue,1),如果存在,则令该记录的数量加
1;
c.计算物料主文件中所有物料组成的集合M中所有元素的低阶码
mLowlevel的最大值,设为maxLowlevel,令curL=maxLowlevel;
d.如果curL<0,则结束,否则在物料主文件中查找所有mLowlevel=cuL的
记录,设查找结果集合为RS1,对RS1中的每条记录R1,转步骤e;
e.在BOM父结点中查找所有满足pValue=R1.mValue的记录,设查找的结果
集合为RS2,对RS2中的每条记录R2,执行步骤f;
f.如果R2.mValue代表的元素属于V,则更新CBOM,具体为:在CBOM
中查询是否存在符合pValue=R1.mValue,cValue=R2.mValue的记录,如果不存在,
则在CBOM中新增记录(R1.mValue,R2.mValue,R2.qty),如果存在,则令该记录的
数量加qty;然后转步骤h,否则执行步骤g;
g.在CBOM中查询所有满足pValue=R2.mValue的记录,设查找的结果集合
为RS3,对RS3中的每条记录R3,更新CBOM,具体为:在CBOM中查询是否
存在符合pValue=R1.mValue,cValue=R3.cValue的记录,若没有则新增记录
(R1.mValue,R3.cValue,R2.qty*R3.qty),若有则令该记录的数量加R2.qty*R3.qty,转
步骤h;
h.curL=curL-1,转步骤d。
与现有技术相比,本发明的有益效果:能够在EBOM被改动时同步快速更
新CBOM相应记录的数据,以快速及时重新建立成品、半成品与特定物料之间的
数量关系,而无需每次进行统计时都对BOM进行遍历,节省了人力物力。
附图说明
图1是本发明添加BOM结点时更新BOM的流程图;
图2是本发明删除BOM结点时更新BOM的流程图;
图3是本发明修改BOM结点时更新BOM的流程图;
图4是本发明添加BOM结点时的示意图;
图5是本发明添加BOM结点时的示意图;
图6是本发明添加BOM结点时的示意图;
图7是本发明添加BOM结点时的示意图。
具体实施方式
下面结合附图和实施例对本发明作进一步说明。
实施例:
如图1所示,一种EBOM到CBOM的映射方法,包括:
初始化CBOM;
当改动EBOM时级联更新CBOM的相关项,具体包括:
当在EBOM中添加BOM结点时按如下步骤级联更新CBOM的相关项:
S11.令当前给BOM子结点添加的记录为R,令PN为R的父亲、CN=R、vQty=0,
创建两个新的列表lstValues和lstQtys;
S12.在CBOM中查询所有满足条件:pValue=R.mValue的记录,设查找的
结果集合为RS1,对RS1中的每一条记录R1,执行S13;
S13.令vQty=R.qty×R1.qty,将R1.cValue添加到lstValues,将vQty添加到
lstQtys,然后更新CBOM的相关项;
S14.进行对PN祖先结点的迭代,更新包含数量,然后结束。
如图2所示,当删除EBOM的BOM结点时,按如下步骤级联更新CBOM的相
关项:
S21.令当前从BOM子结点中删除的记录为R,令PN为R的父亲、CN=R、
vQty=0,创建两个新的列表lstValues和lstQtys;
S22.在CBOM中查询所有满足条件:pValue=R.mValue的记录,设查找的
结果集合为RS1,对RS1中的每一条记录R1,执行S23;
S23.令vQty=R.qty×R1.qty×(-1),将R1.cValue添加到lstValues,将vQty
添加到lstQtys,然后更新CBOM的相关项;
S24.进行对PN祖先结点的迭代,更新包含数量,然后结束。
如图3所示,当修改EBOM的BOM结点时按如下步骤级联更新CBOM的相关
项:
S31.令当前从BOM子结点中删除的记录为R,令PN为R的父亲、CN=R、
vQty=0,创建两个新的列表lstValues和lstQtys;
S32.判断R中被修改的字段,若只是修改R的qty字段,则执行S33,如果
修改的是R的mValue字段,则执行S35,否则结束;
S33.在CBOM中查询所有满足pValue=R.mValue的记录,设查找的结果集
合为RS1,对RS1中的每一条记录R1,执行S34;
S34.令vQty=(R.qty-R.lod_qty)×R1.qty,将R1.cValue添加到lstValues,将
vQty添加到lstQtys,然后更新CBOM的相关项,R.lod_qty表示R记录qty字段被
修改前的值,转S39;
S35.在CBOM中查询所有满足pValue=R.old_mValue的记录,设查找的结
果集合为RS1,对RS1中的每一条记录R1,执行S36,R.old_mValue表示修改
前R的物料编码;
S36.令vQty=R.lod_qty×R1.qty×(-1),将R1.cValue添加到lstValues,将vQty
添加到lstQtys,然后更新CBOM的相关项,进行对PN祖先结点的迭代,更新
包含数量;
S37.清空RS1、lst_Values和lst_Qtys,在CBOM中查询所有满足pValue=R.
mValue的记录,将结果集合放入RS1,对RS1中的每一条记录R1执行S38;
S38.令vQty=R.qty×R1.qty,将R1.cValue添加到lstValues,将vQty添加到
lstQtys,然后更新CBOM的相关项,转S39;
S39.进行对PN祖先结点的迭代,更新包含数量,然后结束。
所述更新CBOM的相关项具体为:在CBOM中查询是否存在符合pValue=
PN.mValue和cValue=CN.mValue的记录,如果不存在,则在CBOM中新增记
录(PN.mValue,CN.mValue,vQty),如果存在,则更新该记录的数量qty:qty=qty+
vQty。
本实施例中,相关的数据及其结构模式为:
物料主文件(序号,物料编码,物料名称,物料分类,单位,低阶码)
BOM父结点(序号,物料编码,BOM类型)
BOM子结点(序号,物料编码,数量,父结点序号)
CBOM(序号,父物料编码,统计物料编码,数量)
库存(序号,物料编码,在手数量)
统计结果(序号,父物料编码,子物料编码,数量),
其中,序号为id,物料编码为mValue,物料分类为mCategory,单位为mUOM,
低阶码为mLowlevel,父物料编码为pValue,子物料编码为cValue,数量为qty,
父节点pBom,X.Y形式表示对象X中属性Y的值。
在添加结点时,如果仅仅是添加父结点,即只在BOM父结点中添加记录,
由于没有建立父子关系,没有涉及到包含关系的建立,因此这种情况可以不考
虑。在添加子结点时,即在BOM子结点中添加记录时,必定要建立结点间的父
子关系,这时要考虑父亲与儿子间包含关系的变化。按照BOM的数据结构,添
加的逻辑顺序是先建立父结点,再建立子结点,最后建立父子关系。以上三个
步骤中父结点和子结点也有可能是已经存在的。因此,可以分为4种情形:1、
父结点已经存在,子结点不存在;2、父节点不存在,子结点存在;3、父子结
点均存在;4、父子结点均不存在。以上四种情况分别如图4至7所示,图中阴
影表示新增的结点,虚线表示新建立的父子关系。其他各种情形均为以上四种
情形组合。
以上4种情中,情形1、情形3和情形4的情况类似,均为将一个节点添加
到另一节点之上,处理方法本质上均为将子节点的包含数量累加到直接父节点
及其它祖先节点。情形2较其它三种情形复杂,但是给父节点添加子节点时是
按顺序进行的,因此可以分解为两步情形3的操作。
进行对PN祖先结点的迭代更新包含数量时,待更新的包含物料为lst_Values,
更新的数量为lst_Qtys。
本实施例中,初始化CBOM包括:
a.清空CBOM;
b.对特定物料组成的集合V中的每一个元素v,更新CBOM,具体为:在CBOM
中查询是否存在符合pValue=v.mValue,cValue=CN.mValue的记录,如果不存在,
则在CBOM中新增记录(v.mValue,v.mValue,1),如果存在,则令该记录的数量加
1;
c.计算物料主文件中所有物料组成的集合M中所有元素的低阶码
mLowlevel的最大值,设为maxLowlevel,令curL=maxLowlevel;
d.如果curL<0,则结束,否则在物料主文件中查找所有mLowlevel=cuL的
记录,设查找结果集合为RS1,对RS1中的每条记录R1,转步骤e;
e.在BOM父结点中查找所有满足pValue=R1.mValue的记录,设查找的结果
集合为RS2,对RS2中的每条记录R2,执行步骤f;
f.如果R2.mValue代表的元素属于V,则更新CBOM,具体为:在CBOM
中查询是否存在符合pValue=R1.mValue,cValue=R2.mValue的记录,如果不存在,
则在CBOM中新增记录(R1.mValue,R2.mValue,R2.qty),如果存在,则令该记录的
数量加qty;然后转步骤h,否则执行步骤g;
g.在CBOM中查询所有满足pValue=R2.mValue的记录,设查找的结果集合
为RS3,对RS3中的每条记录R3,更新CBOM,具体为:在CBOM中查询是否
存在符合pValue=R1.mValue,cValue=R3.cValue的记录,若没有则新增记录
(R1.mValue,R3.cValue,R2.qty*R3.qty),若有则令该记录的数量加R2.qty*R3.qty,转
步骤h;
h.curL=curL-1,转步骤d。
通过本实施例,能够在EBOM被改动时同步快速更新CBOM相应记录的数据,
以快速及时重新建立成品、半成品与特定物料之间的数量关系,而无需每次进
行统计时都对BOM进行遍历,节省了人力物力。