AiBlogTask.php 7.8 KB
<?php
/**
 * @remark :
 * @name   :AiBlogTask.php
 * @author :lyh
 * @method :post
 * @time   :2025/2/14 11:14
 */

namespace App\Console\Commands\Ai;

use App\Models\Ai\AiBlog;
use App\Models\Ai\AiBlogAuthor;
use App\Models\Ai\AiBlogList;
use App\Models\Domain\DomainInfo;
use App\Models\Project\ProjectAiSetting;
use App\Models\RouteMap\RouteMap;
use App\Services\AiBlogService;
use App\Services\ProjectServer;
use Illuminate\Console\Command;
use App\Models\Project\AiBlogTask as AiBlogTaskModel;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use function Symfony\Component\String\s;

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

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '查询ai_blog是否已经生成';

    public function handle(){
        $aiBlogTaskModel = new AiBlogTaskModel();
        while (true){
            $list = $aiBlogTaskModel->list(['status'=>1,'type'=>2, 'created_at' => ['<', date('Y-m-d H:i:s')]],'id',['*'],'asc',1000);
            if(empty($list)){
                sleep(300);
                continue;
            }
            $updateProject = [];
            foreach ($list as $item){
                echo '开始->任务id:' . $item['task_id'] . PHP_EOL . date('Y-m-d H:i:s');
                //获取配置
                $aiSettingInfo = $this->getSetting($item['project_id']);
                $aiBlogService = new AiBlogService();
                $aiBlogService->mch_id = $aiSettingInfo['mch_id'];
                $aiBlogService->key = $aiSettingInfo['key'];
                $aiBlogService->task_id = $item['task_id'];
                $result = $aiBlogService->getDetail();
                if(!isset($result['status']) || $result['status'] != 200){
                    sleep(5);
                    continue;
                }
                //保存当前项目ai_blog数据
                ProjectServer::useProject($item['project_id']);
                $aiBlogModel = new AiBlog();
                $aiBlogInfo = $aiBlogModel->read(['task_id'=>$item['task_id']],['id']);
                if($aiBlogInfo === false){
                    $aiBlogTaskModel->edit(['status'=>2],['id'=>$item['id']]);
                    continue;
                }
                if (!in_array($result['data']['author_id'], $updateProject[$item['project_id']] ?? [])) {
                    $updateProject[$item['project_id']][] = $result['data']['author_id'];
                }
                //拿到返回的路由查看是否重复
                $route = RouteMap::setRoute($result['data']['url'], RouteMap::SOURCE_AI_BLOG, $aiBlogInfo['id'], $item['project_id']);
                if($route != $result['data']['url']){
                    $aiBlogService->updateDetail(['route'=>$route,'task_id'=>$item['task_id']]);
                }
                $aiBlogModel->edit(['new_title'=>$result['data']['title'], 'image'=>$result['data']['thumb'], 'text'=>$result['data']['section'], 'author_id'=>$result['data']['author_id'],'seo_title'=>$result['data']['title'],'seo_keyword'=>$result['data']['keyword'],'seo_description'=>$result['data']['description'], 'route'=>$route ,'status'=>2], ['task_id'=>$item['task_id']]);
                DB::disconnect('custom_mysql');
                $aiBlogTaskModel->edit(['status'=>2],['id'=>$item['id']]);
            }
            //TODO::更新列表页及作者
            $this->updateProject($updateProject);
            echo '结束->任务id:' . $item['task_id'] . PHP_EOL . date('Y-m-d H:i:s');
        }
        return true;
    }

    /**
     * @remark :更新项目作者页面及列表页
     * @name   :updateProject
     * @author :lyh
     * @method :post
     * @time   :2025/3/4 10:25
     */
    public function updateProject($updateProject){
        if(empty($updateProject)){
            return true;
        }
        foreach ($updateProject as $project_id => $author){
            ProjectServer::useProject($project_id);
            $aiSettingInfo = $this->getSetting($project_id);
            $this->updateBlogList($aiSettingInfo);
            //更新作者
            foreach ($author as $val){
                $this->updateAiBlogAuthor($aiSettingInfo,$val);
            }
            DB::disconnect('custom_mysql');
            $this->curlDelRoute($project_id);
        }
        return true;
    }

    /**
     * @remark :获取项目配置
     * @name   :getSetting
     * @author :lyh
     * @method :post
     * @time   :2025/2/14 11:27
     */
    public function getSetting($project_id){
        $ai_cache = Cache::get('ai_blog_'.$project_id);
        if($ai_cache){
            return $ai_cache;
        }
        $projectAiSettingModel = new ProjectAiSetting();
        $aiSettingInfo = $projectAiSettingModel->read(['project_id'=>$project_id]);
        Cache::put('ai_blog_'.$project_id,$aiSettingInfo,3600);
        return $aiSettingInfo;
    }

    /**
     * @remark :更新作者的页面
     * @name   :updateAiBlogAuthor
     * @author :lyh
     * @method :post
     * @time   :2025/2/21 11:53
     */
    public function updateAiBlogAuthor($aiSettingInfo,$author_id){
        if(empty($author_id)){
            return true;
        }
        $aiBlogService = new AiBlogService();
        $aiBlogService->mch_id = $aiSettingInfo['mch_id'];
        $aiBlogService->key = $aiSettingInfo['key'];
        $aiBlogService->author_id = $author_id;
        $result = $aiBlogService->getAuthorDetail();
        if(isset($result['status']) && $result['status'] == 200){
            //当前作者的页面
            $aiBlogAuthorModel = new AiBlogAuthor();
            if(!empty($result['data']['section'])){
                $aiBlogAuthorModel->edit(['text'=>$result['data']['section']],['author_id'=>$author_id]);
            }
        }
        return true;
    }

    /**
     * @remark :更新列表页
     * @name   :updateBlogList
     * @author :lyh
     * @method :post
     * @time   :2025/2/26 15:42
     */
    public function updateBlogList($aiSettingInfo){
        $aiBlogService = new AiBlogService();
        $aiBlogService->mch_id = $aiSettingInfo['mch_id'];
        $aiBlogService->key = $aiSettingInfo['key'];
        $page = 1;
        $saveData = [];
        $result = $aiBlogService->getAiBlogList($page,15);
        if(!isset($result['status']) && $result['status'] != 200){
            return true;
        }
        $total_page = $result['data']['total_page'];
        //组装数据保存
        $saveData[] = [
            'route'=>$page,
            'text'=>$result['data']['section'],
        ];
        while ($total_page > $page){
            $page++;
            $result = $aiBlogService->getAiBlogList($page,15);
            if(isset($result['status']) && $result['status'] == 200){
                $saveData[] = [
                    'route'=>$page,
                    'text'=>$result['data']['section'],
                ];
            }
        }
        $aiBlogListModel = new AiBlogList();
        if(!empty($saveData)){
            //写一条路由信息
            $aiBlogListModel->truncate();
            $aiBlogListModel->insertAll($saveData);
        }
        return true;
    }

    /**
     * @remark :通知C端生成界面
     * @name   :sendNotice
     * @author :lyh
     * @method :post
     * @time   :2025/3/6 11:51
     */
    public function curlDelRoute($project_id){
        $domainModel = new DomainInfo();
        //获取项目域名
        $domain = $domainModel->getProjectIdDomain($project_id);
        if(!empty($domain)){
            $url = $domain.'api/update_page/?project_id='.$project_id.'&route=7';
            shell_exec('curl -k "'.$url.'"');
        }else{
            echo '域名不存在:' . $project_id . PHP_EOL . date('Y-m-d H:i:s');
        }
        return true;
    }
}