Files
ray zhou f71a5c59af ok
2026-05-29 11:21:40 +08:00

21 lines
25 KiB
JSON

{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\nSearch the slot_console codebase for registration reward claiming logic. Look for:\n1. Registration reward / 注册奖励 related controllers, logic, services\n2. API endpoints for claiming registration rewards\n3. Response structure after claiming\n4. Any existing game_id or game selection logic\n\nSearch paths: /Users/ray/Documents/project/www/slot/slot_console\n\nReturn: file paths, key class/method names, code snippets for the claim flow, and any related DTO/response fields.\n</user_query>"}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"Searching the slot_console codebase for registration reward claiming logic.\n\n[REDACTED]"},{"type":"tool_use","name":"UpdateCurrentStep","input":{"current_step":"Searching registration reward logic"}},{"type":"tool_use","name":"Grep","input":{"pattern":"注册奖励|registration.?reward|RegistrationReward","path":"/Users/ray/Documents/project/www/slot/slot_console","-i":true}},{"type":"tool_use","name":"Grep","input":{"pattern":"register.*reward|reward.*register|claim.*register|register.*claim","path":"/Users/ray/Documents/project/www/slot/slot_console","-i":true}},{"type":"tool_use","name":"Glob","input":{"glob_pattern":"**/*Register*Reward*","target_directory":"/Users/ray/Documents/project/www/slot/slot_console"}},{"type":"tool_use","name":"Glob","input":{"glob_pattern":"**/*Registration*","target_directory":"/Users/ray/Documents/project/www/slot/slot_console"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"ACTIVITY_TYPE_REG|user_register_reward|mobile_register"}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"claim|领取|Claim","glob":"**/*{Activity,Register,Reward}*"}},{"type":"tool_use","name":"Glob","input":{"glob_pattern":"**/*Activity*","target_directory":"/Users/ray/Documents/project/www/slot/slot_console"}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"game_id","glob":"**/*{Register,Reward,Activity,Reg}*"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"getActivityReward|claimActivity|activity.*get|领取活动|ACTIVITY_TYPE_REG"}},{"type":"tool_use","name":"Glob","input":{"glob_pattern":"**/*Controller*.php","target_directory":"/Users/ray/Documents/project/www/slot/slot_console"}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"ActivityConfigEntity|UserRegisterEventService"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/api/controller/GiftController.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/entity/activity/ActivityConfigEntity.php","offset":160,"limit":100}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/entity/activity/ActivityConfigEntity.php","offset":620,"limit":150}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/service/user/UserRegisterEventService.php"}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"GiftController|gift/receive|gift/get"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"receive|getActivityList|GiftController","glob":"**/route*.php"}},{"type":"tool_use","name":"Glob","input":{"glob_pattern":"**/*route*","target_directory":"/Users/ray/Documents/project/www/slot/slot_console"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/service/GiftService.php"}},{"type":"tool_use","name":"Read","input":{"limit":120,"offset":260,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/entity/activity/ActivityConfigEntity.php"}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"sendRegisterGiftWagerTask|ACTIVITY_TYPE_REG"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/config/route.php"}},{"type":"tool_use","name":"Read","input":{"limit":80,"offset":375,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/entity/activity/ActivityConfigEntity.php"}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"sendRegisterGiftWagerTask"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/napi/controller/GiftController.php"}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_lib","pattern":"ACTIVITY_TYPE_REG|TRANSACTION_TYPE_REGISTER"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"getActivityList|GiftController|/gift/"}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"sendRegisterGiftWagerTask|ConsoleMqService"}},{"type":"tool_use","name":"Read","input":{"limit":120,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/entity/activity/ActivityConfigEntity.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/command/EventBus.php","offset":240,"limit":30}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_lib","pattern":"sendRegisterGiftWagerTask"}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_lib","pattern":"function gift\\("}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"game_id|game_select|selectGame"}},{"type":"tool_use","name":"Read","input":{"limit":50,"offset":200,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/api/controller/UserController.php"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"limit":50,"offset":85,"path":"/Users/ray/Documents/project/www/slot/slot_lib/src/common/mq/ConsoleMqService.php"}},{"type":"tool_use","name":"Read","input":{"limit":40,"offset":240,"path":"/Users/ray/Documents/project/www/slot/slot_lib/src/services/WalletService.php"}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/entity/activity/ActivityConfigEntity.php","pattern":"getActivityByInfo|checkStatus|setActivityFinishById"}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_gateway","pattern":"gift/receive|getActivityList"}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"user_register_reward|mobile_register"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"limit":80,"offset":580,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/entity/activity/ActivityConfigEntity.php"}},{"type":"tool_use","name":"Read","input":{"limit":40,"offset":855,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/entity/activity/ActivityConfigEntity.php"}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_lib","pattern":"function success","glob":"**/BaseController.php"}},{"type":"tool_use","name":"Read","input":{"limit":120,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/command/event/HomeEvent.php"}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_lib","pattern":"setActivityFinishById|isActivityFinishById"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"limit":40,"offset":50,"path":"/Users/ray/Documents/project/www/slot/slot_lib/src/basic/BaseController.php"}},{"type":"tool_use","name":"Read","input":{"limit":50,"offset":114,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/entity/activity/ActivityConfigEntity.php"}},{"type":"tool_use","name":"Read","input":{"limit":50,"offset":125,"path":"/Users/ray/Documents/project/www/slot/slot_lib/src/services/UserTagService.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/api/controller/LobbyController.php"}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"receive|getActivityList","glob":"**/*.{md,json,yml,yaml,php}"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot","pattern":"gift/receive|getActivityList|gift/getActivityList","glob":"**/*.{vue,ts,js,php}","head_limit":30}},{"type":"tool_use","name":"Read","input":{"limit":80,"offset":750,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/entity/activity/ActivityConfigEntity.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/innerapi/controller/ActivityController.php"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Glob","input":{"glob_pattern":"**/config/*.php","target_directory":"/Users/ray/Documents/project/www/slot/slot_console"}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_lib/src/services/WalletService.php","pattern":"function update\\("}},{"type":"tool_use","name":"Read","input":{"limit":80,"offset":130,"path":"/Users/ray/Documents/project/www/slot/slot_lib/src/services/WalletService.php"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_lib","pattern":"class Wallet"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/config/middleware.php"}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"ACTIVITY_TYPE_REG|type.*7"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_lib/src/entity/Wallet.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/entity/fb/CompleteRegistrationEntity.php"}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/docs","pattern":"注册奖励|register.*reward|gift/receive|getActivityList"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/api/validator/GiftValidator.php"}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_lib/src/common/mq/ConsoleMqService.php","pattern":"sendBaseWagerTask|SOURCE_TYPE_REGISTER"}},{"type":"tool_use","name":"Read","input":{"limit":40,"offset":60,"path":"/Users/ray/Documents/project/www/slot/slot_lib/src/common/mq/ConsoleMqService.php"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"limit":80,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/api/controller/UserController.php"}},{"type":"tool_use","name":"Read","input":{"limit":80,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/service/EmailService.php"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"limit":40,"offset":72,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/api/controller/UserController.php"}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_lib/src/common/const/Consts.php","pattern":"SOURCE_TYPE_REGISTER|ACTIVITY_TYPE_REG"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"UpdateCurrentStep","input":{"current_step":"Compiling search findings","final_summary":"Found **three registration-reward paths** in slot_console: (1) activity-based manual claim via `POST /api/gift/receive` (`ACTIVITY_TYPE_REG=7`), (2) auto credit on register via `UserRegisterEventService` (`game_base.user_register_reward`), and (3) mobile-bind reward via email or direct gift. **No `game_id` selection** exists in any of these flows. Claim response returns `{ gift_coin, gift_bonus }`.","completed_subtitle":"Mapped registration reward claim flows"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"## Overview\n\n`slot_console` has **three separate registration-reward mechanisms**, not one unified flow:\n\n| Path | Trigger | Claim style |\n|------|---------|-------------|\n| **Activity-based 注册赠送** (`ACTIVITY_TYPE_REG = 7`) | Admin-configured activity in `s_recharge_gift_config` | User manually claims via API |\n| **Config auto-reward** (`user_register_reward`) | User register event | Auto-credited on registration |\n| **Mobile bind reward** (`mobile_register_binding`) | Register with phone / bind mobile | Email claim or direct gift |\n\nThere is **no `game_id` or game-selection logic** in any registration-reward path.\n\n---\n\n## 1. Controllers / Services / Logic\n\n### Activity-based registration reward (primary “claim” flow)\n\n| File | Class / Method | Role |\n|------|----------------|------|\n| `/Users/ray/Documents/project/www/slot/slot_console/app/api/controller/GiftController.php` | `GiftController::receive()` | C端领取入口 |\n| `/Users/ray/Documents/project/www/slot/slot_console/app/api/controller/GiftController.php` | `GiftController::getActivityList()` | 活动列表(含注册奖励) |\n| `/Users/ray/Documents/project/www/slot/slot_console/app/service/GiftService.php` | `GiftService::getUserActivityList()` | 组装活动列表响应 |\n| `/Users/ray/Documents/project/www/slot/slot_console/app/entity/activity/ActivityConfigEntity.php` | `receive()`, `get**checkActivity()**`, `getGiftItemsByActivity()` | 核心业务:校验、发奖、打码任务、标记完成 |\n| `/Users/ray/Documents/project/www/slot/slot_lib/src/services/WalletService.php` | `WalletService::gift()` | 钱包入账 |\n| `/Users/ray/Documents/project/www/slot/slot_lib/src/common/mq/ConsoleMqService.php` | `sendRegisterGiftWagerTask()` | 注册赠送打码量任务 |\n| `/Users/ray/Documents/project/www/slot/slot_lib/src/services/UserTagService.php` | `setActivityFinishById()`, `isActivityFinishById()` | 用户活动完成状态 |\n\nAdmin CRUD (not C端 claim):\n\n| File | Class |\n|------|-------|\n| `/Users/ray/Documents/project/www/slot/slot_console/app/innerapi/controller/ActivityController.php` | `ActivityController` |\n\n### Auto registration reward on register event\n\n| File | Class / Method | Role |\n|------|----------------|------|\n| `/Users/ray/Documents/project/www/slot/slot_console/app/command/EventBus.php` | `registerEvent()` | 注册事件触发 |\n| `/Users/ray/Documents/project/www/slot/slot_console/app/service/user/UserRegisterEventService.php` | `deal()`, `reward()` | 读 `game_base.user_register_reward`,直接调 wallet API |\n\n### Mobile bind registration reward (related)\n\n| File | Class / Method | Role |\n|------|----------------|------|\n| `/Users/ray/Documents/project/www/slot/slot_console/app/service/user/UserRegisterEventService.php` | `deal()` | 注册时带手机号 → 发邮件奖励 |\n| `/Users/ray/Documents/project/www/slot/slot_console/app/api/controller/UserController.php` | binding mobile handler | 绑手机直接 gift |\n| `/Users/ray/Documents/project/www/slot/slot_console/app/service/EmailService.php` | `receiveReward()` | 邮件领取奖励 |\n\nConstants (`slot_lib`):\n\n```22:22:/Users/ray/Documents/project/www/slot/slot_lib/src/common/const/Consts.php\n const ACTIVITY_TYPE_REG = 7; //活动类型标识 注册赠送\n```\n\n```40:40:/Users/ray/Documents/project/www/slot/slot_lib/src/common/const/Consts.php\n const TRANSACTION_TYPE_REGISTER = 11; //注册赠送\n```\n\n---\n\n## 2. API Endpoints\n\nWebman convention routing: `{prefix}/{controller}/{action}` with middleware from `config/middleware.php` (`api` → auth).\n\n### Claim registration activity reward\n\n- **Endpoint:** `POST /api/gift/receive`\n- **Auth:** `AuthMiddleware` (api prefix)\n- **Params:** `id` (activity `gift_id`, required), `code` (optional, only for exchange-code activities)\n- **No validator** on `receive()` — `GiftValidator` has no scene for it\n\n```222:229:/Users/ray/Documents/project/www/slot/slot_console/app/api/controller/GiftController.php\n //领取活动奖励\n public function receive(Request $request)\n {\n $user = $request->userEntity;\n $id = input('id', -1);\n $code = input('code', '');\n $res = ActivityConfigEntity::getInstance()->setUid($user->uid)->setSource($user->source)->receive($id, $code);\n return $this->success($res);\n }\n```\n\n### List activities (including registration reward)\n\n- **Endpoint:** `POST /api/gift/getActivityList`\n- Returns array of activities; registration reward items have `type: 7`\n\n```37:42:/Users/ray/Documents/project/www/slot/slot_console/app/api/controller/GiftController.php\n //活动列表\n public function getActivityList(Request $request)\n {\n $giftService = new GiftService($request->userEntity);\n return $this->success($giftService->getUserActivityList());\n }\n```\n\n### Related (not activity claim, but registration rewards)\n\n| Endpoint | Purpose |\n|----------|---------|\n| Register event → `UserRegisterEventService::deal()` | Auto `user_register_reward` |\n| `POST /api/user/receiveEmail` | Claim mobile-register email reward |\n| UserController mobile binding | Direct `mobile_register_binding` gift |\n\n---\n\n## 3. Claim Flow (Activity-based `ACTIVITY_TYPE_REG`)\n\n```mermaid\nsequenceDiagram\n Client->>GiftController: POST /api/gift/receive {id}\n GiftController->>ActivityConfigEntity: receive(activityId, code)\n ActivityConfigEntity->>ActivityConfigEntity: getActivityByInfo(id)\n ActivityConfigEntity->>ActivityConfigEntity: check is_finish + checkStatus (Redis NX 30s)\n ActivityConfigEntity->>WalletService: gift(gift_coin, gift_bonus, TRANSACTION_TYPE_REGISTER)\n ActivityConfigEntity->>ConsoleMqService: sendRegisterGiftWagerTask(uid, source, amount)\n ActivityConfigEntity->>UserTagService: setActivityFinishById(activityId)\n ActivityConfigEntity-->>GiftController: {gift_coin, gift_bonus}\n GiftController-->>Client: {code, msg, data}\n```\n\nCore claim logic:\n\n```716:728:/Users/ray/Documents/project/www/slot/slot_console/app/entity/activity/ActivityConfigEntity.php\n case Consts::ACTIVITY_TYPE_REG: //注册奖励\n\n $date = $this->getActivityInfoById($activityId);\n if (!empty($date['is_finish']) || !$this->checkStatus($activityId)) {\n throw new Exception('Is Got');\n }\n\n $res = $walletService->gift($giftAmount, $giftBonus, Consts::TRANSACTION_TYPE_REGISTER, '领取注册赠送');\n if (!empty($res)) {\n ConsoleMqService::getInstance()->sendRegisterGiftWagerTask($this->uid, $source, $giftAmount);\n $userTagService->setActivityFinishById($activityId);\n }\n break;\n```\n\n**Eligibility checks:**\n- Activity must be active (`status=1`, within `show_start_time`/`show_end_time`, matching `source`/`model_id`)\n- User must not have `is_finish` on this activity (`UserTagService`)\n- Redis lock `type:{date}:{uid}:{activityId}` (30s NX) prevents duplicate claims\n- If already finished: throws `'Is Got'`\n\n**Side effects after success:**\n1. Wallet credit via `WalletService::gift()` → `TRANSACTION_TYPE_REGISTER` (11)\n2. Wager task MQ: `sendRegisterGiftWagerTask()` with `SOURCE_TYPE_REGISTER = 1`\n3. User tag: `activity_info[activityId].is_finish = 1`\n\n---\n\n## 4. Response Structures\n\n### Claim response (`POST /api/gift/receive`)\n\nWrapper from `BaseController::success()`:\n\n```json\n{\n \"code\": 0,\n \"msg\": \"\",\n \"data\": {\n \"gift_coin\": \"<formatted amount>\",\n \"gift_bonus\": \"<formatted amount>\"\n }\n}\n```\n\nBuilt at end of `receive()`:\n\n```750:750:/Users/ray/Documents/project/www/slot/slot_console/app/entity/activity/ActivityConfigEntity.php\n return ['gift_coin' => CommonFn::getNumberFormat($giftAmount), 'gift_bonus' => CommonFn::getNumberFormat($giftBonus)];\n```\n\nNote: wallet `gift()` returns a `Wallet` entity internally, but the API **does not expose wallet balance** — only the gifted amounts.\n\nErrors throw `Exception` (`'Not Found Activity'`, `'Is Got'`, `'Fail'`) — handled by global exception middleware.\n\n### Activity list item for registration reward (`type: 7`)\n\nFrom `GiftService::getUserActivityList()` + `ActivityConfigEntity::getGiftItemsByActivity()`:\n\n```json\n{\n \"gift_id\": 123,\n \"type\": 7,\n \"red_dot_type\": 1,\n \"title\": \"...\",\n \"subtitle\": \"...\",\n \"content\": \"...\",\n \"is_alone\": false,\n \"gift_coin\": \"<formatted>\",\n \"gift_bonus\": \"<formatted>\",\n \"instruction\": \"<recharge config instruction>\",\n \"path>\",\n \"data\": [\n {\n \"goods_id\": -1,\n \"money\": 0,\n \"coin\": 0,\n \"gift_coin\": \"<formatted>\",\n \"gift_bonus\": \"<formatted>\",\n \"status\": 1,\n \"total\": \"...\",\n \"total_p\": 0,\n \"coin_p\": 0,\n \"bonus_p\": 0\n }\n ]\n}\n```\n\nRegistration/download/exchange-code activities use synthetic `goods_id: -1` (no real goods).\n\n### Auto register reward (`UserRegisterEventService`)\n\nNo API response — fires on register event. Calls wallet directly:\n\n```138:147:/Users/ray/Documents/project/www/slot/slot_console/app/service/user/UserRegisterEventService.php\n $data = [\n 'uid' => $this->userInfoEntity->id,\n 'currency' => $this->userInfoEntity->currency,\n 'fee' => $reward,\n 'biz_id' => uniqid('r'),\n 'type' => 'register',\n 'source' => $this->userInfoEntity->source,\n 'organization' => $this->userInfoEntity->organization,\n 'trace_id' => LoggerService::getTraceId()\n ];\n```\n\nConfig key: `game_base.user_register_reward` (per `game_model_id`).\n\n### Mobile bind reward responses\n\n- Email claim: `POST /api/user/receiveEmail` → `{ type: 1, coin: \"<amount>\" }`\n- Direct bind: `{ fee: <mobile_register_binding int> }` or `{ fee: 0 }`\n\n---\n\n## 5. `game_id` / Game Selection\n\n**No game selection exists** in registration reward flows.\n\n- `ActivityConfigEntity::receive()` — no `game_id` param or field\n- `GiftController::receive()` — only `id` + `code`\n- `UserRegisterEventService::reward()` — commented transaction log had `'game_id' => 0` hardcoded\n- Activity goods for REG type use `goods_id: -1`, not a game reference\n\nGame-related code elsewhere (`GameController`, `GameService`, `PlayHistoryService`) is unrelated to registration rewards.\n\n---\n\n## Key File Index\n\n| Path | Purpose |\n|------|---------|\n| `app/api/controller/GiftController.php` | Claim + list APIs |\n| `app/entity/activity/ActivityConfigEntity.php` | Core claim logic, activity assembly |\n| `app/service/GiftService.php` | Activity list service |\n| `app/service/user/UserRegisterEventService.php` | Auto register reward |\n| `app/command/EventBus.php` | Register event hook |\n| `app/innerapi/controller/ActivityController.php` | Admin activity CRUD |\n| `app/model/common/RechargeGiftConfigModel.php` | DB model; type 7 = 注册 |\n| `slot_lib/src/common/const/Consts.php` | `ACTIVITY_TYPE_REG`, `TRANSACTION_TYPE_REGISTER` |\n| `slot_lib/src/common/mq/ConsoleMqService.php` | Register wager task MQ |\n| `slot_lib/src/services/UserTagService.php` | Activity finish state |\n| `slot_lib/src/services/WalletService.php` | Wallet credit |\n\n---\n\n## Summary for Implementation\n\nIf you're adding game selection to registration reward claiming, the natural hook point is **`ActivityConfigEntity::receive()`** case `ACTIVITY_TYPE_REG` and/or **`GiftController::receive()`** to accept a new param — currently neither exists. The list endpoint (`getActivityList`) also has no game fields for type-7 activities.\n\n[REDACTED]"}]}}