FetchTicketProjects.php 16.0 KB
<?php

namespace App\Console\Commands\WorkOrder;

use App\Models\Manage\Manage;
use App\Models\Manage\ManageHr;
use App\Models\Project\Project;
use App\Models\ProjectAssociation\ProjectAssociation;
use App\Models\WorkOrder\TicketProject;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;

class FetchTicketProjects extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'workorder:fetch-ticket-projects {action}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '同步V5,V6的项目到 gl_ticket_projects 表';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        $action = $this->argument('action');
        $this->$action();
        return 0;
    }


    /**
     * @return void
     * 请求:https://www.quanqiusou.cn/extend_api/webs/globalso_all.php
     */
    public function fetchV5()
    {
        $page = 1;
        $postids = [];

        while (true) {
            $response = Http::get('https://www.quanqiusou.cn/extend_api/webs/globalso_all.php?page=' . $page);
            if ($response->status() == 200) {
                $resp_json = $response->json();
                $items = $resp_json['data'] ?? [];
                if (empty($items))
                {
                    echo now() . " | INFO | V5: not found items on page $page \n";
                    break;
                }
                foreach ($items as $item) {
                    # V5: 版本号+postid
                    $uuid = md5("V5{$item['postid']}");
                    $project = TicketProject::where('uuid', $uuid)->first();

                    // 项目状态, 根据 $item['cate'] 判断,建站中,建站客户,推广
                    if (strpos($item['cate'], '推广') !== false)
                        $status=3; // 推广
                    elseif ($item['cate'] == "建站客户")
                        $status=2; // 建站客户
                    elseif ($item['cate'] == "建站中")
                        $status=1; // 建站中

                    $assm_id = Manage::where('name', $item['assm'])->value('id') ?? Manage::where('name', '张鸿飞')->value('id') ?? 0;  //售后服务经理
                    $seom_id = Manage::where('name', $item['yhs'])->value('id') ?? Manage::where('name', '陶婵')->value('id') ?? 0;  //优化师
                    $pm_id = Manage::where('name', $item['pm'])->value('id') ?? Manage::where('name', '李洁玉')->value('id') ?? 0; // 项目经理

                    /**
                     * 第一负责人逻即说明:
                     * 优化推广项目:找售后服务经理??鸿飞
                     * 建站中:项目经理
                     * 建站完成:杨长远
                     */

                    if ($status == 3)
                        $engineer_id = $assm_id; // 推广类项目找售后服务经理
                    elseif ($status == 2)
                        $engineer_id = Manage::where('name', '杨长远')->value('id') ?? 0;  //建站完成
                    elseif ($status == 1)
                        $engineer_id = $pm_id; // 建站中找项目经理

                    $fields = [
                        'post_id' => $item['postid'],
                        'company_name' => $item['company'],
                        'title' => $item['title'] . " - V5",
                        'engineer_id' => $engineer_id,  // 第一负责人
                        'assm_id' => $assm_id,
                        'seom_id' => $seom_id,
                        'website' => $item['main_url'] ?? '',
                        'test_website' => $item['test_url'] ?? '',
                        'is_del' => 0,
                        'plan' => $item['plan'] ?? '',
                        'project_cate' => 1,
                        'pm_id' => $pm_id,
                        'status' => $status, // 项目状态
                        'wechat_group_id' => $item['wx_id']
                    ];
                    if (!$project) {
                        $new = new TicketProject();
                        $new->uuid = $uuid;
                        $new->version = 5;
                        $new->table_id = 0;
                        foreach ($fields as $k => $v) {
                            $new->$k = $v;
                        }
                        $new->save();
                    } else {
                        $changed = false;
                        foreach ($fields as $k => $v) {
                            if ($project->$k != $v) {
                                $project->$k = $v;
                                $changed = true;
                            }
                        }
                        if ($changed) {
                            $project->save();
                        }
                    }
                    echo now() . " | INFO | V5: {$item['postid']} {$item['company']} fetch ok \n";
                }
                $page++;
                $postids = array_merge($postids, collect($items)->pluck('postid')->toArray());
            }
        }
        if ($postids)
        {
            // 软删除 gl_ticket_projects 中不存在的项目
            TicketProject::where('version', 5)
                ->whereNotIn('post_id', $postids)
                ->update(['is_del' => 1]);
        }
    }

    /**
     * @return void
     * 1. 按照ID升序查询 gl_project 表 limit 10
     * 2。同步到 TicketProject 后,redis 缓存 ID
     */
    public function fetchV6()
    {
        $lastid = 0;
        while (true) {
            try {
                $items = Project::where('id', '>', intval($lastid))
//                    ->where('delete_status', 0)
//                    ->where('extend_type', '!=', 5) // 排除归档项目
//                    ->where('type', '!=', 8) // 排除归档项目
                    ->orderBy('id', 'asc')
                    ->limit(10)
                    ->get();
                if ($items->isEmpty()) {
                    echo "not found items \n";
                    break;
                }
                foreach ($items as $item) {
                    $uuid = md5("V6{$item->id}");
                    $project = TicketProject::where('uuid', $uuid)->first();
                    // 项目状态
                    if ($item->type == Project::TYPE_ONE)
                        $status = 1; // 建站中
                    elseif ($item->type == Project::TYPE_THREE)
                        $status = 2; // 建站完成
                    else
                        $status = 3; // 推广找售后服务经理

                    // 售后服务经理
                    $assm_id = collect([
                        ManageHr::find($item->deploy_optimize->manager_mid)->manage_id ?? 0,
                        ManageHr::find($item->deploy_optimize->tech_leader)->manage_id ?? 0,
                        8,  //张鸿飞
                    ])->first(fn($v) => $v !== null && $v !== 0, 0);

                    // 优化师
                    $seom_id = ManageHr::find($item->deploy_optimize->optimist_mid) ? ManageHr::find($item->deploy_optimize->optimist_mid)->manage_id : 0;

                    // 项目经理
                    $pm_id = ManageHr::find($item->deploy_build->manager_mid)->manage_id ?? ManageHr::where('name', '李洁玉')->value('manage_id') ?? 0;

                    // 第一负责人
                    if ($status == 1)
                        $engineer_id = $pm_id; // 建站中找项目经理
                    elseif ($status == 2)
                        $engineer_id = Manage::where('name', '杨长远')->value('id') ?? 0; // 建站完成找杨长远
                    else
                        $engineer_id = $assm_id; // 推广找售后服务经理

                    $is_del = (
                        $item->extend_type == 5
                        || $item->type == 8
                        || $item->delete_status == 1
                        || $item->site_status == 1
                    ) ? 1 : 0;

                    $fields = [
                        'company_name' => $item->company,
                        'title' => $item->title . " - V6",
                        'assm_id' => $assm_id,
                        'seom_id' => $seom_id,
                        'engineer_id' => $engineer_id,
                        'is_del' => $is_del,
                        'website' => !empty($item->domainInfo->domain) ? 'https://'.$item->domainInfo->domain : '',
                        'test_website' => $item->deploy_build->test_domain ?? '',
                        'version' => empty($item->version) ? 7 : $item->version, // 版本号
                        'plan' => $item->planMap()[$item->deploy_build->plan] ?? '',
                        'project_cate' => 2,
                        'wechat_group_id' => ProjectAssociation::where('project_id', $item->id)
                            ->where('status', ProjectAssociation::STATUS_NORMAL)
                            ->where('binding_app', ProjectAssociation::ENTERPRISE_WECHAT)
                            ->value('friend_id'),
                        'pm_id' => $pm_id,
                        'status' => $status, // 项目状态
                    ];
                    if (!$project) {
                        $project = new TicketProject();
                        $project->uuid = $uuid;
                        $project->post_id = $item->post_id;
                        $project->table_id = $item->id;
                        foreach ($fields as $k => $v) {
                            $project->$k = $v;
                        }
                        $project->save();
                    } else {
                        $changed = false;
                        foreach ($fields as $k => $v) {
                            if ($project->$k != $v) {
                                $project->$k = $v;
                                $changed = true;
                            }
                        }
                        if ($changed) {
                            $project->save();
                        }
                    }
                    $lastid = $item->id;
                    echo date('Y-m-d H:i:s') . " V6: $item->id {$item->company} fetch ok \n";
                }
            } catch (\Exception $exception) {
                echo $exception;
                break;
            }
        }
    }

    public function fetchAICC()
    {
        $lastid = 0;
        while (true) {
            try {
                $response = Http::withBasicAuth('bill', 'bill@ai.cc')
                    ->get('https://fob.ai.cc/api/tickets/projects', [
                        'lastid' => $lastid,
                    ]);
                $items = $response->json();
                if (empty($items))
                {
                    echo now() . " | INFO | not found items \n";
                    break;
                }

                foreach ($items as $item) {
                    foreach ($item['plans'] as $plan)
                    {
                        // 判断套餐是超迹还是域途, 如果 $item['plans'][0]['name'] 包含 '超迹' 则为超迹,否则为域途
                        $project_cate = Str::contains($plan['name'], '超迹') ? 3 : 4;
                        $uuid = md5("AICC{$item['id']}{$project_cate}");
                        $project = TicketProject::where('uuid', $uuid)->first();
                        if ($project_cate == 3)
                        {
                            // 售后服务经理
                            $assm_id = collect([
                                ManageHr::where('name', $item['cj_assm']['real_name'] ?? '')->first()->manage_id ?? 0,
                                20,  //徐莹
                            ])->first(fn($v) => $v !== null && $v !== 0, 0);
                        }else
                        {
                            // 域途
                            $assm_id = collect([
                                ManageHr::where('name', $item['yutu_assm']['real_name'] ?? '')->first()->manage_id ?? 0,
                                85,  //黄小玉
                            ])->first(fn($v) => $v !== null && $v !== 0, 0);
                        }

                        // 优化师
                        $seom_id = 0;
                        // 第一负责人
                        $engineer_id = $assm_id;
                        if ($project_cate == 3)
                            $is_del = !empty($item["go_online"]);
                        else{
                            // 域途,以服务时间为准 $item['yutu_service_start_time'] 是开始时间 + 有效天数 yutu_planday
                            $is_del = !empty($item['yutu_service_start_time']) && !empty($item['yutu_planday'])
                                && (strtotime($item['yutu_service_start_time']) + $item['yutu_planday'] * 86400) < time();
                        }

                        $fields = [
                            'company_name' => $item['company'],
                            'title' => $item['company'] . " - " . $plan['name'],
                            'assm_id' => $assm_id,
                            'seom_id' => $seom_id,
                            'engineer_id' => $engineer_id,
                            'is_del' => $is_del,
                            'website' => '',
                            'test_website' => '',
                            'version' => 1, // 版本号
                            'plan' => $plan['name'] ?? '',
                            'project_cate' => $project_cate,
                            'wechat_group_id' => $item['chatroom_id'],
                        ];

                        if (!$project) {
                            $project = new TicketProject();
                            $project->uuid = $uuid;
                            $project->post_id = $item['postid'];
                            $project->table_id = $item['id'];
                            foreach ($fields as $k => $v) {
                                $project->$k = $v;
                            }
                            $project->save();
                        } else {
                            $changed = false;
                            foreach ($fields as $k => $v) {
                                if ($project->$k != $v) {
                                    $project->$k = $v;
                                    $changed = true;
                                }
                            }
                            if ($changed) {
                                $project->save();
                            }
                        }
                        $lastid = $item['id'];
                        echo now() . " | INFO | AICC: {$item['id']} {$item['company']} fetch ok \n";
                    }
                }
            }catch (\Exception $exception){
                echo now() . " | ERROR | " . $exception->getMessage() . "\n" . $exception->getTraceAsString() . "\n";
                break;
            }
        }
    }

    public function fetch_uuid()
    {
        $lastid = 0;
        while (true) {
            try {
                $items = TicketProject::where('id', '>', $lastid)
                    ->where('version', 6)
                    ->orderBy('id', 'asc')
                    ->limit(10)
                    ->get();
                if ($items->isEmpty()) {
                    echo "not found items \n";
                    break;
                }
                foreach ($items as $item) {
                    $uuid = md5("V6{$item->table_id}");
                    $item->uuid = $uuid;
                    $item->save();
                    $lastid = $item->id;
                    echo date('Y-m-d H:i:s') . " V6: $item->id fetch ok \n";
                }
            } catch (\Exception $exception) {
                echo $exception;
                break;
            }
        }
    }
}