Эх сурвалжийг харах

fixed:技师端-优化资质信息

刘学玺 4 сар өмнө
parent
commit
81debd9e27

+ 18 - 10
app/Http/Controllers/Coach/AccountController.php

@@ -62,7 +62,7 @@ class AccountController extends Controller
      *
      * @authenticated
      *
-     * @bodyParam qual_type string required 资质类型(按摩师/理疗师等) Example: 高级按摩师
+     * @bodyParam qual_type int required 资质类型(1:初级按摩师 2:中级按摩师 3:高级按摩师) Example: 1
      * @bodyParam qual_photo string required 资质证书照片 Example: base64或其他格式的图片数据
      * @bodyParam business_license string required 营业执照照片 Example: base64或其他格式的图片数据
      * @bodyParam health_cert string required 健康证照片 Example: base64或其他格式的图片数据
@@ -105,7 +105,7 @@ class AccountController extends Controller
     /**
      * [账户]获取技师信息
      *
-     * @description 取技师的基本信息、资质信息和实名信息
+     * @description 取技师的基本信息、资质信息和实名认证信息
      *
      * @authenticated
      *
@@ -113,7 +113,7 @@ class AccountController extends Controller
      *   "data": {
      *     "base_info": {
      *       "nickname": "张三",
-     *       "avatar": "http://example.com/avatar.jpg",
+     *       "avatar": "base64或其他格式的图片数据",
      *       "gender": "1",
      *       "mobile": "138****8000",
      *       "birthday": "1990-01-01",
@@ -121,28 +121,36 @@ class AccountController extends Controller
      *       "intention_city": "北京",
      *       "introduction": "专业按摩师,从业5年",
      *       "state": 1,
+     *       "state_text": "已通过",
      *       "audit_remark": "审核通过"
      *     },
      *     "qualification": {
      *       "qual_type": "高级按摩师",
-     *       "qual_no": "XZ2024001",
-     *       "qual_photo": "http://example.com/cert.jpg",
-     *       "valid_start": "2024-01-01",
-     *       "valid_end": "2029-01-01",
+     *       "qual_photo": "base64或其他格式的图片数据",
+     *       "business_license": "base64或其他格式的图片数据",
+     *       "health_cert": "base64或其他格式的图片数据",
      *       "state": 1,
+     *       "state_text": "已通过",
      *       "audit_remark": "审核通过"
      *     },
      *     "real_name": {
      *       "real_name": "张三",
      *       "id_card": "370602****1234",
-     *       "id_card_front_photo": "http://example.com/front.jpg",
-     *       "id_card_back_photo": "http://example.com/back.jpg",
-     *       "id_card_hand_photo": "http://example.com/hold.jpg",
+     *       "id_card_front_photo": "base64或其他格式的图片数据",
+     *       "id_card_back_photo": "base64或其他格式的图片数据",
+     *       "id_card_hand_photo": "base64或其他格式的图片数据",
      *       "state": 1,
+     *       "state_text": "已通过",
      *       "audit_remark": "审核通过"
      *     }
      *   }
      * }
+     * @response 404 {
+     *   "message": "用户不存在"
+     * }
+     * @response 404 {
+     *   "message": "技师信息不存在"
+     * }
      */
     public function info()
     {

+ 3 - 3
app/Http/Requests/Coach/SubmitQualificationRequest.php

@@ -14,7 +14,7 @@ class SubmitQualificationRequest extends FormRequest
     public function rules()
     {
         return [
-            'qual_type' => 'required|string|max:50',
+            'qual_type' => 'required|integer|in:1,2,3',
             'qual_photo' => 'required|string|max:2048',
             'business_license' => 'required|string|max:2048',
             'health_cert' => 'required|string|max:2048',
@@ -25,8 +25,8 @@ class SubmitQualificationRequest extends FormRequest
     {
         return [
             'qual_type.required' => '资质类型不能为空',
-            'qual_type.string' => '资质类型必须是字符串',
-            'qual_type.max' => '资质类型不能超过50个字符',
+            'qual_type.integer' => '资质类型必须是整数',
+            'qual_type.in' => '资质类型只能是1(初级)、2(中级)或3(高级)',
             'qual_photo.required' => '资质证书照片不能为空',
             'qual_photo.string' => '资质证书照片格式不正确',
             'qual_photo.max' => '资质证书照片数据过大',

+ 72 - 15
app/Services/Coach/AccountService.php

@@ -98,7 +98,7 @@ class AccountService
      *
      * @param User $user 当前认证用户
      * @param array $data 资质信息数据,包含:
-     *        - qual_type: string 资质类型(如:高级按摩师)
+     *        - qual_type: int 资质类型(1:初级 2:中级 3:高级)
      *        - qual_photo: string 资质证书照片
      *        - business_license: string 营业执照照片
      *        - health_cert: string 健康证照片
@@ -210,31 +210,57 @@ class AccountService
 
     /**
      * 获取技师信息
+     * 包括基本信息、资质信息和实名认证信息
+     *
+     * 业务流程:
+     * 1. 验证用户和技师信息存在性
+     * 2. 尝试从缓存获取数据
+     * 3. 如果缓存不存在,从数据库获取并缓存
+     *
+     * 注意事项:
+     * - 所有图片数据不限制格式
+     * - 敏感信息会进行脱敏处理
+     * - 使用缓存提高性能
+     *
+     * @param User $user 当前认证用户
+     * @return array 返回技师所有信息,包含:
+     *        - base_info: array|null 基本信息
+     *        - qualification: array|null 资质信息
+     *        - real_name: array|null 实名认证信息
+     * @throws \Exception 当验证失败时抛出异常
      */
     public function getCoachInfo($user)
     {
-        abort_if(! $user, 404, '用户不存在');
-        abort_if(! $user->coach, 404, '技师信息不存在');
+        // 验证用户和技师信息
+        abort_if(!$user, 404, '用户不存在');
+        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);
             }
         );
     }
 
-
     /**
      * 获取技师详细信息
+     * 从数据库获取最新的认证记录信息
+     *
+     * @param CoachUser $coach 技师对象
+     * @return array 格式化后的技师信息
      */
     private function fetchCoachInfo($coach)
     {
+        // 获取最新的各类认证记录
         $baseInfo = $coach->infoRecords()->latest()->first();
         $qualification = $coach->qualRecords()->latest()->first();
         $realName = $coach->realRecords()->latest()->first();
 
+        // 格式化并返回数据
         return [
             'base_info' => $baseInfo ? $this->formatBaseInfo($baseInfo) : null,
             'qualification' => $qualification ? $this->formatQualification($qualification) : null,
@@ -244,14 +270,19 @@ class AccountService
 
     /**
      * 格式化基本信息
+     * 处理技师基本信息的展示格式
+     *
+     * @param object $info 基本信息记录对象
+     * @return array 格式化后的基本信息
      */
     private function formatBaseInfo($info)
     {
+        // 返回格式化后的基本信息,包含状态文本
         return [
             'nickname' => $info->nickname,
-            'avatar' => $info->avatar,
+            'avatar' => $info->avatar,  // 支持任意格式的图片数据
             'gender' => $info->gender,
-            'mobile' => $this->maskMobile($info->mobile),
+            'mobile' => $this->maskMobile($info->mobile),  // 手机号脱敏处理
             'birthday' => $info->birthday,
             'work_years' => $info->work_years,
             'intention_city' => $info->intention_city,
@@ -264,17 +295,27 @@ class AccountService
 
     /**
      * 格式化资质信息
+     * 处理技师资质信息的展示格式
      *
      * @param object $qual 资质记录对象
      * @return array 格式化后的资质信息
      */
     private function formatQualification($qual)
     {
+        // 资质类型文本映射
+        $qualTypeMap = [
+            1 => '初级按摩师',
+            2 => '中级按摩师',
+            3 => '高级按摩师',
+        ];
+
+        // 返回格式化后的资质信息,包含状态文本
         return [
             'qual_type' => $qual->qual_type,
-            'qual_photo' => $qual->qual_photo,
-            'business_license' => $qual->business_license,
-            'health_cert' => $qual->health_cert,
+            'qual_type_text' => $qualTypeMap[$qual->qual_type] ?? '未知类型',  // 添加类型文本
+            'qual_photo' => $qual->qual_photo,  // 支持任意格式的图片数据
+            'business_license' => $qual->business_license,  // 支持任意格式的图片数据
+            'health_cert' => $qual->health_cert,  // 支持任意格式的图片数据
             'state' => $qual->state,
             'state_text' => TechnicianAuthStatus::fromValue($qual->state)->label(),
             'audit_remark' => $qual->audit_remark,
@@ -283,15 +324,20 @@ class AccountService
 
     /**
      * 格式化实名信息
+     * 处理技师实名认证信息的展示格式
+     *
+     * @param object $real 实名认证记录对象
+     * @return array 格式化后的实名信息
      */
     private function formatRealName($real)
     {
+        // 返回格式化后的实名信息,包含状态文本和脱敏处理
         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' => $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,  // 支持任意格式的图片数据
             'state' => $real->state,
             'state_text' => TechnicianAuthStatus::fromValue($real->state)->label(),
             'audit_remark' => $real->audit_remark,
@@ -300,6 +346,10 @@ class AccountService
 
     /**
      * 手机号脱敏
+     * 将手机号中间4位替换为****
+     *
+     * @param string $mobile 原始手机号
+     * @return string 脱敏后的手机号
      */
     private function maskMobile($mobile)
     {
@@ -307,10 +357,17 @@ class AccountService
     }
 
     /**
-     * 身份证脱敏
+     * 身份证号脱敏
+     * 将身份证号中间8位替换为****
+     *
+     * @param string|null $idCard 原始身份证号
+     * @return string|null 脱敏后的身份证号
      */
     private function maskIdCard($idCard)
     {
+        if (!$idCard) {
+            return null;
+        }
         return substr_replace($idCard, '****', 6, 8);
     }
 
@@ -759,7 +816,7 @@ class AccountService
      */
     private function validateRestStatus(int $currentStatus): void
     {
-        // 只有在空闲或忙碌状态下才能改为休息状态
+        // 只有在空闲或忙碌状态下才能改为休息状态
         abort_if(! in_array($currentStatus, [
             TechnicianWorkStatus::FREE->value,
             TechnicianWorkStatus::BUSY->value,