通过配置Webhook或者Kafka,零达低代码平台支持在流程流转过程中将流程状态及相关业务数据下发到第三方系统,使用者通过配置接收地址即可接收来自零达下发的流程数据及填报的业务数据(POST请求),从而方便第三方系统的业务处理。

推送事件

零达低代码平台通过Webhook将推送如下几类事件:

  • 流程启动事件 PROCESS_STARTED
  • 流程完成事件 PROCESS_COMPLETED
  • 流程终止事件 PROCESS_CANCELLED
  • 任务开始事件 TASK_CREATED
  • 任务完成事件 TASK_COMPLETED
  • 任务超时事件 TASK_TIMEOUT
  • 任务转办事件 TASK_TURN
  • 任务驳回事件 TASK_REJECT
  • 活动开始事件 ACTIVITY_STARTED
  • 活动完成事件 ACTIVITY_COMPLETED

    流程启动事件 PROCESS_STARTED

    当在零达中启动一个流程时,将触发一个流程启动事件,推送示例数据如下所示:
    1. {
    2. "processInstanceId": "13395898537664:13462600135808",
    3. "data": {},
    4. "subappId": 13347292570432,
    5. "processId": 13440967742400,
    6. "processName": "请假测试流程",
    7. "startTime": 1630394727121,
    8. "startUser": "2198",
    9. "event": "PROCESS_STARTED",
    10. "projectCode": "13395898537664"
    11. }

    流程完成事件 PROCESS_COMPLETED

    当在零达中办结一个流程时,将触发一个流程完成事件,推送示例数据如下所示:
    1. {
    2. "processInstanceId": "13395898537664:13462600135808",
    3. "data": {
    4. "name": "张三",
    5. "remark": "因个人私事请假"
    6. },
    7. "subappId": 13347292570432,
    8. "processId": 13440967742400,
    9. "processName": "请假测试流程",
    10. "startTime": 1630394727121,
    11. "startUser": "2198",
    12. "event": "PROCESS_COMPLETED",
    13. "projectCode": "13395898537664"
    14. }

    流程终止事件 PROCESS_CANCELLED

    当在零达中终止一个流程时,将触发一个流程终止事件,推送示例数据如下所示:
    1. {
    2. "processInstanceId": "13395898537664:13462600135808",
    3. "data": {
    4. "name": "张三",
    5. "remark": "因个人私事请假"
    6. },
    7. "subappId": 13347292570432,
    8. "processId": 13440967742400,
    9. "processName": "请假测试流程",
    10. "startTime": 1630394727121,
    11. "startUser": "2198",
    12. "event": "PROCESS_CANCELLED",
    13. "projectCode": "13395898537664"
    14. }

    任务开始事件 TASK_CREATED

    当流程自动创建一个用户任务时,将触发一个任务创建事件,推送示例数据如下所示:
    1. {
    2. "processInstanceId": "13395898537664:13462600135808",
    3. "data": {
    4. "name": "张三",
    5. "remark": "因个人私事请假"
    6. },
    7. "businessData": {
    8. "node_of_type": "approve",
    9. },
    10. "taskInstanceId": "13395898537664:13462600204544",
    11. "candidate": {
    12. "users": [
    13. "2198",
    14. "2194"
    15. ],
    16. "roles": [],
    17. "depts": []
    18. },
    19. "subappId": 13347292570432,
    20. "processId": 13440967742400,
    21. "processName": "请假测试流程",
    22. "startTime": 1630394728195,
    23. "taskName": "领导审批",
    24. "startUser": "2198",
    25. "event": "TASK_CREATED",
    26. "projectCode": "13395898537664",
    27. "taskId": "flow-node-fselo359dgk-inkbbldqnf-akcdwqr392d"
    28. }

    任务完成事件 TASK_COMPLETED

    当流程中的一个任务被办理时,将触发一个任务完成事件,推送示例数据如下所示:
    1. {
    2. "processInstanceId": "13395898537664:13462600135808",
    3. "data": {
    4. "name": "张三",
    5. "remark": "因个人私事请假"
    6. },
    7. "businessData": {
    8. "node_of_type": "approve",
    9. },
    10. "taskInstanceId": "13395898537664:13462600204544",
    11. "candidate": {
    12. "users": [
    13. "2198",
    14. "2194"
    15. ],
    16. "roles": [],
    17. "depts": []
    18. },
    19. "subappId": 13347292570432,
    20. "processId": 13440967742400,
    21. "processName": "请假测试流程",
    22. "startTime": 1630394728195,
    23. "taskName": "领导审批",
    24. "startUser": "2198",
    25. "event": "TASK_COMPLETED",
    26. "projectCode": "13395898537664",
    27. "taskId": "flow-node-fselo359dgk-inkbbldqnf-akcdwqr392d",
    28. "assign": "2194"
    29. }

    任务超时事件 TASK_TIMEOUT

    当流程中的一个任务超时时,将触发一个任务超时事件,推送示例数据如下所示:
    1. {
    2. "processInstanceId": "13395898537664:13462600135808",
    3. "data": {
    4. "name": "张三",
    5. "remark": "因个人私事请假"
    6. },
    7. "businessData": {
    8. "node_of_type": "approve",
    9. },
    10. "taskInstanceId": "13395898537664:13462600204544",
    11. "candidate": {
    12. "users": [
    13. "2198",
    14. "2194"
    15. ],
    16. "roles": [],
    17. "depts": []
    18. },
    19. "subappId": 13347292570432,
    20. "processId": 13440967742400,
    21. "processName": "请假测试流程",
    22. "startTime": 1630394728195,
    23. "taskName": "领导审批",
    24. "startUser": "2198",
    25. "event": "TASK_TIMEOUT",
    26. "timeoutCount": 1,
    27. "projectCode": "13395898537664",
    28. "taskId": "flow-node-fselo359dgk-inkbbldqnf-akcdwqr392d",
    29. "assign": "2194"
    30. }

    任务驳回事件 TASK_REJECT

    当一个用户任务被驳回时,将触发一个任务驳回事件,推送示例数据如下所示:
    1. {
    2. "processInstanceId": "13395898537664:13462600135808",
    3. "data": {
    4. "name": "张三",
    5. "remark": "因个人私事请假"
    6. },
    7. "businessData": {
    8. "node_of_type": "approve",
    9. },
    10. "taskInstanceId": "13395898537664:13462600204544",
    11. "candidate": {
    12. "users": [
    13. "2198",
    14. "2194"
    15. ],
    16. "roles": [],
    17. "depts": []
    18. },
    19. "subappId": 13347292570432,
    20. "processId": 13440967742400,
    21. "processName": "请假测试流程",
    22. "startTime": 1630394728195,
    23. "taskName": "领导审批",
    24. "startUser": "2198",
    25. "state":5,
    26. "event": "TASK_REJECT",
    27. "projectCode": "13395898537664",
    28. "taskId": "flow-node-fselo359dgk-inkbbldqnf-akcdwqr392d"
    29. }

    任务转办事件 TASK_TURN

    当一个用户任务被转办时,将触发一个任务转办事件,推送示例数据如下所示:
    1. {
    2. "processInstanceId": "13395898537664:13462600135808",
    3. "data": {
    4. "name": "张三",
    5. "remark": "因个人私事请假"
    6. },
    7. "businessData": {
    8. "node_of_type": "approve",
    9. },
    10. "taskInstanceId": "13395898537664:13462600204544",
    11. "candidate": {
    12. "users": [
    13. "2198",
    14. "2194"
    15. ],
    16. "roles": [],
    17. "depts": []
    18. },
    19. "subappId": 13347292570432,
    20. "processId": 13440967742400,
    21. "processName": "请假测试流程",
    22. "startTime": 1630394728195,
    23. "taskName": "领导审批",
    24. "startUser": "2198",
    25. "state":1,
    26. "event": "TASK_TURN",
    27. "projectCode": "13395898537664",
    28. "taskId": "flow-node-fselo359dgk-inkbbldqnf-akcdwqr392d"
    29. }

    活动开始事件 ACTIVITY_STARTED

    当流程中的一个活动开始时,将触发一个活动开始事件,推送示例数据如下所示:
    1. {
    2. "processInstanceId": "14551883133568",
    3. "data": {
    4. "name": "张三",
    5. "userId": "14"
    6. },
    7. "businessData": {
    8. "node_of_type": "submit",
    9. },
    10. "taskInstanceId": "14551883133952",
    11. "projectCode": "14059156939648",
    12. "processId": 14551822826688,
    13. "processName": "数据连接推送",
    14. "subappId": "14551531688385",
    15. "startTime": 1647414773968,
    16. "taskName": "查找用户",
    17. "startUser": "14",
    18. "event": "ACTIVITY_STARTED",
    19. "taskId": "flow-node-dsycu3kucz-9nybm9e7xw9-5dd81u3biwm"
    20. }

    活动完成事件 ACTIVITY_COMPLETED

    当流程中的一个活动完成时(数据连接、业务插件),将触发一个活动完成事件,推送示例数据如下所示:
    1. {
    2. "ext": {
    3. "url": "http://10.19.248.238:17474/mock/receive?name=%E9%99%88%E8%89%B3%E5%B9%B3",
    4. "method": "POST",
    5. "headers": {
    6. "auth": "f48116b614434759921eb1668f61e4b4"
    7. },
    8. "body": "{\"userId\":\"14\"}",
    9. "status": 200,
    10. "response": "{\"parameters\":{\"name\":[\"张三\"]},\"headers\":{\"content-length\":\"15\",\"accept-language\":\"zh-CN,zh;q=0.8\",\"auth\":\"f48116b614434759921eb1668f61e4b4\",\"host\":\"10.19.248.238:17474\",\"content-type\":\"application/json;charset=UTF-8\",\"connection\":\"keep-alive\",\"cache-control\":\"no-cache\",\"accept-encoding\":\"gzip, deflate\",\"pragma\":\"no-cache\",\"accept\":\"text/html,application/json,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\",\"user-agent\":\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36 Hutool\"},\"body\":{\"userId\":\"14\"}}",
    11. "extracts": [
    12. {
    13. "key": "userId",
    14. "value": "14",
    15. "path": "body.userId"
    16. }
    17. ]
    18. },
    19. "processInstanceId": "14551883133568",
    20. "data": {
    21. "name": "张三",
    22. "userId": "14"
    23. },
    24. "businessData": {
    25. "node_of_type": "submit",
    26. },
    27. "taskInstanceId": "14551883133952",
    28. "projectCode": "14059156939648",
    29. "processId": 14551822826688,
    30. "processName": "数据连接推送",
    31. "subappId": "14551531688385",
    32. "startTime": 1647414773968,
    33. "taskName": "查找用户",
    34. "startUser": "14",
    35. "event": "ACTIVITY_COMPLETED",
    36. "taskId": "flow-node-dsycu3kucz-9nybm9e7xw9-5dd81u3biwm"
    37. }

    数据说明

    通过Webhook接收到的数据,其相关业务含义如下:
属性 解释 示例
messageTime 消息产生时间 1647653041420
progress 流程或任务进度 0.12
event 事件类型,共有如下几类:
- PROCESS_STARTED
- PROCESS_COMPLETED
- PROCESS_CANCELLED
- TASK_CREATED
- TASK_COMPLETED
- TASK_TIMEOUT
- TASK_TURN
- TASK_REJECT
- ACTIVITY_STARTED
- ACTIVITY_COMPLETED
TASK_COMPLETED
projectCode 项目代码,即所属租户代码 13395898537664
subappId 子应用ID 13347292570432
processId 流程ID(一个子应用可以有多个不同版本的流程,因此子应用和流程是一对多的关系) 13440967742400
processName 流程名称 请假测试流程
processInstanceId 流程实例ID 13395898537664:13462600135808
parentProcessInstanceId 父流程实例标识 13395898537664:16462600135808
subProcessInstanceIds 子流程实例标识 [“
13395898537664:12462600135808”,

13395898537664:11462600135808”]
startUser 流程发起人 2198
startTime 流程或任务创建时间 1630394728195
taskId 任务ID,即流程定义中的key flow-node-fselo359dgk-inkbbldqnf-akcdwqr392d
taskName 任务名称 领导审批
taskInstanceId 任务实例ID 13395898537664:13462600204544
assign 任务的实际办理人 2198
candidate 任务的候选办理人,包含三个属性:
users:可办理的候选用户 [“2198”,”2184”]
roles:可办理的候选角色 [“3198”,”3184”]
depts:可办理的候选部门 [“1198”,”1184”]
data 流程数据,即通过表单填报的数据 {
“name”: “张三”,
“remark”: “因个人私事请假”
}
ext 附加数据,结构不固定
businessData 业务数据 {
“code”:”123”
}
timeoutCount 任务的超时次数 1
state 流程状态:
- 进行中=1
- 已终止=2
- 已撤回=3
- 已办结=4
- 已驳回=5
- 已挂起=6
1

Webhook接收示例

第三方系统通过定义一个POST方式的接口来接收来自于Webhook下发的数据,如下所示:

  1. @PostMapping("receive")
  2. public Boolean receive(@RequestBody PushMessage message){
  3. System.out.println(message);
  4. return true;
  5. }

类 PushMessage 示例如下:

@Data
@Builder
class PushMessage{
    /**
     * 消息产生时间
     */
    private Long messageTime;
    /**
     * 流程或任务进度
     */
    private Double progress;
    /**
     * 事件类型
     */
    private String event;
    /**
     * 项目代码
     */
    private String projectCode;
    /**
     * 子应用标识
     */
    private String subappId;
    /**
     * 流程标识
     */
    private Long processId;
    /**
     * 子应用(流程)名称
     */
    private String processName;
    /**
     * 流程实例标识
     */
    private String processInstanceId;
    /**
     * 父流程实例标识
     */
    private String parentProcessInstanceId;
    /**
     * 子流程实例标识
     */
    private List<String> subProcessInstanceIds;
    /**
     * 流程启动用户
     */
    private String startUser;
    /**
     * 流程或任务创建时间
     */
    private Date startTime;
    /**
     * 任务标识
     */
    private String taskId;
    /**
     * 任务实例标识
     */
    private String taskInstanceId;
    /**
     * 任务名称
     */
    private String taskName;
    /**
     * 任务办理人
     */
    private String assign;
    /**
     * 候选办理者
     */
    private Candidate candidate;
    /**
     * 流程数据
     */
    private Map<String, Object> data;
    /**
     * 扩展数据
     */
    private Object ext;
    /**
     * 业务数据
     */
    private JSONObject businessData;
    /**
     * 任务超时次数
     */
    private Integer timeoutCount;
    /**
     * 流程状态
     *     进行中 = 1,
     *     已终止 = 2,
     *     已撤回 = 3,
     *     已办结 = 4,
     *     已驳回 = 5,
     *     已挂起 = 6
     */
    private int state;
}

类 Candidate 示例如下:

@Data
@Builder
class Candidate{
    /**
     * 候选用户
     */
    private Set<String> users;
    /**
     * 候选角色
     */
    private Set<String> roles;
    /**
     * 候选部门
     */
    private Set<String> depts;
}

类 HttpCallResult 示例如下:

@Data
public class HttpCallResult implements Serializable {
    /**
     * HTTP 地址
     */
    private String url;
    /**
     * HTTP 方法
     */
    private String method;
    /**
     * 传递的头参数
     */
    private Map<String, String> headers;
    /**
     * 传递的body内容
     */
    private String body;
    /**
     * HTTP 状态码
     */
    private Integer status;
    /**
     * 原始响应内容
     */
    private String response;
    /**
     * 提取的回填内容
     */
    private List<MapItem> extracts;

}