feat: enhance configuration and logging for admin services
Some checks failed
lotterLaravel CI / test (push) Has been cancelled

- Updated .env.example to enable Redis Lua for lottery risk pool and added configuration for agent settlement.
- Improved AGENTS.md to clarify site operations and admin roles.
- Enhanced PHPUnit configuration with memory limit and cache directory settings.
- Refactored AdminReportQueryService and related services to utilize LimitedQuery for better data handling and truncation warnings.
- Added logging for draw settlement failures in DrawTickService.
- Introduced credit preflight checks and reverse bet hold functionality in PlayerCreditService.
- Improved risk pool management with new Redis lock handling in RiskPoolService and TicketPlacementService.
This commit is contained in:
2026-06-16 17:08:10 +08:00
parent 4e370a79dc
commit b496a9457c
16 changed files with 423 additions and 494 deletions

View File

@@ -6,6 +6,7 @@ use App\Models\AdminUser;
use App\Support\AdminAgentSettlementScope;
use App\Support\AgentSettlementPeriodWindow;
use App\Support\CurrencyFormatter;
use App\Support\LimitedQuery;
use App\Support\PlayerFundingMode;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
@@ -53,7 +54,9 @@ final class SettlementCenterLedgerService
$periodId = $filters->settlementPeriodId;
$range = $this->resolveCreatedRange($periodId, $filters->createdFrom, $filters->createdTo);
$settledRange = $this->resolveSettledRange($periodId, $filters->createdFrom, $filters->createdTo);
$playerBills = $this->playerBillsMap($admin, $siteCode, $periodId);
$playerBillsResult = $this->playerBillsMap($admin, $siteCode, $periodId);
$playerBills = $playerBillsResult['map'];
$billsTruncated = $playerBillsResult['truncated'];
$stubQueries = [];
if ($this->shouldIncludeLedgerStub($filters, 'credit')) {
@@ -130,6 +133,7 @@ final class SettlementCenterLedgerService
'page' => $page,
'per_page' => $perPage,
'ledger_source' => 'settlement_ledger',
'truncated' => $billsTruncated || $total > 5000,
];
}
@@ -153,8 +157,12 @@ final class SettlementCenterLedgerService
): array {
$periodId = $filters->settlementPeriodId;
$range = $this->resolveCreatedRange($periodId, $filters->createdFrom, $filters->createdTo);
$rows = $this->fetchBetFlowCreditRows($admin, $siteCode, $range, $filters);
$playerBills = $this->playerBillsMap($admin, $siteCode, $periodId);
$fetched = $this->fetchBetFlowCreditRows($admin, $siteCode, $range, $filters);
$rows = $fetched['rows'];
$sourceTruncated = $fetched['truncated'];
$playerBillsResult = $this->playerBillsMap($admin, $siteCode, $periodId);
$playerBills = $playerBillsResult['map'];
$billsTruncated = $playerBillsResult['truncated'];
$ticketIds = [];
foreach ($rows as $row) {
@@ -207,6 +215,7 @@ final class SettlementCenterLedgerService
'page' => $page,
'per_page' => $perPage,
'ledger_source' => 'credit_ledger',
'truncated' => $sourceTruncated || $billsTruncated,
];
}
@@ -811,7 +820,7 @@ final class SettlementCenterLedgerService
}
/**
* @return array<int, object>
* @return array{map: array<int, object>, truncated: bool}
*/
private function playerBillsMap(AdminUser $admin, string $siteCode, ?int $periodId): array
{
@@ -841,8 +850,9 @@ final class SettlementCenterLedgerService
AdminAgentSettlementScope::applyDirectPlayersToAlias($query, $admin, 'p');
$limited = LimitedQuery::get($query, 500);
$map = [];
foreach ($query->limit(500)->get() as $bill) {
foreach ($limited['rows'] as $bill) {
$pid = (int) $bill->player_id;
if (! isset($map[$pid])) {
$map[$pid] = $bill;
@@ -859,7 +869,10 @@ final class SettlementCenterLedgerService
}
}
return $map;
return [
'map' => $map,
'truncated' => $limited['truncated'],
];
}
/**
@@ -921,7 +934,7 @@ final class SettlementCenterLedgerService
/**
* @param array{0: Carbon, 1: Carbon}|null $range
* @return list<object>
* @return array{rows: list<object>, truncated: bool}
*/
private function fetchBetFlowCreditRows(
AdminUser $admin,
@@ -975,7 +988,12 @@ final class SettlementCenterLedgerService
$query->whereBetween('cl.created_at', $range);
}
return $query->limit(5000)->get()->all();
$limited = LimitedQuery::get($query, 5000);
return [
'rows' => $limited['rows']->all(),
'truncated' => $limited['truncated'],
];
}
/**