ProjectFilePDF.php 4.6 KB
<?php

namespace App\Console\Commands;

use App\Http\Controllers\File\FileController;
use App\Models\ProjectAssociation\ProjectAssociation;
use App\Models\File\DataFile;
use Dompdf\Dompdf;
use Dompdf\Options;
use Illuminate\Console\Command;
use Illuminate\Http\File;

class ProjectFilePDF extends Command
{
    use CmdSignal;

    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'project_file_pdf';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '网站项目数据,生成PDF文件';

    protected ProjectAssociation $AiccWechat;

    protected DataFile $DataFile;

    protected $time;

    // 最大支持5个进程
    public int            $maxRunNumber = 50;

    public FileController $fileController;

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->AiccWechat     = new ProjectAssociation();
        $this->DataFile       = new DataFile();
        $this->time           = date("Y-m");
        $this->fileController = new FileController();
        parent::__construct();
    }

    public function start(): int
    {
        $status = 1; # 1 - 正常, 0 - 禁用
        $is_pdf = 0; # 0 - 未生成 1 - 已生成 2 - 其它问题
        $lists  = $this->DataFile::query()->where('status', $status)
                                 ->where('project_id', '!=', 0)
                                 ->where('friend_id', '!=', 0)
                                 ->where('user_id', '!=', 0)
                                 ->where('is_pdf', $is_pdf)->where('created_at', 'like', $this->time . '%')->first();
        if (is_null($lists)) {
            $this->debug_echo('没有任务,等待中');
            sleep(60);
            return 0;
        }
        $key        = $this->signature . '-' . $lists->id;
        $count      = redis_get($key);
        $item       = $lists->getOriginal();
        $project_id = $item->project_id;
        $user_id    = $item->user_id;
        $friend_id  = $item->friend_id;
        // todo 根据项目查询数据
        $project_data = [];
        $html         = $this->html($project_data);
        $filename     = hash('md5', $this->time . '-' . $project_id . '-' . $friend_id . '-' . $user_id);
        $file_path    = $this->savePDF($html, $filename);
        if (empty($file_path)) {
            $this->debug_echo('pdf生成失败!');
            return 0;
        }
        $isRes = $this->DataFile->saveData(compact('project_id', 'user_id', 'friend_id', 'file_path') + ['time' => $this->time]);
        if (!$isRes) {
            if ($count == 2) {
                $lists->is_pdf = 2;
                $lists->save();
                $this->debug_echo('项目文件数据保存失败! - 其他原因 - ' . $key);
            } else {
                redis_add($key, $count + 1);
                $this->debug_echo('项目文件数据保存失败! - ' . $key);
            }
        }
        $lists->is_pdf = 1;
        $lists->save();
        $this->debug_echo('项目文件数据保存成功!');
        return 0;
    }

    public function savePDF($html, $filename)
    {

        $pdf_path = public_path('PDF/');
        if (!file_exists($pdf_path)) {
            mkdir($pdf_path, 0777, true);
        }

        // 指定保存路径和文件名
        $savePath = $pdf_path . $filename . '.pdf';
        if (file_exists($savePath)) {
            echo '文件已经存在';
//            return 0;
        }
        // todo 生成中文有问题
        # 实例化并使用dompdf类
//        $options = new Options();
//        $options->setDefaultFont('arial');
//        $dompdf = new Dompdf($options);
        $dompdf = new Dompdf();
        $dompdf->loadHtml($html);
        #(可选)设置纸张大小和方向
        $dompdf->setPaper('A4', 'landscape');

        # 将HTML渲染为PDF
        $dompdf->render();

        // 获取PDF内容
        $pdfContent = $dompdf->output();

        // 将PDF内容保存到文件
        @file_put_contents($savePath, $pdfContent);

        // 创建一个文件实例
        $file = new File($savePath);

        return $this->fileController->single($file);
    }

    /**
     * 根据数据生成 Html
     * @param $item
     * @return string
     */
    protected function html($item)
    {
        $html = '<html>';
        $html .= '<body style="font-family:arial">';
        $html .= '<h1>Hello, World!</h1>';
        $html .= '<p>中文内容</p>';
        $html .= '</body>';
        $html .= '</html>';
        return $html;
    }
}