作者 zhl

Merge remote-tracking branch 'origin/master' into zhl

... ... @@ -9,9 +9,13 @@
namespace App\Console\Commands\LyhTest;
use App\Enums\Common\Code;
use App\Helper\Common;
use App\Http\Requests\Aside\WorkOrder\AsideTicketListRequest;
use App\Models\Blog\Blog;
use App\Models\Com\V6WeeklyReport;
use App\Models\Manage\Manage;
use App\Models\Manage\ManageHr;
use App\Models\News\News;
use App\Models\Product\Category;
use App\Models\Product\CategoryRelated;
... ... @@ -22,6 +26,7 @@ use App\Models\Template\BTemplate;
use App\Models\Visit\Visit;
use App\Models\Visit\VisitItem;
use App\Models\Workchat\MessagePush;
use App\Models\WorkOrder\Tickets;
use App\Services\ProjectServer;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
... ... @@ -45,11 +50,11 @@ class DownloadProject extends Command
protected $description = '导出项目数据';
public function handle(){
echo date('Y-m-d H:i:s') . 'start' . PHP_EOL;
ProjectServer::useProject(671);
$this->newsImportBlog();
DB::disconnect('custom_mysql');
echo date('Y-m-d H:i:s') . 'end' . PHP_EOL;
echo date('Y-m-d H:i:s') . 'start1' . PHP_EOL;
// ProjectServer::useProject(671);
$this->downloadTicket();
// DB::disconnect('custom_mysql');
echo date('Y-m-d H:i:s') . 'end1' . PHP_EOL;
return true;
}
... ... @@ -121,6 +126,58 @@ class DownloadProject extends Command
}
/**
* @remark :导出工单数据
* @name :downloadTicketList
* @author :lyh
* @method :post
* @time :2025/9/13 15:24
*/
/**
* A端查看所有工单
*
* @return \Illuminate\Http\Response
*/
public function downloadTicket()
{
$this->param['dept_id'] = 2;
$this->param['entry_position'] = 2;
$search = '资料上传';
$query = Tickets::with([
'logs.engineer',
'project.pm',
'project.projectV6',
]);
$query = $query->where('title', 'like', '%' . $search . '%');
$query = $query->where('status', '!=' ,Tickets::STATUS_COMPLETED)->where('plan_end_at','<',date("Y-m-d H:i:s", strtotime("-72 hours")));
$query = $query->where('status', 0)->where('plan_end_at','<',date("Y-m-d H:i:s", strtotime("-120 hours")));//超过120个小时未处理的工单
//TODO::用户部门搜索
if(isset($this->param['dept_id']) && !empty($this->param['dept_id'])){
$manageHrModel = new ManageHr();
//售后优化+技术搜索
if($this->param['dept_id'] == 2 && !empty($this->param['entry_position'])) {//售后部
if ($this->param['entry_position'] == 1) {
$manageIdArr = $manageHrModel->selectField(['entry_position' => ['in', [44, 46, 49]], 'status' => 1], 'manage_id');
} else {
//售后技术
$manageIdArr = $manageHrModel->selectField(['entry_position' => ['in', [42, 43, 45, 48, 51]], 'status' => 1], 'manage_id');
}
$query = $query->whereHas('logs', function ($q) use ($manageIdArr) {
$q->whereIn('engineer_id', $manageIdArr);
});
}else{
$manageIdArr = $manageHrModel->selectField(['dept_id'=>$this->param['dept_id'],'status'=>1],'manage_id');
$query = $query->whereHas('logs', function ($q) use ($manageIdArr) {
$q->whereIn('engineer_id', $manageIdArr);
});
}
}
// 添加排序功能
$query->orderBy('status', 'asc');
$lists = $query->get()->toArray();
return $this->exportData($lists);
}
/**
* @remark :导出访问明细
* @name :exportData
* @author :lyh
... ... @@ -132,22 +189,27 @@ class DownloadProject extends Command
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// 添加表头
$sheet->setCellValue('A1', '浏览时间');
$sheet->setCellValue('B1', '访客来源');
$sheet->setCellValue('C1', '访客入路页面');
$sheet->setCellValue('D1', '终端');
$sheet->setCellValue('E1', '国家ip');
$sheet->setCellValue('F1', '深度访问页数');
$sheet->setCellValue('G1', '国家');
$sheet->setCellValue('A1', '公司名称');
$sheet->setCellValue('B1', '工单提交时间');
$sheet->setCellValue('C1', '工单内容');
$sheet->setCellValue('D1', '正式域名');
$sheet->setCellValue('E1', '测试域名');
$sheet->setCellValue('F1', '提交人');
$sheet->setCellValue('G1', '执行技术');
$rowCount = 2;
foreach ($data as $v) {
$sheet->setCellValue('A' . $rowCount, $v['created_at']);
$sheet->setCellValue('B' . $rowCount, $v['referrer_url']);
$sheet->setCellValue('C' . $rowCount, $v['url']);
$sheet->setCellValue('D' . $rowCount, $v['device_text']);
$sheet->setCellValue('E' . $rowCount, $v['ip']);
$sheet->setCellValue('F' . $rowCount, $v['depth']);
$sheet->setCellValue('G' . $rowCount, $v['country']);
foreach ($v['logs'] as $key => $value) {
if($value['is_engineer'] == 1){
$is_engineer = $value['engineer']['name'];
}
}
$sheet->setCellValue('A' . $rowCount, $v['project']['company_name']);
$sheet->setCellValue('B' . $rowCount, $v['created_at']);
$sheet->setCellValue('C' . $rowCount, $v['content']);
$sheet->setCellValue('D' . $rowCount, $v['project']['website']);
$sheet->setCellValue('E' . $rowCount, $v['project']['test_website']);
$sheet->setCellValue('F' . $rowCount, $v['submit_username']);
$sheet->setCellValue('G' . $rowCount, $is_engineer ?? '');
$rowCount++;
}
// 创建一个新的 Excel Writer 对象
... ...
... ... @@ -43,7 +43,6 @@ class LyhImportTest extends Command
protected $description = '导入数据';
/**
* @remark :统一更新路由
* @name :handle
... ... @@ -51,10 +50,12 @@ class LyhImportTest extends Command
* @method :post
* @time :2023/11/20 15:13
*/
public function handle(){
ProjectServer::useProject(3654);
echo date('Y-m-d H:i:s') . 'start' . PHP_EOL;
$this->importProductCategory('https://ecdn6-nc.globalso.com/upload/p/3654/file/2025-06/products-1.csv',3654);
public function handle()
{
ProjectServer::useProject(3531);
echo date('Y-m-d H:i:s') . 'start->3531' . PHP_EOL;
// $this->importProductCategory('https://ecdn6-nc.globalso.com/upload/p/3654/file/2025-06/products-1.csv',3654);
$this->import3531CustomModule(3531);
DB::disconnect('custom_mysql');
echo date('Y-m-d H:i:s') . 'end' . PHP_EOL;
}
... ... @@ -66,7 +67,8 @@ class LyhImportTest extends Command
* @method :post
* @time :2025/5/24 11:32
*/
public function import3951Product($url,$project_id){
public function import3951Product($url, $project_id)
{
$line_of_text = [];
$opts = [
'http' => [
... ... @@ -84,18 +86,18 @@ class LyhImportTest extends Command
}
fclose($file_handle);
$saveData = [];
foreach ($line_of_text as $k => $val){
if($k < 1){
foreach ($line_of_text as $k => $val) {
if ($k < 1) {
continue;
}
if(empty($val[0])){
echo '跳过的名称:'.$val[0];
if (empty($val[0])) {
echo '跳过的名称:' . $val[0];
continue;
}
$saveData[] = [
'title'=>$val[0],
'thumb' => json_encode(['alt'=>'主图','url'=>'/upload/p/3951/image/',$val[2]],true),
'gallery' => json_encode([['alt'=>'主图','url'=>'/upload/p/3951/image/',$val[2]]],true)
'title' => $val[0],
'thumb' => json_encode(['alt' => '主图', 'url' => '/upload/p/3951/image/', $val[2]], true),
'gallery' => json_encode([['alt' => '主图', 'url' => '/upload/p/3951/image/', $val[2]]], true)
];
}
}
... ... @@ -107,7 +109,8 @@ class LyhImportTest extends Command
* @method :post
* @time :2025/3/13 9:58
*/
public function importProductCategory($url,$project_id){
public function importProductCategory($url, $project_id)
{
$line_of_text = [];
$opts = [
'http' => [
... ... @@ -125,50 +128,50 @@ class LyhImportTest extends Command
}
fclose($file_handle);
$categoryModel = new Category();
foreach ($line_of_text as $k => $val){
if($k < 1){
foreach ($line_of_text as $k => $val) {
if ($k < 1) {
continue;
}
if(empty($val[0])){
echo '跳过的名称:'.$val[0];
if (empty($val[0])) {
echo '跳过的名称:' . $val[0];
continue;
}
try {
$cateArr = explode('/',$val[0]);
$cateArr = explode('/', $val[0]);
$pid = 0;
$two_pid = 0;
foreach ($cateArr as $key => $item){
if($key == 0){
foreach ($cateArr as $key => $item) {
if ($key == 0) {
//查看一级分类是否存在
$info = $categoryModel->read(['title'=>$item,'pid'=>0],['id']);
if($info === false){
$pid = $categoryModel->addReturnId(['project_id'=>$project_id,'title'=>$item]);
$info = $categoryModel->read(['title' => $item, 'pid' => 0], ['id']);
if ($info === false) {
$pid = $categoryModel->addReturnId(['project_id' => $project_id, 'title' => $item]);
//设置路由
$route = RouteMap::setRoute($item,RouteMap::SOURCE_PRODUCT_CATE,$pid,$project_id);
$categoryModel->edit(['route'=>$route],['id'=>$pid]);
}else{
$route = RouteMap::setRoute($item, RouteMap::SOURCE_PRODUCT_CATE, $pid, $project_id);
$categoryModel->edit(['route' => $route], ['id' => $pid]);
} else {
$pid = $info['id'];
}
}elseif ($key == 1){
} elseif ($key == 1) {
//查看当前下面的子级别是否存在
$two_info = $categoryModel->read(['title'=>$item,'pid'=>$pid],['id']);
if($two_info === false){
$two_pid = $categoryModel->addReturnId(['project_id'=>$project_id,'title'=>$item,'pid'=>$pid]);
$two_info = $categoryModel->read(['title' => $item, 'pid' => $pid], ['id']);
if ($two_info === false) {
$two_pid = $categoryModel->addReturnId(['project_id' => $project_id, 'title' => $item, 'pid' => $pid]);
//设置路由
$route = RouteMap::setRoute($item,RouteMap::SOURCE_PRODUCT_CATE,$two_pid,$project_id);
$categoryModel->edit(['route'=>$route],['id'=>$two_pid]);
}else{
$route = RouteMap::setRoute($item, RouteMap::SOURCE_PRODUCT_CATE, $two_pid, $project_id);
$categoryModel->edit(['route' => $route], ['id' => $two_pid]);
} else {
$two_pid = $two_info['id'];
}
}else{
$id = $categoryModel->addReturnId(['project_id'=>$project_id,'title'=>$item,'pid'=>$two_pid]);
$route = RouteMap::setRoute($item,RouteMap::SOURCE_PRODUCT_CATE,$id,$project_id);
$categoryModel->edit(['route'=>$route],['id'=>$id]);
} else {
$id = $categoryModel->addReturnId(['project_id' => $project_id, 'title' => $item, 'pid' => $two_pid]);
$route = RouteMap::setRoute($item, RouteMap::SOURCE_PRODUCT_CATE, $id, $project_id);
$categoryModel->edit(['route' => $route], ['id' => $id]);
}
}
echo date('Y-m-d H:i:s') . '产品分类id:'.PHP_EOL;
}catch (\Exception $e){
echo date('Y-m-d H:i:s') . '跳过的名称:'. $val[1];
echo date('Y-m-d H:i:s') . '产品分类id:' . PHP_EOL;
} catch (\Exception $e) {
echo date('Y-m-d H:i:s') . '跳过的名称:' . $val[1];
continue;
}
}
... ... @@ -182,7 +185,8 @@ class LyhImportTest extends Command
* @method :post
* @time :2025/3/3 15:59
*/
public function importProduct($url,$project_id){
public function importProduct($url, $project_id)
{
$line_of_text = [];
$opts = [
'http' => [
... ... @@ -203,163 +207,163 @@ class LyhImportTest extends Command
$productModel = new Product();
$detailModel = new Detail();
$extentInfoModel = new ExtendInfo();
foreach ($line_of_text as $k => $val){
if($k < 1){
foreach ($line_of_text as $k => $val) {
if ($k < 1) {
continue;
}
$saveData = [];
if(!empty($val[11])){
if (!empty($val[11])) {
$saveData['title'] = $val[11];
}else{
} else {
continue;
}
if(!empty($val[1])){
$cateInfo = $cateModel->read(['seo_title'=>trim($val[1])]);
if($cateInfo !== false){
$saveData['category_id'] = ','.$cateInfo['id'].',';
if (!empty($val[1])) {
$cateInfo = $cateModel->read(['seo_title' => trim($val[1])]);
if ($cateInfo !== false) {
$saveData['category_id'] = ',' . $cateInfo['id'] . ',';
}
}
$saveData['project_id'] = $project_id;
$saveData['status'] = 1;
$saveData['intro'] = $val[6] ?? '';
$seo = ['title'=>$val[11]];
$saveData['seo_mate'] = json_encode($seo,JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
$thumb = ['alt'=>'主图','url'=>str_replace('/public','/upload/p/3283',$val[12])];
$gallery = [['alt'=>'主图','url'=>str_replace('/public','/upload/p/3283',$val[12])]];
$saveData['thumb'] = json_encode($thumb,JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
$saveData['gallery'] = json_encode($gallery,JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
$seo = ['title' => $val[11]];
$saveData['seo_mate'] = json_encode($seo, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
$thumb = ['alt' => '主图', 'url' => str_replace('/public', '/upload/p/3283', $val[12])];
$gallery = [['alt' => '主图', 'url' => str_replace('/public', '/upload/p/3283', $val[12])]];
$saveData['thumb'] = json_encode($thumb, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
$saveData['gallery'] = json_encode($gallery, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
try {
$id = $productModel->addReturnId($saveData);
}catch (\Exception $e){
@file_put_contents(storage_path('logs/lyh_error.log'), var_export('未导入成功--标题:'.$val[0], true) . PHP_EOL, FILE_APPEND);
} catch (\Exception $e) {
@file_put_contents(storage_path('logs/lyh_error.log'), var_export('未导入成功--标题:' . $val[0], true) . PHP_EOL, FILE_APPEND);
continue;
}
//设置关联关系
if($cateInfo !== false){
CategoryRelated::saveRelated($id,[$cateInfo['id']]);
if ($cateInfo !== false) {
CategoryRelated::saveRelated($id, [$cateInfo['id']]);
}
//设置路由
$route = RouteMap::setRoute($val[11],RouteMap::SOURCE_PRODUCT,$id,$project_id);
$productModel->edit(['route'=>$route],['id'=>$id]);
echo date('Y-m-d H:i:s') . '新增产品id:'.$id . PHP_EOL;
if(!empty($val[2])){
$route = RouteMap::setRoute($val[11], RouteMap::SOURCE_PRODUCT, $id, $project_id);
$productModel->edit(['route' => $route], ['id' => $id]);
echo date('Y-m-d H:i:s') . '新增产品id:' . $id . PHP_EOL;
if (!empty($val[2])) {
$extent = [
'key'=>'pd_extended_field_4',
'product_id'=>$id,
'project_id'=>$project_id,
'values'=>$val[2],
'key' => 'pd_extended_field_4',
'product_id' => $id,
'project_id' => $project_id,
'values' => $val[2],
];
try {
$extentInfoModel->addReturnId($extent);
}catch (\Exception $e){
echo '错误:'.$val[2];
} catch (\Exception $e) {
echo '错误:' . $val[2];
}
}
if(!empty($val[3])){
if (!empty($val[3])) {
$extent = [
'key'=>'pd_extended_field_1',
'product_id'=>$id,
'project_id'=>$project_id,
'values'=>$val[3],
'key' => 'pd_extended_field_1',
'product_id' => $id,
'project_id' => $project_id,
'values' => $val[3],
];
try {
$extentInfoModel->addReturnId($extent);
}catch (\Exception $e){
echo '错误:'.$val[3];
} catch (\Exception $e) {
echo '错误:' . $val[3];
}
}
if(!empty($val[4])){
if (!empty($val[4])) {
$extent = [
'key'=>'pd_extended_field_2',
'product_id'=>$id,
'project_id'=>$project_id,
'values'=>$val[4],
'key' => 'pd_extended_field_2',
'product_id' => $id,
'project_id' => $project_id,
'values' => $val[4],
];
try {
$extentInfoModel->addReturnId($extent);
}catch (\Exception $e){
echo '错误:'.$val[4];
} catch (\Exception $e) {
echo '错误:' . $val[4];
}
}
if(!empty($val[5])){
if (!empty($val[5])) {
$extent = [
'key'=>'pd_extended_field_3',
'product_id'=>$id,
'project_id'=>$project_id,
'values'=>$val[5],
'key' => 'pd_extended_field_3',
'product_id' => $id,
'project_id' => $project_id,
'values' => $val[5],
];
try {
$extentInfoModel->addReturnId($extent);
}catch (\Exception $e){
echo '错误:'.$val[5];
} catch (\Exception $e) {
echo '错误:' . $val[5];
}
}
//产品描述
if(!empty($val[7])){
if (!empty($val[7])) {
//设置产品描述
$detail = [
'title'=>'SEODescription',
'product_id'=>$id,
'column_id'=>1,
'text_type'=>1,
'content'=>json_encode(['content'=>$val[7]],JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)
'title' => 'SEODescription',
'product_id' => $id,
'column_id' => 1,
'text_type' => 1,
'content' => json_encode(['content' => $val[7]], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)
];
$detailModel->addReturnId($detail);
}
//产品描述
if(!empty($val[8])){
if (!empty($val[8])) {
//设置产品描述
$detail = [
'title'=>'SEOSpecification',
'product_id'=>$id,
'column_id'=>1,
'text_type'=>1,
'content'=>json_encode(['content'=>$val[8]],JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)
'title' => 'SEOSpecification',
'product_id' => $id,
'column_id' => 1,
'text_type' => 1,
'content' => json_encode(['content' => $val[8]], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)
];
$detailModel->addReturnId($detail);
}
if(!empty($val[9])){
if (!empty($val[9])) {
try {
$faqsDetail = json_decode($val[9],JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
if(!empty($faqsDetail) && is_array($faqsDetail)){
$faqsDetail = json_decode($val[9], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
if (!empty($faqsDetail) && is_array($faqsDetail)) {
$faqContent = '<div>';
foreach ($faqsDetail as $faq_Val){
$faqContent .= "<span>question:".$faq_Val['question'] . "</span><br /><span>" . "answer:".$faq_Val['answer']. "</span><br />";
foreach ($faqsDetail as $faq_Val) {
$faqContent .= "<span>question:" . $faq_Val['question'] . "</span><br /><span>" . "answer:" . $faq_Val['answer'] . "</span><br />";
}
$faqContent .= '</div>';
$detailFaqInfo = [
'title'=>'SEOQandA',
'product_id'=>$id,
'column_id'=>1,
'text_type'=>1,
'content'=>json_encode(['content'=>$faqContent],JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)
'title' => 'SEOQandA',
'product_id' => $id,
'column_id' => 1,
'text_type' => 1,
'content' => json_encode(['content' => $faqContent], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)
];
$detailModel->addReturnId($detailFaqInfo);
}
}catch(\Exception $e){
} catch (\Exception $e) {
echo 'fqs';
}
}
if(!empty($val[10])){
if (!empty($val[10])) {
try {
$faqsDetail = json_decode($val[10],true);
if(!empty($faqsDetail) && is_array($faqsDetail)){
$faqsDetail = json_decode($val[10], true);
if (!empty($faqsDetail) && is_array($faqsDetail)) {
$faqContent = '<div>';
foreach ($faqsDetail as $faq_Val){
$faqContent .= "<span>question:".$faq_Val['question'] . "</span><br /><span>" . "answer:".$faq_Val['answer']. "</span><br />";
foreach ($faqsDetail as $faq_Val) {
$faqContent .= "<span>question:" . $faq_Val['question'] . "</span><br /><span>" . "answer:" . $faq_Val['answer'] . "</span><br />";
}
$faqContent .= '</div>';
$detailFaqInfo = [
'title'=>'SEOQandA_Product',
'product_id'=>$id,
'column_id'=>1,
'text_type'=>1,
'content'=>json_encode(['content'=>$faqContent])
'title' => 'SEOQandA_Product',
'product_id' => $id,
'column_id' => 1,
'text_type' => 1,
'content' => json_encode(['content' => $faqContent])
];
$detailModel->addReturnId($detailFaqInfo);
}
}catch(\Exception $e){
} catch (\Exception $e) {
continue;
}
}
... ... @@ -367,217 +371,24 @@ class LyhImportTest extends Command
return true;
}
public function handleCatePid(){
public function handleCatePid()
{
$cateModel = new Category();
$list = $cateModel->list([],'id',['*'],'asc');
foreach ($list as $k => $v){
if($v['seo_des'] == 0){
$list = $cateModel->list([], 'id', ['*'], 'asc');
foreach ($list as $k => $v) {
if ($v['seo_des'] == 0) {
$pid = 0;
}else{
$info = $cateModel->read(['seo_title'=>$v['seo_des']],['id']);
if($info !== false){
} else {
$info = $cateModel->read(['seo_title' => $v['seo_des']], ['id']);
if ($info !== false) {
$pid = $info['id'];
}else{
} else {
$pid = 0;
}
}
//更新pid
$cateModel->edit(['pid'=>$pid],['id'=>$v['id']]);
}
return true;
}
/**
* @remark :导入扩展模块数据
* @name :importCustomModule
* @author :lyh
* @method :post
* @time :2025/2/24 14:54
*/
public function importCustomModule($url,$project_id){
$line_of_text = [];
$opts = [
'http' => [
'method' => 'GET',
'header' => 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246'
],
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false
]
];
$file_handle = fopen($url, 'r', null, stream_context_create($opts));
while (!feof($file_handle)) {
$line_of_text[] = fgetcsv($file_handle, 0, ',');
}
fclose($file_handle);
$customContentModel = new CustomModuleContent();
$customCategoryModel = new CustomModuleCategory();;
$customExtendContentTModel = new CustomModuleExtentContent();
foreach ($line_of_text as $k => $item){
// try {
//添加内容
$contentId = $customContentModel->addReturnId(['name'=>$item[0],'module_id'=>3,'remark'=>$item[1],'project_id'=>$project_id]);
echo date('Y-m-d H:i:s') . '当前扩展数据id:'. $contentId . PHP_EOL;
//注册路由
$route = RouteMap::setRoute($item[0], RouteMap::SOURCE_MODULE,
$contentId, $project_id);
$customContentModel->edit(['route'=>$route],['id'=>$contentId]);
if(!empty($item[3])){
$categoryId = ',';
$cateArr = explode('/',$item[3]);
foreach ($cateArr as $cateV){
$cateInfo = $customCategoryModel->read(['name'=>$cateV,'module_id'=>3,'project_id'=>$project_id]);
if($cateInfo !== false){
$categoryId .= $cateInfo['id'].',';
}else{
$cateVId = $customCategoryModel->addReturnId(['name'=>$cateV,'module_id'=>3,'project_id'=>$project_id]);
$cateRoute = RouteMap::setRoute($cateV, RouteMap::SOURCE_MODULE_CATE,
$cateVId, $project_id);
$customCategoryModel->edit(['route'=>$cateRoute],['id'=>$cateVId]);
$categoryId .= $cateVId.',';
}
}
$customContentModel->edit(['category_id'=>$categoryId],['id'=>$contentId]);
}
$saveData = [
['key'=>'pd_extended_field_1', 'type'=>1, 'values'=>$item[2], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>3, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
// ['key'=>'pd_extended_field_2', 'type'=>1, 'values'=>$item[4], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
// ['key'=>'pd_extended_field_3', 'type'=>1, 'values'=>$item[5], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
// ['key'=>'pd_extended_field_4', 'type'=>1, 'values'=>$item[3], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
// ['key'=>'pd_extended_field_5', 'type'=>1, 'values'=>$item[8], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
// ['key'=>'pd_extended_field_6', 'type'=>1, 'values'=>$item[6], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
// ['key'=>'pd_extended_field_7', 'type'=>1, 'values'=>$item[9], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
// ['key'=>'pd_extended_field_8', 'type'=>1, 'values'=>$item[10], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
// ['key'=>'pd_extended_field_9', 'type'=>1, 'values'=>$item[11], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
// ['key'=>'pd_extended_field_10', 'type'=>1, 'values'=>$item[12], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
// ['key'=>'pd_extended_field_11', 'type'=>1, 'values'=>$item[13], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
// ['key'=>'pd_extended_field_12', 'type'=>1, 'values'=>$item[14] ?? '', 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
// ['key'=>'pd_extended_field_13', 'type'=>1, 'values'=>$item[7], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>2, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
];
$customExtendContentTModel->insert($saveData);
// }catch (\Exception $e){
// echo date('Y-m-d H:i:s') . '错误name:'. $item[0] . PHP_EOL;
// continue;
// }
}
}
/**
* @remark :新闻导入到扩展模块
* @name :newsImportCustom
* @author :lyh
* @method :post
* @time :2025/2/28 11:04
*/
public function newsImportCustom($project_id = 2385){
$newsModel = new News();
$lists = $newsModel->list(['category_id'=>',3,']);
foreach ($lists as $k => $v){
$param = [
'name'=>$v['name'],
'content'=>$v['text'],
'remark'=>$v['remark'],
'route'=>$v['url'],
'image'=>$v['image'],
'seo_title'=>$v['seo_title'],
'seo_keywords'=>$v['seo_keywords'],
'seo_description'=>$v['seo_keywords'],
'project_id'=>$project_id,
'operator_id'=>$v['operator_id'],
'release_at'=>$v['release_at'],
'module_id'=>3,
'category_id'=>',2,',
];
//删除当前新闻的路由
RouteMap::delRoute(RouteMap::SOURCE_NEWS,$v['id'],$project_id);
//删除当前数据
$newsModel->del(['id'=>$v['id']]);
$customContentModel = new CustomModuleContent();
$id = $customContentModel->addReturnId($param);
$route = RouteMap::setRoute($param['route'],RouteMap::SOURCE_MODULE,$id,$project_id);
$customContentModel->edit(['route'=>$route],['id'=>$id]);
$cateModel->edit(['pid' => $pid], ['id' => $v['id']]);
}
return true;
}
public function import2140CustomModule($url,$project_id){
$line_of_text = [];
$opts = [
'http' => [
'method' => 'GET',
'header' => 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246'
],
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false
]
];
$file_handle = fopen($url, 'r', null, stream_context_create($opts));
while (!feof($file_handle)) {
$line_of_text[] = fgetcsv($file_handle, 0, ',');
}
fclose($file_handle);
$customContentModel = new CustomModuleContent();
$customCategoryModel = new CustomModuleCategory();
$customExtendContentTModel = new CustomModuleExtentContent();
foreach ($line_of_text as $k => $item){
// try {
//添加内容
$contentId = $customContentModel->addReturnId(['name'=>$item[0],'image'=>'/upload/p/2140/image/'.$item[2],'module_id'=>7,'project_id'=>$project_id]);
echo date('Y-m-d H:i:s') . '当前扩展数据id:'. $contentId . PHP_EOL;
//注册路由
$route = RouteMap::setRoute($item[0], RouteMap::SOURCE_MODULE,
$contentId, $project_id);
$customContentModel->edit(['route'=>$route],['id'=>$contentId]);
if(!empty($item[1])){
$categoryId = ',';
$cateArr = explode('/',$item[1]);
foreach ($cateArr as $cateV){
$cateInfo = $customCategoryModel->read(['name'=>$cateV,'module_id'=>7,'project_id'=>$project_id]);
if($cateInfo !== false){
$categoryId .= $cateInfo['id'].',';
}else{
$cateVId = $customCategoryModel->addReturnId(['name'=>$cateV,'module_id'=>7,'project_id'=>$project_id]);
$cateRoute = RouteMap::setRoute($cateV, RouteMap::SOURCE_MODULE_CATE,
$cateVId, $project_id);
$customCategoryModel->edit(['route'=>$cateRoute],['id'=>$cateVId]);
$categoryId .= $cateVId.',';
}
}
$customContentModel->edit(['category_id'=>$categoryId],['id'=>$contentId]);
}
$saveData = [
['key'=>'pd_extended_field_1', 'type'=>1, 'values'=>$item[3], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
['key'=>'pd_extended_field_2', 'type'=>1, 'values'=>$item[4], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
['key'=>'pd_extended_field_3', 'type'=>1, 'values'=>$item[5], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
['key'=>'pd_extended_field_4', 'type'=>1, 'values'=>$item[6], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
['key'=>'pd_extended_field_5', 'type'=>1, 'values'=>$item[7], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
['key'=>'pd_extended_field_6', 'type'=>1, 'values'=>$item[8]??'', 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
['key'=>'pd_extended_field_7', 'type'=>1, 'values'=>$item[9], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
['key'=>'pd_extended_field_8', 'type'=>1, 'values'=>$item[10], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
['key'=>'pd_extended_field_9', 'type'=>1, 'values'=>$item[11], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
['key'=>'pd_extended_field_10', 'type'=>1, 'values'=>$item[12], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
['key'=>'pd_extended_field_11', 'type'=>1, 'values'=>$item[13], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
['key'=>'pd_extended_field_12', 'type'=>1, 'values'=>$item[14] ?? '', 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
['key'=>'pd_extended_field_13', 'type'=>1, 'values'=>$item[15], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
['key'=>'pd_extended_field_14', 'type'=>1, 'values'=>$item[16], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
['key'=>'pd_extended_field_15', 'type'=>1, 'values'=>$item[17], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
['key'=>'pd_extended_field_16', 'type'=>1, 'values'=>$item[18], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
['key'=>'pd_extended_field_17', 'type'=>1, 'values'=>$item[19], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
['key'=>'pd_extended_field_18', 'type'=>1, 'values'=>$item[20], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
['key'=>'pd_extended_field_19', 'type'=>1, 'values'=>$item[21], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
['key'=>'pd_extended_field_20', 'type'=>1, 'values'=>$item[22], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
['key'=>'pd_extended_field_21', 'type'=>1, 'values'=>$item[23], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
['key'=>'pd_extended_field_22', 'type'=>1, 'values'=>$item[24], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
['key'=>'pd_extended_field_23', 'type'=>1, 'values'=>$item[25], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
['key'=>'pd_extended_field_24', 'type'=>1, 'values'=>$item[26], 'content_id'=>$contentId, 'project_id'=>$project_id, 'module_id'=>7, 'created_at'=>date('Y-m-d H:i:s'), 'updated_at'=>date('Y-m-d H:i:s')],
];
$customExtendContentTModel->insert($saveData);
// }catch (\Exception $e){
// echo date('Y-m-d H:i:s') . '错误name:'. $item[0] . PHP_EOL;
// continue;
// }
}
}
}
... ...
... ... @@ -4,10 +4,10 @@ namespace App\Console\Commands\Project;
use App\Helper\Arr;
use App\Models\Product\Product;
use App\Models\Project\Project;
use App\Services\ProjectServer;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redis;
class ThumbProjectImage extends Command
{
... ... @@ -16,7 +16,7 @@ class ThumbProjectImage extends Command
*
* @var string
*/
protected $signature = 'thumb_project_image {project_id}';
protected $signature = 'thumb_project_image';
/**
* The console command description.
... ... @@ -27,79 +27,49 @@ class ThumbProjectImage extends Command
public function handle()
{
$project_id = $this->argument('project_id');
if ($project_id > 0) {
//指定项目
$this->output('project_id:' . $project_id . ' | start');
$project_info = ProjectServer::useProject($project_id);
if ($project_info) {
$thumb_w = $project_info->deploy_build->thumb_w ?? 0;
Product::select(['id', 'project_id', 'thumb'])->chunk(100, function ($products) use ($thumb_w) {
foreach ($products as $product) {
$thumb = $product->thumb;
if (isset($thumb['url']) && $thumb['url']) {
$new_thumb = thumbImageByUrl($thumb['url'], $thumb_w);
if ($new_thumb != $thumb['url']) {
$thumb['url'] = $new_thumb;
$json_thumb = Arr::a2s($thumb);
if (strlen($json_thumb) <= 500) {
$product->timestamps = false;
$product->thumb = $json_thumb;
$product->save();
$this->output('project_id:' . $product->project_id . ',product_id:' . $product->id . ' | success');
}
}
}
}
});
DB::disconnect('custom_mysql');
}
while (true) {
$this->start_thumb();
}
}
$this->output('project_id:' . $project_id . ' | end');
} else {
//所有项目
$projectModel = new Project();
$list = $projectModel->list(['delete_status' => 0, 'is_upgrade' => 0, 'type' => ['in', [1, 2, 3, 4, 6]]], 'id', ['id'], 'asc');
foreach ($list as $k => $v) {
$project_id = $v['id'];
public function start_thumb()
{
$key = 'thumb_project_image';
$project_id = Redis::rpop($key);
if (empty($project_id)) {
sleep(60);
return true;
}
$this->output('project_id:' . $project_id . ' | start');
$this->output('project_id:' . $project_id . ' | start');
$project_info = ProjectServer::useProject($project_id);
$project_info = ProjectServer::useProject($project_id);
if ($project_info) {
$thumb_w = $project_info->deploy_build->thumb_w ?? 0;
Product::select(['id', 'project_id', 'thumb'])->chunk(100, function ($products) use ($thumb_w) {
foreach ($products as $product) {
$thumb = $product->thumb;
if (isset($thumb['url']) && $thumb['url']) {
$new_thumb = thumbImageByUrl($thumb['url'], $thumb_w);
if ($new_thumb != $thumb['url']) {
$thumb['url'] = $new_thumb;
$json_thumb = Arr::a2s($thumb);
if (strlen($json_thumb) <= 500) {
$product->timestamps = false;
$product->thumb = $json_thumb;
$product->save();
if ($project_info) {
$thumb_w = $project_info->deploy_build->thumb_w ?? 0;
Product::select(['id', 'project_id', 'gallery'])->chunk(100, function ($products) use ($thumb_w) {
foreach ($products as $product) {
$thumb = $product['gallery'][0] ?? [];
if (isset($thumb['url']) && $thumb['url']) {
$thumb['url'] = thumbImageByUrl($thumb['url'], $thumb_w);
$json_thumb = Arr::a2s($thumb);
if (strlen($json_thumb) <= 500) {
$product->timestamps = false;
$product->thumb = $json_thumb;
$product->save();
$this->output('project_id:' . $product->project_id . ',product_id:' . $product->id . ' | success');
}
}
}
$this->output('project_id:' . $product->project_id . ',product_id:' . $product->id . ',thumb:' . $thumb_w . ' | success');
}
});
DB::disconnect('custom_mysql');
}
}
});
$this->output('project_id:' . $project_id . ' | end');
}
DB::disconnect('custom_mysql');
}
$this->output('project_id:' . $project_id . ' | end');
return true;
}
... ...
... ... @@ -10,6 +10,7 @@
namespace App\Console\Commands\SyncFilesImage;
use App\Models\File\File;
use App\Models\File\Image;
use Illuminate\Console\Command;
class SyncProjectFile extends Command
... ... @@ -31,7 +32,7 @@ class SyncProjectFile extends Command
public function handle(){
$project_id = $this->argument('project_id');
$fileModel = new File();
$fileModel = new Image();
$lists = $fileModel->list(['project_id'=>$project_id]);//未同步成功的图片及文件
foreach ($lists as $k => $v){
if(strpos($v['path'], '/181/') !== false ){
... ...
... ... @@ -10,6 +10,7 @@
namespace App\Console\Commands\SyncFilesImage;
use App\Models\File\File;
use App\Models\File\Image;
use Illuminate\Console\Command;
class SyncTimeFiles extends Command
... ... @@ -30,11 +31,11 @@ class SyncTimeFiles extends Command
public function handle()
{
$fileModel = new File();
// $imagesModel = new Image();
$start = '2025-08-20 00:00:00';
$end = '2025-08-28 00:00:00';
$lists = $fileModel->list(['created_at'=>['between',[$start,$end]]]);
// $fileModel = new File();
$imagesModel = new Image();
$start = '2025-08-28 00:00:00';
$end = '2025-08-29 23:59:59';
$lists = $imagesModel->list(['created_at'=>['between',[$start,$end]]]);
foreach ($lists as $v){
$path = $v['path'];
echo date('Y-m-d H:i:s') . ' | 图片链接:' . $path . PHP_EOL;
... ...
... ... @@ -83,6 +83,9 @@ class UpdateKeyword extends Command
if($info['update_method'] != 1){
$idArr = shuffle($idArr);
}
if(!$idArr){
return false;
}
$result = $this->splitArrayIntoParts($idArr,$number);
foreach ($result as $key => $val){
$keywordModel->edit(['keyword_content'=>$text[$key]],['id'=>['in',$val]]);
... ...
... ... @@ -286,14 +286,14 @@ class FetchTicketProjects extends Command
$fields = [
'company_name' => $item->company,
'title' => $item->title . " - V6",
'title' => $item->title . " - V" . (empty($item->version) ? 6 : $item->version),
'assm_id' => $assm_id,
'seom_id' => $seom_id,
'engineer_id' => $engineer_id,
'is_del' => $is_del,
'website' => !empty($item->domainInfo->domain) ? 'https://'.$item->domainInfo->domain : '',
'test_website' => $item->deploy_build->test_domain ?? '',
'version' => empty($item->version) ? 7 : $item->version, // 版本号
'version' => empty($item->version) ? 6 : $item->version, // 版本号
'plan' => $item->planMap()[$item->deploy_build->plan] ?? '',
'project_cate' => 2,
'wechat_group_id' => ProjectAssociation::where('project_id', $item->id)
... ...
... ... @@ -1468,68 +1468,66 @@ function diffInHours($startTime, $endTime)
return round($hours, 1);
}
/**
* 通过图片地址压缩图片
* @param $url
* @param int $width
* @return string
* @author Akun
* @date 2025/09/01 15:18
*/
function thumbImageByUrl($url, $width = 360)
{
if (empty($url)) {
return $url;
}
if (!function_exists('thumbImageByUrl')) {
/**
* 通过图片地址压缩图片
* @param $url
* @param int $width
* @return string
* @author Akun
* @date 2025/09/01 15:18
*/
function thumbImageByUrl($url, $width = 360)
{
if (empty($url)) {
return $url;
}
if ($width == 0) {
return $url;
}
if ($width == 0) {
return $url;
}
if (strpos($url, '_thumb') !== false) {
return $url;
}
//获取图片完整访问地址
$url_complete = getImageUrl($url, 0, 0, 0);//先用v6-file地址
if (strpos($url_complete, 'v6-file') !== false) {
$is_exists = checkRemoteFileExists($url_complete);
if (!$is_exists) {
//不存在,再用cdn地址
$url_complete = getImageUrl($url);
}
}
//获取图片完整访问地址
$url_complete = getImageUrl($url, 0, 0, 0);//先用v6-file地址
if (strpos($url_complete, 'v6-file') !== false) {
$is_exists = checkRemoteFileExists($url_complete);
if (!$is_exists) {
//不存在,再用cdn地址
$url_complete = getImageUrl($url);
//获取与原图存储路径相同的压缩路径
$path = parse_url($url_complete, PHP_URL_PATH);
$path_arr = explode('.', $path);
if (count($path_arr) != 2) {
return $url;
}
}
$path_arr[0] = $path_arr[0] . '_thumbW' . $width;
$key = implode('.', $path_arr);
//获取与原图存储路径相同的压缩路径
$path = parse_url($url_complete, PHP_URL_PATH);
$path_arr = explode('.', $path);
if (count($path_arr) != 2) {
return $url;
}
$path_arr[0] = $path_arr[0] . '_thumbW' . $width;
$key = implode('.', $path_arr);
try {
$img = \Intervention\Image\Facades\Image::make($url_complete);
try {
$img = \Intervention\Image\Facades\Image::make($url_complete);
//宽度按设定,高度自动调整
$img->resize($width, null, function ($constraint) {
$constraint->aspectRatio();
$constraint->upsize();
});
//宽度按设定,高度自动调整
$img->resize($width, null, function ($constraint) {
$constraint->aspectRatio();
$constraint->upsize();
});
//获取处理后的图片二进制资源
$resource = $img->stream()->__toString();
//获取处理后的图片二进制资源
$resource = $img->stream()->__toString();
//上传存储桶
$thumb_url = CosService::uploadRemote('', '', '', $key, $resource);
//上传存储桶
$thumb_url = CosService::uploadRemote('', '', '', $key, $resource);
$url = $thumb_url ? $thumb_url : $url;
} catch (\Exception $e) {
Log::channel('thumb_img')->error($e->getMessage(), [$url_complete, $width]);
}
$url = $thumb_url ? $thumb_url : $url;
} catch (\Exception $e) {
Log::channel('thumb_img')->error($e->getMessage(), [$url, $width]);
return $url;
}
return $url;
}
if (!function_exists('checkRemoteFileExists')) {
... ...
... ... @@ -221,7 +221,7 @@ class TicketController extends BaseController
$data['record'] = array_filter($data['record'], function($item) {
return $item['date'] > '2025-09-01';
});
if($project['type'] == 2){
if($project['type'] == 2 || ($project['deploy_build']['seo_plan'] > 0 && ($project['deploy_build']['plan'] == 0))){
//优化项目 默认在seo优化中
if($data['optimize_record'] == 0) {
$data['optimize_record'] = 1;
... ... @@ -236,14 +236,17 @@ class TicketController extends BaseController
}
//无剩余时间
if($project['project_type'] == 1){
if($project['remain_day'] == 0){$data['optimize_record'] = 4;}
}else{
$remain_day = $project['seo_remain_day'];
if($project['seo_remain_day'] == 0){$data['optimize_record'] = 4;}
}else{
$remain_day = $project['remain_day'];
if($project['remain_day'] == 0){$data['optimize_record'] = 4;}
}
if(in_array(2,$project['level'])){
$data['date_project_record'] = ['暂停优化'];
}else{
$data['date_project_record'] = Project::projectProgress('optimize');
$data['date_project_record'][4] .= (': '.$remain_day.'天');
}
}else{
//查看是否绑定微信群
... ...
... ... @@ -49,11 +49,20 @@ class OptimizeController extends BaseController
->orderBy('gl_project_deploy_optimize.start_date','desc');
$lists = $query->paginate($this->row, $this->selectParam(), 'page', $this->page)->toArray();
if(!empty($lists) && !empty($lists['list'])){
//多apino项目
$api_no_project = [2104,3041];
$rankDataModel = new RankData();
foreach ($lists['list'] as $k => $v){
//特殊项目 两个api_no
if($v['id'] == 2104){
$keyword_num_map = [10690=>100, 11201 => 50];
if(in_array($v['id'],$api_no_project)){
switch ($v['id']){
case 2104:
$keyword_num_map = [10690=>100, 11201 => 50];
break;
case 3041:
$keyword_num_map = [11298=>100, 10659 => 50];
break;
default:break;
}
$v['first_page_num'] = $v['indexed_pages_num'] = $v['g'] = $v['keyword_num'] = [];
foreach ($keyword_num_map as $api_no => $keyword_num){
$data = $rankDataModel->read(['project_id'=>$v['id'],'api_no' => $api_no, 'lang'=>''],['first_page_num','indexed_pages_num']);
... ... @@ -66,8 +75,8 @@ class OptimizeController extends BaseController
$v['indexed_pages_num'] = implode(',', $v['indexed_pages_num']);
$v['g'] = implode(',', $v['g']);
$v['keyword_num'] = implode(',', $v['keyword_num']);
}else{
$data = $rankDataModel->read(['project_id'=>$v['id'],'lang'=>'', 'api_no' => $v['api_no']],['first_page_num','indexed_pages_num']);
}else {
$data = $rankDataModel->read(['project_id' => $v['id'], 'lang' => '', 'api_no' => $v['api_no']], ['first_page_num', 'indexed_pages_num']);
$v['first_page_num'] = $data['first_page_num'] ?? 0;
$v['indexed_pages_num'] = $data['indexed_pages_num'] ?? 0;
$v['g'] = $this->getGNum($v['id']);
... ...
... ... @@ -8,6 +8,7 @@ use App\Http\Requests\Aside\WorkOrder\AsideTicketStoreRequest;
use App\Http\Requests\Aside\WorkOrder\AsideTicketListRequest;
use App\Http\Requests\Aside\WorkOrder\AsideTicketUpdateRequest;
use App\Http\Requests\Aside\WorkOrder\TicketProjectListRequest;
use App\Models\Manage\Manage;
use App\Models\Manage\ManageHr;
use App\Models\WorkOrder\TicketLog;
use App\Models\WorkOrder\TicketProject;
... ... @@ -52,7 +53,7 @@ class AsideTicketController extends BaseController
$status = $request->input('status');
if($status == 10){
$newTime = date("Y-m-d H:i:s", strtotime("-120 hours"));
return $query->where('status', 0)->where('plan_end_at','<',$newTime);//超过120个小时未处理的工单
return $query->where('status', '!=' ,Tickets::STATUS_COMPLETED)->where('plan_end_at','<',$newTime);//超过120个小时未处理的工单
}else{
return $query->where('status', $status);
}
... ... @@ -142,7 +143,15 @@ class AsideTicketController extends BaseController
if ($sortField != 'plan_end_at') $query->orderBy('plan_end_at', 'asc');
$lists = $query->paginate($this->row, ['*'], 'page', $this->page)->toArray();
if(!empty($lists) && !empty($lists['list'])){
$manageModel = new Manage();
foreach ($lists['list'] as $key => $item){
if($item['project']['version'] != 5){
$item['project']['engineer_id_name'] = $manageModel->getName($item['project']['engineer_id'] ?? 0);
}
//自动登录v6
if($item['project']['project_cate'] == 2){
$item['autologin_code'] = getAutoLoginCode($item['project']['table_id']);
}
//计算超时多少个小时
if($item['status'] == 0){
$end = date('Y-m-d H:i:s');
... ... @@ -280,9 +289,7 @@ class AsideTicketController extends BaseController
'logs.engineer',
'project.projectV6:id,company,title',
])->find($id);
if (!$ticket) $this->response('工单不存在', Code::USER_MODEL_NOTFOUND_ERROE);
$this->response('success', Code::SUCCESS, $ticket->toArray());
}
... ... @@ -296,7 +303,6 @@ class AsideTicketController extends BaseController
$request->validated();
$ticket = Tickets::find($id);
if (!$ticket) $this->response('工单不存在', Code::USER_MODEL_NOTFOUND_ERROE);
// 开始修改
$result = DB::transaction(function () use ($request, $ticket) {
if ($request->input('engineer_ids'))
... ...
... ... @@ -84,20 +84,19 @@ class AsideTicketLogController extends BaseController
if ($pending)
{
$ticket->status = Tickets::STATUS_PROCESSING;
}else
{
}else {
// 如果所有子任务都完成了,则将工单状态改为已完成
// todo 注意:建站期间的工单,所有人都完成后,不自动完成工单,需要项目经理验收修改工单状态
if (($ticket->title == 'GEO项目') || !($ticket->project->status == 1 && in_array($ticket->project->project_cate, [1, 2])))
{
$ticket->status = Tickets::STATUS_COMPLETED;
$ticket->end_at = now();
$ticket->end_time = diffInHours($ticket->created_at,$ticket->end_at);
$project = $ticket->project;
if ($project->wechat_switch && !$ticket->close_wechat)
$project->pushWechatGroupMsg("工单(ID:{$ticket->id})已全部完成,请访问查看详情!");
$ticket->pushDing('finish');
}else{
// todo 注意:建站期间的工单,所有人都完成后,不自动完成工单,需要项目经理验收修改工单状态
if (($ticket->title == 'GEO项目') || !($ticket->project->status == 1 && in_array($ticket->project->project_cate, [1, 2])))
{
$ticket->status = Tickets::STATUS_COMPLETED;
$ticket->end_at = now();
$ticket->end_time = diffInHours($ticket->created_at,$ticket->end_at);
$project = $ticket->project;
if ($project->wechat_switch && !$ticket->close_wechat)
$project->pushWechatGroupMsg("工单(ID:{$ticket->id})已全部完成,请访问查看详情!");
$ticket->pushDing('finish');
}else{
$ticket->status = Tickets::STATUS_YANSHOU;
}
}
... ...
... ... @@ -232,12 +232,12 @@ class CNoticeController extends BaseController
}
//获取项目所在服务器
$project_model = new Project();
$project_info = $project_model->read(['id'=>$project_id],['serve_id','is_upgrade', 'main_lang_id']);
$project_info = $project_model->read(['id'=>$project_id],['serve_id','type','is_upgrade', 'main_lang_id']);
if(!$project_info){
$this->fail('未查询到项目数据');
}
// --------------------------------------------------- 特殊处理通知生成页面 --------------------------------------------------------------
if ($type == 2 && $project_info['main_lang_id'] == 8) {
if ($type == 2 && ($project_id != 4041) && ($project_info['main_lang_id'] == 8)) {
$this->fail('申请项目主语种为俄语,禁止翻译小语种,如若需要翻译小语种, 请联系售后人员确认!');
}
... ...
... ... @@ -73,7 +73,7 @@ class GeoLinkLogic extends BaseLogic
foreach ($this->param['data'] as $item){
$data[] = [
'project_id'=>$this->param['project_id'],
'da'=>$item['da'] ?? '',
'da'=>$item['da'] ?? 0,
'url'=>$item['url'],
'send_time'=>$item['send_time']
];
... ...
... ... @@ -64,7 +64,7 @@ class ProcessRecordsLogic extends BaseLogic
// $data['record'] = array_filter($data['record'], function($item) {
// return $item['date'] > '2025-09-01';
// });
if($project['type'] == 2){
if($project['type'] == 2 || ($project['deploy_build']['seo_plan'] > 0 && ($project['deploy_build']['plan'] == 0))){
//优化项目 默认在seo优化中
if($data['optimize_record'] == 0) {
$data['optimize_record'] = 1;
... ... @@ -79,14 +79,17 @@ class ProcessRecordsLogic extends BaseLogic
}
//无剩余时间
if($project['project_type'] == 1){
$remain_day = $project['seo_remain_day'];
if($project['seo_remain_day'] == 0){$data['optimize_record'] = 4;}
}else{
$remain_day = $project['remain_day'];
if($project['remain_day'] == 0){$data['optimize_record'] = 4;}
}
if(in_array(2,$project['level'])){
$data['date_project_record'] = ['暂停优化'];
}else{
$data['date_project_record'] = Project::projectProgress('optimize');
$data['date_project_record'][4] .= (': '.$remain_day.'天');
}
}else{
//查看是否绑定微信群
... ...
... ... @@ -59,6 +59,7 @@ use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log as LogInfo;
use Illuminate\Support\Facades\Redis;
/**
* Class ProjectLogic
... ... @@ -528,6 +529,13 @@ class ProjectLogic extends BaseLogic
protected function saveProjectDeployBuild($deploy_build){
$deployBuildModel = new DeployBuild();
$deploy_build['configuration'] = Arr::a2s(!empty($deploy_build['configuration']) ? $deploy_build['configuration'] : []);
//如果更改了缩略图压缩大小,同步写入处理缩略图任务队列
$old_thumb_info = $deployBuildModel->read(['id'=>$deploy_build['id']],['thumb_w']);
if(isset($old_thumb_info['thumb_w']) && $old_thumb_info['thumb_w'] != $deploy_build['thumb_w']){
Redis::lpush('thumb_project_image',$deploy_build['project_id']);
}
$deployBuildModel->edit($deploy_build,['id'=>$deploy_build['id']]);
return $this->success();
}
... ...
... ... @@ -263,6 +263,9 @@ class CustomModuleContentLogic extends BaseLogic
* @time :2023/10/20 9:02
*/
public function getCategory($category){
if(empty($category)){
return '';
}
$str = '';
foreach ($category as $v){
$str .= $v.',';
... ...
... ... @@ -979,6 +979,18 @@ class ProductLogic extends BaseLogic
}
}
}
$exist_attr_keys = array_column($attrs,'key');//已存在的参数key
for($i=12;$i<count($data);$i++){
if($data[$i] ?? ''){
$data_i_array = explode('^v6sp$',$data[$i]);
if(count($data_i_array) == 2 && !in_array($data_i_array[0],$exist_attr_keys)){
$attrs[] = [
'key' => $data_i_array[0],
'value' => $data_i_array[1]
];
}
}
}
//处理描述切换栏
$describe = [];
if($data[11]??''){
... ...
... ... @@ -319,7 +319,7 @@ class UserLoginLogic
$info['is_amp'] = $is_amp;
$info['is_three_code'] = $project['is_three_code'] ?? 0;
//产品,新闻,博客导入模板
$info['import_products_url'] = 'https://ecdn6.globalso.com/upload/p/1/file/2024-12/products.csv';
$info['import_products_url'] = 'https://ecdn6.globalso.com/upload/p/1/file/2025-09/products-1.csv';
$info['import_news_url'] = 'https://ecdn6.globalso.com/upload/p/1/file/2024-12/news.csv';
$info['import_blogs_url'] = 'https://ecdn6.globalso.com/upload/p/1/file/2024-12/blogs.csv';
//缩略图宽度
... ...
... ... @@ -199,7 +199,7 @@ class Project extends Base
1 => 'SEO设置',
2 => '开始推广',
3 => '排名达标',
4 => '剩余服务时'
4 => '剩余服务时'
]
];
... ...
... ... @@ -254,7 +254,6 @@ Route::middleware(['aloginauth'])->group(function () {
// 售后工单改版
Route::prefix('tickets')->group(function () {
Route::get('/', [Aside\WorkOrder\AsideTicketController::class, 'index'])->name('admin.tickets.index')->summary('A端工单列表');
Route::post('/lists', [Aside\WorkOrder\AsideTicketController::class, 'lists'])->name('admin.tickets.lists')->summary('A端工单列表2');
Route::post('/', [Aside\WorkOrder\AsideTicketController::class, 'store'])->name('admin.tickets.store')->summary('A端创建工单');
Route::get('/{id}', [Aside\WorkOrder\AsideTicketController::class, 'show'])->name('admin.tickets.show')->summary('A端工单详情');
Route::post('/{id}', [Aside\WorkOrder\AsideTicketController::class, 'update'])->name('admin.tickets.update')->summary('A端更新工单,审核,邀请同事');
... ...