# 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和QueryService接口 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和QueryService接口 - 调整了Service类的泛型参数,确保IEntityService接口泛型类型为Model,QueryService接口泛型类型为Vo - 实现了QueryService接口的findById和findAll方法,包含Vo转换逻辑 - 添加了@Cacheable注解,确保findById方法返回的是Vo对象并正确缓存 ```java @Service @CacheConfig(cacheNames = "companyFileType") public class CompanyFileTypeService extends BaseService implements IEntityService, QueryService { // ...现有代码... @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 findAll(JsonNode jsonNode, Pageable pageable) { // 实现逻辑 Specification specification = createSpecification(jsonNode); Page 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 toVo(); } @Data @Entity @Table(name = "COMPANY_FILE_TYPE_LOCAL") public class CompanyFileType implements Serializable, Voable { // ...现有代码... @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和QueryService接口,修改了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和QueryService接口,分别处理实体操作和查询操作 - **数据转换**:实体类实现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 | - | 添加更多技术实现细节和经验总结 | 开发团队 |