# VO类规则

## 1. 目录结构
- VO类统一放置在 `common/src/main/java/com/ecep/contract/vo/` 目录下
- 按业务领域组织，不使用子目录

## 2. 命名规范
- 类名：使用驼峰命名法，首字母大写，以Vo结尾，如 `ContractVo.java`、`CompanyVo.java`

## 3. 继承与接口实现
- **必须实现** `java.io.Serializable` 接口，用于对象序列化
- **通常实现** `IdentityEntity` 接口，提供主键ID的getter/setter方法
- **可能实现** `NamedEntity` 接口，提供name属性的getter/setter方法（适用于有名称的VO）
- **可能实现**特定领域接口，如：
  - `CompanyBasedVo`：提供companyId属性的getter/setter方法
  - `ProjectBasedVo`：提供project属性的getter/setter方法
  - `ContractBasedVo`：提供contractId属性的getter/setter方法
  - 其他类似的基于特定实体的接口

## 4. 注解规范
- 通常使用Lombok的 `@Data` 注解，自动生成getter、setter、equals、hashCode和toString方法

## 5. 序列化规范
- **必须包含** `private static final long serialVersionUID = 1L;` 字段，用于版本控制
- 所有字段类型必须是可序列化的

## 6. 字段规范
- 字段类型：
  - 整数类型：可使用 `Integer` 包装类型或 `int` 原始类型
  - 布尔类型：可使用 `Boolean` 包装类型或 `boolean` 原始类型
  - 时间类型：使用 `java.time.LocalDate`（日期）或 `java.time.LocalDateTime`（日期时间）
  - 字符串类型：使用 `String`
  - 浮点数类型：使用 `double` 或 `Double`
- 关联关系：
  - 通常只包含关联实体的ID字段，如 `companyId`、`project`、`contractId` 等
  - 不包含实体对象的直接引用
- 默认值：
  - 布尔类型字段通常有默认值（如 `false`）
  - 其他类型根据业务需求设置默认值

## 7. 注释规范
- 类注释：使用JavaDoc格式，描述VO类的用途，如 `/** 项目报价视图对象 */`
- 字段注释：使用JavaDoc格式，描述字段的含义、用途或业务规则
- 关键字段（如外键、状态字段）应提供清晰的注释说明

## 8. 最佳实践
- VO类应保持简洁，只包含数据和基本的数据访问方法
- 避免在VO类中包含复杂的业务逻辑
- 字段命名应与对应的实体类保持一致或有明确的映射关系
- 确保所有字段都是可序列化的
- 对于有默认值的字段，应在声明时初始化

## 9. 与实体类的区别
- **序列化**：VO类必须实现 `Serializable` 接口并包含 `serialVersionUID` 字段，而实体类不包含
- **用途**：VO类主要用于数据传输和展示，实体类主要用于持久化
- **关联关系**：VO类通常只包含关联实体的ID，实体类包含实体对象的引用
- **注解**：VO类主要使用Lombok注解，实体类使用JPA注解和Lombok注解
- **方法**：VO类通常只有getter/setter方法，实体类可能包含更多业务相关方法