From fe6ca78d74a72f85b55ce3fda4e98551d1ff3601 Mon Sep 17 00:00:00 2001 From: HopeLi <1278288511@qq.com> Date: Thu, 24 Jul 2025 19:23:33 +0800 Subject: [PATCH] =?UTF-8?q?0724=20ljc=20=20=E6=96=B0=E5=A2=9Eai=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E6=B5=81=E6=B0=B4=E7=BA=BF=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cd/casic/ci/api/AiPipelineController.java | 129 ++++++++++++++++++ .../dto/req/pipeline/AiPipelineCreateReq.java | 75 ++++++++++ .../process/converter/PipelineConverter.java | 2 + .../service/pipeline/PipelineService.java | 7 +- .../pipeline/impl/PipelineServiceImpl.java | 89 +++++++++++- 5 files changed, 294 insertions(+), 8 deletions(-) create mode 100644 modules/module-ci-process-api/src/main/java/cd/casic/ci/api/AiPipelineController.java create mode 100644 modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/req/pipeline/AiPipelineCreateReq.java diff --git a/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/AiPipelineController.java b/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/AiPipelineController.java new file mode 100644 index 00000000..c0236f70 --- /dev/null +++ b/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/AiPipelineController.java @@ -0,0 +1,129 @@ +package cd.casic.ci.api; + + +import cd.casic.ci.process.dto.req.pipeline.AiPipelineCreateReq; +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.resp.context.TreeRunContextResp; +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; +import jakarta.annotation.Resource; +import jakarta.annotation.security.PermitAll; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import org.jetbrains.annotations.NotNull; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @ClassName PipelineController + * @Author hopeli + * @Date 2025/5/10 10:28 + * @Version 1.0 + */ + +@RestController +@RequestMapping("/aiPipeline") +public class AiPipelineController { + + @Resource + private PipelineService pipelineService; + @Resource + private PipelineExecutor pipelineExecutor; + + @PermitAll + @PostMapping(path="/aiCreatePipeline") + public CommonResult aiCreatePipeline(@RequestBody @Valid AiPipelineCreateReq req){ + + String pipelineId = pipelineService.aiCreatePipeline(req); + + return CommonResult.success(pipelineId); + } + + + @PermitAll + @PostMapping(path="/findPipelineList") + public CommonResult> findPipelineList(@RequestBody @Valid PipelineQueryReq pipelineQueryReq){ + + List respList = pipelineService.findPipelineList(pipelineQueryReq); + + return CommonResult.success(respList); + } + + @PermitAll + @PostMapping(path="/findPipelineById") + public CommonResult findPipelineById(@RequestBody @Valid PipelineQueryReq pipelineQueryReq){ + + PipelineFindResp resp = pipelineService.findPipelineById(pipelineQueryReq); + + return CommonResult.success(resp); + } + + @PostMapping(path="/deletePipeline") + public CommonResult deletePipeline(@RequestBody @Valid PipelineReq req){ + + pipelineService.deletePipeline(req); + + return CommonResult.success(); + } + + + @PostMapping(path="/updatePipeline") + public CommonResult updatePipeline(@RequestBody @NotNull @Valid PipelineUpdateReq pipeline){ + + pipelineService.updatePipeline(pipeline); + + return CommonResult.success(); + } + + + @PostMapping(path="/findPipelinePage") + public CommonResult> findPipelinePage(@RequestBody @NotNull @Valid PipelineQueryReq query){ + + PageResult pipelineRespPage = pipelineService.findPipelinePage(query); + + return CommonResult.success(pipelineRespPage); + } + + + + + @PostMapping(path="/pipelineClone") + public CommonResult pipelineClone(@RequestBody @Valid PipelineReq req){ + pipelineService.pipelineClone(req); + + return CommonResult.success(); + } + @Resource + private HttpServletRequest request; + @PostMapping("/executePipeline/{pipelineId}") + public CommonResult executePipeline(@PathVariable("pipelineId") String pipelineId,@RequestParam(required = false,defaultValue = "false") Boolean fromError){ + PipelineRunContext execute = pipelineExecutor.execute(pipelineId, PiplineTriggerModeEnum.HAND,fromError); + return CommonResult.success(execute); + } + @PostMapping("/getStageRunState/{pipelineId}") + public CommonResult getPipelineRunState(@PathVariable String pipelineId){ + return CommonResult.success(pipelineService.getPipelineRunState(pipelineId)); + } + @PostMapping("/traversePipelineContext/{pipelineId}") + public CommonResult traversePipelineContext(@PathVariable("pipelineId") String pipelineId,@RequestParam(required = false,defaultValue = "false") Boolean fromError){ + 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-biz/src/main/java/cd/casic/ci/process/dto/req/pipeline/AiPipelineCreateReq.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/req/pipeline/AiPipelineCreateReq.java new file mode 100644 index 00000000..0a74f265 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/req/pipeline/AiPipelineCreateReq.java @@ -0,0 +1,75 @@ +package cd.casic.ci.process.dto.req.pipeline; + +import cd.casic.ci.process.dto.resp.template.TemplateFindResp; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author HopeLi + * @version v1.0 + * @ClassName AiPipelineCreateReq + * @Date: 2025/7/24 18:22 + * @Description: + */ +@Data +public class AiPipelineCreateReq { + //流水线名称 + private String name; + + //环境id + private String envId; + + //分组id + private String groupId; + + //流水线类型 1.多任务 2.多阶段 + private int type; + + //运行状态 1.未运行 2.运行中 + private int state; + + //项目作用域 1.全局 2.项目 + private int power; + + //颜色 1~5随机生成 + private int color; + + //流水线模板id + private String templateId; + + //目标id + private String targetVersionId; + + //目标类型 + private String targetType; + + //流水线标签 + private String pipelineTag; + + //项目id + private String projectId; + + //备注 + private String remark; + + //收藏 0.未收藏 1.收藏 + private int collect; + + //执行人id + private String executeUserId; + + //执行时间 + private LocalDateTime executeTime; + + //流水线触发模式 + private String pipelineTriggerMode; + + //执行状态 + private String executeStatus; + + //资源id + private String resourceId; + + private TemplateFindResp templateFindResp; +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/converter/PipelineConverter.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/converter/PipelineConverter.java index 2404212d..fa84f17b 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/converter/PipelineConverter.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/converter/PipelineConverter.java @@ -1,5 +1,6 @@ package cd.casic.ci.process.process.converter; +import cd.casic.ci.process.dto.req.pipeline.AiPipelineCreateReq; import cd.casic.ci.process.dto.req.pipeline.PipelineCreateReq; import cd.casic.ci.process.dto.req.pipeline.PipelineUpdateReq; import cd.casic.ci.process.dto.resp.pipeline.PipelineFindResp; @@ -24,4 +25,5 @@ public interface PipelineConverter { PipPipeline reqToDO(PipelineUpdateReq req); List toRespList(List pipPipelines); + PipPipeline aiReqToDO(AiPipelineCreateReq req); } 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 0ab39fba..13872340 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 @@ -1,10 +1,7 @@ package cd.casic.ci.process.process.service.pipeline; -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.pipeline.*; 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; @@ -42,4 +39,6 @@ public interface PipelineService extends IService { void transformTemplateByPipeline(@Valid BaseIdReq req); Boolean targetVersionInUse(List targetVersionId); + + String aiCreatePipeline(@Valid AiPipelineCreateReq 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 49e5aef6..0f32472b 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 @@ -1,10 +1,7 @@ package cd.casic.ci.process.process.service.pipeline.impl; -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.pipeline.*; 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; @@ -625,6 +622,90 @@ public class PipelineServiceImpl extends ServiceImpl i return pipelineDao.exists(wrapper); } + @Override + public String aiCreatePipeline(AiPipelineCreateReq req) { + List pipStageList = new ArrayList<>(0); + List pipTaskList = new ArrayList<>(0); + + PipPipeline pipeline = pipelineConverter.aiReqToDO(req); + + // 随机颜色 + int randomNumber = (int)(Math.random() * 5) + 1; + pipeline.setColor(randomNumber); + + pipeline.setState(1); + + this.save(pipeline); + + TemplateFindResp template = new TemplateFindResp(); + if (!ObjectUtils.isEmpty(req.getTemplateId())){ + //则根据模板进行新增 + template = templateService.findTemplateById(req.getTemplateId()); + }else { + //则根据ai生成的模板进行新增 + template = req.getTemplateFindResp(); + } + + if (!ObjectUtils.isEmpty(template)){ + + //新增阶段数据 + List stageList = template.getStageList(); + stageList.forEach(o->{ + PipStage pipStage = templateConverter.respToStage(o); + pipStage.setId(idWork.nextUUID(null)); + pipStage.setPipelineId(pipeline.getId()); + if (o.isCode()){ + pipStage.setCode(true); + }else { + pipStage.setCode(false); + } + pipStageList.add(pipStage); + + List childStageList = o.getStageList(); + if (!CollectionUtils.isEmpty(childStageList)){ + //则代表大阶段下存在阶段子节点 + childStageList.forEach(j->{ + PipStage childStage = templateConverter.respToStage(j); + + childStage.setId(idWork.nextUUID(null)); + childStage.setPipelineId(pipeline.getId()); + childStage.setParentId(pipStage.getId()); + childStage.setCreateTime(LocalDateTime.now()); + childStage.setCreator(String.valueOf(WebFrameworkUtils.getLoginUserId())); + if (j.isCode()){ + childStage.setCode(true); + }else { + childStage.setCode(false); + } + + pipStageList.add(childStage); + + if (!CollectionUtils.isEmpty(j.getTaskValues())){ + List taskList = new ArrayList<>(0); + j.getTaskValues().forEach(k->{ + PipTask pipTask = templateConverter.templateTaskToTask(k); + pipTask.setId(idWork.nextUUID(null)); + pipTask.setStageId(childStage.getId()); + pipTask.setPipelineId(pipeline.getId()); + pipTask.setCreateTime(LocalDateTime.now()); + pipTask.setCreator(String.valueOf(WebFrameworkUtils.getLoginUserId())); + taskList.add(pipTask); + }); + pipTaskList.addAll(taskList); + } + }); + } + }); + if (!CollectionUtils.isEmpty(pipStageList)){ + pipStageDao.insertBatch(pipStageList); + } + if (!CollectionUtils.isEmpty(pipTaskList)){ + pipTaskDao.insertBatch(pipTaskList); + } + } + return pipeline.getId(); + } + private String between(LocalDateTime startTime,LocalDateTime endTime){ if (startTime==null||endTime==null) { return "";