iT邦幫忙

2026 iThome 鐵人賽

DAY 18
0

OpSet Node在流程中可以直接或將取得的值寫入變數。與上一篇的OpFieldWrite相似,但寫入目標是流程中的變數,用於操作流程的條件

項目 說明
顯示名稱 設定變數
node_type OpSet
一句話用途 在流程執行中設定或運算一個或多個流程變數,供後面的節點透過 ${v.變數名} 取用。
會讓流程等待 否。同步執行,設定完所有操作立刻繼續往下走。
出線 設計上限 1 條(登記在節點定義裡,但目前沒有被設計器或引擎實際檢查——拉了兩條以上一樣會依「沒有指定出線=取全部出邊」同時並行推進;也可以完全不接出線,當作某條分支的安靜終點)。
可用範圍 所有企業,不需要平台管理者另外授權。

1. 這個節點做什麼

設定變數(OpSet)用來在流程執行中設定一個或多個流程變數:可以是寫死的固定值、從表單欄位轉存、 把兩個值串接起來,或做基本的四則運算。它不呼叫任何外部服務,也不會動表單本身——純粹是流程內部的資料處理節點。 設定完的變數可以在後面的分支條件、簽核任務內容、或任何其他節點的設定欄位裡用 ${v.變數名} 取用。 流程變數不會憑空存在,一定要有節點實際設定過才查得到,設定變數是最基本、最直接的設定方式。

適合用在:把表單欄位轉存成一個好記的變數名稱、組合一段要顯示給簽核者看的文字、做金額試算、記錄「流程走到 這裡了」的標記。不適合用在:把結果寫回表單本身讓使用者在表單裡看到——那是寫入欄位 (OpFieldWrite)的工作;也不適合原封不動地把多個表單欄位整批抄成變數, 那用讀取欄位(OpFieldRead)一次處理更直接。

2. 設定欄位

面板上是一份「操作清單」,按「新增」逐條加入,每條都是獨立設定,依序執行;同一個節點可以一次做好幾件事。

2.1 單一操作的三個欄位

面板欄位 config key 必填 預設值 說明
變數名 operations[].target_var 必填 — 要設定的流程變數名稱(不含 ${v.} 前綴,直接寫變數名)。面板會擋下「同一個節點裡有 兩筆操作填了相同變數名」的設定,不論這兩筆操作類型是否不同,見下方「6. 注意事項」。
操作類型(下拉選單) operations[].operation 必填 set 10 種,見下方「操作類型一覽」;面板下拉選單只提供其中 9 種。
值(increment/decrement 時面板會隱藏此欄) operations[].value 依操作類型而定 — 支援 ${...} 變數替換,也支援多行文字;詳見下方「3. 可用的變數與輸出」。

2.2 操作類型一覽

面板顯示 operation 語意 需要「值」欄位
= set 直接設定為「值」欄位算出來的結果(見下方型別轉換說明)。 是
運算 expr 計算一段數學表達式,支援 + - * / // % **(次方)與括號。 是
+ add target_var 目前的值(不存在則視為 0)加上「值」。 是
- subtract 目前的值減去「值」。 是
× multiply 目前的值乘以「值」。 是
÷ divide 目前的值除以「值」;「值」為 0 時這一步失敗,但不會中斷整個節點。 是
連接 concat target_var 目前的值(不存在則視為空字串)接上「值」的字串。 是
+1 increment 目前的值加 1。 否
-1 decrement 目前的值減 1。 否
(面板未提供) convert 依 convert_to(int/float/string/bool) 轉換「值」的型別,只能透過直接編輯流程 graph 使用。 是

set(以及 expr 以外其他需要「值」的操作)在做完變數替換後,會嘗試把結果轉成數字: 字串裡含有 . 就嘗試轉成浮點數,否則嘗試轉成整數;轉不成才原樣保留成字串。這個自動轉型的細節 會影響某些看起來像數字、實際上是文字代碼的欄位,見下方「6. 注意事項」。

3. 可用的變數與輸出

「值」欄位支援與平台其他節點一致的前綴:${f.欄位} 讀表單欄位、${v.變數} 讀流程 變數、${fi.xxx} 讀表單實例資訊、${wi.code|exec_code|name|status|depth} 讀流程實例 資訊、${n.xxx} 讀節點上下文、${t.now|date|time} 讀時間(UTC)。一段「值」裡可以混用 多種前綴,也可以是固定文字與變數混寫,例如 已處理 ${f.reason}(${t.now})。

「運算」(expr)例外:算式字串裡只認得 ${v.xxx} 與 ${f.xxx} 兩種前綴,其餘前綴不會被正確解析,見下方「6. 注意事項」。

輸出:每一筆操作成功後,結果一律寫進流程變數(FLOW scope),之後任何節點都 可以用 ${v.變數名} 取用——分支條件、簽核任務的說明文字、寫入欄位的內容,都能引用。設定變數 不會寫回表單資料,也不會產生任何資料表紀錄;純粹只活在這次流程實例的變數空間裡。

4. 出線行為

操作清單依序逐筆執行;某一筆操作失敗(例如除以 0、運算式解析失敗)只會記一條錯誤到節點日誌並跳過 這一筆,其餘操作照常繼續執行,節點整體仍回報成功——畫面上看起來一切正常,不會有紅字或失敗標記, 要查節點日誌裡的錯誤清單才看得出哪一筆沒設成功。失敗的那一筆不會寫入任何流程變數(不會留下部分結果,也不會 覆蓋掉同名變數原本的值)。

節點本身不會進入等待狀態,也沒有需要挑選的出線——執行完就照「沒有指定出線=取全部出邊」推進,正常情況下 只接一條,等於直接往下走;完全不接出線時,這個節點就是安全的分支終點,執行完安靜結束,不會報錯,也不會 讓流程卡住。

5. 常見設計方式

5.1 一個節點做四種設定

同一個設定變數節點的操作清單依序執行,可以一次示範四種常見來源:

operations: [
  { target_var: "fixed_note",       operation: "set",    value: "這是寫死的固定字串" },
  { target_var: "amount_from_form", operation: "set",    value: "${f.base_amount}" },
  { target_var: "greeting",         operation: "set",    value: "您好," },
  { target_var: "greeting",         operation: "concat", value: "${f.applicant_name}" },
  { target_var: "amount_doubled",   operation: "expr",   value: "${f.base_amount} * 2" }
]

fixed_note 示範跟表單內容完全無關的固定值;amount_from_form 示範單純轉存表單 欄位;greeting 示範「先給基底值、再串接」(concat 是接在目前值後面,不是取代); amount_doubled 示範四則運算。要留意:greeting 這種「同一個變數名被設定兩次」的寫法, 沒辦法直接在設計器面板裡做出來,見下方「6. 注意事項」。

5.2 準備變數給寫入欄位使用

https://ithelp.ithome.com.tw/upload/images/20261002/20184261g61YeSQ00P.png

5.3 沒有出線的安靜終點(取自 SOC 團隊版)

資安事件處置流程(SOC 團隊版)的 SLA 計時分支,用一個只做一件事、完全不接出線的設定變數節點,當作「這條 計時分支已經沒事了」的收尾點:

// 分支判定「已簽核」時導向這個節點,它本身沒有任何出線
{ target_var: "sla_track", operation: "set", value: "signed_in_sla" }

它只是把一個追蹤用的流程變數設成一個標記值,執行完就結束,不會走到結束節點,也不會影響同一個流程實例裡 其他還在跑的分支(例如人工簽核那條)。這是讓並行分支安全收尾、而不是誤用結束節點提早結束整個流程的標準做法。 完整脈絡見 暫停 與 資安事件處置流程(SOC 團隊版)。

6. 注意事項

面板不讓你在同一個節點裡對同一個變數名設定兩次
症狀:想在同一個設定變數節點裡先用 set 給一個基底值、再用 concat 接上 別的內容(就像圖 5.1 的 greeting),在設計器面板裡把兩筆操作都填成同樣的變數名,按下套用時 會跳出「變數名稱重複,同一節點內不可有相同名稱的變數」,整個設定存不進去。原因:這是面板自己額外加的 限制(存檔前逐筆檢查 target_var 是否重複),不是 handler 的限制——handler 本身完全支援依序 執行、後面的操作覆蓋或接續前面的結果。node展覽館裡「一個節點做四種設定」的示範,是用腳本直接寫入資料庫 產生的,繞過了面板這道檢查。
正確做法:要在設計器裡做出「先給基底值、再串接」的效果,把兩步拆到 兩個不同的設定變數節點(面板的重複檢查只看「同一個節點內」,跨節點使用相同變數名不受限制)。

set 對數字字串會自動轉型,開頭的 0 會不見
症狀:把一個從表單抄過來、開頭是 0 的文字(例如市話或行動電話、以 0 開頭的自訂代碼)用 set 存成流程變數,結果查到的值少了開頭的 0,型別也從文字變成數字。
原因: set(以及其他需要「值」的操作)在做完變數替換後,只要整個字串轉得成數字就會自動轉型: 含 . 轉成浮點數,否則轉成整數;int("0912345678") 這種開頭有 0 的數字字串轉換 不會報錯,只會把開頭的 0 吃掉。
正確做法:需要保留原始文字格式的欄位(電話、帶前導零的代碼),不要 透過設定變數的 set 原樣轉存;改用讀取欄位(OpFieldRead)直接抄錄表單值(它不做 任何型別轉換),或者在 set 的值前後加一個非數字字元(例如加個空格再自行處理)避免整段被判定 為純數字。

expr 運算式裡只認得 v. 與 f. 兩種前綴
「運算」(expr)的算式字串裡,${...} 只支援 v.(流程變數)與 f.(表單欄位)兩種前綴;寫成 ${fi.serial}、${wi.code}、 ${t.now} 這類其他前綴,不會被正確解析,會被當成一般流程變數名稱查詢,查不到就以 0 代入計算—— 不會有任何錯誤或警告,只有算出來的數字明顯不合理。需要用到這些欄位做運算時,先用另一個設定變數節點的 set 把值轉存成一個沒有前綴問題的流程變數,再拿去做 expr 運算。

convert 操作面板沒有提供,且 bool 轉換是真假值判定
convert 這個操作類型 handler 支援,但面板下拉選單完全沒有這個選項,只能透過直接編輯流程 graph 使用。要留意 convert_to=bool 轉換的是 Python 的真假值判定,不是文字解析——字串 "false"(非空字串)轉出來仍然是 True,只有空字串才會轉成 False。

某一筆操作失敗不會讓節點失敗,也不會留下部分結果
操作清單裡任何一筆失敗(除以 0、運算式錯誤、變數無法轉成數字等),只會記一條錯誤到節點日誌並跳過這一筆, 其餘操作照常執行完畢,節點整體仍回報成功,流程照樣往下走。失敗的那一筆不會寫入流程變數,也不會覆蓋掉同名 變數原本的值。要確認每一筆是否真的都設成功,要看節點日誌裡的錯誤清單,不能只看節點本身是否顯示成功。

7. 在 node展覽館 實際操作

NT-22 OpSet 示範:流程送出後用一個設定變數節點做四種設定:寫死的固定值、讀表單欄位轉存、 字串串接、以及用「運算」做乘法。對應「5.1 一個節點做四種設定」的內容。

在平台安裝目錄下執行(需要系統管理權限;這支批次同時會建立讀取欄位與寫入欄位的示範):

venv/bin/python scripts/seed_node_showcase.py --apply --only B1

寫入後到表單中心(例如 http://192.168.0.112:8000/beakplatform/forms/center)的「填寫表單」 分類「node展覽館」下找到「NT-22 OpSet 示範表單」,填申請人姓名與一個基本金額後送出(故意填文字而非數字, 可以看到「運算」那一步失敗但不中斷節點的行為)。預期看到:流程跑完後應該有四個流程變數 fixed_note、amount_from_form、greeting、amount_doubled, 其中 greeting 的值是「您好,」加上送單時填的申請人姓名。

8. 相關節點

  • 分支(Branch):分支條件常常讀取設定變數節點寫出來的流程變數,兩者是 「先算好一個值、再依這個值決定路徑」的標準搭配。
  • 寫入欄位(OpFieldWrite):設定變數只寫流程變數,不會動表單;要把 結果寫回表單讓使用者看得到,接一個寫入欄位節點,並在它的內容裡用 ${v.變數名} 取用前面設定好 的變數。
  • 簽核(FormAdapter):簽核任務的說明文字、決策選項標籤都可以引用 設定變數節點寫出來的流程變數,讓簽核者看到組合好的資訊而不是原始資料。
  • 暫停(Delay):暫停到期後常接一個設定變數節點記錄恢復時間;沒有出線的 設定變數節點也是讓並行分支安靜收尾的標準做法。

上一篇
SOC團隊版Node說明--寫入欄位(OpFieldWrite)
系列文
企業管理自動化與執行框架-以SOC運作為實例 共 18 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言