1、配置多实例的活动在流程运行时运行时顺序方式或并行放肆创建活动实例。
2、任务多实例 在任务中添加<multiInstanceLoopCharacteristics>元素来实现:
<serviceTask id="servicetask1" name="Service Task" activiti:expression="${count+1}" activiti:resultVariableName="count">
<multiInstanceLoopCharacteristics isSequential="false">
<loopCardinality>${loop}</loopCardinality>
</multiInstanceLoopCharacteristics>
</serviceTask>
3、请假会签审批的用户任务多实例配置
<userTask id="countersign" name="部门/人事会签审批" activiti:candidateGroups="${user}">
<extensionElements>
<activiti:formProperty id="approved" name="审批意见" type="enum">
<activiti:value id="true" name="同意"></activiti:value>
<activiti:value id="false" name="拒绝"></activiti:value>
</activiti:formProperty>
<activiti:taskListener event="complete" delegateExpression="${leaveCounterSignCompleteListener}"/>
</extensionElements>
<multiInstanceLoopCharacteristics isSequential="false" activiti:collection="users" activiti:elementVariable="user"/>
</userTask>
此外添加了一个任务监听器,每次审批通过将approvedCounter属性自增1:
public class LeaveCounterSignCompleteListenter implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
String approved = (String)delegateTask.getVariable("approved");
if(approved.equals("true")){
Long agreeCounter = (Long)delegateTask.getVariable("approvedCounter");
delegateTask.setVariable("approvedCounter", agreeCounter + 1);
}
}
}
<startEvent id="startevent1" name="Start" activiti:initiator="applyUserId">
<extensionElements>
<activiti:formProperty id="startDate" name="请假开始日期" type="date" datePattern="yyyy-MM-dd" required="true"></activiti:formProperty>
<activiti:formProperty id="endDate" name="请假结束日期" type="date" datePattern="yyyy-MM-dd" required="true"></activiti:formProperty>
<activiti:formProperty id="reason" name="请假原因" type="string" required="true"></activiti:formProperty>
<activiti:formProperty id="users" name="审批参与人" type="users"></activiti:formProperty>
<activiti:formProperty id="validScript" type="javascript" default="alert('表单加载完毕');"></activiti:formProperty>
</extensionElements>
</startEvent>
public class UsersFormType extends AbstractFormType {
@Override
public String getName() {
return "users";
}
@Override
public Object convertFormValueToModelValue(String propertyValue) {
String[] values = StringUtils.split(propertyValue, ",");
return Arrays.asList(values);
}
@Override
public String convertModelValueToFormValue(Object modelValue) {
return Objects.toString(modelValue);
}
}
List<AbstractFormType> customFormTypes = new ArrayList<AbstractFormType>();
customFormTypes.add(new JavaScriptFormType());
customFormTypes.add(new UsersFormType());
processEngineConfiguration.setCustomFormTypes(customFormTypes);
5、审批意见
在taskService接口中定义了3个和意见相关的方法:
addComment(String taskId, String processInstanceId, String message);
getProcessInstanceComments(String processInstanceId);
getTaskAttachments(String taskId)
第一方法创建意见,第二个和第三个方法分别根据流程实例ID和任务ID读取相关意见。