$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() ]); } } }