ソースを参照

add - 多边区域、工单限制

liugc 1 年間 前
コミット
a1c2c4f0b7

+ 1 - 1
app/adminapi/lists/service_area/ServiceAreaLists.php

@@ -57,7 +57,7 @@ class ServiceAreaLists extends BaseAdminDataLists implements ListsSearchInterfac
     public function lists(): array
     {
         return ServiceArea::where($this->searchWhere)
-            ->field(['id', 'province', 'city','county', 'area_name', 'service_name', 'lon', 'lat', 'distance'])
+            ->field(['id', 'province', 'city','county', 'area_name', 'service_name', 'lon', 'lat', 'distance','electronic_fence'])
             ->limit($this->limitOffset, $this->limitLength)
             ->order(['id' => 'desc'])
             ->select()

+ 8 - 6
app/adminapi/logic/service_area/ServiceAreaLogic.php

@@ -46,9 +46,10 @@ class ServiceAreaLogic extends BaseLogic
                 'county' => $params['county'],
                 'area_name' => $params['area_name'],
                 'service_name' => $params['service_name'],
-                'lon' => $params['lon'],
-                'lat' => $params['lat'],
-                'distance' => $params['distance'],
+                'lon' => $params['electronic_fence'][0][0][0]??0,
+                'lat' => $params['electronic_fence'][0][0][1]??0,
+                'distance' => $params['distance']??0,
+                'electronic_fence' => $params['electronic_fence'],
             ]);
 
             Db::commit();
@@ -78,9 +79,10 @@ class ServiceAreaLogic extends BaseLogic
                 'county' => $params['county'],
                 'area_name' => $params['area_name'],
                 'service_name' => $params['service_name'],
-                'lon' => $params['lon'],
-                'lat' => $params['lat'],
-                'distance' => $params['distance'],
+                'lon' => $params['electronic_fence'][0][0][0]??0,
+                'lat' => $params['electronic_fence'][0][0][1]??0,
+                'distance' => $params['distance']??0,
+                'electronic_fence' => json_encode($params['electronic_fence']?:[]),
             ]);
 
             Db::commit();

+ 2 - 2
app/adminapi/validate/service_area/ServiceAreaValidate.php

@@ -64,7 +64,7 @@ class ServiceAreaValidate extends BaseValidate
      */
     public function sceneAdd()
     {
-        return $this->only(['province','city','lon','lat','distance']);
+        return $this->only(['province','city']);
     }
 
 
@@ -76,7 +76,7 @@ class ServiceAreaValidate extends BaseValidate
      */
     public function sceneEdit()
     {
-        return $this->only(['id','province','city','lon','lat','distance']);
+        return $this->only(['id','province','city']);
     }
 
 

+ 10 - 9
app/api/logic/ServiceOrderLogic.php

@@ -51,16 +51,17 @@ class ServiceOrderLogic extends BaseLogic
     public static function isService($params):array
     {
         // 查询服务区所有的地点
-        $rules = ServiceArea::column('*','id');
+        $rules = ServiceArea::field(['id', 'province', 'city','county', 'area_name', 'electronic_fence'])->select()->toArray();
+        $point=['lng'=> $params['lat'],'lat'=> $params['lon']];
         foreach ($rules as $value){
-            $distance = round(DistributeLeafletsService::haversineDistance($params['lat'], $params['lon'], $value['lat'], $value['lon']), 2);
-            if($distance <= (float)$value['distance']){
-                return [
-                    'province'=>$value['province'],
-                    'city'=>$value['city'],
-                    'county'=>$value['county'],
-                    'area_name'=>$value['area_name']
-                ];
+            foreach ($value['electronic_fence'] as $polygon) {
+                if (isPointInPolygon($point, $polygon)) {
+                    return [
+                        'city'=>$value['city'],
+                        'county'=>$value['county'],
+                        'area_name'=>$value['area_name']
+                    ];
+                }
             }
         }
         throw new Exception('已超出服务区域!');

+ 25 - 0
app/common.php

@@ -455,3 +455,28 @@ function generateRandomString($length = 8,$basic_method = 4) {
     }
     return $randomString;
 }
+/**
+ * 判断点是否在多边形内
+ * @param $point
+ * @param $polygon
+ * @return bool
+ */
+function isPointInPolygon($point, $polygon) {
+    $x = $point['lng'];
+    $y = $point['lat'];
+    $inside = false;
+    $j = count($polygon) - 1;
+    for ($i = 0; $i < count($polygon); $i++) {
+        $xi = $polygon[$i][0];
+        $yi = $polygon[$i][1];
+        $xj = $polygon[$j][0];
+        $yj = $polygon[$j][1];
+        $intersect = (($yi > $y) != ($yj > $y))
+            && ($x < ($xj - $xi) * ($y - $yi) / ($yj - $yi) + $xi);
+        if ($intersect) {
+            $inside = !$inside;
+        }
+        $j = $i;
+    }
+    return $inside;
+}

+ 4 - 1
app/common/model/service_area/ServiceArea.php

@@ -28,7 +28,10 @@ class ServiceArea extends BaseModel
 {
     
     protected $name = 'service_area';
-    
+
+    protected $type = [
+        'electronic_fence' => 'array',
+    ];
 
     
 }