• openrp 复杂工作流(子流程)开发


    想实现一个订单订单流程,流程图如下:

    这个流程的关键是要处理子流程“合同管理”和“发票管理”,在子流程的状态变更后,自动变更订单主流程的状态。

    发票管理流程OE已经定义好,现在定义合同管理adm.contact.basic的流程,草稿--发送--回签--完成(取消)

    adm.contact.basic的流程定义代码(部分):

     <record id="act_contract_done" model="workflow.activity">
                <field name="wkf_id" ref="wkf_contract"/>
                <field name="name">contract_done</field>
                <field name="flow_stop">True</field>
                <field name="kind">function</field>
                <field name="action">action_done()</field>
                <field name="signal_send">subflow.contract.done</field><!--当contact的流程运行到done节点时,发出subflow.contract.done的信号-->
    
            </record>
    
             <record id="act_contract_cancel" model="workflow.activity">
                <field name="wkf_id" ref="wkf_contract"/>
                <field name="name">contract_cancel</field>
                <field name="flow_stop">True</field>
                <field name="kind">function</field>
                <field name="action">action_cancel()</field>
                <field name="signal_send">subflow.contract.cancel</field>
            </record>

    合同管理流程定义的信号,将会在订单流程中,合同子流程状态变更时,发送给订单主流程。

    订单主流程的流程节点定义如下(以合同管理子流程为例):

    <!--合同流程-->
            <record id="act_contract" model="workflow.activity">
                <field name="wkf_id" ref="wkf_sale"/>
                <field name="name">contract</field>
                <field name="kind">subflow</field>
                <field name="subflow_id" search="[('name','=','adm.contract.basic')]"/>
    <field name="action">action_contract_create()</field> </record> <record id="act_contract_end" model="workflow.activity"> <field name="wkf_id" ref="wkf_sale"/> <field name="name">contract_end</field> <field name="kind">function</field> <field name="action">action_subflow_end()</field> </record> <record id="act_contract_cancel" model="workflow.activity"> <field name="wkf_id" ref="wkf_sale"/> <field name="name">contract_cancel</field> <field name="kind">function</field> <field name="action">action_subflow_cancel()</field> </record>

    订单主流程的迁移定义如下:

    <!--合同子流程-->
            <record id="trans_progress_contract" model="workflow.transition">
                <field name="act_from" ref="act_progress"/>
                <field name="act_to" ref="act_contract"/>           
            </record>        
            <record id="trans_contract_contract_end" model="workflow.transition">
                <field name="act_from" ref="act_contract"/>
                <field name="act_to" ref="act_contract_end"/>
                <field name="signal">subflow.contract.done</field>
    <!--这里的signal是adm.contract.basic流程中通过signal_send定义的-->
    </record> <record id="trans_contract_contract_cancel" model="workflow.transition"> <field name="act_from" ref="act_contract"/> <field name="act_to" ref="act_contract_cancel"/> <field name="signal">subflow.contract.cancel</field> </record>

    上述迁移的意思是,当合同流程的状态变为done时,发送一个subflow.contract.done的信号,订单流程中的合同子流程就可以接收到这个信号,从而变更订单流程的状态。

    订单流程的两个注意事项,节点定义时:

    <record id="act_progress" model="workflow.activity">
                <field name="wkf_id" ref="wkf_sale"/>
                <field name="name">progress</field>
                <field name="kind">function</field>
                <field name="action">action_validate()</field>
                <field name="split_mode">OR</field>
            </record>
    <record id="act_done" model="workflow.activity">
                <field name="wkf_id" ref="wkf_sale"/>
                <field name="name">done</field>
                <field name="flow_stop">True</field>
                <field name="kind">function</field>
                <field name="action">action_done()</field>
                <field name="join_mode">AND</field>
            </record>

    因为需要实现的功能是,订单流程开始后,同时进行合同和发票子流程,因此process节点必须设置split_mode为OR,代表此节点出发的所有满足条件的迁移都要进行,而默认的XOR则表示只沿着第一个满足条件的迁移进行,这样就无法同时进行合同和发票两个流程。

    订单结束的标志,是合同和发票子流程都结束,订单才能结束,因此done节点需要设置join_mod为AND。

    下面说说流程的调试功能,开发者模式下,调试试图下拉框最后一个功能是:打印工作流,可以帮助我们查看目前工作流进行的情况。比方说我们在测试订单工作流的时候,当进行到process节点是,下一步是同时运行contract和invoice子流程,此时选择打印工作流,就可以看到流程运行的情况,如下图,红色的节点表示流程运行到此。

    如果流程定义的process节点没有定义split_mode,我们看下打印出来的流程图会有什么区别:

    结果很清晰,只有invoce流程在运行,而contract流程则没有运行,这与我们的设计初衷不符,所以就能够发现问题到底在哪里。

  • 相关阅读:
    难找的对象
    欺负10086客服小姐(超搞笑)
    左手,请握紧你的右手!
    Discuz! 6.x/7.x EXP
    【超搞视频】  另类乞讨让你笑掉大牙 !
    GNU/Linux平台的C程序开发及程序运行环境
    SICK LMS200激光数据采集程序说明
    郭云深划分武学境界
    Discuz XSS得webshell
    200条装修小常识(结婚,不结婚的都要看一下,很有用的)
  • 原文地址:https://www.cnblogs.com/jerry2005/p/3392302.html
Copyright © 2020-2023  润新知