一步一步学grails:9 工序表

资源 下载。

1、 首先,我们需要一个让用户录入“加工费”的地方。在main.gsp增加一个按钮“加工费”:

<span class="menuButton"><g:link class="doc" action="index" controller="materialCost">加工费</g:link></span>

然后用户可以通过这个链接进入加工费管理界面:

点击“新建”,即可录入加工费了:

2、 在“生产计划”列表页面的生产编号列,我们增加一个“工艺表”的链接,使用户能编辑工序表:

&nbsp;&nbsp;<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()//保存到数据库

//显示信息:成功向工艺表中新增工艺,idxxx

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 类增加相应的addCraftsdelCrafts方法:

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,actionid参数

</div>

<div class="body" align="center">

<h1>新增工艺</h1>

<span style="color:#ff0066">[产品编号]</span>${planningInstance.productNo}&nbsp;&nbsp;&nbsp;&nbsp;

<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}&nbsp;&nbsp;&nbsp;&nbsp;

//显示本生产计划的产品编号

<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、

你可能感兴趣的:(grails)