love_php/app/Exports/ReportExport.php
2026-04-02 09:20:51 +08:00

149 lines
6.0 KiB
PHP

<?php
namespace App\Exports;
use App\Http\Controllers\UploadController;
use App\Models\Server\MerchantReport;
use App\Models\Server\MerchantUser;
use App\Models\Server\ReportAnswer;
use App\Models\Server\TouristOrder;
use App\Server\ReportFile;
use Illuminate\Support\Facades\Log;
use PhpOffice\PhpWord\IOFactory;
use PhpOffice\PhpWord\PhpWord;
class ReportExport
{
protected $user;
public static function export(TouristOrder $order, $start_date=null, $end_date=null)
{
ini_set('memory_limit', -1);
//活动名称
$activity_name = $order->desc;
//用户报告日期
$time_arr = ReportAnswer::where([ 'm_order_id'=> $order->id])->distinct('commitd_at')->pluck('commitd_at')->toArray();
sort($time_arr);
$new_time_arr = [];
if ($start_date && $end_date) {
foreach ($time_arr as $time) {
if (strtotime($time) >= strtotime($start_date) && strtotime($time) <= strtotime($end_date)) {
$new_time_arr[] = $time;
}
}
}else {
$new_time_arr = $time_arr;
}
$php_word = new PhpWord();
//设置默认样式
$php_word->setDefaultFontName('宋体');//字体
$php_word->setDefaultFontSize(14);//字号
$section = $php_word->addSection();
//预定义样式
$imageStyle = ['width' => 150, 'height' => 150, 'align' => 'left'];
$font_center = ['align'=>'center'];
$font_left = ['align'=>'left'];
$pic_height = $pic_width = 150;
$php_word->addTitleStyle(1, ['bold' => true, 'color' => '000', 'size' => 22, 'name' => '宋体'],$font_center);
$section->addTitle(ReportExport::filterOutXMLIllicit($activity_name). '用户报告',1);
$section->addTextBreak(2);
$php_word->addTitleStyle(2, ['bold' => true, 'color' => '000', 'size' => 16, 'name' => '宋体'],$font_left);
$fontStyleName = 'textstyle';
$php_word->addFontStyle(
$fontStyleName,
array('name' => '宋体', 'size' => 16, 'color' => '1B2232', 'bold' => true)
);
foreach ($new_time_arr as $time) {
$section->addTitle('·'.date("Y-m-d", strtotime($time)), 2);
$section->addTextBreak(1);
$answers = ReportAnswer::with('question')->where(['m_order_id'=> $order->id])->where('commitd_at', $time)->get();
$index = 1;
foreach ($answers as $answer) {
if (empty($answer->question)) continue;
$section->addText(ReportExport::filterOutXMLIllicit($index.'. '.$answer->question->title), $fontStyleName);
if (is_array(json_decode($answer->answer2)) && count(json_decode($answer->answer2))) {
$res = implode('、', json_decode($answer->answer2));
$section->addText(ReportExport::filterOutXMLIllicit($res), $fontStyleName);
}elseif($answer->answer2) {
$section->addText(ReportExport::filterOutXMLIllicit($answer->answer2), $fontStyleName);
}
$section->addText(ReportExport::filterOutXMLIllicit($answer->answer), $fontStyleName);
if ($answer->pics) {
$pics = json_decode($answer->pics, true);
//添加表格
$styleTable = [
'borderColor' => '006699',
'borderSize' => 6,
'cellMargin' => 50,
];
$php_word->addTableStyle('pic_table', $styleTable);
$table = $section->addTable('pic_table');
$cell_index = 1;
if ($pics && count($pics)) {
foreach ($pics as $pic) {
if ($cell_index % 3 == 1) {
$table->addRow($pic_height);
}
if (!strstr($pic, 'x-oss-process')) {
$pic = $pic.'?x-oss-process=image/auto-orient,1/resize,p_30/quality,q_80';
}
try {
$table->addCell($pic_width)->addImage($pic, $imageStyle);
$cell_index++;
}catch (\Exception $e) {
Log::info($e->getMessage());
}
}
}
}
$index++;
$section->addTextBreak(1);
}
$section->addTextBreak(1);
}
$writer = IOFactory::createWriter($php_word, 'Word2007');
$fileName = '用户报告--' . $order->name .$order->id. '.docx';
$path = storage_path('qrcode/') . $fileName;
$writer->save($path);
$url = '';
if (file_exists($path)) {
$url = self::uploadFile($path);
unlink($path);
}
ReportFile::updateOrCreate(['order_id'=>$order->id], ['url'=>$url, 'file_type'=>'docx']);
// return $url;
// return response()->download($url);
}
public static function uploadFile($file)
{
$ossClient = UploadController::getOssClient();
//生成file
$object = date('Y').date('m')."/".date('d')."/".basename($file);
$url = 'https://'.config('alioss.picture_domain').'/'.$object;
try {
$ossClient->uploadFile(config('alioss.buckets.picture'), $object, $file);
} catch(\OSS\Core\OssException $e) {
Log::info($e->getMessage());
return false;
}
return $url;
}
private static function filterOutXMLIllicit($htmlStr) {
if (empty($htmlStr)) return $htmlStr;
$xmlStr=str_replace('<','&lt;',$htmlStr);
$xmlStr=str_replace('>','&gt;',$xmlStr);
$xmlStr=str_replace('"','&quot;',$xmlStr);
$xmlStr=str_replace("'",'&#39;',$xmlStr);
$xmlStr=str_replace("&",'&amp;',$xmlStr);
return $xmlStr;
}
}