|
|
@@ -0,0 +1,417 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace App\Http\Controllers\Api;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+use App\Http\Controllers\ApiController;
|
|
|
+use App\Servers\CommonServer;
|
|
|
+use App\Servers\OrderServer;
|
|
|
+use App\Servers\RedisDataServer;
|
|
|
+use App\Servers\ShoppingCartServer;
|
|
|
+use Carbon\Carbon;
|
|
|
+use Illuminate\Validation\Rules\In;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 外卖订单
|
|
|
+ */
|
|
|
+class OrderController extends ApiController
|
|
|
+{
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 前端获取订单状态
|
|
|
+ */
|
|
|
+ function getOrderStatus()
|
|
|
+ {
|
|
|
+ $statusArr = [
|
|
|
+ 0=>'全部',
|
|
|
+ 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('修改成功');
|
|
|
+ }
|
|
|
+}
|