96 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			PHP
		
	
	
| <?php
 | |
| namespace app\controller\api;
 | |
| 
 | |
| use app\model\CouponMain;
 | |
| use app\repository\CouponRepository;
 | |
| use think\Collection;
 | |
| use think\response\Json;
 | |
| 
 | |
| /**
 | |
|  * 消费者端:游客、普通用户
 | |
|  *
 | |
|  * Class Consumer
 | |
|  * @package app\controller\api
 | |
|  */
 | |
| class Consumer extends Base
 | |
| {
 | |
|     protected $noNeedLogin = [
 | |
|         'home',
 | |
|     ];
 | |
| 
 | |
|     /**
 | |
|      * 获取附近商家发布的优惠卷
 | |
|      * @return Json
 | |
|      */
 | |
|     public function home()
 | |
|     {
 | |
|         $params = [
 | |
|             'businessType'  => $this->request->param('businessType/d', 0), // 商家类型
 | |
|             'couponType'    => $this->request->param('couponType/d', 0), // 优惠卷类型
 | |
|             'dis'           => $this->request->param('dis/d', -1), // 距离,单位为km
 | |
|             'lng'           => $this->request->param('lng/f', 0), // 经度 104.752890
 | |
|             'lat'           => $this->request->param('lat/f', 0), // 纬度 31.465040
 | |
|             'keyword'       => $this->request->param('key/s', ''), // 关键词查询
 | |
|             'page'          => $this->request->param('page/d', 1),
 | |
|             'size'          => $this->request->param('size/d', 10),
 | |
|         ];
 | |
| 
 | |
| 
 | |
|         try {
 | |
|             $repo   = CouponRepository::getInstance();
 | |
|             $nowDate    = date('Y-m-d H:i:s');
 | |
|             $sumPoint   = $params['lng'] + $params['lat'];
 | |
| 
 | |
|             $lngRange   = [];
 | |
|             $latRange   = [];
 | |
|             $whereMap   = [];
 | |
|             $sortOrder  = ['dislatlng'=> 'asc', 'start_time'=>'asc'];
 | |
| 
 | |
|             $whereMap[] = ['status', '=', CouponMain::status_on];
 | |
|             $whereMap[] = ['on_shelf', '=', CouponMain::on_shelf_on];
 | |
|             $whereMap[] = ['start_time', '> TIME', $nowDate];
 | |
|             $whereMap[] = ['end_time', '< TIME', $nowDate];
 | |
|             $whereMap[] = ['using_count', '>', 0];
 | |
|             if (!empty($params['keyword'])) {
 | |
|                 $whereMap[] = ['name', 'like', "%{$params['keyword']}%"];
 | |
|             }
 | |
|             if ($params['businessType'] > 0) {
 | |
|                 $whereMap[] = ['business_type', '=', $params['businessType']];
 | |
|             }
 | |
|             if ($params['couponType'] > 0) {
 | |
|                 $whereMap[] = ['type', '=', $params['couponType']];
 | |
|             }
 | |
| 
 | |
|             if ($params['dis'] > 0) {
 | |
|                 $pointList = getEarthSquareRangePoint($params['lat'],$params['lng'], $params['dis']);
 | |
|                 $latRange[]   = ['lat', 'BETWEEN', [$pointList['lat_min'], $pointList['lat_max']]];
 | |
|                 if (abs($pointList['cur_lng'] - $pointList['lng_min']) != $pointList['dis_lng'] && $pointList['lng_min'] < 0) {
 | |
|                     $lngRange[] = ['lng', 'BETWEEN' , [-180, $pointList['lng_min']]];
 | |
|                     $lngRange[] = ['lng', 'BETWEEN' , [($pointList['cur_lng'] - $pointList['dis_lng']), 180]];
 | |
|                 } else {
 | |
|                     $lngRange[] = ['lng', 'BETWEEN' , [$pointList['lng_min'], $pointList['lng_max']]];
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             $res    = $repo->findCouponMainList($whereMap, [], $params['page'], $params['size'], function ($q) use($lngRange, $latRange, $sumPoint) {
 | |
|                     return $q->when(!empty($lngRange) && !empty($latRange), function($query) use($lngRange, $latRange){
 | |
|                         $query->where(function ($queryB) use($lngRange) {
 | |
|                             $queryB->whereOr($lngRange);
 | |
|                         })->where($latRange);
 | |
|                     })
 | |
|                     ->field("*, abs(IFNULL(lat,0) + IFNULL(lng,0) - {$sumPoint})as dislatlng");
 | |
|             }, $sortOrder);
 | |
| 
 | |
|             return $this->json(0, 'success', $res);
 | |
|         } catch (\Exception $e) {
 | |
|             return $this->json(0, 'success', [
 | |
|                 "total" => 0,
 | |
|                 "current" => $params['page'],
 | |
|                 "size" => $params['size'],
 | |
|                 "list" => new Collection()
 | |
|             ]);
 | |
|         }
 | |
| 
 | |
|     }
 | |
| 
 | |
| } |