123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464 |
- <?php
- /**
- * Created by PhpStorm.
- * User: Elton
- * Date: 2020/5/22
- * Time: 10:18
- */
- namespace app\common\service;
- use app\common\library\Redis;
- use app\common\model\AdManage;
- use app\common\model\AdMaterial;
- use app\main\constants\AdConstants;
- use think\Config;
- class AdPlanService
- {
- /**
- * @var AdPlanService
- */
- private static $self;
- protected $allPositions = [
- AdConstants::AD_P_XQ,
- AdConstants::AD_P_ZG,
- AdConstants::AD_P_YDYDB,
- AdConstants::AD_P_ZJYD,
- AdConstants::AD_P_SJ,
- AdConstants::AD_P_YDYCD,
- AdConstants::AD_P_YDY_ZJ_A,
- AdConstants::AD_P_YDY_ZJ_B,
- AdConstants::AD_P_YDY_ZJ_C,
- AdConstants::AD_P_PAY_SCREEN,
- AdConstants::AD_P_READ_SCREEN,
- AdConstants::AD_P_SIGN_SUCESS,
- AdConstants::AD_P_USER_CENTER,
- AdConstants::AD_P_TOP_INDEX,
- AdConstants::AD_P_CAT_INDEX,
- AdConstants::AD_P_CAT_SUB,
- AdConstants::AD_P_INDEX_BANNER_A,
- AdConstants::AD_P_YDY_TOP,
- AdConstants::AD_P_YDY_CHAPTER_SCREEN,
- AdConstants::AD_P_INDEX_BANNER_B,
- AdConstants::AD_P_INDEX_FLOAT_FRAME,
- AdConstants::AD_P_DETAIL_FLOAT_FRAME,
- ];
- // 福利广告位置
- protected $welfarePositions = [
- AdConstants::AD_WELFARE_YDQ,
- AdConstants::AD_WELFARE_SIGN,
- AdConstants::AD_WELFARE_RECHARGE,
- AdConstants::AD_WELFARE_RECENT,
- ];
- /**
- * @return AdPlanService
- */
- public static function instance()
- {
- if(self::$self == NULL){
- self::$self = new self();
- }
- return self::$self;
- }
- /**
- * @return AdManage
- */
- public function getAdManageModel()
- {
- return model('AdManage');
- }
- /**
- * @return AdMaterial
- */
- public function getAdMaterialModel()
- {
- return model('AdMaterial');
- }
- /**
- * 刷新所有广告计划
- */
- public function refreshAllAd()
- {
- try {
- $allAdPlans = [];
- $allAdPlans['positions'] = $this->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标志失败');
- }
- }
- }
|