model = new SysArea(); } /** * 获取地区信息 * @param int $pid //上级pid * @return mixed * @throws DataNotFoundException * @throws DbException * @throws ModelNotFoundException */ public function getListByPid(int $pid = 0) { $cache_name = self::$cache_tag_name.'_pid_'.$pid; return cache_remember( $cache_name, function() use($pid) { return $this->model->where([['pid', '=', $pid]])->field('id, pid, name, shortname, longitude, latitude, level, sort, status')->select()->toArray(); }, [self::$cache_tag_name] ); } /** * 查询地区树列表 * @param int $level //层级1,2,3 * @return mixed * @throws DataNotFoundException * @throws DbException * @throws ModelNotFoundException */ public function getAreaTree(int $level = 3) { $cache_name = self::$cache_tag_name.'_tree_'.$level; return cache_remember( $cache_name, function() use($level) { $list = $this->model->where([['level', '<=', $level]])->field('id, pid, name, shortname, longitude, latitude, level, sort, status')->select()->toArray(); return list_to_tree($list); }, [self::$cache_tag_name] ); } public function getAreaByAreaCode($id) { $cache_name = self::$cache_tag_name.'_area_'. $id; return cache_remember( $cache_name, function() use($id) { $level = [1 => 'province', 2 => 'city', 3 => 'district']; $tree = []; $area = $this->model->where([ ['id', '=', $id] ])->field('id,level,pid,name')->findOrEmpty(); if (!$area->isEmpty()) { $tree[ $level[ $area['level'] ] ] = $area->toArray(); while ($area['level'] > 1) { $area = $this->model->where([ ['id', '=', $area['pid'] ] ])->field('id,level,pid,name')->findOrEmpty(); $tree[ $level[ $area['level'] ] ] = $area->toArray(); } } return $tree; }, [self::$cache_tag_name] ); } /** * @param string $address * @return int|mixed * 地址解析 */ public function getAddress(string $address){ $map = (new ConfigService())->getMap(); $url = "https://apis.map.qq.com/ws/geocoder/v1/?address=".$address."&key=".$map['key']; $curl = curl_init(); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HEADER, 0); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_TIMEOUT, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); $res = curl_exec($curl); $res = json_decode($res, true); if($res){ curl_close($curl); return $res; }else { $error = curl_errno($curl); curl_close($curl); return $error; } } /** * @param string $location * @return int|mixed * 逆地址解析 */ public function getAddressInfo(string $location){ $map = (new ConfigService())->getMap(); $url = "https://apis.map.qq.com/ws/geocoder/v1/?location=".$location."&key=".$map['key']; $curl = curl_init(); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HEADER, 0); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_TIMEOUT, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); $res = curl_exec($curl); $res = json_decode($res, true); if($res){ curl_close($curl); return $res; }else { $error = curl_errno($curl); curl_close($curl); return $error; } } public function getAreaId($name, $level){ $field = 'id'; $info = $this->model->field($field)->where([['name', 'like', '%' . $name . '%' ], ['level', '=', $level]])->findOrEmpty()->toArray(); return $info['id']; } /** * 获取地址名称 */ public function getAreaName($id){ $info = $this->model->field("name")->where([['id', '=', $id ]])->findOrEmpty()->toArray(); return $info['name']; } }