groupBy('ad_position_id')->all(); foreach ($positions as $position) { // 相关变量获取 $positionId = getProp($position, 'id'); $ident = getProp($position, 'ident'); // 获取优先级最高的任务 $validDispatches = getProp($dispatches, $positionId, []); $validDispatch = $validDispatches ? $validDispatches[0] : []; if (empty($validDispatch)) { continue; } // 过滤条件判断 $filterContentJson = getProp($validDispatch, 'filter_condition'); $matchFilter = $this->filterDispatch($uid, $filterContentJson); if (!$matchFilter) { continue; } // 添加到数据中 $result[$ident][] = $this->buildPositionData($validDispatch, $position); } return $result; } /** * 过滤条件筛选 * @param $uid * @param $filterContentJson * @return bool */ private function filterDispatch($uid, $filterContentJson): bool { // 过滤条件 $filterContent = json_decode($filterContentJson, true); if (empty($uid) || empty($filterContentJson) || empty($filterContent)) { return true; } // 判断注册时间 $registerFilter = true; $registerAtArr = getProp($filterContent, 'registerAt'); if ($registerAtArr) { // 默认值 $registerFilter = false; // 获取用户信息 $user = QappUser::getUserByUid($uid); $registerAt = getProp($user, 'created_at'); $registerUnix = strtotime($registerAt); // 循环条件,满足一条即可 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') !== '') { // 获取用户付费情况 $order = OrderService::getUserLastestOrder($uid); // 有付费 if ($order && getProp($filterContent, 'isPaid') === 1) { $paidFilter = true; } // 未付费 if (!$order && 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)[] ]; } }