AdPositionService.php 4.8 KB

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