209 lines
6.8 KiB
PHP
209 lines
6.8 KiB
PHP
<?php
|
|
namespace app\common\controller;
|
|
|
|
use app\common\controller\BaseController;
|
|
use app\common\model\UsedCar;
|
|
use app\common\model\UsedCarPdfLog;
|
|
use app\common\service\OssService;
|
|
use app\common\traits\crud\CrudControllerTrait;
|
|
use app\common\service\UsedCarService;
|
|
use app\common\utils\pdf\service\MpdfDriver;
|
|
use support\exception\BusinessException;
|
|
use support\Request;
|
|
|
|
class UsedCarController extends BaseController
|
|
{
|
|
use CrudControllerTrait;
|
|
|
|
protected $service;
|
|
|
|
protected $noNeedLogin = ['downloadPdf'];
|
|
|
|
protected $noNeedHeaderData = ['downloadPdf'];
|
|
|
|
public function __construct()
|
|
{
|
|
$this->service = new UsedCarService();
|
|
}
|
|
|
|
/**
|
|
* 列表页数据格式化
|
|
*
|
|
* @param array $data
|
|
* @return array
|
|
*/
|
|
protected function indexFormat($data)
|
|
{
|
|
if (isset($data['created_at']))
|
|
$data['created_at'] = date('Y-m-d H:i:s', $data['created_at']);
|
|
if (isset($data['updated_at']))
|
|
$data['updated_at'] = date('Y-m-d H:i:s', $data['updated_at']);
|
|
if (!empty($data['images'])){
|
|
$images = explode(',', $data['images']);
|
|
$ossService = new OssService();
|
|
$images_pull = [];
|
|
foreach ($images as $image){
|
|
$images_pull[] = $ossService->generatePrivateUrl($image);
|
|
}
|
|
$data['images_pull'] = $images_pull;
|
|
|
|
}
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* 列表页数据格式化
|
|
*
|
|
* @param array $data
|
|
* @return array
|
|
*/
|
|
protected function showFormat($data)
|
|
{
|
|
if (isset($data['created_at']))
|
|
$data['created_at'] = date('Y-m-d H:i:s', $data['created_at']);
|
|
if (isset($data['updated_at']))
|
|
$data['updated_at'] = date('Y-m-d H:i:s', $data['updated_at']);
|
|
if (!empty($data['images'])){
|
|
$images = explode(',', $data['images']);
|
|
$ossService = new OssService();
|
|
$images_pull = [];
|
|
foreach ($images as $image){
|
|
$images_pull[] = $ossService->generatePrivateUrl($image);
|
|
}
|
|
$data['images_pull'] = $images_pull;
|
|
|
|
}else{
|
|
$data['images_pull'] = [];
|
|
}
|
|
if (!empty($data['attachment'])){
|
|
//$attachments = explode(',', $data['attachment']);
|
|
$attachments = json_decode($data['attachment'], true);
|
|
$ossService = new OssService();
|
|
$attachment_pull = [];
|
|
foreach ($attachments as $attachment){
|
|
$attachment_pull[] = [
|
|
'name'=>$attachment['name'],
|
|
'src'=>$ossService->generatePrivateUrl($attachment['src'])
|
|
];
|
|
}
|
|
$data['attachment_pull'] = $attachment_pull;
|
|
|
|
}else{
|
|
$data['attachment_pull'] = [];
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
public function crawlKeyword(Request $request){
|
|
try {
|
|
// $keyword = $request->get('keyword');
|
|
$data = $this->service->crawlKeyword($request);
|
|
return $this->success($data);
|
|
} catch (\Throwable $e) {
|
|
return $this->error($e->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 生成pdf
|
|
* @param Request $request
|
|
* @return \support\Response
|
|
*/
|
|
public function producePdf(Request $request){
|
|
try {
|
|
$price = $request->get('price');
|
|
if(empty($price)){
|
|
throw new BusinessException("请输入生成pdf中的价格");
|
|
}
|
|
$raw = $this->service->serviceShow($request);
|
|
$data = $this->transformData($raw, method_exists($this, 'showFormat')
|
|
? [$this, 'showFormat']
|
|
: null);
|
|
$images = [];
|
|
foreach ($data['images_pull'] as $image){
|
|
$images[] = $this->service->downloadImage($image);
|
|
}
|
|
$data['images'] = $images;
|
|
|
|
$attachments = [];
|
|
foreach ($data['attachment_pull'] as $attachment){
|
|
// 方法1:使用 pathinfo
|
|
$path = parse_url($attachment['src'], PHP_URL_PATH); // 获取路径部分
|
|
$extension = pathinfo($path, PATHINFO_EXTENSION); // 获取扩展名
|
|
|
|
if (strtolower($extension) === 'pdf') { //如果是pdf则下载到本地
|
|
$attachments[] = $this->service->downloadAttachment($attachment['src']);
|
|
}
|
|
}
|
|
$data['attachment'] = $attachments;
|
|
$data['price'] = $price;
|
|
|
|
$pdf = (new MpdfDriver())->exportUsedCarPdf($data);
|
|
UsedCar::where('id', $data['id'])->update(['pdf_src' => $pdf]);
|
|
|
|
array_map('unlink', glob(runtime_path('pdf/images/*.jpg')));
|
|
array_map('unlink', glob(runtime_path('pdf/attachment/*.pdf')));
|
|
|
|
UsedCarPdfLog::create([
|
|
'user_id' => $request->user['id'],
|
|
'used_car_id' => $request->get('id'),
|
|
'price_snapshot' => $price,
|
|
'pdf_path' => $pdf,
|
|
]);
|
|
return $this->success($pdf);
|
|
} catch (\Throwable $e) {
|
|
return $this->error($e->getMessage());
|
|
}
|
|
}
|
|
|
|
public function downloadPdf(Request $request){
|
|
$raw = $this->service->serviceShow($request);
|
|
$filePath = runtime_path('pdf') .'/'. $raw['pdf_src'];
|
|
|
|
if (!file_exists($filePath)) {
|
|
return response($filePath.'文件不存在', 404);
|
|
}
|
|
|
|
return response()->download(
|
|
$filePath,
|
|
$raw['product_name'].'-'.$raw['id'].'.pdf' // 下载时显示的文件名
|
|
);
|
|
}
|
|
|
|
public function getPdf(Request $request)
|
|
{
|
|
try {
|
|
$raw = $this->service->serviceShow($request);
|
|
$filePath = runtime_path('pdf') . '/' . $raw['pdf_src'];
|
|
|
|
if (empty($raw['pdf_src']) || !file_exists($filePath)) {
|
|
throw new BusinessException('文件不存在');
|
|
}
|
|
|
|
// 确保 public/pdf 存在
|
|
$publicDir = public_path('pdf');
|
|
if (!is_dir($publicDir)) {
|
|
mkdir($publicDir, 0755, true);
|
|
}
|
|
|
|
// 拷贝到 public 目录
|
|
$publicFile = $publicDir . '/' . $raw['pdf_src'];
|
|
if (!file_exists($publicFile)) {
|
|
copy($filePath, $publicFile);
|
|
}
|
|
|
|
// 返回访问地址
|
|
$baseUrl = 'https://' . request()->header('host');
|
|
$url = $baseUrl . '/pdf/' . $raw['pdf_src'];
|
|
|
|
return $this->success([
|
|
'pdf_url' => $url,
|
|
'file_name' => $raw['product_name'] . '-' . $raw['id'] . '.pdf'
|
|
]);
|
|
} catch (\Throwable $e) {
|
|
return $this->error($e->getMessage());
|
|
}
|
|
}
|
|
|
|
} |