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流程则没有运行,这与我们的设计初衷不符,所以就能够发现问题到底在哪里。

posted @ 2013-10-28 13:59  少帅寇仲  阅读(1434)  评论(0编辑  收藏  举报
腾讯微博 开心 新浪微博 搜狐微博 网易微博 QQ空间 人人 豆瓣 白社会 Digg MySpace Yahoo! Buzz Linkedin Mixx