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

  • 相关阅读:
    18-行列式及其性质
    17-正交矩阵和Gram-Schmidt正交化
    14-正交向量与子空间
    centOS7.3 离线安装docker
    10-四个基本子空间
    使用vim打造python-ide
    09-线性相关性、基、维数
    python小实例
    Elasticsearch学习之ES节点类型以及各种节点的分工
    基于Kibana和ES的苏宁实时日志分析平台
  • 原文地址:https://www.cnblogs.com/jerry2005/p/3392302.html
Copyright © 2011-2022 走看看