feat: 切换 schema dump 基线并增强返点结算与管理校验
This commit is contained in:
@@ -43,10 +43,17 @@ final class AgentGameSettlementRecorder
|
||||
|
||||
$gameType = trim((string) ($item->play_code ?? '')) ?: '*';
|
||||
$snapshot = $this->snapshotBuilder->buildForPlayer($player, $gameType);
|
||||
$baseRebateRate = $this->baseRebateRateForTicketItem($item);
|
||||
$basicRebateRate = $this->normalizeRate($baseRebateRate + (float) $snapshot['rebate_rate']);
|
||||
$shareSnapshot = [
|
||||
...$snapshot,
|
||||
'base_rebate_rate' => $baseRebateRate,
|
||||
'basic_rebate_rate' => $basicRebateRate,
|
||||
];
|
||||
|
||||
$gameWinLoss = $this->platformWinLoss($item, $netWin, $terminalStatus);
|
||||
$validBet = (int) $item->total_bet_amount;
|
||||
$basicRebate = (int) round($validBet * $snapshot['rebate_rate']);
|
||||
$basicRebate = (int) round($validBet * $basicRebateRate);
|
||||
$extraRebate = (int) round($validBet * $snapshot['extra_rebate_rate']);
|
||||
|
||||
$extraByCode = [];
|
||||
@@ -66,15 +73,11 @@ final class AgentGameSettlementRecorder
|
||||
|
||||
$settledAt = now();
|
||||
|
||||
DB::transaction(function () use ($item, $player, $snapshot, $gameWinLoss, $basicRebate, $result, $settledAt, $validBet, $extraRebate, $gameType): void {
|
||||
DB::transaction(function () use ($item, $player, $snapshot, $shareSnapshot, $basicRebateRate, $gameWinLoss, $basicRebate, $result, $settledAt, $validBet, $extraRebate, $gameType): void {
|
||||
$item->forceFill([
|
||||
'agent_node_id' => $snapshot['agent_node_id'],
|
||||
'share_snapshot' => [
|
||||
'total_shares' => $snapshot['total_shares'],
|
||||
'actual_shares' => $snapshot['actual_shares'],
|
||||
'chain_codes' => $snapshot['chain_codes'],
|
||||
],
|
||||
'agent_rebate_rate_snapshot' => $snapshot['rebate_rate'],
|
||||
'share_snapshot' => $shareSnapshot,
|
||||
'agent_rebate_rate_snapshot' => $basicRebateRate,
|
||||
'agent_settled_at' => $settledAt,
|
||||
])->save();
|
||||
|
||||
@@ -83,7 +86,7 @@ final class AgentGameSettlementRecorder
|
||||
'player_id' => $player->id,
|
||||
'agent_node_id' => $snapshot['agent_node_id'],
|
||||
'agent_path' => json_encode($snapshot['agent_path']),
|
||||
'share_snapshot' => json_encode($snapshot),
|
||||
'share_snapshot' => json_encode($shareSnapshot),
|
||||
'game_win_loss' => (int) round($gameWinLoss),
|
||||
'basic_rebate' => $basicRebate,
|
||||
'shared_net_win_loss' => (int) round($result->sharedNetWinLoss),
|
||||
@@ -99,7 +102,7 @@ final class AgentGameSettlementRecorder
|
||||
'ticket_item_id' => $item->id,
|
||||
'game_type' => $gameType,
|
||||
'valid_bet_amount' => $validBet,
|
||||
'rebate_rate' => $snapshot['rebate_rate'],
|
||||
'rebate_rate' => $basicRebateRate,
|
||||
'rebate_amount' => $basicRebate,
|
||||
'rebate_type' => 'basic',
|
||||
'owner_agent_id' => $snapshot['agent_node_id'],
|
||||
@@ -138,6 +141,38 @@ final class AgentGameSettlementRecorder
|
||||
});
|
||||
}
|
||||
|
||||
private function baseRebateRateForTicketItem(TicketItem $item): float
|
||||
{
|
||||
$ruleSnapshot = is_array($item->rule_snapshot_json) ? $item->rule_snapshot_json : [];
|
||||
$baseFromRule = isset($ruleSnapshot['base_rebate_rate'])
|
||||
? (float) $ruleSnapshot['base_rebate_rate']
|
||||
: null;
|
||||
|
||||
if ($baseFromRule !== null && $baseFromRule > 0) {
|
||||
return $this->normalizeRate($baseFromRule);
|
||||
}
|
||||
|
||||
$oddsSnapshot = is_array($item->odds_snapshot_json) ? $item->odds_snapshot_json : [];
|
||||
foreach ($oddsSnapshot as $row) {
|
||||
if (! is_array($row)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (! array_key_exists('rebate_rate', $row)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
return $this->normalizeRate((float) $row['rebate_rate']);
|
||||
}
|
||||
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
private function normalizeRate(float $rate): float
|
||||
{
|
||||
return max(0.0, min(1.0, $rate));
|
||||
}
|
||||
|
||||
private function platformWinLoss(TicketItem $item, int $netWin, string $terminalStatus): float
|
||||
{
|
||||
if ($terminalStatus === 'settled_lose') {
|
||||
|
||||
Reference in New Issue
Block a user