jbpm人工终止功能的开发
人工终止即管理员在管理界面通过某种技术手段将停留在任意节点的审批中的流程终止掉。目前的需求场景是大量的如加班、请假、外出和一些行政类别的审批单停留在直接或越级主管审批(部分中层或高层的单子,其直接或越级是EMT总裁或CEO),相应审批人未及时审批,导致后续工作存在困难。
首先将终止功能开放给系统管理员或该流程的流程管理员,流程管理员或系统管理员可以将该类型的单子终止掉,人工终止的单子属于特殊类型的单子,有所谓的死单,比如发起人已离职或该单已失效,甚至是单子是否审批通过已无关紧要;另外一部分是这种高层一般不处理的单子(之前有授权功能,高层可以将HR考勤或行政类型的单子的审批权限通过授权功能转授权他人),可由人工终止。人工终止后该单子如何处理,如流程管理员根据报表统计进一步分析处理。
主要代码如下:
public void terminate(String processExecutionId) { ProcessExecutionEntity exe = processExecutionDao.queryById(processExecutionId); List<ProcessTaskEntity> taskList = processTaskService.queryByProcessExecutionId(processExecutionId); if(!CollectionUtils.isEmpty(taskList)){ for(ProcessTaskEntity taskEntity : taskList){ if(ProcessTaskEntity.STATUS_INIT.equals(taskEntity.getStatus())){ taskEntity.setStatus(ProcessTaskEntity.STATUS_MANUAL_FIN); taskEntity.setModifyTime(new Date()); taskEntity.setFinishTime(new Date()); if("抢办".equals(taskEntity.getCreateUserCode())){ taskEntity.setCreateUserCode(OAUserContext.getUserCode()); } taskEntity.setModifyUserCode(OAUserContext.getUserCode()); processTaskService.update(taskEntity); } } } exe.setStatus(ProcessExecutionEntity.STATUS_MANUAL_FINISH); exe.setModifyUserCode(OAUserContext.getUserCode()); exe.setModifyTime(new Date()); update(exe); jbpmOperatorService.terminate(exe.getProcessInstanceId()); exe.setStatus("3"); }
以上的代码主要是针对jbpm扩展类的,在终止execution后,会查询所有的待办任务,包括会签、抢办等等,然后将所有×××全部设置为状态3,即要工终止,jbpm核心终止代码在
jbpmOperatorService.terminate
以下:
public void terminate(String processInstanceId) { ExecutionService executionService = processEngine.getExecutionService(); if(executionService != null){ executionService.endProcessInstance(processInstanceId, "cancle"); }else { } }
代码全部终止后,需要修改高级查询和报表的逻辑,增加人工终止的状态。目前人工终止在业务层面主要用于类型2的,即协助高层审批非EMT层面的流程单;而死单主要通过删除的方式进行。