From 21d08406333a5a7748c24216a9529cc01d448e6d Mon Sep 17 00:00:00 2001 From: calvin Date: Tue, 20 Feb 2024 20:03:48 +0800 Subject: [PATCH 01/14] modify the function of queryTaskSubProcessDepOnProcess --- .../api/service/impl/ProcessDefinitionServiceImpl.java | 7 +++++++ .../api/service/impl/WorkFlowLineageServiceImpl.java | 2 +- .../dolphinscheduler/dao/mapper/WorkFlowLineageMapper.java | 4 +--- .../dolphinscheduler/dao/mapper/WorkFlowLineageMapper.xml | 3 --- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java index 5624f4de4fad..520c7eb5f7f7 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java @@ -815,6 +815,13 @@ public Map updateProcessDefinition(User loginUser, return result; } + /** + * Check if there're any tasks that depend on the process + */ + private void checkIfDependentTaskExists(ProcessDefinition processDefinition) { + + } + /** * Task want to delete whether used in other task, should throw exception when have be used. * diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkFlowLineageServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkFlowLineageServiceImpl.java index 15f39d696f9a..640600a08920 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkFlowLineageServiceImpl.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkFlowLineageServiceImpl.java @@ -278,7 +278,7 @@ public Optional taskDepOnTaskMsg(long projectCode, long processDefinitio public Set queryTaskDepOnProcess(long projectCode, long processDefinitionCode) { Set taskMainInfos = new HashSet<>(); List taskDependents = - workFlowLineageMapper.queryTaskDependentDepOnProcess(projectCode, processDefinitionCode); + workFlowLineageMapper.queryTaskDependentDepOnProcess(processDefinitionCode); List taskSubProcess = workFlowLineageMapper.queryTaskSubProcessDepOnProcess(projectCode, processDefinitionCode); taskMainInfos.addAll(taskDependents); diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.java index b47731c5915f..cd12bd18b59f 100644 --- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.java +++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.java @@ -124,12 +124,10 @@ List queryTaskSubProcessDepOnProcess(@Param("projectCode") long pr * current method `queryTaskDepOnProcess`. Which mean with the same parameter processDefinitionCode, all tasks in * `queryTaskDepOnTask` are in the result of method `queryTaskDepOnProcess`. * - * @param projectCode Project code want to query tasks dependence * @param processDefinitionCode Process definition code want to query tasks dependence * @return List of TaskMainInfo */ - List queryTaskDependentDepOnProcess(@Param("projectCode") long projectCode, - @Param("processDefinitionCode") long processDefinitionCode); + List queryTaskDependentDepOnProcess(@Param("processDefinitionCode") long processDefinitionCode); /** * Query all tasks depend on task, only downstream task support currently(from dependent task type). diff --git a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.xml b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.xml index 73ecd12410d4..de2dbc91da8f 100644 --- a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.xml +++ b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.xml @@ -205,9 +205,6 @@ join t_ds_process_task_relation ptr on ptr.post_task_code = td.code and td.version = ptr.post_task_version join t_ds_process_definition pd on pd.code = ptr.process_definition_code and pd.version = ptr.process_definition_version - - and ptr.project_code = #{projectCode} - From 9d130d6d15900fe3878d948eea792f0d9999cfb1 Mon Sep 17 00:00:00 2001 From: calvin Date: Wed, 21 Feb 2024 20:23:44 +0800 Subject: [PATCH 02/14] add a function to query downstream dependent tasks --- .../ProjectWorkerGroupController.java | 2 +- .../controller/WorkFlowLineageController.java | 21 +++++++++++++++ .../api/service/WorkFlowLineageService.java | 10 +++++++ .../impl/ProcessDefinitionServiceImpl.java | 3 +++ .../impl/WorkFlowLineageServiceImpl.java | 26 +++++++++++++++++++ .../WorkFlowLineageControllerTest.java | 8 ++++++ .../src/service/modules/lineages/index.ts | 11 +++++++- .../src/service/modules/lineages/types.ts | 5 ++++ .../projects/workflow/definition/use-table.ts | 13 ++++++++++ 9 files changed, 97 insertions(+), 2 deletions(-) diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProjectWorkerGroupController.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProjectWorkerGroupController.java index a9ac07479801..24bd3eddd98b 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProjectWorkerGroupController.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProjectWorkerGroupController.java @@ -68,7 +68,7 @@ public class ProjectWorkerGroupController extends BaseController { @ @RequestParam(value = "workerGroups", required = false) String workerGroups * @return create result code */ - @Operation(summary = "assignWorkerGroups", description = "CREATE_PROCESS_DEFINITION_NOTES") + @Operation(summary = "assignWorkerGroups", description = "ASSIGN_WORKER_GROUPS_NOTES") @Parameters({ @Parameter(name = "projectCode", description = "PROJECT_CODE", schema = @Schema(implementation = long.class, example = "123456")), @Parameter(name = "workerGroups", description = "WORKER_GROUP_LIST", schema = @Schema(implementation = List.class)) diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageController.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageController.java index d37928610e4f..0c248e40bf82 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageController.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageController.java @@ -135,4 +135,25 @@ public Result verifyTaskCanDelete(@Parameter(hidden = true) @RequestAttribute(va putMsg(result, Status.SUCCESS); return result; } + + @Operation(summary = "queryDownstreamDependentTaskList", description = "QUERY_DOWNSTREAM_DEPENDENT_TASK_NOTES") + @Parameters({ + @Parameter(name = "projectCode", description = "PROJECT_CODE", required = true, schema = @Schema(implementation = Long.class)), + @Parameter(name = "workFlowCode", description = "PROCESS_DEFINITION_CODE", required = true, schema = @Schema(implementation = Long.class)), + @Parameter(name = "taskCode", description = "TASK_DEFINITION_CODE", required = false, schema = @Schema(implementation = Long.class, example = "123456789")), + }) + @GetMapping(value = "/query-dependent-tasks") + @ResponseStatus(HttpStatus.OK) + public Result> queryDownstreamDependentTaskList(@Parameter(hidden = true) @RequestAttribute(value = SESSION_USER) User loginUser, + @Parameter(name = "projectCode", description = "PROJECT_CODE", required = true) @PathVariable Long projectCode, + @RequestParam(value = "workFlowCode") Long workFlowCode, + @RequestParam(value = "taskCode", required = false, defaultValue = "0") Long taskCode) { + try { + Map result = workFlowLineageService.queryDownstreamDependentTasks(projectCode, workFlowCode, taskCode); + return returnDataList(result); + } catch (Exception e) { + log.error(QUERY_WORKFLOW_LINEAGE_ERROR.getMsg(), e); + return error(QUERY_WORKFLOW_LINEAGE_ERROR.getCode(), QUERY_WORKFLOW_LINEAGE_ERROR.getMsg()); + } + } } diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkFlowLineageService.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkFlowLineageService.java index 5b365553609e..2c86c7c0f768 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkFlowLineageService.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkFlowLineageService.java @@ -45,6 +45,16 @@ public interface WorkFlowLineageService { */ Set queryTaskDepOnProcess(long projectCode, long processDefinitionCode); + /** + * Query downstream tasks depend on a process definition or a task + * + * @param projectCode Project code want to query tasks dependence + * @param processDefinitionCode Process definition code want to query tasks dependence + * @param taskCode Task code want to query tasks dependence + * @return downstream dependent tasks + */ + Map queryDownstreamDependentTasks(Long projectCode, Long processDefinitionCode, Long taskCode); + /** * Query and return tasks dependence with string format, is a wrapper of queryTaskDepOnTask and task query method. * diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java index 520c7eb5f7f7..ec48d402eec1 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java @@ -40,8 +40,10 @@ import static org.apache.dolphinscheduler.common.constants.Constants.LOCAL_PARAMS; import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.LOCAL_PARAMS_LIST; import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.TASK_TYPE; +import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.TASK_TYPE_DEPENDENT; import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.TASK_TYPE_SQL; +import kotlin.sequences.TakeSequence; import org.apache.dolphinscheduler.api.dto.DagDataSchedule; import org.apache.dolphinscheduler.api.dto.treeview.Instance; import org.apache.dolphinscheduler.api.dto.treeview.TreeViewDto; @@ -2544,6 +2546,7 @@ public void offlineWorkflowDefinition(User loginUser, Long projectCode, Long wor // do nothing if the workflow is already offline return; } + workflowDefinition.setReleaseState(ReleaseState.OFFLINE); processDefinitionDao.updateById(workflowDefinition); diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkFlowLineageServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkFlowLineageServiceImpl.java index 640600a08920..b0535a97dba2 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkFlowLineageServiceImpl.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkFlowLineageServiceImpl.java @@ -19,6 +19,7 @@ import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.TASK_TYPE_DEPENDENT; +import java.util.Objects; import org.apache.dolphinscheduler.api.enums.Status; import org.apache.dolphinscheduler.api.exceptions.ServiceException; import org.apache.dolphinscheduler.api.service.WorkFlowLineageService; @@ -285,4 +286,29 @@ public Set queryTaskDepOnProcess(long projectCode, long processDef taskMainInfos.addAll(taskSubProcess); return taskMainInfos; } + + /** + * Query downstream tasks depend on a process definition or a task + * + * @param projectCode Project code want to query tasks dependence + * @param processDefinitionCode Process definition code want to query tasks dependence + * @param taskCode Task code want to query tasks dependence + * @return downstream dependent tasks + */ + @Override + public Map queryDownstreamDependentTasks(Long projectCode, + Long processDefinitionCode, Long taskCode) { + Map result = new HashMap<>(); + List taskDependents = + workFlowLineageMapper.queryTaskDependentDepOnProcess(processDefinitionCode); + if (Objects.nonNull(taskCode) && taskCode.longValue()!=0) { + taskDependents = taskDependents.stream() + .filter(taskMainInfo -> taskMainInfo.getUpstreamTaskCode()==taskCode) + .collect(Collectors.toList()); + } + + result.put(Constants.DATA_LIST, taskDependents); + putMsg(result, Status.SUCCESS); + return result; + } } diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageControllerTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageControllerTest.java index b0f7bbc362fa..3d7c84caee8b 100644 --- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageControllerTest.java +++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageControllerTest.java @@ -86,4 +86,12 @@ public void testQueryWorkFlowLineageByCode() { Mockito.when(workFlowLineageService.queryWorkFlowLineageByCode(projectCode, code)).thenReturn(new HashMap<>()); assertDoesNotThrow(() -> workFlowLineageController.queryWorkFlowLineageByCode(user, projectCode, code)); } + + @Test + public void testQueryDownstreamDependentTaskList() { + long projectCode = 1L; + long code = 1L; + Mockito.when(workFlowLineageService.queryDownstreamDependentTasks(projectCode, code, null)).thenReturn(new HashMap<>()); + assertDoesNotThrow(() -> workFlowLineageController.queryDownstreamDependentTaskList(user, projectCode, code, null)); + } } diff --git a/dolphinscheduler-ui/src/service/modules/lineages/index.ts b/dolphinscheduler-ui/src/service/modules/lineages/index.ts index 2eca2d18b0c5..5c89b44e928e 100644 --- a/dolphinscheduler-ui/src/service/modules/lineages/index.ts +++ b/dolphinscheduler-ui/src/service/modules/lineages/index.ts @@ -16,7 +16,8 @@ */ import { axios } from '@/service/service' -import { ProjectCodeReq, WorkflowCodeReq } from './types' +import {DependentTaskReq, ProjectCodeReq, WorkflowCodeReq} from './types' +import {TaskCodeReq} from "@/service/modules/process-task-relation/types"; export function queryWorkFlowList(projectCode: ProjectCodeReq): any { return axios({ @@ -41,3 +42,11 @@ export function queryLineageByWorkFlowCode( method: 'get' }) } + +export function queryDependentTasks(projectCode: number, params: DependentTaskReq): any { + return axios({ + url: `/projects/${projectCode}/lineages/query-dependent-tasks`, + method: 'get', + params + }) +} \ No newline at end of file diff --git a/dolphinscheduler-ui/src/service/modules/lineages/types.ts b/dolphinscheduler-ui/src/service/modules/lineages/types.ts index 63294b7b7e74..843449105375 100644 --- a/dolphinscheduler-ui/src/service/modules/lineages/types.ts +++ b/dolphinscheduler-ui/src/service/modules/lineages/types.ts @@ -47,10 +47,15 @@ interface WorkflowRes { workFlowRelationList: WorkFlowRelationList[] } +interface DependentTaskReq extends WorkflowCodeReq { + taskCode?: number +} + export { ProjectCodeReq, WorkflowCodeReq, WorkFlowNameReq, + DependentTaskReq, WorkflowRes, WorkFlowListRes } diff --git a/dolphinscheduler-ui/src/views/projects/workflow/definition/use-table.ts b/dolphinscheduler-ui/src/views/projects/workflow/definition/use-table.ts index 914c10a15ac9..4f48ccc0fe97 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/definition/use-table.ts +++ b/dolphinscheduler-ui/src/views/projects/workflow/definition/use-table.ts @@ -43,6 +43,8 @@ import { import type { IDefinitionParam } from './types' import type { Router } from 'vue-router' import type { TableColumns, RowKey } from 'naive-ui/es/data-table/src/interface' +import {queryDependentTasks} from "@/service/modules/lineages"; +import {DependentTaskReq} from "@/service/modules/lineages/types"; export function useTable() { const { t } = useI18n() @@ -362,6 +364,17 @@ export function useTable() { | 'ONLINE' } + if (data.releaseState === 'OFFLINE') { + console.log(data.releaseState) + + let dependentTaskReq = {workFlowCode: row.code} as DependentTaskReq + console.log(dependentTaskReq) + + queryDependentTasks(variables.projectCode, dependentTaskReq).then((res: any) => { + console.log(res.data) + }) + } + release(data, variables.projectCode, row.code).then(() => { if (data.releaseState === 'ONLINE') { variables.setTimingDialogShowRef = true From 983ee28159f338535db92bd9c54d38110b3c4094 Mon Sep 17 00:00:00 2001 From: calvin Date: Fri, 23 Feb 2024 20:12:05 +0800 Subject: [PATCH 03/14] confirm to make the workflow offline --- .../dao/entity/TaskMainInfo.java | 5 ++ .../dao/mapper/WorkFlowLineageMapper.xml | 1 + .../src/locales/en_US/project.ts | 2 + .../src/locales/zh_CN/project.ts | 2 + .../projects/workflow/definition/index.tsx | 51 +++++++++++++++++- .../projects/workflow/definition/use-table.ts | 54 ++++++++++++------- 6 files changed, 94 insertions(+), 21 deletions(-) diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/TaskMainInfo.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/TaskMainInfo.java index 7b5492b75b21..16b5887834ad 100644 --- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/TaskMainInfo.java +++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/TaskMainInfo.java @@ -62,6 +62,11 @@ public class TaskMainInfo { */ private Date taskUpdateTime; + /** + * projectCode + */ + private long projectCode; + /** * processDefinitionCode */ diff --git a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.xml b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.xml index de2dbc91da8f..ae6f0f2eaf57 100644 --- a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.xml +++ b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.xml @@ -197,6 +197,7 @@ , td.code as taskCode , td.version as taskVersion , td.task_type as taskType + , pd.project_code as projectCode , ptr.process_definition_code as processDefinitionCode , pd.name as processDefinitionName , pd.version as processDefinitionVersion diff --git a/dolphinscheduler-ui/src/locales/en_US/project.ts b/dolphinscheduler-ui/src/locales/en_US/project.ts index 69aee6a0e2e3..da2d36ef8216 100644 --- a/dolphinscheduler-ui/src/locales/en_US/project.ts +++ b/dolphinscheduler-ui/src/locales/en_US/project.ts @@ -238,6 +238,8 @@ export default { confirm_to_offline: 'Confirm to make the workflow offline?', time_to_online: 'Confirm to make the Scheduler online?', time_to_offline: 'Confirm to make the Scheduler offline?', + warning_dependent_tasks_title: 'Warning', + warning_dependent_tasks_desc: 'The downstream dependent tasks exists. Are you sure to make the workflow offline?', }, task: { on_line: 'Online', diff --git a/dolphinscheduler-ui/src/locales/zh_CN/project.ts b/dolphinscheduler-ui/src/locales/zh_CN/project.ts index 8b84cc7f135f..fcee5ddb63a9 100644 --- a/dolphinscheduler-ui/src/locales/zh_CN/project.ts +++ b/dolphinscheduler-ui/src/locales/zh_CN/project.ts @@ -236,6 +236,8 @@ export default { confirm_to_offline: '是否确定下线该工作流?', time_to_online: '是否确定上线该定时?', time_to_offline: '是否确定下线该定时?', + warning_dependent_tasks_title: '警告', + warning_dependent_tasks_desc: '下游存在依赖, 可能会对下游任务存在影响. 你确定要下线该工作流嘛?', }, task: { on_line: '线上', diff --git a/dolphinscheduler-ui/src/views/projects/workflow/definition/index.tsx b/dolphinscheduler-ui/src/views/projects/workflow/definition/index.tsx index 3eff91673feb..a76c60efcf7d 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/definition/index.tsx +++ b/dolphinscheduler-ui/src/views/projects/workflow/definition/index.tsx @@ -24,11 +24,12 @@ import { NSpace, NTooltip, NPopconfirm, - NModal + NModal, + NEllipsis } from 'naive-ui' import { defineComponent, - getCurrentInstance, + getCurrentInstance, h, onMounted, toRefs, watch @@ -45,6 +46,7 @@ import VersionModal from './components/version-modal' import CopyModal from './components/copy-modal' import type { Router } from 'vue-router' import Search from '@/components/input-search' +import ButtonLink from "@/components/button-link"; export default defineComponent({ name: 'WorkflowDefinitionList', @@ -84,6 +86,11 @@ export default defineComponent({ variables.timingShowRef = true } + + const confirmToOfflineWorkflow = () => { + variables.dependentTaskConfirmShowRef = false + } + const handleSearch = () => { variables.page = 1 requestData() @@ -142,6 +149,7 @@ export default defineComponent({ batchCopyWorkflow, handleCopyUpdateList, confirmToSetWorkflowTiming, + confirmToOfflineWorkflow, ...toRefs(variables), uiSettingStore, trim @@ -318,6 +326,45 @@ export default defineComponent({ maskClosable={false} onPositiveClick={this.confirmToSetWorkflowTiming} /> + + {{ + default: () => ( + +
{t('project.workflow.warning_dependent_tasks_desc')}
+
Dependences:
+ + {this.dependentTaskLinks.map((item: any) =>{ + return ( + + {{ + default: () => + h(NEllipsis, + { + style: 'max-width: 350px;line-height: 1.5' + }, + () => item.text + ) + }} + + ) + })} + +
+ ) + }} +
) } diff --git a/dolphinscheduler-ui/src/views/projects/workflow/definition/use-table.ts b/dolphinscheduler-ui/src/views/projects/workflow/definition/use-table.ts index 4f48ccc0fe97..ee39cdcc55dd 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/definition/use-table.ts +++ b/dolphinscheduler-ui/src/views/projects/workflow/definition/use-table.ts @@ -45,6 +45,8 @@ import type { Router } from 'vue-router' import type { TableColumns, RowKey } from 'naive-ui/es/data-table/src/interface' import {queryDependentTasks} from "@/service/modules/lineages"; import {DependentTaskReq} from "@/service/modules/lineages/types"; +import {TASK_TYPES_MAP} from "@/store/project"; +import {LinkOption} from "@/components/modal/types"; export function useTable() { const { t } = useI18n() @@ -69,7 +71,9 @@ export function useTable() { versionShowRef: ref(false), copyShowRef: ref(false), loadingRef: ref(false), - setTimingDialogShowRef: ref(false) + setTimingDialogShowRef: ref(false), + dependentTaskConfirmShowRef: ref(false), + dependentTaskLinks: [] as LinkOption[], }) const createColumns = (variables: any) => { @@ -365,29 +369,41 @@ export function useTable() { } if (data.releaseState === 'OFFLINE') { - console.log(data.releaseState) - let dependentTaskReq = {workFlowCode: row.code} as DependentTaskReq - console.log(dependentTaskReq) + variables.dependentTaskLinks = [] queryDependentTasks(variables.projectCode, dependentTaskReq).then((res: any) => { - console.log(res.data) - }) - } + res.filter((item: any) => item.processDefinitionCode!==row.code && item.taskType===TASK_TYPES_MAP.DEPENDENT.alias).forEach((item: any) => { + variables.dependentTaskLinks.push( + { + text: item.processDefinitionName+'->'+item.taskName, + show: true, + action: () => { + router.push({ path: `/projects/${item.projectCode}/workflow/definitions/${item.processDefinitionCode}`}) + }, + } + ) - release(data, variables.projectCode, row.code).then(() => { - if (data.releaseState === 'ONLINE') { - variables.setTimingDialogShowRef = true - variables.row = row - } else { - window.$message.success(t('project.workflow.success')) - } - getTableData({ - pageSize: variables.pageSize, - pageNo: variables.page, - searchVal: variables.searchVal + }) + if (variables.dependentTaskLinks.length > 0) { + variables.dependentTaskConfirmShowRef = true + } }) - }) + } else { + release(data, variables.projectCode, row.code).then(() => { + if (data.releaseState === 'ONLINE') { + variables.setTimingDialogShowRef = true + variables.row = row + } else { + window.$message.success(t('project.workflow.success')) + } + getTableData({ + pageSize: variables.pageSize, + pageNo: variables.page, + searchVal: variables.searchVal + }) + }) + } } const releaseScheduler = (row: any) => { From f912652179d6faf3efb9a3e3fa9092158a10ce31 Mon Sep 17 00:00:00 2001 From: calvin Date: Wed, 28 Feb 2024 23:49:25 +0800 Subject: [PATCH 04/14] query dependent tasks --- .../impl/WorkFlowLineageServiceImpl.java | 10 +- .../dao/mapper/WorkFlowLineageMapper.java | 3 +- .../dao/mapper/WorkFlowLineageMapper.xml | 5 +- .../src/locales/en_US/project.ts | 4 + .../src/locales/zh_CN/project.ts | 6 +- .../components/dag/dag-context-menu.tsx | 45 ++++++-- .../definition/components/table-action.tsx | 107 ++++++++++++++++-- .../projects/workflow/definition/index.tsx | 45 -------- .../projects/workflow/definition/use-table.ts | 60 +++------- 9 files changed, 164 insertions(+), 121 deletions(-) diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkFlowLineageServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkFlowLineageServiceImpl.java index b0535a97dba2..4c812085b6c7 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkFlowLineageServiceImpl.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkFlowLineageServiceImpl.java @@ -279,7 +279,7 @@ public Optional taskDepOnTaskMsg(long projectCode, long processDefinitio public Set queryTaskDepOnProcess(long projectCode, long processDefinitionCode) { Set taskMainInfos = new HashSet<>(); List taskDependents = - workFlowLineageMapper.queryTaskDependentDepOnProcess(processDefinitionCode); + workFlowLineageMapper.queryTaskDependentOnProcess(processDefinitionCode, 0); List taskSubProcess = workFlowLineageMapper.queryTaskSubProcessDepOnProcess(projectCode, processDefinitionCode); taskMainInfos.addAll(taskDependents); @@ -300,13 +300,7 @@ public Map queryDownstreamDependentTasks(Long projectCode, Long processDefinitionCode, Long taskCode) { Map result = new HashMap<>(); List taskDependents = - workFlowLineageMapper.queryTaskDependentDepOnProcess(processDefinitionCode); - if (Objects.nonNull(taskCode) && taskCode.longValue()!=0) { - taskDependents = taskDependents.stream() - .filter(taskMainInfo -> taskMainInfo.getUpstreamTaskCode()==taskCode) - .collect(Collectors.toList()); - } - + workFlowLineageMapper.queryTaskDependentOnProcess(processDefinitionCode, Objects.isNull(taskCode)? 0:taskCode.longValue()); result.put(Constants.DATA_LIST, taskDependents); putMsg(result, Status.SUCCESS); return result; diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.java index cd12bd18b59f..804b49da08c8 100644 --- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.java +++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.java @@ -125,9 +125,10 @@ List queryTaskSubProcessDepOnProcess(@Param("projectCode") long pr * `queryTaskDepOnTask` are in the result of method `queryTaskDepOnProcess`. * * @param processDefinitionCode Process definition code want to query tasks dependence + * @param taskCode Task code want to query tasks dependence * @return List of TaskMainInfo */ - List queryTaskDependentDepOnProcess(@Param("processDefinitionCode") long processDefinitionCode); + List queryTaskDependentOnProcess(@Param("processDefinitionCode") long processDefinitionCode, @Param("taskCode") long taskCode); /** * Query all tasks depend on task, only downstream task support currently(from dependent task type). diff --git a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.xml b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.xml index ae6f0f2eaf57..51c60394be36 100644 --- a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.xml +++ b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.xml @@ -191,7 +191,7 @@
- select td.id , td.name as taskName , td.code as taskCode @@ -213,6 +213,9 @@ and ptr.process_definition_code != #{processDefinitionCode} and td.task_params like concat('%"definitionCode":', #{processDefinitionCode}, '%') + + and (td.task_params like concat('%"depTaskCode":', #{taskCode}, '%') or td.task_params like concat('%"depTaskCode":-1%')) + diff --git a/dolphinscheduler-ui/src/locales/en_US/project.ts b/dolphinscheduler-ui/src/locales/en_US/project.ts index da2d36ef8216..310364c08135 100644 --- a/dolphinscheduler-ui/src/locales/en_US/project.ts +++ b/dolphinscheduler-ui/src/locales/en_US/project.ts @@ -240,6 +240,10 @@ export default { time_to_offline: 'Confirm to make the Scheduler offline?', warning_dependent_tasks_title: 'Warning', warning_dependent_tasks_desc: 'The downstream dependent tasks exists. Are you sure to make the workflow offline?', + warning_dependencies: 'Dependencies:', + delete_validate_dependent_tasks_desc: 'The downstream dependent tasks exists. You can not delete the workflow.', + warning_offline_scheduler_dependent_tasks_desc: 'The downstream dependent tasks exists. Are you sure to make the scheduler offline?', + delete_task_validate_dependent_tasks_desc: 'The downstream dependent tasks exists. You can not delete the task. Dependencies:', }, task: { on_line: 'Online', diff --git a/dolphinscheduler-ui/src/locales/zh_CN/project.ts b/dolphinscheduler-ui/src/locales/zh_CN/project.ts index fcee5ddb63a9..8554fafe8342 100644 --- a/dolphinscheduler-ui/src/locales/zh_CN/project.ts +++ b/dolphinscheduler-ui/src/locales/zh_CN/project.ts @@ -237,7 +237,11 @@ export default { time_to_online: '是否确定上线该定时?', time_to_offline: '是否确定下线该定时?', warning_dependent_tasks_title: '警告', - warning_dependent_tasks_desc: '下游存在依赖, 可能会对下游任务存在影响. 你确定要下线该工作流嘛?', + warning_dependent_tasks_desc: '下游存在依赖, 下线操作可能会对下游任务产生影响. 你确定要下线该工作流嘛?', + warning_dependencies: '依赖如下:', + delete_validate_dependent_tasks_desc: '下游存在依赖,你不能删除该工作流', + warning_offline_scheduler_dependent_tasks_desc: '下游存在依赖, 下线操作可能会对下游任务产生影响. 你确定要下线该定时嘛?', + delete_task_validate_dependent_tasks_desc: '下游存在依赖,你不能删除该任务. 依赖如下:', }, task: { on_line: '线上', diff --git a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-context-menu.tsx b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-context-menu.tsx index 3fd3ca0b5a8a..65a2ed11c004 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-context-menu.tsx +++ b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-context-menu.tsx @@ -17,13 +17,16 @@ import { genTaskCodeList } from '@/service/modules/task-definition' import type { Cell } from '@antv/x6' -import { defineComponent, onMounted, PropType, inject, ref } from 'vue' +import { defineComponent, onMounted, PropType, inject, ref, h } from 'vue' import { useI18n } from 'vue-i18n' -import { useRoute } from 'vue-router' +import {Router, useRoute, useRouter} from 'vue-router' import styles from './menu.module.scss' import { uuid } from '@/common/common' import { IWorkflowTaskInstance } from './types' -import { NButton } from 'naive-ui' +import {NButton} from 'naive-ui' +import {DependentTaskReq} from "@/service/modules/lineages/types"; +import {queryDependentTasks} from "@/service/modules/lineages"; +import {TASK_TYPES_MAP} from "@/store/project"; const props = { startDisplay: { @@ -76,7 +79,10 @@ export default defineComponent({ setup(props, ctx) { const graph = inject('graph', ref()) const route = useRoute() + const router: Router = useRouter() const projectCode = Number(route.params.projectCode) + const workflowCode = Number(route.params.code) + const { t } = useI18n() const hide = () => { ctx.emit('hide', false) @@ -134,9 +140,32 @@ export default defineComponent({ }) } - const handleDelete = () => { - graph.value?.removeCell(props.cell) - ctx.emit('removeTasks', [Number(props.cell?.id)]) + const handleDelete = async () => { + let taskCode = props.cell?.id + let dependentTasks = [] as any[] + if (workflowCode && taskCode) { + dependentTasks = await queryDependentTaskLinks(taskCode) + } + if (dependentTasks.length > 0) { + window.$message.error(t('project.workflow.delete_task_validate_dependent_tasks_desc') + dependentTasks, { duration: 5000 }) + } else { + graph.value?.removeCell(props.cell) + ctx.emit('removeTasks', [Number(props.cell?.id)]) + } + } + + const queryDependentTaskLinks = async (taskCode: any) => { + let tasks = [] as any + if (workflowCode && taskCode) { + let dependentTaskReq = {workFlowCode: workflowCode, taskCode: taskCode} as DependentTaskReq + const res = await queryDependentTasks(projectCode, dependentTaskReq) + console.log(res) + res.filter((item: any) => item.processDefinitionCode !== workflowCode && item.taskType === TASK_TYPES_MAP.DEPENDENT.alias) + .forEach((item: any) => { + tasks.push(item.processDefinitionName + '->' + item.taskName) + }) + } + return tasks } onMounted(() => { @@ -189,8 +218,8 @@ export default defineComponent({ {t('project.node.copy')} {t('project.node.delete')} diff --git a/dolphinscheduler-ui/src/views/projects/workflow/definition/components/table-action.tsx b/dolphinscheduler-ui/src/views/projects/workflow/definition/components/table-action.tsx index 0cc08bc44ce0..8ba6fca4f687 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/definition/components/table-action.tsx +++ b/dolphinscheduler-ui/src/views/projects/workflow/definition/components/table-action.tsx @@ -15,8 +15,8 @@ * limitations under the License. */ -import { defineComponent, PropType, toRefs } from 'vue' -import { NSpace, NTooltip, NButton, NIcon, NPopconfirm } from 'naive-ui' +import {defineComponent, PropType, toRefs, h, computed, watch, ref} from 'vue' +import {NSpace, NTooltip, NButton, NIcon, NPopconfirm, NEllipsis, darkTheme} from 'naive-ui' import { DeleteOutlined, DownloadOutlined, @@ -33,6 +33,11 @@ import { } from '@vicons/antd' import { useI18n } from 'vue-i18n' import { IDefinitionData } from '../types' +import {queryDependentTasks} from "@/service/modules/lineages"; +import {TASK_TYPES_MAP} from "@/store/project"; +import {DependentTaskReq} from "@/service/modules/lineages/types"; +import {Router, useRouter} from "vue-router"; +import ButtonLink from "@/components/button-link"; const props = { row: { type: Object as PropType @@ -95,6 +100,7 @@ export default defineComponent({ const handleReleaseScheduler = () => { ctx.emit('releaseScheduler') } + return { handleEditWorkflow, handleStartWorkflow, @@ -114,6 +120,62 @@ export default defineComponent({ const releaseState = this.row?.releaseState const scheduleReleaseState = this.row?.scheduleReleaseState const schedule = this.row?.schedule + const dependentTaskLinks = [] as any[] + const router: Router = useRouter() + + const confirmPositiveText = ref() + + const queryDependentTaskLinks = () => { + if (this.row?.code) { + let dependentTaskReq = {workFlowCode: this.row.code} as DependentTaskReq + queryDependentTasks(this.row?.projectCode, dependentTaskReq).then((res: any) => { + res.filter((item: any) => item.processDefinitionCode !== this.row?.code && item.taskType === TASK_TYPES_MAP.DEPENDENT.alias) + .forEach((item: any) => { + dependentTaskLinks.push( + { + text: item.processDefinitionName + '->' + item.taskName, + show: true, + action: () => { + router.push({path: `/projects/${item.projectCode}/workflow/definitions/${item.processDefinitionCode}`}) + }, + } + ) + confirmPositiveText.value = dependentTaskLinks.length > 0 ? null : t('project.workflow.confirm') + }) + }) + } + } + + queryDependentTaskLinks() + + const renderDownstreamDependencies = () => { + if (dependentTaskLinks.length > 0) { + return h( + +
{t('project.workflow.warning_dependencies')}
+ {dependentTaskLinks.map((item: any) => { + return ( + + {{ + default: () => + h(NEllipsis, + { + style: 'max-width: 350px;line-height: 1.5' + }, + () => item.text + ) + }} + + ) + })} +
+ ) + } + } + return ( @@ -164,12 +226,18 @@ export default defineComponent({ ? t('project.workflow.down_line') : t('project.workflow.up_line'), trigger: () => ( - + {{ - default: () => - releaseState === 'ONLINE' - ? t('project.workflow.confirm_to_offline') - : t('project.workflow.confirm_to_online'), + default: () => releaseState === 'OFFLINE' ? t('project.workflow.confirm_to_online') + : h( + dependentTaskLinks.length>0? ( + +
{t('project.workflow.warning_dependent_tasks_desc')}
+ {renderDownstreamDependencies()} +
+ ) + :
{t('project.workflow.confirm_to_offline')}
+ ), trigger: () => ( ( - + {{ default: () => - scheduleReleaseState === 'ONLINE' - ? t('project.workflow.time_to_offline') - : t('project.workflow.time_to_online'), + scheduleReleaseState === 'OFFLINE' ? t('project.workflow.time_to_online') + : h( + dependentTaskLinks.length>0? ( + +
{t('project.workflow.warning_offline_scheduler_dependent_tasks_desc')}
+ {renderDownstreamDependencies()} +
+ ) + :
{t('project.workflow.time_to_offline')}
+ ), trigger: () => ( ( {{ - default: () => t('project.workflow.delete_confirm'), + default: () => dependentTaskLinks.length>0? ( + +
{t('project.workflow.delete_validate_dependent_tasks_desc')}
+ {renderDownstreamDependencies()} +
+ ) + :
{t('project.workflow.delete_confirm')}
, trigger: () => ( { - variables.dependentTaskConfirmShowRef = false - } - const handleSearch = () => { variables.page = 1 requestData() @@ -149,7 +144,6 @@ export default defineComponent({ batchCopyWorkflow, handleCopyUpdateList, confirmToSetWorkflowTiming, - confirmToOfflineWorkflow, ...toRefs(variables), uiSettingStore, trim @@ -326,45 +320,6 @@ export default defineComponent({ maskClosable={false} onPositiveClick={this.confirmToSetWorkflowTiming} /> - - {{ - default: () => ( - -
{t('project.workflow.warning_dependent_tasks_desc')}
-
Dependences:
- - {this.dependentTaskLinks.map((item: any) =>{ - return ( - - {{ - default: () => - h(NEllipsis, - { - style: 'max-width: 350px;line-height: 1.5' - }, - () => item.text - ) - }} - - ) - })} - -
- ) - }} -
) } diff --git a/dolphinscheduler-ui/src/views/projects/workflow/definition/use-table.ts b/dolphinscheduler-ui/src/views/projects/workflow/definition/use-table.ts index ee39cdcc55dd..f11d329002de 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/definition/use-table.ts +++ b/dolphinscheduler-ui/src/views/projects/workflow/definition/use-table.ts @@ -43,10 +43,6 @@ import { import type { IDefinitionParam } from './types' import type { Router } from 'vue-router' import type { TableColumns, RowKey } from 'naive-ui/es/data-table/src/interface' -import {queryDependentTasks} from "@/service/modules/lineages"; -import {DependentTaskReq} from "@/service/modules/lineages/types"; -import {TASK_TYPES_MAP} from "@/store/project"; -import {LinkOption} from "@/components/modal/types"; export function useTable() { const { t } = useI18n() @@ -72,8 +68,6 @@ export function useTable() { copyShowRef: ref(false), loadingRef: ref(false), setTimingDialogShowRef: ref(false), - dependentTaskConfirmShowRef: ref(false), - dependentTaskLinks: [] as LinkOption[], }) const createColumns = (variables: any) => { @@ -364,46 +358,22 @@ export function useTable() { const data = { name: row.name, releaseState: (row.releaseState === 'ONLINE' ? 'OFFLINE' : 'ONLINE') as - | 'OFFLINE' - | 'ONLINE' + | 'OFFLINE' + | 'ONLINE' } - - if (data.releaseState === 'OFFLINE') { - let dependentTaskReq = {workFlowCode: row.code} as DependentTaskReq - - variables.dependentTaskLinks = [] - queryDependentTasks(variables.projectCode, dependentTaskReq).then((res: any) => { - res.filter((item: any) => item.processDefinitionCode!==row.code && item.taskType===TASK_TYPES_MAP.DEPENDENT.alias).forEach((item: any) => { - variables.dependentTaskLinks.push( - { - text: item.processDefinitionName+'->'+item.taskName, - show: true, - action: () => { - router.push({ path: `/projects/${item.projectCode}/workflow/definitions/${item.processDefinitionCode}`}) - }, - } - ) - - }) - if (variables.dependentTaskLinks.length > 0) { - variables.dependentTaskConfirmShowRef = true - } - }) - } else { - release(data, variables.projectCode, row.code).then(() => { - if (data.releaseState === 'ONLINE') { - variables.setTimingDialogShowRef = true - variables.row = row - } else { - window.$message.success(t('project.workflow.success')) - } - getTableData({ - pageSize: variables.pageSize, - pageNo: variables.page, - searchVal: variables.searchVal - }) + release(data, variables.projectCode, row.code).then(() => { + if (data.releaseState === 'ONLINE') { + variables.setTimingDialogShowRef = true + variables.row = row + } else { + window.$message.success(t('project.workflow.success')) + } + getTableData({ + pageSize: variables.pageSize, + pageNo: variables.page, + searchVal: variables.searchVal }) - } + }) } const releaseScheduler = (row: any) => { @@ -503,6 +473,6 @@ export function useTable() { getTableData, batchDeleteWorkflow, batchExportWorkflow, - batchCopyWorkflow + batchCopyWorkflow, } } From 1e718f33d72838d3ceaa1638316defa24e6cb90d Mon Sep 17 00:00:00 2001 From: calvin Date: Sat, 2 Mar 2024 18:57:55 +0800 Subject: [PATCH 05/14] check dependencies --- .../src/locales/en_US/project.ts | 4 +- .../src/locales/zh_CN/project.ts | 4 +- .../projects/task/definition/batch-task.tsx | 55 ++++++++- .../views/projects/task/definition/index.tsx | 3 +- .../projects/task/definition/use-table.ts | 35 ++++-- .../src/views/projects/use-dependencies.ts | 111 +++++++++++++++++ .../components/dag/dag-context-menu.tsx | 22 +--- .../workflow/components/dag/dag-toolbar.tsx | 15 ++- .../definition/components/table-action.tsx | 92 +------------- .../projects/workflow/definition/index.tsx | 112 +++++++++++++++++- .../workflow/definition/timing/use-table.ts | 40 +++++-- .../projects/workflow/definition/use-table.ts | 95 ++++++++++----- .../views/projects/workflow/timing/index.tsx | 71 ++++++++++- 13 files changed, 490 insertions(+), 169 deletions(-) create mode 100644 dolphinscheduler-ui/src/views/projects/use-dependencies.ts diff --git a/dolphinscheduler-ui/src/locales/en_US/project.ts b/dolphinscheduler-ui/src/locales/en_US/project.ts index 310364c08135..2e632c260b83 100644 --- a/dolphinscheduler-ui/src/locales/en_US/project.ts +++ b/dolphinscheduler-ui/src/locales/en_US/project.ts @@ -244,6 +244,7 @@ export default { delete_validate_dependent_tasks_desc: 'The downstream dependent tasks exists. You can not delete the workflow.', warning_offline_scheduler_dependent_tasks_desc: 'The downstream dependent tasks exists. Are you sure to make the scheduler offline?', delete_task_validate_dependent_tasks_desc: 'The downstream dependent tasks exists. You can not delete the task. Dependencies:', + warning_delete_scheduler_dependent_tasks_desc: 'The downstream dependent tasks exists. Are you sure to delete the scheduler.?', }, task: { on_line: 'Online', @@ -312,7 +313,8 @@ export default { startup_parameter: 'Startup Parameter', whether_dry_run: 'Whether Dry-Run', please_choose: 'Please Choose', - remove_task_cache: 'Clear cache' + remove_task_cache: 'Clear cache', + delete_validate_dependent_tasks_desc: 'The downstream dependent tasks exists. You can not delete the task.', }, dag: { create: 'Create Workflow', diff --git a/dolphinscheduler-ui/src/locales/zh_CN/project.ts b/dolphinscheduler-ui/src/locales/zh_CN/project.ts index 8554fafe8342..451a2a824c60 100644 --- a/dolphinscheduler-ui/src/locales/zh_CN/project.ts +++ b/dolphinscheduler-ui/src/locales/zh_CN/project.ts @@ -242,6 +242,7 @@ export default { delete_validate_dependent_tasks_desc: '下游存在依赖,你不能删除该工作流', warning_offline_scheduler_dependent_tasks_desc: '下游存在依赖, 下线操作可能会对下游任务产生影响. 你确定要下线该定时嘛?', delete_task_validate_dependent_tasks_desc: '下游存在依赖,你不能删除该任务. 依赖如下:', + warning_delete_scheduler_dependent_tasks_desc: '下游存在依赖, 删除定时可能会对下游任务产生影响. 你确定要删除该定时嘛?', }, task: { on_line: '线上', @@ -310,7 +311,8 @@ export default { startup_parameter: '启动参数', whether_dry_run: '是否空跑', please_choose: '请选择', - remove_task_cache: '清除缓存' + remove_task_cache: '清除缓存', + delete_validate_dependent_tasks_desc: '下游存在依赖,你不能删除该任务定义', }, dag: { create: '创建工作流', diff --git a/dolphinscheduler-ui/src/views/projects/task/definition/batch-task.tsx b/dolphinscheduler-ui/src/views/projects/task/definition/batch-task.tsx index 500d63ddb665..63ad10d4b8d9 100644 --- a/dolphinscheduler-ui/src/views/projects/task/definition/batch-task.tsx +++ b/dolphinscheduler-ui/src/views/projects/task/definition/batch-task.tsx @@ -17,7 +17,7 @@ import { defineComponent, - getCurrentInstance, + getCurrentInstance, h, onMounted, toRefs, watch @@ -25,9 +25,9 @@ import { import { useRoute } from 'vue-router' import { NButton, - NDataTable, + NDataTable, NEllipsis, NIcon, - NInput, + NInput, NModal, NPagination, NSelect, NSpace @@ -41,6 +41,8 @@ import Card from '@/components/card' import VersionModal from './components/version-modal' import TaskModal from '@/views/projects/task/components/node/detail-modal' import type { INodeData } from './types' +import {release} from "@/service/modules/process-definition"; +import ButtonLink from "@/components/button-link"; const BatchTaskDefinition = defineComponent({ name: 'batch-task-definition', @@ -102,6 +104,34 @@ const BatchTaskDefinition = defineComponent({ } } + const renderDownstreamDependencies = () => { + if (variables.dependentTaskLinksRef.length > 0) { + return h( + +
{t('project.workflow.warning_dependencies')}
+ {variables.dependentTaskLinksRef.map((item: any) => { + return ( + + {{ + default: () => + h(NEllipsis, + { + style: 'max-width: 350px;line-height: 1.5' + }, + () => item.text + ) + }} + + ) + })} +
+ ) + } + } + const trim = getCurrentInstance()?.appContext.config.globalProperties.trim onMounted(() => { createColumns(variables) @@ -125,6 +155,7 @@ const BatchTaskDefinition = defineComponent({ onCreate, onTaskSubmit, onTaskCancel, + renderDownstreamDependencies, projectCode, trim } @@ -213,6 +244,24 @@ const BatchTaskDefinition = defineComponent({ readonly={this.taskReadonly} saving={this.taskSaving} /> + + {{ + default: () => ( + +
{t('project.workflow.delete_validate_dependent_tasks_desc')}
+ {this.renderDownstreamDependencies()} +
+ ) + }} +
) } diff --git a/dolphinscheduler-ui/src/views/projects/task/definition/index.tsx b/dolphinscheduler-ui/src/views/projects/task/definition/index.tsx index d762e4718bbe..cc92064617be 100644 --- a/dolphinscheduler-ui/src/views/projects/task/definition/index.tsx +++ b/dolphinscheduler-ui/src/views/projects/task/definition/index.tsx @@ -17,9 +17,10 @@ import { defineComponent } from 'vue' import { useI18n } from 'vue-i18n' -import { NTabPane, NTabs } from 'naive-ui' +import {NModal, NSpace, NTabPane, NTabs} from 'naive-ui' import BatchTaskDefinition from './batch-task' import StreamTaskDefinition from './stream-task' +import {useTable} from "@/views/projects/task/definition/use-stream-table"; const TaskDefinition = defineComponent({ name: 'task-definition', diff --git a/dolphinscheduler-ui/src/views/projects/task/definition/use-table.ts b/dolphinscheduler-ui/src/views/projects/task/definition/use-table.ts index 78e59b9e70bb..533299ecb584 100644 --- a/dolphinscheduler-ui/src/views/projects/task/definition/use-table.ts +++ b/dolphinscheduler-ui/src/views/projects/task/definition/use-table.ts @@ -48,12 +48,15 @@ import type { TaskDefinitionRes } from '@/service/modules/task-definition/types' import type { IRecord } from './types' +import {useDependencies} from "@/views/projects/use-dependencies"; export function useTable(onEdit: Function) { const { t } = useI18n() const route = useRoute() const projectCode = Number(route.params.projectCode) + const {getDependentTaskLinksByTask} = useDependencies() + const createColumns = (variables: any) => { variables.columns = [ { @@ -260,22 +263,32 @@ export function useTable(onEdit: Function) { totalPage: ref(1), taskType: ref(null), showVersionModalRef: ref(false), + dependentTasksShowRef: ref(false), + dependentTaskLinksRef: ref([]), row: {}, loadingRef: ref(false) }) const handleDelete = (row: any) => { - deleteTaskDefinition({ code: row.taskCode }, { projectCode }).then(() => { - getTableData({ - pageSize: variables.pageSize, - pageNo: - variables.tableData.length === 1 && variables.page > 1 - ? variables.page - 1 - : variables.page, - searchTaskName: variables.searchTaskName, - searchWorkflowName: variables.searchWorkflowName, - taskType: variables.taskType - }) + variables.row = row + getDependentTaskLinksByTask(projectCode, row.processDefinitionCode, row.taskCode).then((res: any) =>{ + if (res && res.length > 0) { + variables.dependentTaskLinksRef = res + variables.dependentTasksShowRef = true + } else { + deleteTaskDefinition({ code: row.taskCode }, { projectCode }).then(() => { + getTableData({ + pageSize: variables.pageSize, + pageNo: + variables.tableData.length === 1 && variables.page > 1 + ? variables.page - 1 + : variables.page, + searchTaskName: variables.searchTaskName, + searchWorkflowName: variables.searchWorkflowName, + taskType: variables.taskType + }) + }) + } }) } diff --git a/dolphinscheduler-ui/src/views/projects/use-dependencies.ts b/dolphinscheduler-ui/src/views/projects/use-dependencies.ts new file mode 100644 index 000000000000..8a29c8d8ca70 --- /dev/null +++ b/dolphinscheduler-ui/src/views/projects/use-dependencies.ts @@ -0,0 +1,111 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {DependentTaskReq} from "@/service/modules/lineages/types"; +import {queryDependentTasks} from "@/service/modules/lineages"; +import {TASK_TYPES_MAP} from "@/store/project"; +import {Router, useRouter} from "vue-router"; + +export function useDependencies() { + + const router: Router = useRouter() + + const getDependentTasksBySingleTask = async (projectCode: any, workflowCode: any, taskCode: any) => { + let tasks = [] as any + if (workflowCode && taskCode) { + let dependentTaskReq = {workFlowCode: workflowCode, taskCode: taskCode} as DependentTaskReq + const res = await queryDependentTasks(projectCode, dependentTaskReq) + res.filter((item: any) => item.processDefinitionCode !== workflowCode && item.taskType === TASK_TYPES_MAP.DEPENDENT.alias) + .forEach((item: any) => { + tasks.push(item.processDefinitionName + '->' + item.taskName) + }) + } + return tasks + } + + const getDependentTasksByWorkflow = async (projectCode: any, workflowCode: any) => { + let tasks = [] as any + if (workflowCode) { + let dependentTaskReq = {workFlowCode: workflowCode} as DependentTaskReq + const res = await queryDependentTasks(projectCode, dependentTaskReq) + res.filter((item: any) => item.processDefinitionCode !== workflowCode && item.taskType === TASK_TYPES_MAP.DEPENDENT.alias) + .forEach((item: any) => { + tasks.push(item.processDefinitionName + '->' + item.taskName) + }) + } + return tasks + } + + const getDependentTasksByMultipleTasks = async (projectCode: any, workflowCode: any, taskCodes: any[]) => { + let tasks = [] as any + if (workflowCode && taskCodes?.length>0) { + for(const taskCode of taskCodes) { + const res = await getDependentTasksBySingleTask(projectCode, workflowCode, taskCode) + if (res?.length >0) { + tasks = tasks.concat(res) + } + } + } + return tasks + } + + const getDependentTaskLinks = async (projectCode: any, workflowCode: any) => { + let dependentTaskReq = {workFlowCode: workflowCode} as DependentTaskReq + let dependentTaskLinks = [] as any + if (workflowCode && projectCode) { + await queryDependentTasks(projectCode, dependentTaskReq).then((res: any) => { + res.filter((item: any) => item.processDefinitionCode !== workflowCode && item.taskType === TASK_TYPES_MAP.DEPENDENT.alias) + .forEach((item: any) => { + dependentTaskLinks.push( + { + text: item.processDefinitionName + '->' + item.taskName, + show: true, + action: () => { + router.push({path: `/projects/${item.projectCode}/workflow/definitions/${item.processDefinitionCode}`}) + }, + } + ) + }) + }) + } + return dependentTaskLinks + } + + const getDependentTaskLinksByTask = async (projectCode: any, workflowCode: any, taskCode: any) => { + let dependentTaskReq = {workFlowCode: workflowCode, taskCode: taskCode} as DependentTaskReq + let dependentTaskLinks = [] as any + if (workflowCode && projectCode) { + await queryDependentTasks(projectCode, dependentTaskReq).then((res: any) => { + res.filter((item: any) => item.processDefinitionCode !== workflowCode && item.taskType === TASK_TYPES_MAP.DEPENDENT.alias) + .forEach((item: any) => { + dependentTaskLinks.push( + { + text: item.processDefinitionName + '->' + item.taskName, + show: true, + action: () => { + router.push({path: `/projects/${item.projectCode}/workflow/definitions/${item.processDefinitionCode}`}) + }, + } + ) + }) + }) + } + return dependentTaskLinks + } + + return { getDependentTasksBySingleTask, getDependentTasksByMultipleTasks, getDependentTaskLinks, getDependentTasksByWorkflow, getDependentTaskLinksByTask } +} diff --git a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-context-menu.tsx b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-context-menu.tsx index 65a2ed11c004..77f19a2b6ca8 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-context-menu.tsx +++ b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-context-menu.tsx @@ -27,6 +27,7 @@ import {NButton} from 'naive-ui' import {DependentTaskReq} from "@/service/modules/lineages/types"; import {queryDependentTasks} from "@/service/modules/lineages"; import {TASK_TYPES_MAP} from "@/store/project"; +import {useDependencies} from "@/views/projects/use-dependencies"; const props = { startDisplay: { @@ -84,6 +85,8 @@ export default defineComponent({ const workflowCode = Number(route.params.code) const { t } = useI18n() + const { getDependentTasksBySingleTask } = useDependencies() + const hide = () => { ctx.emit('hide', false) } @@ -142,10 +145,7 @@ export default defineComponent({ const handleDelete = async () => { let taskCode = props.cell?.id - let dependentTasks = [] as any[] - if (workflowCode && taskCode) { - dependentTasks = await queryDependentTaskLinks(taskCode) - } + let dependentTasks = await getDependentTasksBySingleTask(projectCode, workflowCode, taskCode) if (dependentTasks.length > 0) { window.$message.error(t('project.workflow.delete_task_validate_dependent_tasks_desc') + dependentTasks, { duration: 5000 }) } else { @@ -154,20 +154,6 @@ export default defineComponent({ } } - const queryDependentTaskLinks = async (taskCode: any) => { - let tasks = [] as any - if (workflowCode && taskCode) { - let dependentTaskReq = {workFlowCode: workflowCode, taskCode: taskCode} as DependentTaskReq - const res = await queryDependentTasks(projectCode, dependentTaskReq) - console.log(res) - res.filter((item: any) => item.processDefinitionCode !== workflowCode && item.taskType === TASK_TYPES_MAP.DEPENDENT.alias) - .forEach((item: any) => { - tasks.push(item.processDefinitionName + '->' + item.taskName) - }) - } - return tasks - } - onMounted(() => { document.addEventListener('click', () => { hide() diff --git a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-toolbar.tsx b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-toolbar.tsx index d7d517b86737..8c7dfc69b68b 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-toolbar.tsx +++ b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-toolbar.tsx @@ -49,6 +49,7 @@ import type { Graph } from '@antv/x6' import StartupParam from './dag-startup-param' import VariablesView from '@/views/projects/workflow/instance/components/variables-view' import { WorkflowDefinition, WorkflowInstance } from './types' +import {useDependencies} from "@/views/projects/use-dependencies"; const props = { layoutToggle: { @@ -79,6 +80,9 @@ export default defineComponent({ const graph = inject>('graph', ref()) const router = useRouter() const route = useRoute() + const projectCode = Number(route.params.projectCode) + const workflowCode = Number(route.params.code) + const { getDependentTasksByMultipleTasks } = useDependencies() /** * Node search and navigate @@ -164,15 +168,20 @@ export default defineComponent({ /** * Delete selected edges and nodes */ - const removeCells = () => { + const removeCells = async () => { if (graph.value) { const cells = graph.value.getSelectedCells() if (cells) { const codes = cells .filter((cell) => cell.isNode()) .map((cell) => +cell.id) - context.emit('removeTasks', codes, cells) - graph.value?.removeCells(cells) + const dependentTasks = await getDependentTasksByMultipleTasks(projectCode, workflowCode, codes) + if (dependentTasks.length > 0) { + window.$message.error(t('project.workflow.delete_task_validate_dependent_tasks_desc') + dependentTasks, { duration: 5000 }) + } else { + context.emit('removeTasks', codes, cells) + graph.value?.removeCells(cells) + } } } } diff --git a/dolphinscheduler-ui/src/views/projects/workflow/definition/components/table-action.tsx b/dolphinscheduler-ui/src/views/projects/workflow/definition/components/table-action.tsx index 8ba6fca4f687..2b4702feaa83 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/definition/components/table-action.tsx +++ b/dolphinscheduler-ui/src/views/projects/workflow/definition/components/table-action.tsx @@ -38,6 +38,7 @@ import {TASK_TYPES_MAP} from "@/store/project"; import {DependentTaskReq} from "@/service/modules/lineages/types"; import {Router, useRouter} from "vue-router"; import ButtonLink from "@/components/button-link"; +import {useDependencies} from "@/views/projects/use-dependencies"; const props = { row: { type: Object as PropType @@ -120,61 +121,6 @@ export default defineComponent({ const releaseState = this.row?.releaseState const scheduleReleaseState = this.row?.scheduleReleaseState const schedule = this.row?.schedule - const dependentTaskLinks = [] as any[] - const router: Router = useRouter() - - const confirmPositiveText = ref() - - const queryDependentTaskLinks = () => { - if (this.row?.code) { - let dependentTaskReq = {workFlowCode: this.row.code} as DependentTaskReq - queryDependentTasks(this.row?.projectCode, dependentTaskReq).then((res: any) => { - res.filter((item: any) => item.processDefinitionCode !== this.row?.code && item.taskType === TASK_TYPES_MAP.DEPENDENT.alias) - .forEach((item: any) => { - dependentTaskLinks.push( - { - text: item.processDefinitionName + '->' + item.taskName, - show: true, - action: () => { - router.push({path: `/projects/${item.projectCode}/workflow/definitions/${item.processDefinitionCode}`}) - }, - } - ) - confirmPositiveText.value = dependentTaskLinks.length > 0 ? null : t('project.workflow.confirm') - }) - }) - } - } - - queryDependentTaskLinks() - - const renderDownstreamDependencies = () => { - if (dependentTaskLinks.length > 0) { - return h( - -
{t('project.workflow.warning_dependencies')}
- {dependentTaskLinks.map((item: any) => { - return ( - - {{ - default: () => - h(NEllipsis, - { - style: 'max-width: 350px;line-height: 1.5' - }, - () => item.text - ) - }} - - ) - })} -
- ) - } - } return ( @@ -226,18 +172,9 @@ export default defineComponent({ ? t('project.workflow.down_line') : t('project.workflow.up_line'), trigger: () => ( - + {{ - default: () => releaseState === 'OFFLINE' ? t('project.workflow.confirm_to_online') - : h( - dependentTaskLinks.length>0? ( - -
{t('project.workflow.warning_dependent_tasks_desc')}
- {renderDownstreamDependencies()} -
- ) - :
{t('project.workflow.confirm_to_offline')}
- ), + default: () => releaseState === 'OFFLINE' ? t('project.workflow.confirm_to_online'):t('project.workflow.confirm_to_offline'), trigger: () => ( ( - + {{ default: () => - scheduleReleaseState === 'OFFLINE' ? t('project.workflow.time_to_online') - : h( - dependentTaskLinks.length>0? ( - -
{t('project.workflow.warning_offline_scheduler_dependent_tasks_desc')}
- {renderDownstreamDependencies()} -
- ) - :
{t('project.workflow.time_to_offline')}
- ), + scheduleReleaseState === 'OFFLINE' ? t('project.workflow.time_to_online'):t('project.workflow.time_to_offline'), trigger: () => ( ( {{ - default: () => dependentTaskLinks.length>0? ( - -
{t('project.workflow.delete_validate_dependent_tasks_desc')}
- {renderDownstreamDependencies()} -
- ) - :
{t('project.workflow.delete_confirm')}
, + default: () => t('project.workflow.delete_confirm'), trigger: () => ( { + const row: any = variables.row + const data = { + name: row.name, + releaseState: (row.releaseState === 'ONLINE' ? 'OFFLINE' : 'ONLINE') as + | 'OFFLINE' + | 'ONLINE' + } + if (data.releaseState === 'OFFLINE') { + release(data, variables.projectCode, row.code).then(() => { + getTableData({ + pageSize: variables.pageSize, + pageNo: variables.page, + searchVal: variables.searchVal + }) + window.$message.success(t('project.workflow.success')) + }) + } + variables.dependenciesShowRef = false + } + + const confirmToOfflineScheduler = () => { + const row: any = variables.row + offline(variables.projectCode, row.schedule.id).then(() => { + window.$message.success(t('project.workflow.success')) + getTableData({ + pageSize: variables.pageSize, + pageNo: variables.page, + searchVal: variables.searchVal + }) + }) + variables.offlineSchedulerDependenciesShowRef = false + } + + const renderDownstreamDependencies = () => { + if (variables.dependentTaskLinksRef.length > 0) { + return h( + +
{t('project.workflow.warning_dependencies')}
+ {variables.dependentTaskLinksRef.map((item: any) => { + return ( + + {{ + default: () => + h(NEllipsis, + { + style: 'max-width: 350px;line-height: 1.5' + }, + () => item.text + ) + }} + + ) + })} +
+ ) + } + } + const handleSearch = () => { variables.page = 1 requestData() @@ -144,6 +209,9 @@ export default defineComponent({ batchCopyWorkflow, handleCopyUpdateList, confirmToSetWorkflowTiming, + confirmToOfflineWorkflow, + confirmToOfflineScheduler, + renderDownstreamDependencies, ...toRefs(variables), uiSettingStore, trim @@ -320,6 +388,46 @@ export default defineComponent({ maskClosable={false} onPositiveClick={this.confirmToSetWorkflowTiming} /> + + {{ + default: () => ( + +
{t('project.workflow.warning_dependent_tasks_desc')}
+ {this.renderDownstreamDependencies()} +
+ ) + }} +
+ + {{ + default: () => ( + +
{t('project.workflow.warning_offline_scheduler_dependent_tasks_desc')}
+ {this.renderDownstreamDependencies()} +
+ ) + }} +
) } diff --git a/dolphinscheduler-ui/src/views/projects/workflow/definition/timing/use-table.ts b/dolphinscheduler-ui/src/views/projects/workflow/definition/timing/use-table.ts index a339e20e46dc..7efe9259fc24 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/definition/timing/use-table.ts +++ b/dolphinscheduler-ui/src/views/projects/workflow/definition/timing/use-table.ts @@ -39,15 +39,19 @@ import { import { format } from 'date-fns-tz' import { ISearchParam } from './types' import type { Router } from 'vue-router' +import {useDependencies} from "@/views/projects/use-dependencies"; +import {deleteTaskDefinition} from "@/service/modules/task-definition"; export function useTable() { const { t } = useI18n() const router: Router = useRouter() + const {getDependentTaskLinks} = useDependencies() + const variables = reactive({ columns: [], tableWidth: DefaultTableWidth, - row: {}, + row: {} as any, tableData: [], projectCode: ref(Number(router.currentRoute.value.params.projectCode)), page: ref(1), @@ -58,7 +62,9 @@ export function useTable() { loadingRef: ref(false), processDefinitionCode: router.currentRoute.value.params.definitionCode ? ref(Number(router.currentRoute.value.params.definitionCode)) - : ref() + : ref(), + dependentTasksShowRef: ref(false), + dependentTaskLinksRef: ref([]), }) const renderTime = (time: string, timeZone: string) => { @@ -329,7 +335,7 @@ export function useTable() { NPopconfirm, { onPositiveClick: () => { - handleDelete(row.id) + handleDelete(row) } }, { @@ -404,20 +410,28 @@ export function useTable() { }) } - const handleDelete = (id: number) => { + const handleDelete = (row: any) => { /* after deleting data from the current page, you need to jump forward when the page is empty. */ if (variables.tableData.length === 1 && variables.page > 1) { variables.page -= 1 } - deleteScheduleById(id, variables.projectCode).then(() => { - window.$message.success(t('project.workflow.success')) - getTableData({ - pageSize: variables.pageSize, - pageNo: variables.page, - searchVal: variables.searchVal, - projectCode: variables.projectCode, - processDefinitionCode: variables.processDefinitionCode - }) + variables.row = row + getDependentTaskLinks(variables.projectCode, row.processDefinitionCode).then((res: any) =>{ + if (res && res.length > 0) { + variables.dependentTaskLinksRef = res + variables.dependentTasksShowRef = true + } else { + deleteScheduleById(row.id, variables.projectCode).then(() => { + window.$message.success(t('project.workflow.success')) + getTableData({ + pageSize: variables.pageSize, + pageNo: variables.page, + searchVal: variables.searchVal, + projectCode: variables.projectCode, + processDefinitionCode: variables.processDefinitionCode + }) + }) + } }) } diff --git a/dolphinscheduler-ui/src/views/projects/workflow/definition/use-table.ts b/dolphinscheduler-ui/src/views/projects/workflow/definition/use-table.ts index f11d329002de..26f6aca93d99 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/definition/use-table.ts +++ b/dolphinscheduler-ui/src/views/projects/workflow/definition/use-table.ts @@ -43,11 +43,14 @@ import { import type { IDefinitionParam } from './types' import type { Router } from 'vue-router' import type { TableColumns, RowKey } from 'naive-ui/es/data-table/src/interface' +import {useDependencies} from "@/views/projects/use-dependencies"; export function useTable() { const { t } = useI18n() const router: Router = useRouter() const { copy } = useTextCopy() + const { getDependentTasksByWorkflow, getDependentTaskLinks } = useDependencies() + const variables = reactive({ columns: [], tableWidth: DefaultTableWidth, @@ -68,6 +71,9 @@ export function useTable() { copyShowRef: ref(false), loadingRef: ref(false), setTimingDialogShowRef: ref(false), + dependenciesShowRef: ref(false), + dependentTaskLinksRef: ref([]), + offlineSchedulerDependenciesShowRef: ref(false), }) const createColumns = (variables: any) => { @@ -305,13 +311,19 @@ export function useTable() { } const deleteWorkflow = (row: any) => { - deleteByCode(variables.projectCode, row.code).then(() => { - window.$message.success(t('project.workflow.success')) - getTableData({ - pageSize: variables.pageSize, - pageNo: variables.page, - searchVal: variables.searchVal - }) + getDependentTasksByWorkflow(variables.projectCode, row.code).then((res: any) => { + if (res) { + window.$message.error(t('project.workflow.delete_task_validate_dependent_tasks_desc') + res, { duration: 5000 }) + } else { + deleteByCode(variables.projectCode, row.code).then(() => { + window.$message.success(t('project.workflow.success')) + getTableData({ + pageSize: variables.pageSize, + pageNo: variables.page, + searchVal: variables.searchVal + }) + }) + } }) } @@ -354,6 +366,7 @@ export function useTable() { const batchCopyWorkflow = () => {} + const releaseWorkflow = (row: any) => { const data = { name: row.name, @@ -361,35 +374,61 @@ export function useTable() { | 'OFFLINE' | 'ONLINE' } - release(data, variables.projectCode, row.code).then(() => { - if (data.releaseState === 'ONLINE') { + variables.row = row + if (data.releaseState === 'ONLINE') { + release(data, variables.projectCode, row.code).then(() => { variables.setTimingDialogShowRef = true - variables.row = row - } else { - window.$message.success(t('project.workflow.success')) - } - getTableData({ - pageSize: variables.pageSize, - pageNo: variables.page, - searchVal: variables.searchVal + getTableData({ + pageSize: variables.pageSize, + pageNo: variables.page, + searchVal: variables.searchVal + }) }) - }) + } else { + getDependentTaskLinks(variables.projectCode, row.code).then((res: any) => { + if (res && res.length > 0) { + variables.dependentTaskLinksRef = res + variables.dependenciesShowRef = true + } else { + release(data, variables.projectCode, row.code).then(() => { + getTableData({ + pageSize: variables.pageSize, + pageNo: variables.page, + searchVal: variables.searchVal + }) + }) + } + }) + } } const releaseScheduler = (row: any) => { if (row.schedule) { - let handle = online if (row.schedule.releaseState === 'ONLINE') { - handle = offline - } - handle(variables.projectCode, row.schedule.id).then(() => { - window.$message.success(t('project.workflow.success')) - getTableData({ - pageSize: variables.pageSize, - pageNo: variables.page, - searchVal: variables.searchVal + getDependentTaskLinks(variables.projectCode, row.code).then((res: any) => { + if (res && res.length > 0) { + variables.dependentTaskLinksRef = res + variables.offlineSchedulerDependenciesShowRef = true + } else { + offline(variables.projectCode, row.schedule.id).then(() => { + window.$message.success(t('project.workflow.success')) + getTableData({ + pageSize: variables.pageSize, + pageNo: variables.page, + searchVal: variables.searchVal + }) + }) + }}) + } else { + online(variables.projectCode, row.schedule.id).then(() => { + window.$message.success(t('project.workflow.success')) + getTableData({ + pageSize: variables.pageSize, + pageNo: variables.page, + searchVal: variables.searchVal + }) }) - }) + } } } diff --git a/dolphinscheduler-ui/src/views/projects/workflow/timing/index.tsx b/dolphinscheduler-ui/src/views/projects/workflow/timing/index.tsx index 1228cfd8352c..10d82823b19b 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/timing/index.tsx +++ b/dolphinscheduler-ui/src/views/projects/workflow/timing/index.tsx @@ -15,19 +15,22 @@ * limitations under the License. */ -import { NDataTable, NPagination, NSpace } from 'naive-ui' -import { defineComponent, onMounted, toRefs, watch } from 'vue' +import {NDataTable, NEllipsis, NModal, NPagination, NSpace} from 'naive-ui' +import {defineComponent, h, onMounted, toRefs, watch} from 'vue' import { useI18n } from 'vue-i18n' import { useTable } from '../definition/timing/use-table' import Card from '@/components/card' import TimingModal from '../definition/components/timing-modal' import TimingCondition from '@/views/projects/workflow/timing/components/timing-condition' import { ITimingSearch } from '@/views/projects/workflow/timing/types' +import ButtonLink from "@/components/button-link"; +import {deleteScheduleById, offline} from "@/service/modules/schedules"; export default defineComponent({ name: 'WorkflowTimingList', setup() { const { variables, createColumns, getTableData } = useTable() + const { t } = useI18n() const requestData = () => { getTableData({ @@ -59,6 +62,48 @@ export default defineComponent({ requestData() }) + const renderDownstreamDependencies = () => { + if (variables.dependentTaskLinksRef.length > 0) { + return h( + +
{t('project.workflow.warning_dependencies')}
+ {variables.dependentTaskLinksRef.map((item: any) => { + return ( + + {{ + default: () => + h(NEllipsis, + { + style: 'max-width: 350px;line-height: 1.5' + }, + () => item.text + ) + }} + + ) + })} +
+ ) + } + } + + const confirmToDeleteScheduler = () => { + deleteScheduleById(variables.row.id, variables.projectCode).then(() => { + window.$message.success(t('project.workflow.success')) + getTableData({ + pageSize: variables.pageSize, + pageNo: variables.page, + searchVal: variables.searchVal, + projectCode: variables.projectCode, + processDefinitionCode: variables.processDefinitionCode + }) + }) + variables.dependentTasksShowRef = false + } + watch(useI18n().locale, () => { createColumns(variables) }) @@ -68,6 +113,8 @@ export default defineComponent({ handleSearch, handleUpdateList, handleChangePageSize, + renderDownstreamDependencies, + confirmToDeleteScheduler, ...toRefs(variables) } }, @@ -110,6 +157,26 @@ export default defineComponent({ v-model:show={this.showRef} onUpdateList={this.handleUpdateList} /> + + {{ + default: () => ( + +
{t('project.workflow.warning_delete_scheduler_dependent_tasks_desc')}
+ {this.renderDownstreamDependencies()} +
+ ) + }} +
) } From b08068141198af3e8ef2b2a0daba27def983cd80 Mon Sep 17 00:00:00 2001 From: calvin Date: Wed, 6 Mar 2024 19:14:44 +0800 Subject: [PATCH 06/14] done --- .../src/locales/en_US/project.ts | 2 +- .../dependencies/dependencies-modal.tsx | 120 ++++++++++++++++++ .../dependencies}/use-dependencies.ts | 14 +- .../projects/task/definition/batch-task.tsx | 61 ++------- .../projects/task/definition/use-table.ts | 14 +- .../components/dag/dag-context-menu.tsx | 30 +++-- .../workflow/components/dag/dag-toolbar.tsx | 17 ++- .../workflow/components/dag/index.tsx | 19 ++- .../definition/components/table-action.tsx | 7 +- .../projects/workflow/definition/index.tsx | 114 ++--------------- .../workflow/definition/timing/index.tsx | 8 ++ .../workflow/definition/timing/use-table.ts | 68 ++++++++-- .../projects/workflow/definition/use-table.ts | 100 +++++++++++---- .../views/projects/workflow/timing/index.tsx | 78 ++---------- 14 files changed, 365 insertions(+), 287 deletions(-) create mode 100644 dolphinscheduler-ui/src/views/projects/components/dependencies/dependencies-modal.tsx rename dolphinscheduler-ui/src/views/projects/{ => components/dependencies}/use-dependencies.ts (89%) diff --git a/dolphinscheduler-ui/src/locales/en_US/project.ts b/dolphinscheduler-ui/src/locales/en_US/project.ts index 2e632c260b83..88cc429a0091 100644 --- a/dolphinscheduler-ui/src/locales/en_US/project.ts +++ b/dolphinscheduler-ui/src/locales/en_US/project.ts @@ -244,7 +244,7 @@ export default { delete_validate_dependent_tasks_desc: 'The downstream dependent tasks exists. You can not delete the workflow.', warning_offline_scheduler_dependent_tasks_desc: 'The downstream dependent tasks exists. Are you sure to make the scheduler offline?', delete_task_validate_dependent_tasks_desc: 'The downstream dependent tasks exists. You can not delete the task. Dependencies:', - warning_delete_scheduler_dependent_tasks_desc: 'The downstream dependent tasks exists. Are you sure to delete the scheduler.?', + warning_delete_scheduler_dependent_tasks_desc: 'The downstream dependent tasks exists. Are you sure to delete the scheduler?', }, task: { on_line: 'Online', diff --git a/dolphinscheduler-ui/src/views/projects/components/dependencies/dependencies-modal.tsx b/dolphinscheduler-ui/src/views/projects/components/dependencies/dependencies-modal.tsx new file mode 100644 index 000000000000..d27813c3dfb2 --- /dev/null +++ b/dolphinscheduler-ui/src/views/projects/components/dependencies/dependencies-modal.tsx @@ -0,0 +1,120 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + defineComponent, + PropType, + h +} from 'vue' +import { useI18n } from 'vue-i18n' +import {NEllipsis, NModal, NSpace} from 'naive-ui' +import {IDefinitionData} from "@/views/projects/workflow/definition/types"; +import ButtonLink from "@/components/button-link"; + +const props = { + row: { + type: Object as PropType, + default: {}, + required: false + }, + show: { + type: Boolean as PropType, + default: false + }, + required: { + type: Boolean as PropType, + default: true + }, + taskLinks: { + type: Array, + default: [] + }, + content: { + type: String, + default: '' + } +} + +export default defineComponent({ + name: 'dependenciesConfirm', + props, + emits: ['update:show', 'update:row', 'confirm'], + setup(props, ctx) { + const { t } = useI18n() + + const confirmToHandle = () => { + ctx.emit('confirm') + } + + const cancelToHandle = () => { + ctx.emit('update:show') + } + + const renderDownstreamDependencies = () => { + return h( + +
{props.content}
+
{t('project.workflow.warning_dependencies')}
+ {props.taskLinks.map((item: any) => { + return ( + + {{ + default: () => + h(NEllipsis, + { + style: 'max-width: 350px;line-height: 1.5' + }, + () => item.text + ) + }} + + ) + })} +
+ ) + } + + return {renderDownstreamDependencies, confirmToHandle, cancelToHandle} + }, + + render() { + const { t } = useI18n() + + return ( + + {{ + default: () => ( + this.renderDownstreamDependencies() + ) + }} + + ) + } +}) diff --git a/dolphinscheduler-ui/src/views/projects/use-dependencies.ts b/dolphinscheduler-ui/src/views/projects/components/dependencies/use-dependencies.ts similarity index 89% rename from dolphinscheduler-ui/src/views/projects/use-dependencies.ts rename to dolphinscheduler-ui/src/views/projects/components/dependencies/use-dependencies.ts index 8a29c8d8ca70..806e8e87e301 100644 --- a/dolphinscheduler-ui/src/views/projects/use-dependencies.ts +++ b/dolphinscheduler-ui/src/views/projects/components/dependencies/use-dependencies.ts @@ -63,6 +63,18 @@ export function useDependencies() { return tasks } + const getDependentTaskLinksByMultipleTasks = async (projectCode: any, workflowCode: any, taskCodes: any[]) => { + let dependentTaskLinks = [] as any + if (workflowCode && projectCode) { + for (const taskCode of taskCodes) { + await getDependentTaskLinksByTask(projectCode, workflowCode, taskCode).then((res: any) => { + dependentTaskLinks = dependentTaskLinks.concat(res) + }) + } + } + return dependentTaskLinks + } + const getDependentTaskLinks = async (projectCode: any, workflowCode: any) => { let dependentTaskReq = {workFlowCode: workflowCode} as DependentTaskReq let dependentTaskLinks = [] as any @@ -107,5 +119,5 @@ export function useDependencies() { return dependentTaskLinks } - return { getDependentTasksBySingleTask, getDependentTasksByMultipleTasks, getDependentTaskLinks, getDependentTasksByWorkflow, getDependentTaskLinksByTask } + return { getDependentTasksBySingleTask, getDependentTasksByMultipleTasks, getDependentTaskLinks, getDependentTasksByWorkflow, getDependentTaskLinksByTask, getDependentTaskLinksByMultipleTasks } } diff --git a/dolphinscheduler-ui/src/views/projects/task/definition/batch-task.tsx b/dolphinscheduler-ui/src/views/projects/task/definition/batch-task.tsx index 63ad10d4b8d9..a886dec27a58 100644 --- a/dolphinscheduler-ui/src/views/projects/task/definition/batch-task.tsx +++ b/dolphinscheduler-ui/src/views/projects/task/definition/batch-task.tsx @@ -25,9 +25,9 @@ import { import { useRoute } from 'vue-router' import { NButton, - NDataTable, NEllipsis, + NDataTable, NIcon, - NInput, NModal, + NInput, NPagination, NSelect, NSpace @@ -41,8 +41,7 @@ import Card from '@/components/card' import VersionModal from './components/version-modal' import TaskModal from '@/views/projects/task/components/node/detail-modal' import type { INodeData } from './types' -import {release} from "@/service/modules/process-definition"; -import ButtonLink from "@/components/button-link"; +import DependenciesModal from "@/views/projects/components/dependencies/dependencies-modal"; const BatchTaskDefinition = defineComponent({ name: 'batch-task-definition', @@ -104,34 +103,6 @@ const BatchTaskDefinition = defineComponent({ } } - const renderDownstreamDependencies = () => { - if (variables.dependentTaskLinksRef.length > 0) { - return h( - -
{t('project.workflow.warning_dependencies')}
- {variables.dependentTaskLinksRef.map((item: any) => { - return ( - - {{ - default: () => - h(NEllipsis, - { - style: 'max-width: 350px;line-height: 1.5' - }, - () => item.text - ) - }} - - ) - })} -
- ) - } - } - const trim = getCurrentInstance()?.appContext.config.globalProperties.trim onMounted(() => { createColumns(variables) @@ -155,7 +126,6 @@ const BatchTaskDefinition = defineComponent({ onCreate, onTaskSubmit, onTaskCancel, - renderDownstreamDependencies, projectCode, trim } @@ -244,24 +214,13 @@ const BatchTaskDefinition = defineComponent({ readonly={this.taskReadonly} saving={this.taskSaving} /> - - {{ - default: () => ( - -
{t('project.workflow.delete_validate_dependent_tasks_desc')}
- {this.renderDownstreamDependencies()} -
- ) - }} -
+ ) } diff --git a/dolphinscheduler-ui/src/views/projects/task/definition/use-table.ts b/dolphinscheduler-ui/src/views/projects/task/definition/use-table.ts index 533299ecb584..1d9644f358ed 100644 --- a/dolphinscheduler-ui/src/views/projects/task/definition/use-table.ts +++ b/dolphinscheduler-ui/src/views/projects/task/definition/use-table.ts @@ -48,7 +48,7 @@ import type { TaskDefinitionRes } from '@/service/modules/task-definition/types' import type { IRecord } from './types' -import {useDependencies} from "@/views/projects/use-dependencies"; +import {useDependencies} from "@/views/projects/components/dependencies/use-dependencies"; export function useTable(onEdit: Function) { const { t } = useI18n() @@ -266,15 +266,21 @@ export function useTable(onEdit: Function) { dependentTasksShowRef: ref(false), dependentTaskLinksRef: ref([]), row: {}, - loadingRef: ref(false) + loadingRef: ref(false), + dependenciesData: ref({showRef: ref(false), taskLinks: ref([]), required: ref(false), tip: ref(''), action:() => {}}), }) const handleDelete = (row: any) => { variables.row = row getDependentTaskLinksByTask(projectCode, row.processDefinitionCode, row.taskCode).then((res: any) =>{ if (res && res.length > 0) { - variables.dependentTaskLinksRef = res - variables.dependentTasksShowRef = true + variables.dependenciesData = { + showRef: true, + taskLinks: res, + tip: t('project.workflow.delete_validate_dependent_tasks_desc'), + required: true, + action: () => {} + } } else { deleteTaskDefinition({ code: row.taskCode }, { projectCode }).then(() => { getTableData({ diff --git a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-context-menu.tsx b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-context-menu.tsx index 77f19a2b6ca8..4b246d213523 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-context-menu.tsx +++ b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-context-menu.tsx @@ -17,17 +17,14 @@ import { genTaskCodeList } from '@/service/modules/task-definition' import type { Cell } from '@antv/x6' -import { defineComponent, onMounted, PropType, inject, ref, h } from 'vue' +import { defineComponent, onMounted, PropType, inject, ref, h, reactive } from 'vue' import { useI18n } from 'vue-i18n' import {Router, useRoute, useRouter} from 'vue-router' import styles from './menu.module.scss' import { uuid } from '@/common/common' import { IWorkflowTaskInstance } from './types' import {NButton} from 'naive-ui' -import {DependentTaskReq} from "@/service/modules/lineages/types"; -import {queryDependentTasks} from "@/service/modules/lineages"; -import {TASK_TYPES_MAP} from "@/store/project"; -import {useDependencies} from "@/views/projects/use-dependencies"; +import {useDependencies} from "@/views/projects/components/dependencies/use-dependencies" const props = { startDisplay: { @@ -61,6 +58,10 @@ const props = { top: { type: Number as PropType, default: 0 + }, + dependenciesData: { + type: Object as PropType, + require: false } } @@ -85,7 +86,14 @@ export default defineComponent({ const workflowCode = Number(route.params.code) const { t } = useI18n() - const { getDependentTasksBySingleTask } = useDependencies() + // const dependenciesData = reactive({ + // showRef: false, + // taskLinks: ref([]), + // required: ref(false), + // tip: ref(''), action: () => {} + // }) + + const { getDependentTaskLinksByTask } = useDependencies() const hide = () => { ctx.emit('hide', false) @@ -145,9 +153,13 @@ export default defineComponent({ const handleDelete = async () => { let taskCode = props.cell?.id - let dependentTasks = await getDependentTasksBySingleTask(projectCode, workflowCode, taskCode) - if (dependentTasks.length > 0) { - window.$message.error(t('project.workflow.delete_task_validate_dependent_tasks_desc') + dependentTasks, { duration: 5000 }) + let res = await getDependentTaskLinksByTask(projectCode, workflowCode, taskCode) + props.dependenciesData.showRef = false + if (res.length > 0) { + props.dependenciesData.showRef = true + props.dependenciesData.taskLinks = res + props.dependenciesData.tip = t('project.task.delete_validate_dependent_tasks_desc') + props.dependenciesData.required = true } else { graph.value?.removeCell(props.cell) ctx.emit('removeTasks', [Number(props.cell?.id)]) diff --git a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-toolbar.tsx b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-toolbar.tsx index 8c7dfc69b68b..7cee9d13ff39 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-toolbar.tsx +++ b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-toolbar.tsx @@ -49,7 +49,7 @@ import type { Graph } from '@antv/x6' import StartupParam from './dag-startup-param' import VariablesView from '@/views/projects/workflow/instance/components/variables-view' import { WorkflowDefinition, WorkflowInstance } from './types' -import {useDependencies} from "@/views/projects/use-dependencies"; +import {useDependencies} from "@/views/projects/components/dependencies/use-dependencies" const props = { layoutToggle: { @@ -65,6 +65,10 @@ const props = { // The same as the structure responsed by the queryProcessDefinitionByCode api type: Object as PropType, default: null + }, + dependenciesData: { + type: Object as PropType, + require: false } } @@ -82,7 +86,7 @@ export default defineComponent({ const route = useRoute() const projectCode = Number(route.params.projectCode) const workflowCode = Number(route.params.code) - const { getDependentTasksByMultipleTasks } = useDependencies() + const { getDependentTaskLinksByMultipleTasks } = useDependencies() /** * Node search and navigate @@ -175,9 +179,12 @@ export default defineComponent({ const codes = cells .filter((cell) => cell.isNode()) .map((cell) => +cell.id) - const dependentTasks = await getDependentTasksByMultipleTasks(projectCode, workflowCode, codes) - if (dependentTasks.length > 0) { - window.$message.error(t('project.workflow.delete_task_validate_dependent_tasks_desc') + dependentTasks, { duration: 5000 }) + const res = await getDependentTaskLinksByMultipleTasks(projectCode, workflowCode, codes) + if (res.length > 0) { + props.dependenciesData.showRef = true + props.dependenciesData.taskLinks = res + props.dependenciesData.tip = t('project.task.delete_validate_dependent_tasks_desc') + props.dependenciesData.required = true } else { context.emit('removeTasks', codes, cells) graph.value?.removeCells(cells) diff --git a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/index.tsx b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/index.tsx index c41485db2176..be1f25ed8a5b 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/index.tsx +++ b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/index.tsx @@ -24,7 +24,7 @@ import { toRef, watch, onBeforeUnmount, - computed + computed, reactive } from 'vue' import { useI18n } from 'vue-i18n' import { useRoute } from 'vue-router' @@ -57,6 +57,7 @@ import utils from '@/utils' import { useUISettingStore } from '@/store/ui-setting/ui-setting' import { executeTask } from '@/service/modules/executors' import { removeTaskInstanceCache } from '@/service/modules/task-instances' +import DependenciesModal from "@/views/projects/components/dependencies/dependencies-modal"; const props = { // If this prop is passed, it means from definition detail @@ -333,6 +334,13 @@ export default defineComponent({ } } + const dependenciesData = reactive({ + showRef: ref(false), + taskLinks: ref([]), + required: ref(false), + tip: ref(''), action: () => {} + }) + watch( () => props.definition, () => { @@ -373,6 +381,7 @@ export default defineComponent({ onSaveModelToggle={saveModelToggle} onRemoveTasks={removeTasks} onRefresh={refreshTaskStatus} + dependenciesData={dependenciesData} />
@@ -428,6 +437,14 @@ export default defineComponent({ onViewLog={handleViewLog} onExecuteTask={handleExecuteTask} onRemoveTaskInstanceCache={handleRemoveTaskInstanceCache} + dependenciesData={dependenciesData} + /> + {!!props.definition && ( diff --git a/dolphinscheduler-ui/src/views/projects/workflow/definition/index.tsx b/dolphinscheduler-ui/src/views/projects/workflow/definition/index.tsx index 30f26910a894..f6ddcf3b1a66 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/definition/index.tsx +++ b/dolphinscheduler-ui/src/views/projects/workflow/definition/index.tsx @@ -49,6 +49,7 @@ import Search from '@/components/input-search' import ButtonLink from "@/components/button-link" import {release} from "@/service/modules/process-definition" import { offline } from '@/service/modules/schedules' +import DependenciesModal from "@/views/projects/components/dependencies/dependencies-modal"; export default defineComponent({ name: 'WorkflowDefinitionList', @@ -89,68 +90,6 @@ export default defineComponent({ variables.timingShowRef = true } - const confirmToOfflineWorkflow = () => { - const row: any = variables.row - const data = { - name: row.name, - releaseState: (row.releaseState === 'ONLINE' ? 'OFFLINE' : 'ONLINE') as - | 'OFFLINE' - | 'ONLINE' - } - if (data.releaseState === 'OFFLINE') { - release(data, variables.projectCode, row.code).then(() => { - getTableData({ - pageSize: variables.pageSize, - pageNo: variables.page, - searchVal: variables.searchVal - }) - window.$message.success(t('project.workflow.success')) - }) - } - variables.dependenciesShowRef = false - } - - const confirmToOfflineScheduler = () => { - const row: any = variables.row - offline(variables.projectCode, row.schedule.id).then(() => { - window.$message.success(t('project.workflow.success')) - getTableData({ - pageSize: variables.pageSize, - pageNo: variables.page, - searchVal: variables.searchVal - }) - }) - variables.offlineSchedulerDependenciesShowRef = false - } - - const renderDownstreamDependencies = () => { - if (variables.dependentTaskLinksRef.length > 0) { - return h( - -
{t('project.workflow.warning_dependencies')}
- {variables.dependentTaskLinksRef.map((item: any) => { - return ( - - {{ - default: () => - h(NEllipsis, - { - style: 'max-width: 350px;line-height: 1.5' - }, - () => item.text - ) - }} - - ) - })} -
- ) - } - } - const handleSearch = () => { variables.page = 1 requestData() @@ -209,9 +148,6 @@ export default defineComponent({ batchCopyWorkflow, handleCopyUpdateList, confirmToSetWorkflowTiming, - confirmToOfflineWorkflow, - confirmToOfflineScheduler, - renderDownstreamDependencies, ...toRefs(variables), uiSettingStore, trim @@ -388,46 +324,14 @@ export default defineComponent({ maskClosable={false} onPositiveClick={this.confirmToSetWorkflowTiming} /> - - {{ - default: () => ( - -
{t('project.workflow.warning_dependent_tasks_desc')}
- {this.renderDownstreamDependencies()} -
- ) - }} -
- - {{ - default: () => ( - -
{t('project.workflow.warning_offline_scheduler_dependent_tasks_desc')}
- {this.renderDownstreamDependencies()} -
- ) - }} -
+ ) } diff --git a/dolphinscheduler-ui/src/views/projects/workflow/definition/timing/index.tsx b/dolphinscheduler-ui/src/views/projects/workflow/definition/timing/index.tsx index bd348fb8d7b8..9450138e0f4f 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/definition/timing/index.tsx +++ b/dolphinscheduler-ui/src/views/projects/workflow/definition/timing/index.tsx @@ -24,6 +24,7 @@ import { useTable } from './use-table' import Card from '@/components/card' import TimingModal from '../components/timing-modal' import type { Router } from 'vue-router' +import DependenciesModal from "@/views/projects/components/dependencies/dependencies-modal"; export default defineComponent({ name: 'WorkflowDefinitionTiming', @@ -115,6 +116,13 @@ export default defineComponent({ v-model:show={this.showRef} onUpdateList={this.handleUpdateList} /> + ) } diff --git a/dolphinscheduler-ui/src/views/projects/workflow/definition/timing/use-table.ts b/dolphinscheduler-ui/src/views/projects/workflow/definition/timing/use-table.ts index 7efe9259fc24..4c86637d04ca 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/definition/timing/use-table.ts +++ b/dolphinscheduler-ui/src/views/projects/workflow/definition/timing/use-table.ts @@ -39,8 +39,7 @@ import { import { format } from 'date-fns-tz' import { ISearchParam } from './types' import type { Router } from 'vue-router' -import {useDependencies} from "@/views/projects/use-dependencies"; -import {deleteTaskDefinition} from "@/service/modules/task-definition"; +import { useDependencies } from "@/views/projects/components/dependencies/use-dependencies" export function useTable() { const { t } = useI18n() @@ -63,8 +62,7 @@ export function useTable() { processDefinitionCode: router.currentRoute.value.params.definitionCode ? ref(Number(router.currentRoute.value.params.definitionCode)) : ref(), - dependentTasksShowRef: ref(false), - dependentTaskLinksRef: ref([]), + dependenciesData: ref({showRef: false, taskLinks: ref([]), required: ref(false), tip: ref(''), action:() => {}}), }) const renderTime = (time: string, timeZone: string) => { @@ -350,7 +348,8 @@ export function useTable() { { circle: true, type: 'error', - size: 'small' + size: 'small', + disabled: row.releaseState === 'ONLINE' }, { icon: () => h(DeleteOutlined) @@ -393,12 +392,57 @@ export function useTable() { } const handleReleaseState = (row: any) => { - let handle = online if (row.releaseState === 'ONLINE') { - handle = offline + variables.row = row + getDependentTaskLinks(variables.projectCode, row.processDefinitionCode).then((res: any) =>{ + if (res && res.length > 0) { + variables.dependenciesData.showRef = true + variables.dependenciesData.taskLinks = res + variables.dependenciesData.tip = t('project.workflow.warning_delete_scheduler_dependent_tasks_desc') + variables.dependenciesData.required = false + variables.dependenciesData.action = confirmToOfflineSchedule + } else { + offline(variables.projectCode, row.id).then(() => { + window.$message.success(t('project.workflow.success')) + getTableData({ + pageSize: variables.pageSize, + pageNo: variables.page, + searchVal: variables.searchVal, + projectCode: variables.projectCode, + processDefinitionCode: variables.processDefinitionCode + }) + }) + }}) + } else { + online(variables.projectCode, row.id).then(() => { + window.$message.success(t('project.workflow.success')) + getTableData({ + pageSize: variables.pageSize, + pageNo: variables.page, + searchVal: variables.searchVal, + projectCode: variables.projectCode, + processDefinitionCode: variables.processDefinitionCode + }) + }) } + } + + const confirmToOfflineSchedule = () => { + offline(variables.projectCode, variables.row.id).then(() => { + window.$message.success(t('project.workflow.success')) + getTableData({ + pageSize: variables.pageSize, + pageNo: variables.page, + searchVal: variables.searchVal, + projectCode: variables.projectCode, + processDefinitionCode: variables.processDefinitionCode + }) + }) + variables.dependenciesData.showRef = false + } - handle(variables.projectCode, row.id).then(() => { + const confirmToDeleteSchedule = () => { + deleteScheduleById(variables.row.id, variables.projectCode).then(() => { window.$message.success(t('project.workflow.success')) getTableData({ pageSize: variables.pageSize, @@ -408,6 +452,7 @@ export function useTable() { processDefinitionCode: variables.processDefinitionCode }) }) + variables.dependenciesData.showRef = false } const handleDelete = (row: any) => { @@ -418,8 +463,11 @@ export function useTable() { variables.row = row getDependentTaskLinks(variables.projectCode, row.processDefinitionCode).then((res: any) =>{ if (res && res.length > 0) { - variables.dependentTaskLinksRef = res - variables.dependentTasksShowRef = true + variables.dependenciesData.showRef = true + variables.dependenciesData.taskLinks = res + variables.dependenciesData.tip = t('project.workflow.warning_delete_scheduler_dependent_tasks_desc') + variables.dependenciesData.required = false + variables.dependenciesData.action = confirmToDeleteSchedule } else { deleteScheduleById(row.id, variables.projectCode).then(() => { window.$message.success(t('project.workflow.success')) diff --git a/dolphinscheduler-ui/src/views/projects/workflow/definition/use-table.ts b/dolphinscheduler-ui/src/views/projects/workflow/definition/use-table.ts index 26f6aca93d99..69ce6aff9dc4 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/definition/use-table.ts +++ b/dolphinscheduler-ui/src/views/projects/workflow/definition/use-table.ts @@ -43,13 +43,13 @@ import { import type { IDefinitionParam } from './types' import type { Router } from 'vue-router' import type { TableColumns, RowKey } from 'naive-ui/es/data-table/src/interface' -import {useDependencies} from "@/views/projects/use-dependencies"; +import {useDependencies} from "@/views/projects/components/dependencies/use-dependencies"; export function useTable() { const { t } = useI18n() const router: Router = useRouter() const { copy } = useTextCopy() - const { getDependentTasksByWorkflow, getDependentTaskLinks } = useDependencies() + const { getDependentTaskLinks } = useDependencies() const variables = reactive({ columns: [], @@ -71,9 +71,7 @@ export function useTable() { copyShowRef: ref(false), loadingRef: ref(false), setTimingDialogShowRef: ref(false), - dependenciesShowRef: ref(false), - dependentTaskLinksRef: ref([]), - offlineSchedulerDependenciesShowRef: ref(false), + dependenciesData: ref({showRef: false, taskLinks: ref([]), required: ref(false), tip: ref(''), action:() => {}}), }) const createColumns = (variables: any) => { @@ -310,23 +308,6 @@ export function useTable() { variables.row = row } - const deleteWorkflow = (row: any) => { - getDependentTasksByWorkflow(variables.projectCode, row.code).then((res: any) => { - if (res) { - window.$message.error(t('project.workflow.delete_task_validate_dependent_tasks_desc') + res, { duration: 5000 }) - } else { - deleteByCode(variables.projectCode, row.code).then(() => { - window.$message.success(t('project.workflow.success')) - getTableData({ - pageSize: variables.pageSize, - pageNo: variables.page, - searchVal: variables.searchVal - }) - }) - } - }) - } - const batchDeleteWorkflow = () => { const data = { codes: _.join(variables.checkedRowKeys, ',') @@ -366,6 +347,39 @@ export function useTable() { const batchCopyWorkflow = () => {} + const confirmToOfflineWorkflow = () => { + const row: any = variables.row + const data = { + name: row.name, + releaseState: (row.releaseState === 'ONLINE' ? 'OFFLINE' : 'ONLINE') as + | 'OFFLINE' + | 'ONLINE' + } + if (data.releaseState === 'OFFLINE') { + release(data, variables.projectCode, row.code).then(() => { + getTableData({ + pageSize: variables.pageSize, + pageNo: variables.page, + searchVal: variables.searchVal + }) + window.$message.success(t('project.workflow.success')) + }) + } + variables.dependenciesData.showRef = false + } + + const confirmToOfflineScheduler = () => { + const row: any = variables.row + offline(variables.projectCode, row.schedule.id).then(() => { + window.$message.success(t('project.workflow.success')) + getTableData({ + pageSize: variables.pageSize, + pageNo: variables.page, + searchVal: variables.searchVal + }) + }) + variables.dependenciesData.showRef = false + } const releaseWorkflow = (row: any) => { const data = { @@ -387,8 +401,13 @@ export function useTable() { } else { getDependentTaskLinks(variables.projectCode, row.code).then((res: any) => { if (res && res.length > 0) { - variables.dependentTaskLinksRef = res - variables.dependenciesShowRef = true + variables.dependenciesData = { + showRef: true, + taskLinks: res, + tip: t('project.workflow.warning_dependent_tasks_desc'), + required: false, + action: confirmToOfflineWorkflow + } } else { release(data, variables.projectCode, row.code).then(() => { getTableData({ @@ -402,13 +421,42 @@ export function useTable() { } } + const deleteWorkflow = (row: any) => { + getDependentTaskLinks(variables.projectCode, row.code).then((res: any) => { + if (res && res.length > 0) { + variables.dependenciesData = { + showRef: true, + taskLinks: res, + tip: t('project.workflow.delete_task_validate_dependent_tasks_desc'), + required: true, + action: () => {} + } + } else { + deleteByCode(variables.projectCode, row.code).then(() => { + window.$message.success(t('project.workflow.success')) + getTableData({ + pageSize: variables.pageSize, + pageNo: variables.page, + searchVal: variables.searchVal + }) + }) + } + }) + } + const releaseScheduler = (row: any) => { + variables.row = row if (row.schedule) { if (row.schedule.releaseState === 'ONLINE') { getDependentTaskLinks(variables.projectCode, row.code).then((res: any) => { if (res && res.length > 0) { - variables.dependentTaskLinksRef = res - variables.offlineSchedulerDependenciesShowRef = true + variables.dependenciesData = { + showRef: true, + taskLinks: res, + tip: t('project.workflow.warning_offline_scheduler_dependent_tasks_desc'), + required: false, + action: confirmToOfflineScheduler + } } else { offline(variables.projectCode, row.schedule.id).then(() => { window.$message.success(t('project.workflow.success')) diff --git a/dolphinscheduler-ui/src/views/projects/workflow/timing/index.tsx b/dolphinscheduler-ui/src/views/projects/workflow/timing/index.tsx index 10d82823b19b..e18fc400aec5 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/timing/index.tsx +++ b/dolphinscheduler-ui/src/views/projects/workflow/timing/index.tsx @@ -15,16 +15,15 @@ * limitations under the License. */ -import {NDataTable, NEllipsis, NModal, NPagination, NSpace} from 'naive-ui' -import {defineComponent, h, onMounted, toRefs, watch} from 'vue' +import {NDataTable, NPagination, NSpace} from 'naive-ui' +import {defineComponent, onMounted, toRefs, watch} from 'vue' import { useI18n } from 'vue-i18n' import { useTable } from '../definition/timing/use-table' import Card from '@/components/card' import TimingModal from '../definition/components/timing-modal' import TimingCondition from '@/views/projects/workflow/timing/components/timing-condition' import { ITimingSearch } from '@/views/projects/workflow/timing/types' -import ButtonLink from "@/components/button-link"; -import {deleteScheduleById, offline} from "@/service/modules/schedules"; +import DependenciesModal from "@/views/projects/components/dependencies/dependencies-modal"; export default defineComponent({ name: 'WorkflowTimingList', @@ -62,48 +61,6 @@ export default defineComponent({ requestData() }) - const renderDownstreamDependencies = () => { - if (variables.dependentTaskLinksRef.length > 0) { - return h( - -
{t('project.workflow.warning_dependencies')}
- {variables.dependentTaskLinksRef.map((item: any) => { - return ( - - {{ - default: () => - h(NEllipsis, - { - style: 'max-width: 350px;line-height: 1.5' - }, - () => item.text - ) - }} - - ) - })} -
- ) - } - } - - const confirmToDeleteScheduler = () => { - deleteScheduleById(variables.row.id, variables.projectCode).then(() => { - window.$message.success(t('project.workflow.success')) - getTableData({ - pageSize: variables.pageSize, - pageNo: variables.page, - searchVal: variables.searchVal, - projectCode: variables.projectCode, - processDefinitionCode: variables.processDefinitionCode - }) - }) - variables.dependentTasksShowRef = false - } - watch(useI18n().locale, () => { createColumns(variables) }) @@ -113,8 +70,6 @@ export default defineComponent({ handleSearch, handleUpdateList, handleChangePageSize, - renderDownstreamDependencies, - confirmToDeleteScheduler, ...toRefs(variables) } }, @@ -157,26 +112,13 @@ export default defineComponent({ v-model:show={this.showRef} onUpdateList={this.handleUpdateList} /> - - {{ - default: () => ( - -
{t('project.workflow.warning_delete_scheduler_dependent_tasks_desc')}
- {this.renderDownstreamDependencies()} -
- ) - }} -
+ ) } From 2dd06e10b8d7016749fa7e958c5c7ed3c871b1d6 Mon Sep 17 00:00:00 2001 From: calvin Date: Wed, 6 Mar 2024 20:25:17 +0800 Subject: [PATCH 07/14] done --- dolphinscheduler-ui/src/locales/en_US/project.ts | 2 +- dolphinscheduler-ui/src/locales/zh_CN/project.ts | 2 +- .../projects/components/dependencies/use-dependencies.ts | 9 ++++----- .../src/views/projects/workflow/definition/use-table.ts | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/dolphinscheduler-ui/src/locales/en_US/project.ts b/dolphinscheduler-ui/src/locales/en_US/project.ts index 88cc429a0091..b3238fc266b5 100644 --- a/dolphinscheduler-ui/src/locales/en_US/project.ts +++ b/dolphinscheduler-ui/src/locales/en_US/project.ts @@ -243,7 +243,7 @@ export default { warning_dependencies: 'Dependencies:', delete_validate_dependent_tasks_desc: 'The downstream dependent tasks exists. You can not delete the workflow.', warning_offline_scheduler_dependent_tasks_desc: 'The downstream dependent tasks exists. Are you sure to make the scheduler offline?', - delete_task_validate_dependent_tasks_desc: 'The downstream dependent tasks exists. You can not delete the task. Dependencies:', + delete_task_validate_dependent_tasks_desc: 'The downstream dependent tasks exists. You can not delete the task.', warning_delete_scheduler_dependent_tasks_desc: 'The downstream dependent tasks exists. Are you sure to delete the scheduler?', }, task: { diff --git a/dolphinscheduler-ui/src/locales/zh_CN/project.ts b/dolphinscheduler-ui/src/locales/zh_CN/project.ts index 451a2a824c60..21d35e2a71b1 100644 --- a/dolphinscheduler-ui/src/locales/zh_CN/project.ts +++ b/dolphinscheduler-ui/src/locales/zh_CN/project.ts @@ -241,7 +241,7 @@ export default { warning_dependencies: '依赖如下:', delete_validate_dependent_tasks_desc: '下游存在依赖,你不能删除该工作流', warning_offline_scheduler_dependent_tasks_desc: '下游存在依赖, 下线操作可能会对下游任务产生影响. 你确定要下线该定时嘛?', - delete_task_validate_dependent_tasks_desc: '下游存在依赖,你不能删除该任务. 依赖如下:', + delete_task_validate_dependent_tasks_desc: '下游存在依赖,你不能删除该任务.', warning_delete_scheduler_dependent_tasks_desc: '下游存在依赖, 删除定时可能会对下游任务产生影响. 你确定要删除该定时嘛?', }, task: { diff --git a/dolphinscheduler-ui/src/views/projects/components/dependencies/use-dependencies.ts b/dolphinscheduler-ui/src/views/projects/components/dependencies/use-dependencies.ts index 806e8e87e301..0e35cfbb8945 100644 --- a/dolphinscheduler-ui/src/views/projects/components/dependencies/use-dependencies.ts +++ b/dolphinscheduler-ui/src/views/projects/components/dependencies/use-dependencies.ts @@ -18,12 +18,9 @@ import {DependentTaskReq} from "@/service/modules/lineages/types"; import {queryDependentTasks} from "@/service/modules/lineages"; import {TASK_TYPES_MAP} from "@/store/project"; -import {Router, useRouter} from "vue-router"; export function useDependencies() { - const router: Router = useRouter() - const getDependentTasksBySingleTask = async (projectCode: any, workflowCode: any, taskCode: any) => { let tasks = [] as any if (workflowCode && taskCode) { @@ -87,7 +84,8 @@ export function useDependencies() { text: item.processDefinitionName + '->' + item.taskName, show: true, action: () => { - router.push({path: `/projects/${item.projectCode}/workflow/definitions/${item.processDefinitionCode}`}) + const url = `/projects/${item.projectCode}/workflow/definitions/${item.processDefinitionCode}` + window.open(url, '_blank') }, } ) @@ -109,7 +107,8 @@ export function useDependencies() { text: item.processDefinitionName + '->' + item.taskName, show: true, action: () => { - router.push({path: `/projects/${item.projectCode}/workflow/definitions/${item.processDefinitionCode}`}) + const url = `/projects/${item.projectCode}/workflow/definitions/${item.processDefinitionCode}` + window.open(url, '_blank') }, } ) diff --git a/dolphinscheduler-ui/src/views/projects/workflow/definition/use-table.ts b/dolphinscheduler-ui/src/views/projects/workflow/definition/use-table.ts index 69ce6aff9dc4..00652efdff1a 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/definition/use-table.ts +++ b/dolphinscheduler-ui/src/views/projects/workflow/definition/use-table.ts @@ -427,7 +427,7 @@ export function useTable() { variables.dependenciesData = { showRef: true, taskLinks: res, - tip: t('project.workflow.delete_task_validate_dependent_tasks_desc'), + tip: t('project.workflow.delete_validate_dependent_tasks_desc'), required: true, action: () => {} } From b8fa4d1085a3f87682176ac48492c9e108f407e2 Mon Sep 17 00:00:00 2001 From: calvin Date: Thu, 7 Mar 2024 15:27:27 +0800 Subject: [PATCH 08/14] done --- .../dependencies/dependencies-modal.tsx | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/dolphinscheduler-ui/src/views/projects/components/dependencies/dependencies-modal.tsx b/dolphinscheduler-ui/src/views/projects/components/dependencies/dependencies-modal.tsx index d27813c3dfb2..fbb09b307134 100644 --- a/dolphinscheduler-ui/src/views/projects/components/dependencies/dependencies-modal.tsx +++ b/dolphinscheduler-ui/src/views/projects/components/dependencies/dependencies-modal.tsx @@ -18,7 +18,8 @@ import { defineComponent, PropType, - h + h, + ref, watch } from 'vue' import { useI18n } from 'vue-i18n' import {NEllipsis, NModal, NSpace} from 'naive-ui' @@ -56,12 +57,14 @@ export default defineComponent({ setup(props, ctx) { const { t } = useI18n() + const showRef = ref(props.show) + const confirmToHandle = () => { ctx.emit('confirm') } const cancelToHandle = () => { - ctx.emit('update:show') + ctx.emit('update:show', showRef) } const renderDownstreamDependencies = () => { @@ -91,7 +94,12 @@ export default defineComponent({ ) } - return {renderDownstreamDependencies, confirmToHandle, cancelToHandle} + watch(()=> props.show, + () => { + showRef.value = props.show + }) + + return {renderDownstreamDependencies, confirmToHandle, cancelToHandle, showRef} }, render() { @@ -99,7 +107,7 @@ export default defineComponent({ return ( {{ default: () => ( From 93fee9d9d267db20f2d6e23b3aa69ce30a1926f7 Mon Sep 17 00:00:00 2001 From: calvin Date: Thu, 7 Mar 2024 15:33:14 +0800 Subject: [PATCH 09/14] done --- .../api/controller/WorkFlowLineageController.java | 15 ++++++++------- .../impl/ProcessDefinitionServiceImpl.java | 2 -- .../service/impl/WorkFlowLineageServiceImpl.java | 7 ++++--- .../controller/WorkFlowLineageControllerTest.java | 6 ++++-- .../dao/mapper/WorkFlowLineageMapper.java | 3 ++- 5 files changed, 18 insertions(+), 15 deletions(-) diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageController.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageController.java index 0c248e40bf82..f5be941e5839 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageController.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageController.java @@ -138,18 +138,19 @@ public Result verifyTaskCanDelete(@Parameter(hidden = true) @RequestAttribute(va @Operation(summary = "queryDownstreamDependentTaskList", description = "QUERY_DOWNSTREAM_DEPENDENT_TASK_NOTES") @Parameters({ - @Parameter(name = "projectCode", description = "PROJECT_CODE", required = true, schema = @Schema(implementation = Long.class)), - @Parameter(name = "workFlowCode", description = "PROCESS_DEFINITION_CODE", required = true, schema = @Schema(implementation = Long.class)), - @Parameter(name = "taskCode", description = "TASK_DEFINITION_CODE", required = false, schema = @Schema(implementation = Long.class, example = "123456789")), + @Parameter(name = "projectCode", description = "PROJECT_CODE", required = true, schema = @Schema(implementation = Long.class)), + @Parameter(name = "workFlowCode", description = "PROCESS_DEFINITION_CODE", required = true, schema = @Schema(implementation = Long.class)), + @Parameter(name = "taskCode", description = "TASK_DEFINITION_CODE", required = false, schema = @Schema(implementation = Long.class, example = "123456789")), }) @GetMapping(value = "/query-dependent-tasks") @ResponseStatus(HttpStatus.OK) public Result> queryDownstreamDependentTaskList(@Parameter(hidden = true) @RequestAttribute(value = SESSION_USER) User loginUser, - @Parameter(name = "projectCode", description = "PROJECT_CODE", required = true) @PathVariable Long projectCode, - @RequestParam(value = "workFlowCode") Long workFlowCode, - @RequestParam(value = "taskCode", required = false, defaultValue = "0") Long taskCode) { + @Parameter(name = "projectCode", description = "PROJECT_CODE", required = true) @PathVariable Long projectCode, + @RequestParam(value = "workFlowCode") Long workFlowCode, + @RequestParam(value = "taskCode", required = false, defaultValue = "0") Long taskCode) { try { - Map result = workFlowLineageService.queryDownstreamDependentTasks(projectCode, workFlowCode, taskCode); + Map result = + workFlowLineageService.queryDownstreamDependentTasks(projectCode, workFlowCode, taskCode); return returnDataList(result); } catch (Exception e) { log.error(QUERY_WORKFLOW_LINEAGE_ERROR.getMsg(), e); diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java index ec48d402eec1..a4f69d50d113 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java @@ -40,10 +40,8 @@ import static org.apache.dolphinscheduler.common.constants.Constants.LOCAL_PARAMS; import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.LOCAL_PARAMS_LIST; import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.TASK_TYPE; -import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.TASK_TYPE_DEPENDENT; import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.TASK_TYPE_SQL; -import kotlin.sequences.TakeSequence; import org.apache.dolphinscheduler.api.dto.DagDataSchedule; import org.apache.dolphinscheduler.api.dto.treeview.Instance; import org.apache.dolphinscheduler.api.dto.treeview.TreeViewDto; diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkFlowLineageServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkFlowLineageServiceImpl.java index 4c812085b6c7..7422cf45e49d 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkFlowLineageServiceImpl.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkFlowLineageServiceImpl.java @@ -19,7 +19,6 @@ import static org.apache.dolphinscheduler.plugin.task.api.TaskConstants.TASK_TYPE_DEPENDENT; -import java.util.Objects; import org.apache.dolphinscheduler.api.enums.Status; import org.apache.dolphinscheduler.api.exceptions.ServiceException; import org.apache.dolphinscheduler.api.service.WorkFlowLineageService; @@ -50,6 +49,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -297,10 +297,11 @@ public Set queryTaskDepOnProcess(long projectCode, long processDef */ @Override public Map queryDownstreamDependentTasks(Long projectCode, - Long processDefinitionCode, Long taskCode) { + Long processDefinitionCode, Long taskCode) { Map result = new HashMap<>(); List taskDependents = - workFlowLineageMapper.queryTaskDependentOnProcess(processDefinitionCode, Objects.isNull(taskCode)? 0:taskCode.longValue()); + workFlowLineageMapper.queryTaskDependentOnProcess(processDefinitionCode, + Objects.isNull(taskCode) ? 0 : taskCode.longValue()); result.put(Constants.DATA_LIST, taskDependents); putMsg(result, Status.SUCCESS); return result; diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageControllerTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageControllerTest.java index 3d7c84caee8b..90d2c937407c 100644 --- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageControllerTest.java +++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageControllerTest.java @@ -91,7 +91,9 @@ public void testQueryWorkFlowLineageByCode() { public void testQueryDownstreamDependentTaskList() { long projectCode = 1L; long code = 1L; - Mockito.when(workFlowLineageService.queryDownstreamDependentTasks(projectCode, code, null)).thenReturn(new HashMap<>()); - assertDoesNotThrow(() -> workFlowLineageController.queryDownstreamDependentTaskList(user, projectCode, code, null)); + Mockito.when(workFlowLineageService.queryDownstreamDependentTasks(projectCode, code, null)) + .thenReturn(new HashMap<>()); + assertDoesNotThrow( + () -> workFlowLineageController.queryDownstreamDependentTaskList(user, projectCode, code, null)); } } diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.java index 804b49da08c8..649e188e9c8a 100644 --- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.java +++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/WorkFlowLineageMapper.java @@ -128,7 +128,8 @@ List queryTaskSubProcessDepOnProcess(@Param("projectCode") long pr * @param taskCode Task code want to query tasks dependence * @return List of TaskMainInfo */ - List queryTaskDependentOnProcess(@Param("processDefinitionCode") long processDefinitionCode, @Param("taskCode") long taskCode); + List queryTaskDependentOnProcess(@Param("processDefinitionCode") long processDefinitionCode, + @Param("taskCode") long taskCode); /** * Query all tasks depend on task, only downstream task support currently(from dependent task type). From f67f8f607ebd5aba45d2299db6d2d7cecc6b9f45 Mon Sep 17 00:00:00 2001 From: calvin Date: Thu, 7 Mar 2024 17:24:59 +0800 Subject: [PATCH 10/14] improve the test case --- .../api/service/ResourcesServiceTest.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ResourcesServiceTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ResourcesServiceTest.java index fc1766214796..13bfc0e9490d 100644 --- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ResourcesServiceTest.java +++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ResourcesServiceTest.java @@ -21,6 +21,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.when; +import java.util.stream.Collectors; import org.apache.dolphinscheduler.api.dto.resources.DeleteDataTransferResponse; import org.apache.dolphinscheduler.api.dto.resources.ResourceComponent; import org.apache.dolphinscheduler.api.enums.Status; @@ -61,6 +62,7 @@ import java.util.Random; import java.util.Set; +import org.assertj.core.util.Strings; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -494,9 +496,11 @@ public void testUpdateResourceContent() throws Exception { ServiceException serviceException = Assertions.assertThrows(ServiceException.class, () -> resourcesService.updateResourceContent(getUser(), "/dolphinscheduler/123/resources/ResourcesServiceTest.jar", "123", "content")); + + assertEquals( - "Internal Server Error: Resource file: /dolphinscheduler/123/resources/ResourcesServiceTest.jar is illegal", - serviceException.getMessage()); + "Resource file: /dolphinscheduler/123/resources/ResourcesServiceTest.jar is illegal", + Arrays.stream(serviceException.getMessage().split(":")).skip(1).collect(Collectors.joining(":")).trim()); // RESOURCE_NOT_EXIST when(storageOperate.getResDir(Mockito.anyString())).thenReturn("/dolphinscheduler/123/resources"); From 5091109769ef386a35696d67a02f3bd898bbd8db Mon Sep 17 00:00:00 2001 From: calvin Date: Thu, 7 Mar 2024 17:25:46 +0800 Subject: [PATCH 11/14] improve the test case --- .../dolphinscheduler/api/service/ResourcesServiceTest.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ResourcesServiceTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ResourcesServiceTest.java index 13bfc0e9490d..2e27c88df0fa 100644 --- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ResourcesServiceTest.java +++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ResourcesServiceTest.java @@ -21,7 +21,6 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.when; -import java.util.stream.Collectors; import org.apache.dolphinscheduler.api.dto.resources.DeleteDataTransferResponse; import org.apache.dolphinscheduler.api.dto.resources.ResourceComponent; import org.apache.dolphinscheduler.api.enums.Status; @@ -61,8 +60,8 @@ import java.util.Map; import java.util.Random; import java.util.Set; +import java.util.stream.Collectors; -import org.assertj.core.util.Strings; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -497,10 +496,10 @@ public void testUpdateResourceContent() throws Exception { Assertions.assertThrows(ServiceException.class, () -> resourcesService.updateResourceContent(getUser(), "/dolphinscheduler/123/resources/ResourcesServiceTest.jar", "123", "content")); - assertEquals( "Resource file: /dolphinscheduler/123/resources/ResourcesServiceTest.jar is illegal", - Arrays.stream(serviceException.getMessage().split(":")).skip(1).collect(Collectors.joining(":")).trim()); + Arrays.stream(serviceException.getMessage().split(":")).skip(1).collect(Collectors.joining(":")) + .trim()); // RESOURCE_NOT_EXIST when(storageOperate.getResDir(Mockito.anyString())).thenReturn("/dolphinscheduler/123/resources"); From 450e38e8b7c81b5488f023cbace126fa85233f3b Mon Sep 17 00:00:00 2001 From: calvin Date: Fri, 8 Mar 2024 16:44:50 +0800 Subject: [PATCH 12/14] improve codes --- .../api/controller/WorkFlowLineageController.java | 14 ++++---------- .../api/service/WorkFlowLineageService.java | 3 +-- .../service/impl/ProcessDefinitionServiceImpl.java | 7 ------- .../service/impl/WorkFlowLineageServiceImpl.java | 4 +--- .../controller/WorkFlowLineageControllerTest.java | 11 +++++++---- .../src/service/modules/lineages/index.ts | 1 - .../views/projects/task/definition/batch-task.tsx | 2 +- .../src/views/projects/task/definition/index.tsx | 3 +-- .../workflow/components/dag/dag-context-menu.tsx | 7 ------- 9 files changed, 15 insertions(+), 37 deletions(-) diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageController.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageController.java index f5be941e5839..6a6b110d6ea3 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageController.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageController.java @@ -138,23 +138,17 @@ public Result verifyTaskCanDelete(@Parameter(hidden = true) @RequestAttribute(va @Operation(summary = "queryDownstreamDependentTaskList", description = "QUERY_DOWNSTREAM_DEPENDENT_TASK_NOTES") @Parameters({ - @Parameter(name = "projectCode", description = "PROJECT_CODE", required = true, schema = @Schema(implementation = Long.class)), @Parameter(name = "workFlowCode", description = "PROCESS_DEFINITION_CODE", required = true, schema = @Schema(implementation = Long.class)), @Parameter(name = "taskCode", description = "TASK_DEFINITION_CODE", required = false, schema = @Schema(implementation = Long.class, example = "123456789")), }) @GetMapping(value = "/query-dependent-tasks") @ResponseStatus(HttpStatus.OK) + @ApiException(QUERY_WORKFLOW_LINEAGE_ERROR) public Result> queryDownstreamDependentTaskList(@Parameter(hidden = true) @RequestAttribute(value = SESSION_USER) User loginUser, - @Parameter(name = "projectCode", description = "PROJECT_CODE", required = true) @PathVariable Long projectCode, @RequestParam(value = "workFlowCode") Long workFlowCode, @RequestParam(value = "taskCode", required = false, defaultValue = "0") Long taskCode) { - try { - Map result = - workFlowLineageService.queryDownstreamDependentTasks(projectCode, workFlowCode, taskCode); - return returnDataList(result); - } catch (Exception e) { - log.error(QUERY_WORKFLOW_LINEAGE_ERROR.getMsg(), e); - return error(QUERY_WORKFLOW_LINEAGE_ERROR.getCode(), QUERY_WORKFLOW_LINEAGE_ERROR.getMsg()); - } + Map result = + workFlowLineageService.queryDownstreamDependentTasks(workFlowCode, taskCode); + return returnDataList(result); } } diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkFlowLineageService.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkFlowLineageService.java index 2c86c7c0f768..2e535f330704 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkFlowLineageService.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkFlowLineageService.java @@ -48,12 +48,11 @@ public interface WorkFlowLineageService { /** * Query downstream tasks depend on a process definition or a task * - * @param projectCode Project code want to query tasks dependence * @param processDefinitionCode Process definition code want to query tasks dependence * @param taskCode Task code want to query tasks dependence * @return downstream dependent tasks */ - Map queryDownstreamDependentTasks(Long projectCode, Long processDefinitionCode, Long taskCode); + Map queryDownstreamDependentTasks(Long processDefinitionCode, Long taskCode); /** * Query and return tasks dependence with string format, is a wrapper of queryTaskDepOnTask and task query method. diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java index a4f69d50d113..173268c53ac6 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java @@ -815,13 +815,6 @@ public Map updateProcessDefinition(User loginUser, return result; } - /** - * Check if there're any tasks that depend on the process - */ - private void checkIfDependentTaskExists(ProcessDefinition processDefinition) { - - } - /** * Task want to delete whether used in other task, should throw exception when have be used. * diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkFlowLineageServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkFlowLineageServiceImpl.java index 7422cf45e49d..014d22af5724 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkFlowLineageServiceImpl.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkFlowLineageServiceImpl.java @@ -290,14 +290,12 @@ public Set queryTaskDepOnProcess(long projectCode, long processDef /** * Query downstream tasks depend on a process definition or a task * - * @param projectCode Project code want to query tasks dependence * @param processDefinitionCode Process definition code want to query tasks dependence * @param taskCode Task code want to query tasks dependence * @return downstream dependent tasks */ @Override - public Map queryDownstreamDependentTasks(Long projectCode, - Long processDefinitionCode, Long taskCode) { + public Map queryDownstreamDependentTasks(Long processDefinitionCode, Long taskCode) { Map result = new HashMap<>(); List taskDependents = workFlowLineageMapper.queryTaskDependentOnProcess(processDefinitionCode, diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageControllerTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageControllerTest.java index 90d2c937407c..6329cc584adf 100644 --- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageControllerTest.java +++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkFlowLineageControllerTest.java @@ -89,11 +89,14 @@ public void testQueryWorkFlowLineageByCode() { @Test public void testQueryDownstreamDependentTaskList() { - long projectCode = 1L; long code = 1L; - Mockito.when(workFlowLineageService.queryDownstreamDependentTasks(projectCode, code, null)) - .thenReturn(new HashMap<>()); + long taskCode = 1L; + Map result = new HashMap<>(); + result.put(Constants.STATUS, Status.SUCCESS); + Mockito.when(workFlowLineageService.queryDownstreamDependentTasks(code, taskCode)) + .thenReturn(result); + assertDoesNotThrow( - () -> workFlowLineageController.queryDownstreamDependentTaskList(user, projectCode, code, null)); + () -> workFlowLineageController.queryDownstreamDependentTaskList(user, code, taskCode)); } } diff --git a/dolphinscheduler-ui/src/service/modules/lineages/index.ts b/dolphinscheduler-ui/src/service/modules/lineages/index.ts index 5c89b44e928e..d43e69276ce5 100644 --- a/dolphinscheduler-ui/src/service/modules/lineages/index.ts +++ b/dolphinscheduler-ui/src/service/modules/lineages/index.ts @@ -17,7 +17,6 @@ import { axios } from '@/service/service' import {DependentTaskReq, ProjectCodeReq, WorkflowCodeReq} from './types' -import {TaskCodeReq} from "@/service/modules/process-task-relation/types"; export function queryWorkFlowList(projectCode: ProjectCodeReq): any { return axios({ diff --git a/dolphinscheduler-ui/src/views/projects/task/definition/batch-task.tsx b/dolphinscheduler-ui/src/views/projects/task/definition/batch-task.tsx index a886dec27a58..fc51cb84d01f 100644 --- a/dolphinscheduler-ui/src/views/projects/task/definition/batch-task.tsx +++ b/dolphinscheduler-ui/src/views/projects/task/definition/batch-task.tsx @@ -17,7 +17,7 @@ import { defineComponent, - getCurrentInstance, h, + getCurrentInstance, onMounted, toRefs, watch diff --git a/dolphinscheduler-ui/src/views/projects/task/definition/index.tsx b/dolphinscheduler-ui/src/views/projects/task/definition/index.tsx index cc92064617be..d762e4718bbe 100644 --- a/dolphinscheduler-ui/src/views/projects/task/definition/index.tsx +++ b/dolphinscheduler-ui/src/views/projects/task/definition/index.tsx @@ -17,10 +17,9 @@ import { defineComponent } from 'vue' import { useI18n } from 'vue-i18n' -import {NModal, NSpace, NTabPane, NTabs} from 'naive-ui' +import { NTabPane, NTabs } from 'naive-ui' import BatchTaskDefinition from './batch-task' import StreamTaskDefinition from './stream-task' -import {useTable} from "@/views/projects/task/definition/use-stream-table"; const TaskDefinition = defineComponent({ name: 'task-definition', diff --git a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-context-menu.tsx b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-context-menu.tsx index 4b246d213523..673dfc0313ca 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-context-menu.tsx +++ b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-context-menu.tsx @@ -86,13 +86,6 @@ export default defineComponent({ const workflowCode = Number(route.params.code) const { t } = useI18n() - // const dependenciesData = reactive({ - // showRef: false, - // taskLinks: ref([]), - // required: ref(false), - // tip: ref(''), action: () => {} - // }) - const { getDependentTaskLinksByTask } = useDependencies() const hide = () => { From 8af56349f74667f863b9584919949ec13f33a21a Mon Sep 17 00:00:00 2001 From: calvin Date: Sat, 9 Mar 2024 22:27:03 +0800 Subject: [PATCH 13/14] prettier the codes --- .../components/dag/dag-context-menu.tsx | 3 +-- .../workflow/components/dag/dag-toolbar.tsx | 2 +- .../definition/components/table-action.tsx | 4 ++-- .../projects/workflow/definition/index.tsx | 23 ++++++++----------- .../views/projects/workflow/timing/index.tsx | 1 - 5 files changed, 13 insertions(+), 20 deletions(-) diff --git a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-context-menu.tsx b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-context-menu.tsx index 673dfc0313ca..08aa8155f9af 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-context-menu.tsx +++ b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-context-menu.tsx @@ -17,7 +17,7 @@ import { genTaskCodeList } from '@/service/modules/task-definition' import type { Cell } from '@antv/x6' -import { defineComponent, onMounted, PropType, inject, ref, h, reactive } from 'vue' +import { defineComponent, onMounted, PropType, inject, ref } from 'vue' import { useI18n } from 'vue-i18n' import {Router, useRoute, useRouter} from 'vue-router' import styles from './menu.module.scss' @@ -81,7 +81,6 @@ export default defineComponent({ setup(props, ctx) { const graph = inject('graph', ref()) const route = useRoute() - const router: Router = useRouter() const projectCode = Number(route.params.projectCode) const workflowCode = Number(route.params.code) const { t } = useI18n() diff --git a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-toolbar.tsx b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-toolbar.tsx index 7cee9d13ff39..18d09499a14b 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-toolbar.tsx +++ b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-toolbar.tsx @@ -49,7 +49,7 @@ import type { Graph } from '@antv/x6' import StartupParam from './dag-startup-param' import VariablesView from '@/views/projects/workflow/instance/components/variables-view' import { WorkflowDefinition, WorkflowInstance } from './types' -import {useDependencies} from "@/views/projects/components/dependencies/use-dependencies" +import { useDependencies } from "@/views/projects/components/dependencies/use-dependencies" const props = { layoutToggle: { diff --git a/dolphinscheduler-ui/src/views/projects/workflow/definition/components/table-action.tsx b/dolphinscheduler-ui/src/views/projects/workflow/definition/components/table-action.tsx index 2515ee732e57..1453e7ed4f6f 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/definition/components/table-action.tsx +++ b/dolphinscheduler-ui/src/views/projects/workflow/definition/components/table-action.tsx @@ -15,8 +15,8 @@ * limitations under the License. */ -import {defineComponent, PropType, toRefs, h, computed, watch, ref} from 'vue' -import {NSpace, NTooltip, NButton, NIcon, NPopconfirm, NEllipsis, darkTheme} from 'naive-ui' +import { defineComponent, PropType, toRefs } from 'vue' +import { NSpace, NTooltip, NButton, NIcon, NPopconfirm } from 'naive-ui' import { DeleteOutlined, DownloadOutlined, diff --git a/dolphinscheduler-ui/src/views/projects/workflow/definition/index.tsx b/dolphinscheduler-ui/src/views/projects/workflow/definition/index.tsx index f6ddcf3b1a66..90b55adf178c 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/definition/index.tsx +++ b/dolphinscheduler-ui/src/views/projects/workflow/definition/index.tsx @@ -25,14 +25,13 @@ import { NTooltip, NPopconfirm, NModal, - NEllipsis } from 'naive-ui' import { defineComponent, - getCurrentInstance, h, + getCurrentInstance, onMounted, toRefs, - watch, + watch } from 'vue' import { useI18n } from 'vue-i18n' import { useTable } from './use-table' @@ -46,10 +45,7 @@ import VersionModal from './components/version-modal' import CopyModal from './components/copy-modal' import type { Router } from 'vue-router' import Search from '@/components/input-search' -import ButtonLink from "@/components/button-link" -import {release} from "@/service/modules/process-definition" -import { offline } from '@/service/modules/schedules' -import DependenciesModal from "@/views/projects/components/dependencies/dependencies-modal"; +import DependenciesModal from '@/views/projects/components/dependencies/dependencies-modal' export default defineComponent({ name: 'WorkflowDefinitionList', @@ -58,7 +54,6 @@ export default defineComponent({ const route = useRoute() const projectCode = Number(route.params.projectCode) const uiSettingStore = useUISettingStore() - const { t } = useI18n() const { variables, @@ -325,12 +320,12 @@ export default defineComponent({ onPositiveClick={this.confirmToSetWorkflowTiming} /> ) diff --git a/dolphinscheduler-ui/src/views/projects/workflow/timing/index.tsx b/dolphinscheduler-ui/src/views/projects/workflow/timing/index.tsx index e18fc400aec5..37a33447d5f3 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/timing/index.tsx +++ b/dolphinscheduler-ui/src/views/projects/workflow/timing/index.tsx @@ -29,7 +29,6 @@ export default defineComponent({ name: 'WorkflowTimingList', setup() { const { variables, createColumns, getTableData } = useTable() - const { t } = useI18n() const requestData = () => { getTableData({ From 5a7c99cddca30f7f03156ee8726aaad284ab8d37 Mon Sep 17 00:00:00 2001 From: calvin Date: Sat, 9 Mar 2024 23:54:02 +0800 Subject: [PATCH 14/14] prettier the codes --- .../workflow/components/dag/dag-context-menu.tsx | 14 ++++++++------ .../workflow/components/dag/dag-toolbar.tsx | 10 ++++++---- .../projects/workflow/components/dag/index.tsx | 4 ++-- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-context-menu.tsx b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-context-menu.tsx index 08aa8155f9af..517a67d0afbf 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-context-menu.tsx +++ b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-context-menu.tsx @@ -19,7 +19,7 @@ import { genTaskCodeList } from '@/service/modules/task-definition' import type { Cell } from '@antv/x6' import { defineComponent, onMounted, PropType, inject, ref } from 'vue' import { useI18n } from 'vue-i18n' -import {Router, useRoute, useRouter} from 'vue-router' +import { useRoute } from 'vue-router' import styles from './menu.module.scss' import { uuid } from '@/common/common' import { IWorkflowTaskInstance } from './types' @@ -87,6 +87,8 @@ export default defineComponent({ const { getDependentTaskLinksByTask } = useDependencies() + const dependenciesData = props.dependenciesData + const hide = () => { ctx.emit('hide', false) } @@ -146,12 +148,12 @@ export default defineComponent({ const handleDelete = async () => { let taskCode = props.cell?.id let res = await getDependentTaskLinksByTask(projectCode, workflowCode, taskCode) - props.dependenciesData.showRef = false + dependenciesData.showRef = false if (res.length > 0) { - props.dependenciesData.showRef = true - props.dependenciesData.taskLinks = res - props.dependenciesData.tip = t('project.task.delete_validate_dependent_tasks_desc') - props.dependenciesData.required = true + dependenciesData.showRef = true + dependenciesData.taskLinks = res + dependenciesData.tip = t('project.task.delete_validate_dependent_tasks_desc') + dependenciesData.required = true } else { graph.value?.removeCell(props.cell) ctx.emit('removeTasks', [Number(props.cell?.id)]) diff --git a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-toolbar.tsx b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-toolbar.tsx index 18d09499a14b..5dc191db9b73 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-toolbar.tsx +++ b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-toolbar.tsx @@ -88,6 +88,8 @@ export default defineComponent({ const workflowCode = Number(route.params.code) const { getDependentTaskLinksByMultipleTasks } = useDependencies() + const dependenciesData = props.dependenciesData + /** * Node search and navigate */ @@ -181,10 +183,10 @@ export default defineComponent({ .map((cell) => +cell.id) const res = await getDependentTaskLinksByMultipleTasks(projectCode, workflowCode, codes) if (res.length > 0) { - props.dependenciesData.showRef = true - props.dependenciesData.taskLinks = res - props.dependenciesData.tip = t('project.task.delete_validate_dependent_tasks_desc') - props.dependenciesData.required = true + dependenciesData.showRef = true + dependenciesData.taskLinks = res + dependenciesData.tip = t('project.task.delete_validate_dependent_tasks_desc') + dependenciesData.required = true } else { context.emit('removeTasks', codes, cells) graph.value?.removeCells(cells) diff --git a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/index.tsx b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/index.tsx index be1f25ed8a5b..e04afecd09d8 100644 --- a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/index.tsx +++ b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/index.tsx @@ -381,7 +381,7 @@ export default defineComponent({ onSaveModelToggle={saveModelToggle} onRemoveTasks={removeTasks} onRefresh={refreshTaskStatus} - dependenciesData={dependenciesData} + v-model:dependenciesData={dependenciesData} />
@@ -437,7 +437,7 @@ export default defineComponent({ onViewLog={handleViewLog} onExecuteTask={handleExecuteTask} onRemoveTaskInstanceCache={handleRemoveTaskInstanceCache} - dependenciesData={dependenciesData} + v-model:dependenciesData={dependenciesData} />