Przeglądaj źródła

add - 师傅派单距离列表

liugc 1 rok temu
rodzic
commit
018e471588
1 zmienionych plików z 95 dodań i 16 usunięć
  1. 95 16
      app/adminapi/lists/master_worker/MasterWorkerLists.php

+ 95 - 16
app/adminapi/lists/master_worker/MasterWorkerLists.php

@@ -18,6 +18,7 @@ namespace app\adminapi\lists\master_worker;
 use app\adminapi\lists\BaseAdminDataLists;
 use app\common\model\master_worker\MasterWorker;
 use app\common\lists\ListsSearchInterface;
+use app\common\model\works\ServiceWork;
 use think\db\Query;
 
 /**
@@ -27,7 +28,7 @@ use think\db\Query;
  */
 class MasterWorkerLists extends BaseAdminDataLists implements ListsSearchInterface
 {
-
+    public $count = 0;
 
     /**
      * @notes 设置搜索条件
@@ -74,19 +75,55 @@ class MasterWorkerLists extends BaseAdminDataLists implements ListsSearchInterfa
      */
     public function lists(): array
     {
-         return MasterWorker::alias('mw')
-            ->join('master_worker_register mwr', 'mwr.worker_id = mw.id')
-            ->where($this->searchWhere)
-            ->where($this->queryWhere())
-             ->field([
-                 'mw.*',
-                 'mwr.maintain_exp_type',
-                 'mwr.other_exp_type',
-             ])
-            ->limit($this->limitOffset, $this->limitLength)
-            ->order(['mw.id' => 'desc'])
-            ->select()
-            ->toArray();
+        $customer_lon = 0;
+        $customer_lat = 0;
+        if(isset($this->params['order_id']) && $this->params['order_id']){
+            $lon_lat = (ServiceWork::where('id',$this->params['order_id'])->column("lon,lat"))[0];
+            $customer_lon = $lon_lat['lon'];
+            $customer_lat = $lon_lat['lat'];
+        }
+        // 无人在0,0坐标上
+        if($customer_lon && $customer_lat){
+            // 查出所有的师傅 -> 计算距离 -> 按距离排序 -> 分页
+            $allList = MasterWorker::alias('mw')
+                ->join('master_worker_register mwr', 'mwr.worker_id = mw.id')
+                ->where($this->searchWhere)
+                ->where($this->queryWhere())
+                ->field([
+                    'mw.*',
+                    'mwr.maintain_exp_type',
+                    'mwr.other_exp_type',
+                ])
+                //->limit($this->limitOffset, $this->limitLength)
+                ->order(['mw.id' => 'desc'])
+                ->select()
+                ->toArray();
+            $allList = array_column($allList, null, 'id');
+            $mastersDistances = $this->mastersDistance($allList,$customer_lon,$customer_lat);
+            $list = $this->limitPage($allList,$mastersDistances,$this->params['page_no']??1,$this->params['page_size']??10);
+            $this->count = count($allList);
+        }else{
+            $list = MasterWorker::alias('mw')
+                ->join('master_worker_register mwr', 'mwr.worker_id = mw.id')
+                ->where($this->searchWhere)
+                ->where($this->queryWhere())
+                ->field([
+                    'mw.*',
+                    'mwr.maintain_exp_type',
+                    'mwr.other_exp_type',
+                ])
+                ->limit($this->limitOffset, $this->limitLength)
+                ->order(['mw.id' => 'desc'])
+                ->select()
+                ->toArray();
+            $this->count = MasterWorker::alias('mw')
+                ->join('master_worker_register mwr', 'mwr.worker_id = mw.id')
+                ->field([
+                    'mw.*'])
+                ->where($this->searchWhere)->where($this->queryWhere())
+                ->count();
+        }
+        return $list;
     }
 
 
@@ -98,12 +135,54 @@ class MasterWorkerLists extends BaseAdminDataLists implements ListsSearchInterfa
      */
     public function count(): int
     {
-        return MasterWorker::alias('mw')
+        /*return MasterWorker::alias('mw')
             ->join('master_worker_register mwr', 'mwr.worker_id = mw.id')
             ->field([
                 'mw.*'])
             ->where($this->searchWhere)->where($this->queryWhere())
-            ->count();
+            ->count();*/
+        return $this->count;
+    }
+
+
+    private function limitPage($allList,$data,$page,$itemsPerPage)
+    {
+        $startIndex = (($page??1) - 1) * $itemsPerPage;
+        $currentPageData = array_slice($data, $startIndex, $itemsPerPage, true);
+        $lon_lat_masters = [];
+        foreach ($currentPageData as $key => $value){
+            $lon_lat_masters[$key] = $allList[$key];
+            $lon_lat_masters[$key]['user_distance'] = number_format($value,2);
+        }
+        return $lon_lat_masters?array_values($lon_lat_masters):[];
+    }
+    private function mastersDistance($masters,$customer_lon,$customer_lat)
+    {
+        $nearbyMasters = [];
+        foreach ($masters as $master) {
+            $distance = $this->haversineDistance($customer_lat, $customer_lon, $master['lat'], $master['lon']);
+            $nearbyMasters[$master['id']] = $distance;
+            /*if ($distance <= 10000) { // 距离小于或等于10公里
+                $nearbyMasters[] = $master;
+            }*/
+        }
+        asort($nearbyMasters);
+        return $nearbyMasters;
+    }
+    private function haversineDistance($lat1, $lon1, $lat2, $lon2) {
+        $lat1 = deg2rad($lat1);
+        $lon1 = deg2rad($lon1);
+        $lat2 = deg2rad($lat2);
+        $lon2 = deg2rad($lon2);
+
+        $dlon = $lon2 - $lon1;
+        $dlat = $lat2 - $lat1;
+        $a = sin($dlat / 2)**2 + cos($lat1) * cos($lat2) * sin($dlon / 2)**2;
+        $c = 2 * asin(sqrt($a));
+        $r = 6371; // 地球平均半径,单位为公里
+        $distance = $c * $r;
+
+        return $distance;
     }
 
 }