092056-Game模块服务层DTO和Protobuf转换功能增强.md 7.1 KB

Game模块服务层DTO和Protobuf转换功能增强

时间: 2025年06月09日 20:56
任务类型: 功能增强
状态: 已完成

任务描述

为Game模块的ConsumeService、ConditionService和RewardService增加获取组的方法,返回DTO对象,并增加消耗组DTO转Protobuf对象Deduct、奖励组DTO转Protobuf对象Reward的转换功能。

需求分析

核心需求

  1. ConsumeService增加获取消耗组方法,返回DTO
  2. ConditionService增加获取条件组方法,返回DTO
  3. RewardService添加获取奖励组方法,返回DTO
  4. 增加消耗组DTO转Protobuf对象Deduct
  5. 增加奖励组DTO转Protobuf对象Reward

设计目标

  • 统一的DTO接口,便于数据传输和处理
  • 完整的Protobuf转换支持,满足前端通信需求
  • 保持服务层的简洁性和一致性
  • 支持灵活的数据获取选项

解决方案

1. 创建DTO类

1.1 消耗相关DTO

ConsumeGroupDto (app/Module/Game/Dtos/ConsumeGroupDto.php):

class ConsumeGroupDto
{
    public int $id;
    public string $name;
    public string $code;
    public ?string $description;
    public array $items = []; // ConsumeItemDto[]
    
    public static function fromModel($model, bool $withItems = false): self
}

ConsumeItemDto (app/Module/Game/Dtos/ConsumeItemDto.php):

class ConsumeItemDto
{
    public int $id;
    public int $groupId;
    public int $consumeType;
    public int $targetId;
    public int $param1;
    public int $param2;
    public int $quantity;
    public ?array $extraData;
    
    public static function fromModel($model): self
}

1.2 条件相关DTO

ConditionGroupDto (app/Module/Game/Dtos/ConditionGroupDto.php):

class ConditionGroupDto
{
    public int $id;
    public string $name;
    public string $code;
    public ?string $description;
    public int $logicType;
    public array $items = []; // ConditionItemDto[]
    
    public static function fromModel($model, bool $withItems = false): self
}

ConditionItemDto (app/Module/Game/Dtos/ConditionItemDto.php):

class ConditionItemDto
{
    public int $id;
    public int $groupId;
    public int $conditionType;
    public int $targetId;
    public int $operator;
    public int $value;
    public int $param1;
    public int $param2;
    public ?array $extraData;
    
    public static function fromModel($model): self
}

2. 增强服务层方法

2.1 ConsumeService增强

/**
 * 获取消耗组信息
 */
public static function getConsumeGroup($consumeGroupCode, bool $withItems = true): ?ConsumeGroupDto

/**
 * 获取消耗组并转换为Protobuf Deduct对象
 */
public static function getConsumeGroupAsDeduct($consumeGroupCode): ?\Uraus\Kku\Common\Deduct

2.2 ConditionService增强

/**
 * 获取条件组信息
 */
public static function getConditionGroup($conditionGroupCode, bool $withItems = true): ?ConditionGroupDto

2.3 RewardService增强

/**
 * 获取奖励组并转换为Protobuf Reward对象
 */
public static function getRewardGroupAsReward($groupIdOrCode): ?\Uraus\Kku\Common\Reward

3. 创建Protobuf转换器

3.1 ProtobufConverter类

文件: app/Module/Game/Services/ProtobufConverter.php

核心功能:

  • 消耗组DTO转Protobuf Deduct对象
  • 奖励组DTO转Protobuf Reward对象
  • 单个消耗项/奖励项的Protobuf转换
  • 支持复杂的类型映射和参数处理

主要方法:

// 消耗组转换
public static function convertConsumeGroupToDeduct(ConsumeGroupDto $consumeGroupDto): Deduct

// 奖励组转换
public static function convertRewardGroupToReward(RewardGroupDto $rewardGroupDto): Reward

// 单项转换
public static function convertConsumeItemToProtobuf(ConsumeItemDto $consumeItemDto)
public static function convertRewardItemToProtobuf(RewardItemDto $rewardItemDto)

3.2 支持的Protobuf类型映射

消耗类型映射:

  • CONSUME_TYPE::ITEMDeductItem
  • CONSUME_TYPE::CURRENCYDeductCoin
  • CONSUME_TYPE::FUND_CONFIGDeductCoin
  • CONSUME_TYPE::FUND_CONFIGSDeductCoin

奖励类型映射:

  • REWARD_TYPE::ITEMRewardItem
  • REWARD_TYPE::CURRENCYRewardCoin
  • REWARD_TYPE::FUND_CONFIGRewardCoin
  • REWARD_TYPE::FARM_SHRINERewardGod
  • REWARD_TYPE::PETRewardPets
  • REWARD_TYPE::PET_POWERRewardPetPowers
  • REWARD_TYPE::SKINRewardSkin

实现特性

1. 灵活的数据获取

  • 支持通过ID或编码获取组信息
  • 可选择是否包含子项(withItems参数)
  • 统一的错误处理和日志记录

2. 完整的类型支持

  • 支持所有现有的消耗类型和奖励类型
  • 正确处理参数映射(param1、param2等)
  • 支持随机数量范围(minQuantity、maxQuantity)

3. 高效的转换逻辑

  • 直接从DTO转换为Protobuf,避免重复查询
  • 合理的默认值处理
  • 类型安全的转换过程

4. 便捷的API接口

  • 一步到位的Protobuf转换方法
  • 保持向后兼容性
  • 清晰的方法命名和文档

使用示例

1. 获取消耗组DTO

// 获取包含消耗项的消耗组
$consumeGroup = ConsumeService::getConsumeGroup(1, true);
if ($consumeGroup) {
    echo "消耗组: {$consumeGroup->name}";
    echo "消耗项数量: " . count($consumeGroup->items);
}

2. 直接获取Protobuf对象

// 获取消耗组的Protobuf Deduct对象
$deduct = ConsumeService::getConsumeGroupAsDeduct('consume_group_code');

// 获取奖励组的Protobuf Reward对象
$reward = RewardService::getRewardGroupAsReward('reward_group_code');

3. 获取条件组

// 获取条件组DTO
$conditionGroup = ConditionService::getConditionGroup('condition_code', true);
if ($conditionGroup) {
    echo "逻辑类型: {$conditionGroup->logicType}";
    echo "条件项数量: " . count($conditionGroup->items);
}

技术优势

1. 架构清晰

  • DTO层负责数据传输
  • Service层提供业务接口
  • Converter层处理格式转换
  • 职责分离,易于维护

2. 类型安全

  • 强类型的DTO定义
  • 完整的类型检查
  • 避免运行时类型错误

3. 扩展性强

  • 新增类型时只需扩展Converter
  • DTO结构易于扩展
  • 保持接口稳定性

4. 性能优化

  • 减少重复的数据库查询
  • 高效的对象转换
  • 合理的内存使用

测试验证

1. 功能测试

  • 验证所有服务方法正常工作
  • 确认DTO数据完整性
  • 测试Protobuf转换正确性

2. 兼容性测试

  • 确保现有功能不受影响
  • 验证新旧接口兼容性
  • 测试错误处理机制

总结

本次功能增强成功为Game模块建立了完整的DTO和Protobuf转换体系:

  1. 创建了4个DTO类,提供统一的数据传输接口
  2. 增强了3个Service类,添加了获取组的方法
  3. 创建了ProtobufConverter,提供完整的Protobuf转换功能
  4. 支持所有类型映射,满足前端通信需求
  5. 保持了架构清晰,便于后续维护和扩展

这次增强为Game模块的服务层提供了更加完善和统一的接口,特别是在Handler层中可以方便地获取DTO并转换为Protobuf格式返回给前端,大大提升了开发效率和代码质量。