Browse Source

[Bug-13008] [UI] When using the complement function, turn on the dependent mode to generate multiple unrelated workflow instances (#13009)

* Fix dirty data generated by dependent nodes.
Kerwin 2 years ago
parent
commit
597ae5ff7c

+ 27 - 14
dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-dependent.ts

@@ -29,7 +29,9 @@ import {
 import { Router, useRouter } from 'vue-router'
 import type {
   IJsonItem,
-  IDependpendItem,
+  IDependentItem,
+  IDependentItemOptions,
+  IDependTaskOptions,
   IDependTask,
   ITaskState,
   IDateType
@@ -49,6 +51,7 @@ export function useDependent(model: { [field: string]: any }): IJsonItem[] {
   const taskCache = {} as {
     [key: number]: { label: string; value: number }[]
   }
+  const selectOptions = ref([] as IDependTaskOptions[])
 
   const CYCLE_LIST = [
     {
@@ -236,25 +239,30 @@ export function useDependent(model: { [field: string]: any }): IJsonItem[] {
   watch(
     () => model.dependTaskList,
     (value) => {
-      value.forEach((item: IDependTask) => {
+      selectOptions.value = []
+      value.forEach((item: IDependTask, taskIndex: number) => {
         if (!item.dependItemList?.length) return
 
-        item.dependItemList?.forEach(async (dependItem: IDependpendItem) => {
+        const itemListOptions = ref([] as IDependentItemOptions[])
+        item.dependItemList?.forEach(async (dependItem: IDependentItem, itemIndex: number) => {
+          itemListOptions.value[itemIndex] = {}
           if (dependItem.projectCode) {
-            dependItem.definitionCodeOptions = await getProcessList(
+            itemListOptions.value[itemIndex].definitionCodeOptions = await getProcessList(
               dependItem.projectCode
             )
           }
           if (dependItem.projectCode && dependItem.definitionCode) {
-            dependItem.depTaskCodeOptions = await getTaskList(
+            itemListOptions.value[itemIndex].depTaskCodeOptions = await getTaskList(
               dependItem.projectCode,
               dependItem.definitionCode
             )
           }
           if (dependItem.cycle) {
-            dependItem.dateOptions = DATE_LIST[dependItem.cycle]
+            itemListOptions.value[itemIndex].dateOptions = DATE_LIST[dependItem.cycle]
           }
         })
+        selectOptions.value[taskIndex] = {} as IDependTaskOptions
+        selectOptions.value[taskIndex].dependItemList = itemListOptions.value
       })
     }
   )
@@ -277,7 +285,13 @@ export function useDependent(model: { [field: string]: any }): IJsonItem[] {
               filterable: true,
               onUpdateValue: async (projectCode: number) => {
                 const item = model.dependTaskList[i].dependItemList[j]
-                item.definitionCodeOptions = await getProcessList(projectCode)
+                const options = selectOptions?.value[i] || {}
+                const itemListOptions = options?.dependItemList || []
+                const itemOptions = {} as IDependentItemOptions
+                itemOptions.definitionCodeOptions = await getProcessList(projectCode)
+                itemListOptions[j] = itemOptions
+                options.dependItemList = itemListOptions
+                selectOptions.value[i] = options
                 item.depTaskCode = null
                 item.definitionCode = null
               }
@@ -303,16 +317,15 @@ export function useDependent(model: { [field: string]: any }): IJsonItem[] {
               filterable: true,
               onUpdateValue: async (processCode: number) => {
                 const item = model.dependTaskList[i].dependItemList[j]
-                item.depTaskCodeOptions = await getTaskList(
+                selectOptions.value[i].dependItemList[j].depTaskCodeOptions = await getTaskList(
                   item.projectCode,
                   processCode
                 )
                 item.depTaskCode = 0
               }
             },
-            options:
-              model.dependTaskList[i]?.dependItemList[j]
-                ?.definitionCodeOptions || [],
+            options: selectOptions.value[i]?.dependItemList[j]
+                    ?.definitionCodeOptions || [],
             path: `dependTaskList.${i}.dependItemList.${j}.definitionCode`,
             rule: {
               required: true,
@@ -333,7 +346,7 @@ export function useDependent(model: { [field: string]: any }): IJsonItem[] {
               filterable: true
             },
             options:
-              model.dependTaskList[i]?.dependItemList[j]?.depTaskCodeOptions ||
+              selectOptions.value[i]?.dependItemList[j]?.depTaskCodeOptions ||
               [],
             path: `dependTaskList.${i}.dependItemList.${j}.depTaskCode`,
             rule: {
@@ -353,7 +366,7 @@ export function useDependent(model: { [field: string]: any }): IJsonItem[] {
             name: t('project.node.cycle_time'),
             props: {
               onUpdateValue: (value: IDateType) => {
-                model.dependTaskList[i].dependItemList[j].dateOptions =
+                selectOptions.value[i].dependItemList[j].dateOptions =
                   DATE_LIST[value]
                 model.dependTaskList[i].dependItemList[j].dateValue = null
               }
@@ -376,7 +389,7 @@ export function useDependent(model: { [field: string]: any }): IJsonItem[] {
             span: 10,
             name: ' ',
             options:
-              model.dependTaskList[i]?.dependItemList[j]?.dateOptions || [],
+              selectOptions.value[i]?.dependItemList[j]?.dateOptions || [],
             path: `dependTaskList.${i}.dependItemList.${j}.dateValue`,
             rule: {
               trigger: ['input', 'blur'],

+ 3 - 16
dolphinscheduler-ui/src/views/projects/task/components/node/format-data.ts

@@ -15,15 +15,14 @@
  * limitations under the License.
  */
 
-import { omit, cloneDeep } from 'lodash'
+import { omit } from 'lodash'
 import type {
   INodeData,
   ITaskData,
   ITaskParams,
   ISqoopTargetParams,
   ISqoopSourceParams,
-  ILocalParam,
-  IDependTask
+  ILocalParam
 } from './types'
 
 export function formatParams(data: INodeData): {
@@ -270,21 +269,9 @@ export function formatParams(data: INodeData): {
     taskParams.xmx = data.xmx
   }
   if (data.taskType === 'DEPENDENT') {
-    const dependTaskList = cloneDeep(data.dependTaskList)?.map(
-      (taskItem: IDependTask) => {
-        if (taskItem.dependItemList?.length) {
-          taskItem.dependItemList.forEach((dependItem) => {
-            delete dependItem.definitionCodeOptions
-            delete dependItem.depTaskCodeOptions
-            delete dependItem.dateOptions
-          })
-        }
-        return taskItem
-      }
-    )
     taskParams.dependence = {
       relation: data.relation,
-      dependTaskList: dependTaskList
+      dependTaskList: data.dependTaskList
     }
   }
   if (data.taskType === 'DATA_QUALITY') {

+ 14 - 5
dolphinscheduler-ui/src/views/projects/task/components/node/types.ts

@@ -66,12 +66,19 @@ interface IResponseJsonItem extends Omit<IJsonItemParams, 'type'> {
   emit: 'change'[]
 }
 
-interface IDependpendItem {
-  depTaskCode?: number
-  status?: 'SUCCESS' | 'FAILURE'
+interface IDependentItemOptions {
   definitionCodeOptions?: IOption[]
   depTaskCodeOptions?: IOption[]
   dateOptions?: IOption[]
+}
+
+interface IDependTaskOptions {
+  dependItemList: IDependentItemOptions[]
+}
+
+interface IDependentItem {
+  depTaskCode?: number
+  status?: 'SUCCESS' | 'FAILURE'
   projectCode?: number
   definitionCode?: number
   cycle?: 'month' | 'week' | 'day' | 'hour'
@@ -82,7 +89,7 @@ interface IDependTask {
   condition?: string
   nextNode?: number
   relation?: RelationType
-  dependItemList?: IDependpendItem[]
+  dependItemList?: IDependentItem[]
 }
 
 interface ISwitchResult {
@@ -481,7 +488,9 @@ export {
   ISqoopSourceParams,
   ISqoopTargetParams,
   IDependTask,
-  IDependpendItem,
+  IDependentItem,
+  IDependentItemOptions,
+  IDependTaskOptions,
   IFormItem,
   IJsonItem,
   FormRules,