feat(lottery): 扩展传统马来赔率、玩法结算与开注商短码支持
Some checks failed
lotterLaravel CI / test (push) Has been cancelled
lotterLaravel E2E / e2e-api (push) Has been cancelled

This commit is contained in:
2026-07-10 17:04:28 +08:00
parent 2ea3e810a0
commit cbb18b976f
24 changed files with 320 additions and 45 deletions

View File

@@ -29,6 +29,7 @@ final class AdminBetProviderController extends Controller
$data = $request->validate([
'code' => ['required', 'string', 'max:32', 'regex:/^[A-Za-z0-9_-]+$/', Rule::unique('bet_providers', 'code')],
'name' => ['required', 'string', 'max:64'],
'short_code' => ['required', 'string', 'size:1', 'regex:/^[A-Za-z]$/'],
'is_enabled' => ['sometimes', 'boolean'],
'sort_order' => ['sometimes', 'integer', 'min:0'],
]);
@@ -36,6 +37,7 @@ final class AdminBetProviderController extends Controller
$provider = BetProvider::query()->create([
'code' => strtoupper((string) $data['code']),
'name' => trim((string) $data['name']),
'short_code' => strtoupper((string) $data['short_code']),
'is_enabled' => (bool) ($data['is_enabled'] ?? true),
'sort_order' => (int) ($data['sort_order'] ?? 0),
]);
@@ -47,12 +49,14 @@ final class AdminBetProviderController extends Controller
{
$data = $request->validate([
'name' => ['sometimes', 'required', 'string', 'max:64'],
'short_code' => ['sometimes', 'required', 'string', 'size:1', 'regex:/^[A-Za-z]$/'],
'is_enabled' => ['sometimes', 'boolean'],
'sort_order' => ['sometimes', 'integer', 'min:0'],
]);
$betProvider->fill(array_filter([
'name' => isset($data['name']) ? trim((string) $data['name']) : null,
'short_code' => isset($data['short_code']) ? strtoupper((string) $data['short_code']) : null,
'is_enabled' => array_key_exists('is_enabled', $data) ? (bool) $data['is_enabled'] : null,
'sort_order' => array_key_exists('sort_order', $data) ? (int) $data['sort_order'] : null,
], static fn (mixed $value): bool => $value !== null))->save();
@@ -68,6 +72,7 @@ final class AdminBetProviderController extends Controller
'id' => (int) $provider->id,
'code' => $provider->code,
'name' => $provider->name,
'short_code' => $provider->short_code ?: strtoupper(substr((string) $provider->code, 0, 1)),
'is_enabled' => (bool) $provider->is_enabled,
'sort_order' => (int) $provider->sort_order,
'is_default' => $provider->code === BetProvider::DEFAULT_CODE,

View File

@@ -30,6 +30,7 @@ final class AdminDrawIndexController extends Controller
$p = AdminApiList::readPaging($request);
$drawNo = trim((string) $request->query('draw_no', ''));
$status = trim((string) $request->query('status', ''));
$hasPlayerBets = $request->boolean('has_player_bets');
$scope = AdminScopePolicy::resolveContext($request, $admin);
$q = Draw::query()->orderByDesc('draw_time')->orderByDesc('id');
@@ -42,6 +43,14 @@ final class AdminDrawIndexController extends Controller
$q->where('status', $status);
}
if ($hasPlayerBets) {
$ticketItems = TicketItem::query()
->selectRaw('1')
->whereColumn('ticket_items.draw_id', 'draws.id');
$this->scopeTicketItemsToVisiblePlayers($ticketItems, $scope);
$q->whereExists($ticketItems);
}
/** @var LengthAwarePaginator $paginator */
$paginator = $q->paginate($p['perPage'], ['*'], 'page', $p['page']);

View File

@@ -16,10 +16,11 @@ final class BetProviderIndexController extends Controller
->where('is_enabled', true)
->orderBy('sort_order')
->orderBy('id')
->get(['code', 'name', 'sort_order'])
->get(['code', 'name', 'short_code', 'sort_order'])
->map(fn (BetProvider $provider): array => [
'code' => $provider->code,
'name' => $provider->name,
'short_code' => $provider->short_code ?: strtoupper(substr((string) $provider->code, 0, 1)),
'sort_order' => (int) $provider->sort_order,
'is_default' => $provider->code === BetProvider::DEFAULT_CODE,
])