问题描述
在activiti操作流程图走向时,每个节点流向都不一样,怎么样将节点的流向,封装成一个统一方法,返回这个节点可以操作的按钮及执行这个操作需要提交的参数呢?
版本说明
本次采用的版本是activiti6.0版本,因为6.0版本和5.x相比,删除了许多东西,有些方法不一样的话,自行查找
解决思路
根据当前任务节点的任务节点id值和流程id值,获取它所有的出口线,并且获取到出口线的条件以及名称,将结果返回回去。
代码示例
查询按钮的数据传输类
主要是需要两个参数,流程定义id和任务节点id,这里在控制层可以对这个对象做一些参数校验。
public class OperationBtnQueryDTO extends BaseDTO {
@NotNull(message = "流程id不能为空")
private String processDefinitionId;
@NotNull(message = "任务id不能为空")
private String taskDefKey;
}
操作按钮返回值封装类
操作名称,提交这个按钮传递的参数
public class OperationBtnDTO extends BaseDTO {
private String name;
private Map<String,Object> params;
}
实现方法
public List<OperationBtnDTO> getOperationBtn(OperationBtnQueryDTO operationBtnQueryDTO) {
List<OperationBtnDTO> result = new ArrayList<>();
BpmnModel bpmnModel = repositoryService.getBpmnModel(operationBtnQueryDTO.getProcessDefinitionId());
FlowNode flowElement = (FlowNode) bpmnModel.getFlowElement(operationBtnQueryDTO.getTaskDefKey());
if (flowElement == null){
throw new BusiException(ErrorEnum.INTER_ERROR,"无法获取该节点的操作按钮");
}
List<SequenceFlow> outgoingFlows = flowElement.getOutgoingFlows();
// 出口只有一个,判断出口是什么
if (outgoingFlows.size() == 1){
FlowElement targetFlowElement = outgoingFlows.get(0).getTargetFlowElement();
// 如果是排他网关,获取网关所有出口线
if (targetFlowElement instanceof ExclusiveGateway){
List<SequenceFlow> outgoingFlowLines = ((ExclusiveGateway) targetFlowElement).getOutgoingFlows();
for (SequenceFlow sequenceFlow : outgoingFlowLines) {
OperationBtnDTO operationBtnDTO = new OperationBtnDTO();
operationBtnDTO.setName(sequenceFlow.getName());
// 这里是对表达式进行解析${pass==true}解析成{pass:true}map结构数据,建议排他网关节点,只设置一个参数判断就行了,这样也好处理,不建议用很复杂的表达式,比如说${a==1 && b ==2 && c!=3}
Map<String, Object> expressionVal = getExpressionVal(sequenceFlow.getConditionExpression());
operationBtnDTO.setParams(expressionVal);
result.add(operationBtnDTO);
}
// 目标是用户节点,那么返回自身就可以了 这时候不需要参数,也就是说单纯用户任务节点之间流转,是不需要传参数的
// 目前其他节点都是返回自身就可以了,有需要在改
}else{
OperationBtnDTO operationBtnDTO = new OperationBtnDTO();
FlowElement sourceFlowElement = outgoingFlows.get(0).getSourceFlowElement();
operationBtnDTO.setName(sourceFlowElement.getName());
result.add(operationBtnDTO);
}
return result;
}
return Collections.EMPTY_LIST;
未竟之事
- 按钮如何排序
- 排他网关多条件,如何解析成map参数以便完成任务是可以传递进去
- 当前排他网关默认设置的参数是同一个,如果是多个参数,如何构造完成节点的参数map,比如说三个出口线的参数是
${approvalPass==true}、${approvalPass==false}、${needAttrs==true}
,那么点击第一个按钮,其实需要传递两个参数approvalPass=true,needAttrs=false,只传一个参数approvalPass的话就会报错 - and so on
网友评论