Openerp中workflow的设计机制

工作流程系统在OpenERP里是非常有用的机制,可以用于即时描述单据(模型)状态的演进过程。工作流实现了状态流转的可配置,通过迁移的 condition代替python代码中的判断语句,通过迁移的signal增加审批按钮,增加了系统的灵活性。工作流程是完全可以定制的,这些流程可 以调整适用于几乎所有公司的作业流程和交易逻辑。 这个工作流程系统使OpenERP非常有弹性, 而且可以不用编程增加新功能,就可以支持不断变化的需要。对于单据的审批,以及对应的的动作,都可以在OE的工作流中定义解决,而不需要全在对象上进行编 码。即工作流实现了流程处理与对象的业务逻辑的代码相分离,降低了不同处理代码的耦合性,增加了系统功能的柔软性。

如上所说工作流定义了对某一类型的对象,为model的处理流程,每当系统新产生一个model的实例(resource)时候,则对应产生一个工作流实例(workinstance)。如:创建sale.order实例时系统自动启动一个对应的工作流实例 。

简而言之就是工作流定义流程,工作流实例记录对象在流程的哪个阶段,如SO中,SO1在draft状态,SO2已经审批通过。

上面一方的大论过后,下面我们来揭开trigger_model的神秘面纱

工作流就像是隐藏在对象幕后的一个灵敏而又聪明的监视器,闻风而动,它并不会傻傻的每时每刻去检查这些条件,只有当对象发生了变化,这个监视器才会敏锐的捕获信息,随后去检查条件是否满足,可否迁移,当然,仅有这聪明和敏锐是难成大事的,所谓大师就是看到别人看不到的东西,下面我们看看:
当你创建了一张Sale Order,你想当它发货确认以后,就让Sale order的状态为Done,你确认Sale
order的时候,它乖乖的会检查一次,当前处在未发货状态,condition为False,状态不能变,但是过几天我们发货了,这时你发现这工作流装
死,它不给你的Sale Order状态改为
Done,你怒了,把这小子狠批一顿,工作流委屈的说,那是别人家的事(外部的对象)你得让他和我打个招呼…,于是你想想也有道理,于是你跑去别人家也装
了监视器(子工作流),那边有变化就发个信号过来
这个监视器是这样设计的(子工作流):当Activity为subflow的类型时,进入该状态节点(activity)触发“subflow_id”中
指定的工作流。在sale模块的workflow “wkf_sale”中,
需要开发票时候,它触发流程account模块中的工作流“account.invioce.basic” (field
name=”subflow_id” ref=”account.wkf”)。 account.wkf处理完成后,发出信号subflow.paid
通知wkf_sale流程(field name=”signal_send”>subflow.paid<)。
销售订单的工作流中从invioce子工作流节点到invioce_end节点的transition条件中定义了信号
subflow.paid=True,当条件满足时就实现状态跳转,用于父子流程通信的工作流signal必须是形如subflow.*

可是过几天麻烦来了,有人家不让你装这个监视器(有些对象没有定义工作流如stock.move),这可咋办,你为难了,这时候trigger_model闪亮登场

<field name="trigger_model">stock.move</field>
<field name="trigger_expr_id">[move_id.id]</field>

trigger_model:触发你去检查迁移条件的外部对象类型
trigger_expr_id:trigger_model类型的对象ids,可以是一段Python代码,也可以定义一个方法,返回ids

大喜之余,立马动手

<record id="ship_to_ongoing" model="workflow.transition">
<field name="act_from" ref="state_ship" />
<field name="act_to" ref="state_ongoing" />
<field name="trigger_model">stock.picking</field>
<field name="trigger_expr_id">[out_picking_id.id]</field>
<field name="condition">test_out_shipping_done()</field>
</record>

沾沾自喜,再一次再一次被耍了,我改变picking对象状态的时候,它没有在去检查condition

What Amazing Happens! 低头grep…,目标出现。。。

./procurement/procurement_workflow.xml:171:            <field name="trigger_model">stock.move</field>
./procurement/procurement.py:431: wf_service.trg_trigger(uid, 'procurement.order', id, cr)

映衬标题,‘非典型’触发器trigger_model,它并不是那么自动,你得在定义的模块中手动调用wf_service.trg_trigger方法,第一次触发的时候它在数据库中写入wkf_trigger:
1 model = trigger_model

2 res_ids = trigger_expr_id定义的ids

3 workitem_id = workitem id of act_from activity

4 inst_id = instance id of the wrk_flw (参见addons/base/ir/workflow/work.py 下的wkf_triggers)

wkf_trigger就像是一个过滤器,只有哪些对象的特定记录改变了,才会让这工作流去check

trigger_model这个神奇的利器在OpenERP 7.0却仅有中account.move.line, procurement.order 和 stock.move中 用到了

越厉害的东西越危险,高内聚低耦合的设计理念,openerp玩转自如,面纱已落地….

workflow中的‘非典型’自动触发器trigger_model的更多相关文章

  1. openerp 经典收藏 workflow中的‘非典型’自动触发器trigger_model(转载)

    workflow中的‘非典型’自动触发器trigger_model 原文:http://cn.openerp.cn/workflow%E4%B8%AD%E7%9A%84%E9%9D%9E%E5%85% ...

  2. SAP成都研究院非典型程序猿,菜园子小哥:当我用UI5诊断工具时我用些什么

    身边有些年轻同事曾经向我表达过这种困扰:尽管完成日常工作没有任何问题,但是还想更进一步,把代码写得更好些,做到精益求精.现在写的代码能实现功能,但是不知道可以怎样写得更好. 除了阅读优秀的开源库开源框 ...

  3. 从C#程序中调用非受管DLLs

    从C#程序中调用非受管DLLs 文章概要: 众所周知,.NET已经渐渐成为一种技术时尚,那么C#很自然也成为一种编程时尚.如何利用浩如烟海的Win32 API以及以前所编写的 Win32 代码已经成为 ...

  4. C-Lodop 非典型应用

    Lodop是什么? 有人说她是报表打印工具,因为那个add_print_table语句把报表统计的那点事弄了个明明白白: 有人说她是条码打印工具,因为用了她再也不用后台生成条码图片了,前端一行指令就动 ...

  5. IOS-在ARC项目中使用非ARC框架或者类库

    1.在ARC项目中使用非ARC框架或者类库 IOS 4引入了Automatic Reference Count(ARC),编译器可以在编译时对obj-c对象进行内存管理. 之前,obj-c的内存管理方 ...

  6. ARC工程中添加非ARC文件

    转载自:http://blog.csdn.net/zhenweicao/article/details/16988543 分类: IOS2013-11-27 17:02 626人阅读 评论(0) 收藏 ...

  7. WPF中样式和行为和触发器

    原文:WPF中样式和行为和触发器 样式简介:样式(style)是组织和重用格式化选项的重要工具,不是使用重复的标记填充XAML,以便设置外边距.内边距.颜色以及字体等细节.而是创建一系列封装所有这些细 ...

  8. 毕业季offer怎么拿?收下这份非典型求职面试指南

    摘要:求职面试莫慌,先自我评估一下 ,华为云专家手把手为你指导. 本文分享自华为云社区<毕业季offer怎么拿?收下这份非典型求职面试指南>,原文作者:技术火炬手 . 又是一年毕业季,对于 ...

  9. [转]在MyEclipse中设置struts.xml自动提示功能

    导入标签:<%@ taglib uri="/struts-tags" prefix="s" %> 要想在MyEclipse中实现struts.xml ...

随机推荐

  1. SPOJ 375. Query on a tree (动态树)

    375. Query on a tree Problem code: QTREE You are given a tree (an acyclic undirected connected graph ...

  2. USB ISP(ICSP) Open Programmer < PWM ADC HV PID >

    http://sourceforge.net/projects/openprogrammer/?source=navbar Open Programmer http://openprog.alterv ...

  3. Overview of MySQL Programs

    http://blog.163.com/digoal@126/blog/static/16387704020110198756512/

  4. Linux下open与fopen的区别

    int open(const char *path, int access,int mode)    path 要打开的文件路径和名称   access 访问模式,宏定义和含义如下:          ...

  5. [self removeAllSubviews]; // 删除所有子视图(包括 selfl.view) 所以,要慎用

    [self removeAllSubviews];  //删除所有子视图(包括 selfl.view)   所以,要慎用

  6. python接口自动化26-参数关联和JSESSIONID(上个接口返回数据作为下个接口请求参数)

    前言 参数关联是接口测试和性能测试最为重要的一个步骤,很多接口的请求参数是动态的,并且需要从上一个接口的返回值里面取出来,一般只能用一次就失效了. 最常见的案例就是网站的登录案例,很多网站的登录并不仅 ...

  7. 如何在JTable中动态添加一行

    JTable tbImage = new JTable(5,5);//create a dummy tableDefaultTableModel dtm=(DefaultTableModel)tbIm ...

  8. ldap服务器OpenLDAP安装使用

    OpenLDAP 是 LDAP 协议的一个开源实现.LDAP 服务器本质上是一个为只读访问而优化的非关系型数据库.它主要用做地址簿查询(如 email 客户端)或对各种服务访问做后台认证以及用户数据权 ...

  9. Windows 7目录

    1. 用wubi安装的Ubuntu在重装Windows 7系统后,如何恢复(转) 2. Windows 7系统垃圾清理自写程序

  10. [8] 圆面(Round)图形的生成算法

    顶点数据的生成 bool YfBuildRoundVertices ( Yreal radius, Yreal height, Yuint slices, YeOriginPose originPos ...