getAllByCondition('name,id', ['cooperation_status' => 1], "id desc", "all"); $gameList = []; foreach ($tmpGameList as $game) { $gameList[$game['id']] = $game; } // 设置默认时间范围(昨天) $defaultDate = date('Y-m-d', strtotime('-1 day')); $defaultStart = $defaultDate; $defaultEnd = $defaultDate; $this->assign('gameArr', $tmpGameList); $this->assign('game_list', $gameList); $this->assign('default_start', $defaultStart); $this->assign('default_end', $defaultEnd); list($list, $total) = $this->getSummaryList(request()->param()); // 参考Complex.php的方式处理分页数据 // 确保 $list 是分页对象,如果不是则获取总数 $listTotal = is_object($list) && method_exists($list, 'total') ? $list->total() : (is_array($list) ? count($list) : 0); $listData = is_object($list) && method_exists($list, 'toArray') ? $list->toArray()['data'] : (is_array($list) ? $list : []); $pageHtml = is_object($list) && method_exists($list, 'render') ? $list->render() : ''; $this->assign('total', $total); $this->assign('list', $listData); $this->assign('listTotal', $listTotal); // 传递总数,供视图使用 $this->assign('page', $pageHtml); return $this->fetch(); } /** * 获取汇总列表数据 */ private function getSummaryList($data) { $where = []; $isDateRange = false; $startDate = ''; $endDate = ''; // 游戏筛选 if (isset($data['game_id']) && $data['game_id']) { $gameIds = is_array($data['game_id']) ? $data['game_id'] : explode(',', $data['game_id']); $where['game_id'] = ['in', $gameIds]; } // 时间筛选 if (isset($data['start']) && isset($data['end']) && $data['start'] != '' && $data['end'] != '') { $startDate = $data['start']; $endDate = $data['end']; // 计算日期差 $startTimestamp = strtotime($startDate); $endTimestamp = strtotime($endDate); $daysDiff = ($endTimestamp - $startTimestamp) / 86400; // 如果日期范围大于1天,需要汇总 if ($daysDiff >= 1) { $isDateRange = true; } $where['day'] = [ ['>=', $data['start']], ['<=', $data['end']], ]; } elseif (isset($data['start']) && $data['start'] != '') { $where['day'] = ['>=', $data['start']]; } elseif (isset($data['end']) && $data['end'] != '') { $where['day'] = ['<=', $data['end']]; } else { // 默认昨天 $defaultDate = date('Y-m-d', strtotime('-1 day')); $startDate = $defaultDate; $endDate = $defaultDate; $where['day'] = [ ['>=', $defaultDate], ['<=', $defaultDate], ]; if (!isset($data['start'])) { $data['start'] = $defaultDate; } if (!isset($data['end'])) { $data['end'] = $defaultDate; } } $param = input('get.'); // 如果日期范围大于1天,按游戏ID汇总 if ($isDateRange) { // 先获取所有汇总数据 $allList = Db::table('cy_complex_summary_game') ->where($where) ->field('game_id, sum(reg_num) as reg_num, max(complex_num) as complex_num, sum(reg_role_num) as reg_role_num, sum(active_user_num) as active_user_num, sum(pay_money) as pay_money, sum(pay_amount) as pay_amount, sum(pay_user_num) as pay_user_num') ->group('game_id') ->order('day,reg_num desc') ->select(); // 转换为数组(统一处理,兼容数组和Collection对象) $allList = $allList ?: []; if (!is_array($allList) && method_exists($allList, 'toArray')) { $allList = $allList->toArray(); } // 处理汇总数据,计算ARPU和ARPPU,并设置日期范围 foreach ($allList as &$item) { $item['day'] = $startDate . ' ~ ' . $endDate; // 确保数值类型 $payMoney = floatval($item['pay_amount'] ?? 0); $activeUserNum = floatval($item['active_user_num'] ?? 0); $payUserNum = floatval($item['pay_user_num'] ?? 0); // 计算ARPU = 实付金额 / 活跃玩家数 $item['arpu'] = $activeUserNum > 0 ? round(($payMoney / $activeUserNum), 2) : 0; // 计算ARPPU = 实付金额 / 付费人数 $item['arppu'] = $payUserNum > 0 ? round(($payMoney / $payUserNum), 2) : 0; } unset($item); // 手动分页处理 $page = intval(input('get.page', 1)); $page = $page > 0 ? $page : 1; $limit = 20; $totalCount = count($allList); $offset = ($page - 1) * $limit; $listData = array_slice($allList, $offset, $limit); // 创建分页对象,参考Complex.php的方式 $collection = new \think\Collection($listData); $list = \think\paginator\driver\Bootstrap::make($collection, $limit, $page, $totalCount, false, [ 'var_page' => 'page', 'path' => request()->url(), 'query' => $param, ]); } else { // 查询列表(原有逻辑) $list = Db::table('cy_complex_summary_game') ->where($where) ->order('day,reg_num desc') ->paginate(20, false, ['query' => $param])->each(function($item){ $item['arpu'] = round($item['arpu']/100, 2); $item['arppu'] = round($item['arppu']/100, 2); return $item; }); } // 计算汇总 $total = Db::table('cy_complex_summary_game') ->where($where) ->field('sum(reg_num) as reg_num, sum(reg_role_num) as reg_role_num, sum(active_user_num) as active_user_num, sum(pay_money) as pay_money, sum(pay_amount) as pay_amount') ->find(); return [$list, $total ?: ['reg_num' => 0, 'reg_role_num' => 0, 'active_user_num' => 0, 'pay_money' => 0, 'pay_amount' => 0]]; } /** * 导出数据 */ public function export() { if (request()->isPost()) { $data = input('post.'); $where = []; $isDateRange = false; $startDate = ''; $endDate = ''; // 游戏筛选 if (isset($data['game_id']) && $data['game_id']) { $gameIds = is_array($data['game_id']) ? $data['game_id'] : explode(',', $data['game_id']); $where['game_id'] = ['in', $gameIds]; } // 时间筛选 if (isset($data['start']) && isset($data['end']) && $data['start'] != '' && $data['end'] != '') { $startDate = $data['start']; $endDate = $data['end']; // 计算日期差 $startTimestamp = strtotime($startDate); $endTimestamp = strtotime($endDate); $daysDiff = ($endTimestamp - $startTimestamp) / 86400; // 如果日期范围大于1天,需要汇总 if ($daysDiff >= 1) { $isDateRange = true; } $where['day'] = [ ['>=', $data['start']], ['<=', $data['end']], ]; } elseif (isset($data['start']) && $data['start'] != '') { $where['day'] = ['>=', $data['start']]; } elseif (isset($data['end']) && $data['end'] != '') { $where['day'] = ['<=', $data['end']]; } else { $defaultDate = date('Y-m-d', strtotime('-1 day')); $startDate = $defaultDate; $endDate = $defaultDate; $where['day'] = [ ['>=', $defaultDate], ['<=', $defaultDate], ]; } // 构建查询SQL $query = Db::table('cy_complex_summary_game'); // 如果日期范围大于1天 if ($isDateRange) { $sql = $query ->where($where) ->field('game_id, day, sum(reg_num) as reg_num, max(complex_num) as complex_num, sum(reg_role_num) as reg_role_num, sum(active_user_num) as active_user_num, sum(pay_money) as pay_money, sum(pay_amount) as pay_amount, sum(pay_user_num) as pay_user_num') ->group('game_id') ->order('day,reg_num desc') ->fetchSql(true) ->select(); } else { $sql = $query ->where($where) ->field('game_id, day, reg_num, complex_num, reg_role_num, active_user_num, pay_money, pay_amount, pay_user_num, arpu, arppu') ->order('day,reg_num desc') ->fetchSql(true) ->select(); } // 扩展参数,用于Go脚本处理 $extend = [ 'is_date_range' => $isDateRange, 'start_date' => $startDate, 'end_date' => $endDate, 'task_type' => 'complexSummaryGameExport', 'file_name' => "渠道-游戏数据汇总_%s.xlsx", 'headers' => [ ['field' => 'day', 'title' => '日期'], ['field' => 'game_id', 'title' => '游戏名称'], ['field' => 'complex_num', 'title' => '渠道总数量'], ['field' => 'reg_num', 'title' => '新增玩家'], ['field' => 'reg_role_num', 'title' => '新增角色'], ['field' => 'pay_money', 'title' => '充值金额'], ['field' => 'pay_amount', 'title' => '实付金额'], ['field' => 'active_user_num','title' => '活跃玩家'], ['field' => 'pay_user_num', 'title' => '付费人数'], ['field' => 'arpu', 'title' => 'ARPU'], ['field' => 'arppu', 'title' => 'ARPPU'], ], // 字段处理 'handle_fields' => [ [ 'field' => 'game_id', 'handler' => 'mapGameName', 'target_field' => 'game_name', 'extra' => [ 'table_name' => 'cy_game', 'field_key' => 'name', 'where_key' => 'id', ], ], ], ]; // dump($sql); if ((new MakeReportGo())->addTask('admin.complexSummary', $sql, session_id(), $extend)) { $this->jsonResult('', 1, '报表生成的任务已经提交, 报表生成完成后,会及时通知您,请耐心稍等'); } else { $this->jsonResult('', 0, '报表生成任务不可重复提交,如遇到无法导出情况,建议修改查询条件解除当前状态,提交重新生成报表任务!'); } } } }