BPM脚本规范说明

# 1 前言

BPM脚本规则基于groovy引擎实现，groovy语法与java类似，具体语法可参考网站或查看本文的示例：https://www.w3cschool.cn/groovy 。

# 2 路由规则

## 2.1 条件规则

ü 场景说明

抢单是多实例（会签）的业务变种，类似于服务台类的业务审批，如多人环节有3个待办，有任意一人提交流程（调用流程执行接口），流程会向下执行，剩余待办会消失。

ü 适用范围

条件网关、输出线规则。

ü 脚本内容

//返回值true：流程相向下执行，false不执行 //amount和companyid为提交流程传入变量 //也可以使用java语法 float money =Float.parseFloat(amount); def money = amount.toFloat(); if(companyid=="20430001"){ return true } else if(companyid=="2043000155" || companyid=="2043000156"){ return money<10 } else return money<50

## 2.2 抢单

ü 场景说明

抢单是多实例（会签）的业务变种，类似于服务台类的业务审批，如多人环节有3个待办，有任意一人提交流程（调用流程执行接口），流程会向下执行，剩余待办会消失。

ü 适用范围

多实例环节、多实例子流程（发起节点生效）。

ü 脚本内容

//直接写return true即可 return true;

## 2.3 投票

ü 场景说明

投票是多实例（会签）的业务变种，当多实例环节有5个待办，有两人以上在页面选择了“意见类型为同意”时，流程会向下执行，剩余待办会消失。

ü 适用范围

多实例环节、多实例子流程的流程执行才有效。（调用下一环节和人员的服务无效）

ü 脚本内容

//多实例投票逻辑，根据每一个实例流程提交数据来判断流程是否向下执行

//意见类型为同意计数器

int agreeCount=0;

//processInputModels为多实例流程提交对象集合

for(int i=0;i<processInputModels.size();i++)

{

//获取单个实例流程提交对象，processInputModel中有应用提交到流程平台的所有参数，获取方式如getWf_procDefKey

com.blueland.bpm.engine.core.model.ProcessInputModel processInputModel=processInputModels.get(i);

//获取单个实例流程提交对象的表单数据，提交流程时传入fields中的数据

Map<String,Object> bizDataMap=processInputModel.getFields();

//获取表单数据-意见类型ideaType

String ideaType=(String)bizDataMap.get('ideaType');

if(ideaType=='agree'){

agreeCount++;

}

};

return agreeCount>=2?true:false;

# 3 人员规则

## 3.1 部门负责人

ü 场景说明

获取当前用户部门负责人作为下一环节处理人。

ü 适用范围

任一用户任务环节。

ü 脚本内容

//默认返回符合要求的人员格式 return userServiceImpl.getOrgLeaderByMain(String userId);

## 3.2 部门分管领导

ü 场景说明

获取当前用户部门对应分管领导作为下一环节处理人。

ü 适用范围

任一用户任务环节。

ü 脚本内容

//默认返回符合要求的人员格式 return userServiceImpl.getAssignLeader(String userId);

## 3.3 自定义人员规则

ü 场景说明

流程下一环节处理人可基于表单数据或业务规则动态计算并返回流程引擎，下一环节获取人员接口和流程引擎执行均会优先此规则数据。

ü 适用范围

任一用户任务环节

ü 脚本内容

返回的人员格式包括人员ID和组织ID，以井号分隔，返回多人时，人员之间以逗号分隔。

return "wugf12#204300010999,liy4#204300010599";

# 4 4 脚本内置API

流程平台脚本内置API，在所有的规则脚本中都能使用。

## 4.1 用户

ü 调用示例

import com.blueland.bpm.identity.model.User; boolean isFlag=userServiceImpl.isUserInRole(currentProcInst.getStartUserId(),'main_ceo'); User user=userServiceImpl.getUserById(123);

ü API清单

方法 | 名称 | 参数说明
User getUserById(String userId) | 获取用户对象 | userId：用户ID 返回值：User对象
List<User> findUserByOrgId(String orgId) | 来获取用户列表 | orgId：组织ID 返回值：User列表
List<User> findUserByRoleId(String roleId) | 获取用户列表 | roleId：角色ID 返回值：User列表
List<User> findUser(String roleId, String orgId) | 获取用户列表 | roleId：角色ID orgId：组织ID 返回值：User列表
boolean isUserInRole(String userId, String roleId) | 判断该用户是否包含该角色中 | userId：用户ID roleId：角色ID 返回值：true|false
boolean isUserInOrg(String userId, String orgId) | 判断该用户是否包含该组织中 | userId：用户ID orgId：组织ID 返回值：true|false
String getAssignLeader(String userId); | 获取当前用户部门主要领导 | userId：用户ID 返回值：返回的人员格式包括人员ID和组织ID，以井号分隔，返回多人时，人员之间以逗号分隔
String getOrgLeaderByMain(String userId); | 获取当前用户部门分管领导 | userId：用户ID 返回值：返回的人员格式包括人员ID和组织ID，以井号分隔，返回多人时，人员之间以逗号分隔

ü 返回对象属性

com.blueland.bpm.com.blueland.bpm.identity.model.User

名称 | 类型 | 说明
userId | string | 用户ID
userCode | String | 用户编码
userName | String | 用户姓名
userSex | String | 用户性别
userAge | Integer | 用户年龄
deptId | String | 直属单位编码
deptName | String | 直属单位编码
companyId | String | 直属单位编码
companyName | String | 直属单位编码
orgId | String | 所属单位编码
orgName | String | 所属单位名称
userMobile | String | 手机号码
userMail | String | 用户邮箱
positionId | String | 主要岗位
pluralityPositionId | String | 兼职岗位
titleId | String | 主要职务
pluralityTitleId | String | 兼职职务
userType | String | 用户类别，(正式人员:ZS、试用人员:SY、离职人员:LZ、临时人员:LS、外部人员、WB)

## 4.2 组织

ü 调用示例

import com.blueland.bpm.identity.model.Org; Org org=roleServiceImpl.getOrgById('123');

ü API清单

方法 | 名称 | 参数说明
Org getOrgById(String orgId) | 根据组织机构ID来获取组织机构 | orgId：组织ID 返回值：组织对象
List<Org> findSubOrg(String orgId) | 根据组织机构ID来获取其下属机构列表 | orgId：组织ID 返回值：组织对象列表
boolean hasSubOrgs(String orgId) | 根据组织机构ID来判断其是否包含了子组织机构 | orgId：组织ID 返回值：true|false
boolean isInOrg(String parentOrgId, String subOrgId) | 判断父组织机构是否包含该子组织机构 | parentOrgId：父组织机构ID subOrgId：子组织机构ID 返回值：true|false

ü 返回对象属性

com.blueland.bpm.com.blueland.bpm.identity.model.Org

名称 | 类型 | 说明
orgId | string | 组织编码
orgName |  | 组织简称
orgParentId | String | 上级组织编码
orgType | String | 组织类型，如单位：UNIT、部门：DEPT、其他：OTHER
orgLevel | Integer | 组织级别，顶层组织：0、一级组织：1、二级组织：2、三级组织：3、四级组织：4
orgSort | Integer | 组织排序号
orgPrincipal | String | 组织负责人
orgStatus | String | 组织状态，（启用:QY、禁用:JY）
orgBranchLeader | String | 分管领导Id
orgBranchLeaderName | String | 分管领导姓名
companyId | String | 所属公司ID
companyName | String | 所属公司名称
deptId | String | 所属部门ID
deptName | String | 所属部门名称

## 4.3 角色

ü 调用示例

import com.blueland.bpm.identity.model.Role; Role role=roleServiceImpl.getRoleById('main_ceo');

ü API清单

方法 | 名称 | 参数说明
Role getRoleById(String roleId) | 获取角色对象 | roleId：角色ID 返回值：角色对象
List<Role> findRoleByUserId(String userId) | 获取用户绑定的角色列表 | userId：用户ID 返回值：角色对象列表

ü 返回对象属性

com.blueland.bpm.com.blueland.bpm.identity.model.Role

名称 | 类型 | 说明
roleId | string | 角色ID
roleName | String | 角色名称
roleSort | Integer | 角色排序号
roleStatus | String | 角色状态,（启用:QY、未启用:WQY）

## 4.4 流程上下文

流程上下文仅在流程执行时生效，调用流程的获取下一环节和人员的服务时无效。

ü 获取当前用户数据

//获取发送人组织 wf_processInputModel.getWf_sendUserId(); //获取发送人ID wf_processInputModel.getWf_sendUserOrgId();

ü 获取当前表单数据

直接使用提交流程时的fields中的key即可，如"fields": {"amount": 4002} 脚本直接使用amount变量即可

ü 获取当前流程数据

// 流程标题

wf_processInputModel.getWf_procTitle()

//动作处理标识

wf_processInputModel.getWf_actionType()

//流程定义ID

wf_processInputModel.getWf_procDefId()

//流程定义KEY

wf_processInputModel.getWf_procDefKey()

//流程定义名称

wf_processInputModel.getWf_procDefName()

//流程实例ID

wf_processInputModel.getWf_procInstId()

//当前环节定义Id

wf_processInputModel.getWf_curActDefId()

// 当前环节定义Name

wf_processInputModel.getWf_curActDefName()

//当前环节实例Id

wf_processInputModel.getWf_curActInstId()

//当前环节实例Name

wf_processInputModel.getWf_curActInstName()

// 下一个环节定义ID

wf_processInputModel.getWf_nextActDefId()

//下一个环节定义Name

wf_processInputModel.getWf_nextActDefName()

// 下一个环节定义类型

wf_processInputModel.getWf_nextActDefType()

//发送人ID

wf_processInputModel.getWf_sendUserId()

// 发送人ID

wf_processInputModel.getWf_sender()

//发送人姓名

wf_processInputModel.getWf_sendUserName()

// 发送人组织ID

wf_processInputModel.getWf_sendUserOrgId()

//发送人组织ID

wf_processInputModel.getWf_sendUserOrgName()

// 发送人公司ID

wf_processInputModel.getWf_sendUserCompanyId()

// 接收者列表(user1()user2()user3)

wf_processInputModel.getWf_receiver()

// 当前环节意见

wf_processInputModel.getWf_curComment()

// 批量处理标识

wf_processInputModel.getWf_batchId()

//业务标识

wf_processInputModel.getWf_businessKey()