ComplexSummaryGameDay.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. <?php
  2. namespace app\crontab;
  3. use app\service\ComplexSummaryService;
  4. use app\service\RetaineService;
  5. use think\console\Command;
  6. use think\console\Input;
  7. use think\console\Output;
  8. use think\console\Input\Argument;
  9. use think\Db;
  10. use think\Exception;
  11. /**
  12. * 聚合-游戏单日报表-统计脚本
  13. * 统计游戏单日数据汇总
  14. */
  15. class ComplexSummaryGameDay extends Command
  16. {
  17. protected function configure()
  18. {
  19. $this->setName('ComplexSummaryGameDay')
  20. ->setDescription('聚合-游戏单日报表-统计脚本')
  21. ->addArgument('day', Argument::OPTIONAL, '统计日期,格式:Y-m-d,默认为昨天');
  22. }
  23. protected function execute(Input $input, Output $output)
  24. {
  25. $service = new ComplexSummaryService();
  26. // 获取统计日期(默认昨天)
  27. $day = $input->getArgument('day') ?: date('Y-m-d', strtotime('-1 day'));
  28. $output->writeln(date('Y-m-d H:i:s') . " 开始统计日期: {$day}");
  29. $gameIds = $service->getOnlineGameIds();
  30. try {
  31. // 1. 获取新增用户
  32. $regNumList = $service->getRegNum($day, $gameIds, 1);
  33. $output->writeln("新增用户统计完成: " . count($regNumList) . " 条");
  34. // 2. 获取活跃玩家(使用玩家活跃日志表)
  35. $activeUserList = $service->getActiveUserByActiveLog($day, $gameIds, 1, 0);
  36. $output->writeln("活跃玩家统计完成: " . count($activeUserList) . " 条");
  37. // 3. 获取 订单金额、实付金额、付费人数(getPayMoney 方法已包含 pay_user_num 字段)
  38. $payMoneyList = $service->getPayMoney($day, $gameIds, 1, 0);
  39. $output->writeln("订单金额、实付金额和付费人数统计完成: " . count($payMoneyList) . " 条");
  40. // 4. 获取新用户付费人数
  41. $newUserPayNumList = $service->getNewUserPayNum($day, $gameIds, 1);
  42. $output->writeln("新用户付费人数统计完成: " . count($newUserPayNumList) . " 条");
  43. // 5. 获取新用户充值金额
  44. $newUserPayMoneyList = $service->getNewUserPayMoney($day, $gameIds, 1);
  45. $output->writeln("新用户充值金额统计完成: " . count($newUserPayMoneyList) . " 条");
  46. // 6. 合并所有统计数据
  47. $allStats = $service->mergeStatsData([
  48. $regNumList,
  49. $activeUserList,
  50. $payMoneyList,
  51. $newUserPayNumList,
  52. $newUserPayMoneyList
  53. ]);
  54. // 7. 计算ARPU和ARPPU,并保存数据
  55. // 先清空当天日期的数据,避免重新抓取时数据错乱(在事务外执行,确保清空操作生效)
  56. Db::table('cy_complex_summary_game_day')
  57. ->where('day', $day)
  58. ->delete();
  59. Db::startTrans();
  60. try {
  61. foreach ($allStats as $stat) {
  62. $gameId = $stat['game_id'] ?? 0;
  63. $complexId = $stat['channel_id'] ?? 0;
  64. // 计算ARPU和ARPPU
  65. $payMoney = floatval($stat['pay_money'] ?? 0);
  66. $payMoneyTotal = floatval($stat['pay_amount_total'] ?? 0);
  67. $activeUserNum = intval($stat['active_user_num'] ?? 0);
  68. $payUserNum = intval($stat['pay_user_num'] ?? 0);
  69. $arpu = $activeUserNum > 0 ? round($payMoneyTotal / $activeUserNum, 2)*100 : 0;
  70. $arppu = $payUserNum > 0 ? round($payMoneyTotal / $payUserNum, 2)*100 : 0;
  71. // 准备保存的数据
  72. $saveData = [
  73. 'day' => $day,
  74. 'game_id' => $gameId,
  75. 'complex_id' => $complexId,
  76. 'reg_num' => intval($stat['reg_num'] ?? 0),
  77. 'active_user_num' => $activeUserNum,
  78. 'pay_user_num' => $payUserNum,
  79. 'reg_pay_num' => intval($stat['reg_pay_num'] ?? 0),
  80. 'pay_money' => $payMoney,
  81. 'pay_amount_total' => $payMoneyTotal,
  82. 'reg_pay_money' => floatval($stat['reg_pay_money_total'] ?? 0),
  83. 'arpu' => $arpu,
  84. 'arppu' => $arppu,
  85. ];
  86. // 直接插入(已清空当天数据,无需检查是否存在)
  87. Db::table('cy_complex_summary_game_day')->insert($saveData);
  88. // 以下代码已注释,防止以后需要时可以恢复
  89. // // 检查记录是否存在
  90. // $exists = Db::table('cy_complex_summary_game_day')
  91. // ->where([
  92. // 'day' => $day,
  93. // 'game_id' => $gameId,
  94. // 'complex_id' => $complexId
  95. // ])
  96. // ->find();
  97. //
  98. // if ($exists) {
  99. // // 更新
  100. // Db::table('cy_complex_summary_game_day')
  101. // ->where(['id' => $exists['id']])
  102. // ->update($saveData);
  103. // } else {
  104. // // 插入
  105. // Db::table('cy_complex_summary_game_day')->insert($saveData);
  106. // }
  107. }
  108. Db::commit();
  109. $output->writeln("数据保存成功,共处理 " . count($allStats) . " 条记录");
  110. } catch (Exception $e) {
  111. Db::rollback();
  112. $output->writeln("保存数据失败: " . $e->getMessage());
  113. throw $e;
  114. }
  115. } catch (Exception $e) {
  116. $output->writeln("统计失败: " . $e->getMessage() . ' - ' . $e->getFile() . ":" . $e->getLine());
  117. throw $e;
  118. }
  119. $output->writeln(date('Y-m-d H:i:s') . " 统计完成");
  120. }
  121. }