关于activiti:Activiti流程预测功能实现
背景某我的项目流程应用activiti开发,现须要开发一个流程预测的性能,流程预测,也称流程预跑,是指用户在发动流程或者执行审批动作时心愿看到流程后续流转的节点,不便用户跟踪流程。Activiti自身不提供流程预测的性能,实际上流程在运行时每一个变量的变动,比方审批后果,表单数据等,都会影响流程的走向,而这些变动是无奈进行预感的,所以流程预测的前提条件就是,咱们须要假如一些变量的值,比拟典型的就是审批后果,咱们须要假如审批后果都是通过的,基于这个前提,咱们能力实现一个能够提供参考价值的预测数据。 实现如果要看懂本文,你必须对activiti开发有根本的理解,对一些根本的概念相熟,倡议先浏览之前发表的Activiti教程流程模型这边筹备了一个简略的报销流程模型示例 流程很简略,提交报销单,我的项目负责人先审批,如果金额小于500,项目经理审批,如果金额大于500,我的项目总监审批,最初财务审核,财务如果回绝间接退回项目经理。其中判断金额的表达式为${amount >500},判断财务审核后果的表达式为${outcome=='REJECT'},并且财务审核这个节点的审批人是一个变量${finApprover} 实现思路计划就是获取到流程模型,代码依据流程模型进行计算流程流转门路,理论审批人,这里须要解决两个问题 流程变量的计算流程模型和节点流向信息的获取参数的获取activiti都有提供相应的api进行获取,为了模拟计算表达式须要在流程中设置变量,这些个别都是在审批代码中动静设置,比方outcome变量,个别都是依据用户的审批后果进行动静设置,这里为了不便模仿,所有参数都是通过流程发动接口传入,在流程发动时事后设置好的 流程发动上面是流程发动的接口代码 @RequestMapping(value = "start", method = RequestMethod.GET)public String start(@RequestParam(value = "processId") String processId, @RequestParam Map params) { ProcessInstance instance = runtimeService.startProcessInstanceByKey(process, params); return instance.getId();}接口承受一个流程id和参数,并且发动时会把参数设置到流程实例中,流程发动须要借助runtimeService 流程预测这边创立了一个bean用于存储每个预测节点信息 ApproveNode.java public class ApproveNode { private String nodeName; private String approvers; public ApproveNode(String nodeName, String approvers) { this.nodeName = nodeName; this.approvers = approvers; } //getter and setter //....}预测的主函数如下 @Servicepublic class PreviewProcessService { @Autowired private RuntimeService runtimeService; @Autowired private TaskService taskService; @Autowired private RepositoryService repositoryService; public List<ApproveNode> getPreviewNodes(String taskId) { /** * 获取待办工作信息 */ Task task = taskService.createTaskQuery() .taskId(taskId) .singleResult(); //获取流程模型 BpmnModel model = repositoryService.getBpmnModel(task.getProcessDefinitionId()); //获取以后节点 FlowElement flowElement = model.getFlowElement(task.getTaskDefinitionKey()); //获取流程变量 Map<String, Object> params = runtimeService.getVariables(task.getExecutionId()); //保留拜访过的节点,防止死循环 Set<String> visitedElements = new HashSet<>(); //递归获取所有预测节点 List<ApproveNode> approveNodes = visiteElement(flowElement, params, visitedElements); return approveNodes; } //....}这里是依据待办id(taskId)获取到流程模型,再获取流程运行时变量进行计算,如果是流程发动时的预跑,间接依据流程id获取模型,流程变量从前端表单传入即可visitedElements为了防止死循环,因为程序须要依据流程连线获取信息进行计算,如果流程自身存在循环,比方下面的例子,财务审批退回给项目经理,项目经理提交后又能够回到财务审核,如果处理不当,就容易呈现死循环这里应用递归进行节点计算,外围逻辑在visiteElement中残缺代码 ...