select('name,area')->where(['is_delete' => 0,'status' => 1])->asArray()->all(); if(empty($store)){ return $this->apiReturnSuccess(); } $areas = []; $dots = []; foreach ($store as $index => $item){ if(empty($item['area'])){ continue; } $area = json_decode($item['area'],true); $store_region = $area['store']['paths']; $store_lats = array_column($store_region,'lat'); arsort($store_lats); $store_region2 = []; foreach ($store_region as &$item2){ array_push($store_region2,array_values($item2)); } $store_centre = self::GetCenterFromDegrees($store_region2); array_push($dots,['title' => $item['name'],'lat' => $store_lats[0],'lng' => $store_centre[1]]); array_push($areas,$store_region); } $data['areas'] = $areas; $data['dots'] = $dots; return $this->apiReturnSuccess('ok',$data); } public function ball() { // $data = [ // ['id' => '0300','title' => '0300','latitude' => '24.468126','longitude' => '118.166156'], // ['id' => '0200','title' => '0200','latitude' => '24.479394','longitude' => '118.17355'], // ['id' => '0201','title' => '0201','latitude' => '24.508341','longitude' => '118.115605'], // ['id' => '20221000860','title' => '11111','latitude' => '24.470787','longitude' => '118.109243'], // ]; // return $this->apiReturnSuccess('ok',$data); $ball_numbers = BallCart::find()->where(['is_delete' => 0])->andWhere([ 'in','status',[0,1] ])->select('*')->asArray()->all(); if(empty($ball_numbers)){ return $this->apiReturnSuccess(); } //门店管理员 if ($this->user_type == 2) { $store_user_info = ApiHelper::findOneUserStoreId($this->user_id); $user_store_id = isset($store_user_info['store_id']) ? $store_user_info['store_id'] : 0; } $data = []; $redis = \Yii::$app->redis; foreach ($ball_numbers as $item){ $ball_number = $item['ball_number']; $key_detail = 'api:cxaibc:mqtt:data:'.$ball_number.'_Detail'; $detail = $redis->get($key_detail); // TODO 测试 if(!$detail){ continue; } $detail = json_decode($detail, true); $ELEC_PERCENT = json_decode($detail['data'], true)['ELEC_PERCENT']; if(empty($ELEC_PERCENT)){ continue; } $key = 'api:cxaibc:mqtt:data:'.$ball_number.'_GPS'; if ($res = $redis->get($key)) { $res_data = json_decode(json_decode($res, true)['data'], true); $LAT = $res_data['LAT']; $LON= $res_data['LON']; if($LAT >90 || $LAT < -90){ $LAT = -1; } if($LON >180 || $LON < -180){ $LON = -1; } $arr = ['id' => (string) $ball_number,'title' => (string) $ball_number,'latitude' => (string) $LAT,'longitude' => (string) $LON]; if(intval($item['status']) === 1){ // 正在租赁中 $find_order = Order::find()->alias('o') ->join('inner join', ['od' => OrderDetail::tableName()], 'o.id=od.order_id') ->andWhere([ 'od.goods_id' => $ball_number, 'o.is_delete' => 0, 'od.is_delete' => 0, ])->andWhere([ 'in', 'o.status', [1, 2] ])->select('o.id,o.store_id,o.user_id')->asArray()->one(); // 能否进入控制台,是否为当前车辆的购买者,是否为当前车辆的管理者 if (!empty($find_order) && ($find_order['user_id'] == $this->user_id || $find_order['store_id'] == $user_store_id)) { }else{ // 跳过,不让在地图上显示 continue; } } array_push($data,$arr); } } return $this->apiReturnSuccess('ok',$data); } public function GetCenterFromDegrees($data = []) { if (!is_array($data)) return false; $num_coords = count($data); $X = 0.0; $Y = 0.0; $Z = 0.0; foreach ($data as $coord) { $lat = deg2rad($coord[0]) ; $lon = deg2rad($coord[1]) ; $a = cos($lat) * cos($lon); $b = cos($lat) * sin($lon); $c = sin($lat); $X += $a; $Y += $b; $Z += $c; } $X /= $num_coords; $Y /= $num_coords; $Z /= $num_coords; $lon = atan2($Y, $X); $hyp = sqrt($X * $X + $Y * $Y); $lat = atan2($Z, $hyp); return array( rad2deg($lat) , rad2deg($lon)); } }