Odoo的市場定位是SME(中小型企業),這個市場的ERP產品,多如牛毛,產品各具特色。不過,Odoo的自動化處理機制,可以睥睨天下,無人能及。包括一些大型國產軟件,如用友、金蝶也不具備如此強大的自動化業務處理功能。Odoo的業務自動化機制,可以非常容易地擴充ERP系統功能,非常容易地讓業務工作自動化。
Odoo自動化動作
如下圖,增加一個自動化動作,“自動刪除過期的SaaS DB”。系統會按定義好的條件篩選出符合條件的數據記錄(業務對象),自動執行定義好的Server Action(服務器端動作)。
- 相關的文檔模型:本自動化處理適用於哪個業務對象
- 何時運行:什么時候觸發本自動化動作,選項有“業務對象創建時候”,“業務對象更新時候”,“業務對象創建或更新時候”,“基於時間條件觸發”
- 篩選:定義一個過濾條件,僅對符合該過濾條件的業務對象執行本自動化動作
- 觸發日期:業務對象上的一個日期型字段
- 使用日期:觸發日期的前/后多少天(或小時、分鍾)觸發本動作。如果是觸發日期前則填寫負數。
- 使用日歷:如果是希望定義觸發日期前/后多少個工作天,則需要使用該字段。該字段定義工作日歷。
- 最后運行:本動作最近一次運行的時間。
- 動作:定義要自動執行的Server Action,可以有多個。
需要注意的是,系統的時間條件是,假設 觸發日期 + 使用日期 后得到的時間 為DT,本動作最后運行時間 LT,當前時間CT。當滿足條件 LT < DT <= CT時候,系統才會促發本動作。如果某次執行失敗,下次再執行時候,失敗的那條記錄,由於不滿足條件 LT < DT,系統不會再次執行該對象。


Odoo服務端動作Server Action
如下圖,增加一個Server Action,“刪除過期的SaaS Client DB”。Server Action有多種類型,本例是Python代碼。Python代碼最為靈活,你可以自己寫Python代碼,完成任意你希望的業務處理。本例是調用業務對象的刪除數據庫的方法"delete_database_server()"。
非常有用的是,你可以將定義好的Server Action添加到對象視圖的“更多”按鈕下面,從而點擊按鈕自動執行

Odoo篩選條件
如下圖,自動化動作中,可以定義需要執行自動化動作的對象過濾條件。過濾條件可以在對象的列表視圖中自定義,然后“保存當前過濾器”。需要注意的是,保存時候,一定要勾選“與所有用戶共享”。

Odoo計划任務
如下圖,Odoo有一個計划任務機制,類似於Linux的 crontab,或者Windows的計划任務。計划任務機制中,你可以指定系統每隔多少時間執行指定的對象方法。
Odoo的自動動作,是通過“Check Action Rules”的計划任務,默認情況是每隔4小時檢查一遍“自動動作”,如果你希望更頻繁地執行“自動動作”,你可以在此修改。

OODO設計模式一消息通知
問題
Odoo系統根據單據更新發送消息通知相關人員。
舉例:
生產訂單下發,庫管人員就會得到需要發貨的消息。
相關的設計模式有:
- 重寫動作函數.
- 自動化動作
- 定制開發,根據單據狀態,發送消息
下面就,討論不同模式的實現方法,和利弊。
重寫動作函數
odoo v8 中 確認生產訂單 通過workflow完成,
workflow 調用的確認函數是:
def action_confirm(self, cr, uid, ids, context=None): """ Confirms production order. @return: Newly generated Shipment Id. """ user_lang = self.pool.get('res.users').browse(cr, uid, [uid]).partner_id.lang context = dict(context, lang=user_lang) uncompute_ids = filter(lambda x: x, [not x.product_lines and x.id or False for x in self.browse(cr, uid, ids, context=context)]) self.action_compute(cr, uid, uncompute_ids, context=context) for production in self.browse(cr, uid, ids, context=context): self._make_production_produce_line(cr, uid, production, context=context) stock_moves = [] for line in production.product_lines: if line.product_id.type != 'service': stock_move_id = self._make_production_consume_line(cr, uid, line, context=context) stock_moves.append(stock_move_id) else: self._make_service_procurement(cr, uid, line, context=context) if stock_moves: self.pool.get('stock.move').action_confirm(cr, uid, stock_moves, context=context) production.write({'state': 'confirmed'}) return 0
重寫函數, 增加以下代碼實現。
SUPER(mrp_prodduction, self).action_confirm(cr, uid, ids, context=None)
self.message_post(cr, uid, ids, body=_("Order %s confirmed. Please Send Material") % self._description, context=context)
修改結果

優點: 簡單直接
缺點: 需要找到代碼函數,重寫函數。
定制,根據狀態變化
此方法需要修改代碼,在單據狀態變化的時候,自動推送消息。
依賴代碼部分
模塊集成
_inherit = ['mail.thread', 'ir.needaction_mixin']
定義狀態, 增加track_visibility屬性
'state': fields.selection( [('draft', 'New'), ('cancel', 'Cancelled'), ('confirmed', 'Awaiting Raw Materials'), ('ready', 'Ready to Produce'), ('in_production', 'Production Started'), ('done', 'Done')], string='Status', readonly=True, track_visibility='onchange', copy=False,
定義_trace 字段以及參數
ps. mrp.production 中未定義_track, 故狀態更新 不會推送消息通知。
# Automatic logging system if mail installed # _track = { # 'field': { # 'module.subtype_xml': lambda self, cr, uid, obj, context=None: obj[state] == done, # 'module.subtype_xml2': lambda self, cr, uid, obj, context=None: obj[state] != done, # }, # 'field2': { # ... # }, # } # where # :param string field: field name # :param module.subtype_xml: xml_id of a mail.message.subtype (i.e. mail.mt_comment) # :param obj: is a browse_record # :param function lambda: returns whether the tracking should record using this subtype
其中 module.subtype_xml 需要在xml中定義消息類型。 例如 account_voucher 的跟蹤消息類型
1
2
3
4
5
6
7
|
<!
-
-
Voucher
-
related subtypes
for
messaging
/
Chatter
-
-
>
<record
id
=
"mt_voucher_state_change"
model
=
"mail.message.subtype"
>
<field name
=
"name"
>Status Change<
/
field>
<field name
=
"res_model"
>account.voucher<
/
field>
<field name
=
"default"
eval
=
"False"
/
>
<field name
=
"description"
>Status changed<
/
field>
<
/
record>
|
優點:根據狀態或其他字段自動推送消息。
缺點:定義復雜。
自動化動作
創建自動話動作,定義對象和條件

定義動作: 更改負責人 或增加關注者(本例中可以增加倉庫人員)

或 更復雜動作,用服務器動作定義

優點 : 用戶可配置
缺點: server action 需要寫python代碼
總結
以上三種方法,都是使用message_post方法發送消息給關注者,如需使用其他發送消息方法,需要在mail thread尋找新的方法。
方法三,可以自定義配置條件,也可以增加關注者,也可以增加復雜動作,靈活。
方法一,對開發者來說更直接。
參考:https://www.zhiyunerp.com/blog/2/post/15