批量执行审批任务流程:优化方法,提高效率
批量执行审批任务流程:优化方法,提高效率
本文将对原方法 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
}
}
代码分析:
- 遍历执行:
executeProcessNextCmd方法遍历cmds列表,对每个ProcessNextCmd对象调用completeTask方法进行处理。 - 结果处理:
// process the result部分用于处理completeTask返回的JsonResult对象,可根据具体情况进行操作,例如记录日志、提示用户等。 - 性能提升: 通过批量执行,减少了方法调用次数,提高了执行效率。
流程审批逻辑:
- 任务验证: 验证任务是否存在、用户是否有权限审批等。
- 流程状态: 检查流程是否暂停,如果暂停,则返回错误提示。
- 任务校验: 对任务进行校验,例如检查是否满足审批条件等。
- 任务配置: 获取任务的定义、配置等信息,用于后续处理。
- 数据处理: 处理表单数据、流程变量、任务跳转规则等。
- 审批历史: 记录审批历史信息,包括审批意见、操作文件、相关实例等。
- 任务处理: 根据审批类型调用对应的任务处理逻辑,例如下一步、撤回、驳回等。
- 任务完成: 执行任务完成后的操作,例如更新任务状态、记录日志等。
代码优化建议:
- 结果统一处理: 在
executeProcessNextCmd方法中,可以统一处理completeTask返回的JsonResult对象,例如记录错误日志,并将所有错误信息汇总返回给用户。 - 异步处理: 对于一些耗时的操作,例如数据处理、历史记录等,可以考虑使用异步线程池进行处理,提高整体效率。
- 异常处理: 对可能出现的异常进行捕获和处理,避免程序崩溃。
总结:
本文介绍了将 completeTask 方法优化为批量执行方法 executeProcessNextCmd 的方法,并分析了代码逻辑和性能提升。通过批量执行,可以有效提高审批任务处理效率,为用户提供更便捷的操作体验。
原文地址: https://www.cveoy.top/t/topic/qyf5 著作权归作者所有。请勿转载和采集!