'全部', 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');//备注 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) || $table_number < 0) return $this->apiResponseError('就餐人数错误'); if (!empty($note) && mb_strlen($note) > 30 ) return $this->apiResponseError('备注最大30'); //获取购买的商品信息 $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,$note,$goods); //删除锁key-防止死锁 RedisDataServer::creatServer()->unLockKey($lock_key,$lock_value); if ($res['code'] == 0) { return $this->apiResponseError($res['msg']); } return $this->apiResponseSuccess('订单创建成功', $res['data']); } /** * 获取订单支付信息 * @return \Illuminate\Http\JsonResponse */ function getOrderPayInfo() { $m_id = $this->getMemberId();//用户id $commonServer = CommonServer::creatServer(); $order_id = $commonServer->filtrationStr('order_id');//订单id if (empty($order_id)) { return $this->apiResponseError('缺少必要参数'); } $member = Member::where('id', $m_id)->select(['id', 'money'])->first(); if (empty($member)) { 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','coupon_money', 'order_sn', 'shop_id','created_at']) ->first(); if (empty($order_info)) { return $this->apiResponseError('订单已失效'); } $order_info->{'member_money'} = $member['money'];//用户余额 //订单过期时间 $end_time = config('order.order_repeal_time', 10) * 60; $order_info->{'time'} = strtotime($order_info->{'created_at'}) + $end_time; return $this->apiResponseSuccess('获取数据成功', $order_info); } /** * 支付订单 */ 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支付宝 3余额支付 $system_type = request()->input('system_type',2);//1微信h5 2微信小程序 3qq小程序 if (empty($order_id)) return $this->apiResponseError('请选择订单'); if (!in_array($pay_type, [1, 2, 3])) return $this->apiResponseError('支付方式错误'); if (!in_array($system_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_status = Shop::where('id', $order_info['shop_id'])->value('status'); 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', $system_type)->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'] = []; }else{//余额支付 $member = Member::where('id', $m_id)->select(['id', 'money'])->first(); if (empty($member)) { return $this->apiResponseError('会员信息错误'); } if ($member->{'money'} < $order_info->{'pay_money'}) { return $this->apiResponseError('余额不足'); } //余额扣款 $ret = OrderServer::creatServer()->balancePay($order_info); if (empty($ret)) { return $this->apiResponseError('余额支付失败'); } $data['pay_status'] = true; } 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退款/撤销 $where = [['o.m_id',$m_id], ['o.is_del',0]]; $list = Order::from('order as o') ->leftJoin('shops as s','s.id','=','o.shop_id') ->where($where) ->where(function ($q) use ($status){ if ($status == 1){ $q->where('o.order_status',1); }elseif ($status == 2){ $q->where('o.order_status',2); }elseif ($status == 3){ $q->whereIn('o.order_status',[4,5,6]); }elseif ($status == 4){ $q->where('o.order_status',7); $q->where('o.is_comment',0); }elseif ($status == 5){ $q->whereIn('o.order_status',[3,8,9,10]); } }) ->select(['o.id','o.order_sn','o.order_status','o.pay_money','o.is_comment','o.goods_number','o.created_at','o.shop_id','s.shop_name','s.shop_logo']) ->orderBy('o.id','desc') ->paginate(10); foreach ($list as $value){ $value->{'refund_status'} = OrderDetails::where('order_id',$value->{'id'})->value('refund_status'); $value->{'shop_name'} = $commonServer->truncateChineseString($value->{'shop_name'},16); $value->{'item'} = OrderItem::where('order_id',$value->{'id'})->select(['goods_name','goods_img'])->orderBy('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 $refund_msg = $commonServer->filtrationStr('refund_msg','');//退款原因 if (empty($order_id) || !is_numeric($order_id)) { return $this->apiResponseError('请选择订单'); } if (empty($refund_msg)) 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','operate_id','school_id', 'time', 'order_type','order_status','pay_money','pay_type','pay_code', 'shop_id','coupon_id']) ->first(); if (empty($order_info)) return $this->apiResponseError('订单信息错误'); if (!in_array($order_info['order_status'], [2,4])) { return $this->apiResponseError('当前订单不能取消'); } //获取需要的配送时间 $date = date('Y-m-d H:i:s'); $current_time = Carbon::parse($date, config('app.timezone'))->format('Y-m-d H:i:s'); //获取需要的配送时间 $delivery_time = ShopServer::creatServer()->getShopDeliveryTime($order_info->{'shop_id'}); $time = Carbon::parse($order_info->{'time'}, config('app.timezone'))->subMinutes($delivery_time + 30)->format('Y-m-d H:i:s'); if ($order_info->{'order_status'} == 2 || $current_time < $time){//订单状态为待接单或者当前时间小于预定送达时间 - ($delivery_time + 30) $ret = OrderServer::creatServer()->refundPay($order_info,'用户取消订单,原因:'.$refund_msg); if (empty($ret)) { return $this->apiResponseError('退款失败'); } $refund_sn = $ret['refund_sn']; $refund_money = $ret['refund_money']; Order::where('id', $order_info->{'id'})->update(['order_status' => 8]); OrderDetails::where('order_id', $order_info->{'id'})->update(['refund_status' => 2,'refund_sn'=>$refund_sn,'refund_money'=>$refund_money,'refund_msg'=>$refund_msg]); //添加记录 OrderRecordServer::creatServer()->writeRecord($order_info->{'id'},$order_info->{'shop_id'},0,0,'用户发起订单退款,退款完成,原因:'.$refund_msg); //回退优惠卷 CouponServer::creatServer()->backCoupon($order_info->{'m_id'},$order_info->{'coupon_id'}); //获取订单商品,商品不是无限库存需要回退库存 $goods = OrderItem::from('order_item as i') ->leftJoin('goods as g','g.id','=','i.goods_id') ->where('i.order_id',$order_id) ->select(['i.goods_number','i.goods_id','i.goods_spec_id','i.seckill_money','g.is_infinite','g.stock']) ->get(); foreach ($goods as $value){ if ($value->{'is_infinite'} != 1){//回退库存 Goods::where('id',$value['goods_id'])->increment('stock',$value['goods_number']); } if ($value->{'seckill_money'} > 0){ $key_name = 'seckill_'.$value['goods_id']; RedisDataServer::creatServer()->addOneQueue($key_name, 1); } } //投递用户订单统计任务 JobServer::creatServer()->sendMemberOrderTotal($order_info->{'m_id'},$order_info->{'school_id'},1,$order_info->{'created_at'},0,$order_info->{'pay_money'}); //投递商户订单统计任务 JobServer::creatServer()->sendShopOrderTotal($order_info->{'shop_id'},$order_info->{'school_id'},1,$order_info->{'created_at'},0,$order_info->{'pay_money'}); JobServer::creatServer()->sendSchoolOrderTotal($order_info->{'school_id'},1,$order_info->{'created_at'},0,$order_info->{'pay_money'}); return $this->apiResponseSuccess('退款成功'); }else{//已接单需要商家同意 $ret = Order::where('id', $order_info->{'id'})->update(['order_status' => 8]); OrderDetails::where('order_id', $order_info->{'id'})->update(['refund_status' => 1,'refund_msg'=>$refund_msg]); if (empty($ret)) { return $this->apiResponseError('申请退款失败'); } else { //添加记录 OrderRecordServer::creatServer()->writeRecord($order_info->{'id'},$order_info->{'shop_id'},0,0,'用户发起订单退款,等待商家确认,原因:'.$refund_msg); //投递打印任务 JobServer::creatServer()->cancelOrderPrintJob($order_info->{'id'},$order_info->{'shop_id'},1); 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 = [['o.m_id',$m_id], ['o.is_del',0], ['o.id',$order_id]]; $order = Order::from('order as o') ->leftJoin('order_address as a','a.order_id','=','o.id') ->leftJoin('order_details as d','d.order_id','=','o.id') ->where($where) ->select(['o.id','o.order_sn','o.time','o.pay_type','o.m_id','o.note','o.order_status','o.pay_money','o.is_comment','o.goods_number','o.coupon_money','o.shop_id','o.created_at','d.refund_status','d.pack_price','d.delivery_money','d.finish_time','d.finish_image','a.school_id','a.dorm_id','a.consignee','a.phone as consignee_tel','a.address']) ->first(); if (empty($order)) return $this->apiResponseError('订单不存在'); $order->{'school_name'} = School::where('id',$order->{'school_id'})->value('school_name'); $order->{'dorm_name'} = SchoolDorm::where('id',$order->{'dorm_id'})->value('name'); $order->{'shop'} = Shop::where('id',$order->{'shop_id'})->select(['shop_name','shop_logo','shop_phone'])->first(); $order->{'item'} = OrderItem::where('order_id',$order_id) ->select(['goods_name','goods_img','goods_attr','goods_number','goods_price']) ->orderBy('id','asc') ->get(); //获取最新的骑手id $rider_id = OrderRecord::where('order_id',$order_id)->where('rider_id','>',0)->orderBy('id','desc')->value('rider_id'); if (!empty($rider_id)){ $rider = Rider::where('id',$rider_id)->select(['rider_name','phone'])->first(); }else{ $rider['rider_name'] = ''; $rider['phone'] = ''; } $order->{'rider'} = $rider; $order->initializeModel(); return $this->apiResponseSuccess('成功', $order); } /** * 修改收货地址 */ function updateAddress() { $m_id = $this->getMemberId();//用户id $commonServer = CommonServer::creatServer(); $order_id = $commonServer->filtrationStr('order_id');//订单id $address_id = $commonServer->filtrationStr('address_id', '');//地址id if (empty($order_id) || !is_numeric($order_id)) { return $this->apiResponseError('缺少必要参数'); } if (empty($address_id)) { return $this->apiResponseError('请输入新地址信息'); } $where = [['m_id', $m_id], ['id',$order_id], ['is_del', 0]]; $order = Order::where($where) ->select(['id', 'order_sn', 'order_status', 'm_id']) ->orderBy('id', 'desc') ->first(); if (empty($order)) { return $this->apiResponseError('订单信息错误'); } if ($order->{'order_status'} > 2) { return $this->apiResponseError('订单状态错误'); } //获取地址信息 $address_info = MemberAddress::where('m_id',$m_id) ->where('id',$address_id) ->where('is_del',0) ->select(['id','phone','school_id','dorm_id','consignee','address']) ->first(); if (empty($address_info)) { return $this->apiResponseError('地址信息错误'); } $info = OrderAddress::where('m_id',$m_id)->where('order_id',$order_id)->select(['id','school_id'])->first(); //判断收货地址是否在一个学校 if ($info->{'school_id'} != $address_info->{'school_id'}) { return $this->apiResponseError('收货地址与该订单不在同一学校'); } $res = OrderServer::creatServer()->saveAddress($m_id,$order_id, $address_info); if (!$res) { return $this->apiResponseError('修改失败'); } //添加记录 OrderRecordServer::creatServer()->writeRecord($order_id,0,0,0,'用户修改收货地址'); return $this->apiResponseSuccess('修改成功'); } }