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層面的流程單;而死單主要通過刪除的方式進行。