概述说明

概述说明

能做什么

流程引擎能够在 多种触发条件下,接受固定的输入数据, 自动执行一系列操作 完成整个业务流程,减少重复开发,提升效率。 其中有三个特点

  1. 多样的触发条件:要触发一个流程, 可以在多种情况下,比如新增数据,更新数据,删除数据或者无任何数据操作,直接触发流程。
  2. 固定的输入数据:流程会绑定特定的一个数据模型,所有输入流程的数据结构要兼容该模型结构,只有在模型中定义的变量才可以参与流程中的条件判断。
  3. 自动化执行操作:流程流转都是自动进行的,无需额外编码。

相关模块

  1. 表单设计中心:表单设计中心负责设计和配置表单。
  2. 表单数据服务:表单数据服务负责插入、更新、删除表单数据。
  3. 表单渲染引擎:表单渲染引擎负责将表单设计中心设计的表单渲染成用户可交互的前端页面。
  4. 流程模型中心:流程模型中心负责设计和配置业务的流程。
  5. 流程流转引擎:流程流转引擎负责将流程模型设计中心设计的流程模型转换为具体的流程实例, 也就是实际的任务调度,人员分配都在这里完成。
  6. 流程管理后台:流程管理后台提供流程实例的监控功能,可以查看进度,结束异常流程或者重新分配候选人等操作。
  7. 流程中心:流程中心是可发起流程的列表。
  8. 待办中心:待办中心负责查看我发起,处理待我审批/填写列表,查看我已审批的的列表。

使用场景

流程引擎可以配合表单引擎在Baas生态闭环内使用,也提供了标准接口,作为一个强大的二次开发平台使用。

简单使用

android 流程引擎 流程引擎工作原理_android 流程引擎

简单使用场景是针对简单业务,使用Baas内置的业务模块,比如流程中心,代办中心来完成发起流程和完成流程任务等操作。

可以通过0代码快速完成业务开发与部署,但是限制是,只能触发条件只能是新增表单数据,并且流程任务没有复杂逻辑。

二次开发使用

android 流程引擎 流程引擎工作原理_字段_02

二次开发使用场景是针对页面有新增功能或者流程触发时机有变化的业务:

  1. 页面有新增功能:因为表单渲染引擎的默认渲染页面比较简单,可能无法满足复杂需求。比如添加一些其他功能,比如菜单、面包屑、操作记录列表等,这时表单页面需要二次开发,但是表单布局和样式不发生变化。
  2. 触发时机有变化:默认流程中心中发起流程都是将新增表单数据作为触发时机,但是有些业务的触发流程时机并不是新增数据,可能是修改表单数据或者删除表单数据时触发。如下面例子 [客户反馈登记2]

传统开发使用

android 流程引擎 流程引擎工作原理_数据_03

传统开发使用针对特别复杂特殊业务:

大多复杂业务都是二次开发可以完成,一些极少数情况下,比如为了兼容旧的第三方页面或者客户有客户对表单布局样式有特殊需求,整个表单页面需要完全重新开发。 流程流转引擎提供流程流转生命周期内需要用到的所有完整接口,可以很方便的接入。

使用例子

客户反馈登记

以 客户反馈登记 为例

工作流1、当客服人员新增一条客户反馈记录时,就通知客服主管查看。

触发条件:新增一条客户反馈记录。

自动执行动作: 通知 指定人。

工作流2、当客服人员修改记录状态为:已解决,就通知客户主管审批。

触发器:数据内容。

自动执行动作: 让指定人的审批。

销售管理

以 销售管理为 例

流程1:当《客户联系人》表中新增一条记录时,就自动在《线索管理》表中添加 对应的线索记录。

触发器:新增一条新线索。

自动执行动作:在另外一张表中自动添加一条记录。

快速开始

 

全局配置

流程流转配置

流转属性配置 包含流程流转时的一些通用功能

配置名称

是否必填

说明

第一个节点还未进行处理时,发起人可撤回

默认开启

当审批节点的候选人为发起人时自动通过

默认开启

消息通知配置

消息通知配置 包含消息通知的格式,消息去重,以及添加自定义消息

节点介绍

流程节点代表特殊的事件、任务或者条件分支。

开始与结束

开始与结束节点标识流程的开始与结束,一个流程有且只有一个开始节点和一个结束节点。

开始

配置名称

是否必填

描述

名称

开始节点名称。

表单字段

配置开始表单字段的编辑可见、详情可见、是否可写。

表单操作

* 保存:保存开始表单内容,不提交 * 提交:提交开始表单内容

接口调用

配置调用开放平台的接口和调用时机,包括流程开始前或者流程开始后。

抄送人员

流程开始后抄送给相应的人员。

 

其中表单字段权限配置只在简单场景和二次开发使用场景下有效,传统开发使用场景无效。

结束

配置名称

是否必填

描述

名称

结束节点名称

业务接口调用

配置调用开放平台的接口和调用时机,包括流程结束前或者流程结束后。

抄送

流程结束后抄送给相应的人员。

审批与填写

在流程中需要涉及管理审批的情况下,可以使用审批节点。 审批人 拥有 保存、同意、拒绝、回退、转审 这些的操作,可以根据审批结果来决定流程 是继续走下去,还是中止,还是回退。

在流程流转中需要某些成员提供一些必要信息,可以通过填写节点完成。 填写人 拥有 保存、提交、转交 这些操作,流程只会在提交操作后继续往下走。

填写节点和审批节点都是需要用户参与的,区别是填写节点后面没有条件分支,填写结果不影响流程走向。

审批

配置名称

是否必填

说明

名称

审批节点名称

审批人员:

审批节点的候选人列表

表单字段

配置审批表单字段的编辑可见、详情可见、是否可写。

同意条件

可以配置按人数和按百分比两种计算方式,当同意的人数满足条件才会同意并向下流转,为空代表1人同意就向下流转。

拒绝条件

可以配置按人数和按百分比两种计算方式,当拒绝的人数满足条件才会拒绝并向下流转,为空代表1人拒绝就向下流转。

处理限时

流程节点分配候选人后,多少时间内不处理视为该节点超时

* 无限制:不限时(默认) * 自定义:设置限时小时个数

超时处理

超时后处理策略

* 发送提醒:发送APP提醒消息(默认) * 自动通过:流程的拥有者同意该审批节点

表单操作

* 保存:保存审批内容,不提交保存结果 * 同意:同意审批内容 (必须) * 拒绝:拒绝审批内容 * 回退:退回到之前的某个流程节点并重新执行下面的流程(配置 同意条件拒绝条件 后不可用) * 转审:当前审批人把审批权限转交给他人审批

接口调用

配置调用开放平台的接口和调用时机,包括审批结果处理前或者审批结果处理后开始后。

抄送人员

审批完成后,将审批结果抄送相关人员

填写

配置名称

是否必填

说明

名称

填写节点名称

填写人员:

填写节点的候选人列表

表单字段

配置填写表单字段的编辑可见、详情可见、是否可写。

处理限时

流程节点分配候选人后,多少时间内不处理视为该节点超时

* 无限制:不限时(默认) * 自定义:设置限时小时个数

超时处理

超时后处理策略

* 发送提醒:发送APP提醒消息(默认) * 自动通过:流程的拥有者同意该审批节点

表单操作

* 保存:保存填写内容,不提交 * 提交:提交填写内容(必须) * 转交:当前填写人可以转交给他人填写内容

接口调用

配置调用开放平台的接口和调用时机,包括填写内容处理前或者填写内容处理后。

抄送人员

填写完成后,抄送相关人员

条件分支

分支代表流程的走向,任何节点都有输入分支和输出分支

当一个节点具有多条输入分支,则流程流转引擎会等待可以被执行的输入分支上的节点都完成,才会流转进入当前节点。 当一个节点具有多条输出分支,则流程流转引擎会根据分支上的条件判断走哪一条分支,如果多个条件分支都满足,则走最先匹配到的分支。

 

实际上可以推导得出,在这样的条件下,多条输入分支上有且只有一条可以被执行。

输出分支根据所在节点不同可以分为普通分支和审批分支

普通分支

普通分支可以添加自定义条件类型,即通过条件构造器构造自定义条件。

审批分支

审批后流程的流转90%以上是根据审批结果判断的,也就是同意与拒绝。 因此审批分支在普通分支的基础上增加了审批结果条件类型。

配置名称

是否必填

说明

名称

分支名称,当条件类型为审批结果条件时,不需要配置。

条件类型

普通分支为自定义条件;审批分支为自定义条件和审批结果条件。

默认分支

多条输出分支时,无任何条件满足时,执行默认你分支

待办中心

 

流程监控

 

API 参考

流程模型中心

新增模型

流程模型数据结构:

{
    "modelId": "1f160364-d170-11ea-9db3-005056c00008", // 非必填 | 流程模型id, 修改时传
    "childShapes": [], // 字节点
    "properties": {
        "process_id": "process_key", // 必填 | 流程的key (用户手动输入, 且保存后不能修改)
        "name": "测试流程", // 必填 | 流程的名称
        "formEnName": "test_form", // 必填 | 表单英文名称, 内部表单用
    }
}

子节点数据结构:

开始

{
    "resourceId": "startEvent1", // 必填 | 节点定义id (前端自动生成)
    "properties": {
        "form": {
            "fieldAccessAuth": {
                // 非必填 | 字段访问权限
            },
            "operateAuth": {
                // 非必填 | 表单操作权限:保存、提交
            },
            pageUrl: {
                "web": "",
                "mobile": ""
            },
        },
        serviceApis: [ // 非必填 | 接口调用
            {
                trigger: 0, // 必填 | 0 任务开始前、 1 任务结束后
                serviceId: 123456, // 必填 | 服务id
                serviceName: "服务名称", // 必填 | 服务名称
                apiId: 123456, // 必填 | 接口id
                apiName: "服务名称", // 必填 | 接口名称
            }
        ],
        copyTo: {
            "personal": [ // 人员
                {
                    "uid": "881649", // uid
                    "name": "杨六"
                },
            ],
            "leader": [ // 组织领导
                0, // 0 部门负责人、1 单位负责人、2 上级单位负责人
            ],
            "hierarchical": [ // 汇报层级
                0, // 0 直接上级、1 二级汇报人、2 三级汇报人
            ]
        }
    },
    "stencil":{
        "id":"StartNoneEvent" // 必填 | 节点标识
    },
    "outgoing":[
        // 必填 | 下一跳节点出口
        {
            "resourceId":"sid-83131E16-E692-47EC-86B5-C95085EB584B"
        }
    ]
}

结束

{
    "resourceId":"sid-083B25ED-7EE9-4328-BF1C-C9CFEF69FF15", // 必填 | 节点定义id (前端自动生成)
    "properties": {
        copyTo: {
            "personal": [ // 人员
                {
                    "uid": "881649", // uid
                    "name": "杨六"
                },
            ],
            "leader": [ // 组织领导
                0, // 0 部门负责人、1 单位负责人、2 上级单位负责人
            ],
            "hierarchical": [ // 汇报层级
                0, // 0 直接上级、1 二级汇报人、2 三级汇报人
            ]
        }
    },
    "stencil":{
        "id":"EndNoneEvent" // 必填 | 节点标识
    }
}

审批

{
    "resourceId":"sid-02D0F331-9AEC-4592-8C78-6F405FD401AA", // 必填 | 节点定义id (前端自动生成)
    "properties": {
        "name": "结束", // 非必填 | 节点名称
        "candidateUser": {
            "personal": [ // 人员
                {
                    "uid": "881649", // uid
                    "name": "杨六"
                },
            ],
            "leader": [ // 组织领导
                0, // 0 部门负责人、1 单位负责人、2 上级单位负责人
            ],
            "hierarchical": [ // 汇报层级
                0, // 0 直接上级、1 二级汇报人、2 三级汇报人
            ]
        },
        "form": { // 非必填 | 表单配置
            "fieldAccessAuth": {
                // 非必填 | 字段访问权限
            },
            "operateAuth": {
                // 非必填 | 表单操作权限:保存、同意、拒绝、回退(配置 同意条件 和 拒绝条件 后不可用)、转审
            },
            pageUrl: {
                "web": "",
                "mobile": ""
            },
        },
        serviceApis: [ // 非必填 | 接口调用
            {
                trigger: 0, // 必填 | 0 任务开始前、1 任务结束后
                serviceId: 123456, // 必填 | 服务id
                serviceName: "服务名称", // 必填 | 服务名称
                apiId: 123456, // 必填 | 接口id
                apiName: "服务名称", // 必填 | 接口名称
            }
        ],
        "multiInstanceCondition": { // 多实例设置
            "branchType": 0, // 必填 | 0 同意、 1 拒绝
            "calculationType": 0, // 必填 | 0 按人数、 1 按百分比
            "value": 10 // 必填 | 数值: 按人数时代表人数,按百分比时代表百分比(0 - 100]
        },
        "dueDate": { // 超时设置
            "hours": 2, // null 代表不限时,数字代表超时时间
            "strategy": 0 // 处理策略: 0 发送APP提醒、1 自动流转下去
        },
        copyTo: {
            "personal": [ // 人员
                {
                    "uid": "881649", // uid
                    "name": "杨六"
                },
            ],
            "leader": [ // 组织领导
                0, // 0 部门负责人、1 单位负责人、2 上级单位负责人
            ],
            "hierarchical": [ // 汇报层级
                0, // 0 直接上级、1 二级汇报人、2 三级汇报人
            ]
        }
    },
    "stencil":{
        "id": "ApproveTask" // 必填 | 节点标识
    },
    "outgoing":[
        // 必填 | 下一跳节点出口
        {
            "resourceId":"sid-A1576ECA-E2CF-47D6-9C56-6938024D013D"
        }
    ]
}

填写

{
    "resourceId":"sid-02D0F331-9AEC-4592-8C78-6F405FD401AA", // 必填 | 节点定义id (前端自动生成)
    "properties": {
        "name": "结束", // 非必填 | 节点名称
        "candidateUser": {
            "personal": [ // 人员
                {
                    "uid": "881649", // uid
                    "name": "杨六"
                },
            ],
            "leader": [ // 组织领导
                0, // 0 部门负责人、1 单位负责人、2 上级单位负责人
            ],
            "hierarchical": [ // 汇报层级
                0, // 0 直接上级、1 二级汇报人、2 三级汇报人
            ]
        },
        "form": { // 非必填 | 表单配置
            "fieldAccessAuth": {
                // 非必填 | 字段访问权限
            },
            "operateAuth": {
                // 非必填 | 表单操作权限:保存、提交
            },
            pageUrl: {
                "web": "",
                "mobile": ""
            },
        },
        serviceApis: [ // 非必填 | 接口调用
            {
                trigger: 0, // 必填 | 0 任务开始前、1 任务结束后
                serviceId: 123456, // 必填 | 服务id
                serviceName: "服务名称", // 必填 | 服务名称
                apiId: 123456, // 必填 | 接口id
                apiName: "服务名称", // 必填 | 接口名称
            }
        ],
        "multiInstanceCondition": { // 多实例设置
            "branchType": 0, // 必填 | 0 同意、 1 拒绝
            "calculationType": 0, // 必填 | 0 按人数、 1 按百分比
            "value": 10 // 必填 | 数值: 按人数时代表人数,按百分比时代表百分比(0 - 100]
        },
        "dueDate": { // 超时设置
            "hours": 2, // null 代表不限时,数字代表超时时间
            "strategy": 0 // 处理策略: 0 发送APP提醒、1 自动流转下去
        },
        copyTo: {
            "personal": [ // 人员
                {
                    "uid": "881649", // uid
                    "name": "杨六"
                },
            ],
            "leader": [ // 组织领导
                0, // 0 部门负责人、1 单位负责人、2 上级单位负责人
            ],
            "hierarchical": [ // 汇报层级
                0, // 0 直接上级、1 二级汇报人、2 三级汇报人
            ]
        }
    },
    "stencil":{
        "id": "FillInTask" // 必填 | 节点标识
    },
    "outgoing":[
        // 必填 | 下一跳节点出口
        {
            "resourceId":"sid-A1576ECA-E2CF-47D6-9C56-6938024D013D"
        }
    ]
}

条件分支

{
    "resourceId":"sid-83131E16-E692-47EC-86B5-C95085EB584B", // [必填] 节点定义id (前端自动生成)
    "properties":{
        "defaultflow": "false", // 是否为默认分支,如果是,condition属性不可编辑
        "condition": {
            "type": 0, // 普通分支为自定义条件;审批分支为自定义条件和审批结果条件。
            "value": "AGREE" //自定义条件是条件表达式, 审批结果条件是AGREE、REFUSE
        },
    },
    "stencil":{
        "id":"SequenceFlow" // 必填 | 节点标识
    },
    "outgoing":[ // 必填 | 下一跳节点出口
        {
            "resourceId":"sid-02D0F331-9AEC-4592-8C78-6F405FD401AA"
        }
    ],
}

建议列表

开始节点和发起人节点

开始节点和发起人节点实际都代表流程的开始,这两个节点不会孤立存在,也不能分开使用,因此应该合并简化为一个节点,就是开始节点。 如果不合并,在流程图上会有歧义:比如某个节点需要退回到流程的开始,退回到开始节点还是退回到发起人节点。

开始表单字段配置

开始表单字段配置应该在开始节点上,而不应该在表单引擎内。

增加审批结果条件类型

因为审批节点后的分支条件90%以上的都是根据审批结果而来,因此本着简化的原则,当前节点是审批节点,输出分支中的条件类型增加审批结果条件。

删除添加处理人表单操作

在未找到处理人的情况下,按照配置要么自动通过,要么需要管理员重新分配,管理员重新分配应该在流程管理后台操作。

去掉高级功能增加接口调用

所谓自动执行,自动处理,都以来开放平台的接口,所以在接口调用中配置。接口调用配置包含触发时机,就是节点完成前还是节点完成后,不包含审批结果类型判断, 审批结果类是接口调用规范中的标准参数之一,应该交给具体的业务方判断。

去掉通用设置中的重复审批

重复审批实际上是流程中有多个审批节点,例如,审批节点1》审批节点2》审批节点3》审批节点4. 如果 审批节点1和审批节点4,审批的对象记录是同一个记录,且审批人是同一个人,那么审批节点3审批通过后,到审批节点4这一步就可以自动通过审批了。 这是针对流程中有多个表单模型的情况下设置的。 我们流程中是单模型的,自始至终,所有人审批和填写的同一个模型的同一条记录,因此需要去掉。