| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417 |
- <?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('修改成功');
- }
- }
|