FetchTicketProjects.php 13.4 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()
    {
        # pm 项目经理  assm 售后服务经理
        $response = Http::get('https://www.quanqiusou.cn/extend_api/webs/globalso_all.php');
        if ($response->status() == 200) {
            $items = $response->json();
            foreach ($items as $item) {
                # V5: 版本号+postid
                $uuid = md5("V5{$item['postid']}");
                $project = TicketProject::where('uuid', $uuid)->first();
                $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;  //优化师
                // 如果 $item['cate'] 包含”推广“字符,则 $engineer_name = $item['assm']
                /**
                 * 第一负责人逻即说明:
                 * 优化推广项目:找售后服务经理??鸿飞
                 * 建站类项目: 找杨长远
                 */
                $engineer_id = (strpos($item['cate'], '推广') !== false) ? $assm_id : Manage::where('name', '杨长远')->value('id') ?? 0;

                $fields = [
                    'post_id' => $item['postid'],
                    'company_name' => $item['company'],
                    'title' => $item['title'],
                    '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,
                ];
                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();
                    }
                }
            }
            $postids = collect($items)->pluck('postid')->toArray();
            // 软删除 gl_ticket_projects 中不存在的项目
            TicketProject::where('version', 5)
                ->whereNotIn('post_id', $postids)
                ->update(['is_del' => 1]);
            echo date("Y-m-d H:i:s") . " V5: fetch completed, total " . count($items) . " items\n";
        }
    }

    /**
     * @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();
                    // 售后服务经理
                    $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);
                    // 优化师
                    $optimist_mid = ManageHr::find($item->deploy_optimize->optimist_mid) ? ManageHr::find($item->deploy_optimize->optimist_mid)->manage_id : 0;
                    $seom_id = $optimist_mid ? $optimist_mid : $assm_id;
                    /**
                     * 第一负责人逻辑
                     * 建站类项目:找杨长远
                     * 推广类:找售后
                     */
                    if ($item->type == Project::TYPE_THREE) {
                        $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,
                        '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', $project->table_id)
                            ->where('status', ProjectAssociation::STATUS_NORMAL)
                            ->where('binding_app', ProjectAssociation::ENTERPRISE_WECHAT)
                            ->value('friend_id')
                    ];
                    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) {
                    $uuid = md5("AICC{$item['id']}");
                    $project = TicketProject::where('uuid', $uuid)->first();
                    // 判断套餐是超迹还是域途, 如果 $item['plans'][0]['name'] 包含 '超迹' 则为超迹,否则为域途
                    $project_cate = Str::contains($item['plans'][0]['name'], '超迹') ? 3 : 4;
                    print_r($item['cj_assm']);
                    print_r($item['yutu_assm']);
                    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;
                    $is_del = 0;

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

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