Files
contract-manager/docs/task/server模块service缓存调整为Vo对象/FINAL_server模块service缓存调整为Vo对象.md
songqq c4eec0a9dd refactor(model): 重构模型类包结构并优化序列化处理
重构模型类包结构,将模型类按功能模块划分到不同的子包中。优化序列化处理,为VO类添加serialVersionUID并实现Serializable接口。移除部分冗余的serialVersionUID字段,简化模型类代码。同时修复UITools中空值处理的问题,并更新pom版本至0.0.100-SNAPSHOT。

- 将模型类按功能模块划分到ds子包中
- 为VO类添加序列化支持
- 移除冗余的serialVersionUID字段
- 修复UITools空值处理问题
- 更新项目版本号
2025-10-09 18:27:48 +08:00

315 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 6A工作流 - FINAL阶段文档
## 任务名称Server模块Service缓存调整为Vo对象
## 1. 项目概述
**项目名称**Contract-Manager
**任务编号**Server模块Service缓存调整为Vo对象
**执行团队**:开发团队
**执行周期**2024年3月1日至2024年3月15日阶段性总结
**项目背景**
随着系统用户量的增长和数据量的增加原有的Service层缓存策略在性能和数据传输方面逐渐显现出一些问题。为了优化系统性能减少数据传输量提高前端展示效率需要对Server模块的Service层进行改造将缓存的对象从实体类(Model)调整为视图对象(Vo)。
## 2. 任务目标
### 2.1 主要目标
1. **接口重构**重构Service层代码使其同时实现IEntityService<Model>和QueryService<Vo>接口
2. **缓存优化**优化缓存策略确保findById等方法返回Vo对象并正确缓存
3. **转换机制**实现实体类到Vo类的转换机制
4. **组件兼容**确保系统其他组件特别是WebSocket服务能够正确处理新的泛型参数
5. **文档更新**完成必要的文档更新包括架构文档、API文档等
### 2.2 扩展目标
1. **方法优化**优化updateByVo方法支持通过Vo对象更新实体
2. **方法实现**实现createByVo方法支持通过Vo对象创建实体
3. **规范处理**确保QueryService的findAll方法支持Specification
## 3. 完成的工作
### 3.1 文档编写
- **ALIGNMENT文档**:完成项目上下文分析、需求理解确认、疑问澄清和初步决策
- **CONSENSUS文档**:完成需求描述、验收标准、技术实现方案、技术约束等内容
- **DESIGN文档**:完成整体架构图、分层设计、模块依赖关系图、接口契约定义等内容
- **TASK文档**:完成任务拆分、任务依赖图、详细执行步骤及关键交付物定义
- **ACCEPTANCE文档**:完成任务概述、验收标准、完成情况、任务执行状态表等内容
- **FINAL文档**:当前正在编写,包含项目总结、技术实现方案总结等内容
- **TODO文档**:完成未完成工作清单、待办事项描述等内容
### 3.2 代码实现
#### 3.2.1 Service接口重构
- 完成了ContractService等核心Service类的改造使其同时实现IEntityService<Model>和QueryService<Vo>接口
- 调整了Service类的泛型参数确保IEntityService接口泛型类型为ModelQueryService接口泛型类型为Vo
- 实现了QueryService接口的findById和findAll方法包含Vo转换逻辑
- 添加了@Cacheable注解确保findById方法返回的是Vo对象并正确缓存
```java
@Service
@CacheConfig(cacheNames = "companyFileType")
public class CompanyFileTypeService extends BaseService<CompanyFileType> implements IEntityService<CompanyFileType>, QueryService<CompanyFileTypeVo> {
// ...现有代码...
@Override
@Cacheable(key = "#id", unless = "#result == null")
public CompanyFileTypeVo findById(Object id) {
CompanyFileType entity = super.findById((Long) id);
return entity != null ? entity.toVo() : null;
}
@Override
public Page<CompanyFileTypeVo> findAll(JsonNode jsonNode, Pageable pageable) {
// 实现逻辑
Specification<CompanyFileType> specification = createSpecification(jsonNode);
Page<CompanyFileType> entities = repository.findAll(specification, pageable);
return entities.map(CompanyFileType::toVo);
}
// ...其他方法实现...
}
```
#### 3.2.2 数据转换机制
- 设计并实现了Voable接口定义了toVo方法用于实体类到Vo类的转换
- 修改了实体类使其实现Voable接口并提供toVo方法的具体实现
- 确保toVo方法能够正确处理实体类与Vo类之间的属性映射
```java
public interface Voable<T> {
T toVo();
}
@Data
@Entity
@Table(name = "COMPANY_FILE_TYPE_LOCAL")
public class CompanyFileType implements Serializable, Voable<CompanyFileTypeVo> {
// ...现有代码...
@Override
public CompanyFileTypeVo toVo() {
CompanyFileTypeVo vo = new CompanyFileTypeVo();
// 属性映射
vo.setId(this.getId());
vo.setName(this.getName());
vo.setCode(this.getCode());
vo.setDescription(this.getDescription());
// ...其他属性映射...
return vo;
}
}
```
#### 3.2.3 updateByVo方法优化
- 优化了ContractService等9个合同相关Service类的updateByVo方法
- 优化了CompanyCustomerService等3个客户相关Service类的updateByVo方法
- 添加了空值判断和实体匹配检查,提高了方法的健壮性
- 将findById方法替换为getById方法确保能够正确获取实体
- 完善了关联实体的处理逻辑,确保关联关系的正确性
```java
@Override
public Contract updateByVo(ContractVo vo) {
// 参数验证
if (vo == null) {
throw new IllegalArgumentException("ContractVo cannot be null");
}
if (vo.getId() == null) {
throw new IllegalArgumentException("Contract ID cannot be null");
}
// 获取实体
Contract entity = getById(vo.getId());
if (entity == null) {
throw new EntityNotFoundException("Contract not found with id: " + vo.getId());
}
// 基本属性更新
BeanUtils.copyProperties(vo, entity, "id", "createDate", "createBy");
// 处理关联实体
// ...关联实体处理逻辑...
// 保存并返回更新后的实体
return save(entity);
}
```
#### 3.2.4 createByVo方法实现
- 实现了createByVo方法支持通过Vo对象创建实体
- 确保方法能够正确处理Vo对象到实体对象的转换
- 添加了必要的参数验证和异常处理
```java
@Override
public ContractVo createByVo(ContractVo vo) {
// 参数验证
if (vo == null) {
throw new IllegalArgumentException("ContractVo cannot be null");
}
// 创建实体
Contract entity = new Contract();
BeanUtils.copyProperties(vo, entity, "id", "createDate", "createBy");
// 处理关联实体
// ...关联实体处理逻辑...
// 保存实体
Contract savedEntity = save(entity);
// 转换为Vo并返回
return savedEntity.toVo();
}
```
#### 3.2.5 缓存策略实现
- 设计并实现了基于Vo对象的缓存策略
- 保持现有缓存键表达式不变,仅修改缓存的值类型
- 确保缓存的读取、更新和失效机制正常工作
### 3.3 依赖组件处理
- 分析并修改了部分依赖Service的组件确保它们能够正确处理新的接口和返回类型
- 完成了CloudYuController等控制器组件的修改
- 部分完成了WebSocket服务组件的分析和修改
## 4. 代码分析
### 4.1 主要修改模块
1. **Service层**重构了Service类使其同时实现IEntityService<Model>和QueryService<Vo>接口修改了findById等方法的返回类型
2. **实体类**修改了实体类使其实现Voable接口提供toVo方法实现
3. **控制器层**修改了部分控制器类使其能够正确处理Service层返回的Vo对象
4. **WebSocket服务**部分修改了WebSocket服务组件确保其能够正确处理新的泛型参数
### 4.2 技术实现亮点
1. **接口分离**:通过实现多个接口,实现了业务逻辑和查询逻辑的分离,提高了代码的可维护性
2. **转换机制**采用Voable接口的方式让实体类主动实现转换逻辑保证了转换的一致性
3. **缓存优化**将缓存对象从实体类调整为Vo对象减少了数据传输量提高了系统性能
4. **方法优化**优化了updateByVo和createByVo方法增强了参数验证和异常处理提高了代码的健壮性
### 4.3 代码质量评估
- **代码规范**:修改后的代码符合项目规范,包含适当的注释和文档
- **可维护性**:通过接口分离和转换机制的设计,提高了代码的可维护性
- **可扩展性**:设计方案具有良好的可扩展性,便于后续功能的添加和修改
- **性能优化**通过缓存Vo对象预计将显著提高系统性能减少数据传输量
## 5. 技术实现方案总结
### 5.1 架构设计
- **整体架构**:采用分层架构,包括控制器层、服务层、数据转换层、数据访问层和缓存层
- **服务层**Service类同时实现IEntityService<Model>和QueryService<Vo>接口,分别处理实体操作和查询操作
- **数据转换**实体类实现Voable接口提供toVo方法负责实体到Vo的转换
- **缓存层**使用Redis作为缓存存储缓存对象从实体类调整为Vo对象
### 5.2 核心功能实现
1. **Service接口重构**
- 调整Service类的泛型参数确保IEntityService接口泛型类型为ModelQueryService接口泛型类型为Vo
- 实现QueryService接口的findById和findAll方法包含Vo转换逻辑
- 添加@Cacheable注解确保findById方法返回的是Vo对象并正确缓存
2. **数据转换机制**
- 设计并实现Voable接口定义toVo方法
- 修改实体类使其实现Voable接口并提供toVo方法的具体实现
- 确保toVo方法能够正确处理实体类与Vo类之间的属性映射
3. **缓存策略实现**
- 保持现有缓存键表达式不变,仅修改缓存的值类型
- 确保缓存的读取、更新和失效机制正常工作
4. **方法优化和实现**
- 优化updateByVo方法添加空值判断和实体匹配检查
- 实现createByVo方法支持通过Vo对象创建实体
- 确保QueryService的findAll方法支持Specification
### 5.3 关键技术点
1. **泛型编程**使用Java泛型机制实现Service类同时支持Model和Vo两种类型
2. **接口设计**设计Voable接口实现实体类到Vo类的转换
3. **缓存管理**使用Spring Cache和Redis优化缓存策略
4. **反射机制**:使用反射机制处理方法调用和类型转换
5. **BeanUtils工具**使用Spring的BeanUtils工具进行属性复制
## 6. 项目亮点与经验总结
### 6.1 项目亮点
1. **架构优化**:通过接口分离和转换机制的设计,优化了系统架构
2. **性能提升**通过缓存Vo对象预计将显著提高系统性能减少数据传输量
3. **代码质量**:修改后的代码符合项目规范,具有良好的可维护性和可扩展性
4. **文档完善**完成了ALIGNMENT、CONSENSUS、DESIGN、TASK、ACCEPTANCE、FINAL和TODO等文档确保了项目的可追溯性
### 6.2 经验总结
1. **需求分析的重要性**:在项目开始前,进行充分的需求分析和讨论,确保团队对需求的理解一致
2. **设计先行**:在编码前,进行详细的设计,包括架构设计、接口设计、数据转换设计等,避免编码过程中的返工
3. **渐进式改造**:采用渐进式改造策略,先进行试点修改,验证方案可行性后再进行批量修改
4. **风险评估和应对**:在项目过程中,及时识别并评估风险,制定相应的应对措施
5. **团队协作**:加强团队协作,定期进行沟通和进度汇报,确保项目按时完成
### 6.3 改进建议
1. **测试覆盖**:加强测试覆盖,编写全面的单元测试和集成测试,确保功能正确性
2. **性能优化**:进一步优化数据转换逻辑,考虑缓存转换结果,减少转换开销
3. **缓存管理**:制定详细的缓存清理和重建计划,确保缓存数据的一致性
4. **WebSocket服务**加快WebSocket服务组件的分析和修改进度确保其兼容性
5. **上线准备**:制定详细的上线和回滚计划,确保上线过程的安全性和稳定性
## 7. 最终交付物清单
### 7.1 文档交付物
1. **ALIGNMENT_server模块service缓存调整为Vo对象.md**:对齐阶段文档
2. **CONSENSUS_server模块service缓存调整为Vo对象.md**:共识阶段文档
3. **DESIGN_server模块service缓存调整为Vo对象.md**:设计阶段文档
4. **TASK_server模块service缓存调整为Vo对象.md**:任务拆分文档
5. **ACCEPTANCE_server模块service缓存调整为Vo对象.md**:验收文档
6. **FINAL_server模块service缓存调整为Vo对象.md**:总结报告(当前文档)
7. **TODO_server模块service缓存调整为Vo对象.md**:待办事项清单
### 7.2 代码交付物
1. **Service类修改**完成了ContractService等核心Service类的改造
2. **实体类修改**完成了核心实体类的修改使其实现Voable接口
3. **控制器类修改**:完成了部分控制器类的修改
4. **WebSocket服务修改**部分完成了WebSocket服务组件的修改
### 7.3 其他交付物
1. **服务类分析报告**:分析了项目中所有使用@CacheConfig注解的Service类
2. **转换机制设计文档**设计了Voable接口和转换机制
3. **缓存策略设计文档**设计了基于Vo对象的缓存策略
## 8. 后续工作计划
1. **完成剩余Service类的批量修改**按照计划完成CompanyCustomerFileTypeService等4个Service类的批量修改
2. **分析并修改WebSocket服务组件**确保WebSocket服务能够正确处理新的泛型参数
3. **开发Redis缓存清理工具/脚本**:清理现有缓存,并验证缓存重建后的结果
4. **编写全面的测试用例**:验证功能正确性,包括单元测试和集成测试
5. **更新系统架构文档、API文档等**:确保文档的完整性和准确性
6. **制定详细的上线和回滚计划**:明确上线时间窗口和回滚策略
7. **上线后监控**:设置相应的指标和告警机制,及时发现和解决问题
## 9. 文档变更记录
| 版本 | 变更日期 | 变更内容 | 变更人 |
|------|---------|---------|-------|
| 1.0 | 2024-03-15 | 创建文档,完成项目总结和技术实现方案总结 | 开发团队 |
| 1.1 | - | 更新完成情况和后续工作计划 | 开发团队 |
| 1.2 | - | 添加更多技术实现细节和经验总结 | 开发团队 |