BPM-子流程


Activiti提供两种子流程实现:

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

BPM-子流程


工作流子流程方案

子流程

子流程图元

多实例子流程

并发多实例子流程

注:1、集合,集合中可以存任意值,工作流会根据你集合里的值个数,去生成对应的子流程,

 例如:我这里存的是3个科室code{000100020003},那么就会生成出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);