ProjectLogic.php 12.6 KB
<?php

namespace App\Http\Logic\Aside\Project;

use App\Models\Devops\ServerConfig;
use Illuminate\Support\Arr as SupArr;
use App\Helper\Arr;
use App\Helper\Common;
use App\Helper\FormGlobalsoApi;
use App\Http\Logic\Aside\BaseLogic;
use App\Models\Channel\Channel;
use App\Models\Channel\User;
use App\Models\Channel\Zone;
use App\Models\Domain\DomainInfo;
use App\Models\Inquiry\InquirySet;
use App\Models\Manage\Manage;
use App\Models\Project\After;
use App\Models\Project\DeployBuild;
use App\Models\Project\DeployOptimize;
use App\Models\Project\Payment;
use App\Models\Project\Project;
use App\Models\Task\Task;
use App\Services\ProjectServer;
use Hashids\Hashids;
use App\Models\User\User as UserModel;
use Illuminate\Support\Facades\DB;

/**
 * Class ProjectLogic
 * @package App\Http\Logic\Aside\Project
 * @author zbj
 * @date 2023/4/26
 */
class ProjectLogic extends BaseLogic
{
    public function __construct()
    {
        parent::__construct();
        $this->param = $this->requestAll;
        $this->model = new Project();
    }

    /**
     * @remark :获取当前数据详情
     * @name   :getProjectInfo
     * @author :lyh
     * @method :post
     * @time   :2023/7/28 17:11
     */
    public function getProjectInfo($id){
//        $info = Common::get_user_cache($this->model->getTable(),$id);
//        if(empty($info)){
            $info = $this->model->with('payment')->with('deploy_build')->with('deploy_optimize')->with('online_check')
                ->with('project_after')->where(['id'=>$id])->first()->toArray();
            if(!empty($info['online_check']['created_manage_id'])){
                $info['online_check']['name'] = (new Manage())->read(['id'=>$info['online_check']['created_manage_id']])['name'] ?? '';
            }

            if(isset($info['deploy_optimize']['minor_keywords']) && !empty($info['deploy_optimize']['minor_keywords'])){
                $info['deploy_optimize']['minor_keywords'] = json_decode($info['deploy_optimize']['minor_keywords']) ?? '';
            }else{
                $info['deploy_optimize']['minor_keywords'] = [];
            }
            if($info['extend_type'] != 0){
                $info['type'] = $info['extend_type'];
            }
//            Common::set_user_cache($info,$this->model->getTable(),$id);
//        }
        return $this->success($info);
    }

    /**
     * @remark :保存项目数据
     * @name   :projectSave
     * @author :lyh
     * @method :post
     * @time   :2023/8/30 11:57
     */
    public function projectSave(){
//        DB::beginTransaction();
//        try {
            $this->createProjectData($this->param);
            //保存项目信息
            $this->saveProject($this->param);
            //保存建站部署信息
            $this->saveProjectDeployBuild($this->param['deploy_build']);
            //保存付费信息
            $this->saveProjectPayment($this->param['payment']);
            //保存优化信息
            $this->saveProjectDeployOptimize($this->param['deploy_optimize']);
            //保存售后信息
            $this->saveProjectAfter($this->param['project_after']);
//            DB::commit();
//        }catch (\Exception $e){
//            DB::rollBack();
//            $this->fail('error');
//        }
        return $this->success();
    }

    /**
     * @remark :保存项目
     * @name   :setExtendType
     * @author :lyh
     * @method :post
     * @time   :2023/8/30 12:14
     */
    public function saveProject($param){
        if($param['type'] == Project::TYPE_FIVE){
            $param['extend_type'] = Project::TYPE_FIVE;
            unset($param['type']);
        }
        if(isset($param['level']) && !empty($param['level'])){
            $param['level'] = Arr::arrToSet($param['level']);
        }
        if(isset($param['channel']) && !empty($param['channel'])){
            $param['channel'] = Arr::a2s($param['channel']);
        }
        if(isset($param['notice_file']) && !empty($param['notice_file'])){
            foreach ($param['notice_file'] as &$v1) {
                $v1['url'] = str_replace_url($v1['url']);
            }
            $param['notice_file'] = Arr::a2s($param['notice_file']);
        }
        if(isset($param['confirm_file']) && !empty($param['confirm_file'])){
            foreach ($param['confirm_file'] as &$v2) {
                $v2['url'] = str_replace_url($v2['url']);
            }
            $param['confirm_file'] = Arr::a2s($param['confirm_file']);
        }
        unset($param['payment'],$param['deploy_build'],$param['deploy_optimize'],$param['online_check'],$param['project_after']);
        $this->model->edit($param,['id'=>$param['id']]);
        Common::del_user_cache($this->model->getTable(),$param['id']);
        return $this->success();
    }

    /**
     * @remark :保存付款续费
     * @name   :savePayment
     * @author :lyh
     * @method :post
     * @time   :2023/8/29 16:19
     */
    protected function saveProjectPayment($payment){
        $paymentModel = new Payment();
        if(isset($payment['contract']) && !empty($payment['contract'])){
            $payment['contract'] = Arr::a2s($payment['contract']);
        }
        if(isset($payment['bill']) && !empty($payment['bill'])){
            $payment['bill'] = Arr::a2s($payment['bill']);
        }
        if(isset($payment['renewal_record']) && !empty($payment['renewal_record'])){
            $payment['renewal_record'] = Arr::a2s($payment['renewal_record']);
        }
        $paymentModel->edit($payment,['id'=>$payment['id']]);
        return $this->success();
    }

    /**
     * @remark :保存建站部署
     * @name   :saveDeployBuild
     * @author :lyh
     * @method :post
     * @time   :2023/8/29 16:19
     */
    protected function saveProjectDeployBuild($deploy_build){
        $deployBuildModel = new DeployBuild();
        $deployBuildModel->edit($deploy_build,['id'=>$deploy_build['id']]);
        return $this->success();
    }

    /**
     * @remark :保存优化部署
     * @name   :saveDeployOptimize
     * @author :lyh
     * @method :post
     * @time   :2023/8/30 13:45
     */
    protected function saveProjectDeployOptimize($deploy_optimize){
        $deployOptimizeModel = new DeployOptimize();
        if(isset($deploy_optimize['domain']) && !empty($deploy_optimize['domain'])){
            //更改域名
            if(isset($deploy_optimize['domain']) && !empty($deploy_optimize['domain'])){
                $this->editDomainStatus($deploy_optimize['domain'],$deploy_optimize['project_id']);
            }
        }
        if(isset($deploy_optimize['minor_languages']) && !empty($deploy_optimize['minor_languages'])){
            $deploy_optimize['minor_languages'] = Arr::a2s($deploy_optimize['minor_languages']);
        }
        if(isset($deploy_optimize['minor_keywords']) && !empty($deploy_optimize['minor_keywords'])){
            $deploy_optimize['minor_keywords'] = Arr::a2s($deploy_optimize['minor_keywords']);
        }
        $deployOptimizeModel->edit($deploy_optimize,['id'=>$deploy_optimize['id']]);
        return $this->success();
    }

    /**
     * @remark :保存为售后部署
     * @name   :saveProjectAfter
     * @author :lyh
     * @method :post
     * @time   :2023/8/30 13:57
     */
    protected function saveProjectAfter($project_after){
        //查询数据是否存在
        $afterModel = new After();
        $afterModel->edit($project_after,['id'=>$project_after['id']]);
        return $this->success();
    }

    /**
     * @remark :创建初始数据
     * @name   :createProjectData
     * @author :lyh
     * @method :post
     * @time   :2023/8/30 14:30
     */
    public function createProjectData($param){
        //创建默认数据库
        if($param['type'] == Project::TYPE_ONE){
            //初始化数据库
            if(isset($param['mysql_id']) && !empty($param['mysql_id'])){
//                $this->initializationMysql($param['id']);
            }
            //初始账号
            if(isset($param['mobile']) && !empty($param['mobile'])){
                $this->createUser($param['mobile'],$param['id'],$param['lead_name']);
            }
            //更改服务器状态
            if(isset($param['serve_id']) && !empty($param['serve_id'])){
                $this->updateServe($param['serve_id']);
            }
        }
        return $this->success();
    }


    /**
     * @remark :初始化数据库
     * @name   :initializationMysql
     * @author :lyh
     * @method :post
     * @time   :2023/8/4 15:08
     */
    public function initializationMysql($project_id){
        //切换数据库配置
        $project = ProjectServer::useProject($project_id);
        //创建数据库
        ProjectServer::createDatabase($project);
        //创建表
        ProjectServer::initTable();
        return $this->success();
    }

    /**
     * @remark :更新服务器为已使用
     * @name   :updateServe
     * @author :lyh
     * @method :post
     * @time   :2023/8/28 10:50
     */
    public function updateServe($serve_id){
        $serverModel = new ServerConfig();
        $serverModel->edit(['status'=>$serverModel::STATUS_ONE],['id'=>$serve_id]);
        return $this->success();
    }



    /**
     * @remark :创建用户
     * @name   :createUser
     * @author :lyh
     * @method :post
     * @time   :2023/8/28 18:03
     */
    public function createUser($mobile,$project_id,$lead_name){
        $userModel = new UserModel();
        //查看当前用户是否存在
        $info = $userModel->read(['mobile'=>$mobile,'project_id'=>$project_id]);
        if($info === false){
            $data = [
                'mobile'=>$mobile,
                'password'=>base64_encode(md5('123456')),
                'project_id'=>$project_id,
                'name'=>$lead_name,
                'type'=>UserModel::TYPE_ONE,
                'operator_id'=>$this->manager['id'],
                'create_id'=>$this->manager['id'],
            ];
            $userModel->add($data);
        }
        return $this->success();
    }



    public function clearCache($id)
    {
        parent::clearCache($id);
        parent::setWith(['payment', 'deploy_build', 'deploy_optimize', 'online_check']);
        parent::clearCache($id);
    }

    /**
     * 保存询盘通知设置
     * @author zbj
     * @date 2023/5/17
     */
    public function saveInquirySet($param)
    {
        $project = $this->getCacheInfo($param['project_id']);
        //同步到接口
        $domain = parse_url($project['deploy_optimize']['domain'])['host'];
        $emails = Arr::arrToSet($param['emails']??'', 'trim');
        $phones = Arr::arrToSet($param['phones']??'', 'trim');
        $form_global_api  = new FormGlobalsoApi();
        $res = $form_global_api->setInquiry($domain, $emails, $phones);
        if (!$res) {
            $this->fail('保存失败');
        }
        if ($res['status'] != 200) {
            $this->fail($res['message'] ?? '保存失败');
        }
        //保存
        $set = InquirySet::where('project_id', $param['project_id'])->first();
        if (!$set) {
            $set = new InquirySet();
        }
        $set->project_id = $param['project_id'];
        $set->emails = $emails;
        $set->phones = $phones;
        $set->save();
        return $this->success();
    }

    public function dataSource(){
        $data = [];
        $data['level'] = $this->model::levelMap();
        $data['type'] = $this->model::typeMap();
        $data['special'] = $this->model::specialMap();
        $data['plan'] = $this->model::planMap();
        return $this->success($data);
    }


    public function channelSource($param){
        switch ($param['type']){
            case Project::TYPE_ONE:
                return Zone::pluck('title', 'id')->toArray();
            case Project::TYPE_TWO:
                return Channel::where('zone_id', $param['zone_id']??0)->pluck('alias', 'id')->toArray();
            case Project::TYPE_THREE:
                return User::where('channel_id', $param['channel_id']??0)->pluck('name', 'id')->toArray();
        }
        return $this->success();
    }


    /**
     * @remark :修改域名时,同时更改其状态
     * @name   :domainStatus
     * @author :lyh
     * @method :post
     * @time   :2023/9/4 14:29
     */
    public function editDomainStatus($domain,$project_id){
        $domainModel = new DomainInfo();
        //先清空上一次所绑定的域名
        $info = $domainModel->read(['project_id'=>$project_id]);
        if($info !== false){
            $domainModel->edit(['project_id'=>'','status'=>DomainInfo::STATUS_ZERO],['id'=>$info['id']]);
        }
        //重新设置域名
        $domainModel->edit(['status'=>DomainInfo::STATUS_ONE,'project_id'=>$project_id],['id'=>$domain]);
        return $this->success();
    }



}