This is an automated email from the ASF dual-hosted git repository.

kerwin pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git


The following commit(s) were added to refs/heads/dev by this push:
     new 5213290262 [Feature-14863][API] Support to manage what worker groups 
can be used for a project. (#15600)
5213290262 is described below

commit 5213290262117d78dcd8936dd28eec2002a3e538
Author: calvin <jianghuachina...@163.com>
AuthorDate: Tue Feb 20 17:20:00 2024 +0800

    [Feature-14863][API] Support to manage what worker groups can be used for a 
project. (#15600)
---
 .../controller/ProjectWorkerGroupController.java   | 104 +++++++++
 .../api/controller/WorkerGroupController.java      |   1 -
 .../apache/dolphinscheduler/api/enums/Status.java  |   9 +
 .../service/ProjectWorkerGroupRelationService.java |  48 +++++
 .../ProjectWorkerGroupRelationServiceImpl.java     | 233 +++++++++++++++++++++
 .../ProjectWorkerGroupRelationServiceTest.java     | 161 ++++++++++++++
 .../dao/entity/ProjectWorkerGroup.java}            |  42 +++-
 .../dao/mapper/ProjectWorkerGroupMapper.java}      |  12 +-
 .../src/main/resources/sql/dolphinscheduler_h2.sql |  15 ++
 .../main/resources/sql/dolphinscheduler_mysql.sql  |  17 ++
 .../resources/sql/dolphinscheduler_postgresql.sql  |  19 ++
 .../3.2.2_schema/mysql/dolphinscheduler_ddl.sql    |  11 +
 .../postgresql/dolphinscheduler_ddl.sql            |  14 ++
 .../dao/mapper/ProjectWorkerGroupMapperTest.java   | 113 ++++++++++
 dolphinscheduler-ui/src/locales/en_US/project.ts   |   3 +-
 dolphinscheduler-ui/src/locales/zh_CN/project.ts   |   3 +-
 .../service/modules/projects-worker-group/index.ts |  25 ++-
 .../service/modules/projects-worker-group/types.ts |  20 +-
 .../src/service/modules/worker-groups/index.ts     |   2 +-
 .../projects/list/components/use-worker-group.ts   |  77 +++++++
 .../list/components/worker-group-modal.tsx         |  91 ++++++++
 .../src/views/projects/list/index.tsx              |  18 ++
 .../src/views/projects/list/use-table.ts           |  44 +++-
 .../src/views/projects/preference/use-form.ts      |   2 +-
 .../components/node/fields/use-worker-group.ts     |   9 +-
 .../task/components/node/tasks/use-chunjun.ts      |   2 +-
 .../task/components/node/tasks/use-conditions.ts   |   2 +-
 .../task/components/node/tasks/use-data-factory.ts |   2 +-
 .../task/components/node/tasks/use-data-quality.ts |   2 +-
 .../task/components/node/tasks/use-datasync.ts     |   2 +-
 .../task/components/node/tasks/use-datax.ts        |   2 +-
 .../task/components/node/tasks/use-dependent.ts    |   2 +-
 .../task/components/node/tasks/use-dinky.ts        |   2 +-
 .../projects/task/components/node/tasks/use-dms.ts |   2 +-
 .../projects/task/components/node/tasks/use-dvc.ts |   2 +-
 .../task/components/node/tasks/use-dynamic.ts      |   2 +-
 .../projects/task/components/node/tasks/use-emr.ts |   2 +-
 .../task/components/node/tasks/use-flink-stream.ts |   2 +-
 .../task/components/node/tasks/use-flink.ts        |   2 +-
 .../task/components/node/tasks/use-hive-cli.ts     |   2 +-
 .../task/components/node/tasks/use-http.ts         |   2 +-
 .../task/components/node/tasks/use-java.ts         |   2 +-
 .../task/components/node/tasks/use-jupyter.ts      |   2 +-
 .../projects/task/components/node/tasks/use-k8s.ts |   2 +-
 .../task/components/node/tasks/use-kubeflow.ts     |   2 +-
 .../task/components/node/tasks/use-linkis.ts       |   2 +-
 .../task/components/node/tasks/use-mlflow.ts       |   2 +-
 .../projects/task/components/node/tasks/use-mr.ts  |   2 +-
 .../task/components/node/tasks/use-openmldb.ts     |   2 +-
 .../task/components/node/tasks/use-pigeon.ts       |   2 +-
 .../task/components/node/tasks/use-procedure.ts    |   2 +-
 .../task/components/node/tasks/use-python.ts       |   2 +-
 .../task/components/node/tasks/use-pytorch.ts      |   2 +-
 .../task/components/node/tasks/use-remote-shell.ts |   2 +-
 .../task/components/node/tasks/use-sagemaker.ts    |   2 +-
 .../task/components/node/tasks/use-sea-tunnel.ts   |   2 +-
 .../task/components/node/tasks/use-shell.ts        |   2 +-
 .../task/components/node/tasks/use-spark.ts        |   2 +-
 .../projects/task/components/node/tasks/use-sql.ts |   2 +-
 .../task/components/node/tasks/use-sqoop.ts        |   2 +-
 .../task/components/node/tasks/use-sub-process.ts  |   2 +-
 .../task/components/node/tasks/use-switch.ts       |   2 +-
 .../task/components/node/tasks/use-zeppelin.ts     |   2 +-
 .../workflow/definition/components/use-modal.ts    |   9 +-
 64 files changed, 1118 insertions(+), 60 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
new file mode 100644
index 0000000000..a9ac074798
--- /dev/null
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProjectWorkerGroupController.java
@@ -0,0 +1,104 @@
+/*
+ * 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.
+ */
+
+package org.apache.dolphinscheduler.api.controller;
+
+import static 
org.apache.dolphinscheduler.api.enums.Status.ASSIGN_WORKER_GROUP_TO_PROJECT_ERROR;
+
+import org.apache.dolphinscheduler.api.exceptions.ApiException;
+import 
org.apache.dolphinscheduler.api.service.ProjectWorkerGroupRelationService;
+import org.apache.dolphinscheduler.api.utils.Result;
+import org.apache.dolphinscheduler.common.constants.Constants;
+import org.apache.dolphinscheduler.dao.entity.User;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import lombok.extern.slf4j.Slf4j;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestController;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+/**
+ * project and worker group controller
+ */
+@Tag(name = "PROJECT_WORKER_GROUP_TAG")
+@RestController
+@RequestMapping("projects/{projectCode}/worker-group")
+@Slf4j
+public class ProjectWorkerGroupController extends BaseController {
+
+    @Autowired
+    private ProjectWorkerGroupRelationService 
projectWorkerGroupRelationService;
+
+    /**
+     * assign worker groups to the project
+     *
+     * @param loginUser login user
+     * @param projectCode project code
+     @ @RequestParam(value = "workerGroups", required = false) String 
workerGroups
+     * @return create result code
+     */
+    @Operation(summary = "assignWorkerGroups", description = 
"CREATE_PROCESS_DEFINITION_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))
+    })
+    @PostMapping()
+    @ResponseStatus(HttpStatus.CREATED)
+    @ApiException(ASSIGN_WORKER_GROUP_TO_PROJECT_ERROR)
+    public Result assignWorkerGroups(@Parameter(hidden = true) 
@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
+                                     @Parameter(name = "projectCode", 
description = "PROJECT_CODE", required = true) @PathVariable long projectCode,
+                                     @Parameter(name = "workerGroups") 
String[] workerGroups) {
+
+        List<String> workerGroupList = 
Arrays.stream(workerGroups).collect(Collectors.toList());
+        return 
projectWorkerGroupRelationService.assignWorkerGroupsToProject(loginUser, 
projectCode, workerGroupList);
+    }
+
+    /**
+     * query worker groups that assigned to the project
+     *
+     * @param projectCode project code
+     * @return worker group list
+     */
+    @Operation(summary = "queryWorkerGroups", description = 
"QUERY_WORKER_GROUP_LIST")
+    @Parameters({
+            @Parameter(name = "projectCode", description = "PROJECT_CODE", 
schema = @Schema(implementation = long.class, example = "123456"))
+    })
+    @GetMapping()
+    @ResponseStatus(HttpStatus.OK)
+    public Map<String, Object> queryWorkerGroups(@Parameter(hidden = true) 
@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
+                                                 @Parameter(name = 
"projectCode", description = "PROJECT_CODE", required = true) @PathVariable 
long projectCode) {
+        return 
projectWorkerGroupRelationService.queryWorkerGroupsByProject(loginUser, 
projectCode);
+    }
+
+}
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkerGroupController.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkerGroupController.java
index 6b91f7c0ee..8c332a7bbb 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkerGroupController.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkerGroupController.java
@@ -167,5 +167,4 @@ public class WorkerGroupController extends BaseController {
         Map<String, Object> result = workerGroupService.getWorkerAddressList();
         return returnDataList(result);
     }
-
 }
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
index f84f79847c..113ccb6bd1 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
@@ -585,6 +585,15 @@ public enum Status {
     WORKER_GROUP_DEPENDENT_ENVIRONMENT_EXISTS(1401002,
             "You can not modify or remove this worker group, cause it has 
[{0}] dependent environments.",
             "不能修改或删除该Worker组,有 [{0}] 个环境配置正在使用"),
+
+    WORKER_GROUP_NOT_EXIST(1402001, "The Worker group [{0}] not exists", 
"Worker组[{0}]不存在."),
+    ASSIGN_WORKER_GROUP_TO_PROJECT_ERROR(1402002, "Failed to assign these 
worker groups to the project",
+            "给项目分配工作组失败"),
+    WORKER_GROUP_TO_PROJECT_IS_EMPTY(1402003, "Need to assign at least one 
worker group to the project",
+            "需要给项目至少分配一个Worker组"),
+    USED_WORKER_GROUP_EXISTS(1402004,
+            "You can not reassign worker groups to the project, cause these 
worker groups {0} are already used.",
+            "Worker组{0}被项目中任务或定时引用,无法重新分配"),
             ;
     private final int code;
     private final String enMsg;
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProjectWorkerGroupRelationService.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProjectWorkerGroupRelationService.java
new file mode 100644
index 0000000000..5b809f8d61
--- /dev/null
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProjectWorkerGroupRelationService.java
@@ -0,0 +1,48 @@
+/*
+ * 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.
+ */
+
+package org.apache.dolphinscheduler.api.service;
+
+import org.apache.dolphinscheduler.api.utils.Result;
+import org.apache.dolphinscheduler.dao.entity.User;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * the service of project and worker group
+ */
+public interface ProjectWorkerGroupRelationService {
+
+    /**
+     * assign worker groups to a project
+     *
+     * @param loginUser the login user
+     * @param projectCode the project code
+     * @param workerGroups assigned worker group names
+     */
+    Result assignWorkerGroupsToProject(User loginUser, Long projectCode, 
List<String> workerGroups);
+
+    /**
+     * query worker groups that assigned to the project
+     *
+     * @param loginUser the login user
+     * @param projectCode project code
+     */
+    Map<String, Object> queryWorkerGroupsByProject(User loginUser, Long 
projectCode);
+
+}
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProjectWorkerGroupRelationServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProjectWorkerGroupRelationServiceImpl.java
new file mode 100644
index 0000000000..15cbcbb7fa
--- /dev/null
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProjectWorkerGroupRelationServiceImpl.java
@@ -0,0 +1,233 @@
+/*
+ * 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.
+ */
+
+package org.apache.dolphinscheduler.api.service.impl;
+
+import org.apache.dolphinscheduler.api.enums.Status;
+import org.apache.dolphinscheduler.api.exceptions.ServiceException;
+import org.apache.dolphinscheduler.api.service.ProjectService;
+import 
org.apache.dolphinscheduler.api.service.ProjectWorkerGroupRelationService;
+import org.apache.dolphinscheduler.api.utils.Result;
+import org.apache.dolphinscheduler.common.constants.Constants;
+import org.apache.dolphinscheduler.dao.entity.Project;
+import org.apache.dolphinscheduler.dao.entity.ProjectWorkerGroup;
+import org.apache.dolphinscheduler.dao.entity.User;
+import org.apache.dolphinscheduler.dao.mapper.ProjectMapper;
+import org.apache.dolphinscheduler.dao.mapper.ProjectWorkerGroupMapper;
+import org.apache.dolphinscheduler.dao.mapper.ScheduleMapper;
+import org.apache.dolphinscheduler.dao.mapper.TaskDefinitionMapper;
+import org.apache.dolphinscheduler.dao.mapper.WorkerGroupMapper;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections4.SetUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.stream.Collectors;
+
+import lombok.extern.slf4j.Slf4j;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+
+/**
+ * task definition service impl
+ */
+@Service
+@Slf4j
+public class ProjectWorkerGroupRelationServiceImpl extends BaseServiceImpl
+        implements
+            ProjectWorkerGroupRelationService {
+
+    @Autowired
+    private ProjectWorkerGroupMapper projectWorkerGroupMapper;
+
+    @Autowired
+    private ProjectMapper projectMapper;
+
+    @Autowired
+    private WorkerGroupMapper workerGroupMapper;
+
+    @Autowired
+    private TaskDefinitionMapper taskDefinitionMapper;
+
+    @Autowired
+    private ScheduleMapper scheduleMapper;
+
+    @Autowired
+    private ProjectService projectService;
+
+    /**
+     * assign worker groups to a project
+     *
+     * @param loginUser the login user
+     * @param projectCode the project code
+     * @param workerGroups assigned worker group names
+     */
+    @Override
+    public Result assignWorkerGroupsToProject(User loginUser, Long 
projectCode, List<String> workerGroups) {
+
+        Result result = new Result();
+
+        if (!isAdmin(loginUser)) {
+            putMsg(result, Status.USER_NO_OPERATION_PERM);
+            return result;
+        }
+
+        if (Objects.isNull(projectCode)) {
+            putMsg(result, Status.PROJECT_NOT_EXIST);
+            return result;
+        }
+
+        if (CollectionUtils.isEmpty(workerGroups)) {
+            putMsg(result, Status.WORKER_GROUP_TO_PROJECT_IS_EMPTY);
+            return result;
+        }
+
+        Project project = projectMapper.queryByCode(projectCode);
+        if (Objects.isNull(project)) {
+            putMsg(result, Status.PROJECT_NOT_EXIST);
+            return result;
+        }
+
+        Set<String> workerGroupNames =
+                workerGroupMapper.queryAllWorkerGroup().stream().map(item -> 
item.getName()).collect(
+                        Collectors.toSet());
+
+        workerGroupNames.add(Constants.DEFAULT_WORKER_GROUP);
+
+        Set<String> assignedWorkerGroupNames = 
workerGroups.stream().collect(Collectors.toSet());
+
+        Set<String> difference = SetUtils.difference(assignedWorkerGroupNames, 
workerGroupNames);
+
+        if (difference.size() > 0) {
+            putMsg(result, Status.WORKER_GROUP_NOT_EXIST, 
difference.toString());
+            return result;
+        }
+
+        Set<String> projectWorkerGroupNames = 
projectWorkerGroupMapper.selectList(new QueryWrapper<ProjectWorkerGroup>()
+                .lambda()
+                .eq(ProjectWorkerGroup::getProjectCode, 
projectCode)).stream().map(item -> item.getWorkerGroup())
+                .collect(Collectors.toSet());
+
+        difference = SetUtils.difference(projectWorkerGroupNames, 
assignedWorkerGroupNames);
+
+        if (CollectionUtils.isNotEmpty(difference)) {
+            Set<String> usedWorkerGroups = getAllUsedWorkerGroups(project);
+
+            if (CollectionUtils.isNotEmpty(usedWorkerGroups) && 
usedWorkerGroups.containsAll(difference)) {
+                throw new ServiceException(Status.USED_WORKER_GROUP_EXISTS,
+                        SetUtils.intersection(usedWorkerGroups, 
difference).toSet());
+            }
+
+            int deleted = projectWorkerGroupMapper.delete(
+                    new 
QueryWrapper<ProjectWorkerGroup>().lambda().eq(ProjectWorkerGroup::getProjectCode,
 projectCode)
+                            .in(ProjectWorkerGroup::getWorkerGroup, 
difference));
+            if (deleted > 0) {
+                log.info("Success to delete worker groups [{}] for the project 
[{}] .", difference, project.getName());
+            } else {
+                log.error("Failed to delete worker groups [{}] for the project 
[{}].", difference, project.getName());
+                throw new 
ServiceException(Status.ASSIGN_WORKER_GROUP_TO_PROJECT_ERROR);
+            }
+        }
+
+        difference = SetUtils.difference(assignedWorkerGroupNames, 
projectWorkerGroupNames);
+        Date now = new Date();
+        if (CollectionUtils.isNotEmpty(difference)) {
+            difference.stream().forEach(workerGroupName -> {
+                ProjectWorkerGroup projectWorkerGroup = new 
ProjectWorkerGroup();
+                projectWorkerGroup.setProjectCode(projectCode);
+                projectWorkerGroup.setWorkerGroup(workerGroupName);
+                projectWorkerGroup.setCreateTime(now);
+                projectWorkerGroup.setUpdateTime(now);
+                int create = 
projectWorkerGroupMapper.insert(projectWorkerGroup);
+                if (create > 0) {
+                    log.info("Success to add worker group [{}] for the project 
[{}] .", workerGroupName,
+                            project.getName());
+                } else {
+                    log.error("Failed to add worker group [{}] for the project 
[{}].", workerGroupName,
+                            project.getName());
+                    throw new 
ServiceException(Status.ASSIGN_WORKER_GROUP_TO_PROJECT_ERROR);
+                }
+            });
+        }
+
+        putMsg(result, Status.SUCCESS);
+        return result;
+    }
+
+    /**
+     * query worker groups that assigned to the project
+     *
+     * @param projectCode project code
+     */
+    @Override
+    public Map<String, Object> queryWorkerGroupsByProject(User loginUser, Long 
projectCode) {
+        Map<String, Object> result = new HashMap<>();
+
+        Project project = projectMapper.queryByCode(projectCode);
+        // check project auth
+        boolean hasProjectAndPerm = 
projectService.hasProjectAndPerm(loginUser, project, result, null);
+        if (!hasProjectAndPerm) {
+            return result;
+        }
+
+        Set<String> assignedWorkerGroups = getAllUsedWorkerGroups(project);
+
+        projectWorkerGroupMapper.selectList(
+                new 
QueryWrapper<ProjectWorkerGroup>().lambda().eq(ProjectWorkerGroup::getProjectCode,
 projectCode))
+                .stream().forEach(projectWorkerGroup -> 
assignedWorkerGroups.add(projectWorkerGroup.getWorkerGroup()));
+
+        List<ProjectWorkerGroup> projectWorkerGroups = 
assignedWorkerGroups.stream().map(workerGroup -> {
+            ProjectWorkerGroup projectWorkerGroup = new ProjectWorkerGroup();
+            projectWorkerGroup.setProjectCode(projectCode);
+            projectWorkerGroup.setWorkerGroup(workerGroup);
+            return projectWorkerGroup;
+        }).collect(Collectors.toList());
+
+        result.put(Constants.DATA_LIST, projectWorkerGroups);
+        putMsg(result, Status.SUCCESS);
+        return result;
+    }
+
+    private Set<String> getAllUsedWorkerGroups(Project project) {
+        Set<String> usedWorkerGroups = new TreeSet<>();
+        // query all worker groups that tasks depend on
+        
taskDefinitionMapper.queryAllDefinitionList(project.getCode()).stream().forEach(taskDefinition
 -> {
+            if (StringUtils.isNotEmpty(taskDefinition.getWorkerGroup())) {
+                usedWorkerGroups.add(taskDefinition.getWorkerGroup());
+            }
+        });
+
+        // query all worker groups that timings depend on
+        scheduleMapper.querySchedulerListByProjectName(project.getName())
+                .stream()
+                .filter(schedule -> 
StringUtils.isNotEmpty(schedule.getWorkerGroup()))
+                .forEach(schedule -> 
usedWorkerGroups.add(schedule.getWorkerGroup()));
+
+        return usedWorkerGroups;
+    }
+
+}
diff --git 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ProjectWorkerGroupRelationServiceTest.java
 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ProjectWorkerGroupRelationServiceTest.java
new file mode 100644
index 0000000000..a8e8b8beb2
--- /dev/null
+++ 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ProjectWorkerGroupRelationServiceTest.java
@@ -0,0 +1,161 @@
+/*
+ * 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.
+ */
+
+package org.apache.dolphinscheduler.api.service;
+
+import org.apache.dolphinscheduler.api.enums.Status;
+import 
org.apache.dolphinscheduler.api.service.impl.ProjectWorkerGroupRelationServiceImpl;
+import org.apache.dolphinscheduler.api.utils.Result;
+import org.apache.dolphinscheduler.common.constants.Constants;
+import org.apache.dolphinscheduler.common.enums.UserType;
+import org.apache.dolphinscheduler.dao.entity.Project;
+import org.apache.dolphinscheduler.dao.entity.ProjectWorkerGroup;
+import org.apache.dolphinscheduler.dao.entity.User;
+import org.apache.dolphinscheduler.dao.entity.WorkerGroup;
+import org.apache.dolphinscheduler.dao.mapper.ProjectMapper;
+import org.apache.dolphinscheduler.dao.mapper.ProjectWorkerGroupMapper;
+import org.apache.dolphinscheduler.dao.mapper.ScheduleMapper;
+import org.apache.dolphinscheduler.dao.mapper.TaskDefinitionMapper;
+import org.apache.dolphinscheduler.dao.mapper.WorkerGroupMapper;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.mockito.junit.jupiter.MockitoSettings;
+import org.mockito.quality.Strictness;
+
+import com.google.common.collect.Lists;
+
+@ExtendWith(MockitoExtension.class)
+@MockitoSettings(strictness = Strictness.LENIENT)
+public class ProjectWorkerGroupRelationServiceTest {
+
+    @InjectMocks
+    private ProjectWorkerGroupRelationServiceImpl 
projectWorkerGroupRelationService;
+
+    @Mock
+    private ProjectMapper projectMapper;
+
+    @Mock
+    private ProjectWorkerGroupMapper projectWorkerGroupMapper;
+
+    @Mock
+    private WorkerGroupMapper workerGroupMapper;
+
+    @Mock
+    private ProjectService projectService;
+
+    @Mock
+    private TaskDefinitionMapper taskDefinitionMapper;
+
+    @Mock
+    private ScheduleMapper scheduleMapper;
+
+    protected final static long projectCode = 1L;
+
+    @Test
+    public void testAssignWorkerGroupsToProject() {
+        User loginUser = getAdminUser();
+
+        Mockito.when(projectMapper.queryByCode(projectCode)).thenReturn(null);
+        Result result = 
projectWorkerGroupRelationService.assignWorkerGroupsToProject(loginUser, 
projectCode,
+                getWorkerGroups());
+        Assertions.assertEquals(Status.PROJECT_NOT_EXIST.getCode(), 
result.getCode());
+
+        WorkerGroup workerGroup = new WorkerGroup();
+        workerGroup.setName("test");
+        
Mockito.when(projectMapper.queryByCode(Mockito.anyLong())).thenReturn(getProject());
+        
Mockito.when(workerGroupMapper.queryAllWorkerGroup()).thenReturn(Lists.newArrayList(workerGroup));
+        
Mockito.when(projectWorkerGroupMapper.insert(Mockito.any())).thenReturn(1);
+
+        result = 
projectWorkerGroupRelationService.assignWorkerGroupsToProject(loginUser, 
projectCode,
+                getWorkerGroups());
+        Assertions.assertEquals(Status.SUCCESS.getCode(), result.getCode());
+    }
+
+    @Test
+    public void testQueryWorkerGroupsByProject() {
+
+        Mockito.when(projectService.hasProjectAndPerm(Mockito.any(), 
Mockito.any(), Mockito.anyMap(), Mockito.any()))
+                .thenReturn(true);
+
+        Mockito.when(projectMapper.queryByCode(projectCode))
+                .thenReturn(getProject());
+
+        Mockito.when(projectWorkerGroupMapper.selectList(Mockito.any()))
+                .thenReturn(Lists.newArrayList(getProjectWorkerGroup()));
+
+        
Mockito.when(taskDefinitionMapper.queryAllDefinitionList(Mockito.anyLong()))
+                .thenReturn(new ArrayList<>());
+
+        
Mockito.when(scheduleMapper.querySchedulerListByProjectName(Mockito.any()))
+                .thenReturn(Lists.newArrayList());
+
+        Map<String, Object> result =
+                
projectWorkerGroupRelationService.queryWorkerGroupsByProject(getGeneralUser(), 
projectCode);
+
+        ProjectWorkerGroup[] actualValue =
+                ((List<ProjectWorkerGroup>) 
result.get(Constants.DATA_LIST)).toArray(new ProjectWorkerGroup[0]);
+
+        Assertions.assertEquals(actualValue[0].getWorkerGroup(), 
getProjectWorkerGroup().getWorkerGroup());
+    }
+
+    private List<String> getWorkerGroups() {
+        return Lists.newArrayList("default");
+    }
+
+    private User getGeneralUser() {
+        User loginUser = new User();
+        loginUser.setUserType(UserType.GENERAL_USER);
+        loginUser.setUserName("userName");
+        loginUser.setId(1);
+        return loginUser;
+    }
+
+    private User getAdminUser() {
+        User loginUser = new User();
+        loginUser.setUserType(UserType.ADMIN_USER);
+        loginUser.setUserName("userName");
+        loginUser.setId(1);
+        return loginUser;
+    }
+
+    private Project getProject() {
+        Project project = new Project();
+        project.setCode(projectCode);
+        project.setId(1);
+        project.setName("test");
+        project.setUserId(1);
+        return project;
+    }
+
+    private ProjectWorkerGroup getProjectWorkerGroup() {
+        ProjectWorkerGroup projectWorkerGroup = new ProjectWorkerGroup();
+        projectWorkerGroup.setId(1);
+        projectWorkerGroup.setProjectCode(projectCode);
+        projectWorkerGroup.setWorkerGroup("default");
+        return projectWorkerGroup;
+    }
+}
diff --git 
a/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.2.2_schema/mysql/dolphinscheduler_ddl.sql
 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProjectWorkerGroup.java
similarity index 52%
copy from 
dolphinscheduler-dao/src/main/resources/sql/upgrade/3.2.2_schema/mysql/dolphinscheduler_ddl.sql
copy to 
dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProjectWorkerGroup.java
index 4a14f326b9..1bc86bcd7b 100644
--- 
a/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.2.2_schema/mysql/dolphinscheduler_ddl.sql
+++ 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProjectWorkerGroup.java
@@ -13,4 +13,44 @@
  * 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.
-*/
+ */
+package org.apache.dolphinscheduler.dao.entity;
+
+import java.util.Date;
+
+import lombok.Data;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+@Data
+@TableName("t_ds_relation_project_worker_group")
+public class ProjectWorkerGroup {
+
+    /**
+     * id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * project code
+     */
+    private Long projectCode;
+
+    /**
+     * worker group
+     */
+    private String workerGroup;
+
+    /**
+     * create time
+     */
+    private Date createTime;
+
+    /**
+     * update time
+     */
+    private Date updateTime;
+}
diff --git 
a/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.2.2_schema/mysql/dolphinscheduler_ddl.sql
 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ProjectWorkerGroupMapper.java
similarity index 75%
copy from 
dolphinscheduler-dao/src/main/resources/sql/upgrade/3.2.2_schema/mysql/dolphinscheduler_ddl.sql
copy to 
dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ProjectWorkerGroupMapper.java
index 4a14f326b9..40353d4c4a 100644
--- 
a/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.2.2_schema/mysql/dolphinscheduler_ddl.sql
+++ 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ProjectWorkerGroupMapper.java
@@ -13,4 +13,14 @@
  * 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.
-*/
+ */
+
+package org.apache.dolphinscheduler.dao.mapper;
+
+import org.apache.dolphinscheduler.dao.entity.ProjectWorkerGroup;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface ProjectWorkerGroupMapper extends 
BaseMapper<ProjectWorkerGroup> {
+
+}
diff --git 
a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_h2.sql 
b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_h2.sql
index 656e34af0e..f74000e731 100644
--- a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_h2.sql
+++ b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_h2.sql
@@ -1038,6 +1038,21 @@ CREATE TABLE t_ds_worker_group
 -- Records of t_ds_worker_group
 -- ----------------------------
 
+-- ----------------------------
+-- Table structure for t_ds_relation_project_worker_group
+-- ----------------------------
+DROP TABLE IF EXISTS t_ds_relation_project_worker_group CASCADE;
+CREATE TABLE t_ds_relation_project_worker_group
+(
+    id            int(11) NOT NULL AUTO_INCREMENT,
+    project_code  bigint(20) NOT NULL,
+    worker_group  varchar(255) DEFAULT NULL,
+    create_time   datetime DEFAULT NULL,
+    update_time   datetime DEFAULT NULL,
+    PRIMARY KEY (id),
+    UNIQUE KEY unique_project_worker_group(project_code,worker_group)
+);
+
 -- ----------------------------
 -- Table structure for t_ds_version
 -- ----------------------------
diff --git 
a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_mysql.sql 
b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_mysql.sql
index 9dcdc02203..7bde5063f1 100644
--- a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_mysql.sql
+++ b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_mysql.sql
@@ -1095,6 +1095,22 @@ CREATE TABLE `t_ds_alert_plugin_instance` (
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE = utf8_bin;
 
+
+-- ----------------------------
+-- Table structure for t_ds_relation_project_worker_group
+-- ----------------------------
+DROP TABLE IF EXISTS `t_ds_relation_project_worker_group`;
+CREATE TABLE `t_ds_relation_project_worker_group` (
+    `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'key',
+    `project_code` bigint(20) NOT NULL COMMENT 'project code',
+    `worker_group` varchar(255) DEFAULT NULL COMMENT 'worker group',
+    `create_time` datetime DEFAULT NULL COMMENT 'create time',
+    `update_time` datetime DEFAULT NULL COMMENT 'update time',
+    PRIMARY KEY (`id`),
+    UNIQUE KEY unique_project_worker_group(project_code,worker_group)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE = utf8_bin;
+
+
 --
 -- Table structure for table `t_ds_dq_comparison_type`
 --
@@ -1111,6 +1127,7 @@ CREATE TABLE `t_ds_dq_comparison_type` (
     PRIMARY KEY (`id`)
 )ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE = utf8_bin;
 
+
 INSERT IGNORE INTO `t_ds_dq_comparison_type`
 (`id`, `type`, `execute_sql`, `output_table`, `name`, `create_time`, 
`update_time`, `is_inner_source`)
 VALUES(1, 'FixValue', NULL, NULL, NULL, current_timestamp, current_timestamp, 
false);
diff --git 
a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_postgresql.sql 
b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_postgresql.sql
index b54f19a2d1..946a544064 100644
--- 
a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_postgresql.sql
+++ 
b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_postgresql.sql
@@ -927,6 +927,21 @@ CREATE TABLE t_ds_worker_group (
   CONSTRAINT name_unique UNIQUE (name)
 ) ;
 
+--
+-- Table structure for table t_ds_relation_project_worker_group
+--
+
+DROP TABLE IF EXISTS t_ds_relation_project_worker_group;
+CREATE TABLE t_ds_relation_project_worker_group (
+    id int NOT NULL  ,
+    project_code bigint DEFAULT NULL ,
+    worker_group varchar(255) NOT NULL,
+    create_time timestamp DEFAULT NULL,
+    update_time timestamp DEFAULT NULL,
+    PRIMARY KEY (id),
+    CONSTRAINT t_ds_relation_project_worker_group_un UNIQUE (project_code, 
worker_group)
+);
+
 DROP SEQUENCE IF EXISTS t_ds_access_token_id_sequence;
 CREATE SEQUENCE  t_ds_access_token_id_sequence;
 ALTER TABLE t_ds_access_token ALTER COLUMN id SET DEFAULT 
NEXTVAL('t_ds_access_token_id_sequence');
@@ -1024,6 +1039,10 @@ DROP SEQUENCE IF EXISTS 
t_ds_project_preference_id_sequence;
 CREATE SEQUENCE t_ds_project_preference_id_sequence;
 ALTER TABLE t_ds_project_preference ALTER COLUMN id SET DEFAULT 
NEXTVAL('t_ds_project_preference_id_sequence');
 
+DROP SEQUENCE IF EXISTS t_ds_relation_project_worker_group_sequence;
+CREATE SEQUENCE  t_ds_relation_project_worker_group_sequence;
+ALTER TABLE t_ds_relation_project_worker_group ALTER COLUMN id SET DEFAULT 
NEXTVAL('t_ds_relation_project_worker_group_sequence');
+
 -- Records of t_ds_user?user : admin , password : dolphinscheduler123
 INSERT INTO t_ds_user(user_name, user_password, user_type, email, phone, 
tenant_id, state, create_time, update_time, time_zone)
 VALUES ('admin', '7ad2410b2f4c074479a8937a28a22b8f', '0', 'x...@qq.com', '', 
'-1', 1, '2018-03-27 15:48:50', '2018-10-24 17:40:22', null);
diff --git 
a/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.2.2_schema/mysql/dolphinscheduler_ddl.sql
 
b/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.2.2_schema/mysql/dolphinscheduler_ddl.sql
index 4a14f326b9..7a3ab5df68 100644
--- 
a/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.2.2_schema/mysql/dolphinscheduler_ddl.sql
+++ 
b/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.2.2_schema/mysql/dolphinscheduler_ddl.sql
@@ -14,3 +14,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
 */
+DROP TABLE IF EXISTS `t_ds_relation_project_worker_group`;
+CREATE TABLE `t_ds_relation_project_worker_group` (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'key',
+  `project_code` bigint(20) NOT NULL COMMENT 'project code',
+  `worker_group` varchar(255) DEFAULT NULL COMMENT 'worker group',
+  `create_time` datetime DEFAULT NULL COMMENT 'create time',
+  `update_time` datetime DEFAULT NULL COMMENT 'update time',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY unique_project_worker_group(project_code,worker_group)
+) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE = utf8_bin;
+
diff --git 
a/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.2.2_schema/postgresql/dolphinscheduler_ddl.sql
 
b/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.2.2_schema/postgresql/dolphinscheduler_ddl.sql
index 4a14f326b9..587bab4159 100644
--- 
a/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.2.2_schema/postgresql/dolphinscheduler_ddl.sql
+++ 
b/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.2.2_schema/postgresql/dolphinscheduler_ddl.sql
@@ -14,3 +14,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
 */
+DROP TABLE IF EXISTS t_ds_relation_project_worker_group;
+CREATE TABLE t_ds_relation_project_worker_group (
+    id int NOT NULL  ,
+    project_code bigint DEFAULT NULL ,
+    worker_group varchar(255) NOT NULL,
+    create_time timestamp DEFAULT NULL,
+    update_time timestamp DEFAULT NULL,
+    PRIMARY KEY (id),
+    CONSTRAINT t_ds_relation_project_worker_group_un UNIQUE (project_code, 
worker_group)
+);
+
+DROP SEQUENCE IF EXISTS t_ds_relation_project_worker_group_sequence;
+CREATE SEQUENCE  t_ds_relation_project_worker_group_sequence;
+ALTER TABLE t_ds_relation_project_worker_group ALTER COLUMN id SET DEFAULT 
NEXTVAL('t_ds_relation_project_worker_group_sequence');
\ No newline at end of file
diff --git 
a/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/ProjectWorkerGroupMapperTest.java
 
b/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/ProjectWorkerGroupMapperTest.java
new file mode 100644
index 0000000000..3629f02240
--- /dev/null
+++ 
b/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/ProjectWorkerGroupMapperTest.java
@@ -0,0 +1,113 @@
+/*
+ * 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.
+ */
+package org.apache.dolphinscheduler.dao.mapper;
+
+import org.apache.dolphinscheduler.dao.BaseDaoTest;
+import org.apache.dolphinscheduler.dao.entity.ProjectWorkerGroup;
+
+import java.util.Date;
+import java.util.List;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+
+public class ProjectWorkerGroupMapperTest extends BaseDaoTest {
+
+    @Autowired
+    private ProjectWorkerGroupMapper projectWorkerGroupMapper;
+
+    /**
+     * insert
+     *
+     * @return ProjectWorkerGroup
+     */
+    private ProjectWorkerGroup insertOne() {
+        // insertOne
+        ProjectWorkerGroup projectWorkerGroup = new ProjectWorkerGroup();
+
+        projectWorkerGroup.setProjectCode(1L);
+        projectWorkerGroup.setWorkerGroup("WorkerGroup1");;
+        projectWorkerGroupMapper.insert(projectWorkerGroup);
+        return projectWorkerGroup;
+    }
+
+    /**
+     * test update
+     */
+    @Test
+    public void testUpdate() {
+        // insertOne
+        ProjectWorkerGroup projectWorkerGroup = insertOne();
+        projectWorkerGroup.setCreateTime(new Date());
+        // update
+        int update = projectWorkerGroupMapper.updateById(projectWorkerGroup);
+        Assertions.assertEquals(update, 1);
+    }
+
+    /**
+     * test delete
+     */
+    @Test
+    public void testDelete() {
+        ProjectWorkerGroup projectWorkerGroup = insertOne();
+        int delete = 
projectWorkerGroupMapper.deleteById(projectWorkerGroup.getId());
+        Assertions.assertEquals(delete, 1);
+    }
+
+    /**
+     * test query
+     */
+    @Test
+    public void testQuery() {
+        ProjectWorkerGroup projectWorkerGroup = insertOne();
+        // query
+        List<ProjectWorkerGroup> projectUsers = 
projectWorkerGroupMapper.selectList(null);
+        Assertions.assertNotEquals(0, projectUsers.size());
+    }
+
+    /**
+     * test delete the relation of project and worker group
+     */
+    @Test
+    public void testDeleteProjectWorkerGroupRelation() {
+
+        ProjectWorkerGroup projectWorkerGroup = insertOne();
+        int delete = projectWorkerGroupMapper.delete(new 
QueryWrapper<ProjectWorkerGroup>()
+                .lambda()
+                .eq(ProjectWorkerGroup::getProjectCode, 
projectWorkerGroup.getProjectCode())
+                .eq(ProjectWorkerGroup::getWorkerGroup, 
projectWorkerGroup.getWorkerGroup()));
+
+        Assertions.assertTrue(delete >= 1);
+    }
+
+    /**
+     * test query the relation of project and worker group
+     */
+    @Test
+    public void testQueryProjectWorkerGroupRelation() {
+        ProjectWorkerGroup projectWorkerGroup = insertOne();
+        projectWorkerGroup = projectWorkerGroupMapper.selectOne(new 
QueryWrapper<ProjectWorkerGroup>()
+                .lambda()
+                .eq(ProjectWorkerGroup::getProjectCode, 
projectWorkerGroup.getProjectCode())
+                .eq(ProjectWorkerGroup::getWorkerGroup, 
projectWorkerGroup.getWorkerGroup()));
+
+        Assertions.assertNotEquals(null, projectWorkerGroup);
+    }
+}
diff --git a/dolphinscheduler-ui/src/locales/en_US/project.ts 
b/dolphinscheduler-ui/src/locales/en_US/project.ts
index 21aba58f85..69aee6a0e2 100644
--- a/dolphinscheduler-ui/src/locales/en_US/project.ts
+++ b/dolphinscheduler-ui/src/locales/en_US/project.ts
@@ -40,7 +40,8 @@ export default {
     authorize_level: 'Authorize Level',
     no_permission: 'No Permission',
     read_permission: 'Read Permission',
-    all_permission: 'All Permission'
+    all_permission: 'All Permission',
+    assign_worker_group: 'Worker Group',
   },
   workflow: {
     on_line: 'Online',
diff --git a/dolphinscheduler-ui/src/locales/zh_CN/project.ts 
b/dolphinscheduler-ui/src/locales/zh_CN/project.ts
index 1c6756a22e..8b84cc7f13 100644
--- a/dolphinscheduler-ui/src/locales/zh_CN/project.ts
+++ b/dolphinscheduler-ui/src/locales/zh_CN/project.ts
@@ -40,7 +40,8 @@ export default {
     authorize_level: '权限等级',
     no_permission: '无权限',
     read_permission: '读权限',
-    all_permission: '所有权限'
+    all_permission: '所有权限',
+    assign_worker_group: '分配WorkerGroup',
   },
   workflow: {
     on_line: '线上',
diff --git 
a/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.2.2_schema/mysql/dolphinscheduler_ddl.sql
 b/dolphinscheduler-ui/src/service/modules/projects-worker-group/index.ts
similarity index 60%
copy from 
dolphinscheduler-dao/src/main/resources/sql/upgrade/3.2.2_schema/mysql/dolphinscheduler_ddl.sql
copy to dolphinscheduler-ui/src/service/modules/projects-worker-group/index.ts
index 4a14f326b9..7e280e28ae 100644
--- 
a/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.2.2_schema/mysql/dolphinscheduler_ddl.sql
+++ b/dolphinscheduler-ui/src/service/modules/projects-worker-group/index.ts
@@ -13,4 +13,27 @@
  * 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 { axios } from '@/service/service'
+import { UpdateProjectWorkerGroupsReq } from 
"@/service/modules/projects-worker-group/types";
+
+export function queryWorkerGroupsByProjectCode(
+  projectCode: number
+): any {
+  return axios({
+    url: `/projects/${projectCode}/worker-group`,
+    method: 'get'
+  })
+}
+
+export function assignWorkerGroups(
+  data: UpdateProjectWorkerGroupsReq,
+  projectCode: number
+): any {
+  return axios({
+    url: `/projects/${projectCode}/worker-group`,
+    method: 'post',
+    data
+  })
+}
\ No newline at end of file
diff --git 
a/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.2.2_schema/mysql/dolphinscheduler_ddl.sql
 b/dolphinscheduler-ui/src/service/modules/projects-worker-group/types.ts
similarity index 74%
copy from 
dolphinscheduler-dao/src/main/resources/sql/upgrade/3.2.2_schema/mysql/dolphinscheduler_ddl.sql
copy to dolphinscheduler-ui/src/service/modules/projects-worker-group/types.ts
index 4a14f326b9..c91ed7e95f 100644
--- 
a/dolphinscheduler-dao/src/main/resources/sql/upgrade/3.2.2_schema/mysql/dolphinscheduler_ddl.sql
+++ b/dolphinscheduler-ui/src/service/modules/projects-worker-group/types.ts
@@ -13,4 +13,22 @@
  * 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.
-*/
+ */
+
+interface ProjectWorkerGroup {
+  id: number
+  projectCode: number
+  workerGroup: string
+  createTime: string
+  updateTime: string
+}
+
+
+interface UpdateProjectWorkerGroupsReq {
+  workerGroups: string
+}
+
+export {
+  ProjectWorkerGroup,
+  UpdateProjectWorkerGroupsReq
+}
diff --git a/dolphinscheduler-ui/src/service/modules/worker-groups/index.ts 
b/dolphinscheduler-ui/src/service/modules/worker-groups/index.ts
index acc6eb584c..75f716f17c 100644
--- a/dolphinscheduler-ui/src/service/modules/worker-groups/index.ts
+++ b/dolphinscheduler-ui/src/service/modules/worker-groups/index.ts
@@ -54,4 +54,4 @@ export function deleteById(id: IdReq): any {
     method: 'delete',
     params: id
   })
-}
+}
\ No newline at end of file
diff --git 
a/dolphinscheduler-ui/src/views/projects/list/components/use-worker-group.ts 
b/dolphinscheduler-ui/src/views/projects/list/components/use-worker-group.ts
new file mode 100644
index 0000000000..698e753333
--- /dev/null
+++ b/dolphinscheduler-ui/src/views/projects/list/components/use-worker-group.ts
@@ -0,0 +1,77 @@
+/*
+ * 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 { reactive, ref, SetupContext } from 'vue'
+import { useUserStore } from '@/store/user/user'
+import { Option } from "naive-ui/es/transfer/src/interface"
+import { queryAllWorkerGroups } from "@/service/modules/worker-groups"
+import { queryWorkerGroupsByProjectCode, assignWorkerGroups } from 
"@/service/modules/projects-worker-group"
+import { UpdateProjectWorkerGroupsReq } from 
"@/service/modules/projects-worker-group/types"
+
+export function useWorkerGroup(
+    props: any,
+    ctx: SetupContext<('cancelModal' | 'confirmModal')[]>
+) {
+  const { t } = useI18n()
+  const userStore = useUserStore()
+
+  const variables = reactive({
+    model: {
+      workerGroupOptions: [] as Option[],
+      assignedWorkerGroups: ref([] as any)
+    }
+  })
+
+  const initOptions = () => {
+    variables.model.workerGroupOptions = []
+    queryAllWorkerGroups().then((res: any) => {
+      for (const workerGroup of res) {
+        variables.model.workerGroupOptions.push({label: workerGroup, value: 
workerGroup, disabled: workerGroup==='default'})
+      }
+    })
+  }
+
+  const initAssignedWorkerGroups = (projectCode: number) => {
+    variables.model.assignedWorkerGroups = ref([] as any)
+    queryWorkerGroupsByProjectCode(projectCode).then((res: any) =>{
+      res.data.forEach((item: any) => {
+        variables.model.assignedWorkerGroups.push(item.workerGroup)
+      })
+    })
+  }
+
+  initOptions()
+
+  const handleValidate = () => {
+    if (variables.model?.assignedWorkerGroups.length>0) {
+      submitModal()
+      ctx.emit('confirmModal', props.showModalRef)
+    }
+  }
+
+  const submitModal = async () => {
+    if (props.row.code) {
+      let data: UpdateProjectWorkerGroupsReq = {
+        workerGroups: variables.model.assignedWorkerGroups.length>0? 
variables.model.assignedWorkerGroups.join(','):''
+      }
+      assignWorkerGroups(data, props.row.code)
+    }
+  }
+
+  return { variables, t, handleValidate, initAssignedWorkerGroups }
+}
diff --git 
a/dolphinscheduler-ui/src/views/projects/list/components/worker-group-modal.tsx 
b/dolphinscheduler-ui/src/views/projects/list/components/worker-group-modal.tsx
new file mode 100644
index 0000000000..e84dc4520a
--- /dev/null
+++ 
b/dolphinscheduler-ui/src/views/projects/list/components/worker-group-modal.tsx
@@ -0,0 +1,91 @@
+/*
+ * 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,
+  getCurrentInstance,
+  PropType,
+  toRefs,
+  watch
+} from 'vue'
+import { NTransfer} from 'naive-ui'
+import Modal from '@/components/modal'
+import styles from "@/views/security/user-manage/index.module.scss";
+import {useWorkerGroup} from 
"@/views/projects/list/components/use-worker-group";
+
+const props = {
+  showModalRef: {
+    type: Boolean as PropType<boolean>,
+    default: false
+  },
+  row: {
+    type: Object as PropType<any>,
+    default: {}
+  }
+}
+
+const WorkerGroupModal = defineComponent({
+  name: 'WorkerGroupModal',
+  props,
+  emits: ['cancelModal', 'confirmModal'],
+  setup(props, ctx) {
+    const { variables, t, handleValidate, initAssignedWorkerGroups } = 
useWorkerGroup(props, ctx)
+
+    const cancelModal = () => {
+      ctx.emit('cancelModal', props.showModalRef)
+    }
+
+    const trim = getCurrentInstance()?.appContext.config.globalProperties.trim
+
+    const confirmModal = () => {
+      handleValidate()
+    }
+
+    watch(
+        () => props.showModalRef,
+        () => {
+          if (props.showModalRef) {
+            initAssignedWorkerGroups(props.row.code)
+          }
+        }
+    )
+
+    return { ...toRefs(variables), t, cancelModal, confirmModal, trim }
+  },
+  render() {
+    const { t } = this
+    return (
+        <Modal
+            title={t('project.list.assign_worker_group')}
+            show={this.showModalRef}
+            onConfirm={this.confirmModal}
+            onCancel={this.cancelModal}
+            confirmClassName='btn-submit'
+            cancelClassName='btn-cancel'
+        >
+          <NTransfer
+              virtualScroll
+              class={styles.transfer}
+              options={this.model.workerGroupOptions}
+              v-model:value={this.model.assignedWorkerGroups}
+          />
+        </Modal>
+    )
+  }
+})
+
+export default WorkerGroupModal
diff --git a/dolphinscheduler-ui/src/views/projects/list/index.tsx 
b/dolphinscheduler-ui/src/views/projects/list/index.tsx
index 83bcefd5b8..9f687dace7 100644
--- a/dolphinscheduler-ui/src/views/projects/list/index.tsx
+++ b/dolphinscheduler-ui/src/views/projects/list/index.tsx
@@ -29,6 +29,7 @@ import { useTable } from './use-table'
 import Card from '@/components/card'
 import Search from '@/components/input-search'
 import ProjectModal from './components/project-modal'
+import WorkerGroupModal from 
"@/views/projects/list/components/worker-group-modal";
 
 const list = defineComponent({
   name: 'list',
@@ -71,6 +72,15 @@ const list = defineComponent({
       requestData()
     }
 
+    const onCancelWorkerGroupModal = () => {
+      variables.showWorkerGroupModalRef = false
+    }
+
+    const onConfirmWorkerGroupModal = () => {
+      variables.showWorkerGroupModalRef = false
+      requestData()
+    }
+
     const handleChangePageSize = () => {
       variables.page = 1
       requestData()
@@ -95,6 +105,8 @@ const list = defineComponent({
       handleSearch,
       onCancelModal,
       onConfirmModal,
+      onCancelWorkerGroupModal,
+      onConfirmWorkerGroupModal,
       onClearSearch,
       handleChangePageSize,
       trim
@@ -160,6 +172,12 @@ const list = defineComponent({
           onCancelModal={this.onCancelModal}
           onConfirmModal={this.onConfirmModal}
         />
+        <WorkerGroupModal
+            showModalRef={this.showWorkerGroupModalRef}
+            row={this.row}
+            onCancelModal={this.onCancelWorkerGroupModal}
+            onConfirmModal={this.onConfirmWorkerGroupModal}
+        />
       </NSpace>
     )
   }
diff --git a/dolphinscheduler-ui/src/views/projects/list/use-table.ts 
b/dolphinscheduler-ui/src/views/projects/list/use-table.ts
index 6cc01d3b27..7d7b8dda86 100644
--- a/dolphinscheduler-ui/src/views/projects/list/use-table.ts
+++ b/dolphinscheduler-ui/src/views/projects/list/use-table.ts
@@ -25,7 +25,7 @@ import { deleteProject } from '@/service/modules/projects'
 import { format } from 'date-fns'
 import { useRouter } from 'vue-router'
 import {
-  NButton,
+  NButton, NDropdown,
   NEllipsis,
   NIcon,
   NPopconfirm,
@@ -39,18 +39,29 @@ import {
 } from '@/common/column-width-config'
 import type { Router } from 'vue-router'
 import type { ProjectRes } from '@/service/modules/projects/types'
-import { DeleteOutlined, EditOutlined } from '@vicons/antd'
+import {ControlOutlined, DeleteOutlined, EditOutlined, UserOutlined} from 
'@vicons/antd'
+import {useUserStore} from "@/store/user/user";
+import {UserInfoRes} from "@/service/modules/users/types";
 
 export function useTable() {
   const { t } = useI18n()
   const router: Router = useRouter()
 
+  const userStore = useUserStore()
+  const userInfo = userStore.getUserInfo as UserInfoRes
+  const IS_ADMIN = userInfo.userType === 'ADMIN_USER'
+
   const handleEdit = (row: any) => {
     variables.showModalRef = true
     variables.statusRef = 1
     variables.row = row
   }
 
+  const handleAssign = (row: any) => {
+    variables.showWorkerGroupModalRef = true
+    variables.row = row
+  }
+
   const handleDelete = (row: any) => {
     deleteProject(row.code).then(() => {
       getTableData({
@@ -137,7 +148,7 @@ export function useTable() {
       {
         title: t('project.list.operation'),
         key: 'actions',
-        ...COLUMN_WIDTH_CONFIG['operation'](2),
+        ...COLUMN_WIDTH_CONFIG['operation'](3),
         render(row: any) {
           return h(NSpace, null, {
             default: () => [
@@ -165,6 +176,32 @@ export function useTable() {
                   default: () => t('project.list.edit')
                 }
               ),
+              IS_ADMIN &&
+              h(
+                  NTooltip,
+                  {
+                    trigger: 'hover'
+                  },
+                  {
+                    trigger: () =>
+                        h(
+                            NButton,
+                            {
+                              circle: true,
+                              type: 'info',
+                              size: 'small',
+                              class: 'edit',
+                              onClick: () => {
+                                handleAssign(row)
+                              }
+                            },
+                            {
+                              icon: () => h(NIcon, null, () => 
h(ControlOutlined))
+                            }
+                        ),
+                    default: () => t('project.list.assign_worker_group')
+                  }
+              ),
               h(
                 NPopconfirm,
                 {
@@ -219,6 +256,7 @@ export function useTable() {
     searchVal: ref(''),
     totalPage: ref(1),
     showModalRef: ref(false),
+    showWorkerGroupModalRef: ref(false),
     statusRef: ref(0),
     row: {},
     loadingRef: ref(false)
diff --git a/dolphinscheduler-ui/src/views/projects/preference/use-form.ts 
b/dolphinscheduler-ui/src/views/projects/preference/use-form.ts
index 4abdda3edf..992bc007a2 100644
--- a/dolphinscheduler-ui/src/views/projects/preference/use-form.ts
+++ b/dolphinscheduler-ui/src/views/projects/preference/use-form.ts
@@ -111,7 +111,7 @@ export function useForm() {
   const preferencesItems: IJsonItem[] = [
     Fields.useTaskPriority(),
     useTenant(),
-    Fields.useWorkerGroup(),
+    Fields.useWorkerGroup(projectCode),
     Fields.useEnvironmentName(data.model, true),
     ...Fields.useFailed(),
     useWarningType(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-worker-group.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-worker-group.ts
index d06e8b7ec3..d6ec1f6b8d 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-worker-group.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-worker-group.ts
@@ -17,10 +17,10 @@
 
 import { ref, onMounted } from 'vue'
 import { useI18n } from 'vue-i18n'
-import { queryAllWorkerGroups } from '@/service/modules/worker-groups'
+import { queryWorkerGroupsByProjectCode } from 
'@/service/modules/projects-worker-group'
 import type { IJsonItem } from '../types'
 
-export function useWorkerGroup(): IJsonItem {
+export function useWorkerGroup(projectCode: number): IJsonItem {
   const { t } = useI18n()
 
   const options = ref([] as { label: string; value: string }[])
@@ -29,8 +29,9 @@ export function useWorkerGroup(): IJsonItem {
   const getWorkerGroups = async () => {
     if (loading.value) return
     loading.value = true
-    const res = await queryAllWorkerGroups()
-    options.value = res.map((item: string) => ({ label: item, value: item }))
+    await queryWorkerGroupsByProjectCode(projectCode).then((res: any) => {
+      options.value = res.data.map((item: any) =>({label: item.workerGroup, 
value: item.workerGroup }))
+    })
     loading.value = false
   }
 
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-chunjun.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-chunjun.ts
index 1902404ce5..fc24e1a7a8 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-chunjun.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-chunjun.ts
@@ -59,7 +59,7 @@ export function useChunjun({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-conditions.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-conditions.ts
index c22b2345eb..08e325099f 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-conditions.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-conditions.ts
@@ -57,7 +57,7 @@ export function useConditions({
       Fields.useRunFlag(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-data-factory.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-data-factory.ts
index c845fd0246..91fe1ff2f7 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-data-factory.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-data-factory.ts
@@ -58,7 +58,7 @@ export function useDataFactory({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-data-quality.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-data-quality.ts
index 457fc3afa6..c45dfa7044 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-data-quality.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-data-quality.ts
@@ -69,7 +69,7 @@ export function useDataQuality({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-datasync.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-datasync.ts
index 91de2f8cc5..843f90f349 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-datasync.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-datasync.ts
@@ -68,7 +68,7 @@ export function useDatasync({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-datax.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-datax.ts
index 0df09e14f2..b1344fbf35 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-datax.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-datax.ts
@@ -62,7 +62,7 @@ export function useDataX({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-dependent.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-dependent.ts
index 02bfcf7ebc..b140eea7f3 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-dependent.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-dependent.ts
@@ -60,7 +60,7 @@ export function useDependent({
       Fields.useRunFlag(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-dinky.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-dinky.ts
index d90e191967..846a6d7872 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-dinky.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-dinky.ts
@@ -54,7 +54,7 @@ export function useDinky({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-dms.ts 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-dms.ts
index 66c2c643da..7fe0922a73 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-dms.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-dms.ts
@@ -69,7 +69,7 @@ export function useDms({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-dvc.ts 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-dvc.ts
index 18124ad4ec..d8376a5c9c 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-dvc.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-dvc.ts
@@ -55,7 +55,7 @@ export function useDvc({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-dynamic.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-dynamic.ts
index d481528eb6..8f498fbfe9 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-dynamic.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-dynamic.ts
@@ -64,7 +64,7 @@ export function useDynamic({
       Fields.useRunFlag(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useTimeoutAlarm(model),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-emr.ts 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-emr.ts
index 6a4dd664ae..7af5aa3e3a 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-emr.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-emr.ts
@@ -56,7 +56,7 @@ export function useEmr({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-flink-stream.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-flink-stream.ts
index d2186f4466..0b35f9f275 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-flink-stream.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-flink-stream.ts
@@ -65,7 +65,7 @@ export function useFlinkStream({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       Fields.useDelayTime(model),
       ...Fields.useFlink(model),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-flink.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-flink.ts
index adb7dd39f7..204bfc7141 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-flink.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-flink.ts
@@ -65,7 +65,7 @@ export function useFlink({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-hive-cli.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-hive-cli.ts
index f1ae3b302f..e9e485a9b7 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-hive-cli.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-hive-cli.ts
@@ -68,7 +68,7 @@ export function useHiveCli({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-http.ts 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-http.ts
index 731929cb45..0e5d5fe5ca 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-http.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-http.ts
@@ -62,7 +62,7 @@ export function useHttp({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-java.ts 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-java.ts
index 32b67a46a3..1eb99de965 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-java.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-java.ts
@@ -76,7 +76,7 @@ export function useJava({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-jupyter.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-jupyter.ts
index dddd8fee19..1901209e73 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-jupyter.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-jupyter.ts
@@ -56,7 +56,7 @@ export function useJupyter({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-k8s.ts 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-k8s.ts
index c72443c218..e20a506df6 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-k8s.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-k8s.ts
@@ -61,7 +61,7 @@ export function useK8s({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-kubeflow.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-kubeflow.ts
index aaef1d6632..1c721a6dcd 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-kubeflow.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-kubeflow.ts
@@ -54,7 +54,7 @@ export function useKubeflow({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-linkis.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-linkis.ts
index 858c53ae34..5507f79bf6 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-linkis.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-linkis.ts
@@ -65,7 +65,7 @@ export function useLinkis({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-mlflow.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-mlflow.ts
index efb824c118..b25fdae436 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-mlflow.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-mlflow.ts
@@ -62,7 +62,7 @@ export function useMlflow({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-mr.ts 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-mr.ts
index 13eec1c0d6..0ea09704d3 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-mr.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-mr.ts
@@ -56,7 +56,7 @@ export function useMr({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-openmldb.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-openmldb.ts
index e597828f53..18bd0deadc 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-openmldb.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-openmldb.ts
@@ -58,7 +58,7 @@ export function useOpenmldb({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-pigeon.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-pigeon.ts
index 5d99554b79..22b879919b 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-pigeon.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-pigeon.ts
@@ -54,7 +54,7 @@ export function usePigeon({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-procedure.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-procedure.ts
index d45e7a3cad..90f2491613 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-procedure.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-procedure.ts
@@ -58,7 +58,7 @@ export function useProcedure({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-python.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-python.ts
index 91db8b6efd..09f598e1d4 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-python.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-python.ts
@@ -58,7 +58,7 @@ export function usePython({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-pytorch.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-pytorch.ts
index 3d3a8606f2..ca0776aa38 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-pytorch.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-pytorch.ts
@@ -73,7 +73,7 @@ export function usePytorch({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-remote-shell.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-remote-shell.ts
index 5e31de6da8..977776510d 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-remote-shell.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-remote-shell.ts
@@ -56,7 +56,7 @@ export function useRemoteShell({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-sagemaker.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-sagemaker.ts
index fa11be5a97..88a38d8ea7 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-sagemaker.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-sagemaker.ts
@@ -59,7 +59,7 @@ export function userSagemaker({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-sea-tunnel.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-sea-tunnel.ts
index 7f42217da7..1cf03008b9 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-sea-tunnel.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-sea-tunnel.ts
@@ -89,7 +89,7 @@ export function useSeaTunnel({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-shell.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-shell.ts
index 8026363e13..96b1c9ce6c 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-shell.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-shell.ts
@@ -57,7 +57,7 @@ export function useShell({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-spark.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-spark.ts
index 15f7ec508f..05aa0fe1c6 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-spark.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-spark.ts
@@ -64,7 +64,7 @@ export function useSpark({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-sql.ts 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-sql.ts
index 572435bf53..e733387c1d 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-sql.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-sql.ts
@@ -62,7 +62,7 @@ export function useSql({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-sqoop.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-sqoop.ts
index 03b625ee4c..e3e58a0594 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-sqoop.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-sqoop.ts
@@ -77,7 +77,7 @@ export function useSqoop({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-sub-process.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-sub-process.ts
index 77e45686d3..8c855666bc 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-sub-process.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-sub-process.ts
@@ -56,7 +56,7 @@ export function useSubProcess({
       Fields.useRunFlag(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useTimeoutAlarm(model),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-switch.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-switch.ts
index 55452c2582..1e6d3f80cc 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-switch.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-switch.ts
@@ -57,7 +57,7 @@ export function useSwitch({
       Fields.useRunFlag(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-zeppelin.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-zeppelin.ts
index 6516d013cf..c8ac1260e4 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-zeppelin.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-zeppelin.ts
@@ -59,7 +59,7 @@ export function useZeppelin({
       Fields.useCache(),
       Fields.useDescription(),
       Fields.useTaskPriority(),
-      Fields.useWorkerGroup(),
+      Fields.useWorkerGroup(projectCode),
       Fields.useEnvironmentName(model, !data?.id),
       ...Fields.useTaskGroup(model, projectCode),
       ...Fields.useFailed(),
diff --git 
a/dolphinscheduler-ui/src/views/projects/workflow/definition/components/use-modal.ts
 
b/dolphinscheduler-ui/src/views/projects/workflow/definition/components/use-modal.ts
index cc818103fd..733638a3f0 100644
--- 
a/dolphinscheduler-ui/src/views/projects/workflow/definition/components/use-modal.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/workflow/definition/components/use-modal.ts
@@ -26,7 +26,6 @@ import {
   importProcessDefinition,
   queryProcessDefinitionByCode
 } from '@/service/modules/process-definition'
-import { queryAllWorkerGroups } from '@/service/modules/worker-groups'
 import { queryAllEnvironmentList } from '@/service/modules/environment'
 import { listNormalAlertGroupById } from '@/service/modules/alert-group'
 import { startProcessInstance } from '@/service/modules/executors'
@@ -39,6 +38,7 @@ import { parseTime } from '@/common/common'
 import { EnvironmentItem } from '@/service/modules/environment/types'
 import { ITimingState, ProcessInstanceReq } from './types'
 import { queryTenantList } from '@/service/modules/tenants'
+import { queryWorkerGroupsByProjectCode } from 
'@/service/modules/projects-worker-group'
 
 export function useModal(
   state: any,
@@ -228,11 +228,8 @@ export function useModal(
   }
 
   const getWorkerGroups = () => {
-    queryAllWorkerGroups().then((res: any) => {
-      variables.workerGroups = res.map((item: string) => ({
-        label: item,
-        value: item
-      }))
+    queryWorkerGroupsByProjectCode(variables.projectCode).then((res: any) => {
+      variables.workerGroups = res.data.map((item: any) =>({label: 
item.workerGroup, value: item.workerGroup }))
     })
   }
 


Reply via email to