获取店铺(根据经纬度,距离倒序)

发布时间 2023-05-23 14:28:05作者: 叫我亚庆
    /**
     * @ApiTitle    (附近最近的门店)
     * @ApiSummary  (如果传了shop_id则返回这个店铺的信息,如果没传则根据经纬度判断返回最近的店铺信息)
     * @ApiMethod   (POST)
     * @ApiHeaders  (name=platform, type=string, required=false, description="平台")
     * @ApiParams   (name="lat", type="float", required=true, description="经度")
     * @ApiParams   (name="lng", type="float", required=true, description="纬度")
     * @ApiParams   (name="shop_id", type="integer", required=false, description="店铺id")
     * @ApiReturn   ({"code":1,"msg":"","data":{}})
     *
     * @ApiReturnParams  (name="id", type="integer", description="店铺id")
     * @ApiReturnParams  (name="name", type="string", description="店铺名称")
     * @ApiReturnParams  (name="mobile", type="string", description="店铺电话")
     * @ApiReturnParams  (name="notice", type="string", description="店铺公告")
     * @ApiReturnParams  (name="min_price", type="string", description="最低起送价格")
     * @ApiReturnParams  (name="delivery_price", type="string", description="配送费/运费")
     * @ApiReturnParams  (name="lat", type="float", description="经度")
     * @ApiReturnParams  (name="lng", type="float", description="纬度")
     * @ApiReturnParams  (name="distance", type="float", description="配送距离,0表示不配送外卖")
     * @ApiReturnParams  (name="address", type="string", description="店铺地址详情")
     * @ApiReturnParams  (name="address_map", type="string", description="地图选择的地址")
     * @ApiReturnParams  (name="image", type="string", description="店铺logo")
     * @ApiReturnParams  (name="status", type="integer", description="是否营业中:0=否,1=是")
     * @ApiReturnParams  (name="status_text", type="integer", description="营业状态")
     * @ApiReturnParams  (name="far", type="float", description="距离")
     * @ApiReturnParams  (name="far_text", type="float", description="距离/km")
     * @ApiReturnParams  (name="bussines_time", type="string", description="营业时间")
     *
     */
    public function nearby()
    {
        $lat = $this->request->post('lat');
        $lng = $this->request->post('lng');
        $shopId = $this->request->post('shop_id', 0);

        if (!$lat || !$lng) {
            $this->error('参数错误');
        }

        $shopModel = new \addons\unidrink\model\Shop();
        $shop = $shopModel->getList($lat, $lng, 1, 1, $shopId);

        if ($shop && is_array($shop)) {
            $shop = $shop[0];
            $shop->append(['status_text'])->toArray();
            $shop['far_text'] = number_format($shop['far'], 3) . 'km';
        }
        $this->success('', $shop);
    }


    /**
     * @ApiTitle    (获取所有店铺)
     * @ApiSummary  (获取所有店铺)
     * @ApiMethod   (POST)
     *
     */
    public function getList()
    {
        $keyword = $this->request->post('kw', '');
        $lat = $this->request->post('lat');
        $lng = $this->request->post('lng');
        $page = $this->request->post('page', 1);
        $pagesize = $this->request->post('pagesize', 10);

        if (!$lat || !$lng) {
            $this->error('参数错误');
        }

        $shopModel = new \addons\unidrink\model\Shop();
        $list = $shopModel->getList($lat, $lng, $page, $pagesize, 0, $keyword);

        if ($list) {
            $list = collection($list)->append(['status_text'])->toArray();
            foreach ($list as &$shop) {
                $shop['far_text'] = number_format($shop['far'], 3) . 'km';
            }
        }

        $this->success('', $list);
    }
    

  

    /**
     * 根据给定条件获取店铺列表
     */
    public function getList($lat = 0, $lng = 0, $page = 1, $pagesize = 10, $shop_id = 0, $keyword = '', $order = 'far')
    {
        $query = $this
            ->field("id,name,mobile,notice,min_price,delivery_price,lat,lng,distance,address,address_map,image,status,starttime,endtime,
            (6371 * acos (
               cos ( radians($lat) )
        * cos( radians( lat ) )
        * cos( radians( lng ) - radians($lng) )
        + sin ( radians($lat) ) * sin( radians( lat ) ))
            ) AS far");

        if ($shop_id != 0) {
            $query = $query->where('id = :shop_id', ['shop_id' => $shop_id]);
        }
        if ($keyword != '') {
            $query = $query->where("name LIKE :name", ['name' => '%'.$keyword.'%']);
        }

        $shop = $query
            ->fetchSql(false)
            ->order($order)
            ->page($page, $pagesize)
            ->select();

        return $shop;
    }

  

CREATE TABLE `ry_shop` (
	`id` INT(10) NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(100) NOT NULL COMMENT '店铺名称',
	`mobile` VARCHAR(20) NOT NULL COMMENT '店铺电话',
	`image` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '图片',
	`images` TEXT NOT NULL COMMENT '多张图片',
	`address` VARCHAR(255) NOT NULL COMMENT '详细地址',
	`address_map` VARCHAR(255) NOT NULL COMMENT '地图定位地址',
	`starttime` INT(10) NOT NULL COMMENT '营业开始时间',
	`endtime` INT(10) NOT NULL COMMENT '营业结束时间',
	`lng` VARCHAR(30) NOT NULL COMMENT '经度',
	`lat` VARCHAR(30) NOT NULL COMMENT '纬度',
	`province` INT(10) NOT NULL COMMENT '省份id',
	`city` INT(10) NOT NULL COMMENT '所在城市id',
	`area` INT(10) NOT NULL COMMENT '地区id',
	`distance` INT(10) NOT NULL DEFAULT '0' COMMENT '外卖配送距离,单位为千米。0表示不送外卖',
	`min_price` DECIMAL(10,2) NOT NULL DEFAULT '0.00' COMMENT '起送价钱',
	`delivery_price` DECIMAL(10,2) NOT NULL DEFAULT '0.00' COMMENT '配送价格',
	`notice` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '公告',
	`status` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '是否营业:0=否,1=是',
	`createtime` INT(10) NOT NULL COMMENT '创建时间',
	`updatetime` INT(10) NOT NULL COMMENT '更新时间',
	`deletetime` INT(10) NULL DEFAULT NULL COMMENT '删除时间',
	`admin_id` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '管理员id',
	`uniprint_id` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '打印机id',
	PRIMARY KEY (`id`)
)
COMMENT='店铺'
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;