DailyStatistics.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. <?php
  2. declare (strict_types = 1);
  3. namespace app\controller;
  4. use app\BaseController;
  5. use app\model\MerchantDailyModel;
  6. use app\model\GameDailyModel;
  7. use app\model\MerchantHistoryModel;
  8. use think\facade\Request;
  9. class DailyStatistics extends BaseController
  10. {
  11. /**
  12. * 获取商户每日数据列表
  13. */
  14. public function merchantDailyList()
  15. {
  16. $userInfo = $this->request->userInfo;
  17. // 获取查询参数
  18. $page = Request::get('page', 1, 'intval');
  19. $limit = Request::get('limit', 10, 'intval');
  20. $startDate = Request::get('start_date', date('Y-m-d', strtotime('-7 days')), 'trim');
  21. $endDate = Request::get('end_date', date('Y-m-d'), 'trim');
  22. try {
  23. // 获取商户每日数据
  24. $result = MerchantDailyModel::getMerchantDailyList(
  25. $userInfo['merchant_id'],
  26. $startDate,
  27. $endDate,
  28. $page,
  29. $limit
  30. );
  31. // 格式化数据
  32. foreach ($result['list'] as &$item) {
  33. $item['game_profit'] = round($item['game_profit'], 2);
  34. $item['bet_amount'] = round($item['bet_amount'], 2);
  35. $item['commission_amount'] = round($item['commission_amount'], 2);
  36. $item['platform_fee'] = round($item['platform_fee'], 2);
  37. $item['merchant_name'] = $userInfo['merchant_name'] ?? '商户' . $userInfo['merchant_id'];
  38. }
  39. return json_success($result, '获取成功');
  40. } catch (\Exception $e) {
  41. return json_error([], '获取商户每日数据失败:' . $e->getMessage());
  42. }
  43. }
  44. /**
  45. * 获取游戏每日数据列表
  46. */
  47. public function gameDailyList()
  48. {
  49. $userInfo = $this->request->userInfo;
  50. // 获取查询参数
  51. $page = Request::get('page', 1, 'intval');
  52. $limit = Request::get('limit', 10, 'intval');
  53. $gameId = Request::get('game_id', 0, 'intval');
  54. $gameName = Request::get('game_name', '', 'trim');
  55. $startDate = Request::get('start_date', date('Y-m-d', strtotime('-7 days')), 'trim');
  56. $endDate = Request::get('end_date', date('Y-m-d'), 'trim');
  57. $filters = [
  58. 'merchant_id' => $userInfo['merchant_id'],
  59. 'game_id' => $gameId,
  60. 'game_name' => $gameName,
  61. 'start_date' => $startDate,
  62. 'end_date' => $endDate
  63. ];
  64. try {
  65. // 获取游戏每日数据
  66. $result = GameDailyModel::getGameDailyList($filters, $page, $limit);
  67. // 格式化数据
  68. foreach ($result['list'] as &$item) {
  69. $item['game_profit'] = round($item['game_profit'], 2);
  70. $item['bet_amount'] = round($item['bet_amount'], 2);
  71. $item['commission_amount'] = round($item['commission_amount'], 2);
  72. }
  73. return json_success($result, '获取成功');
  74. } catch (\Exception $e) {
  75. return json_error([], '获取游戏每日数据失败:' . $e->getMessage());
  76. }
  77. }
  78. /**
  79. * 获取商户汇总统计
  80. */
  81. public function merchantSummary()
  82. {
  83. $userInfo = $this->request->userInfo;
  84. $startDate = Request::get('start_date', date('Y-m-d', strtotime('-30 days')), 'trim');
  85. $endDate = Request::get('end_date', date('Y-m-d'), 'trim');
  86. try {
  87. $summary = MerchantDailyModel::getMerchantSummary(
  88. $userInfo['merchant_id'],
  89. $startDate,
  90. $endDate
  91. );
  92. return json_success($summary, '获取成功');
  93. } catch (\Exception $e) {
  94. return json_error([], '获取商户汇总统计失败:' . $e->getMessage());
  95. }
  96. }
  97. /**
  98. * 获取游戏列表
  99. */
  100. public function getGameList()
  101. {
  102. $userInfo = $this->request->userInfo;
  103. try {
  104. $games = GameDailyModel::getGameList($userInfo['merchant_id']);
  105. return json_success($games, '获取成功');
  106. } catch (\Exception $e) {
  107. return json_error([], '获取游戏列表失败:' . $e->getMessage());
  108. }
  109. }
  110. /**
  111. * 获取商户历史数据统计
  112. */
  113. public function merchantHistory()
  114. {
  115. $userInfo = $this->request->userInfo;
  116. // 获取过滤参数
  117. $filters = [
  118. 'start_date' => Request::get('start_date', '', 'trim'),
  119. 'end_date' => Request::get('end_date', '', 'trim')
  120. ];
  121. try {
  122. $history = MerchantHistoryModel::getMerchantHistoryStatistics(
  123. $userInfo['merchant_id'],
  124. $filters
  125. );
  126. return json_success($history, '获取成功');
  127. } catch (\Exception $e) {
  128. return json_error([], '获取商户历史数据失败:' . $e->getMessage());
  129. }
  130. }
  131. /**
  132. * 获取商户历史数据列表(按月或按天)
  133. */
  134. public function merchantHistoryList()
  135. {
  136. $userInfo = $this->request->userInfo;
  137. // 获取查询参数
  138. $page = Request::get('page', 1, 'intval');
  139. $limit = Request::get('limit', 10, 'intval');
  140. $groupBy = Request::get('group_by', 'month', 'trim'); // month 或 day
  141. $filters = [
  142. 'start_date' => Request::get('start_date', '', 'trim'),
  143. 'end_date' => Request::get('end_date', '', 'trim')
  144. ];
  145. try {
  146. $result = MerchantHistoryModel::getMerchantHistoryList(
  147. $userInfo['merchant_id'],
  148. $groupBy,
  149. $page,
  150. $limit,
  151. $filters
  152. );
  153. return json_success($result, '获取成功');
  154. } catch (\Exception $e) {
  155. return json_error([], '获取商户历史数据列表失败:' . $e->getMessage());
  156. }
  157. }
  158. /**
  159. * 导出商户历史数据
  160. */
  161. public function exportMerchantHistory()
  162. {
  163. $userInfo = $this->request->userInfo;
  164. $groupBy = Request::get('group_by', 'month', 'trim');
  165. $filters = [
  166. 'start_date' => Request::get('start_date', '', 'trim'),
  167. 'end_date' => Request::get('end_date', '', 'trim')
  168. ];
  169. try {
  170. // 获取所有数据
  171. $result = MerchantHistoryModel::getMerchantHistoryList(
  172. $userInfo['merchant_id'],
  173. $groupBy,
  174. 1,
  175. 100000,
  176. $filters
  177. );
  178. // 生成CSV数据
  179. $csvData = "时间,RTP(%),注单数,注单金额(THB),游戏输赢(THB),注单金额(USDT),游戏输赢(USDT),登录用户,注册用户,投注用户,抽水额度(USDT),购买免费游戏次数\n";
  180. foreach ($result['list'] as $item) {
  181. $csvData .= sprintf(
  182. "%s,%.2f,%d,%.2f,%.2f,%.4f,%.4f,%d,%d,%d,%.4f,%d\n",
  183. $item['period'],
  184. $item['rtp'],
  185. $item['total_orders'],
  186. $item['total_bet_thb'],
  187. $item['game_profit_thb'],
  188. $item['total_bet_usdt'],
  189. $item['game_profit_usdt'],
  190. $item['login_users'],
  191. $item['register_users'],
  192. $item['bet_users'],
  193. $item['commission_usdt'],
  194. $item['free_game_count']
  195. );
  196. }
  197. // 返回CSV数据
  198. return response($csvData)
  199. ->header(['Content-Type' => 'text/csv; charset=utf-8'])
  200. ->header(['Content-Disposition' => 'attachment; filename="merchant_history_' . date('YmdHis') . '.csv"'])
  201. ->header(['Cache-Control' => 'no-cache, must-revalidate']);
  202. } catch (\Exception $e) {
  203. return json_error([], '导出商户历史数据失败:' . $e->getMessage());
  204. }
  205. }
  206. /**
  207. * 获取游戏汇总统计
  208. */
  209. public function gameSummary()
  210. {
  211. $userInfo = $this->request->userInfo;
  212. $startDate = Request::get('start_date', date('Y-m-d', strtotime('-30 days')), 'trim');
  213. $endDate = Request::get('end_date', date('Y-m-d'), 'trim');
  214. try {
  215. $summary = GameDailyModel::getGameSummary(
  216. $userInfo['merchant_id'],
  217. $startDate,
  218. $endDate
  219. );
  220. // 格式化数据
  221. foreach ($summary as &$item) {
  222. $item['total_profit'] = round($item['total_profit'], 2);
  223. $item['avg_rtp'] = round($item['avg_rtp'], 2);
  224. $item['total_bet_amount'] = round($item['total_bet_amount'], 2);
  225. $item['total_commission'] = round($item['total_commission'], 2);
  226. }
  227. return json_success($summary, '获取成功');
  228. } catch (\Exception $e) {
  229. return json_error([], '获取游戏汇总统计失败:' . $e->getMessage());
  230. }
  231. }
  232. /**
  233. * 导出商户每日数据
  234. */
  235. public function exportMerchantDaily()
  236. {
  237. $userInfo = $this->request->userInfo;
  238. $startDate = Request::get('start_date', date('Y-m-d', strtotime('-30 days')), 'trim');
  239. $endDate = Request::get('end_date', date('Y-m-d'), 'trim');
  240. try {
  241. // 获取所有数据
  242. $result = MerchantDailyModel::getMerchantDailyList(
  243. $userInfo['merchant_id'],
  244. $startDate,
  245. $endDate,
  246. 1,
  247. 100000
  248. );
  249. // 生成CSV数据
  250. $csvData = "日期,商户,游戏输赢,游戏RTP(%),注单金额,注单数,投注用户,注册用户,登录用户,抽水额度,平台费用(USDT),购买免费游戏次数\n";
  251. foreach ($result['list'] as $item) {
  252. $csvData .= sprintf(
  253. "%s,%s,%.2f,%.2f,%.2f,%d,%d,%d,%d,%.2f,%.2f,%d\n",
  254. $item['date'],
  255. $userInfo['merchant_name'] ?? '商户' . $userInfo['merchant_id'],
  256. $item['game_profit'],
  257. $item['game_rtp'],
  258. $item['bet_amount'],
  259. $item['bet_count'],
  260. $item['bet_users'],
  261. $item['register_users'],
  262. $item['login_users'],
  263. $item['commission_amount'],
  264. $item['platform_fee'],
  265. $item['free_game_count']
  266. );
  267. }
  268. // 返回CSV数据
  269. return response($csvData)
  270. ->header(['Content-Type' => 'text/csv; charset=utf-8'])
  271. ->header(['Content-Disposition' => 'attachment; filename="merchant_daily_' . date('YmdHis') . '.csv"'])
  272. ->header(['Cache-Control' => 'no-cache, must-revalidate']);
  273. } catch (\Exception $e) {
  274. return json_error([], '导出商户每日数据失败:' . $e->getMessage());
  275. }
  276. }
  277. /**
  278. * 导出游戏每日数据
  279. */
  280. public function exportGameDaily()
  281. {
  282. $userInfo = $this->request->userInfo;
  283. $startDate = Request::get('start_date', date('Y-m-d', strtotime('-30 days')), 'trim');
  284. $endDate = Request::get('end_date', date('Y-m-d'), 'trim');
  285. $filters = [
  286. 'merchant_id' => $userInfo['merchant_id'],
  287. 'start_date' => $startDate,
  288. 'end_date' => $endDate
  289. ];
  290. try {
  291. // 获取所有数据
  292. $result = GameDailyModel::getGameDailyList($filters, 1, 100000);
  293. // 生成CSV数据
  294. $csvData = "日期,游戏名称,游戏输赢,游戏RTP(%),注单金额,注单数,投注用户,注册用户,登录用户,抽水额度,购买免费游戏次数\n";
  295. foreach ($result['list'] as $item) {
  296. $csvData .= sprintf(
  297. "%s,%s,%.2f,%.2f,%.2f,%d,%d,%d,%d,%.2f,%d\n",
  298. $item['date'],
  299. $item['game_name'],
  300. $item['game_profit'],
  301. $item['game_rtp'],
  302. $item['bet_amount'],
  303. $item['bet_count'],
  304. $item['bet_users'],
  305. $item['register_users'],
  306. $item['login_users'],
  307. $item['commission_amount'],
  308. $item['free_game_count']
  309. );
  310. }
  311. // 返回CSV数据
  312. return response($csvData)
  313. ->header(['Content-Type' => 'text/csv; charset=utf-8'])
  314. ->header(['Content-Disposition' => 'attachment; filename="game_daily_' . date('YmdHis') . '.csv"'])
  315. ->header(['Cache-Control' => 'no-cache, must-revalidate']);
  316. } catch (\Exception $e) {
  317. return json_error([], '导出游戏每日数据失败:' . $e->getMessage());
  318. }
  319. }
  320. }