diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/stage/StageService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/stage/StageService.java index 4220f40..6997c92 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/stage/StageService.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/stage/StageService.java @@ -7,6 +7,7 @@ import cd.casic.ci.common.pipeline.resp.stage.StageResp; import cd.casic.ci.process.process.dataObject.stage.PipStage; import com.baomidou.mybatisplus.extension.service.IService; import jakarta.validation.Valid; +import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import java.util.List; @@ -81,6 +82,6 @@ public interface StageService extends IService { void deleteStages(String stageId); - void createStagesOrTaskList(@Valid @NotNull List stageList); + void copyStage(@NotEmpty String stageId); } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/stage/impl/StageServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/stage/impl/StageServiceImpl.java index 7379a67..21efaea 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/stage/impl/StageServiceImpl.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/stage/impl/StageServiceImpl.java @@ -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.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.resp.stage.StageResp; + 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.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.util.WebFrameworkUtils; 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 jakarta.annotation.Resource; import org.apache.commons.lang3.ObjectUtils; @@ -25,9 +27,14 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; 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 static cd.casic.ci.process.constant.PipelineFinalConstant.TASK_TYPE_CODE; + @Service public class StageServiceImpl extends ServiceImpl implements StageService { @Resource @@ -77,7 +84,6 @@ public class StageServiceImpl extends ServiceImpl impleme updateBatchById(otherStageList); } save(firstStage); -// firstStage } else { PipStage stageQuery = new PipStage(); stageQuery.setStageId(firstStageId); @@ -213,7 +219,7 @@ public class StageServiceImpl extends ServiceImpl impleme @Override public void deleteAllStagesOrTask(String pipelineId) { - + // TODO 删除流水线,不知道要不要 } public List getPipStageList(PipStage pipStage){ @@ -298,12 +304,53 @@ public class StageServiceImpl extends ServiceImpl impleme stageDao.deleteById(stageId); } - @Override - public void createStagesOrTaskList(List stageList) { - if (!ObjectUtils.isEmpty(stageList)){ - stageList.forEach(this::createStagesOrTask); + @Transactional + public void copyStage(String stageId) { + // 查询当前stage(阶段下所有) + PipStage firstStage = getById(stageId); + Long loginUserId = WebFrameworkUtils.getLoginUserId(); + List allMainStage = findAllMainStage(firstStage.getPipelineId()); + List 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 secondStageList = findSecondStage(stageId); + if (!CollectionUtils.isEmpty(secondStageList)) { + List stageIdList = secondStageList.stream().map(PipStage::getStageId).toList(); + List taskList = taskService.listByIds(stageIdList); + Map> 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 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 findOtherStageNoTask(String stagesId){ diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/task/TaskService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/task/TaskService.java index 81a3666..d644acf 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/task/TaskService.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/task/TaskService.java @@ -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.resp.task.TasksResp; import cd.casic.ci.process.process.dataObject.task.PipTask; +import cd.casic.framework.commons.pojo.CommonResult; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @@ -11,8 +12,9 @@ public interface TaskService extends IService { /** * 查询taskType是否存在(原项目的各种worker) * */ - public void taskTypeExist(String taskType); + void taskTypeExist(String taskType); List getTask(PipTask pipTask); - public TasksResp getById(String taskId); + TasksResp getRespById(String taskId); + void copyTask(String taskId); } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/task/impl/TaskServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/task/impl/TaskServiceImpl.java index 16acc75..811d3e6 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/task/impl/TaskServiceImpl.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/task/impl/TaskServiceImpl.java @@ -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.PipTaskDao; 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 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.core.type.filter.AnnotationTypeFilter; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; - +import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Set; @@ -33,12 +36,6 @@ public class TaskServiceImpl extends ServiceImpl implements private Set candidates; @Resource private PipTaskDao taskDao; - @Resource - private PipStageDao stageDao; - - public TaskServiceImpl() { - System.out.println(""); - } @PostConstruct public void init(){ @@ -65,7 +62,7 @@ public class TaskServiceImpl extends ServiceImpl implements return taskDao.selectList(wrapper); } @Override - public TasksResp getById(String taskId){ + public TasksResp getRespById(String taskId){ PipTask pipTask = new PipTask(); pipTask.setTaskId(taskId); List taskList = getTask(pipTask); @@ -76,4 +73,35 @@ public class TaskServiceImpl extends ServiceImpl implements BeanUtils.copyProperties(taskList.get(0),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 sameLevelTaskList = getTask(query); + if (CollectionUtils.isEmpty(sameLevelTaskList)) { + return; + } + List 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); + } + } } diff --git a/ops-server/src/main/java/cd/casic/server/controller/StageController.java b/ops-server/src/main/java/cd/casic/server/controller/StageController.java index 3ec4dda..c25a649 100644 --- a/ops-server/src/main/java/cd/casic/server/controller/StageController.java +++ b/ops-server/src/main/java/cd/casic/server/controller/StageController.java @@ -12,6 +12,7 @@ import com.alibaba.fastjson.JSONArray; import jakarta.annotation.Resource; import jakarta.annotation.security.PermitAll; import jakarta.validation.Valid; +import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import org.springframework.web.bind.annotation.*; @@ -84,7 +85,14 @@ public class StageController { stageService.deleteStagesOrTask(taskId); return CommonResult.success(); } - + /** + * 复制stage节点 + * */ + @PostMapping(path="/copyStage") + public CommonResult copyStage(@NotEmpty String stageId){ + stageService.copyStage(stageId); + return CommonResult.success(); + } } diff --git a/ops-server/src/main/java/cd/casic/server/controller/TasksController.java b/ops-server/src/main/java/cd/casic/server/controller/TasksController.java index 2bb6512..60be831 100644 --- a/ops-server/src/main/java/cd/casic/server/controller/TasksController.java +++ b/ops-server/src/main/java/cd/casic/server/controller/TasksController.java @@ -6,7 +6,9 @@ import cd.casic.ci.process.process.service.task.TaskService; import cd.casic.framework.commons.pojo.CommonResult; import com.alibaba.fastjson.JSON; import jakarta.annotation.Resource; +import jakarta.validation.constraints.NotEmpty; 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.RequestMethod; import org.springframework.web.bind.annotation.RestController; @@ -25,8 +27,13 @@ public class TasksController { * @pi.request-type: formdata * @pi.param: name=taskId;dataType=string;value=taskId; */ - @RequestMapping(path="/findOneTasksOrTask",method = RequestMethod.POST) + @PostMapping(path="/findOneTasksOrTask") public CommonResult findOneTasksOrTask(@NotNull String taskId){ - return CommonResult.success(taskService.getById(taskId)); + return CommonResult.success(taskService.getRespById(taskId)); + } + @PostMapping(path="/copyTask") + public CommonResult copyTask(@NotEmpty String taskId){ + taskService.copyTask(taskId); + return CommonResult.success(); } }