diff --git a/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/PipelineController.java b/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/PipelineController.java index bd6eafb7..04c4401a 100644 --- a/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/PipelineController.java +++ b/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/PipelineController.java @@ -10,6 +10,7 @@ import cd.casic.ci.process.dto.resp.pipeline.PipelineFindResp; import cd.casic.ci.process.engine.executor.PipelineExecutor; import cd.casic.ci.process.engine.runContext.PipelineRunContext; import cd.casic.ci.process.enums.PiplineTriggerModeEnum; +import cd.casic.ci.process.process.dataObject.base.BaseIdReq; import cd.casic.ci.process.process.service.pipeline.PipelineService; import cd.casic.framework.commons.pojo.CommonResult; import cd.casic.framework.commons.pojo.PageResult; @@ -117,4 +118,12 @@ public class PipelineController { pipelineExecutor.traversePipelineContext(pipelineId); return CommonResult.success(); } + + @PostMapping(path="/transformTemplateByPipeline") + public CommonResult transformTemplateByPipeline(@RequestBody @Valid BaseIdReq req){ + + pipelineService.transformTemplateByPipeline(req); + + return CommonResult.success(); + } } diff --git a/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/TemplateManagerController.java b/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/TemplateManagerController.java index 9a965e70..31f7a76a 100644 --- a/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/TemplateManagerController.java +++ b/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/TemplateManagerController.java @@ -1,6 +1,7 @@ package cd.casic.ci.api; +import cd.casic.ci.process.dto.req.template.TemplateCreateByDataReq; import cd.casic.ci.process.dto.req.template.TemplateCreateReq; import cd.casic.ci.process.dto.req.template.TemplateQueryReq; import cd.casic.ci.process.dto.req.template.TemplateUpdateReq; @@ -38,6 +39,16 @@ public class TemplateManagerController { String templateId = templateManagerService.createTemplateManager(req); return CommonResult.success(templateId); } + + + + @PostMapping(path="/createTemplateByData") + public CommonResult createTemplateByData(@RequestBody @Valid TemplateCreateByDataReq req){ + String templateId = templateManagerService.createTemplateByData(req); + return CommonResult.success(templateId); + } + + @PostMapping(path="/updateTemplateManager") public CommonResult updateTemplateManager(@RequestBody TemplateUpdateReq req){ String templateId = templateManagerService.updateTemplateManager(req); diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/req/template/TemplateCreateByDataReq.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/req/template/TemplateCreateByDataReq.java new file mode 100644 index 00000000..7d7a39c3 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/req/template/TemplateCreateByDataReq.java @@ -0,0 +1,33 @@ +package cd.casic.ci.process.dto.req.template; + +import lombok.Data; + +import java.util.List; + +/** + * @author HopeLi + * @version v1.0 + * @ClassName TemplateCreateReq + * @Date: 2025/5/29 10:41 + * @Description: + */ + +@Data +public class TemplateCreateByDataReq { + /** + * 模板名称 + */ + private String templateName; + + /** + * 模板分类 + */ + private String templateType; + + /** + * 描述 + */ + private String remark; + + private List stageCreateByDataReqList; +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/req/template/TemplateStageCreateByDataReq.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/req/template/TemplateStageCreateByDataReq.java new file mode 100644 index 00000000..9617c2f3 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/req/template/TemplateStageCreateByDataReq.java @@ -0,0 +1,43 @@ +package cd.casic.ci.process.dto.req.template; + +import lombok.Data; + +import java.util.List; + +/** + * @ClassName TemplateStageCreateByDataReq + * @Author hopeli + * @Date 2025/7/20 18:34 + * @Version 1.0 + */ +@Data +public class TemplateStageCreateByDataReq { + /** + * 阶段名称 + */ + private String stageName; + + /** + * 流水线模板ID + */ + private String templateId; + + /** + * 阶段排序 + */ + private Integer stageSort; + + /** + * 父级阶段ID + */ + private String parentId; + + /** + * 是否是代码阶段 + */ + private Boolean code = false; + + private List stageCreateByDataReqList; + + private List taskCreateByDataReqList; +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/req/template/TemplateTaskCreateByDataReq.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/req/template/TemplateTaskCreateByDataReq.java new file mode 100644 index 00000000..ab478560 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/req/template/TemplateTaskCreateByDataReq.java @@ -0,0 +1,53 @@ +package cd.casic.ci.process.dto.req.template; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import lombok.Data; +import org.apache.ibatis.type.JdbcType; + +import java.util.Map; + +/** + * @ClassName TemplateTaskCreateByDataReq + * @Author hopeli + * @Date 2025/7/20 18:50 + * @Version 1.0 + */ +@Data +public class TemplateTaskCreateByDataReq { + /** + * 阶段ID + */ + private String stageId; + + /** + * 任务名称 + */ + private String taskName; + + /** + * 流水线模板ID + */ + private String templateId; + + /** + * 任务类型 + */ + private String taskType; + + /** + * 任务排序 + */ + private Integer taskSort; + + /** + * 后置处理器ID + */ + private String postprocessId; + + /** + * 任务配置(JSON格式存储) + */ + @TableField(typeHandler = JacksonTypeHandler.class,jdbcType = JdbcType.VARCHAR) + private Map taskProperties; +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/converter/TemplateConverter.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/converter/TemplateConverter.java index f4fdb35e..7738050b 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/converter/TemplateConverter.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/converter/TemplateConverter.java @@ -1,5 +1,6 @@ package cd.casic.ci.process.process.converter; +import cd.casic.ci.process.dto.req.template.TemplateCreateByDataReq; import cd.casic.ci.process.dto.req.template.TemplateCreateReq; import cd.casic.ci.process.dto.req.template.TemplateUpdateReq; import cd.casic.ci.process.dto.resp.template.TemplateFindResp; @@ -31,4 +32,6 @@ public interface TemplateConverter { PipTask templateTaskToTask(TemplateTasksResp resp); TemplateManager managerCreateReqToManager(TemplateCreateReq req); TemplateManager managerUpdateReqToManager(TemplateUpdateReq req); + + TemplateManager managerDataToManagerModule(TemplateCreateByDataReq req); } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/converter/TemplateStageConverter.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/converter/TemplateStageConverter.java index f83aeb9a..bf09029f 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/converter/TemplateStageConverter.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/converter/TemplateStageConverter.java @@ -1,8 +1,7 @@ package cd.casic.ci.process.process.converter; -import cd.casic.ci.process.dto.resp.stage.StageResp; +import cd.casic.ci.process.dto.req.template.TemplateStageCreateByDataReq; import cd.casic.ci.process.dto.resp.template.TemplateStageResp; -import cd.casic.ci.process.process.dataObject.stage.PipStage; import cd.casic.ci.process.process.dataObject.template.TemplateStage; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -15,4 +14,5 @@ public interface TemplateStageConverter { public TemplateStageResp converter(TemplateStage stage); public List converter(List stage); + TemplateStage stageDataToStageModule(TemplateStageCreateByDataReq o); } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/converter/TemplateTaskConverter.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/converter/TemplateTaskConverter.java index 9bfc1181..a5c3409c 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/converter/TemplateTaskConverter.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/converter/TemplateTaskConverter.java @@ -1,8 +1,7 @@ package cd.casic.ci.process.process.converter; -import cd.casic.ci.process.dto.resp.task.TasksResp; +import cd.casic.ci.process.dto.req.template.TemplateTaskCreateByDataReq; import cd.casic.ci.process.dto.resp.template.TemplateTasksResp; -import cd.casic.ci.process.process.dataObject.task.PipTask; import cd.casic.ci.process.process.dataObject.template.TemplateTask; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -11,4 +10,6 @@ import org.mapstruct.factory.Mappers; public interface TemplateTaskConverter { TemplateTaskConverter INSTANCE = Mappers.getMapper(TemplateTaskConverter.class); TemplateTasksResp doToResp(TemplateTask task); + + TemplateTask taskDataToTaskModule(TemplateTaskCreateByDataReq k); } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/template/TemplateStage.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/template/TemplateStage.java index 8b4e3818..ed55948f 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/template/TemplateStage.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/dataObject/template/TemplateStage.java @@ -41,7 +41,7 @@ public class TemplateStage extends PipBaseElement { /** * 是否为源码(0-否,1-是) */ - private String code; + private Boolean code = false; /** * 触发方式(0-手动触发,1-自动触发) diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/pipeline/PipelineService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/pipeline/PipelineService.java index ba9389e5..ba4c1c04 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/pipeline/PipelineService.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/pipeline/PipelineService.java @@ -7,6 +7,7 @@ import cd.casic.ci.process.dto.req.pipeline.PipelineReq; import cd.casic.ci.process.dto.req.pipeline.PipelineUpdateReq; import cd.casic.ci.process.dto.resp.context.TreeRunContextResp; import cd.casic.ci.process.dto.resp.pipeline.PipelineFindResp; +import cd.casic.ci.process.process.dataObject.base.BaseIdReq; import cd.casic.ci.process.process.dataObject.pipeline.PipPipeline; import cd.casic.framework.commons.pojo.PageResult; import com.baomidou.mybatisplus.extension.service.IService; @@ -38,4 +39,6 @@ public interface PipelineService extends IService { TreeRunContextResp getPipelineRunState(String pipelineId); Long getGroupCount(String groupId); + + void transformTemplateByPipeline(@Valid BaseIdReq req); } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/pipeline/impl/PipelineServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/pipeline/impl/PipelineServiceImpl.java index 39db4e77..89bffb2d 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/pipeline/impl/PipelineServiceImpl.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/pipeline/impl/PipelineServiceImpl.java @@ -5,6 +5,9 @@ import cd.casic.ci.process.dto.req.pipeline.PipelineCreateReq; import cd.casic.ci.process.dto.req.pipeline.PipelineQueryReq; import cd.casic.ci.process.dto.req.pipeline.PipelineReq; import cd.casic.ci.process.dto.req.pipeline.PipelineUpdateReq; +import cd.casic.ci.process.dto.req.template.TemplateCreateByDataReq; +import cd.casic.ci.process.dto.req.template.TemplateStageCreateByDataReq; +import cd.casic.ci.process.dto.req.template.TemplateTaskCreateByDataReq; import cd.casic.ci.process.dto.resp.context.TreeRunContextResp; import cd.casic.ci.process.dto.resp.pipeline.PipelineFindResp; import cd.casic.ci.process.dto.resp.stage.StageResp; @@ -19,6 +22,7 @@ import cd.casic.ci.process.process.dao.pipeline.PipStageDao; import cd.casic.ci.process.process.dao.pipeline.PipTaskDao; import cd.casic.ci.process.process.dao.pipeline.PipelineDao; import cd.casic.ci.process.process.dao.pipeline.TargetVersionDao; +import cd.casic.ci.process.process.dataObject.base.BaseIdReq; import cd.casic.ci.process.process.dataObject.pipeline.PipPipeline; import cd.casic.ci.process.process.dataObject.stage.PipStage; import cd.casic.ci.process.process.dataObject.target.TargetVersion; @@ -48,7 +52,13 @@ import org.springframework.util.ObjectUtils; import java.time.Duration; import java.time.LocalDateTime; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; @@ -156,8 +166,6 @@ public class PipelineServiceImpl extends ServiceImpl i PipStage pipStage = templateConverter.respToStage(o); pipStage.setId(idWork.nextUUID(null)); pipStage.setPipelineId(pipeline.getId()); - pipStage.setCreateTime(LocalDateTime.now()); - pipStage.setCreator(String.valueOf(WebFrameworkUtils.getLoginUserId())); if (o.isCode()){ pipStage.setCode(true); }else { @@ -540,6 +548,73 @@ public class PipelineServiceImpl extends ServiceImpl i return pipelineDao.selectCount(wrapper); } + @Override + public void transformTemplateByPipeline(BaseIdReq req) { + if (ObjectUtils.isEmpty(req.getId())){ + throw new ServiceException(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"id不能为空"); + } + + PipelineQueryReq pipelineQueryReq = new PipelineQueryReq(); + pipelineQueryReq.setId(req.getId()); + PipelineFindResp pipeline = this.findPipelineById(pipelineQueryReq); + + if (ObjectUtils.isEmpty(pipeline)){ + throw new ServiceException(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"数据错误,请联系管理员"); + } + + TemplateCreateByDataReq templateCreateByDataReq = new TemplateCreateByDataReq(); + + templateCreateByDataReq.setTemplateName(pipeline.getName()); + templateCreateByDataReq.setTemplateType(pipeline.getTargetType()); + templateCreateByDataReq.setRemark(pipeline.getRemark()); + + if (!ObjectUtils.isEmpty(pipeline.getStageList())){ + List parentTemplateStageList = new ArrayList<>(); + pipeline.getStageList().forEach(o->{ + TemplateStageCreateByDataReq parentTemplateStage = new TemplateStageCreateByDataReq(); + parentTemplateStage.setStageName(o.getStageName()); + parentTemplateStage.setStageSort(o.getStageSort()); + if (o.isCode()){ + parentTemplateStage.setCode(true); + } + + if (!ObjectUtils.isEmpty(o.getStageList())){ + List childTemplateStageList = new ArrayList<>(); + o.getStageList().forEach(j->{ + TemplateStageCreateByDataReq childTemplateStage = new TemplateStageCreateByDataReq(); + childTemplateStage.setStageName(j.getStageName()); + childTemplateStage.setStageSort(j.getStageSort()); + if (j.isCode()){ + childTemplateStage.setCode(true); + } + + if (!ObjectUtils.isEmpty(j.getTaskValues())){ + List templateTaskList = new ArrayList<>(); + j.getTaskValues().forEach(k->{ + TemplateTaskCreateByDataReq templateTaskCreateByDataReq = new TemplateTaskCreateByDataReq(); + templateTaskCreateByDataReq.setTaskName(k.getTaskName()); + templateTaskCreateByDataReq.setTaskType(k.getTaskType()); + templateTaskCreateByDataReq.setTaskSort(k.getTaskSort()); + templateTaskCreateByDataReq.setTaskProperties(k.getTaskProperties()); + templateTaskList.add(templateTaskCreateByDataReq); + }); + childTemplateStage.setTaskCreateByDataReqList(templateTaskList); + } + + childTemplateStageList.add(childTemplateStage); + }); + + parentTemplateStage.setStageCreateByDataReqList(childTemplateStageList); + } + + parentTemplateStageList.add(parentTemplateStage); + }); + + templateCreateByDataReq.setStageCreateByDataReqList(parentTemplateStageList); + } + templateService.createTemplateByData(templateCreateByDataReq); + } + private String between(LocalDateTime startTime,LocalDateTime endTime){ if (startTime==null||endTime==null) { return ""; diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/template/TemplateManagerService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/template/TemplateManagerService.java index 35a19bc3..8ff118f5 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/template/TemplateManagerService.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/template/TemplateManagerService.java @@ -1,6 +1,7 @@ package cd.casic.ci.process.process.service.template; +import cd.casic.ci.process.dto.req.template.TemplateCreateByDataReq; import cd.casic.ci.process.dto.req.template.TemplateCreateReq; import cd.casic.ci.process.dto.req.template.TemplateQueryReq; import cd.casic.ci.process.dto.req.template.TemplateUpdateReq; @@ -28,4 +29,6 @@ public interface TemplateManagerService extends IService { List findTemplateList(@Valid TemplateQueryReq query); TemplateFindResp findTemplateById(String id); + + String createTemplateByData(@Valid TemplateCreateByDataReq req); } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/template/impl/TemplateManagerServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/template/impl/TemplateManagerServiceImpl.java index 56cc7b57..a720e2ff 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/template/impl/TemplateManagerServiceImpl.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/template/impl/TemplateManagerServiceImpl.java @@ -1,12 +1,15 @@ package cd.casic.ci.process.process.service.template.impl; +import cd.casic.ci.process.dto.req.template.TemplateCreateByDataReq; import cd.casic.ci.process.dto.req.template.TemplateCreateReq; import cd.casic.ci.process.dto.req.template.TemplateQueryReq; import cd.casic.ci.process.dto.req.template.TemplateUpdateReq; import cd.casic.ci.process.dto.resp.template.TemplateFindResp; import cd.casic.ci.process.dto.resp.template.TemplateStageResp; import cd.casic.ci.process.process.converter.TemplateConverter; +import cd.casic.ci.process.process.converter.TemplateStageConverter; +import cd.casic.ci.process.process.converter.TemplateTaskConverter; import cd.casic.ci.process.process.dao.template.TemplateManagerDao; import cd.casic.ci.process.process.dao.template.TemplateStageDao; import cd.casic.ci.process.process.dao.template.TemplateTaskDao; @@ -15,14 +18,12 @@ import cd.casic.ci.process.process.dataObject.template.TemplateStage; import cd.casic.ci.process.process.dataObject.template.TemplateTask; import cd.casic.ci.process.process.service.template.TemplateManagerService; import cd.casic.ci.process.process.service.template.TemplateStageService; -import cd.casic.ci.process.process.service.template.TemplateTaskService; import cd.casic.ci.process.util.snowflake.SnowflakeIdentifierGenerator; import cd.casic.framework.commons.exception.ServiceException; import cd.casic.framework.commons.exception.enums.GlobalErrorCodeConstants; import cd.casic.framework.commons.pojo.PageResult; import cd.casic.framework.security.dal.user.AdminUserDO; import cd.casic.framework.tenant.core.service.AdminUserServiceImpl; -import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -67,6 +68,8 @@ public class TemplateManagerServiceImpl extends ServiceImpl stageList = new ArrayList<>(); + List taskList = new ArrayList<>(); + if (!ObjectUtils.isEmpty(req.getStageCreateByDataReqList())){ + req.getStageCreateByDataReqList().forEach(o->{ + TemplateStage templateStage = templateStageConverter.stageDataToStageModule(o); + templateStage.setId(idWork.nextUUID(null)); + templateStage.setTemplateId(templateManager.getId()); + templateStage.setParentId("-1"); + stageList.add(templateStage); + + if (!ObjectUtils.isEmpty(o.getStageCreateByDataReqList())){ + o.getStageCreateByDataReqList().forEach(j->{ + TemplateStage childTemplateStage = templateStageConverter.stageDataToStageModule(j); + childTemplateStage.setId(idWork.nextUUID(null)); + childTemplateStage.setParentId(templateStage.getId()); + childTemplateStage.setTemplateId(templateStage.getTemplateId()); + stageList.add(childTemplateStage); + + if (!ObjectUtils.isEmpty(j.getTaskCreateByDataReqList())){ + j.getTaskCreateByDataReqList().forEach(k->{ + TemplateTask templateTask = TemplateTaskConverter.INSTANCE.taskDataToTaskModule(k); + templateTask.setId(idWork.nextUUID(null)); + templateTask.setStageId(childTemplateStage.getId()); + templateTask.setTemplateId(templateManager.getId()); + taskList.add(templateTask); + }); + } + }); + } + }); + } + templateStageDao.insertBatch(stageList); + templateTaskDao.insertBatch(taskList); + return templateManager.getId(); + } + private void setUserName(TemplateFindResp templateFindResp) { if (!StringUtils.isEmpty(templateFindResp.getCreator())){ AdminUserDO user = adminUserService.getUser(Long.valueOf(templateFindResp.getCreator()));