CreateProject.php 8.1 KB
<?php
/**
 * @remark :
 * @name   :CreateProject.php
 * @author :lyh
 * @method :post
 * @time   :2025/1/6 10:34
 */

namespace App\Console\Commands\Project;

use App\Helper\Arr;
use App\Models\Channel\Channel;
use App\Models\Com\UpdateLog;
use App\Models\Com\UpdateVisit;
use App\Models\Devops\Servers;
use App\Models\Devops\ServersIp;
use App\Models\Manage\Mobile;
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\User\User as UserModel;
use App\Services\ProjectServer;
use Hashids\Hashids;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;

class CreateProject extends Command
{
    protected $signature = 'create_project';
    protected $description = '创建项目';

    public function handle(){
        dd(1);
        return $this->sync();
    }

    /**
     * 创建项目
     * @param int $is_update
     * @throws \Exception
     */
    public function sync($is_update = 0){
        $company = '山东临磨数控机床装备有限公司(自建站)';
        $mobile = '18663004388';
        $lead_name = '18663004388';
        $plan = '商务版';
        $cooperate_date = '2025-08-21';
//        $channel = '{"user_id": "732", "zone_id": "1", "channel_id": "95"}';
        $channel = '{"user_id": "1989", "zone_id": "4", "channel_id": "13"}';

        $title = date('Ymd') . '-' . $company;
        $data = [
            'project'=>[
                'title' => $title,
                'company' => $company,
                'lead_name' => $lead_name,
                'mobile' => $mobile,
                'mysql_id'=>Project::MYSQL_ID,
                'serve_id'=>9,
                'qq' => '',
                'channel' => $channel,
                'requirement' => '',
                'cooperate_date' => $cooperate_date,
                'from_order_id' => uniqid(),
                'type' => $is_update,
                'is_upgrade'=>$is_update,
            ],
            'deploy_build' => [
                'service_duration' => 0,
                'plan' => $this->versionData($plan),
                'login_mobile' => $mobile
            ],
            'deploy_optimize' => [
//                'api_no' => 0
            ],
            'project_after' => [],
            'payment' => [
                'amount' =>  0,
                'contract'=>[],
                'bill'=>[]
            ],
        ];
        DB::beginTransaction();
        try {
            $id = $this->saveProject($data['project']);
            $this->setPostId($data['deploy_build']['plan'],$id);
            $this->savePayment($data['payment'],$id);
            $this->saveDeployBuild($data['deploy_build'],$id);
            $this->saveDeployOptimize($data['deploy_optimize'],$id);
            $this->saveAfter($data['project_after'],$id);
            $serversIpModel = new ServersIp();
            $serversModel = new Servers();
            $serversIpModel->where(['id'=>9])->increment('total',1);
            $serversModel->where(['id'=>7])->increment('being_number',1);
            if($is_update == 1){
                //4.0或5.0更新到6.0
                //初始化数据库
                $this->initializationMysql($id);
                //初始账号
                $this->createUser($data['project']['mobile'],$id,$data['project']['lead_name']);
            }
            DB::commit();
        }catch (\Exception $e){
            DB::rollBack();
            throw new \Exception($e->getMessage());
        }
    }

    /**
     * 获取版本
     * @param $param
     * @return int
     */
    public function versionData($param){
        $data = Project::planMap();
        $data = array_flip($data);
        if(isset($data[$param])){
            return $data[$param];
        }else{
            return 1;
        }
    }

    /**
     * 保存项目
     * @param $param
     * @return mixed
     */
    public function saveProject($param){
        $projectModel = new Project();
        return $projectModel->addReturnId($param);
    }

    /**
     * 设置post_id
     * @param $plan
     * @param $id
     * @return bool
     */
    public function setPostId($plan,$id){
        $length = strlen((string)$id); // 获取变量的位数
        $paddingLength = Project::TYPE_FIVE - $length; // 计算填充前面的 0 的位数
        $zeros = str_repeat("0", $paddingLength);
        $number = Project::TYPE_SIX.$plan.$zeros.$id;
        $projectModel = new Project();
        $projectModel->edit(['post_id'=>$number],['id'=>$id]);
        return true;
    }

    /**
     * 保存优化部署
     * @param $param
     * @param $id
     */
    protected function saveAfter($param,$id){
        $param['project_id'] = $id;
        //查询数据是否存在
        $afterModel = new After();
        $info = $afterModel->read(['project_id'=>$id]);
        if($info !== false){
            $afterModel->edit($param,['id'=>$info['id']]);
        }else{
            $afterModel->add($param);
        }
    }

    /**
     * 保存付款续费
     * @param $param
     * @param $id
     */
    protected function savePayment($param,$id){
        $param['project_id'] = $id;
        $paymentModel= new Payment();
        $param['contract'] = Arr::a2s($param['contract']);
        $param['bill'] = Arr::a2s($param['bill']);
        if(!isset($param['renewal_record'])){
            $param['renewal_record'] = Arr::a2s([["amount"=> null, "remark"=> null, "expire_at"=> null]]);
        }
        $info = $paymentModel->read(['project_id'=>$id]);
        if($info !== false){
            $paymentModel->edit($param,['id'=>$info['id']]);
        }else{
            $paymentModel->add($param);
        }
    }

    /**
     * 保存建站部署
     * @param $param
     * @param $id
     */
    protected function saveDeployBuild($param,$id){
        $param['project_id'] = $id;
        $hashids = new Hashids('test_domain', 5, 'abcdefghjkmnpqrstuvwxyz1234567890');
        $code = $hashids->encode($id);
        $param['test_domain'] = 'https://v6-' . $code . '.globalso.site/';
        $deployBuildModel = new DeployBuild();
        $info = $deployBuildModel->read(['project_id'=>$id]);
        if($info !== false){
            $deployBuildModel->edit($param,['id'=>$info['id']]);
        }else{
            $deployBuildModel->add($param);
        }
    }

    /**
     * 保存优化信息
     * @param $param
     * @param $id
     */
    protected function saveDeployOptimize($param,$id){
        $param['project_id'] = $id;
        $deployOptimizeModel = new DeployOptimize();
        $info = $deployOptimizeModel->read(['project_id'=>$id]);
        if($info !== false){
            //存在就不处理了
//            $deployOptimizeModel->edit($param,['id'=>$info['id']]);
        }else{
            $deployOptimizeModel->add($param);
        }
    }

    /**
     * 初始化数据库
     * @param $project_id
     */
    public function initializationMysql($project_id){
        //切换数据库配置
        $project = ProjectServer::useProject($project_id);
        //创建数据库
        ProjectServer::createDatabase($project);
        //创建表
        ProjectServer::initTable();
        //初始数据
        ProjectServer::saveInitParam($project_id);
    }

    /**
     * 创建用户
     * @param $mobile
     * @param $project_id
     * @param $lead_name
     * @return bool
     */
    public function createUser($mobile,$project_id,$lead_name){
        $userModel = new UserModel();
        //查看当前项目是否存在号码库中
        $mobileModel = new Mobile();
        $mobileInfo = $mobileModel->read(['mobile'=>$mobile]);
        if($mobileInfo === false){
            //查看当前用户是否存在
            $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
                ];
                $userModel->add($data);
            }
        }
        return true;
    }
}