|
@@ -229,6 +229,155 @@ class OrderService
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 取消订单
|
|
|
+ */
|
|
|
+ public function cancelOrder($userId, $orderId)
|
|
|
+ {
|
|
|
+ return DB::transaction(function () use ($userId, $orderId) {
|
|
|
+ try {
|
|
|
+ $user = MemberUser::where('id', $userId)->firstOrFail();
|
|
|
+ $order = $user->orders()->find($orderId);
|
|
|
+
|
|
|
+ if (! $order) {
|
|
|
+ throw new Exception('订单不存在');
|
|
|
+ }
|
|
|
+
|
|
|
+ // 判断订单状态
|
|
|
+ if ($order->state == 'wait_receive') { // 已接单
|
|
|
+ // 扣除20%费用
|
|
|
+ $deductAmount = ($order->payment_amount + $order->balance_amount - $order->traffic_amount) * 0.2;
|
|
|
+ $this->handleRefund($user, $order, $deductAmount, false);
|
|
|
+ } elseif ($order->state == 'on_the_way') { // 已出发
|
|
|
+ // 扣除50%费用并扣除路费
|
|
|
+ $deductAmount = ($order->payment_amount + $order->balance_amount - $order->traffic_amount) * 0.5;
|
|
|
+ $this->handleRefund($user, $order, $deductAmount, true);
|
|
|
+ } elseif ($order->state == 'wait_pay') {
|
|
|
+ // 待支付状态直接取消,无需退款
|
|
|
+ } else {
|
|
|
+ throw new Exception('当前订单状态不允许取消');
|
|
|
+ }
|
|
|
+
|
|
|
+ // 添加订单取消记录
|
|
|
+ OrderRecord::create([
|
|
|
+ 'order_id' => $orderId,
|
|
|
+ 'object_id' => $userId,
|
|
|
+ 'object_type' => MemberUser::class,
|
|
|
+ 'state' => 'cancel',
|
|
|
+ 'remark' => '用户取消订单',
|
|
|
+ ]);
|
|
|
+
|
|
|
+ // 修改订单状态
|
|
|
+ $order->state = 'cancel';
|
|
|
+ $order->save();
|
|
|
+
|
|
|
+ return ['message' => '订单已取消'];
|
|
|
+ } catch (Exception $e) {
|
|
|
+ Log::error('取消订单失败:', [
|
|
|
+ 'message' => $e->getMessage(),
|
|
|
+ 'user_id' => $userId,
|
|
|
+ 'order_id' => $orderId,
|
|
|
+ ]);
|
|
|
+ throw $e;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理退款
|
|
|
+ */
|
|
|
+ private function handleRefund($user, $order, $deductAmount, $deductTrafficFee)
|
|
|
+ {
|
|
|
+ // 计算实际退款金额
|
|
|
+ $refundAmount = $order->payment_amount + $order->balance_amount;
|
|
|
+ if ($deductTrafficFee) {
|
|
|
+ $refundAmount -= $order->traffic_amount;
|
|
|
+ // 记录技师路费收入
|
|
|
+ // ...
|
|
|
+ }
|
|
|
+ $refundAmount -= $deductAmount;
|
|
|
+
|
|
|
+ // 优先从余额支付金额中扣除
|
|
|
+ $balanceRefund = min($order->balance_amount, $refundAmount);
|
|
|
+ if ($balanceRefund > 0) {
|
|
|
+
|
|
|
+ // 添加钱包退款记录
|
|
|
+ $refundRecord = $user->wallet->refundRecords()->create([
|
|
|
+ 'refund_method' => 'balance',
|
|
|
+ 'total_refund_amount' => $order->payment_amount + $order->balance_amount,
|
|
|
+ 'actual_refund_amount' => '0.00',
|
|
|
+ 'wallet_balance_refund_amount' => $balanceRefund,
|
|
|
+ 'recharge_balance_refund_amount' => '0.00',
|
|
|
+ 'remark' => '订单取消退还余额',
|
|
|
+ 'order_id' => $order->id,
|
|
|
+ ]);
|
|
|
+
|
|
|
+ // 添加钱包交易记录
|
|
|
+ $user->wallet->transRecords()->create([
|
|
|
+ 'amount' => $balanceRefund,
|
|
|
+ 'owner_type' => $refundRecord::class,
|
|
|
+ 'owner_id' => $refundRecord->id,
|
|
|
+ 'remark' => '订单取消退还余额',
|
|
|
+ 'trans_type' => 'income',
|
|
|
+ 'storage_type' => 'balance',
|
|
|
+ 'amount' => $balanceRefund,
|
|
|
+ 'before_balance' => $user->wallet->total_balance,
|
|
|
+ 'after_balance' => $user->wallet->total_balance + $balanceRefund,
|
|
|
+ 'before_recharge_balance' => '0.00',
|
|
|
+ 'after_recharge_balance' => '0.00',
|
|
|
+ 'trans_time' => now(),
|
|
|
+ 'state' => 'success',
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $user->wallet->increment('total_balance', $balanceRefund);
|
|
|
+ $user->wallet->increment('available_balance', $balanceRefund);
|
|
|
+ $user->wallet->save();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 剩余退款金额从支付金额中退还
|
|
|
+ $paymentRefund = $refundAmount - $balanceRefund;
|
|
|
+ if ($paymentRefund > 0) {
|
|
|
+
|
|
|
+ // 添加钱包退款记录
|
|
|
+ $refundRecord = $user->wallet->refundRecords()->create([
|
|
|
+ 'refund_method' => 'balance',
|
|
|
+ 'total_refund_amount' => $order->payment_amount + $order->balance_amount,
|
|
|
+ 'actual_refund_amount' => '0.00',
|
|
|
+ 'wallet_balance_refund_amount' => $balanceRefund,
|
|
|
+ 'recharge_balance_refund_amount' => '0.00',
|
|
|
+ 'remark' => '订单取消退还余额',
|
|
|
+ 'order_id' => $order->id,
|
|
|
+ ]);
|
|
|
+
|
|
|
+ // 添加钱包交易记录
|
|
|
+ $user->wallet->transRecords()->create([
|
|
|
+ 'amount' => $balanceRefund,
|
|
|
+ 'owner_type' => $refundRecord::class,
|
|
|
+ 'owner_id' => $refundRecord->id,
|
|
|
+ 'remark' => '订单取消退还余额',
|
|
|
+ 'trans_type' => 'income',
|
|
|
+ 'storage_type' => 'balance',
|
|
|
+ 'amount' => $balanceRefund,
|
|
|
+ 'before_balance' => $user->wallet->total_balance,
|
|
|
+ 'after_balance' => $user->wallet->total_balance + $balanceRefund,
|
|
|
+ 'before_recharge_balance' => '0.00',
|
|
|
+ 'after_recharge_balance' => '0.00',
|
|
|
+ 'trans_time' => now(),
|
|
|
+ 'state' => 'success',
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $user->wallet->increment('total_balance', $paymentRefund);
|
|
|
+ $user->wallet->increment('available_balance', $paymentRefund);
|
|
|
+ $user->wallet->save();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 记录平台收入
|
|
|
+ if ($deductAmount > 0) {
|
|
|
+ // TODO: 添加平台收入记录
|
|
|
+ // PlatformIncome::create([...]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 结束订单
|
|
|
*/
|
|
@@ -289,36 +438,6 @@ class OrderService
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 取消订单
|
|
|
- */
|
|
|
- public function cancelOrder($userId, $orderId)
|
|
|
- {
|
|
|
- return DB::transaction(function () use ($userId, $orderId) {
|
|
|
- $order = Order::where('user_id', $userId)
|
|
|
- ->where('id', $orderId)
|
|
|
- ->first();
|
|
|
-
|
|
|
- if (! $order) {
|
|
|
- throw new Exception('订单不存在');
|
|
|
- }
|
|
|
-
|
|
|
- // 添加订单取消记录
|
|
|
- OrderRecord::create([
|
|
|
- 'order_id' => $orderId,
|
|
|
- 'user_id' => $userId,
|
|
|
- 'state' => 'cancel',
|
|
|
- 'remark' => '用户取消订单',
|
|
|
- ]);
|
|
|
-
|
|
|
- // 修改订单状态
|
|
|
- $order->state = 'cancelled';
|
|
|
- $order->save();
|
|
|
-
|
|
|
- return ['message' => '订单已取消'];
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 获取订单列表
|
|
|
*/
|