NocoBase 内置了常见的数据操作(增删改查等),当这些操作无法满足复杂的业务需求时,可以通过在工作流中使用自定义操作事件,并将该该事件绑定到页面区块的“触发工作流”的按钮上,用户点击后,将会触发一个自定义操作的工作流。
创建工作流时,选择“自定义操作事件”:

v.1.6.0+
上下文类型的不同会决定该工作流可以被绑定在哪些区块的按钮上:

当上下文类型是单行数据或多行数据时,需要选择要绑定数据模型的数据表:

如果需要在工作流中使用触发数据行的关联数据,可以在这里选择深层的关联字段:

这些字段会在事件触发后自动预加载到工作流的上下文中,以便在工作流中使用。
根据工作流配置的上下文类型不同,在不同区块的操作按钮配置也有所区别。
v.1.6.0+
在操作面板和其他数据区块,均可添加“触发工作流”按钮:



添加按钮后绑定之前创建的无上下文的工作流,以操作面板中的按钮为例:


在任意数据区块中,对单行数据的操作栏中都可以添加“触发工作流”按钮,如表单、表格的数据行、详情等:



添加按钮后绑定之前创建的工作流:


之后点击此按钮即可触发该自定义操作事件:

v.1.6.0+
在表格区块的操作栏中,添加“触发工作流”按钮时会有一个额外选项,选择上下文类型是“无上下文”或“多行数据”:

当选择“无上下文”时,即为全局事件,仅能绑定无上下文类型的工作流。
当选择“多行数据”时,可以绑定多行数据类型的工作流,可以用于多选数据后的批量操作(目前仅表格支持)。此时可选的工作流范围仅为配置了匹配当前数据区块数据表的工作流:

在点击按钮触发时,必须已经勾选了表格中的部分数据行,否则将不会触发工作流:

例如,我们有一个“样品”数据表,针对“已采集”(状态)的样品,需要提供一个“送检”的操作,送检会先检查样品的基本信息,然后生成一条“送检记录”数据,再把样品状态修改为“已送检”。而这一系列过程无法通过简单的“增删改查”按钮点击完成,这时就可以使用自定义操作事件来实现。
先创建一张“样品”数据表和一张“送检记录”数据表,对样品表录入基本的测试数据:

然后创建一个“自定义操作事件”工作流,如果需要操作流程有比较及时的反馈,可以选择同步模式(同步模式下不能使用人工处理等异步类型的节点):

在触发器配置中,数据表选择“样品”:

根据业务需求,编排流程中的逻辑,例如指标参数大于 90 时才允许送检,否则提示相关问题:

"响应消息"节点可以在同步的自定义操作事件中使用,用于返回给客户端的提示信息。异步模式下无法使用。
配置好流程并启用后,再返回表格界面,在表格的操作列中添加“触发工作流”的按钮:

然后在按钮的配置菜单中选择绑定工作流,打开配置弹窗:

添加之前启用的工作流:

提交后,再将按钮文本修改为操作名称,如“送检”字样,配置流程就完成了。
使用时,在表格中任选一条样品数据,并点击“送检”按钮,即可触发自定义操作事件。正如之前编排的逻辑,如果样品指标参数小于 90,点击后则会如下提示:

如果指标参数大于 90,则会正常执行流程,生成“送检记录”数据,并将样品状态修改为“已送检”:

至此,一个简单的自定义操作事件就完成了。同样的,对类似有复杂操作的业务,如订单处理、提交报告等,都可以通过自定义操作事件来实现。
自定义操作事件的触发不仅限于用户界面的操作,也可以通过 HTTP API 调用触发。特别地,自定义操作事件为所有数据表操作都提供了触发工作流的新操作类型:trigger,可安装 NocoBase 标准的操作 API 来进行调用。
类似示例中由按钮触发的工作流,可以这样调用:
由于该操作是针对单条数据的,所以在对已有数据调用时,需要指定数据行的 ID,替换 URL 中的 <:id> 部分。
如果是在针对表单调用(如新增或更新),对新增数据的表单可以不传入 ID,但需要传入提交的数据,作为执行的上下文数据:
针对更新表单,需要同时传入数据行的 ID,以及更新的数据:
如果同时传入了 ID 和数据,将首先加载 ID 对应的数据行,再使用传入的数据对象中的属性覆盖原始数据行来得到最终的触发数据上下文。
如果传入了关系数据,则也会进行覆盖,尤其在配置了预加载使用关系数据项时,需要谨慎处理传入数据,以免关系数据被覆盖不符合预期。
另外,URL 参数 triggerWorkflows 为工作流的 key,多个工作流用逗号分隔。该 key 可在工作流画布顶部工作流名称处鼠标悬浮后获得:

以上调用成功后,将触发对应 samples 表的自定义操作事件。
因为外部调用也需要基于用户身份,所以通过 HTTP API 调用时,和普通界面发送的请求一致,都需要提供认证信息,包括 Authorization 请求头或 token 参数(登录获得的 token),以及 X-Role 请求头(用户当前角色名)。
如果需要触发该操作中对一关系数据(对多暂不支持)的事件,可以在参数中使用 ! 来指定关系字段的触发数据:
以上调用成功后,将触发对应 categories 表的自定义操作事件。
通过 HTTP API 调用触发操作后事件时,也需要注意工作流的启用状态,以及数据表配置是否匹配,否则可能不会调用成功,或出现错误。