You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dolphinscheduler.apache.org by zh...@apache.org on 2022/12/01 06:21:07 UTC

[dolphinscheduler] branch dev updated: [feat][API] New restful API for workflow state (#13031)

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

zhongjiajie 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 1064680ded [feat][API] New restful API for workflow state (#13031)
1064680ded is described below

commit 1064680ded1341462a9feea3e1c76f8d5006152b
Author: insist777 <84...@users.noreply.github.com>
AuthorDate: Thu Dec 1 14:21:01 2022 +0800

    [feat][API] New restful API for workflow state (#13031)
---
 .../api/controller/StatisticsV2Controller.java     | 206 +++++++++++++++
 .../api/dto/project/StatisticsStateRequest.java    |  60 +++++
 .../apache/dolphinscheduler/api/enums/Status.java  |   5 +
 .../api/service/DataAnalysisService.java           |  57 ++++-
 .../api/service/ProjectService.java                |   1 -
 .../api/service/impl/DataAnalysisServiceImpl.java  | 275 ++++++++++++++++++++-
 .../api/service/impl/ProjectServiceImpl.java       |  45 ++--
 .../api/controller/StatisticsV2ControllerTest.java | 171 +++++++++++++
 .../common/constants/Constants.java                |   5 +
 .../dao/entity/DefinitionGroupByUser.java          |  27 +-
 .../dao/mapper/ProcessDefinitionMapper.java        |  14 ++
 .../dao/mapper/ProcessInstanceMapper.java          |  22 ++
 .../dao/mapper/ProcessTaskRelationMapper.java      |   3 +
 .../dolphinscheduler/dao/mapper/ProjectMapper.java |   7 +
 .../dao/mapper/TaskInstanceMapper.java             |  35 +++
 .../dao/mapper/ProcessDefinitionMapper.xml         |  18 ++
 .../dao/mapper/ProcessInstanceMapper.xml           |  24 ++
 .../dao/mapper/ProcessTaskRelationMapper.xml       |   7 +
 .../dolphinscheduler/dao/mapper/ProjectMapper.xml  |  10 +
 .../dao/mapper/TaskInstanceMapper.xml              |  57 +++++
 20 files changed, 998 insertions(+), 51 deletions(-)

diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/StatisticsV2Controller.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/StatisticsV2Controller.java
new file mode 100644
index 0000000000..f4b8a14559
--- /dev/null
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/StatisticsV2Controller.java
@@ -0,0 +1,206 @@
+/*
+ * 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.COUNT_PROCESS_DEFINITION_USER_ERROR;
+import static org.apache.dolphinscheduler.api.enums.Status.QUERY_ALL_WORKFLOW_COUNT_ERROR;
+import static org.apache.dolphinscheduler.api.enums.Status.QUERY_ONE_TASK_STATES_COUNT_ERROR;
+import static org.apache.dolphinscheduler.api.enums.Status.QUERY_ONE_WORKFLOW_STATE_COUNT_ERROR;
+import static org.apache.dolphinscheduler.api.enums.Status.QUERY_TASK_STATES_COUNT_ERROR;
+import static org.apache.dolphinscheduler.api.enums.Status.QUERY_WORKFLOW_STATES_COUNT_ERROR;
+
+import org.apache.dolphinscheduler.api.aspect.AccessLogAnnotation;
+import org.apache.dolphinscheduler.api.dto.project.StatisticsStateRequest;
+import org.apache.dolphinscheduler.api.exceptions.ApiException;
+import org.apache.dolphinscheduler.api.service.DataAnalysisService;
+import org.apache.dolphinscheduler.api.utils.Result;
+import org.apache.dolphinscheduler.common.constants.Constants;
+import org.apache.dolphinscheduler.dao.entity.User;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Map;
+
+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.RequestAttribute;
+import org.springframework.web.bind.annotation.RequestBody;
+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.tags.Tag;
+/**
+ * StatisticsV2 controller
+ */
+@Tag(name = "STATISTICS_V2")
+@RestController
+@RequestMapping("/v2/statistics")
+public class StatisticsV2Controller extends BaseController {
+
+    @Autowired
+    private DataAnalysisService dataAnalysisService;
+
+    /**
+     * query all workflow count
+     * @param loginUser login user
+     * @return workflow count
+     */
+    @Operation(summary = "queryAllWorkflowCount", description = "QUERY_ALL_WORKFLOW_COUNT")
+    @GetMapping(value = "/workflows/count")
+    @ResponseStatus(HttpStatus.OK)
+    @ApiException(QUERY_ALL_WORKFLOW_COUNT_ERROR)
+    @AccessLogAnnotation(ignoreRequestArgs = "loginUser")
+    public Result queryWorkflowInstanceCounts(@Parameter(hidden = true) @RequestAttribute(value = Constants.SESSION_USER) User loginUser) {
+        Map<String, Object> result = dataAnalysisService.queryAllWorkflowCounts(loginUser);
+        return returnDataList(result);
+    }
+
+    /**
+     * query all workflow states count
+     * @param loginUser login user
+     * @param statisticsStateRequest statisticsStateRequest
+     * @return workflow states count
+     */
+    @Operation(summary = "queryAllWorkflowStatesCount", description = "QUERY_ALL_WORKFLOW_STATES_COUNT")
+    @GetMapping(value = "/workflows/states/count")
+    @ResponseStatus(HttpStatus.OK)
+    @ApiException(QUERY_WORKFLOW_STATES_COUNT_ERROR)
+    @AccessLogAnnotation(ignoreRequestArgs = "loginUser")
+    public Result queryWorkflowStatesCounts(@Parameter(hidden = true) @RequestAttribute(value = Constants.SESSION_USER) User loginUser,
+                                            @RequestBody(required = false) StatisticsStateRequest statisticsStateRequest) {
+        Map<String, Object> result =
+                dataAnalysisService.countWorkflowStates(loginUser, statisticsStateRequest);
+        return returnDataList(result);
+    }
+
+    /**
+     * query one workflow states count
+     * @param loginUser login user
+     * @param workflowCode workflowCode
+     * @return workflow states count
+     */
+    @Operation(summary = "queryOneWorkflowStatesCount", description = "QUERY_One_WORKFLOW_STATES_COUNT")
+    @GetMapping(value = "/{workflowCode}/states/count")
+    @ResponseStatus(HttpStatus.OK)
+    @ApiException(QUERY_ONE_WORKFLOW_STATE_COUNT_ERROR)
+    @AccessLogAnnotation(ignoreRequestArgs = "loginUser")
+    public Result queryOneWorkflowStates(@Parameter(hidden = true) @RequestAttribute(value = Constants.SESSION_USER) User loginUser,
+                                         @PathVariable("workflowCode") Long workflowCode) {
+        Map<String, Object> result =
+                dataAnalysisService.countOneWorkflowStates(loginUser, workflowCode);
+        return returnDataList(result);
+    }
+
+    /**
+     * query all task states count
+     * @param loginUser login user
+     * @param statisticsStateRequest statisticsStateRequest
+     * @return tasks states count
+     */
+    @Operation(summary = "queryAllTaskStatesCount", description = "QUERY_ALL_TASK_STATES_COUNT")
+    @GetMapping(value = "/tasks/states/count")
+    @ResponseStatus(HttpStatus.OK)
+    @ApiException(QUERY_TASK_STATES_COUNT_ERROR)
+    @AccessLogAnnotation(ignoreRequestArgs = "loginUser")
+    public Result queryTaskStatesCounts(@Parameter(hidden = true) @RequestAttribute(value = Constants.SESSION_USER) User loginUser,
+                                        @RequestBody(required = false) StatisticsStateRequest statisticsStateRequest) {
+        Map<String, Object> result =
+                dataAnalysisService.countTaskStates(loginUser, statisticsStateRequest);
+        return returnDataList(result);
+    }
+
+    /**
+     * query one task states count
+     * @param loginUser login user
+     * @param taskCode taskCode
+     * @return tasks states count
+     */
+    @Operation(summary = "queryOneTaskStatesCount", description = "QUERY_ONE_TASK_STATES_COUNT")
+    @GetMapping(value = "/tasks/{taskCode}/states/count")
+    @ResponseStatus(HttpStatus.OK)
+    @ApiException(QUERY_ONE_TASK_STATES_COUNT_ERROR)
+    @AccessLogAnnotation(ignoreRequestArgs = "loginUser")
+    public Result queryOneTaskStatesCounts(@Parameter(hidden = true) @RequestAttribute(value = Constants.SESSION_USER) User loginUser,
+                                           @PathVariable("taskCode") Long taskCode) {
+        Map<String, Object> result =
+                dataAnalysisService.countOneTaskStates(loginUser, taskCode);
+        return returnDataList(result);
+    }
+
+    /**
+     * statistics the workflow quantities of certain user
+     * @param loginUser login user
+     * @param statisticsStateRequest statisticsStateRequest
+     * @return workflow count in project code
+     */
+    @Operation(summary = "countDefinitionV2ByUserId", description = "COUNT_PROCESS_DEFINITION_V2_BY_USERID_NOTES")
+    @GetMapping(value = "/workflows/users/count")
+    @ResponseStatus(HttpStatus.OK)
+    @ApiException(COUNT_PROCESS_DEFINITION_USER_ERROR)
+    @AccessLogAnnotation(ignoreRequestArgs = "loginUser")
+    public Result countDefinitionByUser(@Parameter(hidden = true) @RequestAttribute(value = Constants.SESSION_USER) User loginUser,
+                                        @RequestBody(required = false) StatisticsStateRequest statisticsStateRequest) {
+        String projectName = statisticsStateRequest.getProjectName();
+        Long projectCode = statisticsStateRequest.getProjectCode();
+        if (null == projectCode && !StringUtils.isBlank(projectName)) {
+            projectCode = dataAnalysisService.getProjectCodeByName(projectName);
+        }
+        Map<String, Object> result = dataAnalysisService.countDefinitionByUserV2(loginUser, projectCode, null, null);
+        return returnDataList(result);
+    }
+
+    /**
+     * statistics the workflow quantities of certain userId
+     * @param loginUser login user
+     * @param userId userId
+     * @return workflow count in project code
+     */
+    @Operation(summary = "countDefinitionV2ByUser", description = "COUNT_PROCESS_DEFINITION_V2_BY_USER_NOTES")
+    @GetMapping(value = "/workflows/users/{userId}/count")
+    @ResponseStatus(HttpStatus.OK)
+    @ApiException(COUNT_PROCESS_DEFINITION_USER_ERROR)
+    @AccessLogAnnotation(ignoreRequestArgs = "loginUser")
+    public Result countDefinitionByUserId(@Parameter(hidden = true) @RequestAttribute(value = Constants.SESSION_USER) User loginUser,
+                                          @PathVariable("userId") Integer userId) {
+        Map<String, Object> result = dataAnalysisService.countDefinitionByUserV2(loginUser, null, userId, null);
+        return returnDataList(result);
+    }
+    /**
+     * statistics the workflow quantities of certain userId and releaseState
+    * @param loginUser login user
+    * @param userId userId
+    * @param releaseState releaseState
+    * @return workflow count in project code
+    */
+    @Operation(summary = "countDefinitionV2ByUser", description = "COUNT_PROCESS_DEFINITION_V2_BY_USER_NOTES")
+    @GetMapping(value = "/workflows/users/{userId}/{releaseState}/count")
+    @ResponseStatus(HttpStatus.OK)
+    @ApiException(COUNT_PROCESS_DEFINITION_USER_ERROR)
+    @AccessLogAnnotation(ignoreRequestArgs = "loginUser")
+    public Result countDefinitionByUserState(@Parameter(hidden = true) @RequestAttribute(value = Constants.SESSION_USER) User loginUser,
+                                             @PathVariable("userId") Integer userId,
+                                             @PathVariable("releaseState") Integer releaseState) {
+        Map<String, Object> result = dataAnalysisService.countDefinitionByUserV2(loginUser, null, userId, releaseState);
+        return returnDataList(result);
+    }
+}
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/project/StatisticsStateRequest.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/project/StatisticsStateRequest.java
new file mode 100644
index 0000000000..77c78907bc
--- /dev/null
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/project/StatisticsStateRequest.java
@@ -0,0 +1,60 @@
+/*
+ * 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.dto.project;
+
+import java.util.Date;
+
+import lombok.Data;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class StatisticsStateRequest {
+
+    @Schema(name = "isAll", example = "true")
+    boolean isAll;
+
+    @Schema(name = "projectName", example = "PROJECT-NAME")
+    String projectName;
+
+    @Schema(name = "projectCode", example = "1234567890")
+    Long projectCode;
+
+    @Schema(name = "workflowName", example = "WORKFLOW-NAME")
+    String workflowName;
+
+    @Schema(name = "workflowCode", example = "1234567890")
+    Long workflowCode;
+
+    @Schema(name = "taskName", example = "TASK-NAME")
+    String taskName;
+
+    @Schema(name = "taskCode", example = "1234567890")
+    Long taskCode;
+
+    @Schema(name = "startDate", example = "2022-01-01 10:01:02")
+    Date startTime;
+
+    @Schema(name = "endDate", example = "2022-01-02 10:01:02")
+    Date endTime;
+
+}
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 6e6b8fb072..566ffac9c5 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
@@ -171,6 +171,11 @@ public enum Status {
     SAVE_ERROR(10136, "save error", "保存错误"),
     DELETE_PROJECT_ERROR_DEFINES_NOT_NULL(10137, "please delete the process definitions in project first!",
             "请先删除全部工作流定义"),
+    QUERY_ALL_WORKFLOW_COUNT_ERROR(10138, "query all workflow count error", "查询所有工作流数量错误"),
+    QUERY_WORKFLOW_STATES_COUNT_ERROR(10139, "query all workflow states count error", "查询所有工作流状态数量错误"),
+    QUERY_ONE_WORKFLOW_STATE_COUNT_ERROR(10140, "query one workflow state count error", "查询工作流状态数量错误"),
+    QUERY_TASK_STATES_COUNT_ERROR(10141, "query all task states count error", "查询所有任务状态数量错误"),
+    QUERY_ONE_TASK_STATES_COUNT_ERROR(10142, "query one task states count error", "查询任务状态数量错误"),
     BATCH_DELETE_PROCESS_INSTANCE_BY_IDS_ERROR(10117, "batch delete process instance by ids {0} error",
             "批量删除工作流实例错误: {0}"),
     PREVIEW_SCHEDULE_ERROR(10139, "preview schedule error", "预览调度配置错误"),
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/DataAnalysisService.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/DataAnalysisService.java
index 389731682e..2417f796ab 100644
--- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/DataAnalysisService.java
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/DataAnalysisService.java
@@ -17,6 +17,7 @@
 
 package org.apache.dolphinscheduler.api.service;
 
+import org.apache.dolphinscheduler.api.dto.project.StatisticsStateRequest;
 import org.apache.dolphinscheduler.dao.entity.ExecuteStatusCount;
 import org.apache.dolphinscheduler.dao.entity.User;
 
@@ -61,9 +62,21 @@ public interface DataAnalysisService {
      *
      * @param loginUser   login user
      * @param projectCode project code
-     * @return definition count data
+     * @return workflow count data
      */
     Map<String, Object> countDefinitionByUser(User loginUser, long projectCode);
+    /**
+     * statistics the workflow quantities of certain user
+     * <p>
+     * We only need projects which users have permission to see to determine whether the definition belongs to the user or not.
+     *
+     * @param loginUser   login user
+     * @param projectCode project code
+     * @param userId userId
+     * @param releaseState releaseState
+     * @return workflow count data
+     */
+    Map<String, Object> countDefinitionByUserV2(User loginUser, Long projectCode, Integer userId, Integer releaseState);
 
     /**
      * statistical command status data
@@ -94,4 +107,46 @@ public interface DataAnalysisService {
     List<ExecuteStatusCount> countTaskInstanceAllStatesByProjectCodes(@Param("startTime") Date startTime,
                                                                       @Param("endTime") Date endTime,
                                                                       @Param("projectCodes") Long[] projectCodes);
+
+    /**
+     * query all workflow count
+     * @param loginUser login user
+     * @return workflow count
+     */
+    Map<String, Object> queryAllWorkflowCounts(User loginUser);
+
+    /**
+     * query all workflow states count
+     * @param loginUser login user
+     * @param statisticsStateRequest statisticsStateRequest
+     * @return workflow states count
+     */
+    Map<String, Object> countWorkflowStates(User loginUser,
+                                            StatisticsStateRequest statisticsStateRequest);
+
+    /**
+     * query one workflow states count
+     * @param loginUser login user
+     * @param workflowCode workflowCode
+     * @return workflow states count
+     */
+    Map<String, Object> countOneWorkflowStates(User loginUser, Long workflowCode);
+
+    /**
+     * query all task states count
+     * @param loginUser login user
+     * @param statisticsStateRequest statisticsStateRequest
+     * @return tasks states count
+     */
+    Map<String, Object> countTaskStates(User loginUser, StatisticsStateRequest statisticsStateRequest);
+
+    /**
+     * query one task states count
+     * @param loginUser login user
+     * @param taskCode taskCode
+     * @return tasks states count
+     */
+    Map<String, Object> countOneTaskStates(User loginUser, Long taskCode);
+
+    Long getProjectCodeByName(String projectName);
 }
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProjectService.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProjectService.java
index 43b8a04acf..54a66c79ec 100644
--- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProjectService.java
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProjectService.java
@@ -203,5 +203,4 @@ public interface ProjectService {
      * @return project list
      */
     Result queryAllProjectListForDependent();
-
 }
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/DataAnalysisServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/DataAnalysisServiceImpl.java
index 06f4e632be..8888b3ee69 100644
--- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/DataAnalysisServiceImpl.java
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/DataAnalysisServiceImpl.java
@@ -22,6 +22,7 @@ import static org.apache.dolphinscheduler.api.constants.ApiFuncIdentificationCon
 import org.apache.dolphinscheduler.api.dto.CommandStateCount;
 import org.apache.dolphinscheduler.api.dto.DefineUserDto;
 import org.apache.dolphinscheduler.api.dto.TaskCountDto;
+import org.apache.dolphinscheduler.api.dto.project.StatisticsStateRequest;
 import org.apache.dolphinscheduler.api.enums.Status;
 import org.apache.dolphinscheduler.api.service.DataAnalysisService;
 import org.apache.dolphinscheduler.api.service.ProjectService;
@@ -35,21 +36,24 @@ import org.apache.dolphinscheduler.dao.entity.CommandCount;
 import org.apache.dolphinscheduler.dao.entity.DefinitionGroupByUser;
 import org.apache.dolphinscheduler.dao.entity.ExecuteStatusCount;
 import org.apache.dolphinscheduler.dao.entity.Project;
+import org.apache.dolphinscheduler.dao.entity.TaskDefinition;
 import org.apache.dolphinscheduler.dao.entity.User;
 import org.apache.dolphinscheduler.dao.mapper.CommandMapper;
 import org.apache.dolphinscheduler.dao.mapper.ErrorCommandMapper;
 import org.apache.dolphinscheduler.dao.mapper.ProcessDefinitionMapper;
 import org.apache.dolphinscheduler.dao.mapper.ProcessInstanceMapper;
+import org.apache.dolphinscheduler.dao.mapper.ProcessTaskRelationMapper;
 import org.apache.dolphinscheduler.dao.mapper.ProjectMapper;
+import org.apache.dolphinscheduler.dao.mapper.TaskDefinitionMapper;
 import org.apache.dolphinscheduler.dao.mapper.TaskInstanceMapper;
 import org.apache.dolphinscheduler.plugin.task.api.enums.TaskExecutionStatus;
-import org.apache.dolphinscheduler.service.process.ProcessService;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -94,8 +98,10 @@ public class DataAnalysisServiceImpl extends BaseServiceImpl implements DataAnal
     private TaskInstanceMapper taskInstanceMapper;
 
     @Autowired
-    private ProcessService processService;
+    private TaskDefinitionMapper taskDefinitionMapper;
 
+    @Autowired
+    private ProcessTaskRelationMapper relationMapper;
     /**
      * statistical task instance status data
      *
@@ -353,4 +359,269 @@ public class DataAnalysisServiceImpl extends BaseServiceImpl implements DataAnal
 
         return startTimeStates.orElse(null);
     }
+    /**
+     * query all workflow count
+     *
+     * @param loginUser login user
+     * @return workflow count
+     */
+    @Override
+    public Map<String, Object> queryAllWorkflowCounts(User loginUser) {
+        Map<String, Object> result = new HashMap<>();
+        int count = 0;
+        Set<Integer> projectIds = resourcePermissionCheckService
+                .userOwnedResourceIdsAcquisition(AuthorizationType.PROJECTS, loginUser.getId(), logger);
+        if (!projectIds.isEmpty()) {
+            List<Project> projects = projectMapper.selectBatchIds(projectIds);
+            List<Long> projectCodes = projects.stream().map(project -> project.getCode()).collect(Collectors.toList());
+            count = projectMapper.queryAllWorkflowCounts(projectCodes);
+        }
+        result.put("data", "AllWorkflowCounts = " + count);
+        putMsg(result, Status.SUCCESS);
+        return result;
+    }
+
+    /**
+     * query all workflow states count
+     * @param loginUser login user
+     * @param statisticsStateRequest statisticsStateRequest
+     * @return workflow states count
+     */
+    @Override
+    public Map<String, Object> countWorkflowStates(User loginUser,
+                                                   StatisticsStateRequest statisticsStateRequest) {
+        Map<String, Object> result = new HashMap<>();
+        Set<Integer> projectIds = resourcePermissionCheckService
+                .userOwnedResourceIdsAcquisition(AuthorizationType.PROJECTS, loginUser.getId(), logger);
+        if (projectIds.isEmpty()) {
+            putMsg(result, Status.SUCCESS);
+            return result;
+        }
+
+        String projectName = statisticsStateRequest.getProjectName();
+        String workflowName = statisticsStateRequest.getWorkflowName();
+        Long projectCode = statisticsStateRequest.getProjectCode();
+        Long workflowCode = statisticsStateRequest.getWorkflowCode();
+        Integer model = Constants.QUERY_ALL_ON_SYSTEM;
+
+        if (!StringUtils.isBlank(projectName) || null != projectCode) {
+            model = Constants.QUERY_ALL_ON_PROJECT;
+        }
+        if (!StringUtils.isBlank(workflowName) || null != workflowCode) {
+            model = Constants.QUERY_ALL_ON_WORKFLOW;
+        }
+        try {
+            if (null == workflowCode || null == projectCode) {
+                projectCode = projectMapper.queryByName(projectName).getCode();
+                workflowCode = processDefinitionMapper.queryByDefineName(projectCode, workflowName).getCode();
+            }
+        } catch (Exception e) {
+            logger.warn(e.getMessage());
+        }
+
+        Date date = new Date();
+        Date startTime = statisticsStateRequest.getStartTime() == null ? DateUtils.addMonths(date, -1)
+                : statisticsStateRequest.getStartTime();
+        Date endTime = statisticsStateRequest.getEndTime() == null ? date : statisticsStateRequest.getEndTime();
+
+        List<ExecuteStatusCount> executeStatusCounts = processInstanceMapper.countInstanceStateV2(
+                startTime, endTime, projectCode, workflowCode, model, projectIds);
+        TaskCountDto taskCountResult = new TaskCountDto(executeStatusCounts);
+        result.put(Constants.DATA_LIST, taskCountResult);
+        putMsg(result, Status.SUCCESS);
+        return result;
+    }
+
+    /**
+     * query one workflow states count
+     * @param loginUser login user
+     * @param workflowCode workflowCode
+     * @return workflow states count
+     */
+    @Override
+    public Map<String, Object> countOneWorkflowStates(User loginUser, Long workflowCode) {
+        Map<String, Object> result = new HashMap<>();
+        Project project = projectMapper.queryByCode(workflowCode);
+        boolean hasProjectAndWritePerm = projectService.hasProjectAndWritePerm(loginUser, project, result);
+        if (!hasProjectAndWritePerm) {
+            return result;
+        }
+        List<ExecuteStatusCount> executeStatusCounts = processInstanceMapper.countInstanceStateV2(
+                null, null, null, workflowCode, Constants.QUERY_ALL_ON_WORKFLOW, null);
+        if (executeStatusCounts != null) {
+            TaskCountDto taskCountResult = new TaskCountDto(executeStatusCounts);
+            result.put(Constants.DATA_LIST, taskCountResult);
+            putMsg(result, Status.SUCCESS);
+        }
+        return result;
+    }
+
+    /**
+     * query all task states count
+     * @param loginUser login user
+     * @param statisticsStateRequest statisticsStateRequest
+     * @return tasks states count
+     */
+    @Override
+    public Map<String, Object> countTaskStates(User loginUser, StatisticsStateRequest statisticsStateRequest) {
+        Map<String, Object> result = new HashMap<>();
+        Set<Integer> projectIds = resourcePermissionCheckService
+                .userOwnedResourceIdsAcquisition(AuthorizationType.PROJECTS, loginUser.getId(), logger);
+        if (projectIds.isEmpty()) {
+            putMsg(result, Status.SUCCESS);
+            return result;
+        }
+        String projectName = statisticsStateRequest.getProjectName();
+        String workflowName = statisticsStateRequest.getWorkflowName();
+        String taskName = statisticsStateRequest.getTaskName();
+        Long projectCode = statisticsStateRequest.getProjectCode();
+        Long workflowCode = statisticsStateRequest.getWorkflowCode();
+        Long taskCode = statisticsStateRequest.getTaskCode();
+        Integer model = Constants.QUERY_ALL_ON_SYSTEM;
+
+        if (!StringUtils.isBlank(projectName) || null != projectCode) {
+            model = Constants.QUERY_ALL_ON_PROJECT;
+        }
+        if (!StringUtils.isBlank(workflowName) || null != workflowCode) {
+            model = Constants.QUERY_ALL_ON_WORKFLOW;
+        }
+        if (!StringUtils.isBlank(taskName) || null != taskCode) {
+            model = Constants.QUERY_ALL_ON_TASK;
+        }
+
+        try {
+            if (null == taskCode || null == workflowCode || null == projectCode) {
+                projectCode = projectMapper.queryByName(projectName).getCode();
+                workflowCode = processDefinitionMapper.queryByDefineName(projectCode, workflowName).getCode();
+                // todo The comment can be canceled after repairing the duplicate taskname of the existing workflow
+                // taskCode = relationMapper.queryTaskCodeByTaskName(workflowCode, taskName);
+            }
+        } catch (Exception e) {
+            logger.warn(e.getMessage());
+        }
+
+        Date date = new Date();
+        Date startTime = statisticsStateRequest.getStartTime() == null ? DateUtils.addMonths(date, -1)
+                : statisticsStateRequest.getStartTime();
+        Date endTime = statisticsStateRequest.getEndTime() == null ? date : statisticsStateRequest.getEndTime();
+
+        Optional<List<ExecuteStatusCount>> startTimeStates = Optional.ofNullable(
+                taskInstanceMapper.countTaskInstanceStateByProjectIdsV2(startTime, endTime, projectIds));
+        List<TaskExecutionStatus> needRecountState = setOptional(startTimeStates);
+        if (needRecountState.size() == 0) {
+            TaskCountDto taskCountResult = new TaskCountDto(startTimeStates.get());
+            result.put(Constants.DATA_LIST, taskCountResult);
+            putMsg(result, Status.SUCCESS);
+            return result;
+        }
+        List<ExecuteStatusCount> recounts = this.taskInstanceMapper
+                .countTaskInstanceStateByProjectCodesAndStatesBySubmitTimeV2(startTime, endTime, projectCode,
+                        workflowCode, taskCode, model, projectIds,
+                        needRecountState);
+        startTimeStates.orElseGet(ArrayList::new).addAll(recounts);
+        List<ExecuteStatusCount> executeStatusCounts = startTimeStates.orElse(null);
+        TaskCountDto taskCountResult = new TaskCountDto(executeStatusCounts);
+        result.put(Constants.DATA_LIST, taskCountResult);
+        putMsg(result, Status.SUCCESS);
+        return result;
+    }
+
+    /**
+     * query one task states count
+     * @param loginUser login user
+     * @param taskCode taskCode
+     * @return tasks states count
+     */
+    @Override
+    public Map<String, Object> countOneTaskStates(User loginUser, Long taskCode) {
+        Map<String, Object> result = new HashMap<>();
+        TaskDefinition taskDefinition = taskDefinitionMapper.queryByCode(taskCode);
+        long projectCode = taskDefinition.getProjectCode();
+        Project project = projectMapper.queryByCode(projectCode);
+        boolean hasProjectAndWritePerm = projectService.hasProjectAndWritePerm(loginUser, project, result);
+        if (!hasProjectAndWritePerm) {
+            return result;
+        }
+        Set<Integer> projectId = Collections.singleton(project.getId());
+        Optional<List<ExecuteStatusCount>> startTimeStates = Optional.ofNullable(
+                taskInstanceMapper.countTaskInstanceStateByProjectIdsV2(null, null, projectId));
+        List<TaskExecutionStatus> needRecountState = setOptional(startTimeStates);
+        if (needRecountState.size() == 0) {
+            TaskCountDto taskCountResult = new TaskCountDto(startTimeStates.get());
+            result.put(Constants.DATA_LIST, taskCountResult);
+            putMsg(result, Status.SUCCESS);
+            return result;
+        }
+        List<ExecuteStatusCount> recounts = this.taskInstanceMapper
+                .countTaskInstanceStateByProjectCodesAndStatesBySubmitTimeV2(null, null, projectCode, null, taskCode,
+                        Constants.QUERY_ALL_ON_TASK, projectId,
+                        needRecountState);
+        startTimeStates.orElseGet(ArrayList::new).addAll(recounts);
+        List<ExecuteStatusCount> executeStatusCounts = startTimeStates.orElse(null);
+        TaskCountDto taskCountResult = new TaskCountDto(executeStatusCounts);
+        result.put(Constants.DATA_LIST, taskCountResult);
+        putMsg(result, Status.SUCCESS);
+        return result;
+    }
+
+    /**
+     * statistics the process definition quantities of a certain person
+     * <p>
+     * We only need projects which users have permission to see to determine whether the definition belongs to the user or not.
+     *
+     * @param loginUser   login user
+     * @param projectCode project code
+     * @return definition count data
+     */
+    @Override
+    public Map<String, Object> countDefinitionByUserV2(User loginUser, Long projectCode, Integer userId,
+                                                       Integer releaseState) {
+        Map<String, Object> result = new HashMap<>();
+        if (null != projectCode) {
+            Project project = projectMapper.queryByCode(projectCode);
+            result = projectService.checkProjectAndAuth(loginUser, project, projectCode, PROJECT_OVERVIEW);
+            if (result.get(Constants.STATUS) != Status.SUCCESS) {
+                return result;
+            }
+        }
+
+        List<DefinitionGroupByUser> defineGroupByUsers = new ArrayList<>();
+        Pair<Set<Integer>, Map<String, Object>> projectIds = getProjectIds(loginUser, result);
+        if (projectIds.getRight() != null) {
+            List<DefinitionGroupByUser> emptyList = new ArrayList<>();
+            DefineUserDto dto = new DefineUserDto(emptyList);
+            result.put(Constants.DATA_LIST, dto);
+            putMsg(result, Status.SUCCESS);
+            return result;
+        }
+        Long[] projectCodeArray =
+                projectCode == null ? getProjectCodesArrays(projectIds.getLeft()) : new Long[]{projectCode};
+        if (projectCodeArray.length != 0 || loginUser.getUserType() == UserType.ADMIN_USER) {
+            defineGroupByUsers =
+                    processDefinitionMapper.countDefinitionByProjectCodesV2(projectCodeArray, userId, releaseState);
+        }
+
+        DefineUserDto dto = new DefineUserDto(defineGroupByUsers);
+        result.put(Constants.DATA_LIST, dto);
+        putMsg(result, Status.SUCCESS);
+        return result;
+    }
+
+    @Override
+    public Long getProjectCodeByName(String projectName) {
+        Project project = projectMapper.queryByName(projectName);
+        return project == null ? 0 : project.getCode();
+    }
+
+    private List<TaskExecutionStatus> setOptional(Optional<List<ExecuteStatusCount>> startTimeStates) {
+        List<TaskExecutionStatus> allState = Arrays.stream(TaskExecutionStatus.values()).collect(Collectors.toList());
+        if (startTimeStates.isPresent() && startTimeStates.get().size() != 0) {
+            List<TaskExecutionStatus> instanceState =
+                    startTimeStates.get().stream().map(ExecuteStatusCount::getState).collect(Collectors.toList());
+            // value 0 state need to recount by submit time
+            return allState.stream().filter(ele -> !instanceState.contains(ele)).collect(Collectors.toList());
+        } else {
+            return allState;
+        }
+    }
 }
diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProjectServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProjectServiceImpl.java
index 1353a30fed..48f8a24a0b 100644
--- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProjectServiceImpl.java
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProjectServiceImpl.java
@@ -17,9 +17,7 @@
 
 package org.apache.dolphinscheduler.api.service.impl;
 
-import static org.apache.dolphinscheduler.api.constants.ApiFuncIdentificationConstant.PROJECT;
-import static org.apache.dolphinscheduler.api.constants.ApiFuncIdentificationConstant.PROJECT_CREATE;
-import static org.apache.dolphinscheduler.api.constants.ApiFuncIdentificationConstant.PROJECT_DELETE;
+import static org.apache.dolphinscheduler.api.constants.ApiFuncIdentificationConstant.*;
 
 import org.apache.dolphinscheduler.api.enums.Status;
 import org.apache.dolphinscheduler.api.exceptions.ServiceException;
@@ -90,8 +88,8 @@ public class ProjectServiceImpl extends BaseServiceImpl implements ProjectServic
      * create project
      *
      * @param loginUser login user
-     * @param name project name
-     * @param desc description
+     * @param name      project name
+     * @param desc      description
      * @return returns an error if it exists
      */
     @Override
@@ -331,8 +329,8 @@ public class ProjectServiceImpl extends BaseServiceImpl implements ProjectServic
      *
      * @param loginUser login user
      * @param searchVal search value
-     * @param pageSize page size
-     * @param pageNo page number
+     * @param pageSize  page size
+     * @param pageNo    page number
      * @return project list which the login user have permission to see
      */
     @Override
@@ -366,11 +364,11 @@ public class ProjectServiceImpl extends BaseServiceImpl implements ProjectServic
     /**
      * admin can view all projects
      *
-     * @param userId user id
+     * @param userId    user id
      * @param loginUser login user
      * @param searchVal search value
-     * @param pageSize page size
-     * @param pageNo page number
+     * @param pageSize  page size
+     * @param pageNo    page number
      * @return project list which with the login user's authorized level
      */
     @Override
@@ -417,7 +415,7 @@ public class ProjectServiceImpl extends BaseServiceImpl implements ProjectServic
     /**
      * delete project by code
      *
-     * @param loginUser login user
+     * @param loginUser   login user
      * @param projectCode project code
      * @return delete result code
      */
@@ -462,7 +460,7 @@ public class ProjectServiceImpl extends BaseServiceImpl implements ProjectServic
      * get check result
      *
      * @param loginUser login user
-     * @param project project
+     * @param project   project
      * @return check result
      */
     private Map<String, Object> getCheckResult(User loginUser, Project project, String perm) {
@@ -478,11 +476,11 @@ public class ProjectServiceImpl extends BaseServiceImpl implements ProjectServic
     /**
      * updateProcessInstance project
      *
-     * @param loginUser login user
+     * @param loginUser   login user
      * @param projectCode project code
      * @param projectName project name
-     * @param desc description
-     * @param userName project owner
+     * @param desc        description
+     * @param userName    project owner
      * @return update result code
      */
     @Override
@@ -528,6 +526,7 @@ public class ProjectServiceImpl extends BaseServiceImpl implements ProjectServic
 
     /**
      * query all project with authorized level
+     *
      * @param loginUser login user
      * @return project list
      */
@@ -571,7 +570,7 @@ public class ProjectServiceImpl extends BaseServiceImpl implements ProjectServic
      * query unauthorized project
      *
      * @param loginUser login user
-     * @param userId user id
+     * @param userId    user id
      * @return the projects which user have not permission to see
      */
     @Override
@@ -606,7 +605,7 @@ public class ProjectServiceImpl extends BaseServiceImpl implements ProjectServic
     /**
      * get unauthorized project
      *
-     * @param projectSet project set
+     * @param projectSet        project set
      * @param authedProjectList authed project list
      * @return project list that unauthorized
      */
@@ -625,7 +624,7 @@ public class ProjectServiceImpl extends BaseServiceImpl implements ProjectServic
      * query authorized project
      *
      * @param loginUser login user
-     * @param userId user id
+     * @param userId    user id
      * @return projects which the user have permission to see, Except for items created by this user
      */
     @Override
@@ -642,8 +641,8 @@ public class ProjectServiceImpl extends BaseServiceImpl implements ProjectServic
     /**
      * query authorized user
      *
-     * @param loginUser     login user
-     * @param projectCode   project code
+     * @param loginUser   login user
+     * @param projectCode project code
      * @return users        who have permission for the specified project
      */
     @Override
@@ -709,7 +708,7 @@ public class ProjectServiceImpl extends BaseServiceImpl implements ProjectServic
     /**
      * check whether have read permission
      *
-     * @param user user
+     * @param user    user
      * @param project project
      * @return true if the user have permission to see the project, otherwise return false
      */
@@ -721,7 +720,7 @@ public class ProjectServiceImpl extends BaseServiceImpl implements ProjectServic
     /**
      * query permission id
      *
-     * @param user user
+     * @param user    user
      * @param project project
      * @return permission
      */
@@ -746,6 +745,7 @@ public class ProjectServiceImpl extends BaseServiceImpl implements ProjectServic
 
     /**
      * query all project list
+     *
      * @param user
      * @return project list
      */
@@ -798,5 +798,4 @@ public class ProjectServiceImpl extends BaseServiceImpl implements ProjectServic
         putMsg(result, Status.SUCCESS);
         return result;
     }
-
 }
diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/StatisticsV2ControllerTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/StatisticsV2ControllerTest.java
new file mode 100644
index 0000000000..a2efc550b3
--- /dev/null
+++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/StatisticsV2ControllerTest.java
@@ -0,0 +1,171 @@
+/*
+ * 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 org.apache.dolphinscheduler.api.dto.TaskCountDto;
+import org.apache.dolphinscheduler.api.dto.project.StatisticsStateRequest;
+import org.apache.dolphinscheduler.api.enums.Status;
+import org.apache.dolphinscheduler.api.service.impl.DataAnalysisServiceImpl;
+import org.apache.dolphinscheduler.api.utils.Result;
+import org.apache.dolphinscheduler.common.constants.Constants;
+import org.apache.dolphinscheduler.dao.entity.ExecuteStatusCount;
+import org.apache.dolphinscheduler.dao.entity.User;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+
+public class StatisticsV2ControllerTest extends AbstractControllerTest {
+
+    @InjectMocks
+    private StatisticsV2Controller statisticsV2Controller;
+
+    @Mock
+    private DataAnalysisServiceImpl dataAnalysisService;
+
+    @Test
+    public void testQueryWorkflowInstanceCounts() {
+        User loginUser = getLoginUser();
+        int count = 0;
+        Map<String, Object> result = new HashMap<>();
+        result.put("data", "AllWorkflowCounts = " + count);
+        putMsg(result, Status.SUCCESS);
+
+        Mockito.when(dataAnalysisService.queryAllWorkflowCounts(loginUser)).thenReturn(result);
+
+        Result result1 = statisticsV2Controller.queryWorkflowInstanceCounts(loginUser);
+
+        Assertions.assertTrue(result1.isSuccess());
+
+    }
+    @Test
+    public void testQueryWorkflowStatesCounts() {
+        User loginUser = getLoginUser();
+        Map<String, Object> result = new HashMap<>();
+        StatisticsStateRequest statisticsStateRequest = new StatisticsStateRequest();
+        List<ExecuteStatusCount> executeStatusCounts = new ArrayList<>();
+        TaskCountDto taskCountResult = new TaskCountDto(executeStatusCounts);
+        result.put(Constants.DATA_LIST, taskCountResult);
+        putMsg(result, Status.SUCCESS);
+
+        Mockito.when(dataAnalysisService.countWorkflowStates(loginUser, statisticsStateRequest)).thenReturn(result);
+
+        Result result1 = statisticsV2Controller.queryWorkflowStatesCounts(loginUser, statisticsStateRequest);
+
+        Assertions.assertTrue(result1.isSuccess());
+    }
+    @Test
+    public void testQueryOneWorkflowStates() {
+        User loginUser = getLoginUser();
+        Long workflowCode = 1L;
+        Map<String, Object> result = new HashMap<>();
+        List<ExecuteStatusCount> executeStatusCounts = new ArrayList<>();
+        TaskCountDto taskCountResult = new TaskCountDto(executeStatusCounts);
+        result.put(Constants.DATA_LIST, taskCountResult);
+        putMsg(result, Status.SUCCESS);
+
+        Mockito.when(dataAnalysisService.countOneWorkflowStates(loginUser, workflowCode)).thenReturn(result);
+
+        Result result1 = statisticsV2Controller.queryOneWorkflowStates(loginUser, workflowCode);
+
+        Assertions.assertTrue(result1.isSuccess());
+
+    }
+    @Test
+    public void testQueryTaskStatesCounts() {
+        User loginUser = getLoginUser();
+        Map<String, Object> result = new HashMap<>();
+        StatisticsStateRequest statisticsStateRequest = new StatisticsStateRequest();
+        List<ExecuteStatusCount> executeStatusCounts = new ArrayList<>();
+        TaskCountDto taskCountResult = new TaskCountDto(executeStatusCounts);
+        result.put(Constants.DATA_LIST, taskCountResult);
+        putMsg(result, Status.SUCCESS);
+
+        Mockito.when(dataAnalysisService.countTaskStates(loginUser, statisticsStateRequest)).thenReturn(result);
+
+        Result result1 = statisticsV2Controller.queryTaskStatesCounts(loginUser, statisticsStateRequest);
+
+        Assertions.assertTrue(result1.isSuccess());
+
+    }
+    @Test
+    public void testQueryOneTaskStatesCounts() {
+        User loginUser = getLoginUser();
+        Long taskCode = 1L;
+        Map<String, Object> result = new HashMap<>();
+
+        List<ExecuteStatusCount> executeStatusCounts = new ArrayList<>();
+        TaskCountDto taskCountResult = new TaskCountDto(executeStatusCounts);
+        result.put(Constants.DATA_LIST, taskCountResult);
+        putMsg(result, Status.SUCCESS);
+
+        Mockito.when(dataAnalysisService.countOneTaskStates(loginUser, taskCode)).thenReturn(result);
+
+        Result result1 = statisticsV2Controller.queryOneTaskStatesCounts(loginUser, taskCode);
+
+        Assertions.assertTrue(result1.isSuccess());
+
+    }
+    @Test
+    public void testCountDefinitionByUser() {
+        User loginUser = getLoginUser();
+
+        Map<String, Object> result = new HashMap<>();
+        StatisticsStateRequest statisticsStateRequest = new StatisticsStateRequest();
+
+        List<ExecuteStatusCount> executeStatusCounts = new ArrayList<>();
+        TaskCountDto taskCountResult = new TaskCountDto(executeStatusCounts);
+        result.put(Constants.DATA_LIST, taskCountResult);
+        putMsg(result, Status.SUCCESS);
+        Mockito.when(dataAnalysisService.countDefinitionByUserV2(loginUser, statisticsStateRequest.getProjectCode(),
+                null, null)).thenReturn(result);
+
+        Result result1 = statisticsV2Controller.countDefinitionByUser(loginUser, statisticsStateRequest);
+
+        Assertions.assertTrue(result1.isSuccess());
+
+    }
+    @Test
+    public void testCountDefinitionByUserId() {
+        User loginUser = getLoginUser();
+        Map<String, Object> result = new HashMap<>();
+        Integer userId = 1;
+
+        putMsg(result, Status.SUCCESS);
+
+        Mockito.when(dataAnalysisService.countDefinitionByUserV2(loginUser, null, userId, null)).thenReturn(result);
+
+        Result result1 = statisticsV2Controller.countDefinitionByUserId(loginUser, userId);
+
+        Assertions.assertTrue(result1.isSuccess());
+    }
+
+    private User getLoginUser() {
+        User user = new User();
+        user.setId(1);
+        user.setUserName("admin");
+        return user;
+    }
+}
diff --git a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/Constants.java b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/Constants.java
index 853df0857e..8d2c1e2e15 100644
--- a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/Constants.java
+++ b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/Constants.java
@@ -802,4 +802,9 @@ public final class Constants {
     public static final String KERBEROS_KRB5_CONF_PATH = "javaSecurityKrb5Conf";
     public static final String KERBEROS_KEY_TAB_USERNAME = "loginUserKeytabUsername";
     public static final String KERBEROS_KEY_TAB_PATH = "loginUserKeytabPath";
+
+    public static final Integer QUERY_ALL_ON_SYSTEM = 0;
+    public static final Integer QUERY_ALL_ON_PROJECT = 1;
+    public static final Integer QUERY_ALL_ON_WORKFLOW = 2;
+    public static final Integer QUERY_ALL_ON_TASK = 3;
 }
diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/DefinitionGroupByUser.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/DefinitionGroupByUser.java
index bd20386fb0..b92b33ff5c 100644
--- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/DefinitionGroupByUser.java
+++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/DefinitionGroupByUser.java
@@ -17,9 +17,12 @@
 
 package org.apache.dolphinscheduler.dao.entity;
 
+import lombok.Data;
+
 /**
  * count definition number group by user
  */
+@Data
 public class DefinitionGroupByUser {
 
     /**
@@ -36,28 +39,4 @@ public class DefinitionGroupByUser {
      * count number
      */
     private int count;
-
-    public String getUserName() {
-        return userName;
-    }
-
-    public void setUserName(String userName) {
-        this.userName = userName;
-    }
-
-    public int getCount() {
-        return count;
-    }
-
-    public void setCount(int count) {
-        this.count = count;
-    }
-
-    public Integer getUserId() {
-        return userId;
-    }
-
-    public void setUserId(Integer userId) {
-        this.userId = userId;
-    }
 }
diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ProcessDefinitionMapper.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ProcessDefinitionMapper.java
index e61b527217..0e0ba3ee5b 100644
--- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ProcessDefinitionMapper.java
+++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ProcessDefinitionMapper.java
@@ -168,6 +168,20 @@ public interface ProcessDefinitionMapper extends BaseMapper<ProcessDefinition> {
      */
     List<DefinitionGroupByUser> countDefinitionByProjectCodes(@Param("projectCodes") Long[] projectCodes);
 
+    /**
+     * Statistics process definition group by project codes list
+     * <p>
+     * We only need project codes to determine whether the definition belongs to the user or not.
+     *
+     * @param projectCodes projectCodes
+     * @param userId userId
+     * @param releaseState releaseState
+     * @return definition group by user
+     */
+    List<DefinitionGroupByUser> countDefinitionByProjectCodesV2(@Param("projectCodes") Long[] projectCodes,
+                                                                @Param("userId") Integer userId,
+                                                                @Param("releaseState") Integer releaseState);
+
     /**
      * list all resource ids
      *
diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ProcessInstanceMapper.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ProcessInstanceMapper.java
index c362eb8bf8..2897ee5450 100644
--- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ProcessInstanceMapper.java
+++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ProcessInstanceMapper.java
@@ -25,6 +25,7 @@ import org.apache.ibatis.annotations.Param;
 
 import java.util.Date;
 import java.util.List;
+import java.util.Set;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -287,4 +288,25 @@ public interface ProcessInstanceMapper extends BaseMapper<ProcessInstance> {
                                                             @Param("state") Integer state,
                                                             @Param("host") String host);
 
+    /**
+     * Statistics process instance state v2
+     * <p>
+     * We only need project codes to determine whether the process instance belongs to the user or not.
+     *
+     * @param startTime    startTime
+     * @param endTime      endTime
+     * @param projectCode  projectCode
+     * @param workflowCode workflowCode
+     * @param model model
+     * @param projectIds projectIds
+     * @return ExecuteStatusCount list
+     */
+    List<ExecuteStatusCount> countInstanceStateV2(
+                                                  @Param("startTime") Date startTime,
+                                                  @Param("endTime") Date endTime,
+                                                  @Param("projectCode") Long projectCode,
+                                                  @Param("workflowCode") Long workflowCode,
+                                                  @Param("model") Integer model,
+                                                  @Param("projectIds") Set<Integer> projectIds);
+
 }
diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ProcessTaskRelationMapper.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ProcessTaskRelationMapper.java
index 58a474f85b..b2592fa72a 100644
--- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ProcessTaskRelationMapper.java
+++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ProcessTaskRelationMapper.java
@@ -219,4 +219,7 @@ public interface ProcessTaskRelationMapper extends BaseMapper<ProcessTaskRelatio
      * @return update num
      */
     int updateProcessTaskRelationTaskVersion(@Param("processTaskRelation") ProcessTaskRelation processTaskRelationList);
+
+    Long queryTaskCodeByTaskName(@Param("workflowCode") Long workflowCode,
+                                 @Param("taskName") String taskName);
 }
diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ProjectMapper.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ProjectMapper.java
index c43a2415f0..772593d21e 100644
--- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ProjectMapper.java
+++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/ProjectMapper.java
@@ -150,4 +150,11 @@ public interface ProjectMapper extends BaseMapper<Project> {
      * @return project
      */
     Project queryProjectByTaskInstanceId(@Param("taskInstanceId") int taskInstanceId);
+
+    /**
+     * query all workflow count
+     * @param projectsCodes projectsCodes
+     * @return workflow count
+     */
+    int queryAllWorkflowCounts(@Param("projectsCodes") List<Long> projectsCodes);
 }
diff --git a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/TaskInstanceMapper.java b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/TaskInstanceMapper.java
index 7b90ba24af..7bee2fc6b8 100644
--- a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/TaskInstanceMapper.java
+++ b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/mapper/TaskInstanceMapper.java
@@ -27,6 +27,7 @@ import org.apache.ibatis.annotations.Param;
 
 import java.util.Date;
 import java.util.List;
+import java.util.Set;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -76,6 +77,20 @@ public interface TaskInstanceMapper extends BaseMapper<TaskInstance> {
                                                                   @Param("endTime") Date endTime,
                                                                   @Param("projectCodes") Long[] projectCodes);
 
+    /**
+     * Statistics task instance group by given project ids list by start time
+     * <p>
+     * We only need project ids to determine whether the task instance belongs to the user or not.
+     *
+     * @param startTime    Statistics start time
+     * @param endTime      Statistics end time
+     * @param projectIds Project ids list to filter
+     * @return List of ExecuteStatusCount
+     */
+    List<ExecuteStatusCount> countTaskInstanceStateByProjectIdsV2(@Param("startTime") Date startTime,
+                                                                  @Param("endTime") Date endTime,
+                                                                  @Param("projectIds") Set<Integer> projectIds);
+
     /**
      * Statistics task instance group by given project codes list by submit time
      * <p>
@@ -90,6 +105,26 @@ public interface TaskInstanceMapper extends BaseMapper<TaskInstance> {
                                                                                        @Param("endTime") Date endTime,
                                                                                        @Param("projectCodes") Long[] projectCodes,
                                                                                        @Param("states") List<TaskExecutionStatus> states);
+    /**
+     * Statistics task instance group by given project codes list by submit time
+     * <p>
+     * We only need project codes to determine whether the task instance belongs to the user or not.
+     *
+     * @param startTime    Statistics start time
+     * @param endTime      Statistics end time
+     * @param projectCode  projectCode
+     * @param model model
+     * @param projectIds projectIds
+     * @return List of ExecuteStatusCount
+     */
+    List<ExecuteStatusCount> countTaskInstanceStateByProjectCodesAndStatesBySubmitTimeV2(@Param("startTime") Date startTime,
+                                                                                         @Param("endTime") Date endTime,
+                                                                                         @Param("projectCode") Long projectCode,
+                                                                                         @Param("workflowCode") Long workflowCode,
+                                                                                         @Param("taskCode") Long taskCode,
+                                                                                         @Param("model") Integer model,
+                                                                                         @Param("projectIds") Set<Integer> projectIds,
+                                                                                         @Param("states") List<TaskExecutionStatus> states);
 
     IPage<TaskInstance> queryTaskInstanceListPaging(IPage<TaskInstance> page,
                                                     @Param("projectCode") Long projectCode,
diff --git a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessDefinitionMapper.xml b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessDefinitionMapper.xml
index f654b0bd77..7ba450d920 100644
--- a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessDefinitionMapper.xml
+++ b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessDefinitionMapper.xml
@@ -151,6 +151,24 @@
             </foreach>
         </if>
         group by td.user_id,tu.user_name
+    </select><select id="countDefinitionByProjectCodesV2" resultType="org.apache.dolphinscheduler.dao.entity.DefinitionGroupByUser">
+        SELECT td.user_id as user_id, tu.user_name as user_name, count(0) as count
+        FROM t_ds_process_definition td
+        JOIN t_ds_user tu on tu.id=td.user_id
+        where 1 = 1
+        <if test="projectCodes != null and projectCodes.length != 0">
+            and td.project_code in
+            <foreach collection="projectCodes" index="index" item="i" open="(" separator="," close=")">
+                #{i}
+            </foreach>
+        </if>
+        <if test="userId != null">
+            and td.user_id = #{userId}
+        </if>
+        <if test="releaseState != null">
+            and td.release_state = #{releaseState}
+        </if>
+        group by td.user_id,tu.user_name
     </select>
 
     <select id="queryByDefineId" resultType="org.apache.dolphinscheduler.dao.entity.ProcessDefinition">
diff --git a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessInstanceMapper.xml b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessInstanceMapper.xml
index ad907b7958..ce4e35aac9 100644
--- a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessInstanceMapper.xml
+++ b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessInstanceMapper.xml
@@ -308,6 +308,30 @@
         </if>
         order by instance.start_time desc,instance.id desc
     </select>
+    <select id="countInstanceStateV2" resultType="org.apache.dolphinscheduler.dao.entity.ExecuteStatusCount">
+        select t.state, count(0) as count
+        from t_ds_process_instance t
+        join t_ds_process_definition d on d.code=t.process_definition_code
+        join t_ds_project p on p.code=d.project_code
+        where 1 = 1
+        and t.is_sub_process = 0
+        <if test="projectIds != null and projectIds.size() != 0">
+            and p.id in
+            <foreach collection="projectIds" index="index" item="i" open="(" close=")" separator=",">
+                #{i}
+            </foreach>
+        </if>
+        <if test="startTime != null and endTime != null">
+            and t.start_time <![CDATA[ >= ]]> #{startTime} and t.start_time <![CDATA[ <= ]]> #{endTime}
+        </if>
+        <if test="model >= 1">
+           and p.code = #{projectCode}
+        </if>
+        <if test="model >= 2">
+            and d.code = #{workflowCode}
+        </if>
+        group by t.state
+    </select>
     <update id="updateGlobalParamsById">
         update t_ds_process_instance
         set global_params = #{globalParams}
diff --git a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessTaskRelationMapper.xml b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessTaskRelationMapper.xml
index ffd6957fbc..c1ad2fac34 100644
--- a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessTaskRelationMapper.xml
+++ b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProcessTaskRelationMapper.xml
@@ -221,6 +221,13 @@
         </where>
         order by update_time desc, id asc
     </select>
+    <select id="queryTaskCodeByTaskName" resultType="java.lang.Long">
+        select r.post_task_code
+        from t_ds_process_task_relation r
+        left join t_ds_task_definition d on d.code = r.post_task_code
+        where r.process_definition_code = #{workflowCode}
+        and d.name = #{taskName}
+    </select>
     <update id="updateProcessTaskRelationTaskVersion">
             update t_ds_process_task_relation
             set
diff --git a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProjectMapper.xml b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProjectMapper.xml
index 6996d6f754..32ef8e72a5 100644
--- a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProjectMapper.xml
+++ b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/ProjectMapper.xml
@@ -197,4 +197,14 @@
         join t_ds_project p on p.code = pd.project_code
         where ti.id = #{taskInstanceId}
     </select>
+    <select id="queryAllWorkflowCounts" resultType="java.lang.Integer">
+        SELECT COUNT(*) FROM t_ds_process_definition
+        where 1=1
+        <if test="projectsCodes != null and projectsCodes.size() > 0">
+            and project_code  in
+            <foreach item="code" index="index" collection="projectsCodes" open="(" separator="," close=")">
+                #{code}
+            </foreach>
+        </if>
+    </select>
 </mapper>
diff --git a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/TaskInstanceMapper.xml b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/TaskInstanceMapper.xml
index c85006148a..a9607740b2 100644
--- a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/TaskInstanceMapper.xml
+++ b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/TaskInstanceMapper.xml
@@ -92,6 +92,26 @@
         </if>
         group by t.state
     </select>
+    <select id="countTaskInstanceStateByProjectIdsV2" resultType="org.apache.dolphinscheduler.dao.entity.ExecuteStatusCount">
+        select state, count(0) as count
+        from t_ds_task_instance t
+        left join t_ds_task_definition_log d on d.code=t.task_code and d.version=t.task_definition_version
+        left join t_ds_project p on p.code=d.project_code
+        where 1=1
+        <if test="projectIds != null and projectIds.size() != 0">
+            and d.id in
+            <foreach collection="projectIds" index="index" item="i" open="(" separator="," close=")">
+                #{i}
+            </foreach>
+        </if>
+        <if test="startTime != null">
+            and t.start_time <![CDATA[ > ]]> #{startTime}
+        </if>
+        <if test="endTime != null">
+            and t.start_time <![CDATA[ <= ]]> #{endTime}
+        </if>
+        group by t.state
+    </select>
     <select id="countTaskInstanceStateByProjectCodesAndStatesBySubmitTime" resultType="org.apache.dolphinscheduler.dao.entity.ExecuteStatusCount">
         select
         state, count(0) as count
@@ -119,6 +139,43 @@
         </if>
         group by t.state
     </select>
+    <select id="countTaskInstanceStateByProjectCodesAndStatesBySubmitTimeV2" resultType="org.apache.dolphinscheduler.dao.entity.ExecuteStatusCount">
+        select
+        state, count(0) as count
+        from t_ds_task_instance t
+        left join t_ds_task_definition_log d on d.code=t.task_code and d.version=t.task_definition_version
+        left join t_ds_project p on p.code=d.project_code
+        left join t_ds_process_task_relation r on r.post_task_code = d.code
+        where 1=1
+        <if test="states != null and states.size != 0">
+            and t.state in
+            <foreach collection="states" index="index" item="state" open="(" separator="," close=")">
+                #{state.code}
+            </foreach>
+        </if>
+        <if test="projectIds != null and projectIds.size() != 0">
+            and p.id in
+            <foreach collection="projectIds" index="index" item="i" open="(" separator="," close=")">
+                #{i}
+            </foreach>
+        </if>
+        <if test="startTime != null">
+            and t.submit_time <![CDATA[ > ]]> #{startTime}
+        </if>
+        <if test="endTime != null">
+            and t.submit_time <![CDATA[ <= ]]> #{endTime}
+        </if>
+        <if test="model == 1 and projectCode !=null">
+            and p.code = #{projectCode}
+        </if>
+        <if test="model == 2 and workflowCode !=null">
+            and r.process_definition_code = #{workflowCode}
+        </if>
+        <if test="model == 3 and taskCode !=null">
+            and t.task_code = #{taskCode}
+        </if>
+        group by t.state
+    </select>
     <select id="queryByInstanceIdAndName" resultType="org.apache.dolphinscheduler.dao.entity.TaskInstance">
         select
         <include refid="baseSql"/>