Activiti提供两种子流程实现:
1、嵌入子流程
子流程元素<subProcess>内嵌在主流程元素<process>之内,只能在该流程中使用该子流程,外部是无法访问到的。这种子流程一般作为局部通用逻辑处理,或者因为特定业务需要,使得比较复杂的单个主流程设计清晰直观;
2、调用子流程
首先实现一个流程,在另一个流程中可以调用该流程,通常可以定义一些通用的流程作为这种调用子流程,供其他多个流程定义复用。这种子流程使用<callActivity>元素来进行调用,间接地嵌入到主流程中,用起来比较方便。
下面通过实例来看下两者的实现:

工作流子流程方案
子流程
子流程图元
多实例子流程
并发多实例子流程
注:1、集合,集合中可以存任意值,工作流会根据你集合里的值个数,去生成对应的子流程,
例如:我这里存的是3个科室code,{0001,0002,0003},那么就会生成出3个子流程,
其实这里我简单说明一下,如果只传入1个值会生成4个流程实例,
传2个会生成出6个流程实例(多出的两个,一个是子流程subprocess的,一个是流程中第一个任务的),以此类推。
2、成员变量,用于在流程图中代替集合中表示当前子流程的变量(我这存的是科室code,所以表示的就是科室code)。
这个节点流程变量可以在当前子流程中任意的task中使用,例如子流程中的任务我就用到了这个变量。
3、完成条件,这里写的表达式如果满足即可到(第三步:立项书编制)这个任务。
子流程活动动态设置参与人
扩展角色
数据结构
字段名 | 类型 | 长度 | 注释 | 说明 |
id_ | varchar(64) | 64 | | |
enable_ | char(1) | 1 | | |
tenant_id_ | varchar(64) | 64 | | |
code_ | varchar(64) | 64 | | |
name_ | varchar(255) | 255 | | |
adapterclazz_ | varchar(500) | 500 | | |
create_time_ | datetime | | | |
modify_time_ | datetime | | | |
扩展角色实体类:ExtendRoleEntity,位于ubpm-engine包中。
自定义适配器
适配器类:BpmExtendUserAdapter,需继承基类AbstractParticipantAdapter。
需实现抽象方法:
public abstract List<Participant>find(ProcessParticipantItem processParticipantItem, ParticipantContextparticipantContext);
参考实现:
@Override public List<Participant> find(ProcessParticipantItem processParticipantItem, ParticipantContext participantContext) { BpmEngineConfiguration bpmEngineConfiguration = (BpmEngineConfiguration)Context.getProcessEngineConfiguration();
String executionId = ParticipantContext.getExecution().getId(); String assignVar = ""; if(executionId==null) { List<Participant> list=new ArrayList<Participant>(); Participant Participant=new Participant(); Participant.setId(assignVar); list.add(Participant); return list; } List<String> subCollection=(List)bpmEngineConfiguration.getRuntimeService().getVariable(executionId, "subCollection"); String subUserInfo = (String)bpmEngineConfiguration.getRuntimeService().getVariable(executionId, "subUserInfo"); String assignList = "default_user_id"; if(subUserInfo.equalsIgnoreCase("人事")){ assignList="75176168-6125-11e7-96cf-b8aeed2e916b,default_user_id"; }else { assignList="98279a81-7823-11e7-92ea-b8aeed2e916b,75176168-6125-11e7-96cf-b8aeed2e916b,default_user_id"; }
/*if(StringUtils.isBlank(assignList)){ log.error("AssignListAdapter can not find user!"); return new ArrayList<Participant>(0); }*/ //assignList="98279a81-7823-11e7-92ea-b8aeed2e916b"; List<User> userEntityList = null; if(assignList.indexOf("{")!=-1){ JSONObject assignsJson = JSONObject.fromObject(assignList); if(assignsJson.containsKey("objectId")){ Object assigns=assignsJson.get("objectId"); if(assigns != null){ userEntityList = new ArrayList<User>(1);
User userEntity = bpmEngineConfiguration.getUserService().getUserById(assigns.toString().trim()); userEntityList.add(userEntity); } } }else{ String[] assignListArray = assignList.split(","); int len = assignListArray != null ? assignListArray.length : 0;
userEntityList = new ArrayList<User>(len); for (int i = 0; i < len; i++) { String userId = assignListArray[i]; User userEntity = bpmEngineConfiguration.getUserService().getUserById(userId); userEntityList.add(userEntity); } }
if(userEntityList == null || userEntityList.size() == 0){ return null; }
List<Participant> list = getResult(processParticipantItem, userEntityList.toArray(new UserEntity[0]));
return list; }
|
调用者
List<String> subCollection = new ArrayList(); subCollection.add("人事"); subCollection.add("财务"); processInstanceBuilder.addVariable("subCollection",subCollection); List<String> subUserCollection = new ArrayList(); subUserCollection.add("5c6c5442-7758-11e7-93ff-b8aeed2e916b"); subUserCollection.add("98279a81-7823-11e7-92ea-b8aeed2e916b"); subUserCollection.add("default_user_id"); processInstanceBuilder.addVariable("subUserCollection",subUserCollection); String subUserInfo = Joiner.on(",").join(subUserCollection); processInstanceBuilder.addVariable("subUserInfo",subUserInfo); //流程启动,使用表单key //ProcessInstance processInstance = runtimeService.startProcessInstanceByKeyAndTenantId(processDefinitionKey, businessKey, organizationsKey); processInstanceBuilder.processDefinitionKey(processDefinitionKey).tenantId(organizationsKey); processInstanceBuilder.processInstanceName(processName); processInstanceBuilder.businessKey(businessKey); ProcessInstance processInstance = runtimeService.startProcessInstance(processInstanceBuilder);
|