背景:
在实现医疗项目的质控流程时,当在第一个节点A的时候选择n个质控项(id分别为a,b,c,d),当完成节点A走到节点B的时候,B节点需要根据选择的不同的质控项(根据A节点选择的不同质控项)并行走不同的子流程。
实现:
1. 画不同的子流程。
eg:
图1. 流程编号设置为: publicSubProcess_a
图2. 流程编号设置为: publicSubProcess_b
2. 自定义expression中可以使用bean, 增加字符串连接方法
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中配置bean
<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为items
代码如下:
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:
关于子流程提前部署问题。给子流程固定的流程编号的前缀,当子流程保存的时候,检查流程编号,只要带这个前缀,则部署。