资源在此处下载。
GORM-groovy 对象关系映射中,最常见的不是1:1关系,而是1:M关系,也不是M:M关系(因为M:M关系比较麻烦,一般不能直接定义,通常都要拆分成两个1:M关系来处理,并且要引入第3个类,否则会出现问题)。在本项目中,最利于理解1:M的地方,就是“生产计划”planning域。
这不是一个单独的域,他分别与其他4个域类都发生了1:1或1:M关系。这些域都不能单独看待,而要整体看待。
1、 下面来讨论这5个域类:
1) 生产计划域
实际上就是根据订单而制订出的产品的具体生产过程。它包含了以下几个重要的内容:
首先,既然是根据订单进行生产,那么生产计划中必须包含有订单对象(即产品编号-前面已定义了这个域)。
其次,产品生产是要消耗一定原材料的,而且原材料可能不只一种,因此在生产计划中应当有物料表,以列出生产中可能用到的各种原材料。
最后,一个产品可能需要使用到一个或一系列的生产工艺才能制造出来,因此还应当在生产计划中列出工艺表,以列出可能用到的生产工艺。
生产计划中产品编号是一个相对简单属性,一个计划只针对一个产品,因此只会有一个产品编号,这只是1:1关系而已,前面已经定义了产品编号域,这里不再讨论。
属性物料表和工艺表则不同,它们包含的都是集合,由多个对象构成列表,因此这是1:m(1对多)关系,而集合里面的每个对象都是复杂对象,应当定义为域类。下面来一一讨论。当然,除了这些复杂对象外,生产计划还有一些简单的属性,比如简单的string 、int。该域类代码如下:
class Planning {
static constraints = {
productNo()
productName()
spec(nullable:true)
pieces()
inspection(nullable:true)
warehousing(nullable:true)
shipment(nullable:true)
factMaterial(nullable:true)
consumeMaterial(nullable:true)
accountsActual()
accountsDue()
rejection(nullable:true)
linkman(nullable:true)
remark(nullable:true)
}
static optionals=['spec','inspection','warehousing','shipment','factMaterial','consumeMaterial','accountsActual','accountsDue','rejection','linkman','remark']
ProductionNo productNo //产品编号
String productName //产品名
String spec //规格型号
static hasMany=[materials:Material,craftList:Crafts]//两个1对多关系:与物料表表项,与工艺表表项
int pieces //件数
String inspection //检验
String warehousing //入库
String shipment //出库,领用
String factMaterial //实际用料
String consumeMaterial //材料消耗
float accountsActual //实收金额
float accountsDue //应收金额
String rejection //退货
String linkman //联系人
String remark //备注
}
注意其中的2个地方。一个是
ProductionNo productNo //产品编号
这表明了一个1:1关系,因此我们还需要修改ProductionNo域类,加上这句:
static belongTo=[Planning]//定义1对1关系,即1个生产编号对应1个生产计划
另一个地方是
static hasMany=[materials:Material,craftList:Crafts]//两个1对多关系:与物料表表项,与工艺表表项
这定义了两个1:m关系。
2) 物料表
物料表实际上是1个以上的物料表表项组成的列表。物料表中的表项我们可以单独定义为一个域:
class Material {//Material域:定义生产计划中某个产品的一种原材料-物料表表项
static constraints = {
}
MaterialCost fee //定义一个材料的价格1:1关系
float amount=0 //该材料所需数量
}
而一个MaterialCost定义了一个材料的价格:
class MaterialCost {
static constraints = {
code(blank:false,nullable:false)//必填
name(blank:false,nullable:false)//必填
price(min:0.0f,nullable:false)//必填,值不能为负
unit()
remark()
}
static optionals=["unit","remark"]
String code //代码
String name //物料类型
float price //单价(元)
String unit='/u516C/u65A4' //单位,默认"公斤",经native2acii转码