feat: 增强代理结算和账单管理功能
- 在多个控制器中引入 SettlementPartyEnrichment 服务,以优化代理结算和账单的处理逻辑。 - 更新 AgentSettlementBillIndexController 和 AgentSettlementBillShowController,支持根据账单 ID 和关键字进行查询。 - 在 AgentSettlementPeriodCloseController 中添加对站点管理权限的验证,确保只有具备相应权限的管理员能够关闭账期。 - 在 AgentSettlementPeriodIndexController 中更新账期数据的返回格式,提升数据的完整性和可用性。 - 引入对相对占成比例的支持,增强代理资料的管理能力,确保数据一致性。
This commit is contained in:
@@ -10,6 +10,8 @@ use Illuminate\Support\Str;
|
||||
use App\Support\AdminDataScope;
|
||||
use App\Support\CurrencyFormatter;
|
||||
use App\Support\PlayerFundingMode;
|
||||
use App\Services\AgentSettlement\CreditLedgerBetFlowPresenter;
|
||||
use App\Services\AgentSettlement\SettlementPartyEnrichment;
|
||||
use App\Services\Player\PlayerCreditService;
|
||||
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
@@ -34,13 +36,15 @@ final class PlayerLedgerLogsService
|
||||
'bet' => ['bet_hold', 'game_settlement_loss'],
|
||||
'reversal' => ['bet_hold_release'],
|
||||
'refund' => ['settlement_confirm'],
|
||||
'prize' => [],
|
||||
'prize' => ['game_settlement_win', 'settlement_payout'],
|
||||
'transfer_in' => [],
|
||||
'transfer_out' => [],
|
||||
];
|
||||
|
||||
public function __construct(
|
||||
private readonly PlayerCreditService $playerCreditService,
|
||||
private readonly CreditLedgerBetFlowPresenter $betFlowPresenter,
|
||||
private readonly SettlementPartyEnrichment $partyEnrichment,
|
||||
) {}
|
||||
|
||||
/**
|
||||
@@ -93,31 +97,102 @@ final class PlayerLedgerLogsService
|
||||
return ['items' => [], 'total' => 0, 'page' => $page, 'per_page' => $perPage];
|
||||
}
|
||||
|
||||
$reasonFilter = $bizType !== null && $bizType !== ''
|
||||
? [trim($bizType)]
|
||||
: null;
|
||||
|
||||
$paginator = $this->creditLedgerQuery($player->id, $reasonFilter)
|
||||
->paginate($perPage, ['*'], 'page', $page);
|
||||
|
||||
$currency = (string) $player->default_currency;
|
||||
$runningMinor = $this->playerCreditService->availableCreditMinor($player, $currency);
|
||||
$items = $paginator->getCollection()
|
||||
->map(function (object $row) use (&$runningMinor, $player, $currency): array {
|
||||
$amount = (int) $row->amount;
|
||||
$formatted = $this->formatAdminCreditRow($row, $player, $currency, $runningMinor);
|
||||
$runningMinor -= $amount;
|
||||
$rawRows = $this->creditLedgerQuery($player->id, [
|
||||
'bet_hold',
|
||||
'bet_hold_release',
|
||||
'game_settlement_loss',
|
||||
'game_settlement_win',
|
||||
'settlement_payout',
|
||||
])->limit(5000)->get()->all();
|
||||
|
||||
$enriched = array_map(function (object $row) use ($player): object {
|
||||
return (object) [
|
||||
'id' => (int) $row->id,
|
||||
'amount' => (int) $row->amount,
|
||||
'reason' => (string) $row->reason,
|
||||
'ref_type' => $row->ref_type ?? null,
|
||||
'ref_id' => $row->ref_id ?? null,
|
||||
'created_at' => $row->created_at ?? null,
|
||||
'updated_at' => $row->updated_at ?? null,
|
||||
'player_id' => (int) $player->id,
|
||||
'site_code' => $player->site_code,
|
||||
'site_player_id' => $player->site_player_id,
|
||||
'username' => $player->username,
|
||||
'nickname' => $player->nickname,
|
||||
'agent_node_id' => $player->agent_node_id,
|
||||
'funding_mode' => $player->funding_mode,
|
||||
'auth_source' => $player->auth_source,
|
||||
'default_currency' => $player->default_currency,
|
||||
'direct_agent_id' => null,
|
||||
'direct_agent_code' => null,
|
||||
'direct_agent_name' => null,
|
||||
'parent_agent_id' => null,
|
||||
'parent_agent_code' => null,
|
||||
'parent_agent_name' => null,
|
||||
];
|
||||
}, $rawRows);
|
||||
|
||||
$ticketIds = [];
|
||||
foreach ($enriched as $row) {
|
||||
if ((string) ($row->ref_type ?? '') === 'ticket_item') {
|
||||
$ticketId = (int) ($row->ref_id ?? 0);
|
||||
if ($ticketId > 0) {
|
||||
$ticketIds[] = $ticketId;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$ticketRefs = $this->partyEnrichment->loadTicketRefs(array_values(array_unique($ticketIds)));
|
||||
|
||||
$simplified = $this->betFlowPresenter->simplifyCreditRows(
|
||||
$enriched,
|
||||
$ticketRefs,
|
||||
fn (object $row): array => $this->formatAdminCreditRow($row, $player, $currency, 0),
|
||||
function (object $row) use ($player, $currency): array {
|
||||
$formatted = $this->formatAdminCreditRow($row, $player, $currency, 0);
|
||||
$ticketId = (int) ($row->ref_id ?? 0);
|
||||
if ($ticketId > 0) {
|
||||
$formatted['txn_no'] = 'CLS-T'.$ticketId;
|
||||
}
|
||||
|
||||
return $formatted;
|
||||
})
|
||||
->values()
|
||||
->all();
|
||||
},
|
||||
);
|
||||
|
||||
if ($bizType !== null && $bizType !== '') {
|
||||
$filterType = trim($bizType);
|
||||
$simplified = array_values(array_filter(
|
||||
$simplified,
|
||||
static fn (array $item): bool => ($item['biz_type'] ?? '') === $filterType
|
||||
|| ($filterType === 'bet_hold' && ($item['biz_type'] ?? '') === CreditLedgerBetFlowPresenter::DISPLAY_BET_HOLD)
|
||||
|| ($filterType === 'game_settlement' && ($item['biz_type'] ?? '') === CreditLedgerBetFlowPresenter::DISPLAY_GAME_SETTLEMENT),
|
||||
));
|
||||
}
|
||||
|
||||
$total = count($simplified);
|
||||
$offset = max(0, ($page - 1) * $perPage);
|
||||
$pageRows = array_slice($simplified, $offset, $perPage);
|
||||
|
||||
$runningMinor = $this->playerCreditService->availableCreditMinor($player, $currency);
|
||||
$items = [];
|
||||
foreach ($pageRows as $formatted) {
|
||||
$signed = (int) ($formatted['direction'] === 1 ? $formatted['amount'] : -$formatted['amount']);
|
||||
$items[] = array_merge($formatted, [
|
||||
'balance_after' => $runningMinor,
|
||||
'balance_after_formatted' => CurrencyFormatter::fromMinor($runningMinor),
|
||||
'balance_before' => $signed >= 0
|
||||
? max(0, $runningMinor - $signed)
|
||||
: $runningMinor + abs($signed),
|
||||
]);
|
||||
$runningMinor -= $signed;
|
||||
}
|
||||
|
||||
return [
|
||||
'items' => $items,
|
||||
'total' => $paginator->total(),
|
||||
'page' => $paginator->currentPage(),
|
||||
'per_page' => $paginator->perPage(),
|
||||
'total' => $total,
|
||||
'page' => $page,
|
||||
'per_page' => $perPage,
|
||||
];
|
||||
}
|
||||
|
||||
@@ -535,6 +610,7 @@ final class PlayerLedgerLogsService
|
||||
'bet_hold', 'game_settlement_loss' => 'bet',
|
||||
'bet_hold_release' => 'reversal',
|
||||
'settlement_confirm' => 'refund',
|
||||
'game_settlement_win', 'settlement_payout' => 'prize',
|
||||
default => $reason,
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user