From a22220e8358309996129d95b38d1b848c4a13f30 Mon Sep 17 00:00:00 2001 From: calvin Date: Mon, 21 Feb 2022 19:52:34 +0800 Subject: [PATCH] The form of procedure task is done (#8473) --- .../src/locales/modules/en_US.ts | 4 +- .../src/locales/modules/zh_CN.ts | 4 +- .../task/components/node/fields/index.ts | 1 + .../components/node/fields/use-procedure.ts | 141 ++++++++++++++++++ .../task/components/node/format-data.ts | 11 ++ .../components/node/tasks/use-procedure.ts | 87 +++++++++++ .../projects/task/components/node/types.ts | 2 + .../projects/task/components/node/use-task.ts | 9 ++ 8 files changed, 257 insertions(+), 2 deletions(-) create mode 100644 dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-procedure.ts create mode 100644 dolphinscheduler-ui-next/src/views/projects/task/components/node/tasks/use-procedure.ts diff --git a/dolphinscheduler-ui-next/src/locales/modules/en_US.ts b/dolphinscheduler-ui-next/src/locales/modules/en_US.ts index 07d13204df..6c91e5cb4f 100644 --- a/dolphinscheduler-ui-next/src/locales/modules/en_US.ts +++ b/dolphinscheduler-ui-next/src/locales/modules/en_US.ts @@ -682,7 +682,9 @@ const project = { pre_sql_statement: 'Pre SQL Statement', post_sql_statement: 'Post SQL Statement', sql_input_placeholder: 'Please enter non-query sql.', - sql_empty_tips: 'The sql can not be empty.' + sql_empty_tips: 'The sql can not be empty.', + procedure_method: 'SQL Statement', + procedure_method_tips: 'Please enter the procedure script' } } diff --git a/dolphinscheduler-ui-next/src/locales/modules/zh_CN.ts b/dolphinscheduler-ui-next/src/locales/modules/zh_CN.ts index 8184d8af61..a503c76830 100644 --- a/dolphinscheduler-ui-next/src/locales/modules/zh_CN.ts +++ b/dolphinscheduler-ui-next/src/locales/modules/zh_CN.ts @@ -674,7 +674,9 @@ const project = { pre_sql_statement: '前置SQL语句', post_sql_statement: '后置SQL语句', sql_input_placeholder: '请输入非查询SQL语句', - sql_empty_tips: '语句不能为空' + sql_empty_tips: '语句不能为空', + procedure_method: 'SQL语句', + procedure_method_tips: '请输入存储脚本' } } diff --git a/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/index.ts b/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/index.ts index 69216c7a6e..1dd5292c84 100644 --- a/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/index.ts +++ b/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/index.ts @@ -33,6 +33,7 @@ export { useTargetTaskName } from './use-target-task-name' export { useDatasourceType } from './use-datasource-type' export { useDatasource } from './use-datasource' export { useSqlType } from './use-sql-type' +export { useProcedure } from './use-procedure' export { useShell } from './use-shell' export { useSpark } from './use-spark' diff --git a/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-procedure.ts b/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-procedure.ts new file mode 100644 index 0000000000..4f536d4f73 --- /dev/null +++ b/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-procedure.ts @@ -0,0 +1,141 @@ +/* + * 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 { useI18n } from 'vue-i18n' +import type { IJsonItem } from '../types' + +export function useProcedure(model: { [field: string]: any }): IJsonItem[] { + const { t } = useI18n() + + return [ + { + type: 'editor', + field: 'method', + name: t('project.node.procedure_method'), + validate: { + trigger: ['input', 'trigger'], + required: true, + message: t('project.node.procedure_method_tips') + } + }, + { + type: 'custom-parameters', + field: 'localParams', + name: t('project.node.custom_parameters'), + children: [ + { + type: 'input', + field: 'prop', + span: 6, + props: { + placeholder: t('project.node.prop_tips'), + maxLength: 256 + }, + validate: { + trigger: ['input', 'blur'], + required: true, + validator(validate: any, value: string) { + if (!value) { + return new Error(t('project.node.prop_tips')) + } + + const sameItems = model.localParams.filter( + (item: { prop: string }) => item.prop === value + ) + + if (sameItems.length > 1) { + return new Error(t('project.node.prop_repeat')) + } + } + } + }, + { + type: 'select', + field: 'direct', + span: 4, + options: DIRECT_LIST, + value: 'IN' + }, + { + type: 'select', + field: 'type', + span: 6, + options: TYPE_LIST, + value: 'VARCHAR' + }, + { + type: 'input', + field: 'value', + span: 6, + props: { + placeholder: t('project.node.value_tips'), + maxLength: 256 + } + } + ] + } + ] +} + +export const TYPE_LIST = [ + { + value: 'VARCHAR', + label: 'VARCHAR' + }, + { + value: 'INTEGER', + label: 'INTEGER' + }, + { + value: 'LONG', + label: 'LONG' + }, + { + value: 'FLOAT', + label: 'FLOAT' + }, + { + value: 'DOUBLE', + label: 'DOUBLE' + }, + { + value: 'DATE', + label: 'DATE' + }, + { + value: 'TIME', + label: 'TIME' + }, + { + value: 'TIMESTAMP', + label: 'TIMESTAMP' + }, + { + value: 'BOOLEAN', + label: 'BOOLEAN' + } +] + +export const DIRECT_LIST = [ + { + value: 'IN', + label: 'IN' + }, + { + value: 'OUT', + label: 'OUT' + } +] diff --git a/dolphinscheduler-ui-next/src/views/projects/task/components/node/format-data.ts b/dolphinscheduler-ui-next/src/views/projects/task/components/node/format-data.ts index 227c3db03a..6d373b583c 100644 --- a/dolphinscheduler-ui-next/src/views/projects/task/components/node/format-data.ts +++ b/dolphinscheduler-ui-next/src/views/projects/task/components/node/format-data.ts @@ -76,6 +76,12 @@ export function formatParams(data: INodeData): { taskParams.postStatements = data.postStatements } + if (data.taskType === 'PROCEDURE') { + taskParams.type = data.type + taskParams.datasource = data.datasource + taskParams.method = data.method + } + const params = { processDefinitionCode: data.processName ? String(data.processName) : '', upstreamCodes: data?.preTasks?.join(','), @@ -152,5 +158,10 @@ export function formatModel(data: ITaskData) { if (data.taskParams?.mainJar) { params.mainJar = data.taskParams?.mainJar.id } + + if (data.taskParams?.method) { + params.method = data.taskParams?.method + } + return params } diff --git a/dolphinscheduler-ui-next/src/views/projects/task/components/node/tasks/use-procedure.ts b/dolphinscheduler-ui-next/src/views/projects/task/components/node/tasks/use-procedure.ts new file mode 100644 index 0000000000..2fb081599c --- /dev/null +++ b/dolphinscheduler-ui-next/src/views/projects/task/components/node/tasks/use-procedure.ts @@ -0,0 +1,87 @@ +/* + * 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 { reactive } from 'vue' +import * as Fields from '../fields/index' +import type { IJsonItem, INodeData } from '../types' +import { ITaskData } from '../types' + +export function useProcedure({ + projectCode, + from = 0, + readonly, + data +}: { + projectCode: number + from?: number + readonly?: boolean + data?: ITaskData +}) { + const model = reactive({ + name: '', + taskType: 'PROCEDURE', + flag: 'YES', + description: '', + timeoutFlag: false, + localParams: [], + environmentCode: null, + failRetryInterval: 1, + failRetryTimes: 0, + workerGroup: 'default', + delayTime: 0, + timeout: 30, + type: data?.taskParams?.type ? data?.taskParams?.type : 'MYSQL', + datasource: data?.taskParams?.datasource, + method: data?.taskParams?.method + } as INodeData) + + let extra: IJsonItem[] = [] + if (from === 1) { + extra = [ + Fields.useTaskType(model, readonly), + Fields.useProcessName({ + model, + projectCode, + isCreate: !data?.id, + from, + processName: data?.processName, + code: data?.code + }) + ] + } + + return { + json: [ + Fields.useName(), + ...extra, + Fields.useRunFlag(), + Fields.useDescription(), + Fields.useTaskPriority(), + Fields.useWorkerGroup(), + Fields.useEnvironmentName(model, !model.id), + ...Fields.useTaskGroup(model, projectCode), + ...Fields.useFailed(), + Fields.useDelayTime(model), + ...Fields.useTimeoutAlarm(model), + Fields.useDatasourceType(model), + Fields.useDatasource(model), + ...Fields.useProcedure(model), + Fields.usePreTasks(model) + ] as IJsonItem[], + model + } +} diff --git a/dolphinscheduler-ui-next/src/views/projects/task/components/node/types.ts b/dolphinscheduler-ui-next/src/views/projects/task/components/node/types.ts index 6895827e30..ba537bc1ab 100644 --- a/dolphinscheduler-ui-next/src/views/projects/task/components/node/types.ts +++ b/dolphinscheduler-ui-next/src/views/projects/task/components/node/types.ts @@ -76,6 +76,7 @@ interface ITaskParams { sqlType?: string preStatements?: string[] postStatements?: string[] + method?: string } type ITaskType = TaskType @@ -111,6 +112,7 @@ interface INodeData extends Omit { sqlType?: string preStatements?: string[] postStatements?: string[] + method?: string } interface ITaskData diff --git a/dolphinscheduler-ui-next/src/views/projects/task/components/node/use-task.ts b/dolphinscheduler-ui-next/src/views/projects/task/components/node/use-task.ts index 7b67cdb766..69618b24c9 100644 --- a/dolphinscheduler-ui-next/src/views/projects/task/components/node/use-task.ts +++ b/dolphinscheduler-ui-next/src/views/projects/task/components/node/use-task.ts @@ -24,6 +24,7 @@ import { useSpark } from './tasks/use-spark' import { useMr } from './tasks/use-mr' import { useHttp } from './tasks/use-http' import { useSql } from './tasks/use-sql' +import { useProcedure } from './tasks/use-procedure' import { IJsonItem, INodeData, ITaskData } from './types' export function useTask({ @@ -111,5 +112,13 @@ export function useTask({ data }) } + if (taskType === 'PROCEDURE') { + node = useProcedure({ + projectCode, + from, + readonly, + data + }) + } return node }