setName('ComplexSummaryGameDay') ->setDescription('聚合-游戏单日报表-统计脚本') ->addArgument('day', Argument::OPTIONAL, '统计日期,格式:Y-m-d,默认为昨天'); } protected function execute(Input $input, Output $output) { $service = new ComplexSummaryService(); // 获取统计日期(默认昨天) $day = $input->getArgument('day') ?: date('Y-m-d', strtotime('-1 day')); $output->writeln(date('Y-m-d H:i:s') . " 开始统计日期: {$day}"); $gameIds = $service->getOnlineGameIds(); try { // 1. 获取新增用户 $regNumList = $service->getRegNum($day, $gameIds, 1); $output->writeln("新增用户统计完成: " . count($regNumList) . " 条"); // 2. 获取活跃玩家(使用玩家活跃日志表) $activeUserList = $service->getActiveUserByActiveLog($day, $gameIds, 1, 0); $output->writeln("活跃玩家统计完成: " . count($activeUserList) . " 条"); // 3. 获取 订单金额、实付金额、付费人数(getPayMoney 方法已包含 pay_user_num 字段) $payMoneyList = $service->getPayMoney($day, $gameIds, 1, 0); $output->writeln("订单金额、实付金额和付费人数统计完成: " . count($payMoneyList) . " 条"); // 4. 获取新用户付费人数 $newUserPayNumList = $service->getNewUserPayNum($day, $gameIds, 1); $output->writeln("新用户付费人数统计完成: " . count($newUserPayNumList) . " 条"); // 5. 获取新用户充值金额 $newUserPayMoneyList = $service->getNewUserPayMoney($day, $gameIds, 1); $output->writeln("新用户充值金额统计完成: " . count($newUserPayMoneyList) . " 条"); // 6. 合并所有统计数据 $allStats = $service->mergeStatsData([ $regNumList, $activeUserList, $payMoneyList, $newUserPayNumList, $newUserPayMoneyList ]); // 7. 计算ARPU和ARPPU,并保存数据 // 先清空当天日期的数据,避免重新抓取时数据错乱(在事务外执行,确保清空操作生效) Db::table('cy_complex_summary_game_day') ->where('day', $day) ->delete(); Db::startTrans(); try { foreach ($allStats as $stat) { $gameId = $stat['game_id'] ?? 0; $complexId = $stat['channel_id'] ?? 0; // 计算ARPU和ARPPU $payMoney = floatval($stat['pay_money'] ?? 0); $payMoneyTotal = floatval($stat['pay_amount_total'] ?? 0); $activeUserNum = intval($stat['active_user_num'] ?? 0); $payUserNum = intval($stat['pay_user_num'] ?? 0); $arpu = $activeUserNum > 0 ? round($payMoneyTotal / $activeUserNum, 2)*100 : 0; $arppu = $payUserNum > 0 ? round($payMoneyTotal / $payUserNum, 2)*100 : 0; // 准备保存的数据 $saveData = [ 'day' => $day, 'game_id' => $gameId, 'complex_id' => $complexId, 'reg_num' => intval($stat['reg_num'] ?? 0), 'active_user_num' => $activeUserNum, 'pay_user_num' => $payUserNum, 'reg_pay_num' => intval($stat['reg_pay_num'] ?? 0), 'pay_money' => $payMoney, 'pay_amount_total' => $payMoneyTotal, 'reg_pay_money' => floatval($stat['reg_pay_money_total'] ?? 0), 'arpu' => $arpu, 'arppu' => $arppu, ]; // 直接插入(已清空当天数据,无需检查是否存在) Db::table('cy_complex_summary_game_day')->insert($saveData); // 以下代码已注释,防止以后需要时可以恢复 // // 检查记录是否存在 // $exists = Db::table('cy_complex_summary_game_day') // ->where([ // 'day' => $day, // 'game_id' => $gameId, // 'complex_id' => $complexId // ]) // ->find(); // // if ($exists) { // // 更新 // Db::table('cy_complex_summary_game_day') // ->where(['id' => $exists['id']]) // ->update($saveData); // } else { // // 插入 // Db::table('cy_complex_summary_game_day')->insert($saveData); // } } Db::commit(); $output->writeln("数据保存成功,共处理 " . count($allStats) . " 条记录"); } catch (Exception $e) { Db::rollback(); $output->writeln("保存数据失败: " . $e->getMessage()); throw $e; } } catch (Exception $e) { $output->writeln("统计失败: " . $e->getMessage() . ' - ' . $e->getFile() . ":" . $e->getLine()); throw $e; } $output->writeln(date('Y-m-d H:i:s') . " 统计完成"); } }