feat(project): 实现AI项目初始化功能

- 新增项目初始化控制器,支持文件上传生成项目结构化数据
- 定义项目初始化结果DTO,包含项目、里程碑、任务、成员、资源、风险和时间节点等信息
- 实现项目初始化服务接口及其实现类,集成Spring AI结构化输出能力
- 支持根据内容或文件生成项目初始化数据,并保存到数据库
- 增加项目、里程碑、任务、成员、资源、风险及时间节点实体及对应Mapper
- 实现文件上传到OSS及项目初始化记录功能,记录解析状态及结果
- 添加PostgreSQL JSONB类型处理器,支持JSON对象字段存储
- 修改开发环境数据库配置,更新连接的数据库名称为aiprojectmanager
This commit is contained in:
2026-03-26 20:05:55 +08:00
parent 0bf41c5353
commit 729af44585
22 changed files with 1623 additions and 15 deletions

View File

@@ -0,0 +1,157 @@
package cn.yinlihupo.domain.entity;
import cn.yinlihupo.common.handler.JsonbTypeHandler;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
/**
* 项目实体类
* 对应数据库表: project
*/
@Data
@TableName("project")
public class Project {
@TableId(type = IdType.AUTO)
private Long id;
/**
* 项目编号
*/
private String projectCode;
/**
* 项目名称
*/
private String projectName;
/**
* 项目类型
*/
private String projectType;
/**
* 项目描述
*/
private String description;
/**
* 项目目标
*/
private String objectives;
/**
* 项目经理ID
*/
private Long managerId;
/**
* 项目发起人ID
*/
private Long sponsorId;
/**
* 计划开始日期
*/
private LocalDate planStartDate;
/**
* 计划结束日期
*/
private LocalDate planEndDate;
/**
* 实际开始日期
*/
private LocalDate actualStartDate;
/**
* 实际结束日期
*/
private LocalDate actualEndDate;
/**
* 项目预算
*/
private BigDecimal budget;
/**
* 已花费金额
*/
private BigDecimal cost;
/**
* 币种
*/
private String currency;
/**
* 进度百分比
*/
private Integer progress;
/**
* 状态: draft-草稿, planning-规划中, ongoing-进行中, paused-暂停, completed-已完成, cancelled-已取消
*/
private String status;
/**
* 优先级: critical-关键, high-高, medium-中, low-低
*/
private String priority;
/**
* 风险等级: high-高, medium-中, low-低
*/
private String riskLevel;
/**
* 可见性: 1-公开, 2-部门内, 3-项目成员
*/
private Integer visibility;
/**
* 标签列表
*/
@TableField(typeHandler = JsonbTypeHandler.class)
private List<String> tags;
/**
* 扩展数据
*/
@TableField(typeHandler = JsonbTypeHandler.class)
private Object extraData;
/**
* 创建人
*/
private Long createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 更新人
*/
private Long updateBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
/**
* 删除标记
*/
@TableLogic
private Integer deleted;
}

View File

@@ -0,0 +1,105 @@
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

@@ -0,0 +1,83 @@
package cn.yinlihupo.domain.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
* 项目成员实体类
* 对应数据库表: project_member
*/
@Data
@TableName("project_member")
public class ProjectMember {
@TableId(type = IdType.AUTO)
private Long id;
/**
* 项目ID
*/
private Long projectId;
/**
* 用户ID
*/
private Long userId;
/**
* 项目角色: manager-项目经理, leader-负责人, member-成员, observer-观察者
*/
private String roleCode;
/**
* 加入日期
*/
private LocalDate joinDate;
/**
* 离开日期
*/
private LocalDate leaveDate;
/**
* 职责描述
*/
private String responsibility;
/**
* 每周投入小时数
*/
private BigDecimal weeklyHours;
/**
* 状态: 1-正常, 0-已移除
*/
private Integer status;
/**
* 创建人
*/
private Long createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
/**
* 删除标记
*/
@TableLogic
private Integer deleted;
}

View File

@@ -0,0 +1,106 @@
package cn.yinlihupo.domain.entity;
import cn.yinlihupo.common.handler.JsonbTypeHandler;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
/**
* 项目里程碑实体类
* 对应数据库表: project_milestone
*/
@Data
@TableName("project_milestone")
public class ProjectMilestone {
@TableId(type = IdType.AUTO)
private Long id;
/**
* 项目ID
*/
private Long projectId;
/**
* 里程碑名称
*/
private String milestoneName;
/**
* 描述
*/
private String description;
/**
* 计划日期
*/
private LocalDate planDate;
/**
* 实际日期
*/
private LocalDate actualDate;
/**
* 状态: pending-待开始, in_progress-进行中, completed-已完成, delayed-延期
*/
private String status;
/**
* 完成进度
*/
private Integer progress;
/**
* 排序
*/
private Integer sortOrder;
/**
* 是否关键里程碑: 1-是, 0-否
*/
private Integer isKey;
/**
* 交付物列表
*/
@TableField(typeHandler = JsonbTypeHandler.class)
private List<String> deliverables;
/**
* 扩展数据
*/
@TableField(typeHandler = JsonbTypeHandler.class)
private Object extraData;
/**
* 创建人
*/
private Long createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 更新人
*/
private Long updateBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
/**
* 删除标记
*/
@TableLogic
private Integer deleted;
}

View File

@@ -0,0 +1,96 @@
package cn.yinlihupo.domain.entity;
import cn.yinlihupo.common.handler.JsonbTypeHandler;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
/**
* 项目时间节点实体类
* 对应数据库表: project_timeline
*/
@Data
@TableName("project_timeline")
public class ProjectTimeline {
@TableId(type = IdType.AUTO)
private Long id;
/**
* 项目ID
*/
private Long projectId;
/**
* 节点名称
*/
private String nodeName;
/**
* 节点类型: phase-阶段, milestone-里程碑, event-事件, checkpoint-检查点
*/
private String nodeType;
/**
* 父节点ID
*/
private Long parentId;
/**
* 计划日期
*/
private LocalDate planDate;
/**
* 实际日期
*/
private LocalDate actualDate;
/**
* 描述
*/
private String description;
/**
* 状态: pending-待开始, in_progress-进行中, completed-已完成, delayed-延期
*/
private String status;
/**
* 排序
*/
private Integer sortOrder;
/**
* 知识库范围配置["report","file","risk","ticket"]
*/
@TableField(typeHandler = JsonbTypeHandler.class)
private List<String> kbScope;
/**
* 扩展数据
*/
@TableField(typeHandler = JsonbTypeHandler.class)
private Object extraData;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
/**
* 删除标记
*/
@TableLogic
private Integer deleted;
}

View File

@@ -0,0 +1,147 @@
package cn.yinlihupo.domain.entity;
import cn.yinlihupo.common.handler.JsonbTypeHandler;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
/**
* 资源实体类
* 对应数据库表: resource
*/
@Data
@TableName("resource")
public class Resource {
@TableId(type = IdType.AUTO)
private Long id;
/**
* 资源编号
*/
private String resourceCode;
/**
* 项目ID
*/
private Long projectId;
/**
* 资源类型: human-人力, material-物料, equipment-设备, software-软件, finance-资金, other-其他
*/
private String resourceType;
/**
* 资源名称
*/
private String resourceName;
/**
* 资源描述
*/
private String description;
/**
* 规格型号
*/
private String specification;
/**
* 单位
*/
private String unit;
/**
* 计划数量
*/
private BigDecimal planQuantity;
/**
* 实际数量
*/
private BigDecimal actualQuantity;
/**
* 单价
*/
private BigDecimal unitPrice;
/**
* 币种
*/
private String currency;
/**
* 供应商/来源
*/
private String supplier;
/**
* 状态: planned-计划中, requested-已申请, approved-已批准, procuring-采购中, arrived-已到货, in_use-使用中, completed-已完成
*/
private String status;
/**
* 计划到位日期
*/
private LocalDate planArriveDate;
/**
* 实际到位日期
*/
private LocalDate actualArriveDate;
/**
* 负责人ID
*/
private Long responsibleId;
/**
* 存放位置
*/
private String location;
/**
* 标签
*/
@TableField(typeHandler = JsonbTypeHandler.class)
private List<String> tags;
/**
* 扩展数据
*/
@TableField(typeHandler = JsonbTypeHandler.class)
private Object extraData;
/**
* 创建人
*/
private Long createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 更新人
*/
private Long updateBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
/**
* 删除标记
*/
@TableLogic
private Integer deleted;
}

View File

@@ -0,0 +1,169 @@
package cn.yinlihupo.domain.entity;
import cn.yinlihupo.common.handler.JsonbTypeHandler;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
/**
* 风险实体类
* 对应数据库表: risk
*/
@Data
@TableName("risk")
public class Risk {
@TableId(type = IdType.AUTO)
private Long id;
/**
* 风险编号
*/
private String riskCode;
/**
* 项目ID
*/
private Long projectId;
/**
* 风险分类: technical-技术风险, schedule-进度风险, cost-成本风险, quality-质量风险, resource-资源风险, external-外部风险, other-其他
*/
private String category;
/**
* 风险名称
*/
private String riskName;
/**
* 风险描述
*/
private String description;
/**
* 风险来源: internal-内部, external-外部, ai_detection-AI检测
*/
private String riskSource;
/**
* 风险类型
*/
private String riskType;
/**
* 发生概率(0-100%)
*/
private BigDecimal probability;
/**
* 影响程度(1-5)
*/
private BigDecimal impact;
/**
* 风险得分(概率*影响)
*/
private BigDecimal riskScore;
/**
* 风险等级: critical-严重, high-高, medium-中, low-低
*/
private String riskLevel;
/**
* 状态: identified-已识别, assigned-已分派工单, mitigating-缓解中, resolved-已解决, closed-已关闭
*/
private String status;
/**
* 负责人ID
*/
private Long ownerId;
/**
* 关联的工单ID数组
*/
@TableField(typeHandler = JsonbTypeHandler.class)
private List<Long> workOrderIds;
/**
* 缓解措施
*/
private String mitigationPlan;
/**
* 应急计划
*/
private String contingencyPlan;
/**
* 触发条件
*/
private String triggerCondition;
/**
* 发现时间
*/
private LocalDateTime discoverTime;
/**
* 预期解决日期
*/
private LocalDate dueDate;
/**
* 解决时间
*/
private LocalDateTime resolvedTime;
/**
* AI分析结果
*/
@TableField(typeHandler = JsonbTypeHandler.class)
private Object aiAnalysis;
/**
* 标签
*/
@TableField(typeHandler = JsonbTypeHandler.class)
private List<String> tags;
/**
* 扩展数据
*/
@TableField(typeHandler = JsonbTypeHandler.class)
private Object extraData;
/**
* 创建人
*/
private Long createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 更新人
*/
private Long updateBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
/**
* 删除标记
*/
@TableLogic
private Integer deleted;
}

View File

@@ -0,0 +1,158 @@
package cn.yinlihupo.domain.entity;
import cn.yinlihupo.common.handler.JsonbTypeHandler;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
/**
* 任务实体类
* 对应数据库表: task
*/
@Data
@TableName("task")
public class Task {
@TableId(type = IdType.AUTO)
private Long id;
/**
* 任务编号
*/
private String taskCode;
/**
* 项目ID
*/
private Long projectId;
/**
* 所属里程碑ID
*/
private Long milestoneId;
/**
* 父任务ID
*/
private Long parentId;
/**
* 任务名称
*/
private String taskName;
/**
* 任务描述
*/
private String description;
/**
* 任务类型
*/
private String taskType;
/**
* 执行人ID
*/
private Long assigneeId;
/**
* 计划开始日期
*/
private LocalDate planStartDate;
/**
* 计划结束日期
*/
private LocalDate planEndDate;
/**
* 实际开始日期
*/
private LocalDate actualStartDate;
/**
* 实际结束日期
*/
private LocalDate actualEndDate;
/**
* 计划工时(小时)
*/
private BigDecimal planHours;
/**
* 实际工时(小时)
*/
private BigDecimal actualHours;
/**
* 进度百分比
*/
private Integer progress;
/**
* 优先级: critical-关键, high-高, medium-中, low-低
*/
private String priority;
/**
* 状态: pending-待开始, in_progress-进行中, completed-已完成, cancelled-已取消
*/
private String status;
/**
* 排序
*/
private Integer sortOrder;
/**
* 标签
*/
@TableField(typeHandler = JsonbTypeHandler.class)
private List<String> tags;
/**
* 附件列表
*/
@TableField(typeHandler = JsonbTypeHandler.class)
private List<Object> attachments;
/**
* 扩展数据
*/
@TableField(typeHandler = JsonbTypeHandler.class)
private Object extraData;
/**
* 创建人
*/
private Long createBy;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
/**
* 更新人
*/
private Long updateBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
/**
* 删除标记
*/
@TableLogic
private Integer deleted;
}

View File

@@ -1,4 +1,4 @@
package cn.yinlihupo.domain.dto;
package cn.yinlihupo.domain.vo;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;