Order.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. <?php
  2. declare (strict_types=1);
  3. namespace app\api\controller;
  4. use app\BaseController;
  5. use app\model\api\Order as OrderModel;
  6. use app\model\api\PayTrade;
  7. use app\model\api\User as UserModel;
  8. use app\model\api\UserScoreDetail;
  9. use app\Request;
  10. use library\services\UtilService;
  11. use think\db\exception\DbException;
  12. use think\facade\Db;
  13. class Order extends BaseController
  14. {
  15. /**
  16. * 订单列表
  17. * @param Request $request
  18. */
  19. public function list(Request $request)
  20. {
  21. $pageSize = 20;
  22. $post = UtilService::getMore([
  23. ['page', 1],
  24. ['status', ''],
  25. ], $request);
  26. $where = [
  27. ['uid', '=', $request->user['uid']]
  28. ];
  29. if ($post['status'] !== '' && in_array((string)$post['status'], ["0", "1", "2", "3", "-1"])) {
  30. $where[] = ['status', '=', (int)$post['status']];
  31. }
  32. $order = new OrderModel;
  33. $data = $order
  34. ->where($where)
  35. ->page((int)$post["page"], $pageSize)
  36. ->order("id", "desc")
  37. ->select()
  38. ->toArray();
  39. $pageCount = $order->where($where)->count();
  40. return app('json')->success([
  41. 'list' => $data,
  42. 'pageCount' => $pageCount,
  43. 'pageSize' => $pageSize,
  44. 'page' => $post['page'],
  45. ]);
  46. }
  47. /**
  48. * 订单详情
  49. * @param Request $request
  50. */
  51. public function info(Request $request)
  52. {
  53. $post = UtilService::getMore([
  54. ['order_id', '', 'empty', '参数错误'],
  55. ], $request);
  56. $orderData = (new OrderModel)
  57. ->where("order_id", $post['order_id'])
  58. ->where("uid", $request->user['uid'])
  59. ->find();
  60. if (empty($orderData)) {
  61. return app('json')->fail('订单不存在');
  62. }
  63. return app('json')->success($orderData);
  64. }
  65. /**
  66. * 取消订单
  67. * @param Request $request
  68. */
  69. public function cancel(Request $request)
  70. {
  71. $post = UtilService::getMore([
  72. ['order_id', '', 'empty', '参数错误'],
  73. ], $request);
  74. $orderData = (new OrderModel)
  75. ->where("order_id", $post['order_id'])
  76. ->where("uid", $request->user['uid'])
  77. ->where("status", 0)
  78. ->find();
  79. if (empty($orderData)) {
  80. return app('json')->fail('订单不存在或已取消');
  81. }
  82. (new OrderModel)->where("id", $orderData['id'])->update(['status' => -1]);
  83. return app('json')->success('订单已取消');
  84. }
  85. /**
  86. * 确认收货
  87. * @param Request $request
  88. */
  89. public function confirm(Request $request)
  90. {
  91. $post = UtilService::getMore([
  92. ['order_id', '', 'empty', '参数错误'],
  93. ], $request);
  94. $orderData = (new OrderModel)
  95. ->where("order_id", $post['order_id'])
  96. ->where("uid", $request->user['uid'])
  97. ->where("status", 2)
  98. ->find();
  99. if (empty($orderData)) {
  100. return app('json')->fail('订单不存在或状态错误');
  101. }
  102. (new OrderModel)->where("id", $orderData['id'])->update([
  103. 'status' => 3,
  104. 'ok_time' => time()
  105. ]);
  106. return app('json')->success('确认收货成功');
  107. }
  108. /**
  109. * 积分支付
  110. * @param Request $request
  111. */
  112. public function scorePay(Request $request)
  113. {
  114. $post = UtilService::getMore([
  115. ['order_id', '', 'empty', '参数错误'],
  116. ], $request);
  117. // 查询订单
  118. $orderData = (new OrderModel)
  119. ->where("order_id", $post['order_id'])
  120. ->where("uid", $request->user['uid'])
  121. ->find();
  122. if (empty($orderData)) {
  123. return app('json')->fail('订单不存在');
  124. }
  125. if ($orderData['status'] != 0) {
  126. return app('json')->fail('订单状态错误');
  127. }
  128. // 查询支付流水
  129. $payTradeData = (new PayTrade)
  130. ->where("o_id", $orderData['id'])
  131. ->where("code", "shop_order")
  132. ->find();
  133. if (empty($payTradeData)) {
  134. return app('json')->fail('支付流水不存在');
  135. }
  136. if ($payTradeData['status'] == 1) {
  137. return app('json')->fail('订单已支付');
  138. }
  139. // 检查用户积分
  140. $userData = (new UserModel)->where("uid", $request->user['uid'])->find();
  141. if (empty($userData)) {
  142. return app('json')->fail('用户不存在');
  143. }
  144. if ($userData['score'] < $orderData['pay_money']) {
  145. return app('json')->fail('积分不足');
  146. }
  147. // 开启事务
  148. PayTrade::beginTrans();
  149. try {
  150. // 扣除积分
  151. $scoreResult = (new UserScoreDetail)->payScore(
  152. $request->user['uid'],
  153. floatval($orderData['pay_money']),
  154. 'outcome_score',
  155. '订单支付:'.$orderData['order_id'],
  156. ['o_id' => $orderData['id']]
  157. );
  158. if (!$scoreResult) {
  159. PayTrade::rollbackTrans();
  160. return app('json')->fail('积分扣除失败');
  161. }
  162. // 更新支付流水
  163. $pay_json = json_encode([
  164. 'pay_type' => 'score',
  165. 'score' => $orderData['pay_money'],
  166. 'pay_time' => time()
  167. ]);
  168. (new PayTrade)->where('id', $payTradeData['id'])->update([
  169. 'status' => 1,
  170. 'pay_time' => time(),
  171. 'pay_json' => $pay_json
  172. ]);
  173. // 更新订单状态
  174. (new OrderModel)->where("id", $orderData['id'])->update([
  175. 'status' => 1,
  176. 'pay_time' => time()
  177. ]);
  178. PayTrade::commitTrans();
  179. return app('json')->success('积分支付成功');
  180. } catch (DbException $e) {
  181. PayTrade::rollbackTrans();
  182. return app('json')->fail('支付失败');
  183. }
  184. }
  185. }