重构模型类包结构,将模型类按功能模块划分到不同的子包中。优化序列化处理,为VO类添加serialVersionUID并实现Serializable接口。移除部分冗余的serialVersionUID字段,简化模型类代码。同时修复UITools中空值处理的问题,并更新pom版本至0.0.100-SNAPSHOT。 - 将模型类按功能模块划分到ds子包中 - 为VO类添加序列化支持 - 移除冗余的serialVersionUID字段 - 修复UITools空值处理问题 - 更新项目版本号
315 lines
14 KiB
Markdown
315 lines
14 KiB
Markdown
# 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接口泛型类型为Model,QueryService接口泛型类型为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接口泛型类型为Model,QueryService接口泛型类型为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 | - | 添加更多技术实现细节和经验总结 | 开发团队 | |