Flowable批量修改审批人

如果一个人员离职了,你要变更这个人员所在的流程为其他的审批人,如果一个个的去检察,你是不是很累,这就是我们如果批量修改的原因。

场景很简单,就是人力告诉你有人离职了,需要变更为其他的人

目标:通过界面来修改审批人

1. 界面怎么做在这里就不用讲了
  • 第一 、获取所有的最新的流程定义

public ReturnVo<String> updateTaskAssignee(List<String> keys, String oldAssignee, String newAssignee) {
        ReturnVo<String> returnVo = new ReturnVo<>(ReturnCode.SUCCESS, "OK");
        //1. 查询最新的流程定义列表
        StringBuffer sql = new StringBuffer("SELECT a.* FROM act_re_procdef a INNER JOIN (SELECT key_,MAX(version_) max_version FROM act_re_procdef GROUP BY key_ ) b " +
                " ON a.key_ = b.key_ AND a.version_ = b.max_version ");
        StringBuffer inkeys = new StringBuffer("");
        if (CollectionUtils.isNotEmpty(keys)) {
            StringBuffer finalInkeys = inkeys;
            keys.forEach(key -> finalInkeys.append("'").append(key).append("'").append(","));
            if (inkeys.length() > 0) {
                inkeys = inkeys.deleteCharAt(inkeys.length() - 1);
                sql.append(" where a.key_ in (").append(inkeys.toString()).append(")");
                List<ProcessDefinition> processDefinitions = repositoryService.createNativeProcessDefinitionQuery().sql(sql.toString()).list();
                if (CollectionUtils.isNotEmpty(processDefinitions)) {
                    processDefinitions.forEach(processDefinition -> this.updateTaskAssignee(processDefinition, oldAssignee, newAssignee));
                }
            }
        }
        return returnVo;
    }
  • 第二、修改每一个流程定义的审批人信息

public ReturnVo<String> updateTaskAssignee(ProcessDefinition processDefinition, String oldAssignee, String newAssignee) {
        ReturnVo<String> returnVo = new ReturnVo<>(ReturnCode.SUCCESS, "OK");
        BpmnModel model = repositoryService.getBpmnModel(processDefinition.getId());
        List<UserTask> userTasks = bpmnModelService.findUserTasksByBpmnModel(model);
        userTasks.forEach(userTask -> {
            if (userTask.getAssignee() != null && userTask.getAssignee().equals(oldAssignee) && !oldAssignee.equals(newAssignee)) {
                ObjectNode processInfo = dynamicBpmnService.changeUserTaskAssignee(userTask.getId(), newAssignee);
                dynamicBpmnService.saveProcessDefinitionInfo(processDefinition.getId(), processInfo);
            }
        });
 }
### Flowable 工作流引擎中的批量审批实现方法 在Flowable工作流引擎中,为了支持业务需求中的批量审批操作,通常会采用一些特定的设计模式和技术手段来确保多个实例能够被有效地管理和处理。下面介绍一种基于任务查询和服务接口的方式来进行批量审批。 #### 使用TaskService完成批量审批 通过`taskService.complete()`可以单独完成单个任务的结束,在实际应用当中如果要实现多条记录的一键审核,则可以通过循环遍历待审的任务列表并逐一调用此API[^2]: ```java List<Task> tasks = taskService.createTaskQuery() .processInstanceId(processInstanceId) .list(); for (Task task : tasks) { Map<String, Object> variables = new HashMap<>(); // 设置流程变量 variables.put("approved", true); taskService.complete(task.getId(), variables); } ``` 这段代码展示了如何获取指定流程实例下的所有未决任务,并设置相应的参数后提交这些任务以达到一次性批准的效果。需要注意的是这里假设所有的子任务都遵循相同的审批逻辑;如果有不同的分支路径或者其他复杂的条件判断则需额外增加对应的控制语句[^1]。 另外,考虑到并发情况下可能存在的竞争问题以及性能优化方面的要求,建议将上述过程封装在一个服务类里面并通过Spring框架提供的事务管理机制加以保护,从而保证整个批处理动作要么全部成功要么完全回滚,维持数据一致性。 ```java @Service public class BatchApprovalService { @Autowired private TaskService taskService; @Transactional(rollbackFor = Exception.class) public void batchApprove(String processInstanceId) throws Exception{ List<Task> tasks = taskService.createTaskQuery() .processInstanceId(processInstanceId).list(); for(Task task :tasks){ try{ Map<String,Object> vars=new HashMap<>(); vars.put("approved",Boolean.TRUE); taskService.setVariablesLocal(task.getId(),vars); taskService.complete(task.getId()); }catch(Exception e){ throw new RuntimeException("Failed to approve task "+task.getName()+" of instance "+processInstanceId,e); } } } } ``` 以上就是利用Flowable API结合Spring Transaction特性所构建的一个简单的批量审批解决方案示例。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小学生05101

flowable

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值