activiti實現根據參數傳過來的集合走不一樣的子流程

背景:spring

     在實現醫療項目的質控流程時,當在第一個節點A的時候選擇n個質控項(id分別爲a,b,c,d),當完成節點A走到節點B的時候,B節點須要根據選擇的不一樣的質控項(根據A節點選擇的不一樣質控項)並行走不一樣的子流程。express

實現:app

    1.  畫不一樣的子流程。ide

        eg: oop

 

                               圖1.  流程編號設置爲:  publicSubProcess_apost

           

                              圖2. 流程編號設置爲:  publicSubProcess_bui

2. 自定義expression中能夠使用bean, 增長字符串鏈接方法spa

public class ExpressionServiceImpl implements ExpressionService{
    @Override
    public String concat(Object... params) {
        StringBuilder sb = new StringBuilder();
        if(params != null){
            for(Object param : params){
                sb.append(param);
            }
        }
        return sb.toString();
    }
}

3. 配置bean,在spring-activiti.xml中配置beanorm

<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
      <property name="dataSource" ref="dataSource" />
      <property name="transactionManager" ref="transactionManager" />
      <property name="databaseSchemaUpdate" value="true" />
      <property name="jobExecutorActivate" value="true" />
      <property name="enableDatabaseEventLogging" value="true" />
      
<property name="activityFontName" value="宋體"/>
<property name="labelFontName" value="宋體"/>
<property name="annotationFontName" value="宋體"/>
<property name="formTypes" ref="activitiCustomFormTypes"></property>
      <property name="customFormTypes">
          <list>
              <bean class="org.activiti.explorer.form.UserFormType" />
              <bean class="org.activiti.explorer.form.ProcessDefinitionFormType" />
              <bean class="org.activiti.explorer.form.MonthFormType" />
          <!-- <bean class="com.xxx.activiti.formtype.FileFormType"/> -->
          </list>
      </property>
      <property name="postBpmnParseHandlers">
       <list>
          <bean class="com.xxx.activiti.handler.TaskListenerPostParseHandler" />
       </list>
      </property>
      <property name="beans">
          <map>
              <entry key="expr" value-ref="expr"></entry>
          </map>
      </property>
  </bean>

  <bean id="expr" class="com.xxx.activiti.service.impl.ExpressionServiceImpl"></bean>

4. 在節點A的時候須要設置選擇的質控項集合。假設key爲itemsxml

  代碼以下:

taskService.setVariable(taskId, "items", Arrays.asList("b"));

5. 主流程配置。

                   圖3. 主流程

 call public sub節點配置以下:

 

             圖4. callActivity節點配置。Called element的值爲: ${expr.concat("publicSubProcess_", items[loopCounter])},Collection處的items和Call element處的items須要保持一致。

6. 啓動主流程,在a1幾點設置集合變量items。完成a1,走到call public sub節點時,會去找對應的子流程,並啓動。(子流程須要提早部署好,不然會報錯)。

 

Tricks: 

    關於子流程提早部署問題。給子流程固定的流程編號的前綴,當子流程保存的時候,檢查流程編號,只要帶這個前綴,則部署。

相關文章
相關標籤/搜索