一步一步学grails:8 物料表

来源:互联网 发布:股指期货数据接口 编辑:程序博客网 时间:2024/04/29 04:48

资源下载

1、  首先,我们需要一个让用户录入“材料费”的地方。在list页面增加一个按钮“材料费”:

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

然后用户可以通过这个链接录入材料费了:

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

<g:if test="${productionNoInstance.findPlan()}">

……

<g:link controller="planning" action="materialList" id="${productionNoInstance.findPlan().id}">物料表</g:link>

……

 </g:if>

3、  打开PlanningController.groovy,新增一个action,叫做materialList

def materialList = {//显示物料表

def planningInstance = Planning.get( params.id )//获得生产计划实例

if(!planningInstance) {//若获得的实例为空,显示错误,返回list页面

      flash.message = "Planning not found with id ${params.id}"

      redirect(action:list)

}

else { return [ planningInstance : planningInstance ] }//返回实例

}

4、  grails-app/views/planning 下新建一个页面materialList.gsp:

……

    <body>

……

<h1>物料表</h1>

<span style="color:#ff0066">[产品编号]</span><g:link action="show" id="${planningInstance.id}">${planningInstance.productNo}</g:link>

&nbsp;&nbsp;&nbsp;&nbsp;

<span style="color:#ff0066">[计划编号]</span>${planningInstance.id}<br/><br/>

……

<thead>

<tr>

                           <th width="60">Id</th>

                           <th width="150">物料代码</th>

                              <th width="200">物料类型</th> 

                              <th width="80">单价</th>

                              <th width="80">数量</th>

                              <th/>

                        </tr>

……

<tbody>

<g:each in="${planningInstance.materials}" status="i" var="m">

                        <tr class="${(i % 2) == 0 ? 'odd' : 'even'}">

                        <td>${m?.id}</td>

                        <td>${m?.fee?.code}</td>

                        <td>${m?.fee?.name}</td>

                        <td>${m?.fee?.price}</td>

                        <td>${m?.amount}</td>

                        <td>

<g:form  controller="material"  action="delete">

<input type="hidden" name="planningId" value="${planningInstance?.id}" />

<input type="hidden" name="id" value="${m?.id}"/>

<span class="button"><g:submitButton name="delete" class="edit" value="删除"/></span>

</g:form>

</td>

</tr>

</g:each>

</tbody>

</table>

</div>

<div class="buttons" >

                <g:form  controller="material"  action="create">

                    <input type="hidden" name="planningId" value="${planningInstance?.id}" />

                    <span class="button"><g:submitButton name="submit" class="edit" value="添加"/></span>

</g:form>

</div>

……

注意其中的两个button,一个是删除按钮,一个是添加按钮。分别对应的是material控制器中的两个action

def delete = {

def materialInstance = Material.get( params.id )

def planning=Planning.get(params.planningId)

if(materialInstance) {

try {

                materialInstance.delete()

                if(planning){

                  planning.delMaterial(materialInstance)

                  planning.save()

                }

                flash.message = "/u6210/u529F/u5C06/u7269/u6599/u4ECE/u7269/u6599/u8868/u4E2D/u5220/u9664/uFF01"

                redirect(controller:'planning',action:'materialList',id:params.planningId)

}         catch(org.springframework.dao.DataIntegrityViolationException e) {

    flash.message = "Material ${params.id} could not be deleted"

    redirect(action:show,id:params.id)

    }

}

else {

flash.message = "Material not found with id ${params.id}"

redirect(action:list)

        }

}

def create = {

        def materialInstance = new Material()

        def planning=Planning.get(params.planningId)

        materialInstance.properties = params

        return ['materialInstance':materialInstance,'planningInstance':planning]

}

同时还需要修改save闭包,在保存时调用planning 实例的addMaterial方法把新建的Material实例添加到物料表中:

def save = {

       def planning=Planning.get(params.planningId)

        def materialInstance = new Material(params)

        if(!materialInstance.hasErrors() && materialInstance.save()) {

        planning.addMaterial(materialInstance)

         planning.save()

            flash.message = "/u6210/u529F/u5C06/u7269/u6599/u52A0/u5165/u7269/u6599/u8868/uFF01"

            redirect(action:show,id:materialInstance.id,params:[planningId:planning.id])

        }

        else {

            render(view:'create',model:[materialInstance:materialInstance])

        }

    }

这样当我们点击前面的“物料表”链接时呈现如下页面:

我们通过“添加”按钮给生产计划中的物料表添加物料或通过“删除”按钮把物料从物料表中删除。当我们点击上面的兰色的产品编号链接时,显示生产计划细节:

注意,下端“材料表”栏,显示出了物料表中包含的物料,但以物料id的显示方式显然不能让人满意,我们来稍微改变一下。

 

5、  当然,我们还需要给Planning 类增加相应的addMaterialdelMaterial方法:

void addMaterial(Material m){

    if(materials==null)

        materials=[]

    materials.add(m)

}

void delMaterial(Material m){

    if(materials!=null)

        materials.remove(m)

}

6、  打开Material.groovy,增加toString方法:

String toString(){

       "${fee?.code} ${fee?.name} ${amount} ${fee?.unit}"

    }

现在,材料表的显示则直观多了:

7、  修改页面grails-app/planning/show.gsp,在其中增加编辑物料表的链接:

<g:link action="materialList" id="${planningInstance?.id}">物料表</g:link>:

                      

这样,通过链接,可以编辑物料表中内容。

8、   

原创粉丝点击