| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- <?php
- namespace services\common;
- use common\enums\PayTypeEnum;
- use common\enums\UserWalletEnum;
- use common\models\common\PaymentTrade;
- use common\models\common\PaymentTradeItem;
- use common\models\order\Order;
- use Exception;
- /**
- * 组合支付订单服务
- * Class MixedOrderService
- * @package common\services\mall\order
- */
- final class MixedOrderService extends BaseService
- {
- /**
- * 订单关闭
- *
- * @param integer $id
- * @return boolean
- */
- public function close(int $id)
- {
- $order = Order::findOne([['id' => $id]]);
- if (empty($order)) throw new Exception($id . ': 订单不存在');
- if (empty($trade = $order->trade)) throw new Exception($id . ': 支付流水不存在');
- return $this->tradeClose($trade, $order);
- }
- /**
- * 支付流水关闭(钱包退回)
- *
- * @param PaymentTrade $trade
- * @param Order $order
- * @param integer $type 1:关闭, 2:二次支付
- * @return boolean
- */
- public function tradeClose(PaymentTrade $trade, Order $order, $type = 1)
- {
- /**
- * @var PaymentTrade $trade
- */
- if (!$trade->isMixedPay() && $trade->isClose()) return true;
- if (empty($wallet_item = $trade->getWalletPayItem())) throw new Exception($order->id . ': 钱包支付项不存在');
- // 支付钱包关闭
- if ($wallet_item->isClose()) return true;
- /**
- * @var PaymentTradeItem|null $wallet_item
- */
- // 钱包退回
- $desc = '订单【' . $order->order_no . '】关闭, 组合支付钱包退回';
- $capital_type = UserWalletEnum::CONSUME_ORDER_CLOSE;
- if ($type == 2) {
- $desc = '订单【' . $order->order_no . '】二次支付, 组合支付钱包退回';
- $capital_type = UserWalletEnum::SECONDARY_PAYMENT;
- }
- if ($wallet_item->pay_type == PayTypeEnum::CONSUMER_CARD) {
- $insert_wallet = [
- 'mall_id' => $trade->mall_id,
- 'user_id' => $trade->user_id,
- 'wallet_type' => \addons\ScoreGame\common\enums\ScoreGameEnum::WALLET_TYPE_CONSUMER_CARD,
- 'change_type' => \common\models\common\CapitalLog::CHANGE_TYPE_ADD,
- 'change_num' => $wallet_item->pay_fee,
- 'source_table' => PaymentTradeItem::tableName(),
- 'source_table_id' => $wallet_item->id,
- 'from_type' => \addons\ScoreGame\common\enums\ScoreGameEnum::SCORE_CAPITAL_TYPE_CONSUME,
- 'capital_type' => \addons\ScoreGame\common\enums\ScoreGameEnum::SCORE_CAPITAL_TYPE_CONSUME,
- 'order_no' => $order->order_no,
- 'desc' => $desc,
- 'created_at' => time(),
- 'updated_at' => time(),
- ];
- \addons\ScoreGame\common\logic\WalletLogic::handle($insert_wallet);
- } else {
- $insert_wallet[] = [
- 'mall_id' => $trade->mall_id,
- 'user_id' => $trade->user_id,
- 'is_frozen' => false,
- 'wallet_type' => $wallet_item->getWalletType(),
- 'money' => $wallet_item->pay_fee,
- 'desc' => $desc,
- 'source_table' => PaymentTradeItem::tableName(),
- 'source_table_id' => $wallet_item->id,
- 'from_type' => UserWalletEnum::CONSUME,
- 'capital_type' => $capital_type,
- 'order_no' => $order->order_no,
- ];
- UserWalletService::batchHandle($insert_wallet);
- }
- $trade->close();
- $wallet_item->close();
- return true;
- }
- }
|