资源下载
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>
<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 类增加相应的addMaterial和delMaterial方法:
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、