> ## Documentation Index
> Fetch the complete documentation index at: https://docs.alforse.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 工作流程

> 自動回應 Alforse 事件或排程：在畫布上將一個觸發條件連接到條件與動作，發布後，逐步檢視每一次執行的內容。

工作流程讓 Alforse 在事件發生時自動反應：銷售訂單一歸入某位客戶經理名下就通知他、工單一暫停就開立問題，或在出貨過帳後通知另一個系統。具備工作流程權限的使用者在**自動化 → 工作流程**下設計這些自動化流程，並在**自動化 → 執行紀錄**下稽核它們做了什麼。

## 概覽

每個工作流程都繪製在畫布上。畫布頂端有一張觸發條件卡片；條件與動作卡片從它延伸出去，單一觸發條件可分支成多條互相獨立的路徑。在您選擇**「發布」**之前，什麼都不會執行。此後，每次觸發都會成為一筆執行紀錄，您可以開啟並檢視其中的每一個步驟，請見[執行紀錄與歷程](#runs-and-history)。

Alforse screenshot**自動化 → 工作流程下的工作流程建構器畫布：觸發條件卡片連接條件與動作步驟，並附有元件面板與「發布」按鈕**

單一觸發條件分成多條分支，每條分支各有自己的結尾。

## 什麼會啟動工作流程

工作流程一定剛好有一個**觸發條件**步驟。在其上，**「觸發類型」**切換開關提供**「事件」**或**「排程」**；選擇其中一個，會清除您為另一個所做的設定。

### 記錄事件

事件指的是對單一記錄類型的單一種變更。共有三種形式：

| 事件形式 | 範例 | 交給工作流程的資料 |
| - | - | - |
| 已建立 | `job.created` | 新建立的記錄 |
| 已刪除 | `purchaseOrder.deleted` | 記錄被移除前的快照 |
| 欄位已變更 | `customer.assignee.changed` | 該記錄，以及欄位的 `before` 與 `after` 值 |

NOTE

**沒有通用的「已更新」事件**

您不能指定「任何變更」，而是要指定您關心的欄位。可監看的記錄類型共有十種：採購單、銷售訂單、工單、品項、收貨、出貨、報價單、供應商、客戶與問題。每一種都提供一份簡短的監看欄位清單，編輯其他任何欄位都不會啟動工作流程。

### 業務時刻

在挑選器的更下方，標題為**「業務時刻」**之下，是 Alforse 內建流程中的九個里程碑：

| 領域 | 時刻 |
| - | - |
| 生產 | 工單已發放 · 工單已暫停 · 工單工序已完成 |
| 銷售 | 報價單已傳送 · 報價單已接受 |
| 物流 | 收貨已過帳 · 出貨已過帳 |
| 開立發票 | 銷售發票已過帳 · 採購發票已過帳 |

業務時刻會告訴工作流程*哪些*記錄參與其中，也就是它們的識別資訊，但不會複製它們的欄位。當後續步驟需要該時刻未提供的值時，請在它前面加上一個**尋找**步驟。

### 排程

選擇**「排程」**即可依時鐘執行。您將**「頻率」**設為每日、每週或每月，挑選適用的日期，再輸入**「時段」**與**「時區」**。編輯時，**「下次觸發時間：」**一行會預覽即將到來的觸發時間。

HEADS UP

**排程不會補跑**

由於 Alforse 將牆上時鐘時間與時區分開保存，09:00 的排程在時鐘調整後仍會於 09:00 觸發。固定在每月 31 日的每月排程會直接**略過**天數較短的月份。如果某次執行到期時 Alforse 無法使用，它不會補跑，而是等待下一個到期時間，且任何逾期超過一小時的執行都會記錄為已略過。每個排程還帶有最多五分鐘的固定抖動，用以分散負載，所以 09:00 實際上是指 09:00 到 09:05 之間的某個時間。

### 限制哪些人的變更算數

對於事件觸發條件，**「觸發者」**決定由**「人員」**、**「工作流程」**或**「兩者」**所做的編輯是否可以觸發工作流程。新的觸發條件預設為**「人員」**，這是安全的設定，因為它會忽略任何工作流程（包括本身）所做的變更。僅在刻意要讓一個自動化流程驅動另一個時，才切換為**「兩者」**。

## 建構工作流程

### 六種步驟類型

步驟依下列順序列於元件面板中：

| 步驟 | 在畫布上的角色 |
| - | - |
| **觸發條件** | 唯一的進入點。其他步驟都不能連入它。 |
| **條件** | 為執行選擇一條要走的路徑。路徑是一組子句；**「否則」**路徑為選用。 |
| **動作** | 執行工作（通知、建立、更新或呼叫外部），並提供各自獨立的**成功**與**失敗**連接點。 |
| **計算** | 從記錄推導出一個數字，例如訂單總額或報廢百分比，不會變更任何內容。 |
| **尋找** | 取得一筆記錄供後續使用。 |
| **篩選** | 將清單縮小為符合您規則的項目。 |

### 動作能做什麼

十六個動作分為三類：

1. **建立（4 個）。** 工單、問題、採購單或銷售訂單。這些動作呼叫的正是 Alforse 自有畫面背後的服務，因此編號序列、預設值與必填欄位的套用方式，與人員操作時完全相同。
2. **更新（10 個）。** 每種可監看的記錄類型各一個，用於編輯既有記錄。
3. **通知與呼叫外部（2 個）。** **「通知某人」**與**「呼叫外部網址」**。

NOTE

**更新刻意設計得很窄**

每個更新動作只開放一小組由 Alforse 定義的欄位，例如受指派人、到期日、參考編號、優先順序。您無法從工作流程變更狀態，也沒有任何動作會刪除資料。工作流程可以*監看*的欄位與可以*寫入*的欄位，是分開維護的兩份清單。

### 為步驟提供值

欄位可以放您輸入的常值，也可以放上游產生的值。在文字欄位中輸入 `{` 會開啟變數選單，其中列出較早的步驟、它們的輸出，以及最深兩層的屬性。

只有*確定*會在目前步驟之前執行的步驟才會出現在那裡。條件分支另一側的值不會列出，任何對這類值的參照在發布時都會被拒絕。

### 對清單中的每個項目各執行一次步驟

如果把清單接到需要單一值的欄位，該步驟就會迴圈執行，每個項目一次，上限為 100 次；表單會對此提出說明。把兩份不同的清單接到同一個步驟，發布時會被拒絕，因為迴圈將沒有單一來源。

## 呼叫外部網址

**「呼叫外部網址」**會發出 HTTP 請求，也就是 Webhook，讓另一個系統回應 Alforse 中的事件。

FieldType

<details>
  <summary>**URL**required`文字`</summary>

  `https` 端點。可包含變數，例如路徑中的記錄 ID。
</details>

<details>
  <summary>**Method**required`選項`</summary>

  `GET`、`POST`、`PUT`、`PATCH` 或 `DELETE`；新步驟預設為 `GET`。
</details>

<details>
  <summary>**Headers**`名稱／值列`</summary>

  額外的請求標頭，例如授權金鑰。允許使用變數，且執行歷程會遮蔽每個標頭的*值*。
</details>

<details>
  <summary>**Body**`文字`</summary>

  已填入變數的酬載。僅能搭配 `POST`、`PUT` 與 `PATCH` 使用，也只會在這些方法時傳送。
</details>

HEADS UP

**Webhook 步驟的限制**

* 只接受 `https`。解析到私有或連結本機（link-local）範圍的位址同樣會被拒絕，這涵蓋了 `localhost` 與雲端中繼資料端點。
* 絕不跟隨重新導向；請求超過十秒仍未回應即放棄。
* 回應落在成功範圍之外，該步驟會標記為失敗。
* Alforse 保留八個標頭，您無法取代它們。
* 請求不帶簽章。如果接收方必須驗證傳送者，請在標頭中包含共用密鑰。

## 儲存、發布與版本

### 自動儲存

您找不到儲存按鈕：編輯內容會持續儲存，標題旁的狀態會顯示**「儲存中…」**、**「已儲存」**或**「無法儲存」**。不完整的草稿可以正常儲存，因為驗證會等到發布時才進行。

### 發布

**「發布」**要嘛完全成功，要嘛不改變任何東西。在上線前，Alforse 會確認有一個觸發條件、沒有任何步驟回饋到較早的步驟、必填欄位皆已填寫，且每個變數都指向上游步驟。失敗項目會集中在一個面板中；選擇其中一筆，畫布會捲動到負責的步驟。

發布同時也是電源開關。已發布的那個版本就是會觸發的版本；**「取消發布」**會停止工作流程但不刪除任何內容，再次發布即可恢復。沒有已發布版本的工作流程會標示為**草稿**。

### 版本

版本一旦發布即被鎖定。要繼續編輯，請從版本選單建立新版本，它會以已發布版本的副本和下一個編號開始。已在進行中的執行，即使其間發布了另一個版本，仍會以它們開始時的版本完成。

### 測試執行

工作流程的負責人可以在觸發條件卡片上選擇**「測試執行」**。這是真正的執行，任何動作都會真的發生，但不會在執行歷程中留下任何項目。

## 權限

工作流程由專屬的權限模組管理，這是在每個路由都需要的員工帳號之上再加的一層。

| 權限 | 授予 |
| - | - |
| **檢視** | 工作流程清單、建構器與執行歷程。 |
| **建立** | 新工作流程與新版本。 |
| **更新** | 編輯、發布與測試執行。 |
| **刪除** | 移除工作流程及其版本與歷程。 |

NOTE

**工作流程以其負責人的身分執行，而非觸發者**

每個步驟都以負責人的權限執行，並在每個步驟重新檢查。如果負責人失去某個領域的存取權，執行就會停止，並顯示指出該領域的訊息。工作流程被限制在其所屬公司內，且執行歷程在資料庫層級受寫入保護，因此無論權限多高，任何人都無法更改或偽造執行記錄。

## 執行紀錄與歷程

每次觸發都會產生一筆工作流程執行：一筆執行本身的記錄，加上每個步驟各一筆，記錄輸入了什麼、輸出了什麼，以及為何以該結果結束。

### 執行紀錄清單

在**自動化 → 執行紀錄**下，每一列顯示狀態、工作流程、觸發條件、時間長度、負責人與來源記錄，來源記錄以名稱或編號顯示並附連結以便快速存取。當另一筆執行引發了這一筆，**鏈**欄會顯示**「跳躍 2」**，之後依此類推。當有執行處於已排入佇列或執行中時，清單會即時更新。

<details>
  <summary>**已排入佇列**</summary>

  已接受，等待工作程序處理。
</details>

<details>
  <summary>**執行中**</summary>

  已被某個工作程序領取，目前正在執行各步驟。
</details>

<details open>
  <summary>**已成功**</summary>

  所有已執行的步驟都無錯誤完成。
</details>

<details>
  <summary>**失敗**</summary>

  某個步驟失敗，或執行達到 500 個步驟的上限。
</details>

<details>
  <summary>**已阻擋**</summary>

  在任何步驟執行前就被迴圈防護機制停止；執行紀錄會說明原因。
</details>

<details>
  <summary>**已略過**</summary>

  從未開始，因為工作流程已被取消發布、排程執行已逾期，或前一次執行尚未結束。
</details>

### 讀取一筆執行

開啟一列會顯示**「執行詳情」**抽屜，最上方是一句淺白的結論，例如*「Failed at 'notify the buyer': The address answered 500.」*

Alforse screenshot**自動化 → 執行紀錄中的「執行詳情」抽屜：結果句、依工作流程順序排列的步驟清單（略過的分支以灰色顯示），以及一個展開並顯示輸入與輸出的步驟**

先看結論句；只有在需要細節時才展開步驟。

步驟依其在工作流程中的位置列出，而不是依執行順序。因此未執行的步驟會留在原位，灰顯為**「未達成」**，或標示為已略過並附上原因。展開步驟會顯示其**輸入**與**輸出**；對條件而言，**原因**區段會逐一說明每個子句，並標出所選的路徑。

迴圈步驟會記錄每個項目並加上統計。*「Ran 100 of 150; 50 were not used」*表示碰到 100 個項目的上限，而不是錯誤。

NOTE

**執行可以成功卻什麼都沒做**

如果條件的所有路徑都不符合且沒有\*\*「否則」**，則該條件已*成功*，它做出了正確的決定：停止。執行因此顯示為綠色，儘管大部分步驟從未被執行到，這正是結論句要用文字解釋結果的原因。缺少資料同樣會導致略過而非失敗。而且無法讀取輸入的條件**不會**走**「否則」\*\*路徑：不知道，不等於否。

### 失敗如何擴散

當步驟失敗時，只有它的分支會停止；同層分支會繼續，已連接的**失敗**連接點仍會被跟隨，但執行結束時會被報告為失敗。權限失敗則更嚴格：即使接了失敗路徑，也會結束該分支。

### 工作流程鏈

如果一個工作流程所做的寫入引發了另一個，Alforse 會把這些執行串在一起，並顯示整條鏈。同一條鏈中出現兩次的工作流程，或超過十次跳躍的鏈，會產生一筆**已阻擋**的執行。要從源頭避免形成鏈，請調整[**「觸發者」**](#what-starts-a-workflow)。

HEADS UP

**沒有重試按鈕**

已完成的執行無法從執行紀錄頁重播。請解決外部問題後讓觸發條件再次觸發，或從建構器啟動\*\*「測試執行」\*\*。中途當機的執行會由佇列自動重試；由於每個步驟在做任何事之前都會先被領取，重試絕不會重複已完成的步驟。

### 保留與遮蔽

每天夜間，清理工作會分四個階段處理執行歷程。仍在進行中的執行絕不會被動到。

| 時間 | 效果 |
| - | - |
| 24 小時 | 卡在已排入佇列或執行中的執行會被關閉為失敗。 |
| 7 天 | 儲存的值會被濃縮為摘要。 |
| 30 天 | 步驟列會被移除；執行標頭保留。 |
| 90 天 | 整筆執行會被移除。 |

名稱類似憑證的任何內容都會儲存為 `[REDACTED]`，且 Webhook 標頭值一律被遮蔽。只是聽起來敏感的欄位（例如品項鍵值、授權某事的人員）則會保留，因為遮蔽過多的記錄，就像遮蔽過少的記錄一樣，對除錯毫無用處。

## 疑難排解

| 症狀 | 可能原因 | 處理方式 |
| - | - | - |
| 預期的執行沒有出現在**自動化 → 執行紀錄**。 | 測試執行絕不會被記錄；逾期的排程執行會顯示為**已略過**；超過 90 天的執行會被清除。 | 在到期時間附近尋找**已略過**的列，或改用真實觸發條件而非測試執行。 |
| 工作流程觸發了兩次，或回應了自己的編輯。 | **「觸發者」**為**「兩者」**或**「工作流程」**。 | 將它改為**「人員」**。 |
| 狀態為**已成功**，但什麼都沒改變。 | 某個條件沒有符合任何路徑，且沒有**「否則」**。 | 結論句會指出該條件；調整其子句或新增**「否則」**。 |
| 較舊的執行沒有顯示任何步驟。 | 步驟列在 30 天後會被清除。 | 無需處理；抽屜中的橫幅會說明原因。 |
| **「發布」**回報問題。 | 必填欄位為空、步驟形成迴圈，或變數指向不一定會先執行的步驟。 | 選擇列出的每個問題即可跳到對應步驟。 |

## 相關內容

**通知**

「通知某人」步驟傳送的訊息送達之處，以及每位使用者如何將某個主題靜音。

[Open](https://docs.alforse.com/zh-Hant/docs/reference/notifications.md)

**核准**

自動化的另一半：針對文件、由規則驅動的簽核關卡。

[Open](https://docs.alforse.com/zh-Hant/docs/reference/approvals.md)

**稽核記錄**

另一份依記錄整理的歷程，記載誰在何時變更了哪個欄位。

[Open](https://docs.alforse.com/zh-Hant/docs/reference/audit-log.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.