Browse Source

fix:修复idea 代码报错问题

Yin Bin 4 months ago
parent
commit
913eff58e8

+ 19 - 0
app/Http/Controllers/Client/OrderController.php

@@ -348,4 +348,23 @@ class OrderController extends Controller
 
         return $this->service->getOrderGrabList($orderId);
     }
+
+    /**
+     * [订单]生成核销码
+     *
+     * 生成订单核销码,用于技师扫码开始服务
+     *
+     * @authenticated
+     *
+     * @urlParam id required 订单ID. Example: 1
+     *
+     * @response {
+     *   "qr_code": "order_123_1679876543_abcdef123456",
+     *   "expired_at": "2024-03-27 10:30:00"
+     * }
+     */
+    public function generateCode($id)
+    {
+        return $this->service->generateVerificationCode(Auth::user()->id, $id);
+    }
 }

+ 49 - 11
app/Services/Client/OrderService.php

@@ -30,6 +30,7 @@ use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Log;
 use Illuminate\Support\Facades\Redis;
+use SimpleSoftwareIO\QrCode\Facades\QrCode;
 
 class OrderService
 {
@@ -424,7 +425,7 @@ class OrderService
         }
         $refundAmount -= $deductAmount;
 
-        // 优先余额支付金额中扣除
+        // 优先余额支付金额中扣除
         $balanceRefund = min($order->balance_amount, $refundAmount);
         if ($balanceRefund > 0) {
             $this->createRefundRecords($user, $order, $balanceRefund);
@@ -489,7 +490,7 @@ class OrderService
      */
     private function logCancelOrderError(Exception $e, int $userId, int $orderId): void
     {
-        // 复用之前的日记录方法
+        // 复用之前的日记录方法
         Log::error('取消订单失败:', [
             'message' => $e->getMessage(),
             'user_id' => $userId,
@@ -1246,36 +1247,73 @@ class OrderService
     /**
      * 生成订单核销码
      *
+     * @param  int  $userId  用户ID
      * @param  int  $orderId  订单ID
      * @return array 返回核销码信息
      *
      * @throws Exception
      */
-    public function generateVerificationCode(int $orderId): array
+    public function generateVerificationCode(int $userId, int $orderId): array
     {
         try {
-            // 1. 验证订单
-            $order = Order::where('id', $orderId)
-                ->where('user_id', Auth::id())
-                ->where('state', OrderStatus::PAID->value)
+            // 1. 验证用户
+            $user = MemberUser::where('id', $userId)
+                ->where('state', UserStatus::OPEN->value)
+                ->firstOrFail();
+
+            // 2. 验证订单状态和归属
+            $order = $user->orders()
+                ->where('id', $orderId)
+                ->whereIn('state', [
+                    OrderStatus::PAID->value,
+                    OrderStatus::ACCEPTED->value,
+                    OrderStatus::DEPARTED->value,
+                    OrderStatus::ARRIVED->value,
+                ])
                 ->firstOrFail();
 
-            // 2. 生成时间戳
+            // 3. 生成时间戳
             $timestamp = time();
 
-            // 3. 生成签名 (使用订单ID、时间戳和应用密钥)
+            // 4. 生成签名
             $sign = md5("order_{$order->id}_{$timestamp}_".config('app.key'));
 
-            // 4. 组装二维码内容
+            // 5. 组装二维码内容
             $qrCode = "order_{$order->id}_{$timestamp}_{$sign}";
 
+            // 6. 生成二维码图片
+            try {
+                $qrCodeImage = QrCode::encoding('UTF-8')
+                    ->size(300)
+                    ->margin(1)
+                    ->style('square')
+                    ->eye('square')
+                    ->backgroundColor(255, 255, 255)
+                    ->color(0, 0, 0)
+                    ->generate($qrCode);
+
+                $qrCodeBase64 = 'data:image/png;base64,'.base64_encode($qrCodeImage);
+            } catch (Exception $e) {
+                Log::error('生成二维码图片失败:', [
+                    'order_id' => $orderId,
+                    'error' => $e->getMessage(),
+                ]);
+                // 如果二维码生成失败,仍然返回文本内容
+                $qrCodeBase64 = null;
+            }
+
+            // 7. 返回结果
             return [
+                'order_id' => $order->id,
                 'qr_code' => $qrCode,
-                'expired_at' => date('Y-m-d H:i:s', $timestamp + 300), // 5分钟后过期
+                'qr_image' => $qrCodeBase64,
+                'expired_at' => date('Y-m-d H:i:s', $timestamp + 300),
+                'state' => $order->state,
             ];
 
         } catch (Exception $e) {
             Log::error('生成订单核销码失败:', [
+                'user_id' => $userId,
                 'order_id' => $orderId,
                 'error' => $e->getMessage(),
                 'trace' => $e->getTraceAsString(),

+ 2 - 2
composer.json

@@ -6,6 +6,7 @@
     "license": "MIT",
     "require": {
         "php": "^8.2",
+        "huifurepo/dg-php-sdk": "^2.0",
         "iwzh/owl-scheduling": "^1.0",
         "knuckleswtf/scribe": "^4.0",
         "laravel/framework": "v11.30.0",
@@ -22,8 +23,7 @@
         "slowlyo/owl-log-viewer": "^1.0",
         "slowlyo/owl-module-notice": "^1.1",
         "slowlyo/owl-operation-log": "^0.2.3",
-        "slowlyo/owl-system-backup": "^0.3.1",
-        "huifurepo/dg-php-sdk": "^2.0"
+        "slowlyo/owl-system-backup": "^0.3.1"
     },
     "require-dev": {
         "barryvdh/laravel-ide-helper": "^3.2",

+ 1 - 1
composer.lock

@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "b4e8636675b2f11d5f8de08125c4fcb3",
+    "content-hash": "216ae47f51f0f3e23b67357d29ab725c",
     "packages": [
         {
             "name": "bacon/bacon-qr-code",

+ 2 - 0
config/app.php

@@ -165,6 +165,7 @@ return [
         // Application Service Providers...
         App\Providers\QueryLogServiceProvider::class,
         Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class,
+        SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class,
     ],
 
     /*
@@ -205,6 +206,7 @@ return [
         'Notification' => Illuminate\Support\Facades\Notification::class,
         'Password' => Illuminate\Support\Facades\Password::class,
         'Process' => Illuminate\Support\Facades\Process::class,
+        'QrCode' => SimpleSoftwareIO\QrCode\Facades\QrCode::class,
         'Queue' => Illuminate\Support\Facades\Queue::class,
         'RateLimiter' => Illuminate\Support\Facades\RateLimiter::class,
         'Redirect' => Illuminate\Support\Facades\Redirect::class,

+ 3 - 1
routes/api.php

@@ -23,7 +23,7 @@ Route::get('/enums', [EnumController::class, 'getEnumData']);
 // 客户端路由组
 Route::prefix('client')->group(function () {
 
-    // 无需认证的路由
+    // 无需认证的��路由
     Route::prefix('account')->group(function () {
         // 发验证码
         Route::post('send-code', [AccountController::class, 'sendVerifyCode']);
@@ -110,6 +110,8 @@ Route::prefix('client')->group(function () {
             // 指派技师
             Route::post('assign-coach', [App\Http\Controllers\Client\OrderController::class, 'assignCoach'])
                 ->name('assign-coach');
+            // 生成订单核销码
+            Route::get('{id}/code', [OrderController::class, 'generateCode']);
         });
 
         // 钱包相关