作者 刘锟

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

... ... @@ -64,6 +64,7 @@ class AiBlogAuthorTask extends Command
$aiBlogService->key = $aiSettingInfo['key'];
$result = $aiBlogService->getAuthor();
if(!isset($result['status'])){
echo '错误:'.json_encode($result,true);
continue;
}
if($result['status'] != 200){
... ... @@ -71,17 +72,17 @@ class AiBlogAuthorTask extends Command
continue;
}
if(empty($result['data'])){
sleep(20);
echo '没有作者任务-'.PHP_EOL;
continue;
}
//保存当前项目ai_blog数据
ProjectServer::useProject($info['project_id']);
$this->saveAiBlogAuthor($result['data'] ?? [],$info['project_id']);
RouteMap::setRoute('top-blog',RouteMap::SOURCE_AI_BLOG_LIST,0,$info['project_id']);//写一条列表页路由
DB::disconnect('custom_mysql');
//修改任务状态
RouteMap::setRoute('top-blog',RouteMap::SOURCE_AI_BLOG_LIST,0,$info['project_id']);//写一条列表页路由
$aiBlogTaskModel->edit(['status'=>2],['id'=>$info['id']]);
echo '结束->任务id:' . $info['task_id'] . PHP_EOL . date('Y-m-d H:i:s');
echo '结束->任务id:' . $info['id'] . PHP_EOL . date('Y-m-d H:i:s');
}
return true;
}
... ... @@ -117,18 +118,28 @@ class AiBlogAuthorTask extends Command
return true;
}
$aiBlogAuthorModel = new AiBlogAuthor();
$info = $aiBlogAuthorModel->counts(['project_id'=>$project_id]);
if($info === false){
foreach ($data as $v){
$param = [
'author_id'=>$v['id'],
'title'=>$v['title'],
'image'=>str_replace_url($v['picture']),
'description'=>$v['description'],
];
$id = $aiBlogAuthorModel->addReturnId($param);
$route = RouteMap::setRoute($v['route'] ?? $v['title'], RouteMap::SOURCE_AI_BLOG_AUTHOR, $id, $project_id);
$aiBlogAuthorModel->edit(['route'=>$route],['id'=>$id]);
foreach ($data as $v){
//查询当前数据是否存在
$info = $aiBlogAuthorModel->read(['author_id'=>$v['id']]);
$param = [
'author_id'=>$v['id'],
'title'=>$v['title'],
'image'=>str_replace_url($v['picture']),
'description'=>$v['description'],
];
try {
if($info === false){
echo '执行新增'.PHP_EOL;
$id = $aiBlogAuthorModel->addReturnId($param);
$route = RouteMap::setRoute($v['route'] ?? $v['title'], RouteMap::SOURCE_AI_BLOG_AUTHOR, $id, $project_id);
$aiBlogAuthorModel->edit(['route'=>$route],['id'=>$id]);
}else{
$aiBlogAuthorModel->edit($param,['id'=>$info['id']]);
echo '执行更新'.PHP_EOL;
}
}catch (\Exception $e){
echo 'error:'.$e->getMessage();
continue;
}
}
return true;
... ...
... ... @@ -42,11 +42,12 @@ class AiBlogTask extends Command
public function handle(){
$aiBlogTaskModel = new AiBlogTaskModel();
while (true){
$list = $aiBlogTaskModel->list(['status'=>1,'type'=>2, 'created_at' => ['<', date('Y-m-d H:i:s')]],'id',['*'],'asc',1000);
$list = $aiBlogTaskModel->formatQuery(['status'=>1,'type'=>2])->inRandomOrder()->limit(1000)->get();
if(empty($list)){
sleep(300);
continue;
}
$list = $list->toArray();
$updateProject = [];
foreach ($list as $item){
echo '开始->任务id:' . $item['task_id'] . PHP_EOL . date('Y-m-d H:i:s');
... ... @@ -57,8 +58,12 @@ class AiBlogTask extends Command
$aiBlogService->key = $aiSettingInfo['key'];
$aiBlogService->task_id = $item['task_id'];
$result = $aiBlogService->getDetail();
if(!isset($result['status']) || $result['status'] != 200){
sleep(5);
if(!isset($result['status'])){
echo json_encode($result,true).PHP_EOL;
continue;
}
if($result['status'] != 200){
echo '错误状态码:'.$result['status'].PHP_EOL;
continue;
}
//保存当前项目ai_blog数据
... ... @@ -66,6 +71,7 @@ class AiBlogTask extends Command
$aiBlogModel = new AiBlog();
$aiBlogInfo = $aiBlogModel->read(['task_id'=>$item['task_id']],['id']);
if($aiBlogInfo === false){
echo '任务id不存在:'.$item['task_id'].PHP_EOL;
$aiBlogTaskModel->edit(['status'=>2],['id'=>$item['id']]);
continue;
}
... ... @@ -80,10 +86,10 @@ class AiBlogTask extends Command
$aiBlogModel->edit(['new_title'=>$result['data']['title'], 'image'=>$result['data']['thumb'], 'text'=>$result['data']['section'], 'author_id'=>$result['data']['author_id'],'seo_title'=>$result['data']['title'],'seo_keyword'=>$result['data']['keyword'],'seo_description'=>$result['data']['description'], 'route'=>$route ,'status'=>2], ['task_id'=>$item['task_id']]);
DB::disconnect('custom_mysql');
$aiBlogTaskModel->edit(['status'=>2],['id'=>$item['id']]);
echo '结束->任务id:' . $item['task_id'] . PHP_EOL . date('Y-m-d H:i:s');
}
//TODO::更新列表页及作者
$this->updateProject($updateProject);
echo '结束->任务id:' . $item['task_id'] . PHP_EOL . date('Y-m-d H:i:s');
}
return true;
}
... ... @@ -207,7 +213,8 @@ class AiBlogTask extends Command
$domain = $domainModel->getProjectIdDomain($project_id);
if(!empty($domain)){
$url = $domain.'api/update_page/?project_id='.$project_id.'&route=7';
shell_exec('curl -k "'.$url.'"');
$res = http_get($url);
echo '返回数据:'.json_encode($res,true).PHP_EOL;
}else{
echo '域名不存在:' . $project_id . PHP_EOL . date('Y-m-d H:i:s');
}
... ...
... ... @@ -530,15 +530,17 @@ class UpdateRoute extends Command
$seoModel = new WebSettingSeo();
$seo_info = $seoModel->read(['project_id'=>$project_id]);
if($seo_info !== false){
$prefix = $seo_info['product_category_prefix'] ?? [];
$suffix = $seo_info['product_category_suffix'] ?? [];
$prefix = [];
$suffix = [];
if(!empty($seo_info['product_cate_prefix'])){
$prefix[] = ['name'=>$seo_info['product_cate_prefix']];
$prefix[] = ['val'=>[$seo_info['product_cate_prefix']],'level'=>1];
}
if(!empty($seo_info['product_cate_suffix'])){
$suffix[] = ['name'=>$seo_info['product_cate_suffix']];
$suffix[] = ['val'=>[$seo_info['product_cate_suffix']],'level'=>1];
}
if(!empty($prefix) && !empty($suffix)){
$seoModel->edit(['product_category_prefix'=>json_encode($prefix,true),'product_category_suffix'=>json_encode($suffix,true)],['project_id'=>$project_id]);
}
$seoModel->edit(['product_category_prefix'=>json_encode($prefix,true),'product_category_suffix'=>json_encode($suffix,true)],['project_id'=>$project_id]);
}
return true;
}
... ...
... ... @@ -55,18 +55,11 @@ class CopyProject extends Command
$this->output('CopyProjectJob start, project_id: ' . $old_project_id);
$data = $this->copyProject($old_project_id);
$project_id = $data['project_id'];
$type = $data['type'];
$this->copyDeployBuild($old_project_id,$project_id);
$this->copyDeployOptimize($old_project_id,$project_id);
$this->copyPayment($old_project_id,$project_id);
$this->copyAfter($old_project_id,$project_id);
$this->copyUser($old_project_id,$project_id);
if($type != 0){
$this->copyMysql($old_project_id,$project_id);
}
//修改项目状态
$projectModel->edit(['delete_status'=>0],['id'=>$project_id]);
$this->output('CopyProjectJob end, old project_id: ' . $old_project_id . ', new project_id: ' . $project_id);
$item->status = NoticeLog::STATUS_SUCCESS;
$item->save();
}catch (\Exception $e){
... ... @@ -75,6 +68,14 @@ class CopyProject extends Command
$item->status = NoticeLog::STATUS_FAIL;
$item->save();
}
try {
$this->copyMysql($old_project_id,$project_id);
}catch (\Exception $e){
echo '复制数据库失败:'.$old_project_id . '<->'.$project_id;
}
//修改项目状态
$projectModel->edit(['delete_status'=>0],['id'=>$project_id]);
$this->output('CopyProjectJob end, old project_id: ' . $old_project_id . ', new project_id: ' . $project_id);
}
}
return true;
... ...
... ... @@ -9,6 +9,7 @@ namespace App\Http\Controllers\Api;
use App\Enums\Common\Code;
use App\Http\Logic\Bside\User\UserLoginLogic;
use App\Models\Ai\AiBlog;
use App\Models\Blog\Blog;
use App\Models\Domain\DomainInfo;
use App\Models\News\News;
... ... @@ -313,16 +314,17 @@ class PrivateController extends BaseController
ProjectServer::useProject($project->id);
$result = [];
// 查询有效时间后 有效的产品、新闻、博客、聚合页 链接
$product = Product::where(['status' => Product::STATUS_ON])->where('created_at', '>=', $date)->pluck('route');
// $product = Product::where(['status' => Product::STATUS_ON])->where('created_at', '>=', $date)->pluck('route');
$news = News::where(['status' => News::STATUS_ONE])->where('release_at', '>', $date)->pluck('url');
$blog = Blog::where(['status' => Blog::STATUS_ONE])->where('release_at', '>', $date)->pluck('url');
// $keyword = Keyword::where('created_at', '>', $date)->pluck('route');
$ai_blog = AiBlog::where(['status' => AiBlog::STATUS_FINISH])->where('updated_at', '>=', $date)->pluck('route');
// 组装链接
foreach ($product as $item) {
$url = 'https://' . $domain . '/' . $item;
array_push($result, $url);
}
// foreach ($product as $item) {
// $url = 'https://' . $domain . '/' . $item;
// array_push($result, $url);
// }
// foreach ($keyword as $item) {
// $url = 'https://' . $domain . '/' . $item;
// array_push($result, $url);
... ... @@ -335,6 +337,10 @@ class PrivateController extends BaseController
$url = 'https://' . $domain . '/blogs/' . $item;
array_push($result, $url);
}
foreach ($ai_blog as $item) {
$url = 'https://' . $domain . '/blog/' . $item;
array_push($result, $url);
}
return $this->success($result);
}
... ...
... ... @@ -250,7 +250,7 @@ class ProjectLogic extends BaseLogic
public function createAuthor($project_id,$mch_id,$key){
//查看当前项目是否已经创建了作者
$aiBlogTaskModel = new AiBlogTask();
$count = $aiBlogTaskModel->counts(['project_id'=>$project_id]);
$count = $aiBlogTaskModel->counts(['project_id'=>$project_id,'type' => 1]);
if($count > 0){
return true;
}
... ... @@ -259,6 +259,7 @@ class ProjectLogic extends BaseLogic
$aiBlogService->key = $key;
$result = $aiBlogService->createAuthor();
if($result['status'] == 200){
//查看当前是否已有未执行的
$aiBlogTaskModel->add(['project_id'=>$project_id,'status'=>1,'type'=>1]);
}
return true;
... ...
... ... @@ -489,7 +489,7 @@ class RankDataLogic extends BaseLogic
$without_project_ids = []; //不用处理排名的项目
$without_extension_project_ids = [658]; //是否达标只统计主词的
$extension_project_ids = [354]; //扩展词也到达标的
$compliance_project_ids = [2163,257]; //直接达标处理的
$compliance_project_ids = [2163,257,823]; //直接达标处理的
$ceaseProjectId = [47, 354, 378, 649, 1226, 1283, 1703, 1893, 2066,];//暂停项目id
//一个项目多个api_no
$multiple_api_no_project_ids = [
... ...
... ... @@ -63,7 +63,10 @@ class UserLoginLogic
$projectArr[] = $v['project_id'];
}
$projectModel = new Project();
$project_list = $projectModel->list(['id'=>['in',$projectArr],'delete_status'=>0],'id',['id','title']);
$project_list = $projectModel->list(['id'=>['in',$projectArr],'type'=>['!=',8],'delete_status'=>0],'id',['id','title']);
if(empty($project_list)){
$this->fail('当前项目已关闭,请联系管理员');
}
foreach ($project_list as $k => $v){
$v['domain'] = (new DomainInfo())->getProjectIdDomain($v['id']);
$project_list[$k] = $v;
... ... @@ -181,12 +184,15 @@ class UserLoginLogic
* @time :2023/8/29 15:26
*/
public function assembleParam($mobile,$project_id){
$info = $this->model->read(['mobile'=>$mobile,'project_id'=>$project_id],['id','mobile','status','role_id','token','name','wechat','project_id']);
$info = $this->model->read(['mobile'=>$mobile,'project_id'=>$project_id],['id','mobile','status','type','role_id','token','name','wechat','project_id']);
//获取项目详情
$project = $this->getProjectInfo($project_id);
if($project['site_status'] != 0){//关闭站点
$this->fail('当前网站已过期,请联系管理员及时续费。');
}
if($project['type'] == 8){//关闭项目
$this->fail('当前网站已关闭,请联系管理员。');
}
$info = $this->handleInfo($info,$project);
$info['login_source'] = User::LOGIN_PASSWORD_SOURCE;//账号密码登录返回
//保存项目缓存
... ...
... ... @@ -10,4 +10,7 @@ class AiBlog extends Base
//连接数据库
protected $connection = 'custom_mysql';
const STATUS_INIT = 0;
const STATUS_RUNNING = 1;
const STATUS_FINISH = 2;
}
... ...
... ... @@ -70,6 +70,28 @@ class Base extends Model
}
/**
* @remark :随机获取数据
* @name :limit_list
* @author :lyh
* @method :post
* @time :2025/3/17 17:26
*/
public function limit_list($map = [],$order = 'id',$fields = ['*'],$sort = 'desc',$row = 0): array
{
$query = $this->formatQuery($map);
if($row != 0){
$query = $query->limit($row);
}
$query = $this->sortOrder($query,$order,$sort);
$lists = $query->select($fields)->get();
if (empty($lists)) {
return [];
}
$lists = $lists->toArray();
return $lists;
}
/**
* @remark :获取数据详情
* @name :read
* @author :lyh
... ...
... ... @@ -91,7 +91,8 @@ class Project extends Base
4 => '推广续网站',
5 => '未续费项目',
6 => '特殊推广项目',
7 => '提单错误转续费'
7 => '提单错误转续费',
8 => '关闭项目',
];
}
... ...