123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292 |
- <?php
- /**
- * Created by PhpStorm.
- * User: Elton
- * Date: 2020/5/19
- * Time: 9:58
- */
- namespace app\common\service;
- use app\common\library\Redis;
- use app\common\model\AdManage;
- use app\common\model\AdMaterial;
- use app\common\model\object\UserObject;
- use app\main\constants\AdConstants;
- // 该类已弃用
- class AdService
- {
- /**
- * @var AdService
- */
- private static $self;
- /**
- * @return AdService
- */
- 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');
- }
- /**
- * 第一步:根据位置查询所有匹配的广告计划ID
- * @param $position_code 位置编号
- * @return string 匹配的广告计划ID
- */
- public function getAllPlan($position_code)
- {
- // 这里从缓存哩读数据
- $data = $this->getAllAd();
- if ($data) {
- $arr = [];
- foreach ($data as $k => $item) {
- if (in_array($position_code, explode(',', $item['show_position']))) {
- array_push($arr, $item['id']);
- };
- }
- return implode(',', $arr);
- } else {
- return '';
- }
- }
- /**
- * 第二步:遍历所有计划,过滤出匹配用户ID的计划
- * @param $position_code
- * @param $uid
- * @param $channel_id
- * @return array
- */
- public function getMatchPlan($position_code, $uid, $channel_id)
- {
- $match_plans = [];
- $plans = $this->getAllPlan($position_code);
- if ($plans) {
- $plan_arr = explode(',', $plans);
- foreach ($plan_arr as $k => $ad_id) {
- // $ad_id => 计划ID
- // 这里需要获取用户渠道ID AD:JU:计划id:渠道号
- $redis_key = AdConstants::AD_JU_KEY . $ad_id . $channel_id;
- $uid_str = Redis::instance()->get($redis_key);
- if($uid_str){
- $uid_arr = implode(',', $uid_str);
- if(in_array($uid, $uid_arr)){
- array_push($match_plan, $ad_id);
- }
- }
- }
- }
- return $match_plans;
- }
- /**
- * 第三步:通过计划查找合适的素材
- * @param $position_code 位置编号
- * @param $uid 用户ID
- * @param $channel_id 渠道ID
- * @return array
- */
- public function getMatchAdMaterial($position_code, $uid, $channel_id)
- {
- $matchPlans = $this->getMatchPlan($position_code, $uid, $channel_id);
- $banner_ad_ids = []; //
- $screen_material_ids = []; //插屏
- if ($matchPlans) {
- foreach ($matchPlans as $k => $ad_id) {
- // $ad_id => ad_manage 对应ID
- $redis_key = AdConstants::AD_P_KEY.$ad_id;
- $redis_data = Redis::instance()->get($redis_key);
- if($redis_data){
- $obj = json_decode($redis_data);
- if ($obj->ad_type == '1') {
- //插屏广告
- if ($obj->state) {
- array_push($screen_material_ids, $ad_id);
- }
- } else {
- //Banner广告
- if ($obj->state) {
- array_push($banner_ad_ids, $ad_id);
- }
- }
- }
- }
- }
- $data = [];
- switch ($position_code) {
- case AdConstants::AD_P_XQ:
- //书籍详情页
- $data = $this->_getMultiMaterial($banner_ad_ids,$uid,AdConstants::AD_P_XQ);
- break;
- case AdConstants::AD_P_ZG:
- //追更页
- $data = $this->_getMultiMaterial($banner_ad_ids,$uid,AdConstants::AD_P_ZG);
- break;
- case AdConstants::AD_P_YDYDB:
- //阅读页底部
- $data = $this->_getMultiMaterial($banner_ad_ids,$uid,AdConstants::AD_P_YDYDB);
- break;
- case AdConstants::AD_P_ZJYD:
- //最近阅读
- $data = $this->_getOneMaterial($banner_ad_ids,$uid,AdConstants::AD_P_ZJYD);
- break;
- case AdConstants::AD_P_SJ:
- //书架
- $data = $this->_getOneMaterial($banner_ad_ids,$uid,AdConstants::AD_P_SJ);
- break;
- case AdConstants::AD_P_YDYCD:
- //阅读页顶部菜单下拉
- $data = $this->_getOneMaterial($banner_ad_ids,$uid,AdConstants::AD_P_YDYCD);
- break;
- case AdConstants::AD_P_YDY_ZJ_A:
- //阅读页中间1
- $data = $this->_getOneMaterial($banner_ad_ids,$uid,AdConstants::AD_P_YDY_ZJ_A, 'screen');
- break;
- default:
- //阅读页中间2 AdConstants::AD_P_YDY_ZJ_B
- $data = $this->_getOneMaterial($banner_ad_ids, $uid,AdConstants::AD_P_YDY_ZJ_B,'screen');
- }
- return $data;
- }
- /**
- * 获取单个Banner 素材
- * @param array $banner_ad_ids
- * @param $uid
- * @param string $type
- * @param int $position
- * @return array
- */
- private function _getOneMaterial(array $banner_ad_ids, $uid, $position = 0, $type = 'banner')
- {
- // 打点广告ID
- $dot_ad_ids = implode(',', $banner_ad_ids);
- $rst = [];
- // 从缓存哩取数据
- $data = $this->getMaterial($type);
- if($data){
- $idx = rand(0, count($data)-1);
- $item = $data[$idx];
- $rst = [
- 'material_id' =>$item->id,
- 'img_url' =>$item->img_url,
- 'link_url' =>$item->link_url,
- 'ad_ids' => $dot_ad_ids,
- 'position' => $position,
- 'user_id' => $uid
- ];
- }
- return $rst;
- }
- /**
- * @param array $ad_ids
- * @param $uid
- * @param int $position
- * @param string $type
- * @return array
- */
- private function _getMultiMaterial(array $ad_ids, $uid, $position = 0, $type = 'banner')
- {
- // 打点广告ID
- $dot_ad_ids = implode(',', $ad_ids);
- $rst = [];
- $data = $this->getMaterial($type);
- if (count($data)) {
- for ($i = 0; $i < 3; $i++) {
- $idx = rand(0, count($data) - 1);
- $item = $data[$idx];
- array_push($rst, [
- 'material_id' => $item->id,
- 'img_url' => $item->img_url,
- 'link_url' => $item->link_url,
- 'ad_ids' => $dot_ad_ids,
- 'position' => $position,
- 'user_id' => $uid
- ]);
- }
- }
- return $rst;
- }
- /**
- * @param $type banner | screen
- * @return array
- */
- public function getMaterial($type)
- {
- $rst = [];
- $material_ids = Redis::instance()->get(AdConstants::AD_SC_IDS);
- if ($material_ids) {
- $arr = explode(',', $material_ids);
- foreach ($arr as $k => $id) {
- $material_str = Redis::instance()->get(AdConstants::AD_M_KEY . $id);
- if ($material_str) {
- $obj = json_decode($material_str);
- if ($type == 'banner') {
- if ($obj->ad_type == '0') {
- // Banner广告
- array_push($rst, $obj);
- }
- } else {
- if ($obj->ad_type == '1') {
- //插屏广告
- array_push($rst, $obj);
- }
- }
- }
- }
- }
- return $rst;
- }
- public function getAllAd()
- {
- $rst = [];
- $ad_ids = Redis::instance()->get(AdConstants::AD_P_IDS);
- if ($ad_ids) {
- $arr = explode(',', $ad_ids);
- foreach ($arr as $k => $id) {
- $ad_str = Redis::instance()->get(AdConstants::AD_P_KEY . $id);
- if ($ad_str) {
- $obj = json_decode($ad_str);
- if ($obj->show_starttime <= time() && $obj->show_endtime >= time()) {
- array_push($rst, $obj);
- }
- }
- }
- }
- return $rst;
- }
- }
|