'全部', 1=>'待支付', 2=>'制作中', 3=>'已完成', 4=>'已取消', 5=>'退款', ]; $data = []; foreach ($statusArr as $key=>$value){ $data[] = [ 'key' => $key, 'name' => $value, ]; } return $this->apiResponseSuccess('成功',array_values($data)); } /** * 下单 */ function createOrder() { $m_id = $this->getMemberId();//用户id $commonServer = CommonServer::creatServer(); $shop_id = $commonServer->filtrationStr('shop_id');//商家id $order_type = $commonServer->filtrationStr('order_type',1);//订单类型 1堂食订单 2打包订单 $table_number = $commonServer->filtrationStr('table_number');//桌号 $diner_number = $commonServer->filtrationStr('diner_number');//就餐人数 $note = $commonServer->filtrationStr('note');//备注 $reserve_time = $commonServer->filtrationStr('reserve_time');//预约时间 if (empty($shop_id)) return $this->apiResponseError('商家错误'); if (!in_array($order_type,[1,2])){ return $this->apiResponseError('就餐方式错误'); } if (empty($table_number) || $table_number < 0) return $this->apiResponseError('桌号错误'); if (empty($diner_number) || $diner_number < 0) return $this->apiResponseError('就餐人数错误'); if ($table_number > 1000) return $this->apiResponseError('桌号最大1000'); if ($diner_number > 0) return $this->apiResponseError('就餐人数最大1000'); if (!empty($note) && mb_strlen($note) > 50 ) return $this->apiResponseError('备注最大50'); if(!empty($reserve_time)){ // 将预约时间转换为时间戳 $reserve_timestamp = strtotime($reserve_time); // 获取当前时间 $current_time = time(); // 计算20分钟后的时间 $time_plus_20min = $current_time + (20 * 60); // 获取今天的日期(Y-m-d格式) $today_date = date('Y-m-d'); // 获取预约时间的日期部分 $reserve_date = date('Y-m-d', $reserve_timestamp); // 判断预约时间是否是今天且比当前时间大20分钟 if ($reserve_date === $today_date && $reserve_timestamp >= $time_plus_20min) { // 检查预约时间是否不超过今天结束时间 $end_of_today = strtotime(date('Y-m-d 23:59:59')); if ($reserve_timestamp >= $end_of_today) { return $this->apiResponseError('预约时间不正确'); } } elseif($reserve_date !== $today_date) { return $this->apiResponseError('预约时间不超过今天'); } $is_reserve = 1; }else{ $is_reserve = 0; } //获取商家信息 $shop = ShopServer::creatServer()->getShopInfo($shop_id); if (empty($shop)) return $this->apiResponseError('该商家不存在'); if ($shop['status'] != 1) return $this->apiResponseError('商家闭店休息中'); //获取购买的商品信息 $goods = ShoppingCartServer::creatServer()->getShoppingList($m_id,$shop_id); if (count($goods['goods_list']) <= 0) { return $this->apiResponseError('商品信息错误'); } //加锁 $lock_key = $shop_id.'lockOrderCreate'; $lock_value = uniqid(bin2hex(random_bytes(10)), true); $lock = RedisDataServer::creatServer()->lockKey($lock_key,$lock_value,500); if (!$lock){ return $this->apiResponseError('下单人数过多,请稍候'); } //下单 $res = OrderServer::creatServer()->createOrder($m_id,$shop_id,$order_type,$table_number,$diner_number,$is_reserve,$reserve_time,$note,$goods); //删除锁key-防止死锁 RedisDataServer::creatServer()->unLockKey($lock_key,$lock_value); if ($res['code'] == 0) { return $this->apiResponseError($res['msg']); } return $this->apiResponseSuccess('订单创建成功', $res['data']); } /** * 下单 */ function createV2Order() { $m_id = $this->getMemberId();//用户id $commonServer = CommonServer::creatServer(); $shop_id = $commonServer->filtrationStr('shop_id');//商家id $order_type = $commonServer->filtrationStr('order_type',1);//订单类型 1堂食订单 2打包订单 $table_number = $commonServer->filtrationStr('table_number');//桌号 $diner_number = $commonServer->filtrationStr('diner_number');//就餐人数 $note = $commonServer->filtrationStr('note');//备注 $shopping_cart = request()->input('shopping_cart',[]);//商品规格数组 $reserve_time = $commonServer->filtrationStr('reserve_time');//预约时间 if (empty($shop_id)) return $this->apiResponseError('商家错误'); if (!in_array($order_type,[1,2])){ return $this->apiResponseError('就餐方式错误'); } if (empty($table_number) || $table_number < 0) return $this->apiResponseError('桌号错误'); if (empty($diner_number) || $diner_number < 0) return $this->apiResponseError('就餐人数错误'); if (empty($shopping_cart)) return $this->apiResponseError('请添加购物车'); if ($table_number > 1000) return $this->apiResponseError('桌号最大1000'); if ($diner_number > 1000) return $this->apiResponseError('就餐人数最大1000'); if (!empty($note) && mb_strlen($note) > 50 ) return $this->apiResponseError('备注最大50'); if(!empty($reserve_time)){ // 将预约时间转换为时间戳 $reserve_timestamp = strtotime($reserve_time); // 获取当前时间 $current_time = time(); // 计算20分钟后的时间 $time_plus_20min = $current_time + (20 * 60); // 获取今天的日期(Y-m-d格式) $today_date = date('Y-m-d'); // 获取预约时间的日期部分 $reserve_date = date('Y-m-d', $reserve_timestamp); // 判断预约时间是否是今天且比当前时间大20分钟 if ($reserve_date === $today_date && $reserve_timestamp >= $time_plus_20min) { // 检查预约时间是否不超过今天结束时间 $end_of_today = strtotime(date('Y-m-d 23:59:59')); if ($reserve_timestamp >= $end_of_today) { return $this->apiResponseError('预约时间不正确'); } } elseif($reserve_date !== $today_date) { return $this->apiResponseError('预约时间不超过今天'); } $is_reserve = 1; $reserve_time = date('Y-m-d H:i:s', $reserve_timestamp); }else{ $is_reserve = 0; $reserve_time = date('Y-m-d H:i:s'); } //获取商家信息 $shop = ShopServer::creatServer()->getShopInfo($shop_id); if (empty($shop)) return $this->apiResponseError('该商家不存在'); if ($shop['status'] != 1) return $this->apiResponseError('商家闭店休息中'); //获取桌号信息 $table = TableNumber::where('shop_id',$shop_id)->where('number',$table_number)->select(['id','status'])->first(); if (empty($table)) return $this->apiResponseError('桌号不存在'); if ($table->{'status'} != 1) return $this->apiResponseError('桌号不可用'); //获取购买的商品信息 $cartResult = ShoppingCartServer::creatServer()->getCartList($shopping_cart); if ($cartResult['code'] == 0) { return $this->apiResponseError($cartResult['msg']); } $goods = $cartResult['data']; //加锁 $lock_key = $shop_id.'lockOrderCreate'; $lock_value = uniqid(bin2hex(random_bytes(10)), true); $lock = RedisDataServer::creatServer()->lockKey($lock_key,$lock_value,500); if (!$lock){ return $this->apiResponseError('下单人数过多,请稍候'); } //下单 $res = OrderServer::creatServer()->createOrder($m_id,$shop_id,$order_type,$table_number,$diner_number,$is_reserve,$reserve_time,$note,$goods,$shopping_cart); //删除锁key-防止死锁 RedisDataServer::creatServer()->unLockKey($lock_key,$lock_value); if ($res['code'] == 0) { return $this->apiResponseError($res['msg']); } return $this->apiResponseSuccess('订单创建成功', $res['data']); } /** * 支付订单 */ function payOrder() { $m_id = $this->getMemberId();//用户id $commonServer = CommonServer::creatServer(); $order_id = $commonServer->filtrationStr('order_id');//订单id $pay_type = $commonServer->filtrationStr('pay_type',1);//支付方式 1微信 2支付宝 if (empty($order_id)) return $this->apiResponseError('请选择订单'); if (!in_array($pay_type, [1, 2, 3])) return $this->apiResponseError('支付方式错误'); $order_info = Order::where('id', $order_id) ->where('m_id', $m_id) ->where('order_status', 1) ->select(['id', 'order_status','order_money', 'pay_money', 'order_sn', 'm_id','shop_id']) ->first(); if (empty($order_info)) { return $this->apiResponseError('订单已失效'); } //获取商家信息 $shop = ShopServer::creatServer()->getShopInfo($order_info->{'shop_id'}); if (empty($shop)) return $this->apiResponseError('该商家不存在'); if ($shop['status'] != 1) return $this->apiResponseError('商家已闭店'); //定义返回参数 $data = ['pay_status' => false, 'wx_pay' => [], 'zfb_pay' => []]; if($pay_type == 1) { //微信支付 $notify_url = route('notify.order_wx'); $wx_openid = MemberOpenId::where('m_id', $m_id)->where('type', 4)->value('openid'); if (empty($wx_openid)) { return $this->apiResponseError('用户信息错误'); } $wx_pay = WeixinServer::creatServer()->wxJsPay($order_info->{'order_sn'}, $order_info->{'pay_money'}, $notify_url, '订单', $wx_openid); $data['wx_pay'] = $wx_pay; }elseif ($pay_type == 2) { $data['zfb_pay'] = []; } return $this->apiResponseSuccess('成功', $data); } /** * 用户获取外卖订单列表 */ function getOrderList() { $m_id = $this->getMemberId();//用户id $commonServer = CommonServer::creatServer(); $status = $commonServer->filtrationStr('status',-1);//状态 0全部1=>'待支付',2=>'制作中',3=>'已完成',4=>'已取消',5=>'退款', $shop_id = $commonServer->filtrationStr('shop_id');//商家id if (empty($shop_id)) return $this->apiResponseError('商家错误'); $where = [['m_id',$m_id], ['is_del',0], ['shop_id',$shop_id]]; $list = Order::where($where) ->where(function ($q) use ($status){ if (in_array($status,[1,2,3,4,5])){ $q->where('order_status',$status); } }) ->select(['id','order_sn','order_type','order_status','pay_money','goods_number','created_at','shop_id','note','shopping_cart','is_reserve','reserve_time']) ->orderBy('id','desc') ->paginate(10); foreach ($list as $value){ $shop_info = ShopServer::creatServer()->getShopInfo($value->{'shop_id'}); $value->{'shop_name'} = $commonServer->truncateChineseString($shop_info['shop_name'],16); $value->{'item'} = OrderItem::from('order_item as o') ->leftJoin('goods as g', 'o.goods_id', '=', 'g.id') ->where('o.order_id',$value->{'id'}) ->select(['o.id','o.goods_id','o.goods_name','o.goods_img','o.goods_number','g.status']) ->orderBy('o.id','asc') ->get(); $value->initializeModel(); } return $this->apiResponseSuccess('成功', [ 'items' => $list->items(), 'total' => $list->total(), 'limit' => 10, ]); } /** * 取消订单 */ function cancelOrder() { $m_id = $this->getMemberId();//用户id $commonServer = CommonServer::creatServer(); $order_id = $commonServer->filtrationStr('order_id');//订单id if (empty($order_id) || !is_numeric($order_id)) { return $this->apiResponseError('请选择订单'); } $order_info = Order::where('m_id', $m_id) ->where('id', $order_id) ->where('is_del',0) ->select(['id','order_sn','m_id', 'order_type','order_status','shop_id']) ->first(); if (empty($order_info)) return $this->apiResponseError('订单信息错误'); if ($order_info->{'order_status'} != 1) { return $this->apiResponseError('当前订单不能取消'); } $res = Order::where('id', $order_info->{'id'})->update(['order_status' => 4]); if (!$res){ return $this->apiResponseError('操作失败'); } return $this->apiResponseSuccess('操作成功'); } /** * 订单详情 */ function getOrderInfo() { $m_id = $this->getMemberId();//用户id $commonServer = CommonServer::creatServer(); $order_id = $commonServer->filtrationStr('order_id');//订单id if (empty($order_id)) return $this->apiResponseError('请选择订单'); $where = [['m_id',$m_id], ['is_del',0], ['id',$order_id]]; $order = Order::where($where) ->select(['id','order_sn','order_type','pay_type','m_id','note','order_status','pay_money','goods_number','shop_id','created_at','pack_price','table_number','diner_number','number','note','shopping_cart','is_reserve','reserve_time']) ->first(); if (empty($order)) return $this->apiResponseError('订单不存在'); if ($order->{'order_type'} == 1) {//堂食打包费为0 $order->{'pack_price'} = 0; } $order->{'shop'} = ShopServer::creatServer()->getShopInfo($order->{'shop_id'}); $order->{'item'} = OrderItem::from('order_item as o') ->leftJoin('goods as g', 'o.goods_id', '=', 'g.id') ->where('o.order_id',$order_id) ->select(['o.id','o.goods_id','o.goods_name','o.goods_img','o.goods_attr','o.goods_number','o.goods_price','o.goods_money','o.goods_spec_list','g.status']) ->orderBy('o.id','asc') ->get(); $order->initializeModel(); return $this->apiResponseSuccess('成功', $order); } }