SysAdService.php 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. <?php
  2. namespace App\Ad\Services;
  3. use App\Ad\Models\SysAdModel;
  4. use App\Ad\Models\SysAdPositionModel;
  5. use App\Exceptions\ApiException;
  6. use App\Services\CommonUserBaseService;
  7. use App\Web\Facades\WebFacade;
  8. use Illuminate\Support\Facades\Cache;
  9. class SysAdService extends CommonUserBaseService
  10. {
  11. protected $cache = true;
  12. protected $cacheBucket = 'SysAd:';
  13. protected $sysAdPositionModel;
  14. /**
  15. * WebService construct
  16. * @param SysAdModel $model
  17. * @param SysAdPositionModel $sysAdPositionModel
  18. * */
  19. public function __construct(SysAdModel $model, SysAdPositionModel $sysAdPositionModel)
  20. {
  21. $this->model = $model;
  22. $this->sysAdPositionModel = $sysAdPositionModel;
  23. }
  24. /**
  25. * 广告设置保存
  26. * */
  27. public function saveAd($params){
  28. $data= $this->buildAdData($params);
  29. if(!empty($data['id'])){
  30. $id = $data['id'];
  31. $this->model->where('id','=',$id)->update($data);
  32. } else {
  33. $id = $this->save($data)->id;
  34. }
  35. $this->clearAdCache();
  36. WebFacade::clearPageCache('urla:');
  37. return $id;
  38. }
  39. /**
  40. * 构造广告数据
  41. * */
  42. private function buildAdData($params,$userId = null){
  43. $userId = $userId ?? $this->getAuthUserId();
  44. $add = [];
  45. $nowTime = nowTime();
  46. $add['update_time']=$nowTime;
  47. if(!empty($params['id'])){
  48. $add['id']=$params['id'];
  49. if(isset($params['position_id'])){
  50. $add['position_id'] = $params['position_id'];
  51. if(empty($params['position_id'])){
  52. throw new ApiException(12101);
  53. }
  54. $positionUnique =$this->model->checkPosition($params['position_id'],$params['id']);
  55. if (!$positionUnique) {
  56. throw new ApiException(12102);
  57. }
  58. }
  59. if(isset($params['ad_title'])){
  60. $add['ad_title'] = empty($params['ad_title'])?'':$params['ad_title'];
  61. }
  62. if(isset($params['ad_file'])){
  63. $add['ad_file'] = empty($params['ad_file'])?'':$params['ad_file'];
  64. }
  65. if(isset($params['ad_description'])){
  66. $add['ad_description'] = empty($params['ad_description'])?'':json_encode($params['ad_description']);
  67. }
  68. if(isset($params['start_time'])){
  69. if(!empty($params['start_time'])){
  70. $add['start_time']= $params['start_time'];
  71. }
  72. }
  73. if(isset($params['end_time'])){
  74. if(!empty($params['end_time'])){
  75. $add['end_time']= $params['end_time'];
  76. }
  77. }
  78. if(isset($params['ad_link'])){
  79. $add['ad_link'] = empty($params['ad_link'])?'':$params['ad_link'];
  80. }
  81. if(isset($params['ad_link_type'])){
  82. $add['ad_link_type'] = empty($params['ad_link_type'])?0:$params['ad_link_type'];
  83. }
  84. if(isset($params['ad_script'])){
  85. $add['ad_script'] = empty($params['ad_script'])?'':$params['ad_script'];
  86. }
  87. if(isset($params['form_id'])){
  88. $add['form_id'] = empty($params['form_id'])?0:$params['form_id'];
  89. }
  90. if(isset($params['type'])){
  91. $add['type'] = empty($params['type'])?0:$params['type'];
  92. }
  93. if(isset($params['status'])){
  94. $add['status'] = empty($params['status'])?0:$params['status'];
  95. }
  96. if(isset($params['remark'])){
  97. $add['remark'] = empty($params['remark'])?'':$params['remark'];
  98. }
  99. if(isset($params['hit_num'])){
  100. $add['hit_num'] = empty($params['hit_num'])?0:$params['hit_num'];
  101. }
  102. if(isset($params['hit_click_num'])){
  103. $add['hit_click_num'] = empty($params['hit_click_num'])?0:$params['hit_click_num'];
  104. }
  105. if(isset($params['push_num'])){
  106. $add['push_num'] = empty($params['push_num'])?0:$params['push_num'];
  107. }
  108. }else{
  109. $add['position_id'] = empty($params['position_id'])?0:$params['position_id'];
  110. if(empty($params['position_id'])){
  111. throw new ApiException(12101);
  112. }
  113. $positionUnique =$this->model->checkPosition($params['position_id']);
  114. if (!$positionUnique) {
  115. throw new ApiException(12102);
  116. }
  117. $add['ad_title'] = empty($params['ad_title'])?'':$params['ad_title'];
  118. $add['ad_file'] = empty($params['ad_file'])?'':$params['ad_file'];
  119. $add['ad_description'] = empty($params['ad_description'])?'':json_encode($params['ad_description']);
  120. $add['ad_link'] = empty($params['ad_link'])?'':$params['ad_link'];
  121. $add['ad_link_type'] = empty($params['ad_link_type'])?0:$params['ad_link_type'];
  122. $add['ad_script'] = empty($params['ad_script'])?'':$params['ad_script'];
  123. $add['form_id'] = empty($params['form_id'])?0:$params['form_id'];
  124. $add['type'] = empty($params['type'])?0:$params['type'];
  125. $add['hit_num'] = empty($params['hit_num'])?0:$params['hit_num'];
  126. $add['hit_click_num'] = empty($params['hit_click_num'])?0:$params['hit_click_num'];
  127. $add['push_num'] = empty($params['push_num'])?0:$params['push_num'];
  128. $add['create_time'] = $nowTime;
  129. if(!empty($params['start_time'])){
  130. $add['start_time']= $params['start_time'];
  131. }
  132. if(!empty($params['end_time'])){
  133. $add['end_time']= $params['end_time'];
  134. }
  135. $add['user_id']=$userId;
  136. }
  137. return $add;
  138. }
  139. /**
  140. * 获取广告列表
  141. */
  142. public function getAdList($params)
  143. {
  144. $list = $this->model->getAdList($params);
  145. return $list;
  146. }
  147. /**
  148. * 获取详情
  149. */
  150. public function getAdInfo($id)
  151. {
  152. $fields = "a.*";
  153. $info = $this->findOneById($id, $fields);
  154. if (!empty($info['id'])) {
  155. $info['ad_title'] = json_decode($info['ad_title'], true)[0];
  156. $info['ad_description'] = json_decode($info['ad_description'], true)[0];
  157. $info['ad_script'] = json_decode($info['ad_script'], true);
  158. }
  159. return $info;
  160. }
  161. /**
  162. * 广告点击
  163. */
  164. public function adClick($id)
  165. {
  166. return $this->incrementBy([
  167. "id" => $id
  168. ], "hit_click_num");
  169. }
  170. /**
  171. * 根据广告位编号
  172. */
  173. public function getAdPositionList($params)
  174. {
  175. $list = $this->sysAdPositionModel->getAdPositionList($params);
  176. $data=!empty($list['data'])?$list['data']:[];
  177. foreach ($data as $adPositionItem){
  178. $adPositionItem['route_path_key']=json_decode($adPositionItem['route_path_key']);
  179. }
  180. $list['data']=$data;
  181. return $list;
  182. }
  183. /**
  184. * 获取所有已发布的广告
  185. * */
  186. public function getPublishAdData(){
  187. $data=$this->getCacheAdData();
  188. if(empty($data)){
  189. $params=[];
  190. $params['status']=0;
  191. $params['page_size']=999;
  192. $list = $this->model->getAdList($params);
  193. if(!empty($list['data'])){
  194. $data= $list['data'];
  195. $this->setAdCache($data);
  196. }
  197. }
  198. return $data;
  199. }
  200. /**
  201. * 获取页面详情
  202. * @return array
  203. */
  204. public function getCacheAdData()
  205. {
  206. $key = $this->getCacheAdKey();
  207. return Cache::get($key);
  208. }
  209. /**
  210. * 获取广告缓存key
  211. * @param $urla
  212. * @return string
  213. */
  214. private function getCacheAdKey()
  215. {
  216. $pageParamsStr = 'web-ad-list:' . md5('web-ad-list');
  217. return $this->cacheBucket . $pageParamsStr;
  218. }
  219. /**
  220. * 缓存广告数据
  221. * @param array $adData
  222. */
  223. private function setAdCache($adData)
  224. {
  225. Cache::put($this->getCacheAdKey(), $adData, config('cache.page_time'));
  226. }
  227. /**
  228. * 清除广告数据缓存
  229. * */
  230. public function clearAdCache()
  231. {
  232. $this->removeByKey('web-ad-list');
  233. }
  234. /**
  235. * 获取页面广告数据
  236. * */
  237. public function getPageAdData($routePathKey){
  238. $retData=[];
  239. $adData=$this->getPublishAdData();
  240. if (!empty($adData)) {
  241. foreach ($adData as $value){
  242. if(!empty($value['route_path_key'])){
  243. $routePathKeyArray=json_decode($value['route_path_key'],true);
  244. if(in_array($routePathKey,$routePathKeyArray)){
  245. $retData[]= $value;
  246. }
  247. }
  248. }
  249. }
  250. return $retData;
  251. }
  252. }