美文网首页
activiti动态获取当前流程节点的操作按钮

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

作者: 西城丶 | 来源:发表于2020-05-12 17:06 被阅读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;
    

    未竟之事

    • 按钮如何排序
    • 排他网关多条件,如何解析成map参数以便完成任务是可以传递进去
    • 当前排他网关默认设置的参数是同一个,如果是多个参数,如何构造完成节点的参数map,比如说三个出口线的参数是${approvalPass==true}、${approvalPass==false}、${needAttrs==true},那么点击第一个按钮,其实需要传递两个参数approvalPass=true,needAttrs=false,只传一个参数approvalPass的话就会报错
    • and so on

    相关文章

      网友评论

          本文标题:activiti动态获取当前流程节点的操作按钮

          本文链接:https://www.haomeiwen.com/subject/bmfinhtx.html