Files
ray zhou 2dd9f17da9 ok
2026-06-29 14:51:55 +08:00

15 lines
24 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"role":"user","message":{"content":[{"type":"text","text":"<user_query>\nExplore /Users/ray/Documents/project/www/slot/slot_console for:\n1. API controller pattern (extends BaseController, inject Logic+Validator) - find 1-2 good examples like FreeCredits or similar activity\n2. Route registration for api/* endpoints\n3. app/model/common/ structure and s_common connection\n4. app/entity/ examples with BaseEntity\n5. How WalletService/slot_lib and UserClient are used in logic\n6. ShareConfigService or source resolution for uid\n\nReturn: file paths, key patterns, route file location, and any existing cycle/player patterns if any.\n</user_query>"}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"Exploring `slot_console` for controller, routing, model, entity, and service patterns.\n\n[REDACTED]"},{"type":"tool_use","name":"UpdateCurrentStep","input":{"current_step":"Exploring slot_console patterns","final_summary":"placeholder"}},{"type":"tool_use","name":"Glob","input":{"glob_pattern":"**/*Controller.php","target_directory":"/Users/ray/Documents/project/www/slot/slot_console"}},{"type":"tool_use","name":"Glob","input":{"glob_pattern":"**/route*.php","target_directory":"/Users/ray/Documents/project/www/slot/slot_console"}},{"type":"tool_use","name":"Glob","input":{"glob_pattern":"**/app/model/common/**","target_directory":"/Users/ray/Documents/project/www/slot/slot_console"}},{"type":"tool_use","name":"Glob","input":{"glob_pattern":"**/app/entity/**","target_directory":"/Users/ray/Documents/project/www/slot/slot_console"}},{"type":"tool_use","name":"Grep","input":{"pattern":"FreeCredits","path":"/Users/ray/Documents/project/www/slot/slot_console","output_mode":"files_with_matches"}},{"type":"tool_use","name":"Grep","input":{"pattern":"ShareConfigService|UserClient|WalletService","path":"/Users/ray/Documents/project/www/slot/slot_console","glob":"**/*.php","output_mode":"files_with_matches","head_limit":30}},{"type":"tool_use","name":"Grep","input":{"pattern":"cycle|player","path":"/Users/ray/Documents/project/www/slot/slot_console","glob":"**/*.php","-i":true,"output_mode":"files_with_matches","head_limit":25}}]}}
{"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/FreeCreditsController.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/api/controller/WeeklyRebateController.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/config/route.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/api/controller/BaseController.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/model/common/FreeCreditsPlayerModel.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/entity/BaseEntity.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/entity/activity/ActivityConfigEntity.php"}},{"type":"tool_use","name":"Grep","input":{"pattern":"s_common|connection.*common","glob":"**/*.php","path":"/Users/ray/Documents/project/www/slot/slot_console","head_limit":40}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Grep","input":{"glob":"**/*","head_limit":40,"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"free-credits|FreeCredits|Route::"}},{"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":{"glob":"**/*.php","head_limit":30,"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"ShareConfigService"}},{"type":"tool_use","name":"Grep","input":{"glob":"**/*.php","head_limit":30,"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"UserClient"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/api/logic/FreeCreditsLogic.php","limit":120}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/api/logic/WeeklyRebateLogic.php","limit":100}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/entity/wallet/WalletAddCurrencyEntity.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/config/thinkorm.php"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/api/logic/FreeCreditsLogic.php","pattern":"WalletService|UserService|ShareConfig|resolveSource|UserTagService"}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/api/logic/WeeklyRebateLogic.php","pattern":"WalletService|resolveSource|UserService"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/config/middleware.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/config/app.php"}},{"type":"tool_use","name":"Glob","input":{"glob_pattern":"**/ShareConfigService.php","target_directory":"/Users/ray/Documents/project/www/slot/slot_console"}},{"type":"tool_use","name":"Grep","input":{"glob":"**/*.php","head_limit":30,"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"cycle"}},{"type":"tool_use","name":"Grep","input":{"glob":"**/*Player*","head_limit":25,"output_mode":"files_with_matches","path":"/Users/ray/Documents/project/www/slot/slot_console"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/service/ShareConfigService.php","limit":80}},{"type":"tool_use","name":"Read","input":{"offset":1160,"limit":140,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/api/logic/FreeCreditsLogic.php"}},{"type":"tool_use","name":"Read","input":{"offset":218,"limit":110,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/api/logic/WeeklyRebateLogic.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/service/user/UserService.php","limit":80}},{"type":"tool_use","name":"Glob","input":{"glob_pattern":"**/BaseController.php","target_directory":"/Users/ray/Documents/project/www/slot"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/model/common/RechargeGiftPlayerModel.php","limit":60}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/api/controller/DailyRebateController.php"}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"free-credits|weekly-rebate|daily-rebate"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_lib/src/basic/BaseController.php"}},{"type":"tool_use","name":"Read","input":{"offset":78,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/service/ShareConfigService.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/entity/UserInfoEntity.php"}},{"type":"tool_use","name":"Read","input":{"limit":50,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/model/common/WeeklyRebateRecordModel.php"}},{"type":"tool_use","name":"Read","input":{"limit":50,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/api/validator/FreeCreditsValidator.php"}},{"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":50,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/model/common/RechargeGiftConfigModel.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/middleware/AuthMiddleware.php"}},{"type":"tool_use","name":"Read","input":{"offset":48,"limit":30,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/model/common/RechargeGiftConfigModel.php"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/entity/activity/ActivityGiftPlayerEntity.php"}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/app/api/logic/FreeCreditsLogic.php","pattern":"walletService|->gift\\(|keepFirstCash|claim\\(","head_limit":25}},{"type":"tool_use","name":"Read","input":{"limit":80,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/command/event/HomeEvent.php"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"Route::|default_route|disableDefaultRoute"}},{"type":"tool_use","name":"Read","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console/config/bootstrap.php"}},{"type":"tool_use","name":"Read","input":{"limit":40,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/model/common/ActivityGiftPlayerModel.php"}},{"type":"tool_use","name":"Read","input":{"limit":40,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/model/UserSignInModel.php"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Read","input":{"limit":50,"offset":120,"path":"/Users/ray/Documents/project/www/slot/slot_console/support/bootstrap.php"}},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"disableDefaultRoute|Route::disable"}},{"type":"tool_use","name":"Read","input":{"limit":50,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/entity/command/UserProfitEntity.php"}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"Grep","input":{"path":"/Users/ray/Documents/project/www/slot/slot_console","pattern":"slotLib\\\\\\\\common\\\\\\\\ShareConfigService|use slotLib\\\\common\\\\ShareConfigService"}},{"type":"tool_use","name":"Read","input":{"limit":30,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/model/common/DailyRebateRecordModel.php"}},{"type":"tool_use","name":"Read","input":{"limit":50,"path":"/Users/ray/Documents/project/www/slot/slot_console/app/api/logic/FreeCreditsLogic.php","offset":180}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"[REDACTED]"},{"type":"tool_use","name":"UpdateCurrentStep","input":{"current_step":"Exploring slot_console patterns","completed_subtitle":"Mapped controllers, routes, models","final_summary":"`slot_console` activity APIs follow `\\slotLib\\basic\\BaseController` + Logic/Validator injection; routes are Webman convention (`/api/{kebab-controller}/{action}`) with auth middleware on the `api` group. Common models live in `s_common` via the `mysql` connection; newer Logic uses `UserTagService`/`LibUserService` for source and `slotLib\\services\\WalletService` for wallet ops, while `UserClient` appears mainly in controllers/events."}}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"Here is a structured map of `slot_console` for the patterns you asked about.\n\n---\n\n## 1. API Controller Pattern (`BaseController` + Logic + Validator)\n\n**Canonical examples (newer activity APIs):**\n\n| File | Role |\n|------|------|\n| `/Users/ray/Documents/project/www/slot/slot_console/app/api/controller/FreeCreditsController.php` | Free Credits activity |\n| `/Users/ray/Documents/project/www/slot/slot_console/app/api/controller/WeeklyRebateController.php` | Weekly rebate |\n| `/Users/ray/Documents/project/www/slot/slot_console/app/api/controller/DailyRebateController.php` | Daily rebate (same shape as weekly) |\n\n**Base class:** `\\slotLib\\basic\\BaseController` at `/Users/ray/Documents/project/www/slot/slot_lib/src/basic/BaseController.php`\n\n**Key pattern:**\n\n```php\nclass WeeklyRebateController extends \\slotLib\\basic\\BaseController\n{\n public function __construct()\n {\n $this->validate = new WeeklyRebateValidator();\n $this->logic = new WeeklyRebateLogic();\n }\n\n public function claim(Request $request): Response\n {\n $post = $request->post();\n $error = $this->validate(WeeklyRebateValidator::SCENE_CLAIM, $post);\n if ($error !== true) {\n return $this->errorCode(ErrorCode::PARAMS_ERROR, $error);\n }\n return $this->success($this->logic->claim(\n $request->userEntity->uid,\n $request->userEntity->source ?? '',\n $post['week_start'] ?? null\n ));\n }\n}\n```\n\n**Supporting files for Free Credits:**\n\n- Logic: `/Users/ray/Documents/project/www/slot/slot_console/app/api/logic/FreeCreditsLogic.php`\n- Validator: `/Users/ray/Documents/project/www/slot/slot_console/app/api/validator/FreeCreditsValidator.php`\n\n**Notes:**\n\n- New activity controllers extend **`slotLib\\basic\\BaseController`**, not the local legacy `/Users/ray/Documents/project/www/slot/slot_console/app/api/controller/BaseController.php` (still used by older controllers like `UserController`).\n- `slotLib` base provides `$this->validate`, `$this->logic`, `validate($scene, $data)`, `success()`, `errorCode()`.\n- Auth context: `$request->userEntity->uid`, `->source`, `->currency`, `->organization` (set in middleware).\n- Free Credits is slightly special: `withdrawFirstCash()` delegates to `WithdrawService` instead of Logic.\n\n---\n\n## 2. Route Registration for `api/*`\n\n**Route file:** `/Users/ray/Documents/project/www/slot/slot_console/config/route.php` \nOnly one explicit route today:\n\n```php\nRoute::get('/metrics', [MetricsController::class, 'index']);\n```\n\n**Everything else uses Webman default convention routing** (no per-endpoint route definitions). URLs map as:\n\n```\n/api/{kebab-case-controller}/{action}\n```\n\nExamples (from controller PHPDoc / naming):\n\n| Controller | Example URLs |\n|------------|--------------|\n| `FreeCreditsController` | `GET /api/free-credits/status`, `POST /api/free-credits/claim`, `POST /api/free-credits/keep-first-cash`, `POST /api/free-credits/withdraw-first-cash` |\n| `WeeklyRebateController` | `GET /api/weekly-rebate/info`, `POST /api/weekly-rebate/claim` |\n| `DailyRebateController` | `GET /api/daily-rebate/info`, `POST /api/daily-rebate/claim` |\n\n**Middleware:** `/Users/ray/Documents/project/www/slot/slot_console/config/middleware.php`\n\n```php\n'api' => [\\app\\middleware\\AuthMiddleware::class],\n```\n\n**Auth middleware:** `/Users/ray/Documents/project/www/slot/slot_console/app/middleware/AuthMiddleware.php` \nParses JWT → builds `UserEntity` with `uid`, `source`, `organization`, `currency`.\n\n---\n\n## 3. `app/model/common/` + `s_common` Connection\n\n**ORM config:** `/Users/ray/Documents/project/www/slot/slot_console/config/thinkorm.php`\n\n- Connection name: `mysql`\n- Database: **`s_common`**\n- Default connection: `mysql`\n\n**Model pattern:**\n\n```php\nprotected $connection = 'mysql';\nprotected $table = 's_common.free_credits_player'; // explicit schema prefix\n// OR\nprotected $table = 'weekly_rebate_record'; // bare name, still in s_common DB\n```\n\n**Representative files:**\n\n| File | Table | Purpose |\n|------|-------|---------|\n| `/Users/ray/Documents/project/www/slot/slot_console/app/model/common/FreeCreditsPlayerModel.php` | `s_common.free_credits_player` | Player main state |\n| `/Users/ray/Documents/project/www/slot/slot_console/app/model/common/FreeCreditsPackageModel.php` | `s_common.free_credits_package` | Tier packages |\n| `/Users/ray/Documents/project/www/slot/slot_console/app/model/common/RechargeGiftConfigModel.php` | `s_recharge_gift_config` | Activity config (types 1113 = free credits / daily / weekly rebate) |\n| `/Users/ray/Documents/project/www/slot/slot_console/app/model/common/WeeklyRebateRecordModel.php` | `weekly_rebate_record` | Per-week rebate record |\n| `/Users/ray/Documents/project/www/slot/slot_console/app/model/common/DailyRebateRecordModel.php` | `daily_rebate_record` | Per-day rebate record |\n| `/Users/ray/Documents/project/www/slot/slot_console/app/model/common/RechargeGiftPlayerModel.php` | `recharge_gift_player` | Generic activity player |\n| `/Users/ray/Documents/project/www/slot/slot_console/app/model/common/ActivityGiftPlayerModel.php` | `recharge_gift_player` | Same table, activity-specific helpers |\n\nAll 21 files under `/Users/ray/Documents/project/www/slot/slot_console/app/model/common/` follow this layout.\n\n---\n\n## 4. `app/entity/` + `BaseEntity` Examples\n\n**Base:** `/Users/ray/Documents/project/www/slot/slot_console/app/entity/BaseEntity.php`\n\n- Constructor fills **public properties** from array\n- `activeData()` returns public properties as array (for HTTP response assembly)\n\n**Good `extends BaseEntity` examples:**\n\n| File | Use |\n|------|-----|\n| `/Users/ray/Documents/project/www/slot/slot_console/app/entity/UserInfoEntity.php` | Remote user info from slot_user |\n| `/Users/ray/Documents/project/www/slot/slot_console/app/entity/wallet/WalletAddCurrencyEntity.php` | Wallet add payload |\n| `/Users/ray/Documents/project/www/slot/slot_console/app/entity/command/UserProfitEntity.php` | Command/statistics payload |\n\n**Legacy note:** Many older “entities” extend `think\\Entity` instead (e.g. `/Users/ray/Documents/project/www/slot/slot_console/app/entity/activity/ActivityConfigEntity.php`, `ActivityGiftPlayerEntity.php`). New activity Logic tends to return arrays directly rather than new-style Entity objects.\n\n---\n\n## 5. `WalletService` / `slot_lib` / `UserClient` in Logic\n\n### `WalletService` (`slotLib\\services\\WalletService`)\n\n**Free Credits Logic** — `/Users/ray/Documents/project/www/slot/slot_console/app/api/logic/FreeCreditsLogic.php`:\n\n```php\n// Context from UserTagService\nprotected function userContext(int $uid): array {\n $tag = UserTagService::getByUid($uid)->tagInfo;\n return ['uid' => $uid, 'currency' => $tag->currency, 'source' => $tag->source, 'organization' => $tag->organization];\n}\n\nprotected function walletService(array $context, int $needStat = 0): WalletService {\n return WalletService::getWalletService($context['uid'], $context['currency'], $context['source'], $context['organization'], $needStat);\n}\n\n// Used for: freeCreditsFreeze, freeCreditsClaim, freeCreditsFirstCashKeep, balance reads\n```\n\n**Weekly Rebate Logic** — `/Users/ray/Documents/project/www/slot/slot_console/app/api/logic/WeeklyRebateLogic.php`:\n\n```php\n$walletService = WalletService::getNoWalletDataService($uid, $user->currency, $user->source, $user->organization);\nreturn $walletService->gift($rebateAmountLi, 0, Consts::TRANSACTION_TYPE_WEEKLY_REBATE, '周返水 ' . $weekStart);\n```\n\n### `UserClient` (`slotsdk\\service\\user\\UserClient`)\n\n**Not used in activity Logic classes.** Used in:\n\n- `/Users/ray/Documents/project/www/slot/slot_console/app/api/controller/UserController.php` — `getUserClient()` with `ShareConfigService::get('userApiHost')`\n- `/Users/ray/Documents/project/www/slot/slot_console/app/command/event/HomeEvent.php` — MQ event handler\n\nPattern:\n\n```php\n$config = new SDKConfig(['host' => ShareConfigService::get('userApiHost'), 'headers' => ['server-name' => config('app.server_name')]]);\n$userClient = new UserClient($config);\n```\n\n### User info in Logic (without `UserClient`)\n\n- **`app\\service\\user\\UserService::getUserInfoEntity($uid)`** — HTTP to slot_user via `ShareConfigService::get('userApiHost')` → returns `UserInfoEntity`\n- **`slotLib\\services\\UserService`** (aliased `LibUserService`) — local lib user cache; `setUid($uid)->getUserInfo()->source`\n\n---\n\n## 6. `ShareConfigService` / Source Resolution for `uid`\n\n**App service:** `/Users/ray/Documents/project/www/slot/slot_console/app/service/ShareConfigService.php`\n\n- Loads center config: `config('app.centerApiHost') . '/innerapi/share-config/all'`\n- `get('userApiHost')`, `get('walletApiHost')`, etc.\n- `configCenterData($groupCode, $uid, $source)` — uid+source aware center config\n- `sourceInfo($source)` — channel metadata\n\n**Where `source` comes from by layer:**\n\n| Layer | Source |\n|-------|--------|\n| API request | JWT → `AuthMiddleware` → `$request->userEntity->source` |\n| FreeCreditsLogic | `UserTagService::getByUid($uid)->tagInfo->source` via `userContext()` |\n| WeeklyRebateLogic | `$request->userEntity->source` passed in; fallback `resolveSource()` → `LibUserService::getInstance()->setUid($uid)->getUserInfo()->source` |\n| UserService | `ShareConfigService::get('userApiHost')` + POST `{uid}` to slot_user innerapi |\n\n**Activity config by source:** e.g. `RechargeGiftConfigModel::getFreeCreditsActiveInfo($source)` in FreeCreditsLogic.\n\n---\n\n## 7. Existing Cycle / Player Patterns\n\nThere is **no shared “cycle” framework** for activities. Each activity has its own model shape:\n\n### Player + tier/package (Free Credits)\n\n- **Player:** `FreeCreditsPlayerModel` — one row per user per activity; status machine (`STATUS_NOT_STARTED` → `STATUS_FROZEN` → … → `STATUS_COMPLETED`)\n- **Packages:** `FreeCreditsPackageModel` — release tiers linked to `player_id`\n- Logic: `/Users/ray/Documents/project/www/slot/slot_console/app/api/logic/FreeCreditsLogic.php`\n\n### Period record (rebates)\n\n- **Daily:** `DailyRebateRecordModel` — one row per uid + `stat_date`; status CAS on claim\n- **Weekly:** `WeeklyRebateRecordModel` — one row per uid + `week_start`\n- Logic: `DailyRebateLogic`, `WeeklyRebateLogic`\n\n### Generic activity player\n\n- **`RechargeGiftPlayerModel` / `ActivityGiftPlayerModel`** — participation tracking for recharge gifts, red packet, etc.\n- Entity wrapper: `/Users/ray/Documents/project/www/slot/slot_console/app/entity/activity/ActivityGiftPlayerEntity.php`\n- Status constants: `STATUS_GOING=1`, `STATUS_CAN_RECEIVE=2`, `STATUS_EXPIRE=3`, `STATUS_FINISH=10`\n\n### Sign-in cycle (only explicit “cycle” naming)\n\n- `/Users/ray/Documents/project/www/slot/slot_console/app/model/SignInConfigModel.php` — `cycle_days`\n- `/Users/ray/Documents/project/www/slot/slot_console/app/model/UserSignInModel.php` — `cycle_day`, `CYCLE_DAY_LAST = 7`\n- Service: `/Users/ray/Documents/project/www/slot/slot_console/app/service/activity/SignActivityService.php`\n\n---\n\n## Quick Reference: File Paths\n\n| Concern | Path |\n|---------|------|\n| slotLib BaseController | `/Users/ray/Documents/project/www/slot/slot_lib/src/basic/BaseController.php` |\n| Best controller examples | `FreeCreditsController.php`, `WeeklyRebateController.php`, `DailyRebateController.php` under `app/api/controller/` |\n| Route config | `/Users/ray/Documents/project/www/slot/slot_console/config/route.php` |\n| API middleware | `/Users/ray/Documents/project/www/slot/slot_console/config/middleware.php` |\n| DB connection | `/Users/ray/Documents/project/www/slot/slot_console/config/thinkorm.php` |\n| Common models | `/Users/ray/Documents/project/www/slot/slot_console/app/model/common/` |\n| BaseEntity | `/Users/ray/Documents/project/www/slot/slot_console/app/entity/BaseEntity.php` |\n| ShareConfigService | `/Users/ray/Documents/project/www/slot/slot_console/app/service/ShareConfigService.php` |\n| User HTTP gateway | `/Users/ray/Documents/project/www/slot/slot_console/app/service/user/UserService.php` |\n\nIf you are scaffolding a new activity, **WeeklyRebateController + WeeklyRebateLogic** is the cleanest template (info/claim, source from JWT, record model + WalletService gift). **FreeCredits** is the reference for a richer player+package state machine.\n\n[REDACTED]"}]}}
{"type":"turn_ended","status":"success"}