WebChannelConfigController.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. use App\Game\WebChannelConfig;
  4. use App\Game\WebRegionConfig;
  5. use Illuminate\Http\Request;
  6. use Illuminate\Support\Facades\DB;
  7. use Illuminate\Support\Facades\Validator;
  8. class WebChannelConfigController
  9. {
  10. protected $groupColors = [
  11. 0 => '#007bff', // blue
  12. 1 => '#28a745', // green
  13. 2 => '#ffc107', // yellow/orange
  14. 3 => '#dc3545', // red
  15. 4 => '#6f42c1', // purple
  16. 5 => '#17a2b8', // cyan
  17. 6 => '#6c757d', // gray
  18. 7 => '#e83e8c', // pink
  19. ];
  20. protected $specialModes = [
  21. 1 => 'GUEST (自动游客登录模式)',
  22. 2 => 'ZERO_MONEY (注册不送钱)',
  23. 4 => 'DISABLE_PROMOTE_INSTALL (提示安装)',
  24. 8 => 'PWA_BONUS (安装app送钱)',
  25. 16 => 'SMS_BONUS (手机验证送钱)',
  26. 32 => 'MAIL_BONUS (MAIL验证送钱)',
  27. 64 => 'FIRSTPAY_OFF30 (首冲打开30%bonus)',
  28. 128 => 'DEBUG_EVENT (是否开启事件日志上报)',
  29. 256 => 'REGION_UNIQUE (是否开启区域独立模式)',
  30. 512 => 'FB_JUMP_LATER (fb内浏览器弹出时机在绑定手机后)',
  31. 1024 => 'FB_JUMP_LATER2 (fb内浏览器弹出在点击提现后)',
  32. ];
  33. public function index(Request $request)
  34. {
  35. $channel = $request->input('Channel');
  36. $packageName = $request->input('PackageName');
  37. $query = WebChannelConfig::query();
  38. if ($channel) {
  39. $query->where('Channel', $channel);
  40. }
  41. if ($packageName) {
  42. $query->where('PackageName', 'like', '%' . $packageName . '%');
  43. }
  44. $list = $query->orderBy('Channel', 'asc')->paginate(40);
  45. $regions = WebRegionConfig::all();
  46. $regionMap = [];
  47. $regionUrlMap = [];
  48. foreach ($regions as $region) {
  49. $logoUrl = $region->DomainUrl . $region->LogoUrl;
  50. $isSvg = !empty($region->LogoUrl) && strtolower(pathinfo($region->LogoUrl, PATHINFO_EXTENSION)) === 'svg';
  51. $regionMap[$region->RegionID] = [
  52. 'color' => $this->groupColors[$region->GroupID] ?? '#000000',
  53. 'logo' => $logoUrl,
  54. 'has_logo' => !empty($region->LogoUrl),
  55. 'is_svg' => $isSvg
  56. ];
  57. // 构建区域的 URL 映射
  58. $regionUrlMap[$region->RegionID] = $region->DomainUrl;
  59. }
  60. // 为每条记录计算网站地址
  61. $channelUrls = [];
  62. foreach ($list as $item) {
  63. $url = '';
  64. // 优先:如果 WebChannelConfig 绑定了 RegionID,直接使用该 Region 的 URL
  65. if (!empty($item->RegionID) && isset($regionUrlMap[$item->RegionID])) {
  66. $url = rtrim($regionUrlMap[$item->RegionID], '/') . '/?c=' . $item->Channel;
  67. }
  68. $channelUrls[$item->ID] = $url;
  69. }
  70. return view('admin.web_channel_config.index', [
  71. 'list' => $list,
  72. 'channel' => $channel,
  73. 'packageName' => $packageName,
  74. 'regionMap' => $regionMap,
  75. 'channelUrls' => $channelUrls,
  76. ]);
  77. }
  78. public function create()
  79. {
  80. $regionList = WebRegionConfig::orderBy('GroupID', 'asc')->get();
  81. return view('admin.web_channel_config.add', [
  82. 'regionList' => $regionList,
  83. 'groupColors' => $this->groupColors,
  84. 'specialModes' => $this->specialModes
  85. ]);
  86. }
  87. public function store(Request $request)
  88. {
  89. $data = $request->all();
  90. $validator = Validator::make($data, [
  91. 'Channel' => 'required|integer',
  92. 'PackageName' => 'required|string|max:200',
  93. ]);
  94. if ($validator->fails()) {
  95. return apiReturnFail($validator->errors()->first());
  96. }
  97. // 处理 BonusArr
  98. $bonusArr = [
  99. $request->input('BonusArr_REG', 0),
  100. $request->input('BonusArr_MOBILE', 0),
  101. $request->input('BonusArr_EMAIL', 0),
  102. $request->input('BonusArr_PWA', 0),
  103. ];
  104. $data['BonusArr'] = implode('|', $bonusArr);
  105. // 处理 LoginOpen 和 RegOpen (多选框)
  106. $data['LoginOpen'] = $request->has('LoginOpen') ? implode(',', $request->input('LoginOpen')) : '';
  107. $data['RegOpen'] = $request->has('RegOpen') ? implode(',', $request->input('RegOpen')) : '';
  108. // 处理 SpecialMode (多选框位运算)
  109. $specialMode = 0;
  110. if ($request->has('SpecialMode') && is_array($request->input('SpecialMode'))) {
  111. foreach ($request->input('SpecialMode') as $val) {
  112. $specialMode += (int)$val;
  113. }
  114. }
  115. $data['SpecialMode'] = $specialMode;
  116. // 防止 null 报错
  117. $data['ShadowChannel'] = $data['ShadowChannel'] ?? '';
  118. $data['LightApk'] = $data['LightApk'] ?? '';
  119. $data['FullApk'] = $data['FullApk'] ?? '';
  120. $data['PlatformID'] = $data['PlatformID'] ?? '';
  121. $data['PlatformToken'] = $data['PlatformToken'] ?? '';
  122. $data['RegionID'] = $data['RegionID'] ?? '';
  123. $config = WebChannelConfig::create($data);
  124. // 同步更新 WebRegionConfig 的 BindChannels
  125. if (!empty($config->RegionID)) {
  126. $region = WebRegionConfig::where('RegionID', $config->RegionID)->first();
  127. if ($region) {
  128. $bindChannels = is_array($region->BindChannels) ? $region->BindChannels : [];
  129. if (!in_array($config->Channel, $bindChannels)) {
  130. $bindChannels[] = (int)$config->Channel;
  131. sort($bindChannels);
  132. $region->BindChannels = $bindChannels;
  133. $region->save();
  134. }
  135. }
  136. }
  137. return apiReturnSuc();
  138. }
  139. public function edit($id)
  140. {
  141. $info = WebChannelConfig::findOrFail($id);
  142. $regionList = WebRegionConfig::orderBy('GroupID', 'asc')->get();
  143. return view('admin.web_channel_config.edit', [
  144. 'info' => $info,
  145. 'regionList' => $regionList,
  146. 'groupColors' => $this->groupColors,
  147. 'specialModes' => $this->specialModes
  148. ]);
  149. }
  150. public function update(Request $request, $id)
  151. {
  152. $data = $request->all();
  153. $info = WebChannelConfig::findOrFail($id);
  154. $validator = Validator::make($data, [
  155. 'PackageName' => 'required|string|max:200',
  156. ]);
  157. if ($validator->fails()) {
  158. return apiReturnFail($validator->errors()->first());
  159. }
  160. // 确保 Channel 不被修改
  161. unset($data['Channel']);
  162. // 处理 BonusArr
  163. $bonusArr = [
  164. $request->input('BonusArr_REG', 0),
  165. $request->input('BonusArr_MOBILE', 0),
  166. $request->input('BonusArr_EMAIL', 0),
  167. $request->input('BonusArr_PWA', 0),
  168. ];
  169. $data['BonusArr'] = implode('|', $bonusArr);
  170. // 处理 LoginOpen 和 RegOpen (多选框)
  171. $data['LoginOpen'] = $request->has('LoginOpen') ? implode(',', $request->input('LoginOpen')) : '';
  172. $data['RegOpen'] = $request->has('RegOpen') ? implode(',', $request->input('RegOpen')) : '';
  173. // 处理 SpecialMode (多选框位运算)
  174. $specialMode = 0;
  175. if ($request->has('SpecialMode') && is_array($request->input('SpecialMode'))) {
  176. foreach ($request->input('SpecialMode') as $val) {
  177. $specialMode += (int)$val;
  178. }
  179. }
  180. $data['SpecialMode'] = $specialMode;
  181. // 防止 null 报错
  182. $data['ShadowChannel'] = $data['ShadowChannel'] ?? '';
  183. $data['LightApk'] = $data['LightApk'] ?? '';
  184. $data['FullApk'] = $data['FullApk'] ?? '';
  185. $data['PlatformID'] = $data['PlatformID'] ?? '';
  186. $data['PlatformToken'] = $data['PlatformToken'] ?? '';
  187. $data['RegionID'] = $data['RegionID'] ?? '';
  188. $data['PlatformName'] = $data['PlatformName'] ?? '';
  189. $oldRegionID = $info->RegionID;
  190. $oldChannel = $info->Channel;
  191. $oldSpecialMode = $info->SpecialMode;
  192. // 一旦启用 REGION_UNIQUE,RegionID 不可更换同时 REGION_UNIQUE 选项不可更改
  193. if (($oldSpecialMode & 256) == 256) {
  194. $data['RegionID'] = $oldRegionID;
  195. if (!in_array(256, $request->input('SpecialMode', []))) {
  196. $specialMode += 256;
  197. $data['SpecialMode'] = $specialMode;
  198. }
  199. }
  200. $info->update($data);
  201. // 同步更新 WebRegionConfig 的 BindChannels
  202. // 1. 从旧的 RegionID 中移除旧的 Channel
  203. if (!empty($oldRegionID)) {
  204. $oldRegion = WebRegionConfig::where('RegionID', $oldRegionID)->first();
  205. if ($oldRegion) {
  206. $bindChannels = is_array($oldRegion->BindChannels) ? $oldRegion->BindChannels : [];
  207. $key = array_search($oldChannel, $bindChannels);
  208. if ($key !== false) {
  209. unset($bindChannels[$key]);
  210. $oldRegion->BindChannels = array_values($bindChannels);
  211. $oldRegion->save();
  212. }
  213. }
  214. }
  215. // 2. 向新的 RegionID 中添加新的 Channel(如果新 RegionID 不为空)
  216. if (!empty($info->RegionID)) {
  217. $newRegion = WebRegionConfig::where('RegionID', $info->RegionID)->first();
  218. if ($newRegion) {
  219. $bindChannels = is_array($newRegion->BindChannels) ? $newRegion->BindChannels : [];
  220. if (!in_array($info->Channel, $bindChannels)) {
  221. $bindChannels[] = (int)$info->Channel;
  222. sort($bindChannels);
  223. $newRegion->BindChannels = $bindChannels;
  224. $newRegion->save();
  225. }
  226. }
  227. }
  228. return apiReturnSuc();
  229. }
  230. public function destroy($id)
  231. {
  232. $info = WebChannelConfig::findOrFail($id);
  233. $channel = $info->Channel;
  234. $regionID = $info->RegionID;
  235. $info->delete();
  236. // 删除时,从 WebRegionConfig 的 BindChannels 中移除该 Channel
  237. if (!empty($regionID)) {
  238. $region = WebRegionConfig::where('RegionID', $regionID)->first();
  239. if ($region) {
  240. $bindChannels = is_array($region->BindChannels) ? $region->BindChannels : [];
  241. $key = array_search($channel, $bindChannels);
  242. if ($key !== false) {
  243. unset($bindChannels[$key]);
  244. $region->BindChannels = array_values($bindChannels);
  245. $region->save();
  246. }
  247. }
  248. }
  249. return apiReturnSuc();
  250. }
  251. public function remarks(Request $request, $id)
  252. {
  253. $remark = $request->input('remark', '');
  254. // 查找 WebChannelConfig 记录
  255. $config = WebChannelConfig::find($id);
  256. if (!$config) {
  257. return apiReturnFail('记录不存在');
  258. }
  259. $channel = $config->Channel;
  260. $packageName = $config->PackageName;
  261. // 更新 WebChannelConfig 的备注
  262. if (WebChannelConfig::where('Channel', $channel)->exists()) {
  263. WebChannelConfig::where('Channel', $channel)->update(['Remarks' => $remark]);
  264. } else {
  265. // 如果不存在,使用渠道100的配置作为模板创建新记录
  266. $templateConfig = WebChannelConfig::where('Channel', 100)->first();
  267. if ($templateConfig) {
  268. $configArray = $templateConfig->toArray();
  269. $configArray['Remarks'] = $remark;
  270. $configArray['Channel'] = $channel;
  271. $configArray['PackageName'] = $packageName;
  272. unset($configArray['ID']);
  273. WebChannelConfig::insert($configArray);
  274. }
  275. }
  276. // 同步更新 dcat-admin.channel 表
  277. $dcatChannel = DB::connection('mysql')->table('dcat-admin.channel')->where('channel', $channel);
  278. if ($dcatChannel->exists()) {
  279. $dcatChannel->update(['channel_name' => $remark]);
  280. } else {
  281. DB::connection('mysql')->table('dcat-admin.channel')->insert([
  282. 'channel' => $channel,
  283. 'channel_name' => $remark,
  284. 'package_name' => '',
  285. 'remark' => ''
  286. ]);
  287. }
  288. // 同步更新 dcat-admin.channel_ownership 表
  289. $dcatChannelOwnership = DB::connection('mysql')->table('dcat-admin.channel_ownership')->where('channel', $channel);
  290. if ($dcatChannelOwnership->exists()) {
  291. $dcatChannelOwnership->update(['name' => $remark]);
  292. } else {
  293. DB::connection('mysql')->table('dcat-admin.channel_ownership')->insert([
  294. 'channel' => $channel,
  295. 'name' => $remark
  296. ]);
  297. }
  298. return apiReturnSuc('备注更新成功');
  299. }
  300. }