| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- <?php
- namespace App\Http\Controllers\Api;
- use App\Http\Controllers\ApiController;
- use App\Models\MemberOpenId;
- use App\Models\Order;
- use App\Models\OrderItem;
- use App\Servers\CommonServer;
- use App\Servers\OrderServer;
- use App\Servers\RedisDataServer;
- use App\Servers\ShoppingCartServer;
- use App\Servers\ShopServer;
- use App\Servers\WeixinServer;
- 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) || $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');
- //获取商家信息
- $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,$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 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支付宝
- $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 = 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', $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'] = [];
- }
- 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_status','pay_money','goods_number','created_at','shop_id'])
- ->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','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::from('order as o')
- ->where($where)
- ->select(['id','order_sn','pay_type','m_id','note','order_status','pay_money','goods_number','shop_id','created_at','pack_price','table_number','diner_number','number'])
- ->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_spec_list','g.status'])
- ->orderBy('o.id','asc')
- ->get();
- $order->initializeModel();
- return $this->apiResponseSuccess('成功', $order);
- }
- }
|