AdPositionService.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <?php
  2. namespace App\Modules\AdPosition\Services;
  3. use App\Libs\Singleton;
  4. use App\Modules\AdPosition\Models\AdPosition;
  5. use App\Modules\AdPosition\Models\AdPositionDispatch;
  6. use App\Modules\Trade\Services\OrderService;
  7. use App\Modules\User\Models\QappUser;
  8. class AdPositionService
  9. {
  10. use Singleton;
  11. /**
  12. * @param $uid
  13. * @param $accountId
  14. * @return array
  15. */
  16. public function getAdPositions($uid, $accountId): array
  17. {
  18. // 获取广告位
  19. $positions = AdPosition::getAllValidAdPositions();
  20. if (empty($positions)) {
  21. return [];
  22. }
  23. // 获取广告位分配信息
  24. $positionIds = array_column($positions, 'id');
  25. $dispatches = AdPositionDispatch::getValidPositionDispatches($positionIds, $accountId);
  26. if (empty($dispatches)) {
  27. return [];
  28. }
  29. // 针对分配数据筛选出优先级最高的分配任务
  30. $result = [];
  31. $dispatches = collect($dispatches)->groupBy('ad_position_id')->all();
  32. foreach ($positions as $position) {
  33. // 相关变量获取
  34. $positionId = getProp($position, 'id');
  35. $ident = getProp($position, 'ident');
  36. $filterContentJson = getProp($position, 'filter_condition');
  37. // 获取优先级最高的任务
  38. $validDispatches = getProp($dispatches, $positionId, []);
  39. $validDispatch = $validDispatches ? $validDispatches[0] : [];
  40. if (empty($validDispatch)) {
  41. continue;
  42. }
  43. // 过滤条件判断
  44. $matchFilter = $this->filterDispatch($uid, $filterContentJson);
  45. if (!$matchFilter) {
  46. continue;
  47. }
  48. // 添加到数据中
  49. $result[$ident][] = $this->buildPositionData($validDispatch);
  50. }
  51. return $result;
  52. }
  53. /**
  54. * 过滤条件筛选
  55. * @param $uid
  56. * @param $filterContentJson
  57. * @return bool
  58. */
  59. private function filterDispatch($uid, $filterContentJson): bool
  60. {
  61. // 过滤条件
  62. $filterContent = json_decode($filterContentJson, true);
  63. if (empty($uid) || empty($filterContentJson) || empty($filterContent)) {
  64. return true;
  65. }
  66. // 判断注册时间
  67. $registerFilter = false;
  68. $registerAtArr = getProp($filterContent, 'registerAt');
  69. if ($registerAtArr) {
  70. // 获取用户信息
  71. $user = QappUser::getUserByUid($uid);
  72. $registerAt = getProp($user, 'created_at');
  73. $registerUnix = strtotime($registerAt);
  74. // 循环条件,满足一条即可
  75. foreach ($registerAtArr as $register) {
  76. $unit = getProp($register, 'unit');
  77. $range = getProp($register, 'range');
  78. sort($range);
  79. [$min, $max] = $range;
  80. $startUnix = strtotime('-' . $max . ' ' . $unit);
  81. $endUnix = strtotime('-' . $min . ' ' . $unit);
  82. if ($registerUnix >= $startUnix && $registerUnix <= $endUnix) {
  83. $registerFilter = true;
  84. break;
  85. }
  86. }
  87. }
  88. // 判断付费情况
  89. $paidFilter = false;
  90. if (isset($filterContent['isPaid'])) {
  91. // 获取用户付费情况
  92. $order = OrderService::getUserLastestOrder($uid);
  93. // 有付费
  94. if ($order && $filterContent['isPaid']) {
  95. $paidFilter = true;
  96. }
  97. // 未付费
  98. if (!$order && !$filterContent['isPaid']) {
  99. $paidFilter = true;
  100. }
  101. }
  102. // 两者如有一个不满足条件则不展示
  103. if (!$registerFilter || !$paidFilter) {
  104. return false;
  105. }
  106. return true;
  107. }
  108. /**
  109. * 返回可显示数据
  110. * @param $param
  111. * @return array
  112. */
  113. private function buildPositionData($param): array
  114. {
  115. if (empty($param)) {
  116. return [];
  117. }
  118. // 链接做特殊处理
  119. $url = getProp($param, 'link_url');
  120. $urlArr = parse_url($url);
  121. parse_str(getProp($urlArr, 'query'), $queryArr);
  122. return [
  123. 'img' => getProp($param, 'image_url'),
  124. 'url' => getProp($urlArr, 'path'),
  125. 'title' => getProp($param, 'title'),
  126. 'params' => $queryArr ?: (object)[]
  127. ];
  128. }
  129. }