Browse Source
* pick-6863 * [Improvement][API][num-7] add task delete check (#6887) * upgrade add sub_process * add interface method * add interface method * fix ut * add task delete check * add task delete check * [Improvement][API][num-5] The workflow of the main table version is not allowed to be deleted (#6893) * feature:deleteProcessDefinitionVersion * pref:delete duplicate enum definition Co-authored-by: 北笙 <“zhanqian@cai-inc.com”> * [DS-6931][fix] swagger failed to start due to improper use of request param annotation (#6933) Co-authored-by: eye <eye.gu@aloudata.com> * [fix #6878] implement interface queryUpstreamRelation queryDownstreamRelation and add UT (#6888) * fix: #6878, implement interface queryUpstreamRelation queryDownstreamRelation and add UT * fix: #6878, implement interface queryUpstreamRelation queryDownstreamRelation and add UT * fix: #6878, add license * fix: #6878, code style * fix: #6878, code style * fix: #6878, fix Duplication * fix: #6878 * fix: #6878 , fix style * to #6878: fix style * to #6878: fix style * to #6878: add buildTaskDefinition to overwrite equals and hashCode Co-authored-by: honghuo.zw <honghuo.zw@alibaba-inc.com> * [Improvement][API][num-6] TaskDefinition releaseTaskDefinition (#6965) * finished releaseTaskDefinition * add releaseTaskDefinition unit test * change import * add import * bug fix * change import Co-authored-by: 时光 <caizhedong@cai-inc.com> * pick-6966 * update task_definition_log field typ (#6967) * update task_definition_log field typ update task_definition_log field task_params type,modify text to longtext to be consistent with the main table * update t_ds_task_definition_log field task_params update t_ds_task_definition_log field task_params * pick-6970 * pick-6977 * pick-6984 * add processDefinition releaseWorkflowAndSchedule (#7044) * [Improvement][API][num-1] save schedule when workflow is offline in interface 'createEmptyProcessDefinition' (#7047) * [Improvement] save schedule when workflow is offline * [Improvement] rollback transactional when creating/updating schedule failed. * [Improvement] resolve merge conflict * [Improvement] do not set projectName and processDefinitionName when saving schedule * [Improvement] do not set projectName and processDefinitionName when saving schedule Co-authored-by: edward-yang <yangjianh210@gmail.com> * pick-7053 * pick-7098 * pick add 6772 relation code * fix ut Co-authored-by: Jeff Zhan <360400325@qq.com> Co-authored-by: 北笙 <“zhanqian@cai-inc.com”> Co-authored-by: ououtt <734164350@qq.com> Co-authored-by: eye <eye.gu@aloudata.com> Co-authored-by: zwZjut <zw15068835817@163.com> Co-authored-by: honghuo.zw <honghuo.zw@alibaba-inc.com> Co-authored-by: 时光 <41109695+yikeshiguang@users.noreply.github.com> Co-authored-by: 时光 <caizhedong@cai-inc.com> Co-authored-by: zhang <60912722+boy-xiaozhang@users.noreply.github.com> Co-authored-by: EdwardYang <yangjianh210@126.com> Co-authored-by: edward-yang <yangjianh210@gmail.com>2.0.1-release
JinYong Li
2 years ago
committed by
GitHub
28 changed files with 2955 additions and 122 deletions
@ -0,0 +1,297 @@
|
||||
/* |
||||
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||
* contributor license agreements. See the NOTICE file distributed with |
||||
* this work for additional information regarding copyright ownership. |
||||
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||
* (the "License"); you may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.apache.dolphinscheduler.api.controller; |
||||
|
||||
import static org.apache.dolphinscheduler.api.enums.Status.CREATE_PROCESS_TASK_RELATION_ERROR; |
||||
import static org.apache.dolphinscheduler.api.enums.Status.DATA_IS_NOT_VALID; |
||||
import static org.apache.dolphinscheduler.api.enums.Status.DELETE_EDGE_ERROR; |
||||
import static org.apache.dolphinscheduler.api.enums.Status.DELETE_TASK_PROCESS_RELATION_ERROR; |
||||
import static org.apache.dolphinscheduler.api.enums.Status.MOVE_PROCESS_TASK_RELATION_ERROR; |
||||
import static org.apache.dolphinscheduler.api.enums.Status.QUERY_TASK_PROCESS_RELATION_ERROR; |
||||
|
||||
import org.apache.dolphinscheduler.api.aspect.AccessLogAnnotation; |
||||
import org.apache.dolphinscheduler.api.exceptions.ApiException; |
||||
import org.apache.dolphinscheduler.api.service.ProcessTaskRelationService; |
||||
import org.apache.dolphinscheduler.api.utils.Result; |
||||
import org.apache.dolphinscheduler.common.Constants; |
||||
import org.apache.dolphinscheduler.dao.entity.User; |
||||
|
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired; |
||||
import org.springframework.http.HttpStatus; |
||||
import org.springframework.web.bind.annotation.DeleteMapping; |
||||
import org.springframework.web.bind.annotation.GetMapping; |
||||
import org.springframework.web.bind.annotation.PathVariable; |
||||
import org.springframework.web.bind.annotation.PostMapping; |
||||
import org.springframework.web.bind.annotation.RequestAttribute; |
||||
import org.springframework.web.bind.annotation.RequestMapping; |
||||
import org.springframework.web.bind.annotation.RequestParam; |
||||
import org.springframework.web.bind.annotation.ResponseStatus; |
||||
import org.springframework.web.bind.annotation.RestController; |
||||
|
||||
import io.swagger.annotations.Api; |
||||
import io.swagger.annotations.ApiImplicitParam; |
||||
import io.swagger.annotations.ApiImplicitParams; |
||||
import io.swagger.annotations.ApiOperation; |
||||
import io.swagger.annotations.ApiParam; |
||||
import springfox.documentation.annotations.ApiIgnore; |
||||
|
||||
/** |
||||
* process task relation controller |
||||
*/ |
||||
@Api(tags = "PROCESS_TASK_RELATION_TAG") |
||||
@RestController |
||||
@RequestMapping("projects/{projectCode}/process-task-relation") |
||||
public class ProcessTaskRelationController extends BaseController { |
||||
|
||||
@Autowired |
||||
private ProcessTaskRelationService processTaskRelationService; |
||||
|
||||
/** |
||||
* create process task relation |
||||
* |
||||
* @param loginUser login user |
||||
* @param projectCode project code |
||||
* @param processDefinitionCode processDefinitionCode |
||||
* @param preTaskCode preTaskCode |
||||
* @param postTaskCode postTaskCode |
||||
* @return create result code |
||||
*/ |
||||
@ApiOperation(value = "save", notes = "CREATE_PROCESS_TASK_RELATION_NOTES") |
||||
@ApiImplicitParams({ |
||||
@ApiImplicitParam(name = "projectCode", value = "PROJECT_CODE", required = true, type = "Long"), |
||||
@ApiImplicitParam(name = "processDefinitionCode", value = "PROCESS_DEFINITION_CODE", required = true, type = "Long"), |
||||
@ApiImplicitParam(name = "preTaskCode", value = "PRE_TASK_CODE", required = true, type = "Long"), |
||||
@ApiImplicitParam(name = "postTaskCode", value = "POST_TASK_CODE", required = true, type = "Long") |
||||
}) |
||||
@PostMapping() |
||||
@ResponseStatus(HttpStatus.CREATED) |
||||
@ApiException(CREATE_PROCESS_TASK_RELATION_ERROR) |
||||
@AccessLogAnnotation(ignoreRequestArgs = "loginUser") |
||||
public Result createProcessTaskRelation(@ApiIgnore @RequestAttribute(value = Constants.SESSION_USER) User loginUser, |
||||
@ApiParam(name = "projectCode", value = "PROJECT_CODE", required = true) @PathVariable long projectCode, |
||||
@RequestParam(name = "processDefinitionCode", required = true) long processDefinitionCode, |
||||
@RequestParam(name = "preTaskCode", required = true) long preTaskCode, |
||||
@RequestParam(name = "postTaskCode", required = true) long postTaskCode) { |
||||
Map<String, Object> result = new HashMap<>(); |
||||
if (postTaskCode == 0L) { |
||||
putMsg(result, DATA_IS_NOT_VALID, "postTaskCode"); |
||||
} else if (processDefinitionCode == 0L) { |
||||
putMsg(result, DATA_IS_NOT_VALID, "processDefinitionCode"); |
||||
} else { |
||||
result = processTaskRelationService.createProcessTaskRelation(loginUser, projectCode, processDefinitionCode, preTaskCode, postTaskCode); |
||||
} |
||||
return returnDataList(result); |
||||
} |
||||
|
||||
/** |
||||
* move task to other processDefinition |
||||
* |
||||
* @param loginUser login user info |
||||
* @param projectCode project code |
||||
* @param processDefinitionCode process definition code |
||||
* @param targetProcessDefinitionCode target process definition code |
||||
* @param taskCode the current task code (the post task code) |
||||
* @return move result code |
||||
*/ |
||||
@ApiOperation(value = "moveRelation", notes = "MOVE_TASK_TO_OTHER_PROCESS_DEFINITION_NOTES") |
||||
@ApiImplicitParams({ |
||||
@ApiImplicitParam(name = "projectCode", value = "PROJECT_CODE", required = true, type = "Long"), |
||||
@ApiImplicitParam(name = "processDefinitionCode", value = "PROCESS_DEFINITION_CODE", required = true, type = "Long"), |
||||
@ApiImplicitParam(name = "targetProcessDefinitionCode", value = "TARGET_PROCESS_DEFINITION_CODE", required = true, type = "Long"), |
||||
@ApiImplicitParam(name = "taskCode", value = "TASK_CODE", required = true, type = "Long") |
||||
}) |
||||
@PostMapping(value = "/move") |
||||
@ResponseStatus(HttpStatus.OK) |
||||
@ApiException(MOVE_PROCESS_TASK_RELATION_ERROR) |
||||
@AccessLogAnnotation(ignoreRequestArgs = "loginUser") |
||||
public Result moveTaskProcessRelation(@ApiIgnore @RequestAttribute(value = Constants.SESSION_USER) User loginUser, |
||||
@ApiParam(name = "projectCode", value = "PROJECT_CODE", required = true) @PathVariable long projectCode, |
||||
@RequestParam(name = "processDefinitionCode", required = true) long processDefinitionCode, |
||||
@RequestParam(name = "targetProcessDefinitionCode", required = true) long targetProcessDefinitionCode, |
||||
@RequestParam(name = "taskCode", required = true) long taskCode) { |
||||
Map<String, Object> result = new HashMap<>(); |
||||
if (processDefinitionCode == 0L) { |
||||
putMsg(result, DATA_IS_NOT_VALID, "processDefinitionCode"); |
||||
} else if (targetProcessDefinitionCode == 0L) { |
||||
putMsg(result, DATA_IS_NOT_VALID, "targetProcessDefinitionCode"); |
||||
} else if (taskCode == 0L) { |
||||
putMsg(result, DATA_IS_NOT_VALID, "taskCode"); |
||||
} else { |
||||
result = processTaskRelationService.moveTaskProcessRelation(loginUser, projectCode, processDefinitionCode, |
||||
targetProcessDefinitionCode, taskCode); |
||||
} |
||||
return returnDataList(result); |
||||
} |
||||
|
||||
/** |
||||
* delete process task relation (delete task from workflow) |
||||
* |
||||
* @param loginUser login user |
||||
* @param projectCode project code |
||||
* @param processDefinitionCode process definition code |
||||
* @param taskCode the post task code |
||||
* @return delete result code |
||||
*/ |
||||
@ApiOperation(value = "deleteRelation", notes = "DELETE_PROCESS_TASK_RELATION_NOTES") |
||||
@ApiImplicitParams({ |
||||
@ApiImplicitParam(name = "projectCode", value = "PROJECT_CODE", required = true, type = "Long"), |
||||
@ApiImplicitParam(name = "processDefinitionCode", value = "PROCESS_DEFINITION_CODE", required = true, type = "Long"), |
||||
@ApiImplicitParam(name = "taskCode", value = "TASK_CODE", required = true, type = "Long") |
||||
}) |
||||
@DeleteMapping(value = "/{taskCode}") |
||||
@ResponseStatus(HttpStatus.OK) |
||||
@ApiException(DELETE_TASK_PROCESS_RELATION_ERROR) |
||||
@AccessLogAnnotation(ignoreRequestArgs = "loginUser") |
||||
public Result deleteTaskProcessRelation(@ApiIgnore @RequestAttribute(value = Constants.SESSION_USER) User loginUser, |
||||
@ApiParam(name = "projectCode", value = "PROJECT_CODE", required = true) @PathVariable long projectCode, |
||||
@RequestParam(name = "processDefinitionCode", required = true) long processDefinitionCode, |
||||
@PathVariable("taskCode") long taskCode) { |
||||
return returnDataList(processTaskRelationService.deleteTaskProcessRelation(loginUser, projectCode, processDefinitionCode, taskCode)); |
||||
} |
||||
|
||||
/** |
||||
* delete task upstream relation |
||||
* |
||||
* @param loginUser login user |
||||
* @param projectCode project code |
||||
* @param preTaskCodes the pre task codes, sep ',' |
||||
* @param taskCode the post task code |
||||
* @return delete result code |
||||
*/ |
||||
@ApiOperation(value = "deleteUpstreamRelation", notes = "DELETE_UPSTREAM_RELATION_NOTES") |
||||
@ApiImplicitParams({ |
||||
@ApiImplicitParam(name = "projectCode", value = "PROJECT_CODE", required = true, type = "Long"), |
||||
@ApiImplicitParam(name = "preTaskCodes", value = "PRE_TASK_CODES", required = true, type = "String", example = "3,4"), |
||||
@ApiImplicitParam(name = "taskCode", value = "TASK_CODE", required = true, type = "Long") |
||||
}) |
||||
@DeleteMapping(value = "/{taskCode}/upstream") |
||||
@ResponseStatus(HttpStatus.OK) |
||||
@ApiException(DELETE_TASK_PROCESS_RELATION_ERROR) |
||||
@AccessLogAnnotation(ignoreRequestArgs = "loginUser") |
||||
public Result deleteUpstreamRelation(@ApiIgnore @RequestAttribute(value = Constants.SESSION_USER) User loginUser, |
||||
@ApiParam(name = "projectCode", value = "PROJECT_CODE", required = true) @PathVariable long projectCode, |
||||
@RequestParam(name = "preTaskCodes", required = true) String preTaskCodes, |
||||
@PathVariable("taskCode") long taskCode) { |
||||
return returnDataList(processTaskRelationService.deleteUpstreamRelation(loginUser, projectCode, preTaskCodes, taskCode)); |
||||
} |
||||
|
||||
/** |
||||
* delete task downstream relation |
||||
* |
||||
* @param loginUser login user |
||||
* @param projectCode project code |
||||
* @param postTaskCodes the post task codes, sep ',' |
||||
* @param taskCode the pre task code |
||||
* @return delete result code |
||||
*/ |
||||
@ApiOperation(value = "deleteDownstreamRelation", notes = "DELETE_DOWNSTREAM_RELATION_NOTES") |
||||
@ApiImplicitParams({ |
||||
@ApiImplicitParam(name = "projectCode", value = "PROJECT_CODE", required = true, type = "Long"), |
||||
@ApiImplicitParam(name = "postTaskCodes", value = "POST_TASK_CODES", required = true, type = "String", example = "3,4"), |
||||
@ApiImplicitParam(name = "taskCode", value = "TASK_CODE", required = true, type = "Long") |
||||
}) |
||||
@DeleteMapping(value = "/{taskCode}/downstream") |
||||
@ResponseStatus(HttpStatus.OK) |
||||
@ApiException(DELETE_TASK_PROCESS_RELATION_ERROR) |
||||
@AccessLogAnnotation(ignoreRequestArgs = "loginUser") |
||||
public Result deleteDownstreamRelation(@ApiIgnore @RequestAttribute(value = Constants.SESSION_USER) User loginUser, |
||||
@ApiParam(name = "projectCode", value = "PROJECT_CODE", required = true) @PathVariable long projectCode, |
||||
@RequestParam(name = "postTaskCodes", required = true) String postTaskCodes, |
||||
@PathVariable("taskCode") long taskCode) { |
||||
return returnDataList(processTaskRelationService.deleteDownstreamRelation(loginUser, projectCode, postTaskCodes, taskCode)); |
||||
} |
||||
|
||||
/** |
||||
* query task upstream relation |
||||
* |
||||
* @param loginUser login user |
||||
* @param projectCode project code |
||||
* @param taskCode current task code (post task code) |
||||
* @return process task relation list |
||||
*/ |
||||
@ApiOperation(value = "queryUpstreamRelation", notes = "QUERY_UPSTREAM_RELATION_NOTES") |
||||
@ApiImplicitParams({ |
||||
@ApiImplicitParam(name = "projectCode", value = "PROJECT_CODE", required = true, type = "Long"), |
||||
@ApiImplicitParam(name = "taskCode", value = "TASK_CODE", required = true, type = "Long") |
||||
}) |
||||
@GetMapping(value = "/{taskCode}/upstream") |
||||
@ResponseStatus(HttpStatus.OK) |
||||
@ApiException(QUERY_TASK_PROCESS_RELATION_ERROR) |
||||
@AccessLogAnnotation(ignoreRequestArgs = "loginUser") |
||||
public Result queryUpstreamRelation(@ApiIgnore @RequestAttribute(value = Constants.SESSION_USER) User loginUser, |
||||
@ApiParam(name = "projectCode", value = "PROJECT_CODE", required = true) @PathVariable long projectCode, |
||||
@PathVariable("taskCode") long taskCode) { |
||||
return returnDataList(processTaskRelationService.queryUpstreamRelation(loginUser, projectCode, taskCode)); |
||||
} |
||||
|
||||
/** |
||||
* query task downstream relation |
||||
* |
||||
* @param loginUser login user |
||||
* @param projectCode project code |
||||
* @param taskCode pre task code |
||||
* @return process task relation list |
||||
*/ |
||||
@ApiOperation(value = "queryDownstreamRelation", notes = "QUERY_DOWNSTREAM_RELATION_NOTES") |
||||
@ApiImplicitParams({ |
||||
@ApiImplicitParam(name = "projectCode", value = "PROJECT_CODE", required = true, type = "Long"), |
||||
@ApiImplicitParam(name = "taskCode", value = "TASK_CODE", required = true, type = "Long") |
||||
}) |
||||
@GetMapping(value = "/{taskCode}/downstream") |
||||
@ResponseStatus(HttpStatus.OK) |
||||
@ApiException(QUERY_TASK_PROCESS_RELATION_ERROR) |
||||
@AccessLogAnnotation(ignoreRequestArgs = "loginUser") |
||||
public Result queryDownstreamRelation(@ApiIgnore @RequestAttribute(value = Constants.SESSION_USER) User loginUser, |
||||
@ApiParam(name = "projectCode", value = "PROJECT_CODE", required = true) @PathVariable long projectCode, |
||||
@PathVariable("taskCode") long taskCode) { |
||||
return returnDataList(processTaskRelationService.queryDownstreamRelation(loginUser, projectCode, taskCode)); |
||||
} |
||||
|
||||
/** |
||||
* delete edge |
||||
* |
||||
* @param loginUser login user |
||||
* @param projectCode project code |
||||
* @param processDefinitionCode process definition code |
||||
* @param preTaskCode pre task code |
||||
* @param postTaskCode post task code |
||||
* @return delete result code |
||||
*/ |
||||
@ApiOperation(value = "deleteEdge", notes = "DELETE_EDGE_NOTES") |
||||
@ApiImplicitParams({ |
||||
@ApiImplicitParam(name = "projectCode", value = "PROJECT_CODE", required = true, type = "Long"), |
||||
@ApiImplicitParam(name = "processDefinitionCode", value = "PROCESS_DEFINITION_CODE", required = true, type = "Long"), |
||||
@ApiImplicitParam(name = "preTaskCode", value = "PRE_TASK_CODE", required = true, type = "Long"), |
||||
@ApiImplicitParam(name = "postTaskCode", value = "POST_TASK_CODE", required = true, type = "Long") |
||||
}) |
||||
@DeleteMapping(value = "/{processDefinitionCode}/{preTaskCode}/{postTaskCode}") |
||||
@ResponseStatus(HttpStatus.OK) |
||||
@ApiException(DELETE_EDGE_ERROR) |
||||
@AccessLogAnnotation(ignoreRequestArgs = "loginUser") |
||||
public Result deleteEdge(@ApiIgnore @RequestAttribute(value = Constants.SESSION_USER) User loginUser, |
||||
@ApiParam(name = "projectCode", value = "PROJECT_CODE", required = true) |
||||
@PathVariable long projectCode, |
||||
@PathVariable long processDefinitionCode, |
||||
@PathVariable long preTaskCode, |
||||
@PathVariable long postTaskCode) { |
||||
return returnDataList(processTaskRelationService.deleteEdge(loginUser, projectCode, processDefinitionCode, preTaskCode, postTaskCode)); |
||||
} |
||||
} |
@ -0,0 +1,138 @@
|
||||
/* |
||||
* 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.service; |
||||
|
||||
import org.apache.dolphinscheduler.dao.entity.User; |
||||
|
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* process task relation service |
||||
*/ |
||||
public interface ProcessTaskRelationService { |
||||
|
||||
/** |
||||
* create process task relation |
||||
* |
||||
* @param loginUser login user |
||||
* @param projectCode project code |
||||
* @param processDefinitionCode processDefinitionCode |
||||
* @param preTaskCode preTaskCode |
||||
* @param postTaskCode postTaskCode |
||||
* @return create result code |
||||
*/ |
||||
Map<String, Object> createProcessTaskRelation(User loginUser, |
||||
long projectCode, |
||||
long processDefinitionCode, |
||||
long preTaskCode, |
||||
long postTaskCode); |
||||
|
||||
/** |
||||
* move task to other processDefinition |
||||
* |
||||
* @param loginUser login user info |
||||
* @param projectCode project code |
||||
* @param processDefinitionCode process definition code |
||||
* @param targetProcessDefinitionCode target process definition code |
||||
* @param taskCode the current task code (the post task code) |
||||
* @return move result code |
||||
*/ |
||||
Map<String, Object> moveTaskProcessRelation(User loginUser, |
||||
long projectCode, |
||||
long processDefinitionCode, |
||||
long targetProcessDefinitionCode, |
||||
long taskCode); |
||||
|
||||
/** |
||||
* delete process task relation |
||||
* |
||||
* @param loginUser login user |
||||
* @param projectCode project code |
||||
* @param processDefinitionCode process definition code |
||||
* @param taskCode the post task code |
||||
* @return delete result code |
||||
*/ |
||||
Map<String, Object> deleteTaskProcessRelation(User loginUser, |
||||
long projectCode, |
||||
long processDefinitionCode, |
||||
long taskCode); |
||||
|
||||
/** |
||||
* delete task upstream relation |
||||
* |
||||
* @param loginUser login user |
||||
* @param projectCode project code |
||||
* @param preTaskCodes the pre task codes, sep ',' |
||||
* @param taskCode the post task code |
||||
* @return delete result code |
||||
*/ |
||||
Map<String, Object> deleteUpstreamRelation(User loginUser, |
||||
long projectCode, |
||||
String preTaskCodes, |
||||
long taskCode); |
||||
|
||||
/** |
||||
* delete task downstream relation |
||||
* |
||||
* @param loginUser login user |
||||
* @param projectCode project code |
||||
* @param postTaskCodes the post task codes, sep ',' |
||||
* @param taskCode the pre task code |
||||
* @return delete result code |
||||
*/ |
||||
Map<String, Object> deleteDownstreamRelation(User loginUser, |
||||
long projectCode, |
||||
String postTaskCodes, |
||||
long taskCode); |
||||
|
||||
/** |
||||
* query task upstream relation |
||||
* |
||||
* @param loginUser login user |
||||
* @param projectCode project code |
||||
* @param taskCode current task code (post task code) |
||||
* @return process task relation list |
||||
*/ |
||||
Map<String, Object> queryUpstreamRelation(User loginUser, |
||||
long projectCode, |
||||
long taskCode); |
||||
|
||||
/** |
||||
* query task downstream relation |
||||
* |
||||
* @param loginUser login user |
||||
* @param projectCode project code |
||||
* @param taskCode pre task code |
||||
* @return process task relation list |
||||
*/ |
||||
Map<String, Object> queryDownstreamRelation(User loginUser, |
||||
long projectCode, |
||||
long taskCode); |
||||
|
||||
/** |
||||
* delete edge |
||||
* |
||||
* @param loginUser login user |
||||
* @param projectCode project code |
||||
* @param processDefinitionCode process definition code |
||||
* @param preTaskCode pre task code |
||||
* @param postTaskCode post task code |
||||
* @return delete result code |
||||
*/ |
||||
Map<String, Object> deleteEdge(User loginUser, long projectCode, long processDefinitionCode, long preTaskCode, long postTaskCode); |
||||
} |
@ -0,0 +1,653 @@
|
||||
/* |
||||
* 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.service.impl; |
||||
|
||||
import static org.apache.dolphinscheduler.api.enums.Status.DATA_IS_NOT_VALID; |
||||
|
||||
import org.apache.dolphinscheduler.api.enums.Status; |
||||
import org.apache.dolphinscheduler.api.exceptions.ServiceException; |
||||
import org.apache.dolphinscheduler.api.service.ProcessTaskRelationService; |
||||
import org.apache.dolphinscheduler.api.service.ProjectService; |
||||
import org.apache.dolphinscheduler.common.Constants; |
||||
import org.apache.dolphinscheduler.common.enums.ConditionType; |
||||
import org.apache.dolphinscheduler.common.enums.TaskType; |
||||
import org.apache.dolphinscheduler.common.utils.JSONUtils; |
||||
import org.apache.dolphinscheduler.dao.entity.ProcessDefinition; |
||||
import org.apache.dolphinscheduler.dao.entity.ProcessTaskRelation; |
||||
import org.apache.dolphinscheduler.dao.entity.ProcessTaskRelationLog; |
||||
import org.apache.dolphinscheduler.dao.entity.Project; |
||||
import org.apache.dolphinscheduler.dao.entity.TaskDefinition; |
||||
import org.apache.dolphinscheduler.dao.entity.TaskDefinitionLog; |
||||
import org.apache.dolphinscheduler.dao.entity.User; |
||||
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.TaskDefinitionLogMapper; |
||||
import org.apache.dolphinscheduler.dao.mapper.TaskDefinitionMapper; |
||||
import org.apache.dolphinscheduler.spi.utils.StringUtils; |
||||
|
||||
import org.apache.commons.collections.CollectionUtils; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.Date; |
||||
import java.util.HashSet; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
import java.util.Objects; |
||||
import java.util.Set; |
||||
import java.util.stream.Collectors; |
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired; |
||||
import org.springframework.stereotype.Service; |
||||
import org.springframework.transaction.annotation.Transactional; |
||||
|
||||
import com.fasterxml.jackson.databind.node.ArrayNode; |
||||
import com.fasterxml.jackson.databind.node.ObjectNode; |
||||
import com.google.common.collect.Lists; |
||||
|
||||
/** |
||||
* process task relation service impl |
||||
*/ |
||||
@Service |
||||
public class ProcessTaskRelationServiceImpl extends BaseServiceImpl implements ProcessTaskRelationService { |
||||
|
||||
@Autowired |
||||
private ProjectMapper projectMapper; |
||||
|
||||
@Autowired |
||||
private ProjectService projectService; |
||||
|
||||
@Autowired |
||||
private ProcessTaskRelationMapper processTaskRelationMapper; |
||||
|
||||
@Autowired |
||||
private ProcessTaskRelationLogMapper processTaskRelationLogMapper; |
||||
|
||||
@Autowired |
||||
private TaskDefinitionLogMapper taskDefinitionLogMapper; |
||||
|
||||
@Autowired |
||||
private TaskDefinitionMapper taskDefinitionMapper; |
||||
|
||||
@Autowired |
||||
private ProcessDefinitionMapper processDefinitionMapper; |
||||
|
||||
/** |
||||
* create process task relation |
||||
* |
||||
* @param loginUser login user |
||||
* @param projectCode project code |
||||
* @param processDefinitionCode processDefinitionCode |
||||
* @param preTaskCode preTaskCode |
||||
* @param postTaskCode postTaskCode |
||||
* @return create result code |
||||
*/ |
||||
@Transactional(rollbackFor = RuntimeException.class) |
||||
@Override |
||||
public Map<String, Object> createProcessTaskRelation(User loginUser, long projectCode, long processDefinitionCode, long preTaskCode, long postTaskCode) { |
||||
Project project = projectMapper.queryByCode(projectCode); |
||||
//check user access for project
|
||||
Map<String, Object> result = projectService.checkProjectAndAuth(loginUser, project, projectCode); |
||||
if (result.get(Constants.STATUS) != Status.SUCCESS) { |
||||
return result; |
||||
} |
||||
ProcessDefinition processDefinition = processDefinitionMapper.queryByCode(processDefinitionCode); |
||||
if (processDefinition == null) { |
||||
putMsg(result, Status.PROCESS_DEFINE_NOT_EXIST, processDefinitionCode); |
||||
return result; |
||||
} |
||||
if (processDefinition.getProjectCode() != projectCode) { |
||||
putMsg(result, Status.PROJECT_PROCESS_NOT_MATCH); |
||||
return result; |
||||
} |
||||
List<ProcessTaskRelation> processTaskRelations = processTaskRelationMapper.queryByCode(projectCode, processDefinitionCode, 0L, postTaskCode); |
||||
if (!processTaskRelations.isEmpty()) { |
||||
Map<Long, ProcessTaskRelation> preTaskCodeMap = processTaskRelations.stream() |
||||
.collect(Collectors.toMap(ProcessTaskRelation::getPreTaskCode, processTaskRelation -> processTaskRelation)); |
||||
if (preTaskCodeMap.containsKey(preTaskCode) || (!preTaskCodeMap.containsKey(0L) && preTaskCode == 0L)) { |
||||
putMsg(result, Status.PROCESS_TASK_RELATION_EXIST, processDefinitionCode); |
||||
return result; |
||||
} |
||||
if (preTaskCodeMap.containsKey(0L) && preTaskCode != 0L) { |
||||
ProcessTaskRelationLog processTaskRelationLog = new ProcessTaskRelationLog(preTaskCodeMap.get(0L)); |
||||
// delete no upstream
|
||||
int delete = processTaskRelationMapper.deleteRelation(processTaskRelationLog); |
||||
int deleteLog = processTaskRelationLogMapper.deleteRelation(processTaskRelationLog); |
||||
if ((delete & deleteLog) == 0) { |
||||
putMsg(result, Status.CREATE_PROCESS_TASK_RELATION_ERROR); |
||||
throw new ServiceException(Status.CREATE_PROCESS_TASK_RELATION_ERROR); |
||||
} |
||||
} |
||||
} |
||||
Date now = new Date(); |
||||
List<ProcessTaskRelationLog> processTaskRelationLogs = new ArrayList<>(); |
||||
if (preTaskCode != 0L) { |
||||
// upstream is or not exist
|
||||
List<ProcessTaskRelation> upstreamProcessTaskRelations = processTaskRelationMapper.queryByCode(projectCode, processDefinitionCode, 0L, preTaskCode); |
||||
TaskDefinition preTaskDefinition = taskDefinitionMapper.queryByCode(preTaskCode); |
||||
if (upstreamProcessTaskRelations.isEmpty()) { |
||||
ProcessTaskRelationLog processTaskRelationLog = setRelationLog(processDefinition, now, loginUser.getId(), preTaskDefinition); |
||||
processTaskRelationLog.setPreTaskCode(0L); |
||||
processTaskRelationLog.setPreTaskVersion(0); |
||||
processTaskRelationLogs.add(processTaskRelationLog); |
||||
} |
||||
TaskDefinition postTaskDefinition = taskDefinitionMapper.queryByCode(postTaskCode); |
||||
ProcessTaskRelationLog processTaskRelationLog = setRelationLog(processDefinition, now, loginUser.getId(), postTaskDefinition); |
||||
processTaskRelationLog.setPreTaskCode(preTaskDefinition.getCode()); |
||||
processTaskRelationLog.setPreTaskVersion(preTaskDefinition.getVersion()); |
||||
processTaskRelationLogs.add(processTaskRelationLog); |
||||
} else { |
||||
TaskDefinition postTaskDefinition = taskDefinitionMapper.queryByCode(postTaskCode); |
||||
ProcessTaskRelationLog processTaskRelationLog = setRelationLog(processDefinition, now, loginUser.getId(), postTaskDefinition); |
||||
processTaskRelationLog.setPreTaskCode(0L); |
||||
processTaskRelationLog.setPreTaskVersion(0); |
||||
processTaskRelationLogs.add(processTaskRelationLog); |
||||
} |
||||
int insert = processTaskRelationMapper.batchInsert(processTaskRelationLogs); |
||||
int insertLog = processTaskRelationLogMapper.batchInsert(processTaskRelationLogs); |
||||
if ((insert & insertLog) > 0) { |
||||
putMsg(result, Status.SUCCESS); |
||||
} else { |
||||
putMsg(result, Status.CREATE_PROCESS_TASK_RELATION_ERROR); |
||||
throw new ServiceException(Status.CREATE_PROCESS_TASK_RELATION_ERROR); |
||||
} |
||||
return result; |
||||
} |
||||
|
||||
private ProcessTaskRelationLog setRelationLog(ProcessDefinition processDefinition, Date now, int userId, TaskDefinition taskDefinition) { |
||||
ProcessTaskRelationLog processTaskRelationLog = new ProcessTaskRelationLog(); |
||||
processTaskRelationLog.setProjectCode(processDefinition.getProjectCode()); |
||||
processTaskRelationLog.setProcessDefinitionCode(processDefinition.getCode()); |
||||
processTaskRelationLog.setProcessDefinitionVersion(processDefinition.getVersion()); |
||||
processTaskRelationLog.setPostTaskCode(taskDefinition.getCode()); |
||||
processTaskRelationLog.setPostTaskVersion(taskDefinition.getVersion()); |
||||
processTaskRelationLog.setConditionType(ConditionType.NONE); |
||||
processTaskRelationLog.setConditionParams("{}"); |
||||
processTaskRelationLog.setCreateTime(now); |
||||
processTaskRelationLog.setUpdateTime(now); |
||||
processTaskRelationLog.setOperator(userId); |
||||
processTaskRelationLog.setOperateTime(now); |
||||
return processTaskRelationLog; |
||||
} |
||||
|
||||
/** |
||||
* move task to other processDefinition |
||||
* |
||||
* @param loginUser login user info |
||||
* @param projectCode project code |
||||
* @param processDefinitionCode process definition code |
||||
* @param targetProcessDefinitionCode target process definition code |
||||
* @param taskCode the current task code (the post task code) |
||||
* @return move result code |
||||
*/ |
||||
@Transactional(rollbackFor = RuntimeException.class) |
||||
@Override |
||||
public Map<String, Object> moveTaskProcessRelation(User loginUser, long projectCode, long processDefinitionCode, long targetProcessDefinitionCode, long taskCode) { |
||||
Project project = projectMapper.queryByCode(projectCode); |
||||
//check user access for project
|
||||
Map<String, Object> result = projectService.checkProjectAndAuth(loginUser, project, projectCode); |
||||
if (result.get(Constants.STATUS) != Status.SUCCESS) { |
||||
return result; |
||||
} |
||||
ProcessDefinition processDefinition = processDefinitionMapper.queryByCode(targetProcessDefinitionCode); |
||||
if (processDefinition == null) { |
||||
putMsg(result, Status.PROCESS_DEFINE_NOT_EXIST, targetProcessDefinitionCode); |
||||
return result; |
||||
} |
||||
if (processDefinition.getProjectCode() != projectCode) { |
||||
putMsg(result, Status.PROJECT_PROCESS_NOT_MATCH); |
||||
return result; |
||||
} |
||||
List<ProcessTaskRelation> downstreamList = processTaskRelationMapper.queryByCode(projectCode, processDefinitionCode, taskCode, 0L); |
||||
if (CollectionUtils.isNotEmpty(downstreamList)) { |
||||
Set<Long> postTaskCodes = downstreamList |
||||
.stream() |
||||
.map(ProcessTaskRelation::getPostTaskCode) |
||||
.collect(Collectors.toSet()); |
||||
putMsg(result, Status.TASK_HAS_DOWNSTREAM, org.apache.commons.lang.StringUtils.join(postTaskCodes, ",")); |
||||
return result; |
||||
} |
||||
List<ProcessTaskRelation> upstreamList = processTaskRelationMapper.queryByCode(projectCode, processDefinitionCode, 0L, taskCode); |
||||
if (upstreamList.isEmpty()) { |
||||
putMsg(result, Status.PROCESS_TASK_RELATION_NOT_EXIST, "taskCode:" + taskCode); |
||||
return result; |
||||
} else { |
||||
Set<Long> preTaskCodes = upstreamList |
||||
.stream() |
||||
.map(ProcessTaskRelation::getPreTaskCode) |
||||
.collect(Collectors.toSet()); |
||||
if (preTaskCodes.size() > 1 || !preTaskCodes.contains(0L)) { |
||||
putMsg(result, Status.TASK_HAS_UPSTREAM, org.apache.commons.lang.StringUtils.join(preTaskCodes, ",")); |
||||
return result; |
||||
} |
||||
} |
||||
TaskDefinition taskDefinition = taskDefinitionMapper.queryByCode(taskCode); |
||||
if (null == taskDefinition) { |
||||
putMsg(result, Status.DATA_IS_NULL, "taskDefinition"); |
||||
return result; |
||||
} |
||||
ObjectNode paramNode = JSONUtils.parseObject(taskDefinition.getTaskParams()); |
||||
if (TaskType.DEPENDENT.getDesc().equals(taskDefinition.getTaskType())) { |
||||
Set<Long> depProcessDefinitionCodes = new HashSet<>(); |
||||
ObjectNode dependence = (ObjectNode) paramNode.get("dependence"); |
||||
ArrayNode dependTaskList = JSONUtils.parseArray(JSONUtils.toJsonString(dependence.get("dependTaskList"))); |
||||
for (int i = 0; i < dependTaskList.size(); i++) { |
||||
ObjectNode dependTask = (ObjectNode) dependTaskList.path(i); |
||||
ArrayNode dependItemList = JSONUtils.parseArray(JSONUtils.toJsonString(dependTask.get("dependItemList"))); |
||||
for (int j = 0; j < dependItemList.size(); j++) { |
||||
ObjectNode dependItem = (ObjectNode) dependItemList.path(j); |
||||
long definitionCode = dependItem.get("definitionCode").asLong(); |
||||
depProcessDefinitionCodes.add(definitionCode); |
||||
} |
||||
} |
||||
if (depProcessDefinitionCodes.contains(targetProcessDefinitionCode)) { |
||||
putMsg(result, DATA_IS_NOT_VALID, "targetProcessDefinitionCode"); |
||||
return result; |
||||
} |
||||
} |
||||
if (TaskType.SUB_PROCESS.getDesc().equals(taskDefinition.getTaskType())) { |
||||
long subProcessDefinitionCode = paramNode.get("processDefinitionCode").asLong(); |
||||
if (targetProcessDefinitionCode == subProcessDefinitionCode) { |
||||
putMsg(result, DATA_IS_NOT_VALID, "targetProcessDefinitionCode"); |
||||
return result; |
||||
} |
||||
} |
||||
Date now = new Date(); |
||||
ProcessTaskRelation processTaskRelation = upstreamList.get(0); |
||||
ProcessTaskRelationLog processTaskRelationLog = processTaskRelationLogMapper.queryRelationLogByRelation(processTaskRelation); |
||||
processTaskRelation.setProcessDefinitionCode(processDefinition.getCode()); |
||||
processTaskRelation.setProcessDefinitionVersion(processDefinition.getVersion()); |
||||
processTaskRelation.setUpdateTime(now); |
||||
processTaskRelationLog.setProcessDefinitionCode(processDefinition.getCode()); |
||||
processTaskRelationLog.setProcessDefinitionVersion(processDefinition.getVersion()); |
||||
processTaskRelationLog.setUpdateTime(now); |
||||
processTaskRelationLog.setOperator(loginUser.getId()); |
||||
processTaskRelationLog.setOperateTime(now); |
||||
int update = processTaskRelationMapper.updateById(processTaskRelation); |
||||
int updateLog = processTaskRelationLogMapper.updateById(processTaskRelationLog); |
||||
if (update == 0 || updateLog == 0) { |
||||
putMsg(result, Status.MOVE_PROCESS_TASK_RELATION_ERROR); |
||||
throw new ServiceException(Status.MOVE_PROCESS_TASK_RELATION_ERROR); |
||||
} else { |
||||
putMsg(result, Status.SUCCESS); |
||||
} |
||||
return result; |
||||
} |
||||
|
||||
/** |
||||
* delete process task relation |
||||
* |
||||
* @param loginUser login user |
||||
* @param projectCode project code |
||||
* @param processDefinitionCode process definition code |
||||
* @param taskCode the post task code |
||||
* @return delete result code |
||||
*/ |
||||
@Transactional(rollbackFor = RuntimeException.class) |
||||
@Override |
||||
public Map<String, Object> deleteTaskProcessRelation(User loginUser, long projectCode, long processDefinitionCode, long taskCode) { |
||||
Project project = projectMapper.queryByCode(projectCode); |
||||
//check user access for project
|
||||
Map<String, Object> result = projectService.checkProjectAndAuth(loginUser, project, projectCode); |
||||
if (result.get(Constants.STATUS) != Status.SUCCESS) { |
||||
return result; |
||||
} |
||||
if (taskCode == 0) { |
||||
putMsg(result, Status.DELETE_TASK_PROCESS_RELATION_ERROR); |
||||
return result; |
||||
} |
||||
ProcessDefinition processDefinition = processDefinitionMapper.queryByCode(processDefinitionCode); |
||||
if (processDefinition == null) { |
||||
putMsg(result, Status.PROCESS_DEFINE_NOT_EXIST, processDefinitionCode); |
||||
return result; |
||||
} |
||||
TaskDefinition taskDefinition = taskDefinitionMapper.queryByCode(taskCode); |
||||
if (null == taskDefinition) { |
||||
putMsg(result, Status.TASK_DEFINE_NOT_EXIST, taskCode); |
||||
return result; |
||||
} |
||||
List<ProcessTaskRelation> downstreamList = processTaskRelationMapper.queryByCode(projectCode, processDefinitionCode, taskCode, 0L); |
||||
if (CollectionUtils.isNotEmpty(downstreamList)) { |
||||
Set<Long> postTaskCodes = downstreamList |
||||
.stream() |
||||
.map(ProcessTaskRelation::getPostTaskCode) |
||||
.collect(Collectors.toSet()); |
||||
putMsg(result, Status.TASK_HAS_DOWNSTREAM, org.apache.commons.lang.StringUtils.join(postTaskCodes, ",")); |
||||
return result; |
||||
} |
||||
|
||||
ProcessTaskRelationLog processTaskRelationLog = new ProcessTaskRelationLog(); |
||||
processTaskRelationLog.setProjectCode(projectCode); |
||||
processTaskRelationLog.setPostTaskCode(taskCode); |
||||
processTaskRelationLog.setPostTaskVersion(taskDefinition.getVersion()); |
||||
processTaskRelationLog.setProcessDefinitionCode(processDefinitionCode); |
||||
processTaskRelationLog.setProcessDefinitionVersion(processDefinition.getVersion()); |
||||
int deleteRelation = processTaskRelationMapper.deleteRelation(processTaskRelationLog); |
||||
int deleteRelationLog = processTaskRelationLogMapper.deleteRelation(processTaskRelationLog); |
||||
if (0 == deleteRelation || 0 == deleteRelationLog) { |
||||
putMsg(result, Status.DELETE_TASK_PROCESS_RELATION_ERROR); |
||||
throw new ServiceException(Status.DELETE_TASK_PROCESS_RELATION_ERROR); |
||||
} |
||||
if (TaskType.CONDITIONS.getDesc().equals(taskDefinition.getTaskType()) |
||||
|| TaskType.DEPENDENT.getDesc().equals(taskDefinition.getTaskType()) |
||||
|| TaskType.SUB_PROCESS.getDesc().equals(taskDefinition.getTaskType())) { |
||||
int deleteTaskDefinition = taskDefinitionMapper.deleteByCode(taskCode); |
||||
if (0 == deleteTaskDefinition) { |
||||
putMsg(result, Status.DELETE_TASK_DEFINE_BY_CODE_ERROR); |
||||
throw new ServiceException(Status.DELETE_TASK_DEFINE_BY_CODE_ERROR); |
||||
} |
||||
} |
||||
putMsg(result, Status.SUCCESS); |
||||
return result; |
||||
} |
||||
|
||||
/** |
||||
* delete task upstream relation |
||||
* |
||||
* @param loginUser login user |
||||
* @param projectCode project code |
||||
* @param preTaskCodes the pre task codes, sep ',' |
||||
* @param taskCode the post task code |
||||
* @return delete result code |
||||
*/ |
||||
@Transactional(rollbackFor = RuntimeException.class) |
||||
@Override |
||||
public Map<String, Object> deleteUpstreamRelation(User loginUser, long projectCode, String preTaskCodes, long taskCode) { |
||||
Project project = projectMapper.queryByCode(projectCode); |
||||
//check user access for project
|
||||
Map<String, Object> result = projectService.checkProjectAndAuth(loginUser, project, projectCode); |
||||
if (result.get(Constants.STATUS) != Status.SUCCESS) { |
||||
return result; |
||||
} |
||||
if (StringUtils.isEmpty(preTaskCodes)) { |
||||
putMsg(result, Status.DATA_IS_NULL, "preTaskCodes"); |
||||
return result; |
||||
} |
||||
Status status = deleteUpstreamRelation(loginUser.getId(), projectCode, |
||||
Lists.newArrayList(preTaskCodes.split(Constants.COMMA)).stream().map(Long::parseLong).distinct().toArray(Long[]::new), taskCode); |
||||
if (status != Status.SUCCESS) { |
||||
putMsg(result, status); |
||||
} |
||||
return result; |
||||
} |
||||
|
||||
/** |
||||
* delete task downstream relation |
||||
* |
||||
* @param loginUser login user |
||||
* @param projectCode project code |
||||
* @param postTaskCodes the post task codes, sep ',' |
||||
* @param taskCode the pre task code |
||||
* @return delete result code |
||||
*/ |
||||
@Transactional(rollbackFor = RuntimeException.class) |
||||
@Override |
||||
public Map<String, Object> deleteDownstreamRelation(User loginUser, long projectCode, String postTaskCodes, long taskCode) { |
||||
Project project = projectMapper.queryByCode(projectCode); |
||||
//check user access for project
|
||||
Map<String, Object> result = projectService.checkProjectAndAuth(loginUser, project, projectCode); |
||||
if (result.get(Constants.STATUS) != Status.SUCCESS) { |
||||
return result; |
||||
} |
||||
if (StringUtils.isEmpty(postTaskCodes)) { |
||||
putMsg(result, Status.DATA_IS_NULL, "postTaskCodes"); |
||||
return result; |
||||
} |
||||
List<ProcessTaskRelation> processTaskRelationList = processTaskRelationMapper.queryDownstreamByCode(projectCode, taskCode); |
||||
Map<Long, ProcessTaskRelationLog> taskRelationLogMap = |
||||
processTaskRelationList.stream() |
||||
.map(ProcessTaskRelationLog::new) |
||||
.collect(Collectors.toMap(ProcessTaskRelationLog::getPostTaskCode, processTaskRelationLog -> processTaskRelationLog)); |
||||
Set<Long> postTaskCodesSet = Lists.newArrayList(postTaskCodes.split(Constants.COMMA)).stream().map(Long::parseLong).collect(Collectors.toSet()); |
||||
int delete = 0; |
||||
int deleteLog = 0; |
||||
for (long postTaskCode : postTaskCodesSet) { |
||||
ProcessTaskRelationLog processTaskRelationLog = taskRelationLogMap.get(postTaskCode); |
||||
if (processTaskRelationLog != null) { |
||||
delete += processTaskRelationMapper.deleteRelation(processTaskRelationLog); |
||||
deleteLog += processTaskRelationLogMapper.deleteRelation(processTaskRelationLog); |
||||
} |
||||
} |
||||
if ((delete & deleteLog) == 0) { |
||||
throw new ServiceException(Status.DELETE_TASK_PROCESS_RELATION_ERROR); |
||||
} else { |
||||
putMsg(result, Status.SUCCESS); |
||||
} |
||||
return result; |
||||
} |
||||
|
||||
/** |
||||
* query task upstream relation |
||||
* |
||||
* @param loginUser login user |
||||
* @param projectCode project code |
||||
* @param taskCode current task code (post task code) |
||||
* @return the upstream task definitions |
||||
*/ |
||||
@Override |
||||
public Map<String, Object> queryUpstreamRelation(User loginUser, long projectCode, long taskCode) { |
||||
Project project = projectMapper.queryByCode(projectCode); |
||||
//check user access for project
|
||||
Map<String, Object> result = projectService.checkProjectAndAuth(loginUser, project, projectCode); |
||||
if (result.get(Constants.STATUS) != Status.SUCCESS) { |
||||
return result; |
||||
} |
||||
List<ProcessTaskRelation> processTaskRelationList = processTaskRelationMapper.queryUpstreamByCode(projectCode, taskCode); |
||||
List<TaskDefinitionLog> taskDefinitionLogList = new ArrayList<>(); |
||||
if (CollectionUtils.isNotEmpty(processTaskRelationList)) { |
||||
Set<TaskDefinition> taskDefinitions = processTaskRelationList |
||||
.stream() |
||||
.map(processTaskRelation -> { |
||||
TaskDefinition taskDefinition = buildTaskDefinition(); |
||||
taskDefinition.setProjectCode(processTaskRelation.getProjectCode()); |
||||
taskDefinition.setCode(processTaskRelation.getPreTaskCode()); |
||||
taskDefinition.setVersion(processTaskRelation.getPreTaskVersion()); |
||||
return taskDefinition; |
||||
}) |
||||
.collect(Collectors.toSet()); |
||||
taskDefinitionLogList = taskDefinitionLogMapper.queryByTaskDefinitions(taskDefinitions); |
||||
} |
||||
result.put(Constants.DATA_LIST, taskDefinitionLogList); |
||||
putMsg(result, Status.SUCCESS); |
||||
return result; |
||||
} |
||||
|
||||
/** |
||||
* query task downstream relation |
||||
* |
||||
* @param loginUser login user |
||||
* @param projectCode project code |
||||
* @param taskCode pre task code |
||||
* @return the downstream task definitions |
||||
*/ |
||||
@Override |
||||
public Map<String, Object> queryDownstreamRelation(User loginUser, long projectCode, long taskCode) { |
||||
Project project = projectMapper.queryByCode(projectCode); |
||||
//check user access for project
|
||||
Map<String, Object> result = projectService.checkProjectAndAuth(loginUser, project, projectCode); |
||||
if (result.get(Constants.STATUS) != Status.SUCCESS) { |
||||
return result; |
||||
} |
||||
List<ProcessTaskRelation> processTaskRelationList = processTaskRelationMapper.queryDownstreamByCode(projectCode, taskCode); |
||||
List<TaskDefinitionLog> taskDefinitionLogList = new ArrayList<>(); |
||||
if (CollectionUtils.isNotEmpty(processTaskRelationList)) { |
||||
Set<TaskDefinition> taskDefinitions = processTaskRelationList |
||||
.stream() |
||||
.map(processTaskRelation -> { |
||||
TaskDefinition taskDefinition = buildTaskDefinition(); |
||||
taskDefinition.setProjectCode(processTaskRelation.getProjectCode()); |
||||
taskDefinition.setCode(processTaskRelation.getPostTaskCode()); |
||||
taskDefinition.setVersion(processTaskRelation.getPostTaskVersion()); |
||||
return taskDefinition; |
||||
}) |
||||
.collect(Collectors.toSet()); |
||||
taskDefinitionLogList = taskDefinitionLogMapper.queryByTaskDefinitions(taskDefinitions); |
||||
} |
||||
result.put(Constants.DATA_LIST, taskDefinitionLogList); |
||||
putMsg(result, Status.SUCCESS); |
||||
return result; |
||||
} |
||||
|
||||
/** |
||||
* delete edge |
||||
* |
||||
* @param loginUser login user |
||||
* @param projectCode project code |
||||
* @param processDefinitionCode process definition code |
||||
* @param preTaskCode pre task code |
||||
* @param postTaskCode post task code |
||||
* @return delete result code |
||||
*/ |
||||
@Override |
||||
public Map<String, Object> deleteEdge(User loginUser, long projectCode, long processDefinitionCode, long preTaskCode, long postTaskCode) { |
||||
Project project = projectMapper.queryByCode(projectCode); |
||||
//check user access for project
|
||||
Map<String, Object> result = projectService.checkProjectAndAuth(loginUser, project, projectCode); |
||||
if (result.get(Constants.STATUS) != Status.SUCCESS) { |
||||
return result; |
||||
} |
||||
List<ProcessTaskRelation> processTaskRelationList = processTaskRelationMapper.queryByCode(projectCode, processDefinitionCode, preTaskCode, postTaskCode); |
||||
if (CollectionUtils.isEmpty(processTaskRelationList)) { |
||||
putMsg(result, Status.DATA_IS_NULL, "processTaskRelationList"); |
||||
return result; |
||||
} |
||||
if (processTaskRelationList.size() > 1) { |
||||
putMsg(result, Status.DATA_IS_NOT_VALID, "processTaskRelationList"); |
||||
return result; |
||||
} |
||||
ProcessTaskRelation processTaskRelation = processTaskRelationList.get(0); |
||||
int upstreamCount = processTaskRelationMapper.countByCode(projectCode, processTaskRelation.getProcessDefinitionCode(), |
||||
0L, processTaskRelation.getPostTaskCode()); |
||||
|
||||
if (upstreamCount == 0) { |
||||
putMsg(result, Status.DATA_IS_NULL, "upstreamCount"); |
||||
return result; |
||||
} |
||||
if (upstreamCount > 1) { |
||||
int delete = processTaskRelationMapper.deleteById(processTaskRelation.getId()); |
||||
if (delete == 0) { |
||||
putMsg(result, Status.DELETE_EDGE_ERROR); |
||||
} |
||||
return result; |
||||
} |
||||
processTaskRelation.setPreTaskVersion(0); |
||||
processTaskRelation.setPreTaskCode(0L); |
||||
int update = processTaskRelationMapper.updateById(processTaskRelation); |
||||
if (update == 0) { |
||||
putMsg(result, Status.DELETE_EDGE_ERROR); |
||||
} |
||||
return result; |
||||
} |
||||
|
||||
/** |
||||
* build task definition |
||||
* |
||||
* @return task definition |
||||
*/ |
||||
private TaskDefinition buildTaskDefinition() { |
||||
|
||||
return new TaskDefinition() { |
||||
@Override |
||||
public boolean equals(Object o) { |
||||
if (this == o) { |
||||
return true; |
||||
} |
||||
if (!(o instanceof TaskDefinition)) { |
||||
return false; |
||||
} |
||||
TaskDefinition that = (TaskDefinition) o; |
||||
return getCode() == that.getCode() |
||||
&& getVersion() == that.getVersion() |
||||
&& getProjectCode() == that.getProjectCode(); |
||||
} |
||||
|
||||
@Override |
||||
public int hashCode() { |
||||
return Objects.hash(getCode(), getVersion(), getProjectCode()); |
||||
} |
||||
}; |
||||
} |
||||
|
||||
/** |
||||
* delete upstream relation |
||||
* |
||||
* @param projectCode project code |
||||
* @param preTaskCodes pre task codes |
||||
* @param taskCode pre task code |
||||
* @return status |
||||
*/ |
||||
private Status deleteUpstreamRelation(int userId, long projectCode, Long[] preTaskCodes, long taskCode) { |
||||
List<ProcessTaskRelation> upstreamList = processTaskRelationMapper.queryUpstreamByCodes(projectCode, taskCode, preTaskCodes); |
||||
if (CollectionUtils.isEmpty(upstreamList)) { |
||||
return Status.SUCCESS; |
||||
} |
||||
List<ProcessTaskRelationLog> upstreamLogList = new ArrayList<>(); |
||||
Date now = new Date(); |
||||
for (ProcessTaskRelation processTaskRelation : upstreamList) { |
||||
ProcessTaskRelationLog processTaskRelationLog = new ProcessTaskRelationLog(processTaskRelation); |
||||
processTaskRelationLog.setOperator(userId); |
||||
processTaskRelationLog.setOperateTime(now); |
||||
processTaskRelationLog.setUpdateTime(now); |
||||
upstreamLogList.add(processTaskRelationLog); |
||||
} |
||||
Map<Long, List<ProcessTaskRelationLog>> processTaskRelationListGroupByProcessDefinitionCode = upstreamLogList.stream() |
||||
.collect(Collectors.groupingBy(ProcessTaskRelationLog::getProcessDefinitionCode)); |
||||
// count upstream relation group by process definition code
|
||||
List<Map<String, Long>> countListGroupByProcessDefinitionCode = processTaskRelationMapper |
||||
.countUpstreamByCodeGroupByProcessDefinitionCode(projectCode, processTaskRelationListGroupByProcessDefinitionCode.keySet().toArray(new Long[0]), taskCode); |
||||
|
||||
List<ProcessTaskRelationLog> deletes = new ArrayList<>(); |
||||
List<ProcessTaskRelationLog> updates = new ArrayList<>(); |
||||
for (Map<String, Long> codeCountMap : countListGroupByProcessDefinitionCode) { |
||||
long processDefinitionCode = codeCountMap.get("processDefinitionCode"); |
||||
long countValue = codeCountMap.get("countValue"); |
||||
List<ProcessTaskRelationLog> processTaskRelationLogList = processTaskRelationListGroupByProcessDefinitionCode.get(processDefinitionCode); |
||||
if (countValue <= processTaskRelationLogList.size()) { |
||||
ProcessTaskRelationLog processTaskRelationLog = processTaskRelationLogList.remove(0); |
||||
if (processTaskRelationLog.getPreTaskCode() != 0) { |
||||
processTaskRelationLog.setPreTaskCode(0); |
||||
processTaskRelationLog.setPreTaskVersion(0); |
||||
updates.add(processTaskRelationLog); |
||||
} |
||||
} |
||||
if (!processTaskRelationLogList.isEmpty()) { |
||||
deletes.addAll(processTaskRelationLogList); |
||||
} |
||||
} |
||||
deletes.addAll(updates); |
||||
int delete = 0; |
||||
int deleteLog = 0; |
||||
for (ProcessTaskRelationLog processTaskRelationLog : deletes) { |
||||
delete += processTaskRelationMapper.deleteRelation(processTaskRelationLog); |
||||
deleteLog += processTaskRelationLogMapper.deleteRelation(processTaskRelationLog); |
||||
} |
||||
if ((delete & deleteLog) == 0) { |
||||
throw new ServiceException(Status.DELETE_TASK_PROCESS_RELATION_ERROR); |
||||
} else { |
||||
if (!updates.isEmpty()) { |
||||
int insert = processTaskRelationMapper.batchInsert(updates); |
||||
int insertLog = processTaskRelationLogMapper.batchInsert(updates); |
||||
if ((insert & insertLog) == 0) { |
||||
throw new ServiceException(Status.CREATE_PROCESS_TASK_RELATION_ERROR); |
||||
} |
||||
} |
||||
} |
||||
return Status.SUCCESS; |
||||
} |
||||
} |
@ -0,0 +1,84 @@
|
||||
/* |
||||
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||
* contributor license agreements. See the NOTICE file distributed with |
||||
* this work for additional information regarding copyright ownership. |
||||
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||
* (the "License"); you may not use this file except in compliance with |
||||
* the License. You may obtain a copy of the License at |
||||
* |
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.apache.dolphinscheduler.api.controller; |
||||
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; |
||||
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.ProcessTaskRelationService; |
||||
import org.apache.dolphinscheduler.api.utils.Result; |
||||
import org.apache.dolphinscheduler.common.Constants; |
||||
import org.apache.dolphinscheduler.common.utils.JSONUtils; |
||||
|
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
import org.junit.Assert; |
||||
import org.junit.Test; |
||||
import org.mockito.Mockito; |
||||
import org.powermock.api.mockito.PowerMockito; |
||||
import org.springframework.boot.test.mock.mockito.MockBean; |
||||
import org.springframework.http.MediaType; |
||||
import org.springframework.test.web.servlet.MvcResult; |
||||
|
||||
/** |
||||
* process task relation controller test |
||||
*/ |
||||
public class ProcessTaskRelationControllerTest extends AbstractControllerTest { |
||||
|
||||
@MockBean |
||||
private ProcessTaskRelationService processTaskRelationService; |
||||
|
||||
@Test |
||||
public void testQueryDownstreamRelation() throws Exception { |
||||
Map<String, Object> mockResult = new HashMap<>(); |
||||
mockResult.put(Constants.STATUS, Status.SUCCESS); |
||||
PowerMockito.when(processTaskRelationService.queryDownstreamRelation(Mockito.any(), Mockito.anyLong(), Mockito.anyLong())) |
||||
.thenReturn(mockResult); |
||||
|
||||
MvcResult mvcResult = mockMvc.perform(get("/projects/{projectCode}/process-task-relation/{taskCode}/downstream", "1113", "123") |
||||
.header(SESSION_ID, sessionId)) |
||||
.andExpect(status().isOk()) |
||||
.andExpect(content().contentType(MediaType.APPLICATION_JSON)) |
||||
.andReturn(); |
||||
|
||||
Result result = JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), Result.class); |
||||
Assert.assertNotNull(result); |
||||
Assert.assertEquals(Status.SUCCESS.getCode(), result.getCode().intValue()); |
||||
} |
||||
|
||||
@Test |
||||
public void testQueryUpstreamRelation() throws Exception { |
||||
Map<String, Object> mockResult = new HashMap<>(); |
||||
mockResult.put(Constants.STATUS, Status.SUCCESS); |
||||
PowerMockito.when(processTaskRelationService.queryUpstreamRelation(Mockito.any(), Mockito.anyLong(), Mockito.anyLong())) |
||||
.thenReturn(mockResult); |
||||
|
||||
MvcResult mvcResult = mockMvc.perform(get("/projects/{projectCode}/process-task-relation/{taskCode}/upstream", "1113", "123") |
||||
.header(SESSION_ID, sessionId)) |
||||
.andExpect(status().isOk()) |
||||
.andExpect(content().contentType(MediaType.APPLICATION_JSON)) |
||||
.andReturn(); |
||||
|
||||
Result result = JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), Result.class); |
||||
Assert.assertNotNull(result); |
||||
Assert.assertEquals(Status.SUCCESS.getCode(), result.getCode().intValue()); |
||||
} |
||||
} |
@ -0,0 +1,577 @@
|
||||
/* |
||||
* 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.service; |
||||
|
||||
import org.apache.dolphinscheduler.api.enums.Status; |
||||
import org.apache.dolphinscheduler.api.service.impl.ProcessTaskRelationServiceImpl; |
||||
import org.apache.dolphinscheduler.api.service.impl.ProjectServiceImpl; |
||||
import org.apache.dolphinscheduler.common.Constants; |
||||
import org.apache.dolphinscheduler.common.enums.TaskType; |
||||
import org.apache.dolphinscheduler.common.enums.UserType; |
||||
import org.apache.dolphinscheduler.dao.entity.ProcessDefinition; |
||||
import org.apache.dolphinscheduler.dao.entity.ProcessTaskRelation; |
||||
import org.apache.dolphinscheduler.dao.entity.ProcessTaskRelationLog; |
||||
import org.apache.dolphinscheduler.dao.entity.Project; |
||||
import org.apache.dolphinscheduler.dao.entity.TaskDefinition; |
||||
import org.apache.dolphinscheduler.dao.entity.TaskDefinitionLog; |
||||
import org.apache.dolphinscheduler.dao.entity.User; |
||||
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.TaskDefinitionLogMapper; |
||||
import org.apache.dolphinscheduler.dao.mapper.TaskDefinitionMapper; |
||||
|
||||
import org.apache.commons.collections.CollectionUtils; |
||||
|
||||
import java.text.MessageFormat; |
||||
import java.util.ArrayList; |
||||
import java.util.HashMap; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
import java.util.Objects; |
||||
import java.util.Set; |
||||
import java.util.stream.Collectors; |
||||
|
||||
import org.junit.Assert; |
||||
import org.junit.Test; |
||||
import org.junit.runner.RunWith; |
||||
import org.mockito.InjectMocks; |
||||
import org.mockito.Mock; |
||||
import org.mockito.Mockito; |
||||
import org.mockito.junit.MockitoJUnitRunner; |
||||
|
||||
import com.google.common.collect.Lists; |
||||
|
||||
/** |
||||
* process task instance relation service test |
||||
*/ |
||||
@RunWith(MockitoJUnitRunner.Silent.class) |
||||
public class ProcessTaskRelationServiceTest { |
||||
|
||||
@InjectMocks |
||||
ProcessTaskRelationServiceImpl processTaskRelationService; |
||||
|
||||
@Mock |
||||
private ProjectMapper projectMapper; |
||||
|
||||
@Mock |
||||
private ProjectServiceImpl projectService; |
||||
|
||||
@Mock |
||||
private ProcessTaskRelationMapper processTaskRelationMapper; |
||||
|
||||
@Mock |
||||
private TaskDefinitionLogMapper taskDefinitionLogMapper; |
||||
|
||||
@Mock |
||||
private ProcessDefinitionMapper processDefinitionMapper; |
||||
|
||||
@Mock |
||||
private TaskDefinitionMapper taskDefinitionMapper; |
||||
|
||||
@Mock |
||||
private ProcessTaskRelationLogMapper processTaskRelationLogMapper; |
||||
|
||||
/** |
||||
* get Mock Admin User |
||||
* |
||||
* @return admin user |
||||
*/ |
||||
private User getAdminUser() { |
||||
User loginUser = new User(); |
||||
loginUser.setId(-1); |
||||
loginUser.setUserName("admin"); |
||||
loginUser.setUserType(UserType.GENERAL_USER); |
||||
return loginUser; |
||||
} |
||||
|
||||
/** |
||||
* get mock Project |
||||
* |
||||
* @param projectCode projectCode |
||||
* @return Project |
||||
*/ |
||||
private Project getProject(long projectCode) { |
||||
Project project = new Project(); |
||||
project.setCode(projectCode); |
||||
project.setId(1); |
||||
project.setName("project_test1"); |
||||
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()); |
||||
} |
||||
} |
||||
|
||||
private TaskDefinitionLog buildTaskDefinitionLog(long projectCode, long code, int version) { |
||||
|
||||
TaskDefinitionLog taskDefinitionLog = new TaskDefinitionLog() { |
||||
@Override |
||||
public boolean equals(Object o) { |
||||
if (this == o) { |
||||
return true; |
||||
} |
||||
if (!(o instanceof TaskDefinitionLog)) { |
||||
return false; |
||||
} |
||||
TaskDefinitionLog that = (TaskDefinitionLog) o; |
||||
return getCode() == that.getCode() |
||||
&& getVersion() == that.getVersion() |
||||
&& getProjectCode() == that.getProjectCode(); |
||||
} |
||||
|
||||
@Override |
||||
public int hashCode() { |
||||
return Objects.hash(getCode(), getVersion(), getProjectCode()); |
||||
} |
||||
}; |
||||
taskDefinitionLog.setProjectCode(projectCode); |
||||
taskDefinitionLog.setCode(code); |
||||
taskDefinitionLog.setVersion(version); |
||||
return taskDefinitionLog; |
||||
} |
||||
|
||||
private TaskDefinition buildTaskDefinition(long projectCode, long code, int version) { |
||||
|
||||
TaskDefinition taskDefinition = new TaskDefinition() { |
||||
@Override |
||||
public boolean equals(Object o) { |
||||
if (this == o) { |
||||
return true; |
||||
} |
||||
if (!(o instanceof TaskDefinition)) { |
||||
return false; |
||||
} |
||||
TaskDefinition that = (TaskDefinition) o; |
||||
return getCode() == that.getCode() |
||||
&& getVersion() == that.getVersion() |
||||
&& getProjectCode() == that.getProjectCode(); |
||||
} |
||||
|
||||
@Override |
||||
public int hashCode() { |
||||
return Objects.hash(getCode(), getVersion(), getProjectCode()); |
||||
} |
||||
}; |
||||
taskDefinition.setProjectCode(projectCode); |
||||
taskDefinition.setCode(code); |
||||
taskDefinition.setVersion(version); |
||||
return taskDefinition; |
||||
} |
||||
|
||||
private List<ProcessTaskRelation> getProcessTaskUpstreamRelationList(long projectCode, long taskCode) { |
||||
ProcessTaskRelation processTaskRelationUpstream0 = new ProcessTaskRelation(); |
||||
processTaskRelationUpstream0.setPostTaskCode(taskCode); |
||||
processTaskRelationUpstream0.setPreTaskVersion(1); |
||||
processTaskRelationUpstream0.setProjectCode(projectCode); |
||||
processTaskRelationUpstream0.setPreTaskCode(123); |
||||
processTaskRelationUpstream0.setProcessDefinitionCode(123); |
||||
ProcessTaskRelation processTaskRelationUpstream1 = new ProcessTaskRelation(); |
||||
processTaskRelationUpstream1.setPostTaskCode(taskCode); |
||||
processTaskRelationUpstream1.setPreTaskVersion(1); |
||||
processTaskRelationUpstream1.setPreTaskCode(123); |
||||
processTaskRelationUpstream1.setProcessDefinitionCode(124); |
||||
processTaskRelationUpstream1.setProjectCode(projectCode); |
||||
ProcessTaskRelation processTaskRelationUpstream2 = new ProcessTaskRelation(); |
||||
processTaskRelationUpstream2.setPostTaskCode(taskCode); |
||||
processTaskRelationUpstream2.setPreTaskVersion(2); |
||||
processTaskRelationUpstream2.setPreTaskCode(123); |
||||
processTaskRelationUpstream2.setProcessDefinitionCode(125); |
||||
processTaskRelationUpstream2.setProjectCode(projectCode); |
||||
List<ProcessTaskRelation> processTaskRelationList = new ArrayList<>(); |
||||
processTaskRelationList.add(processTaskRelationUpstream0); |
||||
processTaskRelationList.add(processTaskRelationUpstream1); |
||||
processTaskRelationList.add(processTaskRelationUpstream2); |
||||
return processTaskRelationList; |
||||
} |
||||
|
||||
private List<ProcessTaskRelation> getProcessTaskDownstreamRelationList(long projectCode,long taskCode) { |
||||
ProcessTaskRelation processTaskRelationDownstream0 = new ProcessTaskRelation(); |
||||
processTaskRelationDownstream0.setPreTaskCode(taskCode); |
||||
processTaskRelationDownstream0.setPostTaskCode(456); |
||||
processTaskRelationDownstream0.setPostTaskVersion(1); |
||||
processTaskRelationDownstream0.setProjectCode(projectCode); |
||||
ProcessTaskRelation processTaskRelationDownstream1 = new ProcessTaskRelation(); |
||||
processTaskRelationDownstream1.setPreTaskCode(taskCode); |
||||
processTaskRelationDownstream1.setPostTaskCode(456); |
||||
processTaskRelationDownstream1.setPostTaskVersion(1); |
||||
processTaskRelationDownstream1.setProjectCode(projectCode); |
||||
ProcessTaskRelation processTaskRelationDownstream2 = new ProcessTaskRelation(); |
||||
processTaskRelationDownstream2.setPreTaskCode(taskCode); |
||||
processTaskRelationDownstream2.setPostTaskCode(4567); |
||||
processTaskRelationDownstream2.setPostTaskVersion(1); |
||||
processTaskRelationDownstream2.setProjectCode(projectCode); |
||||
List<ProcessTaskRelation> processTaskRelationList = new ArrayList<>(); |
||||
processTaskRelationList.add(processTaskRelationDownstream0); |
||||
processTaskRelationList.add(processTaskRelationDownstream1); |
||||
processTaskRelationList.add(processTaskRelationDownstream2); |
||||
return processTaskRelationList; |
||||
} |
||||
|
||||
private ProcessDefinition getProcessDefinition() { |
||||
ProcessDefinition processDefinition = new ProcessDefinition(); |
||||
processDefinition.setId(1); |
||||
processDefinition.setProjectCode(1L); |
||||
processDefinition.setName("test_pdf"); |
||||
processDefinition.setTenantId(1); |
||||
processDefinition.setDescription(""); |
||||
processDefinition.setCode(1L); |
||||
processDefinition.setVersion(1); |
||||
return processDefinition; |
||||
} |
||||
|
||||
private TaskDefinition getTaskDefinition() { |
||||
TaskDefinition taskDefinition = new TaskDefinition(); |
||||
taskDefinition.setProjectCode(1L); |
||||
taskDefinition.setCode(1L); |
||||
taskDefinition.setVersion(1); |
||||
taskDefinition.setTaskType(TaskType.SHELL.getDesc()); |
||||
return taskDefinition; |
||||
} |
||||
|
||||
@Test |
||||
public void testCreateProcessTaskRelation() { |
||||
long projectCode = 1L; |
||||
long processDefinitionCode = 1L; |
||||
long preTaskCode = 0L; |
||||
long postTaskCode = 1L; |
||||
|
||||
Project project = getProject(projectCode); |
||||
Mockito.when(projectMapper.queryByCode(projectCode)).thenReturn(project); |
||||
|
||||
User loginUser = new User(); |
||||
loginUser.setId(-1); |
||||
loginUser.setUserType(UserType.GENERAL_USER); |
||||
|
||||
Map<String, Object> result = new HashMap<>(); |
||||
putMsg(result, Status.SUCCESS, projectCode); |
||||
Mockito.when(projectService.checkProjectAndAuth(loginUser, project, projectCode)).thenReturn(result); |
||||
Mockito.when(processDefinitionMapper.queryByCode(processDefinitionCode)).thenReturn(getProcessDefinition()); |
||||
Mockito.when(processTaskRelationMapper.queryByCode(projectCode, processDefinitionCode, preTaskCode, postTaskCode)).thenReturn(Lists.newArrayList()); |
||||
Mockito.when(taskDefinitionMapper.queryByCode(postTaskCode)).thenReturn(getTaskDefinition()); |
||||
List<ProcessTaskRelationLog> processTaskRelationList = Lists.newArrayList(); |
||||
ProcessTaskRelationLog processTaskRelationLog = new ProcessTaskRelationLog(); |
||||
processTaskRelationLog.setProjectCode(projectCode); |
||||
processTaskRelationLog.setProcessDefinitionCode(processDefinitionCode); |
||||
processTaskRelationLog.setPreTaskCode(0L); |
||||
processTaskRelationLog.setPreTaskVersion(0); |
||||
processTaskRelationLog.setPostTaskCode(postTaskCode); |
||||
processTaskRelationLog.setPostTaskVersion(1); |
||||
processTaskRelationList.add(processTaskRelationLog); |
||||
Mockito.when(processTaskRelationMapper.batchInsert(processTaskRelationList)).thenReturn(1); |
||||
Mockito.when(processTaskRelationLogMapper.batchInsert(processTaskRelationList)).thenReturn(1); |
||||
Assert.assertEquals(Status.SUCCESS, result.get(Constants.STATUS)); |
||||
} |
||||
|
||||
@Test |
||||
public void testMoveTaskProcessRelation() { |
||||
long projectCode = 1L; |
||||
long processDefinitionCode = 1L; |
||||
long taskCode = 1L; |
||||
|
||||
Project project = getProject(projectCode); |
||||
Mockito.when(projectMapper.queryByCode(projectCode)).thenReturn(project); |
||||
|
||||
User loginUser = new User(); |
||||
loginUser.setId(-1); |
||||
loginUser.setUserType(UserType.GENERAL_USER); |
||||
|
||||
Map<String, Object> result = new HashMap<>(); |
||||
putMsg(result, Status.SUCCESS, projectCode); |
||||
Mockito.when(projectService.checkProjectAndAuth(loginUser, project, projectCode)).thenReturn(result); |
||||
Mockito.when(processDefinitionMapper.queryByCode(processDefinitionCode)).thenReturn(getProcessDefinition()); |
||||
Mockito.when(processTaskRelationMapper.queryByCode(projectCode, processDefinitionCode, taskCode, 0L)).thenReturn(Lists.newArrayList()); |
||||
Mockito.when(taskDefinitionMapper.queryByCode(taskCode)).thenReturn(getTaskDefinition()); |
||||
List<ProcessTaskRelation> processTaskRelationList = Lists.newArrayList(); |
||||
ProcessTaskRelation processTaskRelation = new ProcessTaskRelation(); |
||||
processTaskRelation.setProjectCode(projectCode); |
||||
processTaskRelation.setProcessDefinitionCode(processDefinitionCode); |
||||
processTaskRelation.setPreTaskCode(0L); |
||||
processTaskRelation.setPreTaskVersion(0); |
||||
processTaskRelation.setPostTaskCode(taskCode); |
||||
processTaskRelation.setPostTaskVersion(1); |
||||
processTaskRelationList.add(processTaskRelation); |
||||
ProcessTaskRelationLog processTaskRelationLog = new ProcessTaskRelationLog(); |
||||
processTaskRelationLog.setProjectCode(projectCode); |
||||
processTaskRelationLog.setProcessDefinitionCode(processDefinitionCode); |
||||
processTaskRelationLog.setPreTaskCode(0L); |
||||
processTaskRelationLog.setPreTaskVersion(0); |
||||
processTaskRelationLog.setPostTaskCode(taskCode); |
||||
processTaskRelationLog.setPostTaskVersion(1); |
||||
Mockito.when(processTaskRelationMapper.queryByCode(projectCode, processDefinitionCode, 0L, taskCode)).thenReturn(processTaskRelationList); |
||||
Mockito.when(processTaskRelationLogMapper.queryRelationLogByRelation(processTaskRelation)).thenReturn(processTaskRelationLog); |
||||
Mockito.when(processTaskRelationMapper.updateById(processTaskRelation)).thenReturn(1); |
||||
Mockito.when(processTaskRelationLogMapper.updateById(processTaskRelationLog)).thenReturn(1); |
||||
Assert.assertEquals(Status.SUCCESS, result.get(Constants.STATUS)); |
||||
} |
||||
|
||||
@Test |
||||
public void testQueryDownstreamRelation() { |
||||
long projectCode = 1L; |
||||
long taskCode = 2L; |
||||
|
||||
Project project = getProject(projectCode); |
||||
Mockito.when(projectMapper.queryByCode(projectCode)).thenReturn(project); |
||||
|
||||
User loginUser = new User(); |
||||
loginUser.setId(-1); |
||||
loginUser.setUserType(UserType.GENERAL_USER); |
||||
|
||||
Map<String, Object> result = new HashMap<>(); |
||||
putMsg(result, Status.SUCCESS, projectCode); |
||||
Mockito.when(projectService.checkProjectAndAuth(loginUser, project, projectCode)).thenReturn(result); |
||||
|
||||
List<ProcessTaskRelation> processTaskRelationList = getProcessTaskDownstreamRelationList(projectCode,taskCode); |
||||
|
||||
Mockito.when(processTaskRelationMapper.queryDownstreamByCode(projectCode,taskCode)) |
||||
.thenReturn(processTaskRelationList); |
||||
|
||||
if (CollectionUtils.isNotEmpty(processTaskRelationList)) { |
||||
Set<TaskDefinition> taskDefinitions = processTaskRelationList |
||||
.stream() |
||||
.map(processTaskRelation -> { |
||||
TaskDefinition taskDefinition = buildTaskDefinition( |
||||
processTaskRelation.getProjectCode(), |
||||
processTaskRelation.getPostTaskCode(), |
||||
processTaskRelation.getPostTaskVersion()); |
||||
return taskDefinition; |
||||
}) |
||||
.collect(Collectors.toSet()); |
||||
|
||||
Set<TaskDefinitionLog> taskDefinitionLogSet = processTaskRelationList |
||||
.stream() |
||||
.map(processTaskRelation -> { |
||||
TaskDefinitionLog taskDefinitionLog = buildTaskDefinitionLog( |
||||
processTaskRelation.getProjectCode(), |
||||
processTaskRelation.getPostTaskCode(), |
||||
processTaskRelation.getPostTaskVersion() |
||||
); |
||||
return taskDefinitionLog; |
||||
}) |
||||
.collect(Collectors.toSet()); |
||||
List<TaskDefinitionLog> taskDefinitionLogList = taskDefinitionLogSet.stream().collect(Collectors.toList()); |
||||
Mockito.when(taskDefinitionLogMapper.queryByTaskDefinitions(taskDefinitions)) |
||||
.thenReturn(taskDefinitionLogList); |
||||
} |
||||
Map<String, Object> relation = processTaskRelationService |
||||
.queryDownstreamRelation(loginUser, projectCode, taskCode); |
||||
Assert.assertEquals(Status.SUCCESS, relation.get(Constants.STATUS)); |
||||
Assert.assertEquals(2, ((List) relation.get("data")).size()); |
||||
} |
||||
|
||||
@Test |
||||
public void testQueryUpstreamRelation() { |
||||
long projectCode = 1L; |
||||
long taskCode = 2L; |
||||
|
||||
Project project = getProject(projectCode); |
||||
Mockito.when(projectMapper.queryByCode(projectCode)).thenReturn(project); |
||||
|
||||
User loginUser = new User(); |
||||
loginUser.setId(-1); |
||||
loginUser.setUserType(UserType.GENERAL_USER); |
||||
|
||||
Map<String, Object> result = new HashMap<>(); |
||||
putMsg(result, Status.SUCCESS, projectCode); |
||||
Mockito.when(projectService.checkProjectAndAuth(loginUser, project, projectCode)).thenReturn(result); |
||||
List<ProcessTaskRelation> processTaskRelationList = getProcessTaskUpstreamRelationList(projectCode,taskCode); |
||||
|
||||
Mockito.when(processTaskRelationMapper.queryUpstreamByCode(projectCode, taskCode)).thenReturn(processTaskRelationList); |
||||
|
||||
if (CollectionUtils.isNotEmpty(processTaskRelationList)) { |
||||
Set<TaskDefinition> taskDefinitions = processTaskRelationList |
||||
.stream() |
||||
.map(processTaskRelation -> { |
||||
TaskDefinition taskDefinition = buildTaskDefinition( |
||||
processTaskRelation.getProjectCode(), |
||||
processTaskRelation.getPreTaskCode(), |
||||
processTaskRelation.getPreTaskVersion()); |
||||
return taskDefinition; |
||||
}) |
||||
.collect(Collectors.toSet()); |
||||
|
||||
Set<TaskDefinitionLog> taskDefinitionLogSet = processTaskRelationList |
||||
.stream() |
||||
.map(processTaskRelation -> { |
||||
TaskDefinitionLog taskDefinitionLog = buildTaskDefinitionLog( |
||||
processTaskRelation.getProjectCode(), |
||||
processTaskRelation.getPreTaskCode(), |
||||
processTaskRelation.getPreTaskVersion()); |
||||
return taskDefinitionLog; |
||||
}) |
||||
.collect(Collectors.toSet()); |
||||
List<TaskDefinitionLog> taskDefinitionLogList = taskDefinitionLogSet.stream().collect(Collectors.toList()); |
||||
Mockito.when(taskDefinitionLogMapper.queryByTaskDefinitions(taskDefinitions)) |
||||
.thenReturn(taskDefinitionLogList); |
||||
} |
||||
Map<String, Object> relation = processTaskRelationService |
||||
.queryUpstreamRelation(loginUser, projectCode, taskCode); |
||||
Assert.assertEquals(Status.SUCCESS, relation.get(Constants.STATUS)); |
||||
Assert.assertEquals(2, ((List) relation.get("data")).size()); |
||||
} |
||||
|
||||
@Test |
||||
public void testDeleteDownstreamRelation() { |
||||
long projectCode = 1L; |
||||
long taskCode = 2L; |
||||
Project project = getProject(projectCode); |
||||
Mockito.when(projectMapper.queryByCode(projectCode)).thenReturn(project); |
||||
|
||||
User loginUser = new User(); |
||||
loginUser.setId(-1); |
||||
loginUser.setUserType(UserType.GENERAL_USER); |
||||
Map<String, Object> result = new HashMap<>(); |
||||
putMsg(result, Status.SUCCESS, projectCode); |
||||
Mockito.when(projectService.checkProjectAndAuth(loginUser, project, projectCode)).thenReturn(result); |
||||
List<ProcessTaskRelation> processTaskRelationList = new ArrayList<>(); |
||||
ProcessTaskRelation processTaskRelation = new ProcessTaskRelation(); |
||||
processTaskRelation.setProjectCode(projectCode); |
||||
processTaskRelation.setProcessDefinitionCode(1L); |
||||
processTaskRelation.setPreTaskCode(taskCode); |
||||
processTaskRelation.setPostTaskCode(123L); |
||||
processTaskRelationList.add(processTaskRelation); |
||||
Mockito.when(processTaskRelationMapper.queryDownstreamByCode(projectCode, taskCode)).thenReturn(processTaskRelationList); |
||||
ProcessTaskRelationLog processTaskRelationLog = new ProcessTaskRelationLog(processTaskRelation); |
||||
Mockito.when(processTaskRelationMapper.deleteRelation(processTaskRelationLog)).thenReturn(1); |
||||
Mockito.when(processTaskRelationLogMapper.deleteRelation(processTaskRelationLog)).thenReturn(1); |
||||
Map<String, Object> result1 = processTaskRelationService.deleteDownstreamRelation(loginUser, projectCode, "123", taskCode); |
||||
Assert.assertEquals(Status.SUCCESS, result1.get(Constants.STATUS)); |
||||
} |
||||
|
||||
@Test |
||||
public void testDeleteUpstreamRelation() { |
||||
long projectCode = 1L; |
||||
long taskCode = 2L; |
||||
Project project = getProject(projectCode); |
||||
Mockito.when(projectMapper.queryByCode(projectCode)).thenReturn(project); |
||||
|
||||
User loginUser = new User(); |
||||
loginUser.setId(-1); |
||||
loginUser.setUserType(UserType.GENERAL_USER); |
||||
Map<String, Object> result = new HashMap<>(); |
||||
putMsg(result, Status.SUCCESS, projectCode); |
||||
Mockito.when(projectService.checkProjectAndAuth(loginUser, project, projectCode)).thenReturn(result); |
||||
Mockito.when(processTaskRelationMapper.queryUpstreamByCodes(projectCode, taskCode, new Long[]{123L})).thenReturn(Lists.newArrayList()); |
||||
List<Map<String, Long>> countListGroupByProcessDefinitionCode = new ArrayList<>(); |
||||
countListGroupByProcessDefinitionCode.add(new HashMap<String, Long>() { |
||||
{ |
||||
put("processDefinitionCode", 123L); |
||||
put("countValue", 2L); |
||||
} |
||||
}); |
||||
countListGroupByProcessDefinitionCode.add(new HashMap<String, Long>() { |
||||
{ |
||||
put("processDefinitionCode", 124L); |
||||
put("countValue", 1L); |
||||
} |
||||
}); |
||||
countListGroupByProcessDefinitionCode.add(new HashMap<String, Long>() { |
||||
{ |
||||
put("processDefinitionCode", 125L); |
||||
put("countValue", 3L); |
||||
} |
||||
}); |
||||
ProcessTaskRelationLog processTaskRelationLog = new ProcessTaskRelationLog(); |
||||
processTaskRelationLog.setProjectCode(projectCode); |
||||
processTaskRelationLog.setPreTaskCode(0L); |
||||
processTaskRelationLog.setPreTaskVersion(0); |
||||
processTaskRelationLog.setPostTaskCode(taskCode); |
||||
processTaskRelationLog.setPostTaskVersion(2); |
||||
Mockito.when(processTaskRelationMapper.countUpstreamByCodeGroupByProcessDefinitionCode(projectCode, new Long[]{123L, 124L, 125L}, 2)).thenReturn(countListGroupByProcessDefinitionCode); |
||||
Mockito.when(processTaskRelationMapper.deleteRelation(processTaskRelationLog)).thenReturn(1); |
||||
Mockito.when(processTaskRelationLogMapper.deleteRelation(processTaskRelationLog)).thenReturn(1); |
||||
Map<String, Object> result1 = processTaskRelationService.deleteUpstreamRelation(loginUser, projectCode, "123", taskCode); |
||||
Assert.assertEquals(Status.SUCCESS, result1.get(Constants.STATUS)); |
||||
} |
||||
|
||||
@Test |
||||
public void testDeleteTaskProcessRelation() { |
||||
long projectCode = 1L; |
||||
long taskCode = 1L; |
||||
long processDefinitionCode = 1L; |
||||
long preTaskCode = 4L; |
||||
long postTaskCode = 5L; |
||||
Project project = getProject(projectCode); |
||||
Mockito.when(projectMapper.queryByCode(projectCode)).thenReturn(project); |
||||
|
||||
User loginUser = new User(); |
||||
loginUser.setId(-1); |
||||
loginUser.setUserType(UserType.GENERAL_USER); |
||||
Map<String, Object> result = new HashMap<>(); |
||||
putMsg(result, Status.SUCCESS, projectCode); |
||||
Mockito.when(projectService.checkProjectAndAuth(loginUser, project, projectCode)).thenReturn(result); |
||||
Mockito.when(processTaskRelationMapper.queryByCode(projectCode, processDefinitionCode, preTaskCode, postTaskCode)).thenReturn(Lists.newArrayList()); |
||||
ProcessTaskRelationLog processTaskRelationLog = new ProcessTaskRelationLog(); |
||||
processTaskRelationLog.setProjectCode(projectCode); |
||||
processTaskRelationLog.setPreTaskCode(taskCode); |
||||
processTaskRelationLog.setProcessDefinitionCode(processDefinitionCode); |
||||
Mockito.when(processTaskRelationMapper.deleteRelation(processTaskRelationLog)).thenReturn(1); |
||||
Mockito.when(processDefinitionMapper.queryByCode(processDefinitionCode)).thenReturn(getProcessDefinition()); |
||||
Mockito.when(taskDefinitionMapper.queryByCode(taskCode)).thenReturn(getTaskDefinition()); |
||||
TaskDefinition taskDefinition = new TaskDefinition(); |
||||
taskDefinition.setTaskType(TaskType.CONDITIONS.getDesc()); |
||||
Mockito.when(taskDefinitionMapper.queryByCode(taskCode)).thenReturn(taskDefinition); |
||||
Mockito.when(taskDefinitionMapper.deleteByCode(taskCode)).thenReturn(1); |
||||
processTaskRelationLog = new ProcessTaskRelationLog(); |
||||
processTaskRelationLog.setProjectCode(projectCode); |
||||
processTaskRelationLog.setPostTaskCode(taskCode); |
||||
processTaskRelationLog.setProcessDefinitionCode(processDefinitionCode); |
||||
processTaskRelationLog.setProcessDefinitionVersion(1); |
||||
Mockito.when(processTaskRelationMapper.deleteRelation(processTaskRelationLog)).thenReturn(1); |
||||
Mockito.when(processTaskRelationLogMapper.deleteRelation(processTaskRelationLog)).thenReturn(1); |
||||
result = processTaskRelationService.deleteTaskProcessRelation(loginUser, projectCode, processDefinitionCode, taskCode); |
||||
Assert.assertEquals(Status.SUCCESS, result.get(Constants.STATUS)); |
||||
} |
||||
|
||||
@Test |
||||
public void testDeleteEdge() { |
||||
long projectCode = 1L; |
||||
long processDefinitionCode = 3L; |
||||
long preTaskCode = 4L; |
||||
long postTaskCode = 5L; |
||||
Project project = getProject(projectCode); |
||||
Mockito.when(projectMapper.queryByCode(projectCode)).thenReturn(project); |
||||
|
||||
User loginUser = new User(); |
||||
loginUser.setId(-1); |
||||
loginUser.setUserType(UserType.GENERAL_USER); |
||||
Map<String, Object> result = new HashMap<>(); |
||||
putMsg(result, Status.SUCCESS, projectCode); |
||||
Mockito.when(projectService.checkProjectAndAuth(loginUser, project, projectCode)).thenReturn(result); |
||||
ProcessTaskRelation processTaskRelation = new ProcessTaskRelation(); |
||||
processTaskRelation.setProjectCode(projectCode); |
||||
processTaskRelation.setProcessDefinitionCode(processDefinitionCode); |
||||
processTaskRelation.setPreTaskCode(preTaskCode); |
||||
processTaskRelation.setPostTaskCode(postTaskCode); |
||||
List<ProcessTaskRelation> processTaskRelationList = new ArrayList<>(); |
||||
processTaskRelationList.add(processTaskRelation); |
||||
Mockito.when(processTaskRelationMapper.queryByCode(projectCode, processDefinitionCode, preTaskCode, postTaskCode)).thenReturn(processTaskRelationList); |
||||
Mockito.when(processTaskRelationMapper.countByCode(projectCode, processDefinitionCode, 0L, postTaskCode)).thenReturn(1); |
||||
Mockito.when(processTaskRelationMapper.deleteById(processTaskRelation.getId())).thenReturn(1); |
||||
Mockito.when(processTaskRelationMapper.updateById(processTaskRelation)).thenReturn(1); |
||||
result = processTaskRelationService.deleteEdge(loginUser, projectCode, processDefinitionCode, preTaskCode, postTaskCode); |
||||
Assert.assertEquals(Status.SUCCESS, result.get(Constants.STATUS)); |
||||
} |
||||
} |
Loading…
Reference in new issue