Order.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. <?php
  2. namespace app\api\controller\user;
  3. use app\api\controller\Controller;
  4. use app\api\model\order\Order as OrderModel;
  5. use app\api\model\settings\Setting as SettingModel;
  6. use app\api\service\pay\PayService;
  7. use app\common\enum\order\OrderPayTypeEnum;
  8. use app\common\service\qrcode\ExtractService;
  9. use app\common\model\supplier\Service as ServiceModel;
  10. use app\common\model\supplier\User as SupplierUserModel;
  11. /**
  12. * 我的订单
  13. */
  14. class Order extends Controller
  15. {
  16. // user
  17. private $user;
  18. /**
  19. * 构造方法
  20. */
  21. public function initialize()
  22. {
  23. parent::initialize();
  24. $this->user = $this->getUser(); // 用户信息
  25. }
  26. /**
  27. * 我的订单列表
  28. */
  29. public function lists($dataType)
  30. {
  31. $data = $this->postData();
  32. $model = new OrderModel;
  33. $list = $model->getList($this->user['user_id'], $dataType, $data);
  34. $show_alipay = PayService::isAlipayOpen($data['pay_source'], $this->user['app_id']);
  35. return $this->renderSuccess('', compact('list', 'show_alipay'));
  36. }
  37. /**
  38. * 订单详情信息
  39. */
  40. public function detail($order_id, $pay_source = '')
  41. {
  42. // 订单详情
  43. $model = OrderModel::getUserOrderDetail($order_id, $this->user['user_id']);
  44. // 剩余支付时间
  45. if ($model['pay_status']['value'] == 10 && $model['order_status']['value'] != 20) {
  46. $model['pay_end_time'] = $this->formatPayEndTime($model['pay_end_time'] - time());
  47. } else {
  48. $model['pay_end_time'] = '';
  49. }
  50. // 该订单是否允许申请售后
  51. $model['isAllowRefund'] = $model->isAllowRefund();
  52. $model['supplier']['supplier_user_id'] = (new SupplierUserModel())->where('shop_supplier_id', '=', $model['shop_supplier_id'])->value('supplier_user_id');
  53. return $this->renderSuccess('', [
  54. 'order' => $model, // 订单详情
  55. 'setting' => [
  56. // 积分名称
  57. 'points_name' => SettingModel::getPointsName(),
  58. //是否开启客服
  59. 'service_open' => SettingModel::getSysConfig()['service_open'],
  60. //店铺客服信息
  61. 'mp_service' => ServiceModel::detail($model['shop_supplier_id']),
  62. ],
  63. 'show_alipay' => PayService::isAlipayOpen($pay_source, $model['app_id'])
  64. ]);
  65. }
  66. /**
  67. * 支付成功详情信息
  68. */
  69. public function paySuccess($order_id)
  70. {
  71. $order_arr = explode(',', $order_id);
  72. $order = [
  73. 'pay_price' => 0,
  74. 'points_bonus' => 0
  75. ];
  76. foreach ($order_arr as $id) {
  77. $model = OrderModel::getUserOrderDetail($id, $this->user['user_id']);
  78. $order['pay_price'] += $model['pay_price'];
  79. $order['points_bonus'] += $model['points_bonus'];
  80. }
  81. return $this->renderSuccess('', compact('order'));
  82. }
  83. /**
  84. * 获取物流信息
  85. */
  86. public function express($order_id)
  87. {
  88. // 订单信息
  89. $order = OrderModel::getUserOrderDetail($order_id, $this->user['user_id']);
  90. if (!$order['express_no']) {
  91. return $this->renderError('没有物流信息');
  92. }
  93. // 获取物流信息
  94. $model = $order['express'];
  95. $express = $model->dynamic($model['express_name'], $model['express_code'], $order['express_no']);
  96. if ($express === false) {
  97. return $this->renderError($model->getError());
  98. }
  99. return $this->renderSuccess('', compact('express'));
  100. }
  101. /**
  102. * 取消订单
  103. */
  104. public function cancel($order_id)
  105. {
  106. $model = OrderModel::getUserOrderDetail($order_id, $this->user['user_id']);
  107. if ($model->cancel($this->user)) {
  108. return $this->renderSuccess('订单取消成功');
  109. }
  110. return $this->renderError($model->getError() ?: '订单取消失败');
  111. }
  112. /**
  113. * 确认收货
  114. */
  115. public function receipt($order_id)
  116. {
  117. $model = OrderModel::getUserOrderDetail($order_id, $this->user['user_id']);
  118. if ($model->receipt()) {
  119. return $this->renderSuccess('收货成功');
  120. }
  121. return $this->renderError($model->getError() ?: '收货失败');
  122. }
  123. /**
  124. * 立即支付
  125. */
  126. public function pay($order_id, $payType = OrderPayTypeEnum::WECHAT, $pay_source = 'wx')
  127. {
  128. // 获取订单详情
  129. $model = OrderModel::getUserOrderDetail($order_id, $this->user['user_id']);
  130. // 订单支付事件
  131. if (!$model->onPay($payType)) {
  132. return $this->renderError($model->getError() ?: '订单支付失败');
  133. }
  134. // 构建微信支付请求
  135. $payment = $model->onOrderPayment($this->user, [$model], $payType, $pay_source);
  136. // 支付状态提醒
  137. return $this->renderSuccess('', [
  138. 'order_id' => $model['order_id'], // 订单id
  139. 'pay_type' => $payType, // 支付方式
  140. 'payment' => $payment // 微信支付参数
  141. ], ['success' => '支付成功', 'error' => '订单未支付']);
  142. }
  143. /**
  144. * 获取订单核销二维码
  145. */
  146. public function qrcode($order_id, $source)
  147. {
  148. // 订单详情
  149. $order = OrderModel::getUserOrderDetail($order_id, $this->user['user_id']);
  150. // 判断是否为待核销订单
  151. if (!$order->checkExtractOrder($order)) {
  152. return $this->renderError($order->getError());
  153. }
  154. $Qrcode = new ExtractService(
  155. $this->app_id,
  156. $this->user,
  157. $order_id,
  158. $source,
  159. $order['order_no']
  160. );
  161. return $this->renderSuccess('', [
  162. 'qrcode' => $Qrcode->getImage(),
  163. ]);
  164. }
  165. private function formatPayEndTime($leftTime)
  166. {
  167. if ($leftTime <= 0) {
  168. return '';
  169. }
  170. $str = '';
  171. $day = floor($leftTime / 86400);
  172. $hour = floor(($leftTime - $day * 86400) / 3600);
  173. $min = floor((($leftTime - $day * 86400) - $hour * 3600) / 60);
  174. if ($day > 0) $str .= $day . '天';
  175. if ($hour > 0) $str .= $hour . '小时';
  176. if ($min > 0) $str .= $min . '分钟';
  177. return $str;
  178. }
  179. }