refactor(modules): 拆分多模块工程并收口common基础模块

This commit is contained in:
2026-06-01 03:26:18 +08:00
parent 6fe1209801
commit 07ad8bb36b
231 changed files with 1690 additions and 172 deletions

View File

@@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.bruce</groupId>
<artifactId>common-agent-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>common-agent-workflow</artifactId>
<name>common-agent-workflow</name>
<dependencies>
<dependency>
<groupId>com.bruce</groupId>
<artifactId>common-agent-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.bruce</groupId>
<artifactId>common-agent-agent</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.bruce</groupId>
<artifactId>common-agent-rag</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.bruce</groupId>
<artifactId>common-agent-modelprovider</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.bruce</groupId>
<artifactId>common-agent-mcp</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.bruce</groupId>
<artifactId>common-agent-skill</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot4-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,38 @@
package com.bruce.workflow.controller;
import com.bruce.common.domain.model.RequestResult;
import com.bruce.workflow.dto.WorkflowDefinitionSaveDTO;
import com.bruce.workflow.service.IWorkflowDefinitionService;
import com.bruce.workflow.vo.WorkflowDefinitionVO;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/api/workflows")
@RequiredArgsConstructor
public class WorkflowDefinitionController {
private final IWorkflowDefinitionService workflowDefinitionService;
@GetMapping("/definitions")
public RequestResult<List<WorkflowDefinitionVO>> list() {
return RequestResult.success(workflowDefinitionService.listDefinitions());
}
@GetMapping("/definition/detail")
public RequestResult<WorkflowDefinitionVO> detail(@RequestParam("id") Long id) {
return RequestResult.success(workflowDefinitionService.getDefinition(id));
}
@PostMapping("/definition/save")
public RequestResult<Boolean> save(@RequestBody WorkflowDefinitionSaveDTO request) {
return RequestResult.success(workflowDefinitionService.saveDefinition(request));
}
}

View File

@@ -0,0 +1,26 @@
package com.bruce.workflow.dto;
import lombok.Data;
/**
* Workflow 定义保存请求。
*/
@Data
public class WorkflowDefinitionSaveDTO {
private Long id;
private Long projectId;
private String workflowCode;
private String workflowName;
private String description;
private Long boundAgentId;
private String status;
private String remark;
}

View File

@@ -0,0 +1,27 @@
package com.bruce.workflow.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.bruce.common.domain.model.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* Studio 项目空间实体,严格映射 studio_project 表。
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("studio_project")
@Schema(description = "Studio项目空间")
public class StudioProject extends BaseEntity {
private String projectCode;
private String projectName;
private String environment;
private String publishStatus;
private String currentVersion;
}

View File

@@ -0,0 +1,27 @@
package com.bruce.workflow.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.bruce.common.domain.model.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* Workflow 定义实体,对应 workflow_definition 表。
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("workflow_definition")
public class WorkflowDefinition extends BaseEntity {
private Long projectId;
private String workflowCode;
private String workflowName;
private String description;
private Long boundAgentId;
private String status;
}

View File

@@ -0,0 +1,41 @@
package com.bruce.workflow.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.bruce.common.domain.model.BaseEntity;
import com.bruce.common.typehandler.PgJsonbStringTypeHandler;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
/**
* Workflow 运行记录实体,对应 workflow_run 表。
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("workflow_run")
public class WorkflowRun extends BaseEntity {
private String requestId;
private Long workflowId;
private Long workflowVersionId;
private Long agentId;
private String runSource;
private String status;
@TableField(typeHandler = PgJsonbStringTypeHandler.class)
private String inputJson;
@TableField(typeHandler = PgJsonbStringTypeHandler.class)
private String outputJson;
private Integer durationMs;
private BigDecimal estimatedCost;
}

View File

@@ -0,0 +1,37 @@
package com.bruce.workflow.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.bruce.common.domain.model.BaseEntity;
import com.bruce.common.typehandler.PgJsonbStringTypeHandler;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* Workflow 步骤日志实体,用于观测与调试。
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("workflow_run_step")
public class WorkflowRunStep extends BaseEntity {
private Long runId;
private String nodeId;
private String nodeType;
private String nodeName;
private String status;
@TableField(typeHandler = PgJsonbStringTypeHandler.class)
private String inputJson;
@TableField(typeHandler = PgJsonbStringTypeHandler.class)
private String outputJson;
private Integer durationMs;
private String errorMessage;
}

View File

@@ -0,0 +1,30 @@
package com.bruce.workflow.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableField;
import com.bruce.common.domain.model.BaseEntity;
import com.bruce.common.typehandler.PgJsonbStringTypeHandler;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* Workflow 版本快照实体,用于持久化画布结构。
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("workflow_version")
public class WorkflowVersion extends BaseEntity {
private Long workflowId;
private Integer versionNo;
private String snapshotName;
@TableField(typeHandler = PgJsonbStringTypeHandler.class)
private String graphJson;
private String publishStatus;
private java.time.LocalDateTime publishedTime;
}

View File

@@ -0,0 +1,44 @@
package com.bruce.workflow.factory;
import com.bruce.workflow.dto.WorkflowDefinitionSaveDTO;
import com.bruce.workflow.entity.WorkflowDefinition;
import com.bruce.workflow.vo.WorkflowDefinitionVO;
import org.springframework.stereotype.Component;
/**
* WorkflowDefinitionFactory 统一处理 DTO、Entity、VO 转换,
* 避免控制层和服务层分散手写字段映射。
*/
@Component
public class WorkflowDefinitionFactory {
public WorkflowDefinition toEntity(WorkflowDefinitionSaveDTO dto) {
if (dto == null) {
return null;
}
WorkflowDefinition entity = new WorkflowDefinition();
entity.setId(dto.getId());
entity.setProjectId(dto.getProjectId());
entity.setWorkflowCode(dto.getWorkflowCode());
entity.setWorkflowName(dto.getWorkflowName());
entity.setDescription(dto.getDescription());
entity.setBoundAgentId(dto.getBoundAgentId());
entity.setStatus(dto.getStatus());
return entity;
}
public WorkflowDefinitionVO toVO(WorkflowDefinition entity) {
if (entity == null) {
return null;
}
WorkflowDefinitionVO vo = new WorkflowDefinitionVO();
vo.setId(entity.getId());
vo.setWorkflowCode(entity.getWorkflowCode());
vo.setWorkflowName(entity.getWorkflowName());
vo.setProjectId(entity.getProjectId());
vo.setBoundAgentId(entity.getBoundAgentId());
vo.setStatus(entity.getStatus());
vo.setDescription(entity.getDescription());
return vo;
}
}

View File

@@ -0,0 +1,7 @@
package com.bruce.workflow.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bruce.workflow.entity.StudioProject;
public interface StudioProjectMapper extends BaseMapper<StudioProject> {
}

View File

@@ -0,0 +1,7 @@
package com.bruce.workflow.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bruce.workflow.entity.WorkflowDefinition;
public interface WorkflowDefinitionMapper extends BaseMapper<WorkflowDefinition> {
}

View File

@@ -0,0 +1,7 @@
package com.bruce.workflow.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bruce.workflow.entity.WorkflowRun;
public interface WorkflowRunMapper extends BaseMapper<WorkflowRun> {
}

View File

@@ -0,0 +1,7 @@
package com.bruce.workflow.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bruce.workflow.entity.WorkflowRunStep;
public interface WorkflowRunStepMapper extends BaseMapper<WorkflowRunStep> {
}

View File

@@ -0,0 +1,7 @@
package com.bruce.workflow.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bruce.workflow.entity.WorkflowVersion;
public interface WorkflowVersionMapper extends BaseMapper<WorkflowVersion> {
}

View File

@@ -0,0 +1,17 @@
package com.bruce.workflow.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bruce.workflow.dto.WorkflowDefinitionSaveDTO;
import com.bruce.workflow.entity.WorkflowDefinition;
import com.bruce.workflow.vo.WorkflowDefinitionVO;
import java.util.List;
public interface IWorkflowDefinitionService extends IService<WorkflowDefinition> {
List<WorkflowDefinitionVO> listDefinitions();
WorkflowDefinitionVO getDefinition(Long id);
boolean saveDefinition(WorkflowDefinitionSaveDTO request);
}

View File

@@ -0,0 +1,55 @@
package com.bruce.workflow.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bruce.workflow.dto.WorkflowDefinitionSaveDTO;
import com.bruce.workflow.entity.WorkflowDefinition;
import com.bruce.workflow.factory.WorkflowDefinitionFactory;
import com.bruce.workflow.mapper.WorkflowDefinitionMapper;
import com.bruce.workflow.service.IWorkflowDefinitionService;
import com.bruce.workflow.vo.WorkflowDefinitionVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* Workflow 定义服务当前先提供主数据能力,
* 后续运行器与版本发布能力会在此基础上继续扩展。
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class WorkflowDefinitionServiceImpl extends ServiceImpl<WorkflowDefinitionMapper, WorkflowDefinition>
implements IWorkflowDefinitionService {
private final WorkflowDefinitionFactory workflowDefinitionFactory;
@Override
public List<WorkflowDefinitionVO> listDefinitions() {
log.info("查询Workflow定义列表开始");
List<WorkflowDefinitionVO> result = list().stream().map(workflowDefinitionFactory::toVO).toList();
log.info("查询Workflow定义列表结束count={}", result.size());
return result;
}
@Override
public WorkflowDefinitionVO getDefinition(Long id) {
log.info("查询Workflow定义详情开始workflowId={}", id);
WorkflowDefinitionVO result = workflowDefinitionFactory.toVO(getById(id));
log.info("查询Workflow定义详情结束workflowId={}, found={}", id, result != null);
return result;
}
@Override
public boolean saveDefinition(WorkflowDefinitionSaveDTO request) {
log.info("保存Workflow定义开始workflowId={}, workflowCode={}", request == null ? null : request.getId(),
request == null ? null : request.getWorkflowCode());
boolean result = saveOrUpdate(workflowDefinitionFactory.toEntity(request));
log.info("保存Workflow定义结束workflowId={}, workflowCode={}, result={}",
request == null ? null : request.getId(),
request == null ? null : request.getWorkflowCode(),
result);
return result;
}
}

View File

@@ -0,0 +1,24 @@
package com.bruce.workflow.vo;
import lombok.Data;
/**
* Workflow 定义详情返回对象。
*/
@Data
public class WorkflowDefinitionVO {
private Long id;
private String workflowCode;
private String workflowName;
private Long projectId;
private Long boundAgentId;
private String status;
private String description;
}