工作流概念:“ 工作流闯两,指的是一系列相互銜接、自動(dòng)進(jìn)行的業(yè)務(wù)活動(dòng)或任務(wù)返吻。” -百度百科
我的個(gè)人理解乎婿,工作流就是執(zhí)行一個(gè)任務(wù)的一系列過程(步驟)测僵,每個(gè)步驟可能需要設(shè)計(jì)不同“模塊”,而且步驟之間又有著各種各樣的聯(lián)系谢翎。以企業(yè)的采購為例:采購過程包括 采購申請(qǐng)→采購批準(zhǔn)→采購訂單→審核采購訂單→…… 捍靠;其中采購申請(qǐng)可能是A部門申請(qǐng),批準(zhǔn)可能是B部門批準(zhǔn)……這就是一個(gè)簡單的工作流森逮。
- 本文將使用Odoo框架榨婆,開發(fā)一個(gè)簡單的workflow模塊,代碼解釋將嵌套在源碼中
文件結(jié)構(gòu)
文件結(jié)構(gòu)
Model創(chuàng)建(models.py)
- 注意在init.py 文件中導(dǎo)入你的“ models.py ”模塊
- Odoo 框架中的代碼跟平時(shí)開發(fā)時(shí)代碼規(guī)范有些許出入
- 關(guān)于@api.one 鏈接
# -*- coding: utf-8 -*-
from openerp import models, fields, api
class workflow_demo(models.Model):
"""
Author : SXY
Date : 2016/3/24 9:28
Version : 1.0
"""
_name = 'workflow_demo.workflow_demo'
WORKFLOW_STATE_SELECTION = [
('init', '初始'),
('start', '開始'),
('confirm', '確認(rèn)'),
('complete', '完成'),
]
name = fields.Char(string="姓名")
state = fields.Selection(WORKFLOW_STATE_SELECTION, default='init', string="狀態(tài)", readonly=True)
# 注意使用新版本定義方法是褒侧,需要添加裝飾器@api.one/@api.multi
# 將state 置于開始狀態(tài)
@api.one
def do_start(self):
print "------------self.state = 'start'"
self.state = 'start'
return True
# 將state 置于確認(rèn)狀態(tài)
@api.one
def do_confirm(self):
print "------------self.state = 'confirm'"
self.state = 'confirm'
return True
# 將state 置于完成狀態(tài)
@api.one
def do_complete(self):
print "------------self.state = 'complete'"
self.state = 'complete'
return True
View 創(chuàng)建 (workflow_view.xml)
- 注意良风,關(guān)于field,官網(wǎng)(鏈接)(參見lists中的field)有如下要求:要求同一個(gè)name只能使用一次闷供。如 <field name="state" /> 中這個(gè)“state”只能使用一次烟央,如果多次使用,那么只顯示最后使用這個(gè)"state"的標(biāo)簽
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
<data>
<!-- form 視圖-->
<record id="workflow_demo_form_view" model="ir.ui.view">
<field name="name">Workflow</field>
<field name="type">form</field>
<field name="model">workflow_demo.workflow_demo</field>
<field name="arch" type="xml">
<form string="Workflow單">
<!-- workflow 聲明-->
<!-- 添加header標(biāo)簽用來顯示workflow中的按鈕-->
<header>
<!-- 首先指明button的type為workflow類型 -->
<!-- name 對(duì)應(yīng)于workflow.transition中的signal-->
<!-- states 屬性用來控制button顯示隱藏歪脏,例如states="init"吊档,當(dāng)state屬性為init時(shí),這個(gè)button顯示唾糯,否則不顯示 -->
<button name="workflow_start" states="init" string="開始" type="workflow" class="oe_highlight"/>
<button name="workflow_confirm" states="start" string="確認(rèn)" type="workflow" class="oe_highlight"/>
<button name="workflow_end" states="confirm" string="完成" type="workflow" class="oe_highlight"/>
<!-- 右上角 進(jìn)度顯示怠硼。注意在此處已經(jīng)使用的state屬性鬼贱,所以在接下來的tree標(biāo)簽里面就不能再次聲明<field name="state"/>了如果再次聲明此處的進(jìn)度顯示便會(huì)失去作用 -->
<field name="state" widget="statusbar" statusbar_visible="start,confirm,complete"/>
</header>
<sheet>
<group col="4">
<field name="name"/>
</group>
</sheet>
</form>
</field>
</record>
<!-- tree(list)視圖 -->
<record id="workflow_demo_tree_view" model="ir.ui.view">
<field name="name">workflow_demo</field>
<field name="type">tree</field>
<field name="model">workflow_demo.workflow_demo</field>
<field name="arch" type="xml">
<tree string="Workflow">
<field name="name"/>
</tree>
</field>
</record>
<record id="workflow_demo_action" model="ir.actions.act_window">
<field name="name">Workflow</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">workflow_demo.workflow_demo</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">創(chuàng)建Workflow單</p>
</field>
</record>
<!-- 菜單 -->
<menuitem id="workflow_demo_main_menu" name="Workflow演示"/>
<menuitem id="workflow_demo_sub_menu" name="Workflow演示" parent="workflow_demo_main_menu"/>
<menuitem id="workflow_demo_item_menu" name="Workflow" parent="workflow_demo_sub_menu"
action="workflow_demo_action" sequence="1"/>
</data>
</openerp>
Workflow 創(chuàng)建(workflow_demo.xml)
- workflow 介紹
- Workflow transitions 中的group 屬性可以進(jìn)行操作權(quán)限控制
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
<data>
<!-- Workflow 工作流 -->
<!-- https://www.odoo.com/documentation/8.0/reference/workflows.html -->
<!-- 設(shè)置record的model為系統(tǒng)自帶的 “workflow” -->
<record model="workflow" id="workflow_demo">
<field name="name">workflow_demo</field>
<!-- 關(guān)聯(lián)的model -->
<field name="osv">workflow_demo.workflow_demo</field>
<!-- 是否主動(dòng)被實(shí)例化 -->
<field name="on_create">True</field>
</record>
<!-- workflow.activity 用來指定要調(diào)用的model里的方法,一般用來更改state狀態(tài)-->
<record model="workflow.activity" id="activity_one">
<!-- wkf_id 這個(gè)activity對(duì)應(yīng)于哪個(gè)workflow,這里對(duì)應(yīng)于上面聲明的workflow-->
<field name="wkf_id" ref="workflow_demo"/>
<field name="name">workflow.demo.activity.one</field>
<!-- dummy 類型用來指定這個(gè)activity 是workflow的開始還是結(jié)束-->
<field name="kind">dummy</field>
<!-- 開始是flow_start 結(jié)束是flow_end-->
<field name="flow_start">True</field>
</record>
<record model="workflow.activity" id="activity_two">
<field name="wkf_id" ref="workflow_demo"/>
<field name="name">workflow.demo.activity.two</field>
<!-- function 表示要執(zhí)行model中的方法-->
<field name="kind">function</field>
<!-- 對(duì)應(yīng)model中的方法-->
<field name="action">do_start()</field>
</record>
<record model="workflow.activity" id="activity_three">
<field name="wkf_id" ref="workflow_demo"/>
<field name="name">workflow.demo.activity.three</field>
<field name="kind">function</field>
<field name="action">do_confirm()</field>
</record>
<record model="workflow.activity" id="activity_four">
<field name="wkf_id" ref="workflow_demo"/>
<field name="name">workflow.demo.activity.four</field>
<field name="kind">function</field>
<field name="action">do_complete()</field>
</record>
<record model="workflow.activity" id="activity_five">
<field name="wkf_id" ref="workflow_demo"/>
<field name="name">workflow.temp.activity.five</field>
<field name="kind">dummy</field>
<field name="flow_end">True</field>
</record>
<!-- 相當(dāng)于一個(gè)轉(zhuǎn)換器香璃,用來接受button傳來的信號(hào)这难,調(diào)用相關(guān)的activity-->
<record model="workflow.transition" id="transition_one">
<!-- 表示上一個(gè)執(zhí)行的activity,與上面聲明的activity對(duì)應(yīng)-->
<field name="act_from" ref="activity_one"/>
<!-- 表示上一個(gè)將要執(zhí)行的activity-->
<field name="act_to" ref="activity_two"/>
<!-- 用來做一個(gè)嚴(yán)重葡秒,當(dāng)滿足條件是才能執(zhí)行姻乓,可省略-->
<field name="condition">state == 'init'</field>
<!-- 接收的信號(hào) -->
<field name="signal">workflow_start</field>
</record>
<record model="workflow.transition" id="transition_two">
<field name="act_from" ref="activity_two"/>
<field name="act_to" ref="activity_three"/>
<field name="condition">state == 'start'</field>
<field name="signal">workflow_confirm</field>
</record>
<record model="workflow.transition" id="transition_three">
<field name="act_from" ref="activity_three"/>
<field name="act_to" ref="activity_four"/>
<field name="condition">state == 'confirm'</field>
<field name="signal">workflow_end</field>
</record>
</data>
</openerp>
xml聲明(openerp.py)
部分代碼:
'data': [
# 聲明workflow的相關(guān)xml
'views/workflow_view.xml',
'views/workflow_demo.xml',
],
切記添加完workflow之后,一定要在此做一下聲明眯牧,好讓模塊加載過程中能夠?qū)orkflow進(jìn)行實(shí)例化蹋岩。
到此,workflow 已經(jīng)基本實(shí)現(xiàn)
測試
- 安裝模塊
- 測試
test_one.png
test_two.png
小結(jié)
workflow 該功能的開發(fā)要注意学少,workflow剪个、workflow_activity、workflow_transition三者的關(guān)系
Odoo 相比較于現(xiàn)在的workflow聲明方式版确,還有另外一種簡單的方式扣囊,這種方式要在下一章節(jié)給大家介紹。
源碼地址 http://git.oschina.net/tobe/OdooDemo (workflow_demo)