flowable中动态显示节点的审批人信息

1、上面的流程图当任务还没有到的节点,用户想看看节点的人的信息,如果我们常规的是不能实现的。

2、思路就是我们取出节点的表达式,然后用我们流程实例的变量来给他翻译出来即可,如何做呢?

2.1、通过流程实例id查出历史表中的所有的变量列表

List<HistoricVariableInstance> hvis = historyService.createHistoricVariableInstanceQuery()
                                              .processInstanceId(processInstanceId).list();

2.2、通过流程实例id获取所有的节点信息

List<Process> processes = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId()).getProcesses();
if (CollectionUtils.isNotEmpty(processes)) {
            for (Process process : processes) {
                Collection<FlowElement> flowElements = process.getFlowElements();
                if (CollectionUtils.isNotEmpty(flowElements)) {
                    for (FlowElement flowElement : flowElements) {
                        if (flowElement instanceof UserTask) {
                ..........
                    }
                }
            }
       }
}

2.3、取出节点的表达式

if (StringUtils.isNotBlank(userTask.getAssignee())) {
    //处理多实例的显示
    MultiInstanceLoopCharacteristics loopCharacteristics = userTask.getLoopCharacteristics();
    if(loopCharacteristics == null) {
        String expressionValue = null;
        if (userTask.getName().equals(FlowConstant.FLOW_SUBMITTER)) {
            expressionValue = processInstance.getStartUserId();
        }else {
            expressionValue = juelExpression.getValue(hvis, userTask.getAssignee());
        }
        if(StringUtils.isNotBlank(expressionValue)) {
            List<UserVo> userVos = userVoService.getUserByCodeOrGroupId(expressionValue);
            
        }
    }else {
        String inputDataItem = loopCharacteristics.getInputDataItem();
        List<String> values = (List)juelExpression.getValue(hvis, inputDataItem, List.class);
        if (CollectionUtils.isNotEmpty(values)) {
            List<UserVo> users = new ArrayList<>();
            values.forEach(code->{
                List<UserVo> userVos = userVoService.getUserByCodeOrGroupId(code);
                users.addAll(userVos);
            });
            
        }
    }
}

2.4、工具类

public Object getValue(List<HistoricVariableInstance> hvis, String exp, Class<?> clazz) {
        ExpressionFactory factory = new ExpressionFactoryImpl();
        SimpleContext context = new SimpleContext();
        for (HistoricVariableInstance entry : hvis) {
            context.setVariable(entry.getVariableName(), factory.createValueExpression(entry.getValue(), Object.class));
        }
        ValueExpression e = factory.createValueExpression(context, exp, clazz);
        return e.getValue(context);
    }

    public String getValue(List<HistoricVariableInstance> hvis, String exp) {
        return (String) getValue(hvis, exp, String.class);
    }

Flowable中,动态设置每个节点审批人参数可以通过多种方式实现。以下是一些常见的方法: 1. **使用表达式(Expression)**: 你可以在流程定义中使用表达式来动态设置审批人。例如,可以在流程启动时传递一个变量,然后在流程定义中使用这个变量来设置审批人。 ```xml <userTask id="approveTask" name="Approve" flowable:assignee="${approver}"> ... </userTask> ``` 在启动流程时,可以设置`approver`变量: ```java Map<String, Object> variables = new HashMap<>(); variables.put("approver", "userId"); runtimeService.startProcessInstanceByKey("processKey", variables); ``` 2. **使用监听器(Listener)**: 你可以使用任务监听器或执行监听器来动态设置审批人。在监听器中,你可以编写自定义逻辑来获取审批人并设置到任务中。 ```xml <userTask id="approveTask" name="Approve"> <extensionElements> <flowable:taskListener event="create" class="com.example.ApproveTaskListener"/> </extensionElements> </userTask> ``` 在监听器中: ```java public class ApproveTaskListener implements TaskListener { @Override public void notify(DelegateTask delegateTask) { String approver = getApprover(); delegateTask.setAssignee(approver); } private String getApprover() { // 自定义逻辑获取审批人 return "userId"; } } ``` 3. **使用业务规则任务(Business Rule Task)**: 你可以使用业务规则任务来根据业务规则动态设置审批人。业务规则任务可以根据输入数据执行规则引擎,并返回审批人。 ```xml <businessRuleTask id="ruleTask" name="Rule Task" flowable:ruleVariablesInput="inputVariables" flowable:resultVariable="approver"> ... </businessRuleTask> <userTask id="approveTask" name="Approve" flowable:assignee="${approver}"> ... </userTask> ``` 4. **使用脚本任务(Script Task)**: 你可以使用脚本任务来动态设置审批人。在脚本任务中,你可以编写脚本代码来获取审批人并设置到流程变量中。 ```xml <scriptTask id="scriptTask" name="Script Task" scriptFormat="groovy"> <script> def approver = getApprover() execution.setVariable("approver", approver) </script> </scriptTask> <userTask id="approveTask" name="Approve" flowable:assignee="${approver}"> ... </userTask> ``` 通过以上方法,你可以根据实际需求动态设置每个节点审批人参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值