UpdateProjectTdk.php 7.1 KB
<?php
/**
 * @remark :
 * @name   :UpdateProjectTdk.php
 * @author :lyh
 * @method :post
 * @time   :2025/7/2 11:11
 */

namespace App\Console\Commands\Tdk;

use App\Models\Blog\Blog;
use App\Models\Blog\BlogCategory;
use App\Models\Com\NoticeLog;
use App\Models\CustomModule\CustomModuleCategory;
use App\Models\CustomModule\CustomModuleContent;
use App\Models\News\News;
use App\Models\News\NewsCategory;
use App\Models\Product\Category;
use App\Models\Product\Keyword;
use App\Models\Product\Product;
use App\Models\RouteMap\RouteMap;
use App\Services\ProjectServer;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redis;
use PhpOffice\PhpSpreadsheet\IOFactory;

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

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '根据给定的文件更新项目的tdk';


    public function handle(){
        $noticeLogModel = new NoticeLog();
        while (true){
            $task_id = $this->getTaskId();
            if(empty($task_id)){
                sleep(30);
                continue;
            }
            $info = $noticeLogModel->read(['id'=>$task_id]);
            if($info !== false){
                echo 'start--'.PHP_EOL;
                $project_id = $info['data']['project_id'] ?? 0;
                if(empty($project_id)){
                    echo date('Y-m-d H:i:s').'未获取到项目id.'.PHP_EOL;
                    $noticeLogModel->edit(['status'=>$noticeLogModel::STATUS_FAIL],['id'=>$task_id]);
                    continue;
                }
                ProjectServer::useProject($project_id);
                $url = $info['data']['url'] ?? '';
                if(empty($url)){
                    echo date('Y-m-d H:i:s').'未获取到项目更新文件.项目id为:'.$project_id.PHP_EOL;
                    //未获取到文件,跳过
                    $noticeLogModel->edit(['status'=>$noticeLogModel::STATUS_FAIL],['id'=>$task_id]);
                    DB::disconnect('custom_mysql');
                    continue;
                }
                // 下载到 Laravel storage 的临时路径
                $tempPath = storage_path('app/temp_url.xlsx');
                file_put_contents($tempPath, file_get_contents($url));
                // 载入 Excel
                try {
                    $spreadsheet = IOFactory::load($tempPath);
                    $sheet = $spreadsheet->getActiveSheet();
                    $rows = $sheet->toArray();
                    unlink($tempPath);
                }catch (\Exception $e){
                    echo '文件打不开'.PHP_EOL;
                    $noticeLogModel->edit(['status'=>$noticeLogModel::STATUS_FAIL],['id'=>$task_id]);
                    DB::disconnect('custom_mysql');
                    continue;
                }
                $dataRows = array_slice($rows, 1);
                foreach ($dataRows as $item){
                    //获取路由
                    $route = trim($item[0],'/');
                    $route = basename($route);
                    $this->updateTdk($route,$item);
                }
                echo date('Y-m-d H:i:s').',end'.PHP_EOL;
                $noticeLogModel->edit(['status'=>$noticeLogModel::STATUS_SUCCESS],['id'=>$task_id]);
                DB::disconnect('custom_mysql');
            }
        }
        return true;
    }

    /**
     * @remark :获取任务id
     * @name   :getTaskId
     * @author :lyh
     * @method :post
     * @time   :2025/7/2 11:19
     */
    public function getTaskId()
    {
        $task_id = Redis::rpop('update_project_tdk_task');
        if (empty($task_id)) {
            $noticeLogModel = new NoticeLog();
            $ids = $noticeLogModel->selectField(['status'=>$noticeLogModel::STATUS_PENDING,'type'=>$noticeLogModel::TYPE_UPDATE_PROJECT_TDK],'id');
             if(!empty($ids)){
                foreach ($ids as $id) {
                    Redis::lpush('update_project_tdk_task', $id);
                }
            }
            $task_id = Redis::rpop('update_project_tdk_task');
        }
        return $task_id;
    }

    /**
     * @remark :更新tdk
     * @name   :updateTdk
     * @author :lyh
     * @method :post
     * @time   :2025/7/2 14:59
     */
    public function updateTdk($route,$item){
        $routeMapModel = new RouteMap();
        $routeInfo = $routeMapModel->read(['route'=>$route]);
        if($routeInfo === false){
            return false;
        }
        switch ($routeInfo['source']){
            case $routeMapModel::SOURCE_PRODUCT:
                $productModel = new Product();
                $productModel->edit(['seo_mate'=>json_encode(['title'=>$item[1],'description'=>$item[2],'keyword'=>$item[3]])],['id'=>$routeInfo['source_id']]);
                break;
            case $routeMapModel::SOURCE_PRODUCT_CATE:
                $productCategoryModel = new Category();
                $productCategoryModel->edit(['seo_title'=>$item[1],'seo_des'=>$item[2],'seo_keywords'=>$item[3]],['id'=>$routeInfo['source_id']]);
                break;
            case $routeMapModel::SOURCE_PRODUCT_KEYWORD:
                $productKeywordModel = new Keyword();
                $productKeywordModel->edit(['seo_title'=>$item[1],'seo_description'=>$item[2],'seo_keywords'=>$item[3]],['id'=>$routeInfo['source_id']]);
                break;
            case $routeMapModel::SOURCE_BLOG:
                $blogModel = new Blog();
                $blogModel->edit(['seo_title'=>$item[1],'seo_description'=>$item[2],'seo_keywords'=>$item[3]],['id'=>$routeInfo['source_id']]);
                break;
            case $routeMapModel::SOURCE_BLOG_CATE:
                $blogCateModel = new BlogCategory();
                $blogCateModel->edit(['seo_title'=>$item[1],'seo_des'=>$item[2],'seo_keywords'=>$item[3]],['id'=>$routeInfo['source_id']]);
                break;
            case $routeMapModel::SOURCE_NEWS:
                $newsModel = new News();
                $newsModel->edit(['seo_title'=>$item[1],'seo_description'=>$item[2],'seo_keywords'=>$item[3]],['id'=>$routeInfo['source_id']]);
                break;
            case $routeMapModel::SOURCE_NEWS_CATE:
                $newsCateModel = new NewsCategory();
                $newsCateModel->edit(['seo_title'=>$item[1],'seo_des'=>$item[2],'seo_keywords'=>$item[3]],['id'=>$routeInfo['source_id']]);
                break;
            case $routeMapModel::SOURCE_MODULE:
                $contentModel = new CustomModuleContent();
                $contentModel->edit(['seo_title'=>$item[1],'seo_description'=>$item[2],'seo_keywords'=>$item[3]],['id'=>$routeInfo['source_id']]);
                break;
            case $routeMapModel::SOURCE_MODULE_CATE:
                $categoryModel = new CustomModuleCategory();
                $categoryModel->edit(['seo_title'=>$item[1],'seo_description'=>$item[2],'seo_keywords'=>$item[3]],['id'=>$routeInfo['source_id']]);
                break;
            default:
                break;
        }
        return true;
    }
}