Player.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. <?php
  2. declare (strict_types = 1);
  3. namespace app\controller;
  4. use app\BaseController;
  5. use app\model\PlayerModel;
  6. use think\facade\Request;
  7. class Player extends BaseController
  8. {
  9. /**
  10. * 获取玩家列表
  11. */
  12. public function list()
  13. {
  14. $loginInfo = checkUserLogin();
  15. if (!$loginInfo) {
  16. return json_error([], '请先登录');
  17. }
  18. if (!checkPermission($loginInfo, 'Player', 'list')) {
  19. return json_error([], '没有查看玩家列表的权限');
  20. }
  21. // 获取查询参数
  22. $page = Request::get('page', 1, 'intval');
  23. $limit = Request::get('limit', 10, 'intval');
  24. // 过滤条件
  25. $filters = [
  26. 'nickname' => Request::get('nickname', '', 'trim'),
  27. 'player_id' => Request::get('player_id', 0, 'intval'),
  28. 'status' => Request::get('status', ''),
  29. 'adjust_status' => Request::get('adjust_status', ''),
  30. 'login_ip' => Request::get('login_ip', '', 'trim'),
  31. 'reg_ip' => Request::get('reg_ip', '', 'trim'),
  32. 'balance_min' => Request::get('balance_min', 0, 'floatval'),
  33. 'balance_max' => Request::get('balance_max', 0, 'floatval'),
  34. 'today_win_min' => Request::get('today_win_min', 0, 'floatval'),
  35. 'today_win_max' => Request::get('today_win_max', 0, 'floatval'),
  36. 'history_win_min' => Request::get('history_win_min', 0, 'floatval'),
  37. 'history_win_max' => Request::get('history_win_max', 0, 'floatval'),
  38. 'login_time_start' => Request::get('login_time_start', '', 'trim'),
  39. 'login_time_end' => Request::get('login_time_end', '', 'trim'),
  40. 'create_time_start' => Request::get('create_time_start', '', 'trim'),
  41. 'create_time_end' => Request::get('create_time_end', '', 'trim'),
  42. 'order' => Request::get('order', 'player_id', 'trim'),
  43. 'sort' => Request::get('sort', 'desc', 'trim'),
  44. ];
  45. try {
  46. // 获取玩家列表
  47. $result = PlayerModel::getPlayerListByMerchant($loginInfo['merchant_id'], $page, $limit, $filters);
  48. // 处理列表数据
  49. foreach ($result['list'] as &$player) {
  50. $player['status_text'] = PlayerModel::getStatusText($player['status']);
  51. $player['adjust_status_text'] = PlayerModel::getAdjustStatusText($player['adjust_status']);
  52. $player['login_time_text'] = $player['login_time'] ? date('Y-m-d H:i:s', $player['login_time']) : '未登录';
  53. $player['create_time_text'] = date('Y-m-d H:i:s', $player['create_time']);
  54. $player['update_time_text'] = date('Y-m-d H:i:s', $player['update_time']);
  55. }
  56. return json_success($result, '获取成功');
  57. } catch (\Exception $e) {
  58. return json_error([], '获取玩家列表失败:' . $e->getMessage());
  59. }
  60. }
  61. /**
  62. * 获取玩家详情
  63. */
  64. public function detail()
  65. {
  66. $loginInfo = checkUserLogin();
  67. if (!$loginInfo) {
  68. return json_error([], '请先登录');
  69. }
  70. if (!checkPermission($loginInfo, 'Player', 'detail')) {
  71. return json_error([], '没有查看玩家详情的权限');
  72. }
  73. $playerId = Request::get('player_id', 0, 'intval');
  74. if (!$playerId) {
  75. return json_error([], '玩家ID不能为空');
  76. }
  77. try {
  78. $player = PlayerModel::getPlayerDetail($playerId, $loginInfo['merchant_id']);
  79. if (!$player) {
  80. return json_error([], '玩家不存在');
  81. }
  82. // 添加状态文本
  83. $player['status_text'] = PlayerModel::getStatusText($player['status']);
  84. $player['adjust_status_text'] = PlayerModel::getAdjustStatusText($player['adjust_status']);
  85. $player['login_time_text'] = $player['login_time'] ? date('Y-m-d H:i:s', $player['login_time']) : '未登录';
  86. $player['create_time_text'] = date('Y-m-d H:i:s', $player['create_time']);
  87. $player['update_time_text'] = date('Y-m-d H:i:s', $player['update_time']);
  88. return json_success($player, '获取成功');
  89. } catch (\Exception $e) {
  90. return json_error([], '获取玩家详情失败:' . $e->getMessage());
  91. }
  92. }
  93. /**
  94. * 更新玩家状态
  95. */
  96. public function updateStatus()
  97. {
  98. $loginInfo = checkUserLogin();
  99. if (!$loginInfo) {
  100. return json_error([], '请先登录');
  101. }
  102. if (!checkPermission($loginInfo, 'Player', 'updateStatus')) {
  103. return json_error([], '没有更新玩家状态的权限');
  104. }
  105. $playerId = Request::post('player_id', 0, 'intval');
  106. $status = Request::post('status', 0, 'intval');
  107. if (!$playerId) {
  108. return json_error([], '玩家ID不能为空');
  109. }
  110. if (!in_array($status, [PlayerModel::STATUS_NORMAL, PlayerModel::STATUS_FROZEN])) {
  111. return json_error([], '状态值无效');
  112. }
  113. try {
  114. $result = PlayerModel::updatePlayerStatus($playerId, $loginInfo['merchant_id'], $status);
  115. if ($result) {
  116. return json_success([], '状态更新成功');
  117. } else {
  118. return json_error([], '状态更新失败');
  119. }
  120. } catch (\Exception $e) {
  121. return json_error([], '更新玩家状态失败:' . $e->getMessage());
  122. }
  123. }
  124. /**
  125. * 更新玩家调控状态
  126. */
  127. public function updateAdjustStatus()
  128. {
  129. $loginInfo = checkUserLogin();
  130. if (!$loginInfo) {
  131. return json_error([], '请先登录');
  132. }
  133. if (!checkPermission($loginInfo, 'Player', 'updateAdjustStatus')) {
  134. return json_error([], '没有更新玩家调控状态的权限');
  135. }
  136. $playerId = Request::post('player_id', 0, 'intval');
  137. $adjustStatus = Request::post('adjust_status', 0, 'intval');
  138. if (!$playerId) {
  139. return json_error([], '玩家ID不能为空');
  140. }
  141. if (!in_array($adjustStatus, [
  142. PlayerModel::ADJUST_STATUS_NORMAL,
  143. PlayerModel::ADJUST_STATUS_WIN,
  144. PlayerModel::ADJUST_STATUS_LOSE
  145. ])) {
  146. return json_error([], '调控状态值无效');
  147. }
  148. try {
  149. $result = PlayerModel::updatePlayerAdjustStatus($playerId, $loginInfo['merchant_id'], $adjustStatus);
  150. if ($result) {
  151. return json_success([], '调控状态更新成功');
  152. } else {
  153. return json_error([], '调控状态更新失败');
  154. }
  155. } catch (\Exception $e) {
  156. return json_error([], '更新玩家调控状态失败:' . $e->getMessage());
  157. }
  158. }
  159. /**
  160. * 获取玩家统计信息
  161. */
  162. public function statistics()
  163. {
  164. $loginInfo = checkUserLogin();
  165. if (!$loginInfo) {
  166. return json_error([], '请先登录');
  167. }
  168. if (!checkPermission($loginInfo, 'Player', 'statistics')) {
  169. return json_error([], '没有查看玩家统计的权限');
  170. }
  171. try {
  172. $statistics = PlayerModel::getPlayerStatistics($loginInfo['merchant_id']);
  173. return json_success($statistics, '获取成功');
  174. } catch (\Exception $e) {
  175. return json_error([], '获取玩家统计失败:' . $e->getMessage());
  176. }
  177. }
  178. /**
  179. * 批量更新玩家状态
  180. */
  181. public function batchUpdateStatus()
  182. {
  183. $loginInfo = checkUserLogin();
  184. if (!$loginInfo) {
  185. return json_error([], '请先登录');
  186. }
  187. if (!checkPermission($loginInfo, 'Player', 'batchUpdate')) {
  188. return json_error([], '没有批量更新玩家状态的权限');
  189. }
  190. $playerIds = Request::post('player_ids', []);
  191. $status = Request::post('status', 0, 'intval');
  192. if (empty($playerIds) || !is_array($playerIds)) {
  193. return json_error([], '请选择要更新的玩家');
  194. }
  195. if (!in_array($status, [PlayerModel::STATUS_NORMAL, PlayerModel::STATUS_FROZEN])) {
  196. return json_error([], '状态值无效');
  197. }
  198. try {
  199. $result = PlayerModel::batchUpdateStatus($playerIds, $loginInfo['merchant_id'], $status);
  200. if ($result > 0) {
  201. return json_success(['updated' => $result], '批量更新成功');
  202. } else {
  203. return json_error([], '批量更新失败');
  204. }
  205. } catch (\Exception $e) {
  206. return json_error([], '批量更新玩家状态失败:' . $e->getMessage());
  207. }
  208. }
  209. /**
  210. * 批量更新玩家调控状态
  211. */
  212. public function batchUpdateAdjustStatus()
  213. {
  214. $loginInfo = checkUserLogin();
  215. if (!$loginInfo) {
  216. return json_error([], '请先登录');
  217. }
  218. if (!checkPermission($loginInfo, 'Player', 'batchUpdate')) {
  219. return json_error([], '没有批量更新玩家调控状态的权限');
  220. }
  221. $playerIds = Request::post('player_ids', []);
  222. $adjustStatus = Request::post('adjust_status', 0, 'intval');
  223. if (empty($playerIds) || !is_array($playerIds)) {
  224. return json_error([], '请选择要更新的玩家');
  225. }
  226. if (!in_array($adjustStatus, [
  227. PlayerModel::ADJUST_STATUS_NORMAL,
  228. PlayerModel::ADJUST_STATUS_WIN,
  229. PlayerModel::ADJUST_STATUS_LOSE
  230. ])) {
  231. return json_error([], '调控状态值无效');
  232. }
  233. try {
  234. $result = PlayerModel::batchUpdateAdjustStatus($playerIds, $loginInfo['merchant_id'], $adjustStatus);
  235. if ($result > 0) {
  236. return json_success(['updated' => $result], '批量更新成功');
  237. } else {
  238. return json_error([], '批量更新失败');
  239. }
  240. } catch (\Exception $e) {
  241. return json_error([], '批量更新玩家调控状态失败:' . $e->getMessage());
  242. }
  243. }
  244. /**
  245. * 导出玩家列表
  246. */
  247. public function export()
  248. {
  249. $loginInfo = checkUserLogin();
  250. if (!$loginInfo) {
  251. return json_error([], '请先登录');
  252. }
  253. if (!checkPermission($loginInfo, 'Player', 'export')) {
  254. return json_error([], '没有导出玩家列表的权限');
  255. }
  256. // 获取所有过滤条件
  257. $filters = [
  258. 'nickname' => Request::get('nickname', '', 'trim'),
  259. 'player_id' => Request::get('player_id', 0, 'intval'),
  260. 'status' => Request::get('status', ''),
  261. 'adjust_status' => Request::get('adjust_status', ''),
  262. 'login_ip' => Request::get('login_ip', '', 'trim'),
  263. 'reg_ip' => Request::get('reg_ip', '', 'trim'),
  264. 'balance_min' => Request::get('balance_min', 0, 'floatval'),
  265. 'balance_max' => Request::get('balance_max', 0, 'floatval'),
  266. 'today_win_min' => Request::get('today_win_min', 0, 'floatval'),
  267. 'today_win_max' => Request::get('today_win_max', 0, 'floatval'),
  268. 'history_win_min' => Request::get('history_win_min', 0, 'floatval'),
  269. 'history_win_max' => Request::get('history_win_max', 0, 'floatval'),
  270. 'login_time_start' => Request::get('login_time_start', '', 'trim'),
  271. 'login_time_end' => Request::get('login_time_end', '', 'trim'),
  272. 'create_time_start' => Request::get('create_time_start', '', 'trim'),
  273. 'create_time_end' => Request::get('create_time_end', '', 'trim'),
  274. ];
  275. try {
  276. // 获取所有数据
  277. $result = PlayerModel::getPlayerListByMerchant($loginInfo['merchant_id'], 1, 100000, $filters);
  278. // 生成CSV数据
  279. $csvData = "玩家ID,昵称,注册IP,登录IP,余额,今日输赢,历史输赢,今日下注,今日登录次数,历史登录次数,状态,调控状态,最后登录时间,注册时间\n";
  280. foreach ($result['list'] as $player) {
  281. $csvData .= sprintf(
  282. "%d,%s,%s,%s,%.4f,%.4f,%.4f,%.4f,%d,%d,%s,%s,%s,%s\n",
  283. $player['player_id'],
  284. $player['nickname'],
  285. $player['reg_ip'],
  286. $player['login_ip'],
  287. $player['balance'],
  288. $player['today_win_amount'],
  289. $player['history_win_amount'],
  290. $player['today_bet_amount'],
  291. $player['today_login_count'],
  292. $player['history_login_count'],
  293. PlayerModel::getStatusText($player['status']),
  294. PlayerModel::getAdjustStatusText($player['adjust_status']),
  295. $player['login_time'] ? date('Y-m-d H:i:s', $player['login_time']) : '未登录',
  296. date('Y-m-d H:i:s', $player['create_time'])
  297. );
  298. }
  299. // 返回CSV数据
  300. return response($csvData)
  301. ->header('Content-Type', 'text/csv; charset=utf-8')
  302. ->header('Content-Disposition', 'attachment; filename="players_' . date('YmdHis') . '.csv"')
  303. ->header('Cache-Control', 'no-cache, must-revalidate');
  304. } catch (\Exception $e) {
  305. return json_error([], '导出玩家列表失败:' . $e->getMessage());
  306. }
  307. }
  308. }