order('id', 'asc')->select()->toArray(); $byTier = []; $byTierGrid = []; foreach ($list as $row) { $tier = isset($row['tier']) ? (string) $row['tier'] : ''; if ($tier !== '') { if (!isset($byTier[$tier])) { $byTier[$tier] = []; } $byTier[$tier][] = $row; $gridNum = isset($row['grid_number']) ? (int) $row['grid_number'] : 0; if (!isset($byTierGrid[$tier])) { $byTierGrid[$tier] = []; } if (!isset($byTierGrid[$tier][$gridNum])) { $byTierGrid[$tier][$gridNum] = $row; } } } $minRealEv = empty($list) ? 0.0 : (float) min(array_column($list, 'real_ev')); self::$instance = [ 'list' => $list, 'by_tier' => $byTier, 'by_tier_grid' => $byTierGrid, 'min_real_ev' => $minRealEv, ]; Cache::set(self::CACHE_KEY_INSTANCE, self::$instance, self::CACHE_TTL); } private static function buildEmptyInstance(): array { return [ 'list' => [], 'by_tier' => [], 'by_tier_grid' => [], 'min_real_ev' => 0.0, ]; } /** * 按档位+色子点数取一条(用于 BIGWIN) */ public static function getCachedByTierAndGridNumber(string $tier, int $gridNumber): ?array { $inst = self::getCachedInstance(); $byTierGrid = $inst['by_tier_grid'] ?? []; $tierData = $byTierGrid[$tier] ?? []; $row = $tierData[$gridNumber] ?? null; return is_array($row) ? $row : null; } public static function getCachedMinRealEv(): float { $inst = self::getCachedInstance(); return (float) ($inst['min_real_ev'] ?? 0.0); } /** * 从缓存按档位取奖励列表(不含权重,仅配置) */ public static function getCachedByTier(string $tier): array { $inst = self::getCachedInstance(); $byTier = $inst['by_tier'] ?? []; return $byTier[$tier] ?? []; } /** * 按档位+方向取奖励列表(合并 dice_reward 权重,用于抽奖) * @param int $direction 0=顺时针, 1=逆时针 * @return array 每行含 id, grid_number, real_ev, tier, weight 等 */ public static function getCachedByTierForDirection(string $tier, int $direction): array { $list = self::getCachedByTier($tier); $weightMap = DiceReward::getCachedByTierAndDirection($tier, $direction); foreach ($list as $i => $row) { $id = isset($row['id']) ? (int) $row['id'] : 0; $list[$i]['weight'] = $weightMap[$id] ?? 1; } return $list; } public static function clearRequestInstance(): void { self::$instance = null; } public static function onAfterInsert($model): void { self::refreshCache(); } public static function onAfterUpdate($model): void { self::refreshCache(); } public static function onAfterDelete($model): void { self::refreshCache(); } public function searchGridNumberMinAttr($query, $value) { if ($value !== '' && $value !== null) { $query->where('grid_number', '>=', $value); } } public function searchGridNumberMaxAttr($query, $value) { if ($value !== '' && $value !== null) { $query->where('grid_number', '<=', $value); } } public function searchUiTextAttr($query, $value) { if ($value !== '' && $value !== null) { $query->where('ui_text', 'like', '%' . $value . '%'); } } public function searchRealEvMinAttr($query, $value) { if ($value !== '' && $value !== null) { $query->where('real_ev', '>=', $value); } } public function searchRealEvMaxAttr($query, $value) { if ($value !== '' && $value !== null) { $query->where('real_ev', '<=', $value); } } public function searchTierAttr($query, $value) { if ($value !== '' && $value !== null) { $query->where('tier', '=', $value); } } }