基于Activiti6.0工作流结束退回

工作流结束退回,一般是跨流程使用,一般有其他解决方案,Activiti本身不支持退回;正常退回操作,在流程图画退回流程即可,但是,有些时候,我们只有正向流程,通过代码进行反向退回操作。

话不多说,上代码!

//首先,退回需要知道终审岗位任务ID,通过任务ID,查询历史任务
HistoricTaskInstance historicTask = historyService.createHistoricTaskInstanceQuery().taskId(taskId)
                .taskCandidateGroup(candidateGroup).processInstanceBusinessKey(businessKey).singleResult();
        if (historicTask == null) {
            return BaseResponseUtil.error("历史任务不存在或您不是当前审批人");
        }
//获取流程图
BpmnModel bpmnModel = repositoryService.getBpmnModel(historicTask.getProcessDefinitionId());
        Process process = bpmnModel.getProcesses().get(0);
        FlowElement flowElement = process.getFlowElement(historicTask.getTaskDefinitionKey());

managementService.executeCommand(commandContext -> {
            HistoricProcessInstanceEntityManager historicProcessInstanceEntityManager = commandContext.getHistoricProcessInstanceEntityManager();

            HistoricTaskInstanceEntityManager historicTaskInstanceEntityManager = commandContext.getHistoricTaskInstanceEntityManager();
            HistoricTaskInstanceEntity historicTaskInstanceEntity = historicTaskInstanceEntityManager.findById(historicTask.getId());
						//重启流程,更新结束时间为null
            HistoricProcessInstanceEntity instanceEntity =
                    historicProcessInstanceEntityManager.findById(historicTaskInstanceEntity.getProcessInstanceId());
            instanceEntity.setEndTime(null);

            historicProcessInstanceEntityManager.update(instanceEntity);;

            //创建执行流
            ExecutionEntityManager executionEntityManager = commandContext.getExecutionEntityManager();
            ExecutionEntity executionEntity = executionEntityManager.create();
            executionEntity.setId(historicTaskInstanceEntity.getProcessInstanceId());
            executionEntity.setRootProcessInstanceId(historicTaskInstanceEntity.getProcessInstanceId());
            executionEntity.setProcessInstanceId(historicTaskInstanceEntity.getProcessInstanceId());
            executionEntity.setActive(true);
            executionEntity.setBusinessKey(actionEntity.getBusinessKey());
            executionEntity.setProcessDefinitionId(historicTaskInstanceEntity.getProcessDefinitionId());
            executionEntity.setScope(true);
            executionEntity.setStartTime(new Date());
            executionEntityManager.insert(executionEntity);
            //把最后一岗任务,添加到执行流
            ExecutionEntity exe = executionEntityManager.create();
            exe.setParentId(executionEntity.getId());
            exe.setRootProcessInstanceId(historicTaskInstanceEntity.getProcessInstanceId());
            exe.setCurrentFlowElement(flowElement);
            exe.setProcessInstanceId(historicTaskInstanceEntity.getProcessInstanceId());
            exe.setActive(true);
            exe.setProcessDefinitionId(historicTaskInstanceEntity.getProcessDefinitionId());
            exe.setScope(false);
            exe.setStartTime(new Date());
            executionEntityManager.insert(exe);
            commandContext.getAgenda().planContinueProcessOperation(exe);
            return null;
        });

//删除历史任务、删除历史任务节点
managementService.executeCommand(new DeleteHistoryTaskInstanceCmd(historicTask.getId(), historyActivityInstanceService));
historyActivityInstanceService.deleteHistoryActivityInstanceByTaskId(historicTask.getId(), historicTask.getProcessInstanceId());
public class DeleteHistoryTaskInstanceCmd implements Command {
    private String taskId;
    private IHistoryActivityInstanceService historyActivityInstanceService;
    @Override
    public Object execute(CommandContext context) {
        ProcessEngineConfigurationImpl engine = context.getProcessEngineConfiguration();
        engine.getHistoricDetailEntityManager().deleteHistoricDetailsByTaskId(taskId);
        engine.getHistoricVariableInstanceEntityManager().deleteHistoricVariableInstancesByTaskId(taskId);
        engine.getAttachmentEntityManager().deleteAttachmentsByTaskId(taskId);
        engine.getHistoricIdentityLinkEntityManager().deleteHistoricIdentityLinksByTaskId(taskId);

        historyActivityInstanceService.deleteHistoryTaskInstanceByTaskId(taskId);

        return null;
    }
    public DeleteHistoryTaskInstanceCmd(String taskId,IHistoryActivityInstanceService historyActivityInstanceService){
        this.taskId = taskId;
        this.historyActivityInstanceService = historyActivityInstanceService;
    }
}
@Service
public class HistoryActivityInstanceServiceImpl implements IHistoryActivityInstanceService {

    @Autowired
    private HistoryActivityInstanceMapper historyActivityInstanceMapper;
    @Override
    @Transactional
    public int deleteHistoryActivityInstanceByTaskId(String taskId, String processInstanceId) {
        int count = historyActivityInstanceMapper.findHistoryActivityEndEventCount(processInstanceId, CommonConstants.ENT_EVENT);
        if(count > 0){
            historyActivityInstanceMapper.deleteHistoryActivityEndEvent(processInstanceId, CommonConstants.ENT_EVENT);
        }
        return historyActivityInstanceMapper.deleteHistoryActivityInstanceByTaskId(taskId);
    }

    @Override
    public int deleteHistoryTaskInstanceByTaskId(String taskId) {
        return historyActivityInstanceMapper.deleteHistoryTaskInstanceByTaskId(taskId);
    }
}
public interface HistoryActivityInstanceMapper{
    /**
     * 删除历史流程任务信息
     * @param taskId
     * @return
     */
    @Delete("DELETE FROM ACT_HI_ACTINST where TASK_ID_ = #{taskId}")
    int deleteHistoryActivityInstanceByTaskId(@Param("taskId") String taskId);

    /**
     * 删除历史任务信息
     * @param taskId
     * @return
     */
    @Delete("DELETE FROM ACT_HI_TASKINST where ID_ = #{taskId}")
    int deleteHistoryTaskInstanceByTaskId(@Param("taskId") String taskId);

    /**
     * 查询结束节点信息
     * @param processInstanceId
     * @param entEvent
     * @return
     */
    @Select("SELECT count(*) from ACT_HI_ACTINST where proc_inst_id_ = #{processInstanceId} and act_id_ = #{entEvent}")
    int findHistoryActivityEndEventCount(@Param("processInstanceId") String processInstanceId, @Param("entEvent") String entEvent);

    /**
     * 删除结束节点信息
     * @param processInstanceId
     * @param entEvent
     */
    @Delete("DELETE FROM ACT_HI_ACTINST where proc_inst_id_ = #{processInstanceId} and act_id_ = #{entEvent}")
    void deleteHistoryActivityEndEvent(@Param("processInstanceId") String processInstanceId, @Param("entEvent") String entEvent);
}

通过以上代码,可以实现平滑的工作流退回操作。不喜勿喷

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章