feat: 添加结算功能,更新 TicketItem 模型以支持最新结算详情,增强 DrawTickService 以自动处理结算,更新 TicketWalletService 以支持派彩入账,扩展 API 路由以管理结算批次和奖池
This commit is contained in:
51
app/Services/Jackpot/JackpotContributionService.php
Normal file
51
app/Services/Jackpot/JackpotContributionService.php
Normal file
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Jackpot;
|
||||
|
||||
use App\Models\Draw;
|
||||
use App\Models\JackpotContribution;
|
||||
use App\Models\JackpotPool;
|
||||
use App\Models\TicketItem;
|
||||
|
||||
/**
|
||||
* 产品文档 §5.11.1:每笔有效注单按比例蓄水(在下注成功路径调用,非结算)。
|
||||
*/
|
||||
final class JackpotContributionService
|
||||
{
|
||||
public function recordFromPlacedTicketItem(TicketItem $item, Draw $draw, string $currencyCode): void
|
||||
{
|
||||
$currency = strtoupper($currencyCode);
|
||||
$pool = JackpotPool::query()
|
||||
->where('currency_code', $currency)
|
||||
->where('status', 1)
|
||||
->lockForUpdate()
|
||||
->first();
|
||||
|
||||
if ($pool === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ((int) $item->actual_deduct_amount < (int) $pool->min_bet_amount) {
|
||||
return;
|
||||
}
|
||||
|
||||
$rate = (float) $pool->contribution_rate;
|
||||
$contrib = (int) floor((int) $item->actual_deduct_amount * $rate);
|
||||
if ($contrib <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
JackpotContribution::query()->create([
|
||||
'jackpot_pool_id' => $pool->id,
|
||||
'draw_id' => $draw->id,
|
||||
'player_id' => $item->player_id,
|
||||
'ticket_item_id' => $item->id,
|
||||
'contribution_amount' => $contrib,
|
||||
'currency_code' => $currency,
|
||||
]);
|
||||
|
||||
$pool->forceFill([
|
||||
'current_amount' => (int) $pool->current_amount + $contrib,
|
||||
])->save();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user