作者 刘锟

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

... ... @@ -482,6 +482,19 @@ class RelayInquiry extends Command
$this->output('转发内容');
$form_message = $message;
$message_id = 0;
// TODO 当原始询盘内容长度大于15个字符, 直接发送原始内容。
if (strlen($message) >= 15) {
//原内容非英语,转为对应语种
if (is_numeric($form_message)) { //数字会被识别为中文
$lang = 'en';
} else {
$translateSl = Translate::translateSl($form_message);
$lang = $translateSl['texts']['sl'] ?? 'en';
}
return [$message, $message_id, $lang??''];
}
//开启文案替换
if ($task['is_replace_text'] == 2) {
//AI生成
... ...
... ... @@ -82,9 +82,9 @@ class DownloadProject extends Command
if($v['type'] == 1){
$status = '建站中';
}elseif ($v['type'] == 2){
$status = '建站后';
}elseif ($v['type'] == 3){
$status = '优化中';
}elseif ($v['type'] == 3){
$status = '建站后';
}else{
$status = '';
}
... ...
... ... @@ -252,7 +252,7 @@ class UpdateSeoTdk extends Command
if($table == 'gl_product'){
foreach ($map as $field){
$field_arr = explode('.', $field);
$query->orWhereRaw('JSON_CONTAINS('.$field_arr[0].', "null", "$.'.$field_arr[1].'") OR JSON_EXTRACT('.$field_arr[0].', "$.'.$field_arr[1].'") = ""');
$query->whereNull('seo_mate')->orWhereRaw('JSON_CONTAINS('.$field_arr[0].', "null", "$.'.$field_arr[1].'") OR JSON_EXTRACT('.$field_arr[0].', "$.'.$field_arr[1].'") = ""');
}
}else{
foreach ($map as $field){
... ...
... ... @@ -213,7 +213,16 @@ class Common
}
$keyword = str_replace($str,'',$keyword);
$keyword = trim($keyword,'.');
if(strpos(strtolower($keyword),'hope') === false && strpos(strtolower($keyword),'remember') === false && strpos(strtolower($keyword),'help') === false && strpos(strtolower($keyword),'website') === false && strpos(strtolower($keyword),'search keywords') === false && strpos(strtolower($keyword),'here are 8') === false && strpos(strtolower($keyword),'search keywords') === false && strpos(strtolower($keyword),'thank you') === false && strpos(strtolower($keyword),'thanks') === false && strpos(strtolower($keyword),'copywriter') === false ){
if(strpos(strtolower($keyword),'hope') === false
&& (strpos(strtolower($keyword),'remember') === false || strpos(strtolower($keyword),'rememberance') !== false)
&& strpos(strtolower($keyword),'help') === false
&& strpos(strtolower($keyword),'website') === false
&& strpos(strtolower($keyword),'search keywords') === false
&& strpos(strtolower($keyword),'here are 8') === false
&& strpos(strtolower($keyword),'search keywords') === false
&& strpos(strtolower($keyword),'thank you') === false
&& (strpos(strtolower($keyword),'thanks') === false || strpos(strtolower($keyword),'thanksgiving') !== false)
&& strpos(strtolower($keyword),'copywriter') === false ){
$ar_keywords[] = $keyword;
}
}
... ... @@ -224,6 +233,7 @@ class Common
//过滤特殊字符
public static function deal_str($str){
$str = str_replace([',,'],',',$str);
return str_replace(['{','}','”','“','"'],'',$str);
}
... ...
... ... @@ -2,6 +2,8 @@
use App\Models\File\Image;
use App\Models\File\File as FileModel;
use App\Models\Project\DeployOptimize;
use App\Models\Project\ProjectKeyword;
use App\Models\RouteMap\RouteMap;
use App\Services\CosService;
use App\Utils\EncryptUtils;
... ... @@ -9,6 +11,7 @@ use App\Utils\LogUtils;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Redis;
define('HTTP_OPENAI_URL', 'http://openai.waimaoq.com/');
... ... @@ -1081,5 +1084,50 @@ function getRandByRatio($proArr){
}
/**
* @remark :随机获取前后缀
* @name :getPrefixKeyword
* @author :lyh
* @method :post
* @time :2025/2/11 14:41
*/
function getPrefixKeyword($project_id, $type, $num)
{
$str = '';
$info = getDeployOptimize($project_id);
if (!empty($info['keyword_' . $type])) {
$fix_keyword = explode(",", $info['keyword_' . $type]);
//随机取
shuffle($fix_keyword);
if (count($fix_keyword) < $num)
return $str;
$keyword = array_slice($fix_keyword, 0, $num);
$str = implode(", ", $keyword);
}
return $str;
}
/**
* @remark :获取客户选择的关键词
* @name :getDeployOptimize
* @author :lyh
* @method :post
* @time :2025/2/11 14:58
*/
function getDeployOptimize($project_id){
$cache_key = 'project_deploy_optimize_info_' . $project_id;
$info = Cache::get($cache_key);
if(!$info){
$projectOptimizeModel = new DeployOptimize();
$info = $projectOptimizeModel->read(['project_id' => $project_id], ['id', 'company_en_name', 'company_en_description', 'keyword_prefix', 'keyword_suffix']);
$projectKeywordModel = new ProjectKeyword();
$keywordInfo = $projectKeywordModel->read(['project_id'=>$project_id]);
$info['main_keyword'] = '';
if(!empty($keywordInfo['main_keyword'])){
$info['main_keyword'] = $keywordInfo['main_keyword'];
}
Cache::put($cache_key, $info, 600);
}
return $info;
}
... ...
... ... @@ -12,6 +12,8 @@ use App\Models\Ai\AiCommand;
use App\Models\Ai\AiLog;
use App\Models\Project\DeployOptimize;
use App\Models\Project\Project;
use App\Models\Project\ProjectKeyword;
use Illuminate\Support\Facades\Cache;
class AiCommandController extends BaseController
{
... ... @@ -27,12 +29,21 @@ class AiCommandController extends BaseController
'keywords.required' => '关键字不能为空',
'key.required' => '场景不能为空',
]);
if($this->param['key'] == 'keyword_seo_title'){
$prefix = getPrefixKeyword($this->user['project_id'], 'prefix', 1);
$suffix = getPrefixKeyword($this->user['project_id'], 'suffix', 2);
$text = $prefix . ' ' . $this->param['keywords']. ' ' . $suffix;
$data = [
'code' => 200,
'text' => $text
];
}else{
$text = AiCommandLogic::instance()->ai_send();
$data = [
'code' => $text ? 200 : 500,
'text' => $text
];
}
$param = [
'key' => $this->param['key'],
'keywords' => $this->param['keywords'],
... ...
... ... @@ -7,6 +7,8 @@ use App\Exceptions\BsideGlobalException;
use App\Helper\Common;
use App\Http\Controllers\Controller;
use App\Http\Requests\Scene;
use App\Models\Project\DeployOptimize;
use App\Models\Project\ProjectKeyword;
use App\Models\Template\BTemplate;
use App\Models\Template\Setting;
use Illuminate\Http\JsonResponse;
... ...
... ... @@ -29,31 +29,18 @@ class KeywordPrefixLogic extends BaseLogic
* @time :2023/9/6 14:42
*/
public function prefixSave(){
if(isset($this->param['id']) && !empty($this->param['id'])){
$condition = [
'keyword'=>$this->param['keyword'],
'id'=>['!=',$this->param['id']]
];
$prefixInfo = $this->model->read($condition);
if($prefixInfo !== false){
$this->fail('当前关键字已存在');
}
$data = [
'keyword'=>$this->param['keyword']
];
$this->model->edit($data,['id'=>$this->param['id']]);
}else{
$keyword_arr = explode(',',$this->param['keyword']);
foreach ($keyword_arr as $v){
$data = [
'project_id'=>$this->param['project_id'] ?? 0,
'keyword'=>$this->param['keyword'],
'keyword'=>$v,
'type'=>$this->param['type']
];
$prefixInfo = $this->model->read($data);
if($prefixInfo !== false){
$this->fail('当前关键字已存在');
}
if($prefixInfo == false){
$this->model->add($data);
}
}
return $this->success();
}
... ...
... ... @@ -31,7 +31,6 @@ class AiCommandLogic extends BaseLogic
$this->fail('指令不存在');
}
$prompt = $ai_command->ai;
if(strpos($prompt, '{keyword}') !== false) {
$prompt = str_replace('{keyword}', $this->param['keywords'], $prompt);
}
... ... @@ -56,6 +55,24 @@ class AiCommandLogic extends BaseLogic
$prompt = '';
}
}
// 前缀关键词
if(preg_match_all("/\{qz_(\d+)\}/", $prompt, $matches)) {
foreach ($matches[0] as $key=>$val) {
$keyword = getPrefixKeyword($this->user['project_id'], 'prefix', $matches[1][$key]);
if($keyword){
$prompt = str_replace($val, $keyword, $prompt);
}
}
}
// 后缀关键词
if(preg_match_all("/\{hz_(\d+)\}/", $prompt, $matches)) {
foreach ($matches[0] as $key=>$val) {
$keyword = getPrefixKeyword($this->user['project_id'], 'suffix', $matches[1][$key]);
if($keyword){
$prompt = str_replace($val, $keyword, $prompt);
}
}
}
if(strpos($prompt, '{company detail}') !== false) {
$company_introduction = $this->getDeployOptimize('company_en_description');
$prompt = str_replace('{company detail}', $company_introduction, $prompt);
... ... @@ -68,7 +85,6 @@ class AiCommandLogic extends BaseLogic
$prompt .= '.Please answer in ' . $lang;
$ai_send = true;
}
return [
'prompt' => $prompt,
'scene' => $ai_command->scene,
... ...
... ... @@ -130,6 +130,9 @@ class KeywordLogic extends BaseLogic
if(!isset($param['is_video_keyword']) || $param['is_video_keyword'] == null){
$param['is_video_keyword'] = 0;
}
if(!empty($param['seo_title'])){
$param['seo_title'] = ucfirst($param['seo_title']);
}
$param['first_word'] = $this->first_word($param['title']);
return $param;
}
... ...
... ... @@ -67,14 +67,14 @@ class TranslateLogic extends BaseLogic
$data_read = json_decode($info && $info['translate_data'] ? $info['translate_data']['data'] : '',JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
if(!empty($data_read)){
foreach ($data_read as $k => $v){
$k = urldecode($k);
$k = rawurldecode($k);
$old_key[] = $k;
$data[] = [$k => $v];
}
}
$arr2 = [];
foreach ($text_array as $val) {
$val = urldecode($val);
$val = rawurldecode($val);
$val = str_replace(' ','',$val);//处理特殊字符
$val = trim(str_replace(' ','',$val));
if($val == ' ' || $val == ''){
... ...