< 返回
《mes制造执行系统的原理与实现》连载(3)

第四章装配

4.1装配(assembly)与子装配(sub-assembly)

erp中的产品不仅是物料,它同时还是一个装配件,通过bom表达它的装配结构。

一个装配件由若干个子装配件组成。

比如一台pc,包含的子装配件有主板、cpu、显卡、硬盘、显示器等,其bom的结构如图4-1:

这个结构表示一台pc由1件主板、1件cpu、1件显卡、2件硬盘、1件显示器、1件机箱组成。这种结构可以看成pc这种产品的一个属性。在mes系统中,这种结构通过产品工艺路线的若干个工位体现,如图4-2:

图4-2表示pc的装配工艺共分散在4个工位中。

为了记录产品与其子装配之间的关系,我们需要将产品的序列号与子装配的序列号进行关联。具体的操作如表4-3:

关联完成之后,mes数据库里就保留了产品与其装配件之间序列号的关联关系,如图4-4:

从技术的角度而言,有两种方法记录序列号的关联关系。第一种方法是在数据库里保存产品的结构,然后各相关序列号指向这种结构。

第二种方法是直接记录各序列号之间的关联关系,形成一棵“树”。比较而言,第一种方法方便形成批量数据关联关系的报表,而第二种方法隔离了序列号数据与产品结构,所以产品的结构变了也不会影响历史数据。

我们更倾向于采用第二种方法,因为这对于后面要说到的序列号关联替换、注销等操作更为方便。

4.2序列号关联表的设计

考虑到关联的结构,用父-子节点来定义树状结构是非常方便的,效率也比较高。如图4-5所示的结构:

id字段是序列号所在的节点,sn是序列号,father_id是序列号的父节点,如为负数则表示此父节点并没有对应的序列号存在,也就是说此sn是该节点数上的根节点,为方便,我们称负数的节点为虚节点。

4.3新增序列号关联

按照节点的设计,任何一次关联动作可以看成把某一节点设置为另一节点的父节点,为方便叙述,我们统一称为把sn1的节点设置为sn2的父节点,或者把sn2关联到sn1上。

新增序列号关联的方法为:更新序列号关联表,设置sn2的父节点等于sn1的节点。

为避免逻辑上的混乱,我们在关联之前必须进行检查,规则为:

1)sn2的父节点必须为虚节点,也就是说sn2是根节点,这样做是为了保证任何一个sn只能有一个父节点。

2)sn2的父节点不能是sn1所在树上的根节点。

例如,将2221关联到1116上,如图4-7

则2221必须没有父节点,这样不会造成大于1个父节点。而且2221必须不等于1116树上的根节点(1111)。

4.4序列号关联替换

输入旧序列号sn_old、新序列号sn_new,以进行替换。替换的前提条件:

1)sn_new的父节点必须是虚节点,也就是说,sn_new必须是根节点。

2)sn_new不能等于sn_old所在树上的根节点。

替换的方法为:

1)设置sn_new的父节点等于sn_old的父节点。

2)设置sn_old的父节点为一个新的虚节点,这样sn_old仍可以看成以sn_old为根的一棵树。

如图4-8的已有关联:

以6666替换3333的结果如图4-9:

4.5序列号关联注销

对于在序列号关联表中已有记录的序列号,它不仅有自己的节点,而且也可能是其它序列号的父节点,因此在注销时可能对其它序列号产生影响。

序列号关联注销的动作为:

1)定义该序列号的父节点为一新的虚节点;

2)更新所有该序列号的子节点,分别定义其父节点为新的虚节点。

例如:注销1113,如图4-10所示:

4.6序列号关联查询

输入单个序列号进行关联查询的方法为:

1)追溯至此序列号的根节点。

2)以根节点做递归查询,列出所有树状结构的子节点。

3)在每个节点上,通过关联表得到序列号的相关信息。

这种方法很容易还原生成序列号关联关系的树,而且也不存在效率的问题。

但是在实际的生产中,经常需要做大批量的查询,并且生成格式统一的报表,比如根据工单输出所有的关联序列号。象这种情况,如果还要逐个序列号进行迭代查询的话那么效率就会有很大的影响。解决方法是,在查询之前,系统定期对关联数据进行后台处理,把树表展成平表,这样查询时就无需迭代,一条sql就可以跑出所有的数据。具体的实现方面,需要数据库设计方面的技巧,也可以参考数据仓库的原理。