工作流结束退回,一般是跨流程使用,一般有其他解决方案,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 条评论) “” |