更新 AdminJackpotPoolUpdateController 校验规则,禁止传入 current_amount。 优化 AdminRiskPoolManualStatusController:更新奖池状态后同步 Redis 状态。 在 TransferOrderReconcileController 中新增 completeCredit 方法,用于处理卡住的转账订单对账。 调整 TransferOrderListController:优化转账订单处理条件。 在 TicketItemsIndexController 中实现支持时区的日期筛选,提升日期处理准确性。 扩展 JackpotPool 模型,新增 adjustments 关联关系。 改进票据与钱包相关服务中的错误处理和事务管理。
60 lines
1.6 KiB
PHP
60 lines
1.6 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Jackpot;
|
|
|
|
use App\Models\Draw;
|
|
use App\Models\TicketItem;
|
|
use App\Models\JackpotPool;
|
|
use App\Models\JackpotContribution;
|
|
|
|
/**
|
|
* 产品文档 §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;
|
|
}
|
|
|
|
$existing = JackpotContribution::query()
|
|
->where('ticket_item_id', $item->id)
|
|
->first();
|
|
|
|
if ($existing !== null) {
|
|
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();
|
|
}
|
|
}
|