GameBand.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. <?php
  2. namespace app\common\model;
  3. /**
  4. * 游戏多端绑定关系表(游戏组管理)
  5. * @author Administrator
  6. */
  7. class GameBand extends \think\Model
  8. {
  9. protected $pk = 'id';
  10. protected $table = 'nw_game_band';
  11. protected $dateFormat = false; //时间戳格式不自动转换
  12. // 状态常量
  13. const STATUS_DISABLE = 0; // 禁用
  14. const STATUS_ENABLE = 1; // 启用
  15. /**
  16. * 获取分组列表(关联游戏名称,使用 ThinkPHP 分页)
  17. *
  18. * @param array $filters keyword, id, game_id, status, platform
  19. */
  20. public function getGroupList($filters = [])
  21. {
  22. if (!is_array($filters)) {
  23. $filters = ['keyword' => (string)$filters];
  24. }
  25. $keyword = trim($filters['keyword'] ?? '');
  26. $groupId = (int)($filters['id'] ?? 0);
  27. $gameId = (int)($filters['game_id'] ?? 0);
  28. $status = $filters['status'] ?? '';
  29. $platform = trim($filters['platform'] ?? '');
  30. $query = $this->alias('gb')
  31. ->field('gb.*,
  32. ag.name as android_game_name,
  33. ig.name as ios_game_name,
  34. hg.name as h5_game_name')
  35. ->join('cy_game ag', 'ag.id = gb.android_game_id', 'LEFT')
  36. ->join('cy_game ig', 'ig.id = gb.ios_game_id', 'LEFT')
  37. ->join('cy_game hg', 'hg.id = gb.h5_game_id', 'LEFT')
  38. ->order('gb.id desc');
  39. if ($groupId > 0) {
  40. $query->where('gb.id', $groupId);
  41. }
  42. if ($gameId > 0) {
  43. $query->where(function ($q) use ($gameId) {
  44. $q->where('gb.android_game_id', $gameId)
  45. ->whereOr('gb.ios_game_id', $gameId)
  46. ->whereOr('gb.h5_game_id', $gameId);
  47. });
  48. }
  49. if ($status !== '' && $status !== null) {
  50. $query->where('gb.status', (int)$status);
  51. }
  52. switch ($platform) {
  53. case 'android':
  54. $query->where('gb.android_game_id', '>', 0);
  55. break;
  56. case 'ios':
  57. $query->where('gb.ios_game_id', '>', 0);
  58. break;
  59. case 'h5':
  60. $query->where('gb.h5_game_id', '>', 0);
  61. break;
  62. case 'unbound':
  63. $query->where('gb.android_game_id', 0)
  64. ->where('gb.ios_game_id', 0)
  65. ->where('gb.h5_game_id', 0);
  66. break;
  67. }
  68. if ($keyword !== '') {
  69. if (ctype_digit($keyword)) {
  70. $query->where(function ($q) use ($keyword) {
  71. $q->where('gb.id', (int)$keyword)
  72. ->whereOr('gb.android_game_id', (int)$keyword)
  73. ->whereOr('gb.ios_game_id', (int)$keyword)
  74. ->whereOr('gb.h5_game_id', (int)$keyword)
  75. ->whereOr('gb.game_name|ag.name|ig.name|hg.name', 'like', "%{$keyword}%");
  76. });
  77. } else {
  78. $query->where('gb.game_name|ag.name|ig.name|hg.name', 'like', "%{$keyword}%");
  79. }
  80. }
  81. $list = $query->paginate(20, false, ['query' => request()->param()]);
  82. $list->each(function ($item) {
  83. $item['display_name'] = self::resolveDisplayName($item);
  84. $item['bind_count'] = self::countBindings($item);
  85. return $item;
  86. });
  87. return $list;
  88. }
  89. /**
  90. * 获取单个分组详情
  91. */
  92. public function getGroupDetail($id)
  93. {
  94. $detail = $this->alias('gb')
  95. ->field('gb.*,
  96. ag.name as android_game_name,
  97. ig.name as ios_game_name,
  98. hg.name as h5_game_name')
  99. ->join('cy_game ag', 'ag.id = gb.android_game_id', 'LEFT')
  100. ->join('cy_game ig', 'ig.id = gb.ios_game_id', 'LEFT')
  101. ->join('cy_game hg', 'hg.id = gb.h5_game_id', 'LEFT')
  102. ->where('gb.id', $id)
  103. ->find();
  104. if ($detail) {
  105. $detail['display_name'] = self::resolveDisplayName($detail);
  106. }
  107. return $detail;
  108. }
  109. /**
  110. * 解析展示名称:优先 game_name,否则从已绑定游戏名推导
  111. */
  112. public static function resolveDisplayName($row)
  113. {
  114. $name = trim($row['game_name'] ?? '');
  115. if ($name !== '') {
  116. return $name;
  117. }
  118. foreach (['android_game_name', 'ios_game_name', 'h5_game_name'] as $field) {
  119. $gameName = trim($row[$field] ?? '');
  120. if ($gameName === '') {
  121. continue;
  122. }
  123. $clean = preg_replace('/\s*[\((](?:安卓|Android|IOS|ios|iOS|H5|h5)[\))]\s*$/iu', '', $gameName);
  124. $clean = preg_replace('/\s*[-—]?\s*(安卓|Android|IOS|ios|iOS|H5|h5)\s*$/iu', '', $clean);
  125. $clean = trim($clean);
  126. if ($clean !== '') {
  127. return $clean;
  128. }
  129. }
  130. return '未命名游戏组#' . ($row['id'] ?? 0);
  131. }
  132. /**
  133. * 统计已绑定平台数量
  134. */
  135. public static function countBindings($row)
  136. {
  137. $count = 0;
  138. if (!empty($row['android_game_id'])) {
  139. $count++;
  140. }
  141. if (!empty($row['ios_game_id'])) {
  142. $count++;
  143. }
  144. if (!empty($row['h5_game_id'])) {
  145. $count++;
  146. }
  147. return $count;
  148. }
  149. /**
  150. * 获取状态文本
  151. */
  152. public function getStatusTextAttr($value, $data)
  153. {
  154. $status = [
  155. self::STATUS_DISABLE => '禁用',
  156. self::STATUS_ENABLE => '启用',
  157. ];
  158. return $status[$data['status']] ?? '未知';
  159. }
  160. }