CountAllProject.php 8.4 KB
<?php
/**
 * @remark :
 * @name   :CountAllProject.php
 * @author :lyh
 * @method :post
 * @time   :2024/11/9 10:03
 */

namespace App\Console\Commands\Project;

use App\Models\Channel\Channel;
use App\Models\Domain\DomainInfo;
use App\Models\Manage\ManageHr;
use App\Models\Project\Project;
use Illuminate\Console\Command;
use App\Models\Project\CountAllProject as AllProject;

class CountAllProject extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'count_all_project';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '统计所有项目设置';


    public function handle(){
        $countAllModel = new AllProject;
        AllProject::truncate();
        $noSixData = $this->NoSixProject();
        $countAllModel->insert($noSixData);
        $sixData = $this->sixProject();
        $countAllModel->insert($sixData);
        $data = array_merge($noSixData ?? [],$sixData ?? []);
        echo 'success:' .count($data) . PHP_EOL . date('Y-m-d H:i:s');
        return true;
    }

    /**
     * @remark :5.0数据
     * @name   :NoSixProject
     * @author :lyh
     * @method :post
     * @time   :2024/11/11 15:21
     */
    public function NoSixProject(){
        $res_data = [];
        $i = 1;
        while (true) {
            $url = 'https://quanqiusou.cn/extend_api/api/projects.php?page=' . $i . '&pagesize=500';
            $result = $this->httpGetProxy($url);
            // 检查结果是否成功,并且结构符合预期
            if (isset($result['data']['data']) && is_array($result['data']['data'])) {
                $data = $result['data']['data'];
                // 如果当前页没有数据,跳出循环
                if (empty($data)) {
                    break;
                }
                foreach ($data as $k => $v){
                    if(empty($v['online_date'])){
                        $v['online_date'] = null;
                    }
                    if($v['is_admin5'] == 5){
                        $v['version'] = 2;
                    }else{
                        $v['version'] = 3;
                    }
                    $v['is_upgrade'] = 0;
                    $v['status'] = 0;
                    $v['created_at'] = $v['updated_at'] = date('Y-m-d H:i:s');
                    $data[$k] = $v;
                }
                echo '执行页数:' . $i . PHP_EOL . date('Y-m-d H:i:s') . PHP_EOL;
                $res_data = array_merge($res_data, $data);
                $i++;
                // 每次请求后增加 1 秒延迟,防止请求过于频繁
                sleep(1);
            } else {
                // 如果数据结构不符合预期,输出错误信息并跳出循环
                echo '数据结构不符合预期或请求失败,停止执行。' . PHP_EOL . json_encode($result);
                break;
            }
        }
        return $res_data;
    }

    public function httpGetProxy($url){
        $ch1     = curl_init();
        $timeout = 0;
        curl_setopt($ch1, CURLOPT_URL, $url);
        curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch1, CURLOPT_PROXY, 'http://69.90.188.183:51395');
        curl_setopt($ch1, CURLOPT_ENCODING, '');
        curl_setopt($ch1, CURLOPT_MAXREDIRS, 10);
        curl_setopt($ch1, CURLOPT_HTTPHEADER, array());
        curl_setopt($ch1, CURLOPT_CONNECTTIMEOUT, $timeout);
        curl_setopt($ch1, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch1, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch1, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch1, CURLOPT_CUSTOMREQUEST, 'GET');
        curl_setopt($ch1, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        $content = curl_exec($ch1);
        curl_close($ch1);
        return json_decode($content, true);
    }

    public function sixProject(){
        $projectModel = new Project();
        $manageModel = new ManageHr();
        $i = 1;
        while (true){
            $query = $projectModel->leftJoin('gl_project_payment', 'gl_project.id', '=', 'gl_project_payment.project_id')
                ->leftJoin('gl_project_deploy_build', 'gl_project.id', '=', 'gl_project_deploy_build.project_id')
                ->leftJoin('gl_project_deploy_optimize', 'gl_project.id', '=', 'gl_project_deploy_optimize.project_id')
                ->where('gl_project.delete_status',Project::TYPE_ZERO);
            $lists = $query->paginate(500, $this->selectParam(), 'page', $i)->toArray();
            if(empty($lists) || empty($lists['list'])){
                break;
            }
            echo '执行页数:' . $i . PHP_EOL . date('Y-m-d H:i:s') . PHP_EOL;
            foreach ($lists['list'] as $k => $v){
                $data[] = [
                    'project_id'=>$v['id'],
                    'version'=>1,//代表6.0
                    'is_upgrade'=>$v['is_upgrade'],
                    'title'=>$v['title'],
                    'company'=>$v['company'],
                    'channel'=>Channel::getChannelText($v['channel']['user_id'] ?? 0),
                    'join_date'=>$v['cooperate_date'],
                    'online_date'=>$v['uptime'],
                    'keywords_num'=>$v['key'],
                    'service_num'=>$v['day'],
                    'production_num'=>intval(abs((empty($v['uptime']) ? time() : strtotime($v['uptime'])) - strtotime($v['created_at'])) / 86400),
                    'plan'=>Project::planMap()[$v['plan']],
                    'status'=>0,
                    'test_domain'=>$v['test_domain'],
                    'product_domain'=>!empty($v['domain']) ?  (new DomainInfo())->getDomain($v['domain']) : '',
                    'project_manager'=>$manageModel->getName($v['manager_mid'] ?? ''),
                    'project_group'=>$manageModel->getName($v['leader_mid'] ?? ''),
                    'project_design'=>$manageModel->getName($v['designer_mid'] ?? ''),
                    'project_assistant'=>$manageModel->getName($v['tech_mid'] ?? ''),
                    'service_manager'=>$manageModel->getName($v['optimize_manager_mid'] ??''),
                    'service_optimize'=>$manageModel->getName($v['optimize_optimist_mid'] ??''),
                    'service_assistant'=>$manageModel->getName($v['optimize_assist_mid'] ??''),
                    'qa'=>$manageModel->getName($v['quality_mid'] ??''),
                    'created_at'=>date('Y-m-d H:i:s'),
                    'updated_at'=>date('Y-m-d H:i:s'),
                ];
            }
            $i++;
        }
        return $data;
    }

    /**
     * 需要查询的字段
     * @return array
     */
    public function selectParam(){
        $select = [
            'gl_project.id AS id',
            'gl_project.title AS title',
            'gl_project.channel AS channel',
            'gl_project.company AS company',
            'gl_project.type AS type',
            'gl_project.status AS status',
            'gl_project.extend_type AS extend_type',
            'gl_project.uptime AS uptime',
            'gl_project.is_upgrade AS is_upgrade',
            'gl_project.created_at AS created_at',
            'gl_project.cooperate_date AS cooperate_date',
            'gl_project.site_status AS site_status',
            'gl_project_deploy_build.keyword_num AS key',
            'gl_project_deploy_build.service_duration AS day',
            'gl_project_deploy_build.is_comment AS is_comment',
            'gl_project_deploy_build.leader_mid AS leader_mid',
            'gl_project_deploy_build.manager_mid AS manager_mid',
            'gl_project_deploy_build.designer_mid AS designer_mid',
            'gl_project_deploy_build.tech_mid AS tech_mid',
            'gl_project_deploy_build.test_domain AS test_domain',
            'gl_project_deploy_build.plan AS plan',
            'gl_project_deploy_optimize.dept_id AS optimize_dept_id',
            'gl_project_deploy_optimize.manager_mid AS optimize_manager_mid',
            'gl_project_deploy_optimize.optimist_mid AS optimize_optimist_mid',
            'gl_project_deploy_optimize.assist_mid AS optimize_assist_mid',
            'gl_project_deploy_optimize.tech_mid AS optimize_tech_mid',
            'gl_project_deploy_optimize.tech_leader AS tech_leader',
            'gl_project_deploy_optimize.domain AS domain',
            'gl_project_deploy_optimize.api_no AS api_no',
        ];
        return $select;
    }

    public function end_channel($channel){
        $parts = explode("-", $channel);
        return end($parts);
    }
}