OrderController.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  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 createV2Order()
  92. {
  93. $m_id = $this->getMemberId();//用户id
  94. $commonServer = CommonServer::creatServer();
  95. $shop_id = $commonServer->filtrationStr('shop_id');//商家id
  96. $order_type = $commonServer->filtrationStr('order_type',1);//订单类型 1堂食订单 2打包订单
  97. $table_number = $commonServer->filtrationStr('table_number');//桌号
  98. $diner_number = $commonServer->filtrationStr('diner_number');//就餐人数
  99. $note = $commonServer->filtrationStr('note');//备注
  100. $shopping_cart = request()->input('shopping_cart',[]);//商品规格数组
  101. if (empty($shop_id)) return $this->apiResponseError('商家错误');
  102. if (!in_array($order_type,[1,2])){
  103. return $this->apiResponseError('就餐方式错误');
  104. }
  105. if (empty($table_number) || $table_number < 0) return $this->apiResponseError('桌号错误');
  106. if (empty($diner_number) || $diner_number < 0) return $this->apiResponseError('就餐人数错误');
  107. if (empty($shopping_cart)) return $this->apiResponseError('请添加购物车');
  108. if ($table_number > 1000) return $this->apiResponseError('桌号最大1000');
  109. if ($diner_number > 1000) return $this->apiResponseError('就餐人数最大1000');
  110. if (!empty($note) && mb_strlen($note) > 50 ) return $this->apiResponseError('备注最大50');
  111. //获取商家信息
  112. $shop = ShopServer::creatServer()->getShopInfo($shop_id);
  113. if (empty($shop)) return $this->apiResponseError('该商家不存在');
  114. if ($shop['status'] != 1) return $this->apiResponseError('商家闭店休息中');
  115. //获取购买的商品信息
  116. $cartResult = ShoppingCartServer::creatServer()->getCartList($shopping_cart);
  117. if ($cartResult['code'] == 0) {
  118. return $this->apiResponseError($cartResult['msg']);
  119. }
  120. $goods = $cartResult['data'];
  121. //加锁
  122. $lock_key = $shop_id.'lockOrderCreate';
  123. $lock_value = uniqid(bin2hex(random_bytes(10)), true);
  124. $lock = RedisDataServer::creatServer()->lockKey($lock_key,$lock_value,500);
  125. if (!$lock){
  126. return $this->apiResponseError('下单人数过多,请稍候');
  127. }
  128. //下单
  129. $res = OrderServer::creatServer()->createOrder($m_id,$shop_id,$order_type,$table_number,$diner_number,$note,$goods,$shopping_cart);
  130. //删除锁key-防止死锁
  131. RedisDataServer::creatServer()->unLockKey($lock_key,$lock_value);
  132. if ($res['code'] == 0) {
  133. return $this->apiResponseError($res['msg']);
  134. }
  135. return $this->apiResponseSuccess('订单创建成功', $res['data']);
  136. }
  137. /**
  138. * 支付订单
  139. */
  140. function payOrder()
  141. {
  142. $m_id = $this->getMemberId();//用户id
  143. $commonServer = CommonServer::creatServer();
  144. $order_id = $commonServer->filtrationStr('order_id');//订单id
  145. $pay_type = $commonServer->filtrationStr('pay_type',1);//支付方式 1微信 2支付宝
  146. if (empty($order_id)) return $this->apiResponseError('请选择订单');
  147. if (!in_array($pay_type, [1, 2, 3])) return $this->apiResponseError('支付方式错误');
  148. $order_info = Order::where('id', $order_id)
  149. ->where('m_id', $m_id)
  150. ->where('order_status', 1)
  151. ->select(['id', 'order_status','order_money', 'pay_money', 'order_sn', 'm_id','shop_id'])
  152. ->first();
  153. if (empty($order_info)) {
  154. return $this->apiResponseError('订单已失效');
  155. }
  156. //获取商家信息
  157. $shop = ShopServer::creatServer()->getShopInfo($order_info->{'shop_id'});
  158. if (empty($shop)) return $this->apiResponseError('该商家不存在');
  159. if ($shop['status'] != 1) return $this->apiResponseError('商家已闭店');
  160. //定义返回参数
  161. $data = ['pay_status' => false, 'wx_pay' => [], 'zfb_pay' => []];
  162. if($pay_type == 1) {
  163. //微信支付
  164. $notify_url = route('notify.order_wx');
  165. $wx_openid = MemberOpenId::where('m_id', $m_id)->where('type', 4)->value('openid');
  166. if (empty($wx_openid)) {
  167. return $this->apiResponseError('用户信息错误');
  168. }
  169. $wx_pay = WeixinServer::creatServer()->wxJsPay($order_info->{'order_sn'}, $order_info->{'pay_money'}, $notify_url, '订单', $wx_openid);
  170. $data['wx_pay'] = $wx_pay;
  171. }elseif ($pay_type == 2) {
  172. $data['zfb_pay'] = [];
  173. }
  174. return $this->apiResponseSuccess('成功', $data);
  175. }
  176. /**
  177. * 用户获取外卖订单列表
  178. */
  179. function getOrderList()
  180. {
  181. $m_id = $this->getMemberId();//用户id
  182. $commonServer = CommonServer::creatServer();
  183. $status = $commonServer->filtrationStr('status',-1);//状态 0全部1=>'待支付',2=>'制作中',3=>'已完成',4=>'已取消',5=>'退款',
  184. $shop_id = $commonServer->filtrationStr('shop_id');//商家id
  185. if (empty($shop_id)) return $this->apiResponseError('商家错误');
  186. $where = [['m_id',$m_id], ['is_del',0], ['shop_id',$shop_id]];
  187. $list = Order::where($where)
  188. ->where(function ($q) use ($status){
  189. if (in_array($status,[1,2,3,4,5])){
  190. $q->where('order_status',$status);
  191. }
  192. })
  193. ->select(['id','order_sn','order_type','order_status','pay_money','goods_number','created_at','shop_id','note','shopping_cart'])
  194. ->orderBy('id','desc')
  195. ->paginate(10);
  196. foreach ($list as $value){
  197. $shop_info = ShopServer::creatServer()->getShopInfo($value->{'shop_id'});
  198. $value->{'shop_name'} = $commonServer->truncateChineseString($shop_info['shop_name'],16);
  199. $value->{'item'} = OrderItem::from('order_item as o')
  200. ->leftJoin('goods as g', 'o.goods_id', '=', 'g.id')
  201. ->where('o.order_id',$value->{'id'})
  202. ->select(['o.id','o.goods_id','o.goods_name','o.goods_img','o.goods_number','g.status'])
  203. ->orderBy('o.id','asc')
  204. ->get();
  205. $value->initializeModel();
  206. }
  207. return $this->apiResponseSuccess('成功', [
  208. 'items' => $list->items(),
  209. 'total' => $list->total(),
  210. 'limit' => 10,
  211. ]);
  212. }
  213. /**
  214. * 取消订单
  215. */
  216. function cancelOrder()
  217. {
  218. $m_id = $this->getMemberId();//用户id
  219. $commonServer = CommonServer::creatServer();
  220. $order_id = $commonServer->filtrationStr('order_id');//订单id
  221. if (empty($order_id) || !is_numeric($order_id)) {
  222. return $this->apiResponseError('请选择订单');
  223. }
  224. $order_info = Order::where('m_id', $m_id)
  225. ->where('id', $order_id)
  226. ->where('is_del',0)
  227. ->select(['id','order_sn','m_id', 'order_type','order_status','shop_id'])
  228. ->first();
  229. if (empty($order_info)) return $this->apiResponseError('订单信息错误');
  230. if ($order_info->{'order_status'} != 1) {
  231. return $this->apiResponseError('当前订单不能取消');
  232. }
  233. $res = Order::where('id', $order_info->{'id'})->update(['order_status' => 4]);
  234. if (!$res){
  235. return $this->apiResponseError('操作失败');
  236. }
  237. return $this->apiResponseSuccess('操作成功');
  238. }
  239. /**
  240. * 订单详情
  241. */
  242. function getOrderInfo()
  243. {
  244. $m_id = $this->getMemberId();//用户id
  245. $commonServer = CommonServer::creatServer();
  246. $order_id = $commonServer->filtrationStr('order_id');//订单id
  247. if (empty($order_id)) return $this->apiResponseError('请选择订单');
  248. $where = [['m_id',$m_id], ['is_del',0], ['id',$order_id]];
  249. $order = Order::where($where)
  250. ->select(['id','order_sn','order_type','pay_type','m_id','note','order_status','pay_money','goods_number','shop_id','created_at','pack_price','table_number','diner_number','number','note','shopping_cart'])
  251. ->first();
  252. if (empty($order)) return $this->apiResponseError('订单不存在');
  253. if ($order->{'order_type'} == 1) {//堂食打包费为0
  254. $order->{'pack_price'} = 0;
  255. }
  256. $order->{'shop'} = ShopServer::creatServer()->getShopInfo($order->{'shop_id'});
  257. $order->{'item'} = OrderItem::from('order_item as o')
  258. ->leftJoin('goods as g', 'o.goods_id', '=', 'g.id')
  259. ->where('o.order_id',$order_id)
  260. ->select(['o.id','o.goods_id','o.goods_name','o.goods_img','o.goods_attr','o.goods_number','o.goods_price','o.goods_money','o.goods_spec_list','g.status'])
  261. ->orderBy('o.id','asc')
  262. ->get();
  263. $order->initializeModel();
  264. return $this->apiResponseSuccess('成功', $order);
  265. }
  266. }