Files
cursor/plans/注册活动列表_game_id_2136b4fb.plan.md
ray zhou f71a5c59af ok
2026-05-29 11:21:40 +08:00

5.3 KiB
Raw Blame History

name, overview, todos, isProject
name overview todos isProject
注册活动列表 game_id 在 C 端活动列表type=7 注册活动)透出 `game_id` 供前端展示/进游戏;同时从领取接口 `POST /api/gift/receive` 移除 `game_id` 字段,复用现有 `RegisterRewardLogic` 与 `ext_config.game_ids` 配置。
id content status
list-game-id ActivityConfigEntity::getGiftItemsByActivity type=7 分支调用 RegisterRewardLogic 写入 game_id completed
id content status
remove-receive-game-id ActivityConfigEntity::receive 移除注册活动 game_id 逻辑 completed
id content status
logic-stable-pick RegisterRewardLogic 增加 pickGameIdForUser稳定随机并更新注释 completed
id content status
phpdoc-tests GiftController PHPDoc 调整 + RegisterRewardLogicTest 补充用例 completed
false

注册活动列表透出 game_id领取不再返回

需求变更(相对初版)

接口 原行为 目标行为
POST /api/gift/getActivityList 注册活动无 game_id type=7 项增加可选 game_id
POST /api/gift/receivetype=7 成功时随机返回 game_id gift_coingift_bonus

后台 ext_config.game_ids 配置与 RegisterRewardLogic 过滤已上架游戏逻辑保持不变,仅调整调用位置。

数据流

sequenceDiagram
    Client->>GiftController: getActivityList
    GiftController->>GiftService: getUserActivityList
    GiftService->>ActivityConfigEntity: getGiftItemsByActivity type=7
    ActivityConfigEntity->>RegisterRewardLogic: pickGameId from ext_config.game_ids
    ActivityConfigEntity-->>Client: activity item with optional game_id

    Client->>GiftController: receive id=activityId
    GiftController->>ActivityConfigEntity: receive ACTIVITY_TYPE_REG
    ActivityConfigEntity-->>Client: gift_coin, gift_bonus only

实现(仅 slot_console

1. 活动列表组装:增加 game_id

文件:slot_console/app/entity/activity/ActivityConfigEntity.php

getGiftItemsByActivity()switch ($activityType) 中新增 ACTIVITY_TYPE_REG 分支(与首充/兑换码同级,约在 340 行附近):

  • 用已有 normalizeExtConfig($activity['ext_config']) 读取 game_ids
  • 调用 RegisterRewardLogic 得到 game_id
  • 仅当非 null 时写入 $activityInfo['game_id'](与领取侧旧约定一致:省略字段而非 0

$activity 来自 getActiveList() 的 DB 模型,已含 ext_configActivityConfigEntityGiftService::getUserActivityList() 中已通过 setUid / setSource 设置 _modelId

列表随机策略(建议默认):同一用户、同一活动多次拉列表应看到同一款游戏,避免卡片闪烁。在 RegisterRewardLogic 增加例如 pickGameIdForUser(?array $extConfig, int $gameModelId, int $uid, int $activityId): ?int

  • 复用 parseGameIds + GameApiModel::publishedGameIds
  • published 排序后,用 crc32("{$uid}:{$activityId}") % count 取下标(非 array_rand

列表与领取不再需要对齐,但稳定随机对仅列表展示更友好。若产品希望每次刷新换游戏,可继续用现有 pickRandomGameId

2. 领取分支:移除 game_id

同一文件 receive()

  • 删除 ACTIVITY_TYPE_REG 内读取 ext_configRegisterRewardLogic::pickRandomGameId$registerRewardGameId 变量
  • 删除返回数组末尾对 game_id 的合并(约 763765 行)

注册发奖、sendRegisterGiftWagerTasksetActivityFinishById 不动

3. Controller PHPDoc

GiftController.php

  • receive():去掉 game_id 说明,仅 gift_coin / gift_bonus
  • 可选:为 getActivityList() 补充一行说明——type=7 且配置了有效 game_ids 时,对应项含 game_idint

4. Logic 注释与单测

RegisterRewardLogic.php:类注释改为「活动列表推荐进游戏」;保留 pickRandomGameId 或改为对外暴露 pickGameIdForUser(二选一,避免死代码)。

RegisterRewardLogicTest.php:为 pickGameIdForUser 增加确定性用例(相同 uid+activityId 同结果;无候选返回 null

响应示例

活动列表type=7 片段):

{
  "gift_id": 123,
  "type": 7,
  "title": "注册奖励",
  "gift_coin": "10.00",
  "gift_bonus": "0.00",
  "game_id": 205,
  "data": [{ "goods_id": -1, "gift_coin": "10.00", ... }]
}

无有效 game_ids / 无上架游戏:与现网其它活动项一致,game_id 字段

领取

{
  "gift_coin": "10.00",
  "gift_bonus": "0.00"
}

验证

  1. 后台 type=7 活动配置 ext_config.game_ids(已有 admin 能力)。
  2. getActivityList:未领取用户可见注册活动且含 game_id(在候选有效时)。
  3. receive:成功响应不含 game_id
  4. game_ids 为空或均未上架:列表无 game_id,领取正常。
  5. Docker 内跑单测:RegisterRewardLogicTest.php

不涉及

  • slot_admin / admin_vue配置已具备
  • 前端仓库(由 C 端自行改列表消费、去掉领取后对 game_id 的依赖)