* @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; } }