AiBlogLogic.php 10.2 KB
<?php

namespace App\Http\Logic\Bside\Ai;

use App\Helper\Common;
use App\Helper\Gpt;
use App\Helper\Translate;
use App\Http\Logic\Bside\BaseLogic;
use App\Models\Ai\AiBlog;
use App\Models\Ai\AiBlogAuthor;
use App\Models\Com\Notify;
use App\Models\Project\AiBlogTask;
use App\Models\Project\ProjectAiSetting;
use App\Models\RouteMap\RouteMap;
use App\Services\AiBlogService;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Cache;

class AiBlogLogic extends BaseLogic
{
    public function __construct()
    {
        parent::__construct();
        $this->param = $this->requestAll;
        $this->model = new AiBlog();
    }

    /**
     * @remark :获取配置信息
     * @name   :getProjectAiSetting
     * @author :lyh
     * @method :post
     * @time   :2025/2/21 14:51
     */
    public function getProjectAiSetting(){
        $ai_cache = Cache::get('ai_blog_'.$this->user['project_id']);
        if($ai_cache){
            return $ai_cache;
        }
        $projectAiSettingModel = new ProjectAiSetting();
        $aiSettingInfo = $projectAiSettingModel->read(['project_id'=>$this->user['project_id']]);
        if($aiSettingInfo === false){
            $this->fail('请先联系管理员开启Ai博客');
        }
        Cache::put('ai_blog_'.$this->user['project_id'],$aiSettingInfo,3600);
        return $aiSettingInfo;
    }

    /**
     * @remark :编辑ai发布博客
     * @name   :blogSave
     * @author :lyh
     * @method :post
     * @time   :2023/7/5 14:46
     */
    public function blogSave(){
        try {
            if(!empty($this->param['image'])){
                $this->param['image'] = str_replace_url($this->param['image']);
            }
            if(!isset($this->param['seo_title']) || empty($this->param['seo_title'])){
                $this->param['seo_title'] = truncate_text($this->param['new_title'],70);
            }
            $this->param['route'] = RouteMap::setRoute($this->param['route'], RouteMap::SOURCE_AI_BLOG, $this->param['id'], $this->user['project_id']);
            $anchor = $this->param['anchor'] ?? [];
            $this->param['anchor'] = json_encode($anchor,true);
            $this->model->edit($this->param,['id'=>$this->param['id']]);
            $aiSettingInfo = $this->getProjectAiSetting();
            $aiBlogService = new AiBlogService();
            $aiBlogService->mch_id = $aiSettingInfo['mch_id'];
            $aiBlogService->key = $aiSettingInfo['key'];
            $aiBlogService->updateDetail(['task_id'=>$this->param['task_id'],'title'=>$this->param['new_title'],'thumb'=>$this->param['image'],'route'=>$this->param['route'],'author_id'=>$anchor]);
        }catch (\Exception $e){
            $this->fail('保存失败,请联系管理员');
        }
        $this->sendHttpC([$this->param['route'],'top-blog']);
        shell_exec("php artisan save_ai_blog_list {$this->user['project_id']} > /dev/null 2>&1 &");
        return $this->success();
    }

    /**
     * @remark :编辑作者
     * @name   :saveAuthor
     * @author :lyh
     * @method :post
     * @time   :2025/2/21 14:46
     */
    public function saveBlogAuthor(){
        try {
            $aiAuthorModel = new AiBlogAuthor();
            if(!empty($this->param['image'])){
                $this->param['image'] = str_replace_url($this->param['image']);
            }
            $this->param['route'] = RouteMap::setRoute($this->param['route'], RouteMap::SOURCE_AI_BLOG_AUTHOR, $this->param['id'], $this->user['project_id']);
            $aiAuthorModel->edit($this->param,['id'=>$this->param['id']]);
            $aiSettingInfo = $this->getProjectAiSetting();
            $aiBlogService = new AiBlogService();
            $aiBlogService->mch_id = $aiSettingInfo['mch_id'];
            $aiBlogService->key = $aiSettingInfo['key'];
            $aiBlogService->updateAuthorInfo(['author_id'=>$this->param['author_id'],'route'=>$this->param['route'],'title'=>$this->param['title'],'picture'=>$this->param['image'],'description'=>$this->param['description']]);
            $aiBlogTask = new AiBlogTask();
            $aiBlogTask->addReturnId(['type'=>$aiBlogTask::TYPE_AUTHOR_ID,'task_id'=>$this->param['author_id'],'status'=>1,'project_id'=>$this->user['project_id']]);
        }catch (\Exception $e){
            $this->fail('保存失败,请联系管理员');
        }
        $this->sendHttpC([$this->param['route'],'top-blog']);
        return $this->success();
    }

    /**
     * @remark :发布任务
     * @name   :sendTask
     * @author :lyh
     * @method :post
     * @time   :2025/2/14 10:28
     * @detail :type=2/生成文章 type=3/更新列表页记录
     * @detail :status=1/待执行
     */
    public function sendTask(){
        $aiSettingInfo = $this->getProjectAiSetting();
        $aiBlogService = new AiBlogService();
        $aiBlogService->mch_id = $aiSettingInfo['mch_id'];
        $aiBlogService->key = $aiSettingInfo['key'];
        $aiBlogService->route = generateRoute(Translate::tran($this->param['keyword'], 'en'));
        $result = $aiBlogService->createTask($this->param['keyword'],2,'blog',$this->param['anchor'] ?? [],$this->param['title'] ?? '');
        if($result['status'] == 200){
            $aiBlogTaskModel = new AiBlogTask();
            $aiBlogTaskModel->addReturnId(['project_id'=>$this->user['project_id'],'type'=>2,'task_id'=>$result['data']['task_id'],'status'=>1]);
            $this->model->addReturnId(['keyword'=>$this->param['keyword'], 'status'=>1, 'task_id'=>$result['data']['task_id'],'project_id'=>$this->user['project_id'],'anchor'=>json_encode($this->param['anchor'] ?? [],true)
            ]);
        }else{
            @file_put_contents(storage_path('logs/lyh_error.log'), var_export($result, true) . PHP_EOL, FILE_APPEND);
        }
        return $this->success();
    }

    /**
     * @remark :删除
     * @name   :blogDelete
     * @author :lyh
     * @method :post
     * @time   :2025/2/20 18:21
     */
    public function blogDelete(){
        try {
            $aiSettingInfo = $this->getProjectAiSetting();
            $aiBlogService = new AiBlogService();
            $aiBlogTask = new AiBlogTask();
            foreach ($this->param['ids'] as $id) {
                $info = $this->model->read(['id'=>$id],['task_id','route','author_id']);
                $aiBlogService->mch_id = $aiSettingInfo['mch_id'];
                $aiBlogService->key = $aiSettingInfo['key'];
                $aiBlogService->delDetail($info['task_id']);
                //重新生成作者页面
                $aiBlogTask->addReturnId(['type'=>$aiBlogTask::TYPE_AUTHOR_ID,'task_id'=>$info['author_id'],'status'=>1,'project_id'=>$this->user['project_id']]);
                //删除路由映射
                RouteMap::delRoute(RouteMap::SOURCE_AI_BLOG, $id, $this->user['project_id']);
                $this->model->del(['id'=>$id]);
                $this->curlDelRoute(['old_route'=>$info['route'],'path'=>'blog']);
            }
            Artisan::call('save_ai_blog_list', ['project_id' => $this->user['project_id']]);
        }catch (\Exception $e){
            $this->fail('删除失败');
        }
        return $this->success();
    }

    /**
     * @remark :保存自定义
     * @name   :customSaveBlog
     * @author :lyh
     * @method :post
     * @time   :2025/9/16 11:43
     */
    public function customSaveBlog($param)
    {
        try {
            //处理路由
            $param['route'] = generateRoute(Translate::tran($param['route'] ?? $param['new_title'], 'en'));
            //推送到ai的数据结构
            $data = [
                'title'=>$param['new_title'], 'thumb'=>$param['image'], 'foreword'=>$param['description'] ?? '',
                'author_id'=>$param['author_id'], 'url'=>$param['route'],
            ];
            if(!isset($param['description']) || empty($param['description'])){
                $param['description'] = truncate_text($param['text']);
            }
            if(isset($param['id']) && !empty($param['id'])){
                $id = $param['id'];
                $data['task_id'] = $param['task_id'];
                if(!isset($param['seo_keyword']) || empty($param['seo_keyword'])){
                    $ai = "contains keyword {$param['title']} recommend 8 purchaser search keywords, separated by commas";
                    $text = Gpt::instance()->openai_chat_qqs($ai);
                    $text = Common::deal_keywords($text);
                    $text = Common::deal_str($text);
                    $param['seo_keyword'] = $text;
                }
                if(!isset($param['seo_description']) && empty($param['seo_description'])){
                    $ai = "According to the keyword {$param['title']}, write a seo meta description show to purchaser within 200 characters";
                    $text1 = Gpt::instance()->openai_chat_qqs($ai);
                    $text1 = Common::deal_keywords($text1);
                    $text1 = Common::deal_str($text1);
                    $param['seo_keyword'] = $text1;
                }
                $param['route'] = RouteMap::setRoute($param['route'], RouteMap::SOURCE_AI_BLOG, $id, $this->user['project_id']);
                $this->model->edit($param,['id'=>$param['id']]);
            }else{
                $param['uuid'] = md5(date('YmdHis').rand(100,999).$this->user['project_id']);
                $param['project_id'] = $this->user['project_id'];
                $param['status'] = $this->model::STATUS_RUNNING;
                $id = $this->model->addReturnId($param);
                $route = RouteMap::setRoute($param['route'], RouteMap::SOURCE_AI_BLOG, $id, $this->user['project_id']);
                $this->model->edit(['route'=>$route],['id'=>$id]);
            }
        }catch (\Exception $e){
            $this->fail('保存失败,请联系管理员');
        }
        $aiBlogService = new AiBlogService($this->user['project_id']);
        $result = $aiBlogService->createCustomBlog($data);
        $this->model->edit(['task_id'=>$result['data']['task_id'] ?? '','status'=>$this->model::STATUS_FINISH],['id'=>$id]);
        if(isset($result['status']) && $result['status'] == 200){
            //todo::更新列表页
            shell_exec("php artisan save_ai_blog_list {$this->user['project_id']} > /dev/null 2>&1 &");
        }else{
            $this->fail('发布失败,请编辑后重新发布');
        }
        return $this->success();
    }
}