Project.php 9.1 KB
<?php

namespace App\Models\Project;

use App\Helper\Arr;
use App\Helper\Translate;
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 CUSTOMIZED_ONE = 1;//定制项目
    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

    const IS_UPGRADE_FALSE = 0;
    const IS_UPGRADE_TRUE = 1;

    /**
     * 星级客户
     * @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年版)',
            11 => '俄语标准版',
            12 => '俄语商务版',
            13 => '体验版'
        ];
    }

    public static function specialMap()
    {
        return [
            1 => '自建站项目',
            2 => '重点跟进',
            3 => '推广案例',
            4 => '全球搜案例',
            5 => '设计师案例',
            6 => '可登陆后台',
            7 => 'T项目',
            8 => '特殊前后缀',
            9 => '推广续费',
            10 => '案例渠道',
            11 => 'Ads',
            12 => 'AI',
            13 => 'AI站群',
            14 => '未达标',
        ];
    }


    /**
     * 项目部署服务器信息
     * @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');
    }


    /**
     * 询盘过滤配置
     * @return \Illuminate\Database\Eloquent\Relations\HasOne
     * @author zbj
     * @date 2024/1/19
     */
    public function inquiry_filter_config()
    {
        return self::hasOne(InquiryFilterConfig::class, 'project_id', 'id');
    }

    /**
     * 域名
     * @return \Illuminate\Database\Eloquent\Relations\HasOne
     * @author zbj
     */
    public function domainInfo()
    {
        return self::hasOne(\App\Models\Domain\DomainInfo::class, 'project_id', 'id')->select('project_id', 'domain');
    }


    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;
    }

    public function getUploadConfigAttribute($value)
    {
        if($value){
           $value = Arr::s2a($value);
        }
        return $value;
    }

    /**
     * 根据域名获取项目信息
     * @author zbj
     * @date 2023/5/5
     */
    public static function getProjectByDomain($domain)
    {
        $cache_key = 'getProjectByDomain_' . $domain;
        $project = Cache::get($cache_key);
        if(!$project){
            $domain_parse = parse_url($domain);
            $domain = $domain_parse['host'] ?? $domain;
            //是否测试域名
            $project_id = DeployBuild::where('test_domain', 'https://' . $domain . '/')->value('project_id');
            //是否正式域名
            if (!$project_id) {
                //是否小语种域名
                $domainPrefix = explode(".",$domain);
                if (!empty($domainPrefix)){
                    $isLang = Translate::getTls($domainPrefix[0]);
                    if ($isLang) {
                        $domain = "www.".$domainPrefix[1].".".$domainPrefix[2];
                    }
                }
                $project_id = \App\Models\Domain\DomainInfo::where('domain', $domain)->value('project_id');
            }
            $project = self::find($project_id ?: 0);
            if($project){
                Cache::put($cache_key, $project, 3600);
            }
        }
        return $project;
    }

    /**
     * @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;
    }
}