大家可以到此处下载。
1、 修改“生产编号”域类代码
grails-app/domain/ProductionNo.groovy:
class ProductionNo {
CooperationUnit coo //协作单位
String prefix //前缀:2位年份+"-"+2位月份
String suffix //后缀
int sno //中缀:2位顺序编号
static belongTo=[CooperationUnit]//定义1对多关系,即1个协作单位对应多个生产编号
static constraints = {
coo(blank:false)
suffix(inList:["/u6025","/u6025/u53E6","/u60251","/u60252","/u60253","/u60254","/u60255"])//后缀值只能从列表中选取,其中中文用native2ascii编码
}
String toString(){
"${coo.shortName}${prefix}-${sno}${suffix}"
}
static optionals=["prefix","sno"]
}
2、 在浏览器中查看新建生产编号页面:
可以看到新建记录的coo(协作单位)字段是一个下拉列表,其中列出了所有协作单位的id。现在我们把它改为协作单位的简称。打开grails-app/domain/CooperationUnit.groovy/Create.gsp,增加一个toStirng方法:
String toString(){
"$shortName"
}
刷新页面,已变为:
3、 由于“生产编号”中的前缀是由2位年份和2位月份构成的,sno应该是按月进行顺序编号的,这两个字段最好是由系统自动生成,不应该由用户进行编辑。因此要把这两个文本框的只读属性变成true。打开grails-app/views/productionNo/Create.gsp文件,将这两个表单标签中加上readonly属性:
<input type="text" id="sno" …… readonly/>
然后,在grails-app/controlers/ProductionNoController.groovy中,修改控制器中关于Create的逻辑,:
def create = {
def productionNoInstance = new ProductionNo()
SimpleDateFormat sdf = new SimpleDateFormat("yy-MM")//日期格式:yy-MM
Date date=new Date() //取当前日期
params.prefix=sdf.format(date) //取当前日期的2位年份和2位月份存入参数中的prefix
//查找prefix=params.prefix的记录,sno倒序排列.注意find方法只返回第一条记录
def list=ProductionNo.find("from ProductionNo as a where a.prefix=? order by a.sno desc",[params.prefix])
int sno=0
if(!list)sno=1//如果该月份尚无记录,编号从1开始
else{//否则从该月最大编号后续编起
sno:${list.sno},suffix:${list.suffix}")
sno=list.sno+1//在原有编号基础上接着往下编
}
params.sno=sno
productionNoInstance.properties = params//给新建的ProductionNo对象属性设值
return ['productionNoInstance':productionNoInstance]
}
刷新页面,效果变为:
其中,“年月”和“当月编号”栏的内容是控制器中的Create这个Action(动作)自动生成的。
4、 修改域类ProductionNo,为其增加一个toString方法,这个方法在将来会有用处:
String toString(){ String.format('%1$%2$-%3$02d%4$',coo.shortName,prefix,sno,suffix)
}
5、 当新建一个生产编号后,页面会转到show.gsp,在这里显示新插入的记录。我们需要在这个页面调用toString方法,以显示对象经过格式化转换后的字符串。打开grails-app/views/productionNo/show.gsp,编辑以下内容:
<div class="body">
<h1>${productionNoInstance }</h1>
<g:if test="${flash.message}">
注意红色部分的代码,这会自动调用toString 方法。因此当新建完一个生产编号后,页面显示如下:
注意页面顶部显示了ProductionNo的toString方法后的结果。
6、