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

更新於 發佈於 閱讀時間約 5 分鐘
在前一篇我們已經成功地建立簽核表單及簽核節點並關聯回請假表單,而本篇會接著介紹如何管理簽核節點狀態並同步更新簽核表單狀態。
raw-image

簽核節點狀態

我們來回顧一下data model,簽核表單(sign form)與簽核節點(sign node)是一對多關係,每個節點的狀態是獨立的,節點本身無法得知自己是不是下一個要被簽核的對象。

raw-image

但是從簽核表單(sign form)的視角來看,只要加上next_sign_node、last_sign_node兩個欄位,當節點狀態改變時同步更新這兩個欄位,就可以快速查找簽核進行到哪一關啦。

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

def update_sign_nodes(self):
nodes = self.sign_nodes.order_by('order')
last_sign_node = None
next_sign_node = None

for node in nodes:
if node.result in [SignResult.APPROVED, SignResult.REJECTED]:
last_sign_node = node
elif node.result == SignResult.NONE and not next_sign_node:
if last_sign_node or not last_sign_node:
next_sign_node = node

if self.last_sign_node != last_sign_node or self.next_sign_node != next_sign_node:
self.last_sign_node = last_sign_node
self.next_sign_node = next_sign_node
self.save(update_fields=['last_sign_node', 'next_sign_node'])

if all(node.result == SignResult.APPROVED for node in nodes):
self.approve()
elif any(node.result == SignResult.REJECTED for node in nodes):
self.reject()

在簽核表單(sign form)加上update_sign_nodes的函式當簽核節點(sign node)被簽核人員同意或是退回時呼叫,這樣一來就可以非常方便的紀錄目前簽核到哪一個節點或是整張表單已經完成簽核了。

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

class Meta:
ordering = ['order']

@transition()
def approve(self, signer, note):
self.result = SignResult.APPROVED
self.save(update_fields=['result'])
self.sign_form.update_sign_nodes()

@transition()
def reject(self, signer, note):
self.result = SignResult.REJECTED
self.save(update_fields=['result'])
self.sign_form.update_sign_nodes()

搜尋使用者待簽核的表單

使用簽核表單(sign form)紀錄next_sign_node額外的好處是,在搜尋時可以讓query減少一層。

raw-image
ORM雖然效能不佳,但在實作中低流量的ERP系統時,開發效率還是蠻不錯的。
簽核表單真的是蠻複雜的功能,基本的順簽流程都已經如此費工,更大型的ERP甚至會導入更進階的多方會簽逐層退回等等功能,非常考驗開發者的實作經驗。
avatar-img
66會員
19內容數
探索自我實現的小角落。沒有高高在上的教條,只有真實的分享和心得。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
再寫5分鐘 的其他內容
本文介紹瞭如何在後端系統開發時設計不同表單的簽核流程,包括請假表單和採購表單。以及如何動態生成簽核表單,並建立簽核節點。另外還介紹瞭如何利用繼承來簡化簽核流程的設定。
《Future GPX Cyber Formula》閃電霹靂車是一部關於AI賽車的動漫作品,講述了主角與AI合作的故事。文章引述了動漫中的情節與角色,突出了AI協助駕駛者的功能。全文帶有熱血激情、深度思考和特殊概念。
EAFP(Easier to Ask for Forgiveness than Permission)是Python提倡的防禦性程式碼風格,鼓勵工程師直接撰寫主要業務邏輯,不需要多做檢查,真的出現異常再處理就好。這種風格的程式碼可讀性優於LBYL風格,並且在多進程/多線程場景下表現更好。
樣板模式的定義極為簡單,卻是大型系統程式、WEB/APP應用框架的設計核心,完美展現設計模式的價值: 簡單、高效、強大。
你知道IG是用Django開發的嗎? 正在學習或使用Django、Flask框架開發後端的你,是否也常在享受Python語法的舒適之餘,仍然煩惱著是否該學習效率更好的GO或Laravel。
觀察者模式透過主題訂閱/訊息通知的機制,極度增強系統的可擴展性、靈活性以及降低組件間的耦合度。概念直觀簡單,是非常實用的設計模式。
本文介紹瞭如何在後端系統開發時設計不同表單的簽核流程,包括請假表單和採購表單。以及如何動態生成簽核表單,並建立簽核節點。另外還介紹瞭如何利用繼承來簡化簽核流程的設定。
《Future GPX Cyber Formula》閃電霹靂車是一部關於AI賽車的動漫作品,講述了主角與AI合作的故事。文章引述了動漫中的情節與角色,突出了AI協助駕駛者的功能。全文帶有熱血激情、深度思考和特殊概念。
EAFP(Easier to Ask for Forgiveness than Permission)是Python提倡的防禦性程式碼風格,鼓勵工程師直接撰寫主要業務邏輯,不需要多做檢查,真的出現異常再處理就好。這種風格的程式碼可讀性優於LBYL風格,並且在多進程/多線程場景下表現更好。
樣板模式的定義極為簡單,卻是大型系統程式、WEB/APP應用框架的設計核心,完美展現設計模式的價值: 簡單、高效、強大。
你知道IG是用Django開發的嗎? 正在學習或使用Django、Flask框架開發後端的你,是否也常在享受Python語法的舒適之餘,仍然煩惱著是否該學習效率更好的GO或Laravel。
觀察者模式透過主題訂閱/訊息通知的機制,極度增強系統的可擴展性、靈活性以及降低組件間的耦合度。概念直觀簡單,是非常實用的設計模式。
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
利用文字紀錄,明確寫下自己的採購項目......
Thumbnail
今天的除權息特調總算是爭氣了XDDD 正式進入六月份,明細會重新開一張讓大家可以繼續看呦~
Thumbnail
公告佈達看似簡單,但如何做好才是關鍵。 只有透過適時而有效的公告,才能確保重要訊息的及時傳達,促進員工的共識和配合 最終提升整體的運營效率,為企業持續發展注入動力!
Thumbnail
上次完成到基本的CRUD及權限控制,後面花了點時間把排序、分頁、圖表總覽的部分做完,其他細節是佈署上線,一般在公司內有專屬的部門處理,僅了解一下流程。
Thumbnail
👨‍💻簡介 最近因為憑證越來越多,需要監控什麼時候到期,當到期時發送到期通知,因此撰寫一個簡單的小程式來完成。 這次使用Python和Telegram Bot來監控SSL證書的到期時間並發送通知。並使用GCP工具,如CloudFunction和CloudScheduler做部署平台。
目前目標-過一面筆試 20240229至20240330完成 1.案例圖到底要怎麼寫 2.流程圖到底要怎麼寫 3.數據模型圖更新 4.把本機端的檔案上傳至github的master 5.更新履歷 6.投丟了70封履歷,獲得六個一面,兩個筆試沒過,一個無聲卡,兩個剛結束暫待二面消息。
目前開發目標-已完成用戶順利執行訂房行為 今日完成 1.預訂完訂單查詢、移除訂單(O) 2.paymentsuccess.html、def paymentFailed、paymentfailed.html 導向既有頁面 未完成 1​.Coupan機制 2.已瀏覽過項目清單、看過此項目的人
目前開發目標-至少要完成用戶順利執行訂房行為 今日完成 1.修改房間可用性的Q的查詢問題 2.寫短文陳述「何時將資訊放入session合適?」的問題並且整理有關session使用說明 未完成 1.預訂完查詢 2.paymentsuccess.html、def paymentFailed、
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
利用文字紀錄,明確寫下自己的採購項目......
Thumbnail
今天的除權息特調總算是爭氣了XDDD 正式進入六月份,明細會重新開一張讓大家可以繼續看呦~
Thumbnail
公告佈達看似簡單,但如何做好才是關鍵。 只有透過適時而有效的公告,才能確保重要訊息的及時傳達,促進員工的共識和配合 最終提升整體的運營效率,為企業持續發展注入動力!
Thumbnail
上次完成到基本的CRUD及權限控制,後面花了點時間把排序、分頁、圖表總覽的部分做完,其他細節是佈署上線,一般在公司內有專屬的部門處理,僅了解一下流程。
Thumbnail
👨‍💻簡介 最近因為憑證越來越多,需要監控什麼時候到期,當到期時發送到期通知,因此撰寫一個簡單的小程式來完成。 這次使用Python和Telegram Bot來監控SSL證書的到期時間並發送通知。並使用GCP工具,如CloudFunction和CloudScheduler做部署平台。
目前目標-過一面筆試 20240229至20240330完成 1.案例圖到底要怎麼寫 2.流程圖到底要怎麼寫 3.數據模型圖更新 4.把本機端的檔案上傳至github的master 5.更新履歷 6.投丟了70封履歷,獲得六個一面,兩個筆試沒過,一個無聲卡,兩個剛結束暫待二面消息。
目前開發目標-已完成用戶順利執行訂房行為 今日完成 1.預訂完訂單查詢、移除訂單(O) 2.paymentsuccess.html、def paymentFailed、paymentfailed.html 導向既有頁面 未完成 1​.Coupan機制 2.已瀏覽過項目清單、看過此項目的人
目前開發目標-至少要完成用戶順利執行訂房行為 今日完成 1.修改房間可用性的Q的查詢問題 2.寫短文陳述「何時將資訊放入session合適?」的問題並且整理有關session使用說明 未完成 1.預訂完查詢 2.paymentsuccess.html、def paymentFailed、