139 lines
4.8 KiB
PHP
139 lines
4.8 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Currency;
|
|
|
|
use App\Models\Currency;
|
|
use App\Models\OddsItem;
|
|
use App\Models\PlayType;
|
|
use App\Models\JackpotPool;
|
|
use App\Models\OddsVersion;
|
|
use Illuminate\Support\Facades\DB;
|
|
use App\Support\OddsStandardScopes;
|
|
|
|
/**
|
|
* 为新开通下注能力的币种补齐最小可运营数据。
|
|
*/
|
|
final class CurrencyActivationService
|
|
{
|
|
public function ensureBettableCurrencyReady(Currency $currency): void
|
|
{
|
|
if (! $currency->is_enabled || ! $currency->is_bettable) {
|
|
return;
|
|
}
|
|
|
|
DB::transaction(function () use ($currency): void {
|
|
$currencyCode = strtoupper((string) $currency->code);
|
|
|
|
$this->ensureJackpotPool($currencyCode);
|
|
$this->ensureOddsItems($currencyCode);
|
|
});
|
|
}
|
|
|
|
private function ensureJackpotPool(string $currencyCode): void
|
|
{
|
|
$exists = JackpotPool::query()
|
|
->where('currency_code', $currencyCode)
|
|
->exists();
|
|
|
|
if ($exists) {
|
|
return;
|
|
}
|
|
|
|
$source = JackpotPool::query()
|
|
->where('currency_code', '!=', $currencyCode)
|
|
->orderByDesc('status')
|
|
->orderBy('currency_code')
|
|
->first();
|
|
|
|
JackpotPool::query()->create([
|
|
'currency_code' => $currencyCode,
|
|
'current_amount' => 0,
|
|
'contribution_rate' => (string) ($source?->contribution_rate ?? '0.0200'),
|
|
'trigger_threshold' => (int) ($source?->trigger_threshold ?? 100_000_000),
|
|
'payout_rate' => (string) ($source?->payout_rate ?? '0.5000'),
|
|
'force_trigger_draw_gap' => (int) ($source?->force_trigger_draw_gap ?? 100),
|
|
'min_bet_amount' => (int) ($source?->min_bet_amount ?? 100),
|
|
'combo_trigger_play_codes' => $source?->combo_trigger_play_codes,
|
|
'status' => (int) ($source?->status ?? 0),
|
|
'last_trigger_draw_id' => null,
|
|
]);
|
|
}
|
|
|
|
private function ensureOddsItems(string $currencyCode): void
|
|
{
|
|
OddsVersion::query()
|
|
->orderBy('id')
|
|
->each(function (OddsVersion $version) use ($currencyCode): void {
|
|
$this->ensureOddsItemsForVersion($version, $currencyCode);
|
|
});
|
|
}
|
|
|
|
private function ensureOddsItemsForVersion(OddsVersion $version, string $currencyCode): void
|
|
{
|
|
$hasTargetCurrency = OddsItem::query()
|
|
->where('version_id', $version->id)
|
|
->where('currency_code', $currencyCode)
|
|
->exists();
|
|
|
|
if ($hasTargetCurrency) {
|
|
OddsStandardScopes::syncMissingForVersion($version);
|
|
|
|
return;
|
|
}
|
|
|
|
$sourceCurrency = OddsItem::query()
|
|
->where('version_id', $version->id)
|
|
->where('currency_code', '!=', $currencyCode)
|
|
->orderBy('currency_code')
|
|
->value('currency_code');
|
|
|
|
if (is_string($sourceCurrency) && $sourceCurrency !== '') {
|
|
OddsItem::query()
|
|
->where('version_id', $version->id)
|
|
->where('currency_code', $sourceCurrency)
|
|
->orderBy('play_code')
|
|
->orderBy('prize_scope')
|
|
->get()
|
|
->each(function (OddsItem $item) use ($version, $currencyCode): void {
|
|
OddsItem::query()->firstOrCreate(
|
|
[
|
|
'version_id' => $version->id,
|
|
'play_code' => $item->play_code,
|
|
'prize_scope' => $item->prize_scope,
|
|
'currency_code' => $currencyCode,
|
|
],
|
|
[
|
|
'odds_value' => (int) $item->odds_value,
|
|
'rebate_rate' => (float) $item->rebate_rate,
|
|
'commission_rate' => (float) $item->commission_rate,
|
|
'extra_config_json' => $item->extra_config_json,
|
|
],
|
|
);
|
|
});
|
|
|
|
OddsStandardScopes::syncMissingForVersion($version);
|
|
|
|
return;
|
|
}
|
|
|
|
foreach (PlayType::query()->orderBy('sort_order')->orderBy('play_code')->get() as $playType) {
|
|
foreach (OddsStandardScopes::PRESET_ODDS_BY_SCOPE as $scope => $oddsValue) {
|
|
OddsItem::query()->firstOrCreate(
|
|
[
|
|
'version_id' => $version->id,
|
|
'play_code' => $playType->play_code,
|
|
'prize_scope' => $scope,
|
|
'currency_code' => $currencyCode,
|
|
],
|
|
[
|
|
'odds_value' => $oddsValue,
|
|
'rebate_rate' => 0,
|
|
'commission_rate' => 0,
|
|
'extra_config_json' => null,
|
|
],
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|