最近公司做的一个项目要实现工作流程的收回,驳回等操作,而采用的工作流引擎并不支持驳回功能,这个项目恰好就我和一个实习生一块做,所以这个问题就落到我的头上来解决了。。。

客户提出的要求是驳回时要记录日志,但是审批意见之类的需要清除掉,收回时不记录日志,审批意见同样清除。

百度了一下,总结了5个解决方案:

第一种是清除当前任务的出口,实现回到上一步的功能。

根据任务ID获取当前的任务节点,进而获取流程实例,然后取到流程的定义,找到当前活动的节点与上一步活动的节点,然后清除当前活动的出口,将上一步活动的出口作为最新的活动节点。

第二种是直接将当前的activiti引擎更换为第三方的支持退会驳回的引擎。

第三种是自己编译activiti引擎,加入退回,驳回功能。

第四种是直接操作数据库,使用历史任务替换正在进行的任务。

第五种是直接实现Command接口,实现工作流程可以任意跳转。

因为时间紧急所以直接将3.编译activiti引擎给pass掉了,本来项目是接手的离职员工的项目,更换流程引擎可能会引起其他的问题,此计划暂放。

最后在1、4、5之间决定了采用第一种,代码如下

 1 public String rollBackWorkFlow(String taskId) {
 2         try {
 3             Map<String, Object> variables;
 4             // 取得当前任务.当前任务节点
 5             HistoricTaskInstance currTask = historyService
 6                     .createHistoricTaskInstanceQuery().taskId(taskId)
 7                     .singleResult();
 8             // 取得流程实例,流程实例
 9             ProcessInstance instance = runtimeService
10                     .createProcessInstanceQuery()
11                     .processInstanceId(currTask.getProcessInstanceId())
12                     .singleResult();
13             if (instance == null) {
14              logger.info("流程结束");
15              logger.error("出错啦!流程已经结束");
16                 return "ERROR";
17             }
18             variables = instance.getProcessVariables();
19             // 取得流程定义
20             ProcessDefinitionEntity definition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)
21                     .getDeployedProcessDefinition(currTask
22                             .getProcessDefinitionId());
23             if (definition == null) {
24                 logger.info("流程定义未找到");
25                 logger.error("出错啦!流程定义未找到");
26                 return "ERROR";
27             }
28             // 取得上一步活动
29             ActivityImpl currActivity = ((ProcessDefinitionImpl) definition)
30                     .findActivity(currTask.getTaskDefinitionKey());
31             
32             //也就是节点间的连线
33             List<PvmTransition> nextTransitionList = currActivity
34                     .getIncomingTransitions();
35             // 清除当前活动的出口
36             List<PvmTransition> oriPvmTransitionList = new ArrayList<PvmTransition>();
37             //新建一个节点连线关系集合
38             
39             List<PvmTransition> pvmTransitionList = currActivity
40                     .getOutgoingTransitions();
41             //
42             for (PvmTransition pvmTransition : pvmTransitionList) {
43                 oriPvmTransitionList.add(pvmTransition);
44             }
45             pvmTransitionList.clear();
46  
47             // 建立新出口
48             List<TransitionImpl> newTransitions = new ArrayList<TransitionImpl>();
49             for (PvmTransition nextTransition : nextTransitionList) {
50                 PvmActivity nextActivity = nextTransition.getSource();
51                 ActivityImpl nextActivityImpl = ((ProcessDefinitionImpl) definition)
52                         .findActivity(nextActivity.getId());
53                 TransitionImpl newTransition = currActivity
54                         .createOutgoingTransition();
55                 newTransition.setDestination(nextActivityImpl);
56                 newTransitions.add(newTransition);
57             }
58             // 完成任务
59             List<Task> tasks = taskService.createTaskQuery()
60                     .processInstanceId(instance.getId())
61                     .taskDefinitionKey(currTask.getTaskDefinitionKey()).list();
62             for (Task task : tasks) {
63                 taskService.claim(task.getId(), task.getAssignee());
64                 taskService.complete(task.getId(), variables);
65                 historyService.deleteHistoricTaskInstance(task.getId());
66             }
67             // 恢复方向
68             for (TransitionImpl transitionImpl : newTransitions) {
69                 currActivity.getOutgoingTransitions().remove(transitionImpl);
70             }
71             for (PvmTransition pvmTransition : oriPvmTransitionList) {
72                 pvmTransitionList.add(pvmTransition);
73             }
74             logger.info("OK");
75             logger.info("流程结束");
76             return "SUCCESS";
77         } catch (Exception e) {
78             logger.error("失败",e);
79             return "ERROR";
80         }
81     }
View Code

相关文章:

  • 2021-07-17
  • 2022-12-23
  • 2021-10-21
  • 2022-12-23
猜你喜欢
  • 2021-06-07
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-09-23
相关资源
相似解决方案