Panda 2 週間 前
コミット
7c9580403b

+ 36 - 2
application/api/controller/OfflineShop.php

@@ -25,12 +25,46 @@ class OfflineShop extends Api
         return $this->success('success',DataUtil::recursion($list,'id','pid'));
     }
 
+    // 商铺列表
     public function list()
     {
         $params = $this->request->param();
-        $params['category'] = 0;// 仅查询线下门店
+        $userLng = $this->auth->lng;
+        $userLat = $this->auth->lat;
         $model = new OfflineShopModel();
-        $list = $model->getList(params: $params,orderBy: ['weigh' => 'desc']);
+        $select = ['id', 'type_id', 'type_ids', 'name', 'image', 'lng', 'lat', 'address', 'telephone', 'star', 'sales'];
+        $orderBy = [];
+        if (!empty($userLng) && !empty($userLat)) {
+            $select[] = Db::raw("(st_distance(point ({$userLng}, {$userLat}),point(lng,lat))*111195) as distance");
+            !empty($params['distance']) && $params['distance'] = $params['distance'] * 1000;
+        }
+        if (!empty($this->auth->city)) {
+            $params['city'] = $this->auth->city;
+        }
+        if (isset($params['rank_type'])) {
+            switch ($params['rank_type']) {
+                case 1:
+                    $orderBy['star'] = 'desc';
+                    break;
+                case 2:
+                    $orderBy['sales'] = 'desc';
+                    break;
+                case 3:
+                    if (!empty($userLng) && !empty($userLat)) {
+                        $orderBy['distance'] = 'asc';
+                    }
+                    break;
+                default:
+                    if (!empty($userLng) && !empty($userLat)) {
+                        $orderBy['distance'] = 'asc';
+                    }
+                    $orderBy['star'] = 'desc';
+                    $orderBy['sales'] = 'desc';
+                    break;
+            }
+        }
+
+        $list = $model->getList(params: $params,orderBy: array_merge($orderBy,['weigh' => 'desc']),select: $select);
         return $this->success('success',$list);
     }
 }

+ 11 - 0
application/api/controller/User.php

@@ -54,6 +54,17 @@ class User extends Api
         }
     }
 
+    public function setCoord()
+    {
+        $params = $this->request->param();
+        $data = [];
+        !empty($params['city']) && $data['city'] = $params['city'];
+        !empty($params['lng']) && $data['lng'] = $params['lng'];
+        !empty($params['lat']) && $data['lat'] = $params['lat'];
+        !empty($data) && Db::name('user')->where('id',$this->auth->id)->update($data);
+        return $this->success('获取坐标成功');
+    }
+
     /**
      * 手机验证码登录
      *

+ 21 - 5
application/common/model/OfflineShopModel.php

@@ -32,20 +32,28 @@ class OfflineShopModel extends BaseModel
         '*'
     ];
 
-    public function searchCategoryAttribute($query, $value, array $params)
+    public function searchTypeIdAttribute($query, $value, array $params)
     {
-        if (!in_array($value,[0,1,2,3])) {
+        if (empty($value)) {
             return $query;
         }
-        return $query->where('category', $value);
+        return $query->where('type_id', $value);
     }
 
-    public function searchTypeIdAttribute($query, $value, array $params)
+    public function searchKeywordAttribute($query, $value, array $params)
     {
         if (empty($value)) {
             return $query;
         }
-        return $query->where('type_id', $value);
+        return $query->where('name|keyword','like', "%{$value}%");
+    }
+
+    public function searchCityAttribute($query, $value, array $params)
+    {
+        if (empty($value)) {
+            return $query;
+        }
+        return $query->where('city','like', "%{$value}%");
     }
 
     public function searchTypeIdsAttribute($query, $value, array $params)
@@ -55,4 +63,12 @@ class OfflineShopModel extends BaseModel
         }
         return $query->whereRaw("FIND_IN_SET({$value},`type_ids`)");
     }
+
+    public function searchDistanceAttribute($query, $value, array $params)
+    {
+        if (empty($value)) {
+            return $query;
+        }
+        return $query->having("distance < {$value}");
+    }
 }