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

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


The following commit(s) were added to refs/heads/dev by this push:
     new b9153fbd60 [Improvement-18224][API] Migrate WorkflowInstanceService 
Map<String,Object> returns to typed returns (#18232)
b9153fbd60 is described below

commit b9153fbd60878e7c8ac22477d55c45bfb71ed8f9
Author: Wenjun Ruan <[email protected]>
AuthorDate: Sun May 10 19:40:32 2026 +0800

    [Improvement-18224][API] Migrate WorkflowInstanceService Map<String,Object> 
returns to typed returns (#18232)
    
    Migrate 9 service methods from Map<String,Object> returns to typed returns
    or void with ServiceException, following the EnvironmentService pattern.
    
    Methods migrated:
    - queryTopNLongestRunningWorkflowInstance -> List<WorkflowInstance>
    - queryWorkflowInstanceById -> WorkflowInstance
    - queryTaskListByWorkflowInstanceId -> WorkflowInstanceTaskListDTO (new)
    - querySubWorkflowInstanceByTaskId -> Map<String,Integer> (single-key)
    - updateWorkflowInstance -> WorkflowDefinition
    - queryParentInstanceBySubId -> Map<String,Integer> (single-key)
    - viewVariables -> WorkflowInstanceVariablesDTO (new)
    - viewGantt -> GanttDto
    - queryByTriggerCode -> List<WorkflowInstance>
    
    Two new DTOs encapsulate the multi-field payloads:
    - WorkflowInstanceTaskListDTO (workflowInstanceState + taskList)
    - WorkflowInstanceVariablesDTO (globalParams + localParams)
    
    The single-field nested-id payloads (subWorkflowInstanceId,
    parentWorkflowInstance) keep their wire shape via Map<String,Integer>.
    
    Error paths uniformly throw ServiceException; the HTTP wire format is
    preserved by ApiExceptionHandler converting the exception to the same
    Result(code, msg) shape that putMsg produced.
    
    WorkflowInstanceController forwards typed values through Result.success;
    batchDeleteWorkflowInstanceByIds uses Result.errorWithArgs for the
    deleteFailed branch.
    
    WorkflowInstanceService and WorkflowInstanceController have no
    PythonGateway / cross-service callers, so the migration is fully
    contained within these files plus the two test updates.
---
 .../api/controller/WorkflowInstanceController.java | 136 ++++-----
 .../WorkflowInstanceTaskListDTO.java               |  37 +++
 .../WorkflowInstanceVariablesDTO.java              |  37 +++
 .../api/service/WorkflowInstanceService.java       |  83 +++---
 .../service/impl/WorkflowInstanceServiceImpl.java  | 323 +++++----------------
 .../controller/WorkflowInstanceControllerTest.java |  42 +--
 .../api/service/WorkflowInstanceServiceTest.java   | 245 +++++++---------
 7 files changed, 364 insertions(+), 539 deletions(-)

diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkflowInstanceController.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkflowInstanceController.java
index 09e98b2542..221acd99bd 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkflowInstanceController.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkflowInstanceController.java
@@ -22,6 +22,9 @@ import static 
org.apache.dolphinscheduler.api.enums.Status.QUERY_WORKFLOW_INSTAN
 import org.apache.dolphinscheduler.api.audit.OperatorLog;
 import org.apache.dolphinscheduler.api.audit.enums.AuditType;
 import org.apache.dolphinscheduler.api.dto.DynamicSubWorkflowDto;
+import org.apache.dolphinscheduler.api.dto.gantt.GanttDto;
+import 
org.apache.dolphinscheduler.api.dto.workflowInstance.WorkflowInstanceTaskListDTO;
+import 
org.apache.dolphinscheduler.api.dto.workflowInstance.WorkflowInstanceVariablesDTO;
 import org.apache.dolphinscheduler.api.enums.Status;
 import org.apache.dolphinscheduler.api.exceptions.ApiException;
 import org.apache.dolphinscheduler.api.service.WorkflowInstanceService;
@@ -29,15 +32,14 @@ import org.apache.dolphinscheduler.api.utils.Result;
 import org.apache.dolphinscheduler.common.constants.Constants;
 import org.apache.dolphinscheduler.common.enums.WorkflowExecutionStatus;
 import org.apache.dolphinscheduler.dao.entity.User;
+import org.apache.dolphinscheduler.dao.entity.WorkflowDefinition;
 import org.apache.dolphinscheduler.dao.entity.WorkflowInstance;
 import org.apache.dolphinscheduler.plugin.task.api.utils.ParameterUtils;
 
 import org.apache.commons.lang3.StringUtils;
 
-import java.io.IOException;
 import java.text.MessageFormat;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -138,12 +140,12 @@ public class WorkflowInstanceController extends 
BaseController {
     @GetMapping(value = "/{id}/tasks")
     @ResponseStatus(HttpStatus.OK)
     @ApiException(Status.QUERY_TASK_LIST_BY_WORKFLOW_INSTANCE_ID_ERROR)
-    public Result queryTaskListByWorkflowInstanceId(@Parameter(hidden = true) 
@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
-                                                    @Parameter(name = 
"projectCode", description = "PROJECT_CODE", required = true) @PathVariable 
long projectCode,
-                                                    @PathVariable("id") 
Integer id) throws IOException {
-        Map<String, Object> result =
+    public Result<WorkflowInstanceTaskListDTO> 
queryTaskListByWorkflowInstanceId(@Parameter(hidden = true) 
@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
+                                                                               
  @Parameter(name = "projectCode", description = "PROJECT_CODE", required = 
true) @PathVariable long projectCode,
+                                                                               
  @PathVariable("id") Integer id) {
+        WorkflowInstanceTaskListDTO taskList =
                 
workflowInstanceService.queryTaskListByWorkflowInstanceId(loginUser, 
projectCode, id);
-        return returnDataList(result);
+        return Result.success(taskList);
     }
 
     /**
@@ -174,19 +176,19 @@ public class WorkflowInstanceController extends 
BaseController {
     @ResponseStatus(HttpStatus.OK)
     @ApiException(Status.UPDATE_WORKFLOW_INSTANCE_ERROR)
     @OperatorLog(auditType = AuditType.WORKFLOW_INSTANCE_UPDATE)
-    public Result updateWorkflowInstance(@Parameter(hidden = true) 
@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
-                                         @Parameter(name = "projectCode", 
description = "PROJECT_CODE", required = true) @PathVariable long projectCode,
-                                         @RequestParam(value = 
"taskRelationJson", required = true) String taskRelationJson,
-                                         @RequestParam(value = 
"taskDefinitionJson", required = true) String taskDefinitionJson,
-                                         @PathVariable(value = "id") Integer 
id,
-                                         @RequestParam(value = "scheduleTime", 
required = false) String scheduleTime,
-                                         @RequestParam(value = "syncDefine", 
required = true) Boolean syncDefine,
-                                         @RequestParam(value = "globalParams", 
required = false, defaultValue = "[]") String globalParams,
-                                         @RequestParam(value = "locations", 
required = false) String locations,
-                                         @RequestParam(value = "timeout", 
required = false, defaultValue = "0") int timeout) {
-        Map<String, Object> result = 
workflowInstanceService.updateWorkflowInstance(loginUser, projectCode, id,
-                taskRelationJson, taskDefinitionJson, scheduleTime, 
syncDefine, globalParams, locations, timeout);
-        return returnDataList(result);
+    public Result<WorkflowDefinition> updateWorkflowInstance(@Parameter(hidden 
= true) @RequestAttribute(value = Constants.SESSION_USER) User loginUser,
+                                                             @Parameter(name = 
"projectCode", description = "PROJECT_CODE", required = true) @PathVariable 
long projectCode,
+                                                             
@RequestParam(value = "taskRelationJson", required = true) String 
taskRelationJson,
+                                                             
@RequestParam(value = "taskDefinitionJson", required = true) String 
taskDefinitionJson,
+                                                             
@PathVariable(value = "id") Integer id,
+                                                             
@RequestParam(value = "scheduleTime", required = false) String scheduleTime,
+                                                             
@RequestParam(value = "syncDefine", required = true) Boolean syncDefine,
+                                                             
@RequestParam(value = "globalParams", required = false, defaultValue = "[]") 
String globalParams,
+                                                             
@RequestParam(value = "locations", required = false) String locations,
+                                                             
@RequestParam(value = "timeout", required = false, defaultValue = "0") int 
timeout) {
+        WorkflowDefinition workflowDefinition = 
workflowInstanceService.updateWorkflowInstance(loginUser, projectCode,
+                id, taskRelationJson, taskDefinitionJson, scheduleTime, 
syncDefine, globalParams, locations, timeout);
+        return Result.success(workflowDefinition);
     }
 
     /**
@@ -204,11 +206,12 @@ public class WorkflowInstanceController extends 
BaseController {
     @GetMapping(value = "/{id}")
     @ResponseStatus(HttpStatus.OK)
     @ApiException(Status.QUERY_WORKFLOW_INSTANCE_BY_ID_ERROR)
-    public Result queryWorkflowInstanceById(@Parameter(hidden = true) 
@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
-                                            @Parameter(name = "projectCode", 
description = "PROJECT_CODE", required = true) @PathVariable long projectCode,
-                                            @PathVariable("id") Integer id) {
-        Map<String, Object> result = 
workflowInstanceService.queryWorkflowInstanceById(loginUser, projectCode, id);
-        return returnDataList(result);
+    public Result<WorkflowInstance> 
queryWorkflowInstanceById(@Parameter(hidden = true) @RequestAttribute(value = 
Constants.SESSION_USER) User loginUser,
+                                                              @Parameter(name 
= "projectCode", description = "PROJECT_CODE", required = true) @PathVariable 
long projectCode,
+                                                              
@PathVariable("id") Integer id) {
+        WorkflowInstance workflowInstance =
+                workflowInstanceService.queryWorkflowInstanceById(loginUser, 
projectCode, id);
+        return Result.success(workflowInstance);
     }
 
     /**
@@ -230,14 +233,14 @@ public class WorkflowInstanceController extends 
BaseController {
     @GetMapping(value = "/top-n")
     @ResponseStatus(HttpStatus.OK)
     @ApiException(Status.QUERY_WORKFLOW_INSTANCE_BY_ID_ERROR)
-    public Result<WorkflowInstance> 
queryTopNLongestRunningWorkflowInstance(@Parameter(hidden = true) 
@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
-                                                                            
@Parameter(name = "projectCode", description = "PROJECT_CODE", required = true) 
@PathVariable long projectCode,
-                                                                            
@RequestParam("size") Integer size,
-                                                                            
@RequestParam(value = "startTime", required = true) String startTime,
-                                                                            
@RequestParam(value = "endTime", required = true) String endTime) {
-        Map<String, Object> result = 
workflowInstanceService.queryTopNLongestRunningWorkflowInstance(loginUser,
-                projectCode, size, startTime, endTime);
-        return returnDataList(result);
+    public Result<List<WorkflowInstance>> 
queryTopNLongestRunningWorkflowInstance(@Parameter(hidden = true) 
@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
+                                                                               
   @Parameter(name = "projectCode", description = "PROJECT_CODE", required = 
true) @PathVariable long projectCode,
+                                                                               
   @RequestParam("size") Integer size,
+                                                                               
   @RequestParam(value = "startTime", required = true) String startTime,
+                                                                               
   @RequestParam(value = "endTime", required = true) String endTime) {
+        List<WorkflowInstance> workflowInstances = 
workflowInstanceService.queryTopNLongestRunningWorkflowInstance(
+                loginUser, projectCode, size, startTime, endTime);
+        return Result.success(workflowInstances);
     }
 
     /**
@@ -279,12 +282,12 @@ public class WorkflowInstanceController extends 
BaseController {
     @GetMapping(value = "/query-sub-by-parent")
     @ResponseStatus(HttpStatus.OK)
     
@ApiException(Status.QUERY_SUB_WORKFLOW_INSTANCE_DETAIL_INFO_BY_TASK_ID_ERROR)
-    public Result querySubWorkflowInstanceByTaskId(@Parameter(hidden = true) 
@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
-                                                   @Parameter(name = 
"projectCode", description = "PROJECT_CODE", required = true) @PathVariable 
long projectCode,
-                                                   @RequestParam("taskId") 
Integer taskId) {
-        Map<String, Object> result =
+    public Result<Map<String, Integer>> 
querySubWorkflowInstanceByTaskId(@Parameter(hidden = true) 
@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
+                                                                         
@Parameter(name = "projectCode", description = "PROJECT_CODE", required = true) 
@PathVariable long projectCode,
+                                                                         
@RequestParam("taskId") Integer taskId) {
+        Map<String, Integer> data =
                 
workflowInstanceService.querySubWorkflowInstanceByTaskId(loginUser, 
projectCode, taskId);
-        return returnDataList(result);
+        return Result.success(data);
     }
 
     /**
@@ -302,11 +305,12 @@ public class WorkflowInstanceController extends 
BaseController {
     @GetMapping(value = "/query-parent-by-sub")
     @ResponseStatus(HttpStatus.OK)
     
@ApiException(Status.QUERY_PARENT_WORKFLOW_INSTANCE_DETAIL_INFO_BY_SUB_WORKFLOW_INSTANCE_ID_ERROR)
-    public Result queryParentInstanceBySubId(@Parameter(hidden = true) 
@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
-                                             @Parameter(name = "projectCode", 
description = "PROJECT_CODE", required = true) @PathVariable long projectCode,
-                                             @RequestParam("subId") Integer 
subId) {
-        Map<String, Object> result = 
workflowInstanceService.queryParentInstanceBySubId(loginUser, projectCode, 
subId);
-        return returnDataList(result);
+    public Result<Map<String, Integer>> 
queryParentInstanceBySubId(@Parameter(hidden = true) @RequestAttribute(value = 
Constants.SESSION_USER) User loginUser,
+                                                                   
@Parameter(name = "projectCode", description = "PROJECT_CODE", required = true) 
@PathVariable long projectCode,
+                                                                   
@RequestParam("subId") Integer subId) {
+        Map<String, Integer> data =
+                workflowInstanceService.queryParentInstanceBySubId(loginUser, 
projectCode, subId);
+        return Result.success(data);
     }
 
     /**
@@ -344,11 +348,11 @@ public class WorkflowInstanceController extends 
BaseController {
     @GetMapping(value = "/{id}/view-variables")
     @ResponseStatus(HttpStatus.OK)
     @ApiException(Status.QUERY_WORKFLOW_INSTANCE_ALL_VARIABLES_ERROR)
-    public Result viewVariables(@Parameter(hidden = true) 
@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
-                                @Parameter(name = "projectCode", description = 
"PROJECT_CODE", required = true) @PathVariable long projectCode,
-                                @PathVariable("id") Integer id) {
-        Map<String, Object> result = 
workflowInstanceService.viewVariables(loginUser, projectCode, id);
-        return returnDataList(result);
+    public Result<WorkflowInstanceVariablesDTO> 
viewVariables(@Parameter(hidden = true) @RequestAttribute(value = 
Constants.SESSION_USER) User loginUser,
+                                                              @Parameter(name 
= "projectCode", description = "PROJECT_CODE", required = true) @PathVariable 
long projectCode,
+                                                              
@PathVariable("id") Integer id) {
+        WorkflowInstanceVariablesDTO variables = 
workflowInstanceService.viewVariables(loginUser, projectCode, id);
+        return Result.success(variables);
     }
 
     /**
@@ -366,11 +370,11 @@ public class WorkflowInstanceController extends 
BaseController {
     @GetMapping(value = "/{id}/view-gantt")
     @ResponseStatus(HttpStatus.OK)
     @ApiException(Status.ENCAPSULATION_WORKFLOW_INSTANCE_GANTT_STRUCTURE_ERROR)
-    public Result viewTree(@Parameter(hidden = true) @RequestAttribute(value = 
Constants.SESSION_USER) User loginUser,
-                           @Parameter(name = "projectCode", description = 
"PROJECT_CODE", required = true) @PathVariable long projectCode,
-                           @PathVariable("id") Integer id) throws Exception {
-        Map<String, Object> result = 
workflowInstanceService.viewGantt(loginUser, projectCode, id);
-        return returnDataList(result);
+    public Result<GanttDto> viewTree(@Parameter(hidden = true) 
@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
+                                     @Parameter(name = "projectCode", 
description = "PROJECT_CODE", required = true) @PathVariable long projectCode,
+                                     @PathVariable("id") Integer id) throws 
Exception {
+        GanttDto ganttDto = workflowInstanceService.viewGantt(loginUser, 
projectCode, id);
+        return Result.success(ganttDto);
     }
 
     /**
@@ -391,11 +395,9 @@ public class WorkflowInstanceController extends 
BaseController {
     @ResponseStatus(HttpStatus.OK)
     @ApiException(Status.BATCH_DELETE_WORKFLOW_INSTANCE_BY_IDS_ERROR)
     @OperatorLog(auditType = AuditType.WORKFLOW_INSTANCE_BATCH_DELETE)
-    public Result batchDeleteWorkflowInstanceByIds(@RequestAttribute(value = 
Constants.SESSION_USER) User loginUser,
-                                                   @PathVariable long 
projectCode,
-                                                   
@RequestParam("workflowInstanceIds") String workflowInstanceIds) {
-        // task queue
-        Map<String, Object> result = new HashMap<>();
+    public Result<Void> 
batchDeleteWorkflowInstanceByIds(@RequestAttribute(value = 
Constants.SESSION_USER) User loginUser,
+                                                         @PathVariable long 
projectCode,
+                                                         
@RequestParam("workflowInstanceIds") String workflowInstanceIds) {
         List<String> deleteFailedIdList = new ArrayList<>();
         if (!StringUtils.isEmpty(workflowInstanceIds)) {
             String[] workflowInstanceIdArray = 
workflowInstanceIds.split(Constants.COMMA);
@@ -412,11 +414,10 @@ public class WorkflowInstanceController extends 
BaseController {
             }
         }
         if (!deleteFailedIdList.isEmpty()) {
-            putMsg(result, Status.BATCH_DELETE_WORKFLOW_INSTANCE_BY_IDS_ERROR, 
String.join("\n", deleteFailedIdList));
-        } else {
-            putMsg(result, Status.SUCCESS);
+            return 
Result.errorWithArgs(Status.BATCH_DELETE_WORKFLOW_INSTANCE_BY_IDS_ERROR,
+                    String.join("\n", deleteFailedIdList));
         }
-        return returnDataList(result);
+        return Result.success();
     }
 
     // Todo: This is unstable, in some case the command trigger failed, we 
cannot get workflow instance
@@ -431,10 +432,11 @@ public class WorkflowInstanceController extends 
BaseController {
     @GetMapping("/trigger")
     @ResponseStatus(HttpStatus.OK)
     @ApiException(QUERY_WORKFLOW_INSTANCE_LIST_PAGING_ERROR)
-    public Result queryWorkflowInstancesByTriggerCode(@RequestAttribute(value 
= Constants.SESSION_USER) User loginUser,
-                                                      @PathVariable long 
projectCode,
-                                                      @RequestParam(value = 
"triggerCode") Long triggerCode) {
-        Map<String, Object> result = 
workflowInstanceService.queryByTriggerCode(loginUser, projectCode, triggerCode);
-        return returnDataList(result);
+    public Result<List<WorkflowInstance>> 
queryWorkflowInstancesByTriggerCode(@RequestAttribute(value = 
Constants.SESSION_USER) User loginUser,
+                                                                              
@PathVariable long projectCode,
+                                                                              
@RequestParam(value = "triggerCode") Long triggerCode) {
+        List<WorkflowInstance> workflowInstances =
+                workflowInstanceService.queryByTriggerCode(loginUser, 
projectCode, triggerCode);
+        return Result.success(workflowInstances);
     }
 }
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/workflowInstance/WorkflowInstanceTaskListDTO.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/workflowInstance/WorkflowInstanceTaskListDTO.java
new file mode 100644
index 0000000000..fd665d9a9e
--- /dev/null
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/workflowInstance/WorkflowInstanceTaskListDTO.java
@@ -0,0 +1,37 @@
+/*
+ * 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.workflowInstance;
+
+import org.apache.dolphinscheduler.dao.entity.AbstractTaskInstanceContext;
+import org.apache.dolphinscheduler.dao.entity.TaskInstanceDependentDetails;
+
+import java.util.List;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class WorkflowInstanceTaskListDTO {
+
+    private String workflowInstanceState;
+
+    private List<TaskInstanceDependentDetails<AbstractTaskInstanceContext>> 
taskList;
+}
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/workflowInstance/WorkflowInstanceVariablesDTO.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/workflowInstance/WorkflowInstanceVariablesDTO.java
new file mode 100644
index 0000000000..fc2bf28efc
--- /dev/null
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/workflowInstance/WorkflowInstanceVariablesDTO.java
@@ -0,0 +1,37 @@
+/*
+ * 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.workflowInstance;
+
+import org.apache.dolphinscheduler.plugin.task.api.model.Property;
+
+import java.util.List;
+import java.util.Map;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class WorkflowInstanceVariablesDTO {
+
+    private List<Property> globalParams;
+
+    private Map<String, Map<String, Object>> localParams;
+}
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkflowInstanceService.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkflowInstanceService.java
index 3bb9fd71f1..6c3e817535 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkflowInstanceService.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkflowInstanceService.java
@@ -18,13 +18,16 @@
 package org.apache.dolphinscheduler.api.service;
 
 import org.apache.dolphinscheduler.api.dto.DynamicSubWorkflowDto;
+import org.apache.dolphinscheduler.api.dto.gantt.GanttDto;
+import 
org.apache.dolphinscheduler.api.dto.workflowInstance.WorkflowInstanceTaskListDTO;
+import 
org.apache.dolphinscheduler.api.dto.workflowInstance.WorkflowInstanceVariablesDTO;
 import org.apache.dolphinscheduler.api.utils.PageInfo;
 import org.apache.dolphinscheduler.api.utils.Result;
 import org.apache.dolphinscheduler.common.enums.WorkflowExecutionStatus;
 import org.apache.dolphinscheduler.dao.entity.User;
+import org.apache.dolphinscheduler.dao.entity.WorkflowDefinition;
 import org.apache.dolphinscheduler.dao.entity.WorkflowInstance;
 
-import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 
@@ -33,11 +36,11 @@ public interface WorkflowInstanceService {
     /**
      * return top n SUCCESS workflow instance order by running time which 
started between startTime and endTime
      */
-    Map<String, Object> queryTopNLongestRunningWorkflowInstance(User loginUser,
-                                                                long 
projectCode,
-                                                                int size,
-                                                                String 
startTime,
-                                                                String 
endTime);
+    List<WorkflowInstance> queryTopNLongestRunningWorkflowInstance(User 
loginUser,
+                                                                   long 
projectCode,
+                                                                   int size,
+                                                                   String 
startTime,
+                                                                   String 
endTime);
 
     /**
      * query workflow instance by id
@@ -47,9 +50,9 @@ public interface WorkflowInstanceService {
      * @param workflowInstanceId   workflow instance id
      * @return workflow instance detail
      */
-    Map<String, Object> queryWorkflowInstanceById(User loginUser,
-                                                  long projectCode,
-                                                  Integer workflowInstanceId);
+    WorkflowInstance queryWorkflowInstanceById(User loginUser,
+                                               long projectCode,
+                                               Integer workflowInstanceId);
 
     /**
      * paging query workflow instance list, filtering according to project, 
workflow definition, time range, keyword, workflow status
@@ -87,11 +90,10 @@ public interface WorkflowInstanceService {
      * @param projectCode project code
      * @param workflowInstanceId   workflow instance id
      * @return task list for the workflow instance
-     * @throws IOException io exception
      */
-    Map<String, Object> queryTaskListByWorkflowInstanceId(User loginUser,
-                                                          long projectCode,
-                                                          Integer 
workflowInstanceId) throws IOException;
+    WorkflowInstanceTaskListDTO queryTaskListByWorkflowInstanceId(User 
loginUser,
+                                                                  long 
projectCode,
+                                                                  Integer 
workflowInstanceId);
 
     /**
      * query sub workflow instance detail info by task id
@@ -99,11 +101,11 @@ public interface WorkflowInstanceService {
      * @param loginUser   login user
      * @param projectCode project code
      * @param taskId      task id
-     * @return sub workflow instance detail
+     * @return single-entry map keyed by {@code subWorkflowInstanceId}
      */
-    Map<String, Object> querySubWorkflowInstanceByTaskId(User loginUser,
-                                                         long projectCode,
-                                                         Integer taskId);
+    Map<String, Integer> querySubWorkflowInstanceByTaskId(User loginUser,
+                                                          long projectCode,
+                                                          Integer taskId);
 
     List<DynamicSubWorkflowDto> queryDynamicSubWorkflowInstances(User 
loginUser,
                                                                  Integer 
taskId);
@@ -121,18 +123,18 @@ public interface WorkflowInstanceService {
      * @param globalParams       global params
      * @param locations          locations for nodes
      * @param timeout            timeout
-     * @return update result code
+     * @return updated workflow definition
      */
-    Map<String, Object> updateWorkflowInstance(User loginUser,
-                                               long projectCode,
-                                               Integer workflowInstanceId,
-                                               String taskRelationJson,
-                                               String taskDefinitionJson,
-                                               String scheduleTime,
-                                               Boolean syncDefine,
-                                               String globalParams,
-                                               String locations,
-                                               int timeout);
+    WorkflowDefinition updateWorkflowInstance(User loginUser,
+                                              long projectCode,
+                                              Integer workflowInstanceId,
+                                              String taskRelationJson,
+                                              String taskDefinitionJson,
+                                              String scheduleTime,
+                                              Boolean syncDefine,
+                                              String globalParams,
+                                              String locations,
+                                              int timeout);
 
     /**
      * query parent workflow instance detail info by sub workflow instance id
@@ -140,18 +142,17 @@ public interface WorkflowInstanceService {
      * @param loginUser   login user
      * @param projectCode project code
      * @param subId       sub workflow id
-     * @return parent instance detail
+     * @return single-entry map keyed by {@code parentWorkflowInstance}
      */
-    Map<String, Object> queryParentInstanceBySubId(User loginUser,
-                                                   long projectCode,
-                                                   Integer subId);
+    Map<String, Integer> queryParentInstanceBySubId(User loginUser,
+                                                    long projectCode,
+                                                    Integer subId);
 
     /**
      * delete workflow instance by id, at the same time,delete task instance 
and their mapping relation data
      *
      * @param loginUser         login user
      * @param workflowInstanceId workflow instance id
-     * @return delete result code
      */
     void deleteWorkflowInstanceById(User loginUser,
                                     Integer workflowInstanceId);
@@ -164,7 +165,7 @@ public interface WorkflowInstanceService {
      * @param workflowInstanceId workflow instance id
      * @return variables data
      */
-    Map<String, Object> viewVariables(User loginUser, long projectCode, 
Integer workflowInstanceId);
+    WorkflowInstanceVariablesDTO viewVariables(User loginUser, long 
projectCode, Integer workflowInstanceId);
 
     /**
      * encapsulation gantt structure
@@ -175,7 +176,7 @@ public interface WorkflowInstanceService {
      * @return gantt tree data
      * @throws Exception exception when json parse
      */
-    Map<String, Object> viewGantt(User loginUser, long projectCode, Integer 
workflowInstanceId) throws Exception;
+    GanttDto viewGantt(User loginUser, long projectCode, Integer 
workflowInstanceId) throws Exception;
 
     /**
      * query workflow instance by workflowDefinitionCode and stateArray
@@ -210,14 +211,14 @@ public interface WorkflowInstanceService {
                                                          int size);
 
     /**
-     * query workflow instance list bt trigger code
+     * query workflow instance list by trigger code
      *
-     * @param loginUser
-     * @param projectCode
-     * @param triggerCode
-     * @return
+     * @param loginUser   login user
+     * @param projectCode project code
+     * @param triggerCode trigger code (nullable)
+     * @return workflow instances triggered by the given trigger code
      */
-    Map<String, Object> queryByTriggerCode(User loginUser, long projectCode, 
Long triggerCode);
+    List<WorkflowInstance> queryByTriggerCode(User loginUser, long 
projectCode, Long triggerCode);
 
     void deleteWorkflowInstanceByWorkflowDefinitionCode(long 
workflowDefinitionCode);
 
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowInstanceServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowInstanceServiceImpl.java
index 6e5ed60d09..45630ee8b0 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowInstanceServiceImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowInstanceServiceImpl.java
@@ -20,11 +20,9 @@ package org.apache.dolphinscheduler.api.service.impl;
 import static 
org.apache.dolphinscheduler.api.constants.ApiFuncIdentificationConstant.WORKFLOW_INSTANCE;
 import static 
org.apache.dolphinscheduler.api.enums.Status.WORKFLOW_INSTANCE_NOT_EXIST;
 import static 
org.apache.dolphinscheduler.api.enums.Status.WORKFLOW_INSTANCE_STATE_OPERATION_ERROR;
-import static org.apache.dolphinscheduler.common.constants.Constants.DATA_LIST;
-import static 
org.apache.dolphinscheduler.common.constants.Constants.GLOBAL_PARAMS;
 import static 
org.apache.dolphinscheduler.common.constants.Constants.LOCAL_PARAMS;
-import static org.apache.dolphinscheduler.common.constants.Constants.TASK_LIST;
-import static 
org.apache.dolphinscheduler.common.constants.Constants.WORKFLOW_INSTANCE_STATE;
+import static 
org.apache.dolphinscheduler.common.constants.Constants.PARENT_WORKFLOW_INSTANCE;
+import static 
org.apache.dolphinscheduler.common.constants.Constants.SUBWORKFLOW_INSTANCE_ID;
 import static org.apache.dolphinscheduler.common.utils.JSONUtils.parseObject;
 import static 
org.apache.dolphinscheduler.plugin.task.api.TaskPluginManager.checkTaskParameters;
 
@@ -32,6 +30,8 @@ import 
org.apache.dolphinscheduler.api.constants.ApiFuncIdentificationConstant;
 import org.apache.dolphinscheduler.api.dto.DynamicSubWorkflowDto;
 import org.apache.dolphinscheduler.api.dto.gantt.GanttDto;
 import org.apache.dolphinscheduler.api.dto.gantt.Task;
+import 
org.apache.dolphinscheduler.api.dto.workflowInstance.WorkflowInstanceTaskListDTO;
+import 
org.apache.dolphinscheduler.api.dto.workflowInstance.WorkflowInstanceVariablesDTO;
 import org.apache.dolphinscheduler.api.enums.Status;
 import org.apache.dolphinscheduler.api.exceptions.ServiceException;
 import org.apache.dolphinscheduler.api.service.ProjectService;
@@ -177,62 +177,41 @@ public class WorkflowInstanceServiceImpl extends 
BaseServiceImpl implements Work
     @Autowired
     private TaskInstanceContextDao taskInstanceContextDao;
 
-    /**
-     * return top n SUCCESS workflow instance order by running time which 
started between startTime and endTime
-     */
     @Override
-    public Map<String, Object> queryTopNLongestRunningWorkflowInstance(User 
loginUser, long projectCode, int size,
-                                                                       String 
startTime, String endTime) {
+    public List<WorkflowInstance> queryTopNLongestRunningWorkflowInstance(User 
loginUser, long projectCode, int size,
+                                                                          
String startTime, String endTime) {
         Project project = projectMapper.queryByCode(projectCode);
         // check user access for project
         projectService.checkProjectAndAuthThrowException(loginUser, project, 
WORKFLOW_INSTANCE);
 
-        Map<String, Object> result = new HashMap<>();
         if (0 > size) {
-            putMsg(result, Status.NEGTIVE_SIZE_NUMBER_ERROR, size);
-            return result;
+            throw new ServiceException(Status.NEGTIVE_SIZE_NUMBER_ERROR, size);
         }
         if (Objects.isNull(startTime)) {
-            putMsg(result, Status.DATA_IS_NULL, Constants.START_TIME);
-            return result;
+            throw new ServiceException(Status.DATA_IS_NULL, 
Constants.START_TIME);
         }
         Date start = DateUtils.stringToDate(startTime);
         if (Objects.isNull(endTime)) {
-            putMsg(result, Status.DATA_IS_NULL, Constants.END_TIME);
-            return result;
+            throw new ServiceException(Status.DATA_IS_NULL, 
Constants.END_TIME);
         }
         Date end = DateUtils.stringToDate(endTime);
         if (start == null || end == null) {
-            putMsg(result, Status.REQUEST_PARAMS_NOT_VALID_ERROR, 
Constants.START_END_DATE);
-            return result;
+            throw new ServiceException(Status.REQUEST_PARAMS_NOT_VALID_ERROR, 
Constants.START_END_DATE);
         }
         if (start.getTime() > end.getTime()) {
-            putMsg(result, Status.START_TIME_BIGGER_THAN_END_TIME_ERROR, 
startTime, endTime);
-            return result;
+            throw new 
ServiceException(Status.START_TIME_BIGGER_THAN_END_TIME_ERROR, startTime, 
endTime);
         }
 
-        List<WorkflowInstance> workflowInstances = 
workflowInstanceMapper.queryTopNWorkflowInstance(size, start, end,
-                WorkflowExecutionStatus.SUCCESS, projectCode);
-        result.put(DATA_LIST, workflowInstances);
-        putMsg(result, Status.SUCCESS);
-        return result;
+        return workflowInstanceMapper.queryTopNWorkflowInstance(size, start, 
end, WorkflowExecutionStatus.SUCCESS,
+                projectCode);
     }
 
-    /**
-     * query workflow instance by id
-     *
-     * @param loginUser   login user
-     * @param projectCode project code
-     * @param workflowInstanceId   workflow instance id
-     * @return workflow instance detail
-     */
     @Override
-    public Map<String, Object> queryWorkflowInstanceById(User loginUser, long 
projectCode, Integer workflowInstanceId) {
+    public WorkflowInstance queryWorkflowInstanceById(User loginUser, long 
projectCode, Integer workflowInstanceId) {
         Project project = projectMapper.queryByCode(projectCode);
         // check user access for project
         projectService.checkProjectAndAuthThrowException(loginUser, project, 
WORKFLOW_INSTANCE);
 
-        Map<String, Object> result = new HashMap<>();
         WorkflowInstance workflowInstance = 
processService.findWorkflowInstanceDetailById(workflowInstanceId)
                 .orElseThrow(() -> new 
ServiceException(WORKFLOW_INSTANCE_NOT_EXIST, workflowInstanceId));
 
@@ -242,33 +221,13 @@ public class WorkflowInstanceServiceImpl extends 
BaseServiceImpl implements Work
 
         if (workflowDefinition == null || projectCode != 
workflowDefinition.getProjectCode()) {
             log.error("workflow definition does not exist, projectCode: {}.", 
projectCode);
-            putMsg(result, Status.WORKFLOW_DEFINITION_NOT_EXIST, 
workflowInstanceId);
-        } else {
-            workflowInstance.setLocations(workflowDefinition.getLocations());
-            
workflowInstance.setDagData(processService.genDagData(workflowDefinition));
-            result.put(DATA_LIST, workflowInstance);
-            putMsg(result, Status.SUCCESS);
+            throw new ServiceException(Status.WORKFLOW_DEFINITION_NOT_EXIST, 
workflowInstanceId);
         }
-
-        return result;
+        workflowInstance.setLocations(workflowDefinition.getLocations());
+        
workflowInstance.setDagData(processService.genDagData(workflowDefinition));
+        return workflowInstance;
     }
 
-    /**
-     * paging query workflow instance list, filtering according to project, 
workflow definition, time range, keyword, workflow status
-     *
-     * @param loginUser         login user
-     * @param projectCode       project code
-     * @param workflowDefinitionCode workflow definition code
-     * @param pageNo            page number
-     * @param pageSize          page size
-     * @param searchVal         search value
-     * @param stateType         state type
-     * @param host              host
-     * @param startDate         start time
-     * @param endDate           end time
-     * @param otherParamsJson   otherParamsJson handle other params
-     * @return workflow instance list
-     */
     @Override
     public Result<PageInfo<WorkflowInstance>> queryWorkflowInstanceList(User 
loginUser,
                                                                         long 
projectCode,
@@ -336,22 +295,13 @@ public class WorkflowInstanceServiceImpl extends 
BaseServiceImpl implements Work
         return result;
     }
 
-    /**
-     * query task list by workflow instance id
-     *
-     * @param loginUser   login user
-     * @param projectCode project code
-     * @param workflowInstanceId   workflow instance id
-     * @return task list for the workflow instance
-     */
     @Override
-    public Map<String, Object> queryTaskListByWorkflowInstanceId(User 
loginUser, long projectCode,
-                                                                 Integer 
workflowInstanceId) {
+    public WorkflowInstanceTaskListDTO queryTaskListByWorkflowInstanceId(User 
loginUser, long projectCode,
+                                                                         
Integer workflowInstanceId) {
         Project project = projectMapper.queryByCode(projectCode);
         // check user access for project
         projectService.checkProjectAndAuthThrowException(loginUser, project, 
WORKFLOW_INSTANCE);
 
-        Map<String, Object> result = new HashMap<>();
         WorkflowInstance workflowInstance = 
processService.findWorkflowInstanceDetailById(workflowInstanceId)
                 .orElseThrow(() -> new 
ServiceException(WORKFLOW_INSTANCE_NOT_EXIST, workflowInstanceId));
         WorkflowDefinition workflowDefinition =
@@ -359,21 +309,14 @@ public class WorkflowInstanceServiceImpl extends 
BaseServiceImpl implements Work
         if (workflowDefinition != null && projectCode != 
workflowDefinition.getProjectCode()) {
             log.error("workflow definition does not exist, projectCode:{}, 
workflowInstanceId:{}.", projectCode,
                     workflowInstanceId);
-            putMsg(result, WORKFLOW_INSTANCE_NOT_EXIST, workflowInstanceId);
-            return result;
+            throw new ServiceException(WORKFLOW_INSTANCE_NOT_EXIST, 
workflowInstanceId);
         }
         List<TaskInstance> taskInstanceList =
                 
taskInstanceDao.queryValidTaskListByWorkflowInstanceId(workflowInstanceId);
         List<TaskInstanceDependentDetails<AbstractTaskInstanceContext>> 
taskInstanceDependentDetailsList =
                 setTaskInstanceDependentResult(taskInstanceList);
-
-        Map<String, Object> resultMap = new HashMap<>();
-        resultMap.put(WORKFLOW_INSTANCE_STATE, 
workflowInstance.getState().toString());
-        resultMap.put(TASK_LIST, taskInstanceDependentDetailsList);
-        result.put(DATA_LIST, resultMap);
-
-        putMsg(result, Status.SUCCESS);
-        return result;
+        return new 
WorkflowInstanceTaskListDTO(workflowInstance.getState().toString(),
+                taskInstanceDependentDetailsList);
     }
 
     private List<TaskInstanceDependentDetails<AbstractTaskInstanceContext>> 
setTaskInstanceDependentResult(List<TaskInstance> taskInstanceList) {
@@ -404,15 +347,12 @@ public class WorkflowInstanceServiceImpl extends 
BaseServiceImpl implements Work
     @Override
     public List<DynamicSubWorkflowDto> queryDynamicSubWorkflowInstances(User 
loginUser, Integer taskId) {
         TaskInstance taskInstance = taskInstanceDao.queryById(taskId);
-        Map<String, Object> result = new HashMap<>();
         if (taskInstance == null) {
-            putMsg(result, Status.TASK_INSTANCE_NOT_EXISTS, taskId);
             throw new ServiceException(Status.TASK_INSTANCE_NOT_EXISTS, 
taskId);
         }
 
         TaskDefinition taskDefinition = 
taskDefinitionMapper.queryByCode(taskInstance.getTaskCode());
         if (taskDefinition == null) {
-            putMsg(result, Status.TASK_INSTANCE_NOT_EXISTS, taskId);
             throw new ServiceException(Status.TASK_INSTANCE_NOT_EXISTS, 
taskId);
         }
 
@@ -424,7 +364,6 @@ public class WorkflowInstanceServiceImpl extends 
BaseServiceImpl implements Work
         List<WorkflowInstance> allSubWorkflows = 
workflowInstanceDao.queryByIds(allSubWorkflowInstanceId);
 
         if (allSubWorkflows == null || allSubWorkflows.isEmpty()) {
-            putMsg(result, Status.SUB_WORKFLOW_INSTANCE_NOT_EXIST, taskId);
             throw new ServiceException(Status.SUB_WORKFLOW_INSTANCE_NOT_EXIST, 
taskId);
         }
         Long subWorkflowCode = 
allSubWorkflows.get(0).getWorkflowDefinitionCode();
@@ -432,7 +371,6 @@ public class WorkflowInstanceServiceImpl extends 
BaseServiceImpl implements Work
         WorkflowDefinition subWorkflowDefinition =
                 processService.findWorkflowDefinition(subWorkflowCode, 
subWorkflowVersion);
         if (subWorkflowDefinition == null) {
-            putMsg(result, Status.WORKFLOW_DEFINITION_NOT_EXIST, 
subWorkflowCode);
             throw new ServiceException(Status.WORKFLOW_DEFINITION_NOT_EXIST, 
subWorkflowCode);
         }
 
@@ -457,39 +395,27 @@ public class WorkflowInstanceServiceImpl extends 
BaseServiceImpl implements Work
         return allDynamicSubWorkflowDtos;
     }
 
-    /**
-     * query sub workflow instance detail info by task id
-     *
-     * @param loginUser   login user
-     * @param projectCode project code
-     * @param taskId      task id
-     * @return sub workflow instance detail
-     */
     @Override
-    public Map<String, Object> querySubWorkflowInstanceByTaskId(User 
loginUser, long projectCode, Integer taskId) {
+    public Map<String, Integer> querySubWorkflowInstanceByTaskId(User 
loginUser, long projectCode, Integer taskId) {
         Project project = projectMapper.queryByCode(projectCode);
         // check user access for project
         projectService.checkProjectAndAuthThrowException(loginUser, project, 
WORKFLOW_INSTANCE);
 
-        Map<String, Object> result = new HashMap<>();
         TaskInstance taskInstance = taskInstanceDao.queryById(taskId);
         if (taskInstance == null) {
             log.error("Task instance does not exist, projectCode:{}, 
taskInstanceId{}.", projectCode, taskId);
-            putMsg(result, Status.TASK_INSTANCE_NOT_EXISTS, taskId);
-            return result;
+            throw new ServiceException(Status.TASK_INSTANCE_NOT_EXISTS, 
taskId);
         }
 
         TaskDefinition taskDefinition = 
taskDefinitionMapper.queryByCode(taskInstance.getTaskCode());
         if (taskDefinition != null && projectCode != 
taskDefinition.getProjectCode()) {
             log.error("Task definition does not exist, projectCode:{}, 
taskDefinitionCode:{}.", projectCode,
                     taskInstance.getTaskCode());
-            putMsg(result, Status.TASK_INSTANCE_NOT_EXISTS, taskId);
-            return result;
+            throw new ServiceException(Status.TASK_INSTANCE_NOT_EXISTS, 
taskId);
         }
 
         if (!TaskTypeUtils.isSubWorkflowTask(taskInstance.getTaskType())) {
-            putMsg(result, Status.TASK_INSTANCE_NOT_SUB_WORKFLOW_INSTANCE, 
taskInstance.getName());
-            return result;
+            throw new 
ServiceException(Status.TASK_INSTANCE_NOT_SUB_WORKFLOW_INSTANCE, 
taskInstance.getName());
         }
 
         WorkflowInstance subWorkflowInstance = 
processService.findSubWorkflowInstance(
@@ -497,43 +423,22 @@ public class WorkflowInstanceServiceImpl extends 
BaseServiceImpl implements Work
         if (subWorkflowInstance == null) {
             log.error("Sub workflow instance does not exist, projectCode:{}, 
taskInstanceId:{}.", projectCode,
                     taskInstance.getId());
-            putMsg(result, Status.SUB_WORKFLOW_INSTANCE_NOT_EXIST, taskId);
-            return result;
+            throw new ServiceException(Status.SUB_WORKFLOW_INSTANCE_NOT_EXIST, 
taskId);
         }
-        Map<String, Object> dataMap = new HashMap<>();
-        dataMap.put(Constants.SUBWORKFLOW_INSTANCE_ID, 
subWorkflowInstance.getId());
-        result.put(DATA_LIST, dataMap);
-        putMsg(result, Status.SUCCESS);
-        return result;
+        return Collections.singletonMap(SUBWORKFLOW_INSTANCE_ID, 
subWorkflowInstance.getId());
     }
 
-    /**
-     * update workflow instance
-     *
-     * @param loginUser          login user
-     * @param projectCode        project code
-     * @param taskRelationJson   workflow task relation json
-     * @param taskDefinitionJson taskDefinitionJson
-     * @param workflowInstanceId  workflow instance id
-     * @param scheduleTime       schedule time
-     * @param syncDefine         sync define
-     * @param globalParams       global params
-     * @param locations          locations for nodes
-     * @param timeout            timeout
-     * @return update result code
-     */
     @Transactional
     @Override
-    public Map<String, Object> updateWorkflowInstance(User loginUser, long 
projectCode, Integer workflowInstanceId,
-                                                      String taskRelationJson,
-                                                      String 
taskDefinitionJson, String scheduleTime,
-                                                      Boolean syncDefine,
-                                                      String globalParams,
-                                                      String locations, int 
timeout) {
+    public WorkflowDefinition updateWorkflowInstance(User loginUser, long 
projectCode, Integer workflowInstanceId,
+                                                     String taskRelationJson,
+                                                     String 
taskDefinitionJson, String scheduleTime,
+                                                     Boolean syncDefine,
+                                                     String globalParams,
+                                                     String locations, int 
timeout) {
         // check user access for project
         projectService.checkProjectAndAuthThrowException(loginUser, 
projectCode,
                 ApiFuncIdentificationConstant.INSTANCE_UPDATE);
-        Map<String, Object> result = new HashMap<>();
         // check workflow instance exists
         WorkflowInstance workflowInstance = 
processService.findWorkflowInstanceDetailById(workflowInstanceId)
                 .orElseThrow(() -> new 
ServiceException(WORKFLOW_INSTANCE_NOT_EXIST, workflowInstanceId));
@@ -543,16 +448,14 @@ public class WorkflowInstanceServiceImpl extends 
BaseServiceImpl implements Work
         if (workflowDefinition0 != null && projectCode != 
workflowDefinition0.getProjectCode()) {
             log.error("workflow definition does not exist, projectCode:{}, 
workflowDefinitionCode:{}.", projectCode,
                     workflowInstance.getWorkflowDefinitionCode());
-            putMsg(result, WORKFLOW_INSTANCE_NOT_EXIST, workflowInstanceId);
-            return result;
+            throw new ServiceException(WORKFLOW_INSTANCE_NOT_EXIST, 
workflowInstanceId);
         }
         // check workflow instance status
         if (!workflowInstance.getState().isFinalState()) {
             log.warn("workflow Instance state is {} so can not update workflow 
instance, workflowInstanceId:{}.",
                     workflowInstance.getState().name(), workflowInstanceId);
-            putMsg(result, WORKFLOW_INSTANCE_STATE_OPERATION_ERROR,
+            throw new ServiceException(WORKFLOW_INSTANCE_STATE_OPERATION_ERROR,
                     workflowInstance.getName(), 
workflowInstance.getState().toString(), "update");
-            return result;
         }
 
         String timezoneId;
@@ -567,21 +470,18 @@ public class WorkflowInstanceServiceImpl extends 
BaseServiceImpl implements Work
         List<TaskDefinitionLog> taskDefinitionLogs = 
JSONUtils.toList(taskDefinitionJson, TaskDefinitionLog.class);
         if (taskDefinitionLogs.isEmpty()) {
             log.warn("Parameter taskDefinitionJson is empty");
-            putMsg(result, Status.DATA_IS_NOT_VALID, taskDefinitionJson);
-            return result;
+            throw new ServiceException(Status.DATA_IS_NOT_VALID, 
taskDefinitionJson);
         }
         for (TaskDefinitionLog taskDefinitionLog : taskDefinitionLogs) {
             if (!checkTaskParameters(taskDefinitionLog.getTaskType(), 
taskDefinitionLog.getTaskParams())) {
                 log.error("Task parameters are invalid,  
taskDefinitionName:{}.", taskDefinitionLog.getName());
-                putMsg(result, Status.WORKFLOW_NODE_S_PARAMETER_INVALID, 
taskDefinitionLog.getName());
-                return result;
+                throw new 
ServiceException(Status.WORKFLOW_NODE_S_PARAMETER_INVALID, 
taskDefinitionLog.getName());
             }
         }
         int saveTaskResult = processService.saveTaskDefine(loginUser, 
projectCode, taskDefinitionLogs, syncDefine);
         if (saveTaskResult == Constants.DEFINITION_FAILURE) {
             log.error("Update task definition error, projectCode:{}, 
workflowInstanceId:{}", projectCode,
                     workflowInstanceId);
-            putMsg(result, Status.UPDATE_TASK_DEFINITION_ERROR);
             throw new ServiceException(Status.UPDATE_TASK_DEFINITION_ERROR);
         }
         WorkflowDefinition workflowDefinition =
@@ -589,9 +489,11 @@ public class WorkflowInstanceServiceImpl extends 
BaseServiceImpl implements Work
         List<WorkflowTaskRelationLog> taskRelationList =
                 JSONUtils.toList(taskRelationJson, 
WorkflowTaskRelationLog.class);
         // check workflow json is valid
-        result = 
workflowDefinitionService.checkWorkflowNodeList(taskRelationJson, 
taskDefinitionLogs);
-        if (result.get(Constants.STATUS) != Status.SUCCESS) {
-            return result;
+        Map<String, Object> checkResult =
+                
workflowDefinitionService.checkWorkflowNodeList(taskRelationJson, 
taskDefinitionLogs);
+        Status checkStatus = (Status) checkResult.get(Constants.STATUS);
+        if (checkStatus != Status.SUCCESS) {
+            throw new ServiceException(checkStatus.getCode(), (String) 
checkResult.get(Constants.MSG));
         }
 
         workflowDefinition.set(projectCode, workflowDefinition.getName(), 
workflowDefinition.getDescription(),
@@ -601,11 +503,10 @@ public class WorkflowInstanceServiceImpl extends 
BaseServiceImpl implements Work
         if (insertVersion == 0) {
             log.error("Update workflow definition error, projectCode:{}, 
workflowDefinitionName:{}.", projectCode,
                     workflowDefinition.getName());
-            putMsg(result, Status.UPDATE_WORKFLOW_DEFINITION_ERROR);
             throw new 
ServiceException(Status.UPDATE_WORKFLOW_DEFINITION_ERROR);
-        } else
-            log.info("Update workflow definition complete, projectCode:{}, 
workflowDefinitionName:{}.", projectCode,
-                    workflowDefinition.getName());
+        }
+        log.info("Update workflow definition complete, projectCode:{}, 
workflowDefinitionName:{}.", projectCode,
+                workflowDefinition.getName());
 
         // save workflow lineage
         if (syncDefine) {
@@ -615,33 +516,27 @@ public class WorkflowInstanceServiceImpl extends 
BaseServiceImpl implements Work
 
         int insertResult = processService.saveTaskRelation(loginUser, 
workflowDefinition.getProjectCode(),
                 workflowDefinition.getCode(), insertVersion, taskRelationList, 
taskDefinitionLogs, syncDefine);
-        if (insertResult == Constants.EXIT_CODE_SUCCESS) {
-            log.info(
-                    "Update task relations complete, projectCode:{}, 
workflowDefinitionCode:{}, workflowDefinitionVersion:{}.",
-                    projectCode, workflowDefinition.getCode(), insertVersion);
-            putMsg(result, Status.SUCCESS);
-            result.put(DATA_LIST, workflowDefinition);
-        } else {
+        if (insertResult != Constants.EXIT_CODE_SUCCESS) {
             log.info(
                     "Update task relations error, projectCode:{}, 
workflowDefinitionCode:{}, workflowDefinitionVersion:{}.",
                     projectCode, workflowDefinition.getCode(), insertVersion);
-            putMsg(result, Status.UPDATE_WORKFLOW_DEFINITION_ERROR);
             throw new 
ServiceException(Status.UPDATE_WORKFLOW_DEFINITION_ERROR);
         }
+        log.info(
+                "Update task relations complete, projectCode:{}, 
workflowDefinitionCode:{}, workflowDefinitionVersion:{}.",
+                projectCode, workflowDefinition.getCode(), insertVersion);
         workflowInstance.setWorkflowDefinitionVersion(insertVersion);
         boolean update = workflowInstanceDao.updateById(workflowInstance);
         if (!update) {
             log.error(
                     "Update workflow instance version error, projectCode:{}, 
workflowDefinitionCode:{}, workflowDefinitionVersion:{}",
                     projectCode, workflowDefinition.getCode(), insertVersion);
-            putMsg(result, Status.UPDATE_WORKFLOW_INSTANCE_ERROR);
             throw new ServiceException(Status.UPDATE_WORKFLOW_INSTANCE_ERROR);
         }
         log.info(
                 "Update workflow instance complete, projectCode:{}, 
workflowDefinitionCode:{}, workflowDefinitionVersion:{}, workflowInstanceId:{}",
                 projectCode, workflowDefinition.getCode(), insertVersion, 
workflowInstanceId);
-        putMsg(result, Status.SUCCESS);
-        return result;
+        return workflowDefinition;
     }
 
     /**
@@ -663,52 +558,30 @@ public class WorkflowInstanceServiceImpl extends 
BaseServiceImpl implements Work
         workflowInstance.setGlobalParams(globalParams);
     }
 
-    /**
-     * query parent workflow instance detail info by sub workflow instance id
-     *
-     * @param loginUser   login user
-     * @param projectCode project code
-     * @param subId       sub workflow id
-     * @return parent instance detail
-     */
     @Override
-    public Map<String, Object> queryParentInstanceBySubId(User loginUser, long 
projectCode, Integer subId) {
+    public Map<String, Integer> queryParentInstanceBySubId(User loginUser, 
long projectCode, Integer subId) {
         Project project = projectMapper.queryByCode(projectCode);
         // check user access for project
         projectService.checkProjectAndAuthThrowException(loginUser, project, 
WORKFLOW_INSTANCE);
 
-        Map<String, Object> result = new HashMap<>();
         WorkflowInstance subInstance = 
processService.findWorkflowInstanceDetailById(subId)
                 .orElseThrow(() -> new 
ServiceException(WORKFLOW_INSTANCE_NOT_EXIST, subId));
         if (subInstance.getIsSubWorkflow() == Flag.NO) {
             log.warn(
                     "workflow instance is not sub workflow instance type, 
workflowInstanceId:{}, workflowInstanceName:{}.",
                     subId, subInstance.getName());
-            putMsg(result, Status.WORKFLOW_INSTANCE_NOT_SUB_WORKFLOW_INSTANCE, 
subInstance.getName());
-            return result;
+            throw new 
ServiceException(Status.WORKFLOW_INSTANCE_NOT_SUB_WORKFLOW_INSTANCE, 
subInstance.getName());
         }
 
         WorkflowInstance parentWorkflowInstance = 
processService.findParentWorkflowInstance(subId);
         if (parentWorkflowInstance == null) {
             log.error("Parent workflow instance does not exist, 
projectCode:{}, subWorkflowInstanceId:{}.",
                     projectCode, subId);
-            putMsg(result, Status.SUB_WORKFLOW_INSTANCE_NOT_EXIST);
-            return result;
+            throw new ServiceException(Status.SUB_WORKFLOW_INSTANCE_NOT_EXIST);
         }
-        Map<String, Object> dataMap = new HashMap<>();
-        dataMap.put(Constants.PARENT_WORKFLOW_INSTANCE, 
parentWorkflowInstance.getId());
-        result.put(DATA_LIST, dataMap);
-        putMsg(result, Status.SUCCESS);
-        return result;
+        return Collections.singletonMap(PARENT_WORKFLOW_INSTANCE, 
parentWorkflowInstance.getId());
     }
 
-    /**
-     * delete workflow instance by id, at the same time,delete task instance 
and their mapping relation data
-     *
-     * @param loginUser         login user
-     * @param workflowInstanceId workflow instance id
-     * @return delete result code
-     */
     @Override
     @Transactional
     public void deleteWorkflowInstanceById(User loginUser, Integer 
workflowInstanceId) {
@@ -731,27 +604,17 @@ public class WorkflowInstanceServiceImpl extends 
BaseServiceImpl implements Work
         deleteWorkflowInstanceById(workflowInstanceId);
     }
 
-    /**
-     * view workflow instance variables
-     *
-     * @param loginUser         login user
-     * @param projectCode       project code
-     * @param workflowInstanceId workflow instance id
-     * @return variables data
-     */
     @Override
-    public Map<String, Object> viewVariables(User loginUser, long projectCode, 
Integer workflowInstanceId) {
+    public WorkflowInstanceVariablesDTO viewVariables(User loginUser, long 
projectCode, Integer workflowInstanceId) {
         // check user access for project
         projectService.checkProjectAndAuthThrowException(loginUser, 
projectCode, WORKFLOW_INSTANCE);
-        Map<String, Object> result = new HashMap<>();
 
         WorkflowInstance workflowInstance = 
workflowInstanceMapper.queryDetailById(workflowInstanceId);
 
         if (workflowInstance == null) {
             log.error("workflow instance does not exist, projectCode:{}, 
workflowInstanceId:{}.", projectCode,
                     workflowInstanceId);
-            putMsg(result, WORKFLOW_INSTANCE_NOT_EXIST, workflowInstanceId);
-            return result;
+            throw new ServiceException(WORKFLOW_INSTANCE_NOT_EXIST, 
workflowInstanceId);
         }
 
         WorkflowDefinition workflowDefinition =
@@ -759,8 +622,7 @@ public class WorkflowInstanceServiceImpl extends 
BaseServiceImpl implements Work
         if (workflowDefinition != null && projectCode != 
workflowDefinition.getProjectCode()) {
             log.error("workflow definition does not exist, projectCode:{}, 
workflowDefinitionCode:{}.", projectCode,
                     workflowInstance.getWorkflowDefinitionCode());
-            putMsg(result, WORKFLOW_INSTANCE_NOT_EXIST, workflowInstanceId);
-            return result;
+            throw new ServiceException(WORKFLOW_INSTANCE_NOT_EXIST, 
workflowInstanceId);
         }
 
         String timezone = null;
@@ -779,13 +641,7 @@ public class WorkflowInstanceServiceImpl extends 
BaseServiceImpl implements Work
         // localUserDefParams
         Map<String, Map<String, Object>> localUserDefParams = 
processLocalParams(workflowInstance, parameterMap);
 
-        Map<String, Object> resultMap = new HashMap<>();
-        resultMap.put(GLOBAL_PARAMS, finalGlobalParams);
-        resultMap.put(LOCAL_PARAMS, localUserDefParams);
-
-        result.put(DATA_LIST, resultMap);
-        putMsg(result, Status.SUCCESS);
-        return result;
+        return new WorkflowInstanceVariablesDTO(finalGlobalParams, 
localUserDefParams);
     }
 
     /**
@@ -854,28 +710,16 @@ public class WorkflowInstanceServiceImpl extends 
BaseServiceImpl implements Work
         return localUserDefParams;
     }
 
-    /**
-     * encapsulation gantt structure
-     *
-     * @param loginUser         login user
-     * @param projectCode       project code
-     * @param workflowInstanceId workflow instance id
-     * @return gantt tree data
-     * @throws Exception exception when json parse
-     */
     @Override
-    public Map<String, Object> viewGantt(User loginUser, long projectCode,
-                                         Integer workflowInstanceId) throws 
Exception {
+    public GanttDto viewGantt(User loginUser, long projectCode, Integer 
workflowInstanceId) throws Exception {
         // check user access for project
         projectService.checkProjectAndAuthThrowException(loginUser, 
projectCode, WORKFLOW_INSTANCE);
-        Map<String, Object> result = new HashMap<>();
         WorkflowInstance workflowInstance = 
workflowInstanceMapper.queryDetailById(workflowInstanceId);
 
         if (workflowInstance == null) {
             log.error("workflow instance does not exist, projectCode:{}, 
workflowInstanceId:{}.", projectCode,
                     workflowInstanceId);
-            putMsg(result, WORKFLOW_INSTANCE_NOT_EXIST, workflowInstanceId);
-            return result;
+            throw new ServiceException(WORKFLOW_INSTANCE_NOT_EXIST, 
workflowInstanceId);
         }
 
         WorkflowDefinition workflowDefinition = 
workflowDefinitionLogMapper.queryByDefinitionCodeAndVersion(
@@ -884,8 +728,7 @@ public class WorkflowInstanceServiceImpl extends 
BaseServiceImpl implements Work
         if (workflowDefinition == null || projectCode != 
workflowDefinition.getProjectCode()) {
             log.error("workflow definition does not exist, projectCode:{}, 
workflowDefinitionCode:{}.", projectCode,
                     workflowInstance.getWorkflowDefinitionCode());
-            putMsg(result, WORKFLOW_INSTANCE_NOT_EXIST, workflowInstanceId);
-            return result;
+            throw new ServiceException(WORKFLOW_INSTANCE_NOT_EXIST, 
workflowInstanceId);
         }
         GanttDto ganttDto = new GanttDto();
         DAG<Long, TaskNode, TaskNodeRelation> dag = 
processService.genDagGraph(workflowDefinition);
@@ -924,19 +767,9 @@ public class WorkflowInstanceServiceImpl extends 
BaseServiceImpl implements Work
             }
         }
         ganttDto.setTasks(taskList);
-
-        result.put(DATA_LIST, ganttDto);
-        putMsg(result, Status.SUCCESS);
-        return result;
+        return ganttDto;
     }
 
-    /**
-     * query workflow instance by workflowDefinitionCode and stateArray
-     *
-     * @param workflowDefinitionCode workflowDefinitionCode
-     * @param states                states array
-     * @return workflow instance list
-     */
     @Override
     public List<WorkflowInstance> queryByWorkflowDefinitionCodeAndStatus(Long 
workflowDefinitionCode, int[] states) {
         return 
workflowInstanceMapper.queryByWorkflowDefinitionCodeAndStatus(workflowDefinitionCode,
 states);
@@ -949,44 +782,22 @@ public class WorkflowInstanceServiceImpl extends 
BaseServiceImpl implements Work
                 states);
     }
 
-    /**
-     * query workflow instance by workflowDefinitionCode
-     *
-     * @param workflowDefinitionCode workflowDefinitionCode
-     * @param size                  size
-     * @return workflow instance list
-     */
     @Override
     public List<WorkflowInstance> queryByWorkflowDefinitionCode(Long 
workflowDefinitionCode, int size) {
         return 
workflowInstanceMapper.queryByWorkflowDefinitionCode(workflowDefinitionCode, 
size);
     }
 
-    /**
-     * query workflow instance list bt trigger code
-     *
-     * @param loginUser
-     * @param projectCode
-     * @param triggerCode
-     * @return
-     */
     @Override
-    public Map<String, Object> queryByTriggerCode(User loginUser, long 
projectCode, Long triggerCode) {
+    public List<WorkflowInstance> queryByTriggerCode(User loginUser, long 
projectCode, Long triggerCode) {
 
         Project project = projectMapper.queryByCode(projectCode);
         // check user access for project
         projectService.checkProjectAndAuthThrowException(loginUser, project, 
WORKFLOW_INSTANCE);
 
-        Map<String, Object> result = new HashMap<>();
         if (triggerCode == null) {
-            putMsg(result, Status.SUCCESS);
-            return result;
+            return Collections.emptyList();
         }
-
-        List<WorkflowInstance> workflowInstances = 
workflowInstanceMapper.queryByTriggerCode(
-                triggerCode);
-        result.put(DATA_LIST, workflowInstances);
-        putMsg(result, Status.SUCCESS);
-        return result;
+        return workflowInstanceMapper.queryByTriggerCode(triggerCode);
     }
 
     @Override
diff --git 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkflowInstanceControllerTest.java
 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkflowInstanceControllerTest.java
index 7d890de3bb..ada5e70e92 100644
--- 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkflowInstanceControllerTest.java
+++ 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkflowInstanceControllerTest.java
@@ -24,15 +24,18 @@ import static 
org.springframework.test.web.servlet.request.MockMvcRequestBuilder
 import static 
org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
 import static 
org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
 
+import 
org.apache.dolphinscheduler.api.dto.workflowInstance.WorkflowInstanceVariablesDTO;
 import org.apache.dolphinscheduler.api.enums.Status;
+import org.apache.dolphinscheduler.api.exceptions.ServiceException;
 import org.apache.dolphinscheduler.api.service.WorkflowInstanceService;
 import org.apache.dolphinscheduler.api.utils.Result;
-import org.apache.dolphinscheduler.common.constants.Constants;
 import org.apache.dolphinscheduler.common.enums.WorkflowExecutionStatus;
 import org.apache.dolphinscheduler.common.utils.JSONUtils;
+import org.apache.dolphinscheduler.dao.entity.WorkflowDefinition;
+import org.apache.dolphinscheduler.dao.entity.WorkflowInstance;
 
-import java.util.HashMap;
-import java.util.Map;
+import java.util.ArrayList;
+import java.util.Collections;
 
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
@@ -81,12 +84,10 @@ public class WorkflowInstanceControllerTest extends 
AbstractControllerTest {
 
     @Test
     public void testQueryTaskListByWorkflowInstanceId() throws Exception {
-        Map<String, Object> mockResult = new HashMap<>();
-        mockResult.put(Constants.STATUS, Status.PROJECT_NOT_FOUND);
         Mockito
                 
.when(workflowInstanceService.queryTaskListByWorkflowInstanceId(Mockito.any(), 
Mockito.anyLong(),
                         Mockito.any()))
-                .thenReturn(mockResult);
+                .thenThrow(new ServiceException(Status.PROJECT_NOT_FOUND));
 
         MvcResult mvcResult = mockMvc
                 
.perform(get("/projects/{projectCode}/workflow-instances/{id}/tasks", "1113", 
"123")
@@ -102,8 +103,7 @@ public class WorkflowInstanceControllerTest extends 
AbstractControllerTest {
 
     @Test
     public void testUpdateWorkflowInstance() throws Exception {
-        Map<String, Object> mockResult = new HashMap<>();
-        mockResult.put(Constants.STATUS, Status.SUCCESS);
+        WorkflowDefinition mockResult = new WorkflowDefinition();
         Mockito.when(workflowInstanceService
                 .updateWorkflowInstance(Mockito.any(), Mockito.anyLong(), 
Mockito.anyInt(), Mockito.anyString(),
                         Mockito.anyString(), Mockito.anyString(), 
Mockito.anyBoolean(), Mockito.anyString(),
@@ -139,11 +139,9 @@ public class WorkflowInstanceControllerTest extends 
AbstractControllerTest {
 
     @Test
     public void testQueryWorkflowInstanceById() throws Exception {
-        Map<String, Object> mockResult = new HashMap<>();
-        mockResult.put(Constants.STATUS, Status.SUCCESS);
         Mockito.when(
                 
workflowInstanceService.queryWorkflowInstanceById(Mockito.any(), 
Mockito.anyLong(), Mockito.anyInt()))
-                .thenReturn(mockResult);
+                .thenReturn(new WorkflowInstance());
         MvcResult mvcResult = 
mockMvc.perform(get("/projects/{projectCode}/workflow-instances/{id}", "1113", 
"123")
                 .header(SESSION_ID, sessionId))
                 .andExpect(status().isOk())
@@ -157,10 +155,8 @@ public class WorkflowInstanceControllerTest extends 
AbstractControllerTest {
 
     @Test
     public void testQuerySubWorkflowInstanceByTaskId() throws Exception {
-        Map<String, Object> mockResult = new HashMap<>();
-        mockResult.put(Constants.STATUS, Status.TASK_INSTANCE_NOT_EXISTS);
         
Mockito.when(workflowInstanceService.querySubWorkflowInstanceByTaskId(Mockito.any(),
 Mockito.anyLong(),
-                Mockito.anyInt())).thenReturn(mockResult);
+                Mockito.anyInt())).thenThrow(new 
ServiceException(Status.TASK_INSTANCE_NOT_EXISTS));
 
         MvcResult mvcResult = mockMvc
                 
.perform(get("/projects/{projectCode}/workflow-instances/query-sub-by-parent", 
"1113")
@@ -177,11 +173,9 @@ public class WorkflowInstanceControllerTest extends 
AbstractControllerTest {
 
     @Test
     public void testQueryParentInstanceBySubId() throws Exception {
-        Map<String, Object> mockResult = new HashMap<>();
-        mockResult.put(Constants.STATUS, 
Status.WORKFLOW_INSTANCE_NOT_SUB_WORKFLOW_INSTANCE);
         Mockito.when(
                 
workflowInstanceService.queryParentInstanceBySubId(Mockito.any(), 
Mockito.anyLong(), Mockito.anyInt()))
-                .thenReturn(mockResult);
+                .thenThrow(new 
ServiceException(Status.WORKFLOW_INSTANCE_NOT_SUB_WORKFLOW_INSTANCE));
 
         MvcResult mvcResult = mockMvc
                 
.perform(get("/projects/{projectCode}/workflow-instances/query-parent-by-sub", 
"1113")
@@ -199,8 +193,8 @@ public class WorkflowInstanceControllerTest extends 
AbstractControllerTest {
 
     @Test
     public void testViewVariables() throws Exception {
-        Map<String, Object> mockResult = new HashMap<>();
-        mockResult.put(Constants.STATUS, Status.SUCCESS);
+        WorkflowInstanceVariablesDTO mockResult =
+                new WorkflowInstanceVariablesDTO(Collections.emptyList(), 
Collections.emptyMap());
         Mockito.when(workflowInstanceService.viewVariables(Mockito.any(), 
Mockito.eq(1113L), Mockito.eq(123)))
                 .thenReturn(mockResult);
         MvcResult mvcResult = mockMvc
@@ -216,8 +210,6 @@ public class WorkflowInstanceControllerTest extends 
AbstractControllerTest {
 
     @Test
     public void testDeleteWorkflowInstanceById() throws Exception {
-        Map<String, Object> mockResult = new HashMap<>();
-        mockResult.put(Constants.STATUS, Status.SUCCESS);
         
Mockito.doNothing().when(workflowInstanceService).deleteWorkflowInstanceById(Mockito.any(),
 Mockito.anyInt());
 
         MvcResult mvcResult = 
mockMvc.perform(delete("/projects/{projectCode}/workflow-instances/{id}", 
"1113", "123")
@@ -233,9 +225,6 @@ public class WorkflowInstanceControllerTest extends 
AbstractControllerTest {
 
     @Test
     public void testBatchDeleteWorkflowInstanceByIds() throws Exception {
-        Map<String, Object> mockResult = new HashMap<>();
-        mockResult.put(Constants.STATUS, Status.WORKFLOW_INSTANCE_NOT_EXIST);
-
         
Mockito.doNothing().when(workflowInstanceService).deleteWorkflowInstanceById(Mockito.any(),
 Mockito.anyInt());
         MvcResult mvcResult = 
mockMvc.perform(post("/projects/{projectCode}/workflow-instances/batch-delete", 
"1113")
                 .header(SESSION_ID, sessionId)
@@ -251,12 +240,9 @@ public class WorkflowInstanceControllerTest extends 
AbstractControllerTest {
 
     @Test
     public void queryWorkflowInstancesByTriggerCode() throws Exception {
-        Map<String, Object> mockResult = new HashMap<>();
-        mockResult.put(Constants.STATUS, Status.SUCCESS);
-
         Mockito.when(workflowInstanceService
                 .queryByTriggerCode(Mockito.any(), Mockito.anyLong(), 
Mockito.anyLong()))
-                .thenReturn(mockResult);
+                .thenReturn(new ArrayList<>());
 
         MvcResult mvcResult = 
mockMvc.perform(get("/projects/1113/workflow-instances/trigger")
                 .header("sessionId", sessionId)
diff --git 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowInstanceServiceTest.java
 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowInstanceServiceTest.java
index bd31084afe..dd79bb17ea 100644
--- 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowInstanceServiceTest.java
+++ 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowInstanceServiceTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.dolphinscheduler.api.service;
 
+import static 
org.apache.dolphinscheduler.api.AssertionsHelper.assertThrowsServiceException;
 import static 
org.apache.dolphinscheduler.api.constants.ApiFuncIdentificationConstant.INSTANCE_UPDATE;
 import static 
org.apache.dolphinscheduler.api.constants.ApiFuncIdentificationConstant.WORKFLOW_INSTANCE;
 import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -25,6 +26,8 @@ import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.when;
 
+import 
org.apache.dolphinscheduler.api.dto.workflowInstance.WorkflowInstanceTaskListDTO;
+import 
org.apache.dolphinscheduler.api.dto.workflowInstance.WorkflowInstanceVariablesDTO;
 import org.apache.dolphinscheduler.api.enums.Status;
 import org.apache.dolphinscheduler.api.exceptions.ServiceException;
 import org.apache.dolphinscheduler.api.service.impl.LoggerServiceImpl;
@@ -76,8 +79,6 @@ import 
org.apache.dolphinscheduler.service.expand.CuringParamsService;
 import org.apache.dolphinscheduler.service.model.TaskNode;
 import org.apache.dolphinscheduler.service.process.ProcessService;
 
-import java.io.IOException;
-import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
@@ -195,8 +196,6 @@ public class WorkflowInstanceServiceTest {
         long projectCode = 1L;
         User loginUser = getAdminUser();
         Project project = getProject(projectCode);
-        Map<String, Object> result = new HashMap<>();
-        putMsg(result, Status.PROJECT_NOT_FOUND, projectCode);
 
         // project auth fail
         doThrow(new ServiceException())
@@ -227,7 +226,6 @@ public class WorkflowInstanceServiceTest {
         pageReturn.setRecords(workflowInstanceList);
 
         // data parameter check
-        putMsg(result, Status.SUCCESS, projectCode);
         when(projectMapper.queryByCode(projectCode)).thenReturn(project);
         
Mockito.doNothing().when(projectService).checkProjectAndAuthThrowException(Mockito.any(),
                 Mockito.any(Project.class),
@@ -252,8 +250,6 @@ public class WorkflowInstanceServiceTest {
                 10));
 
         // project auth success
-        putMsg(result, Status.SUCCESS, projectCode);
-
         
doNothing().when(projectService).checkProjectAndAuthThrowException(loginUser, 
projectCode, WORKFLOW_INSTANCE);
         when(usersService.queryUser(loginUser.getId())).thenReturn(loginUser);
         
when(usersService.getUserIdByName(loginUser.getUserName())).thenReturn(loginUser.getId());
@@ -317,16 +313,19 @@ public class WorkflowInstanceServiceTest {
         when(projectMapper.queryByCode(projectCode)).thenReturn(project);
         Mockito.doThrow(new ServiceException(Status.PROJECT_NOT_FOUND))
                 
.when(projectService).checkProjectAndAuthThrowException(loginUser, project, 
WORKFLOW_INSTANCE);
-        ServiceException ex = assertThrows(ServiceException.class,
+        assertThrowsServiceException(Status.PROJECT_NOT_FOUND,
                 () -> workflowInstanceService.queryByTriggerCode(loginUser, 
projectCode, 999L));
-        Assertions.assertEquals(Status.PROJECT_NOT_FOUND.getCode(), 
ex.getCode());
-        // project auth success
+
+        // project auth success, trigger code null returns empty list
         
Mockito.doNothing().when(projectService).checkProjectAndAuthThrowException(loginUser,
 project,
                 WORKFLOW_INSTANCE);
-        
when(workflowInstanceMapper.queryByTriggerCode(projectCode)).thenReturn(new 
ArrayList());
-        Map<String, Object> projectAuthFailMap =
-                workflowInstanceService.queryByTriggerCode(loginUser, 
projectCode, 999L);
-        Assertions.assertEquals(Status.SUCCESS, 
projectAuthFailMap.get(Constants.STATUS));
+        List<WorkflowInstance> nullTriggerRes =
+                workflowInstanceService.queryByTriggerCode(loginUser, 
projectCode, null);
+        Assertions.assertTrue(nullTriggerRes.isEmpty());
+
+        when(workflowInstanceMapper.queryByTriggerCode(999L)).thenReturn(new 
ArrayList<>());
+        List<WorkflowInstance> emptyRes = 
workflowInstanceService.queryByTriggerCode(loginUser, projectCode, 999L);
+        Assertions.assertTrue(emptyRes.isEmpty());
     }
 
     @Test
@@ -342,25 +341,22 @@ public class WorkflowInstanceServiceTest {
         when(projectMapper.queryByCode(projectCode)).thenReturn(project);
         Mockito.doThrow(new ServiceException(Status.PROJECT_NOT_FOUND))
                 
.when(projectService).checkProjectAndAuthThrowException(loginUser, project, 
WORKFLOW_INSTANCE);
-        ServiceException ex = assertThrows(ServiceException.class, () -> 
workflowInstanceService
+        assertThrowsServiceException(Status.PROJECT_NOT_FOUND, () -> 
workflowInstanceService
                 .queryTopNLongestRunningWorkflowInstance(loginUser, 
projectCode, size, startTime, endTime));
-        Assertions.assertEquals(Status.PROJECT_NOT_FOUND.getCode(), 
ex.getCode());
 
         // project auth success
-        WorkflowInstance workflowInstance = getProcessInstance();
         
Mockito.doNothing().when(projectService).checkProjectAndAuthThrowException(loginUser,
 project,
                 WORKFLOW_INSTANCE);
-        Map<String, Object> projectAuthFailRes = workflowInstanceService
-                .queryTopNLongestRunningWorkflowInstance(loginUser, 
projectCode, -1, startTime, endTime);
-        Assertions.assertEquals(Status.NEGTIVE_SIZE_NUMBER_ERROR, 
projectAuthFailRes.get(Constants.STATUS));
+        assertThrowsServiceException(Status.NEGTIVE_SIZE_NUMBER_ERROR, () -> 
workflowInstanceService
+                .queryTopNLongestRunningWorkflowInstance(loginUser, 
projectCode, -1, startTime, endTime));
 
-        when(usersService.queryUser(loginUser.getId())).thenReturn(loginUser);
-        
when(usersService.getUserIdByName(loginUser.getUserName())).thenReturn(loginUser.getId());
-        
when(usersService.queryUser(workflowInstance.getExecutorId())).thenReturn(loginUser);
-        Map<String, Object> successRes = 
workflowInstanceService.queryTopNLongestRunningWorkflowInstance(loginUser,
+        
when(workflowInstanceMapper.queryTopNWorkflowInstance(Mockito.eq(size), 
Mockito.any(), Mockito.any(),
+                Mockito.eq(WorkflowExecutionStatus.SUCCESS), 
Mockito.eq(projectCode)))
+                        .thenReturn(new ArrayList<>());
+        List<WorkflowInstance> successRes = 
workflowInstanceService.queryTopNLongestRunningWorkflowInstance(loginUser,
                 projectCode, size, startTime, endTime);
 
-        Assertions.assertEquals(Status.SUCCESS, 
successRes.get(Constants.STATUS));
+        Assertions.assertNotNull(successRes);
     }
 
     @Test
@@ -376,18 +372,17 @@ public class WorkflowInstanceServiceTest {
         
Mockito.doNothing().when(projectService).checkProjectAndAuthThrowException(loginUser,
 project,
                 WORKFLOW_INSTANCE);
 
-        Map<String, Object> startTimeBiggerFailRes = workflowInstanceService
-                .queryTopNLongestRunningWorkflowInstance(loginUser, 
projectCode, size, endTime, startTime);
-        Assertions.assertEquals(Status.START_TIME_BIGGER_THAN_END_TIME_ERROR,
-                startTimeBiggerFailRes.get(Constants.STATUS));
+        
assertThrowsServiceException(Status.START_TIME_BIGGER_THAN_END_TIME_ERROR,
+                () -> 
workflowInstanceService.queryTopNLongestRunningWorkflowInstance(loginUser, 
projectCode, size,
+                        endTime, startTime));
 
-        Map<String, Object> dataNullFailRes = workflowInstanceService
-                .queryTopNLongestRunningWorkflowInstance(loginUser, 
projectCode, size, null, endTime);
-        Assertions.assertEquals(Status.DATA_IS_NULL, 
dataNullFailRes.get(Constants.STATUS));
+        assertThrowsServiceException(Status.DATA_IS_NULL,
+                () -> 
workflowInstanceService.queryTopNLongestRunningWorkflowInstance(loginUser, 
projectCode, size,
+                        null, endTime));
 
-        dataNullFailRes = workflowInstanceService
-                .queryTopNLongestRunningWorkflowInstance(loginUser, 
projectCode, size, startTime, null);
-        Assertions.assertEquals(Status.DATA_IS_NULL, 
dataNullFailRes.get(Constants.STATUS));
+        assertThrowsServiceException(Status.DATA_IS_NULL,
+                () -> 
workflowInstanceService.queryTopNLongestRunningWorkflowInstance(loginUser, 
projectCode, size,
+                        startTime, null));
     }
 
     @Test
@@ -400,9 +395,8 @@ public class WorkflowInstanceServiceTest {
         when(projectMapper.queryByCode(projectCode)).thenReturn(project);
         Mockito.doThrow(new ServiceException(Status.PROJECT_NOT_FOUND))
                 
.when(projectService).checkProjectAndAuthThrowException(loginUser, project, 
WORKFLOW_INSTANCE);
-        ServiceException ex = assertThrows(ServiceException.class,
+        assertThrowsServiceException(Status.PROJECT_NOT_FOUND,
                 () -> 
workflowInstanceService.queryWorkflowInstanceById(loginUser, projectCode, 1));
-        Assertions.assertEquals(Status.PROJECT_NOT_FOUND.getCode(), 
ex.getCode());
 
         // project auth success
         WorkflowInstance workflowInstance = getProcessInstance();
@@ -414,28 +408,26 @@ public class WorkflowInstanceServiceTest {
                 .thenReturn(Optional.of(workflowInstance));
         
when(processService.findWorkflowDefinition(workflowInstance.getWorkflowDefinitionCode(),
                 
workflowInstance.getWorkflowDefinitionVersion())).thenReturn(workflowDefinition);
-        Map<String, Object> successRes = 
workflowInstanceService.queryWorkflowInstanceById(loginUser, projectCode, 1);
-        Assertions.assertEquals(Status.SUCCESS, 
successRes.get(Constants.STATUS));
+        WorkflowInstance successRes = 
workflowInstanceService.queryWorkflowInstanceById(loginUser, projectCode, 1);
+        Assertions.assertNotNull(successRes);
 
         // worker group null
-        Map<String, Object> workerNullRes =
-                workflowInstanceService.queryWorkflowInstanceById(loginUser, 
projectCode, 1);
-        Assertions.assertEquals(Status.SUCCESS, 
workerNullRes.get(Constants.STATUS));
+        WorkflowInstance workerNullRes = 
workflowInstanceService.queryWorkflowInstanceById(loginUser, projectCode, 1);
+        Assertions.assertNotNull(workerNullRes);
 
         // worker group exist
         WorkerGroup workerGroup = getWorkGroup();
-        Map<String, Object> workerExistRes =
-                workflowInstanceService.queryWorkflowInstanceById(loginUser, 
projectCode, 1);
-        Assertions.assertEquals(Status.SUCCESS, 
workerExistRes.get(Constants.STATUS));
+        WorkflowInstance workerExistRes = 
workflowInstanceService.queryWorkflowInstanceById(loginUser, projectCode, 1);
+        Assertions.assertNotNull(workerExistRes);
 
         
when(processService.findWorkflowDefinition(workflowInstance.getWorkflowDefinitionCode(),
-                
workflowInstance.getWorkflowDefinitionVersion())).thenReturn(null);;
-        workerExistRes = 
workflowInstanceService.queryWorkflowInstanceById(loginUser, projectCode, 1);
-        Assertions.assertEquals(Status.WORKFLOW_DEFINITION_NOT_EXIST, 
workerExistRes.get(Constants.STATUS));
+                
workflowInstance.getWorkflowDefinitionVersion())).thenReturn(null);
+        assertThrowsServiceException(Status.WORKFLOW_DEFINITION_NOT_EXIST,
+                () -> 
workflowInstanceService.queryWorkflowInstanceById(loginUser, projectCode, 1));
     }
 
     @Test
-    public void testQueryTaskListByWorkflowInstanceId() throws IOException {
+    public void testQueryTaskListByWorkflowInstanceId() {
         long projectCode = 1L;
         User loginUser = getAdminUser();
         Project project = getProject(projectCode);
@@ -444,9 +436,8 @@ public class WorkflowInstanceServiceTest {
         when(projectMapper.queryByCode(projectCode)).thenReturn(project);
         Mockito.doThrow(new ServiceException(Status.PROJECT_NOT_FOUND))
                 
.when(projectService).checkProjectAndAuthThrowException(loginUser, project, 
WORKFLOW_INSTANCE);
-        ServiceException ex = assertThrows(ServiceException.class,
+        assertThrowsServiceException(Status.PROJECT_NOT_FOUND,
                 () -> 
workflowInstanceService.queryTaskListByWorkflowInstanceId(loginUser, 
projectCode, 1));
-        Assertions.assertEquals(Status.PROJECT_NOT_FOUND.getCode(), 
ex.getCode());
 
         // project auth success
         
Mockito.doNothing().when(projectService).checkProjectAndAuthThrowException(loginUser,
 project,
@@ -458,7 +449,6 @@ public class WorkflowInstanceServiceTest {
         taskInstance.setTaskType("SHELL");
         List<TaskInstance> taskInstanceList = new ArrayList<>();
         taskInstanceList.add(taskInstance);
-        List<DependentResultTaskInstanceContext> 
dependentResultTaskInstanceContextList = new ArrayList<>();
         TaskInstanceContext taskInstanceContext = new TaskInstanceContext();
         taskInstanceContext.setTaskInstanceId(0);
         
taskInstanceContext.setContextType(ContextType.DEPENDENT_RESULT_CONTEXT);
@@ -482,9 +472,10 @@ public class WorkflowInstanceServiceTest {
         
when(taskInstanceContextDao.batchQueryByTaskInstanceIdsAndContextType(taskInstanceIdList,
                 ContextType.DEPENDENT_RESULT_CONTEXT))
                         .thenReturn(Lists.asList(taskInstanceContext, new 
TaskInstanceContext[0]));
-        Map<String, Object> successRes =
+        WorkflowInstanceTaskListDTO successRes =
                 
workflowInstanceService.queryTaskListByWorkflowInstanceId(loginUser, 
projectCode, 1);
-        Assertions.assertEquals(Status.SUCCESS, 
successRes.get(Constants.STATUS));
+        Assertions.assertEquals(WorkflowExecutionStatus.SUCCESS.toString(), 
successRes.getWorkflowInstanceState());
+        Assertions.assertEquals(1, successRes.getTaskList().size());
     }
 
     @Test
@@ -497,17 +488,15 @@ public class WorkflowInstanceServiceTest {
         when(projectMapper.queryByCode(projectCode)).thenReturn(project);
         Mockito.doThrow(new ServiceException(Status.PROJECT_NOT_FOUND))
                 
.when(projectService).checkProjectAndAuthThrowException(loginUser, project, 
WORKFLOW_INSTANCE);
-        ServiceException ex = assertThrows(ServiceException.class,
+        assertThrowsServiceException(Status.PROJECT_NOT_FOUND,
                 () -> 
workflowInstanceService.querySubWorkflowInstanceByTaskId(loginUser, 
projectCode, 1));
-        Assertions.assertEquals(Status.PROJECT_NOT_FOUND.getCode(), 
ex.getCode());
 
         // task null
         
Mockito.doNothing().when(projectService).checkProjectAndAuthThrowException(loginUser,
 project,
                 WORKFLOW_INSTANCE);
         when(taskInstanceDao.queryById(1)).thenReturn(null);
-        Map<String, Object> taskNullRes =
-                
workflowInstanceService.querySubWorkflowInstanceByTaskId(loginUser, 
projectCode, 1);
-        Assertions.assertEquals(Status.TASK_INSTANCE_NOT_EXISTS, 
taskNullRes.get(Constants.STATUS));
+        assertThrowsServiceException(Status.TASK_INSTANCE_NOT_EXISTS,
+                () -> 
workflowInstanceService.querySubWorkflowInstanceByTaskId(loginUser, 
projectCode, 1));
 
         // task not sub process
         TaskInstance taskInstance = getTaskInstance();
@@ -517,13 +506,12 @@ public class WorkflowInstanceServiceTest {
         TaskDefinition taskDefinition = new TaskDefinition();
         taskDefinition.setProjectCode(projectCode);
         
when(taskDefinitionMapper.queryByCode(taskInstance.getTaskCode())).thenReturn(taskDefinition);
-        Map<String, Object> notSubprocessRes =
-                
workflowInstanceService.querySubWorkflowInstanceByTaskId(loginUser, 
projectCode, 1);
-        
Assertions.assertEquals(Status.TASK_INSTANCE_NOT_SUB_WORKFLOW_INSTANCE, 
notSubprocessRes.get(Constants.STATUS));
+        
assertThrowsServiceException(Status.TASK_INSTANCE_NOT_SUB_WORKFLOW_INSTANCE,
+                () -> 
workflowInstanceService.querySubWorkflowInstanceByTaskId(loginUser, 
projectCode, 1));
 
         taskDefinition.setProjectCode(0L);
-        notSubprocessRes = 
workflowInstanceService.querySubWorkflowInstanceByTaskId(loginUser, 
projectCode, 1);
-        Assertions.assertEquals(Status.TASK_INSTANCE_NOT_EXISTS, 
notSubprocessRes.get(Constants.STATUS));
+        assertThrowsServiceException(Status.TASK_INSTANCE_NOT_EXISTS,
+                () -> 
workflowInstanceService.querySubWorkflowInstanceByTaskId(loginUser, 
projectCode, 1));
 
         taskDefinition.setProjectCode(projectCode);
         
when(taskDefinitionMapper.queryByCode(taskInstance.getTaskCode())).thenReturn(taskDefinition);
@@ -533,17 +521,17 @@ public class WorkflowInstanceServiceTest {
         subTask.setWorkflowInstanceId(1);
         when(taskInstanceDao.queryById(subTask.getId())).thenReturn(subTask);
         
when(processService.findSubWorkflowInstance(subTask.getWorkflowInstanceId(), 
subTask.getId())).thenReturn(null);
-        Map<String, Object> subprocessNotExistRes =
-                
workflowInstanceService.querySubWorkflowInstanceByTaskId(loginUser, 
projectCode, 1);
-        Assertions.assertEquals(Status.SUB_WORKFLOW_INSTANCE_NOT_EXIST, 
subprocessNotExistRes.get(Constants.STATUS));
+        assertThrowsServiceException(Status.SUB_WORKFLOW_INSTANCE_NOT_EXIST,
+                () -> 
workflowInstanceService.querySubWorkflowInstanceByTaskId(loginUser, 
projectCode, 1));
 
         // sub process exist
         WorkflowInstance workflowInstance = getProcessInstance();
         
when(processService.findSubWorkflowInstance(taskInstance.getWorkflowInstanceId(),
 taskInstance.getId()))
                 .thenReturn(workflowInstance);
-        Map<String, Object> subprocessExistRes =
+        Map<String, Integer> subprocessExistRes =
                 
workflowInstanceService.querySubWorkflowInstanceByTaskId(loginUser, 
projectCode, 1);
-        Assertions.assertEquals(Status.SUCCESS, 
subprocessExistRes.get(Constants.STATUS));
+        Assertions.assertEquals(workflowInstance.getId(),
+                subprocessExistRes.get(Constants.SUBWORKFLOW_INSTANCE_ID));
     }
 
     @Test
@@ -552,38 +540,34 @@ public class WorkflowInstanceServiceTest {
         User loginUser = getAdminUser();
         Project project = getProject(projectCode);
         Map<String, Object> result = new HashMap<>();
-        putMsg(result, Status.PROJECT_NOT_FOUND, projectCode);
+        result.put(Constants.STATUS, Status.SUCCESS);
 
         // project auth fail
         when(projectMapper.queryByCode(projectCode)).thenReturn(project);
         doThrow(new ServiceException(Status.PROJECT_NOT_FOUND, projectCode))
                 .when(projectService)
                 .checkProjectAndAuthThrowException(loginUser, projectCode, 
INSTANCE_UPDATE);
-        Assertions.assertThrows(ServiceException.class,
+        assertThrowsServiceException(Status.PROJECT_NOT_FOUND,
                 () -> 
workflowInstanceService.updateWorkflowInstance(loginUser, projectCode, 1,
                         shellJson, taskJson, "2020-02-21 00:00:00", true, "", 
"", 0));
 
         // process instance null
-        putMsg(result, Status.SUCCESS, projectCode);
         WorkflowInstance workflowInstance = getProcessInstance();
         when(projectMapper.queryByCode(projectCode)).thenReturn(project);
         doNothing()
                 .when(projectService)
                 .checkProjectAndAuthThrowException(loginUser, projectCode, 
INSTANCE_UPDATE);
         
when(processService.findWorkflowInstanceDetailById(1)).thenReturn(Optional.empty());
-        assertThrows(ServiceException.class, () -> {
-            workflowInstanceService.updateWorkflowInstance(loginUser, 
projectCode, 1,
-                    shellJson, taskJson, "2020-02-21 00:00:00", true, "", "", 
0);
-        });
+        assertThrowsServiceException(Status.WORKFLOW_INSTANCE_NOT_EXIST,
+                () -> 
workflowInstanceService.updateWorkflowInstance(loginUser, projectCode, 1,
+                        shellJson, taskJson, "2020-02-21 00:00:00", true, "", 
"", 0));
+
         // process instance not finish
         
when(processService.findWorkflowInstanceDetailById(1)).thenReturn(Optional.ofNullable(workflowInstance));
         workflowInstance.setState(WorkflowExecutionStatus.RUNNING_EXECUTION);
-        putMsg(result, Status.SUCCESS, projectCode);
-        Map<String, Object> processInstanceNotFinishRes =
-                workflowInstanceService.updateWorkflowInstance(loginUser, 
projectCode, 1,
-                        shellJson, taskJson, "2020-02-21 00:00:00", true, "", 
"", 0);
-        Assertions.assertEquals(Status.WORKFLOW_INSTANCE_STATE_OPERATION_ERROR,
-                processInstanceNotFinishRes.get(Constants.STATUS));
+        
assertThrowsServiceException(Status.WORKFLOW_INSTANCE_STATE_OPERATION_ERROR,
+                () -> 
workflowInstanceService.updateWorkflowInstance(loginUser, projectCode, 1,
+                        shellJson, taskJson, "2020-02-21 00:00:00", true, "", 
"", 0));
 
         // process instance finish
         workflowInstance.setState(WorkflowExecutionStatus.SUCCESS);
@@ -606,7 +590,6 @@ public class WorkflowInstanceServiceTest {
 
         List<TaskDefinitionLog> taskDefinitionLogs = 
JSONUtils.toList(taskDefinitionJson, TaskDefinitionLog.class);
         when(workflowDefinitionService.checkWorkflowNodeList(taskRelationJson, 
taskDefinitionLogs)).thenReturn(result);
-        putMsg(result, Status.SUCCESS, projectCode);
 
         try (
                 MockedStatic<TaskPluginManager> taskPluginManagerMockedStatic =
@@ -614,10 +597,10 @@ public class WorkflowInstanceServiceTest {
             taskPluginManagerMockedStatic
                     .when(() -> 
TaskPluginManager.checkTaskParameters(Mockito.any(), Mockito.any()))
                     .thenReturn(true);
-            Map<String, Object> processInstanceFinishRes =
+            WorkflowDefinition processInstanceFinishRes =
                     workflowInstanceService.updateWorkflowInstance(loginUser, 
projectCode, 1,
                             taskRelationJson, taskDefinitionJson, "2020-02-21 
00:00:00", true, "", "", 0);
-            Assertions.assertEquals(Status.SUCCESS, 
processInstanceFinishRes.get(Constants.STATUS));
+            Assertions.assertNotNull(processInstanceFinishRes);
 
             final RunWorkflowCommandParam runWorkflowCommandParam = 
RunWorkflowCommandParam.builder()
                     .commandParams(Lists.newArrayList(Property.builder()
@@ -629,20 +612,19 @@ public class WorkflowInstanceServiceTest {
                     .timeZone("Asia/Shanghai")
                     .build();
             
workflowInstance.setCommandParam(JSONUtils.toJsonString(runWorkflowCommandParam));
-            Map<String, Object> processInstanceFinishRes2 =
+            WorkflowDefinition processInstanceFinishRes2 =
                     workflowInstanceService.updateWorkflowInstance(loginUser, 
projectCode, 1,
                             taskRelationJson, taskDefinitionJson, "2020-02-21 
00:00:00", true, "", "", 0);
-            Assertions.assertEquals(Status.SUCCESS, 
processInstanceFinishRes2.get(Constants.STATUS));
+            Assertions.assertNotNull(processInstanceFinishRes2);
 
             // success
             
when(workflowDefinitionMapper.queryByCode(46L)).thenReturn(workflowDefinition);
-            putMsg(result, Status.SUCCESS, projectCode);
 
             when(processService.saveWorkflowDefine(loginUser, 
workflowDefinition, Boolean.FALSE, Boolean.FALSE))
                     .thenReturn(1);
-            Map<String, Object> successRes = 
workflowInstanceService.updateWorkflowInstance(loginUser, projectCode, 1,
+            WorkflowDefinition successRes = 
workflowInstanceService.updateWorkflowInstance(loginUser, projectCode, 1,
                     taskRelationJson, taskDefinitionJson, "2020-02-21 
00:00:00", Boolean.FALSE, "", "", 0);
-            Assertions.assertEquals(Status.SUCCESS, 
successRes.get(Constants.STATUS));
+            Assertions.assertNotNull(successRes);
         }
     }
 
@@ -656,38 +638,33 @@ public class WorkflowInstanceServiceTest {
         when(projectMapper.queryByCode(projectCode)).thenReturn(project);
         Mockito.doThrow(new ServiceException(Status.PROJECT_NOT_FOUND))
                 
.when(projectService).checkProjectAndAuthThrowException(loginUser, project, 
WORKFLOW_INSTANCE);
-        ServiceException ex = assertThrows(ServiceException.class,
+        assertThrowsServiceException(Status.PROJECT_NOT_FOUND,
                 () -> 
workflowInstanceService.queryParentInstanceBySubId(loginUser, projectCode, 1));
-        Assertions.assertEquals(Status.PROJECT_NOT_FOUND.getCode(), 
ex.getCode());
 
         // process instance null
         
Mockito.doNothing().when(projectService).checkProjectAndAuthThrowException(loginUser,
 project,
                 WORKFLOW_INSTANCE);
         
when(processService.findWorkflowInstanceDetailById(1)).thenReturn(Optional.empty());
-        assertThrows(ServiceException.class, () -> {
-            workflowInstanceService.queryParentInstanceBySubId(loginUser, 
projectCode, 1);
-        });
+        assertThrowsServiceException(Status.WORKFLOW_INSTANCE_NOT_EXIST,
+                () -> 
workflowInstanceService.queryParentInstanceBySubId(loginUser, projectCode, 1));
 
         // not sub process
         WorkflowInstance workflowInstance = getProcessInstance();
         workflowInstance.setIsSubWorkflow(Flag.NO);
         
when(processService.findWorkflowInstanceDetailById(1)).thenReturn(Optional.ofNullable(workflowInstance));
-        Map<String, Object> notSubProcessRes =
-                workflowInstanceService.queryParentInstanceBySubId(loginUser, 
projectCode, 1);
-        
Assertions.assertEquals(Status.WORKFLOW_INSTANCE_NOT_SUB_WORKFLOW_INSTANCE,
-                notSubProcessRes.get(Constants.STATUS));
+        
assertThrowsServiceException(Status.WORKFLOW_INSTANCE_NOT_SUB_WORKFLOW_INSTANCE,
+                () -> 
workflowInstanceService.queryParentInstanceBySubId(loginUser, projectCode, 1));
 
         // sub process
         workflowInstance.setIsSubWorkflow(Flag.YES);
         when(processService.findParentWorkflowInstance(1)).thenReturn(null);
-        Map<String, Object> subProcessNullRes =
-                workflowInstanceService.queryParentInstanceBySubId(loginUser, 
projectCode, 1);
-        Assertions.assertEquals(Status.SUB_WORKFLOW_INSTANCE_NOT_EXIST, 
subProcessNullRes.get(Constants.STATUS));
+        assertThrowsServiceException(Status.SUB_WORKFLOW_INSTANCE_NOT_EXIST,
+                () -> 
workflowInstanceService.queryParentInstanceBySubId(loginUser, projectCode, 1));
 
         // success
         
when(processService.findParentWorkflowInstance(1)).thenReturn(workflowInstance);
-        Map<String, Object> successRes = 
workflowInstanceService.queryParentInstanceBySubId(loginUser, projectCode, 1);
-        Assertions.assertEquals(Status.SUCCESS, 
successRes.get(Constants.STATUS));
+        Map<String, Integer> successRes = 
workflowInstanceService.queryParentInstanceBySubId(loginUser, projectCode, 1);
+        Assertions.assertEquals(workflowInstance.getId(), 
successRes.get(Constants.PARENT_WORKFLOW_INSTANCE));
     }
 
     @Test
@@ -748,22 +725,20 @@ public class WorkflowInstanceServiceTest {
         workflowInstance.setScheduleTime(new Date());
         workflowInstance.setGlobalParams("");
         
when(workflowInstanceMapper.queryDetailById(1)).thenReturn(workflowInstance);
-        Map<String, Object> successRes = 
workflowInstanceService.viewVariables(loginUser, projectCode, 1);
-
-        Assertions.assertEquals(Status.SUCCESS, 
successRes.get(Constants.STATUS));
+        WorkflowInstanceVariablesDTO successRes = 
workflowInstanceService.viewVariables(loginUser, projectCode, 1);
+        Assertions.assertNotNull(successRes);
 
         when(workflowInstanceMapper.queryDetailById(1)).thenReturn(null);
-        Map<String, Object> processNotExist = 
workflowInstanceService.viewVariables(loginUser, projectCode, 1);
-        Assertions.assertEquals(Status.WORKFLOW_INSTANCE_NOT_EXIST, 
processNotExist.get(Constants.STATUS));
+        assertThrowsServiceException(Status.WORKFLOW_INSTANCE_NOT_EXIST,
+                () -> workflowInstanceService.viewVariables(loginUser, 
projectCode, 1));
 
         // project auth fail
         doThrow(new ServiceException(Status.USER_NO_OPERATION_PROJECT_PERM,
                 loginUser.getUserName(), projectCode))
                         .when(projectService)
                         .checkProjectAndAuthThrowException(loginUser, 
projectCode, WORKFLOW_INSTANCE);
-        ServiceException exception = assertThrows(ServiceException.class,
+        assertThrowsServiceException(Status.USER_NO_OPERATION_PROJECT_PERM,
                 () -> workflowInstanceService.viewVariables(loginUser, 
projectCode, 1));
-        
Assertions.assertEquals(Status.USER_NO_OPERATION_PROJECT_PERM.getCode(), 
exception.getCode());
     }
 
     @Test
@@ -793,14 +768,9 @@ public class WorkflowInstanceServiceTest {
         workflowDefinition.setProjectCode(1L);
         
when(workflowDefinitionMapper.queryByCode(100L)).thenReturn(workflowDefinition);
 
-        Map<String, Object> result = 
workflowInstanceService.viewVariables(loginUser, projectCode, 1);
-
-        Assertions.assertEquals(Status.SUCCESS, result.get(Constants.STATUS));
-
-        Map<String, Object> dataList = (Map<String, Object>) 
result.get(Constants.DATA_LIST);
-        Assertions.assertNotNull(dataList);
+        WorkflowInstanceVariablesDTO result = 
workflowInstanceService.viewVariables(loginUser, projectCode, 1);
 
-        List<Property> globalParams = (List<Property>) 
dataList.get(Constants.GLOBAL_PARAMS);
+        List<Property> globalParams = result.getGlobalParams();
         Assertions.assertNotNull(globalParams);
         Assertions.assertEquals(2, globalParams.size());
 
@@ -828,10 +798,8 @@ public class WorkflowInstanceServiceTest {
 
         when(workflowInstanceMapper.queryDetailById(999)).thenReturn(null);
 
-        Map<String, Object> result = 
workflowInstanceService.viewVariables(loginUser, projectCode, 999);
-
-        Assertions.assertEquals(Status.WORKFLOW_INSTANCE_NOT_EXIST, 
result.get(Constants.STATUS));
-        Assertions.assertNull(result.get(Constants.DATA_LIST));
+        assertThrowsServiceException(Status.WORKFLOW_INSTANCE_NOT_EXIST,
+                () -> workflowInstanceService.viewVariables(loginUser, 
projectCode, 999));
     }
 
     @Test
@@ -855,12 +823,9 @@ public class WorkflowInstanceServiceTest {
         workflowDefinition.setProjectCode(1L);
         
when(workflowDefinitionMapper.queryByCode(101L)).thenReturn(workflowDefinition);
 
-        Map<String, Object> result = 
workflowInstanceService.viewVariables(loginUser, projectCode, 2);
-
-        Assertions.assertEquals(Status.SUCCESS, result.get(Constants.STATUS));
+        WorkflowInstanceVariablesDTO result = 
workflowInstanceService.viewVariables(loginUser, projectCode, 2);
 
-        Map<String, Object> dataList = (Map<String, Object>) 
result.get(Constants.DATA_LIST);
-        List<Property> globalParams = (List<Property>) 
dataList.get(Constants.GLOBAL_PARAMS);
+        List<Property> globalParams = result.getGlobalParams();
         Assertions.assertTrue(globalParams.isEmpty(), "Global params list 
should be empty when input is empty string");
     }
 
@@ -888,21 +853,19 @@ public class WorkflowInstanceServiceTest {
         when(processService.genDagGraph(Mockito.any(WorkflowDefinition.class)))
                 .thenReturn(graph);
 
-        Map<String, Object> successRes = 
workflowInstanceService.viewGantt(loginUser, projectCode, 1);
-        Assertions.assertEquals(Status.SUCCESS, 
successRes.get(Constants.STATUS));
+        Assertions.assertNotNull(workflowInstanceService.viewGantt(loginUser, 
projectCode, 1));
 
         when(workflowInstanceMapper.queryDetailById(1)).thenReturn(null);
-        Map<String, Object> processNotExist = 
workflowInstanceService.viewGantt(loginUser, projectCode, 1);
-        Assertions.assertEquals(Status.WORKFLOW_INSTANCE_NOT_EXIST, 
processNotExist.get(Constants.STATUS));
+        assertThrowsServiceException(Status.WORKFLOW_INSTANCE_NOT_EXIST,
+                () -> workflowInstanceService.viewGantt(loginUser, 
projectCode, 1));
 
         // project auth fail
         doThrow(new ServiceException(Status.USER_NO_OPERATION_PROJECT_PERM,
                 loginUser.getUserName(), projectCode))
                         .when(projectService)
                         .checkProjectAndAuthThrowException(loginUser, 
projectCode, WORKFLOW_INSTANCE);
-        ServiceException exception = assertThrows(ServiceException.class,
+        assertThrowsServiceException(Status.USER_NO_OPERATION_PROJECT_PERM,
                 () -> workflowInstanceService.viewGantt(loginUser, 
projectCode, 1));
-        
Assertions.assertEquals(Status.USER_NO_OPERATION_PROJECT_PERM.getCode(), 
exception.getCode());
     }
 
     @Test
@@ -927,8 +890,7 @@ public class WorkflowInstanceServiceTest {
         
workflowInstance.setCommandParam(JSONUtils.toJsonString(runWorkflowCommandParam));
 
         
when(workflowInstanceMapper.queryDetailById(1)).thenReturn(workflowInstance);
-        Map<String, Object> successRes = 
workflowInstanceService.viewVariables(loginUser, projectCode, 1);
-        Assertions.assertEquals(Status.SUCCESS, 
successRes.get(Constants.STATUS));
+        
Assertions.assertNotNull(workflowInstanceService.viewVariables(loginUser, 
projectCode, 1));
 
         final RunWorkflowCommandParam commandParamWithEmptyTimeZone = 
RunWorkflowCommandParam.builder()
                 .commandParams(Lists.newArrayList(Property.builder()
@@ -941,9 +903,7 @@ public class WorkflowInstanceServiceTest {
         workflowInstance.setCommandType(CommandType.SCHEDULER);
         workflowInstance.setScheduleTime(new Date());
         
workflowInstance.setCommandParam(JSONUtils.toJsonString(commandParamWithEmptyTimeZone));
-        Map<String, Object> successRes2 = 
workflowInstanceService.viewVariables(loginUser, projectCode, 1);
-        Assertions.assertEquals(Status.SUCCESS, 
successRes2.get(Constants.STATUS));
-
+        
Assertions.assertNotNull(workflowInstanceService.viewVariables(loginUser, 
projectCode, 1));
     }
 
     /**
@@ -1038,13 +998,4 @@ public class WorkflowInstanceServiceTest {
         taskInstance.setExecutorId(-1);
         return taskInstance;
     }
-
-    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());
-        }
-    }
 }

Reply via email to