ERP後端 | Django如何快速實作靈活的動態簽核表單(1)

更新於 發佈於 閱讀時間約 6 分鐘
raw-image

流程與節點

公司裡面每一張需要簽核的表單可能會有不一樣的簽核流程(work flow)。而流程中每個節點(work flow node)的簽核對象有可能是特定的使用者或是符合某個部門、某個職位的使用者皆可簽核。

請假表單: 代理人 -> 直屬主管 -> 人資部門

採購表單: 直屬主管 -> 採購部門主管 -> 會計部門

考慮到簽核時需要的各種資料依據,我們在data model的設計上讓各個流程節點設定簽核類型,再根據簽核類型逐一自由設定預定的簽核人員或是簽核部門、簽核組織等等。

流程與節點(db schema)

流程與節點(db schema)

class WorkFlow(Model):
name = CharField()

class WorkFlowNode(Model):
work_flow = ForeignKey()
category = CharField()
organization = ForeignKey()
department = ForeignKey()
position = ForeignKey()
user = ForeignKey()
name = CharField()
order = PositiveIntegerField()

簽核表單與簽核節點

raw-image

當一張請假表單被創建時,我們需要找出對應的簽核流程設定,同時為他創建簽核表單(sign form)與多個簽核節點(sign node),每一個簽核節點都會關聯回流程節點,才能在簽核時正確判端下一層要送給誰簽、使用者能不能簽核這張表單並同時紀錄簽核結果以及備註資訊。

簽核表單與簽核節點(db schema)

簽核表單與簽核節點(db schema)

class SignForm(Model):
objects = Manager()
status = FSMField()
user = ForeignKey()
next_sign_node = ForeignKey()
last_sign_node = ForeignKey()

class SignNode(Model):
sign_form = ForeignKey()
work_flow_node = ForeignKey()
agent = ForeignKey()
signer = ForeignKey()
result = FSMField()
date = DateTimeField()
note = TextField()
level = PositiveIntegerField()

如何動態產生簽核表單

假設我們建了兩個簽核流程(work flow): 請假表單簽核流程、採購表單簽核流程,並各自設定一至多個流程節點(work flow node)。

那當我們建立請假表單(leave form)、採購表單(purchase order)後,如何識別對應的簽核流程來建立簽核表單(sign form)與簽核節點(sign node)? 只好請出我們強大的繼承。

class WorkFlowBaseModel(Model):
sign_form = OneToOneField()
class Meta:
abstract = True

@property
def work_flow_name(self):
raise NotImplementedError("Subclasses must implement this method")

@transaction.atomic
def save(self, *args, **kwargs):
is_new = not self.pk
super(WorkFlowBaseModel, self).save(*args, **kwargs)

if is_new and not self.sign_form:
self.init_work_flow()

def init_work_flow(self):
work_flow_name = self.work_flow_name
work_flow, created = WorkFlow.objects.get_or_create(name=work_flow_name)
work_flow_nodes = work_flow.work_flow_nodes.all()

//建立sign form and sign nodes

先建立一個抽象WorkFlowBaseModel,並且規定所有繼承的子類都必須實作work_flow_name

再來讓請假表單、採購表單繼承並且實作各自的work_flow_name

class LeaveForm(WorkFlowBaseModel):
@property
def work_flow_name(self):
return WorkFlowName.leave

class PurchaseOrder(WorkFlowBaseModel):
@property
def work_flow_name(self):
return WorkFlowName.purchase

再回頭看一下WorkFlowBaseModel定義的save、init_work_flow,會發現已經能夠自動根據子類的work_flow_name找出對應的work_flow、work_flow_nodes囉。

最後只要建立sign form以及sign nodes,並將sign form關聯回請假表單、採購表單,完整的簽核表單就建立完成了。

下一篇我們再來介紹怎麼集中由簽核表單(sign form)處理簽核相關的操作。
留言
avatar-img
留言分享你的想法!
avatar-img
再寫5分鐘
66會員
19內容數
探索自我實現的小角落。沒有高高在上的教條,只有真實的分享和心得。
再寫5分鐘的其他內容
2024/07/02
在前一篇我們已經成功地建立簽核表單及簽核節點並關聯回請假表單,而本篇會接著介紹如何管理簽核節點狀態並同步更新簽核表單狀態。
Thumbnail
2024/07/02
在前一篇我們已經成功地建立簽核表單及簽核節點並關聯回請假表單,而本篇會接著介紹如何管理簽核節點狀態並同步更新簽核表單狀態。
Thumbnail
2024/06/15
《Future GPX Cyber Formula》閃電霹靂車是一部關於AI賽車的動漫作品,講述了主角與AI合作的故事。文章引述了動漫中的情節與角色,突出了AI協助駕駛者的功能。全文帶有熱血激情、深度思考和特殊概念。
Thumbnail
2024/06/15
《Future GPX Cyber Formula》閃電霹靂車是一部關於AI賽車的動漫作品,講述了主角與AI合作的故事。文章引述了動漫中的情節與角色,突出了AI協助駕駛者的功能。全文帶有熱血激情、深度思考和特殊概念。
Thumbnail
2024/06/12
EAFP(Easier to Ask for Forgiveness than Permission)是Python提倡的防禦性程式碼風格,鼓勵工程師直接撰寫主要業務邏輯,不需要多做檢查,真的出現異常再處理就好。這種風格的程式碼可讀性優於LBYL風格,並且在多進程/多線程場景下表現更好。
Thumbnail
2024/06/12
EAFP(Easier to Ask for Forgiveness than Permission)是Python提倡的防禦性程式碼風格,鼓勵工程師直接撰寫主要業務邏輯,不需要多做檢查,真的出現異常再處理就好。這種風格的程式碼可讀性優於LBYL風格,並且在多進程/多線程場景下表現更好。
Thumbnail
看更多
你可能也想看
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
在前一篇我們已經成功地建立簽核表單及簽核節點並關聯回請假表單,而本篇會接著介紹如何管理簽核節點狀態並同步更新簽核表單狀態。
Thumbnail
在前一篇我們已經成功地建立簽核表單及簽核節點並關聯回請假表單,而本篇會接著介紹如何管理簽核節點狀態並同步更新簽核表單狀態。
Thumbnail
本文介紹瞭如何在後端系統開發時設計不同表單的簽核流程,包括請假表單和採購表單。以及如何動態生成簽核表單,並建立簽核節點。另外還介紹瞭如何利用繼承來簡化簽核流程的設定。
Thumbnail
本文介紹瞭如何在後端系統開發時設計不同表單的簽核流程,包括請假表單和採購表單。以及如何動態生成簽核表單,並建立簽核節點。另外還介紹瞭如何利用繼承來簡化簽核流程的設定。
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
上次完成到基本的CRUD及權限控制,後面花了點時間把排序、分頁、圖表總覽的部分做完,其他細節是佈署上線,一般在公司內有專屬的部門處理,僅了解一下流程。
Thumbnail
上次完成到基本的CRUD及權限控制,後面花了點時間把排序、分頁、圖表總覽的部分做完,其他細節是佈署上線,一般在公司內有專屬的部門處理,僅了解一下流程。
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
當我們在撰寫一套系統的時候, 總是會提供一個介面讓使用者來觸發功能模組並回傳使用者所需的請求, 而傳統的安裝包模式總是太侷限, 需要個別主機獨立安裝, 相當繁瑣, 但隨著時代的演進與互聯網的崛起, 大部分的工作都可以藉由網頁端、裝置端來觸發, 而伺服端則是負責接收指令、運算與回傳結果, 雲端
Thumbnail
列出一套完整的程式 程式設計有許多種方法,不過通常會先列出清單的再逐一執行,這樣會加快程式設計的速度。設計通常會採取順推的辦法。所以順推的程式設計方式就是經歷觀念溝通、系統分析、資料統合、權限管理、頻率與時間、後台管理、畫面設計等等階段後,將框架設計完了以後,先列出一套完整的程式,將所有使用者都確
Thumbnail
列出一套完整的程式 程式設計有許多種方法,不過通常會先列出清單的再逐一執行,這樣會加快程式設計的速度。設計通常會採取順推的辦法。所以順推的程式設計方式就是經歷觀念溝通、系統分析、資料統合、權限管理、頻率與時間、後台管理、畫面設計等等階段後,將框架設計完了以後,先列出一套完整的程式,將所有使用者都確
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News