Order.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. <?php
  2. namespace addons\shopro\controller\order;
  3. use think\Db;
  4. use addons\shopro\controller\Common;
  5. use addons\shopro\service\order\OrderCreate;
  6. use addons\shopro\service\order\OrderOper;
  7. use app\admin\model\shopro\order\Order as OrderModel;
  8. use app\admin\model\shopro\Pay as PayModel;
  9. use addons\shopro\library\express\Express as ExpressLib;
  10. //订单
  11. class Order extends Common
  12. {
  13. protected $noNeedLogin = [];
  14. protected $noNeedRight = ['*'];
  15. //订单列表
  16. public function index()
  17. {
  18. $user = auth_user();
  19. $params = $this->request->param();
  20. $type = $params['type'] ?? 'all';
  21. $orders = OrderModel::where('user_id', $user->id)->with(['items', 'invoice']);
  22. switch ($type) {
  23. case 'unpaid':
  24. $orders = $orders->unpaid();
  25. break;
  26. case 'groupon_ing':
  27. $orders = $orders->paid()->nosend()->groupon_ing();
  28. break;
  29. case 'nosend':
  30. $orders = $orders->pretendPaid()->nosend()->groupon_finish();
  31. break;
  32. case 'noget':
  33. $orders = $orders->pretendPaid()->noget();
  34. break;
  35. case 'nocomment':
  36. $orders = $orders->paid()->nocomment();
  37. break;
  38. }
  39. // $orders = $orders->order('id', 'desc')->paginate(request()->param('list_rows', 10))->toArray();
  40. $orders = $orders->order('id', 'desc')->autopage()->select();
  41. $orderModel = new OrderModel();
  42. foreach ($orders as &$order) {
  43. $order = $orderModel->setOrderItemStatusByOrder($order);
  44. }
  45. $this->success('获取成功', $orders);
  46. }
  47. //订单详情
  48. public function detail()
  49. {
  50. $user = auth_user();
  51. $id = $this->request->param('id');
  52. $merchant_trade_no = $this->request->param('merchant_trade_no');
  53. $transaction_id = $this->request->param('transaction_id');
  54. $order = OrderModel::where('user_id', $user->id)->with(['items', 'address', 'invoice']);
  55. if ($id) {
  56. $order = $order->where(function ($query) use ($id) {
  57. return $query->where('id', $id)->whereOr('order_sn', $id);
  58. });
  59. } else if ($merchant_trade_no) {
  60. $pay = PayModel::where('pay_sn', $merchant_trade_no)->findOrFail();
  61. $order = $order->where('id', $pay->order_id);
  62. } else {
  63. $this->error('参数错误');
  64. }
  65. $order = $order->find();
  66. if (!$order) {
  67. $this->error(__('No Results were found'));
  68. }
  69. $order->pay_types_text = $order->pay_types_text;
  70. // 处理未支付订单 item status_code
  71. $order = $order->setOrderItemStatusByOrder($order); // 这里订单转 数组了
  72. // 更新包裹信息(5分钟缓存)
  73. (new ExpressLib)->updateOrderExpress($order['id']);
  74. $this->success('获取成功', $order);
  75. }
  76. public function itemDetail()
  77. {
  78. $user = auth_user();
  79. $id = $this->request->param('id');
  80. $item_id = $this->request->param('item_id');
  81. if (!$id || !$item_id) {
  82. $this->error('参数错误');
  83. }
  84. $order = OrderModel::with(['items' => function ($query) use ($item_id) {
  85. $query->where('id', $item_id);
  86. }])->where('user_id', $user->id)->where('id', $id)->find();
  87. if (!$order || !$order->items) {
  88. $this->error(__('No Results were found'));
  89. }
  90. $order = $order->setOrderItemStatusByOrder($order); // 这里订单转 数组了
  91. $item = $order['items'][0];
  92. $this->success('获取成功', $item);
  93. }
  94. //计算订单
  95. public function calc()
  96. {
  97. $params = $this->request->param();
  98. //购物车
  99. $cart = input('cart',0);
  100. if(!empty($cart)){
  101. unset($params['goods_list']);
  102. // 多个商品
  103. $carts = (new \app\admin\model\shopro\Cart)
  104. ->whereIn('id', $cart)
  105. ->order(['id' => 'desc'])
  106. ->select();
  107. $goods_list = [];
  108. foreach ($carts as $cart) {
  109. $goods_list[] = [
  110. 'goods_id' => $cart['goods_id'],
  111. 'goods_sku_price_id' => $cart['goods_sku_price_id'],
  112. 'goods_num' => $cart['goods_num'],
  113. ];
  114. }
  115. $params['goods_list'] = empty($goods_list) ? '' : json_encode($goods_list);
  116. }
  117. //购物车
  118. $this->svalidate($params, ".calc");
  119. $orderCreate = new OrderCreate($params);
  120. $result = $orderCreate->calc();
  121. if (isset($result['msg']) && $result['msg']) {
  122. // $this->error($result['msg'], 1, $result);
  123. $this->error($result['msg']);
  124. } else {
  125. $this->success('计算成功', $result);
  126. }
  127. }
  128. //创建订单
  129. public function create()
  130. {
  131. $params = $this->request->param();
  132. //购物车
  133. $cart = input('cart',0);
  134. if(!empty($cart)){
  135. unset($params['goods_list']);
  136. // 多个商品
  137. $carts = (new \app\admin\model\shopro\Cart)
  138. ->whereIn('id', $cart)
  139. ->order(['id' => 'desc'])
  140. ->select();
  141. $goods_list = [];
  142. foreach ($carts as $cart) {
  143. $goods_list[] = [
  144. 'goods_id' => $cart['goods_id'],
  145. 'goods_sku_price_id' => $cart['goods_sku_price_id'],
  146. 'goods_num' => $cart['goods_num'],
  147. ];
  148. }
  149. $params['goods_list'] = empty($goods_list) ? '' : json_encode($goods_list);
  150. }
  151. //购物车
  152. $this->svalidate($params, ".create");
  153. $orderCreate = new OrderCreate($params);
  154. $result = $orderCreate->calc('create');
  155. $order = $orderCreate->create($result);
  156. $this->success('订单添加成功', $order);
  157. }
  158. /**
  159. * 获取用户可用和不可用优惠券
  160. *
  161. * @param Request $request
  162. * @return void
  163. */
  164. public function coupons()
  165. {
  166. $params = $this->request->param();
  167. //购物车
  168. $cart = input('cart',0);
  169. if(!empty($cart)){
  170. unset($params['goods_list']);
  171. // 多个商品
  172. $carts = (new \app\admin\model\shopro\Cart)
  173. ->whereIn('id', $cart)
  174. ->order(['id' => 'desc'])
  175. ->select();
  176. $goods_list = [];
  177. foreach ($carts as $cart) {
  178. $goods_list[] = [
  179. 'goods_id' => $cart['goods_id'],
  180. 'goods_sku_price_id' => $cart['goods_sku_price_id'],
  181. 'goods_num' => $cart['goods_num'],
  182. ];
  183. }
  184. $params['goods_list'] = empty($goods_list) ? '' : json_encode($goods_list);
  185. }
  186. //购物车
  187. $this->svalidate($params, ".create");
  188. $orderCreate = new OrderCreate($params);
  189. $result = $orderCreate->getCoupons();
  190. $this->success('获取成功', $result);
  191. }
  192. //取消原因
  193. public function cancel_reason(){
  194. $data = [
  195. '收货地址或者手机号填错了',
  196. '忘记支付密码/余额不足',
  197. '无法正常支付',
  198. '不想买了',
  199. '其他原因',
  200. ];
  201. $this->success(1, $data);
  202. }
  203. // 取消订单,未支付的才可以
  204. public function cancel()
  205. {
  206. $user = auth_user();
  207. $id = $this->request->param('id');
  208. $reason = $this->request->param('reason');
  209. $order = Db::transaction(function () use ($id, $user, $reason) {
  210. $order = OrderModel::canCancel()->where('user_id', $user->id)->with(['items', 'invoice'])->lock(true)->where('id', $id)->find();
  211. if (!$order) {
  212. $this->error(__('No Results were found'));
  213. }
  214. $orderOper = new OrderOper();
  215. $order = $orderOper->cancel($order, $user, 'user', $reason);
  216. return $order;
  217. });
  218. // 订单未支付,处理 item 状态
  219. $order = $order->setOrderItemStatusByOrder($order); // 这里订单转 数组了
  220. // $this->success('取消成功', $order);
  221. $this->success('取消成功');
  222. }
  223. // 订单申请全额退款,支付的且未发货的才可以
  224. public function applyRefund()
  225. {
  226. $user = auth_user();
  227. $id = $this->request->param('id');
  228. $reason = $this->request->param('reason');
  229. $order = OrderModel::paid()->where('user_id', $user->id)->where('id', $id)->find();
  230. if (!$order) {
  231. $this->error(__('No Results were found'));
  232. }
  233. $order = Db::transaction(function () use ($order, $user, $reason) {
  234. $orderOper = new OrderOper();
  235. $order = $orderOper->applyRefund($order, $user, 'user',$reason);
  236. return $order;
  237. });
  238. $order = OrderModel::with(['items', 'invoice'])->find($id);
  239. $order = $order->setOrderItemStatusByOrder($order); // 这里订单转 数组了
  240. // $this->success('申请成功', $order);
  241. $this->success('申请成功');
  242. }
  243. // 确认收货(货到付款的确认收货在后台)
  244. public function confirm()
  245. {
  246. $user = auth_user();
  247. $id = $this->request->param('id');
  248. $order = OrderModel::paid()->where('user_id', $user->id)->where('id', $id)->find();
  249. if (!$order) {
  250. $this->error(__('No Results were found'));
  251. }
  252. $order = Db::transaction(function () use ($order, $user) {
  253. $orderOper = new OrderOper();
  254. $order = $orderOper->confirm($order, [], $user, 'user');
  255. return $order;
  256. });
  257. $order = OrderModel::with(['items', 'invoice'])->find($id);
  258. // $this->success('收货成功', $order);
  259. $this->success('收货成功');
  260. }
  261. // 评价
  262. public function comment()
  263. {
  264. $user = auth_user();
  265. $params = $this->request->param();
  266. $id = $params['id'] ?? 0;
  267. $params['comments'] = json_decode(htmlspecialchars_decode($params['comments']),true);
  268. $this->svalidate($params, ".comment");
  269. $comments = $params['comments'] ?? [];
  270. foreach ($comments as $comment) {
  271. $this->svalidate($comment, ".comment_item");
  272. }
  273. $order = OrderModel::paid()->where('user_id', $user->id)->where('id', $id)->find();
  274. if (!$order) {
  275. $this->error(__('No Results were found'));
  276. }
  277. $order = Db::transaction(function () use ($order, $params, $user) {
  278. $orderOper = new OrderOper();
  279. $order = $orderOper->comment($order, $params['comments'], $user, 'user');
  280. return $order;
  281. });
  282. // $this->success('评价成功', $order);
  283. $this->success('评价成功');
  284. }
  285. /**
  286. * 用户是否存在未支付的,当前团的订单
  287. *
  288. * @param Request $request
  289. * @return void
  290. */
  291. public function unpaidGrouponOrder()
  292. {
  293. $user = auth_user();
  294. $params = $this->request->param();
  295. $activity_id = $params['activity_id'] ?? 0;
  296. if ($user && $activity_id) {
  297. $order = OrderModel::unpaid()->where('user_id', $user->id)
  298. ->where('activity_id', $activity_id)
  299. ->whereIn('activity_type', ['groupon', 'groupon_ladder'])->find();
  300. }
  301. $this->success('获取成功', $order ?? null);
  302. }
  303. // 删除订单
  304. public function delete()
  305. {
  306. $user = auth_user();
  307. $id = $this->request->param('id');
  308. $order = OrderModel::canDelete()->where('user_id', $user->id)->where('id', $id)->find();
  309. if (!$order) {
  310. $this->error('订单不存在或不可删除');
  311. }
  312. Db::transaction(function () use ($order, $user) {
  313. $orderOper = new OrderOper();
  314. $orderOper->delete($order, $user, 'user');
  315. });
  316. $this->success('删除成功');
  317. }
  318. }