This commit is contained in:
ray zhou
2026-05-29 11:21:40 +08:00
parent 5d6d482efe
commit f71a5c59af
447 changed files with 32245 additions and 116 deletions

94
.gitignore vendored
View File

@@ -1,63 +1,45 @@
# >>> CURSOR MANAGED BLOCK >>> # >>> CURSOR MANAGED BLOCK >>>
# Ignore everything in .cursor by default # Ignore everything in .cursor
* *
# Un-ignore projects so we can descend to allowlisted subdirs
# Keep gitignore itself !projects/
!.gitignore projects/*
!projects/*/
# ========================================================= projects/*/*
# Team shared Cursor rules # MCP tool descriptors, resources, prompts
# ========================================================= !projects/*/mcps/
!rules/ !projects/*/mcps/**
!rules/** # Agent transcripts for citation
!projects/*/agent-transcripts/
# ========================================================= !projects/*/agent-transcripts/**
# Team shared Cursor agents # Terminal output files
# ========================================================= !projects/*/terminals/
!agents/ !projects/*/terminals/**
!agents/** # Conversation notes (shared scratchpad)
!projects/*/agent-notes/
# ========================================================= !projects/*/agent-notes/**
# Team shared Cursor skills # Large tool output files
# ========================================================= !projects/*/agent-tools/
!projects/*/agent-tools/**
# Plugin cache (rules, skills, agents)
!plugins/
!plugins/**
# Built-in Cursor skills
!skills-cursor/
!skills-cursor/**
# User's personal skills
!skills/ !skills/
!skills/** !skills/**
# User's personal slash commands
# =========================================================
# Team shared slash commands
# =========================================================
!commands/ !commands/
!commands/** !commands/**
# User's plan files
# ========================================================= !plans/
# Team shared plans, optional !plans/**
# ========================================================= # Subagent state/transcripts
plans/ !subagents/
plans/** !subagents/**
# User-level cursor rules
# ========================================================= !rules/
# Do NOT track Cursor projects runtime files !rules/**
# =========================================================
projects/
projects/**
# =========================================================
# Do NOT track Cursor plugin cache
# =========================================================
plugins/
plugins/**
# =========================================================
# Do NOT track built-in Cursor skills
# Usually auto-generated / synced by Cursor
# =========================================================
skills-cursor/
skills-cursor/**
# =========================================================
# Do NOT track runtime state / transcripts / terminal logs
# =========================================================
subagents/
subagents/**
# <<< CURSOR MANAGED BLOCK <<< # <<< CURSOR MANAGED BLOCK <<<

View File

@@ -0,0 +1,39 @@
---
name: console返水过期兜底
overview: 在 C 端返水信息接口增加“近7天过期兜底”逻辑若存在未领取且已过期记录进入接口时自动标记为 expired避免依赖定时脚本。
todos:
- id: locate-info-hook
content: 在 DailyRebateLogic::info() 增加近7天过期兜底调用点查询记录前
status: pending
- id: add-scope-expire-method
content: 新增用户+近7天范围的过期更新方法仅更新 claimable 且已过期记录
status: pending
- id: verify-behavior
content: 按过期/未过期/超范围三类样例验证 info 返回状态符合预期
status: pending
isProject: false
---
# Console返水信息过期兜底改造
## 目标
在用户访问返水信息接口时对该用户“近7天”记录执行一次轻量过期兜底`status=claimable``expire_at<=当前时间` 的记录更新为 `expired`,避免脚本漏跑导致前端状态不一致。
## 改动方案
- 在 [`/Users/ray/Documents/project/www/slot/slot_console/app/api/logic/DailyRebateLogic.php`](/Users/ray/Documents/project/www/slot/slot_console/app/api/logic/DailyRebateLogic.php) 的 `info()` 开头(`$unlocked` 判定后、组装 records 前)新增一步:
- 仅针对当前 `uid`、统计日期范围“今天往前 6 天到今天”即接口展示的近7天执行过期更新。
- 更新条件:`status = STATUS_CLAIMABLE``expire_at <= now()`
- 更新结果无需抛错,作为兜底处理(可选记录 debug/info 日志)。
- 在同文件新增受保护方法(例如 `expireRecentClaimableForInfo(int $uid): int`)承载该逻辑,保持 `info()` 主流程清晰,符合 Logic 分层。
- 保留现有 `expireDueRecords()`(全量定时任务用),新方法仅用于 C 端接口的“用户级小范围补偿”,两者职责互补,不互相替代。
## 细节约束
- 范围严格限定为近7天避免接口触发全表更新。
- 仅改 `claimable -> expired`,不触碰 `claimed` / `pending`
- 执行顺序放在读取记录前,保证本次 `records` 返回的状态已是最新。
## 验证计划
- 构造 1 条近7天内 `claimable + expire_at 已过期` 数据,调用 `info` 后应返回 `expired`
- 构造 1 条近7天内 `claimable + expire_at 未到期` 数据,调用 `info` 后仍为 `claimable`
- 构造 1 条 7 天外过期 `claimable` 数据,调用 `info` 后不应被本接口更新(仍由定时任务处理)。
- 回归 `claim` 接口:已过期记录仍不可领取(现有保护逻辑保持不变)。

View File

@@ -0,0 +1,59 @@
---
name: Create Cursor Workspace
overview: 在 `/Users/ray/Documents/project/www/slot` 创建一个 Cursor/VS Code workspace 文件,并把该目录下的一级项目文件夹加入 workspace。默认排除 `.vscode` 和普通文件。
todos:
- id: check-existing
content: 检查 `/Users/ray/Documents/project/www/slot/slot.code-workspace` 是否已存在
status: completed
- id: write-workspace
content: 创建或合并 workspace folders 列表
status: completed
- id: validate-json
content: 校验 `.code-workspace` JSON 格式
status: completed
isProject: false
---
# Create Slot Workspace
将在 [`/Users/ray/Documents/project/www/slot/slot.code-workspace`](/Users/ray/Documents/project/www/slot/slot.code-workspace) 创建 workspace 文件,内容使用标准 `.code-workspace` JSON 格式。
计划加入这些一级非隐藏文件夹:
- [`backend`](/Users/ray/Documents/project/www/slot/backend)
- [`monitor`](/Users/ray/Documents/project/www/slot/monitor)
- [`slot-foundation`](/Users/ray/Documents/project/www/slot/slot-foundation)
- [`slot_agent`](/Users/ray/Documents/project/www/slot/slot_agent)
- [`slot_agent_vue`](/Users/ray/Documents/project/www/slot/slot_agent_vue)
- [`slot_center`](/Users/ray/Documents/project/www/slot/slot_center)
- [`slot_console`](/Users/ray/Documents/project/www/slot/slot_console)
- [`slot_gateway`](/Users/ray/Documents/project/www/slot/slot_gateway)
- [`slot_hub`](/Users/ray/Documents/project/www/slot/slot_hub)
- [`slot_lib`](/Users/ray/Documents/project/www/slot/slot_lib)
- [`slot_notification`](/Users/ray/Documents/project/www/slot/slot_notification)
- [`slot_pay`](/Users/ray/Documents/project/www/slot/slot_pay)
- [`slot_pwa`](/Users/ray/Documents/project/www/slot/slot_pwa)
- [`slot_risk`](/Users/ray/Documents/project/www/slot/slot_risk)
- [`slot_sdk`](/Users/ray/Documents/project/www/slot/slot_sdk)
- [`slot_user`](/Users/ray/Documents/project/www/slot/slot_user)
- [`slot_wallet`](/Users/ray/Documents/project/www/slot/slot_wallet)
Workspace 文件结构会类似:
```json
{
"folders": [
{ "path": "backend" },
{ "path": "monitor" },
{ "path": "slot-foundation" }
],
"settings": {}
}
```
实施步骤:
1. 检查目标文件是否已存在,避免覆盖已有 workspace 配置。
2. 如果不存在,创建 [`slot.code-workspace`](/Users/ray/Documents/project/www/slot/slot.code-workspace)。
3. 如果已存在,先读取现有内容,再合并缺失的文件夹,保留已有设置。
4. 校验生成的 JSON 格式可被 Cursor 打开。

View File

@@ -0,0 +1,122 @@
---
name: C端 packages 响应精简
overview: 在 slot_console 的 Free Credits 定格状态接口(`/api/free-credits/status``claim` 共用 `buildStatus`)中,精简 `packages[]` 每项字段,并将档位 status 4/5 映射为 3使 C 端仅见 03。后台 innerapi 与库表语义不变。
todos:
- id: model-list-for-client
content: 在 FreeCreditsPackageModel 实现 mapStatusForClient并精简 listForClient 返回字段
status: in_progress
- id: update-phpdoc
content: 更新 FreeCreditsLogic、FreeCreditsController 的 packages/status PHPDoc
status: pending
- id: update-unit-tests
content: 调整 FreeCreditsClientStatusTest / Harness并补充 status 4/5→3 用例
status: pending
- id: run-phpunit
content: 在 php82 容器内跑 FreeCreditsClientStatusTest 验证
status: pending
isProject: false
---
# C 端定格状态 packages 响应调整
## 背景与范围
目标接口在 [slot_console/app/api/controller/FreeCreditsController.php](slot_console/app/api/controller/FreeCreditsController.php)
- `POST /api/free-credits/status``FreeCreditsLogic::status()``buildStatus()`
- `POST /api/free-credits/claim` 成功后的 `data` 结构相同
`packages[]` 当前由 [slot_console/app/model/common/FreeCreditsPackageModel.php](slot_console/app/model/common/FreeCreditsPackageModel.php) 的 `listForClient()` 组装,经 `FreeCreditsLogic::clientPackagesForPlayer()` 注入响应:
```72:86:slot_console/app/model/common/FreeCreditsPackageModel.php
public static function listForClient(int $playerId, callable $formatAmount): array
{
// ...
$packages[] = [
'id' => intval($row->id),
'package_no' => intval($row->package_no),
'package_type' => intval($row->package_type),
'amount' => $formatAmount(intval($row->amount_qf)),
'status' => intval($row->status),
];
```
库表档位 status[install.sql](slot_console/db/install.sql)`0` 锁定、`1` 可操作、`2` 处理中、`3` 已完成、`4` 失败、`5` 风控拒绝。
**不在本次范围**`innerapi/free-credits/*`(后台仍用 `package_no` / `package_type` 聚合)、库表与 Logic 内按 `package_no` / `package_type` 的业务判断。
## 目标契约
`packages[]` 每项仅保留:
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | int | 档位主键claim / 第一档提现仍传 `package_id` |
| `amount` | float | 展示大单位,逻辑不变 |
| `status` | int | **仅可能为 0、1、2、3**DB 为 4 或 5 时对外返回 3 |
列表仍按 `package_no` 升序(查询不变,仅响应不暴露 `package_no`。C 端可用数组下标区分第一档(`[0]`)与后续档。
Status 映射(仅 C 端展示层):
```mermaid
flowchart LR
db0[DB 0 locked] --> c0[C 0]
db1[DB 1 ready] --> c1[C 1]
db2[DB 2 processing] --> c2[C 2]
db3[DB 3 completed] --> c3[C 3]
db4[DB 4 failed] --> c3
db5[DB 5 rejected] --> c3
```
## 实现步骤
### 1. 修改 `FreeCreditsPackageModel::listForClient()`
文件:[FreeCreditsPackageModel.php](slot_console/app/model/common/FreeCreditsPackageModel.php)
- 新增私有/公有静态方法(建议 `mapStatusForClient(int $status): int`),将 `STATUS_FAILED(4)`、`STATUS_REJECTED(5)` 转为 `STATUS_COMPLETED(3)`,其余原样返回。
- `listForClient()` 返回项改为 `{ id, amount, status }``status` 走映射方法。
- 更新 `@return` PHPDoc`list<array{id:int,amount:float,status:int}>`,并注明 C 端 status 取值 03。
### 2. 同步 Logic / Controller 文档
- [FreeCreditsLogic.php](slot_console/app/api/logic/FreeCreditsLogic.php)`clientPackagesForPlayer()` 的 `@return` 与注释。
- [FreeCreditsController.php](slot_console/app/api/controller/FreeCreditsController.php)`status()` / `claim()` 中 `packages` 字段说明——去掉 `package_no`、`package_type``status` 改为 `0 locked ~ 3 completed失败/拒绝对外亦为 3`。
### 3. 单测
- [FreeCreditsClientStatusTest.php](slot_console/tests/Unit/FreeCreditsClientStatusTest.php)`PACKAGE_KEYS` 改为 `['id','amount','status']`;注入样例去掉 `package_no` / `package_type`。
- 新增用例(二选一或都做):
- 对 `mapStatusForClient`:断言 `4→3`、`5→3`、`03` 不变;
- 或在 harness 注入 `status=4/5` 的 package断言 `buildStatus` 输出为 `3`。
- [FreeCreditsLogicHarness.php](slot_console/tests/Support/FreeCreditsLogicHarness.php):更新 `injectClientPackages` 相关 PHPDoc 类型。
运行Docker
```bash
docker exec -w /app/www/slot/slot_console php82 ./vendor/bin/phpunit tests/Unit/FreeCreditsClientStatusTest.php
```
## 数据流(变更后)
```mermaid
sequenceDiagram
participant C as C端
participant API as FreeCreditsController
participant Logic as FreeCreditsLogic
participant Model as FreeCreditsPackageModel
C->>API: status / claim
API->>Logic: buildStatus
Logic->>Model: listForClient
Model->>Model: mapStatusForClient
Model-->>Logic: id, amount, status
Logic-->>C: packages[]
```
## 风险与说明
- **C 端若已依赖 `package_no` / `package_type` 或区分 4/5**:需同步改 UI服务端 claim 仍用 `package_id`,顺序校验仍在 Logic/DB不依赖响应里的 `package_no`。
- **失败/拒绝与成功完成在 UI 上同为 status=3**:符合当前需求;若以后要区分展示,需另加字段或改映射规则。
- 单测 [FreeCreditsClientStatusTest](slot_console/tests/Unit/FreeCreditsClientStatusTest.php) 期望顶层含 `first_cash_amount`,但 [buildStatus](slot_console/app/api/logic/FreeCreditsLogic.php) 当前未返回该字段——与本次改动无关,不纳入本 PR除非你希望一并补齐。

View File

@@ -0,0 +1,156 @@
---
name: C端 status 响应补全
overview: 完成 Free Credits 定格状态接口 C 端响应packages 精简与 status 映射Model 已改、banner_image、首笔提现成功广播 broadcast真实 Top10 + 不足补假数据),并同步单测与文档。
todos:
- id: add-banner-image
content: 在 buildConfigClientFields / buildStatus / buildPreEnrollmentStatus 返回 banner_image
status: completed
- id: add-broadcast-list
content: 实现 broadcast 列表(真实首档 completed Top10 + 假数据补齐至 10 条)
status: completed
- id: finish-packages-docs
content: 更新 FreeCreditsController PHPDocpackages、banner_image、broadcast
status: completed
- id: update-unit-tests
content: 调整 FreeCreditsClientStatusTest / Harness补充 banner_image、status 映射、broadcast 用例
status: completed
- id: run-phpunit
content: php82 容器跑 FreeCreditsClientStatusTest 验证
status: completed
isProject: false
---
# C 端定格 status 响应补全
## 当前进度
[FreeCreditsPackageModel.php](slot_console/app/model/common/FreeCreditsPackageModel.php) **已完成**
- `mapStatusForClient()`DB status 4/5 → 3
- `listForClient()`:仅返回 `id``amount``status`
**待完成**`banner_image``broadcast`、Logic/Controller 文档、单测。
## 1. `banner_image`(活动 Banner
配置:`ext_config.banner_image`[activity/edit.vue](backend/slot_admin_vue/src/views/game/activity/edit.vue)
在 [FreeCreditsLogic.php](slot_console/app/api/logic/FreeCreditsLogic.php) 的 `buildConfigClientFields()` 增加 `banner_image``buildStatus()` / `buildPreEnrollmentStatus()` 透传;`status=-1` 仍仅 `{ status: -1 }`
## 2. `broadcast`(首笔提现成功最近 10 人)
对齐需求文档 [§13 广播模块](docs/requirements/首充前免费余额定格与分档释放需求文档.md):弹窗展示最近 10 条;用户本次明确要求 **仅首笔提现成功**(非后续 claim
### 2.1 顶层字段
- 字段名:**`broadcast`**`array`,固定长度 **10**
- 每项结构:
```json
{ "username": "U1***3", "amount": 20.0 }
```
| 子字段 | 类型 | 说明 |
|--------|------|------|
| `username` | string | 脱敏账号,展示用 |
| `amount` | float | 该用户首笔免打码提现金额(展示大单位) |
C 端文案示例:`🎉 U1***3 just cashed out $20.00`(前端拼接,接口只给结构化数据)。
### 2.2 真实数据查询
在 [FreeCreditsPackageModel.php](slot_console/app/model/common/FreeCreditsPackageModel.php) 新增查询方法(仅查库,不做脱敏):
```php
public static function listRecentFirstCashoutCompleted(int $activityId, int $limit = 10): array
```
条件:
- `activity_id = ?`
- `package_type = TYPE_FIRST_CASH(1)`
- `status = STATUS_COMPLETED(3)`
- `ORDER BY completed_time DESC``completed_time` 为空则 fallback `update_time`
- `LIMIT 10`
返回行至少含:`uid``amount_qf`
### 2.3 组装与脱敏Logic
在 [FreeCreditsLogic.php](slot_console/app/api/logic/FreeCreditsLogic.php) 新增 `buildBroadcastList(?Model $config): array`
1.`activity_id` 时查真实记录,逐条:
- `amount` = `formatClientAmount(amount_qf)`
- `username` = `maskDisplayName(account)``UserService::getUserInfoEntity($uid)->account`,规则与 [GameLatestLogic::username()](slot_console/app/napi/logic/GameLatestLogic.php) 一致:`substr(0,2) + '***' + substr(-1)`account 为空时用 `strval(uid)` 再脱敏
2. 若真实条数 `< 10`,用 **`buildFakeBroadcastItems($need, $config)`** 补齐:
- `amount`:取当前活动 `first_cash_amount``configAmount` + `formatClientAmount`),可在 ±10% 内随机浮动(整数分位),避免 10 条完全相同
- `username`:随机生成 `U` + 58 位数字再脱敏(勿与真实 uid 重复)
3. 合并后 **截断/保证恰好 10 条**(真实在前,假数据在后)
`buildStatus()` / `buildPreEnrollmentStatus()` 增加:
```php
'broadcast' => $this->buildBroadcastList($config),
```
`status=-1` 不返回 `broadcast`
### 2.4 分层说明
- **Model**:只负责按条件查最近 N 条首档 completed
- **Logic**:脱敏、金额格式化、假数据补齐(业务展示规则,不抽到 Service
```mermaid
flowchart LR
pkgTable[free_credits_package]
modelQuery[listRecentFirstCashoutCompleted]
logicBuild[buildBroadcastList]
fakePad[buildFakeBroadcastItems]
statusAPI["status data.broadcast"]
pkgTable --> modelQuery --> logicBuild
logicBuild --> fakePad --> statusAPI
```
## 3. packages 文档收尾
[FreeCreditsController.php](slot_console/app/api/controller/FreeCreditsController.php)`packages` 项为 `id``amount``status(03)`;补充 `banner_image``broadcast`
## 4. 单测
[FreeCreditsClientStatusTest.php](slot_console/tests/Unit/FreeCreditsClientStatusTest.php)
| 项 | 调整 |
|---|---|
| `PLAYER_TOP_KEYS` | 增加 `banner_image``broadcast`**移除** `first_cash_amount`(与当前 `buildStatus` 一致) |
| `PACKAGE_KEYS` | `['id','amount','status']` |
| 新增 | `testMapStatusForClientMapsFailedAndRejected` |
| 新增 | `testBuildStatusIncludesBannerImageFromExtConfig` |
| 新增 | `testBuildBroadcastAlwaysReturnsTenItems`harness 注入空真实列表,断言 `count(broadcast)==10`、每项含 `username`/`amount` |
[FreeCreditsLogicHarness.php](slot_console/tests/Support/FreeCreditsLogicHarness.php):可覆写 `buildBroadcastList` 或注入 Model 查询结果,避免单测连库。
## 5. 验证
```bash
docker exec -w /app/www/slot/slot_console php82 ./vendor/bin/phpunit tests/Unit/FreeCreditsClientStatusTest.php
```
## 响应示例status≥0
```json
{
"status": 2,
"frozen_amount": 78.5,
"win_threshold": 50.0,
"recharge_unlock_amount": 50.0,
"help": "...",
"banner_image": "https://cdn.example.com/xxx.png",
"broadcast": [
{ "username": "U1***3", "amount": 20.0 },
{ "username": "U9***2", "amount": 20.0 }
],
"packages": [
{ "id": 101, "amount": 20.0, "status": 1 }
]
}
```
注:`broadcast` 数组长度恒为 10示例仅展示 2 条。

View File

@@ -0,0 +1,37 @@
---
name: daily-rebate-info调整
overview: 恢复 `info``tiers` 输出,并明确继续使用共享 Redis 实时计算当天返水,补齐稳定性与返回一致性。
todos:
- id: restore-tiers
content: 在 DailyRebateLogic::info 恢复 tiers 返回并保持现有档位格式
status: completed
- id: harden-today-redis
content: 加固 readTodayBetFromRedis 容错,确保实时计算稳定
status: completed
- id: verify-info-contract
content: 核对 info 字段契约并运行 verify-slot-backend 脚本
status: completed
isProject: false
---
# DailyRebate Info 返回修正计划
## 目标
-`DailyRebate info` 中恢复 `tiers` 字段。
- 当天数据继续采用“共享 Redis 读取下注 + 本地按档位计算返水”的方案。
- 保持近 7 天固定返回与展示金额口径不变。
## 变更点
- 更新 [`/Users/ray/Documents/project/www/slot/slot_console/app/api/logic/DailyRebateLogic.php`](/Users/ray/Documents/project/www/slot/slot_console/app/api/logic/DailyRebateLogic.php)
-`info()` 返回结构中重新加入 `tiers`(复用现有档位格式化逻辑)。
- 保持 `records` 固定 7 天(无数据补 0 展示金额)。
- 明确当天逻辑:从 `readTodayBetFromRedis()` 读取共享 Redis 的当日下注,调用 `DailyRebateCalcService::calcRebateLi()` 计算当日 `rebate_display`
- 为 Redis 空值/脏值场景补轻量容错(反序列化失败时按 0 处理,避免接口抖动)。
- 只读一致性确认(不改跨服务架构)
- 依据 [`/Users/ray/Documents/project/www/slot/slot_pwa/app/service/user/UserProfitService.php`](/Users/ray/Documents/project/www/slot/slot_pwa/app/service/user/UserProfitService.php) 与 [`/Users/ray/Documents/project/www/slot/slot_pwa/app/service/RedisKeyManagerService.php`](/Users/ray/Documents/project/www/slot/slot_pwa/app/service/RedisKeyManagerService.php),继续对齐 `Redis::connection('share') + getUserProfitKey(date('Ymd'))` 键模型。
## 验证
- 检查 `info` 返回字段:包含 `tiers``title/subtitle/help``records(7条)``claimable`
- 抽样验证当天记录:有 Redis 下注时 `rebate_display` 非 0无下注时为 0。
- 执行门禁脚本:`~/.cursor/hooks/verify-slot-backend.sh`

View File

@@ -0,0 +1,132 @@
---
name: DailyRebateLogic重构
overview: 按 `php-code` 规范重构每日返水领取链路:`claim` 编排化、BusinessException、Model 条件更新;同步调整 Controller 异常映射。`settleDate`/`info` 仅做必要小抽取,不改业务语义。
todos:
- id: model-mark-claimed
content: DailyRebateRecordModel 增加 markClaimedIfClaimable + PHPDoc
status: pending
- id: logic-claim-refactor
content: DailyRebateLogicclaim 拆 assert/perform/formatBusinessException
status: pending
- id: logic-info-helper
content: 可选isClaimableRecord 供 info 与 assert 复用
status: pending
- id: controller-exception
content: DailyRebateControllercatch BusinessException → FAILED
status: pending
- id: verify-smoke
content: 跑 verify-slot-backend.sh确认无 RuntimeException 新增
status: pending
isProject: false
---
# DailyRebateLogic 规范重构
## 范围AskQuestion 中断,按推荐默认)
- **必做**[`claim`](slot_console/app/api/logic/DailyRebateLogic.php)、[`DailyRebateController::claim`](slot_console/app/api/controller/DailyRebateController.php)、[`DailyRebateRecordModel`](slot_console/app/model/common/DailyRebateRecordModel.php)
- **轻量**`info()` 抽取「是否可领」判断为 private`assertClaimableRecord` 复用逻辑
- **不改语义**`settleDate` / `expireDueRecords` / Redis 结算逻辑保持行为一致,仅在有重复代码时抽 1 个 private可选
## 现状问题(对照 php-code
[`claim`](slot_console/app/api/logic/DailyRebateLogic.php) L92157
- 6 段 `RuntimeException` if 墙
- CAS 写在 Logic 内联,未沉淀 Model
- Controller `catch RuntimeException` + `PARAMS_ERROR`verify 会拦新增行)
参照:[`FreeCreditsLogic::claim`](slot_console/app/api/logic/FreeCreditsLogic.php)`assert*` + `BusinessException` + 状态更新)
## 目标结构
```mermaid
sequenceDiagram
participant C as DailyRebateController
participant L as DailyRebateLogic
participant M as DailyRebateRecordModel
participant W as WalletService
C->>L: claim(uid, source, statDate)
L->>L: assertActivityEnabled
L->>L: assertUserDeposited
L->>M: findByUidAndDate
L->>L: assertClaimableRecord
L->>M: markClaimedIfClaimable
L->>W: gift(rebate, DAILY_REBATE, remark)
L-->>C: formatClaimResult
```
### 1. Model条件更新
在 [`DailyRebateRecordModel`](slot_console/app/model/common/DailyRebateRecordModel.php) 新增:
```php
/**
* 待领取状态下标记为已领取CAS
*
* @return int 影响行数1 表示成功
*/
public static function markClaimedIfClaimable(int $id): int
```
实现:`where id` + `where status = STATUS_CLAIMABLE``STATUS_CLAIMED` + `claimed_at`
### 2. Logic`claim` 拆分为编排 + assert + perform
| 方法 | 职责 |
|------|------|
| `claim()` public | 编排 ≤20 行:`resolveSource` → 默认 `statDate` → assert → `performClaim` → 返回 |
| `assertActivityEnabled(string $source)` | 活动未开 → `BusinessException` |
| `assertUserDeposited(int $uid)` | 未充值 → `BusinessException` |
| `assertClaimableRecord(?DailyRebateRecordModel $record)` | 不存在/状态/金额/过期 → 各一条 `BusinessException`(合并原 4 条 if |
| `performClaim(int $uid, DailyRebateRecordModel $record, string $statDate)` | 事务:`markClaimedIfClaimable``WalletService::gift` → commit`affected !== 1` 或 wallet 空 → `BusinessException` |
| `formatClaimResult(...)` | 返回 `stat_date` / `rebate_amount` / `display` / `balance` |
- 使用 `support\exception\BusinessException`(与 FreeCredits 一致)
- `@throws` 改为 `BusinessException``\Throwable`(钱包失败)
- **钱包 biz_id**`WalletService::gift()` 内部已 `generateOrderId`[`slot_lib/src/services/WalletService.php`](slot_lib/src/services/WalletService.php) L262265幂等依赖 **记录 CAS**remark 保持 `每日返水 {statDate}` 便于对账
### 3. Logic`info` 轻量复用(可选)
抽取 `isClaimableRecord(DailyRebateRecordModel $record): bool`status + amount + expire`info()``claimable` 块与 `assertClaimableRecord` 共用,避免两套判断漂移。
### 4. Controller异常映射
[`DailyRebateController::claim`](slot_console/app/api/controller/DailyRebateController.php)
```php
} catch (BusinessException $e) {
return $this->errorCode(ErrorCode::FAILED, $e->getMessage());
}
```
- 对齐 [`SignController`](slot_console/app/api/controller/SignController.php)(业务失败 `FAILED` + 文案)
- **API 变更**`code``40003`PARAMS_ERROR变为 `1`FAILED文案仍为中文业务提示。若 PWA 强依赖 `40003`,可在计划中改为保留 `PARAMS_ERROR`(实现时二选一,默认 `FAILED`
不采用 FreeCredits「无 catch、走全局 Handler」方式避免未捕获时变成 `SYSTEM_ERROR`50001
### 5. 不动 / 谨慎
- **事务边界**:维持「先 CAS 再 gift 再 commit」不在此 PR 改为「先 wallet 后 DB」或 Outbox
- **`settleDate`**:逻辑不变;可选抽 `settleOneUserFromRedis(...)` 降低 foreach 嵌套(非必须)
## 文件清单
| 文件 | 变更 |
|------|------|
| `slot_console/app/model/common/DailyRebateRecordModel.php` | +`markClaimedIfClaimable` |
| `slot_console/app/api/logic/DailyRebateLogic.php` | 重构 `claim`;可选 `isClaimableRecord` |
| `slot_console/app/api/controller/DailyRebateController.php` | `BusinessException` + `FAILED` |
## 验收
1. `docker exec -w /app/www/slot/slot_console php82 php webman dailyRebateSettle --date=...`(如有环境)结算后,已充值用户可领昨日返水
2. 重复领取 → 业务错误文案DB 仍为 `CLAIMED`,不重复入账
3. `~/.cursor/hooks/verify-slot-backend.sh` → PASS无新增 `RuntimeException` 业务态)
4. 最终回复含 `PHPDoc: checked`(触及符号补全 `@throws BusinessException`
## 风险与回滚
- **PWA 错误码**:若前端按 `code===40003` 分支,需同步前端或 Controller 保留 `PARAMS_ERROR`
- 回滚:还原 3 个文件即可

View File

@@ -0,0 +1,121 @@
---
name: Docker 环境 Cursor 规则
overview: 建议把 Docker 开发环境信息写成 Cursor 规则,但单独一条、尽量简短;优先放在 slot 项目级规则,只有跨多个仓库共用同一套 Docker 时才放到用户级规则。
todos:
- id: decide-scope
content: 确认 Docker 规则放项目级 (slot) 还是用户级 (~/.cursor/rules)
status: completed
- id: confirm-php-container
content: 确认 slot 后端默认容器 php82 与各服务 working_dir
status: completed
- id: create-dev-rule
content: 新建 dev-environment.mdc1530 行,含 compose 路径、容器名、端口、exec 示例)
status: completed
isProject: false
---
# Docker 环境是否写入 Cursor 规则
## 结论
**值得写进 Cursor 规则**,但**不必**和 [`backend-layering.mdc`](/Users/ray/.cursor/rules/backend-layering.mdc) 混在同一条里,也**不必**默认全部塞进「用户级 + alwaysApply」。
原因Agent 在帮你跑 `php``composer``artisan`、迁移、单测、连 Redis/MySQL 时,若不知道服务在容器里,常会错误地在宿主机执行,或连错端口(例如 MySQL 映射是 `3309:3306`)。
---
## 用户级 vs 项目级:怎么选
| 放置位置 | 路径 | 适用场景 |
| --- | --- | --- |
| **项目级(推荐)** | 例如在 slot 多根工作区根目录建 [`.cursor/rules/dev-environment.mdc`](file:///Users/ray/Documents/project/www/slot/.cursor/rules/dev-environment.mdc) | 只有 slot / `www/slot` 相关仓库用这套 Docker |
| **用户级** | [`~/.cursor/rules/dev-environment.mdc`](/Users/ray/.cursor/rules/dev-environment.mdc) | 多个不相关项目都共用 [`/Users/ray/Documents/project/docker/docker-compose.yml`](file:///Users/ray/Documents/project/docker/docker-compose.yml) |
你当前用户级只有分层规范一条,且 `alwaysApply: true`。Docker 信息属于**运行环境**,和编码规范是不同关注点:
- **分层规则**:继续 `alwaysApply: true`(跨项目仍有用)
- **Docker 规则**:建议 `alwaysApply: false`,或仅在 slot 工作区用项目级规则避免在写前端、文档、Figma 时也占用上下文
当前 slot 工作区下**没有** [`.cursor/rules/`](file:///Users/ray/Documents/project/www/slot/.cursor/rules),更适合为 slot 单独加一条 `dev-environment.mdc`
---
## 规则里应写什么(可操作、短)
根据你的 [`docker-compose.yml`](file:///Users/ray/Documents/project/docker/docker-compose.yml),建议只写 Agent **执行命令时必需** 的信息:
1. **Compose 位置**`/Users/ray/Documents/project/docker/docker-compose.yml`
2. **容器名 → 用途**(执行命令用 `docker exec`,不要用宿主机 PHP/CLI
- `php82` — PHP 8.2slot 后端主环境,按你实际版本确认)
- `php72` — PHP 7.2(若有老项目)
- `goMysql` — MySQL 8容器内 `3306`,宿主机 **`3309`**
- `redis``6379``goredis` — 宿主机 `6378`
3. **挂载路径**:宿主机 `/Users/ray/Documents/project` → 容器内 `/app`(项目在容器内路径如 `/app/www/slot/backend`
4. **命令约定**(示例,按你项目真实入口改):
- PHP`docker exec -w /app/www/slot/backend php82 php ...`
- Composer / artisan同样在 `php82` 内、对应 `working_dir` 执行
- MySQL CLI`docker exec -it goMysql mysql -uroot -proot ...`(或注明用宿主机 `127.0.0.1:3309`
5. **明确禁止/避免**:不要在 macOS 宿主机直接跑 `php`/`composer`(除非已确认本机也有同版本环境)
**不建议写进规则的内容**
- 完整 `docker-compose.yml` 复制(冗长、易过期)
- 所有服务密码细节compose 里已有;规则里写「以 compose 为准」即可)
- RabbitMQ、Milvus 等与当前 slot 任务无关的服务(除非经常用到)
---
## 与现有文档的关系
- **Cursor 规则**:给 Agent 的「默认假设」,每次对话自动带上(按 `alwaysApply` / `globs`
- **仓库 README / `docs/dev-setup.md`**:给人看的完整说明;规则可写一句「详细步骤见 xxx」
两者可并存:规则 1530 行,文档可更长。
---
## 建议的规则骨架(项目级示例)
```markdown
---
description: Slot 本地 Docker 开发环境PHP / MySQL / Redis
alwaysApply: true
---
# Local Dev (Docker)
- Compose: `/Users/ray/Documents/project/docker/docker-compose.yml`
- Host project root: `/Users/ray/Documents/project` → container `/app`
- Run PHP/Composer/Artisan inside container `php82`, not on macOS host.
- MySQL: container `goMysql`; from host use `127.0.0.1:3309`.
- Redis: container `redis`, host port `6379`.
- Example: `docker exec -w /app/www/slot/backend php82 php artisan ...`
```
若放在**用户级**,把 `alwaysApply` 改为 `false`或标题改成「Project docker (ray)」以免污染非 slot 项目。
---
## 推荐决策
```mermaid
flowchart TD
Q[多个仓库共用同一套 Docker?]
Q -->|是| UserRule["~/.cursor/rules/dev-environment.mdc\nalwaysApply: false"]
Q -->|否 仅 slot| ProjRule["www/slot/.cursor/rules/dev-environment.mdc\nalwaysApply: true 在该工作区"]
Both[保留 backend-layering 在用户级 alwaysApply]
UserRule --> Both
ProjRule --> Both
```
**对你当前情况**slot 多仓库工作区 + Docker 在 `project/docker`**优先项目级规则**;仅当你打开的其他 Cursor 工作区(非 slot也依赖同一 compose 时,再复制一份到用户级。
---
## 下一步(你确认后可执行)
1. 在 [`www/slot/.cursor/rules/`](file:///Users/ray/Documents/project/www/slot/.cursor/rules) 新建 `dev-environment.mdc`(约 20 行)
2. 确认 slot 后端默认用 `php82` 还是 `php72`,以及各子服务在容器内的 `working_dir`
3. 可选:在 [`docs/`](file:///Users/ray/Documents/project/www/slot/docs) 增加 `dev-setup.md` 供人查阅,规则里链过去
无需修改现有的 `backend-layering.mdc`

View File

@@ -0,0 +1,47 @@
---
name: first_cashout审核类型对齐
overview: 将 `FreeCreditsLogic::buildFirstCashoutWithdrawalInfo` 中写死的 `auditType=1` 改为与正常提现一致的判定流程:金额阈值 + 黑名单/倍率风控强制人工。
todos:
- id: inspect-normal-rule
content: 提炼 WithdrawService 中正常提现 auditType 判定口径(金额+风控)
status: completed
- id: add-first-cash-audit-evaluator
content: 在 FreeCreditsLogic 增加第一档提现 auditType 判定方法
status: completed
- id: wire-build-method
content: 替换 buildFirstCashoutWithdrawalInfo 中写死 auditType 为动态判定
status: completed
- id: run-verification-gate
content: 执行 verify-slot-backend.sh 并检查结果
status: completed
isProject: false
---
# First Cashout 审核类型对齐计划
## 目标
`slot_console` 中第一档独立提现的审核类型判定,从固定自动审核改为与正常提现流程一致,避免风控场景下误走自动审核。
## 现状结论
- 在 [`/Users/ray/Documents/project/www/slot/slot_console/app/api/logic/FreeCreditsLogic.php`](/Users/ray/Documents/project/www/slot/slot_console/app/api/logic/FreeCreditsLogic.php) 的 `buildFirstCashoutWithdrawalInfo()` 里目前写死:`'auditType' => 1`
- 正常提现在 [`/Users/ray/Documents/project/www/slot/slot_console/app/service/WithdrawService.php`](/Users/ray/Documents/project/www/slot/slot_console/app/service/WithdrawService.php) 的 `apply()` 中处理逻辑是:
- 先通过 `getAuditType($amount)``auto_audit_max` 决定自动/人工。
- 再结合 `BlackApiService::status()` 与提现倍率(`totalW / wallet->r` 对比 `recharge_times`)在命中时强制人工(`auditType=2`)。
## 实施方案
1. 在 [`/Users/ray/Documents/project/www/slot/slot_console/app/api/logic/FreeCreditsLogic.php`](/Users/ray/Documents/project/www/slot/slot_console/app/api/logic/FreeCreditsLogic.php) 新增一个“第一档提现审核类型判定”私有方法(复用正常提现判定口径)。
2. 判定方法内对齐正常流程:
- 读取提现配置 `auto_audit_max`,按第一档固定金额(`package->amount_qf` 转展示金额后)先算基础 `auditType`
- 查询黑名单状态,非白名单直接人工审核。
- 白名单时按当前钱包数据计算倍率并与 `recharge_times` 比较,命中则人工审核。
3.`buildFirstCashoutWithdrawalInfo()` 中移除写死值,改为调用新判定方法赋值 `auditType`
4. 保持第一档提现已有业务语义不变(固定金额、`fee=0``bizType` 不改),只修正审核类型来源。
5. 变更后执行门禁校验脚本:`~/.cursor/hooks/verify-slot-backend.sh`,并在结果中确认通过。
## 影响文件
- [`/Users/ray/Documents/project/www/slot/slot_console/app/api/logic/FreeCreditsLogic.php`](/Users/ray/Documents/project/www/slot/slot_console/app/api/logic/FreeCreditsLogic.php)
## 验证要点
- 第一档提现在低金额且白名单情况下:`auditType=1`
- 超过 `auto_audit_max` 或命中黑名单/倍率规则时:`auditType=2`
- 订单申请链路仍可正常调用 `PayService::apply()`,不影响原有字段结构。

View File

@@ -0,0 +1,181 @@
---
name: firstCashout 合并代码评审
overview: 你对「merge post + 统一 WithdrawService::apply」的改法方向正确但当前 WithdrawService 在 package_id>0 时仍执行 checkInfo/手续费/黑规则,且 Pay 失败无回滚,会导致第一档提现不可用或卡在 processing。
todos:
- id: fc-early-return
content: WithdrawService::apply 中 package_id>0 走独立 applyFreeCreditsFirstCashout 并 early return
status: completed
- id: skip-checkinfo-fc
content: FC 分支跳过 checkInfo、getAmountAndFee、黑规则或产品确认保留项
status: completed
- id: pay-fail-rollback
content: Pay apply 失败时 handleFirstCashoutResult 回滚 processing
status: completed
- id: fc-withdrawal-info
content: FC 使用 package amount_qf、fee=0、auditType=2 组 WithdrawalInfo
status: completed
isProject: false
---
# firstCashout 合并改动 — 代码评审
## 你的改动(理解正确)
```mermaid
sequenceDiagram
participant Ctrl as WithdrawController
participant FC as FreeCreditsLogic
participant WS as WithdrawService
participant Pay as slot_pay
Ctrl->>FC: mergeFirstCashoutIntoPost
Note over FC: amount + bizType + package_id
Ctrl->>WS: apply(DTO)
WS->>FC: firstCashout(uid, packageId, orderId)
Note over FC: markFirstCashoutProcessing
WS->>Pay: apply(WithdrawalInfo)
```
- [`WithdrawController::apply`](slot_console/app/api/controller/WithdrawController.php):有 `package_id` 先 merge再**同一套** `validate($type)` — 符合预期。
- [`mergeFirstCashoutIntoPost`](slot_console/app/api/logic/FreeCreditsLogic.php):补 `amount` / `bizType` / `package_id` — 符合预期。
- [`firstCashout`](slot_console/app/api/logic/FreeCreditsLogic.php) 收窄为只 `markFirstCashoutProcessing` + 外部统一 `PayService::apply` — 思路可行。
---
## P0FC 仍会走 `checkInfo`,大概率直接失败
[`WithdrawService::apply`](slot_console/app/service/WithdrawService.php) 当前顺序:
```php
$bankInfo = $this->checkBankInfo($applyDTO);
$this->checkInfo($applyDTO->type, $applyDTO->amount); // 始终执行
// ...
if ($applyDTO->package_id > 0) {
firstCashout(...); // 永远走不到checkInfo 已抛错)
}
```
`checkInfo` 会校验**钱包可提现余额** ≥ amount[`WithdrawService.php` L333-335](slot_console/app/service/WithdrawService.php))。
Free Credits 第一档资金在**活动池**,不在普通 `withdraw` 余额里 → 典型报错 **`Insufficient balance`**。
**结论**:与需求「不进入普通钱包」冲突,第一档线上基本提不了现。
**建议**`package_id > 0`(或 `bizType === free_credit_first_cashout`)时 **跳过** `checkInfo`(及与之绑定的首提 min/max 规则)。
---
## P0Pay 失败时档位已置为 processing无回滚
你现在在 **Pay 之前** 调用 `firstCashout``markFirstCashoutProcessing`status=2
原实现是mark → `PayService::apply`**catch 时** `handleFirstCashoutResult($orderId, false)` 恢复 ready。
当前 [`WithdrawService::apply`](slot_console/app/service/WithdrawService.php) L236 调 pay **没有** try/catch 回滚 → 申请失败时 package 会一直 **processing**,用户无法重试。
**建议**
```php
if ($applyDTO->package_id > 0) {
$orderId = CommonFn::generateOrderId(4, $userTag->uid);
(new FreeCreditsLogic())->firstCashout($userTag->uid, $applyDTO->package_id, $orderId);
$withdrawalInfo->orderId = $orderId;
$withdrawalInfo->bizType = FreeCreditsLogic::BIZ_TYPE_FIRST_CASHOUT;
try {
$res = PayService::getInstance()->apply($withdrawalInfo->toArray());
return $res;
} catch (\Throwable $e) {
(new FreeCreditsLogic())->handleFirstCashoutResult($orderId, false);
throw $e;
}
}
```
FC 分支应 **early return**,不要继续走下面黑规则 + `getAmountAndFee`。)
---
## P1FC 仍走普通手续费 / 黑规则 / auditType
合并后 FC 路径仍执行:
- `getAuditType($applyDTO->amount)``BlackApiService`、提现倍数检测
- `getAmountAndFee($applyDTO->amount, $this->withdrawal)` — 可能扣手续费、按钱包余额改金额
原 [`firstCashout`](slot_console/app/api/logic/FreeCreditsLogic.php) 约定:
- `fee = 0`
- `auditType = 2`(人工审核)
- `amount = package->amount_qf`(千分位,不经手续费逻辑)
`merge` 写入的 `amount`**展示大单位**`getNumberFormat(qf)`),再经 `getAmountAndFee` 可能与 pay 侧期望的千分位不一致。
**建议**FC 分支单独组 `WithdrawalInfo`
| 字段 | FC 取值 |
|------|---------|
| amount | 从 package 读 `amount_qf`(或 merge 时额外缓存 `_amount_qf` |
| fee | 0 |
| auditType | 2 |
| bizType | `free_credit_first_cashout` |
| 黑规则 | 跳过(或产品确认是否要对 FC 也做) |
---
## P1`firstCashout` 与 `markFirstCashoutProcessing` 重复校验
[`firstCashout`](slot_console/app/api/logic/FreeCreditsLogic.php) 内再次查 `STATUS_READY` 后调用 `markFirstCashoutProcessing`,而 `markFirstCashoutProcessing` ** again** 要求 `STATUS_READY`L343
逻辑重复但无害;可简化为只调 `markFirstCashoutProcessing`,或只保留一处校验。
注意:`mergeFirstCashoutIntoPost` 已校验 ready`firstCashout` 时若并发重复提交,第二次会在 mark 阶段失败 — 符合「处理中不可重复提交」。
---
## P2行为变化需产品确认
| 项 | 原 FC | 现统一 apply |
|----|--------|----------------|
| `is_bind_name` | 不校验 | **校验**L157 |
| Redis 5s 频控 | 无 | **有** |
| 返回值 | `{order_id, amount}` | pay `apply` 原始结构 |
若 C 端依赖 `data.order_id` / `data.amount` 展示,需确认 pay 返回是否一致。
---
## 做得好的部分
- Controller 单入口 + merge post**正确**。
- 去掉独立 FC validator scene**正确**。
- [`FreeCreditsController::firstCashout`](slot_console/app/api/controller/FreeCreditsController.php) 兼容路径与主入口一致:**正确**。
- pay 层仍靠 `bizType` 跳过 `withdrawFrozen`**只要 bizType 确实传到 pay 就没问题**(当前 L184 已设)。
---
## 推荐修复结构(最小 diff
在 [`WithdrawService::apply`](slot_console/app/service/WithdrawService.php) 开头(绑卡、频控之后):
```php
if ($applyDTO->package_id > 0) {
return $this->applyFreeCreditsFirstCashout($applyDTO, $bankInfo);
}
// 原有普通提现逻辑不变
```
`applyFreeCreditsFirstCashout` 内:
1. 跳过 `checkInfo`、黑规则、`getAmountAndFee`
2. `orderId``firstCashout`mark→ 组 `WithdrawalInfo`qf amount, fee=0, auditType=2, bizType
3. try/catch pay + `handleFirstCashoutResult` 回滚
**不要**在普通流程中间用 `if ($package_id > 0) { firstCashout; }` 再接着跑普通逻辑 — 这是当前问题的根源。
---
## 验收清单
- [ ] `package_id>0` 且钱包 withdraw=0能成功提交 pay不报 Insufficient balance
- [ ] pay 申请失败package 回到 ready可再次提现
- [ ] pay 成功 + 回调package completedplayer `FIRST_CASH_DONE`
- [ ] 普通提现无 `package_id`:行为与改前一致
- [ ] `remark`/bizType 在 pay 侧仍为 `free_credit_first_cashout`,不冻结钱包

View File

@@ -0,0 +1,174 @@
---
name: firstCashout 合并提现
overview: 可以合并:推荐在 Withdraw 入口与 Pay 下单层统一,用 package_id 区分;活动档位状态机仍留在 FreeCreditsLogic不能把 FC 逻辑硬塞进 WithdrawService::apply 主流程中间。
todos:
- id: dto-package-id
content: WithdrawApplyDTO 增加 package_idWithdrawValidator 增加 FC scenepackage_id 替代 amount
status: completed
- id: withdraw-fc-branch
content: WithdrawService::apply 增加 applyFreeCreditsFirstCashout early return跳过 checkInfo/手续费/黑规则)
status: completed
- id: controller-unify
content: WithdrawController::apply 统一入口FreeCreditsController::firstCashout 改为兼容 alias
status: completed
- id: bank-persist
content: FC 分支复用 checkBankInfo与普通提现绑卡行为一致
status: completed
- id: pay-rollback-test
content: 补单测/集成测FC 无 withdraw 余额可提交、Pay 失败回滚 ready
status: completed
isProject: false
---
# firstCashout 能否合并进现有提现逻辑
## 结论(后端)
**可以合并,且推荐合并「入口 + 校验 + 绑卡 + Pay 下单」;不应把 Free Credits 编排塞进 [`WithdrawService::apply`](slot_console/app/service/WithdrawService.php) 主流程中间。**
当前仓库状态:**尚未合并**——仍是双入口:
| 入口 | 现状 |
|------|------|
| [`POST /api/free-credits/first-cashout`](slot_console/app/api/controller/FreeCreditsController.php) | `FreeCreditsLogic::firstCashout` 完整编排 |
| [`POST /api/withdraw/apply`](slot_console/app/api/controller/WithdrawController.php) | `WithdrawService::apply`,无 `package_id` |
Pay 层**已经统一**:两类提现最终都走 [`WithdrawalOrderEntity::apply`](slot_pay/app/entity/WithdrawalOrderEntity.php),靠 `bizType=free_credit_first_cashout` 跳过 `withdrawFrozen` 并走独立 MQ 回调。
---
## 为什么「可以」合并
C 端参数与需求 §11 一致:独立提现页 = 普通提现页精简版,收款字段相同,仅差:
| 字段 | 普通提现 | Free Credits 第一档 |
|------|----------|----------------------|
| `amount` | 用户输入 | **不传**,服务端取 package |
| `package_id` | 无 | **必填** |
因此用 **同一 `POST /api/withdraw/apply` + 可选 `package_id`** 区分业务是合理契约。
---
## 为什么不能「整段并入」WithdrawService::apply
[`WithdrawService::apply`](slot_console/app/service/WithdrawService.php) 当前顺序L164219
1. `checkBankInfo`
2. **`checkInfo`(校验钱包 withdraw 余额 ≥ amount**
3. 黑规则、`getAmountAndFee`(手续费)
4. `PayService::apply`
Free Credits 第一档资金在**活动池**,不在普通 `withdraw` 余额。若在中间插入 `firstCashout` 而不 **early return**,会先被 `checkInfo` 打成 `Insufficient balance`(评审计划已记录为 P0
此外 FC 固定规则与普通提现不同:
| 项 | 普通提现 | FC 第一档 |
|----|----------|-----------|
| 金额来源 | 用户 `amount` | `package->amount_qf` |
| 手续费 | `getAmountAndFee` | **0** |
| 审核 | 动态 `getAuditType` + 黑规则 | **auditType=2** |
| 钱包冻结 | 有 | **无**pay 侧 bizType 分支) |
| 活动状态 | 无 | `markFirstCashoutProcessing` / 失败回滚 |
| Pay 失败回滚 | 钱包解冻 | **`handleFirstCashoutResult` 恢复 ready** |
这些差异属于 **Logic 编排**,符合 [`backend-layering`](file:///Users/ray/.cursor/rules/backend-layering.mdc):不应把 `FreeCreditsLogic` 整段搬进 `WithdrawService` 当「又一层 Service」。
---
## 推荐合并结构
```mermaid
flowchart TB
Client["POST /api/withdraw/apply"]
Client --> Branch{package_id 存在?}
Branch -->|否| Normal["WithdrawService::apply 原逻辑"]
Branch -->|是| FC["WithdrawService::applyFreeCreditsFirstCashout"]
FC --> Mark["FreeCreditsLogic::markFirstCashoutProcessing"]
FC --> Pay["PayService::apply bizType=free_credit_first_cashout"]
Normal --> Pay2["PayService::apply 普通"]
Pay --> PayEntity["slot_pay WithdrawalOrderEntity"]
Pay2 --> PayEntity
```
### 合并层(推荐做)
1. **[`WithdrawController::apply`](slot_console/app/api/controller/WithdrawController.php)**
-`package_id` → 走 FC 分支(或 DTO 带 `package_id` 后交给 Service early return
-`package_id` → 现有普通提现
2. **[`WithdrawValidator`](slot_console/app/api/validator/WithdrawValidator.php)**
- 新增 FC scene与普通 apply 对称,把 `amount` 换成 `package_id``SCENE_APPLY_CASH_FC` 等)
3. **[`WithdrawApplyDTO`](slot_console/app/api/dto/request/WithdrawApplyDTO.php)**
- 增加可选 `package_id`
4. **绑卡**
- FC 复用 `WithdrawService::checkBankInfo`(当前 `firstCashout` 只读绑卡、不写库,合并后应对齐普通提现)
5. **[`FreeCreditsController::firstCashout`](slot_console/app/api/controller/FreeCreditsController.php)**
- 保留为 **兼容 alias**(内部转调 withdraw apply或标记 deprecated
### 保持分离(必须)
- [`FreeCreditsLogic`](slot_console/app/api/logic/FreeCreditsLogic.php)`markFirstCashoutProcessing``handleFirstCashoutResult`、package 状态机、`assertEligibleParticipant`
- [`WithdrawService::applyFreeCreditsFirstCashout`](slot_console/app/service/WithdrawService.php)(新建私有方法):
- 跳过 `checkInfo`、黑规则、`getAmountAndFee`
- `amount = package->amount_qf``fee = 0``auditType = 2`
- try/catch Pay失败时 `handleFirstCashoutResult($orderId, false)`
### 已统一、无需再改
- **slot_pay**`bizType` / `remark` 分支跳过冻结、Success/Fail/Rejected → Console MQ
- **slot_console EventBus**`FreeCreditsFirstCashoutSuccess/Fail/Rejected``handleFirstCashoutResult`
---
## 不推荐的做法
在 [`WithdrawService::apply`](slot_console/app/service/WithdrawService.php) 中间写:
```php
$this->checkInfo(...);
// ...
if ($package_id > 0) {
(new FreeCreditsLogic())->firstCashout(...);
}
$amountInfo = $this->getAmountAndFee(...);
PayService::apply(...);
```
会导致余额校验失败、手续费错误、Pay 失败不回滚档位processing 卡死)。
---
## 与「单独提现」需求的关系
| 需求 | 合并后是否满足 |
|------|----------------|
| 不进入普通钱包§15.3 | 是,仍靠 pay `bizType` |
| 固定第一档金额§11.3 | 是,服务端取 package |
| 处理中不可重复提交§5.6 | 是,仍由 package status 控制 |
| 成功/失败/拒绝状态§20.2 | 是,回调逻辑不变 |
合并的是 **HTTP 入口与收款参数校验**,不是改掉「独立提现」的账务语义。
---
## 实施要点(若执行)
1. `WithdrawApplyDTO` 增加 `package_id`
2. `WithdrawService::apply` 在绑卡 + Redis 频控后 **early return**`applyFreeCreditsFirstCashout`
3. FC 分支内:先 `markFirstCashoutProcessing`,再 Paycatch 回滚
4. 单测FC 在 `withdraw=0` 时可提交Pay 失败 package 回 ready普通 apply 无回归
5. 文档:`/api/free-credits/first-cashout` → 指向 `/api/withdraw/apply` + `package_id`
---
## 验收清单
- `package_id>0` 且钱包可提现余额为 0可成功提交 pay
- pay 申请失败package 回到 `ready`,可重试
- pay 回调成功package `completed`player `FIRST_CASH_DONE`
- 不传 `package_id`:普通提现与现网一致
- pay 订单 `remark` 仍为 `free_credit_first_cashout`,不触发 `withdrawFrozen`

View File

@@ -0,0 +1,135 @@
---
name: firstCashout 合并评估
overview: 客户端入参与普通提现几乎一致(仅多 package_id、不传 amount推荐在 WithdrawController::apply 做薄入口合并并复用 WithdrawValidator编排仍留 FreeCreditsLogic不并入 WithdrawService::apply 内部。
todos:
- id: merge-withdraw-entry
content: WithdrawController::apply 增加 package_id 分支,委托 FreeCreditsLogic::firstCashout复用 WithdrawValidator 新增 scenetype 1/2/3/6 + package_id无 amount
status: completed
- id: align-bank-persist
content: firstCashout 改为复用 WithdrawService::checkBankInfo或抽 helper与普通提现一致写绑卡信息
status: completed
- id: deprecate-fc-endpoint
content: /api/free-credits/first-cashout 保留作兼容 alias 或标记 deprecated文档指向 /api/withdraw/apply?package_id=
status: completed
- id: keep-logic-split
content: FreeCreditsLogic 仍负责 package 状态机 + bizTypeWithdrawService::apply 不增加 Free Credits 分支
status: completed
isProject: false
---
# firstCashout 合并进现有提现接口 — 修订评估
## 用户反馈:客户端参数基本一致
对照 [`WithdrawValidator`](slot_console/app/api/validator/WithdrawValidator.php) 与 [`FreeCreditsValidator::SCENE_FIRST_CASHOUT`](slot_console/app/api/validator/FreeCreditsValidator.php)
| 字段 | 普通提现 apply | Free Credits firstCashout |
|------|----------------|---------------------------|
| `type` | require (1/2/3/6) | require (1/2/3/6) |
| `pay_net` | require (1/2/3) | Logic 使用Validator scene 未含(可补齐) |
| `user_name` / `cash_tag` | type=1 时 require | post 传入Logic 读取 |
| `btc` / `usdt` | type=2/3 时 require | 同上 |
| `paypal_*` / `email` | type=6 时 require | 同上 |
| `amount` | **require用户输入** | **不传,服务端取 package 金额** |
| `package_id` | 无 | **require活动档位 id** |
**结论**C 端独立提现页(需求 §11本来就是对普通提现页的精简——同一套收款字段只是隐藏 amount 输入框。从接口契约看,**完全可以用同一个 apply 入口**,用 `package_id` 有无区分业务类型。
---
## 仍建议合并的范围:入口 + 校验 + 组单,不是 WithdrawService 内部
```mermaid
flowchart TB
Client["C 端 POST /api/withdraw/apply"]
Client --> Branch{package_id 存在?}
Branch -->|是| FC["FreeCreditsLogic::firstCashout"]
Branch -->|否| WS["WithdrawService::apply"]
FC --> Pay["PayService::apply bizType=free_credit_first_cashout"]
WS --> Pay2["PayService::apply 普通"]
Pay --> PayEntity["WithdrawalOrderEntity::apply 已统一"]
Pay2 --> PayEntity
```
### 可以合并(推荐)
1. **统一入口**[`WithdrawController::apply`](slot_console/app/api/controller/WithdrawController.php) 检测 `package_id`,有则委托 `FreeCreditsLogic::firstCashout`,无则走 `WithdrawService::apply`
2. **统一校验**:在 `WithdrawValidator` 新增 scene与普通 apply 对称,仅把 `amount` 换成 `package_id`
- `SCENE_APPLY_CASH_FC` => `['package_id', 'type', 'user_name', 'cash_tag']`
- `SCENE_APPLY_BTC_FC` => `['package_id', 'type', 'btc']`
-
3. **统一绑卡写库**`firstCashout` 目前只读 `UserBankCardModel`;普通提现通过 `WithdrawService::checkBankInfo` 会更新绑卡。合并入口后应 **复用同一绑卡逻辑**,避免两套行为。
4. **统一 DTO**`WithdrawApplyDTO` 增加可选 `package_id` 字段即可,不必维护两套 post 结构。
### 不应合并进 WithdrawService::apply
编排差异仍在 Logic 层,不应塞进 [`WithdrawService::apply`](slot_console/app/service/WithdrawService.php)
| 仍分离的逻辑 | 原因 |
|-------------|------|
| 金额 | 普通:用户 amountFCpackage->amount_qf |
| 余额/手续费/VIP/黑规则 | 普通checkInfo + getAmountAndFeeFC跳过 |
| 活动状态 | FCmarkFirstCashoutProcessing / 失败回滚 |
| pay 回调 | 已通过 bizType 在 pay 层分支,无需 console 再分 |
---
## 推荐实现(修订后方案 B
[`WithdrawController::apply`](slot_console/app/api/controller/WithdrawController.php)
```php
public function apply(Request $request)
{
$post = $request->post();
$type = input('type', 1);
if (!empty($post['package_id'])) {
// 复用 WithdrawValidator 的 FC scene无 amount
$error = $this->validate(WithdrawValidator::SCENE_APPLY_CASH_FC /* 按 type */, $post);
if ($error !== true) {
return $this->errorCode(ErrorCode::PARAMS_ERROR, $error);
}
return $this->success(
(new FreeCreditsLogic())->firstCashout(
$request->userEntity->uid,
(int) $post['package_id'],
$post
),
'Submitted successfully! ...'
);
}
// 原有普通提现
$error = $this->validate($type, $post);
// ...
}
```
[`FreeCreditsLogic::firstCashout`](slot_console/app/api/logic/FreeCreditsLogic.php) 内部改动:
- 绑卡:改为调用 `WithdrawService``checkBankInfo`(需将 `checkBankInfo` 改为 `protected` 公开方法,或抽到 helper
- 其余不变package 校验、固定金额、`bizType`、状态机。
[`FreeCreditsController::firstCashout`](slot_console/app/api/controller/FreeCreditsController.php)
- 保留为 **兼容 alias**(内部同样调 Logic或直接 deprecated 指向 withdraw apply。
---
## 与初版评估的差异
| 初版 | 修订 |
|------|------|
| 方案 A 推荐保持双入口 | **方案 B 升为推荐** — 参数一致,双入口无必要 |
| 强调「参数/校验不同故难合并」 | 参数 **高度重合**,差异仅 `package_id` vs `amount`;校验可共用 Validator scene |
| 合并障碍在入口层 | 合并障碍仅在 **WithdrawService 内部编排**,入口层应合并 |
---
## 验收
- C 端独立提现页调用 `POST /api/withdraw/apply`,传 `package_id + type + 收款字段`**不传 amount**
- 普通提现不传 `package_id`,行为与现网一致
- Free Credits 仍不走 `withdrawFrozen`,回调仍更新 package/player
- 绑卡信息与走普通 apply 后一致落库

View File

@@ -0,0 +1,247 @@
---
name: free credits activity edit
overview: 在管理后台活动配置编辑表单中为活动类型 11首充前免费余额定格与分档释放 / Free Credits增加专属表单分支并补齐字典与服务端校验金额输入沿用 type==10 的「美元小数 → 千分位整数」模式,写入 ext_config 的 _qf 后缀键,与 slot_console `FreeCreditsLogic::configAmount()` 的读优先级一致。
todos:
- id: dict-activity-type-11
content: 字典 sm_system_dict_data 追加 code='activity_type' 的 value=11 / label='Free Credits首充前免费余额'DB 或字典管理页)
status: completed
- id: edit-vue-type11-form
content: edit.vue 增加 v-if=type==11 的表单块6 字段 + Banner
status: completed
- id: edit-vue-skip-goods
content: edit.vue 让 type==11 跳过 goods 区块:扩展 onlyGift / 调整「添加赠送」与 goods 卡片的 v-if
status: completed
- id: edit-vue-submit-conv
content: edit.vue submit() 增加 type==11 的金额 ×1000 写入 _qf 键、清空 goods
status: completed
- id: edit-vue-setform-conv
content: edit.vue setFormData() 增加 type==11 的 _qf ÷1000 回填还原
status: completed
- id: validate-free-credits-ext
content: ActivityValidate 增加 checkFreeCreditsExt(extConfig) 方法含必填、非负、max_unlock_per_recharge≥1、first_cash ≤ recharge_unlock 约束
status: completed
- id: controller-trigger-ext-check
content: ActivityController::save / update 在 checkData 后按 type==11 调用 checkFreeCreditsExtupdate 兼容仅改状态请求
status: completed
- id: verify-end-to-end
content: 本地验证:新建/编辑/必填/业务约束/类型切换/C 端 FreeCreditsLogic 读取
status: completed
isProject: false
---
# Free Credits 活动后台编辑落地计划
## 目标
让运营在「活动管理」编辑弹窗里选活动类型 `11`(首充前免费余额)时,能直接编辑需求文档第 17 节列出的所有配置项;保存后落到 `s_recharge_gift_config.ext_config` JSON 字段C 端 `FreeCreditsLogic` 立即生效。
## 现状要点
- `slot_console` 已实现 `RechargeGiftConfigModel::TYPE_FREE_CREDITS = 11``FreeCreditsLogic`、运行时配置读取(`ext_config.{key}_qf` 优先)。
- `slot_admin` 后端 [ActivityController](backend/slot_admin/app/game/controller/ActivityController.php) 走 `slotLib\services\ActivityService` 透传到 `slot_console innerapi/activity/*``ext_config` 已原样落库,**不需要改动 slot_console**。
- 管理前端 [edit.vue](backend/slot_admin_vue/src/views/game/activity/edit.vue) 现仅对 6 / 9 / 10 做了 `v-if` 分支,`type==11` 无任何 UI字典 `activity_type` 也无 value=11 条目。
## 字段映射type=11 专属 `ext_config`
UI 输入用美元小数,提交时 ×1000 写入 `_qf` 键(与 type==10 模式一致;`FreeCreditsLogic::configAmount()` 优先读 `_qf`
- `win_threshold_qf` ← 首笔赢取门槛(默认 $50
- `recharge_unlock_amount_qf` ← 累计充值解锁第一档(默认 $50
- `first_cash_amount_qf` ← 第一档免打码金额(默认 $20
- `package_amount_qf` ← 后续每档拆分金额(默认 $10
- `subsequent_min_recharge_qf` ← 解锁下一档单笔充值下限(默认 $10
- `max_unlock_per_recharge` ← 整数,每笔充值最多解锁档数(默认 1**不走 _qf**
- `banner_image` ← Free Play to Go 弹窗 Banner 图片 URL可空
## 改动清单
### 1. 字典:追加 `activity_type` value=11
在系统管理「字典管理 → activity_type」以有不需要再执行了
### 2. 前端:[backend/slot_admin_vue/src/views/game/activity/edit.vue](backend/slot_admin_vue/src/views/game/activity/edit.vue)
#### 2.1 增加 type==11 表单块
参考 [edit.vue line 108-123](backend/slot_admin_vue/src/views/game/activity/edit.vue) type==10 的写法,新增:
```vue
<template v-if="formData.type == 11">
<a-col :span="24">
<a-form-item label="首笔赢取门槛($)" help="免费余额曾达到该值后解锁首页 Withdraw" :rules="[{ required: true, message: '必填' }]">
<a-input-number v-model="formData.ext_config.win_threshold" placeholder="如 50" :min="0" />
</a-form-item>
<a-form-item label="充值解锁门槛($)" help="累计真实充值满该金额释放第一档" :rules="[{ required: true, message: '必填' }]">
<a-input-number v-model="formData.ext_config.recharge_unlock_amount" placeholder="如 50" :min="0" />
</a-form-item>
<a-form-item label="免打码提现额($)" help="第一档可免打码直接提现金额" :rules="[{ required: true, message: '必填' }]">
<a-input-number v-model="formData.ext_config.first_cash_amount" placeholder="如 20" :min="0" />
</a-form-item>
<a-form-item label="解锁拆分金额($)" help="后续每档释放金额" :rules="[{ required: true, message: '必填' }]">
<a-input-number v-model="formData.ext_config.package_amount" placeholder="如 10" :min="0" />
</a-form-item>
<a-form-item label="后续解锁最小充值($)" help="单笔充值达到该金额才解锁下一档">
<a-input-number v-model="formData.ext_config.subsequent_min_recharge" placeholder="如 10" :min="0" />
</a-form-item>
<a-form-item label="每笔最多解锁档数" help="防止一笔充值解锁多档">
<a-input-number v-model="formData.ext_config.max_unlock_per_recharge" placeholder="如 1" :min="1" :precision="0" />
</a-form-item>
<a-form-item label="Banner 图片" help="Free Play to Go 底部弹窗 Banner">
<sa-upload-image v-model="formData.ext_config.banner_image" :limit="1" :multiple="false" />
</a-form-item>
</a-col>
</template>
```
#### 2.2 让 type==11 跳过 goods 区块
- [edit.vue line 60](backend/slot_admin_vue/src/views/game/activity/edit.vue) `onlyGift` computed 追加 `|| formData.type == 11`
```js
let onlyGift = computed(() => {
return formData.type == 7 || formData.type == 8 || formData.type == 9 || formData.type == 11;
})
```
- [edit.vue line 125](backend/slot_admin_vue/src/views/game/activity/edit.vue) 把「添加赠送」按钮与下方 `<a-row v-else>` 的 goods 卡片包成一组条件,排除 type==10 和 type==11
```vue
<template v-if="formData.type !== 10 && formData.type !== 11">
<a-button type="primary" ... @click="add()">添加赠送</a-button>
</template>
<a-row :gutter="20" v-if="formData.type !== 9 && formData.type !== 10 && formData.type !== 11">
...goods 卡片...
</a-row>
```
(保留原 type==9 的 exchange 表格 v-if 不变。)
#### 2.3 `submit()` 中追加 type==11 的金额 ×1000 转换
[edit.vue line 370](backend/slot_admin_vue/src/views/game/activity/edit.vue) 类似 type==10 的处理,把 6 个美元字段写到 `_qf` 键,整数字段原样保留:
```js
if (formData.type === 11) {
const e = data.ext_config || {};
const toQf = (v) => v === '' || v == null ? undefined : Math.round(Number(v) * 1000);
data.ext_config = {
win_threshold_qf: toQf(e.win_threshold),
recharge_unlock_amount_qf: toQf(e.recharge_unlock_amount),
first_cash_amount_qf: toQf(e.first_cash_amount),
package_amount_qf: toQf(e.package_amount),
subsequent_min_recharge_qf: toQf(e.subsequent_min_recharge),
max_unlock_per_recharge: e.max_unlock_per_recharge == null ? undefined : Math.round(Number(e.max_unlock_per_recharge)),
banner_image: e.banner_image || '',
};
data.goods = [];
}
```
#### 2.4 `setFormData()` 中追加 type==11 的回填还原
[edit.vue line 344-351](backend/slot_admin_vue/src/views/game/activity/edit.vue) 仿照 type==10
```js
if (data.type === 11 && data.ext_config) {
const e = data.ext_config;
formData.ext_config = {
win_threshold: e.win_threshold_qf != null ? e.win_threshold_qf / 1000 : e.win_threshold,
recharge_unlock_amount: e.recharge_unlock_amount_qf != null ? e.recharge_unlock_amount_qf / 1000 : e.recharge_unlock_amount,
first_cash_amount: e.first_cash_amount_qf != null ? e.first_cash_amount_qf / 1000 : e.first_cash_amount,
package_amount: e.package_amount_qf != null ? e.package_amount_qf / 1000 : e.package_amount,
subsequent_min_recharge: e.subsequent_min_recharge_qf != null ? e.subsequent_min_recharge_qf / 1000 : e.subsequent_min_recharge,
max_unlock_per_recharge: e.max_unlock_per_recharge ?? 1,
banner_image: e.banner_image || '',
};
}
```
### 3. 后端校验:[backend/slot_admin/app/game/validate/ActivityValidate.php](backend/slot_admin/app/game/validate/ActivityValidate.php)
ThinkValidate 对嵌套 JSON 支持有限,采用「在 Controller 按 `type` 触发额外校验」+「Validate 提供专用方法」的模式,避免污染既有 scene。
#### 3.1 ActivityValidate 增加一个公开方法
```php
/**
* Free Creditstype=11专用 ext_config 校验。
*
* @param array $extConfig 前端提交的 ext_config金额已 ×1000 写入 _qf 键
* @throws \think\exception\ValidateException
*/
public function checkFreeCreditsExt(array $extConfig): void
{
$required = [
'win_threshold_qf' => '首笔赢取门槛',
'recharge_unlock_amount_qf' => '充值解锁门槛',
'first_cash_amount_qf' => '免打码提现额',
'package_amount_qf' => '解锁拆分金额',
'subsequent_min_recharge_qf' => '后续解锁最小充值',
'max_unlock_per_recharge' => '每笔最多解锁档数',
];
foreach ($required as $key => $label) {
if (!isset($extConfig[$key]) || $extConfig[$key] === '' || (int)$extConfig[$key] < 0) {
throw new \think\exception\ValidateException("{$label}必须填写且为非负数");
}
}
if ((int)$extConfig['max_unlock_per_recharge'] < 1) {
throw new \think\exception\ValidateException('每笔最多解锁档数必须 ≥ 1');
}
// 业务约束:免打码提现额 ≤ 累计充值解锁门槛
if ((int)$extConfig['first_cash_amount_qf'] > (int)$extConfig['recharge_unlock_amount_qf']) {
throw new \think\exception\ValidateException('免打码提现额不能超过充值解锁门槛');
}
}
```
#### 3.2 ActivityController save / update 触发
[ActivityController::save / update](backend/slot_admin/app/game/controller/ActivityController.php) 在 `checkData()` 之后追加:
```php
if ((int)input('type') === 11) {
$this->validate->checkFreeCreditsExt((array)input('ext_config', []));
}
```
`update` 里同样判断,且要兼容仅改状态的请求(无 `updateData` 时不校验 ext_config
```php
if (!empty(input('updateData')) && (int)input('type') === 11) {
$this->validate->checkFreeCreditsExt((array)input('ext_config', []));
}
```
### 4. 不需要改的部分
- `slot_console``ActivityConfigEntity::updateConfig` 已原样写入 `ext_config`,无变更。
- `Consts::ACTIVITY_TYPE_*` 不必新增 11C 端已通过 `RechargeGiftConfigModel::TYPE_FREE_CREDITS` 引用。
- 不新增独立菜单页,复用通用「活动管理」编辑弹窗。
## 数据流
```mermaid
flowchart LR
edit[edit.vue type=11 form] -->|"美元×1000 → _qf"| save["POST /game/activity/save|update"]
save --> ctrl[ActivityController]
ctrl -->|"checkFreeCreditsExt"| validate[ActivityValidate]
ctrl --> svc[ActivityService HTTP]
svc --> console["slot_console innerapi/activity/update"]
console --> entity[ActivityConfigEntity::updateConfig]
entity --> db["s_recharge_gift_config.ext_config"]
db --> fc["FreeCreditsLogic::configAmount key_qf 优先"]
```
## 验收
- 新建 type=11 活动:填写 6 字段 + Banner保存成功DB `ext_config``*_qf` 整数 + `max_unlock_per_recharge` + `banner_image`
- 编辑回填:再次打开同一条活动,美元字段显示为原值(如 50 / 20 / 10整数字段为 1Banner 显示已上传图。
- 必填校验:清空任一必填项保存,返回明确错误信息(如「首笔赢取门槛必须填写且为非负数」)。
- 业务约束:免打码提现额填 60、充值解锁门槛填 50保存被拒。
- 类型切换type 选 11→1再切回 11goods 区块不出现formData 不污染;保存 type==1 时 `_qf` 字段不会被带到 ext_config。
- C 端:调 `FreeCreditsLogic::status($uid)`,门槛 / 第一档金额 / 解锁拆分金额能读到刚配的值。
- type 字典管理后台编辑弹窗活动类型下拉出现「Free Credits首充前免费余额」选项。

View File

@@ -0,0 +1,182 @@
---
name: free credits release
overview: 为“首充前免费余额定格与分档释放”准备开发方案,按钱包账务、充值提现事件、客户端 API、后台配置统计分阶段落地。重点遵循现有后端分层规则避免把业务编排错误地下沉到 Service。
todos:
- id: confirm-wallet-fields
content: 按已确认口径使用 deposit_balance + withdraw_balance 作为免费余额
status: completed
- id: design-schema
content: 设计独立 Free Credits 活动主表、档位明细表、流水关联和旧活动 ID 关联
status: completed
- id: implement-console-core
content: 在 slot_console 实现活动领域模型、定格、解锁、Claim 和状态查询 Logic
status: pending
- id: wire-recharge
content: 接入 slot_pay/slot_console 充值成功链路并保证首充定格幂等
status: completed
- id: wire-cashout
content: 实现第一档独立提现订单和回调状态同步
status: completed
- id: add-console-apis
content: 补充大厅状态、活动入口、后台配置统计相关 API
status: completed
- id: test-acceptance
content: 按需求文档核心规则和账务验收补测试/联调用例
status: completed
isProject: false
---
# 首充前免费余额定格与分档释放开发准备
## 目标范围
本次需求核心实现应以后端账务和状态机为主,前端展示依赖新增/扩展 API。主要涉及
- [`/Users/ray/Documents/project/www/slot/slot_console`](slot_console)Free Credits 活动领域模型、Pool、档位、状态机、定格/释放/Claim 编排、大厅/提现页接口、活动入口、配置读取、后台统计入口。
- [`/Users/ray/Documents/project/www/slot/slot_wallet`](slot_wallet):只提供钱包原子能力,例如余额扣减/入账、钱包流水、Deposit Balance 入账、Y1 流水任务创建;不放活动领域模型和活动状态机。
- [`/Users/ray/Documents/project/www/slot/slot_pay`](slot_pay):充值成功异步通知、第一档独立提现订单。
- [`/Users/ray/Documents/project/www/slot/backend/slot_admin`](backend/slot_admin):运营后台配置和统计页,如该项目负责管理端。
- 客户端 UI 由前端人员在其它仓库实现,本仓库只提供后端接口和状态数据。
已有统一活动管理表可作为关联来源:
- `s_common.s_recharge_gift_config`:现有充值赠送活动主表。
- `recharge_gift_player`:现有充值赠送活动参与玩家表。
本需求不直接复用这两张表承载 Free Credits 账务状态,采用独立 Free Credits 表设计,并保留与旧活动 ID 的关联,避免把“首充前免费余额定格”与已有充值赠送活动规则混在同一张参与表里。
## 数据表 DDL 草案
金额字段建议沿用现有活动表中的 `_qf` 口径,按千分位整数保存,避免小数精度问题。
```sql
CREATE TABLE `free_credits_player` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`activity_id` bigint unsigned NOT NULL DEFAULT '0' COMMENT '关联 s_recharge_gift_config.id',
`uid` bigint unsigned NOT NULL DEFAULT '0' COMMENT '用户ID',
`source` varchar(64) NOT NULL DEFAULT '' COMMENT '渠道',
`model_id` int unsigned NOT NULL DEFAULT '0' COMMENT '游戏模型ID',
`home_withdraw_unlocked` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '首页Withdraw是否已解锁 0否 1是',
`frozen_amount_qf` bigint unsigned NOT NULL DEFAULT '0' COMMENT '首充时定格金额,千分位',
`first_cash_amount_qf` bigint unsigned NOT NULL DEFAULT '0' COMMENT '第一档免打码提现金额,千分位',
`first_recharge_order_id` varchar(64) NOT NULL DEFAULT '' COMMENT '触发定格的首笔充值订单号',
`first_recharge_time` datetime DEFAULT NULL COMMENT '首笔充值成功时间',
`first_cashout_order_id` varchar(64) NOT NULL DEFAULT '' COMMENT '第一档独立提现订单号',
`status` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '主状态 0未开始 1首页已解锁 2已定格 3待充值解锁 4第一档可提现 5第一档提现中 6第一档已提现 7后续释放中 10全部完成',
`completed_time` datetime DEFAULT NULL COMMENT '全部完成时间',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_activity_uid` (`activity_id`,`uid`),
KEY `idx_uid` (`uid`),
KEY `idx_activity_status` (`activity_id`,`status`),
KEY `idx_first_recharge_order` (`first_recharge_order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Free Credits用户活动主表';
```
```sql
CREATE TABLE `free_credits_package` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`player_id` bigint unsigned NOT NULL DEFAULT '0' COMMENT 'free_credits_player.id',
`activity_id` bigint unsigned NOT NULL DEFAULT '0' COMMENT '关联 s_recharge_gift_config.id',
`uid` bigint unsigned NOT NULL DEFAULT '0' COMMENT '用户ID',
`package_no` int unsigned NOT NULL DEFAULT '0' COMMENT '档位序号从1开始',
`package_type` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '档位类型 1第一档免打码提现 2后续释放档',
`amount_qf` bigint unsigned NOT NULL DEFAULT '0' COMMENT '档位金额,千分位',
`status` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '档位状态 0锁定 1可操作 2处理中 3已完成 4失败 5风控拒绝',
`withdraw_order_id` varchar(64) NOT NULL DEFAULT '' COMMENT '第一档提现订单号',
`claim_biz_id` varchar(64) NOT NULL DEFAULT '' COMMENT '后续档Claim入账幂等业务号',
`unlocked_time` datetime DEFAULT NULL COMMENT '解锁时间',
`claimed_time` datetime DEFAULT NULL COMMENT '领取时间',
`completed_time` datetime DEFAULT NULL COMMENT '完成时间',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_player_package` (`player_id`,`package_no`),
UNIQUE KEY `uniq_claim_biz` (`claim_biz_id`),
KEY `idx_uid_status` (`uid`,`status`),
KEY `idx_activity_status` (`activity_id`,`status`),
KEY `idx_withdraw_order` (`withdraw_order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Free Credits档位明细表';
```
## 建议数据流
```mermaid
flowchart TD
preDepositUser["未首充用户"] --> winThreshold["免费余额曾达到门槛"]
winThreshold --> homeUnlocked["首页 Withdraw 解锁"]
preDepositUser --> firstRecharge["任意入口首笔真实充值成功"]
firstRecharge --> freezeFreeCredits["定格当前免费余额"]
freezeFreeCredits --> freeCreditsPool["slot_console 保存 Free Credits Pool 与档位"]
firstRecharge --> walletTotalRecharge["查询钱包累计充值总额"]
walletTotalRecharge --> firstReady["累计充值满门槛释放第一档"]
firstReady --> firstCashout["第一档独立提现"]
firstCashout --> laterPackages["后续档位按充值解锁"]
laterPackages --> claimToWallet["Claim 入 Deposit Balance"]
claimToWallet --> y1Task["创建 Y1 流水任务"]
```
## 后端落地方案
1.`slot_console` 新增独立 Free Credits 活动领域模型。
- 新增用户池主表,保存 `activity_id``uid`、定格金额、首充订单、主状态、首页解锁标记、完成时间等;主表不保存累计充值。
- 新增档位明细表,一档一行,保存序号、类型、金额、状态、关联提现单/Claim 流水、解锁/完成时间。
- `activity_id` 关联现有 `s_common.s_recharge_gift_config` 或后台活动配置 ID但 Free Credits 的进度、档位和账务状态不写入 `recharge_gift_player`
- 表归属按 `slot_console` 现有业务库和活动模块规范处理;`slot_wallet` 不新增 Free Credits 活动表。
2.`slot_console` 增加 Logic 编排定格、解锁、Claim。
- Controller 只做请求接收、Validate、DTO、统一响应。
- Validate 处理参数必填/类型/枚举。
- DTO 只承载已校验字段。
- Logic 负责首充定格、查询钱包累计充值总额、档位状态流转、事务和幂等。
- Model 负责查询/写入和状态条件更新。
- Service 仅用于已有公共能力,如调用钱包原子 API、配置读取、外部系统封装不新增单纯转发 Service。
- 调用 `slot_wallet` 时只请求余额变更、钱包流水、入 Deposit Balance、创建 Y1 任务等钱包能力,不把活动状态写入钱包服务。
3. 接入充值成功链路。
- 现有充值成功链路在 [`/Users/ray/Documents/project/www/slot/slot_pay/app/command/EventRecharge.php`](slot_pay/app/command/EventRecharge.php) 调用钱包充值入账。
- 充值成功后由 `slot_pay` 或事件消费者通知 `slot_console`,由 `slot_console` 判断是否首笔真实充值并触发定格。
- 定格需要调用 `slot_wallet` 原子能力扣减当前免费余额并写钱包流水,再由 `slot_console` 落 Free Credits Pool 和档位。
- 第一档门槛通过调用钱包查询用户累计充值总额判断;`slot_console` 主表不保存累计充值,也不新增充值事件明细表。
4. 实现第一档独立提现。
- 第一档不进入普通钱包余额,创建独立提现订单类型 `free_credit_first_cashout`
- 需要在 `slot_pay` 的提现订单模型/实体中支持新订单类型,提现处理中防重复,成功/失败/拒绝回写档位状态。
- 第一档提现成功后关闭首页状态条,但活动入口保留到所有档位完成。
5. 实现后续档位解锁和 Claim。
- 后续每笔符合条件真实充值最多解锁下一档,按配置控制最小充值金额和每笔最多解锁档数。
- Claim 由 `slot_console` 校验档位状态和顺序后,调用 `slot_wallet` 将档位金额入 `Deposit Balance`,创建 Deposit Lot 和 Y1 Wager Task。
- `slot_console` 负责 Claim 幂等和档位状态流转;`slot_wallet` 负责钱包入账幂等和流水一致性。失败时档位保持 `ready`,重复点击不能重复入账。
6. 增加客户端查询与操作 API。
- 查询用户活动状态首页状态条、活动入口、Free Play to Go 弹窗需要同一份状态数据。
- 操作 API第一档提现、后续 Claim、后续 Unlock 跳充值。
- `slot_console` 可在 [`/Users/ray/Documents/project/www/slot/slot_console/app/napi/controller/LobbyController.php`](slot_console/app/napi/controller/LobbyController.php) 或独立 API 暴露大厅所需数据。
7. 增加后台配置与统计。
- 配置项优先绑定到现有统一活动管理的活动 IDFree Credits 专属配置包括活动开关、首笔赢取门槛、充值解锁门槛、免打码提现额、拆分金额、后续最小充值、每笔最多解锁档数、Y1 倍数、Banner。
- 统计项:定格人数、完成提现人数、全部完成人数、定格总金额、已提现金额、已领取金额、待释放金额。
- 筛选排序按文档要求实现。
## 已确认口径
- 免费余额 = `deposit_balance + withdraw_balance`,即钱包余额。
- 第一档不需要流水,完全绕开普通可提现余额计算。
- 第一档解锁通过充值成功异步通知驱动,并调用钱包查询累计充值总额判断是否达到门槛。
- Free Credits 定格逻辑以独立活动配置为准。
- 客户端 UI 由前端人员处理,本仓库不包含对应页面代码。
## 关键风险与需确认点
- 文档中的 `Deposite Balance / Deposite Lot` 建议统一确认是否为历史命名还是拼写问题。
## 建议开发顺序
1. 先实现 `slot_console` 活动数据模型、配置读取、状态机和只读查询接口。
2. 梳理并补齐 `slot_wallet` 需要暴露的钱包原子能力,包括查询累计充值总额、冻结/扣减免费余额、入 Deposit Balance、创建 Y1 任务和幂等流水。
3. 接入充值成功链路,完成 `slot_pay``slot_console` 的事件通知、首充定格和调用钱包累计充值总额解锁第一档。
4. 实现第一档独立提现链路和提现回调到 `slot_console` 的状态同步。
5. 实现后续档位解锁、Claim 调用钱包入账和 Y1 流水任务创建。
6. 补 `slot_console` 大厅/活动入口接口、后台统计、客户端 UI、文案、埋点和验收用例。

View File

@@ -0,0 +1,317 @@
---
name: free credits 后台统计页
overview: 实现需求 §18 的 Free Credits 后台统计与展示:在 slot_console 增强 innerapi加筛选、加列表字段、富化累计充值与档位聚合slot_lib 新增 FreeCreditsService 并给 WalletService 补一个 statistics 批量方法slot_admin 新增 FreeCreditsStatsController 代理slot_admin_vue 新增 views/game/freeCreditsStats/index.vue 一页搞定,顶部统计走 sa-table 的 otherData 模式。
todos:
- id: slot-console-stats-logic
content: slot_console 新建 innerapi/logic/FreeCreditsStatsLogic.php封装 statistics + list 的查询编排(含 status>=2 口径、批量 package 聚合 SQL
status: completed
- id: slot-console-list-enrich
content: slot_console FreeCreditsController::list 加筛选 + 字段富化first_cash_status / progress / claimed / first_cashout / remaining / total_recharge
status: completed
- id: slot-console-stats-filter
content: slot_console FreeCreditsController::statistics 加 source / first_recharge_time / status 等筛选frozen_user_count 改为 status>=2
status: completed
- id: slot-lib-wallet-stats
content: slot_lib WalletService 新增 statistics(uids, currency) 方法 → 调 /api/wallet/statistics
status: completed
- id: slot-lib-free-credits-service
content: slot_lib 新建 FreeCreditsServicebasePath=innerapi/free-credits含 list + statistics
status: completed
- id: slot-admin-controller
content: slot_admin 新建 game/controller/FreeCreditsStatsController.phpindex 一次调两个 service 合并 otherData 返回
status: completed
- id: slot-admin-vue-api
content: slot_admin_vue 新建 api/game/freeCreditsStats.js导出 getPageList
status: completed
- id: slot-admin-vue-page
content: "slot_admin_vue 新建 views/game/freeCreditsStats/index.vuesa-table + #tableAfterButtons 顶部 7 统计 + 12 列表 + 筛选 + 排序白名单"
status: completed
- id: menu-permission
content: 在 sm_system_menu 加 1 条 L 菜单 + 1 条 B 按钮码(/game/freeCreditsStats/index并分配角色
status: completed
- id: manual-verify
content: docker 内 A/B/C 三种玩家手测默认排序、7 项统计、筛选联动、排序白名单、权限拦截
status: completed
isProject: false
---
## 数据流
```mermaid
flowchart LR
vue[freeCreditsStats/index.vue sa-table]
vue -->|"POST /game/FreeCreditsStats/index"| ctrl[FreeCreditsStatsController]
ctrl -->|"FreeCreditsService::list"| svc[slot_lib FreeCreditsService]
ctrl -->|"FreeCreditsService::statistics"| svc
svc -->|"POST innerapi/free-credits/list"| console[slot_console FreeCreditsController]
svc -->|"POST innerapi/free-credits/statistics"| console
console -->|"WalletService statistics uids currency"| wallet["slot_wallet api/wallet/statistics"]
console -->|"sum on free_credits_package"| db[(s_common.free_credits_player + free_credits_package)]
```
slot_admin Controller 一次代理两个 innerapi合并成 `{ data, total, otherData: <statistics> }` 给 sa-table避免前端两次请求。
## 字段契约(最终对外)
### `/game/FreeCreditsStats/index` 请求
筛选(与 §18.3 对齐)
- `uid` 精确
- `source` 字符串(沿用 channel_game_model + source 二级选择)
- `activity_id` 可选(默认取当前生效的 type=11 活动)
- `first_recharge_time` 范围 `[start, end]``whereBetween`
- `status` 数组player.status0/1/2/3/4/5/6/7/10
- `first_cash_status` 数组package.status0/1/2/3/4/5限定 `package_no=1`
- `is_completed` 0/1status=10 与否)
- `page`, `limit`, `orderBy`, `orderType`
排序
- DB 可排序:`frozen_amount_qf``first_recharge_time`(默认 `first_recharge_time desc`
- 其它字段(进度、剩余、累计充值)派生,前端不开启排序
### 响应
```json
{
"data": [{
"uid": 123,
"source": "us_01",
"frozen_amount_qf": 78500,
"first_cash_amount_qf": 20000,
"total_recharge_amount_qf": 30000,
"first_cash_status": 3,
"progress_done": 3,
"progress_total": 7,
"status": 7,
"remaining_amount_qf": 28500,
"claimed_amount_qf": 30000,
"first_recharge_time": "2026-05-12 11:23:01",
"completed_time": null
}],
"total": 240,
"otherData": {
"frozen_user_count": 240,
"first_cashout_user_count": 180,
"completed_user_count": 35,
"frozen_amount_qf": 18650000,
"first_cashout_amount_qf": 3520000,
"claimed_amount_qf": 8800000,
"pending_amount_qf": 6330000
}
}
```
金额字段一律以 `*_qf`(千分位整数)传到 VueVue 用 `/ 1000` + `toFixed(2)` 显示(与 edit.vue 同口径)。
---
## 改动清单
### 1. slot_console — 增强 innerapi
文件:[slot_console/app/innerapi/controller/FreeCreditsController.php](slot_console/app/innerapi/controller/FreeCreditsController.php)
#### 1.1 `statistics()` 加筛选
参照需求 §18.1,新增可选参数并贯穿到所有子查询:
- `activity_id``source``first_recharge_time_start``first_recharge_time_end``uid`
- 子查询 `frozenTotal / completedCount / firstCashoutCount / firstCashoutAmount / claimedAmount` 全部基于同一个 `playerIds` 数组(按筛选后取出)
- `frozen_user_count` 口径改为 `status >= STATUS_FROZEN(2)` 的玩家数(与需求 "已创建 Free Credits Pool" 一致;当前实现把 status=1 也计入,定义不准)
#### 1.2 `list()` 加筛选 + 字段富化
- 新增筛选参数:`source``first_recharge_time` 范围、`status[]``first_cash_status[]``is_completed``orderBy/orderType`(白名单:`first_recharge_time`, `frozen_amount_qf`
- 输出每行追加:
- `first_cash_status`:对应 `free_credits_package.status` where `player_id=? AND package_no=1`
- `progress_done` / `progress_total``SUM(CASE WHEN status=3 THEN 1 ELSE 0 END)` / `COUNT(*)`,一次 `GROUP BY player_id` 跑完
- `claimed_amount_qf``SUM(amount_qf) WHERE package_type=2 AND status=3 GROUP BY player_id`
- `first_cashout_amount_qf``SUM(amount_qf) WHERE package_type=1 AND status=3 GROUP BY player_id`
- `remaining_amount_qf``frozen_amount_qf - first_cashout_amount_qf - claimed_amount_qf`
- `total_recharge_amount_qf`:调用 `WalletService::statistics(uids, currency='USD')`,把 `total_deposit` 映射进来。currency 默认 'USD'(活动只面向美国 RMGcurrency 字段后续如多币种再扩展)
- 一次性聚合查询,避免 N+1
```text
SELECT player_id,
SUM(CASE WHEN status=3 THEN 1 ELSE 0 END) AS progress_done,
COUNT(*) AS progress_total,
SUM(CASE WHEN package_type=1 AND status=3 THEN amount_qf ELSE 0 END) AS first_cashout_amount_qf,
SUM(CASE WHEN package_type=2 AND status=3 THEN amount_qf ELSE 0 END) AS claimed_amount_qf,
MAX(CASE WHEN package_no=1 THEN status END) AS first_cash_status
FROM s_common.free_credits_package
WHERE player_id IN (...)
GROUP BY player_id
```
#### 1.3 控制器分层
按 backend-layering 规则,把 1.1 / 1.2 的查询编排沉到 Logic新增 [slot_console/app/innerapi/logic/FreeCreditsStatsLogic.php](slot_console/app/innerapi/logic/FreeCreditsStatsLogic.php)(或直接挂在已有 `api/logic/FreeCreditsLogic.php`建议新建避免膨胀Controller 只负责接参 / 调 Logic / 返回。
---
### 2. slot_lib — 新增 FreeCreditsService + 补 WalletService
#### 2.1 [slot_lib/src/services/FreeCreditsService.php](slot_lib/src/services/FreeCreditsService.php) 新建
```php
class FreeCreditsService extends BaseApiService
{
use SingletonService;
protected $hostKey = 'consoleApiHost';
protected $basePath = 'innerapi/free-credits';
public function statistics(array $params) { return $this->postAction('statistics', $params); }
public function list(array $params) { return $this->postAction('list', $params); }
}
```
理由:不与既有 `ActivityService::join/add/update` 混杂basePath 完全独立,匹配 slot_console 的路由。
#### 2.2 [slot_lib/src/services/WalletService.php](slot_lib/src/services/WalletService.php) 补 `statistics`
```php
public function statistics(array $uids, string $currency)
{
return $this->postAction('statistics', ['uids' => $uids, 'currency' => $currency]);
}
```
action 名 `statistics`URL `{walletApiHost}/api/wallet/statistics`,对应 slot_wallet `WalletController::statistics`。slot_console 侧 `FreeCreditsStatsLogic` 调用此方法。
---
### 3. slot_admin — 新增代理 Controller
文件:[backend/slot_admin/app/game/controller/FreeCreditsStatsController.php](backend/slot_admin/app/game/controller/FreeCreditsStatsController.php)
只做接参 + Service 调用 + 合并:
```php
class FreeCreditsStatsController extends AdminController
{
public function index(Request $request): Response
{
$params = $request->all();
$params['page'] = (int)$request->get('page', 1);
$params['limit'] = (int)$request->get('limit', 20);
$list = FreeCreditsService::getInstance()->list($params);
$stats = FreeCreditsService::getInstance()->statistics($params);
$list['otherData'] = $stats;
return $this->success($list);
}
}
```
- 不需要 Validate参数全部可选非法值 slot_console 侧拦)
- 自动路由路径 `/game/freeCreditsStats/index`
- 不新增 `export()` actionV1 不做导出)
---
### 4. slot_admin_vue — 新页 + API
#### 4.1 [backend/slot_admin_vue/src/api/game/freeCreditsStats.js](backend/slot_admin_vue/src/api/game/freeCreditsStats.js) 新建
```js
import request from '@/utils/request'
const url = '/game/freeCreditsStats'
export default {
getPageList: (params) => request.get(`${url}/index`, params),
}
```
#### 4.2 [backend/slot_admin_vue/src/views/game/freeCreditsStats/index.vue](backend/slot_admin_vue/src/views/game/freeCreditsStats/index.vue) 新建
骨架仿 `views/game/order/recharge/index.vue`
- `defineOptions({ name: 'game/freeCreditsStats/index' })`
- `<sa-table>` `options.api = api.getPageList``options.add` / `options.delete` 关闭
- `searchForm``uid``source`(用 `commonStore.allSourcesOptionsNoAll`)、`first_recharge_time``a-range-picker`)、`status``first_cash_status``is_completed`
- 顶部统计走 `#tableAfterButtons`
```vue
<template #tableAfterButtons>
<a-space>
<a-typography-text>定格人数{{ stats.frozen_user_count }}</a-typography-text>
<a-typography-text>完成提现人数{{ stats.first_cashout_user_count }}</a-typography-text>
<a-typography-text>全部完成人数{{ stats.completed_user_count }}</a-typography-text>
<a-typography-text>定格总金额${{ qfToDollar(stats.frozen_amount_qf) }}</a-typography-text>
<a-typography-text>已提现金额${{ qfToDollar(stats.first_cashout_amount_qf) }}</a-typography-text>
<a-typography-text>已领取金额${{ qfToDollar(stats.claimed_amount_qf) }}</a-typography-text>
<a-typography-text>待释放金额${{ qfToDollar(stats.pending_amount_qf) }}</a-typography-text>
</a-space>
</template>
```
- `stats = computed(() => crudRef.value?.getTableOtherData() ?? {})`
- 列定义12 列对齐 §18.2`status``first_cash_status` 直接用前端 map 表(不新建字典):
```js
const PLAYER_STATUS_MAP = {
0: '未触发', 1: 'Home Withdraw 已解锁', 2: '已定格', 3: '充值进行中',
4: '第一档可提现', 5: '第一档处理中', 6: '第一档已提现',
7: '后续档释放中', 10: '全部完成',
}
const PACKAGE_STATUS_MAP = {
0: '未解锁', 1: '可操作', 2: '处理中', 3: '已完成', 4: '失败', 5: '已拒绝',
}
```
- `qfToDollar = (v) => ((Number(v||0))/1000).toFixed(2)`
- 不再调单独的 stats 接口,`tableAfterButtons` 数据从 `otherData`
---
### 5. 字典与菜单
#### 5.1 字典:不新增
`status` / `first_cash_status` 直接走前端 map 表,避免与 `RechargeGiftConfigModel` 共用字典污染。
#### 5.2 菜单DB 表 `sm_system_menu` 追加(运营在「系统管理 → 菜单管理」操作即可)
需要的 2 条数据(指引性 SQL实际可走 UI
```sql
INSERT INTO sm_system_menu (parent_id, type, title, name, path, component, sort)
VALUES (<game_parent_id>, 'L', 'Free Credits 统计',
'game/freeCreditsStats/index', '/game/freeCreditsStats',
'game/freeCreditsStats/index', 50);
INSERT INTO sm_system_menu (parent_id, type, title, code)
VALUES (<leaf_id>, 'B', '列表', '/game/freeCreditsStats/index');
```
写完后给「超级管理员 / 运营」角色分配该菜单与按钮码。
---
## 不动的地方
- `slot_console` 既有 `FreeCreditsLogic` C 端逻辑、`free_credits_player` / `free_credits_package` 表结构、`ext_config` 配置读取等不动
- `s_recharge_gift_config` 不需要新增列
- `slot_pay` 不新增 innerapi不需要订单表精确口径wallet `total_deposit` 已足够)
- 现有 `ActivityController` 编辑表单type=11 分支)已落地,不动
- `RechargeOrderController` / `withdrawal` 等无关模块不动
## 验收(手测)
按 [dev-environment](.cursor/rules/dev-environment.mdc) 在 docker 内调试:
1. 准备 3 个测试账号A 未定格、B 已定格未提现首档、C 全部完成;各 source 至少一个
2. 访问 `/game/freeCreditsStats` 列表:
- 不传参 → 默认按 `first_recharge_time desc`A 不出现status<2 被过滤B / C 都在
- 顶部 7 个统计数字与逐条手算结果一致
- 列表里 `total_recharge_amount_qf` `slot_wallet.api/wallet/statistics` 直接拉的 `total_deposit` 一致
- `progress_done/total` 等于 DB `free_credits_package` 实际行数
3. 筛选
- `source=us_01` 列表与统计同步收敛
- `first_recharge_time` 范围统计 7 项随之变化
- `is_completed=1`列表只剩 C
- `first_cash_status=3`列表只剩第一档已成功的玩家
4. 排序分别点击定格金额」「定格时间列头order 切换其它字段不可排序
5. 权限用未授权账号访问 403授权后正常
6. 仅改活动状态时已存在的活动编辑场景回归一遍确认未触发 type=11 ext 校验路径回归

View File

@@ -0,0 +1,141 @@
---
name: Free Credits 老用户隐藏评审
overview: EventBus 写库确定参加、status 只读展示;在此基础上用环境变量 FREE_CREDITS_ENROLL_REG_AFTER 做注册时间门槛——regTime 晚于该时间的用户才有资格参加,否则一律 status=-1 且 EventBus 跳过写池。
todos:
- id: env-reg-cutoff
content: 新增 FREE_CREDITS_ENROLL_REG_AFTER 环境变量与 FreeCreditsLogic::isEligibleByRegTime(uid) 统一门禁
status: completed
- id: apply-gate-all-paths
content: 在 status、syncHomeWithdrawUnlocked、handleFreeCreditInit、advanceAfterRecharge、claim、firstCashout 入口应用注册时间门禁
status: completed
- id: fix-docs-lobby
content: 修正 FreeCreditsController PHPDoc含 status=-1 含老用户/未达注册门槛LobbyController 清理无用 import
status: completed
- id: guard-claim-cashout
content: 无资格或无 player 时 claim/firstCashout 返回明确业务错误
status: completed
- id: verify-reg-cutoff
content: 联调regTime 早于门槛 status=-1 且 EventBus 不建池;晚于门槛走 win/首充完整流程
status: completed
isProject: false
---
# Free Credits 老用户隔离:注册时间门槛(计划)
## 目标
C 端全量更新后,**注册时间早于活动上线节点的用户视为老用户,不参加、不展示****注册时间晚于该节点的新用户**在现有「EventBus 写库 = 参加」模型下正常走活动。
「默认参加」含义:**有资格参加**EventBus 允许建池、status 可读),**不是**无需 EventBus 自动插入 `free_credits_player`
---
## 分层架构(保持不变)
```mermaid
flowchart TB
gate{regTime > FREE_CREDITS_ENROLL_REG_AFTER?}
gate -->|否| block[不参加: status=-1 EventBus return]
gate -->|是| eligible[有资格]
eligible --> win[EventBus syncHomeWithdrawUnlocked]
eligible --> init[EventBus free_credit_init]
eligible --> api[status 只读 player 行]
win --> pool[(free_credits_player)]
init --> pool
api --> pool
```
| 路径 | 行为 |
| --- | --- |
| **读** `status()` | 未达注册门槛 → `status=-1`;达门槛且无 player 行 → `-1`;有行 → `buildStatus` |
| **写** EventBus | 未达注册门槛 → 各 Logic 方法开头直接 return不建池、不定格、不推进 |
---
## 实现要点
### 1. 环境变量
在 [`.env`](slot_console/.env) / 部署说明中增加(示例):
```env
# 用户注册时间Unix 或 Y-m-d H:i:s建议与 TIMEZONE 一致)晚于此值才可参加 Free Credits
FREE_CREDITS_ENROLL_REG_AFTER=2026-05-20 00:00:00
```
- 在 [`config/app.php`](slot_console/config/app.php) 或新建 `config/free_credits.php` 读取:`getenv('FREE_CREDITS_ENROLL_REG_AFTER')``strtotime` 解析为 `enroll_reg_after_ts`(启动时或首次调用缓存)。
- **未配置时的默认策略(已确认)**`FREE_CREDITS_ENROLL_REG_AFTER` 为空或未配置 → **全员不参加**`isEligibleByRegTime` 恒 false`status=-1`EventBus 不写池)。
### 2. 统一门禁方法(建议放在 [`FreeCreditsLogic`](slot_console/app/api/logic/FreeCreditsLogic.php)
```php
/**
* 是否具备 Free Credits 参与资格(注册时间晚于环境变量门槛)。
*/
protected function isEligibleByRegTime(int $uid): bool
{
$cutoff = self::enrollRegAfterTimestamp(); // 0 表示未配置
if ($cutoff <= 0) {
return false;
}
$userInfo = \app\service\user\UserService::getUserInfoEntity($uid);
if ($userInfo === null || $userInfo->create_at === '') {
return false;
}
$regTime = strtotime($userInfo->create_at);
return $regTime !== false && $regTime > $cutoff; // 严格「晚于」
}
```
- **数据来源**[`app\service\user\UserService::getUserInfoEntity`](slot_console/app/service/user/UserService.php)(调 user 服 `/innerapi/user/info`),与 [`EventBus::registerEvent`](slot_console/app/command/EventBus.php) 等同用法。
- **注册时间字段**[`app\entity\UserInfoEntity::$create_at`](slot_console/app/entity/UserInfoEntity.php)`Y-m-d H:i:s`),比较前 `strtotime` 为 Unix 秒。
- **不用** `UserTagService::tagInfo->regTime`(标签缓存,与账号创建时间可能不一致)。
- 备选:若 Logic 内已大量使用 slotLib可用 `\slotLib\services\UserService::getInstance()->setUid($uid)->getUserInfo()?->regTime`(构造函数内由 `create_at` 解析),但 console 侧优先统一 `app\service\user\UserService`
### 3. 调用点(读写对称)
| 方法 | 未达门槛时 |
| --- | --- |
| `status()` | 直接 `return ['status' => -1]` |
| `syncHomeWithdrawUnlocked()` | `return null` |
| `handleFreeCreditInit()` | `return` |
| `advanceAfterRecharge()` | `return` |
| `claim()` / `firstCashout()` | `throw BusinessException('...')` 或统一文案 |
**说明**:已达门槛、但库中无 player 行 → 仍为 `status=-1`(尚未被 EventBus 纳入);达门槛且 win 后 → EventBus 建池 → status 非 `-1`
### 4. 与「已首充」的关系
- 注册门槛解决:**老账号 / 老注册** 不进入活动。
- 钱包侧 [`maybeSendFreeCreditInit`](slot_wallet/app/api/logic/WalletLogic.php) 仍仅 **首充** 发定格,二者叠加,互不替代。
### 5. 撤销项
- 不再单独做 `total_deposit == 0` 的 EventBus 门禁(由注册时间门槛覆盖「老用户」定义)。
- 不再要求 `frozen_amount > 0` 才展示(保留 HOME_UNLOCKED 阶段)。
### 6. 文档与测试
- 更新 [`FreeCreditsController`](slot_console/app/api/controller/FreeCreditsController.php)`status=-1` = 未参加 / 活动关 / **注册时间早于门槛**
- 单测mock `regTime` 与 env cutoff覆盖 eligible / ineligible 的 status 与 freeze 是否被调用。
- 联调矩阵见下。
---
## 联调矩阵
| regTime vs 门槛 | win 达门槛 | 首充定格 | status | EventBus 建池 |
| --- | --- | --- | --- | --- |
| 早于 | - | - | `-1` | 否 |
| 晚于 | 否 | 否 | `-1` | 否 |
| 晚于 | 是 | 否 | `1` | sync 建池 |
| 晚于 | - | 是 | `3/4` + packages | freeze |
---
## 新 C 端约定(不变)
- **`status === -1`**:隐藏(含老用户、未达注册门槛、未参加)。
- **`status !== -1`**:已参加,按 `FreeCreditsPlayerModel` 状态渲染。

View File

@@ -0,0 +1,162 @@
---
name: Free Credits 验收核查
overview: 「首充前免费余额定格与分档释放」的后端核心链路(定格、分档、首档提现、后续 Claim、充值事件、钱包账务已在 slot_console / slot_wallet / slot_pay / slot_lib 落地约 7080%,但尚未达到需求文档 V1.0 全量验收标准;运营后台、客户端 UI、广播、异常风控、部分 API 字段与自动化测试仍缺失或未对齐。
todos:
- id: p0-wallet-atomicity
content: 补齐 Claim+Y1 原子性/回滚;确认是否需要 Deposit Lot
status: pending
- id: p0-status-api-fields
content: status/buildStatus 增加 total_recharge、show_home_status_bar、show_activity_entry
status: pending
- id: p0-peak-balance
content: 首页解锁「曾达到门槛」:增加峰值记录或可靠触发点
status: pending
- id: p1-admin-config-stats
content: slot_admin 增加 type=11 配置页与统计页(对接 innerapi
status: pending
- id: p1-refund-risk
content: 实现充值退款/拒付暂停未释放档位(文档 20.1
status: pending
- id: p2-frontend-broadcast
content: 前端仓实现 UI/广播;本仓可增加 broadcast API
status: pending
- id: p2-tests
content: 按文档 22.1/22.2 补充自动化或验收用例
status: pending
isProject: false
---
# 首充前免费余额定格与分档释放 — 实现完成度核查
**结论:未实现完。** 后端主流程可联调,但对照 [需求文档](file:///Users/ray/Documents/project/www/slot/docs/requirements/首充前免费余额定格与分档释放需求文档.md) 第 22 节验收标准,仍有若干 **P0 账务/规则缺口** 与大量 **前端/运营/统计** 范围未覆盖。
---
## 实现分布(已落地)
```mermaid
flowchart TB
subgraph console [slot_console]
RechargeEvent --> FreeCreditsLogic
EventBus --> FreeCreditsLogic
FreeCreditsLogic --> DB[(free_credits_player/package)]
ApiCtrl[FreeCreditsController] --> FreeCreditsLogic
Lobby[LobbyController.frontData] --> FreeCreditsLogic
Inner[innerapi FreeCreditsController] --> DB
end
subgraph wallet [slot_wallet]
FreeCreditsLogic --> WalletLogic
WalletLogic --> freeze[freeCreditsFreeze]
WalletLogic --> claim[freeCreditsClaim]
claim --> Y1[createTask SOURCE_TYPE_FREE]
end
subgraph pay [slot_pay]
firstCashout[firstCashout API] --> WithdrawalOrder
WithdrawalOrder --> MQ[FreeCreditsFirstCashout*]
MQ --> EventBus
end
```
| 模块 | 关键文件 | 覆盖的需求章节 |
|------|----------|----------------|
| 领域与状态机 | [FreeCreditsLogic.php](file:///Users/ray/Documents/project/www/slot/slot_console/app/api/logic/FreeCreditsLogic.php) | 5.35.9 核心规则 |
| 数据表 | [install.sql](file:///Users/ray/Documents/project/www/slot/slot_console/db/install.sql) L3686 | 活动池 + 档位 |
| 活动配置 | [RechargeGiftConfigModel.php](file:///Users/ray/Documents/project/www/slot/slot_console/app/model/common/RechargeGiftConfigModel.php) `TYPE_FREE_CREDITS=11` | 17 配置(读库) |
| 客户端 API | [FreeCreditsController.php](file:///Users/ray/Documents/project/www/slot/slot_console/app/api/controller/FreeCreditsController.php) | status / claim / firstCashout |
| 大厅聚合 | [LobbyController.php](file:///Users/ray/Documents/project/www/slot/slot_console/app/napi/controller/LobbyController.php) `free_credits` | 7 状态条数据源(部分) |
| 充值事件 | [RechargeEvent.php](file:///Users/ray/Documents/project/www/slot/slot_console/app/command/event/RechargeEvent.php) | 5.3 首充定格、5.5 累计充值解锁 |
| 首页解锁 | [EventBus.php](file:///Users/ray/Documents/project/www/slot/slot_console/app/command/EventBus.php) win/bonus 等 → `syncHomeWithdrawUnlocked` | 5.2 |
| 钱包原子能力 | [WalletLogic.php](file:///Users/ray/Documents/project/www/slot/slot_wallet/app/api/logic/WalletLogic.php) | 15.215.4 |
| 首档提现 | [WithdrawalOrderEntity.php](file:///Users/ray/Documents/project/www/slot/slot_pay/app/entity/WithdrawalOrderEntity.php) + [EventWithdrawal.php](file:///Users/ray/Documents/project/www/slot/slot_pay/app/command/EventWithdrawal.php) | 5.6、15.3、20.2 |
| 运营统计 API | [innerapi/FreeCreditsController.php](file:///Users/ray/Documents/project/www/slot/slot_console/app/innerapi/controller/FreeCreditsController.php) | 18.118.2(简化版) |
---
## 按需求章节对照22.1 核心规则)
| 验收项(文档 22.1 | 实现情况 | 说明 |
|---------------------|----------|------|
| 未达 $50 点 Withdraw 提示 | **前端** | 后端 `status` 返回 `win_threshold` / `home_withdraw_unlocked`,无专用提示 API |
| 曾达 $50 后输回仍解锁 | **部分** | 已解锁用户靠 `home_withdraw_unlocked=1` 保持;**未持久化历史峰值**,仅在 MQ 事件时若 `balance >= threshold` 才写库,存在漏解锁边界(例如达峰后无 win/bonus 类事件即输掉) |
| 任意入口首充定格 | **是** | `RechargeEvent` + `handleRecharge``frozenAmount = balance_after - wallet_amount` |
| 首充失败不定格 | **是** | 仅充值成功 MQ 触发 |
| 定格后余额扣除、活动展示 | **是** | `freeCreditsFreeze` + player/package 记录 |
| 累计未满 $50 第一档不可提现 | **是** | 首包 `STATUS_LOCKED` 直至 `wallet.r >= recharge_unlock_amount` |
| 累计满 $50 第一档可提现 | **是** | `advanceByRecharge` 解锁 package_no=1 |
| 定格 &lt; $20 时第一档=定格额 | **是** | `min(frozen, first_cash_amount)` |
| 第一档提现成功后关首页状态条 | **后端未显式字段** | 有 `STATUS_FIRST_CASH_DONE`,但 `buildStatus` **未返回** `show_home_status_bar` 等 UI 开关,需前端自行推断 |
| 后续充值只解锁下一档 | **是** | `max_unlock_per_recharge` + `nextLockedReleasePackage` |
| Claim 入 Deposit + Y1 | **部分** | 入 deposit_balance + `createTask(SOURCE_TYPE_FREE)`**无 Deposit Lot**(文档 15.4、22.2 |
| 全部完成关活动入口 | **部分** | `STATUS_COMPLETED=10`API 未返回 `show_activity_entry` 布尔字段 |
---
## 按需求章节对照22.2 账务)
| 验收项 | 实现情况 | 风险 |
|--------|----------|------|
| 定格有钱包流水 | **是** | `BIZ_TYPE_FREE_CREDITS_FREEZE` |
| 定格前后余额正确 | **是** | `addLog` 记录 |
| 第一档不进普通钱包 | **是** | 独立 `free_credit_first_cashout`,跳过 `withdrawFrozen` |
| Claim 创建 Deposit Lot | **否** | 全仓库无 `DepositLot`/`deposit_lot` 实现 |
| Claim 创建 Y1 | **是** | 但 `createTask` 在钱包事务 **commit 之后**;失败仅打日志,**不满足** 文档 20.3「流水任务失败整体回滚」 |
| 重复回调不重复定格 | **是** | `frozen_amount_qf > 0` 跳过 |
| 重复 Claim 不重复入账 | **部分** | package 状态 + `claim_biz_id` 唯一;钱包层 **未见 biz_id 幂等查重** |
---
## 明确未实现 / 未对齐项
### P0影响验收或资金一致性
1. **Deposit Lot**:文档 15.4 / 22.2 要求 Claim 后创建;当前仅 `inc` deposit + Y1 task。
2. **Claim 与 Y1 原子性**`freeCreditsClaim` 先 commit 入账,再 `createTask`;与 20.3 冲突。
3. **充值退款/拒付暂停档位**(文档 20.1`FreeCreditsLogic` 无 refund/chargeback 处理。
4. **status API 缺累计充值进度**:定格后 UI 需要 `$9.99 / $50`(文档 6.3、7.3`buildStatus` 未返回 `total_recharge`(内部用 `wallet.r`,未透出)。
5. **「曾经达到 $50」**:无 `peak_balance` 字段;依赖事件驱动 `syncHomeWithdrawUnlocked`,与 5.2 字面规则不完全一致。
### P1运营与配置
6. **后台配置模块**(文档 17`backend/slot_admin` / `slot_admin_vue` **无** `TYPE_FREE_CREDITS=11` 的 CRUD 页面;仅能手工维护 `s_recharge_gift_config.ext_config`
7. **后台统计页**(文档 18仅有 [innerapi](file:///Users/ray/Documents/project/www/slot/slot_console/app/innerapi/controller/FreeCreditsController.php) 简化接口;列表缺 **渠道、时间范围、第一档状态、排序项、累计充值、完成进度** 等字段/筛选项。
8. **可配置 Y1 倍数**(文档 17 `后续档打码倍数`):代码写死 `createTask(0, fee, SOURCE_TYPE_FREE)`,未读 `ext_config`
9. **状态机 `STATUS_FROZEN=2`**:模型定义了但 Logic **从未赋值**(定格后直接 `DEPOSIT_PENDING` / `FIRST_CASH_READY`)。
### P2产品体验 / 文档其他章节)
10. **客户端 UI**(文档 614`slot_pwa` 等仓库 **零引用** `free_credits`首页状态条、Free Play to Go、独立提现页、广播模块均未实现原开发计划也标明前端另仓
11. **广播模块**(文档 13无最近 10 条提现/领取记录 API。
12. **注册赠送改 $30**(文档 19与本活动解耦**未在本需求代码变更中验证**是否已改配置/落地页。
13. **自动化测试**:无 FreeCredits 相关单测/集成测试。
---
## 与现有开发计划的一致性
[free_credits_release 计划](file:///Users/ray/.cursor/plans/free_credits_release_902566c9.plan.md) 中 `implement-console-core` 仍为 **pending**与代码现状Logic 已较完整)不一致;`test-acceptance` 标 completed 但仓库内 **无测试文件**,建议以文档 22 节手工/自动化用例重新验收。
---
## 建议验收顺序(若需补齐)
1. **手工走通 P0 账务用例**:首充定格幂等、满 $50 解锁、首档提现回调、顺序 Claim、重复 Claim/回调。
2. **补齐 status 字段**`total_recharge``show_home_status_bar``show_activity_entry``current_balance`
3. **对齐钱包**Deposit Lot若钱包规范要求、Claim+Y1 同事务或补偿回滚。
4. **运营**slot_admin 增加 type=11 配置页 + 统计页对接 innerapi。
5. **前端仓**:按文档 614 接 API本 monorepo 外)。
6. **补测试**:覆盖 22.1 / 22.2 表格各行。
---
## 总览评分(仅供沟通)
| 范围 | 完成度(估) |
|------|-------------|
| 后端核心状态机 + 充值/提现/Claim 链路 | ~7585% |
| 钱包账务与文档完全一致 | ~60% |
| 客户端 API 字段/UI 支撑 | ~50% |
| 运营后台配置与统计 | ~25% |
| 前端 UI / 文案 / 广播 | ~0%(本仓库) |
| 自动化测试 | ~0% |
**综合:需求文档 V1.0 不能判定为「已全部实现」;可判定为「后端 MVP 已具备,待补齐账务细节、运营与前端后全量验收」。**

View File

@@ -0,0 +1,78 @@
---
name: is_end派奖结算改造
overview: 基于现有 BetFunding/WinService 实现,新增 is_end 分支:中间派奖仅累计不入账,结束派奖统一按 Round Final Settlement 入账;并对中间派奖增加 biz_id 严格幂等。
todos:
- id: dto-validator-is-end
content: 扩展 DTO 与校验器,支持 is_end 并强制 win 场景 round_id 校验
status: pending
- id: redis-win-keys
content: 新增 pending/dedupe Redis key 生成方法与 TTL 约定
status: pending
- id: logic-win-branching
content: 在 WalletLogic::win 中实现 is_end=0 累计与 is_end=1 最终结算分支
status: pending
- id: idempotency-regression
content: 补充关键回归场景说明并验证与现有幂等不冲突
status: pending
isProject: false
---
# is_end 驱动的派奖结算改造计划
## 目标
`win` 接口支持第三方 `is_end` 语义:
- `is_end=0`:仅记录/累计本局派奖,不做钱包入账、不做 Lot 终态收敛
- `is_end=1`:将本次派奖 + 已累计派奖合并后,执行一次 Final Settlement现有 `WinService::execute`
## 现状结论(基于代码)
- 入口路由在 [app/api/logic/WalletLogic.php](app/api/logic/WalletLogic.php) 的 `type=win -> win()`
- Final Settlement 主流程在 [app/service/wallet/WinService.php](app/service/wallet/WinService.php)。
- 当前 `win` 默认即 Final Settlement不区分中间派奖事件。
- 下注资金事实表在 [app/model/multi/WalletBetFundingModel.php](app/model/multi/WalletBetFundingModel.php)。
## 实现方案(按你选择)
### 1) 入参扩展与校验
- 在 [app/api/dto/request/wallet/WalletUpdateRequestDTO.php](app/api/dto/request/wallet/WalletUpdateRequestDTO.php) 增加字段:`is_end`(默认 `1`,仅允许 `0|1`)。
- 在 [app/validator/Wallet2Validator.php](app/validator/Wallet2Validator.php)
- 增加 `is_end` 校验规则(整数且取值 `0/1`)。
-`win` 也纳入 `round_id` 必传校验(当前仅 bet 必传)。
### 2) Redis Key 设计
- 在 [app/service/RedisKeyManagerService.php](app/service/RedisKeyManagerService.php) 新增两个 key 生成器:
- `wallet:win:pending:{uid}:{currency}:{round_id}`:累计未结算派奖金额
- `wallet:win:dedupe:{uid}:{currency}:{round_id}:{biz_id}`:中间派奖幂等标记
- 过期策略建议:`pending` 48h`dedupe` 72h与重放窗口对齐
### 3) win 主流程分支
- 修改 [app/api/logic/WalletLogic.php](app/api/logic/WalletLogic.php) 的 `win()`
- `is_end=0`
- 命中 dedupe key 则直接返回当前钱包(幂等)
- 未命中则将 `fee` 累加到 pending key写 dedupe key返回当前钱包不写 `BIZ_TYPE_WIN` 流水)
- `is_end=1`
- 读取 pending 累计并与本次 `fee` 合并为 `finalWinAmount`
-`finalWinAmount` 调用现有 `WinService::execute`
- 事务提交后清理 pending key失败不清
### 4) 幂等与一致性
- `is_end=1` 继续沿用现有 `wallet_log(uid,biz_id,biz_type=win)` 幂等。
- `is_end=0` 使用 Redis dedupe key 防重,避免重复累计。
-`is_end=1` 无待分配 funding保持当前行为报错便于暴露上游时序问题。
### 5) 兼容与回归
- 默认 `is_end=1`,兼容未传该字段的旧调用。
- 回归场景:
- 单次结算(只发 `is_end=1`
- 多次派奖(多条 `is_end=0` + 一条 `is_end=1`
- `is_end=0` 重放同 biz_id 不重复累计
- `is_end=1` 重放同 biz_id 不重复入账
- `is_end=1` 失败后 pending 不丢失
## 关键改动文件
- [app/api/dto/request/wallet/WalletUpdateRequestDTO.php](app/api/dto/request/wallet/WalletUpdateRequestDTO.php)
- [app/validator/Wallet2Validator.php](app/validator/Wallet2Validator.php)
- [app/service/RedisKeyManagerService.php](app/service/RedisKeyManagerService.php)
- [app/api/logic/WalletLogic.php](app/api/logic/WalletLogic.php)
## 风险与边界
- 该方案不新增 `wallet_game_round` / `wallet_game_round_event` 持久化表;中间派奖仅 Redis 暂存,审计粒度弱于 DB 事件流。
- 若某局长期无 `is_end=1`pending 依赖 TTL 过期清理。后续可升级为 DB 事件表方案。

View File

@@ -0,0 +1,57 @@
---
name: is_end结算回退方案
overview: 取消“中间派奖实时余额可见化”调整,回退到严格 Final Settlement 方案is_end=0 仅累计is_end=1 才入账与状态收敛。
todos:
- id: dto-validator-is-end
content: 增加 is_end 字段及 win round_id 强校验
status: completed
- id: pending-dedupe-keys
content: 新增 pending 与 dedupe Redis key 并接入 is_end=0 累计
status: completed
- id: win-final-merge
content: is_end=1 合并 pending 后调用现有 WinService 结算并清理缓存
status: completed
- id: regression-check
content: 回归验证多次派奖累计、最终结算与幂等行为
status: completed
isProject: false
---
# is_end 结算回退方案(不做中间余额更新)
## 变更决策
取消这部分:
- 多次派奖期间(`is_end=0`)对第三方返回余额进行实时更新
-`wallet` 查询叠加 pending 金额
保留并执行:
- `is_end=0`:仅做中间派奖累计,不改钱包余额、不做 Lot 收敛
- `is_end=1`:合并累计派奖后一次 Final Settlement调用现有 win 主流程)
## 实现边界
- 严格遵循 [doc/win.md](doc/win.md) 的“Final Settlement 才做真实入账”原则
- 不引入展示层余额叠加逻辑,避免展示余额与真实可下注余额不一致
## 具体改造
1. DTO / 校验
- [app/api/dto/request/wallet/WalletUpdateRequestDTO.php](app/api/dto/request/wallet/WalletUpdateRequestDTO.php) 增加 `is_end`(默认 `1`
- [app/validator/Wallet2Validator.php](app/validator/Wallet2Validator.php)
- 增加 `is_end` 仅允许 `0/1`
- `win` 场景强制 `round_id` 必传
2. Redis 累计与幂等(仅中间派奖)
- [app/service/RedisKeyManagerService.php](app/service/RedisKeyManagerService.php) 增加 key
- `wallet:win:pending:{uid}:{currency}:{round_id}`
- `wallet:win:dedupe:{uid}:{currency}:{round_id}:{biz_id}`
- `is_end=0` 命中 dedupe 则忽略,未命中则累计 pending
3. win 结算分支
- [app/api/logic/WalletLogic.php](app/api/logic/WalletLogic.php)
- `is_end=0`:只累计并返回当前真实钱包余额
- `is_end=1`:读取 pending 并与本次 `fee` 合并后走现有 `WinService::execute`,成功后清理 pending
## 验收
- 多条 `is_end=0` 不触发真实入账
- 一条 `is_end=1` 触发一次最终结算,金额=中间累计+末笔
- 中间派奖重复 `biz_id` 不重复累计
- Final 失败时 pending 不丢失,可重试

View File

@@ -0,0 +1,141 @@
---
name: PHPDoc Cursor 规则
overview: 在 Cursor 全局规则中新增 PHP PHPDoc 严格规范(类、方法、常量全覆盖),与现有 backend-layering 规则并列,并明确适用范围与模板,避免与「不写显而易见注释」的原则冲突。
todos:
- id: create-php-doc-mdc
content: "新建 /Users/ray/.cursor/rules/php-doc.mdcglobs: **/*.php严格 PHPDoc 正文 + 示例)"
status: completed
- id: verify-rule-active
content: 在 Cursor 中打开任意 .php 文件,确认规则被注入;用 WalletLogic 缺注释方法做一次试写验证
status: completed
- id: optional-readme-sync
content: (可选)将 PHPDoc §3.4 同步到 slot_wallet 等 README与 Cursor 规则保持一致
status: completed
isProject: false
---
# 新增 PHPDoc 严格 Cursor 规则
## 结论:要加,但不要写成「所有符号一刀切」的空话
你选择了 **严格全覆盖**。建议在 Cursor 里加一条 **独立规则文件**,与现有的 [`backend-layering.mdc`](/Users/ray/.cursor/rules/backend-layering.mdc) 并列,而不是塞进 layering 里(职责不同:一个管分层,一个管文档)。
**不建议**写成模糊的「所有都要 PHPDoc」——应写清 **哪些符号、最少哪些 tag、何时可写短句**。否则 Agent 会在 trivial 代码上堆 `@param int $uid uid` 这类无意义注释,与 [`slot_agent/README.md`](/Users/ray/Documents/project/www/slot/slot_agent/README.md) 第 9.3 节「不解释显而易见语句」打架。
## 现状
| 来源 | PHPDoc 要求 |
|------|-------------|
| [`.cursor/rules/`](/Users/ray/.cursor/rules/) | 仅有 layering + dev-environment**无 PHPDoc** |
| [`slot_agent/README.md`](/Users/ray/Documents/project/www/slot/slot_agent/README.md) §6.2 | 已要求:业务类说明、公开方法说明、参数/返回值说明 |
| 实际代码(如 [`WalletLogic.php`](/Users/ray/Documents/project/www/slot/slot_wallet/app/api/logic/WalletLogic.php) | **不一致**`run`/`register` 有块注释,`initWalletWithoutMoney``getBalance` 无 |
终端里曾出现给 `slot_wallet/README.md` 增加 §3.4 PHPDoc 的 diff但当前 README **尚未落地**该节——规范应优先进 **Cursor rule**Agent 每次都会读README 可作为人类文档二次同步(可选)。
## 推荐规则文件
**路径**[`/Users/ray/.cursor/rules/php-doc.mdc`](/Users/ray/.cursor/rules/php-doc.mdc)
**Frontmatter 建议**
```yaml
---
description: PHP PHPDoc requirements for all classes, methods, and constants
globs: "**/*.php"
alwaysApply: false
---
```
-`globs: **/*.php`:编辑 PHP 时自动注入,不污染 Vue/TS 会话
- `alwaysApply: false`:与 layering 的 `true` 区分,减少非 PHP 任务 token
## 规则正文(严格版,建议写入 mdc
### 1. 适用范围
- **新增或修改**的 PHP 文件中的:**class / interface / trait / enum**、**所有方法**`public` / `protected` / `private`)、**所有类常量**`const`
- 适用目录:`slot_*``backend/**` 下 PHP 业务代码
- **不追溯**改历史未动代码;但 **本次 diff 触及的符号** 若缺 PHPDoc须一并补齐
### 2. 最低 PHPDoc 内容
| 符号 | 必须包含 |
|------|----------|
| 类 / 接口 / Trait | 一行职责说明;复杂类可加 `@package`(可选) |
| 方法 | 职责说明 + 每个参数的 `@param` + `@return`;有 `throw` 的须 `@throws` |
| 类常量 | 一行说明业务含义(单位、枚举语义、与配置/表字段对应关系) |
| 属性(若新增) | `@var` 或 typed property + 一行说明(仅当类型/语义不直观时) |
已有 **PHP 8+ 标量/对象类型声明** 时,`@param`/`@return` 仍要保留(与你选的 strict 一致),但 **描述句可短**,禁止空块或只复制类型名。
### 3. 禁止项(与 slot_agent 注释原则对齐)
- 禁止无 `@param` / `@return` 的空 `/** */`
- 禁止 `@param int $id id` 式同义反复;语义、单位、边界写进描述
- 禁止用 PHPDoc 替代 Validate / Logic 里的业务校验说明
### 4. 分层补充(与 layering 一致)
对以下层 **额外** 要求写清业务语义(不仅是类型):
- **Controller**:接口用途、幂等/鉴权前提(若有)
- **Logic**:用例步骤、事务边界、失败时行为
- **Service**:复用场景、调用方约束
- **Model**:查询条件、分表键、金额字段单位
- **DTO / Validate**:字段含义、与上游参数映射
### 5. 示例模板(写入规则供 Agent 照抄)
```php
/**
* 首充前冻结免费余额。
*
* @return WalletEntity|null 成功返回钱包实体;无需冻结时返回 null
* @throws WalletException 余额不足或钱包不存在
*/
public function freeCreditsFreeze(): ?WalletEntity
```
```php
/** 释放档位:单位分,对应配置 free_credits.release_tiers */
public const RELEASE_TIER_MIN = 100;
```
## 与工具链的关系(可选,本期可不做的)
Cursor rule **不能**在 CI 里自动 fail。若以后要机器 enforce再单独加
- PHPStan + `phpstan/phpdoc-parser`
- PHPCS `Squiz.Commenting` / 自定义 sniff
本期仅 Cursor 规则即可满足「Agent 写码时遵守」。
## 实施步骤
1. 新建 [`php-doc.mdc`](/Users/ray/.cursor/rules/php-doc.mdc),按上文写入 frontmatter + 正文
2. 在 Cursor Settings → Rules 确认该规则对 PHP 文件生效(`globs` 匹配)
3. (可选)把相同 §3.4 同步进 [`slot_wallet/README.md`](/Users/ray/Documents/project/www/slot/slot_wallet/README.md) 与其它服务 README供人工 review 对照
4. 用一次小改动验证:例如在 `WalletLogic` 给无注释的 `getBalance` 补 PHPDoc看 Agent 是否自动遵循
## 风险与预期
- **Diff 变大**strict 下每个新方法多 515 行注释,属预期成本
- **历史债**:全库补 doc 工作量巨大;规则应写明 **仅 touch 到的符号**,避免 Agent 一次性重构整文件
- **类型重复**strict 仍保留 `@param`/`@return` 类型,利于 IDE/静态分析;描述聚焦「为什么/单位/边界」
```mermaid
flowchart LR
subgraph rules [Cursor Rules]
layering[backend-layering.mdc]
phpdoc[php-doc.mdc]
devenv[dev-environment.mdc]
end
subgraph code [PHP 改动]
edit[编辑 PHP 文件]
agent[Agent 生成/修改代码]
end
edit --> phpdoc
edit --> layering
agent --> phpdoc
agent --> layering
```

View File

@@ -0,0 +1,84 @@
---
name: PHPUnit 钱包链路测试
overview: 补齐本仓库的 PHPUnit 基建,并新增 register/bet/win 集成测试用例,默认在本地 php82 容器执行、连接真实依赖,以 HTTP 结果与余额变化作为核心断言。
todos:
- id: setup-phpunit
content: 补齐 PHPUnit 基建composer require-dev、phpunit.xml、tests/bootstrap.php
status: completed
- id: implement-feature-test
content: 实现 register/bet/win 集成测试与幂等/异常断言
status: completed
- id: run-in-container
content: 在 php82 容器执行测试并根据结果修正
status: completed
- id: document-runbook
content: 补充测试执行说明与可选增强项
status: completed
isProject: false
---
# PHPUnit Register/Bet/Win 测试落地计划
## 默认口径(基于当前信息)
- 测试框架PHPUnit当前仓库尚无 `phpunit.xml``tests/`)。
- 执行环境:本地 `php82` 容器。
- 依赖模式:默认连本地真实 MySQL/Redis贴近联调
- 断言范围:默认先做 API 返回与余额变化断言DB 深断言作为第二阶段可选扩展。
## 现状结论
- 缺少 PHPUnit 基建:未发现 `phpunit*.xml``tests/` 目录。
- `register/bet/win` 入口与逻辑已具备:
- 接口入口:[app/api/controller/WalletController.php](app/api/controller/WalletController.php)
- 业务编排:[app/api/logic/WalletLogic.php](app/api/logic/WalletLogic.php)
- 注册服务:[app/service/wallet/RegisterService.php](app/service/wallet/RegisterService.php)
## 实施步骤
1. **补测试基建**
-`require-dev` 增加 `phpunit/phpunit`
- 新增 `phpunit.xml`(定义 `tests/` 目录、bootstrap、环境变量覆盖
- 新增 `tests/bootstrap.php`(加载自动加载与测试环境初始化)。
2. **新增钱包链路集成测试**
- 新建测试文件:[tests/Feature/WalletRegisterBetWinTest.php](tests/Feature/WalletRegisterBetWinTest.php)
- 用例覆盖:
- `register` 成功(通过 `wallet/update` + `type=register`
- `bet` 成功并校验扣款后余额变化
- `win is_end=0` 中间派奖仅影响待结算展示
- `win is_end=1` 最终结算落账
- `bet` 重复 `biz_id` 幂等
- `win` 重复 `biz_id` 幂等
- `bet/win``round_id` 参数错误
- `win` 非法 `is_end` 参数错误
3. **测试数据与可重复执行设计**
- 每个测试生成独立 `uid/round_id/biz_id/trace_id`(时间戳+随机后缀),避免脏数据冲突。
- 用例内封装统一请求方法POST JSON与响应断言助手降低重复代码。
- 优先按顺序单线程执行此特性测试,避免并发串扰。
4. **执行与验证**
- 在容器内执行:`docker compose exec -T php82 php vendor/bin/phpunit --filter WalletRegisterBetWinTest`
- 验证输出:
- 所有用例通过
- 幂等场景无重复记账(通过返回余额不重复变化来断言)
5. **第二阶段可选增强(不在首版强制)**
- 增加 DB 断言(`wallet_log``wallet_fund_lot``wallet_bet_funding`)与 Redis pending key 清理断言。
- 将该测试纳入 CI job需环境可用性与测试隔离策略先达成一致
## 目标结构图
```mermaid
flowchart TD
testBootstrap[phpunitBootstrap] --> featureTest[WalletRegisterBetWinTest]
featureTest --> registerStep[register_update]
registerStep --> betStep[bet]
betStep --> winMidStep[win_is_end_0]
winMidStep --> winFinalStep[win_is_end_1]
winFinalStep --> idemCheck[idempotencyChecks]
idemCheck --> negativeCheck[invalidParamsChecks]
```
## 受影响文件(计划新增/修改)
- [composer.json](composer.json)
- [phpunit.xml](phpunit.xml)
- [tests/bootstrap.php](tests/bootstrap.php)
- [tests/Feature/WalletRegisterBetWinTest.php](tests/Feature/WalletRegisterBetWinTest.php)

View File

@@ -0,0 +1,11 @@
---
name: PHPUnit 集成测试落地
overview: 补齐本仓库 PHPUnit 基建,并新增 register/bet/win 集成测试(连接真实 MySQL/Redis与关键 DB 断言,支持在本地 php82 容器执行。
todos: []
isProject: false
---
# Register/Bet/Win PHPUnit 实施计划
## 目标
- 新增可

View File

@@ -0,0 +1,227 @@
---
name: PHP用例写法规则
overview: 在用户级 Cursor 新增 `php-use-case-style.mdc`,约束 slot 后端所有 PHP 业务代码Controller/Logic/Service/Model/Command 等)的表达力与可维护性;并扩展 verify-slot-backend.sh 对 diff 中所有 touched 的 app/**/*.php 做轻量检查。仅约束本次 diff不强制全盘重构历史代码。
todos:
- id: create-mdc
content: 创建 ~/.cursor/rules/php-use-case-style.mdc全层 MUST/禁止、BAD/GOOD、按层对照表
status: completed
- id: update-gate-rule
content: 在 agent-completion-gate.mdc 增加对 php-use-case-style 的引用(任意 PHP 改动)
status: completed
- id: extend-verify
content: 扩展 verify-slot-backend.sh所有 app/**/*.php diff 检查 + @use-case-exempt
status: completed
- id: smoke-verify
content: 分别在 Logic/Controller/Service diff 触发自测 PASS/FAIL/豁免
status: completed
- id: merge-php-code
content: 用例写法合并进 php-code.mdc修 frontmatter/强制要求/命名
status: completed
- id: fix-gate-refs
content: agent-completion-gate 引用改为 php-code
status: completed
- id: smoke-rules
content: 确认规则生效 + verify PASS
status: completed
isProject: false
---
# PHP 代码写法规则 + Verify 门禁(全层)
## 目标
让 AI 在改 **任意 slot 后端 PHP 业务代码** 时默认产出:**编排清晰、职责单一、业务异常语义正确、状态变更有条件更新与幂等键**,并对齐仓库内参照实现。
适用范围(规则 + verify 一致):
- `app/api/controller/**`
- `app/api/logic/**``app/innerapi/logic/**``app/napi/logic/**`
- `app/service/**`
- `app/model/**`
- `app/command/**`
- 其它 `app/**` 下业务 PHP`validate``entity` 等按条适用)
**不覆盖**`vendor/``tests/`(除非 diff 触及且单独约定)、纯配置/SQL 文件。
## 默认范围
- **规则文件**:用户级 [`~/.cursor/rules/php-use-case-style.mdc`](~/.cursor/rules/php-use-case-style.mdc)
- **生效方式**`alwaysApply: true`(任意对话均注入;与 `backend-layering` 同级,避免只开 Logic 文件时漏规则)
- **门禁脚本**[`~/.cursor/hooks/verify-slot-backend.sh`](~/.cursor/hooks/verify-slot-backend.sh)(仅 `git diff` + 路径 `app/`
- **不在本阶段**:强制重构历史代码(如 `DailyRebateLogic::claim`);可另开样板 PR
## 1. 新增规则 `php-use-case-style.mdc`
**Frontmatter**
```yaml
---
description: Slot PHP 写法——表达力、可维护、全层通用Controller/Logic/Service/Model/Command
alwaysApply: true
---
```
### 1.1 全层通用 MUST
| 条目 | 要求 |
|------|------|
| 单一职责 | 一个 public 方法只做一件事;编排方法目标 ≤25 行,超出拆 private |
| if 墙 | 禁止同一方法内连续 ≥4 个 `if (...) throw/return error`;合并为 `assert*` / `ensure*` |
| 业务异常 | 可预期业务失败用 `support\exception\BusinessException`;禁止用 `RuntimeException` 表示业务态(未开启、不可领、已过期等) |
| 魔法值 | 状态/类型用 Model 常量或 enum禁止裸 `1/2/3` 散落diff 新增代码) |
| 命名 | 方法名表达意图(`assertClaimable``markClaimedIfClaimable`),禁止 `doClaim``handle` 等空泛名(新增代码) |
| 参照 | 领取/入账编排:[`FreeCreditsLogic::claim`](slot_console/app/api/logic/FreeCreditsLogic.php)Controller[`FreeCreditsController`](slot_console/app/api/controller/FreeCreditsController.php) |
### 1.2 按层补充(与 backend-layering 互补,不重复分层表)
| 分层 | 写法 MUST | 禁止 |
|------|-----------|------|
| **Controller** | 仅Validate → 调 Logic/Service → `success/errorCode``catch BusinessException` 映射业务码 | 业务 if 墙、直接 `Db::`、直接 `gift()` |
| **Logic** | 用例编排:`buildContext``assert*``perform*``format*`;事务边界在此 | 纯转发 Model 无编排、跨服务裸 curl |
| **Service** | 可复用能力封装外部系统wallet/sdk隔离稳定 `biz_id` | Logic 型 Service单用例整条流水线 |
| **Model** | 查询/写入 + `scope`/`mark*If*` 条件更新;金额字段注释单位(厘) | 业务编排、调 Wallet |
| **Command** | 薄入口:参数解析 → 调 Logic日志 phase 结构化 | 复制 Logic 大段 if 墙 |
| **Validate** | 格式/必填/枚举 | 业务规则(「是否可领」应在 Logic assert |
### 1.3 领取 / 入账 / 状态变更(凡涉及处均适用)
- MUST条件更新`where status = expected``update`),鼓励 Model 方法 `mark*If*`
- MUST钱包/外部入账带稳定 `biz_id`(如 `daily_rebate:{uid}:{statDate}`
- Controller禁止 `catch (\RuntimeException)` 后一律 `PARAMS_ERROR`
### 1.4 BAD / GOOD规则内各一段≤8 行)
- BADController `catch RuntimeException` + Logic 5 连 throw + Service 仅 `return Model::find()`
- GOODController 捕 `BusinessException`Logic `assert*` + 条件更新Service 封装 wallet + biz_id
### 1.5 与现有规则关系
- 分层职责:仍服从 [`backend-layering.mdc`](~/.cursor/rules/backend-layering.mdc)
- 文档:仍服从 [`php-doc.mdc`](~/.cursor/rules/php-doc.mdc)
- [`agent-completion-gate.mdc`](~/.cursor/rules/agent-completion-gate.mdc) 增加:**任意改动 `app/**/*.php` 须遵守 `php-use-case-style`**
## 2. 扩展 `verify-slot-backend.sh`
**`CHANGED_PHP` 且路径匹配 `*/app/*`** 的文件检查(不再限定 `/logic/`
```bash
# 1) diff 新增行含 throw new \RuntimeException业务态误用
# 豁免:文件含 @use-case-exempt
# 2) Controller*/app/**/controller/*diff 新增行:
# catch (\RuntimeException 且同文件/邻近行 PARAMS_ERROR → fail
# 3) 已有BaseController、banlist、deleted class — 保持不变
```
**原则**
- 只 FAIL **diff 新增行**`git diff -U0` / `git diff --cached -U0`),不扫历史行
- `@use-case-exempt` 在文件前 5 行内则跳过该文件全部 use-case 检查
- 首期不 FAIL方法行数、biz_id 参数名(写在规则 MUSTverify 二期)
## 3. 数据流
```mermaid
flowchart TB
subgraph agent [Agent 改任意 app PHP]
rule[php-use-case-style alwaysApply]
layers[Controller Logic Service Model Command]
end
subgraph gate [完成前]
verify[verify-slot-backend app/** diff]
hook[stop hook followup]
end
rule --> layers
layers --> verify
verify -->|FAIL| hook
verify -->|PASS| done[可声称完成]
```
## 4. 验收
1. 打开任意 `app/service/*.php``DailyRebateController.php`规则均应生效alwaysApply
2. 在 Controller diff 新增 `catch (\RuntimeException` + `PARAMS_ERROR` → verify FAIL
3. 在 Service diff 新增 `throw new \RuntimeException('活动未开')` → verify FAIL
4.`@use-case-exempt` → 该文件跳过
5. `~/.cursor/hooks/verify-slot-backend.sh` 输出 PASS
## 5. 后续可选(本计划不含)
- 样板 PR重构 `DailyRebateLogic::claim` + `DailyRebateController::claim`
- verify 二期:`gift(` / wallet 调用邻近 biz_id 检测public 方法行数 WARN
---
## 6. 阶段二:合并进 `php-code.mdc`(待执行)
用户已将 PHPDoc 并入 [`php-code.mdc`](~/.cursor/rules/php-code.mdc)`php-use-case-style.mdc` 已不存在。verify 已具备 use-case 检查,但规则与 gate 引用断裂。本阶段只做规则对齐,不改业务代码。
### 6.1 修改 `php-code.mdc`
**Frontmatter**(删空 `globs:`
```yaml
---
description: PHP 全局工程规范PHPDoc + 用例写法 + AI 纪律)
alwaysApply: true
---
```
**在「代码原则」后插入新章节「用例写法app/**)」**(约 35 行):
- MUST业务失败 `support\exception\BusinessException`;禁止 `RuntimeException` 表业务态
- MUST编排 public 方法 ≤25 行;同一方法禁止连续 ≥4 个 `if (...) throw` → 抽 `assert*`
- MUST状态变更条件更新钱包入账稳定 `biz_id``daily_rebate:{uid}:{date}`
- 按层表(与 backend-layering 互补Controller 禁止业务 if 墙 / 直接 giftLogic 编排结构;禁止 Logic 型 Service
- 参照:`slot_console/app/api/logic/FreeCreditsLogic.php` :: `claim()``FreeCreditsController.php`
- BAD/GOOD 各一段RuntimeException vs BusinessExceptionController catch
- 豁免:文件前 5 行 `@use-case-exempt`(与 verify 一致)
**改写「强制要求」**L8492为 diff 范围:
```markdown
## 强制要求(本次 diff 新增/修改须符合)
- PHP 8+;新增/修改的方法须有 typed parameter 与 return
- 新增类属性须 typed property
- 新建文件或本次 diff 触及的文件顶部可加 `declare(strict_types=1);`,禁止为达标改无关历史文件
```
**微调「命名规范」**
- 禁止 `$tmp``$a``$b`、无业务含义的 `$data`/`$list`
- **删除** blanket 禁止 `$info`(与 `UserInfoEntity` 等冲突);改为禁止「无上下文的 `$info` 临时变量」
**文末增加「与 verify 对齐」**
- diff 新增 `throw new RuntimeException`(业务态)→ verify FAIL
- Controller diff 新增 `catch RuntimeException` + `PARAMS_ERROR` → verify FAIL
### 6.2 修改 `agent-completion-gate.mdc`
```diff
- 3. 修改 PHP 后,最终回复含 `PHPDoc: checked`(见 php-doc 规则)。
- 4. 改动 `app/**/*.php` 须遵守 `php-use-case-style`表达力、BusinessException、按层写法
+ 3. 修改 PHP 后,最终回复含 `PHPDoc: checked`(见 php-code 规则 PHPDoc 章节)。
+ 4. 改动 `app/**/*.php` 须遵守 `php-code` 用例写法章节BusinessException、按层写法
```
### 6.3 不改动
- `verify-slot-backend.sh`(已含 use-case 检查)
- `backend-layering.mdc``cross-service-sdk.mdc`
### 6.4 验收
1. `~/.cursor/rules/` 仅一份 PHP 总规范 `php-code.mdc`,无悬空 `php-doc` / `php-use-case-style` 引用
2. 新开 Agent 对话,改 `app/**` PHP 时应看到用例写法 + PHPDoc
3. `~/.cursor/hooks/verify-slot-backend.sh` → PASS
### 6.5 执行 todos
| id | 内容 |
|----|------|
| merge-php-code | 按 6.1 更新 php-code.mdc |
| fix-gate-refs | 按 6.2 更新 agent-completion-gate.mdc |
| smoke-rules | 打开 DailyRebateLogic + 跑 verify |

View File

@@ -0,0 +1,11 @@
---
name: pwa每日返水流水展示
overview: 在 slot_pwa 的交易流水服务中补充每日返水(65)展示映射,确保钱包已入账的每日返水可在前端流水里看到。
todos: []
isProject: false
---
# PWA 每日返水流水展示计划
## 目标
-

View File

@@ -0,0 +1,49 @@
---
name: recharge-config规则说明字段
overview: 为 `s_common.s_recharge_gift_config` 新增独立 `rule_desc` 字段,并在 `slot_admin``slot_console` 全链路打通,保持 `help` 兼容不破坏现有接口。
todos:
- id: add-rule-desc-ddl
content: 在 slot_console/db 与 slot_admin/db 增加 s_recharge_gift_config.rule_desc 的 DDL
status: completed
- id: wire-admin-rule-desc
content: 打通 slot_admin 的 validate/logic/model 对 rule_desc 的读写
status: completed
- id: wire-console-rule-desc
content: 在 slot_console 模型与 DailyRebate info 返回新增 rule_desc 并保留 help
status: completed
- id: verify-multi-repo
content: 分别校验变更仓库并运行 verify-slot-backend 脚本
status: completed
isProject: false
---
# s_recharge_gift_config 增加 rule_desc 计划
## 目标
-`s_common.s_recharge_gift_config` 增加独立规则说明字段 `rule_desc`
- 后台管理(`slot_admin`)支持新增/编辑/列表读写该字段。
- C 端(`slot_console`)返回新增 `rule_desc`,并继续保留现有 `help` 字段兼容。
## 变更范围
- 数据库 SQL双落点
- [`/Users/ray/Documents/project/www/slot/slot_console/db/install.sql`](/Users/ray/Documents/project/www/slot/slot_console/db/install.sql)
- [`/Users/ray/Documents/project/www/slot/backend/slot_admin/db`](/Users/ray/Documents/project/www/slot/backend/slot_admin/db)
- 增加 `ALTER TABLE s_common.s_recharge_gift_config ADD COLUMN rule_desc ...`(含注释、默认值、可空策略)。
- `slot_admin`(配置录入链路)
- [`/Users/ray/Documents/project/www/slot/backend/slot_admin/app/game/validate/RechargeGiftConfigValidate.php`](/Users/ray/Documents/project/www/slot/backend/slot_admin/app/game/validate/RechargeGiftConfigValidate.php)
- [`/Users/ray/Documents/project/www/slot/backend/slot_admin/app/game/logic/RechargeGiftConfigLogic.php`](/Users/ray/Documents/project/www/slot/backend/slot_admin/app/game/logic/RechargeGiftConfigLogic.php)
- [`/Users/ray/Documents/project/www/slot/backend/slot_admin/app/game/model/RechargeGiftConfigModel.php`](/Users/ray/Documents/project/www/slot/backend/slot_admin/app/game/model/RechargeGiftConfigModel.php)
- 确保 `saveRedPacket/updateRedPacket` 等写入路径可接收并持久化 `rule_desc`,列表查询可读出该字段。
- `slot_console`(对外返回链路)
- [`/Users/ray/Documents/project/www/slot/slot_console/app/model/common/RechargeGiftConfigModel.php`](/Users/ray/Documents/project/www/slot/slot_console/app/model/common/RechargeGiftConfigModel.php)
- [`/Users/ray/Documents/project/www/slot/slot_console/app/api/logic/DailyRebateLogic.php`](/Users/ray/Documents/project/www/slot/slot_console/app/api/logic/DailyRebateLogic.php)
- 在活动元数据中新增 `rule_desc`,并保留现有 `help` 字段。
- 返回策略:`rule_desc` 优先读新字段;`help` 维持原语义不变。
## 验证
- SQL 可执行性:检查字段存在与默认值。
- 后台接口:新增/编辑后回读包含 `rule_desc`
- C 端接口:`DailyRebate info` 同时返回 `help``rule_desc`
- 执行门禁:在变更仓库分别运行 `~/.cursor/hooks/verify-slot-backend.sh`

View File

@@ -0,0 +1,81 @@
---
name: SDK taskProgress 封装
overview: 将 slot_sdk或你们的 SDK 仓库)加入工作区后,可按现有 Wallet Client 模式直接实现 `player-task/task-progress` 的调用封装wallet 侧接口文档已就绪,可作为契约来源。
todos:
- id: add-sdk-workspace
content: 用户将 slot_sdk 加入 Cursor 工作区并告知仓库路径
status: completed
- id: explore-sdk-patterns
content: 阅读 SDK 现有 Wallet Client / HTTP 封装与错误处理约定
status: completed
- id: implement-client
content: 新增 taskProgress 方法、路径常量、请求/响应类型(对齐 player-task-progress-api.md
status: completed
- id: add-tests-or-example
content: 按 SDK 惯例补单测或调用示例(若项目有测试目录)
status: completed
isProject: false
---
# SDK 工作区加入后的直接开发方案
## 结论
**可以。** 当前工作区只有 [slot-wallet](file:///Users/ray/Documents/project/www/ray/slot-wallet),已具备接口契约文档 [doc/player-task-progress-api.md](doc/player-task-progress-api.md) 与实现对照(`PlayerTaskController``PlayerTaskQueryService` 等)。把 **SDK 仓库** 作为第二个根目录(或 monorepo 子目录)加入工作区后,我可以:
1. 阅读 SDK 里现有 Wallet/HTTP Client 的命名、基类、错误处理、DTO 约定;
2. 新增 `taskProgress`(或团队统一命名)方法、路径常量、请求/响应类型;
3. 若有单测/示例,补一条调用示例或 Feature 测试;
4. 保证字段 **snake_case** 与 HTTP JSON 一致,成功判定 `code === 0`
```mermaid
flowchart LR
subgraph workspace [Cursor Workspace]
Wallet[slot-wallet]
SDK[slot_sdk]
end
Doc[player-task-progress-api.md]
Wallet --> Doc
SDK -->|reads patterns| SDK
Doc -->|contract| SDK
SDK -->|POST player-task/task-progress| Wallet
```
## 你需要做的准备
| 项 | 说明 |
|----|------|
| 加入工作区 | Cursor**File → Add Folder to Workspace**,选中 SDK 仓库根目录 |
| 告知路径 | 例如 `company/ray/slots/slot_sdk`(与你们实际目录一致即可) |
| 语言确认 | 若是 PHP `slot_sdk`、Go、TS 等,我会跟现有 Client 语言一致,不另起一套风格 |
无需改 wallet 代码即可开始 SDK 开发wallet 接口已实现完毕。
## 我会按什么写(预期产出)
以 SDK 现有 Wallet Client 为模板(具体类名需打开 SDK 后确认),典型改动:
- **路径常量**`player-task/task-progress`
- **请求**`uid`, `currency`(可选统一附带 `trace_id` 若其他接口都有)
- **响应模型**`summary` + `bonus_tasks[]` + `deposit_tasks[]`,字段与 [doc/player-task-progress-api.md](doc/player-task-progress-api.md) §5 一致
- **错误**:复用 SDK 已有 `WalletApiError` / `code !== 0` 处理
## 跨仓库发布(团队规范)
按 [`.cursor/rules/slot-wallet-layers-and-delivery.mdc`](file:///Users/ray/Documents/project/www/ray/slot-wallet/.cursor/rules/slot-wallet-layers-and-delivery.mdc) §89
1. **先在 SDK 仓库** `commit``push`
2. 消费方(如 slot-wallet 若通过 composer 依赖 SDK`composer update` 并锁 `composer.lock`
当前 [composer.json](file:///Users/ray/Documents/project/www/ray/slot-wallet/composer.json) **尚未**声明 `slot_sdk` 依赖,说明 SDK 可能独立发布或由其他服务引用——这不影响我在 SDK 仓库内直接编码。
## 建议的确认项(加入工作区后第一条消息说明即可)
1. SDK 仓库在本机的**绝对路径**或文件夹名;
2. 方法命名偏好:`taskProgress` / `getPlayerTaskProgress` / 与现有 `wallet()` 等方法对齐;
3. 是否需要 **foundation 常量**(如 `source_type`)进 SDK还是仅透传 int。
## 不在本次默认范围
- 修改 wallet 服务端实现(已满足 PRD §26.1
- 自动 `composer update` 到其他服务(除非你明确要求并给出目标仓库)。

View File

@@ -0,0 +1,16 @@
---
name: slot workspace
overview: 在 `/Users/ray/Documents/project/www/slot` 创建一个 Cursor/VS Code workspace 文件,并把该目录下一级项目文件夹加入 workspace。默认排除隐藏目录 `.vscode`,不递归加入嵌套子目录。
todos: []
isProject: false
---
# 创建 Slot Workspace
将创建 `[slot.code-workspace](/Users/ray/Documents/project/www/slot/slot.code-workspace)`,内容使用标准 VS Code/Cursor workspace JSON
```json
{
"folders": [
{ "path": "backend" },
{ "path": "monitor" }

View File

@@ -0,0 +1,176 @@
---
name: Slot 硬规则落地
overview: 在用户级 `~/.cursor` 强化分层/PHPDoc 规则为可执行 checklist并新增 Cursor Hooks拦截宿主机 php/composer、在 Agent 结束前自动跑仓库校验脚本,未通过则注入 follow-up 要求继续修复。
todos:
- id: hooks-scripts
content: 新建 ~/.cursor/hooks.json、block-host-php.sh、verify-slot-backend.sh 并 chmod +x
status: completed
- id: rules-mdc
content: 扩展 backend-layering.mdcphp-doc alwaysApply新增 agent-completion-gate.mdc
status: completed
- id: plan-dod
content: 每日返水 plan 追加 Definition of Done与脚本检查项一致
status: completed
- id: verify-hooks
content: 手动验证:宿主机 php 拦截、docker php 放行、verify 脚本 PASS/FAIL
status: in_progress
isProject: false
---
# Slot 后端硬规则落地
## 目标
把当前「软约束」升级为三层:
| 层级 | 手段 | 效果 |
|------|------|------|
| 上下文 | 规则 `alwaysApply` + 完成前 MUST | 每条对话强制可见 |
| 行为 | Agent 必须跑校验脚本并贴输出 | 可审计、可复查 |
| 机器 | Cursor Hooks `failClosed` | 违反则阻断或自动续跑修复 |
不依赖各 slot 仓库已有 CI目前无 `.github/workflows`、无 pre-commit**先落在用户级 `~/.cursor`**,对你当前多根工作区(`slot_console``backend/slot_admin` 等)全部生效。
## 1. 强化 Cursor Rules`~/.cursor/rules/`
### 1.1 扩展 [backend-layering.mdc](file:///Users/ray/.cursor/rules/backend-layering.mdc)
在文末新增 **「Agent 完成前 MUST」**(短、可验证):
- **重命名/删除类**:对本次 diff 中删除的 `*.php`,提取类名,在 `~/Documents/project/www/slot``rg` 引用数为 **0**
- **新建/大改 `app/api/controller/*`**:必须 `extends \slotLib\basic\BaseController`,构造注入对应 `*Logic` + `*Validator`;参照 [FreeCreditsController.php](file:///Users/ray/Documents/project/www/slot/slot_console/app/api/controller/FreeCreditsController.php)。
- **禁止 Logic 型 Service**:不得新建以单业务用例编排为主、仅转发 Model/Logic 的 `app/service/*Service``DailyRebateCalcService` 这类**公共计算**除外)。
- **声称完成前**:必须执行 `~/.cursor/hooks/verify-slot-backend.sh`,在最终回复粘贴脚本输出(`PASS``FAIL` 明细)。
### 1.2 调整 [php-doc.mdc](file:///Users/ray/.cursor/rules/php-doc.mdc)
- `alwaysApply: false`**`alwaysApply: true`**
- 在「Agent 执行要求」增加:**最终回复必须含一行 `PHPDoc: checked` 或列出例外文件**
与 layering 规则叠加后PHPDoc 不再因 glob 未命中而漏掉。
### 1.3 新增 [agent-completion-gate.mdc](file:///Users/ray/.cursor/rules/agent-completion-gate.mdc)
`alwaysApply: true`,仅 1520 行,避免与 layering 重复:
- 引用校验脚本路径与 Hooks 行为
- 禁止在未跑脚本前写「已完成 / 可以合并」
- 多仓库任务:脚本会扫描 `slot_*``backend` 下有 git 的目录
## 2. Cursor Hooks用户级真正「硬」
新建:
- [~/.cursor/hooks.json](file:///Users/ray/.cursor/hooks.json)
- [~/.cursor/hooks/block-host-php.sh](file:///Users/ray/.cursor/hooks/block-host-php.sh)
- [~/.cursor/hooks/verify-slot-backend.sh](file:///Users/ray/.cursor/hooks/verify-slot-backend.sh)
```mermaid
flowchart TD
shell[Agent_Shell_command]
blockHook[block-host-php.sh]
edit[PHP_file_edits]
stop[Agent_stop]
verify[verify-slot-backend.sh]
shell --> blockHook
blockHook -->|deny_naked_php_composer| block[permission_deny]
blockHook -->|docker_exec| allow[permission_allow]
stop --> verify
verify -->|FAIL| followup[followup_message_continue_fix]
verify -->|PASS| done[session_ends]
```
### 2.1 `beforeShellExecution` — 落实 [dev-environment.mdc](file:///Users/ray/.cursor/rules/dev-environment.mdc)
**`block-host-php.sh`**`failClosed: true`
- 若命令以 `php` / `composer` 开头且**不包含** `docker exec``permission: deny`
- 允许:`docker exec ... php``docker exec ... composer`
- 其它命令 → `allow`
这样宿主机误跑 PHP 会被 Hook **直接拦住**,不依赖模型记忆。
### 2.2 `stop` — 分层与调用方收尾
**`verify-slot-backend.sh`**`failClosed: false`,失败时返回 `followup_message` 让 Agent 继续改):
扫描根目录:`/Users/ray/Documents/project/www/slot` 下各子仓库(存在 `.git``slot_*``backend`
| 检查 | 逻辑 |
|------|------|
| 删除类无残留引用 | `git diff --diff-filter=D --name-only` 的 PHP → 解析 `class X``rg '\bX\b'` 全 slot 根,非 0 则 FAIL |
| API Controller 结构 | `git diff --name-only` 命中 `app/api/controller/*.php` → 文件须含 `extends \slotLib\basic\BaseController`(无则 FAIL除非文件头有 `@layering-exempt` |
| 禁止符号回归 | 内置 banlist首项 `DailyRebateService``rg` 命中即 FAIL |
| 可选轻量 PHPDoc | 对 diff 中新增的 `public function`,上一行非 `/**` 则 WARN不阻断避免历史债 |
输出格式固定:
```
=== verify-slot-backend ===
PASS
```
`FAIL` + 逐条原因;`stop` hook 解析到 `FAIL` 时返回 `followup_message`:「校验未通过,按明细修复后重跑脚本」。
脚本依赖:`bash``git``rg`(你本机已有);不依赖 `jq`(用 grep/sed 解析 stdin降低 hook 环境差异)。
### 2.3 `hooks.json` 草案
```json
{
"version": 1,
"hooks": {
"beforeShellExecution": [
{
"command": "./hooks/block-host-php.sh",
"matcher": "^\\s*(php|composer)\\b",
"failClosed": true
}
],
"stop": [
{
"command": "./hooks/verify-slot-backend.sh",
"failClosed": false
}
]
}
}
```
路径相对 **`~/.cursor/`**(用户 hook 约定)。创建后 `chmod +x` 两个脚本。
**验证步骤**(实施后手动测一次):
1. Agent 尝试 `php -v` → 应被拦截
2. `docker exec ... php -v` → 应放行
3. 故意留 `DailyRebateService` 引用 → `stop` 应触发 follow-up
## 3. 每日返水 Plan 补 DoD可选与硬规则对齐
在 [每日返水活动化改造_dd1575a1.plan.md](file:///Users/ray/.cursor/plans/每日返水活动化改造_dd1575a1.plan.md) 末尾加 **Definition of Done** 小节(与脚本检查项一致),便于人工对照:
- `rg DailyRebateService` → 0
- `DailyRebateController` 对齐 `FreeCreditsController`
- 删除 orphan `dailyRebateTierConfig/*`
- `verify-slot-backend.sh` → PASS
(仅更新 plan 文档,不执行业务代码。)
## 4. 不纳入首期的项(避免过度工程)
- 各仓库 CI / pre-commit可后续把 `verify-slot-backend.sh` 拷到 `scripts/` 进 pipeline
- `DailyRebateTierValidateService` 迁到 Validate 层:属代码重构,单独 PR
- `afterFileEdit` 每次保存都跑校验:太吵,先用 `stop` + 规则要求手动跑脚本
## 5. 实施顺序
1. 写两个 hook 脚本 + `hooks.json`,本地 chmod + 试跑脚本
2. 改/增三个 `.mdc` 规则文件
3. 更新每日返水 plan 的 DoD若你同意
4. 重启 Cursor 或确认 Hooks 面板已加载
## 风险与说明
- **Hooks 是 Cursor 产品能力**:需 Cursor 版本支持 `hooks.json`;若 `stop` 的 stdin 字段与文档不一致,首版脚本以「扫描 git diff」为主不依赖复杂 JSON 字段。
- **硬 ≠ 100%**:模型仍可能不写 follow-up 前的脚本输出;`stop` hook 是兜底。二者叠加后明显严于仅 Rules。
- **多根工作区**:脚本按 `~/Documents/project/www/slot/*/git` 遍历,不依赖当前打开哪个 folder。

View File

@@ -0,0 +1,165 @@
---
name: status 接口字段精简
overview: 对照需求文档精简 C 端 status/claim 响应字段并将所有金额由千分位qf转为大单位与全站 getNumberFormat 一致innerapi 仍返回 qf 全量。
todos:
- id: package-list-for-client
content: FreeCreditsPackageModel::listForClient() 返回精简字段amount 经 getNumberFormat 转大单位
status: completed
- id: slim-build-status
content: buildStatus 去掉 activity_id顶层金额与 packages 均转大单位
status: completed
- id: format-first-cashout-amount
content: firstCashout 响应 data.amount 同步转大单位Pay 入参仍用 qf
status: completed
- id: update-controller-phpdoc
content: 更新 FreeCreditsController PHPDoc金额为展示单位 float非千分位
status: completed
- id: client-status-test
content: 单测断言字段白名单及 78500 qf → 78.5 等大单位转换
status: completed
isProject: false
---
# Free Credits status 接口字段精简
## 结论
**可以且应该精简。** 当前 [`buildStatus()`](slot_console/app/api/logic/FreeCreditsLogic.php) 直接 `toArray()` 透出库表列,超出需求文档中 C 端 UI 所需信息;[`activity_id`](slot_console/app/api/logic/FreeCreditsLogic.php) 仅用于后台/内部关联C 端无展示或交互用途。
你已确认:
- **只做删减**,不新增 `total_deposit`(累计充值进度由 C 端从钱包侧获取)。
- **金额转大单位**C 端接口不再返回千分位整数,统一转为展示金额(与 [`AgentController::formatAmountToFloat`](slot_console/app/api/controller/AgentController.php)、[`CommonFn::getNumberFormat`](slot_lib/src/common/CommonFn.php) 一致,默认 `moneyFormat=1000``moneyDot=2`,如 qf `78500``78.5`)。
---
## 需求文档 vs 当前响应
需求文档([首充前免费余额定格与分档释放需求文档.md](docs/requirements/首充前免费余额定格与分档释放需求文档.md))描述的是 **UI 行为**,未定义 JSON 契约,但可反推 C 端必需数据:
| UI 场景(文档章节) | C 端需要的数据 |
| --- | --- |
| 是否展示活动(`status === -1` 隐藏) | `status` |
| 首页 Withdraw 是否曾达赢取门槛§5.2、§7 | `home_withdraw_unlocked` |
| 池总额 / 入口副标题「$78.50 pending」§6.36.6、§9.3、§14.2 | `frozen_amount` |
| 问号弹窗 / 第一档金额§8、§10 | `first_cash_amount``recharge_unlock_amount` |
| 档位列表 Withdraw / Unlock / Claim / Claimed§9.3、§1012 | `packages[]``id``package_type``amount``status` |
| 发起 claim / 第一档提现(现有 API | `packages[].id` → POST `package_id` |
**当前多出的字段:**
- 顶层:`activity_id``recharge_gift_config.id`,仅 innerapi/编排用)
- `packages[]` 全表列:`player_id``activity_id``uid``withdraw_order_id``claim_biz_id``unlocked_time``claimed_time``completed_time``create_time``update_time`
- `package_no` 可保留(便于调试与稳定排序展示),也可仅靠数组顺序;建议 **保留**(成本低、与 DB 序号一致)
**命名与单位:** packages 字段由 `amount_qf` 改为 **`amount`**;顶层与各档 **`amount` 均为大单位 float**(非 qfC 端可直接用于 `$78.50` 类文案,无需再 `/1000`
---
## 目标响应契约C 端)
```json
{
"status": 4,
"home_withdraw_unlocked": 1,
"frozen_amount": 78.5,
"first_cash_amount": 20,
"recharge_unlock_amount": 50,
"packages": [
{
"id": 101,
"package_no": 1,
"package_type": 1,
"amount": 20,
"status": 1
}
]
}
```
`status === -1` 时仍仅 `{ "status": -1 }`(与现逻辑一致)。
**转换规则(实现):**
```php
// 与全站 C 端金额一致qf 为库表 / 内部逻辑整数
private function formatClientAmount(int $amountQf): float
{
return (float) CommonFn::getNumberFormat($amountQf);
}
```
- 应用于:`frozen_amount``first_cash_amount``recharge_unlock_amount``packages[].amount`
- **`firstCashout` 成功响应** `data.amount` 同样转大单位;调用 Pay / 钱包时仍传 qf仅 JSON 对外转换。
- **innerapi / 单测写库** 仍使用 `_qf` 整数,不在 DB 层改单位。
---
## 实现方案
```mermaid
flowchart LR
statusApi[status_claim_firstCashout]
buildStatus[buildStatus]
clientDto[toClientStatusDto]
modelFull[listByPlayerId_toArray]
innerapi[innerapi_list]
statusApi --> buildStatus --> clientDto
buildStatus --> modelFull
innerapi --> modelFull
```
1. **Logic 层统一转换**[`FreeCreditsLogic`](slot_console/app/api/logic/FreeCreditsLogic.php)
- 新增 `formatClientAmount(int $amountQf): float`(封装 `CommonFn::getNumberFormat`)。
-`buildStatus``listForClient`(或 Model 回调)、`firstCashout` 响应共用。
2. **Model 层 C 端 packages**[`FreeCreditsPackageModel`](slot_console/app/model/common/FreeCreditsPackageModel.php)
- 新增 `listForClient(int $playerId, callable $formatAmount): array` 或 Logic 内 `array_map`:只输出 `id``package_no``package_type``amount`(大单位)、`status`
- 保留 `listByPlayerId()` 供 innerapi、dev、集成测试。
3. **收口 DTO**`buildStatus`
- 去掉 `activity_id`
- 顶层三金额字段经 `formatClientAmount``packages``listForClient`
- `status()``claim()``buildStatus` 返回,结构一致。
4. **firstCashout 响应**
- `return ['order_id' => ..., 'amount' => $this->formatClientAmount($package->amount_qf)]`
5. **更新文档**[`FreeCreditsController`](slot_console/app/api/controller/FreeCreditsController.php) PHPDoc
- 删除「千分位整数、展示时除以 1000」描述改为「金额为大单位 float精度见 `moneyDot`」。
6. **单测**
- 新增 `FreeCreditsClientStatusTest`:字段白名单 + `78500` qf → `78.5` 转换断言。
7. **不改动**
- [`innerapi/controller/FreeCreditsController`](slot_console/app/innerapi/controller/FreeCreditsController.php) 仍返回全量 `toArray()`
- `FreeCreditsFreezeDev` 等内部工具继续用 `listByPlayerId`
---
## 字段对照表(精简前后)
| 字段 | 精简前 | 精简后 | 说明 |
| --- | --- | --- | --- |
| `activity_id` | 有 | **删** | C 端不需要 |
| `status` | 有 | 有 | 主状态机 |
| `home_withdraw_unlocked` | 有 | 有 | §5.2 |
| `frozen_amount` | qf 整数 | **float 大单位** | 如 78.5 |
| `first_cash_amount` | qf 整数 | **float 大单位** | 如 20 |
| `recharge_unlock_amount` | qf 整数 | **float 大单位** | 如 50 |
| `packages[].id` | 有 | 有 | claim/cashout |
| `packages[].package_no` | 有 | 有 | 序号展示 |
| `packages[].package_type` | 有 | 有 | 1=提现档 2=领取档 |
| `packages[].amount` | `amount_qf`qf | `amount`**float 大单位** | 重命名 + 转换 |
| `firstCashout.data.amount` | qf | **float 大单位** | 与 status 一致 |
| `packages[].status` | 有 | 有 | UI 状态 |
| `packages[].player_id/uid/...` | 有 | **删** | 内部字段 |
| `packages[].withdraw_order_id` 等 | 有 | **删** | 轮询靠主 `status` + package `status` |
---
## 风险与协调
- **Breaking change**C 端需改为直接使用大单位金额(不再 `/1000`);删除 `activity_id``amount_qf` 及 packages 审计字段。
- **精度**:与 `ShareConfigService::moneyDot` / `moneyFormat` 绑定,勿手写 `/1000`,避免与 VIP/钱包接口不一致。
- **累计充值进度**不纳入本次接口C 端继续从钱包统计接口取(钱包侧金额亦通常为大单位)。

View File

@@ -0,0 +1,70 @@
---
name: status 返回 help
overview: 在 Free Credits C 端 status 接口(及 claim 同源 buildStatus中增加 help 字段,读取活动配置表 recharge_gift_config.help供问号说明弹窗等展示status=-1 仍不返回 help。
todos:
- id: build-status-help
content: FreeCreditsLogic::buildStatus 增加 help 字段(读 config->help
status: completed
- id: update-phpdoc
content: FreeCreditsController::status PHPDoc 补充 help 说明
status: completed
- id: unit-test-help
content: FreeCreditsClientStatusTest 白名单与透传断言
status: completed
isProject: false
---
# status 接口增加 help 返回
## 目标
`GET /api/free-credits/status`(以及 `claim` 成功后的同源响应)在 `status !== -1` 时增加 **`help`string**,内容来自运营在后台活动编辑里填写的 **「帮助说明」**[`recharge_gift_config.help`](slot_console/app/model/common/RechargeGiftConfigModel.php))。
`status === -1` 时保持仅 `{ "status": -1 }`,不附带 help。
## 改动点
### 1. [`FreeCreditsLogic::buildStatus()`](slot_console/app/api/logic/FreeCreditsLogic.php)
在现有返回数组中增加:
```php
'help' => is_null($config) ? '' : strval($config->help ?? ''),
```
- `buildStatus` 已接收 `$config``activeConfig` 查出的 type=11 活动行),无需额外查库。
- 不做 §8 模板占位符替换轻量方案C 端可用已有 `frozen_amount` / `recharge_unlock_amount` / `first_cash_amount` 自行替换,或原样展示运营配置的富文本/多行文案。
### 2. [`FreeCreditsController`](slot_console/app/api/controller/FreeCreditsController.php) PHPDoc
`status` 方法成功字段列表中补充:
- `help` (string) 活动规则说明,来自后台「帮助说明」
### 3. 单测 [`FreeCreditsClientStatusTest`](slot_console/tests/Unit/FreeCreditsClientStatusTest.php)
- `PLAYER_TOP_KEYS` 增加 `help`
- 用例:`FreeCreditsConfigStub` 设置 `help` 属性,`assertSame` 透传
## 数据流
```mermaid
flowchart LR
admin[slot_admin 活动编辑 help 文本框]
db[(recharge_gift_config.help)]
logic[buildStatus]
api["/api/free-credits/status"]
admin --> db --> logic --> api
```
## 验收
- 后台 type=11 活动填写「帮助说明」并保存后,已参加用户 `status` 响应含相同 `help` 字符串
- `status=-1` 响应无 `help` 字段
- 单元测试通过;`claim` 返回结构同步含 `help`(复用 `buildStatus`
## 不在本次范围
- `ext_config` 独立说明模板、动态金额替换服务端拼装
- `banner_image` 透出(如需可另开)
- 前端问号弹窗 UI

View File

@@ -0,0 +1,129 @@
---
name: status 透出后续最小充值
overview: 在 slot_console 的 Free Credits `GET /api/free-credits/status`(及 claim 共用 `buildStatus`)中,将后台 ext_config 的 `subsequent_min_recharge_qf` 以 C 端约定字段 `subsequent_min_recharge`float 大单位)透出,与 `recharge_unlock_amount` 一致。
todos:
- id: logic-expose-field
content: FreeCreditsLogicbuildConfigClientFields / buildStatus / buildPreEnrollmentStatus 透出 subsequent_min_recharge
status: completed
- id: controller-phpdoc
content: FreeCreditsController::status PHPDoc 补充 subsequent_min_recharge 说明
status: completed
- id: unit-tests
content: 更新 FreeCreditsClientStatusTest、FreeCreditsEligibilityTest 白名单与断言
status: completed
- id: run-phpunit
content: php82 容器跑相关单测验证
status: completed
isProject: false
---
# status 透出 subsequent_min_recharge
## 背景
后台 type=11 活动 [`ext_config`](backend/slot_admin_vue/src/views/game/activity/edit.vue) 已保存 **`subsequent_min_recharge_qf`**(后续解锁最小单笔充值,千分位)。
[`FreeCreditsLogic::advanceByRecharge()`](slot_console/app/api/logic/FreeCreditsLogic.php) 充值推进逻辑**已读取**该配置:
```627:628:slot_console/app/api/logic/FreeCreditsLogic.php
$minRecharge = $this->configAmount($config, 'subsequent_min_recharge', self::DEFAULT_SUBSEQUENT_MIN_RECHARGE);
if ($rechargeAmount < $minRecharge || !is_null(FreeCreditsPackageModel::nextReadyReleasePackage($player->id))) {
```
[`configAmount()`](slot_console/app/api/logic/FreeCreditsLogic.php) 会优先读 `key_qf`(即 `subsequent_min_recharge_qf`),再 fallback 旧键 `subsequent_min_recharge`。
但 C 端 [`buildConfigClientFields()`](slot_console/app/api/logic/FreeCreditsLogic.php) / [`buildStatus()`](slot_console/app/api/logic/FreeCreditsLogic.php) 目前只透出 `win_threshold`、`recharge_unlock_amount`、`help`、`banner_image`**缺少**后续档解锁门槛,前端无法展示「单笔充值满 $X 解锁下一档」类文案。
```mermaid
flowchart LR
extConfig["ext_config.subsequent_min_recharge_qf"]
configAmount["configAmount(subsequent_min_recharge)"]
buildFields["buildConfigClientFields"]
statusAPI["status / claim data"]
advanceByRecharge["advanceByRecharge 已有"]
extConfig --> configAmount
configAmount --> advanceByRecharge
configAmount --> buildFields --> statusAPI
```
## 目标契约
| 项 | 约定 |
| --- | --- |
| 接口 | `GET /api/free-credits/status``POST /api/free-credits/claim` 成功后的 `data` 结构相同 |
| 字段名 | **`subsequent_min_recharge`**(与 `recharge_unlock_amount` 命名一致,**不**在 C 端响应中带 `_qf` |
| 类型 | `float`,展示大单位(`formatClientAmount` + `CommonFn::getNumberFormat` |
| 配置来源 | `ext_config.subsequent_min_recharge_qf`(经现有 `configAmount` |
| 默认值 | `DEFAULT_SUBSEQUENT_MIN_RECHARGE = 10`(千分位 → 展示 `10.0` |
| `status=-1` | 仍仅 `{ status: -1 }`,不含本字段 |
| `status=0` 与有 player | 均返回(与 `recharge_unlock_amount` 同级) |
响应片段示例(`status≥0`
```json
{
"status": 2,
"win_threshold": 50.0,
"recharge_unlock_amount": 50.0,
"subsequent_min_recharge": 10.0,
"help": "...",
"packages": []
}
```
## 实现步骤(仅 slot_console
### 1. Logic — [`FreeCreditsLogic.php`](slot_console/app/api/logic/FreeCreditsLogic.php)
在 **`buildConfigClientFields()`** 增加:
```php
'subsequent_min_recharge' => $this->formatClientAmount(
$this->configAmount($config, 'subsequent_min_recharge', self::DEFAULT_SUBSEQUENT_MIN_RECHARGE)
),
```
- `config === null` 时占位 `0.0`(与 `recharge_unlock_amount` 一致)
- 更新方法 `@return` 数组 shape
在 **`buildStatus()`**、**`buildPreEnrollmentStatus()`** 顶层增加:
```php
'subsequent_min_recharge' => $configFields['subsequent_min_recharge'],
```
无需改 Model / Service不新增中转 Service。
### 2. PHPDoc — [`FreeCreditsController.php`](slot_console/app/api/controller/FreeCreditsController.php)
在 `status()` 的 `data` 字段说明中,于 `recharge_unlock_amount` 后补充:
- `subsequent_min_recharge (float)` 解锁下一后续释放档所需**单笔**充值下限(来自 `ext_config.subsequent_min_recharge_qf`
### 3. 单测
| 文件 | 改动 |
| --- | --- |
| [`FreeCreditsClientStatusTest.php`](slot_console/tests/Unit/FreeCreditsClientStatusTest.php) | `PLAYER_TOP_KEYS` 增加 `subsequent_min_recharge`stub 配置加 `subsequent_min_recharge_qf`(如 `10000` → 展示 `10.0`)并断言 |
| [`FreeCreditsEligibilityTest.php`](slot_console/tests/Unit/FreeCreditsEligibilityTest.php) | `testStatusReturnsPreEnrollmentConfigWhenNoPlayer`stub 加 `subsequent_min_recharge_qf`,断言 `subsequent_min_recharge` |
### 4. 验证
```bash
docker exec -w /app/www/slot/slot_console php82 ./vendor/bin/phpunit \
tests/Unit/FreeCreditsClientStatusTest.php \
tests/Unit/FreeCreditsEligibilityTest.php
```
## 不在本次范围
- C 端 / slot_pwa 消费字段与 UI 文案(仅后端补字段)
- 透出 `first_cash_amount`、`package_amount`、`max_unlock_per_recharge` 等其它 ext 配置
- 修改 `advanceByRecharge` 业务规则(已正确读配置)
## 验收
1. 有资格且 `status≥0``data` 含 `subsequent_min_recharge`,值与后台配置的 `subsequent_min_recharge_qf` 一致(大单位)
2. `status=-1`:无该键
3. `claim` 成功返回的 `data` 同样含该字段
4. 上述单测通过

View File

@@ -0,0 +1,106 @@
---
name: status 配置与未充值
overview: 修复 slot_console FreeCreditsLogic::status无玩家池时返回 status=0 及活动配置C 端新增 win_threshold不含 initial_amount、home_withdraw_unlocked。Logic 已按需求变更实现,待对齐单测与 PHPDoc。
todos:
- id: logic-pre-enrollment
content: FreeCreditsLogicbuildPreEnrollmentStatusstatus() 无 player 时返回配置态(已完成)
status: completed
- id: logic-build-status-fields
content: buildStatus / buildConfigClientFields 仅透出 win_threshold不含 initial_amount、home_withdraw_unlocked已完成
status: completed
- id: align-phpdoc
content: FreeCreditsController PHPDoc 与 buildConfigClientFields 注释:删除 initial_amount、home_withdraw_unlocked移除无用 DEFAULT_INITIAL_AMOUNT
status: completed
- id: align-unit-tests
content: FreeCreditsClientStatusTest / FreeCreditsEligibilityTest 白名单与断言与现实现一致
status: completed
isProject: false
---
# Free Credits status 接口修复计划(需求变更版)
## 需求确认2026-05-21
**C 端 `GET /api/free-credits/status` 约定:**
- **包含**`win_threshold`(来自 `ext_config.win_threshold_qf`
- **不包含**`initial_amount``home_withdraw_unlocked`
- 注册赠送金额:仍由 `game_base.user_register_reward` 等其它接口提供
- 首页 Withdraw 解锁C 端用 `status`(如 `STATUS_HOME_UNLOCKED=1`)或钱包余额 + `win_threshold` 自行判断;库表 `home_withdraw_unlocked` 仍由 `syncHomeWithdrawUnlocked` 维护,仅不下发 API
后台 type=11 的 `initial_amount_qf` 配置保留(运营后台用),**不**经 status 透出。
## 问题根因
[`FreeCreditsLogic::status()`](slot_console/app/api/logic/FreeCreditsLogic.php) 原逻辑在无 `free_credits_player` 时返回 `{ status: -1 }`,导致首充前 C 端无法展示活动(`status !== -1` 为展示开关)。
## 目标行为
| 场景 | status | 返回顶层字段 |
| --- | --- | --- |
| 无资格 / 无 type=11 配置 | `-1` | 仅 `status` |
| 有资格 + 有配置 + **无 player** | `0` | `status`, `frozen_amount`, `first_cash_amount`, `win_threshold`, `recharge_unlock_amount`, `help`, `packages`(空数组) |
| 有资格 + 有配置 + **有 player** | 玩家真实值 | 同上 + 玩家 `frozen_amount` / `first_cash_amount` / `packages` |
```mermaid
flowchart TD
statusReq[GET status] --> eligible{资格+活动配置?}
eligible -->|否| notVisible["status=-1"]
eligible -->|是| player{有 player 行?}
player -->|无| preConfig["status=0 + win_threshold 等"]
player -->|有| fullStatus["buildStatus 玩家态"]
```
## 已实现 Logic当前代码无需再改字段集
[`FreeCreditsLogic.php`](slot_console/app/api/logic/FreeCreditsLogic.php) 已与上表一致:
- `status()`:无 player → `buildPreEnrollmentStatus($config)`
- `buildConfigClientFields()`:仅 `win_threshold``recharge_unlock_amount``help`
- `buildStatus()` / `buildPreEnrollmentStatus()`**不**返回 `initial_amount``home_withdraw_unlocked`
## 待办:对齐文档与单测
### 1. PHPDoc — [`FreeCreditsController.php`](slot_console/app/api/controller/FreeCreditsController.php)
- 删除 `initial_amount``home_withdraw_unlocked` 字段说明
- 明确 `status=0` 时仍返回 `win_threshold``recharge_unlock_amount``help`
### 2. 清理 Logic 注释/死代码 — [`FreeCreditsLogic.php`](slot_console/app/api/logic/FreeCreditsLogic.php)
- 删除未使用的 `DEFAULT_INITIAL_AMOUNT` 常量(若仍保留)
- `buildConfigClientFields``@return` 改为仅含 `win_threshold``recharge_unlock_amount``help`
### 3. 单测
| 文件 | 改动 |
| --- | --- |
| [`FreeCreditsClientStatusTest.php`](slot_console/tests/Unit/FreeCreditsClientStatusTest.php) | `PLAYER_TOP_KEYS` 改为:`status`, `frozen_amount`, `first_cash_amount`, `win_threshold`, `recharge_unlock_amount`, `help`, `packages`;移除 `initial_amount``home_withdraw_unlocked` 断言 |
| [`FreeCreditsEligibilityTest.php`](slot_console/tests/Unit/FreeCreditsEligibilityTest.php) | `testStatusReturnsPreEnrollmentConfigWhenNoPlayer`:断言 `win_threshold=50`**不**断言 `initial_amount` / `home_withdraw_unlocked` |
运行:
```bash
docker exec -w /app/www/slot/slot_console php82 vendor/bin/phpunit tests/Unit/FreeCreditsClientStatusTest.php tests/Unit/FreeCreditsEligibilityTest.php
```
## C 端约定(供联调)
- **展示开关**`data.status !== -1`;首充前为 `status === 0`
- **进度条上限**`win_threshold`
- **注册赠送****不要**从 status 取;走注册/大厅配置接口
- **Withdraw 解锁****不要**依赖 `home_withdraw_unlocked` 字段;用 `status` 或余额逻辑
## 不在本次范围
- status 返回 `initial_amount` / `home_withdraw_unlocked`
- 注册发奖改读 `ext_config.initial_amount_qf`
- slot_pwa / gateway 前端改动
- backend 后台 `initial_amount_qf` 编辑能力(已存在)
## 验收清单
1. 无 player`status=0`,含 `win_threshold``recharge_unlock_amount``help``packages=[]`**无** `initial_amount``home_withdraw_unlocked`
2. 有 player含玩家态金额 + 同上配置字段
3. 无资格/无配置:`status=-1`
4. 单测全部通过

View File

@@ -0,0 +1,131 @@
---
name: type11 活动初始金额
overview: 在活动类型 11Free Credits后台编辑表单中新增「活动初始金额」字段以美元小数录入、落库为 ext_config.initial_amount_qf同步补齐 slot_admin 校验与列表展示。数据经现有 ActivityService 透传至 slot_console本任务不改 slot_console 业务逻辑。
todos:
- id: edit-vue-initial-amount
content: edit.vuetype=11 表单项 + setFormData/submit 的 initial_amount ↔ initial_amount_qf 转换
status: completed
- id: index-vue-display
content: index.vuetype=11 列表 ext_config 展示活动初始金额
status: completed
- id: validate-initial-amount
content: ActivityValidate::checkFreeCreditsExt 增加 initial_amount_qf 必填与非负校验
status: completed
- id: manual-verify
content: 本地验证新建/编辑/回填/必填/列表展示
status: completed
isProject: false
---
# 活动类型 11 增加「活动初始金额」后台配置
## 背景与范围
- 需求来源:[首充前免费余额定格与分档释放需求文档.md](docs/requirements/首充前免费余额定格与分档释放需求文档.md) 第 19 节将注册赠送调整为 `$30`;运营需在 **活动类型 11** 的配置里维护「用户注册时的初始金额」。
- **已确认键名**`initial_amount`(表单) / `initial_amount_qf`(落库,千分位整数)。
- **范围**:仅 [backend/slot_admin](backend/slot_admin) 与 [backend/slot_admin_vue](backend/slot_admin_vue)`ActivityController` 已透传 `ext_config``slot_console`,无需改 `slot_console` / `slot_lib`(新字段会原样写入 `s_recharge_gift_config.ext_config` JSON
## 现状(可复用)
type=11 专属编辑已在 [edit.vue](backend/slot_admin_vue/src/views/game/activity/edit.vue) 实现 6 个金额字段 + Banner模式为
- 编辑:`setFormData``*_qf ÷ 1000` 还原为美元小数
- 提交:`submit` 将美元小数 `× 1000` 写入 `*_qf`
- 校验:[ActivityValidate::checkFreeCreditsExt](backend/slot_admin/app/game/validate/ActivityValidate.php) 在 [ActivityController](backend/slot_admin/app/game/controller/ActivityController.php) `save` / `update(updateData)` 时触发
```mermaid
flowchart LR
editVue["edit.vue submit"] --> adminApi["slot_admin ActivityController"]
adminApi --> activitySvc["slotLib ActivityService"]
activitySvc --> consoleInner["slot_console innerapi/activity"]
consoleInner --> extConfig["ext_config JSON"]
```
## 字段定义
| UI 标签 | 表单字段 | 落库字段 | 说明 |
| --- | --- | --- | --- |
| 活动初始金额($) | `ext_config.initial_amount` | `initial_amount_qf` | 用户注册时赠送的免费余额金额placeholder 建议 `30`(对齐需求文档 $30 |
金额处理与现有 6 项一致:`Math.round(Number(v) * 1000)`,回填优先读 `_qf`
## 改动清单
### 1. 编辑表单 — [edit.vue](backend/slot_admin_vue/src/views/game/activity/edit.vue)
`v-if="formData.type == 11"` 区块 **最上方** 增加表单项(置于「首笔赢取门槛」之前):
```vue
<a-form-item
label="活动初始金额($)"
help="用户注册时赠送的免费余额金额"
:rules="[{ required: true, message: '必填' }]">
<a-input-number v-model="formData.ext_config.initial_amount" placeholder="如 30" :min="0"/>
</a-form-item>
```
**`setFormData`type===11 分支)** 增加映射:
```js
initial_amount: e.initial_amount_qf != null ? e.initial_amount_qf / 1000 : e.initial_amount,
```
**`submit`type===11 分支)** 在 `data.ext_config` 中增加:
```js
initial_amount_qf: toQf(e.initial_amount),
```
### 2. 列表展示(可选但建议)— [index.vue](backend/slot_admin_vue/src/views/game/activity/index.vue)
在 type===11 的 `ext_config` 模板中增加一行,复用已有 `formatExtAmount`
```vue
<div>活动初始金额: ${{ formatExtAmount(record.ext_config.initial_amount_qf, record.ext_config.initial_amount) }}</div>
```
### 3. 后端校验 — [ActivityValidate.php](backend/slot_admin/app/game/validate/ActivityValidate.php)
`checkFreeCreditsExt()``$required` 数组追加:
```php
'initial_amount_qf' => '活动初始金额',
```
校验规则与现有金额字段一致:必填、非负整数(千分位)。若业务要求注册赠送必须大于 0可将条件改为 `(int)$extConfig[$key] <= 0` 时报错(与运营确认;默认可先仅要求 `>= 0`,与「首笔赢取门槛」等一致)。
更新方法 PHPDoc由「6 个金额字段」改为「7 个金额相关字段」。
### 4. 无需改动的文件
- [ActivityController.php](backend/slot_admin/app/game/controller/ActivityController.php):已按 type===11 调用 `checkFreeCreditsExt`,无需新增分支。
- `slot_console` / `slot_lib`:本任务只落库配置;注册发奖仍走 `game_base.user_register_reward`,后续若要从 type=11 的 `initial_amount_qf` 读配置,属独立 console 改造。
## 数据流示意
```mermaid
sequenceDiagram
participant Op as 运营后台
participant Vue as edit.vue
participant Val as ActivityValidate
participant DB as ext_config JSON
Op->>Vue: 填写 initial_amount=30
Vue->>Val: submit initial_amount_qf=30000
Val->>DB: 校验通过并保存
Note over DB: 后续 console 可用 configAmount(config,'initial_amount',default)
```
## 验证步骤
1. 新建/编辑 type=11 活动:可见「活动初始金额」,默认 placeholder 30。
2. 保存后 DB/API 返回的 `ext_config``initial_amount_qf`(如 30 → 30000
3. 再次打开编辑:回填为 30美元
4. 必填校验:留空提交应被 `checkFreeCreditsExt` 拦截。
5. 列表页 type=11 行展示「活动初始金额」。
6. 仅改状态(`updateData` 为空)的 update 请求仍不触发 ext 校验(现有逻辑保持不变)。
## 风险与说明
- **与注册发奖未联动**:本任务只完成后台配置录入;`UserRegisterEventService` 仍读 `game_base.user_register_reward`,改活动配置不会自动改变注册到账,需后续 console 改造读取 `initial_amount_qf`
- **全量覆盖 ext_config**`edit.vue` submit 对 type=11 会重建整个 `ext_config` 对象;新增字段必须同时写入 submit 与 setFormData避免编辑时丢失其它键当前实现已是全量重建与现有一致

View File

@@ -0,0 +1,58 @@
---
name: update 返回值 intval
overview: 在 WalletUserStatModel::updateWithOptionalVersion 中对 ThinkORM update 返回值做 intval 显式转换,保证声明返回 int 与运行时一致,并统一所有经该方法的 apply*/incField 出口。
todos:
- id: apply-intval-updateWithOptionalVersion
content: updateWithOptionalVersion 使用 $result + return (int) intval 并补 PHPDoc
status: completed
isProject: false
---
# updateWithOptionalVersion 返回值显式转换
## 问题
[`app/model/WalletUserStatModel.php`](app/model/WalletUserStatModel.php) 中:
```php
private static function updateWithOptionalVersion(...): int {
// ...
return $query->update($data); // 当前仓库版本
}
```
- `incField` / `applyDeposit` / `applyWithdraw`**全部**`updateWithOptionalVersion` 返回「影响行数」。
- ThinkORM 链式 `static::where(...)->update($data)`**BaseQuery** 上文档为 `int`,但 IDE/静态分析常因 `Model::update()` 静态方法(返回 `Modelable`)产生 **联合类型**,与 `: int` 不匹配。
- 你本地已改为 `intval($result)`,这是正确做法:统一把 `false`、数字字符串等收敛为 `int`,避免类型告警与调用方误判。
## 修改(单点即可)
在 [`updateWithOptionalVersion`](app/model/WalletUserStatModel.php) 末尾改为:
```php
$result = $query->update($data);
return (int) $result;
```
`return intval($result);`(与你本地写法等价;项目内可统一用 `(int)``intval`,二选一即可)。
**无需** 在每个 `apply*` / `incField` 再包一层转换——它们已 `return static::updateWithOptionalVersion(...)`,改一处即全覆盖。
## PHPDoc可选一行补充
在方法 `@return` 说明中注明:「对 ORM `update` 结果做整型转换,无匹配行时为 0」。
## 验证
Docker 内复用既有冒烟(`incField` / `applyDeposit`),确认返回仍为 `1`/`0` 整数:
```bash
docker exec -w /app/www/ray/slot-wallet php82 php -r "
# bootstrap 后 WalletUserStatModel::incField(...)
"
```
## 不涉及
- 不改 MQ / WalletLogic
- 不恢复 `inc()->update()` 链式写法

View File

@@ -0,0 +1,53 @@
---
name: wallet-bet-win-api-split
overview: 评估并规划将 bet/win 从统一 update 入口中显式拆分为独立 API同时保留兼容性与幂等语义。
todos:
- id: add-bet-win-controller-endpoints
content: 新增 wallet/bet 与 wallet/win 控制器入口,保留 update 兼容
status: completed
- id: split-validator-dto
content: 拆分 bet/win DTO 与校验场景,减少 type 分支耦合
status: completed
- id: proxy-update-for-compat
content: 让 update 的 bet/win 分支复用新入口流程,确保行为完全一致
status: completed
- id: docs-and-migration
content: 补充 README/doc 迁移说明与灰度/下线节奏
status: completed
isProject: false
---
# Bet/Win API 拆分评估与迁移计划
## 结论
- 对资金域来说,**对外 API 语义上拆分 `bet` / `win` 会更好**:可读性、接入防错、风控审计与权限隔离都会更清晰。
- 但不建议直接废弃 `update`;建议采用“**新增独立接口 + `update` 兼容转发 + 渐进下线**”的迁移路线,避免影响现有上游与历史幂等键。
## 现状依据
- 当前只有一个入口 [`app/api/controller/WalletController.php`](app/api/controller/WalletController.php) 的 `update()`,通过 `type` 分发。
- 分发逻辑在 [`app/api/logic/WalletLogic.php`](app/api/logic/WalletLogic.php) 的 `ACTION_METHOD_MAP``bet/win` 已是独立业务方法。
- 入参模型 [`app/api/dto/request/wallet/WalletUpdateRequestDTO.php`](app/api/dto/request/wallet/WalletUpdateRequestDTO.php) 同时承载多类交易,`round_id``is_end` 仅对 bet/win 有意义。
- 校验器 [`app/validator/Wallet2Validator.php`](app/validator/Wallet2Validator.php) 也是“单场景 + 按 type 条件校验”,存在语义混杂。
## 目标形态
- 提供显式 API`wallet/bet``wallet/win`(自动路由下对应 Controller 方法)。
- `wallet/update` 保留为兼容入口:内部仅做 DTO 转换与分发,不承载新能力。
- 资金与幂等规则保持不变:仍以 `biz_id` + `type`(必要时叠加 `round_id`)确保可追溯与幂等。
## 实施步骤
1. 在 [`app/api/controller/WalletController.php`](app/api/controller/WalletController.php) 新增 `bet()``win()` 方法,复用统一返回封装。
2. 拆分请求 DTO 与校验场景:
- 新增 bet/win 专用 DTO`WalletUpdateRequestDTO` 中抽取必要字段)。
- 在 [`app/validator/Wallet2Validator.php`](app/validator/Wallet2Validator.php) 增加 `SCENE_BET``SCENE_WIN`,去掉“按 type 再二次判断”的耦合。
3. 在 Logic 层保持复用:
- Controller 仍调用 [`app/api/logic/WalletLogic.php`](app/api/logic/WalletLogic.php) 现有 `bet()` / `win()` 实现,避免资金路径重写。
- `update()` 对 bet/win 请求改为调用新入口共享流程(或内部代理),确保行为一致。
4. 文档与对接迁移:
- 在 [`README.md`](README.md) 与 [`doc/wallet.md`](doc/wallet.md) 补充“新接口 + 兼容期 + 下线节奏”。
- 给上游约定迁移窗口,监控 `update(type=bet|win)` 调用量后再决定是否下线。
## 验证要点
- 幂等:重复 `biz_id` 命中行为与现状一致。
- Round`win``is_end=0/1` 中间派奖与最终结算语义不变。
- 资金正确性:下注扣款顺序、派奖分配、流水字段不变。
- 可回滚:任一阶段可回退为仅使用 `update` 入口。

View File

@@ -0,0 +1,132 @@
---
name: WalletUserStat Model
overview: 为 rh_wallet.wallet_user_stat 新增继承 think\Model 的 WalletUserStatModel通过 mysql 连接 + 库名.表名 的 $table 绑定跨库表;提供 inc/version 及充提首末次等领域方法;不改 thinkorm 配置与 WalletLogic。
todos:
- id: wallet-user-stat-model
content: 新增 WalletUserStatModel extends think\Modelconnection/table、PHPDoc、inc/apply* 方法)
status: completed
- id: smoke-verify
content: Docker 内冒烟验证 find/applyDeposit 与 version 行为
status: completed
isProject: false
---
# rh_wallet.wallet_user_stat Model 实现计划
## 背景与约束
- 表:`rh_wallet.wallet_user_stat`**单库单表、非分片**;主键 `(uid, currency)`;金额为 **x1000 整数**;含 `version` 乐观锁。
- 与现有 [`WalletStatModel`](app/model/multi/WalletStatModel.php)`SelfBaseModel` + 分片)**并存**,本次不替换其调用链。
- **直接继承 `think\Model`**;库表绑定参考项目内惯例:`$connection` + **`$table = '库名.表名'`**(与你提供的 `s_statistics.gm_stat_summary` 写法一致)。
```mermaid
flowchart LR
Logic["Logic / Service"]
Model["WalletUserStatModel"]
Conn["connection mysql"]
Table["table rh_wallet.wallet_user_stat"]
Logic --> Model
Model --> Conn
Model --> Table
```
## 实现方案
### 单文件:[`app/model/WalletUserStatModel.php`](app/model/WalletUserStatModel.php)
```php
namespace app\model;
use think\Model;
use think\facade\Db;
/**
* 用户钱包累计统计rh_wallet.wallet_user_stat
*
* @property int $uid
* @property string $currency
* ...
*/
class WalletUserStatModel extends Model
{
/**
* The connection name for the model.
*
* @var string|null
*/
protected $connection = 'mysql';
/**
* The table associated with the model.
* 跨库:库名.表名
*
* @var string
*/
protected $table = 'rh_wallet.wallet_user_stat';
/**
* 复合主键
*
* @var array<int, string>|string
*/
protected $pk = ['uid', 'currency'];
}
```
**说明:**
- **不改** [`config/thinkorm.php`](config/thinkorm.php):沿用现有 `mysql` 连接(`database` 可为空,与分片库同一实例),由 `$table` 全限定名定位 `rh_wallet`
- 主键使用 ThinkORM **数组形式** `['uid', 'currency']`,与表 `PRIMARY KEY (uid, currency)` 一致;`find` / `update` / `destroy` 等可传复合键数组。
### PHPDoc `@property`
与表字段一致:`total_deposit_*``first/last_deposit_*`、提现/促销/返利/退款/拒付字段、`version``created_at``updated_at`;金额单位 x1000。
### 查询与初始化
| 方法 | 说明 |
|------|------|
| `findByUidCurrency(int $uid, string $currency = 'USD'): ?static` | `static::find(['uid' => $uid, 'currency' => $currency])` 或等价 where |
| `lockByUidCurrency(int $uid, string $currency): ?static` | 复合 where + `lock(true)->find()` |
| `insertInitRow(int $uid, string $currency = 'USD'): static` | `static::create(['uid' => $uid, 'currency' => $currency])` |
### 统计更新(参考 [`WalletStatModel::inc`](app/model/multi/WalletStatModel.php)
**通用累加 `incField`**
- `$field` 白名单:仅可 `inc``*_amount` / `*_count`
- `static::where(['uid','currency'])->inc($field, $amount)`,可选 `version` 条件与 `version + 1`
**领域方法(静态,单次 `update`**
| 方法 | 行为 |
|------|------|
| `applyDeposit` | 累加充值金额/次数;更新 `last_deposit_*`;首充写 `first_deposit_*` |
| `applyWithdraw` | 提现对称 |
| `applyPromoBonus` / `applyCashback` / `applyRefund` / `applyChargeback` | 对应累计字段 |
- 金额参数 `int`,禁止 `float`
- 首充/首提用 `Db::raw('IF(...)')` 保证原子性
- 返回影响行数
### 暂不包含
- 不改 [`WalletLogic.php`](app/api/logic/WalletLogic.php)、[`RegisterService.php`](app/service/wallet/RegisterService.php)
## 验证(实现后)
```bash
docker exec -w /app/www/slot/slot_wallet php82 php -r "
// bootstrap 后
var_export(app\model\WalletUserStatModel::findByUidCurrency(1, 'USD'));
"
```
## 文件清单
| 操作 | 路径 |
|------|------|
| 新增 | `app/model/WalletUserStatModel.php` |
**无配置变更**(不新增 `rh_wallet` connection

View File

@@ -0,0 +1,45 @@
---
name: win返回余额叠加pending
overview: 仅在 win 派奖流程中,对返回给第三方的余额叠加本局 pending 派奖,解决连续派奖期间玩家看到余额不增长的问题;不改其他接口。
todos:
- id: win-response-overlay
content: 仅在 win is_end=0 返回值叠加 pendingRoundAmount 到 w/withdraw
status: completed
- id: idempotent-display-check
content: 确认 dedupe 命中时返回余额不重复增长
status: completed
- id: final-settlement-regression
content: 确认 is_end=1 结算与 pending 清理行为不受影响
status: completed
isProject: false
---
# win 派奖返回余额叠加 pending仅 win 场景)
## 目标
在不改变真实账务入账时机(仍以 `is_end=1` Final Settlement 为准)的前提下,让第三方在连续派奖时拿到“可展示余额”:
- `is_end=0`:返回余额包含本局 pending
- 其他场景:不改
## 当前问题定位
在 [app/api/logic/WalletLogic.php](app/api/logic/WalletLogic.php) 的 `win()` 中:
- `is_end=0` 已做 pending 累计
- 但返回值仍是 DB 真实余额(未叠加 pending导致第三方展示不变
## 最小改动方案
仅修改 [app/api/logic/WalletLogic.php](app/api/logic/WalletLogic.php) 的 `win()`
1.`is_end=0` 分支中,累计完成后读取 `pendingRoundAmount = getPendingWinByRound()`
2. 返回给第三方时,将 `withdraw`/`w` 做展示叠加:
- `w = wallet.withdraw_balance + pendingRoundAmount`
- `withdraw = wallet.withdraw_balance + pendingRoundAmount`
3. `deposit` / `bonus` 保持真实值(不动)。
4. `is_end=1` 维持现有逻辑:合并 pending 后走真实结算并清理 pending。
## 兼容与风险
- 仅影响 `type=win` 的返回体,不影响 DB、Lot、流水、下注规则。
- 若第三方把 `w` 当“可立即下注余额”,会产生语义差异(展示值 > 真实可用);但你当前业务前提是第三方只负责展示。
## 验收点
- 连续 `is_end=0`:返回 `w/withdraw` 逐次增长(包含 pending
- 重复 `biz_id``is_end=0`:返回值不重复增长
- `is_end=1`返回值与真实结算后余额一致pending 被清理

View File

@@ -0,0 +1,91 @@
---
name: 中间派奖余额可见化
overview: 在保持 Final Settlement 真账口径不变的前提下,让 is_end=0 中间派奖实时反映到三方读取的余额(接口返回和钱包查询)。
todos:
- id: pending-win-keys
content: 设计并接入 pending round/total 与 dedupe Redis key
status: pending
- id: win-is-end-branch
content: 实现 is_end=0 累计展示、is_end=1 合并结算与清理
status: pending
- id: wallet-query-overlay
content: 让 wallet 查询叠加 pending total 返回最新展示余额
status: pending
- id: dto-validator-update
content: 补齐 is_end DTO 与 win round_id 校验
status: pending
- id: regression-cases
content: 验证多次派奖余额可见、最终结算、幂等与失败重试场景
status: pending
isProject: false
---
# 中间派奖余额可见化is_end改造计划
## 目标
解决“多次派奖时三方读取余额不更新”的问题,同时保持 `win.md` 的核心原则:
- 真正入账、Lot 回流、转化/解锁只在 `is_end=1`Final Settlement执行
- `is_end=0` 仅做中间派奖累计与展示余额更新
## 核心思路
在 Redis 维护“待结算派奖池Pending Win并把它叠加到对外返回余额
- DB 里的 `withdraw/deposit/bonus` 仍保持真实账
- 对外给三方的余额 = 真实账 + pendingWin
这样能保证:
- 三方实时看到余额变化
- 不破坏现有 `WinService` 的 Round Final Settlement 账务逻辑
## 具体改造
### 1) 新增 Pending Win 缓存层
修改 [app/service/RedisKeyManagerService.php](app/service/RedisKeyManagerService.php):新增 key
- `wallet:win:pending:round:{uid}:{currency}:{round_id}`(每局中间派奖累计)
- `wallet:win:pending:total:{uid}:{currency}`(用户币种维度累计,供快速读余额)
- `wallet:win:dedupe:{uid}:{currency}:{round_id}:{biz_id}`(中间派奖严格幂等)
### 2) win 分支行为
修改 [app/api/logic/WalletLogic.php](app/api/logic/WalletLogic.php) 的 `win()`
- `is_end=0`
- 命中 dedupe 直接返回
- 未命中则 `INCRBY pending:round``INCRBY pending:total`
- 返回余额时把 `pending:total` 叠加到 `withdraw`(仅对外展示)
- 不调用 `WinService::execute`、不写 `BIZ_TYPE_WIN`
- `is_end=1`
- 读取 `pending:round``finalWin = fee + pendingRound`
-`finalWin` 调用现有 [app/service/wallet/WinService.php](app/service/wallet/WinService.php)
- 成功后清理 `pending:round` 并从 `pending:total` 扣除对应值
- 返回余额按真实账(此时 pending 已回收)
### 3) 钱包查询返回也要可见化
修改 [app/api/logic/WalletLogic.php](app/api/logic/WalletLogic.php) 的 `query()` 返回:
-`pending:total` 叠加到返回字段 `w/withdraw`
- 这样第三方无论读 `win` 返回还是调用 `wallet` 查询,都看到“最新展示余额”
### 4) DTO/校验补齐
- 在 [app/api/dto/request/wallet/WalletUpdateRequestDTO.php](app/api/dto/request/wallet/WalletUpdateRequestDTO.php) 增加 `is_end`(默认 1
- 在 [app/validator/Wallet2Validator.php](app/validator/Wallet2Validator.php) 增加:
- `is_end` 仅允许 `0/1`
- `win` 场景强制 `round_id` 必传
## 一致性与幂等
- `is_end=0`Redis dedupebiz_id 级)防重复累计
- `is_end=1`:延续现有 `wallet_log(uid,biz_id,biz_type=win)` 幂等
- 若 Final 失败,不清 pending便于重试恢复
## 风险说明(需明确)
- 该方案是“展示余额实时、真账延后”:若上游把展示余额当可立即可下注余额,可能出现下注时余额校验不一致。
- 若你需要“中间派奖立即可下注”,则要走另一套方案(中间账临时入库 + Final 对冲重分配),改动会显著更大。
## 改动文件
- [app/service/RedisKeyManagerService.php](app/service/RedisKeyManagerService.php)
- [app/api/dto/request/wallet/WalletUpdateRequestDTO.php](app/api/dto/request/wallet/WalletUpdateRequestDTO.php)
- [app/validator/Wallet2Validator.php](app/validator/Wallet2Validator.php)
- [app/api/logic/WalletLogic.php](app/api/logic/WalletLogic.php)
## 验收场景
- 多次 `is_end=0` 后,`win` 返回余额递增
- 多次 `is_end=0` 后,`wallet` 查询余额递增
- `is_end=1` 触发后final 入账金额 = 中间累计 + 最后一笔
- 重放同一 `is_end=0` `biz_id` 不重复累计
- 重放同一 `is_end=1` `biz_id` 不重复结算

View File

@@ -0,0 +1,228 @@
---
name: 任务进度筛选对接
overview: 新增独立分页接口 `player-task/task-list`(筛选 task_type + status + page/page_size供前端双下拉表格使用保留现有 `player-task/task-progress` 全量快照不变。同步 slot_sdk 与 API 文档。
todos:
- id: wallet-model-paginate
content: WalletFundLotModel 新增 paginatePlayerTaskLots按 lot_type/status 分页)
status: completed
- id: wallet-task-list-api
content: 新增 taskList 全链路Validator/DTO/Logic/Service/Controller
status: completed
- id: sdk-task-list
content: slot_sdk 新增 taskList 请求/响应实体与 WalletService 方法
status: completed
- id: api-doc-list
content: 新增 doc/player-task-list-api.md含前端双下拉 + 分页说明)
status: completed
- id: feature-tests-list
content: Feature 测试筛选、分页、参数校验task-progress 回归不变
status: completed
isProject: false
---
# 玩家任务进度:新增分页列表接口
## 背景与目标
- **现有** [`player-task/task-progress`](doc/player-task-progress-api.md):只读全量快照(`bonus_tasks` + `deposit_tasks` + `summary`**不改契约**,继续给大厅/SDK 轻量查询用。
- **新增** `player-task/task-list`:面向 **前端操作页**(双下拉 + 表格),支持 **类型筛选、状态筛选、分页**
前端操作区:
| 下拉框 | 选项 | 说明 |
|--------|------|------|
| 任务类型 | **Bonus** / **Deposit** | 必填,二选一 |
| 状态 | **全部** + Waiting / Active / PendingConversion / PlayedOut | `status=0` 或不传 = 全部可见态 |
```mermaid
flowchart TB
subgraph keep [保持不变]
TP["POST task-progress"]
TP --> Full["bonus_tasks + deposit_tasks 全量"]
end
subgraph newApi [新增]
TL["POST task-list"]
TL --> Filter["task_type + status"]
TL --> Page["page + page_size"]
Page --> List["list + 分页元数据"]
end
UI[前端表格页] --> TL
Lobby[大厅轻量展示] --> TP
```
---
## 1. 新接口契约
### 1.1 路由
| 项 | 值 |
|----|-----|
| Method | `POST` |
| Path | `player-task/task-list` |
| Controller | [`PlayerTaskController::taskList`](app/api/controller/PlayerTaskController.php)(新增方法) |
### 1.2 请求参数
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `uid` | int | 是 | 用户 ID |
| `currency` | string | 是 | 币种,如 `TGO` |
| `task_type` | string | **是** | `bonus` \| `deposit` |
| `status` | int | 否 | `0` 或省略 = 全部玩家可见态;`1`/`2`/`3`/`5` = 单态 |
| `page` | int | 否 | 页码,默认 `1`,最小 `1` |
| `page_size` | int | 否 | 每页条数,默认 `20`,建议上限 `100` |
校验([`PlayerTaskValidator`](app/validator/PlayerTaskValidator.php) 新 scene `list`
- `uid``require|integer`
- `currency``require`
- `task_type``require|in:bonus,deposit`
- `status``integer|in:0,1,2,3,5`(可空,默认 0
- `page``integer|egt:1`(可空)
- `page_size``integer|between:1,100`(可空)
**前端映射**
| UI | 请求 |
|----|------|
| Bonus | `"task_type": "bonus"` |
| Deposit | `"task_type": "deposit"` |
| 全部 | 不传 `status``"status": 0` |
| Waiting / Active / … | `status` = `1` / `2` / `3` / `5` |
| 翻页 | 修改 `page`(切换筛选时重置 `page=1` |
### 1.3 成功响应 `data`
与仓库 [`SearchShardService`](app/service/search/shard/SearchShardService.php) 分页习惯对齐(`data``list`
```json
{
"task_type": "bonus",
"list": [ /* PlayerTaskItem task-progress 任务项字段相同 */ ],
"total": 15,
"page": 1,
"page_size": 20,
"last_page": 1
}
```
- `list[]` 元素结构 **复用** [`PlayerTaskItemEntity::toApiArray()`](app/entity/wallet/PlayerTaskItemEntity.php)(与 `task-progress` 单条一致)。
- 排序:`consume_priority_at ASC`, `lot_id ASC`(与现 [`listPlayerTaskLots`](app/model/multi/WalletFundLotModel.php) 一致)。
- 状态范围:默认仍为 PRD §26.1 四态 `[1,2,3,5]`**不含** Completed/Cancelled/Reversed`task-progress` 一致)。
### 1.4 与 `task-progress` 的分工
| 接口 | 场景 | 返回 |
|------|------|------|
| `task-progress` | 一次拿全量两类任务 + 计数汇总 | `summary` + `bonus_tasks` + `deposit_tasks` |
| `task-list` | 表格页:选定类型 + 状态 + 翻页 | 单维 `list` + 分页字段 |
---
## 2. wallet 实现要点
### 2.1 Model
在 [`WalletFundLotModel`](app/model/multi/WalletFundLotModel.php) 新增:
```php
/**
* 分页查询玩家任务 Lot。
* @return array{list: array, total: int, page: int, page_size: int, last_page: int}
*/
public function paginatePlayerTaskLots(
string $currency,
int $lotType,
array $statuses,
int $page,
int $pageSize
): array
```
- `statuses` 为空时直接返回空分页(与 `listPlayerTaskLots` 一致)。
- 使用 ThinkORM `paginate($pageSize, false, ['page' => $page])`,再将 `data` 重命名为 `list`
### 2.2 Service
在 [`PlayerTaskQueryService`](app/service/wallet/PlayerTaskQueryService.php) 新增 `queryTaskList(...)`
- `task_type` 字符串 → `LOT_TYPE_BONUS` / `LOT_TYPE_DEPOSIT`
- `status``PLAYER_VISIBLE_STATUSES` 或单元素数组
- 调用 Model 分页后,`buildTaskItems()` 组装 `list`
### 2.3 分层文件(新增/扩展)
| 层级 | 文件 |
|------|------|
| DTO | `app/api/dto/request/PlayerTaskListRequestDTO.php`(新建) |
| Validator | `PlayerTaskValidator` 增加 `SCENE_LIST` |
| Logic | `PlayerTaskLogic::taskList()` |
| Controller | `PlayerTaskController::taskList()` |
**不修改** `PlayerTaskProgressRequestDTO` / `taskProgress` 逻辑。
---
## 3. slot_sdk
新增(与 wallet 字段 snake_case 一致):
| 类型 | 文件 |
|------|------|
| 请求 | `PlayerTaskListRequestEntity.php` |
| 响应 | `PlayerTaskListResponseEntity.php`(含 `list``total``page``page_size``last_page``task_type` |
[`WalletService`](slot_sdk/src/service/wallet/WalletService.php) 新增:
```php
public function taskList(PlayerTaskListRequestEntity $entity): ?PlayerTaskListResponseEntity
// POST api/player-task/task-list
```
`taskProgress` / `PlayerTaskProgressRequestEntity` **保持不变**
发布slot_sdk commit → push → slot-wallet `composer update`
---
## 4. 文档
- **新建** [`doc/player-task-list-api.md`](doc/player-task-list-api.md):路由、入参、响应、前端双下拉 + 翻页交互、与 `task-progress` 对比、curl 示例。
- [`doc/player-task-progress-api.md`](doc/player-task-progress-api.md) 顶部增加「列表分页请用 task-list」交叉引用。
- [`doc/wallet.md`](doc/wallet.md) §26.1 补充 `task-list` 一行说明。
---
## 5. 测试
新建 `tests/Feature/PlayerTaskListTest.php`(造数参考 [`WalletRegisterBetWinTest`](tests/Feature/WalletRegisterBetWinTest.php)
| 用例 | 断言 |
|------|------|
| `task_type=bonus` + 默认分页 | `list` 非空项字段完整;`total >= len(list)` |
| `status=2` | `list``status` 均为 2 |
| `page=2` + `page_size=1` | 第二页与总数一致 |
| 缺 `task_type` | `40003` |
| `page_size=101` | `40003` |
| `task-progress` 仍返回双数组 | 回归,不受新接口影响 |
容器内执行:`docker compose exec -T php82` + 项目 PHPUnit 命令。
---
## 6. 不在本次范围
- 修改 `task-progress` 入参或响应
- 任务类型「全部」合并在一个列表
- 运营后台终态Completed 等)纳入筛选
- 前端页面实现(本仓库无前端)
---
## 7. 关键文件一览
| 仓库 | 变更 |
|------|------|
| slot-wallet | `PlayerTaskController``PlayerTaskLogic``PlayerTaskQueryService``WalletFundLotModel``PlayerTaskValidator`、新 DTO、`doc/player-task-list-api.md`、Feature 测试 |
| slot_sdk | 新 Entity ×2、`WalletService::taskList``readme.md` |

View File

@@ -0,0 +1,115 @@
---
name: 修复第一档绑卡类型
overview: "`WithdrawService::apply` 在 Free Credits 第一档(`package_id > 0`)分支把 `checkBankInfo` 返回的收款配置数组传给了需要 `UserBankCardModel``applyFreeCreditsFirstCashout`,导致 PHP 8 类型错误且 Pay 载荷取不到 `btc/usdt/email` 等字段。"
todos:
- id: refactor-checkBankInfo-return
content: WithdrawService::checkBankInfo 返回 ['model' => UserBankCardModel, 'config' => itemConfig] 并补 PHPDoc
status: cancelled
- id: fix-apply-branch
content: WithdrawService::apply 解构返回值FC 传 model普通提现用 config
status: cancelled
- id: run-integration-test
content: php82 跑 FreeCreditsFirstCashoutApplyTest 验证无 TypeError
status: completed
isProject: false
---
# 修复第一档提现绑卡类型不匹配
## 问题
[`WithdrawService::apply`](slot_console/app/service/WithdrawService.php) 中:
```171:175:slot_console/app/service/WithdrawService.php
$bankInfo = $this->checkBankInfo($applyDTO);
if ($applyDTO->package_id > 0) {
return $this->applyFreeCreditsFirstCashout($applyDTO, $bankInfo);
}
```
[`checkBankInfo`](slot_console/app/service/WithdrawService.php) 在持久化 `UserBankCardModel` 后 **返回的是按支付类型整理的 `$itemConfig` 数组**(约 353 行 `return $itemConfig`),供普通提现填 `WithdrawalInfo`
```216:219:slot_console/app/service/WithdrawService.php
$withdrawalInfo->account = $bankInfo['account'];
$withdrawalInfo->address = $bankInfo['account'];
$withdrawalInfo->userName = $bankInfo['user_name'] ?? $userTag->uid;
$withdrawalInfo->card_number = $bankInfo['card_number'] ?? '';
```
而 [`applyFreeCreditsFirstCashout`](slot_console/app/service/WithdrawService.php) / [`FreeCreditsLogic::buildFirstCashoutWithdrawalInfo`](slot_console/app/api/logic/FreeCreditsLogic.php) 签名要求 **`UserBankCardModel`**,并读取模型字段:
```490:507:slot_console/app/api/logic/FreeCreditsLogic.php
'userName' => $post['user_name'] ?? $bank->user_name ?? strval($uid),
'account' => empty($bank->card_number) ? strval($uid) : $bank->card_number,
...
if ($payType === 2) {
$withdrawalInfo->address = $bank->btc ?? '';
} elseif ($payType === 3) {
$withdrawalInfo->address = $bank->usdt ?? '';
} elseif ($payType === 6) {
$withdrawalInfo->userName = trim($bank->paypal_first_name . ' ' . $bank->paypal_last_name);
$withdrawalInfo->account = $bank->email ?? '';
```
因此第一档路径在 PHP 8 下会触发 `TypeError`;即便未开严格类型,用数组当对象也会导致 Pay 下单字段错误。
```mermaid
flowchart LR
apply[WithdrawService.apply]
checkBank[checkBankInfo]
saveModel[save UserBankCardModel]
returnConfig["return itemConfig array"]
fcBranch[package_id greater than 0]
normalBranch[normal withdraw]
fcMethod[applyFreeCreditsFirstCashout]
logic[buildFirstCashoutWithdrawalInfo]
apply --> checkBank
checkBank --> saveModel --> returnConfig
returnConfig --> fcBranch
returnConfig --> normalBranch
fcBranch -->|"wrong: array"| fcMethod
fcMethod --> logic
logic -->|"expects UserBankCardModel"| modelFields[bank.card_number btc usdt]
```
## 推荐改法(单文件、无二次查询)
在 [`WithdrawService.php`](slot_console/app/service/WithdrawService.php) 调整 `checkBankInfo` 返回值,使 `apply` 能同时满足两条路径:
1. **`checkBankInfo` 返回结构体**(关联数组即可,无需新 DTO
- `model` → 已 `save()` 的 `UserBankCardModel`
- `config` → 现有 `$itemConfig`(普通提现继续用)
2. **`apply` 解构**
- `package_id > 0` → `applyFreeCreditsFirstCashout($applyDTO, $bank['model'])`
- 否则 → `$bankConfig = $bank['config']`,后续 `account` / `user_name` / `card_number` 逻辑不变
3. **补 PHPDoc**(符合 [`php-doc.mdc`](/Users/ray/.cursor/rules/php-doc.mdc)
- `checkBankInfo`: `@return array{model: UserBankCardModel, config: array<string, mixed>}`
- `applyFreeCreditsFirstCashout`: 保持现有 `@param UserBankCardModel`
**不改动** `FreeCreditsLogic`:其契约(绑卡已由 `WithdrawService` 写入后传入模型)是正确的。
### 备选(更小 diff多一次查询
若不想改 `checkBankInfo` 签名,可在 `package_id > 0` 分支先调用 `checkBankInfo` 落库,再 `find($uid)` 取模型。可行但冗余,不推荐。
## 测试
- 现有集成测 [`FreeCreditsFirstCashoutApplyTest`](slot_console/tests/Integration/FreeCreditsFirstCashoutApplyTest.php) 已走 `WithdrawService::apply` + `package_id`;修复后应能越过 `TypeError`,继续表现为 Pay 不可用时的 `Throwable` / 余额校验未触发。
- 修复后在 `php82` 容器执行:
```bash
docker exec -w /app/www/slot/slot_console php82 ./vendor/bin/phpunit tests/Integration/FreeCreditsFirstCashoutApplyTest.php
```
(需 `RUN_DB_TESTS=1` 时按项目惯例配置环境变量。)
可选:在 `tests/Unit` 增加轻量测试,用反射调用 `checkBankInfo` 断言返回含 `model` 与 `config` 键——非必须,集成测已覆盖主路径。
## 验收
1. 第一档 `POST /api/withdraw/apply` + `package_id` 不再出现 `UserBankCardModel` 类型错误。
2. 普通提现(无 `package_id`)行为与字段映射不变。
3. Pay 下单能正确带上 `card_number` / `btc` / `usdt` / PayPal 等模型字段(与 `checkBankInfo` 写入一致)。

View File

@@ -0,0 +1,202 @@
---
name: 充值用户 Redis 集合
overview: 在 center 注册共享 Redis key `userRecharged`wallet 侧一次性脚本从分片 `wallet_stat` 回填历史充值用户,并在 `recharge` / `rechargeSign` 成功后实时 SADD 到共享 Redis 集合。
todos:
- id: center-key
content: slot_center sharerediskey.php 增加 userRecharged => user:recharged
status: completed
- id: wallet-service
content: walletRedisKeyManagerService + RechargedUidSetServiceshare Redis SADD
status: completed
- id: wallet-hook
content: WalletLogic::recharge / rechargeSign 成功后调用 RechargedUidSetService::add
status: completed
- id: backfill-cmd
content: 新建 backfillRechargedUidSet 命令:扫 wallet_stat 分片、--dry-run/--rebuild/--batch-size
status: completed
- id: tests
content: 补充 Service/集成测试或 dry-run 验证说明
status: completed
isProject: false
---
# Wallet 充值用户共享 Redis 集合
## 目标
维护一个**全局、持久**的共享 Redis Set成员为「曾成功充值」的用户 uid口径`wallet_stat.total_deposit > 0`,与 [每日返水需求](file:///Users/ray/.cursor/plans/每日返水需求文档_20a03147.plan.md) 中「充值用户」一致)。供后续活动(如每日返水结算)用 `SISMEMBER` 快速判断,避免逐用户查库。
你已确认:
- Key`userRecharged` → Redis `user:recharged`
- `recharge``rechargeSign` 均写入集合
---
## 架构与数据流
```mermaid
flowchart LR
subgraph center [slot_center]
Sharerediskey["config/sharerediskey.php"]
ShareConfigAPI["/innerapi/share-config/all"]
end
subgraph wallet [slot_wallet]
BackfillCmd["BackfillRechargedUidSet command"]
WalletLogic["WalletLogic::recharge / rechargeSign"]
RechargedSvc["RechargedUidSetService"]
StatDB["wallet_XX.wallet_stat_YY"]
end
ShareRedis["Redis connection share"]
Sharerediskey --> ShareConfigAPI
ShareConfigAPI --> RechargedSvc
BackfillCmd --> StatDB
BackfillCmd --> RechargedSvc
WalletLogic --> RechargedSvc
RechargedSvc --> ShareRedis
```
---
## 1. Center注册共享 Key
**文件**[`slot_center/config/sharerediskey.php`](slot_center/config/sharerediskey.php)
在数组末尾增加(含注释):
```php
'userRecharged' => 'user:recharged', // set曾充值用户 uidwallet 维护)
```
该文件已通过 [`ShareConfigController::all()`](slot_center/app/innerapi/controller/ShareConfigController.php) 下发为 `sharerediskey.*`,各服务经 `ShareConfigService::get('sharerediskey.userRecharged')` 读取。
**部署顺序**:先发布 center再发布 wallet否则 wallet 会落到 fallback 默认值key 不一致)。
---
## 2. WalletKey 解析与写入封装
### 2.1 `RedisKeyManagerService`
**文件**[`slot_wallet/app/service/RedisKeyManagerService.php`](slot_wallet/app/service/RedisKeyManagerService.php)
新增方法(与现有 `sourceRealDataKey` 一致,从 center 取 key
```php
public static function getUserRechargedSetKey(): string
{
return ShareConfigService::get('sharerediskey.userRecharged', 'user:recharged');
}
```
### 2.2 新建 `RechargedUidSetService`
**路径**`slot_wallet/app/service/wallet/RechargedUidSetService.php`
职责(公共能力,避免 Logic 直接拼 Redis
- `add(int $uid): void``Redis::connection('share')->sAdd($key, (string)$uid)`
- key 来自 `RedisKeyManagerService::getUserRechargedSetKey()`
- 失败只 `LoggerService::error`,不抛异常(与 `WalletLogic::recharge()``sendConsoleBus` / `createTask` 等非阻断副作用一致)
- **不设 expire**(成员为永久「曾充值」标记;`SADD` 幂等)
参考:[`slot_risk`](slot_risk/app/service/api/BlackUserService.php) 对 `connection('share')->sAdd` 的用法;[`config/redis.php`](slot_wallet/config/redis.php) 已配置 `share` 连接。
---
## 3. 充值链路:实时写入
**文件**[`slot_wallet/app/api/logic/WalletLogic.php`](slot_wallet/app/api/logic/WalletLogic.php)
在以下两处、`total_deposit` 递增且 `RechargeExchangeService::recharge()` 之后,调用 `RechargedUidSetService::add($uid)`
| 方法 | 约行号 | 说明 |
|------|--------|------|
| `recharge()` | ~782 后 | 正常支付充值 |
| `rechargeSign()` | ~820 后 | 签到购,累加统计 |
放在现有 `try/catch` 块内即可,无需单独 try。
**不扩展范围**:全库仅这两处递增 `total_deposit`(已 grep 确认),无需 hook `inc()` 或其它 type。
---
## 4. 一次性回填脚本
### 4.1 Webman Command
**路径**`slot_wallet/app/command/BackfillRechargedUidSet.php`
- `$defaultName = 'backfillRechargedUidSet'`
- 结构参考 [`CleanupWalletLog.php`](slot_wallet/app/command/CleanupWalletLog.php)`LoggerService::initGenerateTraceId`、stdout 汇总、异常返回 `FAILURE`
**选项**
| Option | 作用 |
|--------|------|
| `--dry-run` | 只统计 uid 数量,不写 Redis |
| `--rebuild` | 执行前 `DEL` 目标 set全量重建默认增量 SADD可重复跑 |
| `--batch-size` | 每批 `SADD` 成员数,默认 500 |
### 4.2 扫描逻辑
按 [`InitDB::initWalletStat`](slot_wallet/app/command/InitDB.php) 的分片循环:
```php
for ($i = 1; $i <= $shardInfo['database_num']; $i++) {
$db = sprintf('wallet_%02d', $i);
for ($j = 1; $j <= $shardInfo['table_num']; $j++) {
$table = "{$db}.wallet_stat_" . sprintf('%02d', $j);
// SELECT DISTINCT uid FROM {$table} WHERE total_deposit > 0
}
}
```
- 使用 `DISTINCT uid`(表主键 `(uid, currency)`,多币种各一行,同一 uid 只入 set 一次)
- 分批 `sAdd($key, ...$uids)` 写入 `connection('share')`
- 输出:每表行数、总 uid 数、最终 `SCARD`
### 4.3 执行命令Docker
```bash
docker exec -w /app/www/slot/slot_wallet php82 php webman backfillRechargedUidSet --rebuild
# 预检
docker exec -w /app/www/slot/slot_wallet php82 php webman backfillRechargedUidSet --dry-run
```
**建议上线步骤**
1. 发布 center`userRecharged` 配置)
2. 发布 walletService + Logic + Command
3. 低峰执行 `backfillRechargedUidSet --rebuild`(或先 `--dry-run` 核对数量)
4. 之后新充值由 Logic 自动 `SADD`
---
## 5. 测试wallet 仓库)
| 项 | 方式 |
|----|------|
| `RechargedUidSetService` | 单元测试 mock `Redis::connection('share')`,或集成测试用真实 share Redis若 CI 有) |
| `WalletLogic` | 在现有 [`WalletControllerUpdateTest`](slot_wallet/tests/Integration/WalletControllerUpdateTest.php) / recharge 相关用例后断言 set 含 uid可选依赖 share Redis |
| Command | 本地 `--dry-run` + 小环境 `--rebuild``SCARD` 抽样 `SISMEMBER` |
至少保证Service 在 key 存在时调用 `sAdd` 且不抛异常Command SQL 与分片配置可读。
---
## 6. 不在本次范围(供后续)
- **消费方**(如 `slot_console` 每日返水 cron改为 `SISMEMBER`:需在对应服务增加 `ShareConfigService::get('sharerediskey.userRecharged')` + `connection('share')`,本次仅 wallet 写入。
- center 本地 [`ShareRedisKeyManagerService`](slot_center/app/service/ShareRedisKeyManagerService.php) 可不增方法wallet 直接用 `RedisKeyManagerService` + `ShareConfigService`,与现有 `sourceReal` 一致)。
---
## 涉及文件一览
| 仓库 | 文件 | 变更 |
|------|------|------|
| slot_center | `config/sharerediskey.php` | +1 key |
| slot_wallet | `app/service/RedisKeyManagerService.php` | +`getUserRechargedSetKey()` |
| slot_wallet | `app/service/wallet/RechargedUidSetService.php` | 新建 |
| slot_wallet | `app/api/logic/WalletLogic.php` | recharge / rechargeSign 各 +1 行调用 |
| slot_wallet | `app/command/BackfillRechargedUidSet.php` | 新建一次性脚本 |

View File

@@ -0,0 +1,123 @@
---
name: 定格冻结用户流水
overview: 在 slot_wallet 的 `freeCreditsFreeze` 成功扣款后,补充 `addTransactionRecord` 写入 C 端可见的 `user_transaction_log`;并在 slot_pwa 注册新 `transaction_type` 与列表筛选映射。
todos:
- id: wallet-add-transaction
content: WalletLogic::freeCreditsFreeze 增加 addTransactionRecordtype=65负金额
status: pending
- id: pwa-type-map
content: slot_pwa UserTransactionLogService 注册 type 65 与展示名
status: pending
- id: wallet-unit-test
content: wallet 单测断言 freeCreditsFreeze 写入用户流水
status: pending
- id: run-phpunit
content: php82 跑 wallet 相关单测验证
status: pending
isProject: false
---
# freeCreditsFreeze 补充用户可见流水
## 问题
[`WalletLogic::freeCreditsFreeze()`](slot_wallet/app/api/logic/WalletLogic.php) 当前仅:
1. `minus()` 扣减 deposit/withdraw
2. [`addLog()`](slot_wallet/app/api/logic/WalletLogic.php) 写入分表 **wallet_log**`biz_type=freeCreditsFreeze`
**未**调用 [`addTransactionRecord()`](slot_wallet/app/api/logic/WalletLogic.php),因此 MQ 不会投递到 PWA用户在 **Transaction / 流水页** 看不到定格扣款记录。
对比:普通提现冻结在同文件内已有:
```402:402:slot_wallet/app/api/logic/WalletLogic.php
$this->addTransactionRecord('withdraw frozen', $this->requestDTO->fee * -1, $balance, 7);
```
需求文档 §15.2 要求「必须写钱包流水」——`wallet_log` 已满足后台审计;本需求补齐 **C 端展示流水**。
```mermaid
flowchart LR
freeze[freeCreditsFreeze]
addLog[addLog wallet_log]
addTx[addTransactionRecord]
mq[PWA MQ]
ui[用户流水列表]
freeze --> addLog
freeze --> addTx --> mq --> ui
```
说明:`freeCreditsFreeze` 是**扣款**(金额为负),不是入账;用户列表里应显示为负向变动(与 type 7「Withdraw」冻结类似
## 实现方案slot_wallet + slot_pwa
### 1. slot_wallet — `freeCreditsFreeze` 增加用户流水
文件:[`WalletLogic.php`](slot_wallet/app/api/logic/WalletLogic.php)
在事务内、`addLog` 成功之后、`commit` 之前增加(与 `withdrawFrozen` 一致,失败仅记日志不回滚主事务):
```php
$this->addTransactionRecord(
'Free Credits Freeze',
$this->requestDTO->fee * -1,
$balance,
self::TRANSACTION_TYPE_FREE_CREDITS_FREEZE // 新常量,建议 65
);
```
在 `WalletLogic` 类内新增常量(或集中放在与 PWA 对齐的注释块):
```php
/** 用户流水类型:首充定格冻结扣款,对应 freeCreditsFreeze */
private const TRANSACTION_TYPE_FREE_CREDITS_FREEZE = 65;
```
字段约定(与现有 `addTransactionRecord` 一致):
| 字段 | 值 |
| --- | --- |
| `subject` | `Free Credits Freeze`C 端 `name` 映射用) |
| `amount` | `-fee`(千分位,负数为扣款) |
| `balance_after` | 扣款后 `deposit + withdraw` 总余额 |
| `transaction_id` | 已有规则:`substr(uid,0,3) + biz_id`(幂等键 `free_credits_freeze:{orderId}` |
| `transaction_type` | `65` |
**不**改 `addLog` / 余额扣减逻辑;**不**改 slot_console / slot_lib。
### 2. slot_pwa — 注册 transaction_type=65
文件:[`UserTransactionLogService.php`](slot_pwa/app/service/UserTransactionLogService.php)
- `$typeMaps[-1]`All增加 `65`
- `$typeMaps[1]`Withdraw 分类,已含 7/8增加 `65`(定格扣款与提现类支出归同一 tab可按产品再调
- `$typeToClient[65] = 'Free Credits Freeze'`(或简短文案 `Free Credits`
可选:在 [`UserTransactionLogShardModel.php`](slot_pwa/app/model/shard/UserTransactionLogShardModel.php) 增加 `TRANSACTION_TYPE_FREE_CREDITS_FREEZE = 65` 常量与注释wallet 侧用相同数字wallet 不依赖 pwa 类,注释对齐即可)。
### 3. 单测
| 仓库 | 文件 | 内容 |
| --- | --- | --- |
| slot_wallet | 扩展 [`WalletLogicHarness`](slot_wallet/tests/Support/WalletLogicHarness.php) 或新建用例 | 覆写/桩 `addTransactionRecord`,断言 `freeCreditsFreeze` 成功后调用一次,且 `amount < 0`、`type=65` |
| slot_wallet | 现有 freeze 相关测 | 回归通过 |
运行:
```bash
docker exec -w /app/www/slot/slot_wallet php82 ./vendor/bin/phpunit tests/Unit/WalletFreeCreditsFirstKeepTest.php tests/Unit/WalletFreeCreditInitBusTest.php
# 若有新增 FreezeTransactionTest 则一并跑
```
## 不在本次范围
- `freeCreditsClaim` / `freeCreditsFirstCashKeep` 的用户流水(若也要在流水页展示入账,可另开任务,同样走 `addTransactionRecord` + 新 type
- 修改 `wallet_log` 表结构
- C 端 UI 文案多语言(仅后端 `name` 英文字段)
## 验收
1. 首充定格成功后用户流水列表All / Withdraw出现一条 **负金额** 记录,`name` 为 Free Credits Freeze
2. `transaction_id` 与 `biz_id``free_credits_freeze:{orderId}`可追溯
3. 幂等重试 freezewallet_log 幂等不变 MQ 重复需依赖现有消费端去重 type 7 行为一致本次不单独改 MQ
4. wallet 单测通过

View File

@@ -0,0 +1,95 @@
---
name: 定格列表盈利阈值
overview: 在管理后台首充定格统计列表中,按当前页 UID 调用与 game/pop/index 相同的养客配置接口PopService → slot_pwa getDPByPlayers为每行补充 profitthreshold及可选 hasprofitthreshold字段前端新增对应列。
todos:
- id: pop-service-batch
content: PopService 新增 mapDevelopPlayerByUids按 uid 调用 getPageList 并容错
status: completed
- id: logic-enrich
content: FreeCreditsStatsLogic.list 合并 profitthreshold及可选 hasprofitthreshold
status: completed
- id: vue-columns
content: freeCreditsStats/index.vue 增加盈利阈值列与展示格式化
status: completed
- id: verify-pop-parity
content: 抽 12 个 UID 对比养客配置页与定格列表字段一致
status: completed
isProject: false
---
# 首充定格列表增加盈利阈值
## 背景
- 首充定格统计已迁入 [`slot_admin`](backend/slot_admin/app/game/logic/FreeCreditsStatsLogic.php),接口 `GET /game/freeCreditsStats/index` 返回列表 + 顶部汇总。
- 养客配置页 [`game/pop/index`](backend/slot_admin_vue/src/views/game/pop/config/index.vue) 通过 [`PopController::index`](backend/slot_admin/app/game/controller/PopController.php) → [`PopService::getPageList`](backend/slot_admin/app/service/game/PopService.php) → `slot_pwa` `pop/admin/getDPByPlayers` → 游戏侧 `/api/v2/dp/getDPByPlayers`,列表含 `profitthreshold``hasprofitthreshold` 等字段。
- 需求文档 §18.2 未写盈利阈值,属运营侧补充字段;数据源应与养客页一致,**不用** `UserTag.popBalance` 等本地 tag。
## 数据流
```mermaid
flowchart LR
vue[freeCreditsStats/index.vue] --> api["/game/freeCreditsStats/index"]
api --> logic[FreeCreditsStatsLogic.list]
logic --> db[(s_common free_credits_*)]
logic --> wallet[WalletService statistic]
logic --> pop[PopService getPageList]
pop --> pwa[slot_pwa getDPByPlayers]
pwa --> game["/api/v2/dp/getDPByPlayers"]
```
## 实现要点
### 1. PopService按 UID 批量取养客配置(公共封装)
在 [`PopService.php`](backend/slot_admin/app/service/game/PopService.php) 新增方法,例如 `mapDevelopPlayerByUids(array $uids): array<int, array>`
- 对每个 `uid` 调用现有 `getPageList(['userid' => $uid, 'page' => 1, 'limit' => 1])`(与 pop/index 单用户筛选一致;`starttime`/`endtime` 不传,与养客页默认「全量」查询一致)。
- 从返回 `data[0]` 取行;无记录或接口异常时该 uid 映射为 `null`Logic 展示 `-` / 空)。
- 单 uid 失败只 `logger()->warning`**不**拖垮整页列表(与 `fetchTotalRecharge` 容错一致)。
**说明**`getDPByPlayers` 仅支持单 `userid`,每页最多 100 条 ≈ 最多 100 次 HTTP经 pwa 到游戏 API。当前 `limit` 上限 100可接受若后续性能不足再与游戏侧协商批量接口不在本次范围。
### 2. FreeCreditsStatsLogic列表富化
在 [`FreeCreditsStatsLogic::list`](backend/slot_admin/app/game/logic/FreeCreditsStatsLogic.php) 中,在已有 `fetchTotalRecharge` 之后:
- 调用 `PopService` 批量映射;
- 为每行写入(字段名与 pop/index 保持一致,便于前端复用展示逻辑):
- `profitthreshold``int|null`,配置值(养客页原样展示,**不**除 10000
- 若产品确认需要第二列:`hasprofitthreshold`,游戏侧为千分位类整数,展示时与养客页 [`toNum`](backend/slot_admin_vue/src/views/game/pop/config/index.vue) 一致:`Number((val / 10000).toFixed(2))`
无养客配置的用户:`profitthreshold``null`,前端显示 `-`
**分层**:跨服务 HTTP 封装在 `PopService``FreeCreditsStatsLogic` 只编排,不直接拼 `pwaApiHost` URL。
### 3. 前端:新增列
修改 [`freeCreditsStats/index.vue`](backend/slot_admin_vue/src/views/game/freeCreditsStats/index.vue)
- 在「累计充值金额」后(或渠道后)增加列:
- `盈利阈值``profitthreshold`
- (若选两列)`已达盈利阈值``hasprofitthreshold`slot 内 `/10000` 格式化
- 无自定义 slot 时直接显示;`null`/`undefined` 显示 `-`
路由、API 文件 [`freeCreditsStats.js`](backend/slot_admin_vue/src/api/game/freeCreditsStats.js) **不变**
### 4. 不改动的部分
- `statistics` 顶部 7 项汇总不加盈利阈值(无聚合口径)。
- Validate / DTO 无新筛选项。
- `slot_console` innerapi、`slot_sdk` 无需改动(统计已在 admin
## 验证
- 某 UID 在「养客配置」页能查到 `profitthreshold` 时,定格列表同 UID 显示相同值。
- 无养客配置 UID 显示 `-`,列表其余字段正常。
- pop/pwa 不可用时:列表仍可出数,盈利阈值为空;日志有 warning。
- 与迁前对比:除新增列外,筛选、排序、汇总、累计充值口径不变。
## 涉及文件
| 仓库 | 文件 |
|------|------|
| slot_admin | [`PopService.php`](backend/slot_admin/app/service/game/PopService.php)、[`FreeCreditsStatsLogic.php`](backend/slot_admin/app/game/logic/FreeCreditsStatsLogic.php) |
| slot_admin_vue | [`freeCreditsStats/index.vue`](backend/slot_admin_vue/src/views/game/freeCreditsStats/index.vue) |

View File

@@ -0,0 +1,108 @@
---
name: 定格统计迁入 admin
overview: 将「首充剩余定格列表」的查询与汇总逻辑从 slot_console innerapi 迁入 slot_admin与用户列表等后台能力一致直连 s_common + WalletService前端路由不变。
todos:
- id: add-models
content: 在 slot_admin 新增 FreeCreditsPlayer/Package Models_common
status: completed
- id: migrate-logic
content: 迁入 FreeCreditsStatsLogic + Validate/DTOfetchTotalRecharge 改用 WalletService + UserModel
status: completed
- id: wire-controller
content: 改造 FreeCreditsStatsController移除 ConsoleClient 透传
status: completed
- id: cleanup-bff
content: 删除 console innerapi 与 slot_sdk ConsoleService 中 freeCredits* 方法
status: in_progress
- id: verify-api
content: 对比迁前后列表/汇总与用户列表充值金额口径
status: pending
isProject: false
---
# 首充定格统计迁入 slot_admin去掉 console BFF
## 结论:建议做
当前链路多一跳、职责错位:
```mermaid
flowchart LR
vue[slot_admin_vue] --> admin[slot_admin FreeCreditsStatsController]
admin --> sdk[slot_sdk ConsoleClient]
sdk --> console[slot_console innerapi]
console --> db[(s_common free_credits_*)]
console --> wallet[slot_wallet statistics]
```
[`FreeCreditsStatsController.php`](backend/slot_admin/app/game/controller/FreeCreditsStatsController.php) 注释已写明「仅透传 slot_console innerapi」[`FreeCreditsController`](slot_console/app/innerapi/controller/FreeCreditsController.php) 也标注「仅供 slot_admin 代理调用」——本质是 **admin 专用 BFF**,与 C 端 `FreeCreditsLogic` 无关。
同仓库内后台惯例是 **admin 自己查库 + 按需调钱包**,例如:
- [`UserLogic`](backend/slot_admin/app/game/logic/UserLogic.php)`WalletService::statistic` + `getNumberFormat`
- [`UserProfitDailyLogic`](backend/slot_admin/app/game/logic/UserProfitDailyLogic.php):同上
- [`RechargeGiftPlayerLogic`](backend/slot_admin/app/game/logic/RechargeGiftPlayerLogic.php):直连 `s_common` 活动表
`slot_admin` 已配置 [`s_common`](backend/slot_admin/config/thinkorm.php) 连接,具备迁回条件。
目标链路:
```mermaid
flowchart LR
vue[slot_admin_vue] --> admin[slot_admin Controller]
admin --> logic[FreeCreditsStatsLogic]
logic --> db[(s_common)]
logic --> wallet[WalletService statistic]
```
**不迁**C 端定格/提现/领取仍在 [`slot_console` `FreeCreditsLogic`](slot_console/app/api/logic/FreeCreditsLogic.php),避免动业务写路径。
---
## 实施范围
### 1. slot_admin 新增分层(对齐 backend-layering
| 层 | 文件 | 职责 |
|---|---|---|
| Validate | `app/game/validate/FreeCreditsStatsValidate.php` | `page/limit`、筛选字段类型与枚举 |
| DTO | `app/game/dto/FreeCreditsStatsQueryDTO.php` | 承接已校验参数 |
| Logic | `app/game/logic/FreeCreditsStatsLogic.php` | 从 console 迁入(以当前 [`FreeCreditsStatsLogic.php`](slot_console/app/innerapi/logic/FreeCreditsStatsLogic.php) 为基准,含近期前端改动:无 activity_id/status 筛选、`total_deposit` 按用户 currency + `getNumberFormat` |
| Model | `app/game/model/common/FreeCreditsPlayerModel.php``FreeCreditsPackageModel.php` | `connection = s_common`,表名与 console 一致,常量 `STATUS_*` / `TYPE_*` 复制 |
| Controller | 改造 [`FreeCreditsStatsController.php`](backend/slot_admin/app/game/controller/FreeCreditsStatsController.php) | Validate → DTO → Logic`index` 一次返回 `data/total/otherData`Logic 内 `statistics` + `list` |
**累计充值**:在 admin Logic 内用已有 [`WalletService::statistic`](backend/slot_admin/app/service/WalletService.php) + [`UserModel`](backend/slot_admin/app/model/UserModel.php) 按用户 `currency` 分组(与用户列表口径一致),**不再**经 console 调 wallet SDK。
**对外契约**:保持 `GET/POST /game/freeCreditsStats/index` 与字段名不变 → [`slot_admin_vue`](backend/slot_admin_vue/src/views/game/freeCreditsStats/index.vue) **无需改路由**
### 2. 从 console / SDK 下线 admin 专用 BFF
迁移验证通过后删除或标记废弃:
- [`slot_console/app/innerapi/logic/FreeCreditsStatsLogic.php`](slot_console/app/innerapi/logic/FreeCreditsStatsLogic.php)
- [`slot_console/app/innerapi/controller/FreeCreditsController.php`](slot_console/app/innerapi/controller/FreeCreditsController.php)(若仅服务 stats
- [`slot_sdk` `ConsoleService::freeCreditsList/statistics`](slot_sdk/src/service/console/ConsoleService.php)
- admin Controller 中 `ConsoleClient` / `buildConsoleClient`
### 3. 不做的项
- 不把 C 端 `FreeCreditsLogic` 抽到 `slot_lib`(范围过大,与本次 admin 统计无关)
- 不为两张表单独建 Service 中转层Logic 内私有方法即可)
---
## 风险与注意点
1. **DB 权限**:确认 `slot_admin` 运行账号对 `s_common.free_credits_player/package` 有读权限(与 console 相同库)。
2. **双份 Model**console 仍保留 C 端用的 Modeladmin 侧独立 Model 类,表结构变更需两处同步常量(可接受,与现有 `RechargeGift*` 模式一致)。
3. **一次请求两次查询**`statistics` + `list` 仍在单次 `index` 内完成;若后续数据量大,再在 Logic 内优化共用 `filteredPlayerIds`,不必回退 BFF。
4. **UserProfitDaily 的 currency**:其用 `GameServerModel` 固定币种;本功能应继续用 **每用户 `UserModel.currency`**(与 `UserLogic` 一致),避免回退到固定 USD。
---
## 验证清单
- 列表筛选uid/source/定格时间/第一档状态/全部完成)与汇总 7 项与迁前一致
- 某 UID「累计充值」与后台用户列表 `wallet.r` / `total_deposit` 一致
- 去掉对 `consoleApiHost` 的依赖后,`/game/freeCreditsStats/index` 仍可正常访问
- console innerapi 无其它调用方后再删 SDK 方法

View File

@@ -0,0 +1,227 @@
---
name: 异步事件单元测试
overview: 结合 slot_console 现有 Free Credits 测试实践,说明异步 MQ 事件应分层测试:不直连 RabbitMQ优先测 Logic 编排,再补 Event 解析与 EventBus 路由;并给出可新增的示例用例结构。
todos:
- id: entity-test
content: 新增 FreeCreditInitEntityTest字段映射与 resolveWalletAmount 回退
status: completed
- id: bus-factory
content: 新增 tests/Support/ConsoleBusMessageFactory 统一构造 MQBusEntity 载荷
status: completed
- id: extend-logic-tests
content: 扩展 FreeCreditsHandleFreeCreditInitTest幂等、无配置、异常路径
status: completed
- id: optional-event-inject
content: 可选FreeCreditInitEvent 注入 Logic + Event 单测
status: completed
- id: optional-eventbus-nack
content: 可选EventBus deal 单测TYPE_FREE_CREDIT_INIT 成功 ack / 失败 nack
status: completed
isProject: false
---
# 异步事件单元测试写法slot_console
## 当前架构
```mermaid
sequenceDiagram
participant Wallet as slot_wallet
participant MQ as RabbitMQ_console_bus
participant Bus as EventBus_deal
participant Ev as FreeCreditInitEvent
participant Logic as FreeCreditsLogic
Wallet->>MQ: JSON uid/type/data
MQ->>Bus: AMQPMessage
Bus->>Ev: case TYPE_FREE_CREDIT_INIT
Ev->>Ev: FreeCreditInitEntity
Ev->>Logic: handleFreeCreditInit
Logic->>Logic: freezeFirstRecharge + wallet RPC
```
**结论**:异步只发生在 MQ 传输层;单测应测 **消息解析 → 路由 → 业务编排**,而不是启动真实 `event:bus` 或 RabbitMQ。
---
## 项目里已有的做法(推荐延续)
### 1. 单元测试:直接测 Logic主路径
现有 [`tests/Unit/FreeCreditsHandleFreeCreditInitTest.php`](/Users/ray/Documents/project/www/slot/slot_console/tests/Unit/FreeCreditsHandleFreeCreditInitTest.php) 已覆盖 `free_credit_init` 的**业务结果**,等价于事件消费后的效果:
- [`FreeCreditsLogicHarness`](/Users/ray/Documents/project/www/slot/slot_console/tests/Support/FreeCreditsLogicHarness.php):注入 `userContext` / `activeConfig` / `walletService`
- [`RecordingWalletService`](/Users/ray/Documents/project/www/slot/slot_console/tests/Support/RecordingWalletService.php):记录 `freeCreditsFreeze`,不发 HTTP
- [`FreeCreditsConfigStub`](/Users/ray/Documents/project/www/slot/slot_console/tests/Support/FreeCreditsConfigStub.php):活动配置桩
断言示例(已有):
- 定格金额 = `balance_before_qf`
- `biz_id` = `free_credits_freeze:{orderId}`
- `balance_before_qf <= 0` 时不调用 freeze
**运行**
```bash
cd slot_console && ./vendor/bin/phpunit --testsuite Unit
```
提现三类事件同理:[`tests/Integration/FreeCreditsLogicCashoutResultTest.php`](/Users/ray/Documents/project/www/slot/slot_console/tests/Integration/FreeCreditsLogicCashoutResultTest.php) 直接调 `handleFirstCashoutResult`,不经过 EventBus。
### 2. 集成测试:需要 DB 时
[`FreeCreditsDbTestCase`](/Users/ray/Documents/project/www/slot/slot_console/tests/Integration/FreeCreditsDbTestCase.php)`RUN_DB_TESTS=1` 才跑,默认事务回滚。
```bash
RUN_DB_TESTS=1 ./vendor/bin/phpunit --testsuite Integration --filter FreeCredits
```
---
## 建议的分层(按投入产出排序)
| 层级 | 测什么 | 是否必需 | 依赖 |
|------|--------|----------|------|
| A. Entity | `FreeCreditInitEntity` 字段映射、`resolveWalletAmount()` 回退 | 推荐 | 无 |
| B. Logic | `handleFreeCreditInit` / `handleFirstCashoutResult` 编排 | **已有,继续扩展** | Harness + RecordingWallet |
| C. Event | `FreeCreditInitEvent::handle``MQBusEntity` 转成 Logic 参数 | 可选 | 需可注入 Logic见下 |
| D. EventBus | `deal()``type` 分发、失败 nack | 少量即可 | Mock `AMQPMessage` |
| E. E2E | 真 MQ + wallet 发消息 | 手工/脚本,非单测 | 环境 |
**原则**B 覆盖 90% 风险A 防 payload 字段错C/D 防「路由写错 type」和「实体解析漏字段」。
---
## 可新增的测试示例
### A. Entity 单测(纯数组 → 实体)
新建 `tests/Unit/FreeCreditInitEntityTest.php`
```php
$entity = new FreeCreditInitEntity([
'balance_before_qf' => 15000,
'wallet_amount' => 0,
'amount' => 5000,
'biz_id' => 'order_1',
]);
$this->assertSame(15000, $entity->balance_before_qf);
$this->assertSame(5000, $entity->resolveWalletAmount()); // wallet_amount 为 0 时回退 amount
```
对应生产代码:[`app/entity/mq/FreeCreditInitEntity.php`](/Users/ray/Documents/project/www/slot/slot_console/app/entity/mq/FreeCreditInitEntity.php)。
### B. 构造 MQ 载荷辅助方法
`tests/Support/` 增加工厂,统一模拟 wallet 发出的 body
```php
public static function consoleBusMessage(int $uid, string $type, array $data): MQBusEntity
{
return new MQBusEntity(['uid' => $uid, 'type' => $type, 'data' => $data]);
}
// free_credit_init 示例
public static function freeCreditInitBus(int $uid, int $balanceBefore, int $walletAmount, string $bizId): MQBusEntity
{
return self::consoleBusMessage($uid, MQBusEntity::TYPE_FREE_CREDIT_INIT, [
'balance_before_qf' => $balanceBefore,
'wallet_amount' => $walletAmount,
'biz_id' => $bizId,
'source' => 'test',
'currency' => 'INR',
]);
}
```
与 [`WalletLogic::sendConsoleBus`](/Users/ray/Documents/project/www/slot/slot_wallet/app/api/logic/WalletLogic.php) 字段保持一致。
### C. Event 层单测(当前结构的限制)
[`FreeCreditInitEvent`](/Users/ray/Documents/project/www/slot/slot_console/app/command/event/FreeCreditInitEvent.php) 内部写死 `new FreeCreditsLogic()`**无法在不改代码的情况下 mock Logic**。
两种做法(二选一):
1. **小重构(推荐)**Event 构造函数注入 `FreeCreditsLogic`,单测传入 `FreeCreditsLogicHarness`
2. **不测 Event**:认为 Event 只有 5 行胶水,由 B 层保证;仅加 A 层测 data 解析。
若采用 1示例
```php
$bus = ConsoleBusMessageFactory::freeCreditInitBus($uid, 15000, 5000, 'order_1');
$harness = (new FreeCreditsLogicHarness())->inject($context, $config, $wallet);
(new FreeCreditInitEvent($harness))->handle($bus);
$this->assertCount(1, $wallet->freezeCalls);
```
### D. EventBus 路由单测(少量)
Mock `PhpAmqpLib\Message\AMQPMessage`
```php
$message = $this->createMock(AMQPMessage::class);
$message->method('getBody')->willReturn(json_encode([
'uid' => 90088002,
'type' => MQBusEntity::TYPE_FREE_CREDIT_INIT,
'data' => ['balance_before_qf' => 15000, 'wallet_amount' => 5000, 'biz_id' => 'x'],
]));
$message->expects($this->once())->method('ack'); // 成功应 ack
$bus = new EventBus();
// 若 Logic 仍 new 在 Event 内,需配合 C 的注入或接受集成测
$bus->deal($message);
```
**nack 场景**[`EventBus.php` L164-167](/Users/ray/Documents/project/www/slot/slot_console/app/command/EventBus.php)Logic 抛异常时,`TYPE_FREE_CREDIT_INIT``nack(true)` 且不 `ack`。可让 Harness 的 `freeCreditsFreeze` 抛异常,断言 `$message->expects($this->once())->method('nack')->with(true)`
注意:`EventBus` 依赖多,路由测试宜 **只测 switch 分支 + ack/nack**,业务细节仍放 B。
---
## 四个 Free Credits 相关 type 怎么测
| MQ type常量 | 单测重点 | 现有覆盖 |
|-----------------|----------|----------|
| `TYPE_FREE_CREDIT_INIT` | 定格金额、biz_id、幂等跳过 | `FreeCreditsHandleFreeCreditInitTest` |
| `TYPE_FREE_CREDITS_FIRST_CASHOUT_SUCCESS` | 档位 completed、player 状态 | `FreeCreditsLogicCashoutResultTest` |
| `TYPE_FREE_CREDITS_FIRST_CASHOUT_FAIL` | 失败回滚逻辑 | 可补 case |
| `TYPE_FREE_CREDITS_FIRST_CASHOUT_REJECTED` | rejected → ready | 已有 reject case |
EventBus 里前三类目前 **直接调 Logic**(未走独立 Event 类),单测继续打 Logic 即可;常量定义在 [`MQBusEntity`](/Users/ray/Documents/project/www/slot/slot_console/app/entity/mq/MQBusEntity.php)。
---
## 不建议在单测里做的
- 启动 `php webman event:bus` 或连接真实 RabbitMQ
- 跨服务联调 wallet → console留给脚本如 `scripts/run_free_credits_first_freeze.php` 或手工验收)
- 在单测里依赖 `UserTagService::getByUid`(用 Harness 注入 context
---
## 推荐落地顺序(若你要补测试)
1.`FreeCreditInitEntityTest`A
2.`ConsoleBusMessageFactory`B 辅助)
3. 扩展 `FreeCreditsHandleFreeCreditInitTest`无活动配置、已定格幂等、Logic 抛错
4. (可选)`FreeCreditInitEvent` 注入 Logic + Event 单测C
5. (可选)`EventBusFreeCreditInitTest` 只测 ack/nackD
```mermaid
flowchart TD
subgraph unit [Unit 无 MQ]
E[EntityTest]
L[LogicHarnessTest]
end
subgraph optional [Optional]
Ev[EventTest]
Bus[EventBusRoutingTest]
end
subgraph integration [Integration RUN_DB_TESTS]
DB[DbTestCase]
end
E --> L
L --> Ev
Ev --> Bus
L --> DB
```

View File

@@ -0,0 +1,184 @@
---
name: 异步用户统计 MQ
overview: wallet_user_stat 通过 slot/foundation RabbitMQ 异步更新;废弃 WalletStatModel 分片统计表commit 后发 MQcommand 消费落库Redis biz_id 幂等。
todos:
- id: mq-entity-keys
content: 事件 Entity/常量、MQ 命名foundation RabbitMQConfig 工厂方法
status: completed
- id: mq-producer-consumer-service
content: WalletUserStatMQServiceProducer与 WalletUserStatConsumeService
status: completed
- id: command-update-wallet-user-stat
content: UpdateWalletUserStat command 使用 RabbitMQConsumer::consume
status: completed
- id: remove-wallet-stat-model
content: 移除 WalletStatModel 全部引用,读统计改 WalletUserStatModel
status: completed
- id: wire-wallet-logic
content: 注册/充值/提现完成 commit 后 publishRegisterService 去掉同步 stat
status: completed
- id: doc-and-verify
content: doc 留痕 + Docker 冒烟foundation MQ + 幂等)
status: completed
isProject: false
---
# wallet_user_stat 异步统计更新方案(修订)
## 变更要点(相对上一版)
1. **废弃** [`WalletStatModel`](app/model/multi/WalletStatModel.php)(分片 `wallet_stat_XX`):删除所有同步 `inc` / `insertData` / 读统计逻辑,**不再并行双写**。
2. **MQ 统一走** [`slot/foundation` `src/MQ`](vendor/slot/foundation/src/MQ/)**不再**为本需求扩展 [`RabbitMqService`](app/service/RabbitMqService.php)wager/console 等历史消费者可暂保留旧封装)。
## 为什么异步
| 维度 | 说明 |
|------|------|
| 定位 | `wallet_user_stat` 为运营/展示统计,非真账 |
| 性能 | 资金事务 commit 后异步写 `rh_wallet`,缩短主路径 |
| 规范 | 主账本 DB 先提交,再发 MQ消费幂等 |
```mermaid
sequenceDiagram
participant Logic as WalletLogic
participant ShardDB as wallet_shard
participant Prod as RabbitMQProducer
participant Cmd as updateWalletUserStat
participant Cons as RabbitMQConsumer
participant Stat as wallet_user_stat
Logic->>ShardDB: commit
Logic->>Prod: sendMessage event
Cmd->>Cons: consume autoAck
Cons->>Stat: WalletUserStatModel apply*
```
## Foundation MQ APIvendor 已具备)
| 类 | 用途 |
|----|------|
| [`RabbitMQConfig`](vendor/slot/foundation/src/MQ/RabbitMqConfig.php) | host/port/user/password/vhost |
| [`RabbitMQProducer`](vendor/slot/foundation/src/MQ/RabbitMqProducer.php) | `getInstance($config, $exchange, $queue, 'direct', $route)->sendMessage(array\|string)` |
| [`RabbitMQConsumer`](vendor/slot/foundation/src/MQ/RabbitMqConsumer.php) | `consume($callback, $autoAck=true)``decodeMessage($message)` |
配置从现有 `.env` 组装(与 [`RabbitMqService`](app/service/RabbitMqService.php) 相同变量:`MQ_HOST``MQ_PORT``MQ_USER``MQ_PASSWORD``MQ_VHOST`)。
本仓新增 **`WalletUserStatMqSupport`**(或写在 `WalletUserStatMQService` 内私有方法):
```php
use slot\foundation\MQ\RabbitMQConfig;
use slot\foundation\MQ\RabbitMQProducer;
use slot\foundation\MQ\RabbitMQConsumer;
private static function config(): RabbitMQConfig
{
return new RabbitMQConfig(
(string) getenv('MQ_HOST'),
(int) getenv('MQ_PORT'),
(string) getenv('MQ_USER'),
(string) getenv('MQ_PASSWORD'),
(string) getenv('MQ_VHOST'),
);
}
```
交换机/队列([`MQKeyManagerService`](app/service/MQKeyManagerService.php) 常量directroutingKey = queue 名):
- `EXCHANGE_WALLET_USER_STAT = 'wallet_user_stat'`
- `QUEUE_WALLET_USER_STAT = 'wallet_user_stat'`
## 消息体
[`app/entity/mq/WalletUserStatEventEntity.php`](app/entity/mq/WalletUserStatEventEntity.php) + [`app/constants/WalletUserStatEvent.php`](app/constants/WalletUserStatEvent.php)
| 字段 | 说明 |
|------|------|
| `event` | `init` / `deposit` / `withdraw` / `promo_bonus` / `cashback` / `refund` / `chargeback` |
| `uid`, `currency`, `amount`, `biz_id` | 金额 x1000`init` 时 amount=0 |
| `occurred_at` | 可选 |
消费端映射 [`WalletUserStatModel`](app/model/WalletUserStatModel.php) 已有 `apply*` / `insertInitRow`
## Service 分层
| 类 | 职责 |
|----|------|
| [`WalletUserStatMQService`](app/service/wallet/WalletUserStatMQService.php) | `publish(WalletUserStatEventEntity)``RabbitMQProducer::sendMessage($entity->activeData())` |
| [`WalletUserStatConsumeService`](app/service/wallet/WalletUserStatConsumeService.php) | 校验、Redis 幂等 `wallet:user_stat:dedupe:{event}:{biz_id}`、调用 Model |
**禁止**在 `WalletUserStatMQService` 内再包一层无意义的 `RabbitMqService` 转发。
## Command
[`app/command/UpdateWalletUserStat.php`](app/command/UpdateWalletUserStat.php)(结构参考 [`UpdateWagerTask`](app/command/UpdateWagerTask.php),但换 foundation Consumer
```php
$consumer = RabbitMQConsumer::getInstance(
WalletUserStatMqSupport::config(),
MQKeyManagerService::EXCHANGE_WALLET_USER_STAT,
MQKeyManagerService::QUEUE_WALLET_USER_STAT,
'direct',
MQKeyManagerService::QUEUE_WALLET_USER_STAT,
);
$consumer->consume(function (AMQPMessage $message) use ($consumer) {
$payload = $consumer->decodeMessage($message);
(new WalletUserStatConsumeService())->handle(is_array($payload) ? $payload : []);
}, true, false);
```
- 成功回调后 **auto ack**foundation 默认行为)
- 业务异常:`LoggerService::error`;是否 requeue 首版 `false`(与 wager 手工 ack 策略不同,更依赖 Redis 幂等 + 日志补数)
启动:
```bash
docker exec -w /app/www/ray/slot-wallet php82 php webman updateWalletUserStat
```
## 移除 WalletStatModel
| 文件 | 改动 |
|------|------|
| [`WalletLogic.php`](app/api/logic/WalletLogic.php) | 删除 `WalletStatModel` use 及 `inc`/`insertData`commit 后 `WalletUserStatMQService::publish` |
| [`RegisterService.php`](app/service/wallet/RegisterService.php) | 删除 `$walletStatModel``insertData`;注册 commit 后发 `init` 事件 |
| [`WalletLogic::getWallet`](app/api/logic/WalletLogic.php)`needStat==1` | 改读 `WalletUserStatModel::findByUidCurrency``r``total_deposit_amount``tw``total_withdraw_amount` |
| [`WalletStatModel.php`](app/model/multi/WalletStatModel.php) | **删除文件**(无引用后) |
### 发 MQ 关键路径post-commit
| 场景 | event | amount |
|------|-------|--------|
| 注册 | `init` | 0 |
| `recharge` / `rechargeSign` | `deposit` | `recharge` |
| 提现完成 `BIZ_TYPE_WITHDRAW` | `withdraw` | `fee` |
`biz_id` 使用请求 DTO 已有 `biz_id`(幂等维度与资金接口一致)。
## 不涉及
- 不改 `config/thinkorm.php`
- 不把统计写回资金事务
- 不改造 wager/console 等仍用 `RabbitMqService` 的旧队列(仅新统计队列用 foundation
## 验证
1. `composer` 已含 `slot/foundation`lock 中已有 MQ 类)
2. 启动 consumer + 走注册/充值/提现
3.`rh_wallet.wallet_user_stat`
4. 重复 `biz_id` 验证 Redis 幂等
5. 确认 `wallet_stat_XX` 不再被写入;`getWallet``r`/`tw` 来自新表
## 文件一览
| 操作 | 路径 |
|------|------|
| 新增 | `app/entity/mq/WalletUserStatEventEntity.php` |
| 新增 | `app/constants/WalletUserStatEvent.php` |
| 新增 | `app/service/wallet/WalletUserStatMqSupport.php`(可选,集中 Config/实例化) |
| 新增 | `app/service/wallet/WalletUserStatMQService.php` |
| 新增 | `app/service/wallet/WalletUserStatConsumeService.php` |
| 新增 | `app/command/UpdateWalletUserStat.php` |
| 修改 | `app/service/MQKeyManagerService.php``app/service/RedisKeyManagerService.php` |
| 修改 | `app/api/logic/WalletLogic.php``app/service/wallet/RegisterService.php` |
| 删除 | `app/model/multi/WalletStatModel.php` |
| 新增/修改 | `doc/` 说明 foundation MQ 与启动命令 |

View File

@@ -0,0 +1,56 @@
---
name: 拆分win派奖文档
overview: 将 wallet PRD 中与 win派奖强相关的需求从主文档拆分到独立文档降低耦合并保持规则可追踪。计划默认采用“从 wallet.md 迁移到 win.md并在原处保留索引入口”的方式。
todos:
- id: identify-win-sections
content: 标记 wallet.md 中所有 win派奖主规则与引用依赖段落
status: completed
- id: create-win-doc
content: 创建 win.md 并迁移/重组派奖规则、流程与示例
status: completed
- id: refactor-wallet-doc
content: 在 wallet.md 用摘要+链接替换已迁移内容并更新目录
status: completed
- id: consistency-pass
content: 统一术语与交叉引用,确保无重复冲突定义
status: completed
isProject: false
---
# 将 win派奖需求拆分到独立文档
## 目标
把 [doc/wallet.md](doc/wallet.md) 中“win派奖”相关需求整理到新文档 [doc/win.md](doc/win.md),并保证两份文档职责清晰:
- `wallet.md` 保留钱包总规则与对外索引
- `win.md` 承载派奖、Round 结算、出资分配等细则
## 拆分范围(默认)
从 [doc/wallet.md](doc/wallet.md) 迁移以下“win 主体”内容到 [doc/win.md](doc/win.md)
- §12 `Slots 多次派奖与最终结算规则`
- §20 中 win 强相关子流程:
- `20.4 Round 多次派奖`
- `20.5 Round 最终结算`
- 与派奖直接相关且需避免重复维护的规则片段(在 `wallet.md` 中改为引用):
- §10.3 `派奖归属规则`
- §11 中 `Round 总派奖` 分配示例
- §16.2 `派奖按比例拆分余数`
## 文档结构调整
- 在 [doc/wallet.md](doc/wallet.md)
- 保留“钱包主规则”定位
- 将迁移段落替换为简要摘要 + 指向 [doc/win.md](doc/win.md) 的链接
- 更新目录,新增 `win` 文档入口
- 在 [doc/win.md](doc/win.md)
- 新建“win派奖需求”专题文档
- 按“背景 → 结算时序 → 分配规则 → 边界条件 → 示例流程”重组内容
- 明确与 `Lot``Task``Withdrawable` 的关系保留必要术语一致性Round/FinalSettlement/AllocatedPayout
## 一致性与可维护性约束
- 术语与口径与 [doc/wallet.md](doc/wallet.md) 保持一致Bonus/Deposit/Withdrawable、Final Settlement、PlayedOut
- 避免双份正文维护:同一规则只在一个文档定义,另一侧做引用
- 若保留示例在两文档同时出现,仅保留“简版示意”在 `wallet.md`,完整口径放 `win.md`
## 验收标准
- [doc/win.md](doc/win.md) 可单独说明“派奖”完整业务规则
- [doc/wallet.md](doc/wallet.md) 删除/替换原 win 细节后仍可作为钱包总览
- 两文档目录和交叉链接可直接跳转,且不存在明显冲突描述

View File

@@ -0,0 +1,80 @@
---
name: 支持 webp 上传
overview: slot_admin 后端已允许 webp需在 slot_admin_vue 的图片上传组件默认 accept 中加入 `.webp`(及 MIME即可在管理端选择并上传 webp 文件。
todos:
- id: update-accept-default
content: 在 sa-upload-image/index.vue 的 accept 默认值与模板 fallback 中加入 .webp、image/webp并修正 .bpm → .bmp
status: completed
- id: manual-verify-upload
content: 在活动/Banner 等页面上传 webp确认选择器可选且接口返回 URL
status: completed
isProject: false
---
# slot_admin_vue 支持 WebP 图片上传
## 问题定位
管理端图片上传统一走 [`sa-upload-image`](backend/slot_admin_vue/src/components/sa-upload-image/index.vue) 组件,通过 Arco `a-upload``accept` 限制文件选择器可见格式:
```28:28:backend/slot_admin_vue/src/components/sa-upload-image/index.vue
:accept="props.accept ?? '.jpg,jpeg,.gif,.png,.svg,.bpm'"
```
```67:67:backend/slot_admin_vue/src/components/sa-upload-image/index.vue
accept: { type: String, default: '.jpg,jpeg,.gif,.png,.svg,.bpm' },
```
当前默认列表**不含** `.webp`,因此在系统文件对话框中无法选择 webp或部分浏览器会拦截。组件内 `uploadImageHandler` **没有**再做扩展名校验,上传逻辑直接调用 `/saimulti/system/uploadImage`。
**后端已支持 webp**,无需改动:
```10:10:backend/slot_admin/plugin/saimulti/config/upload.php
'upload_allow_image' => 'jpg,jpeg,png,gif,svg,bmp,webp,avif',
```
[`UploadService`](backend/slot_admin/plugin/saimulti/service/storage/UploadService.php) 按扩展名与白名单比对webp 已在列表中。
```mermaid
flowchart LR
Browser["浏览器文件选择器 accept"]
SaUpload["sa-upload-image"]
API["POST /saimulti/system/uploadImage"]
UploadService["UploadService 扩展名校验"]
Browser -->|"缺 .webp 时被过滤"| SaUpload
SaUpload --> API
API --> UploadService
UploadService -->|"webp 已允许"| Storage["S3/本地存储"]
```
全项目使用 `sa-upload-image` 时均未自定义 `:accept`改组件默认值即可覆盖活动图、Banner、头像、配置项等所有入口。
## 修改方案(仅前端,单文件)
**文件**[`backend/slot_admin_vue/src/components/sa-upload-image/index.vue`](backend/slot_admin_vue/src/components/sa-upload-image/index.vue)
1. 将 `accept` 默认值与模板中的 fallback 统一为包含 webp建议与后端白名单对齐
```
image/jpeg,image/png,image/gif,image/webp,image/svg+xml,.jpg,.jpeg,.png,.gif,.webp,.svg,.bmp
```
- 同时写上 **MIME**`image/webp`)和 **扩展名**`.webp`),兼容 macOS/Chrome 对 webp 的识别方式。
- 顺带修正现有笔误:`.bpm` → `.bmp`(与后端 `bmp` 一致)。
2. 两处需同步修改(保持 `props.accept ?? ...` 与 `defineProps` default 一致):
- 第 28 行模板 `:accept`
- 第 67 行 `accept` prop default
**不需要改后端**`upload.php` 已含 `webp`。
## 可选(非本次必须)
若还需在**富文本编辑器**「资源选择器」里插入已有 webp 资源,[`ma-wangEditor/index.vue`](backend/slot_admin_vue/src/components/ma-wangEditor/index.vue) 第 6772 行对图片 URL 的判断未包含 `.webp`,可另开小改;与本地上传 `sa-upload-image` 无关。
## 验证步骤
1. 本地启动 slot_admin_vue打开任意带 `sa-upload-image` 的页面如活动编辑、Banner 编辑)。
2. 点击「本地上传」,文件选择器应能显示 `.webp` 文件。
3. 上传一张 webp建议 &lt; 5MB与 `upload_size` 一致),应成功返回 URL 并预览。
4. 若仍报错「不支持该格式的文件上传」,检查运行环境 `plugin/saimulti/config/upload.php` 是否被覆盖(线上配置应与仓库一致)。

View File

@@ -0,0 +1,94 @@
---
name: 旧提现接口兼容 package_id
overview: 在已落地的 `POST /api/free-credits/withdraw-first-cash` 基础上,恢复 `POST /api/withdraw/apply``package_id` 的兼容:参数校验与业务编排与新接口一致,内部转发 `applyFreeCreditsFirstCash`,不重复维护 WithdrawValidator 的 `*_fc` scene。
todos:
- id: withdraw-controller-compat
content: WithdrawController::apply 恢复 package_id 分支,校验用 FreeCreditsValidator调用 applyFreeCreditsFirstCash
status: completed
- id: comments-sync
content: FreeCreditsController / WithdrawApplyDTO 注释标明兼容与推荐路径
status: completed
- id: regression-test
content: 跑相关 PHPUnit 确认无回归
status: completed
isProject: false
---
# 旧提现接口兼容 package_id
## 背景
[第一档提现独立接口](第一档提现独立接口_6b3aaf7e.plan.md) 已实现新路径,但 [`WithdrawController::apply`](slot_console/app/api/controller/WithdrawController.php) 当前**一律**走普通提现(`amount` 必填),旧 C 端若仍调用 `POST /api/withdraw/apply` + `package_id` 会校验失败或走错逻辑。
需求:**保留原接口**,传 `package_id` 时行为与 `withdraw-first-cash` 一致(兼容期转发,不删新接口)。
```mermaid
flowchart TD
apply["POST /api/withdraw/apply"]
apply -->|"package_id > 0"| fcPath["FreeCreditsValidator + applyFreeCreditsFirstCash"]
apply -->|"无 package_id"| normalPath["WithdrawValidator + apply"]
newApi["POST /api/free-credits/withdraw-first-cash"]
newApi --> fcPath
```
## 改动(仅 slot_console
### 1. [`WithdrawController::apply`](slot_console/app/api/controller/WithdrawController.php)
- `use app\api\validator\FreeCreditsValidator`
- 分支逻辑(与拆分前一致,编排指向新方法):
```php
$post = $request->post();
$type = intval($post['type'] ?? input('type', 1));
if (!empty($post['package_id'])) {
$error = (new FreeCreditsValidator())->scene(FreeCreditsValidator::firstCashoutScene($type))->check($post);
// 失败 return PARAMS_ERROR
$this->service->setUid($uid);
$res = $this->service->applyFreeCreditsFirstCash(new WithdrawApplyDTO($post));
return $this->success($res, 'Submitted successfully! Your order is under review...');
}
$error = $this->validate((string) $type, $post);
// 现有普通提现 apply + 'Submit successfully'
```
- 方法 PHPDoc 注明:`package_id` 为**兼容**字段,推荐改用 `/api/free-credits/withdraw-first-cash`
**不在** [`WithdrawValidator`](slot_console/app/api/validator/WithdrawValidator.php) 恢复 `*_fc` scene避免两套校验重复兼容路径复用 [`FreeCreditsValidator`](slot_console/app/api/validator/FreeCreditsValidator.php)。
### 2. 注释同步
| 文件 | 内容 |
| --- | --- |
| [`FreeCreditsController`](slot_console/app/api/controller/FreeCreditsController.php) 类注释 | 补充:旧路径 `withdraw/apply` + `package_id` 仍可用,建议迁移新接口 |
| [`WithdrawApplyDTO`](slot_console/app/api/dto/request/WithdrawApplyDTO.php) | `package_id` 注释改为「新接口首选withdraw/apply 兼容」 |
### 3. 单测(可选、建议加)
在 [`tests/Unit/`](slot_console/tests/Unit/) 或扩展现有 Controller 测:
- 仅验证 `WithdrawController``package_id` 非空时选用 `FreeCreditsValidator::firstCashoutScene`(可 mock validate或沿用 validator 单测 + 文档约定)。
集成行为已由 [`FreeCreditsFirstCashoutApplyTest`](slot_console/tests/Integration/FreeCreditsFirstCashoutApplyTest.php) 覆盖 `applyFreeCreditsFirstCash`,兼容层无额外 Service 逻辑,**可不新增 DB 集成测**。
运行回归:
```bash
docker exec -w /app/www/slot/slot_console php82 ./vendor/bin/phpunit \
tests/Unit/FreeCreditsValidatorWithdrawFirstCashTest.php \
tests/Unit/FreeCreditsValidatorTest.php
```
## 不变项
- [`WithdrawService::applyFreeCreditsFirstCash`](slot_console/app/service/WithdrawService.php) 实现不动
- `POST /api/free-credits/withdraw-first-cash` 仍为推荐入口
- 普通 `withdraw/apply`(无 `package_id`)行为不变
## 验收
1. `withdraw/apply` + `package_id` + 绑卡 → 与 `withdraw-first-cash` 相同返回与档位状态
2. `withdraw/apply``package_id` → 仍须 `amount`,走余额/手续费校验
3. 新接口行为无回归

View File

@@ -0,0 +1,225 @@
---
name: 每日返水活动化改造
overview: 将每日返水从独立档位表方案改为与首充定格Free Credits, type=11一致的活动配置模式新增活动类型 12、档位写入 recharge_gift_config.ext_config保留 daily_rebate_record 做用户日统计与领取,综合统计页独立不变。
todos:
- id: activity-type-12
content: 新增 TYPE_DAILY_REBATE=12RechargeGiftConfigModel、getDailyRebateActiveInfo、Consts、activity_type 字典 SQL
status: completed
- id: activity-ext-config
content: ActivityValidate::checkDailyRebateExt + ActivityController save/updateactivity/edit.vue & index.vue type=12 档位 UI
status: completed
- id: refactor-daily-rebate-service
content: DailyRebateService 改读 recharge_gift_config.ext_configdaily_rebate_record 增加 activity_id
status: completed
- id: remove-tier-table
content: 删除 daily_rebate_tier_config 及相关 Admin CRUD/菜单;更新 daily_rebate.sql
status: completed
- id: complete-stats-api
content: 补全 dailyRebateStats 前端页 + 确认 DailyRebateSettle/Expire/API/流水类型 65
status: completed
- id: tests-acceptance
content: DailyRebateCalcServiceTest + 端到端验收(配置→结算→领取→统计)
status: completed
isProject: false
---
# 每日返水 — 活动化改造方案(对齐首充定格)
## 背景与纠偏
你已指出:**这是活动,应新增活动类型,返水档位在「活动配置」里维护**参考首充定格Free Credits
现有代码库中首充定格模式:
| 层级 | 实现 |
|------|------|
| 配置表 | [`s_recharge_gift_config`](slot_console/app/model/common/RechargeGiftConfigModel.php)(后台称「充值活动配置」) |
| 活动类型 | `TYPE_FREE_CREDITS = 11` |
| 业务参数 | `ext_config` JSON千分位 `_qf` 字段) |
| 后台入口 | [活动管理 → 充值活动配置](backend/slot_admin_vue/src/views/game/activity/index.vue) + [edit.vue type==11 表单项](backend/slot_admin_vue/src/views/game/activity/edit.vue) |
| 校验 | [`ActivityValidate::checkFreeCreditsExt`](backend/slot_admin/app/game/validate/ActivityValidate.php) + [`ActivityController::save/update`](backend/slot_admin/app/game/controller/ActivityController.php) |
| 运行时查询 | [`RechargeGiftConfigModel::getFreeCreditsActiveInfo`](slot_console/app/model/common/RechargeGiftConfigModel.php) |
| 用户状态 | 独立表 `free_credits_player` / `free_credits_package` |
**先前中断实现的问题**:已创建 [`daily_rebate_tier_config`](slot_console/db/daily_rebate.sql) 独立表及 [`DailyRebateTierConfig*`](backend/slot_admin/app/game/controller/DailyRebateTierConfigController.php) 后台 — **与产品约定不符,应废弃并改为 ext_config**
**可保留部分**(逻辑正确,仅需改配置来源):
- [`DailyRebateCalcService`](slot_console/app/service/DailyRebateCalcService.php) — 累进分段计算
- [`daily_rebate_record`](slot_console/db/daily_rebate.sql) — 用户日返水记录(需加 `activity_id`
- [`DailyRebateSettle` / `DailyRebateExpire`](slot_console/app/command/DailyRebateSettle.php) 定时任务
- [`DailyRebateController`](slot_console/app/api/controller/DailyRebateController.php) C 端 info/claim
- [`DailyRebateStats*`](backend/slot_admin/app/game/controller/DailyRebateStatsController.php) — **综合统计/每日返水统计**(独立菜单,同 Free Credits 统计)
```mermaid
flowchart TB
subgraph admin [活动管理 slot_admin]
ActivityUI["activity/edit.vue type=12"]
ActivityAPI["ActivityController + ActivityService"]
end
subgraph config [s_common]
RGC["recharge_gift_config ext_config.tiers"]
DRR["daily_rebate_record"]
end
subgraph runtime [slot_console]
Settle["dailyRebateSettle"]
API["DailyRebateService info/claim"]
end
ActivityUI --> ActivityAPI --> RGC
Settle --> RGC
Settle --> DRR
API --> RGC
API --> DRR
```
---
## 1. 新增活动类型 `12` — 每日返水
### 1.1 常量与模型
- [`RechargeGiftConfigModel`](slot_console/app/model/common/RechargeGiftConfigModel.php) 增加:
```php
const TYPE_DAILY_REBATE = 12; // 每日返水
```
- 新增方法 `getDailyRebateActiveInfo(string $source)`,逻辑**复制** `getFreeCreditsActiveInfo``status=1`、`type=12`、时间窗、`source` 优先于 `all`。
- [`slot_lib/Consts.php`](slot_lib/src/common/const/Consts.php) 增加 `ACTIVITY_TYPE_DAILY_REBATE = 12`(与现有 19 并列,便于订单/日志引用)。
- 字典 `activity_type` 增加一条SQL 或后台字典):`value=12, label=每日返水`(与 type=11「首充定格/Free Credits」同级
### 1.2 `ext_config` 结构(档位配置)
```json
{
"tiers": [
{ "sort": 1, "min_bet_qf": 0, "max_bet_qf": 1000000, "rate_percent": 3 },
{ "sort": 2, "min_bet_qf": 1000001, "max_bet_qf": 3000000, "rate_percent": 2 },
{ "sort": 3, "min_bet_qf": 3000001, "max_bet_qf": 5000000, "rate_percent": 1 },
{ "sort": 4, "min_bet_qf": 5000001, "max_bet_qf": null, "rate_percent": 0.5 }
]
}
```
- 金额与全站一致:**存储千分位(厘)**;后台表单用美元展示,提交时 `×1000`(与 type=11 的 `toQf` 一致)。
- 默认种子:可在活动保存时由前端预填 4 档,或提供 migration 插入一条 `type=12` 的 default 活动(`source=all`)。
### 1.3 校验
在 [`ActivityValidate`](backend/slot_admin/app/game/validate/ActivityValidate.php) 新增 `checkDailyRebateExt(array $extConfig)`
- `tiers` 非空数组,每档含 `sort/min_bet_qf/rate_percent`;非最后一档 `max_bet_qf` 必填。
- 复用 [`DailyRebateCalcService::validateTiersContinuous`](slot_console/app/service/DailyRebateCalcService.php)(入参转为 `min_bet`/`max_bet` 厘)。
在 [`ActivityController`](backend/slot_admin/app/game/controller/ActivityController.php) 的 `save` / `update``updateData` 时)对 `type === 12` 调用该校验(与 type=11 并列)。
---
## 2. 管理后台 — 活动配置 UI核心
参考 type=11在 [`activity/edit.vue`](backend/slot_admin_vue/src/views/game/activity/edit.vue) 增加 **`formData.type == 12`** 区块:
| 表单项 | 说明 |
|--------|------|
| 返水档位表 | 可增删行:排序、下限($)、上限($,最后一档可空)、比例(%) |
| 规则说明 | 复用活动主表 `help` 字段(与 Free Credits 一致) |
| 展示时间/生效时间 | 复用现有 `show_*` / `start_time` / `end_time` |
**交互约束**(与 type=11 相同):
- `onlyGift` 计算属性加入 `12` → 不展示「赠送配置 goods」区块。
- `submit` 时:`type===12` → `data.goods=[]``ext_config.tiers` 做 `toQf` 转换。
- `setFormData` 时:`tiers` 从 `_qf` 还原为美元展示。
[`activity/index.vue`](backend/slot_admin_vue/src/views/game/activity/index.vue) 列表 `ext_config` 列type=12 时展示各档比例摘要(类似 type=11 展示门槛)。
**删除**(不再单独维护档位):
- [`DailyRebateTierConfigController`](backend/slot_admin/app/game/controller/DailyRebateTierConfigController.php) 及 Logic/Validate/Model
- [`dailyRebateTierConfig.js`](backend/slot_admin_vue/src/api/game/dailyRebateTierConfig.js) 与对应 vue若已创建
- [`menu-daily-rebate.sql`](backend/slot_admin/db/menu-daily-rebate.sql) 中「每日返水档位」菜单项3082
- 表 `daily_rebate_tier_config`(不建或迁移后 DROP
**保留菜单**:仅「综合统计 → 每日返水统计」3084挂在活动管理同级或统计分组下。
---
## 3. 运行时改造slot_console
### 3.1 配置读取
改造 [`DailyRebateService`](slot_console/app/service/DailyRebateService.php)
- 删除对 `DailyRebateTierConfigModel` 的依赖。
- 通过 `RechargeGiftConfigModel::getDailyRebateActiveInfo($source)` 取活动;无生效活动 → C 端 `unlocked=false` 或整活动不可用(与未开 Free Credits 一致)。
- 从 `ext_config['tiers']` 解析为 `DailyRebateCalcService` 入参(`min_bet`/`max_bet`/`rate_percent`)。
- `info()` 返回的 `tiers` 来自当前活动配置;`tier_snapshot` 结算时写入完整 tiers JSON。
### 3.2 用户记录表
调整 [`daily_rebate_record`](slot_console/db/daily_rebate.sql)
- 增加 `activity_id bigint``recharge_gift_config.id`),结算/待定时写入。
- **删除** `daily_rebate_tier_config` 建表与种子 SQL。
### 3.3 结算与领取
- [`DailyRebateSettle`](slot_console/app/command/DailyRebateSettle.php):按渠道解析活动配置后再算返利;未充值用户仍跳过。
- 领取:继续 `TRANSACTION_TYPE_DAILY_REBATE = 65`(已在 [`Consts.php`](slot_lib/src/common/const/Consts.php) 规划/部分落地)。
### 3.4 C 端 API不变路径
- `GET /api/daily-rebate/info`
- `POST /api/daily-rebate/claim`
需校验:**当前用户渠道存在生效的 type=12 活动**,否则返回活动未开启。
---
## 4. 综合统计页(保持独立)
与 [Free Credits 统计](backend/slot_admin/app/game/controller/FreeCreditsStatsController.php) 相同定位:
- 菜单:**综合统计 / 每日返水统计**(非活动配置页)
- 实现:沿用已规划的 [`DailyRebateStatsLogic`](backend/slot_admin/app/game/logic/DailyRebateStatsLogic.php) + [`dailyRebateStats/index.vue`](backend/slot_admin_vue/src/views/game/dailyRebateStats/index.vue)(若 vue 未写完则补全)
- 数据源:`daily_rebate_record`;筛选/汇总规则不变
---
## 5. 与首充定格的差异对照
| 项 | Free Credits (11) | 每日返水 (12) |
|----|-------------------|---------------|
| ext_config | 门槛、分档金额、Banner | **tiers 累进档位** |
| 用户状态表 | free_credits_player/package | daily_rebate_record |
| 统计页 | Free Credits 统计 | 每日返水统计 |
| 充值门槛 | 首充定格业务 | **历史充值过即可**wallet `r>0` |
| 计费基础 | 定格池 | 当日 `user_profit_daily.bet` |
---
## 6. 实施步骤(建议顺序)
1. **活动类型与 ext_config 契约**Model 常量 + `getDailyRebateActiveInfo` + ActivityValidate + ActivityController + 字典 SQL。
2. **后台 activity/edit.vue + index.vue**type=12 档位表 UI 与 qf 换算。
3. **重构 DailyRebateService**:读活动 ext_configrecord 加 `activity_id`。
4. **清理**:移除 tier 独立表/Controller/菜单;更新 `daily_rebate.sql`。
5. **补全**:统计 vue、PWA 流水类型 65、单元测试仍用 tiers 数组驱动 CalcService。
6. **验收**:后台新建 type=12 活动 → 用户下注 → 日切结算 → 领取 → 统计页数字一致。
---
## 7. 验收要点
1. 仅在「充值活动配置」可创建/编辑 type=12档位保存后 `ext_config.tiers` 正确落库。
2. 同渠道多条 type=12 时行为与 type=11 一致(优先具体 source
3. 改档位仅影响**新结算日**`tier_snapshot` 审计旧记录)。
4. 不再出现「每日返水档位」独立菜单。
5. $2000 下注 → 次日返水 $50与累进公式一致。
---
## Definition of Done硬规则对齐
- [ ] `grep -r DailyRebateService ~/Documents/project/www/slot --include='*.php'` → 无命中(排除 vendor
- [ ] [`DailyRebateController`](slot_console/app/api/controller/DailyRebateController.php) 对齐 [`FreeCreditsController`](slot_console/app/api/controller/FreeCreditsController.php)`BaseController` + Logic + Validate
- [ ] 已删除 orphan`slot_admin_vue` 下 `dailyRebateTierConfig/*`、`api/game/dailyRebateTierConfig.js`
- [ ] `~/.cursor/hooks/verify-slot-backend.sh` 输出 `PASS`

View File

@@ -0,0 +1,408 @@
---
name: 每日返水需求文档
overview: 在现有 user_profit_daily 日下注统计基础上,新增「每日返水」活动:累进档位计费、仅充值用户参与、次日 00:00 起可领且 24 小时内有效;配套用户端 API、后台档位配置与综合统计页。
todos:
- id: schema
content: 设计并评审 daily_rebate_record、daily_rebate_tier_config 表结构与索引
status: in_progress
- id: calc-service
content: 实现累进分段 RebateCalcService + tier_snapshot + 单元测试(含 $2000→$50 等用例)
status: pending
- id: cron
content: slot_consoledailyRebateSettle / dailyRebateExpire 定时任务
status: pending
- id: user-api
content: slot_console 用户端 info/claim API + slot_wallet 入账与新 transaction type
status: pending
- id: admin-tier
content: slot_admin 每日返水档位 CRUD 页
status: pending
- id: admin-stats
content: slot_admin 综合统计/每日返水统计(列表+筛选+排序+汇总,参考 FreeCreditsStats
status: pending
- id: pwa-ui
content: 前端三态 UI、7 日表、倒计时、领取按钮
status: pending
isProject: false
---
# 每日返水Daily Rebate 3%)需求规格书
## 1. 背景与目标
- **业务目标**:对已充值用户,按自然日累计有效下注给予累进比例返水,提升留存与投注激励。
- **数据基础**`[slot_console](slot_console)` 已通过 `[LoseReturnDeposit](slot_console/app/command/LoseReturnDeposit.php)` + Redis `[UserProfitService](slot_pwa/app/service/user/UserProfitService.php)` 维护 `[s_statistics.user_profit_daily](slot_console/app/model/statistics/UserProfitDaily.php)`(字段 `bet`/`win`/`profit`/`create_date`/`source`)。
- **与 VIP 亏损返利的区别**VIP 返利基于「当日净亏损」且需 VIP 等级;本活动基于「当日总下注额」、仅需历史充值、档位为累进分段,产品独立。
---
## 2. 术语
| 术语 | 定义 |
| ---- | ------------------------------------------------------------------------------------------------------------- |
| 自然日 | 服务器时区 `Asia/Shanghai`(与 `[slot_center/config/app.php](slot_center/config/app.php)` 一致)的 `00:00:00``23:59:59` |
| 有效下注 | **等于** `user_profit_daily.bet`(厘),与 PWA 下注时 `incBet` 累计值一致;无单独过滤规则 |
| 返水金额 | 按档位配置对当日有效下注做**累进分段**计算后的金额(厘) |
| 统计日期 | 发生下注的自然日 `create_date`,非领取日 |
| 充值用户 | 结算时刻钱包 `total_deposit > 0``[WalletStatModel](slot_wallet/app/model/multi/WalletStatModel.php)` |
---
## 3. 核心业务规则
### 3.1 参与资格
- **未充值**不参与返水前端展示「锁定」态Unlock Cashback不可领、列表可置灰或仅展示引导文案。
- **已充值**:自充值成功当日起,当日及之后有有效下注的自然日可产生返水记录;历史未充值日的下注不补发。
### 3.2 返水计算(累进分段,非整笔单一比例)
**已确认**:采用分段累进,与原型及后台示例一致($2000 → $50
默认档位(首版种子数据,**后台可配置**
| 分段序号 | 下注区间(含边界,美元展示) | 比例 |
| ---- | --------------- | ---- |
| 1 | $0 $1,000 | 3% |
| 2 | $1,001 $3,000 | 2% |
| 3 | $3,001 $5,000 | 1% |
| 4 | $5,001 及以上 | 0.5% |
**计算公式**`B` = 当日有效下注,美元;存储与计算用厘,`1 USD = 1000` 厘,与 `[share_config.moneyFormat](slot_center/config/share_config.php)` 一致):
```
rebate_li = Σ segment_i( min(B, max_i) - min(B, min_i) + ε_i ) × rate_i
```
- 各档 `min_i`/`max_i` 以后台配置为准(最后一档 `max` 为空表示无上限)。
- 分段左闭右闭:第 1 档覆盖 `[0, 1000]`,第 2 档覆盖 `(1000, 3000]`,依此类推(实现时用「上一档上限 + 1」作为下一档起点避免重复计费
- **舍入**:返水金额入库前 `floor` 到厘;前端展示保留 2 位小数美元。
**计算示例**
| 有效下注 | 计算过程 | 返水 |
| ------- | --------------------------------------- | ------ |
| $125.56 | 125.56 × 3% | $3.77 |
| $200 | 200 × 3% | $6.00 |
| $2,000 | 1000×3% + 1000×2% | $50.00 |
| $6,000 | 1000×3% + 2000×2% + 2000×1% + 1000×0.5% | $95.00 |
**待定态(当天)**:用 Redis 当日 `bet` 实时重算返水预览;不入库终态金额,或与 DB 行 `status=pending` 同步更新。
### 3.3 结算与领取时间轴
```mermaid
sequenceDiagram
participant User
participant PWA as slot_pwa
participant Redis
participant Cron as slot_console_cron
participant DB as daily_rebate_record
Note over User,Redis: D日 00:00-23:59
User->>PWA: 下注
PWA->>Redis: incBet
Note over DB: status=pending 实时 bet/rebate
Note over Cron,DB: D+1日 00:00后 cron
Cron->>Redis: 读取 D日 bet
Cron->>DB: 写入/更新 settle: claimable, dead_time=D+2 00:00
Note over User,DB: D+1日 仅可领 D日 返水
User->>PWA: claim(stat_date=D)
PWA->>DB: status=claimed
Note over DB: 超过 dead_time 未领
Cron->>DB: status=expired
```
| 时点 | 行为 |
| --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| D 日进行中 | 状态 **待定**;有效下注、返水金额随 Redis 刷新 |
| D+1 日 00:00 | 定时任务结算 D 日:有 `bet>0` 且已充值 → 生成/更新记录,状态 **待领取**`claimable_at = D+1 00:00:00``expire_at = D+2 00:00:00`(领取窗口 **24 小时**,对齐 VIP `[vip_rebate_lose_time](slot_center/config/share_config.php)` |
| D+1 日全天 | 用户**只能领取 stat_date=D** 的返水(「前一天」) |
| D+2 日 00:00 前未领 | 状态 **过期**`rebate_amount>0` 且未领 |
| 领取成功 | 状态 **已领**;记 `claimed_at`;钱包入账 |
**无有效下注**:不生成记录(后台列表、前端 7 日表均不展示该日)。
**返水为 0**:若档位计算为 0`bet=0` 已排除),`bet>0` 但舍入为 0 时可不落库或落库且不可领——建议 **不落库**,与「未有有效下注不显示」一致。
### 3.4 状态机
| 状态码 | 中文 | 条件 |
| ----------- | --- | --------------------------------------------------------------------- |
| `pending` | 待定 | `stat_date = 今天`;实时统计未结束 |
| `claimable` | 待领取 | `stat_date < 今天``rebate_amount > 0``claimed_at` 空;`now < expire_at` |
| `claimed` | 已领 | `claimed_at` 非空 |
| `expired` | 过期 | `rebate_amount > 0`;未领;`now >= expire_at` |
状态迁移:
- `pending``claimable`:日切结算任务(仅昨日及更早批量处理;今日保持 pending
- `claimable``claimed`:用户领取接口(幂等)
- `claimable``expired`:过期扫描任务或领取时校验
前端映射(英文 UI
| 状态 | 展示 | 行样式 |
| --------- | --------- | -------------------- |
| pending | Pending | 绿色标签(进行中) |
| claimable | Claimable | 绿色可点 |
| claimed | Claimed | 白色/灰色 |
| expired | Expired | 红色/灰色 |
| 无记录 | No Bets | 灰字(仅前端 7 日占位,无 DB 行) |
### 3.5 领取规则
- 每次领取**一条**指定 `stat_date`(通常为昨日)。
- 并发DB 行级锁 / `UPDATE ... WHERE status=claimable` 防重复领。
- 入账:新增钱包流水类型(建议 `TRANSACTION_TYPE_DAILY_REBATE = 65`,在 `[Consts.php](slot_lib/src/common/const/Consts.php)` 登记);更新 `total_cashback`
- 失败:事务回滚,状态不变。
---
## 4. 数据设计
### 4.1 沿用表
- `**s_statistics.user_profit_daily`**:只读来源,提供 `bet``source``create_date`**不扩展**状态/返水字段。
### 4.2 新建表 `daily_rebate_record`(建议库:`s_common`
| 字段 | 类型 | 说明 |
| ----------------------- | ----------------- | ----------------------------------------- |
| id | bigint PK | |
| uid | bigint | 用户 ID |
| source | varchar | 渠道号(结算时快照) |
| stat_date | date | 统计日期(下注日) |
| bet_amount | bigint | 有效下注(厘) |
| rebate_amount | bigint | 返水金额(厘) |
| status | tinyint | 1 pending 2 claimable 3 claimed 4 expired |
| tier_snapshot | json | 结算时档位快照(审计) |
| claimable_at | datetime | 可领取开始 |
| expire_at | datetime | 过期时间 |
| claimed_at | datetime nullable | 领取时间 |
| created_at / updated_at | datetime | |
**唯一索引**`(uid, stat_date)`
**索引**`(stat_date, status)``(source, stat_date)``(uid)`
### 4.3 新建表 `daily_rebate_tier_config`(后台可配置)
| 字段 | 说明 |
| ----------------------- | ------------------ |
| id | PK |
| sort | 排序(从小到大) |
| min_bet | 区间下限(厘,含) |
| max_bet | 区间上限NULL=无上限) |
| rate_percent | 比例,如 3.00 表示 3% |
| status | 启用/停用 |
| updated_by / updated_at | 审计 |
校验:档位连续无空洞、无重叠;至少一档;最后一档可无 `max_bet`
---
## 5. 定时任务slot_console
| 任务 | 触发 | 职责 |
| ----------------------------------------------------------------------------- | ------------- | ------------------------------------------------------------------------------- |
| `dailyRebateSettle` | 每日 00:05可配置 | 结算 **昨日** `user_profit_daily` + 充值校验 → upsert `daily_rebate_record` 为 claimable |
| `dailyRebateExpire` | 每小时或 00:10 | 将 `claimable``now>=expire_at` 置为 expired |
| (可选)与现有 `[loseReturnDeposit](slot_console/app/command/LoseReturnDeposit.php)` | 同批读 Redis | 避免重复扫 Redis**推荐独立命令**以免耦合 VIP 逻辑 |
**待定实时**用户打开活动页时Logic 读 Redis `user:profit:{Ymd}` + 当前档位配置计算预览,不写 claimable。
---
## 6. 用户端PWA / Gateway
### 6.1 页面态(对齐原型)
| 态 | 条件 | 主按钮 | 表格 |
| --- | ------------------------------- | --------------- | ------------- |
| 锁定 | `total_deposit==0` | Unlock Cashback | 模糊/遮罩 |
| 已解锁 | 已充值,无可领 | Play Now | 近 7 日明细 |
| 可领取 | 存在 `claimable``stat_date=昨天` | Claim($X.XX) | 昨日行 Claimable |
**倒计时**「THIS ROUND」= 距今日自然日结束的秒数(与 Rates reset 00:00 文案一致)。
### 6.2 API建议落在 slot_console `/api/daily-rebate/*`,经 gateway 转发)
**GET `/api/daily-rebate/info`**
响应示例字段:
```json
{
"unlocked": true,
"countdown_seconds": 86399,
"claimable": { "stat_date": "2026-05-25", "rebate_amount": 3000, "display": "3.00" },
"tiers": [{ "min": 0, "max": 1000000, "rate": 3 }],
"records": [
{ "stat_date": "05/26", "bet_amount": 125560, "rebate_amount": 3770, "status": "pending" }
]
}
```
- `records`:最近 7 个自然日,**有 bet 或 DB 行**的日期;无下注日可不返回或前端填 No Bets。
- 打开弹窗时 **强制刷新** 当日 pending 数据。
**POST `/api/daily-rebate/claim`**
- 入参:`stat_date`(可选,默认昨天)
- 校验已充值、status=claimable、未过期、rebate>0
- 出参:领取后余额/流水号
**GET `/api/daily-rebate/tiers`**可选info 已含则省略)
---
## 7. 管理后台slot_admin + slot_admin_vue
### 7.1 菜单
- **活动配置 / 每日返水档位**新建CRUD [`daily_rebate_tier_config`],校验区间连续。
- **综合统计 / 每日返水统计**(新建):列表 + 汇总。
实现参考:列表+汇总 `[FreeCreditsStats](backend/slot_admin/app/game/logic/FreeCreditsStatsLogic.php)` + 前端 `[freeCreditsStats/index.vue](backend/slot_admin_vue/src/views/game/freeCreditsStats/index.vue)`
### 7.2 统计列表
**列**ID(uid) | 渠道号 | 有效下注额⇅ | 返水金额⇅ | 状态 | 统计日期
**筛选**
- UID精确
- 渠道(`source`,可搜索下拉,复用 `commonStore.allSourcesOptionsNoAll`
- 状态:待定 / 待领取 / 已领 / 过期(多选)
- 统计日期范围(`stat_date[]`
**排序白名单**`bet_amount``rebate_amount`(默认 `stat_date desc, id desc`
**数据范围**:仅 `total_deposit>0` 用户在结算时已入库的记录;**待定**行可对「今天」合并 Redis 实时 bet与 Free Credits「打开刷新」一致
### 7.3 顶部汇总(随筛选变化)
| 指标 | 计算 |
| ---- | ----------------------------------------------- |
| 总领取 | `status=claimed``sum(rebate_amount)` |
| 总待领取 | `status=claimable` 的 sum |
| 总过期 | `status=expired` 的 sum |
| 待定 | `status=pending` 的 sum**若筛选日期范围不含今天则为 0** |
| 领取率 | `总领取 / (总领取 + 总过期 + 总待领取)`;分母为 0 时显示 `0%``-` |
展示格式:`$888.88``rebate_amount / 1000`2 位小数)。
---
## 8. 非功能需求
- **幂等**:结算任务对 `(uid, stat_date)` upsert领取 CAS 更新状态。
- **性能**:日活结算批量按日期分页;后台列表分页默认 100最大 100。
- **审计**`tier_snapshot` 保留结算时档位;领取写 wallet log `biz_extra: {activity:"daily_rebate", stat_date}`
- **监控**:结算失败/领取失败打日志 + 指标;过期数量日报。
---
## 9. 边界与异常
| 场景 | 处理 |
| ------------- | ----------------------------------------------------------- |
| 结算日用户刚充值、昨日下注 | 昨日结算时已按当时 `total_deposit` 判断;若需「充值后立即对历史补发」→ **不做**,以结算时刻为准 |
| 结算任务重复跑 | upsert不重复入账 |
| 时区变更 | 禁止随意改;变更需重算规则文档化 |
| bet>0 未充值 | 不生成记录 |
| 领取时档位已改 | 以 `tier_snapshot` 为准,不受后续配置变更影响 |
| 跨天未关弹窗 | 前端倒计时结束刷新 infopending→claimable 由后端状态驱动 |
---
## 10. 实施拆分(供研发排期)
```mermaid
flowchart LR
subgraph phase1 [Phase1 数据与配置]
T1[daily_rebate_tier_config]
T2[daily_rebate_record]
T3[admin 档位 CRUD]
end
subgraph phase2 [Phase2 结算与过期]
C1[dailyRebateSettle]
C2[dailyRebateExpire]
L1[rebate calc service]
end
subgraph phase3 [Phase3 用户端]
A1[info API]
A2[claim API + wallet]
F1[PWA 三态 UI]
end
subgraph phase4 [Phase4 后台统计]
B1[DailyRebateStats Logic]
B2[admin vue 列表汇总]
end
phase1 --> phase2 --> phase3
phase2 --> phase4
```
| 仓库 | 改动要点 |
| ---------------------- | ---------------------------------------------------------- |
| slot_console | Model、结算/过期 Command、RebateCalcService、用户 API、Redis 读当日 bet |
| slot_wallet | 新 transaction type、领取入账 |
| slot_lib | Consts 新类型 |
| backend/slot_admin | Controller/Logic/Validate、菜单 SQL |
| backend/slot_admin_vue | 档位页 + 统计页 |
| slot_sdk | 若 gateway 经 sdk 调 console补 Client 方法 |
**不建议**复用 `vip_rebate_record` 表:业务语义、状态机、计费基础均不同。
---
## 11. 验收标准(摘要)
1. 充值用户 D 日下注 $2000D+1 00:00 后显示待领取 $5024h 内领取成功,流水类型正确。
2. 未充值用户仅见锁定态,无领取接口成功路径。
3. 超 24h 未领变过期,不可再领。
4. 后台筛选/status/排序/汇总与文档公式一致;改档位仅影响新结算日。
5. 前端 7 日表、Claim 按钮金额与后台一致;当日为 Pending 且随下注刷新。
---
## 12. 已确认决策
- 计费方式:**累进分段**(非整笔落档单一比例)。
- 有效下注:**等同 `user_profit_daily.bet`**。
- 档位:**后台可配置**`daily_rebate_tier_config`)。

View File

@@ -0,0 +1,160 @@
---
name: 注册奖励随机游戏
overview: 在 slot_console 注册活动type=7领取成功响应中从活动 ext_config.game_ids 配置的候选池里,按当前渠道 game_model_id 过滤已上架游戏后随机返回 game_id供前端直接进游戏。
todos:
- id: model-published-ids
content: GameApiModel 新增 publishedGameIds(gameModelId, gameIds) 查询
status: completed
- id: logic-pick-random
content: 新增 RegisterRewardLogic::pickRandomGameId 解析 ext_config 并随机
status: completed
- id: entity-receive
content: ActivityConfigEntity ACTIVITY_TYPE_REG 成功分支接入 Logic 并扩展返回
status: completed
- id: controller-phpdoc
content: GiftController::receive PHPDoc 补充 game_id 字段说明
status: completed
- id: unit-tests
content: RegisterRewardLogicTest + php82 容器跑单测
status: completed
isProject: false
---
# 注册奖励领取后随机返回 game_id
## 背景与范围
- **入口**[`POST /api/gift/receive`](slot_console/app/api/controller/GiftController.php) → [`ActivityConfigEntity::receive()`](slot_console/app/entity/activity/ActivityConfigEntity.php) 中 `ACTIVITY_TYPE_REG`type=7
- **不在范围**:注册自动到账(`UserRegisterEventService`)、后台 Vue 配置页、前端进游戏逻辑。
- **配置来源**(已确认):活动表 `s_recharge_gift_config.ext_config.game_ids`
当前领取成功仅返回金额:
```750:750:slot_console/app/entity/activity/ActivityConfigEntity.php
return ['gift_coin' => CommonFn::getNumberFormat($giftAmount), 'gift_bonus' => CommonFn::getNumberFormat($giftBonus)];
```
`game_id` 语义与大厅一致:[`s_game_api.game_id`](slot_console/app/model/GameApiModel.php) = `game.id`,前端用该 ID 调 `POST /api/game/login` 的 `gameId` 或 napi 搜索同款字段。
## 配置契约
在对应注册活动type=7的 `ext_config` 中增加:
```json
{
"game_ids": [101, 205, 308]
}
```
- `game_ids``int[]`,运营在 DB/后台 JSON 中维护;本任务不实现 admin UI。
- 未配置、空数组、或过滤后无有效游戏:**不阻断领取**,响应中 **省略 `game_id` 字段**(与 `withdraw_guide` 用 `0` 不同,避免前端误开游戏)。
## 数据流
```mermaid
sequenceDiagram
Client->>GiftController: POST /api/gift/receive id=activityId
GiftController->>ActivityConfigEntity: receive()
ActivityConfigEntity->>WalletService: gift() 注册赠送入账
ActivityConfigEntity->>RegisterRewardLogic: pickRandomGameId(ext_config, gameModelId)
RegisterRewardLogic->>GameApiModel: 过滤 status=1 且已发布
RegisterRewardLogic-->>ActivityConfigEntity: game_id|null
ActivityConfigEntity-->>Client: gift_coin, gift_bonus, game_id?
```
## 实现要点
### 1. 新增 Logic随机选游戏
新建 [`slot_console/app/api/logic/RegisterRewardLogic.php`](slot_console/app/api/logic/RegisterRewardLogic.php)(参考 [`FreeCreditsLogic`](slot_console/app/api/logic/FreeCreditsLogic.php) 的独立 Logic 拆分方式):
| 方法 | 职责 |
| --- | --- |
| `pickRandomGameId(array\|null $extConfig, int $gameModelId): ?int` | 解析 `game_ids` → 去重/转 int → 调 Model 过滤 → `array_rand` 返回一个 id |
解析规则:
- 支持 `game_ids` 为 JSON 数组或逗号分隔字符串(防御性,与部分旧配置风格兼容)。
- 非法/非正整数丢弃。
### 2. Model候选池与渠道上架交集
在 [`GameApiModel`](slot_console/app/model/GameApiModel.php) 增加查询方法,例如:
```php
public static function publishedGameIds(int $gameModelId, array $gameIds): array
```
条件:`game_id IN (...)`、`game_model_id = $gameModelId`、`status = STATUS_ON`;返回可用 `game_id` 列表。
不在 Logic 里直接拼 SQL符合分层规则。
### 3. 改动领取分支
在 [`ActivityConfigEntity::receive()`](slot_console/app/entity/activity/ActivityConfigEntity.php) 的 `ACTIVITY_TYPE_REG` case
- 发奖逻辑保持不变(`WalletService::gift` + `sendRegisterGiftWagerTask` + `setActivityFinishById`)。
- **仅在 `$res` 非空(领取成功)后**
- 用 `$this->where('id', $activityId)->find()` 读取原始 `ext_config``getActivityByInfo()` 经 `getGiftItemsByActivity` 组装,**不含** ext_config与兑换码分支读库方式一致
- `$gameModelId = $this->_modelId`(已由 `setSource` 设置)。
- 调用 `RegisterRewardLogic::pickRandomGameId()`。
- 在方法末尾统一组装返回:有值则追加 `'game_id' => $pickedId`。
[`GiftController::receive()`](slot_console/app/api/controller/GiftController.php) 补充 PHPDoc`data.game_id`int可选领取注册活动成功且配置了有效候选池时返回
### 4. 响应示例
成功且命中游戏:
```json
{
"code": 0,
"data": {
"gift_coin": "10.00",
"gift_bonus": "0.00",
"game_id": 205
}
}
```
成功但无可用游戏:仅 `gift_coin` / `gift_bonus`(与现网兼容)。
## 单测
新建 [`slot_console/tests/Unit/RegisterRewardLogicTest.php`](slot_console/tests/Unit/RegisterRewardLogicTest.php)
- `game_ids` 为空 / 缺失 → `null`
- 字符串 `"1,2,3"` 解析
- Model 层可用 stub 或 sqlite/内存 mock若项目已有 GameApi 测试惯例则对齐)
在 docker 内执行:
```bash
docker exec -w /app/www/slot/slot_console php82 ./vendor/bin/phpunit tests/Unit/RegisterRewardLogicTest.php
```
## 运维配置说明(无 UI
对目标渠道 type=7 活动,更新 `s_recharge_gift_config.ext_config`
```sql
-- 示例:在现有 ext_config 上合并 game_ids
UPDATE s_recharge_gift_config
SET ext_config = JSON_SET(COALESCE(ext_config, '{}'), '$.game_ids', JSON_ARRAY(101, 205))
WHERE id = <activity_id> AND type = 7;
```
`game_ids` 须为当前 `model_id` 下已在 `s_game_api` 上架的 `game.id`。
## 风险与边界
| 场景 | 行为 |
| --- | --- |
| 配置了已下架/未发布游戏 | 从池中剔除;池空则不下发 `game_id` |
| 重复领取 | 现有 `Is Got` 拦截,不会二次随机 |
| 多注册活动同渠道 | 按请求的 `id` 读对应活动 `ext_config` |
## 后续可选(本任务不做)
- slot_admin 活动编辑页 type=7 增加「推荐游戏」多选,写入 `ext_config.game_ids`
- `getActivityList` 预展示候选游戏(非领取必需)

View File

@@ -0,0 +1,127 @@
---
name: 注册活动列表 game_id
overview: 在 C 端活动列表type=7 注册活动)透出 `game_id` 供前端展示/进游戏;同时从领取接口 `POST /api/gift/receive` 移除 `game_id` 字段,复用现有 `RegisterRewardLogic``ext_config.game_ids` 配置。
todos:
- id: list-game-id
content: ActivityConfigEntity::getGiftItemsByActivity type=7 分支调用 RegisterRewardLogic 写入 game_id
status: completed
- id: remove-receive-game-id
content: ActivityConfigEntity::receive 移除注册活动 game_id 逻辑
status: completed
- id: logic-stable-pick
content: RegisterRewardLogic 增加 pickGameIdForUser稳定随机并更新注释
status: completed
- id: phpdoc-tests
content: GiftController PHPDoc 调整 + RegisterRewardLogicTest 补充用例
status: completed
isProject: false
---
# 注册活动列表透出 game_id领取不再返回
## 需求变更(相对初版)
| 接口 | 原行为 | 目标行为 |
|------|--------|----------|
| `POST /api/gift/getActivityList` | 注册活动无 `game_id` | type=7 项增加可选 `game_id` |
| `POST /api/gift/receive`type=7 | 成功时随机返回 `game_id` | **仅** `gift_coin``gift_bonus` |
后台 `ext_config.game_ids` 配置与 [`RegisterRewardLogic`](slot_console/app/api/logic/RegisterRewardLogic.php) 过滤已上架游戏逻辑**保持不变**,仅调整调用位置。
## 数据流
```mermaid
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`](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_config``ActivityConfigEntity``GiftService::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_config``RegisterRewardLogic::pickRandomGameId``$registerRewardGameId` 变量
- 删除返回数组末尾对 `game_id` 的合并(约 763765 行)
注册发奖、`sendRegisterGiftWagerTask``setActivityFinishById` **不动**
### 3. Controller PHPDoc
[`GiftController.php`](slot_console/app/api/controller/GiftController.php)
- `receive()`:去掉 `game_id` 说明,仅 `gift_coin` / `gift_bonus`
- 可选:为 `getActivityList()` 补充一行说明——type=7 且配置了有效 `game_ids` 时,对应项含 `game_id`int
### 4. Logic 注释与单测
[`RegisterRewardLogic.php`](slot_console/app/api/logic/RegisterRewardLogic.php):类注释改为「活动列表推荐进游戏」;保留 `pickRandomGameId` 或改为对外暴露 `pickGameIdForUser`(二选一,避免死代码)。
[`RegisterRewardLogicTest.php`](slot_console/tests/Unit/RegisterRewardLogicTest.php):为 `pickGameIdForUser` 增加确定性用例(相同 uid+activityId 同结果;无候选返回 null
## 响应示例
**活动列表**type=7 片段):
```json
{
"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` 字段**。
**领取**
```json
{
"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` 的依赖)

View File

@@ -0,0 +1,183 @@
---
name: 注册活动推荐游戏配置
overview: 在 slot_admin 活动管理 type=7 编辑页增加「推荐游戏」多选,写入 ext_config.game_ids配套列表展示与保存校验与 slot_console 已实现的领取随机进游戏逻辑对齐。
todos:
- id: admin-model-api
content: GameApiModel 查询方法 + ActivityController::publishedGames
status: completed
- id: admin-validate
content: ActivityValidate::checkRegisterRewardExt + save/update 调用
status: completed
- id: vue-edit
content: activity/edit.vue type=7 推荐游戏多选与 submit/setFormData
status: completed
- id: vue-api-index
content: activity.js API + index.vue type=7 列表展示
status: completed
- id: manual-verify
content: 后台保存后 C 端领取验证 game_id 随机返回
status: completed
isProject: false
---
# 注册活动 type=7 推荐游戏后台配置
## 背景
C 端已在 [`RegisterRewardLogic`](slot_console/app/api/logic/RegisterRewardLogic.php) 读取 `ext_config.game_ids`,领取注册活动成功后随机返回 `game_id`。本任务补齐 **后台配置入口**,范围:
- [`backend/slot_admin_vue`](backend/slot_admin_vue) 活动编辑/列表
- [`backend/slot_admin`](backend/slot_admin) 保存校验与游戏选项 API
不涉及 slot_console 改动(`updateConfig` 已原样持久化 `ext_config` JSON
## 配置契约(与 C 端一致)
```json
{
"game_ids": [101, 205, 308]
}
```
- 值为 `game.id``s_game_api.game_id`),须属于活动 `model_id`**status=1** 的已发布游戏。
- 允许为空:领取仍成功,响应不含 `game_id`
## 数据流
```mermaid
sequenceDiagram
AdminVue->>ActivityController: GET publishedGames?model_id=
ActivityController->>GameApiModel: 已上架 game_id 列表
AdminVue->>ActivityController: POST save/update ext_config.game_ids
ActivityController->>ActivityValidate: checkRegisterRewardExt
ActivityController->>ConsoleInnerapi: ActivityService add/update
ConsoleInnerapi->>DB: s_recharge_gift_config.ext_config
```
## 1. slot_admin 后端
### 1.1 游戏选项 API
在 [`ActivityController`](backend/slot_admin/app/game/controller/ActivityController.php) 新增:
- **`publishedGames(Request $request)`**
- 入参:`model_id`(必填,对应活动「游戏模型」)
- 出参:`[{ game_id, name }]`,供多选下拉
查询放在 [`GameApiModel`](backend/slot_admin/app/model/GameApiModel.php)`s_common.s_game_api`
```php
public static function optionsByGameModelId(int $gameModelId): array
```
条件:`game_model_id``status = 1``field('game_id,name')`,按 `sort` 排序;可对 `game_id` `group` 去重(与 console 侧一致)。
### 1.2 保存校验
在 [`ActivityValidate`](backend/slot_admin/app/game/validate/ActivityValidate.php) 新增 **`checkRegisterRewardExt(array $extConfig, int $gameModelId)`**
| 规则 | 说明 |
| --- | --- |
| `game_ids` 可选 | 缺失或 `[]` 直接通过 |
| 元素为正整数 | 非法 ID 抛 `ValidateException` |
| 与渠道一致(推荐) | 调用 `GameApiModel::publishedGameIds($gameModelId, $ids)`(与 console 同名语义),提交 ID 必须全部在已发布集合内,否则提示未上架 ID |
`ActivityController::save` / `update``updateData` 全量更新时)中,当 `type === 7` 时调用:
```php
$this->validate->checkRegisterRewardExt(
(array) input('ext_config', []),
(int) input('model_id', 0)
);
```
对齐 type=11 的 [`checkFreeCreditsExt`](backend/slot_admin/app/game/validate/ActivityValidate.php) 调用方式。
可在 `GameApiModel` 复用与 console 相同的 `publishedGameIds` 静态方法admin 连接 `s_common`,表结构一致)。
## 2. slot_admin_vue 前端
### 2.1 API
在 [`src/api/game/activity.js`](backend/slot_admin_vue/src/api/game/activity.js) 增加:
```js
publishedGames(params) {
return request({ url: '/game/activity/publishedGames', method: 'get', params })
}
```
(路径随 Webman 路由约定:`game/activity/publishedGames`。)
### 2.2 编辑页 type=7 表单项
文件:[`src/views/game/activity/edit.vue`](backend/slot_admin_vue/src/views/game/activity/edit.vue)
**仅 type=7**`<template>` 中增加(参考 type=11 独立区块,勿影响 type=8 下载奖励):
```vue
<template v-if="formData.type === 7">
<a-form-item label="推荐游戏" field="ext_config.game_ids"
help="用户领取注册奖励后,从此列表随机推荐一款已上架游戏">
<a-select
v-model="formData.ext_config.game_ids"
:options="publishedGameOptions"
multiple allow-search allow-clear
placeholder="请先选择游戏模型,再选择推荐游戏"
:disabled="!formData.model_id"
/>
</a-form-item>
</template>
```
脚本逻辑(对齐现有 type=10/11 的 `setFormData` / `submit` 分支):
| 时机 | 处理 |
| --- | --- |
| `open` / `model_id` 变更 | `loadPublishedGames()` → 调 `publishedGames({ model_id })`,映射 `{ value: game_id, label: name + ' (' + game_id + ')' }` |
| `setFormData` type=7 | `formData.ext_config.game_ids = (data.ext_config?.game_ids ?? []).map(Number)` |
| `submit` type=7 | `data.ext_config = { ...data.ext_config, game_ids: 去重正整数数组 }`**不**覆盖其他 ext 字段 |
初始 `formData.ext_config` 在 type=7 时保证含 `game_ids: []`(避免 `v-model` 未定义)。
**不**复用首页导航的 cascader[`indexGameNav/edit.vue`](backend/slot_admin_vue/src/views/yyladmin/indexGameNav/edit.vue) 存的是 `nav-{id}-{brandId}`,与 `game_id` 语义不同)。
### 2.3 列表页展示
文件:[`src/views/game/activity/index.vue`](backend/slot_admin_vue/src/views/game/activity/index.vue)
`#ext_config` 插槽增加 type=7 分支:
-`game_ids`:展示 `推荐游戏: 101, 205, ...`(或显示数量 + tooltip
- 无配置:显示「未配置」灰色文案
## 3. 与现有编辑页结构的衔接
当前 type=7 属于 `onlyGift`,仍通过 **goods 卡片** 配置赠送金额(`goods_id: -1` 由 console 汇总),`ext_config` 此前为空。本次仅在 `ext_config` 增加 `game_ids`,与 goods 并存:
- 提交时 **不要** 像 type=11 那样 `data.goods = []`
- `submit` 中 type=7 仅 merge `game_ids``ext_config`
## 4. 验证方式
1. 后台新建/编辑 type=7 活动,选择游戏模型后多选 2+ 款已上架游戏,保存成功。
2. DB 检查:`s_recharge_gift_config.ext_config``"game_ids":[...]`
3. C 端 `POST /api/gift/receive` 领取该活动,响应含随机 `game_id`
4. 提交未上架 `game_id` 应被 admin 校验拦截。
5. `game_ids` 留空:保存成功,领取响应无 `game_id`
## 文件清单
| 仓库 | 文件 | 变更 |
| --- | --- | --- |
| slot_admin | `app/model/GameApiModel.php` | `optionsByGameModelId``publishedGameIds` |
| slot_admin | `app/game/controller/ActivityController.php` | `publishedGames`save/update 校验 type=7 |
| slot_admin | `app/game/validate/ActivityValidate.php` | `checkRegisterRewardExt` |
| slot_admin_vue | `src/api/game/activity.js` | `publishedGames` |
| slot_admin_vue | `src/views/game/activity/edit.vue` | type=7 多选 + 加载/读写 |
| slot_admin_vue | `src/views/game/activity/index.vue` | type=7 ext_config 展示 |
## 风险说明
- 切换「游戏模型」后已选 `game_ids` 可能与新模型不匹配:可在 `model_id` `@change` 时清空 `game_ids` 并提示重新选择(建议在实现时一并处理)。
- 游戏选项依赖 `s_game_api` 发布数据;未发布游戏不会出现在下拉,也无法通过校验提交。

View File

@@ -0,0 +1,73 @@
---
name: 测试 register bet win
overview: 设计一套不改代码的联调测试方案,覆盖 register、bet、win含中间派奖+最终结算)主流程、幂等与关键校验。输出可直接执行的请求序列和验收点。
todos:
- id: collect-endpoints
content: 整理 register/bet/win 的可调用入口与参数最小集合
status: completed
- id: define-test-cases
content: 设计主链路、幂等、参数异常三类用例
status: completed
- id: prepare-request-templates
content: 产出按执行顺序排列的请求模板与预期结果
status: completed
isProject: false
---
# Register/Bet/Win 测试计划
## 目标
- 用最小链路验证 `register -> bet -> win` 的资金变更与返回口径。
- 覆盖 `win` 的两阶段结算(`is_end=0` 中间派奖、`is_end=1` 最终结算)。
- 覆盖关键风控点:幂等(重复 `biz_id`)、参数校验(`round_id``is_end`、金额)。
## 关键实现依据(用于制定用例)
- 接口入口与兼容关系:[`app/api/controller/WalletController.php`](app/api/controller/WalletController.php)
- `wallet/bet``wallet/win` 为独立入口;`wallet/update(type=bet|win)` 复用同链路。
- 业务分发与资金处理:[`app/api/logic/WalletLogic.php`](app/api/logic/WalletLogic.php)
- `register``RegisterService::execute`
- `bet``biz_id` 做幂等。
- `win``is_end=0` 只累计待结算金额,`is_end=1` 才真正入账并清理缓存。
- 注册落账与 Lot 初始化:[`app/service/wallet/RegisterService.php`](app/service/wallet/RegisterService.php)
- 注册会初始化钱包、统计行,并按 `fee/bonus` 创建 Deposit/Bonus Lot。
- 请求参数约束:[`app/validator/Wallet2Validator.php`](app/validator/Wallet2Validator.php)
- bet/win 必传 `round_id``is_end` 仅支持 `0/1`
## 测试范围与步骤
1. **准备阶段**
- 选一个全新 `uid`(避免历史账干扰)。
- 固定 `currency/source/organization`,并准备唯一 `biz_id` 生成规则(例如带时间戳)。
2. **主链路测试Happy Path**
-`wallet/update` 发起 `register``type=register`,带 `fee``bonus`)。
-`wallet/wallet` 查询余额基线。
-`wallet/bet`(带 `round_id`)验证扣款与返回结构。
-`wallet/win``is_end=0`:确认返回中 `withdraw` 临时增加(待结算展示),但不落最终账。
-`wallet/win``is_end=1`:确认最终入账,并清理该 `round_id` 的待结算累计。
3. **幂等与异常场景**
- 重放同一 `bet.biz_id`:应命中幂等,余额不重复变化。
- 重放同一 `win.biz_id`:应命中幂等,余额不重复变化。
- 缺失 `round_id` 调 bet/win应返回参数错误。
- 传非法 `is_end`(如 2应返回参数错误。
4. **验收口径**
- 余额变化符合顺序:下注优先扣 Bonus再 Deposit再 Withdraw。
- `win` 仅在最终结算时落地资金结果;中间派奖只累计。
- 重复请求无重复记账,返回语义稳定。
## 建议请求流(逻辑顺序图)
```mermaid
flowchart TD
registerCall[register(update)] --> walletCheck1[wallet_query]
walletCheck1 --> betCall[bet]
betCall --> winMid[win_is_end_0]
winMid --> walletCheck2[wallet_query]
walletCheck2 --> winFinal[win_is_end_1]
winFinal --> walletCheck3[wallet_query]
walletCheck3 --> idemReplay[replay_same_biz_id]
```
## 交付物
- 一份可直接在 Postman/curl 执行的请求模板(含示例 body
- 一份对照清单:每一步的“预期返回 + 余额期望 + 幂等期望”。

View File

@@ -0,0 +1,82 @@
---
name: 测试报告可追踪输出
overview: 在现有 WalletRegisterBetWinTest 上增加“可追踪测试报告”:每次执行输出并落盘 uid/round_id/biz_id/余额快照,失败时可直接按用户复现。
todos:
- id: add-reporter-support
content: 新增 WalletTestRunContext 与 WalletTestReporterJSON+Markdown 落盘)
status: completed
- id: wire-test-class
content: 改造 WalletRegisterBetWinTest记录 uid/round/biz_idtearDown 输出摘要
status: completed
- id: config-and-doc
content: phpunit.xml 增加 WALLET_TEST_UID/REPORT_DIR更新 doc 执行说明
status: completed
- id: verify-run
content: 容器执行 phpunit 并确认控制台+报告文件含 uid
status: completed
isProject: false
---
# 钱包集成测试可追踪报告方案
## 问题
当前 [tests/Feature/WalletRegisterBetWinTest.php](tests/Feature/WalletRegisterBetWinTest.php) 每个用例都会 `makeUid()` 生成随机用户PHPUnit 默认只显示 `OK (3 tests, 37 assertions)`**看不到本次用了哪个 `uid``round_id``biz_id`**,联调排障和 DB 核对都不方便。
## 目标
- 跑完测试后,**控制台**能看到每个用例的测试用户与关键业务 ID。
- **落盘一份报告**JSON + 可读 Markdown便于复制 `uid` 去查库或手工 curl 复现。
- 可选:通过环境变量固定 `uid`,便于反复验证同一用户。
## 实现方案
### 1. 新增测试上下文与报告器
新增 [tests/Support/WalletTestRunContext.php](tests/Support/WalletTestRunContext.php)
- 字段:`testName`, `uid`, `currency`, `roundId`, `bizIds`register/bet/win_mid/win_final, `traceId`, `steps[]`(每步 API、code、余额快照, `status`, `errorMsg`
新增 [tests/Support/WalletTestReporter.php](tests/Support/WalletTestReporter.php)
- `startRun()` / `recordStep()` / `finishTest()` / `writeReport()`
- 报告目录:`runtime/test-reports/`(文件名含时间戳,如 `wallet-register-bet-win-20260515-160530.json` 与同名 `.md`
- Markdown 表格示例列:用例名 | uid | round_id | biz_id 列表 | 结果 | 最终余额(deposit/withdraw/b)
### 2. 改造现有 Feature 测试
在 [tests/Feature/WalletRegisterBetWinTest.php](tests/Feature/WalletRegisterBetWinTest.php) 中:
- `setUp()`:初始化 reporter若存在 `WALLET_TEST_UID` 则使用该固定 uid否则继续随机
- 每个 `test*` 开始:创建 `WalletTestRunContext` 并记录 uid/round_id/biz_id。
- `postJson()` / `wallet()`:成功后把 `code`、关键 `data`、查询余额写入 `steps`
- `tearDown()`:标记 pass/fail调用 `writeReport()`**向 STDOUT 打印一行摘要**PHPUnit 控制台可见),例如:
- `[WalletTest] testRegisterBetWinFlow uid=90012345 round=r_... bet=bet_... => PASS`
失败时 assertion message 附带 context 摘要,便于一眼定位用户。
### 3. 配置与文档
- [phpunit.xml](phpunit.xml) 增加可选 env
- `WALLET_TEST_UID`(空=随机)
- `WALLET_TEST_REPORT_DIR`(默认 `runtime/test-reports`
- `WALLET_TEST_VERBOSE``1` 时打印每步明细)
- 更新 [doc/register-bet-win-test.md](doc/register-bet-win-test.md) §7
- 报告路径说明
- 固定 uid 复现示例:`WALLET_TEST_UID=90012345 docker compose exec ... phpunit ...`
### 4. 执行验证
容器内执行:
```bash
docker compose exec -T -w /app/www/ray/slot-wallet php82 php vendor/bin/phpunit --filter WalletRegisterBetWinTest
```
验收:
- 控制台出现每个用例的 `uid` 摘要行
- `runtime/test-reports/` 生成 `.json` + `.md`
- 测试仍全部通过3 tests
## 报告结构示意
```mermaid
flowchart LR
testCase[WalletRegisterBetWinTest] --> context[WalletTestRunContext]
context --> reporter[WalletTestReporter]
reporter --> stdout[ConsoleSummary]
reporter --> jsonFile[runtime/test-reports/*.json]
reporter --> mdFile[runtime/test-reports/*.md]
```
## 不在本阶段做的(可选后续)
- HTML 可视化报告、CI artifact 上传
- DB 直连断言wallet_log / wallet_fund_lot

View File

@@ -0,0 +1,59 @@
---
name: 玩家任务进度查询
overview: 新增一个面向玩家的只读接口,返回当前 Bonus/Deposit 任务及其打码进度与详情,数据口径以 PRD 定义的 `wallet_fund_lot` 为准。保持现有资金主流程不变,仅补充查询链路与文档说明。
todos:
- id: define-player-task-endpoint
content: 新建独立玩家任务查询 Controller不改 WalletController并完成入参校验与统一返回
status: pending
- id: add-lot-query-service
content: 在 wallet 域新增只读查询服务,按 PRD 聚合 bonus/deposit 当前任务视图并计算进度字段
status: pending
- id: extend-fund-lot-model
content: 在 WalletFundLotModel 增加面向玩家任务页的查询方法按币种、lot_type、状态过滤与排序
status: pending
- id: document-api-contract
content: 更新 doc/wallet.md补充玩家任务进度查询接口契约与状态语义
status: pending
- id: verify-key-scenarios
content: 按基础与边界场景验证返回结构、进度计算和状态映射
status: pending
isProject: false
---
# 玩家查看Bonus/Deposit任务与打码进度计划
## 目标与口径
- 提供玩家侧查询能力:查看“当前仍在生命周期内”的 `Bonus``Deposit` 任务,以及每条任务的进度与关键详情。
- 数据源以 [`/Users/ray/Documents/project/www/ray/slot-wallet/app/model/multi/WalletFundLotModel.php`](/Users/ray/Documents/project/www/ray/slot-wallet/app/model/multi/WalletFundLotModel.php) 为准,不再使用旧 `wager_task` 作为玩家任务主视图。
- 任务状态遵循 PRD`Waiting/Active/PendingConversion/PlayedOut` 等),并输出前端可直接消费的进度字段。
## 接口设计(新增)
- 新建独立 Controller 承载玩家查询接口(建议新增 [`/Users/ray/Documents/project/www/ray/slot-wallet/app/api/controller/PlayerTaskController.php`](/Users/ray/Documents/project/www/ray/slot-wallet/app/api/controller/PlayerTaskController.php) 并提供 `taskProgress` 方法),不在 [`/Users/ray/Documents/project/www/ray/slot-wallet/app/api/controller/WalletController.php`](/Users/ray/Documents/project/www/ray/slot-wallet/app/api/controller/WalletController.php) 增加行为。
- 入参:`uid``currency`(可复用 [`/Users/ray/Documents/project/www/ray/slot-wallet/app/validator/WalletValidator.php`](/Users/ray/Documents/project/www/ray/slot-wallet/app/validator/WalletValidator.php) 现有校验,或为新 Controller 补充专用 scene/validator
- 出参建议:
- `summary`:当前 `bonus_task_count``deposit_task_count`
- `bonus_tasks[]``deposit_tasks[]`:每条含 `lot_id``lot_no``status``status_text``source_type``source_id``original_amount``remaining_amount``required_wager``current_wager``left_wager``progress_rate``created_at``completed_at``brief`
- “当前任务”默认筛选为:`status in (Waiting, Active, PendingConversion, PlayedOut)`;不返回 `Completed/Cancelled/Reversed`(避免历史噪音)。
## 分层落地
- Logic/Service 层新增只读查询编排(建议放在 wallet 域 service控制器不直接拼查询
- 查询指定用户指定币种的 Deposit/Bonus Lots
- 按类型分组并按 `consume_priority_at, id` 排序;
- 统一计算衍生字段:
- `left_wager = max(required_wager - current_wager, 0)`
- `progress_rate = required_wager > 0 ? min(current_wager / required_wager, 1) : 1`
- 统一状态文案映射(与 PRD 对齐)。
- Model 层在 [`/Users/ray/Documents/project/www/ray/slot-wallet/app/model/multi/WalletFundLotModel.php`](/Users/ray/Documents/project/www/ray/slot-wallet/app/model/multi/WalletFundLotModel.php) 补充专用查询方法(如按币种+lot_type+status 列表查询),保持 Controller/Logic 不下沉 SQL 细节。
## 文档与兼容
- 在 [`/Users/ray/Documents/project/www/ray/slot-wallet/doc/wallet.md`](/Users/ray/Documents/project/www/ray/slot-wallet/doc/wallet.md) 的 API 建议章节补充“玩家任务进度查询”示例(字段说明与状态语义)。
- 明确该接口是玩家视图;旧 [`/Users/ray/Documents/project/www/ray/slot-wallet/app/api/controller/TaskController.php`](/Users/ray/Documents/project/www/ray/slot-wallet/app/api/controller/TaskController.php) 维持兼容,不做破坏式改造。
## 验证计划
- 基础场景:同时存在 Bonus/Deposit Active 任务,返回分组正确、进度计算正确。
- 边界场景:
- `required_wager=0`(进度应视为 100%
- `current_wager > required_wager`(进度封顶 100%
- 仅有 PlayedOut Bonus仍应展示方便玩家理解“已用完未转化”
- 无当前任务(返回空数组与计数 0
- 一致性检查:字段值与 `wallet_fund_lot` 原始记录一致,且状态解释符合 PRD。

View File

@@ -0,0 +1,154 @@
---
name: 移除 RELEASING 状态
overview: 移除 Free Credits 玩家主状态 `STATUS_RELEASING(7)`,并同步实现「跨档领取 + 解锁不等待上一档 claim」后续档进度仅由 package 表表达玩家主状态停留在第一档生命周期4/5/6直至全部完成10
todos:
- id: remove-releasing-status
content: FreeCreditsPlayerModel 删除 STATUS_RELEASINGadvanceByRecharge 去掉写入 status=7
status: completed
- id: cross-claim-logic
content: claim() 去掉顺序校验advanceByRecharge 去掉 nextReadyReleasePackage 解锁门槛
status: completed
- id: update-docs-comments
content: 同步 FreeCreditsLogic/Controller PHPDoc 与 install.sql status 注释
status: completed
- id: admin-vue-status-map
content: slot_admin_vue freeCreditsStats 删除 status=7 映射与筛选项
status: completed
- id: migrate-legacy-7
content: 提供/执行 status=7 历史数据 SQL 修正
status: completed
- id: add-tests
content: 补充跨档 claim 与解锁不等待 claim 的单测/集成测
status: completed
isProject: false
---
# 移除 STATUS_RELEASING 并支持跨档领取
## 结论
**是的,应去掉** [`FreeCreditsLogic.php`](slot_console/app/api/logic/FreeCreditsLogic.php) 第 709 行的 `$player->save(['status' => STATUS_RELEASING])`
**是的,后台展示要改**[`slot_admin_vue`](backend/slot_admin_vue/src/views/game/freeCreditsStats/index.vue) 的 `PLAYER_STATUS_MAP` 需删除 `7: '后续档释放中'`
**`slot_admin` PHP 无需改**[`FreeCreditsStatsController.php`](backend/slot_admin/app/game/controller/FreeCreditsStatsController.php) 仅透传 `slot_console` innerapi不做 status 映射。
## 背景:为何 status=7 已无意义
原设计里,玩家主状态在「第一档生命周期」之后还有一个独立阶段 `releasing(7)`
```mermaid
stateDiagram-v2
direction LR
firstCashReady: 4 第一档可提现
firstCashProcessing: 5 第一档处理中
firstCashDone: 6 第一档已提现
releasing: 7 后续档释放中
completed: 10 全部完成
firstCashReady --> firstCashProcessing
firstCashProcessing --> firstCashDone
firstCashDone --> releasing: 解锁后续档时写入7
releasing --> completed
```
跨档领取后:
- **后续档是否可领、已领多少** → 由 [`free_credits_package.status`](slot_console/app/model/common/FreeCreditsPackageModel.php) 表达(后台已有 `progress_done/total``claimed_amount_qf`
- **玩家主状态** → 只描述「第一档相关阶段」,全部档位完成时由现有 [`refreshPlayerCompletion()`](slot_console/app/api/logic/FreeCreditsLogic.php) 置为 `10`
`STATUS_RELEASING` 在全仓库**仅写入、从未被读取**做分支判断C 端 [`buildStatus()`](slot_console/app/api/logic/FreeCreditsLogic.php) 原样透出 `player.status`,去掉后不影响 package 列表展示。
## 代码改动slot_console
### 1. 删除 RELEASING 常量与写入
文件:[`FreeCreditsPlayerModel.php`](slot_console/app/model/common/FreeCreditsPlayerModel.php)
- 删除 `const STATUS_RELEASING = 7` 及注释
文件:[`FreeCreditsLogic.php`](slot_console/app/api/logic/FreeCreditsLogic.php) `advanceByRecharge()`
- 删除循环内 `$player->save(['status' => STATUS_RELEASING])`
- 解锁 release 档时**不再改玩家主状态**(保持 4/5/6 等既有值)
### 2. 跨档领取:去掉顺序限制
文件:[`FreeCreditsLogic.php`](slot_console/app/api/logic/FreeCreditsLogic.php)
**claim()** — 删除顺序校验块(约 295298 行):
```php
$nextReady = FreeCreditsPackageModel::nextReadyReleasePackage($player->id);
if (is_null($nextReady) || intval($nextReady->id) !== intval($package->id)) {
throw new BusinessException('Please claim credits in order');
}
```
保留:`package_type=release`、归属 uid、`status=ready`、幂等 biz_id、失败回滚 ready。
**advanceByRecharge()** — 去掉「存在 ready 后续档则不再解锁」门槛(约 695 行):
```php
// 改前
if ($rechargeAmount < $minRecharge || !is_null(FreeCreditsPackageModel::nextReadyReleasePackage($player->id))) {
return;
}
// 改后:仅校验单笔充值下限
if ($rechargeAmount < $minRecharge) {
return;
}
```
`nextReadyReleasePackage()` 方法可保留(暂无其它引用,后续若 C 端需要「推荐下一档」可复用)。
### 3. 文档注释同步
- [`FreeCreditsLogic::claim()`](slot_console/app/api/logic/FreeCreditsLogic.php) PHPDoc去掉「须按 package_no 顺序」
- [`FreeCreditsController::claim()`](slot_console/app/api/controller/FreeCreditsController.php) PHPDoc去掉「须为当前可领的下一档 / claim in order」
- [`install.sql`](slot_console/db/install.sql) `free_credits_player.status` 字段 comment删除 `7后续释放中`
### 4. 历史数据修正(建议一次性 SQL
线上若已有 `status=7` 的记录,应按第一档 package 还原为主状态,避免后台筛选项去掉 7 后显示裸数字:
```sql
UPDATE s_common.free_credits_player p
INNER JOIN s_common.free_credits_package fp
ON fp.player_id = p.id AND fp.package_no = 1
SET p.status = CASE fp.status
WHEN 2 THEN 5 -- 第一档处理中
WHEN 3 THEN 6 -- 第一档已完成
WHEN 1 THEN 4 -- 第一档可提现
ELSE 6
END
WHERE p.status = 7;
```
(若首档 package 不存在,默认 `6` 或按业务确认。)
## 后台展示改动slot_admin_vue
文件:[`freeCreditsStats/index.vue`](backend/slot_admin_vue/src/views/game/freeCreditsStats/index.vue)
-`PLAYER_STATUS_MAP` 删除 `7: '后续档释放中'`
- `playerStatusOptions` 自动随之更新(由 map 生成)
- **可选兼容**:保留只读展示 `7: '第一档已提现(历史)'` 不加入筛选项,避免迁移前偶发裸数字;迁移 SQL 执行后可删
列表「当前状态」列继续读 `record.status`;后续档进度看已有的「完成进度」「已领取金额」「待释放金额」,不再依赖 releasing 主状态。
## 测试
在 [`slot_console/tests`](slot_console/tests) 补充/调整:
| 场景 | 预期 |
|------|------|
| 两档均为 readyclaim 较高 package_no | 成功,不再抛 `Please claim credits in order` |
| 上一档 ready 未 claim满足充值条件 | `advanceByRecharge` 仍可解锁下一 locked 档 |
| 解锁 release 档后 | `player.status` 不变(如仍为 `STATUS_FIRST_CASH_DONE` |
| 全部 package completed | `player.status``10` |
## 不在本次范围
- [`docs/requirements/首充前免费余额定格与分档释放需求文档.md`](docs/requirements/首充前免费余额定格与分档释放需求文档.md) §16/§20.3 仍写顺序领取与 releasing — 若需文档对齐可另开任务
- C 端前端slot_pwa 等)若曾按 `status===7` 做 UI 分支需自查;当前仓库内无引用

View File

@@ -0,0 +1,174 @@
---
name: 第一档提现审核拒绝
overview: 补齐管理后台「拒绝退钱/拒绝扣钱」对 Free Credits 第一档独立提现free_credit_first_cashout的处理Pay 侧识别业务类型、避免误动钱包,并通过已有 Console 总线回调恢复档位状态。
todos:
- id: persist-biz-type
content: WithdrawalOrderEntity::creatOrder 写入 data_snapshot.biz_type新增 isFreeCreditFirstCashout 判断
status: in_progress
- id: apply-skip-freeze
content: apply() 第一档跳过 withdrawFrozen 与 incTodayWithdrawalInfo
status: pending
- id: audit-reject-branch
content: audit() 拒绝退钱/扣钱:第一档跳过钱包,发 Fail/Rejected 总线;普通单保持原逻辑
status: pending
- id: mq-constants
content: slot_lib MQBusEntity 增加三条 FreeCredits 事件常量
status: pending
- id: event-withdrawal
content: EventWithdrawal 成功/失败按 biz_type 发 Success/Fail 总线,避免误 withdrawSuccess/Fail
status: pending
- id: tests
content: 补充 slot_pay 单测 + 手工验证后台拒绝退钱/扣钱
status: pending
isProject: false
---
# 第一档提现:后台审核拒绝处理
## 问题确认
管理后台 [`slot_admin_vue/.../withdrawal/index.vue`](backend/slot_admin_vue/src/views/game/order/withdrawal/index.vue) 点「拒绝退钱」(`audit_status=2`) / 「拒绝扣钱」(`audit_status=3`) → [`WithdrawalOrderController::audit`](backend/slot_admin/app/game/controller/WithdrawalOrderController.php) → `PayService::withdrawalAudit` → [`WithdrawalOrderEntity::audit`](slot_pay/app/entity/WithdrawalOrderEntity.php)。
当前 `audit()` **一律**对普通提现调用 `withdrawFail` / `withdrawDone`**不**通知 `slot_console``FreeCreditsLogic::handleFirstCashoutResult`
第一档提现([`FreeCreditsLogic::applyFirstCashoutWithdraw`](slot_console/app/api/logic/FreeCreditsLogic.php)`bizType=free_credit_first_cashout`)在提交时已 `markFirstCashoutProcessing`,审核拒绝后档位会卡在 **processing**C 端无法再次提现。
需求文档约定([§20.2](docs/requirements/首充前免费余额定格与分档释放需求文档.md)
| 后台操作 | 产品语义 | 应对 `handleFirstCashoutResult` |
|----------|----------|----------------------------------|
| 拒绝退钱 | 失败,可重试 | `success=false, rejected=false` → 档位 **ready** |
| 拒绝扣钱 | 风控拒绝 | `success=false, rejected=true` → 档位 **rejected** |
`slot_console` 已有消费端([`EventBus.php`](slot_console/app/command/EventBus.php) L133140**全库无生产端** 发送 `FreeCreditsFirstCashoutFail` / `Rejected` / `Success`
```mermaid
flowchart TB
subgraph today [现状]
adminReject[后台拒绝退钱]
payAudit[Pay audit]
walletFail[withdrawFail]
adminReject --> payAudit --> walletFail
end
subgraph target [目标]
adminReject2[后台拒绝退钱]
payAudit2[Pay audit 识别 bizType]
skipWallet[跳过钱包退冻]
mqFail[MQ FreeCreditsFirstCashoutFail]
fcLogic[handleFirstCashoutResult ready]
adminReject2 --> payAudit2 --> skipWallet
payAudit2 --> mqFail --> fcLogic
end
```
## 改造范围(主改 `slot_pay`,常量补 `slot_lib`
### 1. 订单落库时持久化 `biz_type`
文件:[`slot_pay/app/entity/WithdrawalOrderEntity.php`](slot_pay/app/entity/WithdrawalOrderEntity.php) — `creatOrder()`
-`WithdrawalInfo::$bizType` 非空,写入 `data_snapshot.biz_type`(表无独立字段,用现有 JSON 即可)。
- 常量与 C 端一致:`free_credit_first_cashout`(见 [`FreeCreditsLogic::BIZ_TYPE_FIRST_CASHOUT`](slot_console/app/api/logic/FreeCreditsLogic.php))。
新增私有方法(同文件):
```php
private function isFreeCreditFirstCashout(?WithdrawalInfo $info = null, ?self $order = null): bool
```
- 优先读 `$info->bizType`;审核/回调阶段读 `$order->data_snapshot['biz_type']`
### 2. 申请提现:第一档不冻普通钱包
文件:同上 — `apply()`
- `isFreeCreditFirstCashout($info)` 为 true 时:
- **跳过** `withdrawFrozen``UserTagService::incTodayWithdrawalInfo`
-`creatOrder`、人工审核分支、`WebSocketMqService::sendWithdrawalUrl` 保持不变。
- `catch` 中仅当曾冻结时才 `withdrawFail`(与现逻辑一致,第一档不会进入)。
对齐 [`WithdrawalInfo` 注释](slot_lib/src/entity/data/WithdrawalInfo.php) 与需求「第一档不进入普通钱包 withdraw」。
### 3. 审核拒绝/扣钱:分支 + 发总线(核心)
文件:同上 — `audit()`
`audit_status` 设为 2 或 3 后:
| 条件 | 钱包 | Console 总线 `type` | `handleFirstCashoutResult` |
|------|------|---------------------|----------------------------|
| 普通提现 + 拒绝退钱 | `withdrawFail` | 无 | — |
| 普通提现 + 拒绝扣钱 | `withdrawDone` | 无 | — |
| 第一档 + 拒绝退钱 | **不调**钱包;**不调** `decTodayWithdrawalInfo` | `FreeCreditsFirstCashoutFail` | ready可重提 |
| 第一档 + 拒绝扣钱 | **不调**钱包 | `FreeCreditsFirstCashoutRejected` | rejected |
实现方式Pay 依赖已有 `ConsoleMqService`
```php
use slotLib\common\mq\ConsoleMqService;
// audit 拒绝分支内:
if ($this->isFreeCreditFirstCashout(null, $order)) {
$event = $type === self::AUDIT_STATUS_REVIEW
? MQBusEntity::TYPE_FREE_CREDITS_FIRST_CASHOUT_FAIL
: MQBusEntity::TYPE_FREE_CREDITS_FIRST_CASHOUT_REJECTED;
ConsoleMqService::getInstance()->sendConsoleBusEvent($order->uid, $event, [
'order_id' => $order->order_id,
]);
} else {
// 现有 withdrawFail / withdrawDone + decTodayWithdrawalInfo
}
```
站内信逻辑可保留(第一档同样通知用户)。
### 4. 总线常量集中到 `slot_lib`
文件:[`slot_lib/src/entity/mq/MQBusEntity.php`](slot_lib/src/entity/mq/MQBusEntity.php)
新增(与 console 现有字符串一致):
- `TYPE_FREE_CREDITS_FIRST_CASHOUT_SUCCESS = 'FreeCreditsFirstCashoutSuccess'`
- `TYPE_FREE_CREDITS_FIRST_CASHOUT_FAIL = 'FreeCreditsFirstCashoutFail'`
- `TYPE_FREE_CREDITS_FIRST_CASHOUT_REJECTED = 'FreeCreditsFirstCashoutRejected'`
[`slot_console/app/entity/mq/MQBusEntity.php`](slot_console/app/entity/mq/MQBusEntity.php) 可改为 `use slotLib\entity\mq\MQBusEntity as LibMQBusEntity` 引用常量(可选,避免双份字符串)。
### 5. 顺带补齐:打款结果回调(建议同 PR
[`EventWithdrawal::updateOrder()`](slot_pay/app/command/EventWithdrawal.php) 在成功/失败时同样未区分第一档,会误调 `withdrawSuccess` / `withdrawFail`
在同一 PR 中按 `data_snapshot.biz_type` 分支:
- 成功 → 发 `FreeCreditsFirstCashoutSuccess`**不** `withdrawSuccess`
- 失败 → 发 `FreeCreditsFirstCashoutFail`**不** `withdrawFail`
- 普通单保持现状
否则后台「通过」后渠道失败/成功,档位状态仍会错乱。
## 不改动的部分
- **管理后台 UI**:无需改,仍调 `audit(record, 2|3)`
- **`FreeCreditsLogic::handleFirstCashoutResult`**:逻辑已满足需求,只补 Pay 侧触发。
- **数据库 DDL**:用 `data_snapshot`,无需加列。
## 历史订单
已产生、且 `data_snapshot``biz_type` 的第一档单:
- 拒绝时仍会走旧 `withdrawFail`(若当时已冻钱包则退钱正确,但档位仍卡 processing
- 运维可对已知 `order_id` 在 console 手工调用 `handleFirstCashoutResult`,或一次性 SQL 回填 `data_snapshot.biz_type`(按 `free_credits_package.withdraw_order_id` 关联)。
## 测试
| 层级 | 内容 |
|------|------|
| `slot_pay` 单测 | `creatOrder` 写入 `biz_type``isFreeCreditFirstCashout``audit(2)` 第一档 mock 不发 `withdrawFail`、发 MQmock `ConsoleMqService` |
| `slot_console` 已有 | [`FreeCreditsLogicCashoutResultTest`](slot_console/tests/Integration/FreeCreditsLogicCashoutResultTest.php) 覆盖 `handleFirstCashoutResult` |
| 手工 | 后台对第一档人工单:拒绝退钱 → C 端档位回 ready 可再提;拒绝扣钱 → rejected |
## 涉及文件小结
- [`slot_pay/app/entity/WithdrawalOrderEntity.php`](slot_pay/app/entity/WithdrawalOrderEntity.php) — `creatOrder` / `apply` / `audit` + helper
- [`slot_pay/app/command/EventWithdrawal.php`](slot_pay/app/command/EventWithdrawal.php) — 打款结果分支(建议同 PR
- [`slot_lib/src/entity/mq/MQBusEntity.php`](slot_lib/src/entity/mq/MQBusEntity.php) — 事件常量
- (可选)[`slot_console/app/entity/mq/MQBusEntity.php`](slot_console/app/entity/mq/MQBusEntity.php) — 引用 lib 常量

View File

@@ -0,0 +1,176 @@
---
name: 第一档提现或保留余额
overview: 为 Free Credits 第一档定格后首笔金额增加用户二选一沿用现有独立提现或新增「保留到可提现余额」withdraw_balance、不创建打码任务。涉及 slot_wallet 新钱包原子能力、slot_lib RPC、slot_console 新 C 端接口与档位状态同步。
todos:
- id: wallet-first-keep
content: slot_walletWalletLogModel + WalletLogic::freeCreditsFirstCashKeepwithdraw 入账、无 createTask+ 单测
status: completed
- id: slot-lib-rpc
content: slot_lib WalletService 增加 freeCreditsFirstCashKeep RPC
status: completed
- id: console-keep-api
content: slot_consoleFreeCreditsLogic::keepFirstCash + Validator + Controller + 路由
status: completed
- id: console-tests
content: slot_console 单测 FreeCreditsKeepFirstCashTest必要时调整 broadcast action
status: completed
- id: run-phpunit
content: php82 容器跑 console + wallet 相关单测
status: completed
isProject: false
---
# 第一档:提现或保留到可提现余额
## 背景与现状
当前第一档(`package_type=TYPE_FIRST_CASH`)在累计充值解锁后**仅支持**走 [`WithdrawService::applyFreeCreditsFirstCashout`](slot_console/app/service/WithdrawService.php) → Pay 独立提现(`bizType=free_credit_first_cashout`**不经过钱包余额**(需求文档 §15.3)。
后续释放档走 [`FreeCreditsLogic::claim`](slot_console/app/api/logic/FreeCreditsLogic.php) → [`WalletLogic::freeCreditsClaim`](slot_wallet/app/api/logic/WalletLogic.php):入账 **deposit_balance****创建 Y1 打码任务**
新需求:第一档金额用户可二选一:
| 选项 | 行为 |
| --- | --- |
| **Withdraw** | 保持现有 `/api/withdraw/apply` + `package_id` |
| **Keep to balance** | 入账 **withdraw_balance****不** `createTask`,金额立即可参与普通提现规则(无其它未完成打码任务时) |
已确认:保留余额入账 **withdraw_balance**(非 deposit
```mermaid
flowchart TD
firstReady[第一档 status=ready]
firstReady --> withdrawPath["POST /api/withdraw/apply"]
firstReady --> keepPath["POST /api/free-credits/keep-first-cash"]
withdrawPath --> payOrder[Pay 独立提现单]
payOrder --> busCallback[EventBus 提现结果]
busCallback --> pkgDone[package completed]
keepPath --> walletKeep[wallet freeCreditsFirstCashKeep]
walletKeep --> pkgDone
pkgDone --> playerDone[player STATUS_FIRST_CASH_DONE]
```
## 目标契约
### 新接口slot_console
- **路径**`POST /api/free-credits/keep-first-cash`(与现有 `claim` 命名风格一致)
- **入参**`package_id`(必填,`free_credits_package.id`,须为第一档且 `status=ready`
- **成功**`data` 结构同 `status()` / `claim``buildStatus`
- **幂等**`bizId = free_credits_first_keep:{packageId}`;重复请求不重复入账
- **互斥**:同一第一档 `processing/completed` 后不可再提现或 keep提现处理中不可 keep
### 档位与玩家状态(与提现成功对齐)
完成后与 [`handleFirstCashoutResult(success)`](slot_console/app/api/logic/FreeCreditsLogic.php) 一致:
- package → `STATUS_COMPLETED`,写 `completed_time``claim_biz_id` 存幂等键(复用字段,无需改表)
- player → `STATUS_FIRST_CASH_DONE`
- 调用 `refreshPlayerCompletion`
- 首页状态条关闭逻辑与「第一档提现成功」相同C 端仍用 `status` / packages[0] completed
### 钱包slot_wallet
新增 **`freeCreditsFirstCashKeep`**`WalletLogic::run``type` 分发):
- `inc(withdraw=fee, deposit=0, bonus=0)` 增加 **withdraw_balance**
- **不**调用 `createTask`
- 流水:`BIZ_TYPE_FREE_CREDITS_FIRST_KEEP = 'freeCreditsFirstCashKeep'``WALLET_TYPE_GIFT`(与 freeze/claim 一致)
- 事务内完成入账 + `addLog`;成功后 `sendConsoleBus`(可选,用于统计/通知,类型建议 `freeCreditsFirstCashKeep`
对比现有实现:
| 能力 | 入账 | 打码任务 |
| --- | --- | --- |
| `freeCreditsClaim`(后续档) | deposit | Y1 `createTask` |
| **`freeCreditsFirstCashKeep`(新)** | **withdraw** | **无** |
### slot_lib
[`WalletService`](slot_lib/src/services/WalletService.php) 增加常量与方法:
```php
const WALLET_TYPE_FREE_CREDITS_FIRST_KEEP = 'freeCreditsFirstCashKeep';
public function freeCreditsFirstCashKeep($amount, $bizId = ''): Wallet
```
## 实现步骤
### 1. slot_wallet
| 文件 | 改动 |
| --- | --- |
| [`WalletLogModel.php`](slot_wallet/app/model/multi/WalletLogModel.php) | `BIZ_TYPE_FREE_CREDITS_FIRST_KEEP` |
| [`WalletLogic.php`](slot_wallet/app/api/logic/WalletLogic.php) | `freeCreditsFirstCashKeep()`:镜像 `freeCreditsClaim` 事务结构,改为 `inc(fee,0,0)`**删除** `createTask` 调用 |
| 单测 | 新增 `WalletFreeCreditsFirstKeepTest`(或扩展现有 wallet 单测):断言 withdraw 增加、无 task 创建(可 mock `createTask` 不被调用) |
### 2. slot_lib
- [`WalletService.php`](slot_lib/src/services/WalletService.php):常量 + `freeCreditsFirstCashKeep($amount, $bizId)`
### 3. slot_console — Logic
[`FreeCreditsLogic.php`](slot_console/app/api/logic/FreeCreditsLogic.php) 新增 `keepFirstCash(int $uid, int $packageId): array`
1. `assertEligibleParticipant`
2. 查询 package`uid``TYPE_FIRST_CASH``STATUS_READY`
3. `bizId = 'free_credits_first_keep:' . $packageId`
4. package → `STATUS_PROCESSING`,写 `claim_biz_id`
5. `walletService->freeCreditsFirstCashKeep($package->amount_qf, $bizId)`
6. 成功 → package `COMPLETED` + 时间戳player `STATUS_FIRST_CASH_DONE``refreshPlayerCompletion`
7. 失败 → package 回滚 `READY`(同 `claim`
8. 返回 `buildStatus`
**不**改 `advanceByRecharge` / 定格冻结逻辑。
### 4. slot_console — API 层
| 文件 | 改动 |
| --- | --- |
| [`FreeCreditsValidator.php`](slot_console/app/api/validator/FreeCreditsValidator.php) | `SCENE_KEEP_FIRST_CASH``package_id` require\|integer |
| [`FreeCreditsController.php`](slot_console/app/api/controller/FreeCreditsController.php) | `keepFirstCash()` + PHPDoc类注释补充第二路径 |
| 路由配置 | 注册 `POST /api/free-credits/keep-first-cash`(查项目现有 `route` / `config``free-credits` 注册方式,与 `claim` 并列) |
### 5. 广播 / 统计(小改)
- [`buildBroadcastList`](slot_console/app/api/logic/FreeCreditsLogic.php):第一档 completed 若走 keep广播 `action` 可新增 `keep`(或复用 `claim`);与产品确认文案前可先 `keep`
- [`FreeCreditsStatsLogic`](slot_console/app/innerapi/logic/FreeCreditsStatsLogic.php)`first_cashout_*` 按「第一档 completed」统计**keep 与 withdraw 均计入**(无需区分,除非运营后续要拆指标)
### 6. 单测slot_console
| 文件 | 内容 |
| --- | --- |
| 新增 `FreeCreditsKeepFirstCashTest` | harness 注入 mock `WalletService`;断言状态迁移、幂等、非 ready 抛错 |
| 可选集成测 | keep 后 package completed + player `FIRST_CASH_DONE` |
运行:
```bash
docker exec -w /app/www/slot/slot_console php82 ./vendor/bin/phpunit tests/Unit/FreeCreditsKeepFirstCashTest.php
docker exec -w /app/www/slot/slot_wallet php82 ./vendor/bin/phpunit tests/Unit/WalletFreeCreditsFirstKeepTest.php
```
## C 端约定(供联调,本次可不改 PWA
第一档 `packages[0].status === 1` 时展示两个入口:
- **Withdraw** → 现有 `POST /api/withdraw/apply` + `package_id`
- **Keep to Balance** → `POST /api/free-credits/keep-first-cash` + `package_id`
完成后 `packages[0].status === 3`,与提现成功 UI 一致(按钮隐藏 / 成功态)。
## 不在本次范围
- slot_pwa / gateway 前端页面与文案
- 需求文档 §1011 全文修订可后续补「Add to Balance」分支
- 修改后续档 `claim` 的打码规则
- 第一档金额改由后台配置动态展示(仍从 `packages[0].amount` 读取)
## 验收清单
1. 第一档 readykeep 成功 → withdraw_balance 增加对应千分位,**无**新 WagerTask
2. 同一 package 重复 keep幂等不重复加钱
3. keep 成功后package/player 状态与提现成功一致;`status` 接口 packages[0] 为 completed
4. 第一档 processing提现中keep 拒绝
5. 第一档 completedwithdraw / keep 均拒绝
6. 相关单测通过

View File

@@ -0,0 +1,162 @@
---
name: 第一档提现独立接口
overview: 将 Free Credits 第一档免打码提现从 `POST /api/withdraw/apply` 拆出,新增 `POST /api/free-credits/withdraw-first-cash`(与 `keep-first-cash` 并列);普通提现接口保持原样,不再识别 `package_id`
todos:
- id: validator-migrate
content: FreeCreditsValidator 增加 withdraw-first-cash 各支付 sceneWithdrawValidator 移除 *_fc
status: completed
- id: controller-endpoint
content: FreeCreditsController::withdrawFirstCash + 注释更新
status: completed
- id: withdraw-service-split
content: WithdrawService 抽出 public applyFreeCreditsFirstCashapply() 去掉 package_id 分支
status: completed
- id: withdraw-controller-clean
content: WithdrawController::apply 仅保留普通提现校验与文案
status: completed
- id: tests-update
content: 迁移/更新 Validator 与 FreeCreditsFirstCashoutApplyTest 单测
status: completed
isProject: false
---
# 第一档提现独立接口
## 现状
第一档独立提现与**普通钱包提现**共用同一入口:
```mermaid
flowchart LR
client[C端]
withdrawApply["POST /api/withdraw/apply"]
withdrawSvc[WithdrawService::apply]
fcLogic[FreeCreditsLogic::applyFirstCashoutWithdraw]
pay[PayService::apply]
client --> withdrawApply
withdrawApply -->|"package_id > 0"| withdrawSvc
withdrawApply -->|"无 package_id"| withdrawSvc
withdrawSvc --> fcLogic --> pay
```
关键代码:
- [`WithdrawController::apply`](slot_console/app/api/controller/WithdrawController.php)`package_id` 非空时走 `WithdrawValidator::firstCashoutScene`
- [`WithdrawService::apply`](slot_console/app/service/WithdrawService.php) L167168`package_id > 0` 时调用 `applyFreeCreditsFirstCashout` → [`FreeCreditsLogic::applyFirstCashoutWithdraw`](slot_console/app/api/logic/FreeCreditsLogic.php)
- 第一档「保留余额」已是独立接口:`POST /api/free-credits/keep-first-cash`[`FreeCreditsController`](slot_console/app/api/controller/FreeCreditsController.php)
目标形态:
```mermaid
flowchart LR
normal["POST /api/withdraw/apply\namount + 绑卡"]
fcWithdraw["POST /api/free-credits/withdraw-first-cash\npackage_id + 绑卡"]
keep["POST /api/free-credits/keep-first-cash\npackage_id"]
normal --> walletWithdraw[余额/手续费/黑规则]
fcWithdraw --> fcLogic[FreeCreditsLogic]
keep --> walletKeep[freeCreditsFirstCashKeep]
```
## 新接口契约
| 项 | 约定 |
| --- | --- |
| 路径 | `POST /api/free-credits/withdraw-first-cash`Webman 默认路由 → `FreeCreditsController::withdrawFirstCash` |
| 入参 | `package_id`(必填)、`type`1/2/3/6、各支付方式绑卡字段与现 `WithdrawValidator``*_fc` scene 一致)、可选 `pay_net` |
| 成功 `data` | `{ order_id, amount }`(与现第一档走 `withdraw/apply` 的返回一致,**不**改 `buildStatus` |
| 成功 `msg` | 沿用现第一档文案:`Submitted successfully! Your order is under review...` |
| 业务逻辑 | **复用** `FreeCreditsLogic::applyFirstCashoutWithdraw`Pay 回调、`handleFirstCashoutResult`、档位状态机**不变** |
与 [`keep-first-cash`](slot_console/app/api/controller/FreeCreditsController.php) 对称:同属 Free Credits 活动域,第一档二选一:
- **Withdraw** → `POST /api/free-credits/withdraw-first-cash`
- **Keep** → `POST /api/free-credits/keep-first-cash`
## 实现步骤(仅 slot_console
### 1. 新 Controller 方法
文件:[`FreeCreditsController.php`](slot_console/app/api/controller/FreeCreditsController.php)
- 新增 `withdrawFirstCash(Request $request)`
- 校验 → 构建 `WithdrawApplyDTO`(复用现有 DTO`package_id` + 绑卡字段)→ 调用提现编排(见下)
- 更新类注释:第一档提现改指向新路径
### 2. 校验迁移到 FreeCreditsValidator
文件:[`FreeCreditsValidator.php`](slot_console/app/api/validator/FreeCreditsValidator.php)
从 [`WithdrawValidator`](slot_console/app/api/validator/WithdrawValidator.php) **迁入**
- `SCENE_WITHDRAW_FIRST_CASH_CASH` / `_BTC` / `_USDT` / `_PAYPAL`(命名可与原 `*_fc` 对齐或重命名)
- `type``user_name``cash_tag``btc``usdt``paypal_*``email` 等 rule`*_fc` scene 字段集)
- 静态方法 `firstCashoutScene(int $type): string`(原 `firstCashoutScene`
[`WithdrawValidator`](slot_console/app/api/validator/WithdrawValidator.php)**删除** `SCENE_APPLY_*_FC``firstCashoutScene` 及对应 scene 配置。
### 3. 提现编排仍放 WithdrawService绑卡 + 锁)
文件:[`WithdrawService.php`](slot_console/app/service/WithdrawService.php)
- 将现有 `applyFreeCreditsFirstCashout` 提升为 **`public function applyFreeCreditsFirstCash(WithdrawApplyDTO $applyDTO): array`**,内容包含:
- `is_bind_name` 校验
- Redis 防重复提交锁(与 `apply` 相同 key
- `checkBankInfo` + `FreeCreditsLogic::applyFirstCashoutWithdraw`
- [`apply()`](slot_console/app/service/WithdrawService.php)**删除** `if ($applyDTO->package_id > 0)` 分支,仅保留普通提现路径
说明:绑卡逻辑仍在 `WithdrawService` 私有方法中Logic 层不重复实现,避免违反分层「不中转 Service」时仍复用已有绑卡能力。
### 4. 精简 WithdrawController
文件:[`WithdrawController.php`](slot_console/app/api/controller/WithdrawController.php)
- `apply()` 仅按 `type` 选普通 scene`(string) $type`
- 移除 `package_id` 分支与差异化 `msg`
**不对**旧接口传 `package_id` 做拒绝或转发(按你的确认:无需处理)。
### 5. DTO / 字段
[`WithdrawApplyDTO`](slot_console/app/api/dto/request/WithdrawApplyDTO.php)`package_id` 字段可保留供新接口使用;注释改为「仅 free-credits/withdraw-first-cash 使用」。普通 `withdraw/apply` 不再读取该字段。
### 6. 单测与文档注释
| 文件 | 改动 |
| --- | --- |
| [`WithdrawValidatorFreeCreditsTest.php`](slot_console/tests/Unit/WithdrawValidatorFreeCreditsTest.php) | 迁至 `FreeCreditsValidatorWithdrawFirstCashTest`(或合并进 `FreeCreditsValidatorTest`),断言新 scene |
| [`FreeCreditsFirstCashoutApplyTest.php`](slot_console/tests/Integration/FreeCreditsFirstCashoutApplyTest.php) | 改为调用 `WithdrawService::applyFreeCreditsFirstCash`(或经新 Controller harness断言仍是不走余额校验、Pay 失败回滚 ready |
| [`FreeCreditsController.php`](slot_console/app/api/controller/FreeCreditsController.php) / [`FreeCreditsValidator.php`](slot_console/app/api/validator/FreeCreditsValidator.php) | 注释同步新路径 |
运行:
```bash
docker exec -w /app/www/slot/slot_console php82 ./vendor/bin/phpunit \
tests/Unit/FreeCreditsValidatorTest.php \
tests/Unit/WithdrawValidatorFreeCreditsTest.php \
tests/Integration/FreeCreditsFirstCashoutApplyTest.php
```
(迁移后调整具体测试文件名。)
## 不在本次范围
- slot_pwa / gateway 前端改 URL联调时 C 端将 Withdraw 按钮从 `/api/withdraw/apply` 改为 `/api/free-credits/withdraw-first-cash`
- slot_pay / wallet / EventBus 回调逻辑
- `keep-first-cash``claim``status` 行为
## C 端联调要点
第一档 `packages[0].status === 1` 时:
- **Withdraw** → `POST /api/free-credits/withdraw-first-cash` + `package_id` + 支付方式字段
- **Keep** → 现有 `POST /api/free-credits/keep-first-cash`
普通提现页仍用 `POST /api/withdraw/apply``amount` 必填,**不传** `package_id`)。
## 验收
1. 新接口:第一档 ready + 合法绑卡 → 返回 `order_id`/`amount`package → `processing`Pay 失败回滚 `ready`
2. 新接口:非 ready / 无资格 / processing 中 → 业务异常与现逻辑一致
3. `POST /api/withdraw/apply`:仅普通提现;带 `amount` 走余额/手续费校验;**不再**因 `package_id` 进入 Free Credits 分支
4. `keep-first-cash` / `claim` / 提现结果回调回归不受影响
5. 相关单测通过

View File

@@ -0,0 +1,120 @@
---
name: 第一档提现统计入账
overview: 第一档免打码提现成功后Pay 的 `EventWithdrawal` 在发 Console 总线之外,需经 slot_lib 调用 wallet 新增「仅累加 total_withdraw」接口把提现金额记入分片 `wallet_stat_xx`,与普通提现 `withdrawSuccess` 的统计口径对齐。
todos:
- id: wallet-stat-method
content: slot_walletWalletLogModel 常量 + WalletLogic::freeCreditsFirstCashoutStatinc total_withdraw + 幂等)
status: completed
- id: slot-lib-client
content: slot_lib WalletService常量 + freeCreditsFirstCashoutStat() 封装 HTTP update
status: completed
- id: pay-event-hook
content: slot_pay EventWithdrawal第一档成功分支调用 freeCreditsFirstCashoutStat(order_id, amount)
status: completed
- id: tests
content: wallet 单测幂等与 stat incpay 单测/mock 验证调用链
status: completed
- id: backfill-optional
content: (可选)历史成功第一档订单回填 total_withdraw 脚本说明
status: completed
isProject: false
---
# 第一档提现成功wallet_stat 累计提现额补齐
## 背景与缺口
首充定格第一档(`free_credit_first_cashout`)在 [EventWithdrawal.php](slot_pay/app/command/EventWithdrawal.php) 打款成功时已按设计 **跳过** `withdrawSuccess` / `withdrawFail`,只发 Console 总线:
```117:122:slot_pay/app/command/EventWithdrawal.php
if (WithdrawalOrderEntity::isFreeCreditFirstCashoutOrder($order)) {
ConsoleMqService::getInstance()->sendConsoleBusEvent($order->uid, MQBusEntity::TYPE_FREE_CREDITS_FIRST_CASHOUT_SUCCESS, [
'order_id' => $order->order_id,
]);
} else {
$walletService->withdrawSuccess($withdrawalAmount, $order->order_id);
```
普通提现的 `total_withdraw` 仅在 [WalletLogic::withdraw()](slot_wallet/app/api/logic/WalletLogic.php)`type=withdraw`)里 `WalletStatModel::inc(..., 'total_withdraw', fee)`,且会 `finishWithdraw` 扣减 `withdraw_lock`。
第一档 **不冻结** 普通钱包([WithdrawalOrderEntity::apply](slot_pay/app/entity/WithdrawalOrderEntity.php) 已跳过 `withdrawFrozen`),因此 **不能** 直接调 `withdrawSuccess`——会动 `withdraw_lock` 并可能失败。
遗留问题:**`wallet_stat_{xx}.total_withdraw` 未累加**,后台用户列表/盈亏等读 `tw`/`total_withdraw` 会偏小。
```mermaid
sequenceDiagram
participant Pay as slot_pay EventWithdrawal
participant Console as slot_console EventBus
participant Wallet as slot_wallet WalletLogic
Note over Pay: 现状(成功)
Pay->>Console: FreeCreditsFirstCashoutSuccess
Note over Wallet: total_withdraw 未更新
Note over Pay: 目标(成功)
Pay->>Console: FreeCreditsFirstCashoutSuccess
Pay->>Wallet: freeCreditsFirstCashoutStat(order_id, amount)
Wallet->>Wallet: inc total_withdraw + wallet_log
```
---
## 推荐方案wallet 新增「仅统计」类型
与现有 `freeCreditsFreeze` / `freeCreditsFirstCashKeep` 一致:走 `POST api/wallet/update``WalletLogic::run()` 按 `type` 分发,**不改** `wallet_account` 余额与 `withdraw_lock`。
### 1. slot_wallet
| 文件 | 改动 |
|------|------|
| [WalletLogModel.php](slot_wallet/app/model/multi/WalletLogModel.php) | 新增 `BIZ_TYPE_FREE_CREDITS_FIRST_CASHOUT_STAT = 'freeCreditsFirstCashoutStat'` |
| [WalletLogic.php](slot_wallet/app/api/logic/WalletLogic.php) | 新增 `freeCreditsFirstCashoutStat()``fee>0` 时事务内 `WalletStatModel::inc(currency, 'total_withdraw', fee)` + `addLog(0, balance, 新 biz_type, WALLET_TYPE_GIFT)`(流水 amount=0 或记负向备注,与 first_keep 风格一致) |
| 幂等 | `biz_id` 使用 **提现订单号** `order_id`(与 `withdrawSuccess` 一致);`wallet_log` 表已有 `uniq_uid_bizid_type (uid, biz_id, biz_type)`。重复 MQ 消费时 `addLog` 唯一键冲突应 **视为成功**(查已有流水则直接返回当前 wallet 快照,不二次 `inc`)——可参考项目内其它 Free Credits 写法的异常处理,若无统一模式则在方法开头 `findOne(['biz_id','biz_type'])` 短路 |
**刻意不做:**
- 不调 `finishWithdraw` / `doneWithdraw`
- 不 `sendConsoleBus('Withdrawal')`(避免与普通提现总线混淆)
- 失败/拒绝路径 **不** dec `total_withdraw`(申请时未 inc与 `manualRefund` 对称性无关)
### 2. slot_lib
| 文件 | 改动 |
|------|------|
| [WalletService.php](slot_lib/src/services/WalletService.php) | 常量 `WALLET_TYPE_FREE_CREDITS_FIRST_CASHOUT_STAT = 'freeCreditsFirstCashoutStat'` + 方法 `freeCreditsFirstCashoutStat($amount, $bizId = '')` |
Pay 继续用现有 `slotLib\services\WalletService`(与 `withdrawSuccess` 同路径),**不**在本需求引入 `slot_sdk`(与当前 pay→wallet 一致)。
### 3. slot_pay
| 文件 | 改动 |
|------|------|
| [EventWithdrawal.php](slot_pay/app/command/EventWithdrawal.php) | 第一档成功分支:在发 Console 总线 **之后**(或之前,顺序无关)调用 `$walletService->freeCreditsFirstCashoutStat($withdrawalAmount, $order->order_id)` |
| 可选对齐 | 普通成功会 `UserTagService::incSuccessWithdrawalInfo`;若产品希望第一档也计入「成功提现次数/金额」标签,可同分支补上;**若仅关心 wallet_stat可不加**(需你确认时可单独加) |
失败/拒绝分支 **保持现状**(只发 Fail/Rejected 总线,不调 wallet
### 4. 测试
| 仓库 | 内容 |
|------|------|
| `slot_wallet` | 单测:`freeCreditsFirstCashoutStat` 累加 `total_withdraw`、相同 `biz_id` 幂等 |
| `slot_pay` | 扩展 [WithdrawalOrderFreeCreditsTest.php](slot_pay/tests/Unit/WithdrawalOrderFreeCreditsTest.php) 或 mock `EventWithdrawal::updateOrder`:第一档成功应调用新方法、不调 `withdrawSuccess` |
---
## 历史数据
已打款成功、但 `total_withdraw` 未记的第一档订单:可写一次性运维脚本(按 `free_credits_package.withdraw_order_id` + pay 订单金额)批量调新接口或 SQL `inc``biz_id` 用原 `order_id` 保证幂等。
---
## 涉及文件小结
- [slot_wallet/app/api/logic/WalletLogic.php](slot_wallet/app/api/logic/WalletLogic.php)
- [slot_wallet/app/model/multi/WalletLogModel.php](slot_wallet/app/model/multi/WalletLogModel.php)
- [slot_lib/src/services/WalletService.php](slot_lib/src/services/WalletService.php)
- [slot_pay/app/command/EventWithdrawal.php](slot_pay/app/command/EventWithdrawal.php)
- 测试:`slot_wallet/tests/Unit/...`、`slot_pay/tests/Unit/WithdrawalOrderFreeCreditsTest.php`
**不改:** `FreeCreditsLogic::handleFirstCashoutResult`档位状态已覆盖、Console EventBus 消费端。

View File

@@ -0,0 +1,148 @@
---
name: 跨服务 slot_sdk 约束
overview: 在用户级 Cursor 规则目录新增一条「跨服务通信」约束,用统一、可操作的术语规定:业务服务之间的 HTTP 互调必须经 `slot/sdk``slotsdk`)完成,并与现有 `backend-layering` 规则互补而不重复。
todos:
- id: create-mdc
content: 新建 /Users/ray/.cursor/rules/cross-service-sdk.mdcalwaysApply + 术语与调用规范)
status: completed
- id: consistency-check
content: 对照 backend-layering.mdc 确认交叉引用一致、无重复分层表
status: completed
- id: optional-readme
content: (可选)在 slot_sdk/readme.md 增加简短架构说明
status: completed
isProject: false
---
# 跨服务通信 Cursor 用户级约束
## 背景与目标
当前用户级规则在 [`/Users/ray/.cursor/rules/`](file:///Users/ray/.cursor/rules/) 已有:
- [`backend-layering.mdc`](file:///Users/ray/.cursor/rules/backend-layering.mdc) — 单服务内 Controller / Logic / Service 分层
- [`dev-environment.mdc`](file:///Users/ray/.cursor/rules/dev-environment.mdc) — Docker 本地开发
- [`php-doc.mdc`](file:///Users/ray/.cursor/rules/php-doc.mdc) — PHPDoc 规范
[`backend-layering.mdc`](file:///Users/ray/.cursor/rules/backend-layering.mdc) 仅在 Service 层职责里顺带提到「sdk」**没有**规定跨服务 HTTP 的入口、命名与新增 API 的流程。本次新增**独立规则**(单一职责,符合 create-rule 实践),`alwaysApply: true`,与现有三条规则一致。
代码库事实(供规则用语对齐):
- 包名:`slot/sdk`,命名空间 `slotsdk\`,仓库 [`slot_sdk`](file:///Users/ray/Documents/project/www/slot/slot_sdk)
- 典型消费方:`slot_admin``slot_agent``slot_console``slot_pwa`composer 依赖 `slot/sdk`
- 典型被调方:`slot_wallet``slot_user``slot_center` 等,对外暴露 `innerapi/*``api/*`
- 推荐调用链:`new {Domain}Client($config)->service()->{method}(...)`
- 项目内已有表述:[`slot_agent/doc/feature_agent.md`](file:///Users/ray/Documents/project/www/slot/slot_agent/doc/feature_agent.md) —「代理服不直连用户域表,统一通过 `slot_sdk` 调用户服 innerapi」
按你的选择:**规则只约束新代码走 slot_sdk不写 InnerCurlService / slot_lib 等 legacy 迁移条款。**
---
## 术语优化(写入规则正文)
| 避免说法 | 推荐说法 | 说明 |
| --- | --- | --- |
| 后端服务之间调用 / 中转 | **跨服务 HTTP 调用** | 明确是进程间 HTTP不是本地 Logic/Service |
| 通过 slot/sdk 中转 | **经 slot_sdk 调用** | `slot_sdk` = 客户端库;被调服务仍直接处理请求,库不做业务中转 |
| SDK / 封装 | **slot_sdk`slot/sdk`** | 与 composer 包名、仓库目录一致 |
| 各服务自己拼 URL | **在 slot_sdk 增加 `{Domain}Service` 方法** | 路径与 DTO 单点维护 |
| `app\service\WalletService` | **本地 WalletService** vs **slotsdk WalletService** | 防止与 SDK 类名混淆 |
核心定义(规则开篇 1 段):
> **slot_sdk** 是跨服务 HTTP 客户端库(`composer` 包 `slot/sdk`,命名空间 `slotsdk\`),用于**调用方服务**访问**被调服务**的 `innerapi/*` 或 `api/*` 接口。它不是独立部署的微服务。
---
## 拟新增文件
**路径:** [`/Users/ray/.cursor/rules/cross-service-sdk.mdc`](/Users/ray/.cursor/rules/cross-service-sdk.mdc)
**Frontmatter**
```yaml
---
description: 跨服务 HTTP 须经 slot_sdkslot/sdk调用禁止在业务服务内散落直连
alwaysApply: true
---
```
**正文结构(约 3545 行,中文为主):**
### 1. 适用范围
- 一个 Webman 服务需要 HTTP 访问另一个服务的 `innerapi` / `api` 时适用。
- **被调服务**自身实现 Controller/Logic/Model**不**为「被别人调」而引入 `slot/sdk`
- **调用方**若需调第三个服务,必须通过 `slot/sdk`(不在业务代码里手写 Guzzle/curl/拼 host+path
### 2. 标准调用方式
```php
use slotsdk\Config as SDKConfig;
use slotsdk\service\wallet\WalletClient;
$config = new SDKConfig([
'host' => ShareConfigService::get('walletApiHost'),
'headers' => ['server-name' => config('app.server_name')],
]);
$result = (new WalletClient($config))->service()->getStatistics($uids, $currency);
```
要点:
- Host 来自 center 下发的 `*ApiHost`(如 `walletApiHost``userApiHost`)。
- 请求头带 `server-name`,值为**当前调用方**服务名。
- 非零 `code``slotsdk\exception\ApiException` 抛出,调用方在 Logic/Gateway 层处理。
### 3. 新增 / 变更远程接口的流程
1. 在 [`slot_sdk/src/service/{domain}/`](file:///Users/ray/Documents/project/www/slot/slot_sdk/src/service/) 增加 `{Domain}Service` 方法、路径常量、必要时 `entity/*Entity`
2. 在调用方 Logic 或 `*GatewayService` 中调用Controller 保持薄。
3. **禁止**在 `slot_admin` / `slot_agent` 等多仓库重复写同一路径字符串。
### 4. 与 backend-layering 的衔接12 句)
- 跨服务访问在调用方落在 **Service 或 `*GatewayService`**Logic 编排用例;不把 HTTP 细节散落在 Controller。
- 与 [`backend-layering.mdc`](file:///Users/ray/.cursor/rules/backend-layering.mdc) 中「Service 可承载 sdk」一致本规则专门约束**跨服务边界**,不重复写分层表。
### 5. 命名与混淆规避
- SDK`slotsdk\service\{domain}\{Domain}Client``{Domain}Service``entity\{Name}Entity`
- 本地:`app\service\*`;若同名,用 `SDKConfig`、完整 namespace 或 import alias。
- 消费方封装重复调用:`UserReferralGatewayService` 这类 `*GatewayService` 模式。
---
## 与现有规则的关系
```mermaid
flowchart LR
subgraph userRules [用户级 .cursor/rules]
layering[backend-layering]
crossSdk[cross-service-sdk 新增]
docker[dev-environment]
phpdoc[php-doc]
end
layering -->|"单服务内分层"| Logic
crossSdk -->|"服务间 HTTP"| slot_sdk
slot_sdk --> innerapi[被调服务 innerapi/api]
```
- **不修改** [`backend-layering.mdc`](file:///Users/ray/.cursor/rules/backend-layering.mdc):避免一条规则过长;仅在 `cross-service-sdk` 末尾用交叉引用衔接。
- **不修改** [`dev-environment.mdc`](file:///Users/ray/.cursor/rules/dev-environment.mdc) / [`php-doc.mdc`](file:///Users/ray/.cursor/rules/php-doc.mdc)。
---
## 实施步骤(确认计划后执行)
1. 创建 [`cross-service-sdk.mdc`](/Users/ray/.cursor/rules/cross-service-sdk.mdc),填入上述 frontmatter 与正文。
2. 通读四条 `alwaysApply` 规则,确认无矛盾表述(尤其 Service 层与 Gateway 分工)。
3. (可选)在 [`slot_sdk/readme.md`](file:///Users/ray/Documents/project/www/slot/slot_sdk/readme.md) 补 510 行架构说明并链到 Cursor 规则 — **仅当你希望仓库内也有文档镜像**;非本次必需。
---
## 验收标准
- 新开 Cursor 会话、编辑任意 slot PHP 文件时Agent 应自动带上「跨服务须经 slot_sdk、新 API 先改 slot_sdk」约束。
- 术语统一使用:**跨服务 HTTP**、**调用方 / 被调方**、**slot_sdk**,避免「中转」「服务间随便 HTTP」等模糊说法。
- 规则正文不含 legacy 迁移条款(按你的选择)。

View File

@@ -0,0 +1,223 @@
---
name: 首充定格资金修复
overview: 本次仅改 slot_wallet 与 slot_console。wallet 删除 Recharge bus、首充发 free_credit_initconsole 消费该事件完成定格。pay 等其它服务不在本次范围。
todos:
- id: wallet-remove-recharge-bus
content: 删除 WalletLogic recharge/rechargeSign 中 sendConsoleBus('Recharge')
status: completed
- id: wallet-send-free-credit-init
content: recharge + rechargeSign 首充时发送 free_credit_initinc/改账前采 balance_before_qf
status: completed
- id: wallet-remove-create-wager-first-recharge
content: CreateWagerTask 删除 version1/version2 首充特殊打码分支,首充走普通充值打码
status: completed
- id: console-event-bus-handler
content: EventBus case free_credit_init + FreeCreditInitEvent
status: completed
- id: console-free-credit-init-logic
content: handleFreeCreditInitRechargeEvent 移除首充定格,保留档位推进
status: completed
- id: console-safe-freeze-order
content: freezeFirstRecharge 先 RPC 后落库;上限与幂等
status: completed
- id: mq-reliability
content: free_credit_init 失败 nack/requeue仅 console EventBus
status: completed
- id: tests-and-repair
content: wallet/console 单测与集成测FreeCreditsFreezeDev 补偿console
status: completed
isProject: false
---
# 首充定格资金操作修复方案(修订 v4
## 变更范围(硬约束)
**本次仅编辑以下仓库/服务,不修改任何其它服务(含 slot_pay、slot_lib 等):**
| 在范围内 | 不在范围内 |
|----------|------------|
| `slot_wallet` | `slot_pay` |
| `slot_console` | `slot_lib``slot_agent`、… |
> `Recharge` 总线消息假定由 **pay 或其它既有链路** 发送;本次不从 wallet 重复发送,也**不改 pay** 去补发。若线上 pay 未发 `Recharge`,统计/档位问题需另开 pay 任务,**不纳入本 PR**。
---
## 设计原则
> **情愿用户定格失败,也不能让系统亏钱。**
| 服务(本次) | 职责 |
|--------------|------|
| **slot_wallet** | 入账;首充发 **`free_credit_init`****删除** `Recharge` bus**移除** `CreateWagerTask` 旧首充打码拆分 |
| **slot_console** | 消费 `free_credit_init` → 定格扣款 + 活动落库;`RechargeEvent` **不再**做首充定格 |
---
## 目标架构
```mermaid
sequenceDiagram
participant Ext as 外部_pay等_本次不改
participant Wallet as slot_wallet
participant MQ as console_bus
participant Console as slot_console
Ext->>Wallet: recharge / rechargeSign
Wallet->>Wallet: 采 balance_before_qf入账
Wallet->>MQ: free_credit_init
Ext->>MQ: Recharge本次不实现
MQ->>Console: FreeCreditInitEvent
Console->>Wallet: freeCreditsFreeze RPC
Console->>Console: player/package 落库
MQ->>Console: RechargeEvent既有逻辑无定格
```
---
## 实现步骤
### 1. slot_wallet
#### 1.1 删除 `Recharge` bus
从 [`WalletLogic::recharge()`](file:///Users/ray/Documents/project/www/slot/slot_wallet/app/api/logic/WalletLogic.php)、[`rechargeSign()`](file:///Users/ray/Documents/project/www/slot/slot_wallet/app/api/logic/WalletLogic.php) 移除:
```php
$this->sendConsoleBus('Recharge', $this->requestDTO->recharge);
```
保留 `sendConsoleBus('reward', ...)` 及其它非 Recharge 类型(本次不动)。
#### 1.2 `maybeSendFreeCreditInit()` + 扩展 `sendConsoleBus`
- 改账/ `inc()` **前**`balance_before_qf``is_first_recharge``total_deposit == 0`,在 `statModel->inc` 之前判断)。
- 改账成功后:`is_first_recharge && balance_before_qf > 0` 时发送:
```php
$this->sendConsoleBus('free_credit_init', 0, [
'balance_before_qf' => $balanceBeforeQf,
'recharge_amount' => $this->requestDTO->recharge,
]);
```
- [`sendConsoleBus()`](file:///Users/ray/Documents/project/www/slot/slot_wallet/app/api/logic/WalletLogic.php) 增加可选参数 `array $extraData = []`
#### 1.3 `recharge()` 与 `rechargeSign()` 均接入
签到购买 [`rechargeSign()`](file:///Users/ray/Documents/project/www/slot/slot_wallet/app/api/logic/WalletLogic.php) 与普通 [`recharge()`](file:///Users/ray/Documents/project/www/slot/slot_wallet/app/api/logic/WalletLogic.php) 使用同一套 `maybeSendFreeCreditInit()` 逻辑。
#### 1.4 移除 `CreateWagerTask` 旧首充打码逻辑(已废弃)
[`app/command/CreateWagerTask.php`](file:///Users/ray/Documents/project/www/slot/slot_wallet/app/command/CreateWagerTask.php) 在 **Free Credits 上线前** 于首充时本地拆分余额打码与现「console 定格 + 分档释放」重复且易冲突,**本次删除**。
**旧逻辑位置**(条件均为 `RechargeExchangeService::total` 累计充值等于本笔 `recharge_amount`,即首充):
| 方法 | 行号(约) | 行为 |
|------|-----------|------|
| `version1()` | L87140 | `SOURCE_TYPE_FIRST_RECHARGE` 任务 + `SOURCE_TYPE_FREE` 免打码任务 + `SOURCE_TYPE_FIRST_LEFT`「首充剩余」打码 |
| `version2()` | L186244 | 首充充值/赠送打码 + `SOURCE_TYPE_FIRST_LEFT``first_recharge_left` 系数) |
**与新方案关系**
- 充值前免费余额 → 由 console `free_credit_init``freeCreditsFreeze` 扣出活动池(不再在 wallet 侧拆 `FREE` / `FIRST_LEFT` 任务)。
- 免打码第一档 / 后续释放 → 由 console `FreeCreditsLogic` + `freeCreditsClaim` 创建 Y1`WalletLogic::freeCreditsClaim``createTask`)。
- 首充**本笔充值金额**的打码 → 与其它充值相同,走 `elseif ($dto->required_wager > 0)` 通用分支即可。
**改动要点**
1. 删除 `version1` / `version2` 中整段 `if ($entity->recharge > 0 && $entity->recharge == $dto->recharge_amount) { ... }`
2. 首充与普通充值统一落入后续 `elseif ($dto->required_wager > 0)``version1` L142+、`version2` L246+)。
3. **保留**其中对 `SOURCE_TYPE_BUY_SIGN`(购买签到解锁额度为 0的处理——该逻辑在 `elseif` 分支内已有,无需首充专用块。
4. 删除后确认无引用孤立的 `SOURCE_TYPE_FIRST_RECHARGE` / `SOURCE_TYPE_FIRST_LEFT` 首充专用路径(常量可保留供历史任务读)。
---
### 2. slot_console
#### 2.1 EventBus 注册 `free_credit_init`
[`EventBus::deal()`](file:///Users/ray/Documents/project/www/slot/slot_console/app/command/EventBus.php) 增加显式分支(类名不能走 default 动态加载):
```php
case 'free_credit_init':
(new FreeCreditInitEvent())->handle($busEntity);
break;
```
新建 [`app/command/event/FreeCreditInitEvent.php`](file:///Users/ray/Documents/project/www/slot/slot_console/app/command/event/FreeCreditInitEvent.php)。
#### 2.2 `FreeCreditsLogic::handleFreeCreditInit`
- 入参:`uid``balance_before_qf``wallet_amount``orderId`(来自 bus `data`)。
- `frozenAmount = max(balance_before_qf, 0)`**不以**充值后再读余额反推为主路径。
- 活动未开启 / 已定格 → 幂等 return。
- 调用调整后的 `freezeFirstRecharge()`
#### 2.3 调整 `freezeFirstRecharge`(先扣款、后落库)
[`freezeFirstRecharge()`](file:///Users/ray/Documents/project/www/slot/slot_console/app/api/logic/FreeCreditsLogic.php)
1. 幂等:已有 `free_credits_freeze:{orderId}` 流水则跳过 RPC。
2. `frozenAmount = min(事件金额, RPC 前当前可扣余额)`≤0 不扣。
3. **先** `freeCreditsFreeze` RPC**后** `Db::transaction` 写 player/packages。
4. RPC 失败 → 不落库,**抛异常**。
#### 2.4 `RechargeEvent` 去掉首充定格
[`RechargeEvent::handle()`](file:///Users/ray/Documents/project/www/slot/slot_console/app/command/event/RechargeEvent.php) **删除** L73-82 对 `handleRecharge` 的调用(首充定格改由 `free_credit_init` 触发)。
保留并可继续调用 **仅档位推进** 的逻辑,例如:
- 新增 `FreeCreditsLogic::advanceAfterRecharge($uid, $walletAmount)`,或
- `handleRecharge` 内去掉首充 `freezeFirstRecharge` 分支,仅保留 `advanceByRecharge`(供既有 `Recharge` 消息使用)。
统计、黑名单、代理首充等 **RechargeEvent 现有代码不动**(本次范围外行为保持)。
#### 2.5 MQ 可靠性(仅 console
- `FreeCreditInitEvent` / `free_credit_init`:异常上抛;`EventBus` 对该 type 失败时 **nack/requeue**(需对齐现有 consumer
- `Recharge` 路径统计块仍可独立 try/catch本次不改 pay 发消息前提)。
---
### 3. 测试(仅 wallet + console
| 用例 | 位置 |
|------|------|
| wallet 删除 Recharge bus | slot_wallet |
| wallet 首充发 `free_credit_init`(含 rechargeSign | slot_wallet |
| 首充不再走 CreateWagerTask 特殊分支 | slot_wallet CreateWagerTask |
| `FreeCreditInitEvent` 定格成功 | slot_console 集成测 |
| RPC 失败不落库 / 先扣后落库 / 幂等 | slot_console |
| `RechargeEvent` 不再触发定格 | 调整 [`FreeCreditsHandleRechargeTest`](file:///Users/ray/Documents/project/www/slot/slot_console/tests/Unit/FreeCreditsHandleRechargeTest.php) 等 |
**不新增** pay 侧联调用例。
---
## 关键改动文件(仅此两份)
**slot_wallet**
- [`app/api/logic/WalletLogic.php`](file:///Users/ray/Documents/project/www/slot/slot_wallet/app/api/logic/WalletLogic.php)
- [`app/command/CreateWagerTask.php`](file:///Users/ray/Documents/project/www/slot/slot_wallet/app/command/CreateWagerTask.php)
**slot_console**
- [`app/command/EventBus.php`](file:///Users/ray/Documents/project/www/slot/slot_console/app/command/EventBus.php)
- `app/command/event/FreeCreditInitEvent.php`(新建)
- [`app/api/logic/FreeCreditsLogic.php`](file:///Users/ray/Documents/project/www/slot/slot_console/app/api/logic/FreeCreditsLogic.php)
- [`app/command/event/RechargeEvent.php`](file:///Users/ray/Documents/project/www/slot/slot_console/app/command/event/RechargeEvent.php)
- 相关 testsconsole 仓内)
---
## 验收标准(本 PR
- **wallet**`recharge` / `rechargeSign` 不再发送 `type=Recharge`;首充且 inc 前有免费余额时发送 `free_credit_init``balance_before_qf` 正确。
- **wallet**:首充不再触发 `CreateWagerTask``FIRST_RECHARGE` / `FREE` / `FIRST_LEFT` 拆分,仅按本笔充值/赠送金额走通用打码任务。
- **console**:收到 `free_credit_init` 后完成定格扣款与落库;扣款 ≤ 事件金额且 ≤ 可扣余额;幂等。
- **console**`RechargeEvent` 不再执行首充定格;已定格用户经 `Recharge` 仍可 `advanceByRecharge`(依赖外部 pay 发消息,**本 PR 不验证 pay**)。
- **范围**`git diff` 仅涉及 `slot_wallet``slot_console` 路径。

View File

@@ -0,0 +1,106 @@
---
name: 首充第一档金额下限
overview: 首充定格时,第一档金额应至少为活动配置 `ext_config.first_cash_amount`(千分位),不能仅按 `balanceBeforeQf``min` 压到低于配置;同步调整 `handleFreeCreditInit` 的定格基数与 `calcFirstCashAmount` 公式,并更新单测。
todos:
- id: fix-calc-first-cash
content: 修改 FreeCreditsLogic::calcFirstCashAmount 为至少 ext_config.first_cash_amount
status: completed
- id: update-unit-tests
content: 更新 FreeCreditsLogicAmountTest 与 handleFreeCreditInit 相关单测
status: completed
- id: verify-integration
content: 按需跑 FreeCreditsFirstRechargeFreezeTest 验证落库第一档金额
status: completed
isProject: false
---
# 首充定格:第一档金额不低于配置
## 问题
[`handleFreeCreditInit`](slot_console/app/api/logic/FreeCreditsLogic.php) 当前:
```php
$frozenAmount = max($balanceBeforeQf, 0);
```
定格总额仍用入账前余额(正确),但第一档金额在 [`freezeFirstRecharge`](slot_console/app/api/logic/FreeCreditsLogic.php) 里走:
```php
$firstCashAmount = self::calcFirstCashAmount($frozenAmount, $this->configAmount($config, 'first_cash_amount', ...));
// calcFirstCashAmount = min(frozen, configured)
```
**定格额 &lt; 配置免打码额** 时,第一档会变成定格额本身(例如池内 $6、配置 $20 → 第一档 $6与「第一档最少给 `ext_config.first_cash_amount`」不符。
单测 [`FreeCreditsLogicAmountTest`](slot_console/tests/Unit/FreeCreditsLogicAmountTest.php) 里 `'定格小于配置' => [30, 20, 20]` 已按「至少配置值」写期望,与实现 **不一致**`min(30,20)=20` 碰巧相等,但 `frozen=15, config=20` 会得到 15
## 目标行为
| 字段 | 规则 |
|------|------|
| **定格总额** `frozen_amount_qf` | 仍为入账前免费余额 `balance_before_qf`(需求 §5.3**不**强行抬到配置 |
| **第一档金额** `first_cash_amount_qf` / `package_no=1.amount_qf` | `max(min(定格额, 配置), 配置)` → 等价于 **至少为配置值**:定格 ≥ 配置时取配置上限;定格 &lt; 配置时仍记 **配置值**(运营承诺的档位面额) |
```mermaid
flowchart LR
event[free_credit_init] --> init[handleFreeCreditInit]
init --> freeze[freezeFirstRecharge]
freeze --> frozen["frozen = balanceBefore"]
freeze --> first["firstCash = max(min(frozen, cfg), cfg)"]
```
**边界说明**:若定格额实际小于配置,玩家可提现金额仍受池内 `package.amount_qf` 与钱包冻结额约束;本次按你的要求把 **落库第一档金额** 抬到配置下限,与需求文档 §5.6「定格 &lt; $20 → 第一档 = 定格额」存在冲突——以你本次口径为准;若需「可提现 ≤ 定格」再单独加提现校验。
## 实现(仅 slot_console
### 1. 修改 `calcFirstCashAmount`
文件:[`FreeCreditsLogic.php`](slot_console/app/api/logic/FreeCreditsLogic.php)
```php
public static function calcFirstCashAmount(int $frozenAmount, int $configuredFirstCash): int
{
return max(min($frozenAmount, $configuredFirstCash), $configuredFirstCash);
}
```
- 注释改为:第一档面额不低于配置,且不超过定格总额与配置上限。
- 逻辑上等价于 `return $configuredFirstCash`(当 `configuredFirstCash > 0`);保留 `min(frozen, …)` 形式便于日后若配置为 0 时回退。
### 2. `handleFreeCreditInit` 显式读配置(可选但建议)
在同文件 `handleFreeCreditInit` 内,在调用 `freezeFirstRecharge` 前读取一次配置(便于日志/后续扩展;**定格额仍用 `balanceBeforeQf`**
```php
$configuredFirstCash = $this->configAmount($config, 'first_cash_amount', self::DEFAULT_FIRST_CASH);
$frozenAmount = max($balanceBeforeQf, 0);
// 不把 frozenAmount 改成 max(balanceBefore, configuredFirstCash),避免改变定格总额语义
```
若你希望 **尝试多冻** 到配置下限,可另议;当前计划 **只改第一档金额公式**,不改定格总额。
### 3. 单测
| 文件 | 改动 |
|------|------|
| [`FreeCreditsLogicAmountTest.php`](slot_console/tests/Unit/FreeCreditsLogicAmountTest.php) | 修正/补充:`[15, 20, 20]`(定格小于配置 → 第一档仍为 20保留 `[100, 20, 20]` |
| [`FreeCreditsHandleFreeCreditInitTest.php`](slot_console/tests/Unit/FreeCreditsHandleFreeCreditInitTest.php) | 增加用例:`balanceBefore=15000``first_cash_amount_qf=20000`Harness 落库后 `first_cash_amount_qf` / 第一档 `amount_qf` 为 20000若 Harness 走完整 `freezeFirstRecharge` 需开 DB 或扩展 Harness 断言) |
| 集成测 [`FreeCreditsFirstRechargeFreezeTest`](slot_console/tests/Integration/FreeCreditsFirstRechargeFreezeTest.php) | 当 DB 活动配置 `first_cash_amount_qf=20000``balanceBefore < 20000` 时断言 `player.first_cash_amount_qf === 20000` |
运行Docker
```bash
docker exec -w /app/www/slot/slot_console php82 ./vendor/bin/phpunit \
--filter 'FreeCreditsLogicAmountTest|FreeCreditsHandleFreeCreditInitTest'
```
## 不改动的部分
- **wallet** `maybeSendFreeCreditInit`:仍 `balance_before_qf > 0` 即发事件。
- **定格扣款金额**:仍 `freeCreditsFreeze(frozenAmount)``frozenAmount``balanceBefore` 为准(经 `freezeFirstRecharge``min(…, wallet.balance)` 封顶)。
- **解锁第一档**:仍用 `recharge_unlock_amount` 配置,与本次无关。
## 风险
- 定格 &lt; 配置时,`first_cash_amount_qf` &gt; 实际可冻余额C 端可能展示 $20 但池内不足;提现/保留时需依赖现有 `package.amount_qf` 与钱包校验,必要时后续在 `applyFirstCashoutWithdraw` 增加 `amount_qf <= frozen` 断言。

Submodule plugins/cache/cursor-public/figma/a742f0a700a7772ff5ed85f7c9fc1dad5afa9fcc added at a742f0a700

View File

@@ -0,0 +1,6 @@
---
pid: 32065
cwd: /Users/ray
---
~  base 10:27:38

View File

@@ -0,0 +1,6 @@
---
pid: 32405
cwd: /Users/ray
---
~  base 10:27:48

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,12 @@
The cursor-app-control MCP allows you to control the Cursor application itself. Use it to:
- Move the current agent to a new root workspace directory (move_agent_to_root) — use this after creating a worktree or whenever the conversation should continue from a different workspace root
- Move the current agent to a verbatim clone of the current workspace (move_agent_to_cloned_root) — use this ONLY when the target is a sibling clone already on the agent's branch (for example from cursorfs-clone); skips the migration git fetch / ff-merge that the generic move performs
- Create a new project at a given path (create_project) — creates the directory if missing and initializes a git repository. Use this to bootstrap a new project before moving to it with move_agent_to_root
- Open a resource by URI in Glass (open_resource) — opens files in the right-hand editor panel (workspace paths or anything under ~/.cursor), focuses terminals, opens output channels, opens web links according to the Glass browser setting, or delegates other schemes to the default workbench opener
- Manage personal rules in Cursor Settings (manage_personal_rules) — list, add, update, or delete user rules after asking what the user wants Cursor to remember
Use move_agent_to_root when you want the current conversation to adopt a different root workspace directory. This updates the visible work surface and the default cwd for new terminals.
Use move_agent_to_cloned_root when the target is a freshly-made sibling clone of the current workspace.
Use create_project when you need to create a brand new project directory with an initialized git repository.
Use open_resource when you need to reveal a file, terminal, output channel, or URL for the current agent.
Use manage_personal_rules for onboarding and preference-learning workflows. Always list first to avoid duplicate memories, and only write rules the user has agreed should be remembered.

View File

@@ -0,0 +1,4 @@
{
"serverIdentifier": "cursor-app-control",
"serverName": "cursor-app-control"
}

View File

@@ -0,0 +1,18 @@
{
"name": "create_project",
"description": "Create a new project at the given path. Creates the directory if it does not exist and initializes a git repository. Use this to bootstrap a new project before moving the agent to it with move_agent_to_root.",
"arguments": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"path": {
"description": "Absolute path where the new project should be created (e.g. \"/Users/name/projects/my-new-app\")",
"type": "string"
}
},
"required": [
"path"
],
"additionalProperties": false
}
}

View File

@@ -0,0 +1,41 @@
{
"name": "move_agent_to_cloned_root",
"description": "Move the current agent to a root workspace directory that is a verbatim clone of the current workspace (for example produced by `cursorfs-clone`) and is already on the agent's recorded branch. Skips the migration-path `git fetch` and ff-merge that `move_agent_to_root` performs. Use ONLY when you already know the target is a sibling clone of the current workspace on the same branch; otherwise use `move_agent_to_root`.",
"arguments": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"rootPath": {
"description": "Absolute path to the directory that should become the agent root workspace (e.g. \"/Users/name/projects/my-app\")",
"type": "string",
"minLength": 1
}
},
"required": [
"rootPath"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"rootPaths": {
"description": "Array of absolute paths used to create/switch to a multi-root workspace.",
"minItems": 1,
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"rootPaths"
],
"additionalProperties": false
}
]
}
}

View File

@@ -0,0 +1,41 @@
{
"name": "move_agent_to_root",
"description": "Move the current agent to a new root workspace directory. Use this after creating a worktree or whenever the conversation should continue from a different workspace root.",
"arguments": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"anyOf": [
{
"type": "object",
"properties": {
"rootPath": {
"description": "Absolute path to the directory that should become the agent root workspace (e.g. \"/Users/name/projects/my-app\")",
"type": "string",
"minLength": 1
}
},
"required": [
"rootPath"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"rootPaths": {
"description": "Array of absolute paths used to create/switch to a multi-root workspace.",
"minItems": 1,
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"rootPaths"
],
"additionalProperties": false
}
]
}
}

View File

@@ -0,0 +1,4 @@
{
"serverIdentifier": "plugin-figma-figma",
"serverName": "plugin-figma-figma"
}

View File

@@ -0,0 +1 @@
The MCP server needs authentication. You must call the `mcp_auth` tool for server "plugin-figma-figma" through your MCP tool-calling interface using an empty arguments object `{}` soon so the user can access all of the tools this MCP server offers.

View File

@@ -0,0 +1,9 @@
{
"name": "mcp_auth",
"description": "Authenticate this MCP server so its tools can be used. Call this tool through your MCP tool-calling interface when the server needs authentication.",
"arguments": {
"type": "object",
"properties": {},
"additionalProperties": false
}
}

View File

@@ -0,0 +1,55 @@
---
pid: 2385
cwd: "/private/tmp/hgapi-probe"
command: "cd /Users/ray/Documents/project/pop/hgapi-scrape && python3 scrape_game.py vswaysbufking 2>&1 | tee scrape.log | head -80"
started_at: 2026-05-20T07:46:43.886Z
running_for_ms: 1395516
---
[*] Symbol : vswaysbufking
[*] Base URL : https://hgppdemogamesfree.hgapi.com/gs2c/common/v1/games-html5/games/vs/vswaysbufking/desktop
[*] Output dir : /Users/ray/Documents/project/pop/hgapi-scrape/vswaysbufking
+ bootstrap.js (101920 bytes)
+ build.js (3206753 bytes)
+ style.css (19631 bytes)
+ customizations.info (0 bytes)
+ packages/zh_desktop.json (274146 bytes)
+ packages/zh_GUI_desktop.json (1256731 bytes)
! skip packages/en_desktop.json: GET failed after 3 attempts: https://hgppdemogamesfree.hgapi.com/gs2c/common/v1/games-html5/games/vs/vswaysbufking/desktop/packages/en_desktop.json (HTTP Error 404: Not Found)
! skip packages/en_GUI_desktop.json: GET failed after 3 attempts: https://hgppdemogamesfree.hgapi.com/gs2c/common/v1/games-html5/games/vs/vswaysbufking/desktop/packages/en_GUI_desktop.json (HTTP Error 404: Not Found)
+ client/resources.json (133798 bytes)
+ client/game.json (28393 bytes)
[*] game/GUI* -> 7 chunks
[*] game/GUI_resources* -> 2 chunks
[*] game/game* -> 8 chunks
[*] game/main_resources* -> 23 chunks
[*] game/other_resources* -> 1 chunks
game/GUI: chunks=7 merged=5985211B inline_decoded=0 external_refs=65
game/GUI_resources: chunks=2 merged=963833B inline_decoded=18 external_refs=11
game/game: chunks=8 merged=5729809B inline_decoded=0 external_refs=238
game/main_resources: chunks=23 merged=23471664B inline_decoded=55 external_refs=27
game/other_resources: chunks=1 merged=327406B inline_decoded=13 external_refs=3
client/resources.json: inline_decoded=6 external_refs=1
client/game.json: inline_decoded=0 external_refs=7
[*] Total unique external resource ids: 336
progress: 50/336 ok=0 miss=50
progress: 100/336 ok=0 miss=100
progress: 150/336 ok=0 miss=150
progress: 200/336 ok=0 miss=200
progress: 250/336 ok=0 miss=250
progress: 300/336 ok=6 miss=294
progress: 336/336 ok=6 miss=330
[*] Report: /Users/ray/Documents/project/pop/hgapi-scrape/vswaysbufking/_scrape_report.json
[*] Done.
Exception ignored while finalizing file <http.client.HTTPResponse object at 0x106f04f40>:
Traceback (most recent call last):
File "/opt/homebrew/Cellar/python@3.14/3.14.0_1/Frameworks/Python.framework/Versions/3.14/lib/python3.14/http/client.py", line 432, in close
super().close() # set "closed" flag
File "/opt/homebrew/Cellar/python@3.14/3.14.0_1/Frameworks/Python.framework/Versions/3.14/lib/python3.14/http/client.py", line 445, in flush
self.fp.flush()
ValueError: I/O operation on closed file.
---
exit_code: 0
elapsed_ms: 1399432
ended_at: 2026-05-20T08:10:03.318Z
---

View File

@@ -0,0 +1,14 @@
---
pid: 21016
cwd: "/Users/ray/Documents/project/pop/hgapi-scrape"
command: "cd /Users/ray/Documents/project/pop/hgapi-scrape && \\\nrm -rf vswaysbufking scrape.log && \\\npython3 -u scrape_game.py vswaysbufking > scrape.log 2>&1 &\necho \"started pid=$!\""
started_at: 2026-05-20T08:08:13.189Z
running_for_ms: 2003
---
started pid=21069
---
exit_code: 0
elapsed_ms: 6543
ended_at: 2026-05-20T08:08:19.732Z
---

View File

@@ -0,0 +1,14 @@
---
pid: 15814
cwd: "/Users/ray/Documents/project/pop/hgapi-scrape"
command: "cd /Users/ray/Documents/project/pop/hgapi-scrape && \\\nrm -rf vswaysbufking scrape.log && \\\npython3 -u scrape_game.py vswaysbufking > scrape.log 2>&1 &\necho \"started pid=$!\""
started_at: 2026-05-20T08:03:55.186Z
running_for_ms: 3817
---
started pid=15841
---
exit_code: 0
elapsed_ms: 7427
ended_at: 2026-05-20T08:04:02.613Z
---

View File

@@ -0,0 +1,14 @@
---
pid: 26608
cwd: "/Users/ray/Documents/project/pop/hgapi-scrape/vswaysbufking"
command: "cd /Users/ray/Documents/project/pop/hgapi-scrape && \\\nrm -rf vswaysbufking scrape.log && \\\npython3 -u scrape_game.py vswaysbufking > scrape.log 2>&1 &\necho \"started pid=$!\""
started_at: 2026-05-20T08:14:45.353Z
running_for_ms: 2819
---
started pid=26635
---
exit_code: 0
elapsed_ms: 7319
ended_at: 2026-05-20T08:14:52.672Z
---

View File

@@ -0,0 +1,14 @@
---
pid: 29106
cwd: "/Users/ray/Documents/project/pop/hgapi-scrape"
command: "export PATH=\"/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/homebrew/bin:$PATH\"\ncd /Users/ray/Documents/project/pop/hgapi-scrape && \\\npython3 -u scrape_game.py vswaysbufking > scrape.log 2>&1 &\necho \"started pid=$!\""
started_at: 2026-05-20T08:17:06.381Z
running_for_ms: 2014
---
started pid=29122
---
exit_code: 0
elapsed_ms: 6442
ended_at: 2026-05-20T08:17:12.823Z
---

View File

@@ -0,0 +1,2 @@
{"role":"user","message":{"content":[{"type":"text","text":"<timestamp>Wednesday, Apr 29, 2026, 10:07 AM (UTC+8)</timestamp>\n<user_query>\n我把规范写到那个文件里面你会自动执行\n</user_query>"}]}}
{"role":"assistant","message":{"content":[{"type":"text","text":"不会对任意文件“自动执行”。\n\n我通常只会在这两种情况下按文件里的规范做事\n1. 你在当前对话里明确让我参考它,比如“先读 `readme.md`,按里面规范执行”。\n2. 这个规范已经被配置成持续生效的规则,比如 Cursor rule、skill或者项目里明确约定会被优先读取的规范文件。\n\n所以如果你只是把要求写进 `readme.md`,我**不一定会自动去读并执行**;最稳妥的方式还是直接说一句:\n`按 readme.md 里的规范做`\n或者\n`先读 readme.md再继续`\n\n如果你想要“以后每次都默认按这个规范来”我可以帮你把它整理成 Cursor 的持久规则。"}]}}

View File

@@ -0,0 +1,4 @@
{
"serverIdentifier": "plugin-figma-figma",
"serverName": "plugin-figma-figma"
}

View File

@@ -0,0 +1 @@
The MCP server needs authentication. You must call the `mcp_auth` tool for server "plugin-figma-figma" through your MCP tool-calling interface using an empty arguments object `{}` soon so the user can access all of the tools this MCP server offers.

View File

@@ -0,0 +1,13 @@
{
"name": "mcp_auth",
"description": "Authenticate this MCP server so its tools can be used. Call this tool through your MCP tool-calling interface when the server needs authentication.",
"arguments": {
"type": "object",
"properties": {},
"additionalProperties": false
},
"plugin": "figma",
"marketplace": "cursor-public",
"pluginId": "657",
"marketplaceId": "34"
}

View File

@@ -0,0 +1,6 @@
---
pid: 15504
cwd: /Users/ray/Documents/project/www/ray/slot-activity
---
~/Doc/p/w/r/slot-activity ray/signin  base 16:27:12

View File

@@ -0,0 +1,725 @@
Vendors A-Z (G)
# Vendor Name begins with 'g'
| 1 | [G Gaming](https://www.igamingsuppliers.com/vendor/g-gaming/) Gibraltar, Gibraltar G Gaming is an iGaming company which develops slot games, scratchcards, video lotteries and more for the online real money games market. Categories: Other, Mobile Gaming, Lottery Software, Other, Other |
| --- | --- |
| 2 | [G Lighting](https://www.casinovendors.com/vendor/g-lighting/) St. Louis, Missouri Category: Systems |
| 3 | [G&D Consulting](https://www.igamingsuppliers.com/vendor/g-d-consulting/) Montes de Oca, San José, Costa Rica We are a leading law firm in Costa Rica with strong influence in Latin America. Our expertise expands especially in incorporation services, licensing and compliance for industries such as online gaming, cryptocurrency projects, DeFi, Web3, family offices, asset management, a... Category: Licensing and Regulation |
| 4 | [G&D Currency Technology](https://www.casinovendors.com/vendor/g-d-currency-technology/) Sterling, Virginia Billions of people place their trust in the value and authenticity of their banknotes. WIth our unique skills, we create innovative and secure foundations for monetary transactions. From forgery-proof currency design to the highly efficient processing of banknotes, all the w... Category: Currency Management Services |
| 5 | [G&G Closed Circuit Events LLC](https://www.casinovendors.com/vendor/g-g-closed-circuit-events-llc/) Campbell, California G&G Closed Circuit Events is the leader in providing boxing and Bellator events to commercial establishments like bars, restaurants, nightclubs and casinos. We have been serving the entire United States with quality Pay-per-view programming since 2009 through partnerships wi... Category: Pay-per-view |
| 6 | [G&K Services](https://www.casinovendors.com/vendor/g-k-services/) Hopkins, Minnesota Category: Supplies, Uniforms |
| 7 | [G.E.T. Enterprises](https://www.casinovendors.com/vendor/g-e-t-enterprises/) Houston, Texas Manufacturer of melamine dinnerware, plastic drinkware, hardwood and chrome tray stands for the casino food and beverage industry. Private labeling and custom logos are available upon request. Category: Equipment, Dinnerware |
| 8 | [G.H.I. Solutions, Inc. - Gaming Hospitality Information Solutions](https://www.casinovendors.com/vendor/g-h-i-solutions-inc-gaming-hospitality-information-solutions/) Las Vegas, Nevada G.H.I. Solutions is a company where our passion for technology and business process improvement translates into a more profitable business for you. We are a team of leading experts in the gaming and hospitality industries, and with decades of combined experience, we know ... Categories: Consulting, Computer Systems, Database Marketing, Consulting, Consulting |
| 9 | [G.Partners](https://www.igamingaffiliateprograms.com/affiliate-program/g-partners/) Category: Affiliate Programs |
| 10 | [G2 Database Marketing](https://www.casinovendors.com/vendor/g2-database-marketing/) Abita Springs, Louisiana With nearly 25 years in the casino industry and over 30 years of marketing management and analysis experience, we have the in-depth, hands on experience and record for success that will help you meet your bottom line objectives. Category: Database Marketing, Consulting |
| 11 | [Gable](https://www.casinovendors.com/vendor/gable/) Baltimore, Maryland As a leader in a new era of visual communications, Gable stands at the intersection of technology and craftsmanship, integrating digital displays, audiovisual, signage, and lighting into the most complex environments. We have the people, technology and experience to develop,... Category: Large Screen |
| 12 | [Gabsys](https://www.igamingsuppliers.com/vendor/gabsys/) Gabsys is a company that provides betting, gambling products and solutions along with industry best practice with new approaches tailored to meet your business needs. Categories: Sportsbook Software, Platform Providers, Gambling Operations |
| 13 | [Gaelco](https://www.casinovendors.com/vendor/gaelco/) Barcelona, Spain Gaelco is one of the most important video game developers and publishers in the world. Our recognised professional experience allows us to produce ever more entertaining and exciting games, providing players with unforgettable thrills and emotion. The secret of our success ... Category: Other |
| 14 | [Gafcon, Inc.](https://www.casinovendors.com/vendor/gafcon-inc/) San Diego, California Gafcon, Inc. offers a full range of Gaming and Hospitality Preconstruction and Construction related Professional Services, including Program Management, Construction Management, Reconstruction Services and Legal Support. Category: Management Services, General Contracting |
| 15 | [Gaff Tapes](https://www.casinovendors.com/vendor/gaff-tapes/) San Antonio, Texas We sell Adhesive products such as gaffers tape and spike tape used in Casino concerts and exhibitions. For over 20 years, Gaff Tapes has been catering to Las Vegas casinos such as the LVH, Caesars, and many more. We sell our products for 40% less than our competitors, no sal... Category: Other |
| 16 | [GAFFG - Gaming Affiliates Guide](https://www.igamingsuppliers.com/vendor/gaffg-gaming-affiliates-guide/) Gaffg.com is a portal for webmasters and affiliates in the online gambling industry. Of course any content that is relevant for online marketing will be present and any useful information about the online gaming business as a whole. This site aims to be the market place for ... Category: Other |
| 17 | [Gage Corporation, International](https://www.casinovendors.com/vendor/gage-corporation-international/) Sparta, Wisconsin The Gage Corporation, International serves architects and designers around the globe with distinctive metal architectural products. Gage is recognized worldwide as a premier supplier of specialty metal architectural products. Category: Metal |
| 18 | [Gaging.com](https://www.casinovendors.com/vendor/gaging-com/) Las Vegas, Nevada We are based in Las Vegas and specialize in product knowledge and after-sales service and training. We carry a wide range of industrial products and have over twenty-five years of measurement experience. Download our free Dice Micrometer instructions for Fowler & VIS micro... Category: Tools |
| 19 | [Galantz SRL](https://www.casinovendors.com/vendor/galantz-srl/) Buenos Aires, Capital federal, Argentina The Company is a very competitive provider of cash handling equipment with an excellent after sale service. Category: Counterfeit Detectors |
| 20 | [Galaxia Electronics Co., Ltd.](https://www.casinovendors.com/vendor/galaxia-electronics-co-ltd/) Seoul, South Korea Galaxia Electronics is the sister company of the Hyosung Group and we are the leading company of LED Display and LED Media Facade manufactuere in Korea. Category: LED Systems |
| 21 | [Galaxion LLC](https://www.casinovendors.com/vendor/galaxion-llc/) Odessa, Ukraine Galaxion is a Ukrainian company engaged in the field of gaming business: operation, sales, distributing, manufacturing and servicing of gaming equipment and components. Category: Amusement Equipment, Casino Software |
| 22 | [Galaxsys LLC](https://www.igamingsuppliers.com/vendor/galaxsys-llc/) Yerevan, Armenia Galaxsys offers a wide range of fast and skill games in the iGaming industry. Our game portfolio has been developed to allow our partners to increase their overall offering, improve both player acquisition and retention, and generate profitable growth. Category: Skill Games Software |
| 23 | [Galaxy 88 Ltd](https://www.casinovendors.com/vendor/galaxy-88-ltd/) London, United Kingdom Category: |
| 24 | [Galaxy Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/galaxy-affiliates/) London, England, United Kingdom Category: Affiliate Programs |
| 25 | [Galaxy Control Systems](https://www.casinovendors.com/vendor/galaxy-control-systems/) Walkesville, Maryland Category: Other, Other |
| 26 | [Galaxy Entertainment Group](https://www.casinovendors.com/vendor/galaxy-entertainment-group/) Central, Hong Kong Galaxy Entertainment Group (“GEG” or the “Group”) is one of the worlds leading resorts, hospitality and gaming companies. GEG is listed on the Hong Kong Stock Exchange and is a constituent of the Hang Seng Index. GEG is one of the three original concessionaires in Macau... Category: Other |
| 27 | [Galaxy Event Productions](https://www.casinovendors.com/vendor/galaxy-event-productions/) Sunrise, Florida Galaxy Event Production specializes in award winning, turnkey casino shows and entertainment. We are a full production company that will enhance your casino events! We specialize in grand openings and casino reopening's. We add new high energy to poker tournaments. Be sure ... Category: Theatrical Company, Promotions |
| 28 | [Galaxy Gaming](https://www.casinovendors.com/vendor/galaxy-gaming/) Las Vegas, Nevada "Delivering the finest gaming products and experiences in the galaxy" with table games such as the World's most popular side bet,"Lucky Ladies", 21+3, High Card Flush, World Poker Tour Heads Up Hold'em, Emperor's Challenge Pai Gow Poker and more. Also, offering players a ch... Category: New Game Manufacturer, Table Game Manufacturer |
| 29 | [Galaxy Plaza Ltd.](https://www.casinovendors.com/vendor/galaxy-plaza-ltd/) Vratsa, Vraca, Bulgaria Galaxy Plaza Ltd. is a Bulgarian private company, established in 1996 and specialized in design, production, delivery and installation of the fully furnishing for houses, stores, hotels, bars, coffee-houses, restaurants and offices. We have also a sheet metal processin... Category: Furnishings |
| 30 | [Galaxy Sign Source LLC](https://www.casinovendors.com/vendor/galaxy-sign-source-llc/) Chapel Hill, North Carolina Galaxy Sign Source is a newly formed company under the leadership of a management team who share over 100 years of combined expertise in sign sales, design and fabrication. Our research and manufacturing facility is located in China and this enables us to offer significant ... Category: Neon |
| 31 | [Galaxy4games](https://www.igamingsuppliers.com/vendor/galaxy4games/) Tallinn, Estonia Galaxy4Games team is based on high-skilled game industry professionals. Our experience spans match3, match2, farm, hidden objects, physics puzzles, and bingo projects along with different metagame mixes. Our main rules are fast development to test CPI, each stage optimiza... Categories: Software Development, Mobile Gaming, Mobile Gaming |
| 32 | [GalaxyText](https://www.casinovendors.com/vendor/galaxytext/) Dorvai, Quebec, Canada Offering SMS text message marketing along with mobile apps and mobile websites for casinos of all sizes. Category: E-messaging Systems |
| 33 | [Galera Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/galera-affiliates/) Category: Affiliate Programs |
| 34 | [Galewind Software Corp.](https://www.igamingsuppliers.com/vendor/galewind-software-corp/) Vancouver, British Columbia, Canada Our Adobe Flash application provides the ease of use of a non-download Casino with the rich graphics and fluid animation of a download product. Our offerings include the Practice Casino (shown here), a Bonus and/or Rebate Casino, and a full-featured Tournament Casino. All o... Category: Casino Software |
| 35 | [Gallagher Briody-Butler](https://www.casinovendors.com/vendor/gallagher-briody-butler/) Princeton, New Jersey Category: Other |
| 36 | [Gallant Background Checks](https://www.casinovendors.com/vendor/gallant-background-checks/) Owasso, Oklahoma Nation Wide background and drug testing services.Certified Business T.E.R.O Tribal Employment Rights Office through Cherokee Nation, Osage, Creek Tribes. We give tribal discounts as a way to give back to the tribes and to help the Indian Community. Our company has Integrity ... Category: Employee Screening, Security and Fraud |
| 37 | [Gallery Digital Signage](https://www.casinovendors.com/vendor/gallery-digital-signage/) Fairfield, New Jersey Gallery™ Digital Signage Solutions provides a unique combination of multimedia technology that will inform and effectively engage your audience. The Gallery™ Digital Signage software offering varies from single use to multiple use options showcased through a wide range of ki... Category: Monitors |
| 38 | [Gallery Street](https://www.casinovendors.com/vendor/gallery-street/) Roswell, Georgia Gallery Street is an e-commerce site that features an online fine art gallery and the capability to purchase museum quality giclee prints and innovative decor accessories based on art in the gallery. Gallery Street is the only online company that gives visitors access to an ... Category: Art, Wallcoverings |
| 39 | [Galls LLC](https://www.casinovendors.com/vendor/galls-llc/) Lexington, Kentucky Galls is your reliable source for quality, in-stock public safety equipment and uniforms. Like you, we're quick, efficient and effective. We understand that the demanding needs of your profession drive your purchasing decisions, so we demand the quality gear you require to d... Category: Uniforms |
| 40 | [Galston Associates](https://www.casinovendors.com/vendor/galston-associates/) Trimdon Village, England, United Kingdom Category: Other |
| 41 | [Gamanza Group](https://www.igamingsuppliers.com/vendor/gamanza-group/) OPERATORS & GAME DESIGNERS: TAKE CONTROL OF YOUR GAMES & EXCELERATE YOUR BUSINESS! We develop a state of the art DIY- & AGGREGATION GAMING PLATFORM. It contains: a great DYI Toolkit, which gives YOU the outstanding tools to design and easy assemble your own games. Surely ... Category: Platform Providers, Casino Software |
| 42 | [Gamatron](https://www.igamingsuppliers.com/vendor/gamatron/) Category: Casino Software |
| 43 | [Gambatria](https://www.casinovendors.com/vendor/gambatria/) Las Vegas, Nevada Gambatria (formerly known as Compu-Flyers) has more than 20 years of gaming analysis experience. The company was founded by Lenny Frome, considered for many years to be the premier analyst in the industry. The company is now run by his son Elliot, who has more than 15 year... Category: Game Design |
| 44 | [Gambee d.o.o. - Superior Gaming Experience](https://www.casinovendors.com/vendor/gambee-d-o-o-superior-gaming-experience/) Sezana, Slovenia Gambee is dedicated to providing cutting-edge solutions in the area of electronic and automated casino games. Our current focus lies in the design, production and support for advanced electronic table games and slot machines. Our solutions are successfully installed and used... Category: Table Games |
| 45 | [GamBetNews](https://www.casinovendors.com/vendor/gambetnews/) Cork, Munster, Ireland GamBet News, formerly Coin Op News Europe, is one of the oldest trade publications in the world for the gaming, betting, casino, bingo and lottery businesses. With unparalleled experience in the industry, GamBet News continues the tradition of providing the very best in up t... Category: Gaming Information, Business Publications |
| 46 | [Gamble Beast](https://www.igamingsuppliers.com/vendor/gamble-beast/) Gamble Beast is a market-leading provider of technology solutions to the sports betting and gaming industry supporting both the online and the land-based operations. We have combined together a strong and knowledgeable group of professionals with proven industry expertise... Categories: Platform Providers, Gambling Operations, Sportsbook Software |
| 47 | [Gamble Zen Partners](https://www.igamingaffiliateprograms.com/affiliate-program/gamble-zen-partners/) Category: Affiliate Programs |
| 48 | [GambleFi Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/gamblefi-affiliates/) Category: Affiliate Programs |
| 49 | [GambleID, LLC.](https://www.igamingsuppliers.com/vendor/gambleid-llc/) Houston, Texas GambleID (TSEVO) is a leading provider of Payment & Player Compliance solutions focused on online gaming. Our turn-key solution for daily fantasy sports, social gaming, regulated online poker, casino, and sports book operators features all of the payment management, cust... Categories: Software, Geolocation Services, Consulting |
| 50 | [GambleOn](https://www.igamingaffiliateprograms.com/affiliate-program/gambleon/) Category: Affiliate Programs |
| 51 | [Gamblers Anonymous International Service Office](https://www.casinovendors.com/vendor/gamblers-anonymous-international-service-office/) Gamblers Anonymous is a fellowship of men and women who share their experience, strength and hope with each other that they may solve their common problem and help others to recover from a gambling problem. Category: Other |
| 52 | [Gambler's Book Club](https://www.casinovendors.com/vendor/gambler-s-book-club/) Las Vegas, Nevada Since 1964, the world leading resource, largest and oldest bookshop specializing in books, computer software, and videos on gambling, casino management, employee training and all aspects of sports handicapping. Wholesale 70 titles, retails over 2,200. Open Monday-Saturday 9... Categories: Videos, Other, Books |
| 53 | [Gamblers General Store, Inc.](https://www.casinovendors.com/vendor/gamblers-general-store-inc/) Las Vegas, Nevada 6,000 items for the home gambler. A full line of chips, casino value, roulette, tournament, promotion in a variety of colors, weights and sizes. A new line of Casino and homestyle roulette wheels: 32 in., 30 in., and 19 in. Award wheels, dice, cards, custom poker chips, ta... Category: Home Gaming Products, Poker Chips |
| 54 | [GamblersPick](https://www.casinovendors.com/vendor/gamblerspick/) Or Yehuda, Israel GamblersPick.com is a community-driven online casinos portal that provides comprehensive information about all aspects of online gambling at online casinos. From industry news to casino and bonus reviews, as well as tips, tricks, and advice to enhance your chances of winning... Categories: Consumer Portals, Directories, Internet |
| 55 | [GambleStakes Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/gamblestakes-affiliates/) Category: Affiliate Programs |
| 56 | [Gamblify ApS](https://www.igamingsuppliers.com/vendor/gamblify-aps/) Copenhagen, Denmark Gamblify ApS is a privately owned, independent company that produces hardware and software solutions for the gambling industry. The current product portfolio consists of a slot-machine platform, a betting terminal solution and an online casino. Category: Software Development, Casino Software |
| 57 | [Gambling Affiliation](https://www.financeaffiliateprograms.com/affiliate-program/gambling-affiliation/) Sliema, Malta Gambling-Affiliation.com, also known as Net Business Ltd, was created in 2006 by two french entrepreneurs. It offers its affiliates and brands an independent platform where both parties find a unique place to send and receive traffic dedicated to the iGaming industry. The fi... Category: Affiliate Programs |
| 58 | [Gambling Consulting](https://www.igamingsuppliers.com/vendor/gambling-consulting/) Boulogne, Île-de-France, France Gambling Consulting is specialized in E.U Gambling Markets. Experienced in all Marketing means to reach your targeted audience and increase your customer database at the lowest cost. Our pledge is to promote the highest professionalism and ethical standard. Category: Consulting |
| 59 | [Gambling Craft](https://www.igamingaffiliateprograms.com/affiliate-program/gambling-craft/) Gambling Craft is a reliable affiliate program with in house developed casino brands, affiliate platform and games currently in development. The team consists of iGaming experts with 10 years of experience in the industry. There are more than 300 employees that work with one... Category: Affiliate Programs |
| 60 | [Gambling Insider](https://www.casinovendors.com/vendor/gambling-insider/) London, England, United Kingdom Gambling Insider is the free premier event-driven B2B magazine for the gaming industry, delivering first-class industry knowledge, market analysis and trends, and in-depth interviews with those in the know. Members include top-level CEOs, COOs, directors, business owners and... Category: Magazines |
| 61 | [Gambling Invest](https://www.casinovendors.com/vendor/gambling-invest/) Providence, Grand' Anse (Mahé), Seychelles GamblingInvest.com is a domain names marketplace completely dedicated to gambling-related domains. From betting domains to casino and sportsbook names, from igaming domains to poker domains, at GamblingInvest.com companies and individuals within the gambling industry can ... Categories: Other, Other, Other, Other, Domain Registration |
| 62 | [Gambling Partners](https://www.igamingaffiliateprograms.com/affiliate-program/gambling-partners/) Category: Affiliate Programs |
| 63 | [Gambling Soft](https://www.igamingsuppliers.com/vendor/gambling-soft/) Tyumen, Tyumen, Russia Gambling Soft is a relatively young casino software company from Russia. We tried to create a unique and competitive product at a low price, and we succeeded! We offer complete solutions for the iGaming business: slots, games with live dealers, casino sites, turnkey casin... Categories: Casino Software, Casino Software, Affiliate Program Software, Software |
| 64 | [Gambling Therapy](https://www.casinovendors.com/vendor/gambling-therapy/) Gambling Therapy is a Global Online Helproom for anybody affected by problem gambling. It is available in 28 different languages and mirrors all those languages that are offered by the gambling operators. Gambling Therapy offers forums, live advice, help and support, e-mail ... Category: Problem Gambling Treatment, Problem Gambling |
| 65 | [Gambling Turkey](https://www.igamingsuppliers.com/vendor/gambling-turkey/) Sliema, Malta, Malta Gambling Turkey, the ultimate iGaming digital marketing agency, helps businesses reach their full potential in the Turkish market with superpower of inside knowledge and tailor-made digital marketing services, including SEO, Link building, Web & Graphic design, Copywriting, ... Categories: Social Media, Consulting, Consulting, Translation Services, Website Content, Services |
| 66 | [Gambling Wages](https://www.igamingaffiliateprograms.com/affiliate-program/gambling-wages/)*Highest Revenue Sharing in the Industry for the Lifetime of Your Players *Access to Your Own Account Manager with Complete Tracking and Reporting *Fresh Content! *On-Time Payments! *Cutting Edge Marketing Technology and Effective Tools to Maximize Returns *2-Tier ... Category: Affiliate Programs |
| 67 | [GamblingDomains.io](https://www.igamingsuppliers.com/vendor/gamblingdomains-io/) GamblingDomains.io is the premier marketplace for gambling domains. We cover all the main gambling verticals including casino, bingo, sportsbetting, poker and lottery. Our domains include some that are well over 10 years old as well as ones that have an existing backlink pro... Category: Other, Domain Registration |
| 68 | [GamblingProfesional](https://www.igamingsuppliers.com/vendor/gamblingprofesional/) Montevideo, Montevideo, Uruguay GamblingProfesional is an independent Spanish speaking community, link between affiliates, affiliate programs, agencies and professionals involved in the online gambling and financial products market. Its administrators are not owners, nor do they have direct dependence bond... Category: Business Portals |
| 69 | [Gamblo Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/gamblo-affiliates/) Category: Affiliate Programs |
| 70 | [Gamdom Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/gamdom-affiliates/) Category: Affiliate Programs |
| 71 | [Game Box Builders](https://www.casinovendors.com/vendor/game-box-builders/) Greensboro, North Carolina Our company is owned and operated by leaders in the gaming industry. Game Box Builders is staffed by experienced engineers, designers, and cabinetry experts. Our facilities are equipped with state-of-the-art manufacturing technologies to meet the personalized demands of our ... Categories: Electronic Games, New Game Manufacturer, Bases-Cabinets-Stands (Wood) |
| 72 | [Game Design Automation Pty Ltd](https://www.casinovendors.com/vendor/game-design-automation-pty-ltd/), New South Wales, Australia Tools for the design of advanced slot machine mathematics and development of game prototypes. Categories: Game Design, Design, Other |
| 73 | [Game Guys LLC](https://www.casinovendors.com/vendor/game-guys-llc/) New Orleans, Louisiana Poker Productions offers a complete line of quality casino games for rent. Our friendly, knowledgeable and patient dealers will entertain and teach you guest how to play. Our prices are affordable and our customer service is second to none. We have been serving our customers... Category: Casino Party Rental |
| 74 | [Game Interaction Group BV](https://www.igamingsuppliers.com/vendor/game-interaction-group-bv/) AMESTERDAM, Netherlands Game Interaction Group, provides gaming operators with a complete and modular gaming platform in order to meet all customers requirements, no matter how big or small these might be. Thanks to 15 years experience in the i-gaming industry, we understand that lowering opera... Category: Other, Platform Providers |
| 75 | [Game Media Works (GMW)](https://www.igamingsuppliers.com/vendor/game-media-works-gmw/) Category: Casino Software, Gambling Operations |
| 76 | [Game Media Works](https://www.igamingsuppliers.com/vendor/game-media-works/) Larnaca, Cyprus Category: Platform Providers |
| 77 | [Game Show America](https://www.casinovendors.com/vendor/game-show-america/) Sun Prairie, Wisconsin Game Show America offers a number of exciting interactive floor promotions to draw traffic to your casino. We work with you and your promotions and marketing team to provide the best promotions possible to increase player loyalty. Each one of our game promotions are thorough... Category: Promotions |
| 78 | [Game Show Gurus](https://www.casinovendors.com/vendor/game-show-gurus/) Hoffman Estates, Illinois Game Shows are Winners With Your Guests, Which Means a Jackpot for Your Casino. Casinos can use our game shows for many things: •Entertainment Stages •Player Development •Floor Promotions •Traffic Building •Private Events/Banquets. We are very easy to work with and cost effe... Categories: Multi-media Productions, Stage Equipment, Production, Promotions |
| 79 | [Game Shows Alive](https://www.casinovendors.com/vendor/game-shows-alive/) Coral Springs, Florida Game Shows Alive can emulate, create and produce TV style game shows for use at any type of event. We offer full production anywhere in the United States. Category: Production |
| 80 | [Game Stands, LLC](https://www.casinovendors.com/vendor/game-stands-llc/) El Cajon, California Game Stands has a proven track record with over 24 years of experience. Integrity along with a solutions based focus gives Games Stands a unique opportunity to add value to our customers' business. Categories: Electronic Games, Accessories, Parts |
| 81 | [Game Time Amusement and Billiards](https://www.casinovendors.com/vendor/game-time-amusement-and-billiards/) Tempe, Arizona We have over 50 years experience in the Amusement and Gaming industry. We wholesale slot and video lottery machines worldwide as well as provide consulting in different applications. Category: Consulting, Amusement Equipment |
| 82 | [Game World Event Services, LLC.](https://www.casinovendors.com/vendor/game-world-event-services-llc/) St Charles, Missouri Game World Event Services specializes in corporate parties and trade shows. We carry a full line of professional grade casino equipment as well as simulators, video games, pool tables, inflatables, carnival and arcade activities. All of the equipment we offer is owned and op... Category: Amusement Equipment |
| 83 | [Game360](https://www.igamingsuppliers.com/vendor/game360/) Rome, Italy Game360, part of SG Digital, has developed a comprehensive, self made and proprietary platform which supports multichannel gaming by providing interfaces over web, mobile, tablet and other devices like smart tvs. This platform includes content management, customer relatio... Category: Platform Providers, Gambling Operations |
| 84 | [Game-Ace](https://www.igamingsuppliers.com/vendor/game-ace/) Kharkiv, Ukraine Game-Ace Creative Studio is a game development division of Program-Ace, headquartered in Eastern Ukraine. We are a talented and creative team of designers, artists, producers, programmers, and managers who are focused on crafting addictive games that amaze and excite players... Category: Casino Software |
| 85 | [Gameacon](https://www.casinovendors.com/vendor/gameacon/), New Jersey At its core, every casino has its theme and the demographics to which it caters. But today's, and the future's customers of the casino industry have grown up in a very technical world. They believe in different philosophies and look for an overall immersive experience to en... Category: Other, Conferences |
| 86 | [GameAnalytics Ltd](https://www.casinovendors.com/vendor/gameanalytics-ltd/) Edinburgh, Scotland, United Kingdom GamesAnalytics believes there is a new doctrine in games: Player Relationship Management. Founded in 2010, we bring together extensive expertise from both the games and data mining industries to offer cross-platform predictive analytics technology solutions. Headquartered in... Category: Other |
| 87 | [GameArt](https://www.igamingsuppliers.com/vendor/gameart/) Ta' Xbiex, Malta GameArt is an independent online casino software provider and developer, providing innovative games and cutting-edge solutions dedicated to online and landbased gaming operators. The company was founded in 2013 by a group of serial entrepreneurs who have had successful exper... Categories: Gambling Operations, Software Development, Casino Software, Mobile Gaming, Other |
| 88 | [GameBridge Services Limited](https://www.igamingsuppliers.com/vendor/gamebridge-services-limited/) Douglas, Isle of Man GameBridge provides everything you need to launch and grow your iGaming business - player management, bonuses, payments, CRM, risk & compliance, analytics, gamification, native apps, and much more - all in one platform. Ready for real-money casinos, sweepstakes, crypto gamin... Category: Gambling Operations, Platform Providers |
| 89 | [Gameburger Studios](https://www.igamingsuppliers.com/vendor/gameburger-studios/) Gameburger Studios is a game development studio launched in 2019 which is dedicated to producing premium games with all the trimmings. The company supplies their online games exclusively to Microgaming. Category: Casino Software |
| 90 | [GameCo](https://www.casinovendors.com/vendor/gameco/) New York, New York GameCo LLC is a pioneering company uniting the experience of playing video games with the excitement of gambling by creating the worlds first Video Game Gambling Machines (VGM™). Video Game Gambling combines the fun and interactivity of video games with the thrill and an... Category: Slot Machines |
| 91 | [GameColony.com Affiliate Program](https://www.igamingaffiliateprograms.com/affiliate-program/gamecolony-com-affiliate-program/) Category: Affiliate Programs |
| 92 | [Gamecraft](https://www.casinovendors.com/vendor/gamecraft/) Rydalmere, New South Wales, Australia Gamecraft develop progressive jackpot link strategies to increase gaming machine performance and revenue. Our main effort is to create value by achieving a sustained increase in turnover to gaming machine operations. Category: Other, Progressive Jackpot Equipment |
| 93 | [GamedayMath](https://www.igamingsuppliers.com/vendor/gamedaymath/) Orlando, Florida GamedayMath is a bettors guide to getting an edge against the sportsbooks. With us, there is unlimited earning potential with our affiliate program. There's no ceiling on how much you can earn, offering you the freedom to maximize your income. The more effort and skill you ... Category: Sportsbook Software |
| 94 | [Gamefish Global](https://www.igamingsuppliers.com/vendor/gamefish-global/) Sydney, New South Wales, Australia Gamefish Global is a premium casino game development and distribution provider. Category: Casino Software, Casino Software |
| 95 | [Gamegram Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/gamegram-affiliates/) Category: Affiliate Programs |
| 96 | [GameGrow Partners](https://www.igamingaffiliateprograms.com/affiliate-program/gamegrow-partners/) Category: Affiliate Programs |
| 97 | [GameHouse](https://www.igamingsuppliers.com/vendor/gamehouse/) At GameHouse, we believe its good to game. Thats why we are dedicated to a single mission: to enrich lives through games and experiences that people love to play and share. As the largest developer, publisher, and distributor of casual games with millions of players around... Categories: Software Development, Casino Software, Mobile Gaming, Other |
| 98 | [Gameiom Technologies Limited](https://www.igamingsuppliers.com/vendor/gameiom-technologies-limited/) Douglas, Isle of Man GAMEIOM has two main objectives: firstly, to provide an aggregation platform that allows game developers a quick and viable route to market; and secondly, to provide content, including proprietary products, that excites and engages players from all over the globe. We are ... Category: Platform Providers, Casino Software |
| 99 | [GameOn Consultants Limited](https://www.igamingsuppliers.com/vendor/gameon-consultants-limited/) Onchan, Isle of Man GameOn Consultants offers a wide range of services from advice and assistance with implementation of products and licensing, sourcing and managing white label solutions; developing product set up requirements, devising bonus and loyalty strategies, fraud and risk analysis an... Categories: Licensing and Regulation, Consulting, Security and Fraud, Consulting |
| 100 | [GameOn Marketing Limited](https://www.igamingsuppliers.com/vendor/gameon-marketing-limited/) Isle of Man, United Kingdom Categories: Other, Search Engine Optimization, Trade Shows and Conferences |
| 101 | [GameOn Marketing](https://www.igamingaffiliateprograms.com/affiliate-program/gameon-marketing/) Onchan, Isle of Man GameOn Affiliates, a division of GameOn International Limited, provides gaming clients with tailored affiliate management services and excellent customer value. We specialise in taking the extra step by focusing directly on the player acquisition journey, from affiliate recr... Categories: Affiliate Programs, Consulting, Consulting |
| 102 | [GamePlan Consultants Pty. Ltd.](https://www.casinovendors.com/vendor/gameplan-consultants-pty-ltd/) Burleigh Heads, Queensland, Australia Our entire focus in training and consulting is based on the CRM philosophy. We believe that CRM starts with the right people, and the way in which the casino treats its own people. Internal marketing is thus a major thrust of our organization wherein we blend marketing and H... Category: Consulting |
| 103 | [Gameplay Interactive](https://www.igamingsuppliers.com/vendor/gameplay-interactive/) Gameplay Interactive provide the most engaging and gaming experience for your players consists of many online gaming product including the industry leader in Live Dealers Casino, 3D Slot and Games, Lottery (Keno and iLotto), Sportsbetting, P2P games such as Poker Mahjong pro... Categories: Casino Software, Poker Software, Live Dealer, Sportsbook Software, Gambling Operations |
| 104 | [Gameplay Media GmbH](https://www.igamingsuppliers.com/vendor/gameplay-media-gmbh/) Frankfurt, Germany GamePlay Media GmbH is a media buying & planning agency for the entertainment sector. The range of services includes all aspects of online marketing like social media, SEM, SEO, real-time bidding (RTB) and display, affiliates and newsletter marketing. Category: Social Media |
| 105 | [Gamer Casino Seating](https://www.casinovendors.com/vendor/gamer-casino-seating/) Parkmore Sandton, Gauteng, South Africa Gamer Entertainment Products is a South African based company, specializing in the manufacturer of customized casino slot and table seating. Gamer Entertainment is is a vibrant, young and innovative manufacturer of casino table and slot seating whose creative designs emphasi... Categories: Bases-Cabinets-Stands (Wood), Bases-Cabinets-Stands (Metal), Other |
| 106 | [Gameroom Gallery](https://www.casinovendors.com/vendor/gameroom-gallery/) Ridgeland, Mississippi We are Central Mississippi's oldest and largest pool table and Gaming supplier. We offer a full array of casino supplies, game seating, barstools, combination game tables, billiard table lights, wall art, pool cues, air hockey, foosball tables, restaurant seating and amuseme... Categories: Casino, Furnishings, Furnishings |
| 107 | [Gameroomdepot](https://www.casinovendors.com/vendor/gameroomdepot/) anjou, Quebec, Canada Categories: Equipment, Blackjack Tables, Equipment, Equipment, Other, Chips, Manufacturer |
| 108 | [Games Global Limited](https://www.igamingsuppliers.com/vendor/games-global-limited/) Douglas, Isle of Man Games Global is a supplier of unique and innovative iGaming content. Bringing together some of online gaming's biggest and brightest stars, the Games Global portfolio is home to thousands of titles from 50+ studio partners. Category: Casino Software |
| 109 | [Games Marketing Services](https://www.casinovendors.com/vendor/games-marketing-services/) Paris, France In the advisory field, Games Marketing Services approach is market and customer orientated. In-depth analysis and understanding of customer objectives allow suitable solutions in terms of means, structure and deadlines. The proximity that defines each of GMS missions result... Category: Multi-media Productions |
| 110 | [Games Valley](https://www.igamingsuppliers.com/vendor/games-valley/) Cluj Napoca, Romania Games Valley delivers a modern, technology-led approach to game aggregation, designed to meet the needs of todays iGaming operators. Our team brings decades of hands-on industry knowledge, which has shaped a resilient and scalable infrastructure built for high performance. ... Category: Other |
| 111 | [Games Warehouse](https://www.casinovendors.com/vendor/games-warehouse/) Pride Park, England, United Kingdom Games Warehouse has grown to become the leading supplier of pay-to-play video entertainment terminals in the UK. The Company has developed an ever-expanding portfolio of gaming and skill/entertainment products targeted at its core UK customer base and beyond. We are co... Categories: Game Design, Casino Software, Mobile Gaming |
| 112 | [GameScale Europe Limited](https://www.igamingsuppliers.com/vendor/gamescale-europe-limited/) St. Paul's Bay, Malta GameScale provides a unique gaming platform designed for running a successful online gaming business. Our mission is to provide you with the best technology, which is custom, suited to your present and future needs. We can build exclusive software to specification or help yo... Categories: Live Dealer, Casino Software, Sportsbook Software, Racebook Software |
| 113 | [GAMESERVICE S.C.](https://www.casinovendors.com/vendor/gameservice-s-c/) Krosno, Poland Gameservice company is one of the members of Gameservice Group, with headquarters in Haczów, Poland. It is engaged in the manufacture of highly advanced gaming machines. In its designs, the company uses exclusively components from renowned and world-wide acknowledged comp... Category: Slot Machines |
| 114 | [GamesGuru Pvt. Ltd.](https://www.igamingsuppliers.com/vendor/gamesguru-pvt-ltd/) New Delhi, Delhi, India Established in 2016, Games Guru is India's driving diversion development organization, giving Casino Game Development and Casino art production services to the worldwide Casino games industry with master's games engineers, design and creation directors working in our workpla... Categories: Casino Software, Poker Software, Bingo Software, Betting Exchange Software, Skill Games Software, Consulting |
| 115 | [Gamesman Limited](https://www.casinovendors.com/vendor/gamesman-limited/) West Sussex, United Kingdom Illuminated push-buttons & reel mechanisms. Category: Parts |
| 116 | [GameSpring Co. Ltd.](https://www.casinovendors.com/vendor/gamespring-co-ltd/) Seoul, South Korea Casino / Poker game development specialist. Texas Holdem, Badugi, Omaha, High-Low resizing, multitable, replay and even straddle and more features. Online baccarat, blackjack, roulette, taisai, caribbean poker, casino war, slotmachine and World unique squeeze baccarat Se... Categories: Poker Software, Casino Software, Multi-player Games |
| 117 | [GamesScorekeeper](https://www.igamingsuppliers.com/vendor/gamesscorekeeper/) Aarhus, Århus, Denmark Today GameScorekeeper delivers esports data and content solutions to some of the leading players in the esports market. Our clients range from betting operators to media companies and fantasy leagues. With extensive coverage of the three biggest esports, CS: GO, League of... Category: Other, Gambling Operations |
| 118 | [Gamesys Limited](https://www.igamingsuppliers.com/vendor/gamesys-limited/) London, England, United Kingdom Gamesys develops proprietary multi-platform gaming software consisting of Instant Win, Bingo and Casino Games along with quality promotional and account management tools such as software and design, system security, hosting and maintenance, game development, reporting and Eb... Category: Bingo Software, Casino Software |
| 119 | [Gamevy Limited](https://www.igamingsuppliers.com/vendor/gamevy-limited/) London, England, United Kingdom Gamevy is an award-winning, licensed supplier and operator producing a high- quality, select range of real-money games. The company believes in combining skill, chance and life-changing jackpots for the ultimate in fun. Categories: Casino Software, Skill Games Software, Lottery Software, Mobile Gaming |
| 120 | [Gamewise](https://www.igamingsuppliers.com/vendor/gamewise/) Miami, Florida Gamewise is a turnkey digital gambling, sportsbook, and gaming infrastructure solution. Category: Gambling Operations |
| 121 | [Gaminator](https://www.igamingsuppliers.com/vendor/gaminator/) San Francisco, California Gaminator Casino is a renowned iGaming provider that offers investors a full range of solutions for launching and supporting gaming start-ups. Having started as a small enterprise, the company has achieved stunning success and gained recognition in several markets at once: t... Category: Casino Software |
| 122 | [Gaming & Entertainment Touch Technology](https://www.casinovendors.com/vendor/gaming-entertainment-touch-technology/) Las Vegas, Nevada We stock over 45,000 Touch Sensors in our Inventory and we Guarantee to have the lowest prices on Touch Sensors. Our Casino Air products, SmartPower Systems, and Ceronix Monitors are 3 more great ways we offer to save you time and money. Please visit us at www.get-t.net and ... Categories: Touchscreens, LCD, Monitors, Surge Suppression, Power Sources, Air Filtration Systems |
| 123 | [Gaming & Leisure](https://www.casinovendors.com/vendor/gaming-leisure/) Las Vegas, Nevada Gaming & Leisure® (G&L) is dedicated to the betterment of the gaming and hospitality industry in all that we do. G&L platforms and offerings provide 360° insight into every industry aspect and reaches owners, operators and the business partners who serve them domestically an... Categories: Other, Magazines, Consulting, Other |
| 124 | [Gaming & Resort Development, Inc.](https://www.casinovendors.com/vendor/gaming-resort-development-inc/) Laguna Woods, California The company has a 25 year history of providing comprehensive development & operational consulting, including highly regarded feasibility study services, for casino & resort projects worldwide, and for Tribal Communities in the U.S. & Canada. Categories: Development: Indian Gaming, Market Research and Development, Consulting, Feasibility Studies, Consulting, Consulting |
| 125 | [Gaming Analytics, Inc.](https://www.casinovendors.com/vendor/gaming-analytics-inc/) Berkeley, California Gaming Analytics offers software solutions that help casino operators make strategic improvements to the casino floor. GA saves time with AI doing the hard work for you. Category: Software Development |
| 126 | [Gaming Arts, LLC](https://www.casinovendors.com/vendor/gaming-arts-llc/) Las Vegas, Nevada Gaming Arts, a leader in "Life Changing" gaming products, is dedicated to bringing innovation and excitement to the Gaming industry. The Gaming Arts management team includes leaders in the field with many decades of experience to the younger tech savvy, providing a managemen... Category: Other |
| 127 | [Gaming Associates](https://www.casinovendors.com/vendor/gaming-associates/) Bella Vista, New South Wales, Australia Gaming Associates provide payment card industry (PCI), regulatory compliance, corporate governance and compliance, enterprise risk management to casinos, lottery operators, regulators, bet exchanges, bookmakers... Gaming is our business. PCI certification and implementation.... Categories: Consulting, Consulting, Consulting, Other, Consulting |
| 128 | [Gaming Books International](https://www.casinovendors.com/vendor/gaming-books-international/) Las Vegas, Nevada Have been selling these books since 1985 and they continue to be in demand because they are easy to understand and are priced right at $3.50 Retail. These are humorous and informative books on Las Vegas games. Category: Gaming Information |
| 129 | [Gaming Capital Group](https://www.casinovendors.com/vendor/gaming-capital-group/) Newcastle, Oklahoma Gaming is a highly challenging environment for traditional lenders. Often, new projects must struggle to find the right financing mix to get their project off the ground. Gaming equipment manufacturers and distributors often need growth capital based on their equipment ass... Categories: Leasing, Other, Financing |
| 130 | [Gaming Cards LTD](https://www.casinovendors.com/vendor/gaming-cards-ltd/) Santa Ana, California Category: Playing Cards |
| 131 | [Gaming Consultants International](https://www.casinovendors.com/vendor/gaming-consultants-international/) Dingley, Victoria, Australia Internationally recognised gaming consultants with extensive experience in slot machines, slot systems, performance analysis and improvement, technical standards, government relations and overall casino/gaming project management. Category: Consulting |
| 132 | [Gaming Corps](https://www.igamingsuppliers.com/vendor/gaming-corps/), Sweden Gaming Corps is a Swedish video game and interactive entertainment company with offices and development resources in Stockholm, Austin and Malta. Category: Casino Software, Casino Software |
| 133 | [Gaming Entertainment](https://www.igamingsuppliers.com/vendor/gaming-entertainment/) Sofia, Sofija-Grad, Bulgaria As a company we are constantly striving to evolve, with a team of seasoned rockstars in the iGaming industry, we make sure to stay one step ahead of the curve. We are constantly monitoring the ever changing landscape of the scene and quickly adapt our operations and vision t... Category: Platform Providers, Gambling Operations |
| 134 | [Gaming Equipment Manufacturing (GEM)](https://www.casinovendors.com/vendor/gaming-equipment-manufacturing-gem/) Khimki, Moskva, Russia Gaming tables, chairs, wheels, accessories. Categories: Table Game Manufacturer, Slot Stools, Equipment, Chips, CCTV Systems |
| 135 | [Gaming Floor](https://www.casinovendors.com/vendor/gaming-floor/) London, England, United Kingdom Gaming floor is a leading worldwide resource for casino trade and industry news. Content includes daily headline newslinks and press releases. Product and suppliers, stock prices, operator web site listings by coutry & continent, conference and exhibition dates, casino emplo... Categories: Gaming Information, Internet, Education |
| 136 | [Gaming Gifts](https://www.casinovendors.com/vendor/gaming-gifts/) Las Vegas, Nevada GAMING GIFTS - Supplier and manufacturer of Exquisite Casino Gaming Gifts & Awards. The sculpted, polished beauty of our crystal pieces make them unique, one-of-a-kind gifts for your all your Special Events & Tournaments. These popular designs of the Royal Flush, Blackjack, ... Categories: Gift Merchandise, Imprinted Products, Promotions |
| 137 | [Gaming in EU](https://www.igamingsuppliers.com/vendor/gaming-in-eu/) Gemert, Netherlands Gaming in EU organizes organizes the annual Gaming in Spain, Gaming in Germany and Gaming in Holland conferences. The conferences offer knowledge and networking to everyone who is professionally involved in the gaming industry: from business executives to independent consult... Categories: Trade Shows and Conferences, Trade Shows and Conferences, Trade Shows and Conferences, Business Publications, Business Publications, Business Publications |
| 138 | [Gaming in Holland](https://www.casinovendors.com/vendor/gaming-in-holland/) Gaming in Holland is the leading platform for Gaming and Lotteries in the Netherlands. With weekly local News updates and the Yearly Conference, we reach all industry decision makers in this space. Category: Gaming Information |
| 139 | [Gaming Informatics LLC](https://www.casinovendors.com/vendor/gaming-informatics-llc/) Madison, Wisconsin Auditing and Compliance software for casino operations and regularly bodies (Tribal Commissions, State, Federal) Categories: Indian Gaming, Auditing, Accounting: Slots |
| 140 | [Gaming Innovation Group Limited](https://www.igamingsuppliers.com/vendor/gaming-innovation-group-limited/) St. Julians, Malta At GiG, we pride ourselves in what we do. More than 700 GiGsters from 35 different countries are going all in to make a whole industry open and connected, like never before. We do great stuff and never settle for anything ordinary. We are game changers, because what else is ... Categories: Platform Providers, Sportsbook Software, Other |
| 141 | [Gaming Intelligence](https://www.casinovendors.com/vendor/gaming-intelligence/) London, England, United Kingdom Category: Gaming Information |
| 142 | [Gaming Laboratories International, LLC (GLI)](https://www.casinovendors.com/vendor/gaming-laboratories-international-llc-gli/) Lakewood, New Jersey Compliance is the heart of what Gaming Laboratories International (GLI®) does for suppliers, regulators, and operators worldwide. In 707 jurisdictions, companies turn to GLI for help with their compliance challenges in the areas of land-based gaming, iGaming, lottery, and cy... Categories: On-site Inspections, Training, General, Test and Measurement Equipment, Consulting, Auditing |
| 143 | [Gaming Licensing](https://www.igamingsuppliers.com/vendor/gaming-licensing/) Willemstad, Curaçao Licensing of all iGaming Products — online casinos, sports betting, poker, lotteries, and bingo. Quick and cost effective licensing solution for your igaming business. Category: Licensing and Regulation, Consulting |
| 144 | [Gaming Mail](https://www.igamingsuppliers.com/vendor/gaming-mail-1/) Basingstoke, England, United Kingdom We provide engaging offline gaming brand experiences that deliver. We manage the process for direct mail campaigns from end to end. From the strategic acquisition of printed goods to promoting your brand or product in the most efficient and cost-effective way possible Category: Direct Marketing |
| 145 | [Gaming Mail](https://www.igamingsuppliers.com/vendor/gaming-mail/) Basingstoke, England, United Kingdom Category: Direct Marketing |
| 146 | [Gaming Media Group Inc](https://www.casinovendors.com/vendor/gaming-media-group-inc/) Louisville, Kentucky Gaming Media Group is the publisher of Southern & Midwest Gaming and Destinations, a bi-monthly print and digital magazine widely regarded as the premier resource for casino and travel news throughout the Midwest and South. Every issue delivers expert insights, valuable tips... Category: Magazines |
| 147 | [Gaming Point Partner](https://www.igamingaffiliateprograms.com/affiliate-program/gaming-point-partner/) Category: Affiliate Programs |
| 148 | [Gaming Realms](https://www.igamingsuppliers.com/vendor/gaming-realms/) London, England, United Kingdom Gaming Realms creates and develops interactive next-generation online gaming applications, focused on delivery via mobile, tablet and desktop computers. Its principle businesses are BingoGodz, a multi-platform real money social bingo game; Bejig, an award-winning designer an... Categories: Gambling Operations, Casino Software, Mobile Gaming |
| 149 | [Gaming Recruiters, LLC](https://www.casinovendors.com/vendor/gaming-recruiters-llc/) Saint Louis, Missouri Recruiting services exclusively for the gaming industry since the 90's. Our expertise is identifying difficult to find candidates that fit specific needs and qualifications. We recruit all gaming disciplines including Finance, Marketing, IT, F&B, HR, Cage, Compliance, COO,... Categories: Recruitment, Consulting, Consulting, Staffing Services |
| 150 | [Gaming Signs](https://www.casinovendors.com/vendor/gaming-signs/) Buenos Aires, Buenos Aires, Argentina We are a leading manufacturer of indoor and outdoor signage for entertainment areas with unique design and use of materials at just 2/3 of price of other major companies. The Art Department combines their skill and technical experience with the knowledge of the players p... Categories: Exterior, Interior, LED Systems, LED, Slot Meters, LED Systems, LED, LED |
| 151 | [Gaming Solutions LLC](https://www.casinovendors.com/vendor/gaming-solutions-llc/) Albuquerque, New Mexico Gaming Solutions, LLC has been operating in New Mexico and Arizona for three (3) years. Founded by Lauralyn McCarthy, President of New Mexico Gaming, LLC, we offer over 50 years of gaming and high tech expertise. Our industry contacts and partnerships make Gaming Solutions a... Categories: Parts, Slot Systems, LED Systems, Kiosks, Control Room, Design, Progressive Meters, Videowalls |
| 152 | [Gaming Supplies LLC](https://www.casinovendors.com/vendor/gaming-supplies-llc/) Batumi, Georgia Gaming Supplies LLC sells casino equipment from Batumi, Georgia. Our warehouse holds over 80 casino product types, casino spare parts. We manufacture casino products, such as roulette balltrack leveler, card shredder, baccarat playing cards, baccarat and roulette displays. Category: Equipment |
| 153 | [Gaming Supply Company](https://www.casinovendors.com/vendor/gaming-supply-company/) Manassas Park, Virginia The company has been in business for over 12 years, selling quality products. They are a Deutsche Wurlitzer Distributor. They have many items priced from $9.60 to $8000.000. They offer warranties and service items. Very friendly family owned business. Category: Other |
| 154 | [Gaming Support USA](https://www.casinovendors.com/vendor/gaming-support-usa/) Las Vegas, Nevada Gaming Support is a premier supplier of products and services to the global gaming industry with offices in Nevada, The Netherlands and Belgium. Founded in 2000, the company delivers tried and tested, industry-leading solutions that grow gaming revenues and cut costs for ca... Categories: Bonus Systems, Digital, Controllers, Video, Accessories, Interior |
| 155 | [Gaming Technologies](https://www.casinovendors.com/vendor/gaming-technologies/) Vraca, Vraca, Bulgaria Gaming Technologies is a Bulgarian company, dedicated in manufacturing of gaming machines for casinos and arcades. Categories: New Game Manufacturer, Slot Systems, Equipment, Progressive Jackpot Equipment |
| 156 | [Gaming Technology Solutions - GTS](https://www.igamingsuppliers.com/vendor/gaming-technology-solutions-gts/) Ipswich, England, United Kingdom Gaming Technology Solutions (GTS), a Playtech company, is a leading global supplier of end-to-end soft gaming solutions for delivery to IP enabled devices and iTV boxes. GTS has become the market leader in the end-to-end delivery of on-line soft gaming solutions. Building on... Category: Mobile Gaming, Casino Software |
| 157 | [Gaming Tickets, Inc.](https://www.casinovendors.com/vendor/gaming-tickets-inc/) Columbus, North Carolina IGT approved supplier of cashless slot machine tickets - Gaming Tickets, Inc. provides thermal gaming tickets for use in your 'ticket-in/ticket-out' slot machines (i.e., FutureLogic, Ithaca, and Nanoptix Printers). GTI tickets are 65mm x 156mm and/or 62mm x 120mm. We feature... Categories: TITO Tickets, Tickets, Player Tracking Systems, Ticket Printing, Tickets, Printers, Distributors, Player Tracking Cards, Promotional Tickets, Manufacturing, Bungie Coils and String Cords, Players Club Merchandise, Novelty Supplies, Receipt Paper Rolls, Tickets, Ticket Printing, In-room Access |
| 158 | [Gaming Today](https://www.casinovendors.com/vendor/gaming-today/) Las Vegas, Nevada GamingToday has had its finger on the pulse of the gaming industry for nearly 40 years. Its motto, News You Can Bet On, applies to both sides of the table news for casino customers as well as casino executives. Its specialty printing offers tight turn around, accuracy and ... Category: Gaming Information, Other |
| 159 | [Gaming USA Corp.](https://www.casinovendors.com/vendor/gaming-usa-corp/) Paramus, New Jersey The Gaming Industry Weekly Report is about to begin its 16th year of publication and is the oldest gaming stock and gaming information newsletter. The Gaming Industry Daily Report is in its 12th year and was the first daily report focusing on the gaming industry. We soon ... Category: Newsletters |
| 160 | [Gaming1 Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/gaming1-affiliates/) Category: Affiliate Programs |
| 161 | [Gaming1](https://www.igamingsuppliers.com/vendor/gaming1/) Brussels, Belgium Gaming1 is an online full service provider specialised in development of platforms and online casino games adapted to local markets. Based in Brussels, Gaming1 is an ultra-dynamic and innovative company resulting from the partnership between one of the most prestigious we... Categories: Casino Software, Bingo Software, Live Dealer, Mobile Gaming |
| 162 | [GamingCables.com](https://www.casinovendors.com/vendor/gamingcables-com/) Las Vegas, Nevada GamingCables.Com was founded in 2010 by Wayne J Shafer, we are located in Las Vegas, Nevada. We offer production services of LED assemblies, wire harnesses and cable assemblies for gaming companies. Parent company KNEXTEC LLC visit knextec.com Categories: Cable Assembly, Wire Harnesses, Electro-mechanical Assembly, Manufacturing, LED, Manufacturer, Connectors, Cable Assembly, LED |
| 163 | [GamingLicense.com](https://www.igamingsuppliers.com/vendor/gaminglicense-com/) Nicosia, Cyprus Our team provides expert iGaming license support to clients globally, navigating complex applications and ensuring seamless iGaming compliance with all international regulatory standards. With over 60 years of combined industry expertise, our journey began with 25 years o... Category: Licensing and Regulation |
| 164 | [Gamingmatic](https://www.casinovendors.com/vendor/gamingmatic/) Professional Gaming Terminal Manufacturer Category: Video Lottery Terminals |
| 165 | [GamingSoft](https://www.igamingsuppliers.com/vendor/gamingsoft/) Makati City, National Capital Region, Philippines GamingSoft is a vendor neutral casino software supplier to various eGaming operators of different sizes across Australia, Eastern Europe and Asia Pacific Countries. We provide casino products like live casino software, slots & games, sportsbooks software, poker, keno, financ... Categories: Gambling Operations, Casino Software, Sportsbook Software, Live Dealer |
| 166 | [Gamingtec](https://www.igamingsuppliers.com/vendor/gamingtec/) London, England, United Kingdom Gamingtec is an independent software platform provider. We offer complex turnkey solutions to B2B iGaming partners. Category: Gambling Operations |
| 167 | [Gamix Partners](https://www.igamingaffiliateprograms.com/affiliate-program/gamix-partners/) Category: Affiliate Programs |
| 168 | [GammaStack](https://www.igamingsuppliers.com/vendor/gammastack/) Wilmington, Delaware GammaStack is the leading provider of fantasy sports and sports betting software. Extending its services in the field of eSports, its has become top rated company for eSports Software Platform development. The company also supplies customized software solutions and whitelabl... Category: Sportsbook Software |
| 169 | [GammaTek](https://www.casinovendors.com/vendor/gammatek/) Glendale, Arizona GammaTek's Baccarat displays are designed to appeal to Asian customers, using a column "run-based" method for displaying Baccarat results. GammaTek's Roulette displays are designed for remote casino sites where reliability is key. Our LED displays don't have a tricky ele... Category: Table Top Systems |
| 170 | [Gamomat Development GmbH](https://www.casinovendors.com/vendor/gamomat-development-gmbh/) Berlin, Berlin, Germany We are a German specialist gaming content design company with many years of experience across a range of key global markets. Profound knowledge, innovation and passion are reflected in our games - we develop products for the international markets and we are proud to include ... Category: Casino Software, Game Design |
| 171 | [Gamshy](https://www.igamingsuppliers.com/vendor/gamshy/) Rome, Italy Category: Casino Software |
| 172 | [Gamtec International Ltd](https://www.casinovendors.com/vendor/gamtec-international-ltd/) Denham, England, United Kingdom Gamtec Ltd. was established in 1986 with the purpose of bringing new technology and innovative concepts to the casino market. Our patented casino cash recorder set a new benchmark in MIS. This was further enhanced when Grips of Austria purchased the rights and produced the... Categories: Chips, Synthetic Gaming Layouts, Equipment, Accessories, Blackjack Tables, Equipment |
| 173 | [Gamucci Ltd.](https://www.casinovendors.com/vendor/gamucci-ltd/) Soho, England, United Kingdom Category: Specialty Items |
| 174 | [Gamzix](https://www.igamingsuppliers.com/vendor/gamzix/) Birkirkara, Malta Gamzix is a Maltese game provider that delivers vibrant slot games and scalable solutions. The providers signature Hold the Spin mechanic has become a player favorite, known for keeping the thrill going round after round. Category: Casino Software |
| 175 | [GAN - GameAccount Network](https://www.igamingsuppliers.com/vendor/gan-gameaccount-network/) London, England, United Kingdom GameAccount Network is the leading network of skill-based games where players compete against each other, not the house. For several years weve been looking beyond poker to identify and supply the worlds leading operators with a suite of games which appeal to and excite ga... Categories: Skill Games Software, Casino Software, Platform Providers, Gambling Operations |
| 176 | [Ganapati PLC](https://www.igamingsuppliers.com/vendor/ganapati-plc/) London, England, United Kingdom Bringing a new edge to iGaming, Ganapati is an established multinational company with a reputation for compelling and immersive content uniquely borne out of both Europe and Asia. Effectively implementing strategic sport sponsorship and brand opportunities, Ganapati consider... Category: Casino Software, Mobile Gaming |
| 177 | [Gander Group](https://www.casinovendors.com/vendor/gander-group/) Costa Mesa, California An Inc. 5000 company, Gander Group partners with internationally recognized brands and hundreds of casinos across America to provide trend-forward product development and merchandising solutions. Category: Promotions, Market Research and Development |
| 178 | [Ganlot, inc.](https://www.casinovendors.com/vendor/ganlot-inc/) New Taipei City, Taiwan Ganlot's range of industrial gaming boards includes specific function which is specifically designed for gaming application such as casino slot games, EGM, Roulette, VLT and AWP. Our core value is to offer the widest and flexible selection of industrial grades products inclu... Categories: Manufacturing, Circuit Board Assembly, Consulting |
| 179 | [Ganz Security / CBC Americas Corp.](https://www.casinovendors.com/vendor/ganz-security-cbc-americas-corp/) Cary, North Carolina Ganz Security by CBC is a global leader in the design, development and manufacture of world-class, trend setting security solutions. The Ganz brand offers integrated solutions across multiple market segments and includes an extensive selection of products including IP and an... Category: CCTV Systems |
| 180 | [GAO Engineering Inc.](https://www.casinovendors.com/vendor/gao-engineering-inc/) Toronto, Ontario, Canada GAO Engineering Inc. is a single stop resource for quality, market-proven products including GAO ICE's, Flash Programmers, Universal Programmers, Emulators, DSP and Microprocessor Evaluation Boards, Embedded Linux Boards, FPGA+Linux Boards, ARM IDE's, Software Development Ki... Category: Software Development |
| 181 | [GaoXin Modern Intelligent System Co., Ltd](https://www.casinovendors.com/vendor/gaoxin-modern-intelligent-system-co-ltd/) Shenzhen, China Established in 1993, Gaoxin Modern Intelligent System Co., Ltd (GXMIS for short) is one of the world's leading turnkey solution provider of automated fare collection systems for public transport including bus, bus rapid transit, light rail, commuter rail, heavy rail, ferry a... Category: Access Control, Kiosks |
| 182 | [GAR Products](https://www.casinovendors.com/vendor/gar-products/) Lakewood, New Jersey GAR Products® is a family owned and operated corporation specializing in quality seating, table tops, and table bases for all levels of the hospitality and design industries. Founded in 1956 by Morris H. Garfunkle (Mr. GAR), GAR Products®, now entering its third generation o... Categories: Restaurant, Bases, Casino |
| 183 | [Garavelli Enterprises, Inc.](https://www.casinovendors.com/vendor/garavelli-enterprises-inc/) Memphis, Tennessee Garavelli Enterprises, Inc. is a woman owned, small business, manufacturer and supplier. Airport Seating Alliance is a division that supplies high quality public seating and custom power charging solutions to international and regional airports, transportation centers, gove... Category: Benches |
| 184 | [Gardenia Software Systems, Inc.](https://www.casinovendors.com/vendor/gardenia-software-systems-inc/) Milford, Ohio Gardenia Software Systems was founded in June, 1989 for the purpose of developing and licensing PC-based software solutions to help streamline cash and document processing operations for enterprises handling large sums of cash and other media types in the gaming, banking, an... Category: Cash Processing, Consulting |
| 185 | [Garfinkel Publications](https://www.casinovendors.com/vendor/garfinkel-publications/) Vancouver, British Columbia, Canada Over 20 years experience of working with Native art and artists. We offer an extensive variety of different products, and maintain quality and affordable pricing. We can provide custom services, name drops, and work with our images or your logo. Category: Wearables |
| 186 | [GarJen Corp](https://www.casinovendors.com/vendor/garjen-corp/) Bonney Lake, Washington At GarJen Corp we are in the business of developing promotional products that are designed to create a positive product experience, create a positive word of mouth buzz and designed to keep your casino and bingo hall name in front of your players every day. Over 30 years of... Category: Promotional Items |
| 187 | [Garland Writing Instruments](https://www.casinovendors.com/vendor/garland-writing-instruments/) Coventry, Rhode Island Garland celebrates 80 years of manufacturing quality writing instruments. Our USA-Made Photo Logo Writing Instruments are highly recognizable by Garland's patented flared top design, which can showcase any full-color logo or image. Garland's complete product line includes ... Categories: Specialties, Promotional Items, Promotions, Promotions, Lapel Pins, Incentives and Awards, Recruitment, Training, General, Seminars: Employee Relations, Gift Merchandise, Souvenirs |
| 188 | [Garment Machinery Company](https://www.casinovendors.com/vendor/garment-machinery-company/) Needham, Massachusetts We are New England's Oldest Commercial Laundry Equipment Distributor, since 1939. We sell, install, and service most brands. We are always eager to earn the business. Category: Laundry Equipment |
| 189 | [Garner Holt Productions, Inc.](https://www.casinovendors.com/vendor/garner-holt-productions-inc/) San Bernardino, California Garner Holt Productions is known for outstanding design and manufacture of animatronic figures, museum quality static animals, animated props, show action equipment, sets and scenery, and also Creative Design. Clients include Mohegan Sun, Caesars, McDonalds, and Disney park... Category: Animation and Animatronics |
| 190 | [Garrett Leather Corp.](https://www.casinovendors.com/vendor/garrett-leather-corp/) Buffalo, New York Garrett Leather is a wholesale distributor of Italian upholstery leather. Over 500 colors are available for immediate shipment. Most orders ship within 24 hours of purchase. Designers may also order custom leather area rugs, made from Garrett's leather, steerhide, wovens, b... Category: Fabrics, Other |
| 191 | [Garrett Metal Detectors](https://www.casinovendors.com/vendor/garrett-metal-detectors/) Garland, Texas Garrett Metal Detectors offers you the best products and training that you need to run an effective security checkpoint. From airports and prisons to public venues and nightclubs, our hand-held, walk-through and ground search metal detection products meet the most stringent ... Category: Monitoring |
| 192 | [Garrison Flood Control Systems, LLC.](https://www.casinovendors.com/vendor/garrison-flood-control-systems-llc/) New York, New York Garrison™ Flood Control is a New York-based manufacturer and distributor of a complete line of flood control products that help prevent, mitigate and combat flood damage using a series of economical flood control products. Garrison products prevent, contain, divert, and re-r... Category: Engineering |
| 193 | [Garron Lottery Products, Inc.](https://www.casinovendors.com/vendor/garron-lottery-products-inc/) Baltimore, Maryland Category: Drawing Equipment |
| 194 | [Garuda Promo & Branding Solutions](https://www.casinovendors.com/vendor/garuda-promo-branding-solutions/) Los Angeles, California Garuda Promo and Branding Solutions are led by a team of skilled professionals with years of experience in promotional items, advertising specialties. Together with a sourcing platform of over 3500 vendor partners, we have manufacturing capabilities that cover any custom pro... Categories: Promotional Items, Coin Melting, Exhibit Supplies, Specialty Items, Personal Protection Equipment, Personal Protection Equipment |
| 195 | [Gary Green Gaming](https://www.casinovendors.com/vendor/gary-green-gaming/) Boca Raton, Florida Well-known casino industry luminary; star of the television series "CASINO INSIDER"; author of several books on the industry. One of the industry's most publicized and successful track records of development, finance, and management using our copyrighted and patented oper... Categories: Consulting, Consulting, Continuity Programs, Other |
| 196 | [Gary Panks Associates](https://www.casinovendors.com/vendor/gary-panks-associates/) Scottsdale, Arizona Category: Architecture, Landscape |
| 197 | [Gary Platt Manufacturing, LLC](https://www.casinovendors.com/vendor/gary-platt-manufacturing-llc/) Reno, Nevada Every Gary Platt chair is hand-crafted to perfect the player gaming experience through Unsurpassed Comfort. With over 40 years in delivering state-of-the-art ergonomically sculpted seating, the new generation of X2-Tended play seating continues to push the bounds of excellen... Categories: Casino, Benches, Other, Furniture Manufacturer, Casino, Slot Stools |
| 198 | [Gary Taylor Creative Group](https://www.casinovendors.com/vendor/gary-taylor-creative-group/) Los Angeles, California Why the Gary Taylor Creative Group? We offer 15 years of unparalleled service along with award winning work that builds brands and drives sales. We have valuable casino and event marketing experience working with The Venetian resort in Las Vegas. Our clients success is what... Category: Full Service Agency |
| 199 | [GasanMamo Insurance](https://www.igamingsuppliers.com/vendor/gasanmamo-insurance/) Gzira, Malta Category: Other |
| 200 | [Gaspar's Fine Architectural](https://www.casinovendors.com/vendor/gaspar-s-fine-architectural/) North Hollywood, California Gaspar's Fine Architectural Metal Works is a manufacturing company with an old world craftsman heritage and a vision for the future. We specialize in architectural exterior and interior elements, as well as unique furniture parts, fabricated by hand in copper, brass, and she... Category: Interior Design |
| 201 | [Gasser Chair Company, Inc.](https://www.casinovendors.com/vendor/gasser-chair-company-inc/) Youngstown, Ohio A Million Ways to Dazzle. Most chairs are designed to fill a space. Gasser chairs are designed to elevate it. For more than 70 years weve been designing, building and perfecting the art of commercial seating, using only the highest quality materials. When you buy a Gasser ... Categories: Casino, Slot Stools, Restaurant |
| 202 | [Gassis Energy](https://www.casinovendors.com/vendor/gassis-energy/) Atlantic City, New Jersey From 1970 until today, our family business has grown into a recognized and well respected company that has served New Jersey with pride and respect. We have constructed homes and also have built and managed major projects in New Jersey, Pennsylvania and New York. We provide ... Category: General Contracting |
| 203 | [GastonRed Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/gastonred-affiliates/), Malta Category: Affiliate Programs |
| 204 | [Gate To Wire Solutions, Inc.](https://www.casinovendors.com/vendor/gate-to-wire-solutions-inc/) Toronto, Ontario, Canada Gate To Wire Solutions, Inc. (G2W) is a comprehensive service provider and advisory organization to horse racing and pari-mutuel wagering interests in Latin America, comprised of seasoned industry executives whose combined experience is being re-focused on the Latin American... Categories: Wagering, Simulcast Systems, Consulting |
| 205 | [Gates Capital Management](https://www.casinovendors.com/vendor/gates-capital-management/) New York, New York Category: Consulting |
| 206 | [Gateway Digital](https://www.igamingsuppliers.com/vendor/gateway-digital/) Zoetermeer, Netherlands - Experience of working with one of the top 3 iGaming companies - Registered vendor in the New Jersey Division of Gaming Enforcement - Enterprise - Excellent price-to-quality ratio of game development - Innovation and adaptation of latest technologies - Team of QA engine... Category: Software Development |
| 207 | [Gateway FS Construction Services](https://www.casinovendors.com/vendor/gateway-fs-construction-services/) Red Bud, Illinois Gateway FS Construction Services is a leader in the southern Illinois counties of Monroe, Randolph, Clinton, Washington, Perry and St. Clair providing construction service to customers for over 40 years in the areas of Grain Drying and Aeration Systems including Sukup, Shivv... Category: General Contracting |
| 208 | [Gaudium](https://www.casinovendors.com/vendor/gaudium/) Olomouc, Czech Republic Recruitment agency Category: Recruitment |
| 209 | [Gayle Force Enterprises](https://www.casinovendors.com/vendor/gayle-force-enterprises/) Westlake Village, California Gayle Force is one of the leading talent buyers in the competitive casino entertainment market. The service we provide is so much more than a typical talent-buyer for a casino role, including assistance with marketing, venue management and ticketing. We provide our clients w... Category: Talent Buying, Production |
| 210 | [GBE Technologies (gbet)](https://www.igamingsuppliers.com/vendor/gbe-technologies-gbet/) Dublin, Ireland GBE Technologies was established in 1999 with a goal to develop a global exchange platform for the trading of sports bets. Gbet has built its technology around a networked Broker-Exchange model, and it licences its broker software platform to gaming operators globally. Th... Category: Gambling Operations, Betting Exchange Software |
| 211 | [GBGroup](https://www.igamingsuppliers.com/vendor/gbgroup/) Chester, England, United Kingdom GBGroup combines individual identity data with technology to provide our clients with the Identity Intelligence they need to make good business decisions based on trust. Category: Security and Fraud |
| 212 | [GBL LED Lighting Inc](https://www.casinovendors.com/vendor/gbl-led-lighting-inc/) Vancouver, British Columbia, Canada With over 10 years designing & manufacturing quality LED bulbs for the Gaming and Casino market, we can bring a vibrant atmosphere to your Space. Long OEM and Private Label history! Category: LED |
| 213 | [GBL](https://www.igamingsuppliers.com/vendor/gbl/) Kitchener, Ontario, Canada Since 2014, we've helped the iGaming industry capitalize on the rapidly growing digital currency market. We recognized the need to help operators improve their payment efficiency and also lower the overall time and cost of processing a transaction through the use of Bitcoin.... Category: Software, Platform Providers |
| 214 | [GBS Linens](https://www.casinovendors.com/vendor/gbs-linens/) Anaheim, California We have been in business for over 20 years providing table linens and laundry services to the Special Events and Food Industry. As a manufacturer, we offer a quick turnaround on purchases and we boast one of the largest rental inventories in our industry. Our linens are de... Category: Table Linens |
| 215 | [GC Gaming Curacao](https://www.casinovendors.com/vendor/gc-gaming-curacao/) Willemstad, Colorado Curacao has long been recognized as one of the preferred locations for eGaming operators to base their operations. This success has been due to a combination of factors, such as a progressive legislative system, political stability, first rate telecommunications facilities a... Categories: Mobile Gaming, Compliance, Hosting, Business Brokers, Tokens |
| 216 | [GCM Partner](https://www.financeaffiliateprograms.com/affiliate-program/gcm-partner/) Category: Affiliate Programs |
| 217 | [GD'Tronics](https://www.casinovendors.com/vendor/gd-tronics/) Keratsini - Piraeus, Greece We design and market professional monitors for non-stop operation ranging from open frame to multimedia monitors. Applications of our monitors include information kiosks, public information displays, gaming & gabling machines. Category: Monitors, Open Frame |
| 218 | [GE Interlogix, Kalatel Division](https://www.casinovendors.com/vendor/ge-interlogix-kalatel-division/) Corvallis, Oregon Meeting your security needs - As the need to protect people and property continues to increase, GE Interlogix keeps pace with innovations in security technology. Because we are part of GE, we have the resources of one of the largest companies in America behind us. We put t... Categories: Digital Video Recorders, Multiplexers, CCTV Systems, High-speed Domes, Pan and Tilt Devices, Digital Video Management Systems, Video Multiplexers |
| 219 | [Gear for Sports](https://www.casinovendors.com/vendor/gear-for-sports/) Lenexa, Kansas Gear For Sports is a leading national manufacturer of customized sportswear apparel. Graphics are designed with the individual client's needs in mind. The company provides low minimums and fast turnarounds. Categories: Luggage, Logoed, Promotional Products, Apparel, Logoed |
| 220 | [Geding Information Inc](https://www.casinovendors.com/vendor/geding-information-inc/) Dongguan, Guangdong, China Company established in October, 1982 started with business of setting up security surveillance system and CCTV system engineering projects. In 1994 for expansion, company started running agency business, importing and selling the reed switches and electronic components and p... Categories: Position Sensors, Position Sensors, Position Sensors, Position Sensors |
| 221 | [Geeks of Technology](https://www.casinovendors.com/vendor/geeks-of-technology/) Hollywood, Florida Well-rounded, Florida-based technology expert integrator, providing the gaming industry with Design and Installation services for AudioVisual Systems, Lighting and Climate Controls, Motorized Windows Treatments, Touch Panel Controls, Automation and IT Services. Categories: Controls, Design, Audio Systems, Integration Services, Networking, Communication Systems, Networking Equipment |
| 222 | [Gefim Sas](https://www.casinovendors.com/vendor/gefim-sas/) Misinto, Michigan GEFIM offers electronice machines entirely made by painted steel, chrome or gold plated provided with the most important mechanical security that is very reliable. We have 10 years experience in planning and construction of game machines. Besides, each machine, thanks to its... Category: Bases-Cabinets-Stands (Metal) |
| 223 | [Gehl's Guernsay Farms Incorporated](https://www.casinovendors.com/vendor/gehl-s-guernsay-farms-incorporated/) Germantown, Wisconsin Gehls Guernsey Farms offers a full ine of cheese sauces, chili sauce, hassle-free dispensers for sauce and tortilla chips. Puddings and Main Street Cafe Iced Lattes are also offered. Category: Other |
| 224 | [Geiger Automatenbau GmbH](https://www.casinovendors.com/vendor/geiger-automatenbau-gmbh/) Sonthofen, Germany Geiger is one of the leading supplier for spare parts and accessories in Europe with more than 30 years experience in our branch. We offer you a wide range of items, but we are also concentrated on the token market. We are one of the worlds leading companies for high securit... Category: Tokens |
| 225 | [Gemified](https://www.igamingaffiliateprograms.com/affiliate-program/gemified/) Bnei Brak, Israel Gemified is more than a Publisher network - we're a performance engine tailored for the sweepstakes iGaming space. Founded by marketers and engineers who've scaled Publisher empires, we're here to bring a new level of intelligence to user acquisition. Category: Affiliate Programs |
| 226 | [Gemini 2000 Ltd](https://www.casinovendors.com/vendor/gemini-2000-ltd/) Poole, England, United Kingdom Since 1997, Gemini 2000 has had the opportunity to pioneer the NFC technology market and provide bookmakers with top-of-the-range products for numerous smart card applications. Over the years we have become established as a leading UK-based manufacturer, developing innovativ... Category: Smart Card Systems |
| 227 | [Gemini Gaming LLC of Nevada](https://www.casinovendors.com/vendor/gemini-gaming-llc-of-nevada/) Las Vegas, Nevada Backed by a group of used slot machine parts warehouses, Gemini Gaming offers a large variety of quality, used, and tested slot machine parts for business or personal use. We accept large or small orders and are experts at finding those hard to locate items. Category: Parts, TITO Tickets |
| 228 | [Gemini Technologies](https://www.casinovendors.com/vendor/gemini-technologies/) Tecumseh, Michigan Category: Janitorial Equipment and Supplies |
| 229 | [GemPartner](https://www.igamingaffiliateprograms.com/affiliate-program/gempartner/) Category: Affiliate Programs |
| 230 | [GemSlots Partners](https://www.igamingaffiliateprograms.com/affiliate-program/gemslots-partners/) Category: Affiliate Programs |
| 231 | [Gemsys Money Handling Systems Inc.](https://www.casinovendors.com/vendor/gemsys-money-handling-systems-inc/) Mississauga, Ontario, Canada Gemsys Money Handling Systems Inc. supports a highly comprehensive product line of coin, currency, token, and ticket equipment and systems. We are committed to a leadership role in providing all clients with the best equipment backed by quality after sales service and suppor... Categories: Currency Handling Equipment, Coin Handling Equipment, Counterfeit Detectors, Chip Handling, Coin Dispensing, Scales, Cash Storage Equipment, Coin Wrapping, Accessories, Banking and Cashier Supplies, Bill Validator Cleaning Cards, Bill Validators, Cash Processing, Cash Processing, Consulting, Coin Bags, Coin Redemption, Self-service, Hard Count, Plastic Bags, Soft Count, Supplies, Other, Specialty Items |
| 232 | [Genera Networks](https://www.casinovendors.com/vendor/genera-networks/) Stockholm, Stockholms, Sweden Genera Networks is an independent and neutral gaming solution provider with no direct or indirect connection to cross-border operators. We aggregate the most successful products, technology and content, all to fit your specific needs. Categories: Electronic Systems, Other, Slot Machines, Bingo Software, Casino Software, Poker Software, Racebook Software |
| 233 | [General Bank Supply, Inc.](https://www.casinovendors.com/vendor/general-bank-supply-inc/) Troy, Michigan General Bank Supply has been serving its customers for over 60 Years! We offer personalized customer service providing quality products and a commitment to customer satisfaction. Category: Banking and Cashier Supplies |
| 234 | [General Coatings Corporation](https://www.casinovendors.com/vendor/general-coatings-corporation/) Orange, California General Coatings Corporation is a family owned painting company with offices in San Diego & Orange County specializing in customer service. Category: Other |
| 235 | [General Link (GLIC)](https://www.casinovendors.com/vendor/general-link-glic/) City of Industry, California General Link was funded in 2004 and supplies LED lighting, LED displays, LED boards. We have a showroom and warehouse in Los Angeles, which offers full technical supports to our customers in America, south America and North America. Our products are assembled in China. Th... Category: LED Systems |
| 236 | [General Roof Management](https://www.casinovendors.com/vendor/general-roof-management/) Sacramento, California General Roof Management is an independent roof consulting firm serving clients throughout Nevada and California. We have 25 years experience in our industry. From leak investigation on a single building to full roof management programs on an entire building inventory, we of... Category: Consulting |
| 237 | [General Seating Solutions](https://www.casinovendors.com/vendor/general-seating-solutions/) South Windsor, Connecticut General Seating Solutions (GSS) is a world-class manufacturer of restaurant booths, banquettes, benches, chairs and sofas for the foodservice and hospitality industries. Category: Restaurant, Benches |
| 238 | [General Security Services Corp.](https://www.casinovendors.com/vendor/general-security-services-corp/) Minneapolis, Minnesota Category: Other, Other |
| 239 | [General Touch Co., Ltd.](https://www.casinovendors.com/vendor/general-touch-co-ltd/) Chengdu City, Sichuan, China General Touch has been a leading touch solutions provider in the global marketplace for more than 20 years. By putting the customers interest first, GT consistently offers exceptional customer experience and satisfaction through its wide variety of touch technologies and so... Categories: Monitors, Open Frame, Monitors, Open Frame, Monitors, Touchscreens, Touchscreens, Touchscreens, Touchscreens, Touchscreens |
| 240 | [General Vending Services, Limited (GVS)](https://www.casinovendors.com/vendor/general-vending-services-limited-gvs/) Horley, England, United Kingdom General Vending Services is a specialist supplier of tea and coffee vending machines, food and snack vending machines, table top vending machines and water coolers. GVS has been providing total vending support for its clients since the 1920s. GVS provides unsurpassed custo... Category: Vending Machines, Dispensers |
| 241 | [GenerationWeb](https://www.igamingsuppliers.com/vendor/generationweb/) Categories: Sportsbook Software, Racebook Software, Mobile Gaming |
| 242 | [Generator Source, LLC](https://www.casinovendors.com/vendor/generator-source-llc/) Brighton, Colorado Generator Source, formerly Diesel Service & Supply, has been buying, servicing, and selling new, surplus, and used industrial diesel engines and electric power generators for over 30 years. You will always get a competitive price for your equipment, but you'll also be deali... Category: Materials |
| 243 | [Genesis Air](https://www.casinovendors.com/vendor/genesis-air/) Lubbock, Texas Genesis Air is the manufacturer of indoor air quality systems. Using G.A.P. technology, we can help reduce your overall operating costs. G.A.P. is dedicated to the removal of smoke, bacteria, particulate matter and the disinfection of your indoor air. Any of our systems can ... Category: Air Filtration Systems |
| 244 | [Genesis Associates](https://www.casinovendors.com/vendor/genesis-associates/) Santa Ana, California Genesis Associates has been providing complete design services to many of the largest casino companies in the world such as the Mandalay Resort Group, MGM Grand, Penn National Gaming, and has been used as a source to forecast the future trends of casino design. Over the past... Categories: Design, Design, Native American, Interior Design, Interior |
| 245 | [Genesis Games Limited](https://www.casinovendors.com/vendor/genesis-games-limited/) Chesham, England, United Kingdom Genesis is a company at the cutting edge of technology, providing broadband, techno-efficient e-solutions for all coin operated entertainment machines requirements. Our extensive knowledge base with 50 years experience between our partners gives us the ability to understand... Categories: Slot Machines, Equipment, Software |
| 246 | [Genesis Gaming Solutions, Inc.](https://www.casinovendors.com/vendor/genesis-gaming-solutions-inc/) Spring, Texas Genesis Gaming Solutions, Inc develops software and hardware for casion management and player tracking systems. Category: Software |
| 247 | [Genesis Gaming, Inc. (GGI)](https://www.igamingsuppliers.com/vendor/genesis-gaming-inc-ggi/) Henderson, Nevada Genesis Gaming, Inc. is based in Las Vegas, Nevada and is a content development company with extensive and diversified gaming experience. Our team has been a key supplier of third party content to the most prominent manufacturers in the gaming industry. We are experienced in... Category: Casino Software |
| 248 | [Genesis Recycling Ltd.](https://www.casinovendors.com/vendor/genesis-recycling-ltd/) Aldergrove, British Columbia, Canada We at Genesis Recycling provide electronic recycling to the gaming industry. We have a very high level of security for the safe demanufacturing of all gaming equipment. We recycle all materials in an environmentally sound manor. We are certified under ISO 9001 and 14001. We ... Category: Parts |
| 249 | [Genesys One Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/genesys-one-affiliates/) Genesys Affiliates offers your players HD quality games along with an incentive program for your VIP players. You will benefit from flexible and highly competitive commission deals tailored to the market and customer segment which you are promoting; customized acquisition ca... Category: Affiliate Programs |
| 250 | [Genetec Inc.](https://www.casinovendors.com/vendor/genetec-inc/) Saint Laurent, Quebec, Canada Genetec is a pioneer in the physical security and public safety industry and a global provider of world-class IP video surveillance, access control and license plate recognition (LPR) solutions to markets such as transportation, education, retail, gaming, government and more... Category: Other |
| 251 | [Genieee](https://www.casinovendors.com/vendor/genieee/) Pune, Mahārāshtra, India One of the Top HTML5 Game Development Company in India. Being the top game development company in India, Genieee provides best HTML5 game development services. With our creative and fun oriented game development experience we are able build more than 1000+ html5 games for mu... Category: Mobile Gaming, New Game Manufacturer |
| 252 | [Genii Limited](https://www.igamingsuppliers.com/vendor/genii-limited/) San Gwann, Malta Genii is a gaming technology provider focused on building the next generation online gaming platform. The company is steered by a team of entrepreneurs that have led the field, both in the business of gaming and technological innovation, since the 1990s. Genii is founded ... Categories: Gambling Operations, Casino Software, Mobile Gaming |
| 253 | [GenioBet Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/geniobet-affiliates/) Category: Affiliate Programs |
| 254 | [Genius Sports](https://www.igamingsuppliers.com/vendor/genius-sports/) London, England, United Kingdom Founded in 2001, Genius Sports is one of the worlds largest sports technology companies. Category: Sportsbook Software |
| 255 | [Genlot Game Technology co.,Ltd](https://www.casinovendors.com/vendor/genlot-game-technology-co-ltd/) Shenzhen, China Since 2000, Genlot has established itself as a leading provider of compelling solutions to the global gaming industry. With a proven product portfolio encompassing all key gaming verticals, Genlot specializes in the development and deployment of leading-edge bespoke gaming s... Category: Other |
| 256 | [GennaGroup S.R.L.](https://www.casinovendors.com/vendor/gennagroup-s-r-l/) San Mango Piemonte, Campania, Italy The GennaGroup is founded in 2002 as satellite company of the GennaGiochi to improve the functions of import-export and distribution of spare parts for the assembly and the aid to the customers. Despite the recent such a constitution company makes use of the professionalism ... Categories: Amusement Equipment, Coin Dispensing, Parts, Magnetic Counters, Parts, Power Sources, Other, Components, Manufacturing, LED, Lamps and Lamp Shades, Coin Dispensing, Monitoring, Locks, Spotlight Lamps, LED Systems, Other |
| 257 | [GenPrime, Inc.](https://www.casinovendors.com/vendor/genprime-inc/) Spokane, Washington Determine in 5 minutes if an unknown powder is a credible threat or a harmless hoax. The Prime Alert Biodetection/Threat Verification System is the only first response tool that combines a broad Microbe Screen with Ricin and Botulinum Toxin Screens to provide the most compre... Category: Other |
| 258 | [Gentec Technologies Ltd.](https://www.casinovendors.com/vendor/gentec-technologies-ltd/) Calgary, Alberta, Canada Category: Consulting |
| 259 | [Gentex Corporation](https://www.casinovendors.com/vendor/gentex-corporation/) Zeeland, Michigan Category: Alarms |
| 260 | [Genwac, Inc. (WATEC)](https://www.casinovendors.com/vendor/genwac-inc-watec/) Orangeburg, New York Category: Other |
| 261 | [GeoComply Ltd](https://www.igamingsuppliers.com/vendor/geocomply-ltd/) Henderson, Nevada GeoComply offers regulators and operators a reliable, secure and user-friendly solution for the Geolocation of online users. Focusing on the regulated iGaming and broadcasting industries, GeoComply works closely with its customers to harness cutting edge technology to serve ... Category: Geolocation Services |
| 262 | [Geoffrey Parker Games Ltd](https://www.casinovendors.com/vendor/geoffrey-parker-games-ltd/) Saffron Walden, England, United Kingdom Regarded as the finest maker of traditional board games, including luxury World Championship backgammon, chess, bridge, home casino games and licensed parlour games such as Monopoly, Trivial Pursuit, Scrabble and Cluedo. Fine games tables in beautiful marquetry inlaid woods,... Category: Promotional Items |
| 263 | [Georgia Carpet Industries](https://www.casinovendors.com/vendor/georgia-carpet-industries/) Dalton, Georgia As a rising leader in the Hospitality Flooring Industry, Georgia Carpet Industries knows that color and design make the room. By offering the latest styles and patterns and a complete line of Flooring for the Hospitality Industry your entire property will look beautiful. Our... Category: Carpets, Flooring |
| 264 | [Georgia Case Company](https://www.casinovendors.com/vendor/georgia-case-company/) Tucker, Georgia We are an original equipment manufacturer offering our services directly to the gaming industry. We sell at a wholesale level direct to end users, and provide a low cost, no risk solution to industry requirements. Categories: Packaging Material, Scenery and Set Design, Other, Services |
| 265 | [Georgia Expo Manufacturing Corporation](https://www.casinovendors.com/vendor/georgia-expo-manufacturing-corporation/) Norcross, Georgia Georgia Expo is your one stop shop for all your casino floor needs! We're the largest manufacturer of Pipe & Drape in the United States! In addition we provide Exhibit Products to turn any event into something extraordinary. Adjustable Height Expo Tables, Table skirting, cro... Categories: Exhibits, Exhibit Supplies, Exhibits |
| 266 | [Georgia Pacific Professional](https://www.casinovendors.com/vendor/georgia-pacific-professional/) Atlanta, Georgia Category: Janitorial Equipment and Supplies |
| 267 | [Georgia Stage, LLC](https://www.casinovendors.com/vendor/georgia-stage-llc/) Duluth, Georgia Georgia Stage, LLC is a leader in Theatrical Curtains and Fabrics, Pipe & Drape, Track and Rigging. We are committed to providing our customers with the highest quality products and services and to keeping the hand crafted look and feel we have come to be known for since 199... Category: Stage Equipment, Display Systems |
| 268 | [Georgia Steel Entertainment](https://www.casinovendors.com/vendor/georgia-steel-entertainment/) Toronto, Ontario, Canada Georgia Steel Entertainment provides Vintage Music shows Featuring Georgia Steel a popular musical entertainer in the Toronto area. Her mother Ivy Steel an acclaimed Jazz vocalist supported her start in the Jazz classics. Georgia's compelling vocal performances are mesmeriz... Category: Music Production |
| 269 | [GeoVision](https://www.casinovendors.com/vendor/geovision/) Irvine, California GeoVision is the leading provider of digital surveillance with specialization in video enhancement analytics and integrable solutions including NVR, IP Camera, CMS, Access Control and Loss Prevention. With more than 9 million GeoVision channels sold to over 100 countries, we... Category: CCTV Systems |
| 270 | [Germisept](https://www.casinovendors.com/vendor/germisept/) Newport Beach, California Germisept is a family-owned brand founded on the pursuit of passion and innovation. Our mission is deeply rooted in quality, providing amazing value to our customers and community. We have grown and continue to evolve through constant leading-edge products, thus enabling our... Category: Hand Sanitizer |
| 271 | [Germstar/Soaptronic](https://www.casinovendors.com/vendor/germstar-soaptronic/) Lake Forest, California Category: Hygiene Products |
| 272 | [Geron Associates](https://www.casinovendors.com/vendor/geron-associates/) Markham, Ontario, Canada Category: Exhibits |
| 273 | [GES Holiday Retail (formerly Becker Group)](https://www.casinovendors.com/vendor/ges-holiday-retail-formerly-becker-group/) Baltimore, Maryland For over half a century, Becker Group (now GES) has produced award-winning, cost effective display and exhibit solutions for casinos, hotels, resorts, shopping centers and commercial properties, transforming every type of commercial property into stunning destinations. Categories: Holiday, Christmas, Other, Multi-media Productions, Interior |
| 274 | [GESI Hospitality](https://www.casinovendors.com/vendor/gesi-hospitality/) Astoria, New York Category: Locks |
| 275 | [Get Green Recycling Corp](https://www.casinovendors.com/vendor/get-green-recycling-corp/) Aurora, Illinois Every Casino has different metal ingredients for their gaming tokens, prices vary upon the precious metals contained in the weighted tokens, a sample token given to us will determine the recovery value you will receive. Get Green Recycling is your simple, secure solution... Category: Coin Melting, Coin Melting |
| 276 | [Get Maine Lobster](https://www.casinovendors.com/vendor/get-maine-lobster/) Portland, Maine At Get Maine Lobster, we create the modern culinary adventures that bring the allure of the ocean right to your door. We know that the freshest seafood deserves to be much more than a meal...it should be an experience. From meaty, deep-water Maine lobsters to sweet diver sca... Category: Seafood |
| 277 | [Get Noticed Advertising](https://www.casinovendors.com/vendor/get-noticed-advertising/) Boulder City, Nevada Get Noticed has been in business since 1995 and has proven to be one of the top companies in the advertising and promotion industry here in Las Vegas. With attention to detail and excellent customer service Get Noticed will always get the job done right. Category: Specialties |
| 278 | [Get The Picture, LLC](https://www.casinovendors.com/vendor/get-the-picture-llc/) Lincoln, Rhode Island We work with several Fortune 500 companies, hospitals, and educational institutions and have earned their business and trust. As the area's only award winning certified picture framer, we have the expertise to get it done right. Category: Art, Moldings |
| 279 | [GeWeTe GmbH & Co. KG](https://www.casinovendors.com/vendor/gewete-gmbh-co-kg/) Mechernich, Germany For every need, the perfect solution with this claim GeWeTe cash handling technology near Cologne (Germany), develops for over 18 years compelling solutions for high-quality money changing systems. GeWeTe covers the entire spectrum: from mini-changer WGS 102 to the high-en... Category: Cash Handling Equipment |
| 280 | [GFInteriors](https://www.casinovendors.com/vendor/gfinteriors/) City of Industry, California We manufacture our own product and our prices do not reflect our high standard of design and make but are very competitive.We have tables with semiprecious stones and marble in neo baroque and contemporary style. Category: Furnishings |
| 281 | [GFM Holdings Limited](https://www.casinovendors.com/vendor/gfm-holdings-limited/) Colchester, England, United Kingdom GFM: Promotional Marketing, Online Games and Marketing Services. Categories: Other, Promotions, Promotions |
| 282 | [GG.bet Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/gg-bet-affiliates/) Willemstad, Curaçao GG.BET was developed by eSports enthusiasts and former professionals. Our goal is to create an intuitive and convenient platform for betting on all major eSports events in the world. On GG.BET you can always quickly and easily place a bet on your favorite team. Our cash o... Category: Affiliate Programs |
| 283 | [GGPartners](https://www.igamingaffiliateprograms.com/affiliate-program/ggpartners/) Category: Affiliate Programs |
| 284 | [GGR Partners](https://www.igamingaffiliateprograms.com/affiliate-program/ggr-partners/) Category: Affiliate Programs |
| 285 | [GGRSOFT](https://www.igamingsuppliers.com/vendor/ggrsoft/) Vilnius, Lithuania Decades of experience have given us safe to say PhDs in iGaming. We know the pain, and we know the gain. The challenges and opportunities within the industry excite us. As a forward-thinking iGaming company, were equipped to navigate the complexities and deliver abnorma... Categories: Licensing and Regulation, Consulting, Platform Providers, Gambling Operations |
| 286 | [GHA Technologies](https://www.casinovendors.com/vendor/gha-technologies/) Huntington Beach, California GHA Technologies, Inc. provides computer reselling and systems integration services. It sells various Internet, bandwidth, security, VoIP, wireless, video, and identification technologies specializing in customizing file servers, computers, and laptops, as well as mission-cr... Category: Computer Systems |
| 287 | [Ghirardelli Chocolate Company](https://www.casinovendors.com/vendor/ghirardelli-chocolate-company/) San Leandro, California Celebrating 160 years, Ghirardelli Chocolate continues to hand-select the world's finest cocoa beans and uses only the purest ingredients for our award-winning chocolate. We specialize in beautifully packaged gifts, ideal for VIPs, frequent guests, arrival gifts, promo annou... Category: Chocolate |
| 288 | [Ghost Beads, LLC](https://www.casinovendors.com/vendor/ghost-beads-llc/) Las Vegas, Nevada Category: Jewelry |
| 289 | [GHY Stone](https://www.casinovendors.com/vendor/ghy-stone/) Beijing, Beijing, China When you open this web we guess you are looking for something with special designs and reasonable prices for your home. So you are in right place. GHY basically are a manufacturer and 80% of products showed here can be made to order by ourselves. And we have strong combinati... Category: Materials |
| 290 | [GI Games Co PTE Limited](https://www.casinovendors.com/vendor/gi-games-co-pte-limited/), Singapore GI GAMES CO is a company that specializes in creating state-of-the-art lottery software solutions that redefine the gaming experience. Category: Other |
| 291 | [GI Tech Gaming Co India Private Limited](https://www.igamingsuppliers.com/vendor/gi-tech-gaming-co-india-private-limited/) Chennai, Tamil Nādu, India Thirty Seven years and Counting. That is how long GI Tech Gaming has been working in India and International Market in the lottery business. With a good sense for trends and strategy, GI has the technological edge, young and vibrant team of entreprenuers and professionals wi... Categories: Lottery Software, Sportsbook Software, Mobile Gaming |
| 292 | [Giacona Container Corporation, Inc.](https://www.casinovendors.com/vendor/giacona-container-corporation-inc/) New Orleans, Louisiana Categories: Other, Specialties, Specialties, Gift Merchandise, Souvenirs, Cruise Ship Concesssionaire, Promotions, Promotional Items |
| 293 | [Giant Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/giant-affiliates/) Nicosia, Cyprus THE HIGHEST CONVERTING LOTTO PARTNER PROGRAM Our goal is to continue to lead the iGaming industry as the highest converting lotto affiliate platform. Our sales funnels and telesales team will convert your quality lotto traffic easily. Giant Affiliates is the affiliate... Category: Affiliate Programs |
| 294 | [Giant Bows](https://www.casinovendors.com/vendor/giant-bows/) Norwalk, Connecticut Manufactures giant display bows up to 24 feet wide. Styles: 2-Loops, 4-Loops, 6-Loops, 10-Loops and 16-Loops. Matching giant ribbons up to 5 feet wide. Gift wrap buildings & cars. Weatherproof. Category: Other |
| 295 | [Gibson Graphics Group, Inc.](https://www.casinovendors.com/vendor/gibson-graphics-group-inc/) York, Pennsylvania Gibson Graphics is a full service marketing communications firm with in house print, mail, and fulfillment capabilities. We specialize in direct marketing campaigns, whether large format posters or banners for an in house event or direct mail advertising to your high roller... Categories: Large Format, Billboards, Mailing Services, Printers, Manufacturers |
| 296 | [GIC Management Corporation](https://www.casinovendors.com/vendor/gic-management-corporation/) Pompano Beach, Florida GIC has extensive experience in lotteries and gaming around the world. Our associations with suppliers and vendors allow us to offer the best solutions for all gaming promoters. We have provided services to "Blue Chip" companies and promoters in the business including the fo... Category: Other |
| 297 | [Giesecke & Devrient](https://www.casinovendors.com/vendor/giesecke-devrient/) Dulles, Virginia Giesecke & Devrient (G&D) is an internationally operating technology group with over 156 years of experience and over thirty subsidiaries worldwide. The organization is a leading supplier of currency processing automation systems, vault management software, banknotes and sec... Categories: Currency Handling Equipment, Cash Processing, Consulting, Cash Handling Equipment, Smart Card Systems, Plastic Cards |
| 298 | [Gift Baskets by Kim](https://www.casinovendors.com/vendor/gift-baskets-by-kim/) Los Angeles, California Gift Baskets by Kim offers a distinctive collection of beautiful gift baskets for all your gift giving needs. We offer a number of theme gift baskets from Housewarming Gifts to Wedding gifts and Bridal Gifts. From Newborn baby gift baskets, gift baskets for her and gift bas... Category: Gift Merchandise |
| 299 | [Gift Wonders](https://www.casinovendors.com/vendor/gift-wonders/) Ningbo, Zhejiang, China With an experience of poker chips set, dice, texas hold'em production since year of 1999, we have become one of the largest manufacture in these items. Our production capability is around half million pcs of chips/day quality guranteed. kindly contact us at the info displaye... Category: Poker Chips |
| 300 | [Gift Works Plus](https://www.casinovendors.com/vendor/gift-works-plus/) Waukesha, Wisconsin If you are looking for something truly special, unique and personal, GiftWorksPlus is the perfect place to find it! With our ever-increasing selection of wooden picture frames and new product lines, we are ready to help you find that perfect gift. Whether you're looking f... Category: Other |
| 301 | [Gigaboard Polska](https://www.casinovendors.com/vendor/gigaboard-polska/) Warszawa, Poland We specialize in large-format advertising media, such as superbacklight, and advertising in the prestigious shopping centres. Our company helps the Client find the perfect solution while planning outdoor campaigns. Our experience in this field enables us to offer good advice... Category: Full Service Agency |
| 302 | [Gigadat](https://www.igamingsuppliers.com/vendor/gigadat/) Winnipeg, Manitoba, Canada Gigadat is a team comprised of Canadian payment experts who understand e-merchant needs and requirements, as well as their industry specifics to create a reliable, convenient and secure payments ecosystem, designed to support consumers, e-merchants and financial institutions... Category: Mobile Gaming |
| 303 | [GigaMedia Limited](https://www.casinovendors.com/vendor/gigamedia-limited/) Taipei, Taipei, Taiwan GigaMedia is a diversified provider of online entertainment and broadband services, with headquarters in Taipei, Taiwan. The company develops software for online entertainment services, including the global online gaming market. GigaMedia also operates a major Taiwanese broa... Categories: Software, Other, Software Development |
| 304 | [Gigantic Game Show Give Away](https://www.casinovendors.com/vendor/gigantic-game-show-give-away/) Hoffman Estates, Illinois Gigantic Game Show Give Away™ is a fast moving audience participation show using mostly risk reward games designed to create incremental sales at retail, highlight sponsors, create excitement, and give away valuable prizes. Designed in part, in the style of TV game shows tha... Categories: Theatrical Company, Agency, Production, Promotional Games |
| 305 | [Gilbane Building Company](https://www.casinovendors.com/vendor/gilbane-building-company/) Philadelphia, Pennsylvania Stability...Strength...Experience. Gilbane Building Company has been in the construction business since 1873 and manages over $3 billion of construction annually for our clients. With 28 offices serving owners from coast-to-coast, Gilbane marries the strength of a large na... Category: Consulting |
| 306 | [Gilderfluke & Co., Inc.](https://www.casinovendors.com/vendor/gilderfluke-co-inc/) Burbank, California We manufacture and design show control systems for robotic animation, dynamic fountains, motion platforms, lighting and special effects, modular audio systems, clock/carillons and much more for theme parks, museums, themed restaurants, churches, and airports (to name a few).... Category: Digital Audio Repeater Systems, Animation and Animatronics |
| 307 | [Gills Printing and Color Graphics](https://www.casinovendors.com/vendor/gills-printing-and-color-graphics/) Las Vegas, Nevada Gills has provided forms and color printing and mail services to the casino and hotel industry for 39 years. Category: Other |
| 308 | [Gillware, Inc.](https://www.casinovendors.com/vendor/gillware-inc/) Madison, Wisconsin Gillware Incorporated is located in Madison, Wisconsin, specializing in data recovery from troubled hard drives and reliable remote storage solutions for individuals and corporations alike. Founded in 2004 by Brian and Tyler Gill, Gillware's original mission was to be the be... Category: Data Retrieval Systems, Other |
| 309 | [Gimme Credit LLC](https://www.casinovendors.com/vendor/gimme-credit-llc/) New York, New York Category: Consulting |
| 310 | [Gimoka Coffee UK](https://www.casinovendors.com/vendor/gimoka-coffee-uk/) London, England, United Kingdom Gimoka Coffee UK is the UK distributor of the Italian coffee roaster Gruppo Gimoka. Our mission is to deliver genuine and high quality Italian espresso, roasted according to the traditional coffee artisan practice, directly to you. Lavazza and Nespresso compatible capsules: ... Category: Coffee |
| 311 | [Giocaonline Srl](https://www.igamingsuppliers.com/vendor/giocaonline-srl/) Milan, Italy Category: Casino Software, Casino Software |
| 312 | [Giochi Telematici Affiliazione](https://www.igamingaffiliateprograms.com/affiliate-program/giochi-telematici-affiliazione/) Category: Affiliate Programs |
| 313 | [Gioco News](https://www.igamingsuppliers.com/vendor/gioco-news/) Terni, Umbria, Italy Gioconews is a gaming network with a monthly review with an international delivery because the magazine is in Italian and in English language. It also has an online daily paper (www.gioconews.it) and two other specific online daily news dedicated to the Poker and Casino worl... Category: Consumer Publications |
| 314 | [Gioielli Italy](https://www.casinovendors.com/vendor/gioielli-italy/) Stockton, California Category: Other |
| 315 | [Girard Emilia Custom WoodCarvers, Inc.](https://www.casinovendors.com/vendor/girard-emilia-custom-woodcarvers-inc/) New York, New York Category: Furniture |
| 316 | [Girard's Foodservice Salad Dressings](https://www.casinovendors.com/vendor/girard-s-foodservice-salad-dressings/) City of Industry, California Girard's Foodservice Dressings distributes upscale dressings, sauces and mayonnaise. They manufacture over 100 varieties of dressings and sauces. Category: Other |
| 317 | [Girls Night Out the Show](https://www.casinovendors.com/vendor/girls-night-out-the-show/) Las Vegas, Nevada Girls Night Out the Show® Heats Up the Stages across the USA and brings down the house Seven Nights a Week! Along With Having The BEST GIRLS NIGHT EVER... Here's a few more details about what you can look forward to at GNO The Show: 90 sexy minutes of getting extremely ... Category: Production, Agency |
| 318 | [Girvin, Inc.](https://www.casinovendors.com/vendor/girvin-inc/) Seattle, Washington Our ability to distinctly articulate your brand is our point of difference. Girvin approaches each project from the client's point of view and puts business results at the forefront of our thinking. This approach insures delivery of results that are on strategy, time and bud... Category: Environmental Graphic Design |
| 319 | [GIS - Gambling Integrity Services](https://www.casinovendors.com/vendor/gis-gambling-integrity-services/) Winchester, England, United Kingdom Gambling Integrity Services is a consultancy firm advising governments, regulators and operators in the latest policy and processes for consumer protection, regulation and responsible gambling. We are a member of GiGA, IMGL and our consultants are internationally known and ... Category: Compliance |
| 320 | [Gist Specialties Inc](https://www.casinovendors.com/vendor/gist-specialties-inc/) North Las Vegas, Nevada Young single parent father with talent and vision along with his awesome team of skilled craftsman is ready to design and/or fabricate for your needs. Specializing in architectural themeing and fabrication in high end decor, Gist manufactures in GRG, GFRC, FRP, and almost a... Categories: Fabrication, Theming, Fabrication, Sculpture, Theming, Facility Design, Fabricators |
| 321 | [GISTRA, S.L.](https://www.casinovendors.com/vendor/gistra-s-l/) We are the leading cash management company in Spain. Our cashiers are the best sellers in the Spanish market and we are able to manage the direct payment of all slots machines, jackpots, roulettes and bets installed in casinos Category: ATM Products and Services |
| 322 | [Gitchi Gaming, Inc.](https://www.casinovendors.com/vendor/gitchi-gaming-inc/) Prescott, Wisconsin Gitchi Gaming, Inc. is a complete supplier for slots, table games, cage, vault, bingo & hospitality, specializing in Furniture, Fixtures and Equipment Packages. Categories: Equipment, Supplies, Slot Stools, Storage Systems, Bases-Cabinets-Stands (Wood), Slot Stools, Casino, Equipment, Slot Stools, Tables, Carts, Chips, Interior, Furnishings, Equipment, Change Banks, Change Banks, Equipment, Bases-Cabinets-Stands (Wood) |
| 323 | [Give&Take Profit](https://www.igamingaffiliateprograms.com/affiliate-program/give-take-profit/) Category: Affiliate Programs |
| 324 | [GKMT IT](https://www.igamingsuppliers.com/vendor/gkmt-it/) Jaipur, Rājāsthan, India GKMT IT is an IT-based firm communicating top-notch Website & App Development Company in Jaipur, Graphics & UI/UX Designing, and Digital Marketing indoor your budget cost and pronounced by the dream of creating the fittest for the world with the tardiest technology. Our comp... Category: Software Development |
| 325 | [Gladiator Lighting](https://www.casinovendors.com/vendor/gladiator-lighting/) Aurora, Colorado Our team at Gladiator Lighting have over 20+ years of experience in the lighting industry. Our strong relationships with lighting manufacturers allows us to bring you high quality light bulbs and fixtures at extremely affordable prices. We believe by utilizing the Internet, ... Category: Supplies |
| 326 | [Glamour Flooring](https://www.casinovendors.com/vendor/glamour-flooring/) Katy, Texas Glamour Flooring is your one stop shop for all your home remodeling needs. "Simply the best at what we do." That's what we pride our business upon. Providing our customers with outstanding customer service and professional expert help. Our sales staff and designing team will... Category: Flooring |
| 327 | [Glaro Products](https://www.casinovendors.com/vendor/glaro-products/) Matthews, North Carolina We at www.Glaro-Products.com Sell Glaro Hospitality products exclusively. Everything is manufactured under one roof, so anything you purchase will coordinate perfectly with everything else we sell. No longer is there a need to agonize over what products will look good togeth... Category: Furniture, Metal Products |
| 328 | [Glaro, Inc.](https://www.casinovendors.com/vendor/glaro-inc/) Hauppauge, New York Since 1945, Manufactures of Distinctive metal products for hotels, institutions and public places. As a rule every order is shipped within 1 to 3 days. Bellman carts, Sign frames, key drop boxes, planters, crowd control barriers, waste and smoking receptacles, clothes rack... Categories: Receptacles, Fabrication, Metal, Crowd Control, Doormen |
| 329 | [Glasdon, Inc.](https://www.casinovendors.com/vendor/glasdon-inc/) Sandston, Virginia Glasdon, Inc. supply a wide range of waste management products including trash cans, recycling containers and ash receptacles. We pride ourselves on offering products of the highest quality and value, in a choice of styles, colors and options that complement a variety of app... Categories: Waste Management, Barriers and Germ Guards, Barriers and Germ Guards, Facility Cleaning and Disinfection Services, Facility Cleaning and Disinfection Services |
| 330 | [Glass Creations Unlimited, Inc.](https://www.casinovendors.com/vendor/glass-creations-unlimited-inc/) Dallas, Texas A complete glass design studio that designs and manufacturers metal, wood, lighting, and more to accent projects. We are one of the most reputable companies for glass signage and architectural glass. Glass Creations is known for providing fascinating designs for hotels, re... Categories: Illuminated, Glass Art, Amenities, Indoor, Interior, Design |
| 331 | [Glass Surface Systems, Inc.](https://www.casinovendors.com/vendor/glass-surface-systems-inc/) Barberton, Ohio Glass Surface Systems Inc. has produced SHATTERPROOF lighting for all types of industries for 30 years. Our coating provides glass containment, non-yellowing shatterproofing for all your industrial, commercial, and institutional requirements. H.I.D. metal halide, high pressu... Category: Other |
| 332 | [Glasslight](https://www.casinovendors.com/vendor/glasslight/) Santa Cruz, California Glasslight works in all facets of architectural carved glass. From exquisite brilliant cut mandalas in starfire glass to sandblasted multiples in clear or mirror. Whether contemporary hotel design, victorian to deco restoration or sculptural glass, we can help you develop a ... Category: Glass Art |
| 333 | [Glassometry Studios](https://www.casinovendors.com/vendor/glassometry-studios/) Hood River, Oregon Glassometry studios owner Laurel Marie Hagner has her degree in sculpture. She has been pushing boundaries with metal and glass for over 16 years. Her sculptural metal work is fantastical and executed with the highest quality. With custom sculptural pieces made for compan... Categories: Glass Art, Fabrication, Metal |
| 334 | [GLC Abogados](https://www.igamingsuppliers.com/vendor/glc-abogados/) Los Yoses, San José, Costa Rica Category: Consulting |
| 335 | [Gleiss Lutz](https://www.igamingsuppliers.com/vendor/gleiss-lutz/) Berlin, Berlin, Germany For many years, we have been following the development of e-business with all its many and varied facets. Our work has concerned fundamental matters like the registration, securing and defence of domains worldwide (including WIPO proceedings), the establishment of joint plat... Category: Compliance |
| 336 | [Glendale Awning Company](https://www.casinovendors.com/vendor/glendale-awning-company/) Middle Village, New York Glendale Awning Company, a division of PHK GROUP, INC is a company that manages all awnings, canopies, signs, banners, channel letters, aluminum awning, lexan awning products and service in NYC Tri-State area. We are one of the oldest awning manufacturer in NYC. Buy direct f... Category: Other |
| 337 | [Glenn Green Galleries](https://www.casinovendors.com/vendor/glenn-green-galleries/) Tesuque, New Mexico An art treasure located in the lovely historical village of Tesuque - just six minutes from Santa Fes Plaza. Glenn, Sandy and their daughter Kerry Green hope the that the public will enjoy the works they show online and that they will personally visit their varied & expansi... Category: Art |
| 338 | [Glenn Rieder LLC](https://www.casinovendors.com/vendor/glenn-rieder-llc/) West Allis, Wisconsin Glenn Rieder LLC ("GR") manufactures and installs complete interiors for casinos, including architectural millwork, decorative glass, ornamental metal, cast materials, faux finishes, booth and banquette seating, solid surfaces and stone tops. Categories: Interior, Millwork, Moldings |
| 339 | [GLI Europe B.V.](https://www.casinovendors.com/vendor/gli-europe-b-v/) Hillegom, Zuid-Holland, Netherlands For more than 20 years, Gaming Laboratories International has been the world leader in independent testing for the gaming industry. With 13 testing laboratories spread across Africa, Asia, Australia, Europe, South America and the United States, GLI is recognized in more than... Category: Software Testing and Certification, Testing |
| 340 | [Glitnor Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/glitnor-affiliates/) Category: Affiliate Programs |
| 341 | [Global Access Unlimited](https://www.casinovendors.com/vendor/global-access-unlimited/) Largo, Florida We are Woman Owned Small Business celebrating 11 years of electronics distribution. Although our core competency is the supply of commercial through military board level components, we pride ourselves in our ability to provide our customers with anything utilized in the ma... Category: Parts |
| 342 | [Global Architectural Models](https://www.casinovendors.com/vendor/global-architectural-models/) Las Vegas, Nevada Scale models for any project. Category: Supplies |
| 343 | [Global Art, Inc.](https://www.casinovendors.com/vendor/global-art-inc/) Kentwood, Michigan Global Art has serviced the retail industry in picture framing and signage frames for 30 years. We maintain all our deadlines while still creating quality products for the industry. We can customize products & services for the industry by adding a uniqueness to framing or ... Category: Interior Design, Furnishings |
| 344 | [Global Awards, Inc.](https://www.casinovendors.com/vendor/global-awards-inc/) Las Vegas, Nevada Global Awards is a creative - full service engraving company offering quality service, craftsmanship & customer satisfaction. We specialize in name badges, slot machine & interior ADA approved signage, plaques & awards promotional gift items. Our master engravers are highly ... Categories: Plaques, Engraving, Engraved Signs Manufacturer, Indoor, Signage, Incentives and Awards, Plastics |
| 345 | [Global Beerco USA](https://www.casinovendors.com/vendor/global-beerco-usa/) Davis, California Global Beerco USA is committed to applying todays advanced communication technology to deliver the highest standards of customer support and continuous education to each HouseBrew operator. HouseBrew owners attend a two-day comprehensive training course at the University of ... Category: Bar Equipment |
| 346 | [Global Bet Guide](https://www.casinovendors.com/vendor/global-bet-guide/) London, England, United Kingdom GlobalBetGuide is an independent iGaming portal focused on Nigeria & South Africa, with coverage also extending to Australia and New Zealand. We publish expert-edited reviews of sportsbooks, casinos, and live dealer platforms, along with in-depth guides on local payment meth... Category: |
| 347 | [Global Betting & Gaming Consultants - GBGC](https://www.igamingsuppliers.com/vendor/global-betting-gaming-consultants-gbgc/) Castletown, Isle of Man GBGC has on its team several specialist consultants who can provide economic research, 'know how' in all areas of gambling, market research, statistical data, software solutions, payment solutions, electronic point of sale, information display systems, online technology and ... Categories: Consulting, Consulting, Consulting, Consulting, Consulting |
| 348 | [Global Billiards Manufacturing](https://www.casinovendors.com/vendor/global-billiards-manufacturing/) Carson, California The success of Los Angeles based Global Billiard Manufacturing can be attributed to a similar force: blending the Old World values of craftsmanship with an understanding of evolving business trends and customer needs. Founded more than three decades ago by a young immigrant ... Category: Amusement Equipment |
| 349 | [Global Drilling Fluids & Chemicals Limited](https://www.casinovendors.com/vendor/global-drilling-fluids-chemicals-limited/) Faridabad, Haryāna, India Manufacturers and suppliers of drilling fluids, oil drilling fluids and chemicals exporters from India. The Companys product range covers drilling fluids for oil and Gas Wells, Mud Chemicals, Workover and Completion Fluids, Production Chemicals, Well Stimulation Chemicals a... Category: Other |
| 350 | [Global Equipment Co., Inc.](https://www.casinovendors.com/vendor/global-equipment-co-inc/) Buford, Georgia Leading distributor of industrial products for over 50 years. Category: Other, Other |
| 351 | [Global Fabric Group](https://www.casinovendors.com/vendor/global-fabric-group/) Easley, South Carolina Global Fabric Group is a wholesaler of finished products for the hospitality and healthcare industries. Category: Linens |
| 352 | [Global Game](https://www.casinovendors.com/vendor/global-game/) Panchiao City, Taipei, Taiwan Category: New Game Manufacturer |
| 353 | [Global Games & Gaming (G3) Magazine](https://www.casinovendors.com/vendor/global-games-gaming-g3-magazine/) Manchester, United Kingdom G3 is a global media channel supplying news, market research, expert opinions and data to the international gaming community. G3 encompasses a monthly print and digital magazine, G3Newswire.com daily gaming news service, podcasts and support Apps for both magazine and news d... Category: Magazines, Business Publications |
| 354 | [Global Gaming Business](https://www.casinovendors.com/vendor/global-gaming-business/) Boulder City, Nevada GGB is a leading gaming trade publication focusing on the worldwide gaming industry. GGB is the exclusive official publication of the American Gaming Association, AGEM, and the official G2E magazine. Publications include Tribal Government Gaming, Casino Style, Progressive P... Categories: Magazines, Business Publications, Consulting |
| 355 | [Global Gaming Expo (G2E)](https://www.casinovendors.com/vendor/global-gaming-expo-g2e/) Norwalk, Connecticut At G2E, youll find the industrys leading suppliers of the latest technologies and new products, four days of hard-hitting strategies and essential education, and unparalleled networking that are indispensable for predicting upcoming opportunities and unforeseen challenges.... Categories: Shows, Conferences, Trade Shows and Conferences |
| 356 | [Global Gaming Initiatives](https://www.casinovendors.com/vendor/global-gaming-initiatives/) Las Vegas, Nevada With 20 years of hands on experience, Global Gaming Initiatives has the greatest insight as to what the end user wishes to see in a casino and gaming product. From his entry into gaming management in 1987, Mr. Meyer held operational and internal audit positions with such ent... Categories: Game Design, Design, Assessment, Brokerage, Other |
| 357 | [Global Industry Products Corp](https://www.casinovendors.com/vendor/global-industry-products-corp/) Las Vegas, Nevada Global Industry Products began developing relationships with the casino industry in Las Vegas. We have committed ourselves in providing our customers with the highest quality products, lowest pricing, and excellence in customer service. Today we are even more committed ... Categories: Other, Disposable Tableware, Paper Products |
| 358 | [Global Intelligence Network, LLC](https://www.casinovendors.com/vendor/global-intelligence-network-llc/) Las Vegas, Nevada Global conducts confidential and discreet investigations for due diligence in regulatory compliance, key employee backgrounds and market entry reports. Global manages both domestic and international investigations with an extensive network of assets. In the last three years... Categories: Investigations, Indian Gaming, Fulfillment Services |
| 359 | [Global Lighting & Signs](https://www.casinovendors.com/vendor/global-lighting-signs/) San Diego, California Global Lighting & Signs is an electrical and sign contractor that installs indoor and outdoor signage in Casinos. Category: Illuminated |
| 360 | [Global Link Language Services, Inc.](https://www.casinovendors.com/vendor/global-link-language-services-inc/) Boston, Massachusetts Global Link Language Services, founded in 1996, has emerged as an industry leader. Our premise is simple yet effective: we provide superior services and experience, extensive linguistic resources and competitive rates. Most importantly, we not only meet the expectations of o... Category: Translation Services |
| 361 | [Global Mfg. LLC](https://www.casinovendors.com/vendor/global-mfg-llc/) Newark, New Jersey We are the lowest cost, highest quality producer in our Field. We own our own factories in Mexico and have very quick turn around. We ship from Laredo Texas and Newark New Jersey. We do our embroidery in Mexico which makes us very competitive in specializng what we make. Category: Apparel Manufacturer |
| 362 | [Global Mfg. Solutions](https://www.casinovendors.com/vendor/global-mfg-solutions/) Franklin, Ohio Global Mfg. Solutions strives to assist every customer in accomplishing their decorating goals. Customer satisfaction is paramount to our existence as a leading provider of foam shapes. Exceeding customer expectations is our primary goal. We can accept most cad shapes or ... Category: Theming |
| 363 | [Global Monitor](https://www.casinovendors.com/vendor/global-monitor/) Guadalajara, Mexico Global Monitor is more than 14 years experience in industrial monitors for gaming machines, we integrate the best solutions in monitors with and without touch screen for our customers, and we are certifie by companies like 3M in US to integrate their touch screens with the b... Category: Other |
| 364 | [Global One Technologies](https://www.casinovendors.com/vendor/global-one-technologies/) Oceanside, California Global One Technologies is a design, engineering and systems integration firm, which transforms the way our customers live and do business by providing the best and most appropriate Audio Video and Technology solutions available to meet their functional, budgetary and implem... Category: Control Room |
| 365 | [Global Payment Technologies, Inc.](https://www.casinovendors.com/vendor/global-payment-technologies-inc/) Bohemia, New York Global Payment Technologies is a designer and manufacturer of currency validators supporting over 75 valid country-databases in the gaming, vending, banking and retail industries. GPTs validators are unmatched in quality and performance, as is their unsurpassed commitment ... Category: Bill Validators |
| 366 | [Global Power Products](https://www.casinovendors.com/vendor/global-power-products/) Simi Valley, California Global Power Products specializes in many diverse industries from Gaming to Medical. We have a wide selection of standard power supplies. We also do modified and custom designs. Our lead-times are within 6-8 weeks. All our products are backed by a minimum 2 year warranty. Category: Power Sources |
| 367 | [Global Promotional Sourcing](https://www.casinovendors.com/vendor/global-promotional-sourcing/) Las Vegas, Nevada Global Promotional Sourcing (GPS) is the ONLY all-in-one provider of loyalty solutions for the gaming industry. Founded in 2001, weve grown into a trusted $200M+ marketing partner for top casino groups, delivering innovative, data-driven strategies that enhance guest engage... Category: Promotional Items |
| 368 | [Global Recruiters Network](https://www.casinovendors.com/vendor/global-recruiters-network/) Chicago, Illinois Global Recruiters Network, Inc.(GRN) is an expanding network dedicated to connecting high-quality companies with high-quality talent to advance in both business and career goals. Each of our offices specialize in a variety of disciplines, industries, and geographies, giving ... Category: Recruitment |
| 369 | [Global Refractory Installers and Suppliers](https://www.casinovendors.com/vendor/global-refractory-installers-and-suppliers/) Manistee, Michigan Global Refractory is comprised of project managers and service technicians. They have come together to bring their many years of designing, building, installing and servicing the air pollution control, aluminum melting and steel processing industries. Category: Air Filtration Systems |
| 370 | [Global Resource, Inc.](https://www.casinovendors.com/vendor/global-resource-inc/) Houston, Texas We carry all major brands of telephone equipment priced at 40-60% below retail. We offer the strongest warranty in the industry-- 3 year advanced replacement on all telephone and system parts. Some of the name brands we carry include: Nortel, Meridian, Teledex, Telematrix... Categories: Telecommunications Systems, Other, Communication Systems, In-room Messaging, Communications, In-house |
| 371 | [Global Safe Corporation](https://www.casinovendors.com/vendor/global-safe-corporation/) Boca Raton, Florida Global Safe Corporation is a leading manufacturer of electronic hotel safes. They have installed their hotel room safes in hospital patient rooms, university dormitories, United States military bases and embassies around the world. Categories: Safes, Safes, Safes, Safes, Safes |
| 372 | [Global Scenic Services, Inc.](https://www.casinovendors.com/vendor/global-scenic-services-inc/) Bridgeport, Connecticut Global Scenic Services is your partner in every aspect of your production. We operate from a 40,000 sq ft fabrication facility equipped to handle all of your fabrication needs including automation. We are prepared to tackle projects from the smallest show to the most lav... Category: Production |
| 373 | [Global Security Products, Inc.](https://www.casinovendors.com/vendor/global-security-products-inc/) Miami, Florida Paradyme/Global Security Products, Inc. is an experienced systems integration provider. Our in-house design and consulting team takes projects from conception to implementation and operation. Our experienced team has designed and installed systems for National Palaces, Presi... Category: CCTV Systems |
| 374 | [Global Security Solutions](https://www.casinovendors.com/vendor/global-security-solutions/) Tulsa, Oklahoma Our expertise and strengths are rooted in our firm understanding that each security project needs to be tailor-made to each clients needs, specifications, and environment. We in building working partnerships, where the client is able to maximize the benefits of the services... Category: CCTV Systems |
| 375 | [Global Security Technologies (GST)](https://www.casinovendors.com/vendor/global-security-technologies-gst/) Odessa, Odes'ka Oblast', Ukraine Let us express to you our respect and introduce GST-Group (www.gst-group.com) - manufacturer and distributor of advanced high-grade security seals for preventing unauthorized access and fraud. Security seals for game machines, cash boxes, meters (electric, gas, water), calib... Category: Plastics |
| 376 | [Global Semisolutions](https://www.casinovendors.com/vendor/global-semisolutions/) Clearwater, Florida Global Semisolutions brings industry expertise to your electronic component needs. Our specialized sales team gives you the diversity in product knowledge that you need- the market expertise and technical skills of a specialist and the global supply chain services of a large... Category: Components |
| 377 | [Global Shakeup](https://www.casinovendors.com/vendor/global-shakeup/) North Hollywood, California Snowdomes, and snow globes designed to your specifications. Our focus is exclusively on these items and we are the best in the business. All-inclusive pricing (no surprise setup or extra charges) and on-time delivery takes the worry out of ordering these prized collectibles.... Categories: Wholesale, Souvenirs, Gift Merchandise |
| 378 | [Global Storm Partners](https://www.igamingaffiliateprograms.com/affiliate-program/global-storm-partners/) Category: Affiliate Programs |
| 379 | [Global Supply Network](https://www.casinovendors.com/vendor/global-supply-network/) Boulder, Colorado Global Supply Network is a manufacturer of Thermal & 2-ply Rolls, Printer ribbons,toner cartridge, InkJet cartridge, copier toners> We also have a full line of Thermal & Direct labels. We have Manufactured in the United States for over 25 years experience in the markets. O... Categories: Toner Cartridges, ATM Products and Services, Other, Bar Equipment, Paper, Other, Change Banks, Other, Supplies, Banking, Other |
| 380 | [Global Tote](https://www.igamingsuppliers.com/vendor/global-tote/) Broadmeadow, New South Wales, Australia The Global Tote is set to change Race books around the world. With the worlds first Business to Business only tote system its giving wagering operators globally the opportunity to provide a RaceBook to their clients like never before.Guaranteed returns, More content, No lo... Category: Gambling Operations, Sportsbook Software |
| 381 | [Global Trends U.S.A.](https://www.casinovendors.com/vendor/global-trends-u-s-a/) Canoga Park, California We are a mid-size embroidery and digitizing company offering our clients the highest quality production to be found anywhere. We have digitized over 250,000 individual logos since 1995, so we know what to do and how to do it precisely and perfectly. We have worked with man... Category: Embroidery |
| 382 | [Global Verification Network](https://www.casinovendors.com/vendor/global-verification-network/) Palatine, Illinois How do you know who you're hiring? Redridge Verification can help you answer this question. They offer accurate information, with a quick turnaround rate. Please visit their website today. Category: Employee Screening |
| 383 | [GlobalBet](https://www.casinovendors.com/vendor/globalbet/) Ruggell, Ruggell, Liechtenstein GlobalBet is a prominent B2B provider, serving as a trusted partner to the world's largest lottery operators across the globe. With a strong presence in five countries, GlobalBet offers comprehensive gaming solutions tailored to the unique requirements of the lottery industr... Categories: Other, Gambling Operations, Sportsbook Software, Racebook Software |
| 384 | [Globaldev Group](https://www.casinovendors.com/vendor/globaldev-group/) Belmont, California Globaldev Group helps companies advance their value by providing a complete set of software development solutions and leveraging our global talent pool. Category: Web Site Development |
| 385 | [Globalization Partners International](https://www.casinovendors.com/vendor/globalization-partners-international/) McLean, Virginia Globalization Partners International provides an array of globalization services that help companies communicate with the world. Our core service offerings enable firms to design, develop, and deploy multilingual documentation, software and Web sites for worldwide use. GP... Category: Translation Services, Translation Services |
| 386 | [GlobalProjectors.com](https://www.casinovendors.com/vendor/globalprojectors-com/) Guangzhou, Guangdong, China Globalprojectors.com is located in HongKong,China. Our company is established in 1997. Our store is to provide all the customers of us with the manufacturer wholesales price in Projection equipment and accessories without any aftersales commision. Our higly efficient logist... Category: Projectors |
| 387 | [Globant](https://www.igamingsuppliers.com/vendor/globant/) Capital Federal, Argentina We want to challenge the status quo and become the best company developing solutions that combine the best of engineering, innovation and design. Our goal is to be the leader in the creation of innovative software products that appeal to global audiences. We are a new-bre... Category: Software Development, Other |
| 388 | [GLOBAST Sh.a.](https://www.casinovendors.com/vendor/globast-sh-a/) Tirana, Tiranë, Albania Great offers for used electro-mechanical roulettes, slots and a complete Bingo Hall Equipment. Contact us for more details... Categories: Equipment, Slot Machines, Refurbished, Bingo Hall Management Systems |
| 389 | [Globe Party, Inc.](https://www.casinovendors.com/vendor/globe-party-inc/) Panorama City, California Globe Party, Inc is one of the USA leading entertainment companies. Our passion for innovative, fresh and creative entertainment ensures that we deliver distinctive experience to our clients in an easy, stress free way. Globe Party works with a diverse range of high qua... Category: Agency |
| 390 | [Globe Ticket](https://www.casinovendors.com/vendor/globe-ticket/) Carol Stream, Illinois The nation's oldest ticket printer (1868). As the manufacturer of tickets for the original thermal ticket printers, we have the most experience in the nation with this product. In addition we also produce thermal tickets for event admission, and movie theaters nationwide in... Categories: TITO Tickets, Tickets, Supplies |
| 391 | [Globo Technologies](https://www.igamingsuppliers.com/vendor/globo-technologies/) Moscow, Russia Globo Technologies was founded in 2001. Originally, its founders had set out to create a one-of-a-kind online casino, but were unable to find a unique software vendor that met their standards of quality. This prompted the start of their own software development company. Glob... Category: Casino Software, Poker Software |
| 392 | [GLORY (U.S.A.) Inc.](https://www.casinovendors.com/vendor/glory-u-s-a-inc/) West Caldwell, New Jersey GLORY is the world leader in the design and manufacture of cash management solutions that consist of casino kiosks with ATM functionality, bill breaking and ticket redemption; cash dispensers, cash recyclers and currency sorters and integration with many of the top cash acce... Categories: Kiosks, Cash Processing, Currency Handling Equipment, Currency Handling Equipment, Coin Wrapping, Change Banks |
| 393 | [Glory Global Solutions Limited](https://www.casinovendors.com/vendor/glory-global-solutions-limited/) Las Vegas, Nevada At Glory Global Solutions, innovation is at the heart of what we do. We bring real innovation to our customers, through technology, process and our people. Through our innovation, we fundamentally change the way cash moves across operations, how staff work, how customers are... Category: Currency Management Services |
| 394 | [Glory Partners](https://www.igamingaffiliateprograms.com/affiliate-program/glory-partners/) Category: Affiliate Programs |
| 395 | [Gloss Partners](https://www.igamingaffiliateprograms.com/affiliate-program/gloss-partners/) Category: Affiliate Programs |
| 396 | [Glove Connection](https://www.casinovendors.com/vendor/glove-connection/) Henderson, Nevada The Glove Connection is a local company located in Henderson Nevada. We have been in business since 2001. We are a "Full Service Safety Supply House." We provide disposable Latex and Nitrile gloves to casinos. We also provide several items to Engineering and Horticulture dep... Category: Other, Other |
| 397 | [Glownight Games](https://www.igamingsuppliers.com/vendor/glownight-games/) New Hyde Park, New York Glownight Games is a prominent in 2D and 3D Game development, iOS & Android mobile game development company building games with great design & high-performance to provide a great user experience. Glownight Games is an aggregation of the world-class mobile game developers who... Category: Mobile Gaming |
| 398 | [Glu Mobile Inc.](https://www.igamingsuppliers.com/vendor/glu-mobile-inc/) San Francisco, California Glu Mobile is a leading global developer and publisher of freemium games for smartphone and tablet devices. Glu's unique technology platform enables its titles to be accessible to a broad audience of consumers all over the world - supporting iOS, Android, Palm, Windows Phon... Category: Mobile Gaming |
| 399 | [Glux Gtek (Shenzhen) Inc](https://www.casinovendors.com/vendor/glux-gtek-shenzhen-inc/) Shenzhen, China Glux Gtek is China's No.1 in LED curtain products, supply LED display to 2008 Olympics. With 17 years manufacturing & 15 years rental business experiences, we have customers from over 60 countries worldwide;our references include 2008 Beijing Olympics Games, CCTV (China Cen... Categories: LED Systems, LED, Videowalls, LED Systems |
| 400 | [GM Monarch West, LLC](https://www.casinovendors.com/vendor/gm-monarch-west-llc/) Las Vegas, Nevada Our staff has extensive experience in manufacturing custom millwork interiors for the Gaming and Hospitality Industry. We offer a commitment to customer service and pride ourselves on completing all projects on schedule to the customer's satisfaction. We offer Value Engineer... Category: Theming |
| 401 | [GM Telecom Supply, Inc.](https://www.casinovendors.com/vendor/gm-telecom-supply-inc/) Tampa, Florida Fiber Optic Manufacturing house. Lead time same day or next day delivery on all products from single to multi strand fiber assemblies example LC,SC,FC,D4,MU,BICONIC,SMA,DIN,MTRJ etc. Category: Fiber Optics Products |
| 402 | [GMD Industries, Inc.](https://www.casinovendors.com/vendor/gmd-industries-inc/) College Point, New York In the 33 years in existence, GMD Industries has provide decorative glass products to the gaming and high end retail markets. Our extensive knowledge when it comes to providing solutions allows us to manufacture products that others struggle with, such as oversize pieces of ... Category: Glass Art |
| 403 | [GMF Hospitality Inc](https://www.casinovendors.com/vendor/gmf-hospitality-inc/) Tenafly, New Jersey GMF Hospitality is a leading supply of upholstery products to a number of casino properties in Atlantic City, Las Vegas and throughout the US Category: Upholstery |
| 404 | [GMP Design Associates](https://www.casinovendors.com/vendor/gmp-design-associates/) Staffordshire, England, United Kingdom Established since 1990, award winning leisure designers GMP are currently one of the leading design consultancies in the late night entertainment market. Our highly creative and professional team are experienced in producing value for money interiors that are dynamic, stylis... Category: Interior |
| 405 | [GMR Transciption](https://www.casinovendors.com/vendor/gmr-transciption/) Tustin, California GMR Transcription provides state-of-the-art, affordable and accurate transcription services in the United States. With several million minutes of audio recorded and thousands of happy clients from an ever-growing list, GMR is your trusted source for transcription services at... Category: Translation Services |
| 406 | [GMW - Golden Metal Works](https://www.casinovendors.com/vendor/gmw-golden-metal-works/) Aligarh, India Established in 1975, Golden Metal Works has earned an enviable reputation as Manufacturer and Exporters of Quality Builders Hardwares in Brass, Aluminium & Iron as well. It has a very good standing with its customers all across the world. Presently, the company exports its B... Category: Other |
| 407 | [GN Exhibits Plus](https://www.casinovendors.com/vendor/gn-exhibits-plus/) Hauppauge, New York Over 25 years of experience with trade show exhibits and complete convention services. We provide special custom props, prototypes, and integrated industrial design services. Imagine it, design it, build it from concept to completion we do it all. www.gnexhibitsplus.com Category: Exhibit Supplies, Trade Shows and Conferences |
| 408 | [GnG Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/gng-affiliates/) Category: Affiliate Programs |
| 409 | [GNISEC](https://www.casinovendors.com/vendor/gnisec/) Sherman, Texas GNISEC is a national security company providing system installation and service of security camera systems, alarm systems, access control, integration and networking. We offer the latest in digital video recording technology. Stop by our booth for a demonstration and a pre... Category: Alarms |
| 410 | [Go Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/go-affiliates/) Category: Affiliate Programs |
| 411 | [Go Barefoot](https://www.casinovendors.com/vendor/go-barefoot/) Gardena, California Go Barefoot has been designing and producing clothing for almost 50 years. Go Barefoot manufacturers island and beach lifestyle clothing. Category: Other |
| 412 | [GO Business](https://www.igamingsuppliers.com/vendor/go-business/) GO is the leading provider of ICT services in Malta, operating the primary IP link to Europe with capacity in excess of 2.5Gbps and immediate plans for a secondary link. GO also operates a number of state-of-the-art data centres that are managed round the clock by an excelle... Category: Hosting |
| 413 | [Go Green Lighting USA](https://www.casinovendors.com/vendor/go-green-lighting-usa/) Margate, Florida We are providers, designers and manufaturers of LED lightign products. We also do installation and services of our products. We have a wide range of products and we can design and customize to any customer's need. Category: LED |
| 414 | [GO plc](https://www.casinovendors.com/vendor/go-plc/) Marsa, Malta GO plc (formerly Maltacom) has become Maltas first and only quadruple play operator, a truly converged telecommunications operator with a huge range of services. And to help you find exactly the right service for you, weve grouped them together into three areas GO Busine... Categories: Communication Systems, Hosting, Hosting |
| 415 | [Go Win Casino Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/go-win-casino-affiliates/) Category: Affiliate Programs |
| 416 | [Go2Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/go2affiliates/) Category: Affiliate Programs |
| 417 | [Goat Gaming Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/goat-gaming-affiliates/) Category: Affiliate Programs |
| 418 | [GodBunny Partners](https://www.igamingaffiliateprograms.com/affiliate-program/godbunny-partners/) Category: Affiliate Programs |
| 419 | [Godiva Chocolatier, Inc.](https://www.casinovendors.com/vendor/godiva-chocolatier-inc/) New York, New York Category: Chocolate |
| 420 | [Goff Public, Inc.](https://www.casinovendors.com/vendor/goff-public-inc/) Saint Paul, Minnesota Goff Public is an independent communications agency based in Minnesota offering public relations and government relations services. We are skilled, experienced problem solvers who tell our clients stories, advocate for their interests and protect their reputations while se... Category: Public Relations and Publicity |
| 421 | [GoFrugal Technologies](https://www.casinovendors.com/vendor/gofrugal-technologies/) Chennai, Tamil Nādu, India GoFrugal is a leading retail business management software company India specializing in retail, distribution and supply chain management solutions. We offer end to end solutions from store automation to multi-channel retailing suitable for volume, value and service to the re... Category: Systems |
| 422 | [GOG Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/gog-affiliates/) Category: Affiliate Programs |
| 423 | [Gogame Partners](https://www.igamingaffiliateprograms.com/affiliate-program/gogame-partners/) Category: Affiliate Programs |
| 424 | [GOJO Industries Inc.](https://www.casinovendors.com/vendor/gojo-industries-inc/) Akron, Ohio GOJO Industries, Inc. has a portfolio of products that includes industry leading formulas under the GOJO® and PURELL® brand names. GOJO is known for state-of-the-art dispensing technology, engineered with attention to design and durability. In partnership with our distributo... Category: Hygiene Products, Supplies |
| 425 | [Gold Club d.o.o.](https://www.casinovendors.com/vendor/gold-club-d-o-o/) Sezana, Sežana, Slovenia Gold Club D.O.O. developes automated roulettes. The Gold Club Roulette for 5,6,8 and 10 players is a completely automated, computer controlled gambling machine. Its classical design and esthetical perfection, combined with cutting edge technology, sets new standards to one's... Category: Equipment |
| 426 | [Gold Coast Flood Restorations](https://www.casinovendors.com/vendor/gold-coast-flood-restorations/) El Cajon, California At Gold Coast Flood Restorations, we believe every customer deserves our fullest attention. That your problems are ours. And that we are obligated to do everything within our power to makes those problems disappear. Gold Coast is a Christian-based, family owned and operat... Categories: Claims, Other, Consulting, Other |
| 427 | [Gold Crown Gaming](https://www.casinovendors.com/vendor/gold-crown-gaming/) Miami, Florida Gold Crown Gaming Categories: Slot Machines, Refurbished, Supplies, Equipment, Manufacturer, Furnishings, Reconditioned, Shuffling Machines, Blackjack Tables, Chip Handling, Equipment, Bill Validators, Chip Handling, Chips, Electronic Systems, Slot Stools, Accessories, Blackjack Tables, Blackjack Tables, Chips, Multi-player Games, Chips, Reconditioned, Poker Network, Equipment, Slot Stools, Coin Hoppers, Electronic Games, Gaming Products, Shuffling Machines, Pai Gow, Shuffling Machines, Tables, Accessories, Accessories, Equipment, Video Devices (used), Equipment, Reconditioned, Equipment, Gaming Products, Collection Systems, Chip Handling, Poker Chips, Chips, Used, Coin and Chip Storage, Furnishings, Slot Machines, Refurbished |
| 428 | [Gold Deluxe Ltd](https://www.igamingsuppliers.com/vendor/gold-deluxe-ltd/) Gold Deluxe was established in 2011 July; with over 100 employees in Philippines. It specializes in online casino platform for Baccarat and other casino games. Gold Deluxe has led the online gaming industry by providing innovative & cutting edge casino solutions to leading g... Category: Live Dealer, Mobile Gaming |
| 429 | [Gold Fusion](https://www.casinovendors.com/vendor/gold-fusion/) Conyers, Georgia The GOLD FUSION team is comprised of dedicated professionals who work synergistically to provide you, the customer, with the most feature-packed system on the market today. Programmers, Gamers, Artists, Technicians, Engineers, Customer Support, Account Representatives and In... Category: Software |
| 430 | [Gold Link S.R.L](https://www.casinovendors.com/vendor/gold-link-s-r-l/) Buenos Aires, Capital federal, Argentina Categories: Electronic Systems, Equipment, Slot Machines, Systems |
| 431 | [Goldbet Partners](https://www.igamingaffiliateprograms.com/affiliate-program/goldbet-partners/) Category: Affiliate Programs |
| 432 | [Golden Euro Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/golden-euro-affiliates/) Category: Affiliate Programs |
| 433 | [Golden Games](https://www.casinovendors.com/vendor/golden-games/) Pfäffiko, Switzerland Category: Slot Machines |
| 434 | [Golden Gorilla Media Limited](https://www.igamingsuppliers.com/vendor/golden-gorilla-media-limited/) Newcastle upon tyne, England, United Kingdom Digital Growth Specialists We are digital marketing and media publishers that get brands discovered online. Category: Search Engine Optimization, Website Content |
| 435 | [Golden Hero Limited](https://www.igamingsuppliers.com/vendor/golden-hero-limited/) Category: Casino Software, Casino Software |
| 436 | [Golden Limo Worldwide](https://www.casinovendors.com/vendor/golden-limo-worldwide/) San Jose, California SFO Golden Limo consistently provides on-time, prompt and professional chauffeured limo service to meet the challenging transportation needs of San Jose business and leisure travelers. With our team of professional chauffeurs, fleet of latest sedans, vans, limo-buses and var... Category: Limousines |
| 437 | [Golden Matrix Group](https://www.igamingsuppliers.com/vendor/golden-matrix-group/) Golden Matrix Group is a leading provider of turnkey and white label gaming platforms, Esports technology and gaming content. Categories: Gambling Operations, Platform Providers, Other |
| 438 | [Golden Palace Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/golden-palace-affiliates/) GoldenPalaceAffiliates.com represents world-renown brands that have withstood the test of time. GoldenPalace.com was established in 1997, virtually since the advent of online gaming itself. We hold operators to the highest possible standards to ensure that players receive th... Category: Affiliate Programs |
| 439 | [Golden Race](https://www.igamingsuppliers.com/vendor/golden-race/) Birguma Naxxar, Malta Golden Race is the “one stop partner” for virtual sportsbetting and number games. We fulfill all special needs regarding different clients, countries and habits. By constantly improving existing products and developing innovative new games, we build up “one stop clients” tha... Category: Gambling Operations, Other |
| 440 | [Golden Rock Studios](https://www.igamingsuppliers.com/vendor/golden-rock-studios/) Gibraltar, Gibraltar Golden Rock Studios is a game developer of online slots and table games. Category: Casino Software |
| 441 | [Golden Royal Technology Developer Co.,Ltd.](https://www.casinovendors.com/vendor/golden-royal-technology-developer-co-ltd/) Yongkang, Tainan, Taiwan Our company has been engaged in developing and manufacturing various software and hardware for electronic gaming such as electronic baccarat. We have a specialized team that offers the most specialized, conscientious service, the latest development of machinery, and permanen... Category: Electronic Games |
| 442 | [Golden Sunshine Entertainment Products Limited](https://www.casinovendors.com/vendor/golden-sunshine-entertainment-products-limited/) Guangzhou, China Category: Playing Cards |
| 443 | [Golden View Localization](https://www.casinovendors.com/vendor/golden-view-localization/) Shenzhen, Guangdong, China One-stop shop translation & localization solutions into East Asia and South East Asian languages with 13 years excellence. Category: Translation Services |
| 444 | [Golden Waffles](https://www.casinovendors.com/vendor/golden-waffles/) South Bend, Indiana For over 80 years Golden Waffles has been America's Favorite waffle. They are the world's largest supplier of waffle irons and waffle mix for the best hotels, universities, restaurants and theme parks. If you've eaten a waffle at a hotel, most likely it was a Carbon's Golde... Category: Equipment, Other |
| 445 | [Golden Whale Productions GmbH](https://www.casinovendors.com/vendor/golden-whale-productions-gmbh/) Vienna, Austria Data-driven services in platform-building, games-design, player-analytics and much more Golden Whale Productions provides know-how and products that let you utilize the power of your data for informed decisions. Solutions for player behaviour and classification, retention ... Category: |
| 446 | [Goldenbet Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/goldenbet-affiliates/) Category: Affiliate Programs |
| 447 | [Golden-Race A.B. Group](https://www.igamingsuppliers.com/vendor/golden-race-a-b-group/) Birguma Naxxar, Malta Golden Race is a young and dynamic holding company that was born at the beginning of 2006 in the field of sports betting and with the successful launch of dogs racings with over 8,000 licenses sold. Because of the success of its first product, the company decided to invest a... Category: Racebook Software, Live Dealer |
| 448 | [Golden-Race.ru](https://www.igamingsuppliers.com/vendor/golden-race-ru/) Netishin, Ukraine Category: Racebook Software |
| 449 | [Goldfinger Monitors](https://www.casinovendors.com/vendor/goldfinger-monitors/) John's Island, South Carolina Goldfinger is the fastest growing monitor company in the United States designing and manufacturing non-touch and touch screen monitors with touch-screen capable on-screen menus boasting state-of-the-art technology and durability. We offer a full line of monitors that are bui... Category: Monitors, Card Readers |
| 450 | [Goldfire Studios](https://www.igamingsuppliers.com/vendor/goldfire-studios/) Oklahoma City, Oklahoma GoldFire Studios is pioneering the next generation of social gaming by bringing real-time multiplayer games to your tablets and computers with cutting edge web technologies. Our vision is to enable the same engaging gameplay and meaningful social experiences across all devic... Category: Other |
| 451 | [Goldray Industries Ltd.](https://www.casinovendors.com/vendor/goldray-industries-ltd/) Calgary, Alberta, Canada Goldray is a leading manufacturer and innovator for decorative glass. We have one of the most complete and modern manufacturing facilities for fabricated decorative glass in North America. Our reliance on outsourcing is very minimal, this gives us an advantage in controlli... Category: Glass Art, Exhibits |
| 452 | [Goldrush Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/goldrush-affiliates/) Category: Affiliate Programs |
| 453 | [Goldstein-Schwartz Inc.](https://www.casinovendors.com/vendor/goldstein-schwartz-inc/) Maryland Heights, Missouri We have worked with Naval Engineers designing Flexible Utility Systems for many new projects and have supplied numerous Casino Riverboats in Missouri, Illinois, Iowa, Mississippi, Indiana and Louisiana with various styles of Hose and Fittings for their Utility Systems handli... Category: Other |
| 454 | [Golf Resources Group](https://www.casinovendors.com/vendor/golf-resources-group/) Plano, Texas D.A. Weibring/GRI was formed in October, 1987 for the purpose of consulting on agronomic issues with golf course architects, owners, and operators. The formation of the company was achieved with the combined efforts of PGA Tour Professional D.A. Weibring and Dallas real est... Categories: Artificial Grass Surfaces, Other, Consulting |
| 455 | [Gollehon Books](https://www.casinovendors.com/vendor/gollehon-books/) Grand Rapids, Michigan Gollehon Books are among the top sellers in national bookstore chains and are perfectly suited for casino promotions, awards, give-aways, prizes and tournament gifts. Write, call, email, or fax for a free catalog! Category: Books |
| 456 | [Golpas Partners](https://www.igamingaffiliateprograms.com/affiliate-program/golpas-partners/) Category: Affiliate Programs |
| 457 | [Gomeeki](https://www.igamingsuppliers.com/vendor/gomeeki/) Lavender Bay, New South Wales, Australia Gomeeki, the mobile commerce company is committed in providing clients with high-quality Mobile application development services. Gomeekis operation is headquartered in Sydney Australia, with an additional service delivery & support team located in Bangkok, Thailand. ... Category: Mobile Gaming |
| 458 | [GOMO Mobile Technology Co., Ltd.](https://www.igamingsuppliers.com/vendor/gomo-mobile-technology-co-ltd/) Guangzhou, Guangdong, China GOMO Mobile Technology Co., Ltd. (hereinafter referred to as “GOMO”) was founded in 2003 with its headquarter located in Guangzhou. Riding on the opportunities in the era of Mobile Internet, GOMO has developed into the world leading mobile application developer and mobile ad... Category: Mobile Gaming |
| 459 | [Gondola Adventures®, Inc.](https://www.casinovendors.com/vendor/gondola-adventures-inc/) Henderson, Nevada Gondola Adventures®, Inc. is the largest purveyor of gondolas, gondola equipment, training, and operations in the United States. With three operations currently in Las Vegas, Dallas, and Newport Beach, California, and our boat fabricating arm, our staff has the most extensi... Category: Amusement Equipment |
| 460 | [GoneGambling](https://www.igamingsuppliers.com/vendor/gonegambling/) GoneGambling is a unique casino and gambling portal which has been specifically designed with the casino's interests in mind. Creative on-site incentives, as well as intense promotion for our sponsors, guarantee quality, consistent players and deposits. Our satisfied adver... Category: Consumer Portals |
| 461 | [GONG Gaming Technolgies](https://www.igamingsuppliers.com/vendor/gong-gaming-technolgies/) Category: Casino Software |
| 462 | [Gonzi & Associates, Advocates](https://www.casinovendors.com/vendor/gonzi-associates-advocates/) Fgura, Malta Categories: Other, Licensing and Regulation, Accounting, Licensing: Intellectual Property, Contract Management, Gaming Licensing, Compliance |
| 463 | [Good Day 4 Play Affiliate Program](https://www.igamingaffiliateprograms.com/affiliate-program/good-day-4-play-affiliate-program/) Category: Affiliate Programs |
| 464 | [Good Guy Productions](https://www.casinovendors.com/vendor/good-guy-productions/) Bloomingdale, New York We are a full service party planning event company that can render any style or theme imaginable. We do things in a tactful, yet fun, manner. We are also dealers of all casino products. We can sell them inexpensive because we buy them that way. We make our money on the p... Category: Casino Party Rental, Poker Chips |
| 465 | [Good Source Solutions](https://www.casinovendors.com/vendor/good-source-solutions/) Emmett, Idaho Category: Other |
| 466 | [GoodCore Software Ltd](https://www.casinovendors.com/vendor/goodcore-software-ltd/) Croydon, England, United Kingdom GoodCore is a software development company that designs, develops and supports bespoke software solutions and works with clients of various preferences, business needs, and organizational cultures. Category: Software Development |
| 467 | [GoodDep](https://www.igamingaffiliateprograms.com/affiliate-program/gooddep/) Saldus, Latvia GoodDep is an ultimate bridge between advertisers and publishers, specifically designed to empower gambling affiliates. Our dedicated support team is here to provide personalized assistance, analyzing your specific situation to ensure smooth operations and optimal result... Category: Affiliate Programs |
| 468 | [GoodFellas Gaming](https://www.casinovendors.com/vendor/goodfellas-gaming/) Birmingham, Alabama GoodFellas Gaming, located in Birmingham, AL, services the state of Alabama and the entire Southeast. Whether you're hosting a Corporate Party, Fundraiser, Reunion, Student Social or Private Affair, our commitment is to ensuring that your guests have a great time at your spe... Category: Casino Party Rental |
| 469 | [Goodwill Ship Management](https://www.casinovendors.com/vendor/goodwill-ship-management/) Chittagong, Chittagong bibhag, Bangladesh Goodwill Ship Management is one of the most trusted names in this region in the field of complete shipping solutions. Each company is focused on particular services. Category: Shipping |
| 470 | [Goodwyn Production Group](https://www.casinovendors.com/vendor/goodwyn-production-group/) Las Vegas, Nevada Goodwyn Production Group is a woman-owned, full service results-oriented video production company based in Las Vegas, Nevada. We understand that our job is to make our clients look their best. Goodwyn has 20 years of experience doing just that: creating award-winning prog... Category: Production |
| 471 | [Google Cloud](https://www.casinovendors.com/vendor/google-cloud/) Mountainview, Massachusetts Google Cloud is widely recognized as a global leader in delivering a secure, open, intelligent and transformative enterprise cloud platform. Our technology is built on Googles private network and is the product of nearly 20 years of innovation in security, network architect... Category: Computer Systems |
| 472 | [Goplay365 Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/goplay365-affiliates/) Category: Affiliate Programs |
| 473 | [GoProCasino Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/goprocasino-affiliates/) Category: Affiliate Programs |
| 474 | [Goral Partners](https://www.igamingaffiliateprograms.com/affiliate-program/goral-partners/) Goral Partners blends innovation and expertise to fuel every affiliate partnership, striving to pioneer digital solutions that redefine success. The company's mission is to empower affiliates with cutting-edge digital strategies. Category: Affiliate Programs |
| 475 | [GoRealTime](https://www.casinovendors.com/vendor/gorealtime/) St. George, Utah We have been providing the best in on-line, e-commerce enabled services since 1997. We provide fast, secure on-line credit card transactions for merchants, ISP's, shopping cart companies and anyone else doing business over the net. The GOrealtime Gateway is high capacity and... Category: Merchant Accounts |
| 476 | [Gorilla Gaming](https://www.casinovendors.com/vendor/gorilla-gaming/) Warwick, Rhode Island Gorilla Gaming is home to Legendary Gaming Tables, Custom Felts and Livestream Production. Located in Warwick, RI, Gorilla Gaming has become the industries go to suppler for the highest quality gaming tables. As the official table of the World Series of Poker, and the pr... Categories: Poker Tables, Synthetic Gaming Layouts, Poker Tables, Poker Tables, Poker Tables, Masks and Shields, Masks and Shields |
| 477 | [Gorilla Paper Inc](https://www.casinovendors.com/vendor/gorilla-paper-inc/) Elk Grove Village, Illinois Gorilla Paper offers same day shipping from IL and AZ warehouse, There is no minimum to purchase order online. No.1 source of Credit Card Thermal Receipt Paper Rolls, Cleaning Cards since 2009. Category: Bill Validator Cleaning Cards, ATM Products and Services |
| 478 | [Gorilla Playsets](https://www.casinovendors.com/vendor/gorilla-playsets/) Canton, Georgia Gorilla Playsets is the top manufacturer of swing sets and swing set accessories. Category: Amusement Equipment, Child Care Services |
| 479 | [Goslyn Grease Recovery Systems](https://www.casinovendors.com/vendor/goslyn-grease-recovery-systems/) Aurora, Ontario, Canada Goslyn is an automatic grease recovery device that is more efficient and cost-effective alternative to a traditional grease trap. The unique separation system continuously and permanently removes fats, oil and grease from waste effluent. There is no grease build up as is th... Category: Plumbing Products and Parts |
| 480 | [Goslyn West](https://www.casinovendors.com/vendor/goslyn-west/) Oakland, California Category: Restaurant Equipment |
| 481 | [GoTo Foods](https://www.casinovendors.com/vendor/goto-foods/) Atlanta, Georgia GoTo Foods, formerly Focus Brands, is the franchisor and operator of over 2,200 ice cream shoppes, bakeries, restaurants, and cafes in the United States, the District of Columbia, Puerto Rico, and 38 foreign countries under the brand names Carvel®, Cinnabon®, Schlotzskys®, ... Category: Other |
| 482 | [Gotta Have It Golf, Inc.](https://www.casinovendors.com/vendor/gotta-have-it-golf-inc/) Miami, Florida For 15 years Gotta Have It Golf has been the leader in supplying the memorabilia industry with the best Sports, Entertainment and Historical collectibles in the world. From our elegant and creative presentations to our handcrafted framework, and finally to our unique and dis... Category: Other |
| 483 | [Gourmet Display](https://www.casinovendors.com/vendor/gourmet-display/) Kent, Washington Category: Food Display, Other |
| 484 | [Gourmet Table Skirts and Linens](https://www.casinovendors.com/vendor/gourmet-table-skirts-and-linens/) Houston, Texas We manufacture and sell direct table linens, table skirting, conference cloths, along with many other table covering products. We are approved vendors for many buying organizations and have been in business over 25 years. We are very price competitive and known for the quali... Category: Linens |
| 485 | [GourmetGiftBaskets.com](https://www.casinovendors.com/vendor/gourmetgiftbaskets-com/) Kingston, New Hampshire GourmetGiftBaskets.com is an online retailer of award-winning, gourmet gifts. We design and build every gift by hand at our single location in Southern NH and truly consider our gifts to be works of art. With over 400 gifts to choose from, you can be certain that we have the... Category: Gift Merchandise |
| 486 | [Governance Associates](https://www.casinovendors.com/vendor/governance-associates/) Information security, AML/CFT, compliance, and governance consulting. Categories: Consulting, Security and Fraud, Regulatory Agency |
| 487 | [Gowell Group Technology Co., Ltd](https://www.casinovendors.com/vendor/gowell-group-technology-co-ltd/) Shenzhen, Guangdong, China Gowell group technology Co.,limited is a hi-tech enterprise specializing in developing, manufacturing and marketing CCTV products including Standalone DVR, DVR Kits, IP Camera, Analog Camera, etc., devoting ourselves to providing HD and intelligent IP surveillance systems at... Category: CCTV Systems |
| 488 | [Gowling WLG International Limited](https://www.igamingsuppliers.com/vendor/gowling-wlg-international-limited/) Toronto, Ontario, Canada Gowling WLG is an international law firm which represents a natural evolution for its founding firms - Gowlings and Wragge Lawrence Graham & Co. With roots tracing back to 1887, Gowlings has grown to become one of the largest and most respected law firms in Canada, with a re... Category: Licensing and Regulation |
| 489 | [GPE Vendors](https://www.casinovendors.com/vendor/gpe-vendors/) Fano, Italy GPE Vendors is a well-known and proven brand name in the European and International vending market. The wide selection of refrigerated and hot drinks vending machines has its main strengths in the excellent quality-price ratio, the reliability of the electronic parts and th... Category: Dispensers, Vending Machines |
| 490 | [GPO Display](https://www.casinovendors.com/vendor/gpo-display/) Livermore, California GPO Display offers a wide array of display solutions to meet your needs from video walls to 4K & 1080p commercial LCD monitors, interactive kiosks and touch-enabled display tables.The “GPO difference” is evident from the moment a project is conceived. We aid in preliminary d... Categories: Videowalls, Videowalls, Videowalls, Videowalls, Kiosks, Touchscreens, Touchscreens, Monitors, Monitors, Other |
| 491 | [GPS - Game Power System Co., Ltd.](https://www.casinovendors.com/vendor/gps-game-power-system-co-ltd/) New Taipei City, Taipei, Taiwan Established since 1979, Game Power System (GPS) is a video arcade game manufacturer and developer as well. We manufacture Video Game Machine, Video Arcade Machine, Vending Machine,LCD Gambling Machine, WHACK A MOLE, Touch Machine, Bar Game, Mario Game, Fruit (8 line) Games, ... Category: Slot Machines |
| 492 | [GR8 Tech](https://www.igamingsuppliers.com/vendor/gr8-tech/) Limassol, Lemesos, Cyprus GR8 Tech is the provider behind the Platform for Champions, delivering high-performance sportsbook and iGaming solutions for operators ready to lead and win in competitive markets. Categories: Gambling Operations, Platform Providers, Platform Providers, Affiliate Program Software |
| 493 | [Graciana Tortilla Factory](https://www.casinovendors.com/vendor/graciana-tortilla-factory/) Sylmar, California Graciana Tortilla Factory was establish in 1937, we serve all southern California and our major vendors include Sysco, MCI food, California State Prison, Navy, Army Base. Our prices are lower than any other manufacture in town and are guarantee. Category: Other |
| 494 | [GRAFIX Oncall, Inc.](https://www.casinovendors.com/vendor/grafix-oncall-inc/) Santa Rosa, California We help you separate your business from the competition! Grafix Oncall has 17+ years experience in providing top-notch real-world graphics. Count on us for your time sensitive projects and be assured deadlines will be met. We listen. We advise. We're there when you need us. ... Category: Graphic Design |
| 495 | [Graftek Systems](https://www.casinovendors.com/vendor/graftek-systems/) West Warwick, Rhode Island Graftek Systems is one of the leading providers of uniforms, promotional products, and printed documents in the Eastern United States. Recognized by their customers as a high quality provider with extremely attractive prices. An industry leading customer service team and unc... Categories: Uniforms, Specialties, Printers, Distributors |
| 496 | [Grainger](https://www.casinovendors.com/vendor/grainger/) Mobile, Alabama Grainger Industrial Supply has been America's leading distributor of Maintenance, Repair, & Operating supplies for over 75 years. We have maintained this status by offering our customers the very best brands at competitive prices with unmatched service after the sale. Our ne... Categories: Supplies, Other, Other, Batteries, Customer Service |
| 497 | [Grand Aire, Inc.](https://www.casinovendors.com/vendor/grand-aire-inc/) Swanton, Ohio Grand Aire is a premium Air Charter Management company, offering a wide variety of passenger and cargo charter aircraft throughout North America and beyond. Categories: Air Transportation, Other, Air Charter, Passenger |
| 498 | [Grand Betting Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/grand-betting-affiliates/) Category: Affiliate Programs |
| 499 | [Grand Canyon University](https://www.casinovendors.com/vendor/grand-canyon-university/) Phoenix, Arizona Grand Canyon University is a private Christian university located in Phoenix, Arizona. We are dedicated to helping our students change their lives for the better through education. We offer a wide range of programs at both the undergraduate and graduate levels that you can e... Category: Education |
| 500 | [Grand Club Partners](https://www.igamingaffiliateprograms.com/affiliate-program/grand-club-partners/) Category: Affiliate Programs |
| 501 | [Grand Korea Corp.](https://www.casinovendors.com/vendor/grand-korea-corp/) Seoul, Seoul Teugbyeolsi, South Korea Category: Management Systems |
| 502 | [Grand Parade Ltd](https://www.igamingsuppliers.com/vendor/grand-parade-ltd/) London, England, United Kingdom Grand Parade is an independently owned company founded by Andy Clerkson and Ed Needham - two pioneers of men's lifestyle publishing in the UK and USA. They edited and published mega-magazine brands such as Maxim, Rolling Stone, FHM and Stuff. They wanted to create engaging m... Categories: Other, Mobile Gaming, Social Media, Search Engine Optimization, Website Content |
| 503 | [Grand Prive Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/grand-prive-affiliates/) Category: Affiliate Programs |
| 504 | [Grand Prize Promotions](https://www.casinovendors.com/vendor/grand-prize-promotions/) Richardson, Texas With over 25 years of covering prize promotions, we have covered over 300,000 events throughout the world. Providing superior and exciting Prize programs for casinos, sporting events, odds contests and games of chance. We also provide weather promotions, weather insurance,... Categories: Insurance, Specialties, Driving Range Services, Production, Other, Planning, Consulting, Media Buying and Planning, Promotions, Promotions, Database Marketing, Promotions, Insurance: Jackpots, Promotions, Prizes, Public Relations and Publicity, Sales Building |
| 505 | [Grand Productions, Inc.](https://www.casinovendors.com/vendor/grand-productions-inc/) Naperville, Illinois Specialize in creating high-impact celebrity driven programs, promotions, and engaging interactive games that resonate with not just your existing gaming customers, but have proven drawing power to new customers in your local & mid-markets. Our programs utilize some of toda... Category: Promotions, Talent Buying |
| 506 | [Grand Products Incorporated](https://www.casinovendors.com/vendor/grand-products-incorporated/) Des Plaines, Illinois Grand Products Inc. is a full service contract assembler and manufacturer with complete turnkey operations from prototype engineering through production. Some of our capabilities include: wire harnesses, electromechanical assemblies, mechanical assemblies, cable assemblies a... Category: Slot Machines |
| 507 | [Grand Rapids Chair Company](https://www.casinovendors.com/vendor/grand-rapids-chair-company/) Grand Rapids, Michigan Grand Rapids Chair Co. prides itself on its unique designs. We offer customers fresh new looks that are appropriate for their specific installations. Each and every chair, barstool, and table that we manufacture reflects the pride of our craftsmanship and our quality. Pull... Categories: Furniture, Furniture Manufacturer, Other |
| 508 | [Grand Traverse Mobile Communications](https://www.casinovendors.com/vendor/grand-traverse-mobile-communications/) Traverse City, Michigan CASINO PROVEN SOLUTIONS We strive to create a more efficient, cost effective solution to problems our customers have. If their actual needs are simple, we provide a simple solution. If their needs are complex, we utilize the decades technical experience within our company t... Categories: Radios-2 Way, Radios-2 Way, Wireless Communication Systems, Monitoring |
| 509 | [Grand View Products, Inc.](https://www.casinovendors.com/vendor/grand-view-products-inc/) Miami, Florida Grandview products has been re-manufacturing and distributing casino gaming machines since 1991. Although our headquaters are located in Miami FL, we have state of the art facilities located globally which were designed to consistently deliver quality standards of reconditio... Categories: Slot Machines, Used, Slot Machines, Refurbished, Equipment, Equipment, Slot Machines, Video Devices (used), Progressive Jackpot Equipment, Repair, Slot Machines, Used |
| 510 | [Grand Vision Gaming, LLC](https://www.casinovendors.com/vendor/grand-vision-gaming-llc/) Billings, Montana Grand Vision Gaming (GVG) is a designer and manufacturer of Class III Video Gaming Machines. GVG boasts an engineering team responsible for revolutionary gaming products that employ state of the art technology, highly interactive and imaginary game themes, and proprietary ca... Category: Slot Machines |
| 511 | [GrandeAffiliates](https://www.igamingaffiliateprograms.com/affiliate-program/grandeaffiliates/) Category: Affiliate Programs |
| 512 | [Grandville Printing Company](https://www.casinovendors.com/vendor/grandville-printing-company/) Grandville, Michigan Grandville Printing Company is a family owned company located in the heart of Grandville, Michigan. We are commited to value in everything we do. Offering offest web printing, sheetfed, and HP Indigo digital variable data printing as our foundation, we believe in servicing e... Categories: Printers, Manufacturers, Player Tracking Cards, Large Format, Full Service Agency |
| 513 | [Grandwell Industries Inc.](https://www.casinovendors.com/vendor/grandwell-industries-inc/) Fuquay-Varina, North Carolina We have provided digital solutions to local, national, and international customers since 1989.Our customers achieve great results in both their digital marketing and advertising strategies. All of our tech support customers receive courteous, professional and thorough suppor... Category: LED Systems, LED Systems |
| 514 | [GrandX Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/grandx-affiliates/) Category: Affiliate Programs |
| 515 | [Granite Mountain Stone Design](https://www.casinovendors.com/vendor/granite-mountain-stone-design/) Fresno, California Granite Mountain Stone Design is under the umbrella of Cold Spring Granite. Cold Spring Granite has been in business for over 100 years and owns over 33 quarrys nation wide, that allows us the ability to not only provide custom granite countertops but to also provide specifi... Category: Other |
| 516 | [Grant Sound & Lighting Inc](https://www.casinovendors.com/vendor/grant-sound-lighting-inc/) Ventura, California Grant Sound & Lighting, formerly known as Luners has been in business for over 35 years and provides superior service along with over a hundred high quality lines of equipment to choose from. From lighting and Audio system design, through installation and on to maintenance a... Category: Audio Systems, Systems |
| 517 | [Grant Thornton LLP](https://www.casinovendors.com/vendor/grant-thornton-llp/) Reno, Nevada Grant Thornton is one of the world's largest and most dynamic accounting and management consulting organizations. Our goal is to help our clients grow faster by providing business services that deliver measurable value. Category: Accounting, Consulting |
| 518 | [Grape Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/grape-affiliates/) Category: Affiliate Programs |
| 519 | [Graphic Composition, Inc.](https://www.casinovendors.com/vendor/graphic-composition-inc/) Greenville, Wisconsin Graphic Composition has been servicing our clients for over sixty years. Offering an experienced design, production and distribution staff to provide full service to our customers, from concept to completion on their projects. We look for ways to spoil our customers by del... Categories: Direct Mail, Printers, Distributors |
| 520 | [Graphic Controls](https://www.casinovendors.com/vendor/graphic-controls/) Buffalo, New York Graphic Controls is the world's largest manufacturer of TITO Slot Machine Tickets. Our global operations combine the latest printing technologies with the expertise and service of more than 90 years. From shrink-wrap ticket packs and custom printing to local warehousing and ... Categories: Coinless Systems, TITO Tickets, Thermal Products, Promotional Tickets, Manufacturing, Player Tracking Systems, Receipt Paper Rolls |
| 521 | [Graphic Encounter Fine Art](https://www.casinovendors.com/vendor/graphic-encounter-fine-art/) Basalt, Colorado Graphic Encounter Fine Art provides art, mirrors, framing + professional fine art consulting services to prominent interior designers, architects, project managers and purchasing agents throughout North America, Europe and the Far East. Since 1970,our Single Source concept b... Categories: Art, Art, Mirrors, Art, Art |
| 522 | [Graphic House](https://www.casinovendors.com/vendor/graphic-house/) Wausau, Wisconsin Graphic House is the leading manufacturer and designer of custom signage in the Midwest. They offer superior custom design, fabrication, installation and service to national accounts as well as companies in the region. When you work with our dedicated sales staff, youll see... Category: Outdoor |
| 523 | [Graphic Impact](https://www.casinovendors.com/vendor/graphic-impact/) Tucson, Arizona One source for full color digital output, printed materials, mailings, large routed signs, posters, name tags, architectural signage and awards and plaques. Founded in 1989, locally owned. Largest supplier in Southern Arizona. Our website at www.graphic-impact.com includes p... Category: Large Format |
| 524 | [Graphic Interfaces, Inc.](https://www.casinovendors.com/vendor/graphic-interfaces-inc/) San Diego, California We are a custom label/tag/ticket producer that offers outstanding quality at very competitive prices. Our in-house graphics department can enhance the success of your promotion. Categories: Labels, Other, Promotions, Printed Materials |
| 525 | [Graphic Solutions](https://www.casinovendors.com/vendor/graphic-solutions/) Greenwood, Indiana We handle several types of graphic and sign projects that you would have a need for. Whether it be event signage, outdoor, vinyl banners, billboards, displays, bannerstands and more. From paper, photographic, backlit, PSV, vinyl, mesh, perforated window clings, fabric and ma... Category: Digital Output |
| 526 | [Graphics International](https://www.casinovendors.com/vendor/graphics-international/) Van Nuys, California Graphics International has been a leading Designer and Manufacturer of Framed Art products such as framed posters, mirrors and wall decors for the hospitality industry for the past 28 years. Category: Mirrors |
| 527 | [Graphite Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/graphite-affiliates/) Category: Affiliate Programs |
| 528 | [GraphoNET Ltd](https://www.casinovendors.com/vendor/graphonet-ltd/) Category: E-commerce |
| 529 | [Gravure Alain Robitaille](https://www.casinovendors.com/vendor/gravure-alain-robitaille/) Portneuf, Quebec, Canada Our company made signage for hotel since 1991. We are located in Québec city in Canada. When we make signage, we make it for you and exactly as you want it. We can give suggest to raise the quality, lifetime and restore capacity of your signage. When we work for you, we work... Categories: Interior, Engraved Signs Manufacturer, Bronze, Metal Finishing, Architectural Signage and Graphics |
| 530 | [Graybar](https://www.casinovendors.com/vendor/graybar/) City of Industry, California Graybar, a Fortune 500 company, is a specialist in supply chain management services and the leading North American distributor of high-quality components, equipment and materials for the electrical and telecommunications industries.With more than $5 billion in revenue (2006)... Category: Supplies |
| 531 | [Grazgame](https://www.igamingsuppliers.com/vendor/grazgame/) Yerevan, Erevan, Armenia Category: Live Dealer |
| 532 | [Great American Insurance Company](https://www.casinovendors.com/vendor/great-american-insurance-company/) Windsor, Connecticut Great Americans Fidelity/Crime Division provides insurance to cover losses caused by Employee Dishonesty, Forgery, Theft, Robbery, Computer Fraud and Kidnap, Ransom and Extortion. One of our specialty areas is the casino industry. The gaming industry has an enormous turnove... Category: Insurance |
| 533 | [Great American Recreation Equipment, Inc.](https://www.casinovendors.com/vendor/great-american-recreation-equipment-inc/) Cranston, Rhode Island There are many reasons why Great American is your best choice when it comes to coin-operated or non coin-operated commercial tables. We have a commitment to quality that stretches back over 10 years. We are family owned, operated and made in the USA. Our products have a du... Category: Amusement Equipment |
| 534 | [Great Creativity Smart Card,Co. Ltd](https://www.casinovendors.com/vendor/great-creativity-smart-card-co-ltd/) Shenzhen, China Established in 1999, Shenzhen Chuangxin jia smart card co., Ltd was specialized in producing and marketing of pvc card and smart card. Category: Plastic Card Manufacturer |
| 535 | [Great Lakes Amusement](https://www.casinovendors.com/vendor/great-lakes-amusement/) Green Bay, Wisconsin Great Lakes Amusement is a leading distributor in gaming systems and supplies. We are committed to providing superior quality products, rapid delivery, and outstanding technical support. Our website www.glastore.com is a trusted marketplace that offers customers thousands of... Categories: Accessories, Electronic Games, New Game Manufacturer, Multi-player Games |
| 536 | [Great Lakes Scenic Studios](https://www.casinovendors.com/vendor/great-lakes-scenic-studios/) Burlington, Ontario, Canada At Great Lakes Scenic Studios' 30,000 square foot facility, located within a day's drive of more than a dozen major east-coast cities, our team of creative craftspeople, technical experts, installers, artisans and tradespeople have earned a reputation for building complex an... Categories: Theming, Other, Theming, Fabrication, Decorative Painting, Millwork |
| 537 | [Great Live Games](https://www.igamingsuppliers.com/vendor/great-live-games/) London, England, United Kingdom GreatLiveGames offers a “Real Time” multiplayer skill games software platform and has developed a scalable and secure infrastructure for online casual game communities. Our unique platform and exclusive skill games portfolio has over 21 exclusive games of skill. The platform... Category: Mahjong Software, Skill Games Software |
| 538 | [Greater Pacific Industries](https://www.casinovendors.com/vendor/greater-pacific-industries/) Bellevue, Washington Greater Pacific is a direct manufacturer of custom OEM product. Internal product safety and compliance program ensures safe and compliant product. Wide range of product categories including drink ware, bags, head wear, custom metal and plastic gifts and accessories. Proven t... Category: Promotional Items, Promotions |
| 539 | [Greater Southern Home Recreation](https://www.casinovendors.com/vendor/greater-southern-home-recreation/) Smyrna, Georgia Here at Greater Southern Home Recreation, we pride ourselves on being the one place in Georgia that has it all. With the best customer service in the industry and the most knowledgeable sales staff, we will be sure to make your experience with us the most enjoyable. Please... Category: Other |
| 540 | [GreatMenuCovers.com](https://www.casinovendors.com/vendor/greatmenucovers-com/) Milwaukee, Wisconsin GreatMenuCovers.com makes high-quality long-lasting cafe menu covers that are available in 16 standard colors to match decor and theme branding designs. Made in the USA with credit terms available for large purchases. Custom sizes and design requests welcome. Free samples av... Category: Trade Shows and Conferences, Menu Covers |
| 541 | [Grecian Delight Foods](https://www.casinovendors.com/vendor/grecian-delight-foods/) Elk Grove Village, Illinois Grecian Delight Foods, A Pure Mediterranean Foods Company, is located in Elk Grove Village, IL. The company was founded in 1974 by Peter Parthenis, Sr., and is still family held and operated by the Parthenis family. Grecian Delight is a manufacturer and marketer of top qu... Category: Other |
| 542 | [Green Chiropractic](https://www.casinovendors.com/vendor/green-chiropractic/) Omaha, Nebraska Created in 2005, Green Chiropractic offers pain relief for low back pain, headaches, sciatica, tingling fingers. We also offer scoliotic remodeling, sports injuries pain relief, acupuncture and personal training. We are located at 184th and West Center in front of LOWE'S. Category: Health Care Services |
| 543 | [Green Choice Vendors Distribution LLC](https://www.casinovendors.com/vendor/green-choice-vendors-distribution-llc/) New York, New York Green Choice Vendors is a full service distributor of environmentally safe alternative food service products, bags and treeless paper products. We offer a wide range of biodegradable and compostable products made from renewable resources. We provide clients the convenience... Categories: Disposable Tableware, Promotions, Supplies, Supplies, Other |
| 544 | [Green Coin Machines, Inc.](https://www.casinovendors.com/vendor/green-coin-machines-inc/) Myrtle Beach, South Carolina Green Coin Machines Distributing has been in business for 46 years and is one of the leading distributors for home game room equipment East of the Mississippi. We sell pinballs, arcade videos, pool tables, jukeboxes, and much much more! We deliver to your door, NATIONWIDE. Category: Other |
| 545 | [Green Dragon (GD88)](https://www.igamingsuppliers.com/vendor/green-dragon-gd88/) Koh Thom District, Kandaal, Cambodia Category: Live Dealer |
| 546 | [Green Edge Systems Inc](https://www.casinovendors.com/vendor/green-edge-systems-inc/) Woodland Hills, California Leader in Signage, Hand Sanitizer Stands, Sneeze Guards, Crowd Control Social Distancing stanchions, Casino and waiting room Separation Shields Guard germ shields and separation wall shields for Casinos, Hospitals, Colleges and Universities and Schools. Categories: Masks and Shields, Masks and Shields, Hand Sanitizer, Theming, Surveys, Disinfection Equipment, Indoor Signage, Indoor Signage |
| 547 | [Green Energy Lighting Corporation](https://www.casinovendors.com/vendor/green-energy-lighting-corporation/) Cerritos, California Green Energy Lighting supplies the latest in energy efficient Lighting including: LED , Compact Fluorescent, Metal Halide, Halogen,and Miniature light bulbs. Category: Supplies |
| 548 | [Green Floral Crafts](https://www.casinovendors.com/vendor/green-floral-crafts/) San Jose, California We specialize in decorative accents made from natural and renewal resource materials. We sell one-of-a-kind real preserved/dried non-perishable florals that can be paired up with our bamboo and mango wood vases, which are light for easy transport, but large for stunning beau... Category: Interior Design |
| 549 | [Green Light Booking](https://www.casinovendors.com/vendor/green-light-booking/) Pleasant Grove, Utah Green Light Booking is a premier event entertainment company that works with many world-class entertainers and live bands, allowing individuals and event planning professionals to hire entertainment that wows crowds. We make it fun to find and book high quality corporate ent... Category: Production |
| 550 | [Green Squared](https://www.casinovendors.com/vendor/green-squared/) Meridian, Idaho At Green Squared, our purpose is to have a positive impact on our environment and to improve local communities through e-waste recycling fundraiser programs that uphold the highest quality environmental standards; all while making the world a better place. We provide free 91... Category: Waste Management |
| 551 | [Green Star Coffee - Santa Barbara Coffee LLC](https://www.casinovendors.com/vendor/green-star-coffee-santa-barbara-coffee-llc/) Santa Barbara, California Green Star Coffee sources only the finest, most intriguing coffees from the premier growing regions around the world. We offer 100% Certified Organic Fair Trade coffee, purchasing beans from villages and importers that are committed to fair trade and working towards better e... Category: Coffee |
| 552 | [Green Suites International](https://www.casinovendors.com/vendor/green-suites-international/) Upland, California Green Suites® International is the leading supplier of environmental products & programs to the lodging & hospitality industry. We've been "greening" hotels, resorts and casinos since 1993. We specialize in providing profitable solutions with environmental benefits. Call ... Category: Equipment, Amenities |
| 553 | [Green Trading, USA](https://www.casinovendors.com/vendor/green-trading-usa/) Chino, California Do your Bears Snore and Giggle? Ours do. We also feature wonderful Bear, Moose, Wolf, Buffalo, and all Wildlife Hats. Will fit from Children to Adults. Dozens of Plush Animal in all sizes. Prices starting at $2.50 each. No Min. Perfect for Casino Gifts and School Fund Raisin... Category: Plush Toys |
| 554 | [Greenberg Traurig](https://www.casinovendors.com/vendor/greenberg-traurig/) Miami, Florida Greenberg Traurigs global Gaming Practice advises clients on matters that a company operating in the gaming industry may face, including licensing, compliance, employment, real estate, intellectual property, litigation, corporate transactions, anti-money laundering regulati... Category: Other |
| 555 | [Greencorner USA](https://www.casinovendors.com/vendor/greencorner-usa/) Orlando, Florida In 1998, The Greencorner USA was established to manufacture Mediterranean umbrellas based on the 15 year experience of sister company Le Coinvert in Europe. Research of the American market had found that there was a need for extra large, heavy duty umbrellas with new square ... Category: Furniture, Outdoor |
| 556 | [Greene Forensic Accounting Solutions LLP](https://www.casinovendors.com/vendor/greene-forensic-accounting-solutions-llp/) Las Vegas, Nevada Greene Forensic Accounting Solutions LLP is a Certified Public Accounting and Consulting Firm providing professional services to the gaming industry. The firm provides financial investigation services, litigation support, internal audit, employer healthcare audits, employee... Category: Accounting, Auditing |
| 557 | [Greenfire Minerals](https://www.casinovendors.com/vendor/greenfire-minerals/) Lisbon, Portugal Greenfire Minerals is the leading & original manufacturer of luxury hospitality materiaals like semi precious stone on glass and ceramic,seashell tiles,coconut in resin,pebbles in resin and many other exotic stone tiles and slabs. Category: Architectural Design |
| 558 | [Greenheart Exchange](https://www.casinovendors.com/vendor/greenheart-exchange/) Chicago, Illinois Category: Temporary Personnel: Management and Financial |
| 559 | [Greenlight](https://www.igamingsuppliers.com/vendor/greenlight/) London, England, United Kingdom Category: Search Engine Optimization |
| 560 | [Greensleeves, Inc](https://www.casinovendors.com/vendor/greensleeves-inc/) Miami, Florida Since 1985, Greensleeves has installed and maintained extraordinary interior and exterior landscapes through Design, working in Europe, South America, Caribbean and the United States. Our purpose is to assist our clients to achieve their expectations in budget. Call today fo... Category: Interior Landscaping |
| 561 | [Greentube I.E.S. AG](https://www.igamingsuppliers.com/vendor/greentube-i-e-s-ag/) Vienna, Wien, Austria Greentube offers ready-to-use Skill Gaming solutions for the internet, mobile devices and iTV. Their white label solution generates gaming portals that fit the client's desired look and feel. As a developer of multiplayer games, Greentube's service offers multi-channel, mul... Categories: Backgammon Software, Skill Games Software, Poker Software |
| 562 | [Greenway Print Solutions](https://www.casinovendors.com/vendor/greenway-print-solutions/) Scottsdale, Arizona Greenway Print Solutions can print everything from simple brochures to full color annual reports, and everything in between. We manage every aspect of each project to produce the best end result in the fastest possible time, at the lowest possible price. We serve over 2,000... Categories: Tickets, Promotional Items, Promotions, Printed Materials, Newsletters, Direct Mail, Printers, Manufacturers, In-room Access |
| 563 | [Greenwell Chisholm Printing Company](https://www.casinovendors.com/vendor/greenwell-chisholm-printing-company/) Owensboro, Kentucky Greenwell Chisholm has been in business for over 85 years and our customer service and quality are superb. Greenwell Chisholm Printing Company will not accept a job unless we are sure we can meet the customers deadline. We would be happy to offer references if needed and sam... Categories: Printers, Manufacturers, Direct Mail, Promotions, Printed Materials |
| 564 | [Greenwich Technologies, Inc.](https://www.casinovendors.com/vendor/greenwich-technologies-inc/) Grosse Pointe, Michigan At Greenwich Technologies, our primary goal and main reason for our continued success is customer satisfaction. From casino hotels, to country clubs, to corporations around the world - our customers are our largest asset. As a Microsoft Certified Partner, Greenwich solution... Categories: Systems, Software, Systems, Software |
| 565 | [Greg Thompson Productions](https://www.casinovendors.com/vendor/greg-thompson-productions/) Seattle, Washington Greg Thompson Productions, the largest producer of casino musical revues in the world, has produced award-winning productions for Caesars, Casino Monte Carlo, Grand Casinos, Harrahs, Isle of Capri, Mirage, Sands, Trump, Microsoft, IBM, Boeing and many regional Indian Gaming ... Category: Music Production |
| 566 | [Gregory Friedlander & Assts.](https://www.casinovendors.com/vendor/gregory-friedlander-assts/) Mobile, Alabama Gregory M. Friedlander & Assts, P.C., www.gmfpc.com specializes in obtaining intellectual property protection and providing marketing assistance for clients. We provide information and services related to invention, innovation, new business startup and incorporating new tec... Category: Patent Attorney |
| 567 | [Gregory Gove Art](https://www.casinovendors.com/vendor/gregory-gove-art/) Chicago, Illinois Not an Art factory like most mural companies. You work directly with individual doing the work. Good communication. Easy to deal with. Distinguished client list. Centrally located, and will travel. Category: Art |
| 568 | [Gregory Signs](https://www.casinovendors.com/vendor/gregory-signs/) Toronto, Ontario, Canada Gregory Signs has been providing a variety of signage since 1981. Our educational staff have been trained in many fields like engineering, architecture and designing. Gregory Signs is a custom manufacturer so we build to your needs or we can even design you sign. When you... Categories: Exterior, Illuminated, Exterior, Design, Illuminated, Indoor, Exterior, Non-illuminated |
| 569 | [Gregory, Inc.](https://www.casinovendors.com/vendor/gregory-inc/) Buhler, Kansas Gregory is both a wholesale graphics manufacturer and an international distributor of sign materials and supplies. As a distributor we represent 3M, Oracal, Arlon, Sihl, SignGold, R-Tape and Transfer Rite to name a few. We can supply your casino sign shop with many of the co... Categories: Digital Output, Exterior, Interior, Banners, Digital Printing, Digital Graphics, Labels, Large Format, Screen Printing, Wallcoverings, Murals, Graphics, Windows, Signage, Banners, Visual Communications |
| 570 | [Gremillion and Pou Integrated Marketing](https://www.casinovendors.com/vendor/gremillion-and-pou-integrated-marketing/) Shreveport, Louisiana In the ever-changing and competitive realm of casino marketing, Gremillion and Pou Marketing understands the need to be available and aware 24/7. Our casino marketing team consists of former casino employees and directors, marketing specialists, strategic analysts and ga... Category: Full Service Agency, Consulting |
| 571 | [Grenald Waldron Associates](https://www.casinovendors.com/vendor/grenald-waldron-associates/) Narberth, Pennsylvania We provide quality lighting solutions to people who understand and appreciate the value of good lighting. At Grenald Waldron Associates, by integrating the fields of architecture, lighting design, and psychology, we are able to tailor our approach to each project, always se... Category: Consulting |
| 572 | [Greneker](https://www.casinovendors.com/vendor/greneker/) Los Angeles, California Greneker Solutions designs and manufactures Visual Merchandising and Thematic products. Visual merchandising products include forms and mannequins, specialized fixtures, and product display components. Theming products include custom theme fixturing, architectural displays... Category: Fabrication |
| 573 | [Gretna Bingo Palace](https://www.casinovendors.com/vendor/gretna-bingo-palace/) Gretna, Louisiana We offer 27 sessions weekly and all games are played as scheduled. The organizations served by the hall are: David Crockett Fire Company, German American Cultural Center, Westbank Rotary Club, Gretna Economic Development, Gretna Historical Society, Gretna Police Benevolent S... Category: Other |
| 574 | [Greyhound Lines, Inc.](https://www.casinovendors.com/vendor/greyhound-lines-inc/) New York, New York Greyhound “Lucky Streak” service offers coast to-coast schedules directly to casinos in Atlantic City, NJ; Las Vegas, Reno and Lake Tahoe. There is also service to the Native American casinos at Foxwoods in Ledyard, CT. Hotard, a wholly-owned Greyhound company, operates ser... Category: Other |
| 575 | [Greystone Energy Systems](https://www.casinovendors.com/vendor/greystone-energy-systems/) Somerset, Pennsylvania Manufacturer of HVAC Sensors and Instruments CO Monitors, CO2 Monitors, Humidity and Temperature Sensors Wall mount space sensors and HVAC duct mounted sensors for building automation systems. Category: Energy Management Systems |
| 576 | [GRG Banking Equipment Co Ltd](https://www.casinovendors.com/vendor/grg-banking-equipment-co-ltd/) Guangzhou, China GRGBanking is a leading provider of currency recognition and cash processing solutions in the global market with great potential and rapid development. We specialize in the development & manufacturing of Automatic Teller Machine (ATM) for financial institutions and retailers... Category: Bill Validators |
| 577 | [Griffin Investigations, Inc.](https://www.casinovendors.com/vendor/griffin-investigations-inc/) Las Vegas, Nevada Griffin Investigations, Inc. is the premiere trusted leader in the field of Gaming Investigation. We have been identifying advantage players, cheaters and casino criminals successfully since 1967. Our GOLD Database is an effective and affordable solution in helping you prote... Category: Information |
| 578 | [Griffin Valuation Group](https://www.casinovendors.com/vendor/griffin-valuation-group/) Chicago, Illinois Griffin Valuation Group provides Cost Segregation & Property Tax consulting to commercial and industrial property owners nationwide which provides substantial increases in cash flow and shareholder value. We provide Big-4 tax accounting experience and quality without the bi... Category: Accounting |
| 579 | [Griner Engineering, Inc.](https://www.casinovendors.com/vendor/griner-engineering-inc/) Bloomington, Indiana We do high-volume rotary transfer machining on turned parts.We do high-volume screw machining with secondary.We do some production CNC machining center work using 4 vertical and horizontal machining centers purchased this year.We have a new 6'x12'Flow water-jet which we want... Category: Engineering, Mechanical |
| 580 | [GRIPS USA](https://www.casinovendors.com/vendor/grips-usa/) La Jolla, California The GRIPS Display is the most accurate and reliable Reader Board on the market. We introduced the Roulette Display into the USA in 1990, and have since added Baccarat Displays and BJ Displays to our portfolio. For Roulette, our Optical Reader automatically detects the winnin... Categories: Equipment, Electronic Signs, Electronic Signs, Electronic Signs |
| 581 | [Grommes-Precision](https://www.casinovendors.com/vendor/grommes-precision/) Gurnee, Illinois Made in the U.S.A. commercial audio equipment. Including 70 volt amplifiers, microphone mixer, Hi-Fi Tube Gear, and custom audio electronics. A service oriented company with immediate answers to your questions...No voice mail system tio get lost in. Category: Parts |
| 582 | [Groove Leather](https://www.casinovendors.com/vendor/groove-leather/) Montvale, New Jersey Category: Other |
| 583 | [Groove Technologies](https://www.igamingsuppliers.com/vendor/groove-technologies/) Sliema, Malta Groove was founded in 2016 by a group of professionals who all had the dream of creating an exclusive service so entrepreneurs could meet the growing gaming needs of the world. Collectively we have over 150 years of experience in all aspects of online business and e-commerce... Categories: Casino Software, Mobile Gaming, Bingo Software, Lottery Software, Sportsbook Software, Gambling Operations |
| 584 | [Group III International, Inc.](https://www.casinovendors.com/vendor/group-iii-international-inc/) Pompano Beach, Florida Group III International, based in Pompano Beach, FL. Company founded 1982. Sales over $120 million per year. Offices in USA, China, Taiwan and Thailand. Category: Medical Gloves, Medical Gloves |
| 585 | [Group One Media](https://www.casinovendors.com/vendor/group-one-media/) Yuen Long, Hong Kong Group One Media is a dynamic internet marketing company operating numerous websites across a wide portfolio of niches in a vast array of countries. Our core business is email marketing to our members on a performance basis, clients only pay on results! Every month we drive t... Category: Internet |
| 586 | [Group West Companies PLLC](https://www.casinovendors.com/vendor/group-west-companies-pllc/) Seattle, Washington Group West Companies offers comprehensive services in architectural/interior design and development strategies with a major focus on gaming and hospitality. Category: Architectural Design, Interior Design |
| 587 | [Groupartners](https://www.igamingaffiliateprograms.com/affiliate-program/groupartners/) Category: Affiliate Programs |
| 588 | [Groupe Lucien Barriere (GLB)](https://www.casinovendors.com/vendor/groupe-lucien-barriere-glb/) Paris, France Created in 1912 by François André, Barrière has perfectly illustrated the prestige of French luxury and expertise for more than a century. Shaped by three generations of passionate, visionary entrepreneurs, today it serves as a shining example of French luxury hospitality an... Category: Other |
| 589 | [Grover Gaming, Inc.](https://www.casinovendors.com/vendor/grover-gaming-inc/) Greenville, North Carolina Grover Gaming has extensive experience in developing Video Slot and Casino Game Content and is now licensing their premium games for a variety of gaming markets including social and real money gaming. Lottery Solutions Online Lottery Gaming System Video Slot Game Desig... Categories: Mobile Gaming, Lottery Software, Game Design, Software, Class II Tabs-video Devices, Video Game Software, Casino Software, Bingo Software, Pull-tab Equipment, New Game Manufacturer, Skill Games Software, Electronic Systems, Lottery Software, Other |
| 590 | [Growe Partners](https://www.igamingaffiliateprograms.com/affiliate-program/growe-partners/) Category: Affiliate Programs |
| 591 | [GRS Global Recruitment Solutions Ltd](https://www.igamingsuppliers.com/vendor/grs-global-recruitment-solutions-ltd/) Limassol, Lemesos, Cyprus GRS is a specialist international recruitment consultancy based in Cyprus, the gateway to Europe and Middle East. We offer recruitment and managed recruitment services for clients and candidates across Cyprus and internationally. The GRS culture is underpinned by a basic ... Category: Recruitment |
| 592 | [Gruber Industries](https://www.casinovendors.com/vendor/gruber-industries/) Phoenix, Arizona Category: Fiber Optics Products |
| 593 | [Gruppo Extraball](https://www.casinovendors.com/vendor/gruppo-extraball/) San Cesareo, Lazio, Italy The Group Extraball is today one of the largest in central Italy in the rental of automatic equipment for entertainment such as: New Slot Machines, Video Lotteries, vending gadgets, mobiles, and much more, at public establishments such as bars, amusement arcades and betting,... Category: Vending Machines |
| 594 | [Gryndstone and Fusspot Press](https://www.casinovendors.com/vendor/gryndstone-and-fusspot-press/) North Vancouver, British Columbia, Canada Cartoonist Graham Harrop's gentle satires have been making people chuckle about politics, celebrity culture and other strange animals for more than 2 decades. His cartoon collections are lively and never unkind, and offer a lighter side to contemporary life. Graham also cr... Category: Books |
| 595 | [Gryphon, Inc.](https://www.casinovendors.com/vendor/gryphon-inc/) Buffalo Grove, Illinois Since 1985, Gryphon has been a distributor for ONEAC-POWERVAR. Gryphon provides its customers worldwide with the best power and environmental protection solutions for their sensitive microprocessor-based electronic equipment. POWERVAR manufactures premium-grade power prote... Category: Batteries |
| 596 | [GS Plastic Optics](https://www.casinovendors.com/vendor/gs-plastic-optics/) Rochester, New York G&H | GS Optics dates back to a small machine shop - located in Rochester, NY and founded in 1916. The business quickly grew to become a major supplier of replacement watch crystals made of plastic. Today, G&H | GS Optics specializes in the custom design and manufacture o... Category: LED Systems |
| 597 | [GSH Casino Parties](https://www.casinovendors.com/vendor/gsh-casino-parties/) Des Plaines, Illinois After working in the casino party industry for more than 5 years, the partners at The GSH Group knew it was time for a change. They recognized that better organized, more enthusiastic, and more fun events were needed. The GSH Group officially opened its doors to provide Casi... Categories: Equipment, Party Rental, Slot Machines, Blackjack Tables, Equipment, Accessories |
| 598 | [GSH Online Media](https://www.igamingaffiliateprograms.com/affiliate-program/gsh-online-media/) Bucuresti, Romania GSH Online Media is a high-quality online lead generation company within the iGaming industry, targeting Casino and Sportsbook players from multiple GEOs. Websites owned by GSH are representing authority in the industry. For example, BetBrain it the first and the best odds c... Category: Affiliate Programs |
| 599 | [GSN - Game Show Network LLC](https://www.igamingsuppliers.com/vendor/gsn-game-show-network-llc/) GSN is a multimedia entertainment company that offers original and classic game programming and competitive entertainment via its 80-million subscriber television network and online game sites. GSNs cross-platform content gives game lovers the opportunity to win cash and pr... Categories: Casino Software, Bingo Software, Skill Games Software |
| 600 | [GSP Systems, Inc.](https://www.casinovendors.com/vendor/gsp-systems-inc/) Bucheon City, Gyeonggido, South Korea Category: Other |
| 601 | [GSpin Partners](https://www.igamingaffiliateprograms.com/affiliate-program/gspin-partners/) Category: Affiliate Programs |
| 602 | [GT Advertising, LLC](https://www.casinovendors.com/vendor/gt-advertising-llc/) Las Vegas, Nevada GT Advertising is a major provider of email appends for the casino hotel industry in both commercial and Native gaming and hospitality. Category: Internet, Internet |
| 603 | [GT Holdings (GamyTech)](https://www.igamingsuppliers.com/vendor/gt-holdings-gamytech/) Ta' Xbiex, Malta Gamytech develops and manages software platforms aimed for the iGaming industry. We deliver a holistic white labelled solution, which is scalable, consistent and enables real time gaming. We are a team of experts equipped with extensive knowledge and experience in the gaming... Categories: Backgammon Software, Skill Games Software, Mobile Gaming, Casino Software, Mobile Gaming, Affiliate Program Software, Mobile Gaming, Mobile Gaming, Gambling Operations |
| 604 | [GTE Localize](https://www.igamingsuppliers.com/vendor/gte-localize/) Singapore, Singapore GTE Localize is a fast-growing global translation and localization agency, providing services for all major languages in the world. Our solutions include translation, localization, interpretation, subtitling and transcription. Our experience has been solidly gathered by our ... Category: Translation Services |
| 605 | [GTG Advocates](https://www.igamingsuppliers.com/vendor/gtg-advocates/) Valletta, Malta GTG advocates is a full-service corporate and commercial firm spanning a diverse array of disciplines and distinguished by its unsurpassed expertise in shipping, financial services, information technology and i-gaming. At GTG, we have one compelling mission: to deliver value... Category: Licensing and Regulation, Consulting |
| 606 | [GTi Freight](https://www.casinovendors.com/vendor/gti-freight/) Coral Springs, Florida GTi Freight is a privately held, US based logistics company specializing in freight management services including LTL, Full Truckload, Supply Chain Management, and Domestic Air/Expedited shipping. We focus on innovative technology and partnering with sales professionals that... Categories: Shipping, Expediting Services, Equipment Trailers, Other, Trucking |
| 607 | [GTI GAMING SRL DBA as GTI - Giochi Tecnologici Italiani](https://www.casinovendors.com/vendor/gti-gaming-srl-dba-as-gti-giochi-tecnologici-italiani/) Milano, Lombardia, Italy GTI is the new leading Casino Currency manufacturer and (RFID) Casino Currency Inventory, Management and Security systems and products manufacturer and developer. GTI is a technology product and system provider for casino. We produce electronic chips, jetons and plaques and... Category: Chips, Chips |
| 608 | [GTreasury](https://www.casinovendors.com/vendor/gtreasury/) Lake Zurich, Illinois Founded in 1986, GTreasury has become a leading global provider of treasury management systems. The company offers a full suite of solutions, including cash management, funds transfers, accounting and more! Check out their website today for more information. Category: Accounting Systems |
| 609 | [GTSource, Inc.](https://www.casinovendors.com/vendor/gtsource-inc/) Kennesaw, Georgia GTSource offers complete turnkey Class-II/III gaming solutions including cabinet and cabinet design. GTSource compliments the cabinets with their LogixCube gaming specific computer platform, I/O Suite Hardware and game harness assemblies. GTSource also offers game refurbishm... Category: Slot Machines |
| 610 | [GTSS Minds](https://www.casinovendors.com/vendor/gtss-minds-1/) Hamilton, New Jersey Our vision is our framework within which our employees work. Our vision statement guides us through every endeavor and helps achieve sustainable growth for every person involved with GTSS. Category: Consulting |
| 611 | [GTT Co., Ltd.](https://www.casinovendors.com/vendor/gtt-co-ltd/) Goyang-shi, Gyeonggido, South Korea Rugged LCD Monitors Category: LCD |
| 612 | [GTT Communications, Inc.](https://www.casinovendors.com/vendor/gtt-communications-inc/) McLean, Virginia GTT connects people across organizations, around the world and to every application in the cloud. GTT owns and operates a global Tier 1 internet network and provides a comprehensive suite of cloud networking services. Category: Systems Integration Services, Network Services |
| 613 | [Guangdong Phoenix Lighting Co., Ltd.](https://www.casinovendors.com/vendor/guangdong-phoenix-lighting-co-ltd/) Guangzhou, Guangdong, China Guangdong Phoenix Lighting Co., Ltd., founded in 2002, manufactures a wide range of professional stage products, including Moving Head Light, Scanner Light,Follow Spot Light,Lighting Controller,Laser Light, LED light, Strobe Light, outdoor Light, Fog machine,Bubble Machine,S... Category: Effects |
| 614 | [Guangxi Pinglu Group Co., Ltd.](https://www.casinovendors.com/vendor/guangxi-pinglu-group-co-ltd/) Nanning, Guangxi, China Guangxi Pinglu Group Co., Ltd. is a comprehensive large-scale enterprise specializes in aluminum, curtainwall, wire and cable industry development, manufacturing and product development, as well as real estate, hotel, import and export business. Category: Materials |
| 615 | [Guangzhou 3Hz Solar Technology Co.,Ltd](https://www.casinovendors.com/vendor/guangzhou-3hz-solar-technology-co-ltd/) Guangzhou, China Guangzhou 3Hz Solar Technology Co.,Ltd is a leading PV product manufacturer and system integration service provider. We aim at providing customers with the design, manufacture, installation & maintenance service of individualized, professionalized and systematized PV applica... Category: Other |
| 616 | [Guangzhou Aolait Lighting Co.,Ltd](https://www.casinovendors.com/vendor/guangzhou-aolait-lighting-co-ltd/) Guangzhou, Guizhou, China Guangzhou Aolait Lighting Co.,Ltd is a professional stage lighting enterprise with integration of Research and development, production, sales and service. Main products range from intelligent moving head light series, led lighting series and accessories for stage equipment. ... Category: Manufacturer |
| 617 | [Guangzhou Blossom Stage Lighting Equipment Co., Ltd](https://www.casinovendors.com/vendor/guangzhou-blossom-stage-lighting-equipment-co-ltd/) Guangzhou, Guangdong, China Guangzhou Blossom stage lighting factory ,established in 2003, is a factory of lighting reproducing apparatus, specialized in R & D and manufacture & sale. Over the years, it continues to provide lighting and sound with high-quality, professional technology and great support... Category: Manufacturer |
| 618 | [Guangzhou Creative Stage Equipment Factory](https://www.casinovendors.com/vendor/guangzhou-creative-stage-equipment-factory/) Guangzhou, Guangdong, China Guangzhou Creative Stage Equipment Co.,Ltd. is the manufacturer in Guangzhou,CHINA, we are professional on designing ,manufacturing and marketing various high quality professional performance equipments , including all kinds of aluminium truss , stage truss, stage lighting ... Categories: Fixtures, Systems, Fixtures, Stage Equipment |
| 619 | [Guangzhou HOATOA Digital Technology Co.,Ltd](https://www.casinovendors.com/vendor/guangzhou-hoatoa-digital-technology-co-ltd/) GuangZhou, Guangdong, China Guangzhou HOATOA Digital Technology Co.,Ltd was incorporated in 2000. It is located in Bai Yun District of Guangzhou City. It is professional in car DVD player and car LCD monitor. The modernized factory takes up about 5000 square meters, there are several engineers and mor... Category: Other |
| 620 | [Guangzhou JR Lighting Equipment Co.,Ltd](https://www.casinovendors.com/vendor/guangzhou-jr-lighting-equipment-co-ltd/) Guangzhou, Guangdong, China Guangzhou JR Lighting, a professional manufacturer of Stage lighting, including LED PAR Light, LED BAR Light,Matrix Audience Blinder,Moving Head Light,Mirror Ball,Theatre Projector,Effect Machine, City Color/Sky Light,Controller,Accessories, etc. Category: Lighting Equipment |
| 621 | [Guangzhou Likang Electronic Technology Co., Ltd](https://www.casinovendors.com/vendor/guangzhou-likang-electronic-technology-co-ltd/) Guangzhou, Guangdong, China Guangzhou Likang Electronic Technology Co. Ltd. is a famous company in china. We are mainly producing electronic coin selector and ticket outlet. Category: Coin Handling Equipment |
| 622 | [Guangzhou LiQi Intelligent Technology Co., Ltd](https://www.casinovendors.com/vendor/guangzhou-liqi-intelligent-technology-co-ltd/) Guangzhou, China Guangzhou LiQi Intelligent Technology CO.,LTD. founded in year 2000, and obtained the Certificate of Verification for Software Enterprises and the Certificate of Verification for Software Products, is specialized in self-service touch screened equipments and the total soluti... Category: Kiosks |
| 623 | [Guangzhou Mingfine Electronic Co., ltd](https://www.casinovendors.com/vendor/guangzhou-mingfine-electronic-co-ltd/) Guangzhou, China Guangzhou Mingfine Electronic Co., Ltd. was established in 2001, which located in Guangzhou city, China, is a professional CCTV equipment designer and manufacturer. We have knowledgeable and young research, improving, manufacturing and sales teams. We can supply good aft... Category: CCTV Systems |
| 624 | [Guangzhou PURUI Electronic Co.,Ltd](https://www.casinovendors.com/vendor/guangzhou-purui-electronic-co-ltd/) Guangzhou, Guangdong, China Guangzhou purui Electronic Co., Ltd. locates in Guangzhou, China, found in 1995. It is a professional manufacturerer of LED display screen integrating R&D, design, production, marketing and after-sales service of LED displays. Guangzhou purui offer all types of indoor an... Category: LED Systems |
| 625 | [Guangzhou Rohin Electronic Co.](https://www.casinovendors.com/vendor/guangzhou-rohin-electronic-co/) Guangzhou City, China Rohin Electric is a factory which specializes in the development & manufacturing of all kinds of games and amusement machines. Our goal is to be committed to excellence in providing services and products to various markets and customers all over the world. Category: Themed Devices |
| 626 | [Guangzhou Ruixin Touch Control Technology Co., Ltd.](https://www.casinovendors.com/vendor/guangzhou-ruixin-touch-control-technology-co-ltd/) Guangzhou, Guangdong, China Guangzhou RUIXIN Touch Control Technology Co., Ltd, established in 2001, is a professional manufacturer of touch monitor and touch screen related products integrated with R&D and sales. Category: Touchscreens |
| 627 | [Guangzhou WATCHMAN Electronic Technology Co., LTD](https://www.casinovendors.com/vendor/guangzhou-watchman-electronic-technology-co-ltd/) Guangzhou, Guangdong, China Established in 1997, Guangzhou WATCHMAN Electronic Technology co., ltd is a large high tech enterprise specialized in R&D, manufacturing and supply, and marketing of product in security and surveillance electronics. Our high quality CCTV product and well designed system have... Category: CCTV Systems |
| 628 | [Guaranteed On Site](https://www.casinovendors.com/vendor/guaranteed-on-site/) Paulsboro, New Jersey State certified flame retardant applicators that will work with you and local Fire Marshals to bring your facility into compliance. Quick response and guaranteed work. Work can be performed on and off site. Fully insured and free estimates. Category: Dry Cleaning Design |
| 629 | [Guard Security](https://www.casinovendors.com/vendor/guard-security/) New York, New York Guard Security is fully licensed and insured. Due to our vast experience and motivated staff, we can offer far more than an ordinary security company. There is no comparison to our trained, experienced Security Officers to a 20-hour trained security guard. Guard Securi... Category: Officers |
| 630 | [Guardall Limited](https://www.casinovendors.com/vendor/guardall-limited/) Edinburgh, United Kingdom Category: Access Control, Other |
| 631 | [Guest Access International](https://www.casinovendors.com/vendor/guest-access-international/) Midland, Texas Guest Access, Intl offers premium quality laminated plastic guest access-related items direct from the factory. Stock and customized items are available(turnkey from card production to fulfillment and program management). Supplier and program management for many hotel hold... Category: Plastic Card Manufacturer |
| 632 | [Gul Group Industries](https://www.casinovendors.com/vendor/gul-group-industries/), Punjab, Pakistan We are pleased to introduce ourselves as a leading manufacturing and exporting company of highest standard Motorbike and Fashion Leather, Textile Garments & Gloves have been producing quality products for many years now. We have our own tannery where we produce best qual... Category: Apparel |
| 633 | [Gulf Islands Promotion](https://www.casinovendors.com/vendor/gulf-islands-promotion/) Biloxi, Mississippi Gulf Islands Promotion is your low cost choice for all things promotion. As part of a major buying group, we are able to offer almost unlimited product offerings at prices that will allow your promotional budget to stretch further! With over 14 years experince in the Casino... Category: Promotional Items |
| 634 | [Gulf Marine Products](https://www.casinovendors.com/vendor/gulf-marine-products/) Westwego, Louisiana Since 1988, Gulf Marine has become a leading processor of domestic and imported shrimp, crawfish tail meat and whole-cooked crawfish.Taking pride in excellent customer service and timely information, Gulf Marine's personnel create a seamless bridge between the producer and t... Category: Seafood |
| 635 | [Gulfport Industrial Supply](https://www.casinovendors.com/vendor/gulfport-industrial-supply/) Gulfport, Mississippi Locally owned, knowing the casino industry needs quick service and we have competitive pricing. Category: Wheels and Casters |
| 636 | [Gunderson, Palmer, Goodsell & Nelson LLP](https://www.casinovendors.com/vendor/gunderson-palmer-goodsell-nelson-llp/) Rapid City, South Dakota Category: Other |
| 637 | [Gunnebo Entrance Control, Inc.](https://www.casinovendors.com/vendor/gunnebo-entrance-control-inc/) Benicia, California We are world leading specialist in entrance control solutions and manufacturers of entrance gates for a broad range of applications including corporate offices, casinos, metro, airports and stadiums. From basic Tripod Turnstiles to our advanced SpeedGates, Revolving Securit... Categories: Access Control, Access Control, Access Control, Access Control |
| 638 | [GunsBet Affiliates](https://www.igamingaffiliateprograms.com/affiliate-program/gunsbet-affiliates/) Category: Affiliate Programs |
| 639 | [Guntex Industries, Inc.](https://www.casinovendors.com/vendor/guntex-industries-inc/) Chattanooga, Tennessee Our custom manufactured bags are designed for banks, casinos, and vending companies who use specialty bags in their daily operations. We offer custom printing services for customers wishing to personalize our bags with their company name and logo. Category: Coin Bags |
| 640 | [Guovin Technology Limited](https://www.casinovendors.com/vendor/guovin-technology-limited/) Shenzhen, Guangdong, China Established in 2008, Guovin Technology Limited is one of the leading manufacturer for high quality CCTV cameras and DVRs in Shenzhen China. Our product range including AHD/TVI/CVI Camera, IP Camera, PTZ Camera, DVR, NVR etc. GUOVIN focus on OEM & ODM, offer high-quality,best... Category: CCTV Systems |
| 641 | [Guowo Autoparts Co., Ltd](https://www.casinovendors.com/vendor/guowo-autoparts-co-ltd/) Qingdao, Shandong, China Guowo Autoparts Co.,Ltd is a leading auto parts manufacturer specialized in producing multi leaf spring,parabolic leaf springs, pin ,U-bolt,bush. We have more than 500 workers and 45 technicans, with the experienced R&D staff, advanced production equipments, strict quality c... Category: Assembly |
| 642 | [GVA Marquette Advisors](https://www.casinovendors.com/vendor/gva-marquette-advisors/) Minneapolis, Minnesota Leaders in feasibility consulting, market research, valuation, economic impact analysis and litigation support for casinos, hotels, resorts, golf, convention centers, RV parks, water parks, bowling, entertainment, retail, amusements and attractions. Category: Feasibility Studies |
| 643 | [GVG - Green Valley Games](https://www.igamingsuppliers.com/vendor/gvg-green-valley-games/) Categories: Casino Software, Lottery Software, Mobile Gaming |
| 644 | [GVision USA](https://www.casinovendors.com/vendor/gvision-usa/) Lake Forest, California GVISION is a leader in LCD display technologies, with their strategic blend of comprehensive product line, exceptional component sourcing consistency and high standards of cost-conscious quality manufacturing. This allows GVISION to deliver significant price/performance adva... Categories: Touchscreens, LCD, Monitors, Monitors, Open Frame |
| 645 | [GVZH Advocates](https://www.casinovendors.com/vendor/gvzh-advocates/) Valletta, Malta GVZH Advocates is one of Maltas leading legal practices actively involved in e-commerce and remote gaming law. The firm offers a full spectrum of services including company registration, preparation and co-ordination of all aspects of the application process with the Lotter... Categories: Licensing and Regulation, Gaming Licensing, Contract Management |
| 646 | [GWbet Affiliate](https://www.igamingaffiliateprograms.com/affiliate-program/gwbet-affiliate/) Category: Affiliate Programs |
| 647 | [GWIN Game](https://www.igamingsuppliers.com/vendor/gwin-game/) GWIN offers the white label solution services for Mobile web and PC gaming sites. We have 15 years of experience operating in the Asia Online Gaming market.The Most advanced functions of Mobile web gaming sites, and the integration of 15 Top Platforms of gaming product wi... Category: Platform Providers, Gambling Operations |
| 648 | [GX Trade Co., Ltd](https://www.casinovendors.com/vendor/gx-trade-co-ltd/) Caton, Guangdong, China Our company was founded in 2002,specialized in producing a series of marked cards and Europe Poker Club entertainment products. Golden Sunshine is a leading brand. We develop the newest luminous marked cards and Texas scanner system, which can be applied to any brand of poke... Category: Direct Marketing |
| 649 | [Gypsy Partners](https://www.igamingaffiliateprograms.com/affiliate-program/gypsy-partners/) Category: Affiliate Programs |
| 650 | [GZ Technologies, Inc.](https://www.casinovendors.com/vendor/gz-technologies-inc/) Taipei County, Taipei, Taiwan GZ TECHNOLOGIES, INC., member of Microsoft Embedded Partner, has more than 150 years of engineering experiences in Industrial and Gaming Solutions, especially ARM series and X86 based processors with Windows CE, Windows XP, XP Embedded, and Linux support. Our focus is to pr... Categories: Electronic Games, Electronic Games, Systems |
Featured Vendors
| [Casino Network](https://www.casinovendors.com/vendor/casino-network/) 20+ years experience selling refurbished slot machines, parts & glass for all major brands | [Casino City Press](https://www.casinovendors.com/vendor/casino-city-press/) A leading publisher and distributor of casino and gaming business data and market research reports. |
| --- | --- |
| [K2J Marketing Partners](https://www.casinovendors.com/vendor/k2j-marketing-partners/) Were not just a gifting provider—were an extension of your marketing team driving proven results. | [TribalHub](https://www.casinovendors.com/vendor/tribalhub/) 27th Annual TribalNet Conference Sept 20-24, 2026 at Hilton Anatole Dallas in Dallas, TX |
| [Oklahoma Indian Gaming Association (OIGA) Conference](https://www.casinovendors.com/vendor/oklahoma-indian-gaming-association-oiga-conference/) The biggest little show in Indian gaming! Save the date: July 20-22, 2026 Oklahoma City | [Innovative Configuration Inc.](https://www.casinovendors.com/vendor/innovative-configuration-inc/) I-Games Anywhere-Anytime - Win Product-Service-Activity-Attraction Discounts at Favorite Casinos. |
| [Patriot Gaming & Electronics, Inc.](https://www.casinovendors.com/vendor/patriot-gaming-electronics-inc/) Patriot Gaming…Parts is what we do. Visit us: www.patriotgaming.com | [Rymax Marketing Services, Inc.](https://www.casinovendors.com/vendor/rymax-marketing-services-inc/) Leader in creating award winning player & employee loyalty programs & events proven to increase ROI |
| [Slot Machines Unlimited](https://www.casinovendors.com/vendor/slot-machines-unlimited/) Exporter of IGT, Williams, AVP, Trimline, Aristocrat, Konami, Bally, & parts over 20 yrs experience | [Sunkist Graphics, Inc.](https://www.casinovendors.com/vendor/sunkist-graphics-inc/) Specializing in the creation of best-of-breed gaming graphics - slot glass, sign faces, and more |
| [Betson Imperial Parts & Service](https://www.casinovendors.com/vendor/betson-imperial-parts-service/) Your one stop shop for all your gaming and OEM needs! | [Regulatory Management Counselors, PC](https://www.casinovendors.com/vendor/regulatory-management-counselors-pc/) Over 45 years of experience serving the legal and regulatory needs of casino industry clients |
Your Guide to 13,687 Gaming Industry Suppliers
[ADD YOUR COMPANY](https://www.casinovendors.com/signup/default.aspx?action=add)| [ABOUT US](https://www.casinovendors.com/aboutus/)
Vendors By Category
»
[Legal Services & Licensing](https://www.casinovendors.com/category/administration-and-finance/legal-services-and-licensing/)
[Advertising, Marketing and Sales](https://www.casinovendors.com/category/advertising-marketing-and-sales/)
»
[Audio/Visual, Electrical and Signage](https://www.casinovendors.com/category/audio-visual-electrical-and-signage/)
»
»
[ATM & Credit Cards](https://www.casinovendors.com/category/cash-chips-money-cards/atm-credit-cards/)
[Magnetic Cards and Readers](https://www.casinovendors.com/category/cash-chips-money-cards/magnetic-cards-and-readers/)
[Disease Prevention and Safety](https://www.casinovendors.com/category/disease-prevention-and-safety/)
»
[Cleaning, Disinfection and Sanitation](https://www.casinovendors.com/category/disease-prevention-and-safety/cleaning-disinfection-and-sanitation/)
[Touchless Systems and Supplies](https://www.casinovendors.com/category/disease-prevention-and-safety/touchless-systems-and-supplies/)
[Entertainment and Special Events](https://www.casinovendors.com/category/entertainment-and-special-events/)
»
[Facility Security, Design and Construction](https://www.casinovendors.com/category/facility-security-design-and-construction/)
»
[Gaming Equipment and Supplies](https://www.casinovendors.com/category/gaming-equipment-and-supplies/)
»
[Hotel, Retail, Food and Beverage](https://www.casinovendors.com/category/hotel-retail-food-and-beverage/)
»
»
»
[Trade Shows & Seminars](https://www.casinovendors.com/category/miscellaneous/trade-shows-seminars/)
Vendors A-Z
---
Copyright © 1999-2026 Casino City Press. All Rights Reserved. [Terms of Use](https://www.casinovendors.com/terms-of-use/)| [Privacy Policy](https://www.casinocitypress.com/privacy/).

View File

@@ -0,0 +1,189 @@
Terms of Service Popiplay
# TERMS OF SERVICE
Version: 1.0Last updated: July, 2023.
## 1.GENERAL
Before using our website, please read these Terms of Service carefully. By registering a Player Account with the website, you agree and confirm your consent with the Terms and Conditions.
The website www.popiplay.com (“Game Provider”, “Website”, “Company”, “We”, “Us”, “Our”) is owned and operated by PP Solutions N.V. a company registered and established under the laws of Curaçao, with registration number 164235 and registered address at Scharlooweg 39, Willemstad, Curaçao.
It is the players sole responsibility to inquire about the existing laws and regulations of the given jurisdiction for online gambling.
## 2. CHANGES TO TERMS AND CONDITIONS
The Casino reserves the right to unilaterally change these Terms and Conditions when such need occurs. We will do our best to notify our players of any significant changes by email. However, we do recommend all players to revisit this page regularly and check for possible changes.
## 3. WHO CAN PLAY
The Casino accepts players only from those countries and geographic regions where online gambling is allowed by law. It is the players sole responsibility to inquire about the existing gambling laws and regulations of the given jurisdiction before placing bets on the website. The Casino accepts strictly adult players (the minimum age is 18) andplayers who have reached the age specified by the jurisdiction of players place of residence as eligible for online gaming. It is the players sole responsibility to inquire about the existing laws and regulations of the given jurisdiction regarding age limitations for online gambling. It is entirely and solely your responsibility to enquire and ensure that you do not breach laws applicable to you by participating in the games. Depositing real funds and playing for real money is subject to the laws of your country, and it is your sole responsibility to abide by your native regulations. TheCompany reserves the right to ask for proof of age from the player and limit access to the Website or suspend the Player Account to those players who fail to meet this requirement.
Any bonuses are not available to players from Sweden, including participation in any kind of promotional programs, receiving VIP rewards, as well as exchange of comp points. Users from the following countries and their territories (“Restricted Countries”) are not allowed to deposit and play real money games: United States of America, United Kingdom, Spain, France and its overseas territories (Guadeloupe, Martinique, French Guiana, Réunion, Mayotte, St. Martin, French Polynesia, Wallis and Futuna, New Caledonia), Netherlands, Israel, Lithuania, Dutch West Indies, Curacao, Gibraltar, Jersey, Greece, Belgium. The Casino cannot guarantee successful processing of withdrawals or refunds in the event that player breaches this Restricted Countries policy.
## 4. AVAILABILITY OF GAMES
Please bear in mind that some games may be unavailable in certain jurisdictions, as required by their respective regulation, which may change from time to time. Using VPN to bypass providers block is strictly prohibited and may lead to confiscation of winnings.
## 5. ACCEPTED CURRENCIES
Popiplay allows operators to chose their offering of currencies in their respectivemarkets, as long as legal tenders are being used for transactions.
## 6. FEES AND TAXES
You are fully responsible for paying all fees and taxes applied to your winnings according to the laws of the jurisdiction of your residence.
## 7. GAME RULES
By accepting these Terms of Service you confirm that you know and understand the rules of the games offered on the operators respective websites. It is at your discretion to familiarise yourself with the theoretical payout percentage of each game.
## 8. DISCLAIMER OF LIABILITIEST
By accepting these Terms of Service, you confirm your awareness of the fact that gambling may lead to losing money. Game provider is not liable for any possible financial damage arising from your use of any operator web-site.
The Game Provider is not liable of any hardware or software defects, unstable or lost Internet connection, or any other technical errors that may limit access to the Website or prevent any players from uninterrupted play. In the unlikely case where a wager is confirmed or a payment is performed by us in error, the Company reserves the right tocancel all wagers accepted containing such an error, or to correct the mistake by resettling all the wagers at the correct terms that should have been available at the time that the wager was placed in the absence of the error. If the Casino mistakenly credit your Player Account with a deposit, bonus or winnings that do not belong to you,whether due to a technical issue, error in the pay tables, human error or otherwise, the amount and/or the winnings from such bonus or deposit will remain the Casino property and will be deducted from your Player Account. If you have withdrawn funds that do not belong to you prior to us becoming aware of the error, the mistakenly paidamount will (without prejudice to other remedies and actions that may be available at law) constitute a debt owed by you to us. In the event of an incorrect crediting, you are obliged to notify us immediately by email. The Casino, its directors, employees, partners, service providers: • do not warrant that the software or the Website is/are fitfor their purpose; • do not warrant that the software and Website are free from errors; • do not warrant that the Website and/or games will be accessible without interruptions; • shall not be liable for any loss, costs, expenses or damages, whether direct, indirect, special, consequential, incidental or otherwise, arising in relation to your use of the Website or your participation in the games.
You hereby agree to fully indemnify and hold harmless the Game Provider, its directors, employees, partners, and service providers for any cost, expense, loss, damages, claims and liabilities howsoever caused that may arise in relation to your use of games or participation in games. You acknowledge that the Game Provider shall be the final decision-maker of whether you have violated the Game Providers Terms of Service in a manner that results in your suspension or permanent barring from participation in the Website.
## 9. USE OF PLAYER ACCOUNT
Each player is allowed to create only one (1) personal account. Creating multiple Player Accounts by a single player can lead, at the sole discretion of the respective operator, to termination of all such accounts and cancellation of all payouts to the player. The player shall not provide access to their Player Account or allow using operators respective websites to any third party including but not limited to minors. Any returns, winnings or bonuses which the player has gained or accrued during such time as the Duplicate Account was active may be reclaimed by us, and players undertake to return to us on demand any such funds which have been withdrawn from the Duplicate Account. The Website can only be used for personal purposes and shall not be used for any type of commercial profit. You must maintain your account and keep your details up-to-date. We reserve the right to make a phone call to the numberprovided in your user account, which at our own discretion can be a necessary part of the KYC procedure. Account and/or any actions in the account may be terminated until the account is fully verified. We will make reasonable efforts trying to contact you regarding the withdrawal of the funds, but if we are not able to reach you (by email orphone) in two (2) weeks as from the date of the request for withdrawal, account will be locked, since you have failed to pass the KYC procedure.
## 10. ANTI-MONEY LAUNDERING
## 10.1 ABBREVIATIONS USED
FATF Financial Action Task Force (http://www.fatf-gafi.org)RNG Random Number Generator
## 10.2. GUIDELINE IDENTITY CHECK
1. In order to do a first deposit with PP Solutions N.V. a customer needs to provide the following mandatory details:
● First name● Last name● Street and street number● City and postal code● Country● Email address (must be valid and unique within PP Solutions N.V.)● Date of birth● Password (will be encrypted)● Confirmation of password● Account currency● Mobile phone number
2. A newly registered account has to be checked immediately by the service department in order to find out if the details are correct (accounts with false names and addresses will be closed). Also, the registered country and the country IP need to be compared. A mismatch is automatically to be noted in the customers account. This helps us close fake accounts before any paying can be processed.
1. Players who are not registered are unable and not allowed to play for real money. Any online transaction, may it be pay-in or pay-out, will not be accepted or processed in cash.2. Once the registration process has been accomplished, customers will receive a welcome email with a link to access their accounts. This procedure aims at verifying the customers email address.3. Each new customer has to provide a copy of an ID document (passport, ID card or driving license) when thresholds set in section 4.1.1 are reached. This is in line with the 5th AML requirements.4. The identity check has to include a copy of a utility bill and/or bank statement showing the name and address, if there is any doubt on the authenticity of the provided ID document.5. Furthermore, the identity check may include additional measures such as the provision of a copy of each credit card used in the specific account.6. Any remaining doubts concerning the identity of a customer have to be reported to the supervisor.7. In such a case, further investigations have to be started.8. These may include • Check of the IP used by the customer • Check of the provided phone number and/or call to the provided phone number • Internet research on the customer details • Request to the official authorities in thecountry of the customer this has to be done by compliance management.9. Customers will not be able to register with a country of residence in the following list: US, Denmark, Belgium, Australia, Anguilla, Afghanistan, Czech Republic, Slovakia, Slovenia, Gibraltar, Israel, Iran, Jersey, Lithuania, Slovenia, Slovakia, UK, Ireland, Estonia, Italy, France, Turkey, Spain, Greece, China, Jamaica, Cambodia, Iraq, Syria, Myanmar, Lao PDR, Angola, Cape Verde, Paraguay, Macau, Hong Kong, Albania, Pakistan, Lebanon, Cote DIvoire, Iran, Afghanistan.10.Customer under the age of 18 will be denied to register an account. Customers will be required to register before playing for real money.
## 10. 3 GUIDELINE PAYOUT MANAGEMENT
## 10.3.1 Checks to be performed on each payout:
## 10.3.1.1 Account check
The owner of the PP Solutions N.V. account must be the same person as the owner of the bank account or credit card. All account information, like address, email, date of birth etc., must be complete and authentic. Withdrawals will be made to the same source where the funds originated (where possible).
## 10. 3.1.2 Deposits must have been used
On each payout it has to be checked if the deposits have been used for stakes. A payout cannot be processed if the deposited amount has not been used for stakes. If the deposited amount has not been used, the payout has to be denied. Furthermore, the latest winnings have to be checked for correctness.
## 10. 3.1.3 Fulfilment of bonus rules
Before a payout can be deducted from the customer´s account, the account has to be checked if a bonus has been given to the customer since the last payout. When a bonus has been credited, the account has to be checked for fulfillment of the bonus rules applicable to that bonus.
## 10.4 AML Procedures - The Risk Based Approach
The risk-based approach is introduced to promote a move away from a “one size fits all” approach to anti-money laundering procedures. By identifying and assessing the money laundering risks, PP Solutions N.V. can take the best steps to mitigate and monitor those risks.
## 10.4.1. Risk Profile for PP Solutions N.V.
Based on our business profile, the risk of money laundering and terrorist financing is minimal, especially compared to financial institutions. The main reason is that cash is not accepted and only credit cards, e-wallets and other licensed instruments can be used to effect deposits and withdrawals. Additionally, the average transaction is of a relatively small value. The only money laundering stage that could be of a risk potential for PP Solutions N.V., is the layering stage, which is mitigated by various daily screening measures described below.
## 10.4.1.1. Customer Due Diligence (CDD)
CDD information is needed to identify money laundering activity. The more the customer profile is updated, the more it will help to identify unusual and potentially suspicious activity. In accordance with the 4th AML directive, the verification and gathering of client information will be delayed until:
• Account deposits reach a pre-determined threshold of EUR 2,000;• Gaming activity reaches a pre-determined threshold of EUR 2,000;• Players seek to withdraw funds (initial payout);• A period of time since account opening lapses more than 60 days.
The following on-going monitoring measures describe CDD measures based on thecompanys risk profile:
• Identity verification for every new customer• Assessing the risk profile of every customer• Daily payout analysis• Analysis of the historical pattern of the customers payout activity• Ban of anonymous or fictitious accounts.
## 10.4.1.2. Customer Due Diligence Measures Applied
The daily CDD measures applied during the daily workflow are described in detail below.
## CDD: ID-Check
For every new customer the service department conducts individual checks whether the registered data is plausible and correct. The IP address check and double customer check are conducted as outlined below. Fake or double accounts are being closed immediately.
## CDD: IP-Check
The customers IP address is registered upon every log-in. Upon registration, a review is done as to whether the customers IP address corresponds with the registered country. If there is a mismatch, the customers account is marked for further checks.
## CDD: Double Customer Check
Every customer can open only one account. If a customer tries to open multiple accounts, these will be blocked, and the system will generate a warning.
## CDD: Passport check upon first pay-out
Customers may need to submit a passport copy before the first pay-out irrespective of the amount requested. Passport copies are checked individually by risk management. Furthermore, PP Solutions N.V. reserves the right to determine the payment means of the first pay-out: either by the same method used for the deposit, or by bank transfer in order to further validate the customers identity.
## 10.4.2. Customer Acceptance Policy
After the identity verification a risk profile is formed based on the behavioural pattern of the customer. Every customer is given an internal classification, which will be described further below. If suspicious behaviour is observed, evidence will be recorded on the customer profile, and enhanced customer due diligence is applied.Enhanced customer due diligence (EDD) is mandatory also for Politically Exposed Persons (PEPs) who are considered high-risk customers.
## 10.4.3. Enhanced Customer Due Diligence (EDD)
Enhanced Customer Due Diligence is applied when additional steps of examination are needed to identify the customer and to confirm that their activities and funds are legitimate. The following measures describe EDD measures based on the companys risk profile:
● Establishing the identity of the customer by requesting additional documents suchas: a copy of a utility bill to verify the home address and a statement of a credit orfinancial institution to prove the bank account holder.● Verifying documents by using supplementary measures.● Requesting certified confirmation of the documents from a credit/financialinstitution.● Ensuring that the first payment originates from customers own bank account /credit card.● Clarifying the source of the funds with the customer.
## 10.4.4. Enhanced Customer Due Diligence Measures Applied
The daily EDD measures applied during the daily workflow are described in detail below
## EDD: Enhanced ID Check
The customer has to submit ID, utility bill and bank statement for Enhanced ID Checkwithin 30 days. If the customer does not send these documents within 30 days, thegaming account will be blocked from all transactions. Enhanced IDCheck is carriedout whenever:
● The registered country is not part of the FATF white list.● A deposit or pay out request is equal or more than 2,000 EUR.
## Credit card verification
We use common tools like 3D Secure to verify credit cards.
## 10.4.5. Money Laundering Reporting Officer (MLRO)
The MLRO is the first person to notify when the suspicion of money launderingactivities evolves. The MLRO is appointed by senior management and is trained forthe money laundering risk factors that the company faces. When the companyappoints the MLRO, the competent authorities need to be notified. The main dutiesof the MLRO are:
a) Keeping up to date with AML/CTF legislations.b) Making sure that implementation takes place in line with the internal procedures.c) Making sure that anti-money laundering training is periodically given to staff.d) Recording and updating risk assessments.e) To receive and evaluate internal reports.f) To advise, guide and assist.g) To keep statistical data.h) Filing STRs to the respective financial authority.
All incidents involving a suspicious person or transaction in terms of moneylaundering or funding terrorism need to be reported to the respective financialauthority by the MLRO within 5 working days. In the Suspicious Transaction Report,the MLRO must give a clear and complete explanation of the suspicious behaviourincluding also customer identification and transaction records.
## 10.4.6. Additional Monitoring Tools
## Customer Classes
Every customer is vetted in a specific customer class according to his „risk potential.” Every customer class is subject to different deposit limits. For instance, all new customers are being rated with customer class N (white list markets) or M (non-white list countries). After the lapse of 4 weeks, customers will be moved to different classes in line with their observed behaviour. High risk customers will be followed closely.
## 10.4.7. Politically Exposed Persons (PEPs)
A Politically Exposed Person is someone who has been entrusted with a prominent public function, such as a senior political figure. Individuals who are closely related to this person, for instance, immediate family members and close associates, are also considered as PEPs. PEPs are classified as a money laundering risk since they may be exposed to property that has been generated by corruption and bribery because of their position. The current PEP lists provided by Acuris are consulted in order to identify a customer as PEP. The player is requested to confirm their PEP status within the first deposit. Once established as PEP, the users account is terminated. Screening for PEP status is carried out once a year and after a country election the resident of which the player is. Where player who was a PEP is no longer entrusted with a prominent public function, the requirements for PEPs will continue to apply for a period of at least 12 months after the date on which the person ceased to be entrusted with a public function or for a longer period to address the risks of money laundering or terrorist financing in relation to that person.
## 10.4.8. Record Keeping
The following records are kept: Identification Records: Copy of ID-document; Copy of bank/credit statement; References. Transaction Record Details: Deposit/withdrawal method used; ID of person performing the transaction; Destination of funds; The authorization of credit card payments performed by our clearing companies; Volumeof transactions. The records are kept for 5 years from the end of the business relationship in accordance to the directive.
## 10.4.9. Employee training
Periodical training ensures that the staff is aware and compliant with the anti-moneylaundering regulatory requirements.
## 10.4.10. Employee hiring
For all new employees hired by PP Solutions N.V.; PP Solutions N.V. will conduct a thorough background check and various due diligence documents will be collected for reference (birth certificate, clear police conduct, etc.). Interviews are carried out and requested references are checked, whenever available. It is a company policy that all new employees are also given training with regards to the anti-money laundering policy and the internal procedures used to mitigate this risk.
## 11. COMPLAINTS
You are free to contact our customer service team to share your opinion, your feedback, request or complaint. Please use: [[email protected]](https://www.popiplay.com/cdn-cgi/l/email-protection#3b484e4b4b54494f7b4b544b524b575a4215585456) for this purpose. We will endeavour to respond as soon as possible, but not later than 48-72 hours. Complaints are handled in the support department and escalated in the organisation of the respective Casino in the case that support personnel did not solve the case immediately. You shall be informed about the state of the complaint to a reasonable level. Casino is to acknowledge a complaint started by the account holder only. It is forbidden to and you can therefore not assign, transfer, hand over or sell your complaint to the third party. Casino will dismiss the complaint if the matter is handed over to be conducted by the third party and not the original account owner. In the event of any dispute, you agree that the server logs and records shall act as the final authority in determining the outcome of any claim. You agree that in the unlikely event of a disagreement between the result that appears on your screen and the game server, the result that was logged on the game server will prevail, and you acknowledge and agree that our records will be the final authority in determining the terms and circumstances of your participation in the relevant online gaming activity and the results of this participation. When we wish to contact you regarding such a dispute, we will do so by using any of the contact details provided in your Player Account.
## Welcome to
## You must be over 18 years old to enjoy our content.
## Please verify your age!
Yes, I am 18 years old
[No, take me back](https://google.com/)

View File

@@ -0,0 +1,415 @@
Best iGaming aggregation solution - iGaming API solution
# Casino Game Aggregator API
Our API integration is a powerful solution for fast and seamless integration of casino games and sportsbook content into your platform.
Integrate software from multiple game providers in a single day and scale your iGaming business without limits.
[Contact Us](https://igamingslots.com/contact/) [All Providers](https://igamingslots.com/casino-game-providers/)
Work with leading providers such as Pragmatic Play, Evolution, NetEnt, Playtech, and more. Access thousands of casino games and deliver a premium iGaming experience worldwide.
#### Fast Integration
Launch your platform quickly with easy API setup.
#### Multiple Providers
Connect to leading game developers worldwide.
#### Scalable System
Handle high traffic and expand without limits.
## One API to connect 15,000+ games, live casino and sportsbook
Plug a single REST endpoint into your iGaming platform and instantly unlock slots, live dealer tables, crash games, virtual sports and sportsbook feeds from 150+ certified providers — without rebuilding your stack.
[Contact Us →](https://igamingslots.com/contact/) [All Providers](https://igamingslots.com/casino-game-providers/)
15,000+Slot games
150+Providers
40+Countries
14 daysAvg. setup
### Start with leaders in the industry
Pragmatic PlayEvolutionNetEntPlaytech HacksawSpribeNovomaticAmatic IGTQuickspinNolimit CityBooming Games
What is our API
## A single aggregator built for serious iGaming operators
Our Casino Game Aggregator API is a production-grade integration layer that lets you connect thousands of casino games and sportsbook content to your platform through one unified interface. It was engineered specifically for online gambling operators who want to minimise engineering cost, shorten time-to-market and scale their business without being locked to a single provider.
Instead of negotiating, integrating and certifying each provider individually — which typically takes months of back-and-forth for every new studio — you sign one agreement with us and immediately receive access to 150+ top-tier studios and independent game labs. We handle provider onboarding, game catalogue normalisation, RTP reporting and player session tracking on the backend, so your team can focus on growth, marketing and product instead of infrastructure.
The aggregator was built from day one with the needs of real-world iGaming operators in mind: high concurrency during marketing peaks, burst traffic around major sporting events, complex multi-region routing, multi-language lobbies and strict reporting requirements from operations teams. Every decision — from the way we version endpoints to the way we expose webhook retries — exists because weve lived through the problem it solves, many times over, with operators across 40+ countries.
You connect once and keep receiving new content, new providers and new markets as our platform expands. There is no separate contract to renegotiate every time we add a studio — you simply flip a switch in the admin panel and the new provider appears in your game lobby, already normalised and ready for traffic.
Fast integrationSandbox credentials within 24 hours, production go-live in 14 days on average.
Multiple providersPragmatic, Evolution, NetEnt, Playtech, Hacksaw, Spribe and 140+ more, all via one API.
Scalable systemBattle-tested under millions of spins per day with multi-region failover.
Always-on contentNew game titles and providers are pushed to your lobby weekly without any downtime or redeploys.
YOUR APP`client.launchGame("book_of_dead")`
OUR API`POST /v1/games/launch`
AGGREGATOR`routes to Pragmatic · Evolution · NetEnt…`
PROVIDER`200 OK · game URL · 38 ms`
Key Features
## Everything your platform needs, shipped in one integration
A complete aggregation layer with the tools, data and reliability iGaming operators actually use in production. No puzzle-piece stack, no vendor spaghetti.
### All-in-One Game Aggregation
Access 15,000+ slots, live dealers, table games, crash, instant-win and fishing titles through a single integration. The aggregation layer normalises game data, session tokens, RTP reporting and player histories in one unified dashboard — no more juggling a dozen different provider schemas.
### Sportsbook & In-Play Feeds
Real-time pre-match and in-play odds for 40+ sports, low-latency websocket streams with automatic regional failover, settlement API and bet-builder support — everything you need to add sports betting to your casino audience without a second platform.
### Live Casino & Game Shows
Premium live dealer content from Evolution, Ezugi, Pragmatic Live, Vivo and more. Blackjack, roulette, baccarat, poker variants and next-generation game shows — streamed in HD, 24/7, with multilingual dealers and regional tables for your key markets.
### Real-time Analytics & BI
Track GGR, NGR, RTP, player acquisition costs, session duration, game performance and conversion funnels. Schedule automated reports, build custom dashboards, stream events to your BI stack and share insights across your team in real time.
### Any-GEO Deployment
Launch in North America, Europe, Asia, LATAM or Africa on the same code base. Regional endpoints with automatic routing, localised game catalogues, multi-language lobbies and time-zone-aware support — so entering a new market is a configuration change, not a rebuild.
### Fraud Protection & Security
Multi-layer defence purpose-built for iGaming: real-time fraud scoring, anti-bot protection, device fingerprinting, encrypted transactions and SOC 2-ready infrastructure. Your business and players stay protected at every point of the flow.
### Mobile-First Performance
Every game and sportsbook endpoint is optimised for mobile. Progressive Web App support means instant loads even on slower connections — keeping players engaged whether theyre on fibre at home or 3G on the move.
### 24/7 Dedicated Support
Round-the-clock assistance from iGaming engineers — not a ticketing bot. Technical integration, incident response, provider questions, tuning and optimisation are handled by a dedicated account manager assigned to your project from day one.
Technical Architecture
## Built for operators who cant afford downtime
Our API is designed around the reality of high-traffic iGaming: spikes during football weekends, marketing peaks that triple your concurrent users, and regulatory audits that can land without warning. Every endpoint is deployed across multiple cloud regions with automatic failover, aggressive caching where it makes sense, and signed, replay-protected requests where it matters.
Under the hood the platform runs on a distributed microservice architecture with independent game, sportsbook, CMS and analytics services. Each service scales horizontally and can be deployed closer to the player, so Brazilian users get responses from São Paulo while European players are served from Frankfurt, without you having to think about geography.
We also take backwards compatibility seriously. Breaking changes are rare and always announced through semantic versioning, a public changelog and a twelve-month deprecation window — so you can move at your own pace instead of scrambling to match an unannounced schema change.
The result is a platform that stays online when your players need it most, and an integration surface that your engineers can reason about without reading a fifty-page PDF.
REST + WebSocketJSON over HTTPS for game launches, WS streams for live odds and session events.
Multi-region failoverActive deployments in EU, UK, LATAM and APAC with automatic DNS-based routing.
OAuth2 + HMAC signingSigned requests, IP allow-listing, rotating keys and complete audit trails.
Low-latency edgep95 under 80 ms thanks to edge caching, optimised payloads and CDN routing.
Versioned APISemantic versioning with 12-month deprecation windows, detailed changelog.
Sandbox mirrorIdentical data shapes and latency profile as production for confident QA.
Webhook retriesExponential backoff with DLQ inspection and signed payload delivery.
Event streamingKafka-compatible event bus for bet, spin, session and game-lifecycle events.
How it works
## From first contact to live platform in four steps
We engineered the onboarding flow to be friction-free. Most operators move from “hello” to fully live in a matter of weeks, not quarters.
01
### Contact Us
Submit your request and book a discovery call. We take the time to understand your target market, traffic projections and roadmap before proposing the optimal setup.
02
### Setup & Config
We provision your sandbox, configure domains, servers, SSL and brand assets. Credentials land in your inbox, typically within 24 hours of signing.
03
### Integration
Games, sportsbook, analytics and back-office dashboards are connected, tested and verified against joint UAT checklists before go-live.
04
### Launch & Scale
Switch to production keys, push to real traffic and keep scaling. We stay on-call for optimisation, monitoring and new provider rollouts as you grow.
Supported Content
## All major iGaming verticals, one API
The aggregator serves every mainstream content type players expect from a modern online casino — plus the fast-growing niches that are driving engagement today. From classic three-reel slots to high-volatility megaways, from live-streamed roulette to community-driven crash rounds, the catalogue is curated to match real player behaviour across dozens of regulated and emerging markets.
Slots
### Video Slots
15,000+ certified slot titles from premium studios and boutique labs — megaways, cluster pays, buy-feature mechanics and classic fruit machines.
Live
### Live Dealer
Blackjack, roulette, baccarat, game shows and regional specialities streamed from Evolution, Ezugi, Pragmatic Live, Vivo and more.
Table
### Table & Card Games
Multi-hand poker, classic blackjack, European & American roulette, punto banco and a deep catalogue of regional card games.
Crash
### Crash & Instant Win
Aviator, JetX, Plinko, Mines, scratchcards and social-style instant-win formats — the content that keeps engagement graphs steep.
Sports
### Sportsbook & Virtual Sports
Pre-match, in-play, bet-builder, cash-out and a full virtual sports suite covering football, horse racing, tennis and esports.
More
### Bingo, Lottery & Fishing
Network-based bingo rooms, daily lotteries and arcade-style fishing games for Asia-facing operators, all through the same endpoint.
Global Reach
## Start your journey in any GEO
We ship iGaming software in almost any country and region, taking on the technical challenges so your team can focus on acquisition and product. Each region has its own player expectations, its own language preferences and its own content trends — we package all of that into ready-to-go regional profiles that you activate with a single click.
🌎
### North & South America
Localised content in Spanish, Portuguese and English, regional jackpots tuned for LATAM players and a content mix weighted toward the slot titles and live dealer studios that dominate the US, Brazilian and Mexican markets.
- English
- Spanish
- Portuguese
🌍
### Europe
Full EEA and UK coverage with localised content catalogues, regional live-dealer tables and dedicated European support desks across multiple time zones for both regulated and emerging European markets.
- English
- German
- Polish
- Italian
- French
🌏
### Asia
Dedicated Asian live-dealer studios, regional fishing and arcade-style titles, plus deep catalogues tuned for the biggest APAC markets — with on-the-ground support teams covering each key time zone.
- English
- Hindi
- Thai
- Vietnamese
- Bahasa
Why IGP
## 15 years of undefeated success in iGaming
Professionals with more than 15 years in iGaming software, trusted by operators across 40+ countries. The numbers speak louder than a sales pitch.
500+Successfully finished projects
13K+Games available on platform
150+Providers integrated
14 daysAverage setup time
What you get
## A complete turnkey operation, out of the box
### Full turnkey delivery
No in-house development required on your side — the entire stack, from casino frontend to admin back-office, is delivered ready to run.
### Cloudflare & servers
Complete cloud setup, domain transfer or purchase, DDoS protection, global CDN and dedicated servers for stable performance in any region.
### Account manager from day one
A dedicated iGaming specialist joins your project from the very first call and stays with you through launch, optimisation and scaling.
### Multi-GEO support
North America, Europe, Asia — each with localised languages, live dealer studios and content catalogues curated specifically for the region.
### Average response < 2h
Our support desk keeps an average reply time under two hours, with Telegram, WhatsApp and email always open during launches.
### Proven track record
500+ successfully launched projects over 15 years in iGaming. The team has seen every edge case, so your launch doesnt have to be the one that uncovers them.
Who its for
## Built for operators who want to move fast
The aggregator API fits a wide range of iGaming businesses — from first-time entrepreneurs launching their debut brand to established groups scaling into new markets. Whether youre starting from a blank page or replacing a legacy vendor, the onboarding flow is the same: a single discovery call, a tailored setup and a project timeline that moves in weeks rather than quarters. A few of the most common scenarios operators come to us with:
### New brand launch
Stand up a full casino & sportsbook under your own branding in weeks, with games, content and support ready from the first player sign-up.
### Existing casino expansion
Plug our aggregator into your current platform and instantly triple your game library, add sportsbook or roll out crash games without rebuilding.
### New GEO roll-out
Enter LATAM, Asia or a regulated European market with localised content, languages and a support team that already knows the landscape.
### Migration from a legacy provider
Move away from an outdated vendor with minimal downtime — we import your player base, sessions and game history and run a parallel sandbox until cutover.
### Affiliate or media group
Turn your traffic into a fully owned casino product instead of pushing users to someone elses brand — you keep the lifetime value.
### Land-based operator going online
Extend your physical brand into the digital world with a fully synchronised player account, loyalty program and unified cash management.
Integration Playbook
## Everything your engineers need on day one
We dont just hand you an endpoint and a wish of good luck. Every new operator gets a complete integration pack so the engineering team can move from “kick-off call” to “first real spin” without guesswork.
### Full API reference
OpenAPI 3.1 specification with request/response examples, error codes, rate limits and regional endpoint URLs. Auto-generated SDK stubs for Node, PHP, Python, Go and .NET.
### Postman & Insomnia collections
Ready-made collections pre-filled with sandbox credentials so your QA team can click through the whole player journey — session creation, game launch, live odds and round settlement — in minutes.
### Sandbox identical to production
Same data shapes, same latency profile, same error behaviour. What passes in sandbox passes in production, which removes an entire class of “works on my machine” incidents.
### Webhook playground
Replay any webhook event, inspect the signed payload, rotate secrets and simulate network failures to validate your idempotency logic before players ever touch the system.
### Engineering Slack channel
A shared Slack or Telegram channel connects your developers directly to ours. No tickets, no escalation trees — just the people who can actually answer the question in real time.
### Go-live checklist
A thirty-point launch checklist covering DNS, SSL, webhook signatures, fraud rules, responsible gaming limits, latency targets and analytics tags — all signed off before we flip production.
FAQ
## Frequently asked questions
A few of the most common questions operators ask before signing on — if yours isnt here, just reach out and well reply personally.
What exactly does your Casino Game Aggregator API include?
Its a unified REST and WebSocket interface to 15,000+ casino games, live dealer content, sportsbook feeds, crash and instant-win titles, plus full analytics and admin tooling — delivered through one integration and maintained on our side. You integrate once and automatically receive new providers, new titles and feature updates over time.
How fast can we go live?
Sandbox credentials are typically issued within 24 hours of onboarding. The average go-live time for a full casino + sportsbook platform is 14 days; casino-only integrations can ship in less than a week if your team is ready. Timelines depend on how much customisation you want on top of the default stack.
Which providers are connected out of the box?
Pragmatic Play, Evolution, NetEnt, Playtech, Hacksaw Gaming, Spribe, Nolimit City, Booming Games, Quickspin, Novomatic, Amatic, IGT, Red Tiger, Yggdrasil, Wazdan, Habanero, PGSoft, BGaming, KA Gaming, and 130+ more. The full catalogue is available in our providers directory and we add new studios every month.
What types of games are covered?
Video slots (classic, megaways, cluster pays, buy-feature), live dealer tables, blackjack, roulette, baccarat, poker variants, crash and instant-win titles, lotteries, bingo, virtual sports, sportsbook feeds and regional specialities like fishing games for Asian markets — all via the same API.
Can we bring our own provider?
Absolutely. The API is extensible — if you already have a direct contract with a game provider well certify the integration and plug it into the same unified interface so your team still has a single point of control. Custom provider integrations are typically delivered within two weeks at no extra cost for operators on the platform.
Is the platform scalable for high traffic?
Yes. The infrastructure has been battle-tested under millions of spins per day and sustained peaks during major sporting events. Multi-region deployments with automatic failover and horizontal scaling keep latency low even under sudden load spikes from viral marketing or paid acquisition pushes.
How is the platform secured against fraud and abuse?
Multiple layers: real-time fraud scoring, device fingerprinting, anti-bot protection, multi-account detection, encrypted transactions, SOC 2-ready infrastructure and continuous penetration testing. Our fraud team also provides actionable reports so your operations desk can act on emerging patterns quickly.
What kind of support do we get after launch?
24/7 technical support with an average first-response time under two hours, plus a dedicated account manager assigned to your project from day one. You reach us over Telegram, WhatsApp or email — whichever works best for your team.
Can the API power a mobile app or PWA?
Yes. Every endpoint is mobile-first; game launches return mobile-optimised URLs, sportsbook and content APIs return lightweight JSON, and the platform supports Progressive Web App distribution for markets where native app stores are restrictive. Native iOS and Android wrappers can be added on request.
Do you provide analytics and reporting?
Yes — GGR, NGR, RTP, cohort engagement, player LTV, session duration, game performance and many more metrics are available in real-time dashboards. You can also stream events to your own BI stack or receive scheduled reports by email.
Can we customise the casino lobby and UI?
Yes. The frontend is fully brandable — colours, logos, typography, game lobby categories, lobby sorting, promotional banners and landing page layouts are all configurable from the admin panel. Deeper custom work, like unique landing pages or gamified journeys, is delivered by our design and engineering team on request.
Can we deploy the platform in any GEO?
Yes — North America, South America, Europe, UK, LATAM, Africa, Middle East and APAC are all supported on the same code base. Each region has regional endpoints, localised game catalogues, language packs and time-zone-aligned support. Rolling out to a new GEO is a configuration change, not a rebuild — we usually have a fresh region in production within days, not weeks.
What happens if a provider has an outage?
Our monitoring picks up provider issues usually before the provider does. Affected games are automatically hidden from the lobby, running sessions are gracefully closed and players are notified — while the rest of your casino keeps running. You get a real-time status page and a post-incident report for every outage.
Ready to plug in?
## Lets connect your platform to 150+ providers
Fill in the contact form and our iGaming specialist will reach out within 24 hours to walk you through the integration and answer any technical questions your team has.
[Contact Us →](https://igamingslots.com/contact/) [Telegram: @igaming_production](https://t.me/igaming_production)

Some files were not shown because too many files have changed in this diff Show More