副作用:通知、Webhook 与写回

第 5 课 · 共 7 课 约 8 分钟

通知与两种 Webhook 的执行时机和失败后果;Action 可直接配邮件通知,writeback 调用源系统,sideEffects 在提交后调用外部系统。

本课目标

读完这一课,你将能够

  • 说出副作用是什么,分清通知、Webhook 与写回
  • 说出写回型与副作用型 Webhook 在时机和失败后果上的差别
  • 说出 AIDC 怎样配置 Action 通知与外部调用

副作用:改完之后向外发生的事

Action 改完对象,有时还要做两件事:告诉某个人,或者让另一个系统知道。这些不是对象上的修改,叫副作用:数据被送出了 Semantic。副作用有两类,通知与 Webhook。

通知Webhook 调用
做什么告诉一个人发生了什么向外部系统发一个请求,例如 ERP 的一个接口
发给谁固定名单、参数里指定的人,或对象属性里存的人一个事先配置好的外部地址
什么时候所有编辑落地之后写回型在所有规则之前,副作用型在编辑之后(见下)

副作用不在 Action 的事务里。事务保证的是对象上的编辑要么都成、要么都不成;通知发不出去,或外部请求失败,对象上的编辑仍可能已经生效。

通知

示例工厂里,暂停工单要通知质量负责人:人需要知道,但不必改任何数据,这是通知最典型的用法。收件人可以是固定的一批人、参数里指定的人,或对象属性里存的人;每人单独收到一份,而且只有看得见其中数据的人才会收到。

通知在所有编辑落地之后发出,但正文里引用的对象数据是编辑之前的状态。要让收件人看到最新状态,就在通知里带上对象的链接。

通知当前用模板渲染,不能用 Function 生成正文,也不能把组直接作为收件人。标题最多 250 个字符,正文最多 1,000 个字符,超长截断。缺省只要有一个收件人不合格,整个 Action 就不执行。配 notificationSettings.renderingSettings 为 anyNotificationRenderingCanFail,可以只发给合格的人。

Webhook:写回型与副作用型

写回型副作用型
何时执行在所有规则之前在对象编辑落地之后
失败会怎样什么都不改,执行人看到失败原因编辑已经生效,失败不会告诉执行人
一个 Action 里放几个只能一个可以多个,不保证顺序
适合外部系统才是权威,必须先成功尽力而为的通知,或同时写多个外部系统

写回型只保证一个方向:外部请求失败,Semantic 里就一个字也不改。反过来不成立:外部请求成功了,Semantic 里的修改仍可能失败,两边并不是一个事务。还有一条相关的规定:含外部调用的 Action 默认不自动重试,免得把同一个请求发两遍。

在 AIDC 里:配置通知与 writeback

ERP、MES、OA 缺省只读。Action 的改动落在 Semantic,下一次同步不会冲掉它。receive-material 可以只改本体(Ontology)里的采购订单和物料,也可以配置 writeback webhook 调用 ERP 的收货接口。源系统先接受,语义层才提交改动。

暂停工单可以直接在 Action 里配邮件通知。也可以用 Automate 监听 workOrder 变成 paused 后发邮件。下面保留后一种写法,展示应用清单里的 workflow 节选:

"workflow": {
  "input": { "work_order_no": { "type": "text", "required": true } },
  "trigger": {
    "change": {
      "type": "workOrder",
      "when": "=object.status == 'paused'",
      "cooldown": "1h",
      "input": { "work_order_no": "=object.workOrderNo" }
    }
  },
  "steps": [
    {
      "id": "mail",
      "kind": "notify",
      "title": "工单已暂停",
      "to": ["quality-lead@example.com"],
      "subject": "工单 {{ input.work_order_no }} 已暂停",
      "body": "请到 Semantic 里查看暂停原因。",
      "dedupe": "=input.work_order_no",
      "cooldown": "6h"
    }
  ]
}

notify 有几条规矩:收件人写死在清单里,最多 5 个,必须是本公司的账号(示例邮箱要换成真实账号);dedupe 相同的通知在 cooldown 内只发一次;预演(preview)只给出内容,不真发。

≤ 5每个 notify 步骤的收件人
6 小时缺省冷却:相同通知只发一次
20 封每个应用每天的通知上限(缺省)

副作用讲完了。下一节回到对象本身:一次修改留下哪些记录,出了错怎么查、怎么纠。

要点

  • 副作用是改完对象之后向外发生的事:通知与 Webhook,都不在 Action 的事务里。
  • 写回型 Webhook 在规则之前执行,失败就什么都不改;副作用型在编辑之后执行,失败不告诉执行人。
  • 通知正文引用的是编辑之前的数据,要看最新状态就带对象链接。
  • 数据源缺省只读。Action 可以配置 writeback、sideEffects 和 notifications;Automate 的 notify 步骤也能发通知。

练一练

为收料与发运设计副作用

先分清哪些事该发生在 Semantic 里,哪些不该。

receive-material 收货后可能要做三件事:增加物料库存、通知采购员、在 ERP 生成收货凭证。分别选择 Action 编辑规则、schema.notifications、schema.webhooks.writeback,说明各自的执行时机。

小测

选一个答案,马上看解析。

Q1订单发运后要给客户经理发一封邮件,在 AIDC 里今天该怎么做?

Q2写回型与副作用型 Webhook 最大的差别是什么?

Q3通知正文里引用了订单的状态,读到的是哪一刻的值?

延伸阅读