• 一步一步学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="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、               

  • 相关阅读:
    STM32 -- 硬件知识
    PCIe相关的操作命令
    [转载]PCI/PCIe基础——配置空间
    [转载]网络虚拟化中的 offload 技术:LSO/LRO、GSO/GRO、TSO/UFO、VXLAN
    [转载]TSO、UFO、GSO、LRO、GRO和RSS介绍
    Linux应用函数 -- 字符串
    初级PLC
    中断方式下进行串口通讯的正确方法
    [altium] Altium Designer2013 13.3.4 (10.1881.28608) 完美版
    32个最热CPLD-FPGA论坛
  • 原文地址:https://www.cnblogs.com/encounter/p/2188549.html
Copyright © 2020-2023  润新知