作者 刘锟

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

... ... @@ -73,6 +73,7 @@ class AfterDayCount extends Command
->whereIn('gl_project.type',[2,4])
->leftJoin('gl_project_deploy_optimize', 'gl_project.id', '=', 'gl_project_deploy_optimize.project_id')
->whereRaw("FIND_IN_SET('2', gl_project.level) = 0 AND FIND_IN_SET('3', gl_project.level) = 0")
->whereRaw("FIND_IN_SET('7', gl_project_deploy_optimize.special) = 0 AND FIND_IN_SET('8', gl_project_deploy_optimize.special) = 0")
->count();
$qualified_count = $projectModel->where('gl_project.extend_type',0)
->where('gl_project.delete_status',0)
... ... @@ -82,6 +83,7 @@ class AfterDayCount extends Command
->whereIn('gl_project.type',[2,4])
->leftJoin('gl_project_deploy_optimize', 'gl_project.id', '=', 'gl_project_deploy_optimize.project_id')
->whereRaw("FIND_IN_SET('2', gl_project.level) = 0 AND FIND_IN_SET('3', gl_project.level) = 0")
->whereRaw("FIND_IN_SET('7', gl_project_deploy_optimize.special) = 0 AND FIND_IN_SET('8', gl_project_deploy_optimize.special) = 0")
->count();
$rate = number_format($qualified_count / $project_count, 2);
$threeMonthsAgo = date('Y-m-d 00:00:00', strtotime('-3 months'));
... ... @@ -92,6 +94,7 @@ class AfterDayCount extends Command
->whereIn('gl_project.type',[2,4])
->leftJoin('gl_project_deploy_optimize', 'gl_project.id', '=', 'gl_project_deploy_optimize.project_id')
->whereRaw("FIND_IN_SET('2', gl_project.level) = 0 AND FIND_IN_SET('3', gl_project.level) = 0")
->whereRaw("FIND_IN_SET('7', gl_project_deploy_optimize.special) = 0 AND FIND_IN_SET('8', gl_project_deploy_optimize.special) = 0")
->count();
$three_qualified_count = $projectModel->where('gl_project.extend_type',0)
->whereIn('gl_project.id',$projectIdArr)
... ... @@ -101,6 +104,7 @@ class AfterDayCount extends Command
->whereIn('gl_project.type',[2,4])
->leftJoin('gl_project_deploy_optimize', 'gl_project.id', '=', 'gl_project_deploy_optimize.project_id')
->whereRaw("FIND_IN_SET('2', gl_project.level) = 0 AND FIND_IN_SET('3', gl_project.level) = 0")
->whereRaw("FIND_IN_SET('7', gl_project_deploy_optimize.special) = 0 AND FIND_IN_SET('8', gl_project_deploy_optimize.special) = 0")
->count();
$three_rate = number_format($three_qualified_count / $three_project_count, 2);
$data = $projectModel->where('gl_project.extend_type',0)
... ... @@ -111,6 +115,7 @@ class AfterDayCount extends Command
->whereIn('gl_project.type',[2,4])
->leftJoin('gl_project_deploy_optimize', 'gl_project.id', '=', 'gl_project_deploy_optimize.project_id')
->whereRaw("FIND_IN_SET('2', gl_project.level) = 0 AND FIND_IN_SET('3', gl_project.level) = 0")
->whereRaw("FIND_IN_SET('7', gl_project_deploy_optimize.special) = 0 AND FIND_IN_SET('8', gl_project_deploy_optimize.special) = 0")
->pluck('gl_project.title')->toArray();
$saveData[] = [
'date'=>date('Y-m-d', strtotime('yesterday')),
... ...
... ... @@ -44,6 +44,7 @@ class CopyProject extends Command
public function handle()
{
while (true) {
$projectModel = new Project();
$list = NoticeLog::where('type', NoticeLog::TYPE_COPY_PROJECT)->where('status', NoticeLog::STATUS_PENDING)->get();
if(empty($list)){
sleep(30);
... ... @@ -68,13 +69,15 @@ class CopyProject extends Command
$item->status = NoticeLog::STATUS_FAIL;
$item->save();
}
sleep(60);
try {
$this->copyMysql($old_project_id,$project_id);
$this->output('CopyProjectJob end, old project_id: ' . $old_project_id . ', new project_id: ' . $project_id);
}catch (\Exception $e){
echo $e->getMessage().PHP_EOL;
echo '复制数据库失败:'.$old_project_id . '<->'.$project_id;
}
$this->output('CopyProjectJob end, old project_id: ' . $old_project_id . ', new project_id: ' . $project_id);
//修改项目状态
$projectModel->edit(['delete_status'=>0],['id'=>$project_id]);
}
}
return true;
... ... @@ -206,13 +209,54 @@ class CopyProject extends Command
}
//复制数据库
public function copyMysql($project_id,$new_project_id){
Artisan::call("php artisan copy_project_s $project_id $new_project_id");
echo '进入复制数据:'.PHP_EOL;
//切换数据库配置
$project = ProjectServer::useProject($new_project_id);
//创建数据库
ProjectServer::createDatabase($project);
//创建表
$this->initTable($project_id,$new_project_id);
//修改项目状态
$projectModel = new Project();
$projectModel->edit(['delete_status'=>0],['id'=>$new_project_id]);
}
/**
* @remark :创建数据库
* @name :initTable
* @author :lyh
* @method :post
* @time :2023/12/11 10:09
*/
public function initTable($project_id, $news_project_id)
{
// 设置源数据库
config(['database.connections.custom_tmp_mysql_copy.database' => 'gl_data_' . $project_id]);
$database_name = DB::connection('custom_tmp_mysql_copy')->getDatabaseName();
// 获取源数据库的所有表
$tables = Schema::connection('custom_tmp_mysql_copy')->getAllTables();
$tables = array_column($tables, 'Tables_in_' . $database_name);
foreach ($tables as $table) {
// 1. 删除目标数据库中的表
DB::connection('custom_mysql')->statement("DROP TABLE IF EXISTS {$table}");
// 2. 复制建表 SQL
$sql = DB::connection('custom_tmp_mysql_copy')->select("SHOW CREATE TABLE `{$table}`");
DB::connection('custom_mysql')->statement(get_object_vars($sql[0])['Create Table']);
// 3. 跳过指定的表
if (in_array($table, ['gl_customer_visit', 'gl_customer_visit_item', 'gl_inquiry_other', 'gl_inquiry_form_data', 'gl_inquiry_form'])) {
continue;
}
// 4. 原生 SQL 插入数据(完全复制)
$insert_sql = "INSERT INTO `{$table}` SELECT * FROM `gl_data_{$project_id}`.`{$table}`";
DB::connection('custom_mysql')->statement($insert_sql);
// 5. 更新 project_id(如果存在)
if (Schema::connection('custom_mysql')->hasColumn($table, 'project_id')) {
DB::connection('custom_mysql')->table($table)->update(['project_id' => $news_project_id]);
}
}
return true;
}
/**
* @param $message
* @return bool
*/
... ...
... ... @@ -7,6 +7,7 @@ use App\Models\RankData\RankDataLog as RankDataLogModel;
use App\Models\Project\DeployOptimize;
use App\Models\Project\Project;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
/**
... ... @@ -47,8 +48,19 @@ class RankData extends BaseCommands
Project::where('is_remain_today', 1)->update(['is_remain_today' => 0]);
Cache::set('clear_remain_today_' . date('Y-m-d'), 1, 24 * 3600);
}
$projectModel = new Project();
$list = $projectModel->leftJoin('gl_project_deploy_optimize', 'gl_project.id', '=', 'gl_project_deploy_optimize.project_id')
->where('gl_project.extend_type',0)
->where('gl_project.delete_status',0)
->where('gl_project_deploy_optimize.api_no', '>', 0)
->whereIn('gl_project.type',[2,4])
->whereRaw("FIND_IN_SET('2', gl_project.level) = 0 AND FIND_IN_SET('3', gl_project.level) = 0")
->select(['gl_project_deploy_optimize.api_no as api_no', 'gl_project_deploy_optimize.project_id as project_id'])
->orderBy('gl_project.id', 'asc')
->get()->toArray();
//有排名api编号的项目
$list = DeployOptimize::where('api_no', '>', 0)->select('api_no', 'project_id')->orderBy('project_id', 'asc')->get()->toArray();
// $list = DeployOptimize::where('api_no', '>', 0)->select('api_no', 'project_id')->orderBy('project_id', 'asc')->get()->toArray();
//特殊项目 一个项目多个apino
$list[] = ['api_no' => 11201, 'project_id' => 2104];
$list[] = ['api_no' => 10690, 'project_id' => 2104];
... ...
... ... @@ -55,16 +55,27 @@ class RecommendedSuppliers extends Command
*/
public function handle()
{
$project_list = $this->deployBuildModel->list(['is_supplier'=>1]);//TODO::已开启推荐供应商
$projectModel = new Project();
$projectArr = $projectModel->selectField(['delete_status'=>0,'type'=>['in',[2,3,4]]],'id');
$project_list = $this->deployBuildModel->list(['is_supplier'=>1,'project_id'=>['in',$projectArr]]);//TODO::已开启推荐供应商
foreach ($project_list as $v){
try {
echo date('Y-m-d H:i:s') . '推荐供应商执行的project_id:'.$v['project_id'] . PHP_EOL;
$result = $this->countPurchaser($v);
if($result !== false){
ProjectServer::useProject($v['project_id']);
$title = $this->getKeywords($v['project_id']);
if(!empty($title)){
$this->savePurchaser($v['project_id'],$title);
}else{
echo '关键词已取完'.PHP_EOL;
}
DB::disconnect('custom_mysql');
}
}catch (\Exception $e){
echo date('Y-m-d hH:i:s').'当前项目执行错误:'.$e->getMessage().PHP_EOL;
continue;
}
}
return true;
}
... ... @@ -84,7 +95,9 @@ class RecommendedSuppliers extends Command
$count = $purchaserInfoModel->counts(['project_id'=>$v['project_id']]);
//获取项目版本
$plan = ['专业版'=>300, '标准版'=>500, '商务版'=>800, '旗舰版'=>1200];
$total_number = $plan[Project::planMap()[$v['plan']]] ?? 300;
$typePlan = Project::planMap();
$version = $typePlan[$v['plan']] ?? '专业版';
$total_number = $plan[$version] ?? 300;
if($count > $total_number){
echo date('Y-m-d H:i:s') . '达到数量上线关闭的项目:'.$v['project_id'] . PHP_EOL;
//更新数量上限字段,并关闭推荐供应商
... ... @@ -95,12 +108,31 @@ class RecommendedSuppliers extends Command
return true;
}
/**
* @remark :获取关键词数据
* @name :getPurchaser
* @author :lyh
* @method :post
* @time :2025/4/15 17:55
*/
public function getPurchaser($keyword,$project_id){
$purchaserModel = new Purchaser();
return $purchaserModel->read(['keyword'=>$keyword,'project_id'=>$project_id]);
}
/**
* @remark :获取已经处理过的关键词
* @name :getPurchaserList
* @author :lyh
* @method :post
* @time :2025/4/15 17:55
*/
public function getPurchaserList($project_id){
$purchaserModel = new Purchaser();
return $purchaserModel->selectField(['project_id'=>$project_id],'keyword');
}
/**
* @remark :保存供应商
* @name :getPurchaser
* @author :lyh
... ... @@ -110,6 +142,7 @@ class RecommendedSuppliers extends Command
public function savePurchaser($project_id,$keyword,$row = 10){
//项目还没有关键词
if(!$keyword){
echo '项目还没有关键词'.PHP_EOL;
return true;
}
$url = 'https://fob.ai.cc/api/company_list';
... ... @@ -126,6 +159,7 @@ class RecommendedSuppliers extends Command
'total'=>$this->param['row'] ?? 10,
];
$res = http_post($url,json_encode($param));
echo '请求返回状态'. ($res['code']?? '').PHP_EOL;
// echo date('Y-m-d H:i:s') . json_encode($res) . PHP_EOL;
if(!empty($res) && isset($res['code']) && $res['code'] == 200 && !empty($res['data'])){
//保存多条数据
... ... @@ -152,15 +186,13 @@ class RecommendedSuppliers extends Command
* @time :2024/7/1 18:07
*/
public function getKeywords($project_id){
$info = Keyword::inRandomOrder()->first();
if(!$info){
$keywordModel = new Keyword();
$keyword_array = $this->getPurchaserList($project_id);
$info = $keywordModel->read(['title'=>['not in',$keyword_array]],'title');
if($info === false){
return '';
}
$keywordInfo = $this->getPurchaser($info->title,$project_id);
if($keywordInfo !== false){
$this->getKeywords($project_id);
}
return $info->title;
return $info['title'] ?? '';
}
/**
... ...
... ... @@ -13,6 +13,7 @@ use App\Models\Domain\DomainInfo;
use App\Models\Mail\Mail;
use App\Models\Project\DeployBuild;
use App\Models\Project\DeployOptimize;
use App\Models\Project\KeywordPrefix;
use App\Models\Project\Project;
use App\Models\Project\ProjectKeyword;
use App\Models\Project\ProjectUpdateTdk;
... ... @@ -373,39 +374,13 @@ class UpdateSeoTdk extends Command
$seo_title = $v[$this->topic_fields[$table]];;
//只有推广项目 且未标记特殊前后缀 才加 前后缀
if($project->type == Project::TYPE_TWO && !in_array(8, explode(',', $project->deploy_optimize->special))) {
$prefix = $this->getPrefixKeyword($project_id, 'prefix', 1);
$suffix = $this->getPrefixKeyword($project_id, 'suffix', 2);
if (empty($prefix) || empty($suffix)) {
continue;
}
$title = $seo_title;
$prefix = $this->getPrefixKeyword($project_id, 'prefix', 1, $title);
//in,for,with,to,near,from 这些介词 只拼前缀,不拼后缀
$is_contains_jieci = false;
$words = explode(' ', $title);
foreach ($words as $word){
$word = Str::replace([',', '!', '?'], '', $word);
if(in_array(strtolower($word), ['in', 'for', 'with', 'to', 'near','from'])){
$is_contains_jieci = true;
}
}
$suffix = '';
if(!$is_contains_jieci){
// 某些后缀不能并存的情况
$ban_suffix = [];
//services/service 结尾的词,后缀不拼manufacturer,factory
if (Str::endsWith($title, ['services', 'service', 'Services', 'Service'])) {
$ban_suffix = ['manufacturer', 'factory', 'Manufacturer', 'Factory', 'Factories', 'Manufacturers'];
}
//前缀有wholesale或cheap的词,后缀不拼 manufacturer,factory,exporter,company
if (Str::startsWith($title, ['wholesale', 'cheap', 'Wholesale', 'Cheap'])) {
$ban_suffix = array_merge($ban_suffix, ['manufacturer', 'factory', 'exporter', 'company', 'Manufacturer', 'Factory', 'Exporter', 'Company', 'Factories', 'Manufacturers', 'Exporters', 'Companies']);
}
$suffix = $this->getPrefixKeyword($project_id, 'suffix', 2, $title, $ban_suffix);
$prefix = $this->getPrefixKeyword($project_id, 'prefix', 1, $seo_title);
$suffix = $this->getPrefixKeyword($project_id, 'suffix', 2, $seo_title);
if(Str::startsWith($suffix, ', ')){
$seo_title = $prefix . ' ' . $seo_title . $suffix;
}else{
$seo_title = $prefix . ' ' . $seo_title . ' ' . $suffix;
}
$seo_title = $prefix . ' ' . $title . ' ' . $suffix;
}
$data[$field] = trim($seo_title);
... ... @@ -577,61 +552,118 @@ class UpdateSeoTdk extends Command
* @param $type
* @param $num
* @param string $topic
* @param array $ban 被禁用的前后缀
* @return string
*/
public function getPrefixKeyword($project_id, $type, $num, $topic='', $ban = [])
public function getPrefixKeyword($project_id, $type, $num, $topic='')
{
$str = '';
$ban = []; //被禁用的前后缀
$info = $this->getDeployOptimize($project_id);
if (!empty($info['keyword_' . $type])) {
$fix_keyword = explode(",", $info['keyword_' . $type]);
$fix_keyword = array_filter($fix_keyword);
//去掉标题存在的词
if ($topic) {
foreach ($fix_keyword as $k=>$keyword) {
// 被禁用的关键词
if (in_array($keyword, $ban)) {
unset($fix_keyword[$k]);
//没有勾选前后缀
if (empty($info['keyword_' . $type])) {
return $str;
}
//前后缀(包括自定义前后缀)如果已经存在,就不在拼接当前类型 后缀只包含了一个,要再拼一个(需去重)
$all_prefixes = $this->getAllPrefix($type == 'prefix' ? 1 : 2, $project_id);
$all_prefixes = array_map('strtolower', $all_prefixes);
//in,for,with,to,near,from 这些介词 只拼前缀,不拼后缀
$preposition = ['in', 'for', 'with', 'to', 'near','from'];
//标题拆成词
$topic_words = explode(' ', strtolower($topic));
$i= 0;
foreach ($topic_words as $topic_word){
//包含了前后缀
if(in_array($topic_word, $all_prefixes)){
//前缀包含一个就不拼了 后缀包含两个才不再拼
if($i == $num - 1){
return $str;
}
$ban[] = $topic_word;
$i++;
$num--;
}
// 前后缀如果已经存在, 就不在拼接当前类型
if (FALSE !== strpos($topic, $keyword))
//in,for,with,to,near,from 这些介词 只拼前缀,不拼后缀
if(in_array($topic_word, $preposition) && $type == 'suffix'){
return $str;
//复数转单数
$keyword = Str::singular($keyword);
}
$topic_words = explode(" ", $topic);
if($type == 'prefix' && Str::startsWith($topic_words[0], $keyword)){
unset($fix_keyword[$k]);
}
if($type == 'suffix' && Str::startsWith($topic_words[count($topic_words)-1], $keyword)){
//services/service 结尾的词,后缀不拼manufacturer,factory
if (Str::endsWith(strtolower($topic), ['services', 'service']) && $type == 'suffix') {
$ban = array_merge($ban, ['manufacturer', 'manufacturers', 'factory', 'factories']);
}
//manufacturer,factory 结尾的词,后缀不拼 services/service
if (Str::endsWith(strtolower($topic), ['manufacturer', 'manufacturers', 'factory', 'factories']) && $type == 'suffix') {
$ban = array_merge($ban, ['services', 'service']);
}
//前缀有wholesale或cheap的词,后缀不拼 manufacturer,factory,exporter,company
if (Str::startsWith(strtolower($topic), ['wholesale', 'cheap']) && $type == 'prefix') {
$ban = array_merge($ban, ['manufacturer', 'manufacturers', 'factory', 'factories', 'exporter', 'exporters', 'company', 'companies', 'supplier', 'suppliers']);
}
//关键词以manufacturer,factory,exporter,company结尾, 前缀不拼wholesale或cheap的词
if (Str::endsWith(strtolower($topic), ['manufacturer', 'manufacturers', 'factory', 'factories', 'exporter', 'exporters', 'company', 'companies', 'supplier', 'suppliers']) && $type == 'prefix') {
$ban = array_merge($ban, ['wholesale', 'cheap']);
}
//关键词是否包含 品牌词
$brand_keywords = explode("\r\n", $info['brand_keyword']);
$is_contains_brand = false;
foreach ($brand_keywords as $brand_keyword) {
if (Str::contains(strtolower($topic), strtolower(trim($brand_keyword)))) {
$is_contains_brand = true;
break;
}
}
//包含品牌词 排除自定义前后缀
if ($is_contains_brand) {
$customer_keywords = KeywordPrefix::where('project_id', $project_id)->pluck('keyword')->toArray();
$ban = array_merge($ban, $customer_keywords);
}
//勾选的前后缀
$fix_keyword = explode(",", $info['keyword_' . $type]);
$fix_keyword = array_filter($fix_keyword);
foreach ($fix_keyword as $k => $keyword) {
// 被禁用的关键词
if (in_array(strtolower(Str::plural($keyword)), $ban)) {
unset($fix_keyword[$k]);
}
if (in_array(strtolower(Str::singular($keyword)), $ban)) {
unset($fix_keyword[$k]);
}
}
//随机取 并单复数去重
shuffle($fix_keyword);
$keywords = [];
foreach ($fix_keyword as $v){
if($num == 0){
foreach ($fix_keyword as $v) {
if ($num == 0) {
break;
}
$is_repeat = false;
foreach ($keywords as $keyword){
if(Str::singular($keyword) == Str::singular($v)){
foreach ($keywords as $keyword) {
if (Str::singular($keyword) == Str::singular($v)) {
$is_repeat = true;
break;
}
}
if($is_repeat){
if ($is_repeat) {
continue;
}
$keywords[] = $v;
$num--;
}
$str = implode(', ', $keywords);
if ($type == 'suffix' && count($keywords) == 1 && in_array(Arr::last($topic_words), $all_prefixes)) {
return ', ' . $keywords[0];
}
return $str;
return implode(', ', $keywords);
}
... ... @@ -653,6 +685,24 @@ class UpdateSeoTdk extends Command
}
/**
* 所有前后缀 和 当期项目的自定义前后缀
* @param $type
* @param int $project_id
* @return mixed
* @author zbj
* @date 2025/4/15
*/
public function getAllPrefix($type, int $project_id = 0){
$cache_key = 'AllPrefix_' . $type . '_' . $project_id;
$data = Cache::get($cache_key);
if(!$data){
$data = KeywordPrefix::whereIn('project_id', [0, $project_id])->where('type', $type)->pluck('keyword')->toArray();
Cache::put($cache_key, $data, 600);
}
return $data;
}
/**
* @remark :获取公司英文名称
* @name :companyName
* @author :lyh
... ...
... ... @@ -185,6 +185,9 @@ class KeywordController extends BaseController
*/
public function batchKeywordFiled(){
$param = [];
if(isset($this->param['seo_title'])){
$param['seo_title'] = null;
}
if(isset($this->param['keyword'])){
$param['seo_keywords'] = null;
}
... ...
... ... @@ -53,9 +53,11 @@ use App\Services\DingService;
use App\Services\ProjectServer;
use App\Services\SyncService;
use App\Utils\LogUtils;
use AWS\CRT\Log;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log as LogInfo;
/**
* Class ProjectLogic
... ... @@ -159,13 +161,14 @@ class ProjectLogic extends BaseLogic
* @param :1->建站中 2->优化中 3->建站完成 6-》错误单
*/
public function projectSave(){
$this->saveSeoPlan($this->param['id'],$this->param['type'],$this->param['deploy_build']['plan'],$this->param['deploy_build']['seo_plan'],$this->param['deploy_optimize']['optimist_mid'] ?? 0,$this->param['deploy_optimize']['quality_mid'] ?? 0);
$this->checkAiBlog($this->param['main_lang_id'],$this->param['is_ai_blog'],$this->param['company'],$this->param['deploy_optimize']['company_en_name'] ?? '',$this->param['deploy_optimize']['company_en_description'] ?? '');
DB::beginTransaction();
try {
if($this->param['type'] == Project::TYPE_SEVEN){
$this->setTypeSevenEdit($this->param);
}else{
$this->param = $this->handleLevelStr($this->param);//处理星级客户暂停优化默认参数
$this->saveSeoPlan($this->param);//保存seo白帽类型,上线保存一条审核记录
$this->checkAiBlog($this->param);//开启白帽验证参数
DB::beginTransaction();
try {
//初始化项目
$this->param = $this->createProjectData($this->param);
//双向绑定服务器,需放到保存项目的上方
... ... @@ -191,16 +194,37 @@ class ProjectLogic extends BaseLogic
$this->syncImageFile($this->param['project_location'],$this->param['id']);
//同步信息表
(new SyncService())->projectAcceptAddress($this->param['id']);
}
DB::commit();
}catch (\Exception $e){
LogInfo::info('项目保存失败:project_id'.$this->param['id'].',错误详情:'.$e->getMessage(). PHP_EOL);
DB::rollBack();
$this->fail('保存失败,请联系管理员');
}
}
return $this->success();
}
/**
* @remark :星际客户为(2,3)暂停优化
* @name :handleLevelStr
* @author :lyh
* @method :post
* @time :2025/4/16 11:14
* @remark :http://zentao.globalso.com/index.php?m=task&f=view&taskID=195163
*/
public function handleLevelStr($param){
if(!empty($param['level'])){
if (in_array('2', $param['level']) || in_array('3', $param['level'])) {
//优化设置默认关闭
$param['is_ai_blog'] = 0;
$param['deploy_optimize']['is_ai_blog_send'] = 0;
$param['deploy_optimize']['is_auto_keywords'] = 0;
}
}
return $param;
}
/**
* @remark :保存上线审核问题
* @name :saveOnlineCheck
* @author :lyh
... ... @@ -235,13 +259,18 @@ class ProjectLogic extends BaseLogic
}
/**
* @remark :开启白帽验证
* @remark :开启白帽验证
* @name :checkAiBlog
* @author :lyh
* @method :post
* @time :2025/3/21 17:32
*/
public function checkAiBlog($main_lang_id,$is_ai_blog,$company,$company_en_name,$company_en_description){
public function checkAiBlog($param){
$main_lang_id = $param['main_lang_id'] ?? 0;
$is_ai_blog = $param['is_ai_blog'] ?? 0;
$company = $param['company'] ?? '';
$company_en_name = $param['deploy_optimize']['company_en_name'] ?? '';
$company_en_description = $param['deploy_optimize']['company_en_description'] ?? '';
if($is_ai_blog == 1){
if(empty($main_lang_id) || empty($company) || empty($company_en_name) || empty($company_en_description)){
$this->fail('开启ai_blog--请填写主语种+公司名称+公司英文名称+公司英文介绍');
... ... @@ -488,7 +517,13 @@ class ProjectLogic extends BaseLogic
* @method :post
* @time :2025/4/1 15:33
*/
protected function saveSeoPlan($project_id,$type,$plan,$seo_plan,$optimist_mid,$quality_mid){
protected function saveSeoPlan($param){
$project_id = $param['id'];
$type = $param['type'];
$plan = $param['deploy_build']['plan'];
$seo_plan = $param['deploy_build']['seo_plan'];
$optimist_mid = $param['deploy_optimize']['optimist_mid'] ?? 0;
$quality_mid = $param['deploy_optimize']['quality_mid'] ?? 0;
$onlineCheckModel = new OnlineCheck();
if(($plan == Project::TYPE_ZERO) && ($seo_plan == Project::TYPE_ONE) && ($type == Project::TYPE_TWO || $type == Project::TYPE_THREE)){
$onlineInfo = $onlineCheckModel->read(['project_id'=>$project_id]);
... ...
... ... @@ -62,7 +62,12 @@ class RankDataLogic extends BaseLogic
$external_links = ExternalLinks::where('project_id', $project_id)->where('api_no', $api_no)->first();
$indexed_pages = IndexedPages::where('project_id', $project_id)->where('api_no', $api_no)->first();
$speed = Speed::where('project_id', $project_id)->first();
//暂停优化的项目(排名数据显示横杠 - ,关键词排名第一页 、 关键词排名前十页 、 Google收录页面数 、 可查询外链数)
if(!empty($project['level'])){
if (in_array('2', $project['level']) || in_array('3', $project['level'])) {
$rank['first_page_num'] = $rank['first_ten_pages_num'] = $rank['indexed_pages_num'] = $external_links['total'] = '-';
}
}
//排名数据
$data = [
'first_num' => $rank['first_num'] ?? 0,
... ...
... ... @@ -195,6 +195,7 @@ class TranslateLogic extends BaseLogic
$texts = $dom->find("text");
$description = $dom->find("meta[name=description]",0);
$keywords = $dom->find("meta[name=keywords]",0);
$placeholders = $dom->find("[placeholder]");
// 组装需要翻译的内容 HTML内文案、meta description、meta keywords
$need_tran = [];
foreach ($texts as $k=>$text) {
... ... @@ -217,6 +218,12 @@ class TranslateLogic extends BaseLogic
$need_tran[] = htmlspecialchars_decode(html_entity_decode($string));
}
}
foreach ($placeholders as $placeholder) {
$placeholderText = trim($placeholder->placeholder);
if ($placeholderText) {
$need_tran[] = $placeholderText;
}
}
$need_tran[] = $description ? $description->attr['content'] : '';
$need_tran[] = $keywords ? $keywords->attr['content'] : '';
$need_tran = array_values(array_unique($need_tran));
... ... @@ -283,9 +290,9 @@ class TranslateLogic extends BaseLogic
}
DB::beginTransaction();
try {
$info = $this->model->read(['language_id'=>$this->param['language_id'],'url'=>$this->param['url'],'project_id'=>$this->user['project_id'],'type'=>$this->param['type']]);
if($info === false){
$sourceInfo = $this->getRouteSource($sendData['new_route']);
$info = $this->model->read(['language_id'=>$this->param['language_id'],'source_id'=>$sourceInfo['source_id'],'url'=>$this->param['url'],'project_id'=>$this->user['project_id'],'type'=>$this->param['type']]);
if($info === false){
$param = [
'type'=>$this->param['type'] ?? 1,
'project_id'=>$this->user['project_id'],
... ...