041811-奖励处理逻辑拆分为独立类.md 4.4 KB

奖励处理逻辑拆分为独立类

时间: 2025年06月04日 18:11
任务类型: 代码重构
状态: 已完成

任务描述

将RewardLogic类中的processRewardItem方法及其相关的处理方法拆分为独立的静态类,遵循简单的静态类设计,不使用复杂的设计模式。

实现内容

1. 创建奖励处理器分发器

  • 文件: app/Module/Game/Logics/RewardProcessors/RewardProcessorDispatcher.php
  • 功能: 根据奖励类型分发到对应的处理器进行处理

2. 创建9个独立的奖励处理器类

2.1 ItemRewardProcessor

  • 文件: app/Module/Game/Logics/RewardProcessors/ItemRewardProcessor.php
  • 功能: 处理物品奖励(REWARD_TYPE::ITEM)

2.2 FundConfigRewardProcessor

  • 文件: app/Module/Game/Logics/RewardProcessors/FundConfigRewardProcessor.php
  • 功能: 处理账户种类奖励(REWARD_TYPE::FUND_CONFIG)

2.3 CurrencyRewardProcessor

  • 文件: app/Module/Game/Logics/RewardProcessors/CurrencyRewardProcessor.php
  • 功能: 处理币种奖励(REWARD_TYPE::CURRENCY)

2.4 PetExpRewardProcessor

  • 文件: app/Module/Game/Logics/RewardProcessors/PetExpRewardProcessor.php
  • 功能: 处理宠物经验奖励(REWARD_TYPE::PET_EXP)

2.5 PetEnergyRewardProcessor

  • 文件: app/Module/Game/Logics/RewardProcessors/PetEnergyRewardProcessor.php
  • 功能: 处理宠物体力奖励(REWARD_TYPE::PET_ENERGY)

2.6 PetRewardProcessor

  • 文件: app/Module/Game/Logics/RewardProcessors/PetRewardProcessor.php
  • 功能: 处理宠物奖励(REWARD_TYPE::PET)

2.7 PetPowerRewardProcessor

  • 文件: app/Module/Game/Logics/RewardProcessors/PetPowerRewardProcessor.php
  • 功能: 处理宠物体力奖励(REWARD_TYPE::PET_POWER)

2.8 FarmShrineRewardProcessor

  • 文件: app/Module/Game/Logics/RewardProcessors/FarmShrineRewardProcessor.php
  • 功能: 处理神像奖励(REWARD_TYPE::FARM_SHRINE)

2.9 OtherRewardProcessor

  • 文件: app/Module/Game/Logics/RewardProcessors/OtherRewardProcessor.php
  • 功能: 处理其他奖励(REWARD_TYPE::OTHER)

3. 修改RewardLogic类

  • 引入RewardProcessorDispatcher
  • 将processRewardItem方法调用替换为RewardProcessorDispatcher::process()
  • 移除所有原有的处理方法(processItemReward、processFundConfigReward等)
  • 清理不再使用的import语句

4. 添加说明文档

  • 文件: app/Module/Game/Logics/RewardProcessors/README.md
  • 内容: 说明该目录为自动生成内容,不可手动修改

设计特点

  1. 简单静态类: 每个处理器都是简单的静态类,包含一个process静态方法
  2. 单一职责: 每个处理器只负责处理一种类型的奖励
  3. 统一接口: 所有处理器都有相同的方法签名
  4. 易于扩展: 新增奖励类型时只需添加新的处理器类
  5. 代码复用: 原有的处理逻辑完全保留,只是重新组织

方法签名

public static function process(int $userId, RewardItemDto $item, string $sourceType, int $sourceId): void

使用方式

// 原来的调用方式
$this->processRewardItem($userId, $item, $sourceType, $sourceId);

// 新的调用方式
RewardProcessorDispatcher::process($userId, $item, $sourceType, $sourceId);

技术细节

  • 保持了原有的错误处理和日志记录逻辑
  • 保持了原有的业务逻辑不变
  • 移除了不再使用的import和方法
  • 遵循PSR-4命名标准

提交信息

重构奖励处理逻辑:将RewardLogic中的处理方法拆分为独立的静态处理器类

- 创建RewardProcessorDispatcher分发器,根据奖励类型分发到对应处理器
- 拆分出9个独立的奖励处理器类
- 每个处理器都是简单的静态类,遵循单一职责原则
- 修改RewardLogic类使用新的分发器,移除原有的处理方法
- 添加README.md说明处理器目录为自动生成内容

后续修复

修复奖励组10次奖励查看页面错误

问题: 页面访问时出现"Array to string conversion"错误

解决方案:

  1. 修改RandomRewardResultLazyRenderable类继承UCore\DcatAdmin\Support\LazyRenderable
  2. 将grid()方法改为render()方法,直接返回HTML字符串
  3. 修复REWARD_TYPE枚举使用valueInt()方法而不是value属性
  4. 移除Grid相关代码,使用简单的HTML表格展示
  5. 添加异常处理确保数据格式正确

结果: 页面现在可以正常显示10次奖励模拟结果和统计信息