作者 zhl

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

... ... @@ -99,6 +99,9 @@ class RemainDay extends Command
}
//白帽版本的系统
if($deploy_build['seo_plan'] == 1){
if($deploy_build['seo_service_duration'] == 0){
continue;
}
if($item['uptime']){
$diff = time() - strtotime($item['uptime']);
$seo_remain_day = $deploy_build['seo_service_duration'] - floor($diff / (60 * 60 * 24));
... ... @@ -115,6 +118,10 @@ class RemainDay extends Command
//同时包括白帽版本+默认版本的项目
$this->project->edit(['seo_remain_day'=>$seo_remain_day],['id'=>$item['id']]);
}
if($deploy_build['service_duration'] == 0){
//服务时长为0自动跳过
continue;
}
//默认版本计算剩余服务时常
if($item['type'] == Project::TYPE_TWO || $item['type'] == Project::TYPE_FOUR){
if(in_array($item['id'],$this->projectId)){//已开始优化的时间结算
... ...
... ... @@ -9,8 +9,10 @@
namespace App\Console\Commands\LyhTest;
use App\Console\Commands\Domain\DomainInfo;
use App\Models\Com\NoticeLog;
use App\Models\Project\AiBlogTask;
use App\Models\Project\DeployBuild;
use App\Models\Project\Project;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Artisan;
... ... @@ -33,9 +35,14 @@ class lyhDemo extends Command
protected $description = '更新路由';
public function handle(){
$projectModel = new Project();
$noticeModel = new NoticeLog();
$lists = $projectModel->list(['from_order_id'=>null]);
$projectBuildModel = new DeployBuild();
$projectList = $projectBuildModel->list(['plan'=>0,'seo_plan'=>1],'project_id');
foreach ($projectList as $val){
if(!empty($val['service_duration']) && empty($val['seo_service_duration'])){
$projectBuildModel->edit(['seo_service_duration'=>$val['service_duration']],['id'=>$val['id']]);
echo '项目id:'.$val['project_id'].PHP_EOL;
}
}
return true;
}
}
... ...
... ... @@ -2,12 +2,11 @@
namespace App\Console\Commands\RankData;
use App\Helper\QuanqiusouApi;
use App\Http\Logic\Bside\RankData\RankDataLogic;
use App\Models\RankData\RankDataLog as RankDataLogModel;
use App\Models\Project\DeployOptimize;
use App\Models\Domain\DomainInfo;
use App\Models\Project\Project;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
/**
... ... @@ -49,8 +48,7 @@ class RankData extends BaseCommands
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')
$list = Project::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)
... ... @@ -79,6 +77,22 @@ class RankData extends BaseCommands
RankDataLogModel::addTask($item['project_id'], $item['api_no'], $lang);
}
}
//白帽SEO版
$list = Project::leftJoin('gl_project_deploy_build', 'gl_project.id', '=', 'gl_project_deploy_build.project_id')
->where('gl_project.delete_status',0)
->where('gl_project_deploy_build.seo_plan', 1)
->whereIn('gl_project.type',[2,3,4])
->orderBy('gl_project.id', 'asc')
->pluck('gl_project.id')->toArray();
foreach ($list as $project_id){
$domain = DomainInfo::getCacheInfoByProjectId($project_id);
$id = RankDataLogic::instance()->getBmSeoProjects($domain['domain']);
if(!$id){
continue;
}
RankDataLogModel::addTask($project_id, $id . '_bmseo');
}
} catch (\Exception|\Throwable $e) {
Log::channel('rank_data')->error('排名数据任务失败 ' . $e->getMessage());
}
... ...
... ... @@ -13,6 +13,7 @@ use App\Models\Project\Project;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;
use Illuminate\Support\Str;
/**
* Class GoogleRank
... ... @@ -76,8 +77,13 @@ class RankDataLog extends BaseCommands
$log->data = Arr::s2a($res);
//保存数据
$this->output('保存排名数据:ID'.$log->project_id . ',APINO' . $log->api_no);
$is_compliance = (new RankDataLogic())->save_rank($log->project_id, $log->api_no, $res, null, $log->lang);
$log->is_compliance = $is_compliance;
if(Str::endsWith($log->api_no, '_bmseo')){
//白帽版
(new RankDataLogic())->save_rank_bmseo($log->project_id, $log->api_no, $res);
}else{
$is_compliance = (new RankDataLogic())->save_rank($log->project_id, $log->api_no, $res, null, $log->lang);
$log->is_compliance = $is_compliance;
}
$log->status = 1;
$log->save();
... ...
... ... @@ -74,7 +74,7 @@ class RecommendedSuppliers extends Command
DB::disconnect('custom_mysql');
}
}catch (\Exception $e){
echo date('Y-m-d hH:i:s').'当前项目执行错误:'.$e->getMessage().PHP_EOL;
echo date('Y-m-d H:i:s').'当前项目执行错误:'.$e->getMessage().PHP_EOL;
continue;
}
}
... ... @@ -166,7 +166,7 @@ class RecommendedSuppliers extends Command
$saveData = [
'project_id'=>$project_id,
'keyword'=>$keyword,
'data'=>json_encode($res['data'] ?? '')
'data'=>json_encode($res['data'] ?? [])
];
$purchaserModel = new Purchaser();
$purchaserModel->add($saveData);
... ... @@ -214,8 +214,6 @@ class RecommendedSuppliers extends Command
$v['mobile'] = json_encode($v['mobile']??[],JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
$v['social_media'] = json_encode($v['social_media']??[],JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
$v['image'] = str_replace('admin.hagro.cn','fob.ai.cc',$v['image']??'');
// $v['created_at'] = date('Y-m-d H:i:s');
// $v['updated_at'] = $v['created_at'];
$param = $v;
$info = $purchaserInfoModel->read(['keyword'=>$keyword,'buyer_id'=>$v['buyer_id']??0,'project_id'=>$project_id],['id']);
if($info === false){
... ...
... ... @@ -6,6 +6,7 @@ namespace App\Helper;
use App\Models\Project\Project;
use App\Utils\HttpUtils;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Support\Facades\Log;
/**
... ... @@ -154,7 +155,7 @@ class FormGlobalsoApi
$res = HttpUtils::post($api_url, $data);
$res = Arr::s2a($res);
} catch (\Exception | GuzzleException $e) {
errorLog('提交询盘信息失败', $data, $e);
Log::channel('inquiry')->info('询盘发送邮件失败' . $e->getMessage(), $data);
return false;
}
return $res;
... ...
... ... @@ -834,6 +834,16 @@ function ends_with($string, $suffix)
return substr($string, -strlen($suffix)) === $suffix;
}
function getCustomRouteMap($module_route,$route = '')
{
if($module_route == $route){
$resultRoute = $route;
}else{
$resultRoute = $module_route.'_catalog/'.$route;
}
return $resultRoute;
}
/**
* @remark :获取二级路由
* @name :getRouteMap
... ... @@ -841,11 +851,24 @@ function ends_with($string, $suffix)
* @method :post
* @time :2023/11/10 14:29
*/
function getRouteMap($source,$source_id){
function getRouteMap($source,$source_id,$is_upgrade = 0){
$route = '';
$routeMapModel = new RouteMap();
$info = $routeMapModel->read(['source'=>$source,'source_id'=>$source_id]);
if($info !== false){
if($is_upgrade == 1){
if($source == $routeMapModel::SOURCE_NEWS_CATE){
if($info['route'] != 'news'){
return $routeMapModel::PATH_NEWS_CATE.'/'.$info['route'];
}
}elseif ($source == $routeMapModel::SOURCE_BLOG_CATE){
if($info['route'] != 'blog'){
return $routeMapModel::PATH_BLOG_CATE.'/'.$info['route'];
}
}
$route = $info['route'];
return $route;
}
if(!empty($info['path'])){
if($info['path'] == 'blog'){
$info['path'] = $info['path'].'s';
... ...
... ... @@ -147,8 +147,8 @@ class OptimizeController extends BaseController
$data = APublicModel::getNumByProjectId($item['id']);
}
$manageModel = new ManageHr();
$plan = Project::planMap();
$seo_plan = Project::seoMap();
// $plan = Project::planMap();
// $seo_plan = Project::seoMap();
$item['channel'] = Channel::getChannelText($item['channel']['user_id'] ?? 0);
$item['build_leader'] = $manageModel->getName($item['leader_mid']);
$item['build_manager'] = $manageModel->getName($item['manager_mid']);
... ... @@ -159,8 +159,6 @@ class OptimizeController extends BaseController
$item['optimize_assist'] = $manageModel->getName($item['optimize_assist_mid']);
$item['optimize_tech'] = $manageModel->getName($item['optimize_tech_mid']);
$item['quality_mid_name'] = $manageModel->getName($item['quality_mid']);
$item['plan'] = $plan[$item['plan']] ?? 0;
$item['seo_plan'] = $seo_plan[$item['plan']] ?? 0;
$item['created_at'] = date('Y年m月d日', strtotime($item['cooperate_date']));
$item['autologin_code'] = getAutoLoginCode($item['id']);
$item['domain'] = 'https://'.$item['domain'].'/';
... ... @@ -194,6 +192,7 @@ class OptimizeController extends BaseController
'gl_project.finish_remain_day AS finish_remain_day',
'gl_project.is_remain_today AS is_remain_today',
'gl_project.remain_day AS remain_day',
'gl_project.seo_remain_day AS seo_remain_day',
'gl_project.robots AS robots',
'gl_project.is_minor_languages AS is_minor_languages',
'gl_project.is_translate AS is_translate',
... ...
... ... @@ -29,7 +29,7 @@ class BlogCategoryController extends BaseController
$template_id = $this->getTemplateId(BTemplate::SOURCE_BLOG,BTemplate::IS_LIST);
foreach ($lists as $k => $v){
$v['num'] = $blogModel->formatQuery(['category_id'=>['like','%,' . $v['id'] . ',%']])->count();
$v['url'] = $this->user['domain'] . getRouteMap(RouteMap::SOURCE_BLOG_CATE,$v['id']);
$v['url'] = $this->user['domain'] . getRouteMap(RouteMap::SOURCE_BLOG_CATE,$v['id'],$this->user['is_upgrade']);
$v['is_renovation'] = $this->getIsRenovation(BTemplate::SOURCE_BLOG,BTemplate::IS_LIST,$template_id,$v['id']);
$lists[$k] = $v;
}
... ...
... ... @@ -42,12 +42,7 @@ class CustomModuleCategoryController extends BaseController
$template_id = $this->getModuleTemplateId($this->param['module_id']);
foreach ($list as $k => $v){
$v['is_renovation'] = $this->getIsRenovation($v['module_id'],BTemplate::IS_LIST,$template_id,$v['id'],BTemplate::IS_CUSTOM);
$v['url'] = $this->user['domain'].$v['route'];
if($this->user['is_upgrade'] == 1){
if($v['route'] != $moduleInfo['route']){
$v['url'] = $this->user['domain'].$moduleInfo['route']."_catalog/".$v['route'];
}
}
$v['url'] = $this->user['domain'].getCustomRouteMap($moduleInfo['route'],$v['route']);
$list[$k] = $v;
}
}
... ...
... ... @@ -37,7 +37,7 @@ class GoogleSearchController extends BaseController
//查询详情数据
$searchDetailModel = new GoogleSearchDetail();
$this->map['project_id'] = $this->user['project_id'];
$data = $searchDetailModel->lists($this->map,$this->page,$this->row,'impressions',['keys','click_rate','impressions_rate']);
$data = $searchDetailModel->lists($this->map,$this->page,$this->row,'impressions',['keys','click_rate','position','impressions_rate']);
if(!empty($data)){
if($this->param['type'] == 'country'){
$codeCountryModel = new GoogleCodeCountry();
... ...
... ... @@ -29,7 +29,7 @@ class NewsCategoryController extends BaseController
$template_id = $this->getTemplateId(BTemplate::SOURCE_BLOG,BTemplate::IS_LIST);
foreach ($lists as $k => $v){
$v['num'] = $newsModel->formatQuery(['category_id'=>['like','%,' . $v['id'] . ',%']])->count();
$v['url'] = $this->user['domain'].getRouteMap(RouteMap::SOURCE_NEWS_CATE,$v['id']);
$v['url'] = $this->user['domain'].getRouteMap(RouteMap::SOURCE_NEWS_CATE,$v['id'],$this->user['is_upgrade']);
$v['is_renovation'] = $this->getIsRenovation(BTemplate::SOURCE_NEWS,BTemplate::IS_LIST,$template_id,$v['id']);
$lists[$k] = $v;
}
... ...
... ... @@ -321,6 +321,9 @@ class NewsController extends BaseController
'keyword.required' => 'keyword不能为空',
]);
$data = curl_get('http://gnews.globalso.com/gnews_news.php?keyword='.$this->param['keyword'],true);
if(isset($data['data']['p'][0]) && !empty($data['data']['p'][0])){
$data['data']['p'][0] = str_replace('&nbsp' ,' ',$data['data']['p'][0]);
}
$this->response('success',Code::SUCCESS,$data);
}
... ...
... ... @@ -13,6 +13,8 @@ use App\Enums\Common\Code;
use App\Http\Controllers\Bside\BaseController;
use App\Http\Logic\Bside\Setting\TranslateLogic;
use App\Models\Blog\Blog;
use App\Models\CustomModule\CustomModule;
use App\Models\CustomModule\CustomModuleCategory;
use App\Models\CustomModule\CustomModuleContent;
use App\Models\News\News;
use App\Models\Product\Product;
... ... @@ -279,7 +281,19 @@ class TranslateController extends BaseController
case RouteMap::SOURCE_MODULE_CATE:
$customModel = new CustomModuleContent();
$count = $customModel->formatQuery(['category_id'=>['like','%,'.$v['source_id'].',%']])->count();
$this->pageSixList($data,$count,$v,3,10);
//获取module_id
$customCateModel = new CustomModuleCategory();
$cateInfo = $customCateModel->read(['route'=>$v['route']],['module_id']);
if($cateInfo !== false){
$model = new CustomModule();
$moduleInfo = $model->read(['id'=>$cateInfo['module_id']],['route']);
if($moduleInfo !== false){
if($v['route'] != $moduleInfo['route']){
$v['route'] = $moduleInfo['route'].'/'.$v['route'];
}
}
}
$this->pageList($data,$count,$v,3,10);
break;
default:
$data[] = $v['route'];
... ... @@ -393,7 +407,7 @@ class TranslateController extends BaseController
}
/**
* @remark :
* @remark :5.0列表页路由处理
* @name :pageList
* @author :lyh
* @method :post
... ... @@ -412,6 +426,15 @@ class TranslateController extends BaseController
}
$page = ceil($count / $pageNum);//向上取整
}
if($v['source'] == RouteMap::SOURCE_NEWS_CATE){
if($v['route'] != 'news'){
$v['route'] = RouteMap::PATH_NEWS_CATE.'/'.$v['route'];
}
}elseif($v['source'] == RouteMap::SOURCE_BLOG_CATE){
if($v['route'] != 'blog'){
$v['route'] = RouteMap::PATH_BLOG_CATE.'/'.$v['route'];
}
}
for ($i = 1;$i <= $page;$i++){
if($i == 1){
$data[] = $v['route'];
... ... @@ -423,7 +446,7 @@ class TranslateController extends BaseController
}
/**
* @remark :
* @remark :6.0列表路由处理
* @name :pageList
* @author :lyh
* @method :post
... ...
... ... @@ -200,7 +200,22 @@ class DomainInfoLogic extends BaseLogic
$host_array = explode('.',$host);
if($this->param['type'] == 3){
//需要申请通配符证书,判断_acme-challenge是否已经解析
//需要申请通配符证书
//判断*是否已经解析
$host_array_any = $host_array;
if (count($host_array_any) <= 2) {
array_unshift($host_array_any, '*');
} else {
$host_array_any[0] = '*';
}
$any_domain = implode('.',$host_array_any);
$rand_str = generateRandomString(3);
if(!check_domain_record(str_replace('*',$rand_str,$any_domain), $serversIpInfo)){
$this->fail('域名' . $any_domain . '未解析至目标服务器');
}
//判断_acme-challenge是否已经解析
$host_array_ssl = $host_array;
if (count($host_array_ssl) <= 2) {
array_unshift($host_array_ssl, '_acme-challenge');
... ...
... ... @@ -20,6 +20,7 @@ use App\Models\RankData\ExternalLinks as ExternalLinksModel;
use App\Models\RankData\IndexedPages;
use App\Models\RankData\IndexedPages as IndexedPagesModel;
use App\Models\RankData\RankData;
use App\Models\RankData\RankDataBmseo;
use App\Models\RankData\RankWeek;
use App\Models\RankData\RankWeek as RankWeekModel;
use App\Models\RankData\RecommDomain;
... ... @@ -32,6 +33,7 @@ use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
class RankDataLogic extends BaseLogic
{
... ... @@ -193,6 +195,11 @@ class RankDataLogic extends BaseLogic
$data['current_api_no'] = $api_no;
$data['current_api_source'] = $api_no == 10690 ? 'Yandex' : 'Google';
}
$data['api_no'] = $api_no;
$bmseo_id = RankDataBmseo::where('project_id', $project_id)->value('id');
if($bmseo_id){
$data['bmseo_api_no'] = $bmseo_id . '_bmseo';
}
return $data;
}
... ... @@ -226,7 +233,12 @@ class RankDataLogic extends BaseLogic
$ai_projects = $this->getAiProjects()['data'] ?? [];
$flg_ai = $this->getAiFlag($ai_projects, $domain);
$ai_domain = str_replace('www.', '', $this->getAiProjects($domain)['domain'] ?? '');
$list = RankData::where('project_id', $project_id)->where('api_no', $api_no)->where('lang', $lang)->value('data') ?: [];
if (Str::endsWith($api_no, '_bmseo')) {
$list = RankDataBmseo::where('project_id', $project_id)->where('api_no', $api_no)->where('lang', $lang)->value('data') ?: [];
} else {
$list = RankData::where('project_id', $project_id)->where('api_no', $api_no)->where('lang', $lang)->value('data') ?: [];
}
$list30 = []; //排名前三十的
$list30_0 = []; //排名前三十且近三天没有排名的
$list100 = []; //排名前100的
... ... @@ -360,6 +372,34 @@ class RankDataLogic extends BaseLogic
}
/**
* 获取白帽seo站点项目
* @author zbj
* @date 2023/5/12
*/
public function getBmSeoProjects($domain = '')
{
$key = 'weblist_bm';
$data = Cache::get($key);
if (!$data) {
$api_url = 'http://api.quanqiusou.cn/api/index/weblist_bm';
try {
$data = HttpUtils::get($api_url, ['key'=> '289c1fc81c89d79c04ed4fd72822948e']);
if ($data) {
$data = Arr::s2a($data);
Cache::put($key, $data, 4 * 3600);
}
} catch (\Exception | GuzzleException $e) {
errorLog('白帽seo站点项目获取失败', [], $e);
return false;
}
}
if ($domain) {
return array_search($domain, $data);
}
return $data;
}
/**
* 获取AI站点项目
*
* @author zbj
... ... @@ -622,6 +662,58 @@ class RankDataLogic extends BaseLogic
return $model->is_compliance;
}
public function save_rank_bmseo($project_id, $api_no, $data){
$first_num = $first_page_num = $first_three_pages_num = $first_five_pages_num = $first_ten_pages_num = 0;
$first_page_without_extension_num = 0; //不算扩展词在首页的数量
$first_page_extension_num = 0; //扩展词在首页的数量
foreach ($data as &$ranks){
ksort($ranks);
$last = Arr::last($ranks);
//第一名
if($last['position'] == 1){
$first_num ++;
}
//排名第一页
if($last['position'] > 0 && $last['position'] <= 10){
$first_page_num ++;
$last['g'] == 1 && $first_page_without_extension_num++;
$last['g'] == 2 && $first_page_extension_num++;
}
//排名前三页
if($last['position'] > 0 && $last['position'] <= 30){
$first_three_pages_num ++;
}
//排名前五页
if($last['position'] > 0 && $last['position'] <= 50){
$first_five_pages_num ++;
}
//排名前十页
if($last['position'] > 0 && $last['position'] <= 100){
$first_ten_pages_num ++;
}
}
$where = [
'project_id' => $project_id,
'api_no' => $api_no,
];
$model = RankDataBmseo::where($where)->first();
if(!$model){
$model = new RankDataBmseo();
}
$model->project_id = $project_id;
$model->api_no = $api_no;
$model->first_num = $first_num;
$model->first_page_num = $first_page_num;
$model->first_three_pages_num = $first_three_pages_num;
$model->first_five_pages_num = $first_five_pages_num;
$model->first_ten_pages_num = $first_ten_pages_num;
$model->data = $data;
$model->updated_date = date('Y-m-d');
$model->save();
return true;
}
/**
* @remark :g_top
* @name :g_top_plan
... ...
... ... @@ -66,19 +66,6 @@ class InquiryFormData extends Base
return 0;
}
$model = new self();
$model->form_id = $form_id;
$model->domain = $domain;
$model->ip = $ip;
$model->country = $country;
$model->referer = $referer;
$model->user_agent = $user_agent;
$model->submit_at = $submit_at;
$model->data = $data;
$model->sign = $sign;
$model->save();
if(!empty($data['name']) && !empty($data['email']) && !empty($data['message'])){
Log::channel('inquiry')->info('开始发邮件' . PHP_EOL);
... ... @@ -102,8 +89,24 @@ class InquiryFormData extends Base
if(!$has_file) {
$res = (new FormGlobalsoApi())->submitInquiry($ip, $referer, $submit_at, $data, $traffic);
Log::channel('inquiry')->info('询盘发送邮件', [$data, $res]);
if(!$res){
throw new \Exception('询盘发送邮件失败');
}
}
}
$model = new self();
$model->form_id = $form_id;
$model->domain = $domain;
$model->ip = $ip;
$model->country = $country;
$model->referer = $referer;
$model->user_agent = $user_agent;
$model->submit_at = $submit_at;
$model->data = $data;
$model->sign = $sign;
$model->save();
return $model->id;
}
... ...
<?php
namespace App\Models\RankData;
use App\Helper\Arr;
use App\Models\Base;
/**
* Class GoogleRank
* @package App\Models
* @author zbj
* @date 2023/5/6
*/
class RankDataBmseo extends Base
{
//设置关联表名
protected $table = 'gl_rank_data_bmseo';
public static function gMap(){
return [
1 => '主关键词',
2 => '拓展关键词',
3 => '小语种关键词',
];
}
public function setDataAttribute($value)
{
$this->attributes['data'] = Arr::a2s($value);
}
public function getDataAttribute($value)
{
return Arr::s2a($value);
}
}
... ...
... ... @@ -68,6 +68,11 @@ class SyncSubmitTaskService
$project = $checkIpCountry['project'];
$data['project_id'] = $project['id'];
if(empty($data['data']['url']) && $task['type'] == 'visit'){
throw new InquiryFilterException( 'url为空');
}
//特殊处理
if($project['id'] == 455 && !empty($data['email']) && $data['email'] == 'alb@marketingtu.org'){
throw new InquiryFilterException( '黑名单邮箱');
... ... @@ -288,6 +293,7 @@ class SyncSubmitTaskService
$name = empty($data['data']['name']) ? '' : ' ' . $data['data']['name'];
MessagePush::addInquiryMessage($id, $data['project_id'], $data['country'], $name, $data['submit_at']);
}catch (\Exception $e){
Cache::decrement($ip_cache_key);
Log::channel('inquiry')->info($task_id . '询盘失败', [$e->getMessage(), $e->getFile(), $e->getLine()]);
LogUtils::error('询盘消息'.$id.'写入企微消息队列失败' . $e->getMessage());
}
... ...