06日1102-消耗组进行功能扩展.md 5.5 KB

消耗组进行功能扩展

任务时间: 2025年06月06日 11:02:00
完成时间: 2025年06月06日 11:45:00
任务类型: 功能扩展

任务概述

扩展消耗组系统功能,实现 FUND_CONFIGS 多账户种类消耗类型,支持按配置顺序依次从多个账户种类扣除资金。

任务背景

用户选中了 FUND_CONFIGS 类型的代码,该类型已在枚举中定义但未完全实现。需要完善相关功能,使其能够支持多账户种类的依次消耗逻辑。

实现内容

1. 完善 CONSUME_TYPE 枚举

文件: app/Module/Game/Enums/CONSUME_TYPE.php

  • getAll() 方法中添加 FUND_CONFIGS 类型显示
  • 确保枚举类型的完整性

2. 扩展 ConsumeService 服务

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

新增方法:

  • checkFundConfigsConsume(): 检查多账户种类消耗条件
  • executeFundConfigsConsume(): 执行多账户种类消耗
  • getFundConfigIds(): 获取消耗项的账户种类ID列表

功能特点:

  • 支持从 target_idextra_data.fund_config_ids 获取账户列表
  • 按配置顺序依次消耗,优先从主账户扣除
  • 支持倍数参数,用于执行几倍消耗
  • 完整的事务处理,确保数据一致性
  • 详细的错误处理和日志记录

修复问题:

  • 修复 executeConsume() 方法的事务处理问题
  • 移除未使用的导入 UCore\Db\Helper
  • 完善错误处理逻辑

3. 更新模型支持

文件: app/Module/Game/Models/GameConsumeItem.php

  • 扩展 getTargetName() 方法支持 FUND_CONFIGS 类型
  • 更新 toDeductObject() 方法支持多账户种类的 protobuf 对象转换
  • 支持从 extra_data 中解析多个账户种类ID

文件: app/Module/Game/Models/GameConsumeGroup.php

  • 更新 getTargetName() 方法支持 FUND_CONFIGS 类型显示
  • 直接使用 GameConsumeItem 模型的方法避免重复代码

4. 更新测试命令

文件: app/Module/Game/Commands/TestConsumeCommand.php

  • 修复对 Res 对象和数组结果的处理
  • 支持更好的结果显示和错误处理

5. 完善文档

文件: app/Module/Game/Docs/消耗组系统.md

新增内容:

  • FUND_CONFIGS 类型的详细说明
  • 多账户种类消耗的工作原理
  • 配置示例和注意事项
  • 更新数据库结构说明

技术实现细节

多账户消耗逻辑

  1. 账户ID获取:

    • 主账户: target_id 字段
    • 额外账户: extra_data.fund_config_ids 数组
  2. 消耗顺序:

    • 优先从主账户(target_id)扣除
    • 主账户不足时,依次从额外账户扣除
    • 按配置顺序进行,确保可预测性
  3. 余额检查:

    • 计算所有账户的总余额
    • 确保总余额满足消耗需求
    • 支持倍数参数的余额计算
  4. 事务处理:

    • 使用数据库事务确保原子性
    • 任何步骤失败都会回滚所有操作
    • 完整的错误处理和日志记录

配置示例

{
  "target_id": 1,
  "quantity": 1000,
  "extra_data": {
    "fund_config_ids": [2, 3, 4]
  }
}

此配置表示:消耗1000单位资金,优先从账户种类1扣除,不足时依次从账户种类2、3、4扣除。

测试验证

测试用例1: 单账户消耗

  • 创建消耗组 test_fund_configs
  • 消耗100金币,主账户余额充足
  • 验证: 成功扣除100金币

测试用例2: 多账户依次消耗

  • 创建消耗组 test_fund_configs_insufficient
  • 消耗10000000金币,需要从多个账户扣除
  • 验证:
    • 金币账户从9999912减少到0(扣除9999912)
    • 钻石账户从93906减少到93818(扣除88)
    • 总计扣除10000000,符合预期

测试命令

# 检查消耗条件
php artisan game:test-consume 10001 test_fund_configs --check

# 执行消耗
php artisan game:test-consume 10001 test_fund_configs

文件变更清单

  1. app/Module/Game/Enums/CONSUME_TYPE.php - 添加FUND_CONFIGS类型显示
  2. app/Module/Game/Services/ConsumeService.php - 实现多账户消耗逻辑
  3. app/Module/Game/Models/GameConsumeItem.php - 支持FUND_CONFIGS类型
  4. app/Module/Game/Models/GameConsumeGroup.php - 支持FUND_CONFIGS显示
  5. app/Module/Game/Commands/TestConsumeCommand.php - 修复结果处理
  6. app/Module/Game/Docs/消耗组系统.md - 更新文档说明

提交信息

扩展消耗组功能:实现FUND_CONFIGS多账户种类消耗

- 在CONSUME_TYPE枚举中添加FUND_CONFIGS类型到getAll()方法
- 在ConsumeService中实现checkFundConfigsConsume()和executeFundConfigsConsume()方法
- 支持按配置顺序依次从多个账户种类扣除资金
- 更新GameConsumeItem模型支持FUND_CONFIGS类型的目标名称显示
- 更新GameConsumeGroup模型支持FUND_CONFIGS类型的格式化显示
- 完善toDeductObject()方法支持多账户种类的protobuf对象转换
- 修复executeConsume()方法的事务处理问题
- 更新消耗组系统文档,添加FUND_CONFIGS类型详细说明
- 更新TestConsumeCommand支持Res对象和数组结果的处理
- 通过测试验证功能正常:单账户消耗和多账户依次消耗均工作正常

任务状态

已完成 - 功能已实现并通过测试验证,代码已提交并推送到远程仓库。

后续建议

  1. 后台管理界面优化: 可以考虑在后台管理中添加多账户种类选择的UI组件
  2. 性能优化: 对于大量账户的情况,可以考虑批量查询优化
  3. 监控和日志: 可以添加更详细的消耗日志,便于问题排查
  4. 文档完善: 可以添加更多使用场景的示例