流程配置

业务对象

业务对象是流程运行时的业务数据,业务对象与流程实例相关联,一个流程实例可以关联多个业务对象。

业务对象确定后才能选择表单,一个业务对象可以有多个表单,用于不同场景的展示。当然也可以通过业务对象权限配置来控制展示情况。

提示

如果业务对象过于复杂,比如超过了3层,动则关联十多张表,我们极其不建议还继续使用完整的业务对象去维护数据关系。可以考虑将某部分数据从主业务对象拆离开。比如:
学校 - 班级 - 学生,那么可以将学生作为独立维护的内容,表单只关联id、名字。这样流程提交会更快。(后期我们会支持异步加载,异步保存功能,解决超大业务对象影响流程性能的问题)

表单

在线表单

在线表单是由业务对象和表单模板生成,用于展示业务对象数据。
不同节点的表单会通过该节点权限配置情况来展示数据,不同的节点可以配置不同的表单,若节点未配置表单会使用全局表单,以及全局表单权限配置。

URL表单

URL 表单需要配合 “URL表单处理器” 一同使用,URL表单会通过配置的 URL + bizId(业务主键) 去获取展示表单内容,通过表单处理器去持久化表单数据。
以案例库 “URL表单流程” 为例,全局表单配置URL表单,
PC端URL为:/demo/demo/demoEdit.html?id={bizId}
url表单处理器为:demoManager.saveDemoJson

那么流程处理逻辑步骤为:

  1. 流程展示页面会 通过 iframe 去加载页面 /demo/demo/demoEdit.html?id={bizId} (url的 {bizId}会被替换成业务主键的值,若启动流程则为空)
  2. demoEdit.html 页面会通过 bizId 去后台加载表单数据
  3. 流程提交的时候会调用 demoEdit.html 页面的 getData() js 方法,将表单业务数据提供给流程,在getData方法调用前流程会尝试调用 isValid 方法去校验表单
  4. 流程提交表单后,后台会以 ActionCmd 为入参 调用配置的URL表单处理器 demoManager.saveDemoJson
  5. URL表单处理器 需要保存业务数据,若新增需要对cmd设置bizId
  6. 流程最后会在 流程实例(bpm_instance)中记录设置在 ActionCmd 中的bizId,当流程实例再次打开表单的时候则会以该bizId为参数打开url表单
URL 表单处理器实现案例(仅限单体架构场景)

@Override
public void saveDemoJson(ActionCmd actionCmd) { //入参可以依赖 wf-api 模块
// 业务主键
String bizKey = actionCmd.getBusinessKey();
// url 表单的业务数据
JSONObject object = actionCmd.getBusData();
Demo demo = JSON.toJavaObject(object, Demo.class);

// 说明新增
if(StringUtil.isEmpty(bizKey)) {
String id = IdUtil.getSuid();
// 新增必须设置流程的bizId
actionCmd.setBusinessKey(id);
demo.setId(id);
demoDao.create(demo);

//启动时候设置一些流程变量,请看 act_ru_variable 表、在整个流程声明周期您都可以使用该流程变量,可以用于分支判断等等
Map<String,Object> hashMap = new HashMap<>();
hashMap.put("startVariable", demo.getMz());
actionCmd.setActionVariables(hashMap);
}else {
demoDao.update(demo);

// URL表单处理器设置 activiti流程变量,可跳过
Map<String,Object> hashMap = new HashMap<>();
hashMap.put("doTaskVariable", demo.getMz() + "-" + actionCmd.getActionName());
actionCmd.setActionVariables(hashMap);
}
}
远程表单处理器

URL表单处理器支持Groovy脚本形式,系统内置了一个 “远程表单处理器” 的常用脚本,它会中继token以 restTemplate 的方式调用远程接口,具体请查看源码 com.dstz.bpm.rest.script.BpmScriptUtil.httpFormHandler(url)

如下配置,可以通过一个 HTTP URL 地址去持久化业务数据,远程表单处理器实现代码位于Demo模块 DemoController.formHandler

bpmScriptUtil.httpFormHandler("http://localhost:8080/agile-bpm-platform/demo/demo/formHandler")

这样做可以保证业务数据保存与流程处理处于同一请求

若URL表单地址为其他系统的前端链接?

URL表单为其他服务器提供的前端地址会存在跨域,鉴权等问题,可以通过路由网关解决跨域js调用问题,单点登录、统一token解决鉴权问题。
为了减少在 agilebpm 系统写太多的远程 url表单处理器,您可以写一个通用的表单处理器来转发业务数据保存的请求

URL 表单地址关键值替换

  1. 如果包含 {bizId} 则替换为业务主键即: bpmInstance.bizKey
  2. 如果包含{token} 则从 session 中取 token_ 值进行替换
  3. 如果以 {urlFormDemo:PreAddr} 开头,则将其 替换为 系统属性中 urlFormDemo的值

URL表单前端跨域问题处理

在表单中添加如下代码
// 通知主页面
window.parent.postMessage ({type : 'callback' ,name : 'subIframeCallback',}, "*" );

// 监听主页面的获取数据的事件, 并且发送数据报送事件
window.onmessage = function(e){
var data = e.data || {};
if( data.type != 'getDataReady'){
return;
}

var valid = false;
var errorMsg = "数据不能为空";
// TODO 校验表单的逻辑

var formData = {};
// TODO 获取数据的逻辑

// 发送数据报送事件
window.parent.postMessage ( {
type : 'getData' ,
url : document.location.href ,
valid : valid,
errorMsg : errorMsg,
data : formData
}, data.url );
}

节点表单,表单授权

流程表单权限只能在流程表单中设置,表单列表的权限配置仅对单独使用表单时才有效(比如自定义列表新增页,编辑页,表单预览页)

流程配置节点表单后,可以对业务对象进行权限配置,若不配置则自动继承 “全局表单配置”

字段权限含以下类型:

  • 无权限: 表单字段会被隐藏。无权限业务对象不会查询该字段数据,若整个对象字段均无权限,则不查询该表数据,也不会对该对象执行保存或者更新操作
  • 只读权限: 业务对象不会更新只读权限字段,前端字段展示为只读
  • 编辑权限: 拥有编辑更新权限
  • 必填权限: 表单会展示必填校验

业务对象可授权层级

  • 业务对象
  • 实体(表)
  • 字段

下级没有配置的情况下会自动继承上级配置的权限,所以业务对象权限配置粒度可粗可细。
若用户拥有某个字段的必填权限则不再去判断是否拥有编辑权限,若有编辑,则不再判断是否有只读权限。若全部都未配置则取上级

节点表单以及权限使用场景说明

  • 流程启动时: 使用开始节点的表单以及权限配置
  • 任务处理时: 使用节点表单以及权限配置
  • 流程抄送时: 节点抄送使用节点表单只读形式,实例抄送使用实例表单
  • 传阅:任务传阅使用任务表单只读形式,流程实例传阅使用实例表单
  • 办理历史: 使用任务表单只读形式

表单类型说明

  • 全局表单:全局默认的表单以及表单权限
  • 节点表单:流程节点任务单独配置的表单,若未配置则默认使用全局表单(流程设计中选中流程节点可以配置节点表单)
  • 实例表单:默认查看流程实例的表单,若未配置则默认使用全局表单
  • 打印表单:打印时使用的表单,若未配置则默认使用全局表单
提示

当流程需要一个比较大的业务对象时,比如一个业务对象 主表关联了多张子表,不同节点,只维护部分信息,这时候配置权限可以减少数据获取、保存,也能保证节点数据提交的安全性

节点按钮 \ 实例按钮

系统内置的节点按钮在流程后台都会存在一个对应的处理器,处理器定义了该动作执行的具体逻辑以及按钮属性配置等信息
不同的节点类型会展示不同的按钮,比如启动节点不会存在同意、反对按钮

目前支持的按钮类型

节点按钮:

  • 启动: 启动流程实例
  • 保存: 保存草稿
  • 同意: 任务提交,会驱动流程走向下一个节点
  • 反对: 反对动作提交任务,与同意是不同的业务语义,可用于分支判断,在会签中会计票为反对(同意 Action agree ,反对 Action 是 oppose
  • 驳回: 根据流程节点属性配置的驳回情况执行驳回动作,默认驳回至上一节点,可以指定驳回至任意节点,自由驳回
  • 驳回发起人: 驳回到流程的第一个用户节点
  • 加办: 临时添加一个任务给指定用户处理,指定用户处理完成后会回到自己手中。
  • 抄送: 手动抄送流程实例给指定用户(这里与抄送插件不同,抄送插件为预定义抄送)
  • 超管跳转: 超级管理员用于干预流程,指定跳转到 任意节点
  • 超管终止: 超级管理员用于干预流程,临时终止流程实例

  • 审批历史: 查看历史审批记录和审批意见

  • 流程图: 流程运转情况展示
  • 人工终止: 强制终止流程,会触发终止节点配置的人工终止脚本执行。
  • 打印: 打印当前任务页面
  • 转办: 将任务转交其他人处理
  • 锁定: 多个候选人时,将任务锁定到自己名下
  • 解锁: 取消锁定,将候选人修改为锁定前的状态

  • 会签同意:会签参与者投同意票

  • 会签反对:会签参与者投反对票
  • 加签:会签时临时添加一个人参与会签投票

实例按钮:

  • 撤销: 发起人将任务撤销作废
  • 撤回: 将任务撤回到自己手中
  • 催办: 人工催办任务处理者或者加急任务
  • 超管终止: 超级管理员人工终止流程实例

按钮扩展配置

前置JS脚本

表单提交前执行,常用于扩展特殊 JS 逻辑,return false 可以阻断按钮操作 (此处与表单内置校验JS 方法不冲突)
在前置js中可以使用 scope 变量,可以用它访问到流程表单的数据,等同与表单组件的 this 对象,具体可用信息参考 表单开发指导一文的 data

前置Groovy脚本

流程任务、实例每次打开页面时,服务器执行的 Groovy 脚本,若 return false 则不展示该按钮。
可以用在特殊场景下隐藏按钮的需求,比如通过业务对象动态判断是否展示某个按钮
脚本可用变量: 业务对象eg:demo.getString("name"), 任务按钮可用: bpmTask,实例按钮可用:bpmInstance

自定义按钮

按钮支持添加自定义按钮,通过按钮编辑页的添加按钮可以新增定义按钮,自定义按钮需要手动录入别名,名字信息。
自定义按钮需要在前置JS脚本逻辑的最后添加 return false ,需要阻止提交到后台。
自定义按钮相关的逻辑代码 建议在表单的 method 方法区定义,如: scope.testaaa() 则可以调用到表单 method 的方法 testaaa

提示!

默认按钮除了 “按钮名称” 外请勿随意修改!否则后端将无法识别按钮的动作!

流程扩展属性

流程标题

配置的流程标题模板,可以使用流程属性、流程启动变量作为参数来生成个性化标题。
待办、流程实例列表页面也可以通过关键业务属性检索

状态

配置流程的状态,若禁用则无法处理流程任务。

允许执行人为空

不允许执行人为空时,如果下个任务执行人为空。提交流程会 提示业务异常

支持移动端

流程若不支持移动端,流程实例、任务则不会出现在 移动端中。若支持移动端没有配置移动端表单,系统会提示业务异常

记录每次提交数据

开启后当前流程定义产生的所有任务提交都将记录日志

是否提交意见

若为否,流程启动、任务提交时将无需展示意见录入对话框,直接提交任务,对应动作的名字即为意见!

流程插件

AgileBPM 流程支持很多插件,这里罗列介绍、详细说明请移步 插件文档

  • 节点消息通知 插件: 配置流程在某些节点发送消息给任务候选人

  • 节点表单初始化: 用于流程表单业务数据的初始化

  • 流程数据提交日志插件:该插件会异步记录流程每次提交的业务数据,保存在bpm_submit_data_log

  • 流程节点自动跳过 插件: 用于配置全局任务跳过策略

  • 流程任务自由跳转:当前节点任务提交后,会执行自由跳转脚本,如果脚本返回 true ,则流程会跳转至 配置的目标节点

流程变量定义

用于约定当前流程定义会使用到的流程变量。流程变量可用于分支判断,特殊流程标记等,他会贯穿流程实例整个生命周期。
可以在以下时机对流程设置流程变量

  • 流程启动时
  • 任务提交时
  • 表单处理器中
  • 前后置脚本中

前后置脚本 通过 variableScope 直接操作流程变量,更多参考 插件变量

流程启动、任务处理、表单处理器则通过 ActionCmdsetActionVariables方法设置流程变量

节点配置

节点表单

节点表单配置优先于全局表单,如果未配置表单,节点配置的权限也将无效。

节点人员

点击添加,可以添加一组人员条件配置,支持添加多组配置,如果前一组配置解析出候选人后将不再继续计算下一组。

更多请参考 人员条件配置

节点属性

驳回后执行人

  • 历史执行人:当前节点任务驳回后,被驳回节点将使用之前的处理者作为候选人
  • 节点配置人:驳回后,被驳回节点使用节点配置的人员作为候选人

指定驳回节点

默认为驳回前一节点,支持指定驳回至任意节点。

驳回后流转方式

  • 按流程图执行: 驳回后按流程图运行
  • 返回驳回节点: 驳回后,任务处理者完成任务后将直接跳转回到驳回者手中

查看原图

自由选择候选人

  • 不开启: 当前节点提交意见的时候,不支持对下一环节指定候选人
  • 节点人员: 当前节点提交意见的时候,可以从下一环节候选人中选择其中一位作为任务处理人
  • 所有用户: 当前节点提交意见的时候,可以自由指定下一环节任务的处理人

允许任务撤回

若允许撤回,当前节点任务完成后,下一环节任务未提交前可以撤回到自己手里。
若当前节点为开始节点,可以设置【允许撤回节点】,在指定节点创建前都可以撤回到第一个任务节点。

允许任务撤销

若允许撤销,流程发起后,发起人可以撤销流程申请。
如果设置了【允许撤销节点】,那么在指定节点创建前都可以撤销流程申请。

自由分支选择

可以自由的选择下一步的走向,该设值的优先级高于分支决策、自由跳转等。

是否提交意见

当前节点的任务是否必须录入意见,如果否,则直接使用处理按钮的名字作为意见。

提示!

如果不需要录入意见,则无法自由选择候选人,无法自由分支选择!

节点图片背景自定义

AgileBPM 针对流程图元素进行了全新的设计,预定义了一套新的风格,并支持上传自定义图片,扩展新节点类型图片

  • 节点类型图片: 系统会根据节点类型展示对应的节点图片的默认背景,默认图片路径为 /assets/img/flow ,以 _gray 结尾的图片为未办理时的背景图
  • 上传图片:上传图片为流程节点的背景图片,不支持未办理灰度风格
  • 自定义节点类型: 支持通过节点ID约定自定义节点类型
    如节点ID为 myStyle_Task1,那么系统会定位到 /agilebpm-ui/assets/img/flow/myStyle.png 未办理为/agilebpm-ui/assets/img/flow/myStyle_gray.png
    如果系统不存在该路径图片,会导致流程图渲染异常。