* @version : HUOSDK-Mp 1.0 */ namespace huomp\logic\data; use DateTime; use huo\model\common\CommonModel; use huo\model\game\GameModel; use huo\model\user\UserModel; use huolib\constant\AgentConst; use huolib\constant\CommonConst; use huolib\tool\StrUtils; use huoLtv\model\LtvAgentModel; use huoLtv\model\LtvDayModel; use huoLtv\model\LtvGameAgentModel; use huoLtv\model\LtvGameModel; use huomp\model\agent\AgentGameDateCostModel; use think\Model; class OutputDataLogic extends CommonModel { private $base_field = [ 'date' => 'date', 'reg_cnt' => 'reg_cnt', 'sum_money' => 'sum_money', 'day1' => 'day1', //1日 'day2' => 'day2', //2日 'day3' => 'day3', //3日 'day4' => 'day4', //4日 'day5' => 'day5', //5日 'day6' => 'day6', //6日 'day7' => 'day7', //7日 'day8' => 'day8', //8日 'day9' => 'day9', //9日 'day10' => 'day10', //10日 'day11' => 'day11', //11日 'day12' => 'day12', //12日 'day13' => 'day13', //13日 'day14' => 'day14', //14日 'day15' => 'day15', //15日 'day16' => 'day16', //16日 'day17' => 'day17', //17日 'day18' => 'day18', //18日 'day19' => 'day19', //19日 'day20' => 'day20', //20日 'day21' => 'day21', //21日 'day22' => 'day22', //22日 'day23' => 'day23', //23日 'day24' => 'day24', //24日 'day25' => 'day25', //25日 'day26' => 'day26', //26日 'day27' => 'day27', //27日 'day28' => 'day28', //28日 'day29' => 'day29', //29日 'day30' => 'day30', //30日 'day31' => 'day31', //31日 'day32' => 'day32', //32日 'day33' => 'day33', //33日 'day34' => 'day34', //34日 'day35' => 'day35', //35日 'day36' => 'day36', //36日 'day37' => 'day37', //37日 'day38' => 'day38', //38日 'day39' => 'day39', //39日 'day40' => 'day40', //40日 'day41' => 'day41', //41日 'day42' => 'day42', //42日 'day43' => 'day43', //43日 'day44' => 'day44', //44日 'day45' => 'day45', //45日 'day46' => 'day46', //46日 'day47' => 'day47', //47日 'day48' => 'day48', //48日 'day49' => 'day49', //49日 'day50' => 'day50', //50日 'day51' => 'day51', //51日 'day52' => 'day52', //52日 'day53' => 'day53', //53日 'day54' => 'day54', //54日 'day55' => 'day55', //55日 'day56' => 'day56', //56日 'day57' => 'day57', //57日 'day58' => 'day58', //58日 'day59' => 'day59', //59日 'day60' => 'day60', //60日 'day90' => 'day90', //90日 'day120' => 'day120', //120日 'day180' => 'day180', //180日 ]; private $sum_base_field = [ 'date' => 'date', 'sum(reg_cnt)' => 'reg_cnt', 'sum(sum_money)' => 'sum_money', '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(day16)' => 'day16', //16日 'sum(day17)' => 'day17', //17日 'sum(day18)' => 'day18', //18日 'sum(day19)' => 'day19', //19日 'sum(day20)' => 'day20', //20日 'sum(day21)' => 'day21', //21日 'sum(day22)' => 'day22', //22日 'sum(day23)' => 'day23', //23日 'sum(day24)' => 'day24', //24日 'sum(day25)' => 'day25', //25日 'sum(day26)' => 'day26', //26日 'sum(day27)' => 'day27', //27日 'sum(day28)' => 'day28', //28日 'sum(day29)' => 'day29', //29日 'sum(day30)' => 'day30', //30日 'sum(day31)' => 'day31', //31日 'sum(day32)' => 'day32', //32日 'sum(day33)' => 'day33', //33日 'sum(day34)' => 'day34', //34日 'sum(day35)' => 'day35', //35日 'sum(day36)' => 'day36', //36日 'sum(day37)' => 'day37', //37日 'sum(day38)' => 'day38', //38日 'sum(day39)' => 'day39', //39日 'sum(day40)' => 'day40', //40日 'sum(day41)' => 'day41', //41日 'sum(day42)' => 'day42', //42日 'sum(day43)' => 'day43', //43日 'sum(day44)' => 'day44', //44日 'sum(day45)' => 'day45', //45日 'sum(day46)' => 'day46', //46日 'sum(day47)' => 'day47', //47日 'sum(day48)' => 'day48', //48日 'sum(day49)' => 'day49', //49日 'sum(day50)' => 'day50', //50日 'sum(day51)' => 'day51', //51日 'sum(day52)' => 'day52', //52日 'sum(day53)' => 'day53', //53日 'sum(day54)' => 'day54', //54日 'sum(day55)' => 'day55', //55日 'sum(day56)' => 'day56', //56日 'sum(day57)' => 'day57', //57日 'sum(day58)' => 'day58', //58日 'sum(day59)' => 'day59', //59日 'sum(day60)' => 'day60', //60日 'sum(day90)' => 'day90', //90日 'sum(day120)' => 'day120', //120日 'sum(day180)' => 'day180', //180日 ]; /* 后台显示 */ private $show_field = [ 'day1' => 'day1', //1日 'day2' => 'day2', //2日 'day3' => 'day3', //3日 'day4' => 'day4', //4日 'day5' => 'day5', //5日 'day6' => 'day6', //6日 'day7' => 'day7', //7日 'day8' => 'day8', //8日 'day9' => 'day9', //9日 'day10' => 'day10', //10日 'day11' => 'day11', //11日 'day12' => 'day12', //12日 'day13' => 'day13', //13日 'day14' => 'day14', //14日 'day15' => 'day15', //15日 'day30' => 'day30', //30日 'day60' => 'day60', //60日 'day90' => 'day90', //90日 'day120' => 'day120', //120日 'day180' => 'day180', //180日 ]; /** * @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']]; } $_agent_model = new UserModel(); if (!empty($param['cp_id'])) { $_ids = $_agent_model->getIdsByCpId( $param['cp_id'], ['in', [AgentConst::AGENT_ROLE_MP_AGENT, AgentConst::AGENT_ROLE_MP_AD]] ); if (empty($_ids)) { $_ids = [-1]; } $_map['agent_id'] = ['in', $_ids]; } if (!empty($param['agent_level_1_id'])) { $_agent_map = [ 'role_id' => ['in', [AgentConst::AGENT_ROLE_MP_AGENT, AgentConst::AGENT_ROLE_MP_AD]] ]; $_ids = $_agent_model->getIdsByParentId($param['agent_level_1_id'], $_agent_map); $_ids[] = $param['agent_level_1_id']; $_map['agent_id'] = ['in', $_ids]; } if (!empty($param['agent_level_2_id'])) { $_map['agent_id'] = $param['agent_level_2_id']; } if (!empty($param['agent_id'])) { $_map['agent_id'] = $param['agent_id']; } if (!empty($param['agent_id'])) { if (is_array($param['agent_id'])) { if (in_array('in', $param['agent_id'])) { $_map['agent_id'] = $param['agent_id']; } else { $_map['agent_id'] = ['in', $param['agent_id']]; } } else { $_map['agent_id'] = $param['agent_id']; } } if (!empty($param['game_id'])) { $_map['app_id'] = $param['game_id']; } $_game_model = new GameModel(); if (!empty($param['app_id'])) { if (is_array($param['app_id'])) { if (in_array('in', $param['app_id'])) { $_map['app_id'] = $param['app_id']; } else { $_map['app_id'] = ['in', $param['app_id']]; } } else { $_ids = $_game_model->getGameIds($param['app_id']); $_map['app_id'] = ['in', $_ids]; } } return $_map; } /** * @param array $where * * @return LtvAgentModel|LtvGameAgentModel|LtvGameModel|LtvDayModel|null|Model */ public function getDataModel($where) { if (!empty($where['agent_id']) && !empty($where['app_id'])) { return (new LtvGameAgentModel()); } elseif (!empty($where['agent_id'])) { return (new LtvAgentModel()); } elseif (!empty($where['app_id'])) { return new LtvGameModel(); } else { return new LtvDayModel(); } } /** * 获取字段 * * @param $where * * @return array */ public function getField($where) { $_field = $this->base_field; if ((isset($where['include_agent']) && 2 == $where['include_agent']) || (isset($where['is_summary']) && 2 == $where['is_summary'])) { $_field = $this->sum_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; } /** * 获取with * * @param $where * * @return string */ public function getWith($where) { $_with = ''; if (!empty($where['agent_id']) && !empty($where['app_id'])) { $_with = 'agent,game'; } elseif (!empty($where['agent_id'])) { $_with = 'agent'; $_field['agent_id'] = 'agent_id'; } elseif (!empty($where['app_id'])) { $_with = 'game'; } return $_with; } /** * 获取列表底层函数 * * @param array $where 搜索条件 * @param string $page 列表个数 * @param string $order 排序 * @param array $field 附加字段 * @param string $group 归类 * * @return array ['count'=>0,'list'=>[]] */ public function getList($where = [], $page = '1,10', $order = '-date', $field = [], $group = '', $with = '') { $_map = $where; $_field = $field; $_model = $this->getDataModel($_map); if (!empty($group)) { $_count = $_model->where($_map)->group($group)->count(); } else { $_count = $_model->where($_map)->count(); } if (empty($_count)) { return [ 'count' => 0, 'list' => [] ]; } $_order = $this->orderFilter($order); if (!empty($group)) { $_datas = $_model->with($with) ->field($_field) ->where($_map) ->order($_order) ->group($group) ->page($page) ->select(); } else { $_datas = $_model->with($with) ->field($_field) ->where($_map) ->order($_order) ->page($page) ->select(); } if (is_object($_datas)) { $_datas = $_datas->toArray(); } $_date = date('Y-m-d'); $_date_end = new DateTime($_date); foreach ($_datas as $_k => $_v) { $_datas[$_k]['now_ltv'] = '0.00'; if (!empty($_v['reg_cnt'])) { $_datas[$_k]['now_ltv'] = bcdiv($_v['sum_money'], $_v['reg_cnt'], 2); } $_date_start = new DateTime($_v['date']); $_days = $_date_start->diff($_date_end)->days; //记录至今相差天数 foreach ($this->show_field as $_day) { if (strpos($_day, 'day') === false) { continue; } $_day_num = substr($_day, 3); if ($_days < $_day_num) { $_datas[$_k][$_day] = '--'; continue; } if (empty($_v['reg_cnt'])) { $_datas[$_k][$_day] = '0.00'; continue; } $_day_money = self::getTheDayMoney($_v, $_day_num); $_datas[$_k][$_day] = $_day_money; } if (!empty($_v['game'])) { $_datas[$_k]['game_name'] = get_val($_v['game'], 'name', ''); $_datas[$_k]['game_icon'] = get_val($_v['game'], 'icon', ''); $_datas[$_k]['classify'] = get_val($_v['game'], 'classify', ''); unset($_datas[$_k]['game']); } if (!empty($_v['agent'])) { $_datas[$_k]['agent_nickname'] = get_val($_v['agent'], 'user_nicename', ''); $_datas[$_k]['agent_name'] = get_val($_v['agent'], 'user_login', ''); unset($_datas[$_k]['agent']); } else { $_datas[$_k]['agent_nickname'] = ''; $_datas[$_k]['agent_name'] = ''; } } return [ 'count' => $_count, 'list' => $_datas ]; } /** * 获取汇总数据 * * @param $model * @param $map * * @return array */ public function getSumData($model, $map) { $_sum_field = $this->sum_base_field; $_sum_data = $model ->field($_sum_field) ->where($map) ->find(); if (is_object($_sum_data)) { $_sum_data = $_sum_data->toArray(); } $_new_sum_data = $_sum_data; foreach ($this->show_field as $_day) { if (strpos($_day, 'day') === false) { continue; } $_day_num = substr($_day, 3); $_day_money = self::getTheDayMoney($_sum_data, $_day_num); $_new_sum_data[$_day] = $_day_money; } return $_new_sum_data; } /** * 获取后台列表 * * @param array $where 搜索条件 * @param string $page 列表个数 * @param string $order 排序 * @param array $field 附加字段 * * @return array ['count'=>0,'list'=>[]] */ public function getAdminList($where = [], $page = '1,10', $order = '-date', $field = []) { $_map = $this->getWhere($where); $_where = array_merge($where, $_map); $_field = $this->getField($_where); $_with = $this->getWith($_where); if (!empty($field)) { $_field = array_merge($_field, $field);/* 获取后台字段 */ } $_group = ''; if ((isset($where['include_agent']) && 2 == $where['include_agent']) || (isset($where['is_summary']) && 2 == $where['is_summary'])) { $_group = 'date'; } $_rdata = $this->getList($_map, $page, $order, $_field, $_group, $_with); if (empty($_rdata['count'])) { $_rdata['sum'] = []; return $_rdata; } $_datas = $_rdata['list']; $_agdc_model = new AgentGameDateCostModel(); foreach ($_datas as $_k => $_v) { $_agdc_map = [ 'date' => $_v['date'] ]; if (!empty($_v['app_id'])) { $_agdc_map['app_id'] = $_v['app_id']; } if (CommonConst::STATUS_NO == $where['is_summary'] && !empty($_v['agent_id'])) { $_agdc_map['agent_id'] = $_v['agent_id']; } elseif (!empty($_map['agent_id'])) { $_agdc_map['agent_id'] = $_map['agent_id']; } $_datas[$_k]['cost'] = $_agdc_model->getCostByWhere($_agdc_map); $_datas[$_k]['price'] = StrUtils::getArpu($_datas[$_k]['cost'], $_v['reg_cnt']); } $_rdata['list'] = $_datas; $_model = $this->getDataModel($_map); $_rdata['sum'] = $this->getSumData($_model, $_map); $_rdata['sum']['cost'] = $_agdc_model->getCostByWhere($_map); $_rdata['sum']['price'] = StrUtils::getArpu($_rdata['sum']['cost'], $_rdata['sum']['reg_cnt']); return $_rdata; } /** * 获取后台列表 * * @param array $where 搜索条件 * @param string $page 列表个数 * @param string $order 排序 * @param array $field 附加字段 * * @return array ['count'=>0,'list'=>[]] */ public function getNewAdminList($_indexData,$where = [], $page = '1,10', $order = '-date', $field = []) { $_map = $this->getWhere($where); // 渠道过滤 // if (!empty(request()->default_agent_ids)) { // $_map['agent_id'] = ['in', request()->default_agent_ids]; // $where['is_summary'] = CommonConst::STATUS_YES; // } $_where = array_merge($where, $_map); $_with = $this->getWith($_where); $_field = $this->sum_base_field; $_rdata = $this->getList($_map, $page, $order, $_field, 'date', $_with); if (empty($_rdata['count'])) { $_rdata['sum'] = []; return $_rdata; } $_datas = $_rdata['list']; $_agdc_model = new AgentGameDateCostModel(); $reg_array = array_column($_indexData['list'],'reg_cnt','date'); $user_cnt_array = array_column($_indexData['list'],'user_cnt','date'); $reg_pay_cnt_array = array_column($_indexData['list'],'reg_pay_cnt','date'); $reg_sum_money_array = array_column($_indexData['list'],'reg_sum_money','date'); foreach ($_datas as $_k => $_v) { $_agdc_map = [ 'date' => $_v['date'] ]; if (isset($_map['app_id'])) $_agdc_map['app_id'] = $_map['app_id']; if (CommonConst::STATUS_NO == $where['is_summary'] && !empty($_v['agent_id'])) { $_agdc_map['agent_id'] = $_v['agent_id']; } elseif (!empty($_map['agent_id'])) { $_agdc_map['agent_id'] = $_map['agent_id']; } $_datas[$_k]['cost'] = $_agdc_model->getCostByWhere($_agdc_map); //$_datas[$_k]['price'] = StrUtils::getArpu($_datas[$_k]['cost'], $_v['reg_cnt']); $_datas[$_k]['user_cnt'] = $user_cnt_array[$_v['date']] ?? 0; $_datas[$_k]['price'] = StrUtils::getArpu($_datas[$_k]['cost'], $reg_array[$_v['date']] ?? 0); //新增付费人数 $_datas[$_k]['reg_pay_cnt'] = $reg_pay_cnt_array[$_v['date']] ?? 0; //新增付费金额 $_datas[$_k]['reg_sum_money'] = $reg_sum_money_array[$_v['date']] ?? 0; //成本/新增付费人数 $_datas[$_k]['agv_price'] = StrUtils::getArpu($_datas[$_k]['cost'], $_datas[$_k]['reg_pay_cnt'] ); } $_rdata['list'] = $_datas; $_model = $this->getDataModel($_map); $_rdata['sum'] = $this->getSumData($_model, $_map); $_rdata['sum']['cost'] = $_agdc_model->getCostByWhere($_map); if (!empty(request()->default_agent_ids)) { $_map['agent_id'] = ['in', request()->default_agent_ids]; $where['is_summary'] = CommonConst::STATUS_YES; } $_model = (new DayDataLogic())->getDataModel($_map); $_sum_data = $_model ->field(['sum(reg_pay_cnt)'=> 'reg_pay_cnt','sum(reg_sum_money)' => 'reg_sum_money']) ->where($_map) ->find(); if (is_object($_sum_data)) { $_sum_data = $_sum_data->toArray(); } $_rdata['sum']['reg_pay_cnt'] = $_sum_data['reg_pay_cnt']; $_rdata['sum']['reg_sum_money'] = $_sum_data['reg_sum_money']; return $_rdata; } /** * 获取至当日金额 * * @param array $data 单条数据 * @param int $day 获取日期 * * @return int|mixed|string */ private function getTheDayMoney($data, $day) { $_money = 0; /* 最大循环60日 */ $_lop_day = $day; if ($day > 60) { $_lop_day = 60; } for ($_i = 1; $_i <= $_lop_day; $_i++) { $_field = 'day'.$_i; $_value = get_val($data, $_field, 0); $_money += $_value; } /* 60日内数据返回 */ if ($day <= 60) { return $_money; } if ($day <= 90) { $_value90 = get_val($data, 'day90', 0); $_money += $_value90; return $_money; } if ($day <= 120) { $_value90 = get_val($data, 'day90', 0); $_value120 = get_val($data, 'day120', 0); $_money = $_money + $_value90 + $_value120; return $_money; } if ($day <= 180) { $_value90 = get_val($data, 'day90', 0); $_value120 = get_val($data, 'day120', 0); $_value180 = get_val($data, 'day180', 0); $_money = $_money + $_value90 + $_value120 + $_value180; return $_money; } if ($day <= 270) { $_value90 = get_val($data, 'day90', 0); $_value120 = get_val($data, 'day120', 0); $_value180 = get_val($data, 'day180', 0); $_value270 = get_val($data, 'day270', 0); $_money = $_money + $_value90 + $_value120 + $_value180 + $_value270; return $_money; } if ($day <= 360) { $_value90 = get_val($data, 'day90', 0); $_value120 = get_val($data, 'day120', 0); $_value180 = get_val($data, 'day180', 0); $_value270 = get_val($data, 'day270', 0); $_value360 = get_val($data, 'day360', 0); $_money = $_money + $_value90 + $_value120 + $_value180 + $_value270 + $_value360; return $_money; } return $_money; } }