背景: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:
關於子流程提早部署問題。給子流程固定的流程編號的前綴,當子流程保存的時候,檢查流程編號,只要帶這個前綴,則部署。