request->param(); $model = new OfflineTypeModel(); $model->setSelect(['id','pid','name','image']); $list = $model->getList(params: $params,orderBy: ['weigh' => 'desc','id' => 'desc']); return $this->success('success',DataUtil::recursion($list,'id','pid')); } // 商铺列表 public function list() { $params = $this->request->param(); $userLng = $this->auth->lng; $userLat = $this->auth->lat; $model = new OfflineShopModel(); $select = ['id', 'type_id', 'type_ids', 'name', 'image', 'lng', 'lat', 'address', 'telephone', 'star', 'sales']; $orderBy = []; if (!empty($userLng) && !empty($userLat)) { $select[] = Db::raw("(st_distance(point ({$userLng}, {$userLat}),point(lng,lat))*111195) as distance"); !empty($params['distance']) && $params['distance'] = $params['distance'] * 1000; } if (!empty($this->auth->city)) { $params['city'] = $this->auth->city; } if (isset($params['rank_type'])) { switch ($params['rank_type']) { case 1: $orderBy['star'] = 'desc'; break; case 2: $orderBy['sales'] = 'desc'; break; case 3: if (!empty($userLng) && !empty($userLat)) { $orderBy['distance'] = 'asc'; } break; default: if (!empty($userLng) && !empty($userLat)) { $orderBy['distance'] = 'asc'; } $orderBy['star'] = 'desc'; $orderBy['sales'] = 'desc'; break; } } $list = $model->getList(params: $params,orderBy: array_merge($orderBy,['weigh' => 'desc']),select: $select); foreach ($list as &$item) { [$distance,$unit] = \app\utils\Common::distanceTo($item['distance']); $item['distance'] = "{$distance}{$unit}"; } return $this->success('success',$list); } // 商铺列表 public function info() { $params = $this->request->param(); $userLng = $this->auth->lng; $userLat = $this->auth->lat; $model = new OfflineShopModel(); $select = ['*']; if (!empty($userLng) && !empty($userLat)) { $select[] = Db::raw("(st_distance(point ({$userLng}, {$userLat}),point(lng,lat))*111195) as distance"); } $info = $model->getDetail(params: $params,select: $select); if (!empty($info)) { $info['images'] = explode(',',$info['image']); } return $this->success('success',$info); } // 评价 public function comment() { $params = $this->request->param(); if (empty($params['shop_id'])) { return $this->error('请选择评价门店'); } if (empty($params['star'])){ return $this->error('请选择评分'); } if (empty($params['remark'])){ return $this->error('请填写评价'); } $data = [ 'shop_id' => $params['shop_id'], 'user_id' => $this->auth->id, 'star' => $params['star'], 'remark' => $params['remark'], 'images' => $params['images'] ?? '', 'status' => 1, 'create_time' => time(), ]; Db::name('offline_shop_comment')->insert($data); $comment = Db::name('offline_shop_comment')->where('shop_id',$params['shop_id'])->field([Db::raw('sum(star) as star'),Db::raw('count(*) as num')])->find(); $star = bcdiv($comment['star'] ?? 0,$comment['num'] ?? 0,2); Db::name('offline_shop')->where('id',$params['shop_id'])->update(['star'=>$star]); return $this->success('评价成功'); } /** * 提交订单 * @return true */ public function orderSubmit() { $params = $this->request->param(); if (empty($params['shop_id'])) { return $this->error('参数缺失'); } if (empty($params['money'])) { return $this->error('请填写支付金额'); } $user_id = $this->auth->id; $model = new OfflineShopModel(); $info = $model->getDetail(params: ['id'=>$params['shop_id']]); if (!$info){ return $this->error('门店信息有误'); } // 开始报名 $data = [ 'shop_id' => $info['id'], 'user_id' => $user_id, 'order_no' => createUniqueNo('C', $user_id), 'pay_amount' => bcmul($params['money'], 1, 2), 'status' => 1, 'create_time' => time() ]; if (!Db::name('offline_shop_order')->insertGetId($data)) { return $this->error('订单创建失败'); } return $this->success('提交成功',[ 'order_no' => $data['order_no'], 'pay_amount' => $data['pay_amount'], 'order_type' => 'offline_shop_order', ]); } }