OrderController.php 13 KB

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