CropImage.php 8.4 KB
<?php
/**
 * @remark :
 * @name   :CropImage.php
 * @author :lyh
 * @method :post
 * @time   :2025/5/8 9:19
 */

namespace App\Console\Commands\CropImage;

use App\Enums\Common\Code;
use App\Models\Domain\DomainInfo;
use App\Models\File\Image;
use App\Models\WebSetting\AggregationSetting;
use App\Models\WebSetting\WebSettingImage;
use App\Services\CosService;
use App\Services\ProjectServer;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;

class CropImage extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'crop_image {project_id}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '裁剪图片';

    public function handle(){
        echo '测试裁剪->cs-crop:'.PHP_EOL;
        $project_id = $this->argument('project_id');
        ProjectServer::useProject($project_id);
        $data = $this->_keywordAction($project_id);
        $this->_aiAction($project_id,$data[0] ?? []);
        DB::disconnect('custom_mysql');
    }

    /**
     * @remark :执行的方法
     * @name   :_action
     * @author :lyh
     * @method :post
     * @time   :2025/5/8 9:21
     */
    public function _keywordAction($project_id){
        $resData = [];
        //聚合页裁剪
        $data = $this->getKeywordImage($project_id);
        $cosService = new CosService();
        if(!empty($data)){
            foreach ($data as $val){
                //处理图片为相对路径
                $image = str_replace_url($val);
                $height = $cosService->getImageHeight($image);
                if(empty($height)){
                    echo '未获取到图片高度。'.PHP_EOL;
                    continue;
                }
                echo '返回的图片高度:'.$height.PHP_EOL;
                if($height > 220){
                    $result = $cosService->cropCosImage($image);
                    if(empty($result)){
                        continue;
                    }
                    $resData[] = $result['path'];
                    $this->saveMysql($project_id,$result['size'],$result['type'],$result['path'],$result['mime']);
                }else{
                    $resData[] = $image;
                }
            }
        }
        $this->saveAggregationSetting($project_id,$resData);
        return $resData;
    }

    /**
     * @remark :ai执行方法
     * @name   :_aiAction
     * @author :lyh
     * @method :post
     * @time   :2025/5/8 16:12
     */
    public function _aiAction($project_id,$keywordImage){
        $cosService = new CosService();
        //ai_blog裁剪
        $ai_image = $this->getAiBlogImage($project_id,$keywordImage ?? []);
        if(empty($ai_image)){
            echo '当前图片不需要裁剪。'.PHP_EOL;
            return true;
        }
        $height = $cosService->getImageHeight($ai_image);
        if(empty($height)){
            echo '未获取到AI_BLOG图片高度。'.PHP_EOL;
            return true;
        }
        echo '返回的图片高度:'.$height.PHP_EOL;
        if($height > 220){
            $result = $cosService->cropCosImage($ai_image);
            if(empty($result)){
                return true;
            }
            $this->saveMysql($project_id,$result['size'],$result['type'],$result['path'],$result['mime']);
            $webSettingImageModel = new WebSettingImage();
            $webSettingImageModel->edit(['image'=>$result['path']],['project_id' => $project_id, 'type' => 4]);
        }
        return true;
    }

    /**
     * @remark :保存数据
     * @name   :saveAggregationSetting
     * @author :lyh
     * @method :post
     * @time   :2025/5/8 16:24
     */
    public function saveAggregationSetting($project_id,$data){
        if(empty($data)){
            return true;
        }
        //存全路径
        foreach ($data as $key => $val){
            $val = getImageUrl($val);
            $data[$key] = $val;
        }
        $aggregationSettingModel = new AggregationSetting();
        $info = $aggregationSettingModel->read(['project_id'=>$project_id]);
        if($info === false){
            $aggregationSettingModel->addReturnId(['project_id'=>$project_id,'top_banner'=>json_encode($data,true)]);
        }else{
            $aggregationSettingModel->edit(['top_banner'=>json_encode($data,true)],['id'=>$info['id']]);
        }
        return true;
    }

    /**
     * @remark :获取aiBlog图片
     * @name   :getAiBlogImage
     * @author :lyh
     * @method :post
     * @time   :2025/5/8 10:42
     */
    public function getAiBlogImage($project_id,$keywordImage){
        // AI博客banner type:1:产品,2:博客,3:新闻,4:AIBlog
        $webSettingImageModel = new WebSettingImage();
        $aiBlogInfo = $webSettingImageModel->read(['project_id' => $project_id, 'type' => 4],['image']);
        if($aiBlogInfo === false && !empty($keywordImage)){
            $webSettingImageModel->addReturnId(['project_id'=>$project_id,'image'=>$keywordImage,'type'=>4]);
            return '';
        }
        if(empty($aiBlogInfo['image']) && !empty($keywordImage)){
            $webSettingImageModel->edit(['image'=>$keywordImage],['id'=>$aiBlogInfo['id']]);
            return '';
        }
        $ai_image = str_replace_url($aiBlogInfo['image']);
        return $ai_image;
    }

    /**
     * @remark :获取聚合页图片
     * @name   :getImage
     * @author :lyh
     * @method :post
     * @time   :2025/5/8 9:21
     */
    public function getKeywordImage($project_id){
        $data = [];
        // 聚合页banner
        $aggregationSettingModel = new AggregationSetting();
        $aggregationSettingInfo = $aggregationSettingModel->read(['project_id' => $project_id],['id','top_banner']);
        if($aggregationSettingInfo !== false && !empty($aggregationSettingInfo['top_banner'])){
            foreach ($aggregationSettingInfo['top_banner'] as $val){
                if($val != 'jpg' && $val != 'png' && $val != 'webp'){
                    $data[] = $val;
                }
            }
        }
        if(empty($data)){
            //重页面上获取首页banner
            $data = $this->getDomImage($project_id);
        }
        return $data;
    }

    /**
     * @remark :页面上获取图片
     * @name   :getDomImage
     * @author :lyh
     * @method :post
     * @time   :2025/5/8 10:32
     */
    public function getDomImage($project_id){
        $data = [];
        echo '获取首页banner:' . $project_id . PHP_EOL;
        $domainModel = new DomainInfo();
        $domainInfo = $domainModel->read(['project_id' => $project_id, 'status' => 1]);
        if ($domainInfo !== false) {
            $dom = @file_get_html('https://' . $domainInfo['domain'] . '/');
            if (empty($dom)) {
                $this->output('获取HTML失败: ' . $project_id);
            }else{
                $banner_dom = $dom->find('main .section-banner-wrap-block img', 0);
                $data[] = $banner_dom ? $banner_dom->src : '';
                $dom->clear();
                unset($dom);
            }
        }else{
            $this->output('域名不存在: ' . $project_id);
        }
        return $data;
    }

    /**
     * @remark :写入数据库
     * @name   :saveMysql
     * @author :lyh
     * @method :post
     * @time   :2025/5/8 14:59
     */
    public function saveMysql($project_id,$size,$image_type,$path,$mime = ''){
        $hash = md5($path);
        $imageModel = new Image();
        $info = $imageModel->read(['hash'=>$hash,'project_id'=>$project_id]);
        $data = [
            'path' => $path,
            'size' => $size,
            'hash' => $hash,
            'type' => $image_type,
            'refer'=> 0,
            'mime' => $mime,
            'project_id'=>$project_id,
            'name'=>basename($path),
            'en_name'=>basename($path)
        ];
        if($info === false){
            $imageModel->addReturnId($data);
        }else{
            $imageModel->edit($data,['id'=>$info['id']]);
        }
        return true;
    }

    /**
     * @remark :记录日志
     * @name   :output
     * @author :lyh
     * @method :post
     * @time   :2025/5/8 9:57
     */
    public function output($message, $log_file = 'logs/crop_image.log')
    {
        $message = date('Y-m-d H:i:s') . ' ' . $message . PHP_EOL;
        echo $message;
        file_put_contents(storage_path($log_file), $message, FILE_APPEND);
        return true;
    }
}