Browse Source

feat:增加技师管理视图以及模型VCoachList.php文件,增加一个是否开通会员的枚举,重新梳理了技师管理视图以及后台重新加个新菜单

景好勇win11 3 months ago
parent
commit
117afa0d28

+ 91 - 0
app/Enums/MembershipStatus.php

@@ -0,0 +1,91 @@
+<?php
+
+namespace App\Enums;
+
+/**
+ * 会员状态枚举类
+ */
+enum MembershipStatus: int
+{
+    /**
+     * 会员状态:未开通
+     */
+    case NOT_ACTIVATED = 0;
+
+    /**
+     * 会员状态:已开通
+     */
+    case ACTIVATED = 1;
+
+    /**
+     * 获取状态的显示文本
+     *
+     * @return string 状态的中文描述
+     */
+    public function text(): string
+    {
+        return match ($this) {
+            self::NOT_ACTIVATED => '未开通',
+            self::ACTIVATED => '已开通',
+        };
+    }
+
+    /**
+     * 获取状态的整数值
+     *
+     * @return int 状态值
+     */
+    public function value(): int
+    {
+        return $this->value;
+    }
+
+    /**
+     * 检查当前状态是否与指定状态相同
+     *
+     * @param self $status 要比较的状态
+     * @return bool 如果状态相同返回 true,否则返回 false
+     */
+    public function is(self $status): bool
+    {
+        return $this === $status;
+    }
+
+    /**
+     * 根据整数值创建对应的状态枚举实例
+     *
+     * @param int $value 状态值
+     * @return self|null 返回对应的状态枚举实例,如果值无效则返回 null
+     */
+    public static function fromValue(int $value): ?self
+    {
+        return match ($value) {
+            self::NOT_ACTIVATED->value => self::NOT_ACTIVATED,
+            self::ACTIVATED->value => self::ACTIVATED,
+            default => null
+        };
+    }
+
+    /**
+     * 获取所有状态的值数组
+     *
+     * @return array 包含所有状态值的数组
+     */
+    public static function values(): array
+    {
+        return array_column(self::cases(), 'value');
+    }
+
+    /**
+     * 获取所有状态的键值对数组
+     *
+     * @return array 状态值作为键,显示文本作为值的关联数组
+     */
+    public static function all(): array
+    {
+        return [
+            self::NOT_ACTIVATED->value => self::NOT_ACTIVATED->text(),
+            self::ACTIVATED->value => self::ACTIVATED->text(),
+        ];
+    }
+}

+ 2 - 4
app/Enums/TechnicianLevel.php

@@ -44,7 +44,7 @@ enum TechnicianLevel: int
      */
     public function label(): string
     {
-        return match($this) {
+        return match ($this) {
             self::TRAINEE => '实习技师',
             self::JUNIOR => '初级技师',
             self::INTERMEDIATE => '中级技师',
@@ -83,7 +83,7 @@ enum TechnicianLevel: int
      */
     public static function fromValue(int $value): ?self
     {
-        return match($value) {
+        return match ($value) {
             self::TRAINEE->value => self::TRAINEE,
             self::JUNIOR->value => self::JUNIOR,
             self::INTERMEDIATE->value => self::INTERMEDIATE,
@@ -120,6 +120,4 @@ enum TechnicianLevel: int
             self::MASTER->value => self::MASTER->label(),
         ];
     }
-
-  
 }

+ 62 - 0
app/Models/VCoachList.php

@@ -0,0 +1,62 @@
+<?php
+
+namespace App\Models;
+
+use App\Enums\TechnicianLevel;
+use App\Enums\TechnicianStatus;
+use App\Enums\TechnicianWorkStatus;
+use Illuminate\Database\Eloquent\Model;
+
+class VCoachList extends Model
+{
+    protected $table = 'v_coach_list';
+
+    public $timestamps = false;
+
+    protected $casts = [
+        'id' => 'integer',
+        'gender' => 'integer',
+        'birthday' => 'datetime',
+        'created_at' => 'datetime',
+        'state' => 'integer',
+        'is_vip' => 'boolean',
+        'vip_time' => 'datetime',
+        'level' => 'integer',
+        'score' => 'float',
+        'work_status' => 'integer',
+        'virtual_order' => 'integer',
+        'total_income' => 'decimal:2',
+        'total_expense' => 'decimal:2',
+        'total_balance' => 'decimal:2',
+        'available_balance' => 'decimal:2',
+        'frozen_amount' => 'decimal:2',
+        'avatar' => 'array',
+        'qual_photo' => 'array',
+        'business_license' => 'array',
+        'health_certificate' => 'array',
+        'id_card_front_photo' => 'array',
+        'id_card_back_photo' => 'array',
+        'formal_photo' => 'array',
+    ];
+
+    protected $appends = [
+        'state_text',
+        'level_text',
+        'work_status_text',
+    ];
+
+    public function getStateTextAttribute()
+    {
+        return is_null($this->state) ? null : TechnicianStatus::fromValue($this->state)?->label();
+    }
+
+    public function getLevelTextAttribute()
+    {
+        return is_null($this->level) ? null : TechnicianLevel::fromValue($this->level)?->label();
+    }
+
+    public function getWorkStatusTextAttribute()
+    {
+        return is_null($this->work_status) ? null : TechnicianWorkStatus::fromValue($this->work_status)?->label();
+    }
+}

+ 61 - 85
doc/系统设计/数据库设计/物理模型/分析后台设计增加/02技师列表.sql

@@ -16,94 +16,70 @@
 请重写我的统计sql
 */
 
--- 技师列表视图
-DROP VIEW IF EXISTS manage_coach_list;
+/*新的技师管理视图*/
+DROP VIEW IF EXISTS v_coach_list;
 
-CREATE OR REPLACE VIEW manage_coach_list AS
-WITH
-    /* 一级邀请人信息 */
-    inviter_level1 AS (
-        SELECT mdt1.user_id, m1.nickname
-        FROM
-            market_dist_teams mdt1
-            LEFT JOIN member_users m1 ON mdt1.object_id = m1.id
-        WHERE
-            mdt1.level = 1
-    ),
-    /* 二级邀请人信息 */
-    inviter_level2 AS (
-        SELECT mdt1.user_id, m2.nickname
-        FROM
-            market_dist_teams mdt1
-            LEFT JOIN market_dist_teams mdt2 ON mdt1.object_id = mdt2.user_id
-            LEFT JOIN member_users m2 ON mdt2.object_id = m2.id
-        WHERE
-            mdt1.level = 1
-            AND mdt2.level = 1
-    ),
-    /* 钱包余额信息 */
-    coach_wallet AS (
-        SELECT owner_id, total_balance
-        FROM wallet
-        WHERE
-            owner_type = 'App\\Models\\CoachUser'
-    )
+CREATE OR REPLACE VIEW v_coach_list AS
 SELECT
-    cu.id,
-    /* 性别 */
-    mu.gender,
-    /* 技师名称 */
-    ci.nickname,
-    /* 头像 */
-    ci.avatar,
-    /* 手机号码 */
-    mu.mobile,
-    /* 注册地址 */
-    mu.register_area,
-    /* 注册时间 */
-    mu.created_at,
-    /* 当前所属区域 */
-    cl.city,
+    cu.id AS id,/*技师id*/
+    ci.nickname AS nickname,/*技师名称*/
+    ci.mobile AS mobile,/*手机号码*/
+    ci.avatar AS avatar,/*头像*/
+    ci.gender AS gender,/*性别*/
+    ci.birthday AS birthday,/*生日*/
+    cu.created_at AS created_at,/*注册时间*/
+    cu.state AS state,/*技师状态*/
+    cu.invite_code AS invite_code,/*邀请码*/
+    cu.qr_code AS qr_code,/*二维码*/
+    cu.is_vip AS is_vip, /*是否开通会员*/
+    cu.vip_time AS vip_time,/*开通会员时间*/
+    cu.level AS level,/*技师等级*/
+    cu.score AS score,/*技师评分*/
+    cu.work_status AS work_status,/*工作状态*/
+    cu.formal_photo AS formal_photo,/*正式照*/
+    cu.virtual_order AS virtual_order,/*虚拟订单*/
+    /* 认证信息 */
+    crr.id_card AS id_card,/*身份证*/
+    crr.real_name AS real_name,/*真实姓名*/
+    crr.id_card_front_photo AS id_card_front_photo,/*身份证正面*/
+    crr.id_card_back_photo AS id_card_back_photo,/*身份证反面*/
+    cq.health_cert AS health_cert,/*健康证*/
+    cq.qual_photo AS qual_photo,/*资格证*/
+    cq.business_license AS business_license,/*营业执照*/
     /* 所属店铺 */
-    sar.shop_name,
-    /* 调度区域 */
-    cl.location,
-    /* 是否开通会员 */
-    CASE
-        WHEN cu.is_vip = 1 THEN '是'
-        ELSE '否'
-    END AS is_vip,
-    /* 开通会员时间 */
-    cu.vip_time,
+    sar.shop_name AS shop_name,/*店铺名称*/
+    /* 当前位置信息 */
+    cl.city AS city,/*城市*/
+    cl.address AS address,/*当前位置*/
+    /* 钱包余额 */
+    COALESCE(cw.total_income, 0) AS total_income,/*总收入*/
+    COALESCE(cw.total_expense, 0) AS total_expense,/*总支出*/
+    COALESCE(cw.total_balance, 0) AS total_balance,/*钱包余额*/
+    COALESCE(cw.available_balance, 0) AS available_balance,/*可用余额*/
+    COALESCE(cw.frozen_amount, 0) AS frozen_amount,/*冻结余额*/
     /* 一级邀请人 */
-    il1.nickname AS inviter_level1_name,
+    CASE
+        WHEN mdt1.object_type = 'App\\Models\\CoachUser' THEN ci1.nickname
+        WHEN mdt1.object_type = 'App\\Models\\MemberUser' THEN mu1.nickname
+    END AS inviter_level1_name,
     /* 二级邀请人 */
-    il2.nickname AS inviter_level2_name,
-    /* 余额 */
-    COALESCE(cw.total_balance, 0) AS balance,
-    /* 状态 */
-    cu.state,
-    /* 邀请码 */
-    cu.invite_code,
-    /* 二维码 */
-    cu.qr_code,
-    /* 认证状态 */
     CASE
-        WHEN cq.state = 2 THEN '已认证'
-        WHEN cq.state = 1 THEN '认证中'
-        WHEN cq.state = 3 THEN '认证失败'
-        ELSE '未认证'
-    END AS auth_status
-FROM
-    coach_users cu
-    LEFT JOIN member_users mu ON cu.user_id = mu.id
-    LEFT JOIN coach_info_records ci ON cu.info_record_id = ci.id
-    LEFT JOIN coach_locations cl ON cu.id = cl.coach_id
-    AND cl.type = 2
-    LEFT JOIN shop_auth_records sar ON cu.shop_id = sar.id
-    LEFT JOIN coach_qual_records cq ON cu.qualification_record_id = cq.id
-    LEFT JOIN inviter_level1 il1 ON cu.user_id = il1.user_id
-    LEFT JOIN inviter_level2 il2 ON cu.user_id = il2.user_id
-    LEFT JOIN coach_wallet cw ON cu.user_id = cw.owner_id
-WHERE
-    cu.deleted_at IS NULL;
+        WHEN mdt2.object_type = 'App\\Models\\CoachUser' THEN ci2.nickname
+        WHEN mdt2.object_type = 'App\\Models\\MemberUser' THEN mu2.nickname
+    END AS inviter_level2_name
+FROM coach_users cu
+LEFT JOIN coach_info_records ci ON cu.info_record_id = ci.id
+LEFT JOIN coach_locations cl ON cu.id = cl.coach_id AND cl.type = 2
+LEFT JOIN coach_qual_records cq ON cu.qualification_record_id = cq.id
+LEFT JOIN shop_auth_records sar ON cu.shop_id = sar.shop_id
+LEFT JOIN coach_real_records crr ON cu.real_auth_record_id = crr.id
+LEFT JOIN wallet cw ON cu.id = cw.owner_id AND cw.owner_type = 'App\\Models\\CoachUser'
+/* 一级邀请人关联 */
+LEFT JOIN market_dist_teams mdt1 ON cu.id = mdt1.user_id AND mdt1.level = 1
+LEFT JOIN coach_info_records ci1 ON mdt1.object_type = 'App\\Models\\CoachUser' AND mdt1.object_id = ci1.coach_id
+LEFT JOIN member_users mu1 ON mdt1.object_type = 'App\\Models\\MemberUser' AND mdt1.object_id = mu1.id
+/* 二级邀请人关联 */
+LEFT JOIN market_dist_teams mdt2 ON cu.id = mdt2.user_id AND mdt2.level = 2
+LEFT JOIN coach_info_records ci2 ON mdt2.object_type = 'App\\Models\\CoachUser' AND mdt2.object_id = ci2.coach_id
+LEFT JOIN member_users mu2 ON mdt2.object_type = 'App\\Models\\MemberUser' AND mdt2.object_id = mu2.id
+WHERE cu.deleted_at IS NULL

+ 2 - 0
routes/admin.php

@@ -117,5 +117,7 @@ Route::group([
     $router->get('_project/cate', [\Slowlyo\OwlAdmin\Controllers\AdminApiController::class, 'index']);
     // 项目分类下拉
     $router->get('project-category', [\Slowlyo\OwlAdmin\Controllers\AdminApiController::class, 'index']);
+    // 城市下拉
+    $router->get('area_code_info', [\Slowlyo\OwlAdmin\Controllers\AdminApiController::class, 'index']);
 
 });