123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- <?php
- /**
- * LtvLogic.php UTF-8
- * LTV 数据逻辑处理
- *
- * @date : 2019/5/27 14:53
- *
- * @license 这不是一个自由软件,未经授权不许任何使用和传播。
- * @author : chenbingling <cbl@huosdk.com>
- * @version : HUOSDK 8.0
- */
- namespace ltv;
- use DateTime;
- use huolib\constant\CommonConst;
- use huolib\constant\DataConst;
- use huolib\tool\Math;
- use think\Model;
- class LtvLogic extends Model {
- private $base_field
- = [
- 'date' => 'date', /* 日期 */
- 'sum(reg_cnt)' => 'reg_cnt', /* 注册玩家数 */
- 'sum(reg_device_cnt)' => 'reg_device_cnt', /* 新增设备 */
- 'sum(sum_money)' => 'sum_money', /* 注册玩家数 */
- ];
- protected $day_field
- = [
- 'sum(day1)' => 'day1', //1日
- 'sum(day2)' => 'day2', //2日
- 'sum(day3)' => 'day3', //3日
- 'sum(day4)' => 'day4', //4日
- 'sum(day5)' => 'day5', //5日
- 'sum(day6)' => 'day6', //6日
- 'sum(day7)' => 'day7', //7日
- 'sum(day8)' => 'day8', //8日
- 'sum(day9)' => 'day9', //9日
- 'sum(day10)' => 'day10', //10日
- 'sum(day11)' => 'day11', //11日
- 'sum(day12)' => 'day12', //12日
- 'sum(day13)' => 'day13', //13日
- 'sum(day14)' => 'day14', //14日
- 'sum(day15)' => 'day15', //15日
- 'sum(day30)' => 'day30', //30日
- 'sum(day60)' => 'day60', //60日
- 'sum(day90)' => 'day90', //90日
- //'sum(day120)' => 'day120', //120日
- 'sum(day180)' => 'day180', //180日
- // 'sum(day270)' => 'day270', //270日
- // 'sum(day360)' => 'day360', //360日
- ];
- /**
- * 获取字段
- *
- * @param $where
- *
- * @return array
- */
- public function getField($where) {
- $_field = array_merge($this->base_field, $this->day_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 array $param
- *
- * @return string
- */
- public function getGroup($param) {
- if (!empty($param['data_summary']) && DataConst::DATA_SUMMARY_YES == $param['data_summary']) {
- $_group = 'date';
- return $_group;
- }
- $_group = 'date';
- if (!empty($param['app_id']) && !empty($param['agent_id'])) {
- $_group = 'date,app_id,agent_id';
- } elseif (!empty($param['app_id'])) {
- $_group = 'date,app_id';
- } elseif (!empty($param['agent_id'])) {
- $_group = 'date,agent_id';
- }
- return $_group;
- }
- /***
- * 获取查询条件
- *
- * @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'])) {
- $_map['agent_id'] = $param['agent_id'];
- if (-1 == $_map['agent_id']) {
- $_map['agent_id'] = ['in', [$_map['agent_id'], CommonConst::CONST_ZERO]];
- } elseif (is_array($param['agent_id']) && !in_array('in', $param['agent_id'])) {
- $_map['agent_id'] = ['in', $param['agent_id']];
- }
- }
- if (!empty($param['app_id'])) {
- $_map['app_id'] = $param['app_id'];
- }
- return $_map;
- }
- /**
- * 获取关联
- *
- * @param $param
- *
- * @return LtvModel
- */
- public function getWith($param) {
- $_model = new LtvModel();
- if (!empty($param['app_id']) && !empty($param['agent_id'])) {
- $_model = $_model->with('ch,game');
- } elseif (!empty($param['app_id'])) {
- $_model = $_model->with('game');
- } elseif (!empty($param['agent_id'])) {
- $_model = $_model->with('ch');
- }
- return $_model;
- }
- /***
- * 获取LTV 列表
- *
- * @param array $param
- *
- * @param string $page
- *
- * @param string $order
- *
- * @return array|bool
- */
- public function getList($param, $page = '1,10', $order = 'date desc') {
- $_rdata = ['count' => CommonConst::CONST_ZERO, 'list' => []];
- $_map = $this->getWhere($param);
- $_group = $this->getGroup($param);
- $_count = (new LtvModel())->where($_map)->group($_group)->count();
- if (empty($_count)) {
- return $_rdata;
- }
- $_field = $this->getField($param);
- $_item = $this->getWith($param)
- ->where($_map)
- ->field($_field)
- ->order($order)
- ->group($_group)
- ->page($page)
- ->select();
- if (is_object($_item)) {
- $_item = $_item->toArray();
- }
- if (empty($_item)) {
- return $_rdata;
- }
- $_list = [];
- $_date = date('Y-m-d');
- $_date_end = new DateTime($_date);
- foreach ($_item as $_k => $_v) {
- $_data = [];
- $_data['reg_cnt'] = $_v['reg_cnt'];
- $_data['date'] = $_v['date'];
- $_data['sum_money'] = $_v['sum_money'];
- $_data['now_ltv'] = 0.00;
- if (!empty($_v['reg_cnt'])) {
- $_data['now_ltv'] = Math::divNum($_v['sum_money'], $_v['reg_cnt'], 2);
- }
- $_date_start = new DateTime($_v['date']);
- $_days = $_date_start->diff($_date_end)->days; //记录至今相差天数
- foreach ($this->day_field as $_day) {
- $_day_num = substr($_day, 3);
- if ($_days < $_day_num) {
- $_data[$_day] = '--';
- continue;
- }
- if (empty($_v['reg_cnt'])) {
- $_data[$_day] = CommonConst::CONST_ZERO;
- continue;
- }
- $_data[$_day] = Math::divNum($_v[$_day], $_v['reg_cnt'], 2);
- }
- if (isset($_v['game'])) {
- $_data['game_name'] = $_v['game']['name'];
- }
- if (isset($_v['ch'])) {
- $_data['channel_name'] = $_v['ch']['user_login'];
- }
- if (isset($_v['agent_id'])) {
- $_data['agent_id'] = $_v['agent_id'];
- }
- $_list[] = $_data;
- }
- $_rdata['count'] = $_count;
- $_rdata['list'] = $_list;
- return $_rdata;
- }
- /**
- * @param array $day_field
- */
- public function setDayField($day_field) {
- $this->day_field = $day_field;
- }
- }
|