Ver Fonte

feat:订单管理->取消订单

刘学玺 há 4 meses atrás
pai
commit
95c22a41aa

+ 25 - 19
app/Models/CoachUser.php

@@ -10,24 +10,25 @@ use Slowlyo\OwlAdmin\Models\BaseModel as Model;
  */
 class CoachUser extends Model
 {
-	use SoftDeletes;
+    use SoftDeletes;
 
-	protected $table = 'coach_users';
+    protected $table = 'coach_users';
 
     protected $guarded = [];
 
     protected static function booted()
-	{
-		static::created(function ($user) {
-			$user->wallet()->create([
-				'owner_type' => CoachUser::class,
-				'owner_id' => $user->id
-			]);
-		});
-	}
+    {
+        static::created(function ($user) {
+            $user->wallet()->create([
+                'owner_type' => CoachUser::class,
+                'owner_id' => $user->id,
+            ]);
+        });
+    }
 
     /**
      * @Author FelixYin
+     *
      * @description 技师所属会员
      */
     public function member()
@@ -37,6 +38,7 @@ class CoachUser extends Model
 
     /**
      * @Author FelixYin
+     *
      * @description 技师关联信息
      */
     public function info()
@@ -46,6 +48,7 @@ class CoachUser extends Model
 
     /**
      * @Author FelixYin
+     *
      * @description 技师关联资质信息
      */
     public function qual()
@@ -55,6 +58,7 @@ class CoachUser extends Model
 
     /**
      * @Author FelixYin
+     *
      * @description 技师关联评分
      */
     public function score()
@@ -64,6 +68,7 @@ class CoachUser extends Model
 
     /**
      * @Author FelixYin
+     *
      * @description 技师关联定位
      */
     public function locations()
@@ -73,15 +78,7 @@ class CoachUser extends Model
 
     /**
      * @Author FelixYin
-     * @description 技师关联订单
-     */
-    public function orders()
-    {
-        return $this->hasMany('App\Models\OrderInfo', 'coach_id', 'id');
-    }
-
-    /**
-     * @Author FelixYin
+     *
      * @description 技师关联抢单记录
      */
     public function grabRecords()
@@ -91,6 +88,7 @@ class CoachUser extends Model
 
     /**
      * @Author FelixYin
+     *
      * @description 技师关联评论
      */
     public function comments()
@@ -100,6 +98,7 @@ class CoachUser extends Model
 
     /**
      * @Author FelixYin
+     *
      * @description 技师关联钱包
      */
     public function wallet()
@@ -109,6 +108,7 @@ class CoachUser extends Model
 
     /**
      * @Author FelixYin
+     *
      * @description 技师所属店铺
      */
     public function shop()
@@ -118,6 +118,7 @@ class CoachUser extends Model
 
     /**
      * @Author FelixYin
+     *
      * @description 技师关联店铺开通服务
      */
     public function shopOpenService()
@@ -127,6 +128,7 @@ class CoachUser extends Model
 
     /**
      * @Author FelixYin
+     *
      * @description 技师关联实名信息
      */
     public function real()
@@ -136,6 +138,7 @@ class CoachUser extends Model
 
     /**
      * @Author FelixYin
+     *
      * @description 技师开通项目
      */
     public function projects()
@@ -145,6 +148,7 @@ class CoachUser extends Model
 
     /**
      * @Author FelixYin
+     *
      * @description 基本信息认证记录
      */
     public function infoRecords()
@@ -154,6 +158,7 @@ class CoachUser extends Model
 
     /**
      * @Author FelixYin
+     *
      * @description 技师关联资质记录
      */
     public function qualRecords()
@@ -163,6 +168,7 @@ class CoachUser extends Model
 
     /**
      * @Author FelixYin
+     *
      * @description 技师关联实名认证记录
      */
     public function realAuthRecords()

+ 7 - 3
app/Models/WalletRefundRecord.php

@@ -10,12 +10,15 @@ use Slowlyo\OwlAdmin\Models\BaseModel as Model;
  */
 class WalletRefundRecord extends Model
 {
-	use SoftDeletes;
+    use SoftDeletes;
 
-	protected $table = 'wallet_refund_records';
+    protected $table = 'wallet_refund_records';
+
+    protected $guarded = [];
 
     /**
      * @Author FelixYin
+     *
      * @description 退款记录所属钱包
      */
     public function wallet()
@@ -25,10 +28,11 @@ class WalletRefundRecord extends Model
 
     /**
      * @Author FelixYin
+     *
      * @description 退款记录所属交易
      */
     public function trans()
     {
         return $this->belongsTo('App\Models\WalletTransRecord', 'trans_record_id');
     }
-}
+}

+ 9 - 3
app/Models/WalletTransRecord.php

@@ -10,12 +10,15 @@ use Slowlyo\OwlAdmin\Models\BaseModel as Model;
  */
 class WalletTransRecord extends Model
 {
-	use SoftDeletes;
+    use SoftDeletes;
 
-	protected $table = 'wallet_trans_records';
+    protected $table = 'wallet_trans_records';
+
+    protected $guarded = [];
 
     /**
      * @Author FelixYin
+     *
      * @description 交易记录所属钱包
      */
     public function wallet()
@@ -25,6 +28,7 @@ class WalletTransRecord extends Model
 
     /**
      * @Author FelixYin
+     *
      * @description 钱包交易关联提现记录
      */
     public function withdraw()
@@ -34,6 +38,7 @@ class WalletTransRecord extends Model
 
     /**
      * @Author FelixYin
+     *
      * @description 交易关联支付记录
      */
     public function paymentRecords()
@@ -43,10 +48,11 @@ class WalletTransRecord extends Model
 
     /**
      * @Author FelixYin
+     *
      * @description 交易关联退款记录
      */
     public function refundRecords()
     {
         return $this->hasMany('App\Models\WalletRefundRecord', 'trans_record_id', 'id');
     }
-}
+}

+ 149 - 30
app/Services/Client/OrderService.php

@@ -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' => '订单已取消'];
-        });
-    }
-
     /**
      * 获取订单列表
      */