You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dolphinscheduler.apache.org by we...@apache.org on 2021/07/19 08:02:12 UTC

[dolphinscheduler] branch json_split_two updated: [Fix-5518]: The data analysis state count interface, projectId change to projectCode (#5837)

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

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


The following commit(s) were added to refs/heads/json_split_two by this push:
     new 5f5aec9  [Fix-5518]:  The data analysis state count interface, projectId change to projectCode (#5837)
5f5aec9 is described below

commit 5f5aec93c4f908cc0c8c03386e0de851c37f72af
Author: wen-hemin <39...@users.noreply.github.com>
AuthorDate: Mon Jul 19 16:02:05 2021 +0800

    [Fix-5518]:  The data analysis state count interface, projectId change to projectCode (#5837)
    
    * fix: the data analysis state count interface, projectId change to projectCode
    
    * fix: the data analysis state count interface, projectId change to projectCode
    
    * fix checkstyle
    
    * fix checkstyle
    
    * fix: the process state count page use "projectCode"
    
    * fix: English comments
    
    Co-authored-by: wen-hemin <we...@apache.com>
---
 .../api/controller/DataAnalysisController.java     |  25 ++-
 .../api/service/DataAnalysisService.java           |   8 +-
 .../api/service/impl/DataAnalysisServiceImpl.java  |  26 +--
 .../api/controller/DataAnalysisControllerTest.java |  42 ++++-
 .../api/service/DataAnalysisServiceTest.java       | 178 ++++++++++++---------
 .../service/process/ProcessService.java            |  15 --
 .../pages/index/_source/processStateCount.vue      |   6 +-
 .../pages/index/_source/taskStatusCount.vue        |   4 +-
 .../conf/home/pages/projects/pages/index/index.vue |   4 +-
 9 files changed, 172 insertions(+), 136 deletions(-)

diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/DataAnalysisController.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/DataAnalysisController.java
index e7b0dd6..076f9c0 100644
--- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/DataAnalysisController.java
+++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/DataAnalysisController.java
@@ -64,14 +64,14 @@ public class DataAnalysisController extends BaseController {
      * @param loginUser login user
      * @param startDate count start date
      * @param endDate   count end date
-     * @param projectId project id
+     * @param projectCode project code
      * @return task instance count data
      */
     @ApiOperation(value = "countTaskState", notes = "COUNT_TASK_STATE_NOTES")
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "startDate", value = "START_DATE", dataType = "String"),
-            @ApiImplicitParam(name = "endDate", value = "END_DATE", dataType = "String"),
-            @ApiImplicitParam(name = "projectId", value = "PROJECT_ID", dataType = "Int", example = "100")
+        @ApiImplicitParam(name = "startDate", value = "START_DATE", dataType = "String"),
+        @ApiImplicitParam(name = "endDate", value = "END_DATE", dataType = "String"),
+        @ApiImplicitParam(name = "projectCode", value = "PROJECT_CODE", dataType = "Long", example = "100")
     })
     @GetMapping(value = "/task-state-count")
     @ResponseStatus(HttpStatus.OK)
@@ -80,9 +80,9 @@ public class DataAnalysisController extends BaseController {
     public Result countTaskState(@ApiIgnore @RequestAttribute(value = Constants.SESSION_USER) User loginUser,
                                  @RequestParam(value = "startDate", required = false) String startDate,
                                  @RequestParam(value = "endDate", required = false) String endDate,
-                                 @RequestParam(value = "projectId", required = false, defaultValue = "0") int projectId) {
+                                 @RequestParam(value = "projectCode", required = false, defaultValue = "0") long projectCode) {
 
-        Map<String, Object> result = dataAnalysisService.countTaskStateByProject(loginUser, projectId, startDate, endDate);
+        Map<String, Object> result = dataAnalysisService.countTaskStateByProject(loginUser, projectCode, startDate, endDate);
         return returnDataList(result);
     }
 
@@ -92,14 +92,14 @@ public class DataAnalysisController extends BaseController {
      * @param loginUser login user
      * @param startDate start date
      * @param endDate   end date
-     * @param projectId project id
+     * @param projectCode project code
      * @return process instance data
      */
     @ApiOperation(value = "countProcessInstanceState", notes = "COUNT_PROCESS_INSTANCE_NOTES")
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "startDate", value = "START_DATE", dataType = "String"),
-            @ApiImplicitParam(name = "endDate", value = "END_DATE", dataType = "String"),
-            @ApiImplicitParam(name = "projectId", value = "PROJECT_ID", dataType = "Int", example = "100")
+        @ApiImplicitParam(name = "startDate", value = "START_DATE", dataType = "String"),
+        @ApiImplicitParam(name = "endDate", value = "END_DATE", dataType = "String"),
+        @ApiImplicitParam(name = "projectCode", value = "PROJECT_CODE", dataType = "Long", example = "100")
     })
     @GetMapping(value = "/process-state-count")
     @ResponseStatus(HttpStatus.OK)
@@ -108,9 +108,9 @@ public class DataAnalysisController extends BaseController {
     public Result countProcessInstanceState(@ApiIgnore @RequestAttribute(value = Constants.SESSION_USER) User loginUser,
                                             @RequestParam(value = "startDate", required = false) String startDate,
                                             @RequestParam(value = "endDate", required = false) String endDate,
-                                            @RequestParam(value = "projectId", required = false, defaultValue = "0") int projectId) {
+                                            @RequestParam(value = "projectCode", required = false, defaultValue = "0") long projectCode) {
 
-        Map<String, Object> result = dataAnalysisService.countProcessInstanceStateByProject(loginUser, projectId, startDate, endDate);
+        Map<String, Object> result = dataAnalysisService.countProcessInstanceStateByProject(loginUser, projectCode, startDate, endDate);
         return returnDataList(result);
     }
 
@@ -187,5 +187,4 @@ public class DataAnalysisController extends BaseController {
         return returnDataList(result);
     }
 
-
 }
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 b8b6be5..f189358 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
@@ -30,23 +30,23 @@ public interface DataAnalysisService {
      * statistical task instance status data
      *
      * @param loginUser login user
-     * @param projectId project id
+     * @param projectCode project code
      * @param startDate start date
      * @param endDate end date
      * @return task state count data
      */
-    Map<String, Object> countTaskStateByProject(User loginUser, int projectId, String startDate, String endDate);
+    Map<String, Object> countTaskStateByProject(User loginUser, long projectCode, String startDate, String endDate);
 
     /**
      * statistical process instance status data
      *
      * @param loginUser login user
-     * @param projectId project id
+     * @param projectCode project code
      * @param startDate start date
      * @param endDate end date
      * @return process instance state count data
      */
-    Map<String, Object> countProcessInstanceStateByProject(User loginUser, int projectId, String startDate, String endDate);
+    Map<String, Object> countProcessInstanceStateByProject(User loginUser, long projectCode, String startDate, String endDate);
 
     /**
      * statistics the process definition quantities of certain person
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 a867dea..25bc3f8 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
@@ -90,17 +90,17 @@ public class DataAnalysisServiceImpl extends BaseServiceImpl implements DataAnal
      * statistical task instance status data
      *
      * @param loginUser login user
-     * @param projectId project id
+     * @param projectCode project code
      * @param startDate start date
      * @param endDate end date
      * @return task state count data
      */
     @Override
-    public Map<String, Object> countTaskStateByProject(User loginUser, int projectId, String startDate, String endDate) {
+    public Map<String, Object> countTaskStateByProject(User loginUser, long projectCode, String startDate, String endDate) {
 
         return countStateByProject(
                 loginUser,
-                projectId,
+                projectCode,
                 startDate,
                 endDate,
             (start, end, projectCodes) -> this.taskInstanceMapper.countTaskInstanceStateByUser(start, end, projectCodes));
@@ -110,16 +110,16 @@ public class DataAnalysisServiceImpl extends BaseServiceImpl implements DataAnal
      * statistical process instance status data
      *
      * @param loginUser login user
-     * @param projectId project id
+     * @param projectCode project code
      * @param startDate start date
      * @param endDate end date
      * @return process instance state count data
      */
     @Override
-    public Map<String, Object> countProcessInstanceStateByProject(User loginUser, int projectId, String startDate, String endDate) {
+    public Map<String, Object> countProcessInstanceStateByProject(User loginUser, long projectCode, String startDate, String endDate) {
         Map<String, Object> result =  this.countStateByProject(
                 loginUser,
-                projectId,
+                projectCode,
                 startDate,
                 endDate,
             (start, end, projectCodes) -> this.processInstanceMapper.countInstanceStateByUser(start, end, projectCodes));
@@ -130,11 +130,11 @@ public class DataAnalysisServiceImpl extends BaseServiceImpl implements DataAnal
         return result;
     }
 
-    private Map<String, Object> countStateByProject(User loginUser, int projectId, String startDate, String endDate
+    private Map<String, Object> countStateByProject(User loginUser, long projectCode, String startDate, String endDate
             , TriFunction<Date, Date, Long[], List<ExecuteStatusCount>> instanceStateCounter) {
-        Map<String, Object> result = new HashMap<>();
-        boolean checkProject = checkProject(loginUser, projectId, result);
-        if (!checkProject) {
+        Project project = projectMapper.queryByCode(projectCode);
+        Map<String, Object> result = projectService.checkProjectAndAuth(loginUser, project, project.getName());
+        if (result.get(Constants.STATUS) != Status.SUCCESS) {
             return result;
         }
 
@@ -149,8 +149,8 @@ public class DataAnalysisServiceImpl extends BaseServiceImpl implements DataAnal
             }
         }
 
-        Long[] projectCodeArray = projectId == 0 ? getProjectCodesArrays(loginUser)
-                : new Long[] { projectMapper.selectById(projectId).getCode() };
+        Long[] projectCodeArray = projectCode == 0 ? getProjectCodesArrays(loginUser)
+                : new Long[] { projectCode };
         List<ExecuteStatusCount> processInstanceStateCounts =
                 instanceStateCounter.apply(start, end, projectCodeArray);
 
@@ -280,7 +280,7 @@ public class DataAnalysisServiceImpl extends BaseServiceImpl implements DataAnal
             return result;
         }
 
-        //TODO need to add detail data info 
+        //TODO need to add detail data info
         Map<String, Integer> dataMap = new HashMap<>();
         dataMap.put("taskQueue", 0);
         dataMap.put("taskKill", 0);
diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/DataAnalysisControllerTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/DataAnalysisControllerTest.java
index 897a5a6..0818753 100644
--- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/DataAnalysisControllerTest.java
+++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/DataAnalysisControllerTest.java
@@ -24,11 +24,16 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
 import org.apache.dolphinscheduler.api.enums.Status;
 import org.apache.dolphinscheduler.api.utils.Result;
 import org.apache.dolphinscheduler.common.utils.JSONUtils;
+import org.apache.dolphinscheduler.dao.entity.Project;
+import org.apache.dolphinscheduler.dao.mapper.ProjectMapper;
 
 import org.junit.Assert;
 import org.junit.Test;
+import org.mockito.Mockito;
+import org.powermock.api.mockito.PowerMockito;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.boot.test.mock.mockito.MockBean;
 import org.springframework.http.MediaType;
 import org.springframework.test.web.servlet.MvcResult;
 import org.springframework.util.LinkedMultiValueMap;
@@ -37,17 +42,21 @@ import org.springframework.util.MultiValueMap;
 /**
  * data analysis controller test
  */
-public class DataAnalysisControllerTest extends AbstractControllerTest{
+public class DataAnalysisControllerTest extends AbstractControllerTest {
 
     private static Logger logger = LoggerFactory.getLogger(DataAnalysisControllerTest.class);
 
+    @MockBean
+    ProjectMapper projectMapper;
+
     @Test
     public void testCountTaskState() throws Exception {
+        PowerMockito.when(projectMapper.queryByCode(Mockito.any())).thenReturn(getProject("test"));
 
         MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>();
         paramsMap.add("startDate","2019-12-01 00:00:00");
         paramsMap.add("endDate","2019-12-28 00:00:00");
-        paramsMap.add("projectId","16");
+        paramsMap.add("projectCode","16");
 
         MvcResult mvcResult = mockMvc.perform(get("/projects/analysis/task-state-count")
                 .header("sessionId", sessionId)
@@ -56,17 +65,19 @@ public class DataAnalysisControllerTest extends AbstractControllerTest{
                 .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
                 .andReturn();
         Result result = JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), Result.class);
-        Assert.assertEquals(Status.SUCCESS.getCode(),result.getCode().intValue());
+        Assert.assertEquals(
+                Status.SUCCESS.getCode(),result.getCode().intValue());
         logger.info(mvcResult.getResponse().getContentAsString());
     }
 
     @Test
     public void testCountProcessInstanceState() throws Exception {
+        PowerMockito.when(projectMapper.queryByCode(Mockito.any())).thenReturn(getProject("test"));
 
         MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>();
         paramsMap.add("startDate","2019-12-01 00:00:00");
         paramsMap.add("endDate","2019-12-28 00:00:00");
-        paramsMap.add("projectId","16");
+        paramsMap.add("projectCode","16");
 
         MvcResult mvcResult = mockMvc.perform(get("/projects/analysis/process-state-count")
                 .header("sessionId", sessionId)
@@ -81,6 +92,7 @@ public class DataAnalysisControllerTest extends AbstractControllerTest{
 
     @Test
     public void testCountDefinitionByUser() throws Exception {
+        PowerMockito.when(projectMapper.selectById(Mockito.any())).thenReturn(getProject("test"));
 
         MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>();
         paramsMap.add("projectId","16");
@@ -98,9 +110,11 @@ public class DataAnalysisControllerTest extends AbstractControllerTest{
 
     @Test
     public void testCountCommandState() throws Exception {
+        PowerMockito.when(projectMapper.selectById(Mockito.any())).thenReturn(getProject("test"));
+
         MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>();
-        paramsMap.add("startDate","2019-12-01");
-        paramsMap.add("endDate","2019-12-15");
+        paramsMap.add("startDate","2019-12-01 00:00:00");
+        paramsMap.add("endDate","2019-12-15 23:59:59");
         paramsMap.add("projectId","16");
         MvcResult mvcResult = mockMvc.perform(get("/projects/analysis/command-state-count")
                 .header("sessionId", sessionId)
@@ -116,6 +130,7 @@ public class DataAnalysisControllerTest extends AbstractControllerTest{
 
     @Test
     public void testCountQueueState() throws Exception {
+        PowerMockito.when(projectMapper.selectById(Mockito.any())).thenReturn(getProject("test"));
 
         MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>();
         paramsMap.add("projectId","16");
@@ -129,4 +144,19 @@ public class DataAnalysisControllerTest extends AbstractControllerTest{
         Assert.assertEquals(Status.SUCCESS.getCode(),result.getCode().intValue());
         logger.info(mvcResult.getResponse().getContentAsString());
     }
+
+    /**
+     * get mock Project
+     *
+     * @param projectName projectName
+     * @return Project
+     */
+    private Project getProject(String projectName) {
+        Project project = new Project();
+        project.setCode(11L);
+        project.setId(1);
+        project.setName(projectName);
+        project.setUserId(1);
+        return project;
+    }
 }
diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/DataAnalysisServiceTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/DataAnalysisServiceTest.java
index bb893ba..d838b15 100644
--- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/DataAnalysisServiceTest.java
+++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/DataAnalysisServiceTest.java
@@ -22,16 +22,15 @@ import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
 
 import org.apache.dolphinscheduler.api.dto.CommandStateCount;
-import org.apache.dolphinscheduler.api.dto.TaskStateCount;
 import org.apache.dolphinscheduler.api.enums.Status;
 import org.apache.dolphinscheduler.api.service.impl.DataAnalysisServiceImpl;
-import org.apache.dolphinscheduler.api.service.impl.ProjectServiceImpl;
 import org.apache.dolphinscheduler.common.Constants;
 import org.apache.dolphinscheduler.common.enums.CommandType;
 import org.apache.dolphinscheduler.common.enums.ExecutionStatus;
 import org.apache.dolphinscheduler.common.enums.UserType;
 import org.apache.dolphinscheduler.common.utils.DateUtils;
 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.User;
@@ -43,6 +42,7 @@ import org.apache.dolphinscheduler.dao.mapper.ProjectMapper;
 import org.apache.dolphinscheduler.dao.mapper.TaskInstanceMapper;
 import org.apache.dolphinscheduler.service.process.ProcessService;
 
+import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -57,6 +57,7 @@ import org.junit.runner.RunWith;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Mockito;
+import org.powermock.api.mockito.PowerMockito;
 import org.powermock.modules.junit4.PowerMockRunner;
 
 /**
@@ -66,13 +67,13 @@ import org.powermock.modules.junit4.PowerMockRunner;
 public class DataAnalysisServiceTest {
 
     @InjectMocks
-    private DataAnalysisServiceImpl dataAnalysisService;
+    private DataAnalysisServiceImpl dataAnalysisServiceImpl;
 
     @Mock
     ProjectMapper projectMapper;
 
     @Mock
-    ProjectServiceImpl projectService;
+    ProjectService projectService;
 
     @Mock
     ProcessInstanceMapper processInstanceMapper;
@@ -102,134 +103,144 @@ public class DataAnalysisServiceTest {
         user = new User();
         Project project = new Project();
         project.setId(1);
+        project.setName("test");
         resultMap = new HashMap<>();
         Mockito.when(projectMapper.selectById(1)).thenReturn(project);
         Mockito.when(projectService.hasProjectAndPerm(user, project, resultMap)).thenReturn(true);
 
+        Mockito.when(projectMapper.queryByCode(1L)).thenReturn(project);
     }
 
-
     @After
     public void after() {
-
         user = null;
         projectMapper = null;
         resultMap = null;
     }
 
     @Test
-    public void testCountTaskStateByProject() {
-
+    public void testCountTaskStateByProject_success() {
         String startDate = "2020-02-11 16:02:18";
         String endDate = "2020-02-11 16:03:18";
 
-        //checkProject false
-        Map<String, Object> result = dataAnalysisService.countTaskStateByProject(user, 2, startDate, endDate);
-        Assert.assertTrue(result.isEmpty());
-
+        Map<String, Object> result = new HashMap<>();
+        putMsg(result, Status.SUCCESS, null);
+        Mockito.when(projectService.checkProjectAndAuth(any(), any(), any())).thenReturn(result);
+        Mockito.when(projectMapper.queryByCode(Mockito.any())).thenReturn(getProject("test"));
 
-        //SUCCESS
+        // SUCCESS
         Mockito.when(taskInstanceMapper.countTaskInstanceStateByUser(DateUtils.getScheduleDate(startDate),
-                DateUtils.getScheduleDate(endDate), new Long[]{1L})).thenReturn(getTaskInstanceStateCounts());
-        Mockito.when(projectMapper.selectById(Mockito.any())).thenReturn(getProject("test"));
-        Mockito.when(projectService.hasProjectAndPerm(Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(true);
-
-        result = dataAnalysisService.countTaskStateByProject(user, 1, startDate, endDate);
+                DateUtils.getScheduleDate(endDate), new Long[] {1L})).thenReturn(getTaskInstanceStateCounts());
+        Mockito.when(projectMapper.queryByCode(Mockito.any())).thenReturn(getProject("test"));
+        result = dataAnalysisServiceImpl.countTaskStateByProject(user, 1, startDate, endDate);
         Assert.assertEquals(Status.SUCCESS, result.get(Constants.STATUS));
+    }
+
+    @Test
+    public void testCountTaskStateByProject_projectNotFound() {
+        String startDate = "2020-02-11 16:02:18";
+        String endDate = "2020-02-11 16:03:18";
+
+        // checkProject false
+        Map<String, Object> failResult = new HashMap<>();
+        putMsg(failResult, Status.PROJECT_NOT_FOUNT, 1);
+        Mockito.when(projectService.checkProjectAndAuth(any(), any(), any())).thenReturn(failResult);
+        failResult = dataAnalysisServiceImpl.countTaskStateByProject(user, 1, startDate, endDate);
+        Assert.assertEquals(Status.PROJECT_NOT_FOUNT, failResult.get(Constants.STATUS));
+    }
+
+    @Test
+    public void testCountTaskStateByProject_paramValid() {
+        Map<String, Object> result = new HashMap<>();
+        putMsg(result, Status.SUCCESS, null);
+        Mockito.when(projectService.checkProjectAndAuth(any(), any(), any())).thenReturn(result);
+        Mockito.when(projectMapper.queryByCode(Mockito.any())).thenReturn(getProject("test"));
 
         // when date in illegal format then return error message
         String startDate2 = "illegalDateString";
         String endDate2 = "illegalDateString";
-        result = dataAnalysisService.countTaskStateByProject(user, 0, startDate2, endDate2);
+        result = dataAnalysisServiceImpl.countTaskStateByProject(user, 1, startDate2, endDate2);
         Assert.assertEquals(Status.REQUEST_PARAMS_NOT_VALID_ERROR, result.get(Constants.STATUS));
 
         // when one of date in illegal format then return error message
         String startDate3 = "2020-08-28 14:13:40";
         String endDate3 = "illegalDateString";
-        result = dataAnalysisService.countTaskStateByProject(user, 0, startDate3, endDate3);
+        result = dataAnalysisServiceImpl.countTaskStateByProject(user, 1, startDate3, endDate3);
         Assert.assertEquals(Status.REQUEST_PARAMS_NOT_VALID_ERROR, result.get(Constants.STATUS));
 
         // when one of date in illegal format then return error message
         String startDate4 = "illegalDateString";
         String endDate4 = "2020-08-28 14:13:40";
-        result = dataAnalysisService.countTaskStateByProject(user, 0, startDate4, endDate4);
+        result = dataAnalysisServiceImpl.countTaskStateByProject(user, 1, startDate4, endDate4);
         Assert.assertEquals(Status.REQUEST_PARAMS_NOT_VALID_ERROR, result.get(Constants.STATUS));
+    }
 
-        // when counting general user's task status then return user's task status count
-        user.setUserType(UserType.GENERAL_USER);
-        Mockito.when(processService.getProjectIdListHavePerm(anyInt()))
-                .thenReturn(Collections.singletonList(123L));
-        ExecuteStatusCount executeStatusCount = new ExecuteStatusCount();
-        executeStatusCount.setExecutionStatus(ExecutionStatus.RUNNING_EXECUTION);
-        executeStatusCount.setCount(10);
-        Mockito.when(taskInstanceMapper.countTaskInstanceStateByUser(any(), any(), any()))
-                .thenReturn(Collections.singletonList(executeStatusCount));
-        result = dataAnalysisService.countTaskStateByProject(user, 0, startDate, null);
-        assertThat(result.get(Constants.DATA_LIST)).extracting("taskCountDtos").first().asList()
-                .hasSameSizeAs(ExecutionStatus.values());
-        assertThat(result.get(Constants.DATA_LIST)).extracting("totalCount").first().isEqualTo(10);
-        TaskStateCount taskStateCount = new TaskStateCount(ExecutionStatus.RUNNING_EXECUTION, 10);
-        assertThat(result.get(Constants.DATA_LIST)).extracting("taskCountDtos").first().asList().containsOnlyOnce(taskStateCount);
+    @Test
+    public void testCountTaskStateByProject_allCountZero() {
+        Map<String, Object> result = new HashMap<>();
+        putMsg(result, Status.SUCCESS, null);
+        Mockito.when(projectService.checkProjectAndAuth(any(), any(), any())).thenReturn(result);
+        Mockito.when(projectMapper.queryByCode(Mockito.any())).thenReturn(getProject("test"));
 
         // when general user doesn't have any task then return all count are 0
         user.setUserType(UserType.GENERAL_USER);
-        Mockito.when(processService.getProjectIdListHavePerm(anyInt()))
-                .thenReturn(new ArrayList<>());
-        Mockito.when(taskInstanceMapper.countTaskInstanceStateByUser(any(), any(), any()))
-                .thenReturn(Collections.emptyList());
-        result = dataAnalysisService.countTaskStateByProject(user, 0, null, null);
+        Mockito.when(taskInstanceMapper.countTaskInstanceStateByUser(any(), any(), any())).thenReturn(
+                Collections.emptyList());
+        result = dataAnalysisServiceImpl.countTaskStateByProject(user, 1, null, null);
         assertThat(result.get(Constants.DATA_LIST)).extracting("totalCount").first().isEqualTo(0);
-        assertThat(result.get(Constants.DATA_LIST)).extracting("taskCountDtos").first().asList()
-                .hasSameSizeAs(ExecutionStatus.values());
-        assertThat(result.get(Constants.DATA_LIST)).extracting("taskCountDtos").first().asList()
-                .extracting("count").allMatch(count -> count.equals(0));
+        assertThat(result.get(Constants.DATA_LIST)).extracting("taskCountDtos").first().asList().hasSameSizeAs(
+                ExecutionStatus.values());
+        assertThat(result.get(Constants.DATA_LIST)).extracting("taskCountDtos").first().asList().extracting(
+                "count").allMatch(count -> count.equals(0));
+    }
 
-        // when general user doesn't have any task then return all count are 0
-        user.setUserType(UserType.GENERAL_USER);
-        Mockito.when(processService.getProjectIdListHavePerm(anyInt()))
-                .thenReturn(new ArrayList<>());
-        Mockito.when(taskInstanceMapper.countTaskInstanceStateByUser(any(), any(), any()))
-                .thenReturn(Collections.emptyList());
-        result = dataAnalysisService.countTaskStateByProject(user, 0, null, null);
-        assertThat(result.get(Constants.DATA_LIST)).extracting("totalCount").first().isEqualTo(0);
-        assertThat(result.get(Constants.DATA_LIST)).extracting("taskCountDtos").first().asList()
-                .hasSameSizeAs(ExecutionStatus.values());
-        assertThat(result.get(Constants.DATA_LIST)).extracting("taskCountDtos").first().asList()
-                .extracting("count").allMatch(count -> count.equals(0));
+    @Test
+    public void testCountTaskStateByProject_noData() {
+        Map<String, Object> result = new HashMap<>();
+        putMsg(result, Status.SUCCESS, null);
+        Mockito.when(projectService.checkProjectAndAuth(any(), any(), any())).thenReturn(result);
+        Mockito.when(projectMapper.queryByCode(Mockito.any())).thenReturn(getProject("test"));
 
         // when instanceStateCounter return null, then return nothing
         user.setUserType(UserType.GENERAL_USER);
-        Mockito.when(processService.getProjectIdListHavePerm(anyInt()))
-                .thenReturn(new ArrayList<>());
-        Mockito.when(taskInstanceMapper.countTaskInstanceStateByUser(any(), any(), any()))
-                .thenReturn(null);
-        result = dataAnalysisService.countTaskStateByProject(user, 0, null, null);
-        assertThat(result).isEmpty();
+        PowerMockito.when(taskInstanceMapper.countTaskInstanceStateByUser(any(), any(), any())).thenReturn(null);
+        result = dataAnalysisServiceImpl.countTaskStateByProject(user, 1, null, null);
+        Assert.assertNull(result.get(Constants.DATA_LIST));
     }
 
     @Test
     public void testCountProcessInstanceStateByProject() {
-
         String startDate = "2020-02-11 16:02:18";
         String endDate = "2020-02-11 16:03:18";
+
+        Mockito.when(projectMapper.queryByCode(Mockito.any())).thenReturn(getProject("test"));
+
         //checkProject false
-        Map<String, Object> result = dataAnalysisService.countProcessInstanceStateByProject(user, 2, startDate, endDate);
-        Assert.assertTrue(result.isEmpty());
+        Map<String, Object> failResult = new HashMap<>();
+        putMsg(failResult, Status.PROJECT_NOT_FOUNT, 1);
+        Mockito.when(projectService.checkProjectAndAuth(any(), any(), any())).thenReturn(failResult);
+        failResult = dataAnalysisServiceImpl.countProcessInstanceStateByProject(user, 2, startDate, endDate);
+        Assert.assertEquals(Status.PROJECT_NOT_FOUNT, failResult.get(Constants.STATUS));
+
+        Map<String, Object> result = new HashMap<>();
+        putMsg(result, Status.SUCCESS, null);
+        Mockito.when(projectService.checkProjectAndAuth(any(), any(), any())).thenReturn(result);
 
         //SUCCESS
-        Mockito.when(projectMapper.selectById(Mockito.any())).thenReturn(getProject("test"));
         Mockito.when(processInstanceMapper.countInstanceStateByUser(DateUtils.getScheduleDate(startDate),
                 DateUtils.getScheduleDate(endDate), new Long[]{1L})).thenReturn(getTaskInstanceStateCounts());
         Mockito.when(projectService.hasProjectAndPerm(Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(true);
 
-        result = dataAnalysisService.countProcessInstanceStateByProject(user, 1, startDate, endDate);
+        result = dataAnalysisServiceImpl.countProcessInstanceStateByProject(user, 1, startDate, endDate);
         Assert.assertEquals(Status.SUCCESS, result.get(Constants.STATUS));
     }
 
     @Test
     public void testCountDefinitionByUser() {
         Mockito.when(projectMapper.selectById(Mockito.any())).thenReturn(getProject("test"));
-        Map<String, Object> result = dataAnalysisService.countDefinitionByUser(user, 0);
+        Mockito.when(processDefinitionMapper.countDefinitionGroupByUser(Mockito.anyInt(), Mockito.any(Long[].class),
+            Mockito.anyBoolean())).thenReturn(new ArrayList<DefinitionGroupByUser>());
+        Map<String, Object> result = dataAnalysisServiceImpl.countDefinitionByUser(user, 0);
         Assert.assertEquals(Status.SUCCESS, result.get(Constants.STATUS));
     }
 
@@ -239,7 +250,7 @@ public class DataAnalysisServiceTest {
         String startDate = "2020-02-11 16:02:18";
         String endDate = "2020-02-11 16:03:18";
         //checkProject false
-        Map<String, Object> result = dataAnalysisService.countCommandState(user, 2, startDate, endDate);
+        Map<String, Object> result = dataAnalysisServiceImpl.countCommandState(user, 2, startDate, endDate);
         Assert.assertTrue(result.isEmpty());
         List<CommandCount> commandCounts = new ArrayList<>(1);
         CommandCount commandCount = new CommandCount();
@@ -253,31 +264,31 @@ public class DataAnalysisServiceTest {
         Mockito.when(projectMapper.selectById(Mockito.any())).thenReturn(getProject("test"));
         Mockito.when(projectService.hasProjectAndPerm(Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(true);
 
-        result = dataAnalysisService.countCommandState(user, 1, startDate, endDate);
+        result = dataAnalysisServiceImpl.countCommandState(user, 1, startDate, endDate);
         Assert.assertEquals(Status.SUCCESS, result.get(Constants.STATUS));
 
         // when all date in illegal format then return error message
         String startDate2 = "illegalDateString";
         String endDate2 = "illegalDateString";
-        Map<String, Object> result2 = dataAnalysisService.countCommandState(user, 0, startDate2, endDate2);
+        Map<String, Object> result2 = dataAnalysisServiceImpl.countCommandState(user, 0, startDate2, endDate2);
         Assert.assertEquals(Status.REQUEST_PARAMS_NOT_VALID_ERROR, result2.get(Constants.STATUS));
 
         // when one of date in illegal format then return error message
         String startDate3 = "2020-08-22 09:23:10";
         String endDate3 = "illegalDateString";
-        Map<String, Object> result3 = dataAnalysisService.countCommandState(user, 0, startDate3, endDate3);
+        Map<String, Object> result3 = dataAnalysisServiceImpl.countCommandState(user, 0, startDate3, endDate3);
         Assert.assertEquals(Status.REQUEST_PARAMS_NOT_VALID_ERROR, result3.get(Constants.STATUS));
 
         // when one of date in illegal format then return error message
         String startDate4 = "illegalDateString";
         String endDate4 = "2020-08-22 09:23:10";
-        Map<String, Object> result4 = dataAnalysisService.countCommandState(user, 0, startDate4, endDate4);
+        Map<String, Object> result4 = dataAnalysisServiceImpl.countCommandState(user, 0, startDate4, endDate4);
         Assert.assertEquals(Status.REQUEST_PARAMS_NOT_VALID_ERROR, result4.get(Constants.STATUS));
 
         // when no command found then return all count are 0
         Mockito.when(commandMapper.countCommandState(anyInt(), any(), any(), any())).thenReturn(Collections.emptyList());
         Mockito.when(errorCommandMapper.countCommandState(any(), any(), any())).thenReturn(Collections.emptyList());
-        Map<String, Object> result5 = dataAnalysisService.countCommandState(user, 0, startDate, null);
+        Map<String, Object> result5 = dataAnalysisServiceImpl.countCommandState(user, 0, startDate, null);
         assertThat(result5).containsEntry(Constants.STATUS, Status.SUCCESS);
         assertThat(result5.get(Constants.DATA_LIST)).asList().extracting("errorCount").allMatch(count -> count.equals(0));
         assertThat(result5.get(Constants.DATA_LIST)).asList().extracting("normalCount").allMatch(count -> count.equals(0));
@@ -292,7 +303,7 @@ public class DataAnalysisServiceTest {
         Mockito.when(commandMapper.countCommandState(anyInt(), any(), any(), any())).thenReturn(Collections.singletonList(normalCommandCount));
         Mockito.when(errorCommandMapper.countCommandState(any(), any(), any())).thenReturn(Collections.singletonList(errorCommandCount));
 
-        Map<String, Object> result6 = dataAnalysisService.countCommandState(user, 0, null, null);
+        Map<String, Object> result6 = dataAnalysisServiceImpl.countCommandState(user, 0, null, null);
 
         assertThat(result6).containsEntry(Constants.STATUS, Status.SUCCESS);
         CommandStateCount commandStateCount = new CommandStateCount();
@@ -305,11 +316,11 @@ public class DataAnalysisServiceTest {
     @Test
     public void testCountQueueState() {
         // when project check fail then return nothing
-        Map<String, Object> result1 = dataAnalysisService.countQueueState(user, 2);
+        Map<String, Object> result1 = dataAnalysisServiceImpl.countQueueState(user, 2);
         Assert.assertTrue(result1.isEmpty());
 
         // when project check success when return all count are 0
-        Map<String, Object> result2 = dataAnalysisService.countQueueState(user, 1);
+        Map<String, Object> result2 = dataAnalysisServiceImpl.countQueueState(user, 1);
         assertThat(result2.get(Constants.DATA_LIST)).extracting("taskQueue", "taskKill")
                 .isNotEmpty()
                 .allMatch(count -> count.equals(0));
@@ -342,4 +353,13 @@ public class DataAnalysisServiceTest {
         project.setUserId(1);
         return project;
     }
-}
\ No newline at end of file
+
+    private void putMsg(Map<String, Object> result, Status status, Object... statusParams) {
+        result.put(Constants.STATUS, status);
+        if (statusParams != null && statusParams.length > 0) {
+            result.put(Constants.MSG, MessageFormat.format(status.getMsg(), statusParams));
+        } else {
+            result.put(Constants.MSG, status.getMsg());
+        }
+    }
+}
diff --git a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java
index de6aa44..9b2dadb 100644
--- a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java
+++ b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java
@@ -1994,21 +1994,6 @@ public class ProcessService {
     }
 
     /**
-     * get have perm project ids
-     *
-     * @param userId userId
-     * @return project codes
-     */
-    public List<Long> getProjectIdListHavePerm(int userId) {
-
-        List<Long> projectCodeList = new ArrayList<>();
-        for (Project project : getProjectListHavePerm(userId)) {
-            projectCodeList.add(project.getCode());
-        }
-        return projectCodeList;
-    }
-
-    /**
      * list unauthorized udf function
      *
      * @param userId user id
diff --git a/dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/index/_source/processStateCount.vue b/dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/index/_source/processStateCount.vue
index 277d799..b6fedbd 100644
--- a/dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/index/_source/processStateCount.vue
+++ b/dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/index/_source/processStateCount.vue
@@ -33,7 +33,7 @@
                 <td><span>{{$index+1}}</span></td>
                 <td>
                   <a v-if="currentName === 'home'" style="cursor: default">{{item.value}}</a>
-                  <span v-else><a href="javascript:" @click="searchParams.projectId && _goProcess(item.key)">{{item.value}}</a></span>
+                  <span v-else><a href="javascript:" @click="searchParams.projectCode && _goProcess(item.key)">{{item.value}}</a></span>
                 </td>
                 <td><span class="ellipsis" style="width: 98%;" :title="item.key">{{item.key}}</span></td>
               </tr>
@@ -90,8 +90,8 @@
         })
         const myChart = Chart.pie('#process-state-pie', this.processStateList, { title: '' })
         myChart.echart.setOption(pie)
-        // 首页不允许跳转
-        if (this.searchParams.projectId) {
+        // Jump not allowed on home page
+        if (this.searchParams.projectCode) {
           myChart.echart.on('click', e => {
             this._goProcess(e.data.name)
           })
diff --git a/dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/index/_source/taskStatusCount.vue b/dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/index/_source/taskStatusCount.vue
index 9ebfcc6..d83c0c2 100644
--- a/dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/index/_source/taskStatusCount.vue
+++ b/dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/index/_source/taskStatusCount.vue
@@ -33,7 +33,7 @@
                 <td><span>{{$index+1}}</span></td>
                 <td>
                   <span>
-                    <a href="javascript:" @click="searchParams.projectId && _goTask(item.key)" :class="searchParams.projectId ?'links':''">{{item.value}}</a>
+                    <a href="javascript:" @click="searchParams.projectCode && _goTask(item.key)" :class="searchParams.projectCode ?'links':''">{{item.value}}</a>
                   </span>
                 </td>
                 <td><span class="ellipsis" style="width: 98%;" :title="item.key">{{item.key}}</span></td>
@@ -94,7 +94,7 @@
         myChart.echart.setOption(pie)
 
         // Jump forbidden in index page
-        if (this.searchParams.projectId) {
+        if (this.searchParams.projectCode) {
           myChart.echart.on('click', e => {
             this._goTask(e.data.name)
           })
diff --git a/dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/index/index.vue b/dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/index/index.vue
index 322f98a..5175ba5 100644
--- a/dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/index/index.vue
+++ b/dolphinscheduler-ui/src/js/conf/home/pages/projects/pages/index/index.vue
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 <template>
-  <m-list-construction :title="searchParams.projectId ? `${$t('Project Home')} - ${projectName}` : $t('Home')">
+  <m-list-construction :title="searchParams.projectCode ? `${$t('Project Home')} - ${projectName}` : $t('Home')">
     <template slot="content">
       <div class="perject-home-content">
         <div class="time-model">
@@ -80,6 +80,7 @@
       return {
         searchParams: {
           projectId: null,
+          projectCode: null,
           startDate: '',
           endDate: ''
         },
@@ -97,6 +98,7 @@
     },
     created () {
       this.searchParams.projectId = this.id === 0 ? 0 : localStore.getItem('projectId')
+      this.searchParams.projectCode = this.id === 0 ? 0 : localStore.getItem('projectCode')
       this.dataTime[0] = dayjs().format('YYYY-MM-DD 00:00:00')
       this.dataTime[1] = dayjs().format('YYYY-MM-DD HH:mm:ss')
       this.searchParams.startDate = this.dataTime[0]