From 1064680ded1341462a9feea3e1c76f8d5006152b Mon Sep 17 00:00:00 2001 From: insist777 <84278047+insist777@users.noreply.github.com> Date: Thu, 1 Dec 2022 14:21:01 +0800 Subject: [PATCH] [feat][API] New restful API for workflow state (#13031) --- .../controller/StatisticsV2Controller.java | 206 +++++++++++++ .../dto/project/StatisticsStateRequest.java | 60 ++++ .../dolphinscheduler/api/enums/Status.java | 5 + .../api/service/DataAnalysisService.java | 57 +++- .../api/service/ProjectService.java | 1 - .../service/impl/DataAnalysisServiceImpl.java | 275 +++++++++++++++++- .../api/service/impl/ProjectServiceImpl.java | 45 ++- .../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 + .../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 + .../dao/mapper/ProjectMapper.xml | 10 + .../dao/mapper/TaskInstanceMapper.xml | 57 ++++ 20 files changed, 998 insertions(+), 51 deletions(-) create mode 100644 dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/StatisticsV2Controller.java create mode 100644 dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/project/StatisticsStateRequest.java create mode 100644 dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/StatisticsV2ControllerTest.java 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 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 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 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 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 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 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 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 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 countDefinitionByUser(User loginUser, long projectCode); + /** + * statistics the workflow quantities of certain user + *

+ * 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 countDefinitionByUserV2(User loginUser, Long projectCode, Integer userId, Integer releaseState); /** * statistical command status data @@ -94,4 +107,46 @@ public interface DataAnalysisService { List 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 queryAllWorkflowCounts(User loginUser); + + /** + * query all workflow states count + * @param loginUser login user + * @param statisticsStateRequest statisticsStateRequest + * @return workflow states count + */ + Map countWorkflowStates(User loginUser, + StatisticsStateRequest statisticsStateRequest); + + /** + * query one workflow states count + * @param loginUser login user + * @param workflowCode workflowCode + * @return workflow states count + */ + Map countOneWorkflowStates(User loginUser, Long workflowCode); + + /** + * query all task states count + * @param loginUser login user + * @param statisticsStateRequest statisticsStateRequest + * @return tasks states count + */ + Map countTaskStates(User loginUser, StatisticsStateRequest statisticsStateRequest); + + /** + * query one task states count + * @param loginUser login user + * @param taskCode taskCode + * @return tasks states count + */ + Map 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 queryAllWorkflowCounts(User loginUser) { + Map result = new HashMap<>(); + int count = 0; + Set projectIds = resourcePermissionCheckService + .userOwnedResourceIdsAcquisition(AuthorizationType.PROJECTS, loginUser.getId(), logger); + if (!projectIds.isEmpty()) { + List projects = projectMapper.selectBatchIds(projectIds); + List 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 countWorkflowStates(User loginUser, + StatisticsStateRequest statisticsStateRequest) { + Map result = new HashMap<>(); + Set 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 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 countOneWorkflowStates(User loginUser, Long workflowCode) { + Map result = new HashMap<>(); + Project project = projectMapper.queryByCode(workflowCode); + boolean hasProjectAndWritePerm = projectService.hasProjectAndWritePerm(loginUser, project, result); + if (!hasProjectAndWritePerm) { + return result; + } + List 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 countTaskStates(User loginUser, StatisticsStateRequest statisticsStateRequest) { + Map result = new HashMap<>(); + Set 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> startTimeStates = Optional.ofNullable( + taskInstanceMapper.countTaskInstanceStateByProjectIdsV2(startTime, endTime, projectIds)); + List 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 recounts = this.taskInstanceMapper + .countTaskInstanceStateByProjectCodesAndStatesBySubmitTimeV2(startTime, endTime, projectCode, + workflowCode, taskCode, model, projectIds, + needRecountState); + startTimeStates.orElseGet(ArrayList::new).addAll(recounts); + List 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 countOneTaskStates(User loginUser, Long taskCode) { + Map 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 projectId = Collections.singleton(project.getId()); + Optional> startTimeStates = Optional.ofNullable( + taskInstanceMapper.countTaskInstanceStateByProjectIdsV2(null, null, projectId)); + List 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 recounts = this.taskInstanceMapper + .countTaskInstanceStateByProjectCodesAndStatesBySubmitTimeV2(null, null, projectCode, null, taskCode, + Constants.QUERY_ALL_ON_TASK, projectId, + needRecountState); + startTimeStates.orElseGet(ArrayList::new).addAll(recounts); + List 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 + *

+ * 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 countDefinitionByUserV2(User loginUser, Long projectCode, Integer userId, + Integer releaseState) { + Map 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 defineGroupByUsers = new ArrayList<>(); + Pair, Map> projectIds = getProjectIds(loginUser, result); + if (projectIds.getRight() != null) { + List 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 setOptional(Optional> startTimeStates) { + List allState = Arrays.stream(TaskExecutionStatus.values()).collect(Collectors.toList()); + if (startTimeStates.isPresent() && startTimeStates.get().size() != 0) { + List 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 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 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 result = new HashMap<>(); + StatisticsStateRequest statisticsStateRequest = new StatisticsStateRequest(); + List 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 result = new HashMap<>(); + List 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 result = new HashMap<>(); + StatisticsStateRequest statisticsStateRequest = new StatisticsStateRequest(); + List 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 result = new HashMap<>(); + + List 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 result = new HashMap<>(); + StatisticsStateRequest statisticsStateRequest = new StatisticsStateRequest(); + + List 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 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 { */ List countDefinitionByProjectCodes(@Param("projectCodes") Long[] projectCodes); + /** + * Statistics process definition group by project codes list + *

+ * 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 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 { @Param("state") Integer state, @Param("host") String host); + /** + * Statistics process instance state v2 + *

+ * 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 countInstanceStateV2( + @Param("startTime") Date startTime, + @Param("endTime") Date endTime, + @Param("projectCode") Long projectCode, + @Param("workflowCode") Long workflowCode, + @Param("model") Integer model, + @Param("projectIds") Set 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 { * @return project */ Project queryProjectByTaskInstanceId(@Param("taskInstanceId") int taskInstanceId); + + /** + * query all workflow count + * @param projectsCodes projectsCodes + * @return workflow count + */ + int queryAllWorkflowCounts(@Param("projectsCodes") List 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 { @Param("endTime") Date endTime, @Param("projectCodes") Long[] projectCodes); + /** + * Statistics task instance group by given project ids list by start time + *

+ * 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 countTaskInstanceStateByProjectIdsV2(@Param("startTime") Date startTime, + @Param("endTime") Date endTime, + @Param("projectIds") Set projectIds); + /** * Statistics task instance group by given project codes list by submit time *

@@ -90,6 +105,26 @@ public interface TaskInstanceMapper extends BaseMapper { @Param("endTime") Date endTime, @Param("projectCodes") Long[] projectCodes, @Param("states") List states); + /** + * Statistics task instance group by given project codes list by submit time + *

+ * 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 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 projectIds, + @Param("states") List states); IPage queryTaskInstanceListPaging(IPage 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 @@ group by td.user_id,tu.user_name + + 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 @@ order by update_time desc, id asc + 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} + 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 @@ group by t.state + +