|
@@ -38,6 +38,7 @@ use App\Services\Client\Traits\ValidatesServiceTime;
|
|
|
use App\Services\Client\Traits\CalculatesOrderAmounts;
|
|
|
use App\Models\CoachStatistic;
|
|
|
use App\Models\FinanceRecord;
|
|
|
+use App\Models\OrderRefundRecord;
|
|
|
|
|
|
readonly class OrderService
|
|
|
{
|
|
@@ -928,42 +929,40 @@ readonly class OrderService
|
|
|
*/
|
|
|
private function processCancelRefund(Order $order, array $refundAmounts): void
|
|
|
{
|
|
|
- // 1. 处理余额退款(不记录财务流水,因为是内部账户变动)
|
|
|
- if ($refundAmounts['balance_refund'] > 0) {
|
|
|
- $this->processBalanceCancelRefund($order, $refundAmounts['balance_refund']);
|
|
|
- }
|
|
|
+ try {
|
|
|
+ // 1. 处理余额退款
|
|
|
+ if ($refundAmounts['balance_refund'] > 0) {
|
|
|
+ $this->processBalanceCancelRefund($order, $refundAmounts['balance_refund']);
|
|
|
+ }
|
|
|
|
|
|
- // 2. 处理支付退款(记录财务支出)
|
|
|
- if ($refundAmounts['payment_refund'] > 0) {
|
|
|
- $this->processPaymentCancelRefund($order, $refundAmounts['payment_refund']);
|
|
|
+ // 2. 处理支付退款
|
|
|
+ if ($refundAmounts['payment_refund'] > 0) {
|
|
|
+ $refundResult = $this->processPaymentCancelRefund($order, $refundAmounts['payment_refund']);
|
|
|
|
|
|
- // 记录支付退款支出
|
|
|
- FinanceRecord::create([
|
|
|
- 'owner_type' => 'platform',
|
|
|
+ // 3. 创建退款记录
|
|
|
+ OrderRefundRecord::create([
|
|
|
+ 'order_id' => $order->id,
|
|
|
+ 'refund_no' => $refundResult['refund_no'],
|
|
|
+ 'total_refund_amount' => $refundAmounts['total_refund'],
|
|
|
+ 'balance_refund_amount' => $refundAmounts['balance_refund'],
|
|
|
+ 'payment_refund_amount' => $refundAmounts['payment_refund'],
|
|
|
+ 'penalty_amount' => $refundAmounts['penalty'],
|
|
|
+ 'coach_fee' => $refundAmounts['coach_fee'],
|
|
|
+ 'platform_traffic_fee' => $refundAmounts['platform_traffic_fee'],
|
|
|
+ 'platform_penalty' => $refundAmounts['platform_penalty'],
|
|
|
+ 'transaction_id' => $order->transaction_id,
|
|
|
+ 'state' => 'processing',
|
|
|
+ 'remark' => '订单取消退款'
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ Log::error('处理退款失败', [
|
|
|
'order_id' => $order->id,
|
|
|
- 'type' => 'expense',
|
|
|
- 'business_type' => 'refund',
|
|
|
- 'amount' => $refundAmounts['payment_refund'],
|
|
|
- 'payment_type' => 'wechat',
|
|
|
- 'user_id' => $order->user_id,
|
|
|
- 'remark' => '订单取消微信支付退款'
|
|
|
+ 'refund_amounts' => $refundAmounts,
|
|
|
+ 'error' => $e->getMessage()
|
|
|
]);
|
|
|
+ throw $e;
|
|
|
}
|
|
|
-
|
|
|
- // 3. 创建退款记录
|
|
|
- $order->refundRecords()->create([
|
|
|
- 'total_refund_amount' => $refundAmounts['total_refund'],
|
|
|
- 'balance_refund_amount' => $refundAmounts['balance_refund'],
|
|
|
- 'payment_refund_amount' => $refundAmounts['payment_refund'],
|
|
|
- 'penalty_amount' => $refundAmounts['penalty_amount'],
|
|
|
- 'coach_fee' => $refundAmounts['coach_fee'],
|
|
|
- 'platform_traffic_fee' => $refundAmounts['platform_traffic_fee'],
|
|
|
- 'platform_penalty' => $refundAmounts['platform_penalty'],
|
|
|
- 'refund_no' => $this->generateRefundNo($order),
|
|
|
- 'state' => 'success',
|
|
|
- 'remark' => '订单取消退款',
|
|
|
- 'refund_time' => now()
|
|
|
- ]);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -1001,7 +1000,7 @@ readonly class OrderService
|
|
|
/**
|
|
|
* 处理支付退款
|
|
|
*/
|
|
|
- private function processPaymentCancelRefund(Order $order, float $amount): void
|
|
|
+ private function processPaymentCancelRefund(Order $order, float $amount): array
|
|
|
{
|
|
|
try {
|
|
|
// 调用支付服务处理退款
|
|
@@ -1024,6 +1023,8 @@ readonly class OrderService
|
|
|
'state' => OrderRecordStatus::REFUNDING->value,
|
|
|
'remark' => '微信支付退款'
|
|
|
]);
|
|
|
+
|
|
|
+ return $result;
|
|
|
} catch (\Exception $e) {
|
|
|
Log::error('订单退款失败', [
|
|
|
'order_id' => $order->id,
|