* @version : HUOSDK 8.0 */ namespace huo\logic\data; use huo\model\common\CommonModel; use huo\model\data\DayAgentModel; use huo\model\data\DayGameAgentModel; use huo\model\data\DayGameModel; use huo\model\data\DayModel; use huo\model\log\DayMemLogModel; use huolib\constant\CommonConst; use huolib\constant\DataConst; use huolib\tool\StrUtils; use huolib\tool\Time; class DayDataLogic extends CommonModel { protected $base_field = [ 'date' => 'date', /* 日期 */ 'user_cnt' => 'user_cnt', /* 活跃玩家数量 */ 'reg_device_cnt' => 'reg_device_cnt', /* 新增设备 */ 'reg_cnt' => 'reg_cnt', /* 注册玩家数 */ 'pay_user_cnt' => 'pay_user_cnt',/* 付费玩家数 */ 'order_cnt' => 'order_cnt', /* 成功订单数 */ 'reg_pay_cnt' => 'reg_pay_cnt', /* 新增即付费人数 */ 'first_pay_cnt' => 'first_pay_user_cnt', /* 新增付费人数 */ 'sum_money' => 'sum_money', /* 充值金额 */ 'reg_sum_money' => 'reg_sum_money', /* 新增即付总额 */ 'first_pay_money' => 'first_pay_sum_money', /* 新增付费总额 */ 'reg_order_cnt' => 'reg_order_cnt', /* 新增订单 */ 'cpa_cnt' => 'cpa_cnt', /* cpa有效用户 */ 'openid_cnt' => 'openid_cnt', /* 第三方注册用户 */ 'ip_cnt' => 'ip_cnt', /* 独立ip */ 'reg_ip_cnt' => 'reg_ip_cnt', /* 独立ip */ ]; protected $sum_field = [ 'sum(user_cnt)' => 'user_cnt', 'sum(reg_device_cnt)' => 'reg_device_cnt', 'sum(reg_cnt)' => 'reg_cnt', 'sum(pay_user_cnt)' => 'pay_user_cnt', 'sum(reg_order_cnt)' => 'reg_order_cnt', 'sum(reg_pay_cnt)' => 'reg_pay_cnt', 'sum(first_pay_cnt)' => 'first_pay_user_cnt', 'sum(sum_money)' => 'sum_money', 'sum(reg_sum_money)' => 'reg_sum_money', 'sum(first_pay_money)' => 'first_pay_sum_money', 'sum(order_cnt)' => 'order_cnt', 'sum(cpa_cnt)' => 'cpa_cnt', 'sum(openid_cnt)' => 'openid_cnt', 'sum(ip_cnt)' => 'ip_cnt', 'sum(reg_ip_cnt)' => 'reg_ip_cnt', ]; /** * @param array $param * * @return array */ protected function getWhere($param = []) { $_map = []; if (!empty($param['start_time']) && !empty($param['end_time'])) { $_map['date'] = ['between', [$param['start_time'], $param['end_time']]]; } elseif (!empty($param['start_time'])) { $_map['date'] = ['egt', $param['start_time']]; } elseif (!empty($param['end_time'])) { $_map['date'] = ['elt', $param['end_time']]; } if (!empty($param['agent_id'])) { if ($param['agent_id'] == -1) { $_map['agent_id'] = 0; } else { $_map['agent_id'] = $param['agent_id']; } } if (!empty($param['sub_agent_id'])) { if ($param['sub_agent_id'] == -1) { $_map['agent_id'] = 0; } else { $_map['agent_id'] = $param['sub_agent_id']; } } if (!empty($param['game_id'])) { $_map['app_id'] = $param['game_id']; } if (!empty($param['app_id'])) { $_map['app_id'] = $param['app_id']; } return $_map; } /** * @param array $where * * @return DayAgentModel|DayGameAgentModel|DayGameModel|DayModel|null|\think\Model */ public function getDataModel($where) { if (isset($where['agent_id']) && isset($where['app_id'])) { return new DayGameAgentModel(); } elseif (isset($where['agent_id'])) { return new DayAgentModel(); } elseif (isset($where['app_id'])) { return new DayGameModel(); } else { return new DayModel(); } } /** * 获取字段 * * @param $where * * @return array */ public function getField($where) { $_field = $this->base_field; if (!empty($where['agent_id']) && !empty($where['app_id'])) { $_field['agent_id'] = 'agent_id'; $_field['app_id'] = 'app_id'; } elseif (!empty($where['agent_id'])) { $_field['agent_id'] = 'agent_id'; } elseif (!empty($where['app_id'])) { $_field['app_id'] = 'app_id'; } return $_field; } /** * 获取字段 * * @param $where * * @return array */ public function getSumField($where) { $_field = $this->base_field; if (!empty($where['agent_id']) && !empty($where['app_id'])) { $_field['agent_id'] = 'agent_id'; $_field['app_id'] = 'app_id'; } elseif (!empty($where['agent_id'])) { $_field['agent_id'] = 'agent_id'; } elseif (!empty($where['app_id'])) { $_field['app_id'] = 'app_id'; } return $_field; } /** * 获取某个字段值 * * @param $field * @param $where * @param string $page * @param string $order * * @return array */ public function getFieldList($field, $where, $page = '1,10', $order = '+date') { $_map = $this->getWhere($where); if (strpos($page, ',')) { list($_page, $_offset) = explode(',', $page); } else { $_tem_map = $_map; if (isset($_map['app_id'])) { unset($_tem_map['app_id']); } if (isset($_map['agent_id'])) { unset($_tem_map['agent_id']); } $_offset = (new DayModel())->where($_tem_map)->count(); } $_end_time = isset($where['end_time']) ? $where['end_time'] : date('Y-m-d'); $_end_time = strtotime($_end_time); if (empty($where['agent_id'])) { $_model = new DayModel(); $_order = $this->orderFilter($order); $_list = $_model->where($_map)->order($_order)->page($page)->column($field, 'date'); $_rdata = []; for ($_i = $_offset; $_i > 0; $_i--) { $_date = date("Y-m-d", $_end_time - CommonConst::CONST_DAY_SECONDS * ($_i - 1)); $_key = substr($_date, 8); if (isset($_list[$_date])) { $_rdata[$_key] = $_list[$_date]; continue; } $_rdata[$_key] = 0; } return $_rdata; } else { $_model = new DayAgentModel(); $_rdata = []; for ($_i = $_offset; $_i > 0; $_i--) { $_date = date("Y-m-d", $_end_time - CommonConst::CONST_DAY_SECONDS * ($_i - 1)); $_key = substr($_date, 8); $_map['date'] = $_date; $_sum = $_model->where($_map)->sum($field); $_data[$_key] = $_sum; $_rdata[] = $_data; } return $_rdata; } } /** * 获取今日数据 * * @param $where * * @return array|bool|false */ public function getTodayData($where) { $_map = $this->getWhere($where); if (isset($_map['agent_id']) && -1 == $_map['agent_id']) { $_map['agent_id'] = 0; } $_date = date('Y-m-d'); $_map['date'] = $_date; $_group = 'date'; if (!empty($_map['agent_id']) && !empty($_map['app_id'])) { $_group .= ',app_id,agent_id'; } elseif (!empty($_map['agent_id'])) { $_group .= ',agent_id'; } elseif (!empty($where['app_id'])) { $_group .= ',app_id'; } $_field = [ 'date' => 'date', 'app_id' => 'app_id', 'agent_id' => 'agent_id', 'COUNT(DISTINCT `mem_id`)' => 'active_cnt', 'COUNT(DISTINCT(CASE WHEN `reg_days`=0 THEN `mem_id` END))' => 'today_cnt', // 'SUM(`login_cnt`)' => 'click_cnt', 'COUNT(DISTINCT(CASE WHEN `auth_cnt`>0 THEN `mem_id` END))' => 'user_cnt', 'COUNT(DISTINCT `last_login_ip`)' => 'ip_cnt', 'COUNT(DISTINCT(CASE WHEN `reg_days`=0 AND `auth_cnt`>0 THEN `mem_id` END))' => 'reg_cnt', 'COUNT(DISTINCT(CASE WHEN `reg_days`=0 AND `auth_cnt`>0 THEN `device_id` END))' => 'reg_device_cnt', 'COUNT(DISTINCT(CASE WHEN `reg_days`=0 AND `auth_cnt`>0 THEN `last_login_ip` END))' => 'reg_ip_cnt', 'COUNT(DISTINCT(CASE WHEN `sum_money`>0 THEN `mem_id` END))' => 'pay_user_cnt', // 'COUNT(DISTINCT(CASE WHEN `first_pay_time`>0 THEN `mem_id` END))' => 'first_pay_user_cnt', // 'SUM(`order_suc_cnt`)' => 'order_cnt', 'COUNT(DISTINCT(CASE WHEN `reg_days`=0 AND `sum_money`>0 THEN `mem_id` END))' => 'reg_pay_cnt', 'SUM(`sum_money`)' => 'sum_money', 'SUM(`order_cnt`)' => 'order_cnt', // 'SUM(`sum_real_money`)' => 'sum_real_money', 'SUM(CASE WHEN `reg_days`=0 AND `auth_cnt`>0 THEN `sum_money` END)' => 'reg_sum_money', 'SUM(CASE WHEN `reg_days`=0 AND `auth_cnt`>0 THEN `sum_real_money` END)' => 'reg_real_sum_money', ]; $_data = (new DayMemLogModel())->computeTable($_date)->field($_field)->where($_map)->group($_group)->find(); if (is_object($_data)) { $_data = $_data->toArray(); } if (empty($_data)) { return false; } $_data['act_pay_rate'] = StrUtils::getRate($_data['reg_pay_cnt'], $_data['today_cnt']); $_data['reg_pay_rate'] = StrUtils::getRate($_data['reg_pay_cnt'], $_data['reg_cnt']); $_data['user_pay_rate'] = StrUtils::getRate($_data['pay_user_cnt'], $_data['user_cnt']); $_data['reg_arpu'] = StrUtils::getArpu($_data['reg_sum_money'], $_data['reg_pay_cnt']); $_data['arpu'] = StrUtils::getArpu($_data['sum_money'], $_data['user_cnt']); $_data['arppu'] = StrUtils::getArpu($_data['sum_money'], $_data['pay_user_cnt']); $_data['acr'] = StrUtils::getArpu($_data['reg_cnt'], $_data['today_cnt']); $_data['first_day_ltv'] = StrUtils::getArpu($_data['reg_sum_money'], $_data['reg_cnt']); return $_data; } /** * 获取列表 * * @param array $where * @param string $page * @param string $order * * @return array */ public function getList($where, $page = '1,10', $order = '-date') { $_map = $this->getWhere($where); $_model = $this->getDataModel($_map); if (isset($_map['agent_id']) && -1 == $_map['agent_id']) { $_map['agent_id'] = 0; } $_count = $_model->where($_map)->count(); $_sum_field = $this->sum_field; $_sum_data = $_model ->field($_sum_field) ->where($_map) ->find(); if (is_object($_sum_data)) { $_sum_data = $_sum_data->toArray(); } $_sum = $_sum_data; $_sum['act_pay_rate'] = StrUtils::getRate($_sum_data['reg_pay_cnt'], $_sum_data['today_cnt']); $_sum['reg_pay_rate'] = StrUtils::getRate($_sum_data['reg_pay_cnt'], $_sum_data['reg_cnt']); $_sum['user_pay_rate'] = StrUtils::getRate($_sum_data['pay_user_cnt'], $_sum_data['user_cnt']); $_sum['reg_arpu'] = StrUtils::getArpu($_sum_data['reg_sum_money'], $_sum_data['reg_pay_cnt']); $_sum['arpu'] = StrUtils::getArpu($_sum_data['sum_money'], $_sum_data['user_cnt']); $_sum['arppu'] = StrUtils::getArpu($_sum_data['sum_money'], $_sum_data['pay_user_cnt']); $_sum['acr'] = StrUtils::getRate($_sum_data['reg_cnt'], $_sum_data['today_cnt']); $_sum['first_day_ltv'] = StrUtils::getArpu($_sum_data['reg_sum_money'], $_sum_data['reg_cnt']); if (empty($_count)) { return [ 'count' => 0, 'sum' => $_sum, 'list' => [] ]; } $_field = $this->getField($_map); $_order = $_model->orderFilter($order); $_datas = $_model ->where($_map) ->field($_field) ->order($_order) ->page($page) ->select(); if (is_object($_datas)) { $_datas = $_datas->toArray(); } if (empty($_datas)) { return [ 'count' => $_count, 'sum' => $_sum, 'list' => [] ]; } foreach ($_datas as $_k => $_v) { $_datas[$_k]['agent_name'] = !empty($_v['agent']) ? $_v['agent']['user_login'] : ''; $_datas[$_k]['reg_pay_rate'] = StrUtils::getRate($_v['reg_pay_cnt'], $_v['reg_cnt']); $_datas[$_k]['user_pay_rate'] = StrUtils::getRate($_v['pay_user_cnt'], $_v['user_cnt']); $_datas[$_k]['act_pay_rate'] = StrUtils::getRate($_v['pay_user_cnt'], $_v['today_cnt']); $_datas[$_k]['reg_arpu'] = StrUtils::getArpu($_v['reg_sum_money'], $_v['reg_pay_cnt']); $_datas[$_k]['arppu'] = StrUtils::getArpu($_v['sum_money'], $_v['pay_user_cnt']); $_datas[$_k]['arpu'] = StrUtils::getArpu($_v['sum_money'], $_v['user_cnt']); $_datas[$_k]['acr'] = StrUtils::getRate($_v['reg_cnt'], $_v['today_cnt']); $_datas[$_k]['first_day_ltv'] = StrUtils::getArpu($_v['reg_sum_money'], $_v['reg_cnt']); } return [ 'count' => $_count, 'sum' => $_sum, 'list' => $_datas ]; } /** * 获取今日游戏排行数据 * * @param $where * * @param $list_rows * * @return \think\Paginator * @throws \think\exception\DbException */ public function getTodayRankData($where, $list_rows, $order = '-sum_money') { $_map = $this->getWhere($where); if (!empty($where['game_name'])) { $_map['game.name'] = ['like', "{$where['game_name']}%"]; } if (!empty($where['rank_by'])) { $order = '-'.$where['rank_by']; } if (isset($_map['agent_id']) && -1 == $_map['agent_id']) { $_map['agent_id'] = 0; } $_order = $this->orderFilter($order); $_date = date('Y-m-d'); $_map['date'] = $_date; $_group = 'app_id'; $_field = [ 'date' => 'date', 'app_id' => 'app_id', 'agent_id' => 'agent_id', 'COUNT(DISTINCT `mem_id`)' => 'active_cnt', 'COUNT(DISTINCT(CASE WHEN `reg_days`=0 THEN `mem_id` END))' => 'today_cnt', // 'SUM(`login_cnt`)' => 'click_cnt', 'COUNT(DISTINCT(CASE WHEN `auth_cnt`>0 THEN `mem_id` END))' => 'user_cnt', 'COUNT(DISTINCT `last_login_ip`)' => 'ip_cnt', 'COUNT(DISTINCT(CASE WHEN `reg_days`=0 AND `auth_cnt`>0 THEN `mem_id` END))' => 'reg_cnt', 'COUNT(DISTINCT(CASE WHEN `reg_days`=0 AND `auth_cnt`>0 THEN `device_id` END))' => 'reg_device_cnt', 'COUNT(DISTINCT(CASE WHEN `reg_days`=0 AND `auth_cnt`>0 THEN `last_login_ip` END))' => 'reg_ip_cnt', 'COUNT(DISTINCT(CASE WHEN `sum_money`>0 THEN `mem_id` END))' => 'pay_user_cnt', // 'COUNT(DISTINCT(CASE WHEN `first_pay_time`>0 THEN `mem_id` END))' => 'first_pay_user_cnt', // 'SUM(`order_suc_cnt`)' => 'order_cnt', 'COUNT(DISTINCT(CASE WHEN `reg_days`=0 AND `sum_money`>0 THEN `mem_id` END))' => 'reg_pay_cnt', 'SUM(`sum_money`)' => 'sum_money', 'SUM(`order_cnt`)' => 'order_cnt', // 'SUM(`sum_real_money`)' => 'sum_real_money', 'SUM(CASE WHEN `reg_days`=0 AND `auth_cnt`>0 THEN `sum_money` END)' => 'reg_sum_money', 'SUM(CASE WHEN `reg_days`=0 AND `auth_cnt`>0 THEN `sum_real_money` END)' => 'reg_real_sum_money', ]; $_data = (new DayMemLogModel())->computeTable($_date)->field($_field)->with('game')->where($_map)->order( $_order )->group($_group)->paginate($list_rows); return $_data; } /** * 获取列表 * * @param array $where 查询条件 * @param string $page 分页数据 * @param string $order 排序方式 * @param array $field 查询字段 * @param string $group 组查询 * * @return array */ public function NewgetList($where, $page = '1,10', $order = '-date', $field = [], $group = '') { $_map = $where; $_model = $this->getDataModel($_map); if (!empty($_map['agent_id']) && -1 == $_map['agent_id']) { $_map['agent_id'] = 0; } if (!empty($group)) { $_count = $_model->where($_map)->group($group)->count(); } else { $_count = $_model->where($_map)->count(); } $_field = $field; $_order = $_model->orderFilter($order); $_datas = $_model->where($_map) ->field($_field) ->order($_order) ->group($group) ->page($page) ->select(); if (is_object($_datas)) { $_datas = $_datas->toArray(); } if (empty($_datas)) { return [ 'count' => $_count, 'list' => [] ]; } return [ 'count' => $_count, 'list' => $_datas ]; } /** * 获取后台列表 * * @param array $where 查询条件 * @param string $page 分页数据 * @param string $order 排序方式 * * @return array */ public function getAdminList($where, $page = '1,10', $order = '-date') { $_map = $this->getWhere($where); $_group = ''; if (!empty($where['data_summary']) && DataConst::DATA_SUMMARY_YES == $where['data_summary']) { $_field = $this->getSumField($_map); $_group = 'date'; } else { $_field = $this->getField($_map); } $_rdata = $this->NewgetList($_map, $page, $order, $_field, $_group); if (empty($_rdata['count'])) { return [ 'count' => CommonConst::CONST_ZERO, 'sum' => [], 'list' => [] ]; } $_datas = get_val($_rdata, 'list', []); $_static_logic = new StatisticsLogic(); $_today_date = date('Y-m-d'); foreach ($_datas as $_k => $_v) { if ($_today_date == $_v['date']) { unset($_datas[$_k]); continue; } if (!isset($_v['agent_id'])) { $_datas[$_k]['agent_id'] = 0; } if (!isset($_v['app_id'])) { $_datas[$_k]['app_id'] = 0; } $_datas[$_k]['reg_pay_rate'] = StrUtils::getRate($_v['reg_pay_cnt'], $_v['reg_cnt']); $_datas[$_k]['user_pay_rate'] = StrUtils::getRate($_v['pay_user_cnt'], $_v['user_cnt']); $_datas[$_k]['reg_arpu'] = StrUtils::getArpu($_v['reg_sum_money'], $_v['reg_cnt']); $_datas[$_k]['arppu'] = StrUtils::getArpu($_v['sum_money'], $_v['pay_user_cnt']); $_datas[$_k]['arpu'] = StrUtils::getArpu($_v['sum_money'], $_v['user_cnt']); $_start_time = strtotime($_v['date']); $_end_time = $_start_time + CommonConst::CONST_DAY_SECONDS; $_role_map = [ 'start_time' => $_start_time, 'end_time' => $_end_time, 'app_id' => get_val($where, 'app_id', 0), 'agent_id' => get_val($where, 'agent_id', 0) ]; $_datas[$_k]['role_cnt'] = $_static_logic->getDayRole($_role_map); } $_rdata['list'] = $_datas; $_sum_field = $this->sum_field; $_rdata['sum'] = $this->getSumData($where, $_sum_field); return $_rdata; } /** * 获取活跃数据汇总 * * @param array $param * * @return int|string */ public function getActiveUserSum($param = []) { $_start_time = strtotime('2013-08-01'); $_end_time = time(); if (!empty($param['start_time']) && !empty($param['end_time'])) { $_start_time = strtotime($param['start_time']); $_end_time = strtotime($param['end_time']); } $_map = $this->getWhere($param); $_group = 'mem_id'; $_cnt = (new DayMemLogModel())->getActiveUserSum($_map, $_start_time, $_end_time, $_group); return $_cnt; } /** * 获取汇总数据 * * @param array $where 查询条件 * @param array $sum_field 查询汇总字段 * * @return array */ public function getSumData($where, $sum_field) { $_date = date('Y-m-d'); $_where=$where; if (isset($_where['start_time']) && $_date == $_where['start_time']) { $_where['start_time'] = date('Y-m-d', strtotime('+1 day')); } if (isset($_where['end_time']) && strtotime($_where['end_time']) >= strtotime($_date)) { $_where['end_time'] = date('Y-m-d', strtotime('-1 day')); } $_map = $this->getWhere($_where); $_model = $this->getDataModel($_map); $_sum_field = $sum_field; $_sum_data = $_model ->field($_sum_field) ->where($_map) ->find(); if (is_object($_sum_data)) { $_sum_data = $_sum_data->toArray(); } foreach ($sum_field as $_v) { if (empty($_sum_data[$_v])) { $_sum_data[$_v] = 0; } } $_sum = $_sum_data; // $_user_cnt = $this->getActiveUserSum($where); // $_sum['user_cnt'] = $_user_cnt; if (isset($_sum_data['reg_pay_cnt']) && isset($_sum_data['reg_cnt'])) { $_sum['reg_pay_rate'] = StrUtils::getRate($_sum_data['reg_pay_cnt'], $_sum_data['reg_cnt']); } if (isset($_sum_data['pay_user_cnt']) && isset($_sum_data['user_cnt'])) { $_sum['user_pay_rate'] = StrUtils::getRate($_sum_data['pay_user_cnt'], $_sum_data['user_cnt']); } if (isset($_sum_data['reg_sum_money']) && isset($_sum_data['reg_cnt'])) { $_sum['reg_arpu'] = StrUtils::getArpu($_sum_data['reg_sum_money'], $_sum_data['reg_cnt']); } if (isset($_sum_data['sum_money']) && isset($_sum_data['user_cnt'])) { $_sum['arpu'] = StrUtils::getArpu($_sum_data['sum_money'], $_sum_data['user_cnt']); } if (isset($_sum_data['sum_money']) && isset($_sum_data['pay_user_cnt'])) { $_sum['arppu'] = StrUtils::getArpu($_sum_data['sum_money'], $_sum_data['pay_user_cnt']); } list($_start_time, $_end_time) = $this->getTime($where); $_role_map = [ 'start_time' => $_start_time, 'end_time' => $_end_time, 'app_id' => get_val($where, 'app_id', 0), 'agent_id' => get_val($where, 'agent_id', 0) ]; $_sum['role_cnt'] = (new StatisticsLogic())->getDayRole($_role_map); /* 创角数 */ return $_sum; } public function getTime($param) { list($_start_time, $_end_time) = time::today(); $_start_time = 0; if (!empty($param['start_time'])) { $_start_time = strtotime($param['start_time']); } if (!empty($param['end_time'])) { $_end_time = strtotime($param['end_time']) + CommonConst::CONST_DAY_SECONDS; } return [$_start_time, $_end_time]; } }