OpSet Node在流程中可以直接或將取得的值寫入變數。與上一篇的OpFieldWrite相似,但寫入目標是流程中的變數,用於操作流程的條件
| 項目 | 說明 |
|---|---|
| 顯示名稱 | 設定變數 |
| node_type | OpSet |
| 一句話用途 | 在流程執行中設定或運算一個或多個流程變數,供後面的節點透過 ${v.變數名} 取用。 |
| 會讓流程等待 | 否。同步執行,設定完所有操作立刻繼續往下走。 |
| 出線 | 設計上限 1 條(登記在節點定義裡,但目前沒有被設計器或引擎實際檢查——拉了兩條以上一樣會依「沒有指定出線=取全部出邊」同時並行推進;也可以完全不接出線,當作某條分支的安靜終點)。 |
| 可用範圍 | 所有企業,不需要平台管理者另外授權。 |
設定變數(OpSet)用來在流程執行中設定一個或多個流程變數:可以是寫死的固定值、從表單欄位轉存、 把兩個值串接起來,或做基本的四則運算。它不呼叫任何外部服務,也不會動表單本身——純粹是流程內部的資料處理節點。 設定完的變數可以在後面的分支條件、簽核任務內容、或任何其他節點的設定欄位裡用 ${v.變數名} 取用。 流程變數不會憑空存在,一定要有節點實際設定過才查得到,設定變數是最基本、最直接的設定方式。
適合用在:把表單欄位轉存成一個好記的變數名稱、組合一段要顯示給簽核者看的文字、做金額試算、記錄「流程走到 這裡了」的標記。不適合用在:把結果寫回表單本身讓使用者在表單裡看到——那是寫入欄位 (OpFieldWrite)的工作;也不適合原封不動地把多個表單欄位整批抄成變數, 那用讀取欄位(OpFieldRead)一次處理更直接。
面板上是一份「操作清單」,按「新增」逐條加入,每條都是獨立設定,依序執行;同一個節點可以一次做好幾件事。
| 面板欄位 | config key | 必填 | 預設值 | 說明 |
|---|---|---|---|---|
| 變數名 | operations[].target_var | 必填 | — | 要設定的流程變數名稱(不含 ${v.} 前綴,直接寫變數名)。面板會擋下「同一個節點裡有 兩筆操作填了相同變數名」的設定,不論這兩筆操作類型是否不同,見下方「6. 注意事項」。 |
| 操作類型(下拉選單) | operations[].operation | 必填 | set | 10 種,見下方「操作類型一覽」;面板下拉選單只提供其中 9 種。 |
| 值(increment/decrement 時面板會隱藏此欄) | operations[].value | 依操作類型而定 | — | 支援 ${...} 變數替換,也支援多行文字;詳見下方「3. 可用的變數與輸出」。 |
| 面板顯示 | 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. 注意事項」。
「值」欄位支援與平台其他節點一致的前綴:${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.變數名} 取用——分支條件、簽核任務的說明文字、寫入欄位的內容,都能引用。設定變數 不會寫回表單資料,也不會產生任何資料表紀錄;純粹只活在這次流程實例的變數空間裡。
操作清單依序逐筆執行;某一筆操作失敗(例如除以 0、運算式解析失敗)只會記一條錯誤到節點日誌並跳過 這一筆,其餘操作照常繼續執行,節點整體仍回報成功——畫面上看起來一切正常,不會有紅字或失敗標記, 要查節點日誌裡的錯誤清單才看得出哪一筆沒設成功。失敗的那一筆不會寫入任何流程變數(不會留下部分結果,也不會 覆蓋掉同名變數原本的值)。
節點本身不會進入等待狀態,也沒有需要挑選的出線——執行完就照「沒有指定出線=取全部出邊」推進,正常情況下 只接一條,等於直接往下走;完全不接出線時,這個節點就是安全的分支終點,執行完安靜結束,不會報錯,也不會 讓流程卡住。
同一個設定變數節點的操作清單依序執行,可以一次示範四種常見來源:
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. 注意事項」。

資安事件處置流程(SOC 團隊版)的 SLA 計時分支,用一個只做一件事、完全不接出線的設定變數節點,當作「這條 計時分支已經沒事了」的收尾點:
// 分支判定「已簽核」時導向這個節點,它本身沒有任何出線
{ target_var: "sla_track", operation: "set", value: "signed_in_sla" }
它只是把一個追蹤用的流程變數設成一個標記值,執行完就結束,不會走到結束節點,也不會影響同一個流程實例裡 其他還在跑的分支(例如人工簽核那條)。這是讓並行分支安全收尾、而不是誤用結束節點提早結束整個流程的標準做法。 完整脈絡見 暫停 與 資安事件處置流程(SOC 團隊版)。
面板不讓你在同一個節點裡對同一個變數名設定兩次
症狀:想在同一個設定變數節點裡先用 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、運算式錯誤、變數無法轉成數字等),只會記一條錯誤到節點日誌並跳過這一筆, 其餘操作照常執行完畢,節點整體仍回報成功,流程照樣往下走。失敗的那一筆不會寫入流程變數,也不會覆蓋掉同名 變數原本的值。要確認每一筆是否真的都設成功,要看節點日誌裡的錯誤清單,不能只看節點本身是否顯示成功。
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 的值是「您好,」加上送單時填的申請人姓名。