參考

CEL 表示式

公式欄位、驗證規則、可見性、共享和流程條件背後的表示式語言 —— ObjectOS 在哪裡使用它、幾個示例,以及 objectstack.ai 上的完整語言規範。

完整規範:objectstack.ai 上的表示式(CEL)。本頁是摘要:ObjectOS 在哪裡使用它,以及幾個示例。

ObjectOS 在任何需要一個小巧、安全的表示式的定義中使用 CEL(Common Expression Language):它沒有 副作用,沒有 I/O,並且在伺服器上求值。表示式能以 record 看到被求值的記錄(以 previous 看到它之前的狀態),並且 —— 在有執行使用者的地方 —— 以 current_user 看到該使用者。

ObjectOS 在哪裡使用它

位置表示式決定什麼
公式欄位欄位的值,由記錄推導而來
欄位的 requiredWhen、visibleWhen、readonlyWhen該欄位在這條記錄上是否必填、是否顯示、是否可編輯
驗證規則是否拒絕一次寫入(驗證規則)
共享規則授予一組使用者哪些記錄(記錄訪問)
動作的 visible / disabled是否提供該按鈕
流程的啟動條件及其分支流程是否執行,以及走哪個分支(流程)
欄位的 defaultValue新記錄的初始值

示例

公式欄位 —— 明細行合計:

subtotal: Field.formula({
  label: 'Subtotal',
  expression: F`record.quantity * record.unit_price`,
}),

驗證 —— 關閉日期必須在將來。script 規則的 condition 描述的是無效的 記錄:當它為真時,寫入會被拒絕。

// One validation rule, an entry of the object's `validations`
{
  type: 'script',
  name: 'close_date_in_future',
  message: 'Close date must be in the future',
  condition: P`record.close_date <= today()`,
}

可見性 —— 只在商機贏單後才顯示某個欄位:

close_reason: Field.textarea({
  label: 'Close reason',
  visibleWhen: P`record.stage == 'closed_won'`,
}),

流程條件 —— 只在金額較大時啟動記錄變更流程:

// The `config` of a `start` node; the rest of the flow is omitted (see Flows).
config: {
  objectName: 'opportunity',
  triggerType: 'record-after-update',
  condition: P`record.amount >= 1000`,
}

許可權檢查

從 ObjectStack 17.5 起,current_user.can(object, verb) 用於詢問執行使用者是否持有 某項物件許可權,依據該使用者的有效許可權作答:

discount: Field.percent({
  label: 'Discount',
  defaultValue: cel`current_user.can('crm_quote', 'edit') ? 10 : 0`,
}),

伺服器會在選擇項選項的 visibleWhen 中(使用者不能選擇的選項會以 invalid_option 被拒絕)、在公式欄位中以及在 CEL defaultValue 中回答它。在不攜帶許可權資料的求值 中 —— 驗證規則就是一例 —— can() 會被拒絕而不是被猜測,表示式隨之失敗。

當表示式有錯時

它不會靜默失敗。格式錯誤的表示式,或者點名了物件上不存在的欄位的表示式,會讓 os compile 失敗,並給出位置和一個"你是不是想寫"的提示。在執行時,錯誤的表示式 會丟擲一個可歸因的錯誤,而不是求值為 null 或 false,所以故障會出現在日誌和審計 軌跡中,而不是悄悄地破壞一個公式值或一次守衛判定。

另請參閱