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

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


The following commit(s) were added to refs/heads/json_split_two by this push:
     new c386b64  [Feature][JsonSplit-api] copy of processDefinition (#5740)
c386b64 is described below

commit c386b6450008b6bee69c41445aed362be3badeaf
Author: JinyLeeChina <[email protected]>
AuthorDate: Sat Jul 3 14:10:16 2021 +0800

    [Feature][JsonSplit-api] copy of processDefinition (#5740)
    
    * select-by-code of processDefinition
    
    * fix ut
    
    * prcessDefinition copy
    
    Co-authored-by: JinyLeeChina <[email protected]>
---
 .../controller/ProcessDefinitionController.java    |  16 +-
 .../api/controller/ProjectController.java          |  28 +--
 .../apache/dolphinscheduler/api/enums/Status.java  |   4 +-
 .../api/service/ProcessDefinitionService.java      |   8 +-
 .../service/impl/ProcessDefinitionServiceImpl.java | 219 +++++++----------
 .../ProcessDefinitionControllerTest.java           |   9 +-
 .../api/controller/ProjectControllerTest.java      | 272 ++++++++-------------
 .../api/service/ProcessDefinitionServiceTest.java  |  32 ++-
 .../apache/dolphinscheduler/common/Constants.java  |   4 +
 .../dao/entity/ProcessDefinition.java              |  37 +++
 .../service/process/ProcessService.java            |  28 +--
 11 files changed, 273 insertions(+), 384 deletions(-)

diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProcessDefinitionController.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProcessDefinitionController.java
index 55a7ea4..b2f5dbc 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProcessDefinitionController.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProcessDefinitionController.java
@@ -136,14 +136,14 @@ public class ProcessDefinitionController extends 
BaseController {
      *
      * @param loginUser login user
      * @param projectName project name
-     * @param processDefinitionIds process definition ids
-     * @param targetProjectId target project id
+     * @param processDefinitionCodes process definition codes
+     * @param targetProjectName target project name
      * @return copy result code
      */
-    @ApiOperation(value = "copyProcessDefinition", notes = 
"COPY_PROCESS_DEFINITION_NOTES")
+    @ApiOperation(value = "copy", notes = "COPY_PROCESS_DEFINITION_NOTES")
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "processDefinitionIds", value = 
"PROCESS_DEFINITION_IDS", required = true, dataType = "String", example = 
"3,4"),
-            @ApiImplicitParam(name = "targetProjectId", value = 
"TARGET_PROJECT_ID", required = true, dataType = "Int", example = "10")
+            @ApiImplicitParam(name = "processDefinitionCodes", value = 
"PROCESS_DEFINITION_CODES", required = true, dataType = "String", example = 
"3,4"),
+            @ApiImplicitParam(name = "targetProjectName", value = 
"TARGET_PROJECT_NAME", required = true, dataType = "String", example = "ddd")
     })
     @PostMapping(value = "/copy")
     @ResponseStatus(HttpStatus.OK)
@@ -151,10 +151,10 @@ public class ProcessDefinitionController extends 
BaseController {
     @AccessLogAnnotation(ignoreRequestArgs = "loginUser")
     public Result copyProcessDefinition(@ApiIgnore @RequestAttribute(value = 
Constants.SESSION_USER) User loginUser,
                                         @ApiParam(name = "projectName", value 
= "PROJECT_NAME", required = true) @PathVariable String projectName,
-                                        @RequestParam(value = 
"processDefinitionIds", required = true) String processDefinitionIds,
-                                        @RequestParam(value = 
"targetProjectId", required = true) int targetProjectId) {
+                                        @RequestParam(value = 
"processDefinitionCodes", required = true) String processDefinitionCodes,
+                                        @RequestParam(value = 
"targetProjectName", required = true) String targetProjectName) {
         return returnDataList(
-                processDefinitionService.batchCopyProcessDefinition(loginUser, 
projectName, processDefinitionIds, targetProjectId));
+                processDefinitionService.batchCopyProcessDefinition(loginUser, 
projectName, processDefinitionCodes, targetProjectName));
     }
 
     /**
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProjectController.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProjectController.java
index 6279305..76f9090 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProjectController.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/ProjectController.java
@@ -23,7 +23,7 @@ import static 
org.apache.dolphinscheduler.api.enums.Status.IMPORT_PROCESS_DEFINE
 import static 
org.apache.dolphinscheduler.api.enums.Status.LOGIN_USER_QUERY_PROJECT_LIST_PAGING_ERROR;
 import static 
org.apache.dolphinscheduler.api.enums.Status.QUERY_AUTHORIZED_AND_USER_CREATED_PROJECT_ERROR;
 import static 
org.apache.dolphinscheduler.api.enums.Status.QUERY_AUTHORIZED_PROJECT;
-import static 
org.apache.dolphinscheduler.api.enums.Status.QUERY_PROJECT_DETAILS_BY_ID_ERROR;
+import static 
org.apache.dolphinscheduler.api.enums.Status.QUERY_PROJECT_DETAILS_BY_CODE_ERROR;
 import static 
org.apache.dolphinscheduler.api.enums.Status.QUERY_UNAUTHORIZED_PROJECT_ERROR;
 import static 
org.apache.dolphinscheduler.api.enums.Status.UPDATE_PROJECT_ERROR;
 
@@ -73,7 +73,7 @@ public class ProjectController extends BaseController {
     /**
      * create project
      *
-     * @param loginUser   login user
+     * @param loginUser login user
      * @param projectName project name
      * @param description description
      * @return returns an error if it exists
@@ -97,8 +97,8 @@ public class ProjectController extends BaseController {
     /**
      * update project
      *
-     * @param loginUser   login user
-     * @param projectCode   project code
+     * @param loginUser login user
+     * @param projectCode project code
      * @param projectName project name
      * @param description description
      * @return update result code
@@ -136,10 +136,10 @@ public class ProjectController extends BaseController {
     })
     @GetMapping(value = "/query-by-code")
     @ResponseStatus(HttpStatus.OK)
-    @ApiException(QUERY_PROJECT_DETAILS_BY_ID_ERROR)
+    @ApiException(QUERY_PROJECT_DETAILS_BY_CODE_ERROR)
     @AccessLogAnnotation(ignoreRequestArgs = "loginUser")
-    public Result queryProjectById(@ApiIgnore @RequestAttribute(value = 
Constants.SESSION_USER) User loginUser,
-                                   @RequestParam("projectCode") Long 
projectCode) {
+    public Result queryProjectByCode(@ApiIgnore @RequestAttribute(value = 
Constants.SESSION_USER) User loginUser,
+                                     @RequestParam("projectCode") Long 
projectCode) {
         Map<String, Object> result = projectService.queryByCode(loginUser, 
projectCode);
         return returnDataList(result);
     }
@@ -149,8 +149,8 @@ public class ProjectController extends BaseController {
      *
      * @param loginUser login user
      * @param searchVal search value
-     * @param pageSize  page size
-     * @param pageNo    page number
+     * @param pageSize page size
+     * @param pageNo page number
      * @return project list which the login user have permission to see
      */
     @ApiOperation(value = "queryProjectListPaging", notes = 
"QUERY_PROJECT_LIST_PAGING_NOTES")
@@ -201,7 +201,7 @@ public class ProjectController extends BaseController {
      * query unauthorized project
      *
      * @param loginUser login user
-     * @param userId    user id
+     * @param userId user id
      * @return the projects which user have not permission to see
      */
     @ApiOperation(value = "queryUnauthorizedProject", notes = 
"QUERY_UNAUTHORIZED_PROJECT_NOTES")
@@ -223,7 +223,7 @@ public class ProjectController extends BaseController {
      * query authorized project
      *
      * @param loginUser login user
-     * @param userId    user id
+     * @param userId user id
      * @return projects which the user have permission to see, Except for 
items created by this user
      */
     @ApiOperation(value = "queryAuthorizedProject", notes = 
"QUERY_AUTHORIZED_PROJECT_NOTES")
@@ -259,13 +259,13 @@ public class ProjectController extends BaseController {
     /**
      * import process definition
      *
-     * @param loginUser   login user
-     * @param file        resource file
+     * @param loginUser login user
+     * @param file resource file
      * @param projectName project name
      * @return import result code
      */
 
-    @ApiOperation(value = "importProcessDefinition", notes= 
"EXPORT_PROCESS_DEFINITION_NOTES")
+    @ApiOperation(value = "importProcessDefinition", notes = 
"EXPORT_PROCESS_DEFINITION_NOTES")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "file", value = "RESOURCE_FILE", required 
= true, dataType = "MultipartFile")
     })
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
index 9e06558..268dd8e 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/enums/Status.java
@@ -74,7 +74,7 @@ public enum Status {
     LIST_WORKERS_ERROR(10044, "list workers error", "查询worker列表错误"),
     LIST_MASTERS_ERROR(10045, "list masters error", "查询master列表错误"),
     UPDATE_PROJECT_ERROR(10046, "update project error", "更新项目信息错误"),
-    QUERY_PROJECT_DETAILS_BY_ID_ERROR(10047, "query project details by id 
error", "查询项目详细信息错误"),
+    QUERY_PROJECT_DETAILS_BY_CODE_ERROR(10047, "query project details by code 
error", "查询项目详细信息错误"),
     CREATE_PROJECT_ERROR(10048, "create project error", "创建项目错误"),
     LOGIN_USER_QUERY_PROJECT_LIST_PAGING_ERROR(10049, "login user query 
project list paging error", "分页查询项目列表错误"),
     DELETE_PROJECT_ERROR(10050, "delete project error", "删除项目错误"),
@@ -189,7 +189,7 @@ public enum Status {
     DELETE_PROCESS_DEFINITION_VERSION_ERROR(10156, "delete process definition 
version error", "删除工作流历史版本出错"),
 
     QUERY_USER_CREATED_PROJECT_ERROR(10157, "query user created project error 
error", "查询用户创建的项目错误"),
-    PROCESS_DEFINITION_IDS_IS_EMPTY(10158, "process definition ids is empty", 
"工作流IDS不能为空"),
+    PROCESS_DEFINITION_CODES_IS_EMPTY(10158, "process definition codes is 
empty", "工作流CODES不能为空"),
     BATCH_COPY_PROCESS_DEFINITION_ERROR(10159, "batch copy process definition 
error", "复制工作流错误"),
     BATCH_MOVE_PROCESS_DEFINITION_ERROR(10160, "batch move process definition 
error", "移动工作流错误"),
     QUERY_WORKFLOW_LINEAGE_ERROR(10161, "query workflow lineage error", 
"查询血缘失败"),
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionService.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionService.java
index 045a920..7ae7953 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionService.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionService.java
@@ -120,13 +120,13 @@ public interface ProcessDefinitionService {
      *
      * @param loginUser loginUser
      * @param projectName projectName
-     * @param processDefinitionIds processDefinitionIds
-     * @param targetProjectId targetProjectId
+     * @param processDefinitionCodes processDefinitionCodes
+     * @param targetProjectName targetProjectName
      */
     Map<String, Object> batchCopyProcessDefinition(User loginUser,
                                                    String projectName,
-                                                   String processDefinitionIds,
-                                                   int targetProjectId);
+                                                   String 
processDefinitionCodes,
+                                                   String targetProjectName);
 
     /**
      * batch move process definition
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java
index 907c7c3..3617639 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProcessDefinitionServiceImpl.java
@@ -67,6 +67,7 @@ import org.apache.dolphinscheduler.dao.entity.Tenant;
 import org.apache.dolphinscheduler.dao.entity.User;
 import org.apache.dolphinscheduler.dao.mapper.ProcessDefinitionLogMapper;
 import org.apache.dolphinscheduler.dao.mapper.ProcessDefinitionMapper;
+import org.apache.dolphinscheduler.dao.mapper.ProcessTaskRelationLogMapper;
 import org.apache.dolphinscheduler.dao.mapper.ProcessTaskRelationMapper;
 import org.apache.dolphinscheduler.dao.mapper.ProjectMapper;
 import org.apache.dolphinscheduler.dao.mapper.ScheduleMapper;
@@ -107,7 +108,6 @@ import org.springframework.web.multipart.MultipartFile;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -158,6 +158,9 @@ public class ProcessDefinitionServiceImpl extends 
BaseServiceImpl implements Pro
     private ProcessTaskRelationMapper processTaskRelationMapper;
 
     @Autowired
+    private ProcessTaskRelationLogMapper processTaskRelationLogMapper;
+
+    @Autowired
     TaskDefinitionLogMapper taskDefinitionLogMapper;
 
     @Autowired
@@ -194,14 +197,11 @@ public class ProcessDefinitionServiceImpl extends 
BaseServiceImpl implements Pro
                                                        String tenantCode,
                                                        String 
taskRelationJson) {
 
-        Map<String, Object> result = new HashMap<>();
-        Project project = projectMapper.queryByName(projectName);
-        // check project auth
-        Map<String, Object> checkResult = 
projectService.checkProjectAndAuth(loginUser, project, projectName);
-        Status resultStatus = (Status) checkResult.get(Constants.STATUS);
-        if (resultStatus != Status.SUCCESS) {
-            return checkResult;
+        Map<String, Object> result = checkProjectAndAuth(loginUser, 
projectName);
+        if (result.get(Constants.STATUS) != Status.SUCCESS) {
+            return result;
         }
+        long projectCode = (long) result.get(Constants.PROJECT_CODE);
 
         List<ProcessTaskRelationLog> taskRelationList = 
JSONUtils.toList(taskRelationJson, ProcessTaskRelationLog.class);
         Map<String, Object> checkRelationJson = 
checkTaskRelationList(taskRelationList, taskRelationJson);
@@ -222,16 +222,23 @@ public class ProcessDefinitionServiceImpl extends 
BaseServiceImpl implements Pro
             putMsg(result, Status.CREATE_PROCESS_DEFINITION);
             return result;
         }
+        ProcessDefinition processDefinition = new 
ProcessDefinition(projectCode, name, processDefinitionCode, description,
+                globalParams, locations, connects, timeout, loginUser.getId(), 
tenant.getId());
 
-        int insertVersion = processService.saveProcessDefine(loginUser, 
project, name, description, globalParams,
-                locations, connects, timeout, tenant.getId(), 
processDefinitionCode, 0, true);
+        return createProcessDefine(loginUser, result, taskRelationList, 
processDefinition);
+    }
 
+    private Map<String, Object> createProcessDefine(User loginUser,
+                                                    Map<String, Object> result,
+                                                    
List<ProcessTaskRelationLog> taskRelationList,
+                                                    ProcessDefinition 
processDefinition) {
+        int insertVersion = processService.saveProcessDefine(loginUser, 
processDefinition, true);
         if (insertVersion > 0) {
-            int insertResult = processService.saveTaskRelation(loginUser, 
project.getCode(), processDefinitionCode, insertVersion, taskRelationList);
+            int insertResult = processService.saveTaskRelation(loginUser, 
processDefinition.getProjectCode(), processDefinition.getCode(), insertVersion, 
taskRelationList);
             if (insertResult > 0) {
                 putMsg(result, Status.SUCCESS);
                 // return processDefinitionCode
-                result.put(Constants.DATA_LIST, processDefinitionCode);
+                result.put(Constants.DATA_LIST, processDefinition.getCode());
             } else {
                 putMsg(result, Status.CREATE_PROCESS_DEFINITION);
             }
@@ -282,17 +289,11 @@ public class ProcessDefinitionServiceImpl extends 
BaseServiceImpl implements Pro
      */
     @Override
     public Map<String, Object> queryProcessDefinitionList(User loginUser, 
String projectName) {
-
-        HashMap<String, Object> result = new HashMap<>();
-        Project project = projectMapper.queryByName(projectName);
-
-        Map<String, Object> checkResult = 
projectService.checkProjectAndAuth(loginUser, project, projectName);
-        Status resultStatus = (Status) checkResult.get(Constants.STATUS);
-        if (resultStatus != Status.SUCCESS) {
-            return checkResult;
+        Map<String, Object> result = checkProjectAndAuth(loginUser, 
projectName);
+        if (result.get(Constants.STATUS) != Status.SUCCESS) {
+            return result;
         }
-
-        List<ProcessDefinition> resourceList = 
processDefinitionMapper.queryAllDefinitionList(project.getCode());
+        List<ProcessDefinition> resourceList = 
processDefinitionMapper.queryAllDefinitionList((long) 
result.get(Constants.PROJECT_CODE));
 
         resourceList.forEach(processDefinition -> {
             ProcessData processData = 
processService.genProcessData(processDefinition);
@@ -387,17 +388,12 @@ public class ProcessDefinitionServiceImpl extends 
BaseServiceImpl implements Pro
 
     @Override
     public Map<String, Object> queryProcessDefinitionByName(User loginUser, 
String projectName, String processDefinitionName) {
-
-        Map<String, Object> result = new HashMap<>();
-        Project project = projectMapper.queryByName(projectName);
-
-        Map<String, Object> checkResult = 
projectService.checkProjectAndAuth(loginUser, project, projectName);
-        Status resultStatus = (Status) checkResult.get(Constants.STATUS);
-        if (resultStatus != Status.SUCCESS) {
-            return checkResult;
+        Map<String, Object> result = checkProjectAndAuth(loginUser, 
projectName);
+        if (result.get(Constants.STATUS) != Status.SUCCESS) {
+            return result;
         }
-
-        ProcessDefinition processDefinition = 
processDefinitionMapper.queryByDefineName(project.getCode(), 
processDefinitionName);
+        long projectCode = (long) result.get(Constants.PROJECT_CODE);
+        ProcessDefinition processDefinition = 
processDefinitionMapper.queryByDefineName(projectCode, processDefinitionName);
 
         if (processDefinition == null) {
             putMsg(result, Status.PROCESS_DEFINE_NOT_EXIST, 
processDefinitionName);
@@ -438,14 +434,11 @@ public class ProcessDefinitionServiceImpl extends 
BaseServiceImpl implements Pro
                                                        int timeout,
                                                        String tenantCode,
                                                        String 
taskRelationJson) {
-        Map<String, Object> result = new HashMap<>();
-
-        Project project = projectMapper.queryByName(projectName);
-        Map<String, Object> checkResult = 
projectService.checkProjectAndAuth(loginUser, project, projectName);
-        Status resultStatus = (Status) checkResult.get(Constants.STATUS);
-        if (resultStatus != Status.SUCCESS) {
-            return checkResult;
+        Map<String, Object> result = checkProjectAndAuth(loginUser, 
projectName);
+        if (result.get(Constants.STATUS) != Status.SUCCESS) {
+            return result;
         }
+        long projectCode = (long) result.get(Constants.PROJECT_CODE);
 
         List<ProcessTaskRelationLog> taskRelationList = 
JSONUtils.toList(taskRelationJson, ProcessTaskRelationLog.class);
         Map<String, Object> checkRelationJson = 
checkTaskRelationList(taskRelationList, taskRelationJson);
@@ -471,10 +464,11 @@ public class ProcessDefinitionServiceImpl extends 
BaseServiceImpl implements Pro
             return result;
         }
 
-        int insertVersion = processService.saveProcessDefine(loginUser, 
project, name, description, globalParams,
-                locations, connects, timeout, tenant.getId(), code, 
processDefinition.getId(), true);
+        processDefinition.set(projectCode, name, description, globalParams, 
locations, connects, timeout, tenant.getId());
+        processDefinition.setUpdateTime(new Date());
+        int insertVersion = processService.saveProcessDefine(loginUser, 
processDefinition, true);
         if (insertVersion > 0) {
-            int insertResult = processService.saveTaskRelation(loginUser, 
project.getCode(), code, insertVersion, taskRelationList);
+            int insertResult = processService.saveTaskRelation(loginUser, 
projectCode, code, insertVersion, taskRelationList);
             if (insertResult > 0) {
                 putMsg(result, Status.SUCCESS);
                 result.put(Constants.DATA_LIST, processDefinition);
@@ -1453,51 +1447,24 @@ public class ProcessDefinitionServiceImpl extends 
BaseServiceImpl implements Pro
     }
 
     private Map<String, Object> copyProcessDefinition(User loginUser,
-                                                      Integer processId,
-                                                      Project targetProject) 
throws JsonProcessingException {
+                                                      Long processCode,
+                                                      long targetProjectCode) {
 
         Map<String, Object> result = new HashMap<>();
-        String currentTimeStamp = DateUtils.getCurrentTimeStamp();
-        ProcessDefinition processDefinition = 
processDefinitionMapper.selectById(processId);
+        ProcessDefinition processDefinition = 
processDefinitionMapper.queryByCode(processCode);
         if (processDefinition == null) {
-            putMsg(result, Status.PROCESS_DEFINE_NOT_EXIST, processId);
+            putMsg(result, Status.PROCESS_DEFINE_NOT_EXIST, processCode);
             return result;
-        } else {
-            ProcessData processData = 
processService.genProcessData(processDefinition);
-            List<TaskNode> taskNodeList = processData.getTasks();
-            String locations = processDefinition.getLocations();
-            ObjectNode locationsJN = JSONUtils.parseObject(locations);
-
-            for (TaskNode taskNode : taskNodeList) {
-                String suffix = "_copy_" + currentTimeStamp;
-                String id = taskNode.getId();
-                String newName = locationsJN.path(id).path("name").asText() + 
suffix;
-                ((ObjectNode) locationsJN.get(id)).put("name", newName);
-
-                List<String> depList = taskNode.getDepList();
-                List<String> newDepList = depList.stream()
-                        .map(s -> s + suffix)
-                        .collect(Collectors.toList());
-
-                taskNode.setDepList(newDepList);
-                taskNode.setName(taskNode.getName() + suffix);
-                taskNode.setCode(0L);
-            }
-            processData.setTasks(taskNodeList);
-            String processDefinitionJson = JSONUtils.toJsonString(processData);
-            // TODO copy process
-            // return createProcessDefinition(
-            //       loginUser,
-            //       targetProject.getName(),
-            //       processDefinition.getName() + "_copy_" + currentTimeStamp,
-            //       processDefinitionJson,
-            //       processDefinition.getDescription(),
-            //       locationsJN.toString(),
-            //       processDefinition.getConnects());
-            // TODO remove
+        }
+        List<ProcessTaskRelationLog> taskRelationList =
+                
processTaskRelationLogMapper.queryByProcessCodeAndVersion(processDefinition.getCode(),
 processDefinition.getVersion());
+        if (taskRelationList.isEmpty()) {
+            putMsg(result, Status.PROCESS_TASK_RELATION_NOT_EXIST, 
processCode);
             return result;
-
         }
+        processDefinition.setName(processDefinition.getName() + "_copy_" + 
DateUtils.getCurrentTimeStamp());
+        processDefinition.setProjectCode(targetProjectCode);
+        return createProcessDefine(loginUser, result, taskRelationList, 
processDefinition);
     }
 
     /**
@@ -1505,45 +1472,37 @@ public class ProcessDefinitionServiceImpl extends 
BaseServiceImpl implements Pro
      *
      * @param loginUser loginUser
      * @param projectName projectName
-     * @param processDefinitionIds processDefinitionIds
-     * @param targetProjectId targetProjectId
+     * @param processDefinitionCodes processDefinitionCodes
+     * @param targetProjectName targetProjectName
      */
     @Override
     public Map<String, Object> batchCopyProcessDefinition(User loginUser,
                                                           String projectName,
-                                                          String 
processDefinitionIds,
-                                                          int targetProjectId) 
{
-        Map<String, Object> result = new HashMap<>();
+                                                          String 
processDefinitionCodes,
+                                                          String 
targetProjectName) {
         List<String> failedProcessList = new ArrayList<>();
-
-        if (StringUtils.isEmpty(processDefinitionIds)) {
-            putMsg(result, Status.PROCESS_DEFINITION_IDS_IS_EMPTY, 
processDefinitionIds);
-            return result;
-        }
-
         //check src project auth
-        Map<String, Object> checkResult = checkProjectAndAuth(loginUser, 
projectName);
-        if (checkResult != null) {
-            return checkResult;
+        Map<String, Object> result = checkProjectAndAuth(loginUser, 
projectName);
+        if (result.get(Constants.STATUS) != Status.SUCCESS) {
+            return result;
         }
-
-        Project targetProject = projectMapper.queryDetailById(targetProjectId);
-        if (targetProject == null) {
-            putMsg(result, Status.PROJECT_NOT_FOUNT, targetProjectId);
+        if (StringUtils.isEmpty(processDefinitionCodes)) {
+            putMsg(result, Status.PROCESS_DEFINITION_CODES_IS_EMPTY, 
processDefinitionCodes);
             return result;
         }
-
-        if (!(targetProject.getName()).equals(projectName)) {
-            Map<String, Object> checkTargetProjectResult = 
checkProjectAndAuth(loginUser, targetProject.getName());
-            if (checkTargetProjectResult != null) {
+        long targetProjectCode = 0L;
+        if (!(targetProjectName).equals(projectName)) {
+            Map<String, Object> checkTargetProjectResult = 
checkProjectAndAuth(loginUser, targetProjectName);
+            if (checkTargetProjectResult.get(Constants.STATUS) != 
Status.SUCCESS) {
                 return checkTargetProjectResult;
+            } else {
+                targetProjectCode = (long) 
checkTargetProjectResult.get(Constants.PROJECT_CODE);
             }
         }
 
-        String[] processDefinitionIdList = 
processDefinitionIds.split(Constants.COMMA);
-        doBatchCopyProcessDefinition(loginUser, targetProject, 
failedProcessList, processDefinitionIdList);
-
-        checkBatchOperateResult(projectName, targetProject.getName(), result, 
failedProcessList, true);
+        String[] processDefinitionCodeList = 
processDefinitionCodes.split(Constants.COMMA);
+        doBatchCopyProcessDefinition(loginUser, targetProjectCode, 
failedProcessList, processDefinitionCodeList);
+        checkBatchOperateResult(projectName, targetProjectName, result, 
failedProcessList, true);
 
         return result;
     }
@@ -1561,16 +1520,15 @@ public class ProcessDefinitionServiceImpl extends 
BaseServiceImpl implements Pro
                                                           String projectName,
                                                           String 
processDefinitionIds,
                                                           int targetProjectId) 
{
-        Map<String, Object> result = new HashMap<>();
         List<String> failedProcessList = new ArrayList<>();
         //check src project auth
-        Map<String, Object> checkResult = checkProjectAndAuth(loginUser, 
projectName);
-        if (checkResult != null) {
-            return checkResult;
+        Map<String, Object> result = checkProjectAndAuth(loginUser, 
projectName);
+        if (result.get(Constants.STATUS) != Status.SUCCESS) {
+            return result;
         }
 
         if (StringUtils.isEmpty(processDefinitionIds)) {
-            putMsg(result, Status.PROCESS_DEFINITION_IDS_IS_EMPTY, 
processDefinitionIds);
+            putMsg(result, Status.PROCESS_DEFINITION_CODES_IS_EMPTY, 
processDefinitionIds);
             return result;
         }
 
@@ -1697,23 +1655,21 @@ public class ProcessDefinitionServiceImpl extends 
BaseServiceImpl implements Pro
      * batch copy process definition
      *
      * @param loginUser loginUser
-     * @param targetProject targetProject
+     * @param targetProjectCode targetProjectCode
      * @param failedProcessList failedProcessList
-     * @param processDefinitionIdList processDefinitionIdList
+     * @param processDefinitionCodeList processDefinitionCodeList
      */
-    private void doBatchCopyProcessDefinition(User loginUser, Project 
targetProject, List<String> failedProcessList, String[] 
processDefinitionIdList) {
-        for (String processDefinitionId : processDefinitionIdList) {
+    private void doBatchCopyProcessDefinition(User loginUser, long 
targetProjectCode, List<String> failedProcessList, String[] 
processDefinitionCodeList) {
+        for (String processDefinitionCode : processDefinitionCodeList) {
             try {
-                Map<String, Object> copyProcessDefinitionResult =
-                        copyProcessDefinition(loginUser, 
Integer.valueOf(processDefinitionId), targetProject);
+                Map<String, Object> copyProcessDefinitionResult = 
copyProcessDefinition(loginUser, Long.valueOf(processDefinitionCode), 
targetProjectCode);
                 if 
(!Status.SUCCESS.equals(copyProcessDefinitionResult.get(Constants.STATUS))) {
-                    setFailedProcessList(failedProcessList, 
processDefinitionId);
+                    setFailedProcessList(failedProcessList, 
processDefinitionCode);
                     logger.error((String) 
copyProcessDefinitionResult.get(Constants.MSG));
                 }
             } catch (Exception e) {
-                setFailedProcessList(failedProcessList, processDefinitionId);
+                setFailedProcessList(failedProcessList, processDefinitionCode);
                 logger.error("copy processDefinition error: {}", 
e.getMessage(), e);
-
             }
         }
     }
@@ -1741,15 +1697,12 @@ public class ProcessDefinitionServiceImpl extends 
BaseServiceImpl implements Pro
      */
     private Map<String, Object> checkProjectAndAuth(User loginUser, String 
projectName) {
         Project project = projectMapper.queryByName(projectName);
-
         //check user access for project
-        Map<String, Object> checkResult = 
projectService.checkProjectAndAuth(loginUser, project, projectName);
-        Status resultStatus = (Status) checkResult.get(Constants.STATUS);
-
-        if (resultStatus != Status.SUCCESS) {
-            return checkResult;
+        Map<String, Object> result = 
projectService.checkProjectAndAuth(loginUser, project, projectName);
+        if (result.get(Constants.STATUS) == Status.SUCCESS) {
+            result.put(Constants.PROJECT_CODE, project.getCode());
         }
-        return null;
+        return result;
     }
 
     /**
@@ -1811,13 +1764,9 @@ public class ProcessDefinitionServiceImpl extends 
BaseServiceImpl implements Pro
             return result;
         }
 
-        Project project = projectMapper.queryByName(projectName);
-
-        // check project auth
-        Map<String, Object> checkResult = 
projectService.checkProjectAndAuth(loginUser, project, projectName);
-        Status resultStatus = (Status) checkResult.get(Constants.STATUS);
-        if (resultStatus != Status.SUCCESS) {
-            return checkResult;
+        result = checkProjectAndAuth(loginUser, projectName);
+        if (result.get(Constants.STATUS) != Status.SUCCESS) {
+            return result;
         }
 
         ProcessDefinition processDefinition = 
processDefinitionMapper.queryByCode(processDefinitionCode);
diff --git 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/ProcessDefinitionControllerTest.java
 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/ProcessDefinitionControllerTest.java
index e0ee1dd..98849ae 100644
--- 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/ProcessDefinitionControllerTest.java
+++ 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/ProcessDefinitionControllerTest.java
@@ -67,7 +67,6 @@ public class ProcessDefinitionControllerTest {
         loginUser.setId(1);
         loginUser.setUserType(UserType.GENERAL_USER);
         loginUser.setUserName("admin");
-
         user = loginUser;
     }
 
@@ -190,14 +189,14 @@ public class ProcessDefinitionControllerTest {
     public void testBatchCopyProcessDefinition() throws Exception {
 
         String projectName = "test";
-        int targetProjectId = 2;
-        String id = "1";
+        String targetProjectName = "test1";
+        String code = "1";
 
         Map<String, Object> result = new HashMap<>();
         putMsg(result, Status.SUCCESS);
 
-        Mockito.when(processDefinitionService.batchCopyProcessDefinition(user, 
projectName, id, targetProjectId)).thenReturn(result);
-        Result response = 
processDefinitionController.copyProcessDefinition(user, projectName, id, 
targetProjectId);
+        Mockito.when(processDefinitionService.batchCopyProcessDefinition(user, 
projectName, code, targetProjectName)).thenReturn(result);
+        Result response = 
processDefinitionController.copyProcessDefinition(user, projectName, code, 
targetProjectName);
 
         Assert.assertTrue(response != null && response.isSuccess());
     }
diff --git 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/ProjectControllerTest.java
 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/ProjectControllerTest.java
index 0e01312..9e116ce 100644
--- 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/ProjectControllerTest.java
+++ 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/ProjectControllerTest.java
@@ -17,220 +17,140 @@
 
 package org.apache.dolphinscheduler.api.controller;
 
-import static 
org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
-import static 
org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
-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.enums.Status;
+import org.apache.dolphinscheduler.api.service.impl.ProjectServiceImpl;
+import org.apache.dolphinscheduler.api.utils.PageInfo;
 import org.apache.dolphinscheduler.api.utils.Result;
-import org.apache.dolphinscheduler.common.utils.JSONUtils;
+import org.apache.dolphinscheduler.common.Constants;
+import org.apache.dolphinscheduler.common.enums.UserType;
+import org.apache.dolphinscheduler.dao.entity.Project;
+import org.apache.dolphinscheduler.dao.entity.Resource;
+import org.apache.dolphinscheduler.dao.entity.User;
+import org.apache.dolphinscheduler.dao.mapper.ProjectMapper;
+
+import java.text.MessageFormat;
+import java.util.HashMap;
+import java.util.Map;
 
-import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.http.MediaType;
-import org.springframework.test.web.servlet.MvcResult;
-import org.springframework.util.LinkedMultiValueMap;
-import org.springframework.util.MultiValueMap;
-
-import com.fasterxml.jackson.core.type.TypeReference;
+import org.junit.runner.RunWith;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.MockitoJUnitRunner;
 
 /**
  * project controller test
  */
-public class ProjectControllerTest extends AbstractControllerTest {
-
-    private static Logger logger = 
LoggerFactory.getLogger(ProjectControllerTest.class);
-
-    private String projectCode;
-
-    @Before
-    public void before() throws Exception {
-        projectCode = testCreateProject("project_test11", "the test project");
-    }
-
-    @After
-    public void after() throws Exception {
-        testDeleteProject(projectCode);
-    }
+@RunWith(MockitoJUnitRunner.Silent.class)
+public class ProjectControllerTest {
 
-    private String testCreateProject(String projectName, String description) 
throws Exception {
+    @InjectMocks
+    private ProjectController projectController;
 
-        MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>();
-        paramsMap.add("projectName",projectName);
-        paramsMap.add("description",description);
+    @Mock
+    private ProjectServiceImpl projectService;
 
-        MvcResult mvcResult = mockMvc.perform(post("/projects/create")
-                .header(SESSION_ID, sessionId)
-                .params(paramsMap))
-                .andExpect(status().isCreated())
-                
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
-                .andReturn();
+    @Mock
+    private ProjectMapper projectMapper;
 
-        Result result = 
JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), new 
TypeReference<Result<String>>() {});
-        Assert.assertEquals(Status.SUCCESS.getCode(), 
result.getCode().intValue());
-        Assert.assertNotNull(result.getData());
-        logger.info("create project return result:{}", 
mvcResult.getResponse().getContentAsString());
+    protected User user;
 
-        return (String)result.getData();
+    @Before
+    public void before() {
+        User loginUser = new User();
+        loginUser.setId(1);
+        loginUser.setUserType(UserType.GENERAL_USER);
+        loginUser.setUserName("admin");
+        user = loginUser;
     }
 
     @Test
-    public void testUpdateProject() throws Exception {
-
-        MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>();
-        paramsMap.add("projectCode", projectCode);
-        paramsMap.add("projectName","project_test_update");
-        paramsMap.add("desc","the test project update");
-        paramsMap.add("userName", "the project owner");
-
-        MvcResult mvcResult = mockMvc.perform(post("/projects/update")
-                .header(SESSION_ID, sessionId)
-                .params(paramsMap))
-                .andExpect(status().isOk())
-                
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
-                .andReturn();
-
-        Result result = 
JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), 
Result.class);
-        
Assert.assertEquals(Status.USER_NOT_EXIST.getCode(),result.getCode().intValue());
-        logger.info("update project return result:{}", 
mvcResult.getResponse().getContentAsString());
-
+    public void testUpdateProject() {
+        Map<String, Object> result = new HashMap<>();
+        putMsg(result, Status.SUCCESS);
+        result.put("projectId", 1);
+
+        long projectCode = 1L;
+        String projectName = "test";
+        String desc = "";
+        String userName = "jack";
+        Mockito.when(projectService.update(user, projectCode, projectName, 
desc, userName)).thenReturn(result);
+        Result response = projectController.updateProject(user, projectCode, 
projectName, desc, userName);
+        Assert.assertEquals(Status.SUCCESS.getCode(), 
response.getCode().intValue());
     }
 
     @Test
-    public void testQueryProjectByCode() throws Exception {
-
-        MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>();
-        paramsMap.add("projectCode", projectCode);
-
-        MvcResult mvcResult = mockMvc.perform(get("/projects/query-by-code")
-                .header(SESSION_ID, sessionId)
-                .params(paramsMap))
-                .andExpect(status().isOk())
-                
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
-                .andReturn();
-
-        Result result = 
JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), 
Result.class);
-        Assert.assertEquals(Status.SUCCESS.getCode(), 
result.getCode().intValue());
-        logger.info(mvcResult.getResponse().getContentAsString());
-        logger.info("query project by code :{}, return result:{}", 
projectCode, mvcResult.getResponse().getContentAsString());
-
+    public void testQueryProjectByCode() {
+        Map<String, Object> result = new HashMap<>();
+        putMsg(result, Status.SUCCESS);
+        long projectCode = 1L;
+        
Mockito.when(projectMapper.queryByCode(projectCode)).thenReturn(getProject());
+        Mockito.when(projectService.queryByCode(user, 
projectCode)).thenReturn(result);
+        Result response = projectController.queryProjectByCode(user, 
projectCode);
+        Assert.assertEquals(Status.SUCCESS.getCode(), 
response.getCode().intValue());
     }
 
     @Test
-    public void testQueryProjectListPaging() throws Exception {
-
-        MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>();
-        paramsMap.add("searchVal","test");
-        paramsMap.add("pageSize","2");
-        paramsMap.add("pageNo","2");
-
-        MvcResult mvcResult = mockMvc.perform(get("/projects/list-paging")
-                .header(SESSION_ID, sessionId)
-                .params(paramsMap))
-                .andExpect(status().isOk())
-                
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
-                .andReturn();
-
-        Result result = 
JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), 
Result.class);
-        
Assert.assertEquals(Status.SUCCESS.getCode(),result.getCode().intValue());
-        logger.info("query list-paging project return result:{}", 
mvcResult.getResponse().getContentAsString());
-    }
-
-    @Test
-    public void testQueryUnauthorizedProject() throws Exception {
+    public void testQueryProjectListPaging() {
+        int pageNo = 1;
+        int pageSize = 10;
+        String searchVal = "";
 
-        MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>();
-        paramsMap.add("userId","2");
+        Map<String, Object> result = new HashMap<>();
+        putMsg(result, Status.SUCCESS);
+        result.put(Constants.DATA_LIST, new PageInfo<Resource>(1, 10));
 
-        MvcResult mvcResult = mockMvc.perform(get("/projects/unauth-project")
-                .header(SESSION_ID, sessionId)
-                .params(paramsMap))
-                .andExpect(status().isOk())
-                
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
-                .andReturn();
+        Mockito.when(projectService.queryProjectListPaging(user, pageSize, 
pageNo, searchVal)).thenReturn(result);
+        Result response = projectController.queryProjectListPaging(user, 
searchVal, pageSize, pageNo);
 
-        Result result = 
JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), 
Result.class);
-        
Assert.assertEquals(Status.SUCCESS.getCode(),result.getCode().intValue());
-        logger.info("query unauth project return result:{}", 
mvcResult.getResponse().getContentAsString());
+        Assert.assertTrue(response != null && response.isSuccess());
     }
 
     @Test
-    public void testQueryAuthorizedProject() throws Exception {
-
-        MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>();
-        paramsMap.add("userId",String.valueOf(user.getId()));
-
-        MvcResult mvcResult = mockMvc.perform(get("/projects/authed-project")
-                .header(SESSION_ID, sessionId)
-                .params(paramsMap))
-                .andExpect(status().isOk())
-                
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
-                .andReturn();
-
-        Result result = 
JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), 
Result.class);
-        
Assert.assertEquals(Status.SUCCESS.getCode(),result.getCode().intValue());
-        logger.info("query authed project return result:{}", 
mvcResult.getResponse().getContentAsString());
-
+    public void testQueryUnauthorizedProject() {
+        Map<String, Object> result = new HashMap<>();
+        putMsg(result, Status.SUCCESS);
+        Mockito.when(projectService.queryUnauthorizedProject(user, 
2)).thenReturn(result);
+        Result response = projectController.queryUnauthorizedProject(user, 2);
+        Assert.assertEquals(Status.SUCCESS.getCode(), 
response.getCode().intValue());
     }
 
     @Test
-    public void testQueryAllProjectList() throws Exception {
-
-        MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>();
-
-        MvcResult mvcResult = 
mockMvc.perform(get("/projects/query-project-list")
-                .header(SESSION_ID, sessionId)
-                .params(paramsMap))
-                .andExpect(status().isOk())
-                
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
-                .andReturn();
-
-        Result result = 
JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), 
Result.class);
-        
Assert.assertEquals(Status.SUCCESS.getCode(),result.getCode().intValue());
-        logger.info("query all project return result:{}", 
mvcResult.getResponse().getContentAsString());
-
+    public void testQueryAuthorizedProject() {
+        Map<String, Object> result = new HashMap<>();
+        putMsg(result, Status.SUCCESS);
+        Mockito.when(projectService.queryAuthorizedProject(user, 
2)).thenReturn(result);
+        Result response = projectController.queryAuthorizedProject(user, 2);
+        Assert.assertEquals(Status.SUCCESS.getCode(), 
response.getCode().intValue());
     }
 
-    @Ignore
     @Test
-    public void testImportProcessDefinition() throws Exception {
-
-        MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>();
-        paramsMap.add("file","test");
-
-        MvcResult mvcResult = 
mockMvc.perform(post("/projects/import-definition")
-                .header(SESSION_ID, sessionId)
-                .params(paramsMap))
-                .andExpect(status().isOk())
-                .andExpect(content().contentType(MediaType.TEXT_PLAIN))
-                .andReturn();
-
-        Result result = 
JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), 
Result.class);
-        
Assert.assertEquals(Status.IMPORT_PROCESS_DEFINE_ERROR.getCode(),result.getCode().intValue());
-        logger.info(mvcResult.getResponse().getContentAsString());
+    public void testQueryAllProjectList() {
+        Map<String, Object> result = new HashMap<>();
+        putMsg(result, Status.SUCCESS);
+        Mockito.when(projectService.queryAllProjectList()).thenReturn(result);
+        Result response = projectController.queryAllProjectList(user);
+        Assert.assertEquals(Status.SUCCESS.getCode(), 
response.getCode().intValue());
     }
 
-    private void testDeleteProject(String projectCode) throws Exception {
-
-        MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>();
-        paramsMap.add("projectCode", projectCode);
-
-        MvcResult mvcResult = mockMvc.perform(get("/projects/delete")
-                .header(SESSION_ID, sessionId)
-                .params(paramsMap))
-                .andExpect(status().isOk())
-                
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
-                .andReturn();
-
-        Result result = 
JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), 
Result.class);
-        
Assert.assertEquals(Status.SUCCESS.getCode(),result.getCode().intValue());
-        logger.info("delete project return result:{}", 
mvcResult.getResponse().getContentAsString());
+    private Project getProject() {
+        Project project = new Project();
+        project.setCode(1L);
+        project.setId(1);
+        project.setName("test");
+        project.setUserId(1);
+        return project;
     }
 
+    private void putMsg(Map<String, Object> result, Status status, Object... 
statusParams) {
+        result.put(Constants.STATUS, status);
+        if (statusParams != null && statusParams.length > 0) {
+            result.put(Constants.MSG, MessageFormat.format(status.getMsg(), 
statusParams));
+        } else {
+            result.put(Constants.MSG, status.getMsg());
+        }
+    }
 }
diff --git 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionServiceTest.java
 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionServiceTest.java
index 8cad1ea..a0226c6 100644
--- 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionServiceTest.java
+++ 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ProcessDefinitionServiceTest.java
@@ -387,6 +387,8 @@ public class ProcessDefinitionServiceTest {
 
         //instance exit
         Mockito.when(processDefineMapper.queryByDefineName(project.getCode(), 
"test")).thenReturn(getProcessDefinition());
+        putMsg(result, Status.SUCCESS, projectName);
+        Mockito.when(projectService.checkProjectAndAuth(loginUser, project, 
projectName)).thenReturn(result);
         Map<String, Object> successRes = 
processDefinitionService.queryProcessDefinitionByName(loginUser,
                 "project_test1", "test");
         Assert.assertEquals(Status.SUCCESS, successRes.get(Constants.STATUS));
@@ -398,30 +400,32 @@ public class ProcessDefinitionServiceTest {
         String projectName = "project_test1";
         Project project = getProject(projectName);
         User loginUser = new User();
-        loginUser.setId(-1);
+        loginUser.setId(1);
         loginUser.setUserType(UserType.GENERAL_USER);
+        
Mockito.when(projectMapper.queryByName(projectName)).thenReturn(getProject(projectName));
+        Map<String, Object> result = new HashMap<>();
+        putMsg(result, Status.SUCCESS, projectName);
+        Mockito.when(projectService.checkProjectAndAuth(loginUser, project, 
projectName)).thenReturn(result);
 
         // copy project definition ids empty test
-        Map<String, Object> map = 
processDefinitionService.batchCopyProcessDefinition(loginUser, projectName, 
StringUtils.EMPTY, 0);
-        Assert.assertEquals(Status.PROCESS_DEFINITION_IDS_IS_EMPTY, 
map.get(Constants.STATUS));
+        Map<String, Object> map = 
processDefinitionService.batchCopyProcessDefinition(loginUser, projectName, 
StringUtils.EMPTY, "project_test2");
+        Assert.assertEquals(Status.PROCESS_DEFINITION_CODES_IS_EMPTY, 
map.get(Constants.STATUS));
 
-        Map<String, Object> result = new HashMap<>();
 
         // project check auth fail
         putMsg(result, Status.PROJECT_NOT_FOUNT, projectName);
-        
Mockito.when(projectMapper.queryByName(projectName)).thenReturn(getProject(projectName));
         Mockito.when(projectService.checkProjectAndAuth(loginUser, project, 
projectName)).thenReturn(result);
         Map<String, Object> map1 = 
processDefinitionService.batchCopyProcessDefinition(
-                loginUser, projectName, String.valueOf(project.getId()), 0);
+                loginUser, projectName, String.valueOf(project.getId()), 
"project_test2");
         Assert.assertEquals(Status.PROJECT_NOT_FOUNT, 
map1.get(Constants.STATUS));
 
         // project check auth success, target project is null
-        putMsg(result, Status.SUCCESS, projectName);
         
Mockito.when(projectMapper.queryByName(projectName)).thenReturn(getProject(projectName));
         Mockito.when(projectService.checkProjectAndAuth(loginUser, project, 
projectName)).thenReturn(result);
-        Mockito.when(projectMapper.queryDetailById(0)).thenReturn(null);
+        putMsg(result, Status.PROJECT_NOT_FOUNT, "project_test2");
+        Mockito.when(projectService.checkProjectAndAuth(loginUser, project, 
projectName)).thenReturn(result);
         Map<String, Object> map2 = 
processDefinitionService.batchCopyProcessDefinition(
-                loginUser, projectName, String.valueOf(project.getId()), 0);
+                loginUser, projectName, String.valueOf(project.getId()), 
"project_test2");
         Assert.assertEquals(Status.PROJECT_NOT_FOUNT, 
map2.get(Constants.STATUS));
 
         // project check auth success, target project name not equal project 
name, check auth target project fail
@@ -430,21 +434,13 @@ public class ProcessDefinitionServiceTest {
         Mockito.when(projectService.checkProjectAndAuth(loginUser, project, 
projectName)).thenReturn(result);
 
         putMsg(result, Status.SUCCESS, projectName);
-        String projectName2 = "project_test2";
-        Project project2 = getProject(projectName2);
-        
Mockito.when(projectMapper.queryByName(projectName2)).thenReturn(project2);
-        Mockito.when(projectService.checkProjectAndAuth(loginUser, project2, 
projectName2)).thenReturn(result);
-        Mockito.when(projectMapper.queryDetailById(1)).thenReturn(project2);
         // instance exit
         ProcessDefinition definition = getProcessDefinition();
         
definition.setLocations("{\"tasks-36196\":{\"name\":\"ssh_test1\",\"targetarr\":\"\",\"x\":141,\"y\":70}}");
         definition.setConnects("[]");
 
-        
Mockito.when(processDefineMapper.selectById(46)).thenReturn(definition);
-        
Mockito.when(processService.genProcessData(Mockito.any())).thenReturn(getProcessData());
-
         Map<String, Object> map3 = 
processDefinitionService.batchCopyProcessDefinition(
-                loginUser, projectName, "46", 1);
+                loginUser, projectName, "46", projectName);
         Assert.assertEquals(Status.COPY_PROCESS_DEFINITION_ERROR, 
map3.get(Constants.STATUS));
     }
 
diff --git 
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/Constants.java
 
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/Constants.java
index 59e65c5..f18cfd5 100644
--- 
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/Constants.java
+++ 
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/Constants.java
@@ -710,6 +710,10 @@ public final class Constants {
      */
     public static final String PROJECT_ID = "projectId";
     /**
+     * projectCode
+     */
+    public static final String PROJECT_CODE = "projectCode";
+    /**
      * processId
      */
     public static final String SCHEDULE_ID = "scheduleId";
diff --git 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessDefinition.java
 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessDefinition.java
index 98fe7ee..d43667c 100644
--- 
a/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessDefinition.java
+++ 
b/dolphinscheduler-dao/src/main/java/org/apache/dolphinscheduler/dao/entity/ProcessDefinition.java
@@ -190,6 +190,43 @@ public class ProcessDefinition {
 
     public ProcessDefinition(){}
 
+    public ProcessDefinition(Long projectCode,
+                             String name,
+                             Long code,
+                             String description,
+                             String globalParams,
+                             String locations,
+                             String connects,
+                             int timeout,
+                             int userId,
+                             int tenantId) {
+        set(projectCode, name, description, globalParams, connects, locations, 
timeout, tenantId);
+        this.code = code;
+        this.userId = userId;
+        Date date = new Date();
+        this.createTime = date;
+        this.updateTime = date;
+    }
+
+    public void set(long projectCode,
+                    String name,
+                    String description,
+                    String globalParams,
+                    String connects,
+                    String locations,
+                    int timeout,
+                    int tenantId) {
+        this.projectCode = projectCode;
+        this.name = name;
+        this.description = description;
+        this.globalParams = globalParams;
+        this.locations = locations;
+        this.connects = connects;
+        this.timeout = timeout;
+        this.tenantId = tenantId;
+        this.flag = Flag.YES;
+    }
+
     public String getName() {
         return name;
     }
diff --git 
a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java
 
b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java
index ddead50..618451f 100644
--- 
a/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java
+++ 
b/dolphinscheduler-service/src/main/java/org/apache/dolphinscheduler/service/process/ProcessService.java
@@ -2205,36 +2205,20 @@ public class ProcessService {
     /**
      * save processDefinition (including create or update processDefinition)
      */
-    public int saveProcessDefine(User operator, Project project, String name, 
String description, String globalParams,
-                                 String locations, String connects, int 
timeout, int tenantId, long processDefinitionCode,
-                                 int processDefinitionId, Boolean 
isFromProcessDefine) {
-        ProcessDefinitionLog processDefinitionLog = new ProcessDefinitionLog();
-        Integer version = 
processDefineLogMapper.queryMaxVersionForDefinition(processDefinitionCode);
+    public int saveProcessDefine(User operator, ProcessDefinition 
processDefinition, Boolean isFromProcessDefine) {
+        ProcessDefinitionLog processDefinitionLog = new 
ProcessDefinitionLog(processDefinition);
+        Integer version = 
processDefineLogMapper.queryMaxVersionForDefinition(processDefinition.getCode());
         int insertVersion = version == null || version == 0 ? 1 : version + 1;
-        processDefinitionLog.setUserId(operator.getId());
-        processDefinitionLog.setCode(processDefinitionCode);
         processDefinitionLog.setVersion(insertVersion);
-        processDefinitionLog.setName(name);
-        processDefinitionLog.setFlag(Flag.YES);
         processDefinitionLog.setReleaseState(isFromProcessDefine ? 
ReleaseState.OFFLINE : ReleaseState.ONLINE);
-        processDefinitionLog.setProjectCode(project.getCode());
-        processDefinitionLog.setDescription(description);
-        processDefinitionLog.setGlobalParams(globalParams);
-        processDefinitionLog.setLocations(locations);
-        processDefinitionLog.setConnects(connects);
-        processDefinitionLog.setTimeout(timeout);
-        processDefinitionLog.setTenantId(tenantId);
         processDefinitionLog.setOperator(operator.getId());
-        Date now = new Date();
-        processDefinitionLog.setOperateTime(now);
-        processDefinitionLog.setUpdateTime(now);
-        processDefinitionLog.setCreateTime(now);
+        processDefinitionLog.setOperateTime(processDefinition.getUpdateTime());
         int insertLog = processDefineLogMapper.insert(processDefinitionLog);
         int result;
-        if (0 == processDefinitionId) {
+        if (0 == processDefinition.getId()) {
             result = processDefineMapper.insert(processDefinitionLog);
         } else {
-            processDefinitionLog.setId(processDefinitionId);
+            processDefinitionLog.setId(processDefinition.getId());
             result = processDefineMapper.updateById(processDefinitionLog);
         }
         return (insertLog & result) > 0 ? insertVersion : 0;

Reply via email to