123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- <?php
- namespace App\Modules\AdPosition\Services;
- use App\Libs\Singleton;
- use App\Modules\AdPosition\Models\AdPosition;
- use App\Modules\AdPosition\Models\AdPositionDispatch;
- use App\Modules\Trade\Services\OrderService;
- use App\Modules\User\Models\QappUser;
- class AdPositionService
- {
- use Singleton;
- /**
- * @param $uid
- * @param $accountId
- * @return array
- */
- public function getAdPositions($uid, $accountId): array
- {
- // 参数判断
- if (empty($uid) || empty($accountId)) {
- return [];
- }
- // 获取所有有效广告位
- $positions = AdPosition::getAllValidAdPositions();
- if (empty($positions)) {
- return [];
- }
- // 获取广告位分配信息
- $positionIds = array_column($positions, 'id');
- $dispatches = AdPositionDispatch::getValidPositionDispatches($positionIds, $accountId);
- if (empty($dispatches)) {
- return [];
- }
- // 获取用户相关数据
- $userData = $this->getUserFilterData($uid);
- // 针对分配数据筛选出优先级最高的分配任务
- $result = [];
- $dispatches = collect($dispatches)->groupBy('ad_position_id')->all();
- foreach ($positions as $position) {
- // 相关变量获取
- $positionId = getProp($position, 'id');
- $ident = getProp($position, 'ident');
- // 获取对应广告位所有任务
- $validDispatches = getProp($dispatches, $positionId, []);
- if (empty($validDispatches)) {
- continue;
- }
- // 根据优先级循环匹配,直到匹配到为止
- $validDispatches = collect($validDispatches)->sortByDesc('priority')->all();
- $validDispatch = [];
- foreach ($validDispatches as $value) {
- // 过滤条件判断
- $filterContentJson = getProp($value, 'filter_condition');
- $matchFilter = $this->filterDispatch($filterContentJson, $userData);
- if ($matchFilter) {
- $validDispatch = $value;
- break;
- }
- }
- // 判断
- if (empty($validDispatch)) {
- continue;
- }
- // 添加到数据中
- $result[$ident][] = $this->buildPositionData($validDispatch, $position);
- }
- return $result;
- }
- /**
- * 用户的数据
- * @param $uid
- * @return array
- */
- private function getUserFilterData($uid): array
- {
- // 获取用户信息
- $user = QappUser::getUserByUid($uid);
- $registerAt = getProp($user, 'created_at');
- $registerUnix = strtotime($registerAt);
- // 获取用户付费情况
- $order = OrderService::getUserLastestOrder($uid);
- $isPaid = $order ? 1 : 0;
- return compact('registerUnix', 'isPaid');
- }
- /**
- * 过滤条件筛选
- * @param $filterContentJson
- * @param $userData
- * @return bool
- */
- private function filterDispatch($filterContentJson, $userData): bool
- {
- // 过滤条件
- $filterContent = json_decode($filterContentJson, true);
- if (empty($userData) || empty($filterContentJson) || empty($filterContent)) {
- return true;
- }
- // 判断注册时间
- $registerFilter = true;
- $registerAtArr = getProp($filterContent, 'registerAt');
- if ($registerAtArr) {
- // 默认值
- $registerFilter = false;
- $registerUnix = $userData['registerUnix'];
- // 循环条件,满足一条即可
- foreach ($registerAtArr as $register) {
- $unit = getProp($register, 'unit');
- $range = getProp($register, 'range');
- sort($range);
- [$min, $max] = $range;
- $startUnix = strtotime('-' . $max . ' ' . $unit);
- $endUnix = strtotime('-' . $min . ' ' . $unit);
- if ($registerUnix >= $startUnix && $registerUnix <= $endUnix) {
- $registerFilter = true;
- break;
- }
- }
- }
- // 判断付费情况
- $paidFilter = true;
- if (getProp($filterContent, 'isPaid') !== '') {
- // 获取用户付费情况
- $isPaid = getProp($userData, 'isPaid', 0);
- // 有付费
- if ($isPaid && getProp($filterContent, 'isPaid') === 1) {
- $paidFilter = true;
- }
- // 未付费
- if (!$isPaid && getProp($filterContent, 'isPaid') === 0) {
- $paidFilter = true;
- }
- }
- // 两者全部满足条件才可展示
- return $registerFilter && $paidFilter;
- }
- /**
- * 返回可显示数据
- * @param $validDispatch
- * @param $position
- * @return array
- */
- private function buildPositionData($validDispatch, $position): array
- {
- if (empty($validDispatch)) {
- return [];
- }
- // 链接做特殊处理
- $url = getProp($validDispatch, 'link_url');
- $urlArr = parse_url($url);
- parse_str(getProp($urlArr, 'query'), $queryArr);
- // 广告位图片
- $image = getProp($validDispatch, 'image_url');
- if (empty($image)) {
- $image = getProp($position, 'default_img');
- }
- return [
- 'img' => $image,
- 'url' => getProp($urlArr, 'path'),
- 'title' => getProp($validDispatch, 'title'),
- 'params' => $queryArr ?: (object)[]
- ];
- }
- }
|