代码改变世界

一步一步学grails:9 工序表

2010-01-28 16:21  乱世文章  阅读(255)  评论(0编辑  收藏  举报

资源 下载。

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、