activiti动态获取当前流程节点的操作按钮

2020-05-12  本文已影响0人  西城丶

问题描述

在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;

未竟之事

上一篇下一篇

猜你喜欢

热点阅读