MixedOrderService.php 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <?php
  2. namespace services\common;
  3. use common\enums\PayTypeEnum;
  4. use common\enums\UserWalletEnum;
  5. use common\models\common\PaymentTrade;
  6. use common\models\common\PaymentTradeItem;
  7. use common\models\order\Order;
  8. use Exception;
  9. /**
  10. * 组合支付订单服务
  11. * Class MixedOrderService
  12. * @package common\services\mall\order
  13. */
  14. final class MixedOrderService extends BaseService
  15. {
  16. /**
  17. * 订单关闭
  18. *
  19. * @param integer $id
  20. * @return boolean
  21. */
  22. public function close(int $id)
  23. {
  24. $order = Order::findOne([['id' => $id]]);
  25. if (empty($order)) throw new Exception($id . ': 订单不存在');
  26. if (empty($trade = $order->trade)) throw new Exception($id . ': 支付流水不存在');
  27. return $this->tradeClose($trade, $order);
  28. }
  29. /**
  30. * 支付流水关闭(钱包退回)
  31. *
  32. * @param PaymentTrade $trade
  33. * @param Order $order
  34. * @param integer $type 1:关闭, 2:二次支付
  35. * @return boolean
  36. */
  37. public function tradeClose(PaymentTrade $trade, Order $order, $type = 1)
  38. {
  39. /**
  40. * @var PaymentTrade $trade
  41. */
  42. if (!$trade->isMixedPay() && $trade->isClose()) return true;
  43. if (empty($wallet_item = $trade->getWalletPayItem())) throw new Exception($order->id . ': 钱包支付项不存在');
  44. // 支付钱包关闭
  45. if ($wallet_item->isClose()) return true;
  46. /**
  47. * @var PaymentTradeItem|null $wallet_item
  48. */
  49. // 钱包退回
  50. $desc = '订单【' . $order->order_no . '】关闭, 组合支付钱包退回';
  51. $capital_type = UserWalletEnum::CONSUME_ORDER_CLOSE;
  52. if ($type == 2) {
  53. $desc = '订单【' . $order->order_no . '】二次支付, 组合支付钱包退回';
  54. $capital_type = UserWalletEnum::SECONDARY_PAYMENT;
  55. }
  56. if ($wallet_item->pay_type == PayTypeEnum::CONSUMER_CARD) {
  57. $insert_wallet = [
  58. 'mall_id' => $trade->mall_id,
  59. 'user_id' => $trade->user_id,
  60. 'wallet_type' => \addons\ScoreGame\common\enums\ScoreGameEnum::WALLET_TYPE_CONSUMER_CARD,
  61. 'change_type' => \common\models\common\CapitalLog::CHANGE_TYPE_ADD,
  62. 'change_num' => $wallet_item->pay_fee,
  63. 'source_table' => PaymentTradeItem::tableName(),
  64. 'source_table_id' => $wallet_item->id,
  65. 'from_type' => \addons\ScoreGame\common\enums\ScoreGameEnum::SCORE_CAPITAL_TYPE_CONSUME,
  66. 'capital_type' => \addons\ScoreGame\common\enums\ScoreGameEnum::SCORE_CAPITAL_TYPE_CONSUME,
  67. 'order_no' => $order->order_no,
  68. 'desc' => $desc,
  69. 'created_at' => time(),
  70. 'updated_at' => time(),
  71. ];
  72. \addons\ScoreGame\common\logic\WalletLogic::handle($insert_wallet);
  73. } else {
  74. $insert_wallet[] = [
  75. 'mall_id' => $trade->mall_id,
  76. 'user_id' => $trade->user_id,
  77. 'is_frozen' => false,
  78. 'wallet_type' => $wallet_item->getWalletType(),
  79. 'money' => $wallet_item->pay_fee,
  80. 'desc' => $desc,
  81. 'source_table' => PaymentTradeItem::tableName(),
  82. 'source_table_id' => $wallet_item->id,
  83. 'from_type' => UserWalletEnum::CONSUME,
  84. 'capital_type' => $capital_type,
  85. 'order_no' => $order->order_no,
  86. ];
  87. UserWalletService::batchHandle($insert_wallet);
  88. }
  89. $trade->close();
  90. $wallet_item->close();
  91. return true;
  92. }
  93. }