Order.php 6.6 KB

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