Просмотр исходного кода

add - 服务区域管理 / 下单需在配置的距离范围内

liugc 1 год назад
Родитель
Сommit
2d54b90de9

+ 2 - 2
app/adminapi/lists/master_worker/MasterWorkerRuleLists.php

@@ -38,7 +38,7 @@ class MasterWorkerRuleLists extends BaseAdminDataLists implements ListsSearchInt
     public function setSearch(): array
     {
         return [
-            '=' => ['rule_name', 'description', 'sort'],
+            '=' => ['rule_name', 'description', 'sort','scene_id'],
 
         ];
     }
@@ -56,7 +56,7 @@ class MasterWorkerRuleLists extends BaseAdminDataLists implements ListsSearchInt
     public function lists(): array
     {
         return MasterWorkerRule::where($this->searchWhere)
-            ->field(['id', 'rule_name', 'description', 'sort'])
+            ->field(['id', 'rule_name', 'description', 'sort','scene_id'])
             ->limit($this->limitOffset, $this->limitLength)
             ->order(['id' => 'desc'])
             ->select()

+ 2 - 0
app/adminapi/logic/master_worker/MasterWorkerRuleLogic.php

@@ -44,6 +44,7 @@ class MasterWorkerRuleLogic extends BaseLogic
                 'rule_name' => $params['rule_name'],
                 'description' => $params['description'],
                 'sort' => $params['sort'],
+                'scene_id' => $params['scene_id'],
             ]);
 
             Db::commit();
@@ -71,6 +72,7 @@ class MasterWorkerRuleLogic extends BaseLogic
                 'rule_name' => $params['rule_name'],
                 'description' => $params['description'],
                 'sort' => $params['sort'],
+                'scene_id' => $params['scene_id'],
             ]);
 
             Db::commit();

+ 2 - 2
app/adminapi/service/DistributeLeafletsService.php

@@ -75,7 +75,7 @@ class DistributeLeafletsService
         $result=array_intersect($mergeIds,$intersectIds);
         return array_values($result);
     }
-    private static function mastersDistance($masters,$customer_lon,$customer_lat,$radius = 0)
+    public static function mastersDistance($masters,$customer_lon,$customer_lat,$radius = 0)
     {
         $masters = array_column($masters, null, 'id');
         $nearbyMasters = [];
@@ -90,7 +90,7 @@ class DistributeLeafletsService
         asort($nearbyMasters);
         return $nearbyMasters;
     }
-    private static function haversineDistance($lat1, $lon1, $lat2, $lon2) {
+    public static function haversineDistance($lat1, $lon1, $lat2, $lon2) {
         $lat1 = deg2rad($lat1);
         $lon1 = deg2rad($lon1);
         $lat2 = deg2rad($lat2);

+ 16 - 0
app/api/controller/ServiceOrderController.php

@@ -188,4 +188,20 @@ class ServiceOrderController extends BaseApiController
         }
         return $this->success('保存成功', [], 1, 1);
     }
+
+    public function isServiceWithin()
+    {
+        $params = (new ServiceOrderValidate())->get()->goCheck('LonLat', [
+            'user_id' => $this->userId,
+            'user_info' => $this->userInfo
+        ]);
+        $result = ServiceOrderLogic::isService($params);
+        if (false === $result) {
+            return $this->fail(ServiceOrderLogic::getError(),['is_service'=>0]);
+        }
+        return $this->success('服务区域内', ['is_service'=>1], 1, 1);
+    }
+
+
+
 }

+ 29 - 0
app/api/logic/ServiceOrderLogic.php

@@ -2,6 +2,7 @@
 
 namespace app\api\logic;
 
+use app\adminapi\service\DistributeLeafletsService;
 use app\common\enum\GoodsEnum;
 use app\common\enum\PayEnum;
 use app\common\enum\WorkEnum;
@@ -11,6 +12,7 @@ use app\common\model\coupon\UserCoupon;
 use app\common\model\dict\DictData;
 use app\common\model\goods\Goods;
 use app\common\model\master_worker\MasterWorker;
+use app\common\model\master_worker\MasterWorkerRule;
 use app\common\model\orders\RechargeOrder;
 use app\common\model\recharge\OrderGoods;
 use app\common\model\spare_part\SparePart;
@@ -28,6 +30,29 @@ use think\facade\Db;
  */
 class ServiceOrderLogic extends BaseLogic
 {
+
+    /**
+     * 判断是否在某服务区
+     * @param $params
+     * @return bool
+     */
+    public static function isService($params)
+    {
+        // 查询服务区所有的地点
+        $rules = MasterWorkerRule::where('scene_id',MasterWorkerRule::SCENE_SERVICE)->column('description','id');
+        //$masters = [];
+        foreach ($rules as $key=>$value){
+            $rule = explode(',',$value);
+            //$masters[] = ['id'=>$key,'lon'=>$rule[0],'lat'=>$rule[1],'radius'=>$rule[2]];
+            $distance = DistributeLeafletsService::haversineDistance($params['lat'], $params['lon'], $rule[1], $rule[0]);
+            if($distance <= $value[2]){
+                return true;
+            }
+        }
+        self::setError('已超出服务区域!');
+        return false;
+    }
+
     /**
      * 提交订单
      * @param array $params
@@ -37,6 +62,10 @@ class ServiceOrderLogic extends BaseLogic
     {
         Db::startTrans();
         try {
+            // 订单位置是否在服务区内
+            if(!self::isService($params)){
+                throw new Exception('已超出服务区域!');
+            }
             $goods = Goods::findOrEmpty($params['goods_id']);
             if($goods->isEmpty()){
                 throw new Exception('产品不存在!');

+ 10 - 1
app/api/validate/ServiceOrderValidate.php

@@ -21,7 +21,9 @@ class ServiceOrderValidate extends BaseValidate
         'pay_way' => 'require',
         'goods_id' => 'require',
         'contact_number' => 'require',
-        'contact_people' => 'require'
+        'contact_people' => 'require',
+        'lon' => 'require',
+        'lat' => 'require',
     ];
 
 
@@ -35,6 +37,8 @@ class ServiceOrderValidate extends BaseValidate
         'goods_id.require' => '订单商品不存在',
         'contact_number.require' => '联系电话不存在',
         'contact_people.require' => '联系人不存在',
+        'lon.require' => '经度不存在',
+        'lat.require' => '纬度不存在',
     ];
 
 
@@ -94,4 +98,9 @@ class ServiceOrderValidate extends BaseValidate
     {
         return $this->only(['sn']);
     }
+    public function sceneLonLat()
+    {
+        return $this->only(['lon','lat']);
+    }
+
 }

+ 5 - 1
app/common/model/master_worker/MasterWorkerRule.php

@@ -26,7 +26,11 @@ use app\common\model\BaseModel;
  */
 class MasterWorkerRule extends BaseModel
 {
-    
+
+    const SCENE_PROTECTION = 101;//保障期
+    const SCENE_AVAILABLE_GOLD = 102;//可用金限制
+    const SCENE_SERVICE = 103;//服务区规则
+
     protected $name = 'master_worker_rule';