Browse Source

feat:优化了技师实名认证以及资质认证

景好勇win11 3 months ago
parent
commit
9ff002fe74

+ 28 - 6
app/Admin/Controllers/CoachRealRecordController.php

@@ -2,10 +2,12 @@
 
 namespace App\Admin\Controllers;
 
+use Slowlyo\OwlAdmin\Admin;
+use Illuminate\Http\Request;
+use App\Models\CoachRealRecord;
 use App\Services\CoachRealRecordService;
+use Illuminate\Support\Facades\Validator;
 use Slowlyo\OwlAdmin\Controllers\AdminController;
-use Illuminate\Http\Request;
-use Slowlyo\OwlAdmin\Admin;
 
 /**
  * 技师实名认证
@@ -106,18 +108,38 @@ class CoachRealRecordController extends AdminController
     public function audit(Request $request)
     {
         $validated = $request->validate([
-            'real_auth_record_id' => 'required|integer|exists:coach_real_records,id',
-            'real_auth_state' => 'required|integer|in:2,3', // 2:通过 3:驳回
+            'id' => 'required|integer|exists:coach_real_records,id',
+            'state' => 'required|integer|in:2,3', // 2:通过 3:驳回
             'audit_remark' => 'required|string|max:255',
         ]);
 
         $result = $this->service->audit(
-            $validated['real_auth_record_id'],
-            $validated['real_auth_state'],
+            $validated['id'],
+            $validated['state'],
             $validated['audit_remark'],
             Admin::user()->id
         );
 
         return $this->autoResponse($result);
     }
+
+    /**
+     * 修改技师实名认证信息
+     *
+     * @param Request $request
+     * @return \Illuminate\Http\JsonResponse
+     */
+    public function updateInfo(Request $request)
+    {
+        $validated = $request->validate([
+            'id' => 'required|integer|exists:coach_real_records,id',
+            'id_card_front_photo' => 'nullable|string|max:255',
+            'id_card_back_photo' => 'nullable|string|max:255',
+            'id_card_hand_photo' => 'nullable|string|max:255',
+        ]);
+
+        $result = $this->service->updateInfo($validated['id'], $validated);
+
+        return $this->autoResponse($result);
+    }
 }

+ 59 - 0
app/Models/VCoachQualRecord.php

@@ -0,0 +1,59 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * 技师资格记录视图模型
+ *
+ * 包含字段:
+ * - qual_record_id: 资格记录ID
+ * - coach_id: 技师编号
+ * - qualification: 资格证书
+ * - issue_date: 发证日期
+ * - expiry_date: 过期日期
+ * - auditor: 审核人
+ * - audit_time: 审核时间
+ * - audit_remark: 审核回执
+ */
+class VCoachQualRecord extends Model
+{
+    /**
+     * 关联到模型的数据表
+     *
+     * @var string
+     */
+    protected $table = 'v_coach_qual_record';
+
+    /**
+     * 表明模型是否应该被打上时间戳
+     *
+     * @var bool
+     */
+    public $timestamps = false;
+
+    /**
+     * 可以被批量赋值的属性
+     *
+     * @var array
+     */
+    protected $guarded = [];
+
+    /**
+     * 应该被转换成原生类型的属性
+     *
+     * @var array
+     */
+    protected $casts = [
+        'qual_photo' => 'array',
+        'id_card_front_photo' => 'array',
+        'id_card_back_photo' => 'array',
+        'id_card_hand_photo' => 'array',
+        'avatar' => 'array',
+        'portrait_images' => 'array',
+        'business_license' => 'array',
+        'health_certificate' => 'array',
+        'life_photos' => 'array',
+    ];
+}

+ 8 - 9
app/Models/VCoachAuthRecord.php → app/Models/VCoachRealRecord.php

@@ -5,30 +5,30 @@ namespace App\Models;
 use Illuminate\Database\Eloquent\Model;
 
 /**
- * 技师认证记录视图模型
+ * 技师真实记录视图模型
  *
  * 包含字段:
- * - real_auth_record_id: 实名认证记录ID
+ * - real_record_id: 实记录ID
  * - coach_id: 技师编号
  * - nickname: 技师昵称
  * - gender: 性别
  * - phone: 手机号
  * - portrait_images: 技术形象照
  * - coach_state: 技师状态
- * - real_auth_state: 实名认证状态
+ * - real_record_state: 真实记录状态
  * - id_card_images: 身份证照片
  * - auditor: 审核人
  * - audit_time: 审核时间
  * - audit_remark: 审核回执
  */
-class VCoachAuthRecord extends Model
+class VCoachRealRecord extends Model
 {
     /**
      * 关联到模型的数据表
      *
      * @var string
      */
-    protected $table = 'v_coach_qual_record';
+    protected $table = 'v_coach_real_record';
 
     /**
      * 表明模型是否应该被打上时间戳
@@ -50,9 +50,8 @@ class VCoachAuthRecord extends Model
      * @var array
      */
     protected $casts = [
-        'business_license' => 'array',
-        'health_certificate' => 'array',
-        'life_photos' => 'array',
-        'qual_photo' => 'array',
+        'id_card_front_photo' => 'array',
+        'id_card_back_photo' => 'array',
+        'id_card_hand_photo' => 'array',
     ];
 }

+ 23 - 19
app/Services/Coach/AccountService.php

@@ -99,7 +99,7 @@ class AccountService
     }
 
     /**
-     * 提���技师资质信息
+     * 提技师资质信息
      * 包括资质证书照片、营业执照和健康证照片的提交和审核
      *
      * 业务流程:
@@ -213,6 +213,9 @@ class AccountService
             // 创建新的实名认证记录,设置为待审核状态
             $user->coach->realRecords()->create(array_merge($data, [
                 'state' => TechnicianAuthStatus::AUDITING->value,
+                'id_card_front_photo' => json_encode($data['id_card_front_photo']),
+                'id_card_back_photo' => json_encode($data['id_card_back_photo']),
+                'id_card_hand_photo' => json_encode($data['id_card_hand_photo']),
             ]));
 
             // 清除技师信息缓存,确保数据一致性
@@ -258,14 +261,15 @@ class AccountService
         abort_if(!$user->coach, 404, '技师信息不存在');
 
         // 尝试从缓存获取数据
-        return Cache::remember(
-            self::CACHE_KEY_PREFIX . $user->coach->id,
-            self::CACHE_TTL,
-            function () use ($user) {
-                // 缓存不存在时,从数据库获取
-                return $this->fetchCoachInfo($user->coach);
-            }
-        );
+        // return Cache::remember(
+        //     self::CACHE_KEY_PREFIX . $user->coach->id,
+        //     self::CACHE_TTL,
+        //     function () use ($user) {
+        //         // 缓存不存在时,从数据库获取
+        //         return $this->fetchCoachInfo($user->coach);
+        //     }
+        // );
+        return $this->fetchCoachInfo($user->coach);
     }
 
     /**
@@ -537,9 +541,9 @@ class AccountService
         return [
             'qual_type' => $qual->qual_type,
             'qual_type_text' => $qualTypeMap[$qual->qual_type] ?? '未知类型',
-            'qual_photo' => $qual->qual_photo,
-            'business_license' => $qual->business_license,
-            'health_cert' => $qual->health_cert,
+            'qual_photo' => json_decode($qual->qual_photo, true),
+            'business_license' => json_decode($qual->business_license, true),
+            'health_cert' => json_decode($qual->health_cert, true),
             'state' => $qual->state,
             'state_text' => $qual->state ? TechnicianAuthStatus::fromValue($qual->state)->label() : null,
             'audit_remark' => $qual->audit_remark,
@@ -560,13 +564,13 @@ class AccountService
             return null;
         }
 
-        // 返回格式��后的实名信息,包含状态文本和脱敏处理
+        // 返回格式后的实名信息,包含状态文本和脱敏处理
         return [
             'real_name' => $real->real_name,
             'id_card' => $this->maskIdCard($real->id_card),
-            'id_card_front_photo' => $real->id_card_front_photo,
-            'id_card_back_photo' => $real->id_card_back_photo,
-            'id_card_hand_photo' => $real->id_card_hand_photo,
+            'id_card_front_photo' => $real->id_card_front_photo ? json_decode($real->id_card_front_photo, true) : null,
+            'id_card_back_photo' => $real->id_card_back_photo ? json_decode($real->id_card_back_photo, true) : null,
+            'id_card_hand_photo' => $real->id_card_hand_photo ? json_decode($real->id_card_hand_photo, true) : null,
             'state' => $real->state,
             'state_text' => $real->state ? TechnicianAuthStatus::fromValue($real->state)->label() : null,
             'audit_remark' => $real->audit_remark,
@@ -714,7 +718,7 @@ class AccountService
      * 格式化位置响应数据
      *
      * @param CoachLocation $location 位置记录
-     * @return array 格式化后���位置信息,包含:
+     * @return array 格式化后位置信息,包含:
      *        - province: string 省份
      *        - city: string 城市
      *        - district: string 区县
@@ -785,7 +789,7 @@ class AccountService
         // 验证时间段数组
         abort_if(empty($timeRanges), 400, '必须至少设置一个时间段');
 
-        // 验证每个时间段格式并转换为分钟���进行比较
+        // 验证每个时间段格式并转换为分钟进行比较
         $ranges = collect($timeRanges)->map(function ($range) {
             abort_if(
                 !isset($range['start_time'], $range['end_time']),
@@ -1168,7 +1172,7 @@ class AccountService
      */
     private function getLatestBaseInfo(CoachUser $coach): CoachInfoRecord
     {
-        // 获取最新的��师信息记录(排除审核拒绝的记录)
+        // 获取最新的师信息记录(排除审核拒绝的记录)
         $latestInfo = $coach->infoRecords()
             ->where('state', '<>', TechnicianAuthStatus::REJECTED->value)
             ->latest()

+ 51 - 2
app/Services/CoachRealRecordService.php

@@ -2,11 +2,11 @@
 
 namespace App\Services;
 
+use App\Models\CoachUser;
 use App\Models\CoachRealRecord;
-use Slowlyo\OwlAdmin\Services\AdminService;
 use Illuminate\Support\Facades\DB;
-use App\Models\CoachUser;
 use App\Enums\TechnicianAuthStatus;
+use Slowlyo\OwlAdmin\Services\AdminService;
 
 /**
  * 技师实名认证
@@ -62,4 +62,53 @@ class CoachRealRecordService extends AdminService
             throw $e;
         }
     }
+
+    /**
+     * 更新技师实名认证信息
+     *
+     * @param int $id 认证记录ID
+     * @param array $data 更新的数据
+     * @return bool
+     * @throws \Exception
+     */
+    public function updateInfo(int $id, array $data): bool
+    {
+        DB::beginTransaction();
+        try {
+            // 获取认证记录
+            $record = $this->getModel()::findOrFail($id);
+
+            // 准备更新数据,确保不为 null
+            $updateData = [];
+
+            if (isset($data['id_card_front_photo'])) {
+                // 确保存储的值是有效的 JSON 格式
+                $updateData['id_card_front_photo'] = json_encode($data['id_card_front_photo']);
+            }
+
+            if (isset($data['id_card_back_photo'])) {
+                // 确保存储的值是有效的 JSON 格式
+                $updateData['id_card_back_photo'] = json_encode($data['id_card_back_photo']);
+            }
+
+            if (isset($data['id_card_hand_photo'])) {
+                // 确保存储的值是有效的 JSON 格式
+                $updateData['id_card_hand_photo'] = json_encode($data['id_card_hand_photo']);
+            }
+
+            // 确保更新数据不为空
+            if (empty($updateData)) {
+                throw new \Exception('没有提供有效的更新数据');
+            }
+
+            // 更新认证记录
+            $record->update($updateData);
+
+            DB::commit();
+            return true;
+        } catch (\Exception $e) {
+            DB::rollBack();
+            throw $e;
+        }
+    }
 }

+ 12 - 6
routes/web.php

@@ -1,14 +1,14 @@
 <?php
 
-use App\Admin\Controllers\CoachUserController;
-use App\Admin\Controllers\MemberUserController;
-use App\Admin\Controllers\OrderController;
-use App\Admin\Controllers\ShopInfoController;
-use App\Http\Controllers\EnumController;
+use Slowlyo\OwlAdmin\Admin;
 use Illuminate\Routing\Router;
 use Illuminate\Support\Facades\Route;
-use Slowlyo\OwlAdmin\Admin;
+use App\Http\Controllers\EnumController;
+use App\Admin\Controllers\OrderController;
 use App\Http\Controllers\UploadController;
+use App\Admin\Controllers\ShopInfoController;
+use App\Admin\Controllers\CoachUserController;
+use App\Admin\Controllers\MemberUserController;
 
 
 Route::get('/', function () {
@@ -132,6 +132,9 @@ Route::group(
 
         // 上传
         Route::post('/upload', [UploadController::class, 'upload']);
+
+        // 修改技师实名认证信息
+        Route::post('coach_real_records/update_info', [\App\Admin\Controllers\CoachRealRecordController::class, 'updateInfo']);
     }
 );
 
@@ -245,5 +248,8 @@ Route::group([
 
         // 修改技师基本信息
         Route::post('coach_info_records/update_info', [\App\Admin\Controllers\CoachInfoRecordController::class, 'updateInfo']);
+
+        // 修改技师实名认证信息
+        Route::post('coach_real_records/update_info', [\App\Admin\Controllers\CoachRealRecordController::class, 'updateInfo']);
     });
 });