feat(project): 实现AI项目初始化及相关实体管理

- 新增通用返回类BaseResponse用于统一接口响应格式
- 新增业务异常BusinessException及全局异常处理GlobalExceptionHandler
- 新增OSS文件上传控制器支持文件上传与删除接口
- 添加项目核心实体类Project、ProjectMember、ProjectMilestone、ProjectTimeline和Resource
- 实现ProjectService接口及其实现类,使用AI能力从项目文档生成结构化项目数据
- 在ProjectServiceImpl中实现项目数据解析、保存及业务逻辑,包括项目、里程碑、任务、成员、资源、风险等
- 项目初始化控制器ProjectController提供文件上传触发项目初始化功能
- 设计了详细的系统提示词和用户提示词,用于AI模型指导生成严格格式的结构化项目数据
- 设计项目数据持久化流程,确保生成的数据正确保存至数据库,支持事务回滚
- 增强日志记录,便于追踪项目初始化全过程及错误调试
This commit is contained in:
2026-03-27 10:25:13 +08:00
parent 729af44585
commit 294ef21d50
19 changed files with 237 additions and 287 deletions

View File

@@ -17,7 +17,7 @@ import java.util.List;
@TableName("project")
public class Project {
@TableId(type = IdType.AUTO)
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/**

View File

@@ -1,105 +0,0 @@
package cn.yinlihupo.domain.entity;
import cn.yinlihupo.common.handler.JsonbTypeHandler;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
/**
* 项目初始化记录实体类
* 对应数据库表: project_init_record
*/
@Data
@TableName("project_init_record")
public class ProjectInitRecord {
@TableId(type = IdType.AUTO)
private Long id;
/**
* 项目ID
*/
private Long projectId;
/**
* 上传的文件列表[{name, path, type, size}]
*/
@TableField(typeHandler = JsonbTypeHandler.class)
private List<InputFile> inputFiles;
/**
* 用户输入的项目描述
*/
private String inputText;
/**
* 状态: pending-待解析, processing-解析中, completed-已完成, failed-失败
*/
private String parseStatus;
/**
* 解析结果(结构化数据)
*/
@TableField(typeHandler = JsonbTypeHandler.class)
private Object parseResult;
/**
* 生成的里程碑数量
*/
private Integer generatedMilestones;
/**
* 生成的任务数量
*/
private Integer generatedTasks;
/**
* 生成的成员数量
*/
private Integer generatedMembers;
/**
* 生成的资源数量
*/
private Integer generatedResources;
/**
* 使用的AI模型
*/
private String model;
/**
* 消耗的Token数
*/
private Integer tokensUsed;
/**
* 错误信息
*/
private String errorMessage;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
/**
* 输入文件信息内部类
*/
@Data
public static class InputFile {
private String name;
private String path;
private String type;
private Long size;
}
}

View File

@@ -15,7 +15,7 @@ import java.time.LocalDateTime;
@TableName("project_member")
public class ProjectMember {
@TableId(type = IdType.AUTO)
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/**

View File

@@ -16,7 +16,7 @@ import java.util.List;
@TableName("project_milestone")
public class ProjectMilestone {
@TableId(type = IdType.AUTO)
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/**

View File

@@ -16,7 +16,7 @@ import java.util.List;
@TableName("project_timeline")
public class ProjectTimeline {
@TableId(type = IdType.AUTO)
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/**

View File

@@ -17,7 +17,7 @@ import java.util.List;
@TableName("resource")
public class Resource {
@TableId(type = IdType.AUTO)
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/**

View File

@@ -17,7 +17,7 @@ import java.util.List;
@TableName("risk")
public class Risk {
@TableId(type = IdType.AUTO)
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/**

View File

@@ -17,7 +17,7 @@ import java.util.List;
@TableName("task")
public class Task {
@TableId(type = IdType.AUTO)
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/**