DayDataLogic.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617
  1. <?php
  2. /**
  3. * DayDataLogic.php UTF-8
  4. * 每日数据
  5. *
  6. * @date : 2018/5/21 21:49
  7. *
  8. * @license 这不是一个自由软件,未经授权不许任何使用和传播。
  9. * @author : wuyonghong <wyh@huosdk.com>
  10. * @version : HUOSDK 8.0
  11. */
  12. namespace huo\logic\data;
  13. use huo\model\common\CommonModel;
  14. use huo\model\data\DayAgentModel;
  15. use huo\model\data\DayGameAgentModel;
  16. use huo\model\data\DayGameModel;
  17. use huo\model\data\DayModel;
  18. use huo\model\log\DayMemLogModel;
  19. use huolib\constant\CommonConst;
  20. use huolib\constant\DataConst;
  21. use huolib\tool\StrUtils;
  22. use huolib\tool\Time;
  23. class DayDataLogic extends CommonModel {
  24. protected $base_field
  25. = [
  26. 'date' => 'date', /* 日期 */
  27. 'user_cnt' => 'user_cnt', /* 活跃玩家数量 */
  28. 'reg_device_cnt' => 'reg_device_cnt', /* 新增设备 */
  29. 'reg_cnt' => 'reg_cnt', /* 注册玩家数 */
  30. 'pay_user_cnt' => 'pay_user_cnt',/* 付费玩家数 */
  31. 'order_cnt' => 'order_cnt', /* 成功订单数 */
  32. 'reg_pay_cnt' => 'reg_pay_cnt', /* 新增即付费人数 */
  33. 'first_pay_cnt' => 'first_pay_user_cnt', /* 新增付费人数 */
  34. 'sum_money' => 'sum_money', /* 充值金额 */
  35. 'reg_sum_money' => 'reg_sum_money', /* 新增即付总额 */
  36. 'first_pay_money' => 'first_pay_sum_money', /* 新增付费总额 */
  37. 'reg_order_cnt' => 'reg_order_cnt', /* 新增订单 */
  38. 'cpa_cnt' => 'cpa_cnt', /* cpa有效用户 */
  39. 'openid_cnt' => 'openid_cnt', /* 第三方注册用户 */
  40. 'ip_cnt' => 'ip_cnt', /* 独立ip */
  41. 'reg_ip_cnt' => 'reg_ip_cnt', /* 独立ip */
  42. ];
  43. protected $sum_field
  44. = [
  45. 'sum(user_cnt)' => 'user_cnt',
  46. 'sum(reg_device_cnt)' => 'reg_device_cnt',
  47. 'sum(reg_cnt)' => 'reg_cnt',
  48. 'sum(pay_user_cnt)' => 'pay_user_cnt',
  49. 'sum(reg_order_cnt)' => 'reg_order_cnt',
  50. 'sum(reg_pay_cnt)' => 'reg_pay_cnt',
  51. 'sum(first_pay_cnt)' => 'first_pay_user_cnt',
  52. 'sum(sum_money)' => 'sum_money',
  53. 'sum(reg_sum_money)' => 'reg_sum_money',
  54. 'sum(first_pay_money)' => 'first_pay_sum_money',
  55. 'sum(order_cnt)' => 'order_cnt',
  56. 'sum(cpa_cnt)' => 'cpa_cnt',
  57. 'sum(openid_cnt)' => 'openid_cnt',
  58. 'sum(ip_cnt)' => 'ip_cnt',
  59. 'sum(reg_ip_cnt)' => 'reg_ip_cnt',
  60. ];
  61. /**
  62. * @param array $param
  63. *
  64. * @return array
  65. */
  66. protected function getWhere($param = []) {
  67. $_map = [];
  68. if (!empty($param['start_time']) && !empty($param['end_time'])) {
  69. $_map['date'] = ['between', [$param['start_time'], $param['end_time']]];
  70. } elseif (!empty($param['start_time'])) {
  71. $_map['date'] = ['egt', $param['start_time']];
  72. } elseif (!empty($param['end_time'])) {
  73. $_map['date'] = ['elt', $param['end_time']];
  74. }
  75. if (!empty($param['agent_id'])) {
  76. if ($param['agent_id'] == -1) {
  77. $_map['agent_id'] = 0;
  78. } else {
  79. $_map['agent_id'] = $param['agent_id'];
  80. }
  81. }
  82. if (!empty($param['sub_agent_id'])) {
  83. if ($param['sub_agent_id'] == -1) {
  84. $_map['agent_id'] = 0;
  85. } else {
  86. $_map['agent_id'] = $param['sub_agent_id'];
  87. }
  88. }
  89. if (!empty($param['game_id'])) {
  90. $_map['app_id'] = $param['game_id'];
  91. }
  92. if (!empty($param['app_id'])) {
  93. $_map['app_id'] = $param['app_id'];
  94. }
  95. return $_map;
  96. }
  97. /**
  98. * @param array $where
  99. *
  100. * @return DayAgentModel|DayGameAgentModel|DayGameModel|DayModel|null|\think\Model
  101. */
  102. public function getDataModel($where) {
  103. if (isset($where['agent_id']) && isset($where['app_id'])) {
  104. return new DayGameAgentModel();
  105. } elseif (isset($where['agent_id'])) {
  106. return new DayAgentModel();
  107. } elseif (isset($where['app_id'])) {
  108. return new DayGameModel();
  109. } else {
  110. return new DayModel();
  111. }
  112. }
  113. /**
  114. * 获取字段
  115. *
  116. * @param $where
  117. *
  118. * @return array
  119. */
  120. public function getField($where) {
  121. $_field = $this->base_field;
  122. if (!empty($where['agent_id']) && !empty($where['app_id'])) {
  123. $_field['agent_id'] = 'agent_id';
  124. $_field['app_id'] = 'app_id';
  125. } elseif (!empty($where['agent_id'])) {
  126. $_field['agent_id'] = 'agent_id';
  127. } elseif (!empty($where['app_id'])) {
  128. $_field['app_id'] = 'app_id';
  129. }
  130. return $_field;
  131. }
  132. /**
  133. * 获取字段
  134. *
  135. * @param $where
  136. *
  137. * @return array
  138. */
  139. public function getSumField($where) {
  140. $_field = $this->base_field;
  141. if (!empty($where['agent_id']) && !empty($where['app_id'])) {
  142. $_field['agent_id'] = 'agent_id';
  143. $_field['app_id'] = 'app_id';
  144. } elseif (!empty($where['agent_id'])) {
  145. $_field['agent_id'] = 'agent_id';
  146. } elseif (!empty($where['app_id'])) {
  147. $_field['app_id'] = 'app_id';
  148. }
  149. return $_field;
  150. }
  151. /**
  152. * 获取某个字段值
  153. *
  154. * @param $field
  155. * @param $where
  156. * @param string $page
  157. * @param string $order
  158. *
  159. * @return array
  160. */
  161. public function getFieldList($field, $where, $page = '1,10', $order = '+date') {
  162. $_map = $this->getWhere($where);
  163. if (strpos($page, ',')) {
  164. list($_page, $_offset) = explode(',', $page);
  165. } else {
  166. $_tem_map = $_map;
  167. if (isset($_map['app_id'])) {
  168. unset($_tem_map['app_id']);
  169. }
  170. if (isset($_map['agent_id'])) {
  171. unset($_tem_map['agent_id']);
  172. }
  173. $_offset = (new DayModel())->where($_tem_map)->count();
  174. }
  175. $_end_time = isset($where['end_time']) ? $where['end_time'] : date('Y-m-d');
  176. $_end_time = strtotime($_end_time);
  177. if (empty($where['agent_id'])) {
  178. $_model = new DayModel();
  179. $_order = $this->orderFilter($order);
  180. $_list = $_model->where($_map)->order($_order)->page($page)->column($field, 'date');
  181. $_rdata = [];
  182. for ($_i = $_offset; $_i > 0; $_i--) {
  183. $_date = date("Y-m-d", $_end_time - CommonConst::CONST_DAY_SECONDS * ($_i - 1));
  184. $_key = substr($_date, 8);
  185. if (isset($_list[$_date])) {
  186. $_rdata[$_key] = $_list[$_date];
  187. continue;
  188. }
  189. $_rdata[$_key] = 0;
  190. }
  191. return $_rdata;
  192. } else {
  193. $_model = new DayAgentModel();
  194. $_rdata = [];
  195. for ($_i = $_offset; $_i > 0; $_i--) {
  196. $_date = date("Y-m-d", $_end_time - CommonConst::CONST_DAY_SECONDS * ($_i - 1));
  197. $_key = substr($_date, 8);
  198. $_map['date'] = $_date;
  199. $_sum = $_model->where($_map)->sum($field);
  200. $_data[$_key] = $_sum;
  201. $_rdata[] = $_data;
  202. }
  203. return $_rdata;
  204. }
  205. }
  206. /**
  207. * 获取今日数据
  208. *
  209. * @param $where
  210. *
  211. * @return array|bool|false
  212. */
  213. public function getTodayData($where) {
  214. $_map = $this->getWhere($where);
  215. if (isset($_map['agent_id']) && -1 == $_map['agent_id']) {
  216. $_map['agent_id'] = 0;
  217. }
  218. $_date = date('Y-m-d');
  219. $_map['date'] = $_date;
  220. $_group = 'date';
  221. if (!empty($_map['agent_id']) && !empty($_map['app_id'])) {
  222. $_group .= ',app_id,agent_id';
  223. } elseif (!empty($_map['agent_id'])) {
  224. $_group .= ',agent_id';
  225. } elseif (!empty($where['app_id'])) {
  226. $_group .= ',app_id';
  227. }
  228. $_field = [
  229. 'date' => 'date',
  230. 'app_id' => 'app_id',
  231. 'agent_id' => 'agent_id',
  232. 'COUNT(DISTINCT `mem_id`)' => 'active_cnt',
  233. 'COUNT(DISTINCT(CASE WHEN `reg_days`=0 THEN `mem_id` END))' => 'today_cnt',
  234. // 'SUM(`login_cnt`)' => 'click_cnt',
  235. 'COUNT(DISTINCT(CASE WHEN `auth_cnt`>0 THEN `mem_id` END))' => 'user_cnt',
  236. 'COUNT(DISTINCT `last_login_ip`)' => 'ip_cnt',
  237. 'COUNT(DISTINCT(CASE WHEN `reg_days`=0 AND `auth_cnt`>0 THEN `mem_id` END))' => 'reg_cnt',
  238. 'COUNT(DISTINCT(CASE WHEN `reg_days`=0 AND `auth_cnt`>0 THEN `device_id` END))' => 'reg_device_cnt',
  239. 'COUNT(DISTINCT(CASE WHEN `reg_days`=0 AND `auth_cnt`>0 THEN `last_login_ip` END))' => 'reg_ip_cnt',
  240. 'COUNT(DISTINCT(CASE WHEN `sum_money`>0 THEN `mem_id` END))' => 'pay_user_cnt',
  241. // 'COUNT(DISTINCT(CASE WHEN `first_pay_time`>0 THEN `mem_id` END))' => 'first_pay_user_cnt',
  242. // 'SUM(`order_suc_cnt`)' => 'order_cnt',
  243. 'COUNT(DISTINCT(CASE WHEN `reg_days`=0 AND `sum_money`>0 THEN `mem_id` END))' => 'reg_pay_cnt',
  244. 'SUM(`sum_money`)' => 'sum_money',
  245. 'SUM(`order_cnt`)' => 'order_cnt',
  246. // 'SUM(`sum_real_money`)' => 'sum_real_money',
  247. 'SUM(CASE WHEN `reg_days`=0 AND `auth_cnt`>0 THEN `sum_money` END)' => 'reg_sum_money',
  248. 'SUM(CASE WHEN `reg_days`=0 AND `auth_cnt`>0 THEN `sum_real_money` END)' => 'reg_real_sum_money',
  249. ];
  250. $_data = (new DayMemLogModel())->computeTable($_date)->field($_field)->where($_map)->group($_group)->find();
  251. if (is_object($_data)) {
  252. $_data = $_data->toArray();
  253. }
  254. if (empty($_data)) {
  255. return false;
  256. }
  257. $_data['act_pay_rate'] = StrUtils::getRate($_data['reg_pay_cnt'], $_data['today_cnt']);
  258. $_data['reg_pay_rate'] = StrUtils::getRate($_data['reg_pay_cnt'], $_data['reg_cnt']);
  259. $_data['user_pay_rate'] = StrUtils::getRate($_data['pay_user_cnt'], $_data['user_cnt']);
  260. $_data['reg_arpu'] = StrUtils::getArpu($_data['reg_sum_money'], $_data['reg_pay_cnt']);
  261. $_data['arpu'] = StrUtils::getArpu($_data['sum_money'], $_data['user_cnt']);
  262. $_data['arppu'] = StrUtils::getArpu($_data['sum_money'], $_data['pay_user_cnt']);
  263. $_data['acr'] = StrUtils::getArpu($_data['reg_cnt'], $_data['today_cnt']);
  264. $_data['first_day_ltv'] = StrUtils::getArpu($_data['reg_sum_money'], $_data['reg_cnt']);
  265. return $_data;
  266. }
  267. /**
  268. * 获取列表
  269. *
  270. * @param array $where
  271. * @param string $page
  272. * @param string $order
  273. *
  274. * @return array
  275. */
  276. public function getList($where, $page = '1,10', $order = '-date') {
  277. $_map = $this->getWhere($where);
  278. $_model = $this->getDataModel($_map);
  279. if (isset($_map['agent_id']) && -1 == $_map['agent_id']) {
  280. $_map['agent_id'] = 0;
  281. }
  282. $_count = $_model->where($_map)->count();
  283. $_sum_field = $this->sum_field;
  284. $_sum_data = $_model
  285. ->field($_sum_field)
  286. ->where($_map)
  287. ->find();
  288. if (is_object($_sum_data)) {
  289. $_sum_data = $_sum_data->toArray();
  290. }
  291. $_sum = $_sum_data;
  292. $_sum['act_pay_rate'] = StrUtils::getRate($_sum_data['reg_pay_cnt'], $_sum_data['today_cnt']);
  293. $_sum['reg_pay_rate'] = StrUtils::getRate($_sum_data['reg_pay_cnt'], $_sum_data['reg_cnt']);
  294. $_sum['user_pay_rate'] = StrUtils::getRate($_sum_data['pay_user_cnt'], $_sum_data['user_cnt']);
  295. $_sum['reg_arpu'] = StrUtils::getArpu($_sum_data['reg_sum_money'], $_sum_data['reg_pay_cnt']);
  296. $_sum['arpu'] = StrUtils::getArpu($_sum_data['sum_money'], $_sum_data['user_cnt']);
  297. $_sum['arppu'] = StrUtils::getArpu($_sum_data['sum_money'], $_sum_data['pay_user_cnt']);
  298. $_sum['acr'] = StrUtils::getRate($_sum_data['reg_cnt'], $_sum_data['today_cnt']);
  299. $_sum['first_day_ltv'] = StrUtils::getArpu($_sum_data['reg_sum_money'], $_sum_data['reg_cnt']);
  300. if (empty($_count)) {
  301. return [
  302. 'count' => 0,
  303. 'sum' => $_sum,
  304. 'list' => []
  305. ];
  306. }
  307. $_field = $this->getField($_map);
  308. $_order = $_model->orderFilter($order);
  309. $_datas = $_model
  310. ->where($_map)
  311. ->field($_field)
  312. ->order($_order)
  313. ->page($page)
  314. ->select();
  315. if (is_object($_datas)) {
  316. $_datas = $_datas->toArray();
  317. }
  318. if (empty($_datas)) {
  319. return [
  320. 'count' => $_count,
  321. 'sum' => $_sum,
  322. 'list' => []
  323. ];
  324. }
  325. foreach ($_datas as $_k => $_v) {
  326. $_datas[$_k]['agent_name'] = !empty($_v['agent']) ? $_v['agent']['user_login'] : '';
  327. $_datas[$_k]['reg_pay_rate'] = StrUtils::getRate($_v['reg_pay_cnt'], $_v['reg_cnt']);
  328. $_datas[$_k]['user_pay_rate'] = StrUtils::getRate($_v['pay_user_cnt'], $_v['user_cnt']);
  329. $_datas[$_k]['act_pay_rate'] = StrUtils::getRate($_v['pay_user_cnt'], $_v['today_cnt']);
  330. $_datas[$_k]['reg_arpu'] = StrUtils::getArpu($_v['reg_sum_money'], $_v['reg_pay_cnt']);
  331. $_datas[$_k]['arppu'] = StrUtils::getArpu($_v['sum_money'], $_v['pay_user_cnt']);
  332. $_datas[$_k]['arpu'] = StrUtils::getArpu($_v['sum_money'], $_v['user_cnt']);
  333. $_datas[$_k]['acr'] = StrUtils::getRate($_v['reg_cnt'], $_v['today_cnt']);
  334. $_datas[$_k]['first_day_ltv'] = StrUtils::getArpu($_v['reg_sum_money'], $_v['reg_cnt']);
  335. }
  336. return [
  337. 'count' => $_count,
  338. 'sum' => $_sum,
  339. 'list' => $_datas
  340. ];
  341. }
  342. /**
  343. * 获取今日游戏排行数据
  344. *
  345. * @param $where
  346. *
  347. * @param $list_rows
  348. *
  349. * @return \think\Paginator
  350. * @throws \think\exception\DbException
  351. */
  352. public function getTodayRankData($where, $list_rows, $order = '-sum_money') {
  353. $_map = $this->getWhere($where);
  354. if (!empty($where['game_name'])) {
  355. $_map['game.name'] = ['like', "{$where['game_name']}%"];
  356. }
  357. if (!empty($where['rank_by'])) {
  358. $order = '-'.$where['rank_by'];
  359. }
  360. if (isset($_map['agent_id']) && -1 == $_map['agent_id']) {
  361. $_map['agent_id'] = 0;
  362. }
  363. $_order = $this->orderFilter($order);
  364. $_date = date('Y-m-d');
  365. $_map['date'] = $_date;
  366. $_group = 'app_id';
  367. $_field = [
  368. 'date' => 'date',
  369. 'app_id' => 'app_id',
  370. 'agent_id' => 'agent_id',
  371. 'COUNT(DISTINCT `mem_id`)' => 'active_cnt',
  372. 'COUNT(DISTINCT(CASE WHEN `reg_days`=0 THEN `mem_id` END))' => 'today_cnt',
  373. // 'SUM(`login_cnt`)' => 'click_cnt',
  374. 'COUNT(DISTINCT(CASE WHEN `auth_cnt`>0 THEN `mem_id` END))' => 'user_cnt',
  375. 'COUNT(DISTINCT `last_login_ip`)' => 'ip_cnt',
  376. 'COUNT(DISTINCT(CASE WHEN `reg_days`=0 AND `auth_cnt`>0 THEN `mem_id` END))' => 'reg_cnt',
  377. 'COUNT(DISTINCT(CASE WHEN `reg_days`=0 AND `auth_cnt`>0 THEN `device_id` END))' => 'reg_device_cnt',
  378. 'COUNT(DISTINCT(CASE WHEN `reg_days`=0 AND `auth_cnt`>0 THEN `last_login_ip` END))' => 'reg_ip_cnt',
  379. 'COUNT(DISTINCT(CASE WHEN `sum_money`>0 THEN `mem_id` END))' => 'pay_user_cnt',
  380. // 'COUNT(DISTINCT(CASE WHEN `first_pay_time`>0 THEN `mem_id` END))' => 'first_pay_user_cnt',
  381. // 'SUM(`order_suc_cnt`)' => 'order_cnt',
  382. 'COUNT(DISTINCT(CASE WHEN `reg_days`=0 AND `sum_money`>0 THEN `mem_id` END))' => 'reg_pay_cnt',
  383. 'SUM(`sum_money`)' => 'sum_money',
  384. 'SUM(`order_cnt`)' => 'order_cnt',
  385. // 'SUM(`sum_real_money`)' => 'sum_real_money',
  386. 'SUM(CASE WHEN `reg_days`=0 AND `auth_cnt`>0 THEN `sum_money` END)' => 'reg_sum_money',
  387. 'SUM(CASE WHEN `reg_days`=0 AND `auth_cnt`>0 THEN `sum_real_money` END)' => 'reg_real_sum_money',
  388. ];
  389. $_data = (new DayMemLogModel())->computeTable($_date)->field($_field)->with('game')->where($_map)->order(
  390. $_order
  391. )->group($_group)->paginate($list_rows);
  392. return $_data;
  393. }
  394. /**
  395. * 获取列表
  396. *
  397. * @param array $where 查询条件
  398. * @param string $page 分页数据
  399. * @param string $order 排序方式
  400. * @param array $field 查询字段
  401. * @param string $group 组查询
  402. *
  403. * @return array
  404. */
  405. public function NewgetList($where, $page = '1,10', $order = '-date', $field = [], $group = '') {
  406. $_map = $where;
  407. $_model = $this->getDataModel($_map);
  408. if (!empty($_map['agent_id']) && -1 == $_map['agent_id']) {
  409. $_map['agent_id'] = 0;
  410. }
  411. if (!empty($group)) {
  412. $_count = $_model->where($_map)->group($group)->count();
  413. } else {
  414. $_count = $_model->where($_map)->count();
  415. }
  416. $_field = $field;
  417. $_order = $_model->orderFilter($order);
  418. $_datas = $_model->where($_map)
  419. ->field($_field)
  420. ->order($_order)
  421. ->group($group)
  422. ->page($page)
  423. ->select();
  424. if (is_object($_datas)) {
  425. $_datas = $_datas->toArray();
  426. }
  427. if (empty($_datas)) {
  428. return [
  429. 'count' => $_count,
  430. 'list' => []
  431. ];
  432. }
  433. return [
  434. 'count' => $_count,
  435. 'list' => $_datas
  436. ];
  437. }
  438. /**
  439. * 获取后台列表
  440. *
  441. * @param array $where 查询条件
  442. * @param string $page 分页数据
  443. * @param string $order 排序方式
  444. *
  445. * @return array
  446. */
  447. public function getAdminList($where, $page = '1,10', $order = '-date') {
  448. $_map = $this->getWhere($where);
  449. $_group = '';
  450. if (!empty($where['data_summary']) && DataConst::DATA_SUMMARY_YES == $where['data_summary']) {
  451. $_field = $this->getSumField($_map);
  452. $_group = 'date';
  453. } else {
  454. $_field = $this->getField($_map);
  455. }
  456. $_rdata = $this->NewgetList($_map, $page, $order, $_field, $_group);
  457. if (empty($_rdata['count'])) {
  458. return [
  459. 'count' => CommonConst::CONST_ZERO,
  460. 'sum' => [],
  461. 'list' => []
  462. ];
  463. }
  464. $_datas = get_val($_rdata, 'list', []);
  465. $_static_logic = new StatisticsLogic();
  466. $_today_date = date('Y-m-d');
  467. foreach ($_datas as $_k => $_v) {
  468. if ($_today_date == $_v['date']) {
  469. unset($_datas[$_k]);
  470. continue;
  471. }
  472. if (!isset($_v['agent_id'])) {
  473. $_datas[$_k]['agent_id'] = 0;
  474. }
  475. if (!isset($_v['app_id'])) {
  476. $_datas[$_k]['app_id'] = 0;
  477. }
  478. $_datas[$_k]['reg_pay_rate'] = StrUtils::getRate($_v['reg_pay_cnt'], $_v['reg_cnt']);
  479. $_datas[$_k]['user_pay_rate'] = StrUtils::getRate($_v['pay_user_cnt'], $_v['user_cnt']);
  480. $_datas[$_k]['reg_arpu'] = StrUtils::getArpu($_v['reg_sum_money'], $_v['reg_cnt']);
  481. $_datas[$_k]['arppu'] = StrUtils::getArpu($_v['sum_money'], $_v['pay_user_cnt']);
  482. $_datas[$_k]['arpu'] = StrUtils::getArpu($_v['sum_money'], $_v['user_cnt']);
  483. $_start_time = strtotime($_v['date']);
  484. $_end_time = $_start_time + CommonConst::CONST_DAY_SECONDS;
  485. $_role_map = [
  486. 'start_time' => $_start_time,
  487. 'end_time' => $_end_time,
  488. 'app_id' => get_val($where, 'app_id', 0),
  489. 'agent_id' => get_val($where, 'agent_id', 0)
  490. ];
  491. $_datas[$_k]['role_cnt'] = $_static_logic->getDayRole($_role_map);
  492. }
  493. $_rdata['list'] = $_datas;
  494. $_sum_field = $this->sum_field;
  495. $_rdata['sum'] = $this->getSumData($where, $_sum_field);
  496. return $_rdata;
  497. }
  498. /**
  499. * 获取活跃数据汇总
  500. *
  501. * @param array $param
  502. *
  503. * @return int|string
  504. */
  505. public function getActiveUserSum($param = []) {
  506. $_start_time = strtotime('2013-08-01');
  507. $_end_time = time();
  508. if (!empty($param['start_time']) && !empty($param['end_time'])) {
  509. $_start_time = strtotime($param['start_time']);
  510. $_end_time = strtotime($param['end_time']);
  511. }
  512. $_map = $this->getWhere($param);
  513. $_group = 'mem_id';
  514. $_cnt = (new DayMemLogModel())->getActiveUserSum($_map, $_start_time, $_end_time, $_group);
  515. return $_cnt;
  516. }
  517. /**
  518. * 获取汇总数据
  519. *
  520. * @param array $where 查询条件
  521. * @param array $sum_field 查询汇总字段
  522. *
  523. * @return array
  524. */
  525. public function getSumData($where, $sum_field) {
  526. $_date = date('Y-m-d');
  527. $_where=$where;
  528. if (isset($_where['start_time']) && $_date == $_where['start_time']) {
  529. $_where['start_time'] = date('Y-m-d', strtotime('+1 day'));
  530. }
  531. if (isset($_where['end_time']) && strtotime($_where['end_time']) >= strtotime($_date)) {
  532. $_where['end_time'] = date('Y-m-d', strtotime('-1 day'));
  533. }
  534. $_map = $this->getWhere($_where);
  535. $_model = $this->getDataModel($_map);
  536. $_sum_field = $sum_field;
  537. $_sum_data = $_model
  538. ->field($_sum_field)
  539. ->where($_map)
  540. ->find();
  541. if (is_object($_sum_data)) {
  542. $_sum_data = $_sum_data->toArray();
  543. }
  544. foreach ($sum_field as $_v) {
  545. if (empty($_sum_data[$_v])) {
  546. $_sum_data[$_v] = 0;
  547. }
  548. }
  549. $_sum = $_sum_data;
  550. // $_user_cnt = $this->getActiveUserSum($where);
  551. // $_sum['user_cnt'] = $_user_cnt;
  552. if (isset($_sum_data['reg_pay_cnt']) && isset($_sum_data['reg_cnt'])) {
  553. $_sum['reg_pay_rate'] = StrUtils::getRate($_sum_data['reg_pay_cnt'], $_sum_data['reg_cnt']);
  554. }
  555. if (isset($_sum_data['pay_user_cnt']) && isset($_sum_data['user_cnt'])) {
  556. $_sum['user_pay_rate'] = StrUtils::getRate($_sum_data['pay_user_cnt'], $_sum_data['user_cnt']);
  557. }
  558. if (isset($_sum_data['reg_sum_money']) && isset($_sum_data['reg_cnt'])) {
  559. $_sum['reg_arpu'] = StrUtils::getArpu($_sum_data['reg_sum_money'], $_sum_data['reg_cnt']);
  560. }
  561. if (isset($_sum_data['sum_money']) && isset($_sum_data['user_cnt'])) {
  562. $_sum['arpu'] = StrUtils::getArpu($_sum_data['sum_money'], $_sum_data['user_cnt']);
  563. }
  564. if (isset($_sum_data['sum_money']) && isset($_sum_data['pay_user_cnt'])) {
  565. $_sum['arppu'] = StrUtils::getArpu($_sum_data['sum_money'], $_sum_data['pay_user_cnt']);
  566. }
  567. list($_start_time, $_end_time) = $this->getTime($where);
  568. $_role_map = [
  569. 'start_time' => $_start_time,
  570. 'end_time' => $_end_time,
  571. 'app_id' => get_val($where, 'app_id', 0),
  572. 'agent_id' => get_val($where, 'agent_id', 0)
  573. ];
  574. $_sum['role_cnt'] = (new StatisticsLogic())->getDayRole($_role_map); /* 创角数 */
  575. return $_sum;
  576. }
  577. public function getTime($param) {
  578. list($_start_time, $_end_time) = time::today();
  579. $_start_time = 0;
  580. if (!empty($param['start_time'])) {
  581. $_start_time = strtotime($param['start_time']);
  582. }
  583. if (!empty($param['end_time'])) {
  584. $_end_time = strtotime($param['end_time']) + CommonConst::CONST_DAY_SECONDS;
  585. }
  586. return [$_start_time, $_end_time];
  587. }
  588. }