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

14 KiB
Raw Blame History

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接口泛型类型为ModelQueryService接口泛型类型为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 主要修改模块

  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接口泛型类型为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 - 添加更多技术实现细节和经验总结 开发团队