in dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowTaskRelationServiceImpl.java [282:351]
public Map<String, Object> deleteTaskWorkflowRelation(User loginUser, long projectCode, long workflowDefinitionCode,
long taskCode) {
Project project = projectMapper.queryByCode(projectCode);
// check user access for project
Map<String, Object> result = projectService.checkProjectAndAuth(loginUser, project, projectCode, null);
if (result.get(Constants.STATUS) != Status.SUCCESS) {
return result;
}
if (taskCode == 0) {
log.error(
"delete task workflow relation error due to parameter taskCode is 0, projectCode:{}, workflowDefinitionCode:{}.",
projectCode, workflowDefinitionCode);
putMsg(result, Status.DELETE_TASK_WORKFLOW_RELATION_ERROR);
return result;
}
WorkflowDefinition workflowDefinition = workflowDefinitionMapper.queryByCode(workflowDefinitionCode);
if (workflowDefinition == null) {
log.error("workflow definition does not exist, workflowDefinitionCode:{}.", workflowDefinitionCode);
putMsg(result, Status.WORKFLOW_DEFINITION_NOT_EXIST, String.valueOf(workflowDefinitionCode));
return result;
}
TaskDefinition taskDefinition = taskDefinitionMapper.queryByCode(taskCode);
if (null == taskDefinition) {
log.error("Task definition does not exist, taskDefinitionCode:{}.", taskCode);
putMsg(result, Status.TASK_DEFINE_NOT_EXIST, String.valueOf(taskCode));
return result;
}
List<WorkflowTaskRelation> workflowTaskRelations =
workflowTaskRelationMapper.queryByWorkflowDefinitionCode(workflowDefinitionCode);
List<WorkflowTaskRelation> workflowTaskRelationList = Lists.newArrayList(workflowTaskRelations);
if (CollectionUtils.isEmpty(workflowTaskRelationList)) {
log.error("workflow task relations are empty, projectCode:{}, workflowDefinitionCode:{}.", projectCode,
workflowDefinitionCode);
putMsg(result, Status.DATA_IS_NULL, "workflowTaskRelationList");
return result;
}
List<Long> downstreamList = Lists.newArrayList();
for (WorkflowTaskRelation workflowTaskRelation : workflowTaskRelations) {
if (workflowTaskRelation.getPreTaskCode() == taskCode) {
downstreamList.add(workflowTaskRelation.getPostTaskCode());
}
if (workflowTaskRelation.getPostTaskCode() == taskCode) {
workflowTaskRelationList.remove(workflowTaskRelation);
}
}
if (CollectionUtils.isNotEmpty(downstreamList)) {
String downstream = StringUtils.join(downstreamList, ",");
log.warn(
"Relation can not be deleted because task has downstream tasks:[{}], projectCode:{}, workflowDefinitionCode:{}, taskDefinitionCode:{}.",
downstream, projectCode, workflowDefinitionCode, taskCode);
putMsg(result, Status.TASK_HAS_DOWNSTREAM, downstream);
return result;
}
updateWorkflowDefiniteVersion(loginUser, result, workflowDefinition);
updateRelation(loginUser, result, workflowDefinition, workflowTaskRelationList);
if (TaskTypeUtils.isConditionTask(taskDefinition.getTaskType())
|| TaskTypeUtils.isSubWorkflowTask(taskDefinition.getTaskType())
|| TaskTypeUtils.isDependentTask(taskDefinition.getTaskType())) {
int deleteTaskDefinition = taskDefinitionMapper.deleteByCode(taskCode);
if (0 == deleteTaskDefinition) {
log.error("Delete task definition error, taskDefinitionCode:{}.", taskCode);
putMsg(result, Status.DELETE_TASK_DEFINE_BY_CODE_ERROR);
throw new ServiceException(Status.DELETE_TASK_DEFINE_BY_CODE_ERROR);
} else
log.info("Delete {} type task definition complete, taskDefinitionCode:{}.",
taskDefinition.getTaskType(), taskCode);
}
putMsg(result, Status.SUCCESS);
return result;
}