批量执行审批任务流程:优化方法,提高效率

本文将对原方法 completeTask 进行优化,使其支持批量执行审批任务,提高效率。优化后的方法名为 executeProcessNextCmd,该方法接收一个 List<ProcessNextCmd> 作为参数,并遍历执行每个 ProcessNextCmd 对象,完成对应的审批任务。

原方法 completeTask

public JsonResult completeTask(ProcessNextCmd cmd, boolean skip) {
    JsonResult result= JsonResult.Success();
    BpmTask bpmTask=get(cmd.getTaskId());
    if(BeanUtil.isEmpty(bpmTask)){
        result= JsonResult.Fail('此任务已经审批!');
        return result;    
    }
    
    JsonResult authResult=bpmInstService.calTaskAuth(bpmTask,ContextUtil.getCurrentUserId());
    if(!skip && !authResult.isSuccess()){
        return authResult;    
    }
    
    String detail='审批任务:'+ bpmTask.getSubject() +',意见为:' + cmd.getCheckType();
    LogContext.put(Audit.DETAIL,detail);
    
    BpmInst bpmInst=bpmInstService.getById(bpmTask.getInstId());
    String status=bpmInst.getStatus();
    if(BpmInstStatus.SUPSPEND.name().equals( status)){
        return JsonResult.Fail('流程已暂停,请联系管理员!');
    }
    
    result=checkTask(bpmTask,bpmInst);
    if(!result.isSuccess()){
        return result;    
    }
    
    //传入,为后续的任务执行直接获取该定义,而不用进行转换获取。
    cmd.setDefId(bpmTask.getDefId());
    //放置线程变量,在后续可获取到
    cmd.setInstId(bpmTask.getInstId());
    //设置上一节点ID
    cmd.setPreNodeId(bpmTask.getKey());
    
    //加上审批的流程变更
    ProcessConfig processConfig=bpmDefService.getProcessConfig(bpmTask.getActDefId());
    UserTaskConfig userTaskConfig=(UserTaskConfig) bpmDefService.getNodeConfig(bpmTask.getActDefId(),bpmTask.getKey());
    cmd.addTransientVar(BpmConst.PROCESS_CONFIG,processConfig);
    cmd.addTransientVar(BpmConst.USERTASK_CONFIG,userTaskConfig);
    cmd.addTransientVar(BpmConst.BPM_INST,bpmInst);
    cmd.addTransientVar(BpmConst.BPM_APPROVE_TASK,bpmTask);
    
    //是否允许审批
    JsonResult jsonResult = bpmInstService.getAllowApprove(userTaskConfig,cmd.getFormData(),cmd.getVars());
    if(!jsonResult.isSuccess()){
        return jsonResult;    
    }
    
    //跳过不处理数据。
    if(!TaskOptionType.SKIP.name().equals(cmd.getCheckType()) &&cmd.getSystemHand()){
        //处理表单数据
        formDataService.handFormData(cmd,userTaskConfig.getDataSetting(),'approve');
    }
    
    //处理流程变量
    bpmInstService.handVars(cmd,bpmInst,processConfig,false);
    //处理任务跳转规则。
    String  targetNodeId= handJumpRules(bpmTask, userTaskConfig);
    if(StringUtils.isNotEmpty(targetNodeId) && StringUtils.isEmpty(cmd.getDestNodeId())){
        cmd.setDestNodeId(targetNodeId);    
    }
    
    //处理fieldJson。
    TaskFieldConfig fieldConfig= processConfig.getTaskFields();
    //处理JSON字段。
    bpmInstService.handInstJson(fieldConfig,bpmInst,cmd);
    //处理任务前置数据
    processHandlerExecutor.handTaskBeforeHandler(userTaskConfig,bpmTask,bpmInst.getBusKey());
    
    //创建审批历史。
    bpmCheckHistoryService.createHistory(bpmTask, cmd.getCheckType(),cmd.getOpinionName(), cmd.getOpinion(),cmd.getOpFiles(),cmd.getRelInsts(),'');
    
    //若为回退,包括 上一步、撤回、驳回发起人等
    ITaskHandler taskHandler= TaskHandlerContext.getJumpType(cmd.getCheckType());
    taskHandler.handTask(bpmTask,cmd,userTaskConfig);
    
    
    //任务完成处理器。
    processHandlerExecutor.handTaskAfterHandler(userTaskConfig,bpmTask.getKey(),bpmInst.getBusKey());
    
    //处理任务跳过。
    bpmTaskSkipService.handSkipTask(cmd);
    
    //加入流程实例权限表
    bpmInstPermissionService.createTaskInfo(bpmInst,cmd);
    
    //添加审批任务日志
    bpmInstLogService.addTaskLog(bpmTask.getInstId(),bpmTask.getTaskId(),bpmTask.getName(),bpmTask.getKey(),'审批任务');
    
    //删除暂存的意见
    bpmTemporaryOpinionService.delByTaskId(bpmTask.getTaskId());
    
    result.setMessage('成功完成处理任务!');
    
    return result;    
}

优化后的方法 executeProcessNextCmd

public void executeProcessNextCmd(List<ProcessNextCmd> cmds, boolean skip) {
    for (ProcessNextCmd cmd : cmds) {
        JsonResult result = completeTask(cmd, skip);
        // process the result
    }
}

代码分析:

  1. 遍历执行: executeProcessNextCmd 方法遍历 cmds 列表,对每个 ProcessNextCmd 对象调用 completeTask 方法进行处理。
  2. 结果处理: // process the result 部分用于处理 completeTask 返回的 JsonResult 对象,可根据具体情况进行操作,例如记录日志、提示用户等。
  3. 性能提升: 通过批量执行,减少了方法调用次数,提高了执行效率。

流程审批逻辑:

  1. 任务验证: 验证任务是否存在、用户是否有权限审批等。
  2. 流程状态: 检查流程是否暂停,如果暂停,则返回错误提示。
  3. 任务校验: 对任务进行校验,例如检查是否满足审批条件等。
  4. 任务配置: 获取任务的定义、配置等信息,用于后续处理。
  5. 数据处理: 处理表单数据、流程变量、任务跳转规则等。
  6. 审批历史: 记录审批历史信息,包括审批意见、操作文件、相关实例等。
  7. 任务处理: 根据审批类型调用对应的任务处理逻辑,例如下一步、撤回、驳回等。
  8. 任务完成: 执行任务完成后的操作,例如更新任务状态、记录日志等。

代码优化建议:

  1. 结果统一处理:executeProcessNextCmd 方法中,可以统一处理 completeTask 返回的 JsonResult 对象,例如记录错误日志,并将所有错误信息汇总返回给用户。
  2. 异步处理: 对于一些耗时的操作,例如数据处理、历史记录等,可以考虑使用异步线程池进行处理,提高整体效率。
  3. 异常处理: 对可能出现的异常进行捕获和处理,避免程序崩溃。

总结:

本文介绍了将 completeTask 方法优化为批量执行方法 executeProcessNextCmd 的方法,并分析了代码逻辑和性能提升。通过批量执行,可以有效提高审批任务处理效率,为用户提供更便捷的操作体验。

批量执行审批任务流程:优化方法,提高效率

原文地址: https://www.cveoy.top/t/topic/qyf5 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录