人工任务
人工任务使工作流中间能够进行用户交互,例如表单提交、审批等。
人工任务使工作流中间能够进行人工交互。当工作流到达人工任务时,会将表单分配给用户或组进行填写。人工任务等待交互完成并记录用户输入,然后继续执行下一个任务。人工任务可用于各种涉及人工的任务,例如审批工作流中的手动审批或酒店预订工作流中的用户登记表。
为了支持涉及人工的任务,人工任务可以与以下 taskflow 功能一起使用:
- 用户表单—一个表单构建器,用于创建托管在您的 Conductor 集群上的用户表单。
- 人工任务 API—一套管理连接到 Conductor 工作流的人工任务生命周期的 API。
有关如何使用涉及人工的任务的完整指南,请参阅人工任务编排指南。
任务参数
在工作流创建期间,可以为人工任务配置:
分配策略—定义谁可以填写表单,表单分配给他们多长时间,以及如果分配超时该怎么办。
- 如果未配置,人工任务将不限于特定组或用户,任何人都可以完成表单。
- 可以添加多个分配策略以创建多级分配链。如果第一个组未在指定时间范围内选择分配,任务将升级到下一个分配的组。
- 如果前面的分配策略没有指定到期时间范围,则无法添加其他分配策略。
触发策略—如果任务状态或详细信息发生变化,则触发工作流开始。
为人工任务配置以下参数。
参数 | 描述 | 必需/可选 |
---|---|---|
displayName | 任务显示名称,将出现在用户的连接 UI 上。使用唯一的人类友好名称(例如,"贷款审批"或"预订表单")。 | 必需 |
userFormTemplate | 与人工任务关联的用户表单模板。当人工任务执行时,将分配此表单。 注意:如果您尚未创建用户表单,请转到定义 > 用户表单并设置它。请参阅创建用户表单的文档。 | 可选 |
userFormTemplate.name | 将分配的用户表单名称。 | - |
userFormTemplate.version | 将分配的用户表单版本号。 | - |
assignments | 人工任务的分配策略。 | 可选 |
assignments.userType | 将分配给任务的用户或组的类型。支持的值:外部用户—被分配者是驻留在外部系统中的 Conductor 集群外部的用户。外部组—被分配者是驻留在外部系统中的 Conductor 集群外部的组。Conductor 用户—被分配者是 Conductor 集群中的用户。Conductor 组—被分配者是 Conductor 集群中的组。 | - |
assignments.user | 被分配者的用户或组 ID。该值取决于用户类型。外部用户—提供在外部系统中管理和验证的用户电子邮件。外部组—提供在外部系统中管理和验证的组名称。Conductor 用户—提供用户的 Conductor 电子邮件。Conductor 组—提供Conductor 组名称。 | - |
assignments.slaMinutes | 人工任务将被分配的分钟数。使用 0 分钟表示无期限。 | - |
assignmentCompletion Strategy | 如果分配策略超时将发生的操作。支持的值:保持开放—人工任务执行保持开放,任何人都可以接手。终止—人工任务执行被终止并标记为已删除,工作流失败并显示错误"由于没有更多待处理的分配且完成策略为 TERMINATE,任务已终止"。 | 必需 |
taskTriggers | 人工任务的触发策略。 | 可选 |
taskTriggers.triggerType | 将触发指定工作流的条件。支持的条件有:待处理—如果人工任务进入待处理状态,将触发工作流。已分配—一旦人工任务分配给特定被分配者,将触发工作流。进行中—如果人工任务进入进行中状态,将触发工作流。已完成—如果人工任务进入已完成状态,将触发工作流。超时—如果人工任务超时,将触发工作流。被分配者已更改—如果由于分配策略或因为任务已保持开放并被任何人接手而导致被分配者更改,将触发工作流。认领者已更改—如果认领者更改,将触发工作流。 | - |
taskTriggers.startWorkflowRequest | 要触发的工作流的详细信息,包括其名称、版本、输入参数、关联 ID 和任务到域的映射。 | - |
此外,您还应该配置人工任务的 inputParameters
,其中包含从其关联的用户表单模板中获取的字段。配置取决于输入源:
- 如果字段要由被分配者填写,请将参数值留空。
- 如果字段是只读的,并且将从工作流中的某个地方传递,请输入参数值。该值可以作为变量传递。
任务配置
这是人工任务的任务配置。
{
"name": "human",
"taskReferenceName": "human_ref",
"inputParameters": {
"__humanTaskDefinition": {
"assignmentCompletionStrategy": "LEAVE_OPEN",
"displayName": "完成您的预订",
"userFormTemplate": {
"name": "someFormName",
"version": 1
},
"assignments": [
{
"assignee": {
"userType": "EXTERNAL_GROUP"
"user": "someId",
},
"slaMinutes": 0
}
],
"taskTriggers": [
{
"triggerType": "COMPLETED",
"startWorkflowRequest": { //工作流名称、版本、参数等}
}
]
},
"FormField": "", // 对应的任务输入参数,留空供用户输入
"anotherFormField": "someValue", // 如果表单字段设置为只读,则应传递值
"BooleanField": false
},
"type": "HUMAN"
}
任务输出
人工任务将返回包含表单响应的 JSON 对象。
在 UI 中添加人工任务
在将人工任务添加到工作流之前,您应该完成以下操作:
- 在 TaskFlow 的用户表单工作室中创建用户表单模板。
- 在定义 > 任务中定义人工任务。
有关如何使用涉及人工的任务的完整指南,请参阅人工任务编排指南。
添加人工任务的步骤:
在工作流中,选择 (+) 图标并添加 人工 任务。
在任务定义中,选择人工任务定义。
输入任务显示名称,它将出现在用户的连接 UI 上。使用唯一的人类友好名称,例如"贷款审批"或"预订表单"。
选择之前在用户表单工作室中创建的 UI 模板 及其版本。
(可选)添加分配策略以控制谁可以填写表单。
在分配策略中,选择 (+) 新建分配。
在分配中,选择被分配者的用户类型并输入相应的用户或组 ID。
- 外部用户或组—如果被分配者在外部系统中管理和验证,并访问外部 UI 完成任务,请选择此项。
- Conductor 用户或组—如果被分配者是 Conductor 用户,并使用 TaskFlow Conductor 完成任务,请选择此项。
输入 SLA 分钟 以指定分配在超时前的持续时间。使用 0 分钟设置无期限分配。
在分配后,选择分配超时时的策略。
如果需要,添加另一个分配以创建多级分配链。
(可选)添加触发策略以在人工任务状态更改时启动新工作流。
- 在触发策略中,选择 (+) 新建触发。
- 选择触发事件。
- 选择要启动的工作流及其版本。
- (可选)选择其他输入以配置工作流的输入参数、关联 ID 和任务到域的映射。
- 如果需要,添加另一个触发以启动另一个工作流。
在输入参数中,根据输入源配置表单字段:
- 如果字段要由被分配者填写,您可以将参数值留空或传入可以在提交前修改的默认值。
- 如果字段是只读的,并且将从工作流中的某个地方传递,请输入参数值。该值可以作为变量传递。
示例
以下是使用人工任务的一些示例。
费用审批
在此示例中,费用审批工作流包含两个人工任务,一个用于人力资源部门审批,另一个用于财务部门审批。由于两个轮次的审批过程相同,因此可以在两个人工任务中重复使用相同的用户表单模板。
费用名称和金额被传递到只读表单字段中,供用户查看和审批。如果费用已获得人力资源部门批准,它将进入下一阶段的审批。否则,工作流将终止。一旦费用获得财务部门批准,将触发通知工作流。
// 工作流定义
{
"name": "expenseApprovals",
"description": "审批费用",
"version": 1,
"tasks": [
{
"name": "human",
"taskReferenceName": "human_ref",
"inputParameters": {
"__humanTaskDefinition": {
"assignmentCompletionStrategy": "LEAVE_OPEN",
"userFormTemplate": {
"name": "ExpenseApproval",
"version": 1
},
"assignments": [
{
"assignee": {
"user": "HR",
"userType": "EXTERNAL_GROUP"
},
"slaMinutes": 0
}
],
"taskTriggers": [
{
"triggerType": "",
"startWorkflowRequest": {
"name": "",
"version": ""
}
}
],
"displayName": "审批费用 - 人力资源"
},
"expenseName": "${workflow.input.expense}",
"expenseAmt": "${workflow.input.amount}",
"approve": false,
"approveReason": ""
},
"type": "HUMAN"
},
{
"name": "HRApproved",
"taskReferenceName": "switch_ref",
"inputParameters": {
"switchCaseValue": "${human_ref.output.approve}"
},
"type": "SWITCH",
"decisionCases": {
"true": [
{
"name": "human_1",
"taskReferenceName": "human_1_ref",
"inputParameters": {
"__humanTaskDefinition": {
"assignmentCompletionStrategy": "LEAVE_OPEN",
"userFormTemplate": {
"name": "ExpenseApproval",
"version": 1
},
"displayName": "审批费用 - 财务",
"assignments": [
{
"assignee": {
"user": "Finance",
"userType": "EXTERNAL_USER"
}
}
],
"taskTriggers": [
{
"triggerType": "COMPLETED",
"startWorkflowRequest": {
"name": "notif",
"version": ""
}
}
]
},
"expenseName": "${workflow.input.expense}",
"expenseAmt": "${workflow.input.amount}",
"approve": false,
"approveReason": ""
},
"type": "HUMAN"
}
]
},
"defaultCase": [
{
"name": "terminate",
"taskReferenceName": "terminate_ref",
"inputParameters": {
"terminationStatus": "COMPLETED"
},
"type": "TERMINATE"
}
],
"evaluatorType": "value-param"
}
]
}