AnalyseLogic.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557
  1. <?php
  2. // 玩家日志逻
  3. namespace app\v1\logic\gameLog;
  4. use app\v1\logic\tool\ToolLogic;
  5. use plugin\saiadmin\basic\BaseLogic;
  6. use support\think\Db;
  7. class AnalyseLogic extends BaseLogic
  8. {
  9. // 注册按日
  10. public function getRegDayDataList($where){
  11. $params = $this->searchByAuth($where);
  12. $whereSql = $this->generateWhereSql($params);
  13. $field = "SUM(reg_total) AS reg_total, tdate,game_id";
  14. $baseData = $this->generateYearUnionList('base_total_day_',$where['reg_date'],$whereSql,$field,'game_id,tdate');
  15. $data=[];
  16. foreach($baseData as $row){
  17. $tdate = $row['tdate'];
  18. $game_id = $row['game_id'];
  19. $data[$game_id][$tdate] = $row['reg_total'];
  20. $data[$game_id]['total'] = !empty($data[$game_id]['total']) ? $data[$game_id]['total'] + $row['reg_total'] : $row['reg_total'];
  21. $data[$game_id]['game_id'] = $game_id;
  22. }
  23. $list = array_values($data);
  24. $totalRow = ['game_id'=>'合计'];
  25. foreach($list as &$row){
  26. $totalRow['total'] = !empty($totalRow['total']) ? $totalRow['total'] + $row['total'] : $row['total'];
  27. foreach ($row as $key => $value) {
  28. if($key == 'total' || $key == 'game_id'){
  29. continue;
  30. }
  31. $totalRow[$key] = !empty($totalRow[$key]) ? $totalRow[$key] + $value : $value;
  32. }
  33. }
  34. // 获取两个注册日期之间的日期列表
  35. $dateList = ToolLogic::getDatesBetween($where['reg_date'][0],$where['reg_date'][1]);
  36. $columnsData = [
  37. [
  38. 'title' => '游戏ID',
  39. 'dataIndex' => 'game_id',
  40. 'width' => 120,
  41. ],
  42. [
  43. 'title' => '游戏',
  44. 'dataIndex' => 'game_name',
  45. 'width' => 120,
  46. ],
  47. [
  48. 'title' => '合计',
  49. 'dataIndex' => 'total',
  50. 'width' => 120,
  51. ]
  52. ];
  53. foreach($dateList as $date){
  54. $columnsData[] = [
  55. 'title' => $date,
  56. 'dataIndex' => $date,
  57. 'width' => 120,
  58. ];
  59. }
  60. $result['data'] = $list;
  61. $result['totalRow'] = $totalRow;
  62. $result['columns'] = $columnsData;
  63. return $result;
  64. }
  65. // 注册按时
  66. public function getRegHourDataList($where){
  67. $params = $this->searchByAuth($where);
  68. $field = "SUM(role_create_user) AS role_create_user, tdate,game_id,thour";
  69. $regDate = $where['reg_date'];
  70. // 将$regDate转化为年月格式,如202509
  71. $ym = date('Ym', strtotime($regDate));
  72. $tableName = 'base_total_hour_'.$ym;
  73. $whereSql = 'WHERE 1=1';
  74. if(!empty($params['game_id'])){
  75. $whereSql .= " AND game_id IN(" . implode(',', $params['game_id']) . ")";
  76. }
  77. if(!empty($params['reg_date'])){
  78. $whereSql .= " AND tdate = '" .$params['reg_date']. "'";
  79. }
  80. $sql = "SELECT {$field} FROM {$tableName} {$whereSql} GROUP BY game_id,thour,tdate";
  81. $baseData = Db::connect('db_data_report')->query($sql);
  82. $data = [];
  83. foreach($baseData as &$row){
  84. $game_id = $row['game_id'];
  85. $thour = $row['thour'];
  86. $data[$game_id]['h'.$thour] = $row['role_create_user'];
  87. $data[$game_id]['total'] = !empty($data[$game_id]['total']) ? $data[$game_id]['total'] + $row['role_create_user'] : $row['role_create_user'];
  88. $data[$game_id]['game_id'] = $game_id;
  89. }
  90. $list = array_values($data);
  91. $totalRow = ['game_id'=>'合计'];
  92. foreach($list as &$row){
  93. $totalRow['total'] = !empty($totalRow['total']) ? $totalRow['total'] + $row['total'] : $row['total'];
  94. foreach ($row as $key => $value) {
  95. if($key == 'total' || $key == 'game_id'){
  96. continue;
  97. }
  98. $totalRow[$key] = !empty($totalRow[$key]) ? $totalRow[$key] + $value : $value;
  99. }
  100. }
  101. $result['data'] = $list;
  102. $result['totalRow'] = $totalRow;
  103. return $result;
  104. }
  105. // 留存按日
  106. public function getRetentionDayDataList($where){
  107. $params = $this->searchByAuth($where);
  108. // 构建whereSql
  109. $whereSql = '';
  110. if(!empty($params['game_id'])){
  111. $whereSql .= " AND game_id IN(" . implode(',', $params['game_id']) . ")";
  112. }
  113. if(!empty($params['reg_date'])){
  114. $whereSql .= " AND tdate BETWEEN '{$params['reg_date'][0]}' AND '{$params['reg_date'][1]}'";
  115. }
  116. $data = [];
  117. $totalRow = ['game_id'=>'合计'];
  118. $baseField = "SUM(reg_total) AS reg_total, tdate,game_id";
  119. $activeField = "SUM(active_total) AS active_total, reg_date,game_id,days";
  120. // 1. 查询每天的注册数,根据注册时间,游戏
  121. $baseData = $this->generateYearUnionList('base_total_day_',$params['reg_date'],$whereSql,$baseField,'game_id,tdate');
  122. $baseData = array_column($baseData,null,'tdate');
  123. // 2. 查询每天的活跃数,根据注册时间,游戏,留存天数
  124. $activeWhereSql = str_replace("AND tdate", "AND reg_date", $whereSql);
  125. if(!empty($params['days'])){
  126. $activeWhereSql .= " AND days = {$params['days']}";
  127. }
  128. $activeData = $this->generateYearUnionList('game_active_day_',$params['reg_date'],$activeWhereSql,$activeField,'game_id,reg_date');
  129. $activeData = array_column($activeData,null,'reg_date');
  130. foreach($baseData as $row){
  131. $game_id = $row['game_id'];
  132. $tdate = $row['tdate'];
  133. $data[$game_id]['game_id'] = $game_id;
  134. $data[$game_id][$tdate]['reg_total'] = $row['reg_total'];
  135. $data[$game_id][$tdate]['active_total'] = !empty($activeData[$tdate]['active_total']) ? $activeData[$tdate]['active_total'] : 0;
  136. $data[$game_id][$tdate]['retention_total'] = ToolLogic::getPercent($data[$game_id][$tdate]['active_total'],$data[$game_id][$tdate]['reg_total']);
  137. // 每日合计
  138. $data[$game_id]['total_reg_total'] = !empty($data[$game_id]['total_reg_total']) ? $data[$game_id]['total_reg_total'] + $data[$game_id][$tdate]['reg_total'] : $data[$game_id][$tdate]['reg_total'];
  139. $data[$game_id]['total_active_total'] = !empty($data[$game_id]['total_active_total']) ? $data[$game_id]['total_active_total'] + $data[$game_id][$tdate]['active_total'] : $data[$game_id][$tdate]['active_total'];
  140. // 底部合计
  141. $totalRow['total_reg_total'] = !empty($totalRow['total_reg_total']) ? $totalRow['total_reg_total'] + $data[$game_id][$tdate]['reg_total'] : $data[$game_id][$tdate]['reg_total'];
  142. $totalRow['total_active_total'] = !empty($totalRow['total_active_total']) ? $totalRow['total_active_total'] + $data[$game_id][$tdate]['active_total'] : $data[$game_id][$tdate]['active_total'];
  143. $totalRow[$tdate]['reg_total'] = !empty($totalRow[$tdate]['reg_total']) ? $totalRow[$tdate]['reg_total'] + $data[$game_id][$tdate]['reg_total'] : $data[$game_id][$tdate]['reg_total'];
  144. $totalRow[$tdate]['active_total'] = !empty($totalRow[$tdate]['active_total']) ? $totalRow[$tdate]['active_total'] + $data[$game_id][$tdate]['active_total'] : $data[$game_id][$tdate]['active_total'];
  145. }
  146. $data = array_values($data);
  147. foreach($data as &$row){
  148. foreach($row as $key => $value){
  149. if($key == 'total_reg_total' || $key == 'game_id'){
  150. continue;
  151. }
  152. if($key == 'total_active_total'){
  153. $row['total'] = ToolLogic::getPercent($row['total_active_total'],$row['total_reg_total']);
  154. }else{
  155. $row[$key] = ToolLogic::getPercent($value['active_total'],$value['reg_total']);
  156. }
  157. }
  158. }
  159. foreach($totalRow as $totalKey => &$row){
  160. if($totalKey == 'game_id' || $totalKey == 'total_active_total'||$totalKey == 'total_reg_total'){
  161. continue;
  162. }
  163. $totalRow[$totalKey] = ToolLogic::getPercent($row['active_total'],$row['reg_total']);
  164. }
  165. $totalRow['total'] = ToolLogic::getPercent($totalRow['total_active_total'],$totalRow['total_reg_total']);
  166. // 获取两个注册日期之间的日期列表
  167. $dateList = ToolLogic::getDatesBetween($where['reg_date'][0],$where['reg_date'][1]);
  168. $columnsData = [
  169. [
  170. 'title' => '游戏ID',
  171. 'dataIndex' => 'game_id',
  172. 'width' => 120,
  173. ],
  174. [
  175. 'title' => '游戏',
  176. 'dataIndex' => 'game_name',
  177. 'width' => 120,
  178. ],
  179. [
  180. 'title' => '合计',
  181. 'dataIndex' => 'total',
  182. 'width' => 120,
  183. ]
  184. ];
  185. foreach($dateList as $date){
  186. $columnsData[] = [
  187. 'title' => $date,
  188. 'dataIndex' => $date,
  189. 'width' => 120,
  190. ];
  191. }
  192. $result['data'] = $data;
  193. $result['totalRow'] = $totalRow;
  194. $result['columns'] = $columnsData;
  195. return $result;
  196. }
  197. /*
  198. 数据总览
  199. */
  200. public function getDataOverview($where){
  201. $params = $this->searchByAuth($where);
  202. $whereSql = $this->generateWhereSql($params);
  203. // 基础汇总信息
  204. $field = "
  205. SUM(login_total) AS login_total, -- 登陆总数
  206. SUM(reg_total) AS reg_total, -- 注册总数
  207. SUM(pay_total) AS pay_total, -- 付费总数
  208. SUM(pay_num) AS pay_num, -- 付费人数
  209. SUM(reg_login_total) AS reg_login_total, -- 注册登陆总数
  210. SUM(reg_pay_num) AS reg_pay_num, -- 注册付费数
  211. SUM(reg_pay_total) AS reg_pay_total, -- 注册付费金额
  212. SUM(old_login_total) AS old_login_total, -- 老用户登陆总数
  213. tdate";
  214. $baseData = $this->generateYearUnionList('base_total_day_',$where['reg_date'],$whereSql,$field,'tdate');
  215. if(empty($baseData)){
  216. return [
  217. 'data' => [],
  218. 'totalRow' => []
  219. ];
  220. }
  221. $actWhereSql = str_replace("AND tdate", "AND reg_date", $whereSql);
  222. $actWhereSql .= " AND days = 1";
  223. $actData = $this->generateYearUnionList('game_active_day_',$where['reg_date'],$actWhereSql,'SUM(active_total) AS active_total,reg_date','reg_date');
  224. $actData = array_column($actData,null,'reg_date');
  225. $totalRow = [
  226. 'tdate' => '合计'
  227. ];
  228. foreach($baseData as &$row){
  229. $totalRow['login_total'] = !empty($totalRow['login_total']) ? $totalRow['login_total'] + $row['login_total'] : $row['login_total']; // 总用户 - 登陆总数
  230. $totalRow['reg_login_total'] = !empty($totalRow['reg_login_total']) ? $totalRow['reg_login_total'] + $row['reg_login_total'] : $row['reg_login_total']; // 新用户 - 注册登陆总数
  231. $totalRow['pay_num'] = !empty($totalRow['pay_num']) ? $totalRow['pay_num'] + $row['pay_num'] : $row['pay_num']; // 总用户 - 付费人数
  232. $totalRow['pay_total'] = !empty($totalRow['pay_total']) ? $totalRow['pay_total'] + $row['pay_total'] : $row['pay_total']; // 总用户 - 付费金额
  233. $totalRow['old_login_total'] = !empty($totalRow['old_login_total']) ? $totalRow['old_login_total'] + $row['old_login_total'] : $row['old_login_total']; // 老用户 - 登陆总数
  234. $totalRow['reg_total'] = !empty($totalRow['reg_total']) ? $totalRow['reg_total'] + $row['reg_total'] : $row['reg_total']; // 新用户 - 注册总数
  235. $totalRow['reg_pay_num'] = !empty($totalRow['reg_pay_num']) ? $totalRow['reg_pay_num'] + $row['reg_pay_num'] : $row['reg_pay_num']; // 新用户 - 注册付费数
  236. $totalRow['reg_pay_total'] = !empty($totalRow['reg_pay_total']) ? $totalRow['reg_pay_total'] + $row['reg_pay_total'] : $row['reg_pay_total']; // 新用户 - 注册付费金额
  237. $totalRow['active'] = !empty($totalRow['active']) ? $totalRow['active'] + $actData[$row['tdate']]['active_total']??0 : $actData[$row['tdate']]['active_total']??0; // 次留数
  238. $row['active'] = !empty($actData[$row['tdate']]['active_total']) ? $actData[$row['tdate']]['active_total'] : 0; // 次留数
  239. $row['arpu'] = ToolLogic::getRound($row['pay_total'],$row['pay_num']); // 总用户 - ARPU
  240. $row['pay_rate'] = ToolLogic::getPercent($row['pay_num'],$row['login_total']); // 总用户 - 付费率
  241. $row['reg_pay_rate'] = ToolLogic::getPercent($row['reg_pay_num'],$row['reg_total']); // 新用户 - 注册付费率
  242. $row['reg_arpu'] = ToolLogic::getRound($row['reg_pay_total'],$row['reg_pay_num']); // 新用户 - 注册付费ARPU
  243. $row['act_rate'] = ToolLogic::getPercent($row['active'],$row['reg_total']); // 新用户 - 次留率
  244. $row['old_pay_num'] = $row['pay_num'] - $row['reg_pay_num']; // 老用户 - 付费人数
  245. $row['old_pay_total'] = $row['pay_total'] - $row['reg_pay_total']; // 老用户 - 付费金额
  246. $row['old_pay_rate'] = ToolLogic::getPercent($row['old_pay_num'],$row['old_login_total']); // 老用户 - 付费率
  247. $row['old_arpu'] = ToolLogic::getRound($row['old_pay_total'],$row['old_pay_num']); // 老用户 - 付费ARPU
  248. }
  249. $totalRow['arpu'] = ToolLogic::getRound($totalRow['pay_total'],$totalRow['pay_num']); // 总用户 - ARPU
  250. $totalRow['pay_rate'] = ToolLogic::getPercent($totalRow['pay_num'],$totalRow['login_total']); // 总用户 - 付费率
  251. $totalRow['reg_pay_rate'] = ToolLogic::getPercent($totalRow['reg_pay_num'],$totalRow['reg_total']); // 新用户 - 注册付费率
  252. $totalRow['reg_arpu'] = ToolLogic::getRound($totalRow['reg_pay_total'],$totalRow['reg_pay_num']); // 新用户 - 注册付费ARPU
  253. $totalRow['old_pay_num'] = $totalRow['pay_num'] - $totalRow['reg_pay_num']; // 老用户 - 付费人数
  254. $totalRow['old_pay_total'] = $totalRow['pay_total'] - $totalRow['reg_pay_total']; // 老用户 - 付费金额
  255. $totalRow['old_pay_rate'] = ToolLogic::getPercent($totalRow['old_pay_num'],$totalRow['old_login_total']); // 老用户 - 付费率
  256. $totalRow['old_arpu'] = ToolLogic::getRound($totalRow['old_pay_total'],$totalRow['old_pay_num']); // 老用户 - 付费ARPU
  257. $totalRow['act_rate'] = ToolLogic::getPercent($totalRow['active'],$totalRow['reg_total']); // 次留率
  258. return [
  259. 'data' => $baseData,
  260. 'totalRow' => $totalRow
  261. ];
  262. }
  263. /*
  264. 数据总览(按月)
  265. */
  266. public function getDataOverviewByMonth($where){
  267. $params = $this->searchByAuth($where);
  268. // 根据渠道名称获取渠道ID
  269. if(!empty($params['agent_name'])){
  270. $agentData = Db::connect('db_advert')->query("SELECT id,name FROM agent_list WHERE 1=1 AND name = '{$params['agent_name']}'");
  271. $params['agent_id'] = $agentData[0]['id'] ?? 0;
  272. }
  273. $whereSql = $this->generateWhereSql($params);
  274. // 基础汇总信息
  275. $field = "
  276. SUM(login_total) AS login_total, -- 登陆总数
  277. SUM(reg_total) AS reg_total, -- 注册总数
  278. SUM(pay_total) AS pay_total, -- 付费总数
  279. SUM(pay_num) AS pay_num, -- 付费人数
  280. SUM(reg_login_total) AS reg_login_total, -- 注册登陆总数
  281. SUM(reg_pay_num) AS reg_pay_num, -- 注册付费数
  282. SUM(reg_pay_total) AS reg_pay_total, -- 注册付费金额
  283. SUM(old_login_total) AS old_login_total, -- 老用户登陆总数
  284. date_format(`tdate`, '%Y-%m') AS mdate";
  285. $baseData = $this->generateYearUnionList('base_total_day_',$where['reg_date'],$whereSql,$field,'mdate');
  286. if(empty($baseData)){
  287. return [
  288. 'data' => [],
  289. 'totalRow' => []
  290. ];
  291. }
  292. $actWhereSql = str_replace("AND tdate", "AND reg_date", $whereSql);
  293. $actWhereSql .= " AND days = 1";
  294. $actData = $this->generateYearUnionList('game_active_day_',$where['reg_date'],$actWhereSql,'SUM(active_total) AS active_total,date_format(reg_date, "%Y-%m") AS mdate','mdate');
  295. $actData = array_column($actData,null,'mdate');
  296. $totalRow = [
  297. 'mdate' => '合计'
  298. ];
  299. foreach($baseData as &$row){
  300. $totalRow['login_total'] = !empty($totalRow['login_total']) ? $totalRow['login_total'] + $row['login_total'] : $row['login_total']; // 总用户 - 登陆总数
  301. $totalRow['reg_login_total'] = !empty($totalRow['reg_login_total']) ? $totalRow['reg_login_total'] + $row['reg_login_total'] : $row['reg_login_total']; // 新用户 - 注册登陆总数
  302. $totalRow['pay_num'] = !empty($totalRow['pay_num']) ? $totalRow['pay_num'] + $row['pay_num'] : $row['pay_num']; // 总用户 - 付费人数
  303. $totalRow['pay_total'] = !empty($totalRow['pay_total']) ? $totalRow['pay_total'] + $row['pay_total'] : $row['pay_total']; // 总用户 - 付费金额
  304. $totalRow['old_login_total'] = !empty($totalRow['old_login_total']) ? $totalRow['old_login_total'] + $row['old_login_total'] : $row['old_login_total']; // 老用户 - 登陆总数
  305. $totalRow['reg_total'] = !empty($totalRow['reg_total']) ? $totalRow['reg_total'] + $row['reg_total'] : $row['reg_total']; // 新用户 - 注册总数
  306. $totalRow['reg_pay_num'] = !empty($totalRow['reg_pay_num']) ? $totalRow['reg_pay_num'] + $row['reg_pay_num'] : $row['reg_pay_num']; // 新用户 - 注册付费数
  307. $totalRow['reg_pay_total'] = !empty($totalRow['reg_pay_total']) ? $totalRow['reg_pay_total'] + $row['reg_pay_total'] : $row['reg_pay_total']; // 新用户 - 注册付费金额
  308. $totalRow['active'] = !empty($totalRow['active']) ? $totalRow['active'] + $actData[$row['mdate']]['active_total']??0 : $actData[$row['mdate']]['active_total']??0; // 次留数
  309. $row['active'] = !empty($actData[$row['mdate']]['active_total']) ? $actData[$row['mdate']]['active_total'] : 0; // 次留数
  310. $row['arpu'] = ToolLogic::getRound($row['pay_total'],$row['pay_num']); // 总用户 - ARPU
  311. $row['pay_rate'] = ToolLogic::getPercent($row['pay_num'],$row['login_total']); // 总用户 - 付费率
  312. $row['reg_pay_rate'] = ToolLogic::getPercent($row['reg_pay_num'],$row['reg_total']); // 新用户 - 注册付费率
  313. $row['reg_arpu'] = ToolLogic::getRound($row['reg_pay_total'],$row['reg_pay_num']); // 新用户 - 注册付费ARPU
  314. $row['act_rate'] = ToolLogic::getPercent($row['active'],$row['reg_total']); // 新用户 - 次留率
  315. $row['old_pay_num'] = $row['pay_num'] - $row['reg_pay_num']; // 老用户 - 付费人数
  316. $row['old_pay_total'] = $row['pay_total'] - $row['reg_pay_total']; // 老用户 - 付费金额
  317. $row['old_pay_rate'] = ToolLogic::getPercent($row['old_pay_num'],$row['old_login_total']); // 老用户 - 付费率
  318. $row['old_arpu'] = ToolLogic::getRound($row['old_pay_total'],$row['old_pay_num']); // 老用户 - 付费ARPU
  319. }
  320. $totalRow['arpu'] = ToolLogic::getRound($totalRow['pay_total'],$totalRow['pay_num']); // 总用户 - ARPU
  321. $totalRow['pay_rate'] = ToolLogic::getPercent($totalRow['pay_num'],$totalRow['login_total']); // 总用户 - 付费率
  322. $totalRow['reg_pay_rate'] = ToolLogic::getPercent($totalRow['reg_pay_num'],$totalRow['reg_total']); // 新用户 - 注册付费率
  323. $totalRow['reg_arpu'] = ToolLogic::getRound($totalRow['reg_pay_total'],$totalRow['reg_pay_num']); // 新用户 - 注册付费ARPU
  324. $totalRow['old_pay_num'] = $totalRow['pay_num'] - $totalRow['reg_pay_num']; // 老用户 - 付费人数
  325. $totalRow['old_pay_total'] = $totalRow['pay_total'] - $totalRow['reg_pay_total']; // 老用户 - 付费金额
  326. $totalRow['old_pay_rate'] = ToolLogic::getPercent($totalRow['old_pay_num'],$totalRow['old_login_total']); // 老用户 - 付费率
  327. $totalRow['old_arpu'] = ToolLogic::getRound($totalRow['old_pay_total'],$totalRow['old_pay_num']); // 老用户 - 付费ARPU
  328. $totalRow['act_rate'] = ToolLogic::getPercent($totalRow['active'],$totalRow['reg_total']); // 次留率
  329. return [
  330. 'data' => $baseData,
  331. 'totalRow' => $totalRow
  332. ];
  333. }
  334. /**
  335. * 收入分析
  336. */
  337. public function getIncomeAnalysis($where){
  338. $params = $this->searchByAuth($where);
  339. $tdate = $params['reg_date']??date('Y-m-d');
  340. $ldate = date('Y-m-d', strtotime($tdate . ' -1 days'));
  341. $wdate = date('Y-m-d', strtotime($tdate . ' -7 days'));
  342. unset($params['reg_date']);
  343. $whereSql = $this->generateWhereSql($params);
  344. $whereSql .= " AND tdate IN ('{$tdate}','{$ldate}','{$wdate}')";
  345. $field = "
  346. SUM(pay_total) AS pay_total, -- 付费金额
  347. SUM(pay_num) AS pay_num, -- 付费人数
  348. SUM(login_total) AS login_total, -- 登陆总数
  349. game_id,
  350. tdate";
  351. $year = (int)date('Y', strtotime($tdate));
  352. $tableName = 'base_total_day_'.$year;
  353. $baseData = Db::connect('db_data_report')->query("SELECT {$field} FROM {$tableName} WHERE 1=1 {$whereSql} GROUP BY game_id,tdate");
  354. if(empty($baseData)){
  355. return [
  356. 'data' => [],
  357. 'totalRow' => []
  358. ];
  359. }
  360. // 计算今日,所有游戏总充值
  361. $totalRow = [
  362. 'game_id' => '合计',
  363. ];
  364. $allTotal = 0;
  365. $data = [];
  366. foreach($baseData as &$row){
  367. // 查询日期数据
  368. if($row['tdate'] == $tdate){
  369. $gameId = $row['game_id'];
  370. $data[$gameId]['game_id'] = $gameId;
  371. $data[$gameId]['login_total'] = $row['login_total']; // DAU
  372. $data[$gameId]['pay_total'] = $row['pay_total']??0; // 今日充值
  373. $data[$gameId]['pay_num'] = $row['pay_num']??0; // 今日付费人数
  374. $data[$gameId]['pay_arpu'] = ToolLogic::getRound($row['pay_total'],$row['pay_num']); // 今日付费ARPU
  375. $allTotal += $row['pay_total'];
  376. $totalRow['pay_total'] = !empty($totalRow['pay_total']) ? $totalRow['pay_total'] + $row['pay_total'] : $row['pay_total']; // 今日充值
  377. $totalRow['pay_num'] = !empty($totalRow['pay_num']) ? $totalRow['pay_num'] + $row['pay_num'] : $row['pay_num']; // 今日付费人数
  378. $totalRow['login_total'] = !empty($totalRow['login_total']) ? $totalRow['login_total'] + $row['login_total'] : $row['login_total']; // 今日登陆人数
  379. }
  380. // 查询昨天数据
  381. if($row['tdate'] == $ldate){
  382. $gameId = $row['game_id'];
  383. $data[$gameId]['yestoday_pay_total'] = $row['pay_total']??0; // 昨日充值
  384. $totalRow['yestoday_pay_total'] = !empty($totalRow['yestoday_pay_total']) ? $totalRow['yestoday_pay_total'] + $row['pay_total'] : $row['pay_total']; // 昨日充值
  385. }
  386. // 查询7天前数据
  387. if($row['tdate'] == $wdate){
  388. $gameId = $row['game_id'];
  389. $data[$gameId]['week_pay_total'] = $row['pay_total']??0; // 7天前充值
  390. $totalRow['week_pay_total'] = !empty($totalRow['week_pay_total']) ? $totalRow['week_pay_total'] + $row['pay_total'] : $row['pay_total']; // 7天前充值
  391. }
  392. }
  393. $totalRow['pay_arpu'] = ToolLogic::getRound($totalRow['pay_total'],$totalRow['pay_num']); // 今日充值ARPU
  394. $totalRow['pay_ratio'] = ToolLogic::getPercent($totalRow['pay_total'],$allTotal); // 今日充值占比
  395. $totalRow['pay_increase_yestoday'] = $totalRow['pay_total'] - $totalRow['yestoday_pay_total']; // 昨日增长
  396. $totalRow['pay_increase_week'] = $totalRow['pay_total'] - $totalRow['week_pay_total']; // 7天增长
  397. foreach($data as &$row){
  398. $data['pay_ratio'] = ToolLogic::getPercent($row['pay_total'],$allTotal); // 今日充值占比
  399. $row['pay_increase_yestoday'] = $row['pay_total'] - $row['yestoday_pay_total']; // 昨日增长
  400. $row['pay_increase_week'] = $row['pay_total'] - $row['week_pay_total']; // 7天增长
  401. }
  402. return [
  403. 'data' => array_values($data),
  404. 'totalRow' => $totalRow
  405. ];
  406. }
  407. // 生成基础日统计表的联合查询列表
  408. public function generateYearUnionList($namePrefix, $regDate,$whereSql='',$field='*',$group=null){
  409. $tableNames = ToolLogic::getYearlyTableNames($namePrefix, $regDate[0],$regDate[1]);
  410. $sqlParts = [];
  411. foreach ($tableNames as $tableName){
  412. $sqlParts[] = "SELECT * FROM {$tableName} WHERE 1=1 {$whereSql}";
  413. }
  414. $unionSql = implode(" UNION ALL ", $sqlParts);
  415. $finalSql = "
  416. SELECT {$field} FROM ( {$unionSql} ) AS all_total_day
  417. ";
  418. if (!empty($group)) {
  419. $finalSql .= " GROUP BY {$group}";
  420. }
  421. $baseData = Db::connect('db_data_report')->query($finalSql);
  422. return $baseData;
  423. }
  424. // 生成wheresql
  425. public function generateWhereSql($params){
  426. $whereSql = "";
  427. // 游戏id
  428. if(!empty($params['game_id'])){
  429. if (is_array($params['game_id'])) {
  430. $whereSql .= " AND game_id IN(" . implode(',', $params['game_id']) . ")";
  431. } else {
  432. $whereSql .= " AND game_id = {$params['game_id']}";
  433. }
  434. }
  435. // 媒体id
  436. if(!empty($params['media_id'])){
  437. $whereSql .= " AND media_id = {$params['media_id']}";
  438. }
  439. // 渠道id
  440. if(!empty($params['agent_id'])){
  441. $whereSql .= " AND agent_id = {$params['agent_id']}";
  442. }
  443. // 广告位id
  444. if(!empty($params['site_id'])){
  445. if (is_array($params['site_id'])) {
  446. $whereSql .= " AND site_id IN(" . implode(',', $params['site_id']) . ")";
  447. } else {
  448. $whereSql .= " AND site_id = {$params['site_id']}";
  449. }
  450. }
  451. // 负责人
  452. if(!empty($params['auth_id'])){
  453. if (is_array($params['auth_id'])) {
  454. $whereSql .= " AND auth_id IN(" . implode(',', $params['auth_id']) . ")";
  455. } else {
  456. $whereSql .= " AND auth_id = {$params['auth_id']}";
  457. }
  458. }
  459. // 注册日期
  460. if(!empty($params['reg_date'])??null){
  461. $whereSql .= " AND tdate BETWEEN '{$params['reg_date'][0]}' AND '{$params['reg_date'][1]}'";
  462. }
  463. return $whereSql;
  464. }
  465. }