重构模型类包结构,将模型类按功能模块划分到不同的子包中。优化序列化处理,为VO类添加serialVersionUID并实现Serializable接口。移除部分冗余的serialVersionUID字段,简化模型类代码。同时修复UITools中空值处理的问题,并更新pom版本至0.0.100-SNAPSHOT。 - 将模型类按功能模块划分到ds子包中 - 为VO类添加序列化支持 - 移除冗余的serialVersionUID字段 - 修复UITools空值处理问题 - 更新项目版本号
14 KiB
14 KiB
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 主要目标
- 接口重构:重构Service层代码,使其同时实现IEntityService和QueryService接口
- 缓存优化:优化缓存策略,确保findById等方法返回Vo对象并正确缓存
- 转换机制:实现实体类到Vo类的转换机制
- 组件兼容:确保系统其他组件(特别是WebSocket服务)能够正确处理新的泛型参数
- 文档更新:完成必要的文档更新,包括架构文档、API文档等
2.2 扩展目标
- 方法优化:优化updateByVo方法,支持通过Vo对象更新实体
- 方法实现:实现createByVo方法,支持通过Vo对象创建实体
- 规范处理:确保QueryService的findAll方法支持Specification
3. 完成的工作
3.1 文档编写
- ALIGNMENT文档:完成项目上下文分析、需求理解确认、疑问澄清和初步决策
- CONSENSUS文档:完成需求描述、验收标准、技术实现方案、技术约束等内容
- DESIGN文档:完成整体架构图、分层设计、模块依赖关系图、接口契约定义等内容
- TASK文档:完成任务拆分、任务依赖图、详细执行步骤及关键交付物定义
- ACCEPTANCE文档:完成任务概述、验收标准、完成情况、任务执行状态表等内容
- FINAL文档:当前正在编写,包含项目总结、技术实现方案总结等内容
- TODO文档:完成未完成工作清单、待办事项描述等内容
3.2 代码实现
3.2.1 Service接口重构
- 完成了ContractService等核心Service类的改造,使其同时实现IEntityService和QueryService接口
- 调整了Service类的泛型参数,确保IEntityService接口泛型类型为Model,QueryService接口泛型类型为Vo
- 实现了QueryService接口的findById和findAll方法,包含Vo转换逻辑
- 添加了@Cacheable注解,确保findById方法返回的是Vo对象并正确缓存
@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类之间的属性映射
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方法,确保能够正确获取实体
- 完善了关联实体的处理逻辑,确保关联关系的正确性
@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对象到实体对象的转换
- 添加了必要的参数验证和异常处理
@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 主要修改模块
- Service层:重构了Service类,使其同时实现IEntityService和QueryService接口,修改了findById等方法的返回类型
- 实体类:修改了实体类,使其实现Voable接口,提供toVo方法实现
- 控制器层:修改了部分控制器类,使其能够正确处理Service层返回的Vo对象
- WebSocket服务:部分修改了WebSocket服务组件,确保其能够正确处理新的泛型参数
4.2 技术实现亮点
- 接口分离:通过实现多个接口,实现了业务逻辑和查询逻辑的分离,提高了代码的可维护性
- 转换机制:采用Voable接口的方式,让实体类主动实现转换逻辑,保证了转换的一致性
- 缓存优化:将缓存对象从实体类调整为Vo对象,减少了数据传输量,提高了系统性能
- 方法优化:优化了updateByVo和createByVo方法,增强了参数验证和异常处理,提高了代码的健壮性
4.3 代码质量评估
- 代码规范:修改后的代码符合项目规范,包含适当的注释和文档
- 可维护性:通过接口分离和转换机制的设计,提高了代码的可维护性
- 可扩展性:设计方案具有良好的可扩展性,便于后续功能的添加和修改
- 性能优化:通过缓存Vo对象,预计将显著提高系统性能,减少数据传输量
5. 技术实现方案总结
5.1 架构设计
- 整体架构:采用分层架构,包括控制器层、服务层、数据转换层、数据访问层和缓存层
- 服务层:Service类同时实现IEntityService和QueryService接口,分别处理实体操作和查询操作
- 数据转换:实体类实现Voable接口,提供toVo方法,负责实体到Vo的转换
- 缓存层:使用Redis作为缓存存储,缓存对象从实体类调整为Vo对象
5.2 核心功能实现
-
Service接口重构
- 调整Service类的泛型参数,确保IEntityService接口泛型类型为Model,QueryService接口泛型类型为Vo
- 实现QueryService接口的findById和findAll方法,包含Vo转换逻辑
- 添加@Cacheable注解,确保findById方法返回的是Vo对象并正确缓存
-
数据转换机制
- 设计并实现Voable接口,定义toVo方法
- 修改实体类,使其实现Voable接口并提供toVo方法的具体实现
- 确保toVo方法能够正确处理实体类与Vo类之间的属性映射
-
缓存策略实现
- 保持现有缓存键表达式不变,仅修改缓存的值类型
- 确保缓存的读取、更新和失效机制正常工作
-
方法优化和实现
- 优化updateByVo方法,添加空值判断和实体匹配检查
- 实现createByVo方法,支持通过Vo对象创建实体
- 确保QueryService的findAll方法支持Specification
5.3 关键技术点
- 泛型编程:使用Java泛型机制,实现Service类同时支持Model和Vo两种类型
- 接口设计:设计Voable接口,实现实体类到Vo类的转换
- 缓存管理:使用Spring Cache和Redis,优化缓存策略
- 反射机制:使用反射机制处理方法调用和类型转换
- BeanUtils工具:使用Spring的BeanUtils工具进行属性复制
6. 项目亮点与经验总结
6.1 项目亮点
- 架构优化:通过接口分离和转换机制的设计,优化了系统架构
- 性能提升:通过缓存Vo对象,预计将显著提高系统性能,减少数据传输量
- 代码质量:修改后的代码符合项目规范,具有良好的可维护性和可扩展性
- 文档完善:完成了ALIGNMENT、CONSENSUS、DESIGN、TASK、ACCEPTANCE、FINAL和TODO等文档,确保了项目的可追溯性
6.2 经验总结
- 需求分析的重要性:在项目开始前,进行充分的需求分析和讨论,确保团队对需求的理解一致
- 设计先行:在编码前,进行详细的设计,包括架构设计、接口设计、数据转换设计等,避免编码过程中的返工
- 渐进式改造:采用渐进式改造策略,先进行试点修改,验证方案可行性后再进行批量修改
- 风险评估和应对:在项目过程中,及时识别并评估风险,制定相应的应对措施
- 团队协作:加强团队协作,定期进行沟通和进度汇报,确保项目按时完成
6.3 改进建议
- 测试覆盖:加强测试覆盖,编写全面的单元测试和集成测试,确保功能正确性
- 性能优化:进一步优化数据转换逻辑,考虑缓存转换结果,减少转换开销
- 缓存管理:制定详细的缓存清理和重建计划,确保缓存数据的一致性
- WebSocket服务:加快WebSocket服务组件的分析和修改进度,确保其兼容性
- 上线准备:制定详细的上线和回滚计划,确保上线过程的安全性和稳定性
7. 最终交付物清单
7.1 文档交付物
- ALIGNMENT_server模块service缓存调整为Vo对象.md:对齐阶段文档
- CONSENSUS_server模块service缓存调整为Vo对象.md:共识阶段文档
- DESIGN_server模块service缓存调整为Vo对象.md:设计阶段文档
- TASK_server模块service缓存调整为Vo对象.md:任务拆分文档
- ACCEPTANCE_server模块service缓存调整为Vo对象.md:验收文档
- FINAL_server模块service缓存调整为Vo对象.md:总结报告(当前文档)
- TODO_server模块service缓存调整为Vo对象.md:待办事项清单
7.2 代码交付物
- Service类修改:完成了ContractService等核心Service类的改造
- 实体类修改:完成了核心实体类的修改,使其实现Voable接口
- 控制器类修改:完成了部分控制器类的修改
- WebSocket服务修改:部分完成了WebSocket服务组件的修改
7.3 其他交付物
- 服务类分析报告:分析了项目中所有使用@CacheConfig注解的Service类
- 转换机制设计文档:设计了Voable接口和转换机制
- 缓存策略设计文档:设计了基于Vo对象的缓存策略
8. 后续工作计划
- 完成剩余Service类的批量修改:按照计划完成CompanyCustomerFileTypeService等4个Service类的批量修改
- 分析并修改WebSocket服务组件:确保WebSocket服务能够正确处理新的泛型参数
- 开发Redis缓存清理工具/脚本:清理现有缓存,并验证缓存重建后的结果
- 编写全面的测试用例:验证功能正确性,包括单元测试和集成测试
- 更新系统架构文档、API文档等:确保文档的完整性和准确性
- 制定详细的上线和回滚计划:明确上线时间窗口和回滚策略
- 上线后监控:设置相应的指标和告警机制,及时发现和解决问题
9. 文档变更记录
| 版本 | 变更日期 | 变更内容 | 变更人 |
|---|---|---|---|
| 1.0 | 2024-03-15 | 创建文档,完成项目总结和技术实现方案总结 | 开发团队 |
| 1.1 | - | 更新完成情况和后续工作计划 | 开发团队 |
| 1.2 | - | 添加更多技术实现细节和经验总结 | 开发团队 |