# Conflicts:
#	modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/stage/impl/StageServiceImpl.java
This commit is contained in:
HopeLi 2025-05-15 16:18:43 +08:00
commit 04d395b9a0
6 changed files with 115 additions and 22 deletions

View File

@ -7,6 +7,7 @@ import cd.casic.ci.common.pipeline.resp.stage.StageResp;
import cd.casic.ci.process.process.dataObject.stage.PipStage; import cd.casic.ci.process.process.dataObject.stage.PipStage;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import java.util.List; import java.util.List;
@ -81,6 +82,6 @@ public interface StageService extends IService<PipStage> {
void deleteStages(String stageId); void deleteStages(String stageId);
void createStagesOrTaskList(@Valid @NotNull List<StageCreateReq> stageList); void copyStage(@NotEmpty String stageId);
} }

View File

@ -2,9 +2,10 @@ package cd.casic.ci.process.process.service.stage.impl;
import cd.casic.ci.common.pipeline.req.stage.StageCreateReq; import cd.casic.ci.common.pipeline.req.stage.StageCreateReq;
import cd.casic.ci.common.pipeline.req.stage.StageUpdateReq; import cd.casic.ci.common.pipeline.req.stage.StageReq;
import cd.casic.ci.common.pipeline.req.task.TaskCreateReq; import cd.casic.ci.common.pipeline.req.task.TaskCreateReq;
import cd.casic.ci.common.pipeline.resp.stage.StageResp; import cd.casic.ci.common.pipeline.resp.stage.StageResp;
import cd.casic.ci.process.process.dal.pipeline.PipStageDao; import cd.casic.ci.process.process.dal.pipeline.PipStageDao;
import cd.casic.ci.process.process.dataObject.stage.PipStage; import cd.casic.ci.process.process.dataObject.stage.PipStage;
import cd.casic.ci.process.process.dataObject.task.PipTask; import cd.casic.ci.process.process.dataObject.task.PipTask;
@ -15,6 +16,7 @@ import cd.casic.framework.commons.exception.enums.GlobalErrorCodeConstants;
import cd.casic.framework.commons.util.object.BeanUtils; import cd.casic.framework.commons.util.object.BeanUtils;
import cd.casic.framework.commons.util.util.WebFrameworkUtils; import cd.casic.framework.commons.util.util.WebFrameworkUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
@ -25,9 +27,14 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.*; import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static cd.casic.ci.process.constant.PipelineFinalConstant.TASK_TYPE_CODE;
@Service @Service
public class StageServiceImpl extends ServiceImpl<PipStageDao, PipStage> implements StageService { public class StageServiceImpl extends ServiceImpl<PipStageDao, PipStage> implements StageService {
@Resource @Resource
@ -77,7 +84,6 @@ public class StageServiceImpl extends ServiceImpl<PipStageDao, PipStage> impleme
updateBatchById(otherStageList); updateBatchById(otherStageList);
} }
save(firstStage); save(firstStage);
// firstStage
} else { } else {
PipStage stageQuery = new PipStage(); PipStage stageQuery = new PipStage();
stageQuery.setStageId(firstStageId); stageQuery.setStageId(firstStageId);
@ -213,7 +219,7 @@ public class StageServiceImpl extends ServiceImpl<PipStageDao, PipStage> impleme
@Override @Override
public void deleteAllStagesOrTask(String pipelineId) { public void deleteAllStagesOrTask(String pipelineId) {
// TODO 删除流水线不知道要不要
} }
public List<PipStage> getPipStageList(PipStage pipStage){ public List<PipStage> getPipStageList(PipStage pipStage){
@ -298,12 +304,53 @@ public class StageServiceImpl extends ServiceImpl<PipStageDao, PipStage> impleme
stageDao.deleteById(stageId); stageDao.deleteById(stageId);
} }
@Override @Override
public void createStagesOrTaskList(List<StageCreateReq> stageList) { @Transactional
if (!ObjectUtils.isEmpty(stageList)){ public void copyStage(String stageId) {
stageList.forEach(this::createStagesOrTask); // 查询当前stage阶段下所有
PipStage firstStage = getById(stageId);
Long loginUserId = WebFrameworkUtils.getLoginUserId();
List<PipStage> allMainStage = findAllMainStage(firstStage.getPipelineId());
List<PipStage> updateStageList = new ArrayList<>(allMainStage.size());
for (PipStage stage : allMainStage) {
if (stage.getStageSort()>firstStage.getStageSort()) {
stage.setStageSort(stage.getStageSort()+1);
updateStageList.add(stage);
}
} }
// 保存复制后的阶段除了id和sort其他都一样
firstStage.setStageId(null);
firstStage.setStageSort(firstStage.getStageSort()+1);
save(firstStage);
updateBatchById(updateStageList);
// 查询阶段下所有分支
List<PipStage> secondStageList = findSecondStage(stageId);
if (!CollectionUtils.isEmpty(secondStageList)) {
List<String> stageIdList = secondStageList.stream().map(PipStage::getStageId).toList();
List<PipTask> taskList = taskService.listByIds(stageIdList);
Map<String, List<PipTask>> stageIdMap = taskList.stream().collect(Collectors.groupingBy(PipTask::getStageId));
for (PipStage secondStage : secondStageList) {
secondStage.setCreateUserId(loginUserId);
secondStage.setCreateTime(LocalDateTime.now());
secondStage.setUpdateTime(LocalDateTime.now());
secondStage.setUpdateUserId(loginUserId);
secondStage.setParentId(firstStage.getStageId());
String secondStageId = secondStage.getStageId();
List<PipTask> childTask = stageIdMap.get(secondStageId);
secondStage.setStageId(null);
save(secondStage);
for (PipTask pipTask : childTask) {
pipTask.setStageId(secondStage.getStageId());
pipTask.setTaskId(null);
pipTask.setCreateUserId(loginUserId);
pipTask.setCreateTime(LocalDateTime.now());
pipTask.setUpdateTime(LocalDateTime.now());
pipTask.setUpdateUserId(loginUserId);
}
taskService.saveBatch(childTask);
}
}
} }
public List<PipStage> findOtherStageNoTask(String stagesId){ public List<PipStage> findOtherStageNoTask(String stagesId){

View File

@ -3,6 +3,7 @@ package cd.casic.ci.process.process.service.task;
import cd.casic.ci.common.pipeline.req.stage.StageCreateReq; import cd.casic.ci.common.pipeline.req.stage.StageCreateReq;
import cd.casic.ci.common.pipeline.resp.task.TasksResp; import cd.casic.ci.common.pipeline.resp.task.TasksResp;
import cd.casic.ci.process.process.dataObject.task.PipTask; import cd.casic.ci.process.process.dataObject.task.PipTask;
import cd.casic.framework.commons.pojo.CommonResult;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List; import java.util.List;
@ -11,8 +12,9 @@ public interface TaskService extends IService<PipTask> {
/** /**
* 查询taskType是否存在原项目的各种worker * 查询taskType是否存在原项目的各种worker
* */ * */
public void taskTypeExist(String taskType); void taskTypeExist(String taskType);
List<PipTask> getTask(PipTask pipTask); List<PipTask> getTask(PipTask pipTask);
public TasksResp getById(String taskId); TasksResp getRespById(String taskId);
void copyTask(String taskId);
} }

View File

@ -5,6 +5,7 @@ import cd.casic.ci.common.pipeline.resp.task.TasksResp;
import cd.casic.ci.process.process.dal.pipeline.PipStageDao; import cd.casic.ci.process.process.dal.pipeline.PipStageDao;
import cd.casic.ci.process.process.dal.pipeline.PipTaskDao; import cd.casic.ci.process.process.dal.pipeline.PipTaskDao;
import cd.casic.ci.process.process.dataObject.task.PipTask; import cd.casic.ci.process.process.dataObject.task.PipTask;
import cd.casic.ci.process.process.service.stage.StageService;
import cd.casic.ci.process.process.service.task.TaskService; import cd.casic.ci.process.process.service.task.TaskService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -18,10 +19,12 @@ import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.core.type.filter.AnnotationTypeFilter; import org.springframework.core.type.filter.AnnotationTypeFilter;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@ -33,12 +36,6 @@ public class TaskServiceImpl extends ServiceImpl<PipTaskDao, PipTask> implements
private Set<BeanDefinition> candidates; private Set<BeanDefinition> candidates;
@Resource @Resource
private PipTaskDao taskDao; private PipTaskDao taskDao;
@Resource
private PipStageDao stageDao;
public TaskServiceImpl() {
System.out.println("");
}
@PostConstruct @PostConstruct
public void init(){ public void init(){
@ -65,7 +62,7 @@ public class TaskServiceImpl extends ServiceImpl<PipTaskDao, PipTask> implements
return taskDao.selectList(wrapper); return taskDao.selectList(wrapper);
} }
@Override @Override
public TasksResp getById(String taskId){ public TasksResp getRespById(String taskId){
PipTask pipTask = new PipTask(); PipTask pipTask = new PipTask();
pipTask.setTaskId(taskId); pipTask.setTaskId(taskId);
List<PipTask> taskList = getTask(pipTask); List<PipTask> taskList = getTask(pipTask);
@ -76,4 +73,35 @@ public class TaskServiceImpl extends ServiceImpl<PipTaskDao, PipTask> implements
BeanUtils.copyProperties(taskList.get(0),tasksResp); BeanUtils.copyProperties(taskList.get(0),tasksResp);
return tasksResp; return tasksResp;
} }
@Override
@Transactional(rollbackFor = Exception.class)
public void copyTask(String taskId) {
PipTask sourceTask = getById(taskId);
if (sourceTask == null) {
return;
}
String stageId = sourceTask.getStageId();
PipTask query = new PipTask();
query.setStageId(stageId);
List<PipTask> sameLevelTaskList = getTask(query);
if (CollectionUtils.isEmpty(sameLevelTaskList)) {
return;
}
List<PipTask> updateList = new ArrayList<>(sameLevelTaskList.size());
for (PipTask pipTask : sameLevelTaskList) {
if (!pipTask.getTaskId().equals(sourceTask.getTaskId())) {
if (pipTask.getTaskSort()>sourceTask.getTaskSort()) {
pipTask.setTaskSort(pipTask.getTaskSort()+1);
updateList.add(pipTask);
}
}
}
sourceTask.setTaskSort(sourceTask.getTaskSort()+1);
sourceTask.setTaskId(null);
save(sourceTask);
if (!CollectionUtils.isEmpty(updateList)) {
updateBatchById(updateList);
}
}
} }

View File

@ -12,6 +12,7 @@ import com.alibaba.fastjson.JSONArray;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.annotation.security.PermitAll; import jakarta.annotation.security.PermitAll;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -84,7 +85,14 @@ public class StageController {
stageService.deleteStagesOrTask(taskId); stageService.deleteStagesOrTask(taskId);
return CommonResult.success(); return CommonResult.success();
} }
/**
* 复制stage节点
* */
@PostMapping(path="/copyStage")
public CommonResult<Void> copyStage(@NotEmpty String stageId){
stageService.copyStage(stageId);
return CommonResult.success();
}
} }

View File

@ -6,7 +6,9 @@ import cd.casic.ci.process.process.service.task.TaskService;
import cd.casic.framework.commons.pojo.CommonResult; import cd.casic.framework.commons.pojo.CommonResult;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -25,8 +27,13 @@ public class TasksController {
* @pi.request-type: formdata * @pi.request-type: formdata
* @pi.param: name=taskId;dataType=string;value=taskId; * @pi.param: name=taskId;dataType=string;value=taskId;
*/ */
@RequestMapping(path="/findOneTasksOrTask",method = RequestMethod.POST) @PostMapping(path="/findOneTasksOrTask")
public CommonResult<TasksResp> findOneTasksOrTask(@NotNull String taskId){ public CommonResult<TasksResp> findOneTasksOrTask(@NotNull String taskId){
return CommonResult.success(taskService.getById(taskId)); return CommonResult.success(taskService.getRespById(taskId));
}
@PostMapping(path="/copyTask")
public CommonResult<Void> copyTask(@NotEmpty String taskId){
taskService.copyTask(taskId);
return CommonResult.success();
} }
} }