资源 下载。
1、 首先,我们需要一个让用户录入“加工费”的地方。在main.gsp增加一个按钮“加工费”:
<span class="menuButton"><g:link class="doc" action="index" controller="materialCost">加工费</g:link></span>
然后用户可以通过这个链接进入加工费管理界面:
点击“新建”,即可录入加工费了:
2、 在“生产计划”列表页面的生产编号列,我们增加一个“工艺表”的链接,使用户能编辑工序表:
<g:link controller="planning" action="craftsList" id="${productionNoInstance.findPlan().id}">工艺表</g:link>
3、 打开PlanningController.groovy,新增一个action,叫做craftsList:
def craftsList = {//显示工艺表
def planningInstance = Planning.get( params.id )//获得生产计划实例
if(!planningInstance) {//若获得的实例为空,显示错误,返回list页面
flash.message = "Planning/u5B9E/u4F8B/u4E3A/u7A7A/uFF0Cid/uFF1A${params.id}"
redirect(action:list)
}
else { return [ planningInstance : planningInstance ] }//返回实例
}
4、 在grails-app/views/planning 下新建一个页面craftsList.gsp(可以用materialList.gsp为模板进行修改):
5、 craftsList.gsp中用到两个button,一个是删除按钮,一个是添加按钮。分别对应的是crafts控制器中的两个action:
def delete = {
def crafts = Crafts.get( params.id )//取得工艺实例对象
def planning=Planning.get(params.planningId)//取得生产计划实例对象
if(crafts) {//若工艺实例对象不为空
try {
crafts.delete()//删除该工艺实例
if(planning){//若生产计划实例不为空
planning.delCrafts(crafts)//从工艺表中删除
planning.save()//更新到数据库
}
flash.message = "/u4ECE/u5DE5/u827A/u8868/u4E2D/u5220/u9664/u5DE5/u827A/u6210/u529F/uFF01"
redirect(controller:'planning',action:'craftsList',id:params.planningId)
}
catch(org.springframework.dao.DataIntegrityViolationException e) {
flash.message = "Crafts ${params.id} could not be deleted"
redirect(action:show,id:params.id)
}
}
else {
flash.message = "Crafts not found with id ${params.id}"
redirect(action:list)
}
}
def create = {
def crafts = new Crafts()//构造新Crafts实例
def planning=Planning.get(params.planningId)//根据请求参数取得Planning实例
crafts.properties = params
return ['craftsInstance':crafts,'planningInstance':planning]
}
同时还需要修改save闭包,在保存时调用planning 实例的addCrafts方法把新建的Crafts实例添加到物料表中:
def save = {
def planning=Planning.get(params.planningId)//根据请求参数取得Planning实例
def craftsInstance = new Crafts(params)//根据请求参数取得Crafts实例
if(!craftsInstance.hasErrors() && craftsInstance.save()) {
planning.addCrafts(craftsInstance)//往工艺表中新增Crafts实例
planning.save()//保存到数据库
//显示信息:成功向工艺表中新增工艺,id:xxx
flash.message = "/u6210/u529F/u5411/u5DE5/u827A/u8868/u4E2D/u65B0/u589E/u5DE5/u827A/uFF0Cid/uFF1A${craftsInstance.id}"
redirect(action:show,id:craftsInstance.id)
}
else {
render(view:'create',model:[craftsInstance:craftsInstance])
}
}
6、 当然,我们还需要给Planning 类增加相应的addCrafts和delCrafts方法:
void addCrafts(Crafts c){
if(craftList==null)
craftList=[]
craftList.add(c)
}
void delCrafts(Crafts c){
if(craftList!=null)
craftList.remove(c)
}
7、 此外,需要修改grails-app/views/crafts/create.gsp:
…… |
|
<div class="nav"> |
|
<span class="menuButton"><g:link class="list" action="craftsList" controller="planning" id="${planningInstance.id}">工艺表</g:link></span> |
//显示菜单项,链接到本生产计划的工艺表,注意controller,action和id参数 |
</div> |
|
<div class="body" align="center"> |
|
<h1>新增工艺</h1> |
|
<span style="color:#ff0066">[产品编号]:</span>${planningInstance.productNo} <span style="color:#ff0066">[计划编号]:</span>${planningInstance.id}<br/><br/> |
//显示产品编号和计划编号 |
<p></p> |
|
…… |
|
<g:form action="save" method="post" > |
|
<div class="dialog"> |
|
<table style="width:600"> |
|
<tbody> |
|
<tr class="prop"> |
|
…… |
|
</table> |
|
</div> |
|
<div class="buttons"> |
|
<g:hiddenField name="planningId" value="${planningInstance?.id} "/> |
//提交时带上本生产计划的id |
<span class="button"><input class="save" type="submit" value="增加" /></span> |
|
</div> |
|
</g:form> |
|
…… |
|
兰色阴影的代码是重点修改的内容。
8、 现在我们来测试是否能正常的从工艺表中新增和删除工艺。打开首页,查看生产计划记录:
点击“工艺表”链接,进入工艺表编制界面:
点击“增加”按钮,进入新增工艺界面,录入一些数据:
点击“增加”,一个新的工艺就添加到工艺表中了:
9、 我们还想修改grails-app/views/crafts/show.gsp,使得它在显示工艺细节的同时,还可以显示与该工艺相关联的生产计划的相关信息:
首先,需要修改CraftsController.groovy中的show闭包:
def show = {
def craftsInstance = Crafts.get( params.id )
def planning=Planning.get(params.planningId)
if(!craftsInstance) {
flash.message = "Crafts not found with id ${params.id}"
redirect(action:list)
}
else { return [ craftsInstance : craftsInstance ,planningInstance:planning] }
}
注意,用红色虚线框住的部分是增加的内容。其目的是通过请求参数planningId,找到指定的Planning实例,然后把Planning实例传递给show.gsp页面。
当然,show.gsp页面也要做一些修改:
…… |
|
<div class="nav"> |
|
<span class="menuButton"><g:link class="list" action="craftsList" controller="planning" id="${planningInstance.id}">工艺表</g:link></span> |
//增加一个菜单项,链接到本生产计划的工艺表页面 |
</div> |
|
<div class="body"> |
|
<h1>查看工艺明细</h1> |
|
<span style="color:#ff0066">[产品编号]:</span>${planningInstance.productNo} |
//显示本生产计划的产品编号 |
<span style="color:#ff0066">[计划编号]:</span>${planningInstance.id}<br/><br/> |
//显示本生产计划的id |
<p></p> |
|
…… |
|
</table> |
|
</div> |
|
<div class="buttons"> |
|
<g:form> |
|
<input type="hidden" name="id" value="${craftsInstance?.id}" /> |
//提交时带上工艺实例的id |
<span class="button"><g:actionSubmit class="delete" onclick="return confirm('确认删除吗?');" value="删除" /></span> |
//删除工艺按钮 |
</g:form> |
|
…… |
|
兰色阴影的部分是重点修改的内容。
10、 现在我们来看已经编制了工艺表的生产计划:
看红框标记的部分,我们又需要修改Crafts类的toString 方法了:
String toString(){
"${fee?.code}-${fee?.workType}:${hours}/u5C0F/u65F6"
}
同时修改grails-app/views/planning/show.gsp,在“工艺表”上增加一个链接:
<g:link action="craftsList" id="${planningInstance?.id}">工艺表</g:link>:
最终grails-app/views/planning/show.gsp效果如图所示:
11、 查看工艺表时我们发现,工艺表中的工艺并没有按照我们分配的工艺序号来进行排列:
那要怎样才能让工艺表中的工艺按照工艺序号来排列呢?
首先需要Crafts实现Comparable接口:
class Crafts implements Comparable{
……
int compareTo(Object other){
sequence<=>other.sequence
}
}
然后在Planning.groovy中,将craftList属性声明为SortedSet类型:
SortedSet craftList //声明craftList需要排序
这样,工艺表中的工艺就会按照工艺序号来排序了:
那么,如果要按照倒序进行排序怎么办呢?很简单,使用“-”(负号):
int compareTo(Object other){
-sequence<=>other.sequence
}
结果:
12、