OrderController.php 9.7 KB

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