You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

235 lines
7.7 KiB

6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
  1. <?php
  2. namespace App\Controller\v3;
  3. use App\Constants\v3\ErrorCode;
  4. use App\Constants\v3\LogLabel;
  5. use App\Constants\v3\OrderState;
  6. use App\Controller\BaseController;
  7. use App\Exception\ErrorCodeException;
  8. use App\Model\v3\OrderMain;
  9. use App\Request\v3\OrderOnlineDetailRequest;
  10. use App\Request\v3\OrderOnlineRequest;
  11. use App\Request\v3\OrderOnlineStateRequest;
  12. use App\Service\v3\Implementations\PaymentService;
  13. use App\Service\v3\Interfaces\CouponRecServiceInterface;
  14. use App\Service\v3\Interfaces\SeparateAccountsServiceInterface;
  15. use App\Service\v3\Interfaces\ShopCartServiceInterface;
  16. use App\Service\v3\Interfaces\UserAddressServiceInterface;
  17. use Hyperf\DbConnection\Db;
  18. use Hyperf\Di\Annotation\Inject;
  19. use App\Service\v3\Interfaces\OrderOnlineServiceInterface;
  20. use App\Service\v3\Interfaces\UserBindTelServiceInterface;
  21. use App\Service\v3\Interfaces\AppointmentTimeServiceInterface;
  22. use Psr\Http\Message\ResponseInterface;
  23. use App\Model\v3\UserAddress;
  24. class OrderOnlineController extends BaseController
  25. {
  26. /**
  27. * @Inject
  28. * @var UserBindTelServiceInterface
  29. */
  30. protected $userBindTelService;
  31. /**
  32. * @Inject
  33. * @var CouponRecServiceInterface
  34. */
  35. protected $couponRecService;
  36. /**
  37. * @Inject
  38. * @var AppointmentTimeServiceInterface
  39. */
  40. protected $appointmentTimeService;
  41. /**
  42. * @Inject
  43. * @var OrderOnlineServiceInterface
  44. */
  45. protected $orderOnlineService;
  46. /**
  47. * @Inject
  48. * @var ShopCartServiceInterface
  49. */
  50. protected $shopCartService;
  51. /**
  52. * @Inject
  53. * @var SeparateAccountsServiceInterface
  54. */
  55. protected $separateAccountsService;
  56. /**
  57. * @Inject
  58. * @var UserAddressServiceInterface
  59. */
  60. protected $userAddressService;
  61. /*
  62. * 如果没有绑手机号去绑定页面
  63. * 收货地址接口
  64. * 返回预约送达时间
  65. * 商品数据接口
  66. * 红包独立接口
  67. * 配送费独立接口 可根据距离动态计算费用
  68. * 增值服务接口
  69. * */
  70. public function review()
  71. {
  72. $userId = $this->request->input('user_id');
  73. $marketId = $this->request->input('market_id');
  74. $shopcartIds = $this->request->input('shopcart_ids');
  75. //判断用户有没有绑定手机
  76. $telExists = $this->userBindTelService->check($userId);
  77. if(!$telExists){
  78. throw new ErrorCodeException(ErrorCode::NOT_BIND_TEL_ERROR);
  79. }
  80. //获取用户收货地址
  81. $address = UserAddress::query()->where([
  82. ['user_id','=',$userId],
  83. ['is_default','=',1],
  84. ])
  85. ->select('id')
  86. ->first();
  87. $res['location'] = $this->userAddressService->getAddressAndDistributionRrice($address->id,$marketId);
  88. //返回预约送达时间 数组
  89. $res['appointment_time'] = $this->appointmentTimeService->do();
  90. //
  91. $res['store_list'] = $this->shopCartService->getGoodsByShopcartId($shopcartIds);
  92. //获取用户优惠券
  93. $res['coupon'] = $this->couponRecService->allForOnlineOrderAvailable($userId, $marketId);
  94. //增值服务接口
  95. $res['value_added_service'] = [
  96. 'select' => 1,
  97. 'price' => 3.50
  98. ];
  99. $total = 0;
  100. foreach ($res['store_list'] as $store)
  101. {
  102. $total = bcadd($total,$store['subtotal'],2);
  103. }
  104. $total = bcadd($total,$res['value_added_service']['price'],2);
  105. $total = bcadd($total,$res['location']['distribution_price'],2);
  106. $res['total'] = $total;
  107. return $this->success($res);
  108. }
  109. /**
  110. * 订单详情
  111. * 1、主订单信息,用户配送信息(地址、姓名、电话、配送时间、配送类型)、基础信息(订单ID、订单编号、下单时间、订单金额、付款时间、支付方式、红包优惠、服务站电话、增值服务费)
  112. * 2、子订单以及订单商品,按商户分组,有商户信息(ID、商户名、商户logo),商品信息(id、名字、封面、规格、tag、原价、售价、库存、总销、月销、是否失效、失效原因)
  113. * @param OrderOnlineDetailRequest $request
  114. * @return ResponseInterface
  115. */
  116. public function detailByUser(OrderOnlineDetailRequest $request)
  117. {
  118. $params = $request->validated();
  119. return $this->success(['detail' => $this->orderOnlineService->detailByUser($params['order_id'], $params['user_id'])]);
  120. }
  121. /**
  122. * 下单并进行支付,返回支付参数
  123. * 1、用户传参,用户地址ID,用于获取用户地址经纬度来计算配送费
  124. * 2、用户传参,购物车IDs,去获取购物车里的商品详情
  125. * 3、预约送达时间
  126. * 4、优惠券IDs
  127. * 5、订单总金额,用于校验比对
  128. * 6、下单成功,请求支付
  129. * @param OrderOnlineRequest $request
  130. * @return ResponseInterface
  131. */
  132. public function add(OrderOnlineRequest $request){
  133. // 下单
  134. $params = $request->validated();
  135. $couponIds = isset($params['coupon_ids'])&&$params['coupon_ids'] ? explode(',', $params['coupon_ids']) : [];
  136. $data = $this->orderOnlineService->do(
  137. $params['market_id'],
  138. $params['user_id'],
  139. $params['user_address_id'],
  140. json_decode($params['store_list']),
  141. $params['total_money'],
  142. $params['delivery_time_note'],
  143. $params['service_money'],
  144. $couponIds,
  145. $params['plat']
  146. );
  147. return $this->success(['data' => $data]);
  148. }
  149. /**
  150. * 待支付订单重新发起支付
  151. * 1、用户id、订单id
  152. * 2、发起支付
  153. * @param OrderOnlineStateRequest $request
  154. * @return ResponseInterface
  155. */
  156. public function pay(OrderOnlineStateRequest $request)
  157. {
  158. $params = $request->validated();
  159. $data = $this->orderOnlineService->doPay($params['order_id'], $params['user_id']);
  160. return $this->success(['data' => $data]);
  161. }
  162. /**
  163. * 取消订单
  164. * @param OrderOnlineStateRequest $request
  165. * @return ResponseInterface
  166. */
  167. public function cancel(OrderOnlineStateRequest $request)
  168. {
  169. $params = $request->validated();
  170. $this->orderOnlineService->undo($params['order_id'], $params['user_id']);
  171. return $this->success([]);
  172. }
  173. /**
  174. * 删除订单
  175. * @param OrderOnlineStateRequest $request
  176. * @return ResponseInterface
  177. */
  178. public function del(OrderOnlineStateRequest $request)
  179. {
  180. $params = $request->validated();
  181. $this->orderOnlineService->doDel($params['order_id'], $params['user_id']);
  182. return $this->success([]);
  183. }
  184. /**
  185. * 申请退款
  186. * @param OrderOnlineStateRequest $request
  187. * @return ResponseInterface
  188. */
  189. public function applyRefund(OrderOnlineStateRequest $request)
  190. {
  191. $params = $request->validated();
  192. $this->orderOnlineService->doApplyRefund($params['order_id'], $params['user_id']);
  193. return $this->success([]);
  194. }
  195. /**
  196. * 完成订单
  197. * @param OrderOnlineStateRequest $request
  198. * @return ResponseInterface
  199. */
  200. public function complete(OrderOnlineStateRequest $request)
  201. {
  202. Db::beginTransaction();
  203. try {
  204. $params = $request->validated();
  205. $this->orderOnlineService->doComplete($params['order_id'], $params['user_id']);
  206. $this->separateAccountsService->orderOnlineCompleted($params['order_id'], $params['user_id']);
  207. Db::commit();
  208. return $this->success([]);
  209. } catch (\Exception $e) {
  210. Db::rollBack();
  211. $this->log->event(LogLabel::ORDER_COMPLETE_LOG, ['exception' => $e->getMessage()]);
  212. throw new ErrorCodeException(ErrorCode::ORDER_COMPLETE_FAIL, $e->getMessage());
  213. }
  214. }
  215. }