12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- <?php
- namespace App\Services\Client\Traits;
- use App\Enums\OrderStatus;
- use App\Models\MemberUser;
- use App\Models\Order;
- use App\Models\WalletRefundRecord;
- use Illuminate\Support\Facades\Log;
- trait HandlesRefunds
- {
- /**
- * 处理订单取消退款
- */
- protected function handleCancelRefund(Order $order): void
- {
- $user = $order->user;
- $deductAmount = $this->calculateDeductAmount($order);
- $this->processRefund($user, $order, $deductAmount);
- }
- /**
- * 计算扣除金额
- */
- private function calculateDeductAmount(Order $order): float
- {
- $baseAmount = $order->payment_amount + $order->balance_amount - $order->traffic_amount;
- return match ($order->state) {
- OrderStatus::ACCEPTED->value => $baseAmount * 0.2, // 已接单扣除20%
- OrderStatus::DEPARTED->value => $baseAmount * 0.5, // 已出发扣除50%
- default => 0
- };
- }
- /**
- * 处理退款流程
- */
- private function processRefund(MemberUser $user, Order $order, float $deductAmount): void
- {
- try {
- $refundAmount = $this->calculateRefundAmount($order, $deductAmount);
- if ($refundAmount > 0) {
- // 退还余额
- $user->wallet->increment('total_balance', $refundAmount);
- $user->wallet->increment('available_balance', $refundAmount);
- // 创建退款记录
- $this->createRefundRecord($order, $refundAmount);
- }
- } catch (\Exception $e) {
- Log::error('处理退款失败', [
- 'order_id' => $order->id,
- 'user_id' => $user->id,
- 'error' => $e->getMessage(),
- ]);
- throw $e;
- }
- }
- /**
- * 创建退款记录
- */
- private function createRefundRecord(Order $order, float $refundAmount): void
- {
- WalletRefundRecord::create([
- 'order_id' => $order->id,
- 'user_id' => $order->user_id,
- 'amount' => $refundAmount,
- 'state' => 'success',
- ]);
- }
- }
|