activiti实战读书笔记——第九章 多实例

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-06 09:10:59

1、配置多实例的活动在流程运行时运行时顺序方式或并行放肆创建活动实例。

2、任务多实例 在任务中添加<multiInstanceLoopCharacteristics>元素来实现:

<serviceTask id="servicetask1" name="Service Task" activiti:expression="${count+1}"         activiti:resultVariableName="count">
      <multiInstanceLoopCharacteristics isSequential="false">
        <loopCardinality>${loop}</loopCardinality>
      </multiInstanceLoopCharacteristics>
    </serviceTask>



对一个Java service任务添加了多实例配置,loop变量决定实例数量,每次执行任务count自增1。isSequential属性为false表示并行运行,否则顺序运行。

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>



多实例在遍历users集合时把单个值保存在 activiti:elementVariable指定的user中。

此外添加了一个任务监听器,每次审批通过将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);
		}
	}

}



4、开始事件的表单定义中有一个自定义的类型users:
<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);
	}

}



并将它配置到processEngineConfiguration中:
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读取相关意见。


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!