feat: 为赔率项增加 dimension 字段并支持按维度配置佣金,调整后台配置导航权限

This commit is contained in:
2026-05-21 17:54:31 +08:00
parent 7a6048de10
commit c1c25e3143
7 changed files with 150 additions and 31 deletions

View File

@@ -30,6 +30,8 @@ final class OddsStandardScopes
*
* 仅对「该版本里已出现过的 (play_code, currency_code)」补全,避免给从未配置过的玩法凭空加行。
* 若版本下无任何 odds_items则用当前全部玩法 × 首个可下注币种补全。
*
* 佣金按维度2D/3D/4D配置同一维度的所有玩法共享佣金率。
*/
public static function syncMissingForVersion(OddsVersion $version): void
{
@@ -54,26 +56,45 @@ final class OddsStandardScopes
$pairs = PlayType::query()
->orderBy('sort_order')
->orderBy('play_code')
->get(['play_code'])
->get(['play_code', 'dimension'])
->map(fn (PlayType $pt) => (object) [
'play_code' => $pt->play_code,
'dimension' => $pt->dimension,
'currency_code' => $currencyCode,
]);
}
// 按维度分组,获取每个维度的佣金率
$dimensionCommissions = [];
foreach ($pairs as $pair) {
$dimension = $pair->dimension ?? null;
$currencyCode = strtoupper((string) $pair->currency_code);
$key = $dimension.'|'.$currencyCode;
if (!isset($dimensionCommissions[$key])) {
// 从现有记录中获取该维度的佣金率
$anchor = OddsItem::query()
->where('version_id', $vid)
->where('currency_code', $currencyCode)
->where('dimension', $dimension)
->orderByDesc('id')
->first();
$dimensionCommissions[$key] = [
'rebate' => (float) ($anchor?->rebate_rate ?? 0),
'commission' => (float) ($anchor?->commission_rate ?? 0),
];
}
}
foreach ($pairs as $pair) {
$playCode = (string) $pair->play_code;
$dimension = $pair->dimension ?? null;
$currencyCode = strtoupper((string) $pair->currency_code);
$anchor = OddsItem::query()
->where('version_id', $vid)
->where('play_code', $playCode)
->where('currency_code', $currencyCode)
->orderByDesc('id')
->first();
$rebate = (float) ($anchor?->rebate_rate ?? 0);
$commission = (float) ($anchor?->commission_rate ?? 0);
$key = $dimension.'|'.$currencyCode;
$rebate = $dimensionCommissions[$key]['rebate'] ?? 0;
$commission = $dimensionCommissions[$key]['commission'] ?? 0;
foreach (self::PRESET_ODDS_BY_SCOPE as $scope => $oddsValue) {
$exists = OddsItem::query()
@@ -90,6 +111,7 @@ final class OddsStandardScopes
'version_id' => $vid,
'play_code' => $playCode,
'prize_scope' => $scope,
'dimension' => $dimension,
'odds_value' => $oddsValue,
'rebate_rate' => $rebate,
'commission_rate' => $commission,