'#007bff', // blue 1 => '#28a745', // green 2 => '#ffc107', // yellow/orange 3 => '#dc3545', // red 4 => '#6f42c1', // purple 5 => '#17a2b8', // cyan 6 => '#6c757d', // gray 7 => '#e83e8c', // pink ]; protected $specialModes = [ 1 => 'GUEST (自动游客登录模式)', 2 => 'ZERO_MONEY (注册不送钱)', 4 => 'DISABLE_PROMOTE_INSTALL (提示安装)', 8 => 'PWA_BONUS (安装app送钱)', 16 => 'SMS_BONUS (手机验证送钱)', 32 => 'MAIL_BONUS (MAIL验证送钱)', 64 => 'FIRSTPAY_OFF30 (首冲打开30%bonus)', 128 => 'DEBUG_EVENT (是否开启事件日志上报)', 256 => 'REGION_UNIQUE (是否开启区域独立模式)', ]; public function index(Request $request) { $channel = $request->input('Channel'); $packageName = $request->input('PackageName'); $query = WebChannelConfig::query(); if ($channel) { $query->where('Channel', $channel); } if ($packageName) { $query->where('PackageName', 'like', '%' . $packageName . '%'); } $list = $query->orderBy('Channel', 'asc')->paginate(40); $regions = WebRegionConfig::all(); $regionMap = []; foreach ($regions as $region) { $regionMap[$region->RegionID] = [ 'color' => $this->groupColors[$region->GroupID] ?? '#000000', 'logo' => $region->DomainUrl . $region->LogoUrl, 'has_logo' => !empty($region->LogoUrl) ]; } return view('admin.web_channel_config.index', [ 'list' => $list, 'channel' => $channel, 'packageName' => $packageName, 'regionMap' => $regionMap, ]); } public function create() { $regionList = WebRegionConfig::orderBy('GroupID', 'asc')->get(); return view('admin.web_channel_config.add', [ 'regionList' => $regionList, 'groupColors' => $this->groupColors, 'specialModes' => $this->specialModes ]); } public function store(Request $request) { $data = $request->all(); $validator = Validator::make($data, [ 'Channel' => 'required|integer', 'PackageName' => 'required|string|max:200', ]); if ($validator->fails()) { return apiReturnFail($validator->errors()->first()); } // 处理 BonusArr $bonusArr = [ $request->input('BonusArr_REG', 0), $request->input('BonusArr_MOBILE', 0), $request->input('BonusArr_EMAIL', 0), $request->input('BonusArr_PWA', 0), ]; $data['BonusArr'] = implode('|', $bonusArr); // 处理 LoginOpen 和 RegOpen (多选框) $data['LoginOpen'] = $request->has('LoginOpen') ? implode(',', $request->input('LoginOpen')) : ''; $data['RegOpen'] = $request->has('RegOpen') ? implode(',', $request->input('RegOpen')) : ''; // 处理 SpecialMode (多选框位运算) $specialMode = 0; if ($request->has('SpecialMode') && is_array($request->input('SpecialMode'))) { foreach ($request->input('SpecialMode') as $val) { $specialMode += (int)$val; } } $data['SpecialMode'] = $specialMode; // 防止 null 报错 $data['ShadowChannel'] = $data['ShadowChannel'] ?? ''; $data['LightApk'] = $data['LightApk'] ?? ''; $data['FullApk'] = $data['FullApk'] ?? ''; $data['PlatformID'] = $data['PlatformID'] ?? ''; $data['RegionID'] = $data['RegionID'] ?? ''; $config = WebChannelConfig::create($data); // 同步更新 WebRegionConfig 的 BindChannels if (!empty($config->RegionID)) { $region = WebRegionConfig::where('RegionID', $config->RegionID)->first(); if ($region) { $bindChannels = is_array($region->BindChannels) ? $region->BindChannels : []; if (!in_array($config->Channel, $bindChannels)) { $bindChannels[] = (int)$config->Channel; sort($bindChannels); $region->BindChannels = $bindChannels; $region->save(); } } } return apiReturnSuc(); } public function edit($id) { $info = WebChannelConfig::findOrFail($id); $regionList = WebRegionConfig::orderBy('GroupID', 'asc')->get(); return view('admin.web_channel_config.edit', [ 'info' => $info, 'regionList' => $regionList, 'groupColors' => $this->groupColors, 'specialModes' => $this->specialModes ]); } public function update(Request $request, $id) { $data = $request->all(); $info = WebChannelConfig::findOrFail($id); $validator = Validator::make($data, [ 'PackageName' => 'required|string|max:200', ]); if ($validator->fails()) { return apiReturnFail($validator->errors()->first()); } // 确保 Channel 不被修改 unset($data['Channel']); // 处理 BonusArr $bonusArr = [ $request->input('BonusArr_REG', 0), $request->input('BonusArr_MOBILE', 0), $request->input('BonusArr_EMAIL', 0), $request->input('BonusArr_PWA', 0), ]; $data['BonusArr'] = implode('|', $bonusArr); // 处理 LoginOpen 和 RegOpen (多选框) $data['LoginOpen'] = $request->has('LoginOpen') ? implode(',', $request->input('LoginOpen')) : ''; $data['RegOpen'] = $request->has('RegOpen') ? implode(',', $request->input('RegOpen')) : ''; // 处理 SpecialMode (多选框位运算) $specialMode = 0; if ($request->has('SpecialMode') && is_array($request->input('SpecialMode'))) { foreach ($request->input('SpecialMode') as $val) { $specialMode += (int)$val; } } $data['SpecialMode'] = $specialMode; // 防止 null 报错 $data['ShadowChannel'] = $data['ShadowChannel'] ?? ''; $data['LightApk'] = $data['LightApk'] ?? ''; $data['FullApk'] = $data['FullApk'] ?? ''; $data['PlatformID'] = $data['PlatformID'] ?? ''; $data['RegionID'] = $data['RegionID'] ?? ''; $oldRegionID = $info->RegionID; $oldChannel = $info->Channel; $oldSpecialMode = $info->SpecialMode; // 一旦启用 REGION_UNIQUE,RegionID 不可更换同时 REGION_UNIQUE 选项不可更改 if (($oldSpecialMode & 256) == 256) { $data['RegionID'] = $oldRegionID; if (!in_array(256, $request->input('SpecialMode', []))) { $specialMode += 256; $data['SpecialMode'] = $specialMode; } } $info->update($data); // 如果 RegionID 或 Channel 发生变化,需要同步更新 WebRegionConfig if ($oldRegionID != $info->RegionID || $oldChannel != $info->Channel) { // 1. 从旧的 RegionID 中移除旧的 Channel if (!empty($oldRegionID)) { $oldRegion = WebRegionConfig::where('RegionID', $oldRegionID)->first(); if ($oldRegion) { $bindChannels = is_array($oldRegion->BindChannels) ? $oldRegion->BindChannels : []; $key = array_search($oldChannel, $bindChannels); if ($key !== false) { unset($bindChannels[$key]); $oldRegion->BindChannels = array_values($bindChannels); $oldRegion->save(); } } } // 2. 向新的 RegionID 中添加新的 Channel if (!empty($info->RegionID)) { $newRegion = WebRegionConfig::where('RegionID', $info->RegionID)->first(); if ($newRegion) { $bindChannels = is_array($newRegion->BindChannels) ? $newRegion->BindChannels : []; if (!in_array($info->Channel, $bindChannels)) { $bindChannels[] = (int)$info->Channel; sort($bindChannels); $newRegion->BindChannels = $bindChannels; $newRegion->save(); } } } } return apiReturnSuc(); } public function destroy($id) { $info = WebChannelConfig::findOrFail($id); $channel = $info->Channel; $regionID = $info->RegionID; $info->delete(); // 删除时,从 WebRegionConfig 的 BindChannels 中移除该 Channel if (!empty($regionID)) { $region = WebRegionConfig::where('RegionID', $regionID)->first(); if ($region) { $bindChannels = is_array($region->BindChannels) ? $region->BindChannels : []; $key = array_search($channel, $bindChannels); if ($key !== false) { unset($bindChannels[$key]); $region->BindChannels = array_values($bindChannels); $region->save(); } } } return apiReturnSuc(); } }