PreOrderPay.php 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: shenyang
  5. * Date: 2018/6/6
  6. * Time: 下午3:41
  7. */
  8. namespace app\frontend\modules\orderPay\models;
  9. use app\common\events\order\BeforeOrderPayValidateEvent;
  10. use app\common\exceptions\AppException;
  11. use app\common\models\PayType;
  12. use app\frontend\models\Member;
  13. use app\common\models\Order;
  14. use app\frontend\models\OrderPay;
  15. use app\frontend\modules\order\OrderCollection;
  16. use app\frontend\modules\order\services\OrderService;
  17. use Illuminate\Database\Eloquent\Collection;
  18. use app\common\models\OrderGoods;
  19. class PreOrderPay extends OrderPay
  20. {
  21. /**
  22. * @param OrderCollection $orders
  23. * @throws AppException
  24. */
  25. public function setOrders(OrderCollection $orders)
  26. {
  27. $this->order_ids = $orders->pluck('id');
  28. $this->amount = $orders->sum('price');
  29. $this->uid = $orders->first()->uid;
  30. $this->pay_sn = OrderService::createPaySN();
  31. $this->validateOrders($orders);
  32. }
  33. /**
  34. * @param Collection $orders
  35. * @throws AppException
  36. */
  37. private function validateOrders(Collection $orders)
  38. {
  39. $orders->each(function (Order $order) {
  40. if ($order->status > Order::WAIT_PAY) {
  41. throw new AppException('(ID:' . $order->id . ')订单已付款,请勿重复付款');
  42. }
  43. if ($order->status == Order::CLOSE) {
  44. throw new AppException('(ID:' . $order->id . ')订单已关闭,无法付款');
  45. }
  46. if ($order->is_pending) {
  47. throw new AppException('(ID:' . $order->id . ')订单已锁定,无法付款');
  48. }
  49. //找人代付 商米D2支付方式有冲突,加pos_pay请求
  50. if ($order->uid != \YunShop::app()->getMemberId() && !Member::getPid() && $this->pay_type_id != PayType::BACKEND && !request()->pos_pay) {
  51. throw new AppException('(ID:' . $order->id . ')该订单属于其他用户');
  52. }
  53. // 转账付款审核中
  54. if ($order->pay_type_id == PayType::REMITTANCE) {
  55. throw new AppException('(ID:' . $order->id . ')该订单处于转账审核中,请先关闭转账审核申请,再选择其他支付方式');
  56. }
  57. // 校验订单商品库存
  58. event(new BeforeOrderPayValidateEvent($order));
  59. });
  60. // 订单金额验证
  61. if ($orders->sum('price') < 0) {
  62. throw new AppException('(' . $this->orders->sum('price') . ')订单金额有误');
  63. }
  64. }
  65. /**
  66. * @throws AppException
  67. */
  68. public function store()
  69. {
  70. $this->save();
  71. if ($this->id === null) {
  72. throw new AppException('支付流水记录保存失败');
  73. }
  74. $this->orders()->attach($this->order_ids);
  75. // 校验库存
  76. foreach ($this->orders as $order) {
  77. foreach ($order->orderGoods as $orderGoods) {
  78. /**
  79. * @var OrderGoods $orderGoods
  80. */
  81. $orderGoods->goodsStock()->withhold();
  82. }
  83. }
  84. }
  85. }