Project.php 7.5 KB
<?php

namespace App\Models\Project;

use App\Helper\Arr;
use App\Models\Base;
use App\Models\Devops\ServerConfig;
use App\Models\Optimize\Process;
use App\Services\Facades\Upload;
use Illuminate\Support\Facades\Cache;

class Project extends Base
{
    //设置关联表名
    protected $table = 'gl_project';

    const DATABASE_NAME_FIX = 'gl_data_';

    const DEMO_PROJECT_ID = 1;

    const STATUS_ONE = 1;//审核通过
    const TYPE_ZERO = 0;//初始导入项目
    const TYPE_ONE = 1;//建站中
    const TYPE_TWO = 2;//建站完成
    const TYPE_THREE = 3;//建站完成(推广)
    const TYPE_FOUR = 4;//推广续费
    const TYPE_FIVE = 5;//未续费网站
    const TYPE_SIX = 6;//特殊推广项目

    const TYPE_SEVEN = 7;//错误单
    const MYSQL_ID = 2;//默认数据库id
    /**
     * 星级客户
     * @return string[]
     * @author zbj
     * @date 2023/4/25
     */
    public static function levelMap()
    {
        return [
//            1 => '★★★Ads-Customer',
            2 => '暂停优化',
            3 => '告知书一',
            4 => '告知书二',
            5 => 'Q告知书二',
        ];
    }

    /**
     * 项目分类
     * @return string[]
     * @author zbj
     * @date 2023/4/26
     */
    public static function typeMap()
    {
        return [
            1 => '建站进程中',
            2 => '已完成–推广进程中',
            3 => '已完成-建站用户',
            4 => '推广续网站',
            5 => '未续费项目',
            6 => '特殊推广项目',
            7 => '提单错误转续费'
        ];
    }

    public static function planMap()
    {
        return [
            10 => '专业版',
            1 => '标准版',
            2 => '商务版',
            3 => '旗舰版',
            4 => '【PLUS】尊贵版',
            5 => '【PLUS】至尊版',
            6 => '自主建站(定制器)',
            7 => '定制建站(PS订制)',
            8 => '星链网站(1年版)',
            9 => '星链网站(2年版)',
        ];
    }

    public static function specialMap()
    {
        return [
            1 => '自建站项目',
            2 => '重点跟进',
            3 => '推广案例',
            4 => '全球搜案例',
            5 => '设计师案例',
            6 => '可登陆后台'
        ];
    }


    /**
     * 项目部署服务器信息
     * @return \Illuminate\Database\Eloquent\Relations\HasOne
     */
    public function serverConfig()
    {
        return self::hasOne(ServerConfig::class, 'id', 'serve_id');
    }

    /**
     * 项目部署mysql数据库信息
     * @return \Illuminate\Database\Eloquent\Relations\HasOne
     */
    public function mysqlConfig()
    {
        return self::hasOne(ServerConfig::class, 'id', 'mysql_id');
    }

    /**
     * 项目使用Redis服务器信息, 如果没有即使用默认配置
     * @return \Illuminate\Database\Eloquent\Relations\HasOne
     */
    public function redisConfig()
    {
        return self::hasOne(ServerConfig::class, 'id', 'redis_id');
    }

    /**
     * 获取项目对应数据库名称
     * 初始化数据库、数据表迭代等功能使用
     * TODO 如果前缀变更,请使用该方法进行处理
     * @return string
     */
    public function databaseName()
    {
        //TODO::上线打开
//        return self::DATABASE_NAME_FIX . 1;
        return self::DATABASE_NAME_FIX . $this->id;
    }

    /**
     * 付款续费信息
     * @return \Illuminate\Database\Eloquent\Relations\HasOne
     * @author zbj
     * @date 2023/4/26
     */
    public function payment()
    {
        return self::hasOne(Payment::class, 'project_id', 'id');
    }

    /**
     * @remark :上线审核
     * @name   :process
     * @author :lyh
     * @method :post
     * @time   :2023/7/20 14:25
     */
    public function online_check()
    {
        return self::hasOne(OnlineCheck::class, 'project_id', 'id');
    }

    /**
     * 建站部署信息
     * @return \Illuminate\Database\Eloquent\Relations\HasOne
     * @author zbj
     * @date 2023/4/26
     */
    public function deploy_build()
    {
        return self::hasOne(DeployBuild::class, 'project_id', 'id');
    }

    /**
     * 建站部署信息
     * @return \Illuminate\Database\Eloquent\Relations\HasOne
     * @author zbj
     * @date 2023/4/26
     */
    public function deploy_optimize()
    {
        return self::hasOne(DeployOptimize::class, 'project_id', 'id');
    }

    /**
     * @remark :转售后
     * @name   :after
     * @author :lyh
     * @method :post
     * @time   :2023/8/17 16:24
     */
    public function project_after()
    {
        return self::hasOne(After::class, 'project_id', 'id');
    }

    public function setLevelAttribute($value)
    {
        $this->attributes['level'] = Arr::arrToSet($value);
    }

    public function getLevelAttribute($value)
    {
        return Arr::setToArr($value);
    }

    public function setChannelAttribute($value)
    {
        $this->attributes['channel'] = Arr::a2s($value);
    }

    public function getChannelAttribute($value)
    {
        $value = Arr::s2a($value);
        foreach ($value as $k => $v){
            $v = (string)$v;
            $value[$k] = $v;
        }
        return $value;
    }

    public function setNoticeFileAttribute($value)
    {
        foreach ($value as &$v) {
            $v['url'] = str_replace_url($v['url']);
        }
        $this->attributes['notice_file'] = Arr::a2s($value);
    }

    public function getNoticeFileAttribute($value)
    {
        if(!empty($value)) {
            $value = Arr::s2a($value);
            foreach ($value as &$v) {
                if(!empty($v['url'])){
                    $v['url'] = getFileUrl($v['url']);
                }
            }
        }
        return $value;
    }

    public function setConfirmFileAttribute($value)
    {
        foreach ($value as &$v) {
            $v['url'] = str_replace_url($v['url']);
        }
        $this->attributes['confirm_file'] = Arr::a2s($value);
    }

    public function getConfirmFileAttribute($value)
    {
        if(!empty($value)) {
            $value = Arr::s2a($value);
            foreach ($value as &$v) {
                if(!empty($v['url'])){
                    $v['url'] = getFileUrl($v['url']);
                }
            }
        }
        return $value;
    }

    /**
     * 根据域名获取项目信息
     * @author zbj
     * @date 2023/5/5
     */
    public static function getProjectByDomain($domain)
    {
        $cache_key = 'project_' . $domain;
        $data = Cache::get($cache_key);
        if (!$data) {
            //是否测试域名
            $project_id = DeployBuild::where('test_domain', $domain)->value('project_id');
            //是否正式域名
            if (!$project_id) {
                $project_id = DeployOptimize::where('domain', $domain)->value('project_id');
            }
            if (!$project_id) {
                return [];
            }
            $data = self::find($project_id);
            if ($data) {
                Cache::put($cache_key, $data);
            }
        }
        return $data;
    }

    /**
     * @remark :获取项目名称
     * @name   :getProjectName
     * @author :lyh
     * @method :post
     * @time   :2023/9/19 10:35
     */
    public function getProjectName($id){
        $title = '';
        if(!empty($id)){
            $info = $this->read(['id'=>$id]);
            if($info !== false){
                $title = $info['title'];
            }
        }
        return $title;
    }
}