Ver Fonte

Merge branch 'master' of ssh://gogs.yinbin.ink:30004/didong/owl-admin

刘学玺 há 3 meses atrás
pai
commit
d45affec6b

BIN
.DS_Store


+ 1 - 0
.gitignore

@@ -37,3 +37,4 @@ _ide_helper_models.php
 .env
 composer.lock
 php.ini
+.DS_Store

+ 4 - 4
app/Admin/Controllers/CoachInfoRecordController.php

@@ -2,10 +2,10 @@
 
 namespace App\Admin\Controllers;
 
+use Slowlyo\OwlAdmin\Admin;
+use Illuminate\Http\Request;
 use App\Services\CoachInfoRecordService;
 use Slowlyo\OwlAdmin\Controllers\AdminController;
-use Illuminate\Http\Request;
-use Slowlyo\OwlAdmin\Admin;
 
 /**
  * @group 后台
@@ -121,13 +121,13 @@ class CoachInfoRecordController extends AdminController
         $validated = $request->validate([
             'info_record_id' => 'required|integer|exists:coach_info_records,id',
             'info_record_state' => 'required|integer|in:2,3', // 2:通过 3:驳回
-            'audit_remark' => 'required|string|max:255',
+            'audit_remark' => 'nullable|string|max:255', // 改为可选
         ]);
 
         $result = $this->service->audit(
             $validated['info_record_id'],
             $validated['info_record_state'],
-            $validated['audit_remark'],
+            $validated['audit_remark'] ?? '', // 添加默认值
             Admin::user()->id
         );
 

+ 8 - 8
app/Admin/Controllers/CoachQualRecordController.php

@@ -2,10 +2,10 @@
 
 namespace App\Admin\Controllers;
 
+use Slowlyo\OwlAdmin\Admin;
+use Illuminate\Http\Request;
 use App\Services\CoachQualRecordService;
 use Slowlyo\OwlAdmin\Controllers\AdminController;
-use Illuminate\Http\Request;
-use Slowlyo\OwlAdmin\Admin;
 
 /**
  * 技师资质认证记录
@@ -86,8 +86,8 @@ class CoachQualRecordController extends AdminController
      *
      * @header x-xsrf-token required CSRF令牌 Example: your_csrf_token
      *
-     * @bodyParam qual_record_id integer required 资质认证记录ID Example: 1
-     * @bodyParam qual_state integer required 审核状态(2:通过 3:驳回) Example: 2
+     * @bodyParam qualification_record_id integer required 资质认证记录ID Example: 1
+     * @bodyParam qualification_record_state integer required 审核状态(2:通过 3:驳回) Example: 2
      * @bodyParam audit_remark string required 审核意见 Example: 资质证书有效,审核通过
      *
      * @response scenario=success {
@@ -106,14 +106,14 @@ class CoachQualRecordController extends AdminController
     public function audit(Request $request)
     {
         $validated = $request->validate([
-            'qual_record_id' => 'required|integer|exists:coach_qual_records,id',
-            'qual_state' => 'required|integer|in:2,3', // 2:通过 3:驳回
+            'qualification_record_id' => 'required|integer|exists:coach_qual_records,id',
+            'qualification_record_state' => 'required|integer|in:2,3', // 2:通过 3:驳回
             'audit_remark' => 'required|string|max:255',
         ]);
 
         $result = $this->service->audit(
-            $validated['qual_record_id'],
-            $validated['qual_state'],
+            $validated['qualification_record_id'],
+            $validated['qualification_record_state'],
             $validated['audit_remark'],
             Admin::user()->id
         );

+ 53 - 46
app/Services/Coach/AccountService.php

@@ -268,18 +268,6 @@ class AccountService
 
     /**
      * 获取技师详细信息
-     *
-     * 业务逻辑:
-     * 1. 获取技师最新基本信息(不包括审核拒绝的记录)
-     * 2. 获取技师邀请码信息
-     * 3. 获取钱包信息
-     * 4. 获取审核状态信息
-     * 5. 获取位置和店铺信息
-     * 6. 获取统计数据
-     * 7. 组装返回数据
-     *
-     * @return array 技师详细信息
-     * @throws \Exception 获取信息失败时抛出异常
      */
     public function getCoachDetail(): array
     {
@@ -332,9 +320,13 @@ class AccountService
             $baseInfo,
             [
                 'state' => $coach->state,
-                'state_text' => TechnicianStatus::fromValue($coach->state)?->label(),
-                'work_status' => $coach->work_status,  // 工作状态
-                'work_status_text' => TechnicianWorkStatus::fromValue($coach->work_status)?->label(),  // 状态文本
+                'state_text' => $coach->state
+                    ? TechnicianStatus::fromValue($coach->state)->label()
+                    : null,
+                'work_status' => $coach->work_status,
+                'work_status_text' => $coach->work_status
+                    ? TechnicianWorkStatus::fromValue($coach->work_status)->label()
+                    : null,
             ],
             [
                 'auth_status' => $authStatus,
@@ -349,12 +341,6 @@ class AccountService
      * 格式化审核状态信息
      * 包含基本信息、实名认证和资质认证的审核状态
      *
-     * 业务逻辑:
-     * 1. 获取最新的基本信息审核状态
-     * 2. 获取最新的实名认证审核状态
-     * 3. 获取最新的资质认证审核状态
-     * 4. 格式化状态文本和时间
-     *
      * @param CoachUser $coach 技师对象
      * @return array 审核状态信息
      */
@@ -362,20 +348,26 @@ class AccountService
     {
         return [
             'base_info' => [
-                'state' => $coach->latestInfoRecord?->state,                    // 审核状态值
-                'state_text' => TechnicianAuthStatus::fromValue($coach->latestInfoRecord?->state)?->label(),  // 状态文本
-                'audit_remark' => $coach->latestInfoRecord?->audit_remark,      // 审核备注
-                'updated_at' => $coach->latestInfoRecord?->updated_at?->format('Y-m-d H:i:s'),  // 更新时间
+                'state' => $coach->latestInfoRecord?->state,
+                'state_text' => $coach->latestInfoRecord?->state
+                    ? TechnicianAuthStatus::fromValue($coach->latestInfoRecord->state)->label()
+                    : null,
+                'audit_remark' => $coach->latestInfoRecord?->audit_remark,
+                'updated_at' => $coach->latestInfoRecord?->updated_at?->format('Y-m-d H:i:s'),
             ],
             'real_name' => [
                 'state' => $coach->latestRealRecord?->state,
-                'state_text' => TechnicianAuthStatus::fromValue($coach->latestRealRecord?->state)?->label(),
+                'state_text' => $coach->latestRealRecord?->state
+                    ? TechnicianAuthStatus::fromValue($coach->latestRealRecord->state)->label()
+                    : null,
                 'audit_remark' => $coach->latestRealRecord?->audit_remark,
                 'updated_at' => $coach->latestRealRecord?->updated_at?->format('Y-m-d H:i:s'),
             ],
             'qualification' => [
                 'state' => $coach->latestQualRecord?->state,
-                'state_text' => TechnicianAuthStatus::fromValue($coach->latestQualRecord?->state)?->label(),
+                'state_text' => $coach->latestQualRecord?->state
+                    ? TechnicianAuthStatus::fromValue($coach->latestQualRecord->state)->label()
+                    : null,
                 'audit_remark' => $coach->latestQualRecord?->audit_remark,
                 'updated_at' => $coach->latestQualRecord?->updated_at?->format('Y-m-d H:i:s'),
             ],
@@ -494,8 +486,13 @@ class AccountService
      * @param object $info 基本信息记录对象
      * @return array 格式化后的基本信息
      */
-    private function formatBaseInfo($info)
+    private function formatBaseInfo($info): array
     {
+        // 如果 $info 为空,返回空数组
+        if (!$info) {
+            return [];
+        }
+
         // 返回格式化后的基本信息,包含状态文本
         return [
             'nickname' => $info->nickname,
@@ -508,7 +505,7 @@ class AccountService
             'intention_city' => $info->intention_city,
             'introduction' => $info->introduction,
             'state' => $info->state,
-            'state_text' => TechnicianAuthStatus::fromValue($info->state)->label(),
+            'state_text' => $info->state ? TechnicianAuthStatus::fromValue($info->state)->label() : null,
             'audit_remark' => $info->audit_remark,
         ];
     }
@@ -517,12 +514,17 @@ class AccountService
      * 格式化资质信息
      * 处理技师资质信息的展示格式
      *
-     * @param object $qual 资质记录对象
-     * @return array 格式化后的资质信息
+     * @param object|null $qual 资质记录对象
+     * @return array|null 格式化后的资质信息
      */
-    private function formatQualification($qual)
+    private function formatQualification($qual): ?array
     {
-        // 资质类型文本映
+        // 如果资质信息为空,返回 null
+        if (!$qual) {
+            return null;
+        }
+
+        // 资质类型文本映射
         $qualTypeMap = [
             1 => '初级按摩师',
             2 => '中级按摩师',
@@ -532,12 +534,12 @@ 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_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(),
+            'state_text' => $qual->state ? TechnicianAuthStatus::fromValue($qual->state)->label() : null,
             'audit_remark' => $qual->audit_remark,
         ];
     }
@@ -546,20 +548,25 @@ class AccountService
      * 格式化实名信息
      * 处理技师实名认证信息的展示格式
      *
-     * @param object $real 实名认证记录对象
-     * @return array 格式化后的实名信息
+     * @param object|null $real 实名认证记录对象
+     * @return array|null 格式化后的实名信息
      */
-    private function formatRealName($real)
+    private function formatRealName($real): ?array
     {
+        // 如果实名信息为空,返回 null
+        if (!$real) {
+            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' => $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(),
+            'state_text' => $real->state ? TechnicianAuthStatus::fromValue($real->state)->label() : null,
             'audit_remark' => $real->audit_remark,
         ];
     }

+ 2 - 2
app/Services/CoachQualRecordService.php

@@ -2,11 +2,11 @@
 
 namespace App\Services;
 
+use App\Models\CoachUser;
 use App\Models\CoachQualRecord;
-use Slowlyo\OwlAdmin\Services\AdminService;
 use Illuminate\Support\Facades\DB;
-use App\Models\CoachUser;
 use App\Enums\TechnicianAuthStatus;
+use Slowlyo\OwlAdmin\Services\AdminService;
 
 /**
  * 技师资质认证记录

+ 82 - 14
doc/系统设计/数据库设计/物理模型/分析后台设计增加/03技师认证.sql

@@ -43,24 +43,28 @@ WITH
             cq.id
     )
 SELECT
-    ci.nickname as nickname /* 技师昵称 */,
-    ci.gender as gender /* 性别 */,
-    ci.birthday as birthday /* 出生日期 */,
-    ci.intention_city as intention_city /* 期望城市 */,
-    ci.mobile as mobile /* 手机号码 */,
-    ci.introduction as introduction /* 个人简介 */,
+    cu.id AS id /* 技师ID */,
+    ci.id AS info_record_id /* 技师信息记录ID */,
+    cr.id AS real_auth_record_id /* 实名认证记录ID */,
+    qp.id AS qualification_record_id /* 资质证书记录ID */,
+    ci.nickname AS nickname /* 技师昵称 */,
+    ci.gender AS gender /* 性别 */,
+    ci.birthday AS birthday /* 出生日期 */,
+    ci.intention_city AS intention_city /* 期望城市 */,
+    ci.mobile AS mobile /* 手机号码 */,
+    ci.introduction AS introduction /* 个人简介 */,
     CASE
         WHEN cu.real_auth_record_id IS NULL THEN '未认证'
         WHEN cu.qualification_record_id IS NULL THEN '实名认证完成'
         ELSE '全部认证完成'
-    END as auth_state /* 认证进度 */,
-    cu.state as state /* 认证状态 */,
-    cr.id_card_front_photo as id_card_front_photo /* 身份证照片正面 */,
-    cr.id_card_back_photo as id_card_back_photo /* 身份证照片反面 */,
-    qp.qualification_photo as qualification_photo /* 从业资格证图片 */,
-    qp.health_photo as health_photo /* 健康证 */,
-    qp.life_photo as life_photo /* 生活照 */,
-    qp.work_photo as work_photo /* 工作照 */
+    END AS auth_state /* 认证进度 */,
+    cu.state AS state /* 认证状态 */,
+    cr.id_card_front_photo AS id_card_front_photo /* 身份证照片正面 */,
+    cr.id_card_back_photo AS id_card_back_photo /* 身份证照片反面 */,
+    qp.qualification_photo AS qualification_photo /* 从业资格证图片 */,
+    qp.health_photo AS health_photo /* 健康证 */,
+    qp.life_photo AS life_photo /* 生活照 */,
+    qp.work_photo AS work_photo /* 工作照 */
 FROM
     coach_users cu
     LEFT JOIN coach_info_records ci ON cu.info_record_id = ci.id
@@ -73,3 +77,67 @@ WHERE
         cr.deleted_at IS NULL
         OR cr.deleted_at IS NULL
     );
+
+/* 技师基本信息视图 */
+DROP VIEW IF EXISTS v_coach_info;
+
+CREATE VIEW v_coach_info AS
+SELECT
+    cir.id AS info_record_id /* 技师信息记录ID */,
+    cu.id AS coach_id /* 技师ID */,
+    cir.nickname AS nickname /* 技师昵称 */,
+    cir.gender AS gender /* 性别 */,
+    cir.mobile AS phone /* 手机号码 */,
+    cir.intention_city AS intention_city /* 期望城市 */,
+    cir.introduction AS introduction /* 个人简介 */,
+    cu.state AS coach_state /* 技师状态 */,
+    cir.state AS info_record_state /* 技师信息记录状态 */,
+    cir.portrait_images AS portrait_images /* 技师头像 */,
+    cir.life_photos AS life_photos /* 形象照 */,
+    cir.auditor AS auditor /* 审核人 */,
+    cir.audit_time AS audit_time /* 审核时间 */,
+    cir.audit_remark AS audit_remark /* 审核备注 */
+FROM
+    coach_info_records cir /* 技师基本信息记录 */
+    LEFT JOIN coach_users cu ON cu.id = cir.coach_id /* 技师ID */
+WHERE
+    cir.deleted_at IS NULL
+    AND cu.deleted_at IS NULL;
+
+/* 技师认证记录视图 */
+DROP VIEW IF EXISTS v_coach_auth_record;
+
+CREATE VIEW v_coach_auth_record AS
+SELECT
+    cqr.id AS qualification_record_id /* 资质证书记录ID */,
+    cu.id AS coach_id /* 技师ID */,
+    cir.id AS info_record_id /* 技师信息记录ID */,
+    cqr.qual_type AS qual_type /* 资质类型 */,
+    cqr.qual_photo AS qual_photo /* 资质图片 */,
+    cir.state AS info_record_state /* 技师信息记录状态 */,
+    cu.state AS coach_state /* 技师状态 */,
+    cqr.state AS qualification_record_state /* 审核状态 */,
+    cir.nickname AS nickname /* 技师昵称 */,
+    cir.gender AS gender /* 技师性别 */,
+    cir.mobile AS phone /* 技师手机号码 */,
+    cir.intention_city AS intention_city /* 技师期望城市 */,
+    cir.introduction AS introduction /* 技师个人简介 */,
+    cir.portrait_images AS portrait_images /* 技师头像 */,
+    cir.life_photos AS life_photos /* 技师形象照 */,
+    cqr.business_license AS business_license /* 技师营业执照 */,
+    cqr.health_cert AS health_certificate /* 技师健康证 */,
+    cr.id_card_front_photo AS id_card_front_photo /* 技师身份证照片正面 */,
+    cr.id_card_back_photo AS id_card_back_photo /* 身份证照片反面 */,
+    cr.id_card_hand_photo AS id_card_hand_photo /* 身份证手持照片 */,
+    cqr.auditor AS auditor /* 审核人 */,
+    cqr.audit_time AS audit_time /* 审核时间 */,
+    cqr.audit_remark AS audit_remark /* 审核备注 */
+FROM
+    coach_qual_records cqr
+    LEFT JOIN coach_users cu ON cu.id = cqr.coach_id /* 先关联技师用户表 */
+    LEFT JOIN coach_info_records cir ON cir.id = cu.info_record_id /* 再关联技师信息记录表 */
+    LEFT JOIN coach_real_records cr ON cr.id = cu.real_auth_record_id /* 最后关联实名认证记录表 */
+WHERE
+    cqr.deleted_at IS NULL
+    AND cu.deleted_at IS NULL
+    AND cir.deleted_at IS NULL;

+ 27 - 2
doc/系统设计/数据库设计/物理模型/分析后台设计增加/04平台项目管理.sql

@@ -1,7 +1,5 @@
 -- Active: xiaoding_test@@192.168.110.85@3306@xiaoding_test
-DROP TABLE IF EXISTS report_project_list;
 
-CREATE TABLE report_project_list AS
 /* 项目列表视图 */
 
 DROP VIEW IF EXISTS manage_project_list;
@@ -15,3 +13,30 @@ FROM
 WHERE
     p.deleted_at IS NULL
 ORDER BY p.id DESC;
+
+/* 项目详情视图 */
+
+DROP VIEW IF EXISTS v_project_detail;
+
+CREATE VIEW v_project_detail AS
+SELECT
+    p.id AS project_id /* 项目ID */,
+    p.cover AS project_cover /* 项目封面图片 */,
+    p.cate_id AS project_cate_id /* 项目分类ID */,
+    p.title AS project_title /* 项目名称 */,
+    p.subtitle AS project_subtitle /* 项目副标题 */,
+    p.price AS project_price /* 项目价格 */,
+    p.original_price AS project_original_price /* 项目原价 */,
+    p.sales AS project_sales /* 项目虚拟销量 */,
+    p.duration AS project_duration /* 服务时长(分钟) */,
+    p.project_desc AS project_desc /* 项目描述 */,
+    p.service_desc AS service_desc /* 服务描述 */,
+    p.`type` AS project_type /* 项目类型 */,
+    p.state AS project_state /* 项目状态 */,
+    p.service_posture AS service_posture /* 服务姿态 */,
+    p.service_process AS service_process /* 服务流程 */,
+    p.suitable_population AS suitable_population /* 适用人群 */,
+    p.taboo_symptoms AS taboo_symptoms /* 禁忌症状 */
+FROM project p
+WHERE
+    p.deleted_at IS NULL;