getPositionPlans(); $allAdPlans['materials'] = $this->getAllMaterials(); // 增加福利广告计划和素材 $allAdPlans['welfare_plans'] = $this->getWelfarePlans(); $allAdPlans['welfare_materials'] = $this->getAllWelfareMaterials(); Redis::instance()->set(AdConstants::AD_FULL, json_encode($allAdPlans)); Redis::instance()->set(AdConstants::AD_LATEST_VERSION, substr(md5(time()),0,11)); $this->_updatePlanFlag(); } catch (\Exception $exception) { LogService::error($exception->getMessage()); } } /** * 刷新缓存后更新广告计划Flag,通知 Job 广告计划有更新 */ private function _updatePlanFlag() { try { $this->getAdManageModel() ->where('show_endtime', '>=', time()) ->where('state', '=', '1') ->where("!ISNULL(user_group_id)") ->update(['flag' => 1]); LogService::info('AD:更新广告计划Flag'); } catch (\Exception $exception) { LogService::info('AD:更新广告计划Flag, Error:' . $exception->getMessage()); } } /** * 返回所有的可用素材 (非福利广告素材) * @return array */ public function getAllMaterials() { $allMaterials = []; $material_arr = $this->getAdMaterialModel() ->where('type', 'in', '0,1,2') ->where('state', '=', '1') ->where('show_endtime', '>=', time()) ->where('material_position', '<>', '') ->order('weight', 'desc') ->order('createtime', 'desc') ->select(); if ($material_arr) { foreach ($material_arr as $k => $material) { $allMaterials[$material->id] = [ 'type' => $material->type, 'img_url' => $this->getRealUrl($material->img_url), 'link_url' => $material->link_url, 'js_code' => $material->js_code, 'ad_baidu' => $material->ad_baidu, 'weight' => $material->weight, 'show_starttime' => $material->show_starttime, 'show_endtime' => $material->show_endtime, ]; } } return $allMaterials; } /** * 返回所有的可用福利广告素材 * @return array */ public function getAllWelfareMaterials() { $allMaterials = []; $material_arr = $this->getAdMaterialModel() ->where('type', '=', '3') ->where('state', '=', '1') ->where('show_endtime', '>=', time()) ->order('weight', 'desc') ->order('createtime', 'desc') ->select(); if ($material_arr) { foreach ($material_arr as $k => $material) { $allMaterials[$material->id] = [ 'type' => $material->type, 'link_game' => $material->link_game, 'weight' => $material->weight, 'show_starttime' => $material->show_starttime, 'show_endtime' => $material->show_endtime, ]; } } return $allMaterials; } /** * 返回 [位置 => 广告计划] 映射关系 * @return array */ public function getWelfarePlans() { $tmp_plans = []; // 获取所有未结束的广告计划 $adWelfarePlans = $this->getAdManageModel() ->join('ad_user_group', 'ad_manage.user_group_id = ad_user_group.id', 'left') ->where('ad_type', '=', '2') ->where('show_endtime', '>=', time()) ->where('state', '=', '1') ->where("!ISNULL(user_group_id)") ->field('ad_manage.*, ad_user_group.group_name, ad_user_group.group_type') ->order('weight', 'desc') ->order('createtime', 'desc') ->select(); if ($adWelfarePlans) { foreach ($adWelfarePlans as $key => $plan) { $tmp_plans[$plan->id] = $this->getAdWelfarePlanItem($plan); } } return $tmp_plans; } /** * 获取所有福利广告计划(用户组 => 非全部用户) * 给 push 消息使用 */ public function welfarePlans(){ $data = []; $adWelfarePlans = $this->getAdManageModel() ->join('ad_user_group', 'ad_manage.user_group_id = ad_user_group.id', 'left') ->where('ad_type', '=', '2') ->where('show_endtime', '>=', time()) ->where('state', '=', '1') ->where("!ISNULL(user_group_id)") ->where('ad_user_group.group_type', '<>', '0') ->field('ad_manage.id plan_id, ad_user_group.id user_group_id, ad_user_group.group_name, ad_user_group.group_type, ad_user_group.user_json') ->order('ad_manage.weight', 'desc') ->order('ad_manage.createtime', 'desc') ->select(); if ($adWelfarePlans) { foreach ($adWelfarePlans as $plan) { $item = []; if ($plan->group_type == '1') { // 如果是自定义用户,从PolarDb数据库中查询自定义的用户ID $ad_user_group = model('AdUserGroupExtend')->where('user_group_id', '=', $plan->user_group_id)->find(); if ($ad_user_group) { $item['user_ids'] = $ad_user_group->user_ids; } else { $item['user_ids'] = ''; } } else { $item['user_ids'] = ''; } $item['plan_id'] = $plan->plan_id; $item['group_type'] = $plan->group_type; $item['user_json'] = $plan->user_json; array_push($data, $item); } } return $data; } /** * 获取福利计划广告推送的内容 */ public function getWelfareContent() { try{ $data = []; // 获取定时PUSH的广告内容 $adWelfareObj = $this->getAdManageModel() ->join('ad_user_group', 'ad_manage.user_group_id = ad_user_group.id', 'left') ->where('ad_type', '=', '2') ->where('show_endtime', '>=', time()) ->where('state', '=', '1') ->where("!ISNULL(user_group_id)") ->where('welfare_json', '<>', '') ->where('ad_user_group.group_type', '<>', '0') ->field('ad_manage.id plan_id, ad_manage.welfare_json') ->order('ad_manage.weight', 'desc') ->order('ad_manage.createtime', 'desc') ->find(); if ($adWelfareObj) { $plan_id = $adWelfareObj->plan_id; $welfare_json_arr = json_decode(trim($adWelfareObj->welfare_json), true); $data['title'] = $welfare_json_arr['smart_title'] ?? ''; $data['description'] = $welfare_json_arr['smart_deputy_title'] ?? ''; $data['picurl'] = $welfare_json_arr['smart_icon'] ?? ''; $materialObj = $this->getAdMaterialModel() ->where('type', '=', '3') ->where('link_game', '<>', '') ->order('weight', 'desc') ->order('id', 'desc') ->find(); $url = $materialObj->link_game ?? ''; $data['url'] = $url . "?ad_plan={$plan_id}&uid={uid}"; } return $data; }catch (\Exception $exception){ LogService::error("AD:" . $exception->getMessage()); } } /** * @return array */ public function getPositionPlans() { $position_plans = []; // 位置 => 广告计划 映射关系 foreach ($this->allPositions as $k => $position) { $tmp_plans = []; // 获取所有未结束的广告计划 $adPlans = $this->getAdManageModel() ->join('ad_user_group', 'ad_manage.user_group_id = ad_user_group.id', 'left') ->where('show_endtime', '>=', time()) ->where('state', '=', '1') ->where("find_in_set($position,show_position)") ->where("!ISNULL(user_group_id)") ->field('ad_manage.*, ad_user_group.group_name, ad_user_group.group_type') ->order('weight', 'desc') ->order('createtime', 'desc') ->select(); if ($adPlans) { foreach ($adPlans as $key => $plan) { $tmp_plans[$plan->id] = $this->getAdPlanItem($plan,$position); } } $position_plans[$position] = $tmp_plans; } return $position_plans; } /** * @param $url * @return mixed */ public function getRealUrl($url) { $patten = "/^http[s]?:/"; if (!preg_match($patten, $url)) { $url = Config::get('Site.cdnurl') . '/' . $url; } return $url; } /** * 返回 福利广告计划 实体对象 * @param $plan * @param $position * @return array */ public function getAdWelfarePlanItem(&$plan) { $welfare_arr = json_decode($plan->welfare_json, true); $data = [ 'ad_type' => $plan->ad_type, 'show_starttime' => $plan->show_starttime, 'show_endtime' => $plan->show_endtime, 'weight' => $plan->weight, 'group_type' => $plan->group_type, ]; $data = array_merge($data, $welfare_arr); return $data; } /** * 返回 广告计划 实体对象 * @param $plan * @param $position * @return array */ public function getAdPlanItem(&$plan, $position) { $data = [ 'material_ids' => $this->getPositionMaterial($position), 'ad_type' => $plan->ad_type, 'show_starttime' => $plan->show_starttime, 'show_endtime' => $plan->show_endtime, 'is_slide' => $plan->show_type, 'weight' => $plan->weight, 'group_type' => $plan->group_type, 'chapter_num' => $plan->chapter_num, 'chapter_start_num' => $plan->chapter_start_num, 'chapter_step_num' => $plan->chapter_step_num ]; return $data; } /** * 根据位置返回匹配的素材ID * @param string $show_position 展示位置 1,2,3 || 1 * @return array */ public function getPositionMaterial($show_position = '') { $tmp_arr = []; if ($show_position) { $position = explode(',', $show_position); foreach ($position as $k => $position) { $material_arr = $this->getAdMaterialModel() ->where('state', '=', '1') ->where("find_in_set($position,material_position)") ->order('weight', 'desc') ->order('createtime', 'desc') ->select(); if ($material_arr) { foreach ($material_arr as $k => $material) { array_push($tmp_arr, $material->id); } } } } $tmp_arr = array_unique($tmp_arr); sort($tmp_arr); return $tmp_arr; } /** * 返回所有的广告位 * @return array */ public function getAllAdPositions() { return $this->allPositions; } /** * 获取福利互动广告内容 * @param $plan_id 福利广告ID * @return array|mixed */ public function getWelfarePlan($plan_id) { $data = []; $redis_key = AdConstants::AD_PLAN . $plan_id; if ($plan = Redis::instance()->get($redis_key)) { $data = json_decode($plan, true); } else { $plan = $this->getAdManageModel() ->where('ad_type', '=', 2) ->where('id', '=', $plan_id) ->where('welfare_json', '<>', '') ->find(); if ($plan) { Redis::instance()->set($redis_key, $plan->welfare_json, 86400); $data = json_decode($plan->welfare_json, true); } } return $data; } /** * 维护广告计划中的flag字段 * @param $user_group_id * @param $group_type 0:全部,1:自定义,2:条件筛选 */ public function updateFlagByUserGroup($user_group_id, $group_type = 0) { try { if ($group_type) { $this->getAdManageModel()->update(['flag' => 1], ['user_group_id' => $user_group_id]); } } catch (\Exception $exception) { LogService::info('AD:广告计划更新Flag标志失败'); } } }