OrderController.php 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Http\Controllers\ApiController;
  4. use App\Models\Order;
  5. use App\Models\OrderItem;
  6. use App\Servers\CommonServer;
  7. use App\Servers\OrderServer;
  8. use App\Servers\RedisDataServer;
  9. use App\Servers\ShoppingCartServer;
  10. use App\Servers\ShopServer;
  11. use App\Servers\WeixinServer;
  12. use Carbon\Carbon;
  13. use Illuminate\Validation\Rules\In;
  14. /**
  15. * 外卖订单
  16. */
  17. class OrderController extends ApiController
  18. {
  19. /**
  20. * 前端获取订单状态
  21. */
  22. function getOrderStatus()
  23. {
  24. $statusArr = [
  25. 0=>'全部',
  26. 1=>'待支付',
  27. 2=>'制作中',
  28. 3=>'已完成',
  29. 4=>'已取消',
  30. 5=>'退款',
  31. ];
  32. $data = [];
  33. foreach ($statusArr as $key=>$value){
  34. $data[] = [
  35. 'key' => $key,
  36. 'name' => $value,
  37. ];
  38. }
  39. return $this->apiResponseSuccess('成功',array_values($data));
  40. }
  41. /**
  42. * 下单
  43. */
  44. function createOrder()
  45. {
  46. $m_id = $this->getMemberId();//用户id
  47. $commonServer = CommonServer::creatServer();
  48. $shop_id = $commonServer->filtrationStr('shop_id');//商家id
  49. $order_type = $commonServer->filtrationStr('order_type',1);//订单类型 1堂食订单 2打包订单
  50. $table_number = $commonServer->filtrationStr('table_number');//桌号
  51. $diner_number = $commonServer->filtrationStr('diner_number');//就餐人数
  52. $note = $commonServer->filtrationStr('note');//备注
  53. if (empty($shop_id)) return $this->apiResponseError('商家错误');
  54. if (!in_array($order_type,[1,2])){
  55. return $this->apiResponseError('就餐方式错误');
  56. }
  57. if (empty($table_number) || $table_number < 0) return $this->apiResponseError('桌号错误');
  58. if (empty($diner_number) || $table_number < 0) return $this->apiResponseError('就餐人数错误');
  59. if (!empty($note) && mb_strlen($note) > 30 ) return $this->apiResponseError('备注最大30');
  60. //获取商家信息
  61. $shop = ShopServer::creatServer()->getShopInfo($shop_id);
  62. if (empty($shop)) return $this->apiResponseError('该商家不存在');
  63. if ($shop->{'status'} != 1) return $this->apiResponseError('商家闭店休息中');
  64. //获取购买的商品信息
  65. $goods = ShoppingCartServer::creatServer()->getShoppingList($m_id,$shop_id);
  66. if (count($goods['goods_list']) <= 0) {
  67. return $this->apiResponseError('商品信息错误');
  68. }
  69. //加锁
  70. $lock_key = $shop_id.'lockOrderCreate';
  71. $lock_value = uniqid(bin2hex(random_bytes(10)), true);
  72. $lock = RedisDataServer::creatServer()->lockKey($lock_key,$lock_value,500);
  73. if (!$lock){
  74. return $this->apiResponseError('下单人数过多,请稍候');
  75. }
  76. //下单
  77. $res = OrderServer::creatServer()->createOrder($m_id,$shop_id,$order_type,$table_number,$diner_number,$note,$goods);
  78. //删除锁key-防止死锁
  79. RedisDataServer::creatServer()->unLockKey($lock_key,$lock_value);
  80. if ($res['code'] == 0) {
  81. return $this->apiResponseError($res['msg']);
  82. }
  83. return $this->apiResponseSuccess('订单创建成功', $res['data']);
  84. }
  85. /**
  86. * 支付订单
  87. */
  88. function payOrder()
  89. {
  90. $m_id = $this->getMemberId();//用户id
  91. $commonServer = CommonServer::creatServer();
  92. $order_id = $commonServer->filtrationStr('order_id');//订单id
  93. $pay_type = $commonServer->filtrationStr('pay_type',1);//支付方式 1微信 2支付宝
  94. $system_type = request()->input('system_type',2);//1微信h5 2微信小程序 3qq小程序
  95. if (empty($order_id)) return $this->apiResponseError('请选择订单');
  96. if (!in_array($pay_type, [1, 2, 3])) return $this->apiResponseError('支付方式错误');
  97. if (!in_array($system_type, [1, 2, 3])) return $this->apiResponseError('来源平台错误');
  98. $order_info = Order::where('id', $order_id)
  99. ->where('m_id', $m_id)
  100. ->where('order_status', 1)
  101. ->select(['id', 'order_status','order_money', 'pay_money', 'order_sn', 'm_id','shop_id'])
  102. ->first();
  103. if (empty($order_info)) {
  104. return $this->apiResponseError('订单已失效');
  105. }
  106. //获取商家信息
  107. $shop = ShopServer::creatServer()->getShopInfo($order_info->{'shop_id'});
  108. if (empty($shop)) return $this->apiResponseError('该商家不存在');
  109. if ($shop->{'status'} != 1) return $this->apiResponseError('商家已闭店');
  110. //定义返回参数
  111. $data = ['pay_status' => false, 'wx_pay' => [], 'zfb_pay' => []];
  112. if($pay_type == 1) {
  113. //微信支付
  114. $notify_url = route('notify.order_wx');
  115. $wx_openid = MemberOpenId::where('m_id', $m_id)->where('type', $system_type)->value('openid');
  116. if (empty($wx_openid)) {
  117. return $this->apiResponseError('用户信息错误');
  118. }
  119. $wx_pay = WeixinServer::creatServer()->wxJsPay($order_info->{'order_sn'}, $order_info->{'pay_money'}, $notify_url, '外卖订单', $wx_openid);
  120. $data['wx_pay'] = $wx_pay;
  121. }elseif ($pay_type == 2) {
  122. $data['zfb_pay'] = [];
  123. }
  124. return $this->apiResponseSuccess('成功', $data);
  125. }
  126. /**
  127. * 用户获取外卖订单列表
  128. */
  129. function getOrderList()
  130. {
  131. $m_id = $this->getMemberId();//用户id
  132. $commonServer = CommonServer::creatServer();
  133. $status = $commonServer->filtrationStr('status',-1);//状态 0全部1=>'待支付',2=>'制作中',3=>'已完成',4=>'已取消',5=>'退款',
  134. $shop_id = $commonServer->filtrationStr('shop_id');//商家id
  135. if (empty($shop_id)) return $this->apiResponseError('商家错误');
  136. $where = [['m_id',$m_id], ['is_del',0], ['shop_id',$shop_id]];
  137. $list = Order::where($where)
  138. ->where(function ($q) use ($status){
  139. if (in_array($status,[1,2,3,4,5])){
  140. $q->where('order_status',$status);
  141. }
  142. })
  143. ->select(['id','order_sn','order_status','pay_money','goods_number','created_at','shop_id'])
  144. ->orderBy('o.id','desc')
  145. ->paginate(10);
  146. foreach ($list as $value){
  147. $shop_info = ShopServer::creatServer()->getShopInfo($value->{'shop_id'});
  148. $value->{'shop_name'} = $commonServer->truncateChineseString($shop_info['shop_name'],16);
  149. $value->{'item'} = OrderItem::where('order_id',$value->{'id'})->select(['goods_name','goods_img'])->orderBy('id','asc')->get();
  150. $value->initializeModel();
  151. }
  152. return $this->apiResponseSuccess('成功', [
  153. 'items' => $list->items(),
  154. 'total' => $list->total(),
  155. 'limit' => 10,
  156. ]);
  157. }
  158. /**
  159. * 取消订单
  160. */
  161. function cancelOrder()
  162. {
  163. $m_id = $this->getMemberId();//用户id
  164. $commonServer = CommonServer::creatServer();
  165. $order_id = $commonServer->filtrationStr('order_id');//订单id
  166. if (empty($order_id) || !is_numeric($order_id)) {
  167. return $this->apiResponseError('请选择订单');
  168. }
  169. $order_info = Order::where('m_id', $m_id)
  170. ->where('id', $order_id)
  171. ->where('is_del',0)
  172. ->select(['id','order_sn','m_id', 'order_type','order_status','shop_id'])
  173. ->first();
  174. if (empty($order_info)) return $this->apiResponseError('订单信息错误');
  175. if ($order_info->{'order_status'} != 1) {
  176. return $this->apiResponseError('当前订单不能取消');
  177. }
  178. $res = Order::where('id', $order_info->{'id'})->update(['order_status' => 4]);
  179. if (!$res){
  180. return $this->apiResponseError('操作失败');
  181. }
  182. return $this->apiResponseSuccess('操作成功');
  183. }
  184. /**
  185. * 订单详情
  186. */
  187. function getOrderInfo()
  188. {
  189. $m_id = $this->getMemberId();//用户id
  190. $commonServer = CommonServer::creatServer();
  191. $order_id = $commonServer->filtrationStr('order_id');//订单id
  192. if (empty($order_id)) return $this->apiResponseError('请选择订单');
  193. $where = [['m_id',$m_id], ['is_del',0], ['id',$order_id]];
  194. $order = Order::from('order as o')
  195. ->where($where)
  196. ->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'])
  197. ->first();
  198. if (empty($order)) return $this->apiResponseError('订单不存在');
  199. $order->{'shop'} = ShopServer::creatServer()->getShopInfo($order->{'shop_id'});
  200. $order->{'item'} = OrderItem::where('order_id',$order_id)
  201. ->select(['goods_name','goods_img','goods_attr','goods_number','goods_price'])
  202. ->orderBy('id','asc')
  203. ->get();
  204. $order->initializeModel();
  205. return $this->apiResponseSuccess('成功', $order);
  206. }
  207. }