WeekProject.php 14.6 KB
<?php
/**
 * @remark :
 * @name   :WeekProject.php
 * @author :lyh
 * @method :post
 * @time   :2024/12/3 9:48
 */

namespace App\Console\Commands\ProjectWeeklyReport;

use App\Helper\FormGlobalsoApi;
use App\Models\Blog\Blog;
use App\Models\Com\Notify;
use App\Models\Com\V6WeeklyReport;
use App\Models\Domain\DomainInfo;
use App\Models\HomeCount\Count;
use App\Models\News\News;
use App\Models\Product\Product;
use App\Models\Project\Project;
use App\Models\ProjectAssociation\ProjectAssociation;
use App\Models\RankData\ExternalLinks;
use App\Models\RankData\RankData;
use App\Models\RankData\RankWeek;
use App\Models\Workchat\MessagePush;
use App\Services\ProjectServer;
use Carbon\Carbon;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

class WeekProject extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'week_project';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'V6.0周报';

    /**
     * @remark :
     * @name   :handle
     * @author :lyh
     * @method :post
     * @time   :2024/12/3 10:01
     */
    public function handle(){
        $projectModel = new Project();
        $list = $projectModel->list(['delete_status'=>0,'id'=>2803,'type'=>['in',[1,2,3,4,6]]],'id',['id','title','is_weekly_report','main_lang_id']);
        $domainModel = new DomainInfo();
        foreach ($list as $k => $v){
            echo date('Y-m-d H:i:s') . 'project_id:'.$v['id'] . PHP_EOL;
            $domainInfo = $domainModel->read(['project_id'=>$v['id']]);
            if($domainInfo === false){
                echo date('Y-m-d H:i:s') . '域名不存在,跳过:'.$v['title'] . PHP_EOL;
                continue;
            }
            $v['domain'] = $domainInfo['domain'];
            ProjectServer::useProject($v['id']);
            $this->weekData($v);
            DB::disconnect('custom_mysql');
        }
        echo date('Y-m-d H:i:s') . 'end:' . PHP_EOL;
    }

    /**
     * @remark :统计数据
     * @name   :weekData
     * @author :lyh
     * @method :post
     * @time   :2024/12/3 10:03
     */
    public function weekData($value){
        echo date('Y-m-d H:i:s') . '项目名称:'.$value['title'] . PHP_EOL;
        $data = [
            'project_id'=>$value['id'],
            'title'=>$value['title'],
            'main_lang_id'=>$value['main_lang_id'],
        ];
        // 上一周的开始时间(周一 00:00:00)
        $startOfLastWeek = strtotime("last week monday");
        // 上一周的结束时间(周日 23:59:59)
        $endOfLastWeek = strtotime("last week sunday 23:59:59");
        // 格式化为日期时间字符串
        $data['start_date'] = $startOfLastWeekFormatted = date('Y-m-d', $startOfLastWeek);
        $data['end_date'] = $endOfLastWeekFormatted = date('Y-m-d', $endOfLastWeek);
        $countModel = new Count();
        $startOfThisWeek = date('Y-m-d', strtotime("monday this week"));
        $endOfLastWeekFormattedInfo = $countModel->read(['date'=>$startOfThisWeek,'project_id'=>$value['id']],['inquiry_num','country']);
        $data['inquiry_total'] = $endOfLastWeekFormattedInfo['inquiry_num'] ?? 0;//询盘总数量
        $data['inquiry_country'] = $endOfLastWeekFormattedInfo['country'] ?? json_encode([]);//询盘国家
        //获取上一周询盘数量
        $result = (new FormGlobalsoApi())->getDateInquiry($value['domain'],$data['start_date'],$data['end_date']);
        if(isset($result['status'])){
            $data['week_inquiry_total'] = $result['data'];
            echo date('Y-m-d H:i:s') . '项目id:'.$value['id'].',域名:'.$value['domain'].',上周询盘数量data:'.$result['data'] . PHP_EOL;
        }else{
            $data['week_inquiry_total'] = 0;
            echo date('Y-m-d H:i:s') . '项目id:'.$value['id'].',域名:'.$value['domain'].',请求询盘错误。' . PHP_EOL;
        }
        $rankDataModel = new RankData();
        $rankInfo = $rankDataModel->read(['project_id'=>$value['id'],'lang'=>''],['first_num','first_page_num','first_three_pages_num','first_five_pages_num','first_ten_pages_num','indexed_pages_num']);
        $data['google_indexed_num'] = $rankInfo['indexed_pages_num'] ?? 0;
        $externalLinksModel = new ExternalLinks();
        $linkInfo = $externalLinksModel->read(['project_id'=>$value['id']],['total']);
        $data['google_links_num'] = $linkInfo['total'] ?? 0;
        $data['keyword_home_num'] = $rankInfo['first_page_num'] ?? 0;
        $data['keyword_three_num'] = $rankInfo['first_three_pages_num'] ?? 0;
        $data['keyword_five_num'] = $rankInfo['first_five_pages_num'] ?? 0;
        $data['keyword_ten_num'] = $rankInfo['first_ten_pages_num'] ?? 0;
        $productModel = new Product();
        $data['product_num'] = $productModel->counts(['status'=>1]) ?? 0;
        $data['week_product_num'] = $productModel->counts(['status'=>1,'created_at'=>['between',[$startOfLastWeek,$endOfLastWeek]]]) ?? 0;
        $newsModel = new News();
        $data['news_num'] = $newsModel->counts(['status'=>1]) ?? 0;
        $data['week_news_num'] = $newsModel->counts(['status'=>1,'created_at'=>['between',[$startOfLastWeek,$endOfLastWeek]]]) ?? 0;
        $blogModel = new Blog();
        $data['blog_num'] = $blogModel->counts(['status'=>1]) ?? 0;
        $notifyModel = new Notify();
        $data['main_update_num'] = $notifyModel->counts(['type'=>1,'route'=>1,'project_id'=>$value['id']]) ?? 0;
        $data['aggregation_update_num'] = $notifyModel->counts(['type'=>1,'route'=>4,'project_id'=>$value['id']]) ?? 0;
        $data['minor_update_num'] = $notifyModel->counts(['type'=>2,'route'=>1,'project_id'=>$value['id']]) ?? 0;
        $data['aggregation_minor_update_num'] = $notifyModel->counts(['type'=>2,'route'=>4,'project_id'=>$value['id']]) ?? 0;
        //日均访问量
        $data['daily_average_num'] = 0;
        $pv_num_count = $countModel->where('project_id',$value['id'])->whereBetween('date', [$startOfLastWeekFormatted,$endOfLastWeekFormatted])->sum('pv_num');
        if($pv_num_count != 0){
            $data['daily_average_num'] = round($pv_num_count / 7,2);
        }

        if(isset($value['is_weekly_report']) && $value['is_weekly_report'] != 0){
            $this->workChatMessage($data,$value['id']);
        }
        $v6WeeklyReportModel = new V6WeeklyReport();
        $v6WeeklyReportModel->add($data);
        return true;
    }

    /**
     * 周报消息推送消息入库
     * @param $data
     * @param $project_id
     * @return bool
     */
    public function workChatMessage($data,$project_id){
        $arr = [];
        //项目是否有绑定群
        $friend_id = ProjectAssociation::where('project_id', $project_id)
            ->where('status', ProjectAssociation::STATUS_NORMAL)
            ->where('binding_app', ProjectAssociation::ENTERPRISE_WECHAT)
            ->value('friend_id');
        if(!$friend_id){
            echo date('Y-m-d H:i:s') . '没有绑定企微群:'.$project_id . PHP_EOL;
            return false;
        }
        $content = '';
        $content1 = '';
        if(!empty($data['inquiry_total'])){
            $content1 .= '项目共计已收到询盘 '.$data['inquiry_total'].'条,';
            if(!empty($data['week_inquiry_total'])){
                $content1 .= '本周新收 '.$data['week_inquiry_total'].' 封询盘。';
            }
            if(!empty($data['inquiry_country'])){
                $data['inquiry_country'] = json_decode($data['inquiry_country'],true);
                arsort($data['inquiry_country']);
                $data['inquiry_country'] = array_slice($data['inquiry_country'], 0, 4, true);
                $country = '';
                foreach ($data['inquiry_country'] as $k => $v){
                    $country .= $k.',';
                };
                $country = trim($country,',');
                if(!empty($country)){
                    $content1 .= '询盘主要来源于'.$country.'等国家地区。';
                }
            }
            $content1 .= '如有高质量客户,请您密切关注与跟进;';
        }
        if(!empty($content1)){
            $arr[] = $content1;
        }
        $content2 = '';
        if(!empty($data['google_indexed_num']) || !empty($data['google_links_num']) || !empty($data['keyword_home_num']) || !empty($data['keyword_three_num']) || !empty($data['keyword_five_num']) || !empty($data['keyword_ten_num']) || !empty($data['daily_average_num'])){
            $content2 .= '项目截止目前';
            if($data['main_lang_id'] == 8){
                $title = 'Yandex';
            }else{
                $title = '谷歌';
            }
            if(!empty($data['google_indexed_num'])){
                $content2 .= $title.'收录量:'.$data['google_indexed_num'].'条,';
            }
            if(!empty($data['google_links_num'])){
                //获取上一次的外链数
                $latestRecord = V6WeeklyReport::where(['project_id'=>$project_id])->orderBy('id', 'desc')->first();
                if(!empty($latestRecord)){
                    if($latestRecord['google_links_num'] != $data['google_links_num']){
                        $content2 .= '外链量:'.$data['google_links_num'].'条,';
                    }
                }else{
                    $content2 .= '外链量:'.$data['google_links_num'].'条,';
                }
            }
            if(!empty($data['keyword_home_num']) || !empty($data['keyword_three_num']) || !empty($data['keyword_five_num']) || !empty($data['keyword_ten_num'])){
                $content2 .= $title.'搜索排名';
                if(!empty($data['keyword_home_num'])){
                    $content2 .= '首页关键词数量为:'.$data['keyword_home_num'].'个,';
                }
                if(!empty($data['keyword_three_num'])){
                    $content2 .= '前三页关键词数量为:'.$data['keyword_three_num'].'个,';
                }
                if(!empty($data['keyword_five_num'])){
                    $content2 .= '前五页关键词数量为:'.$data['keyword_five_num'].'个,';
                }
                if(!empty($data['keyword_ten_num'])){
                    $content2 .= '前十页关键词数量为:'.$data['keyword_ten_num'].'个,';
                }
            }
            if(!empty($data['daily_average_num'])){
                $content2 .= '本周日均访客量:'.$data['daily_average_num'].'+。';
            }
            $content2 .= PHP_EOL.'全球搜建议用户持续分析、选择、添加企业、产品、服务等相关关键词进行优化和监控,以覆盖更多相关排名和流量;';
        }
        if(!empty($content2)){
            $arr[] = $content2;
        }
        $content3 = '';
        if(!empty($data['product_num']) || !empty($data['news_num']) || !empty($data['week_product_num']) || !empty($data['week_news_num'])){
            if(!empty($data['product_num']) || !empty($data['news_num'])){
                $content3 .= '项目截止目前';
                if(!empty($data['product_num'])){
                    $content3 .= '发布产品:'.$data['product_num'].'条,';
                }
                if(!empty($data['news_num'])){
                    $content3 .= '发布新闻:'.$data['news_num'].'条。';
                }
            }
            if(!empty($data['week_product_num']) || !empty($data['week_news_num'])){
                $content3 .= '本周新增';
                if(!empty($data['week_product_num'])){
                    $content3 .= '产品:'.$data['week_product_num'].'条,';
                }
                if(!empty($data['week_news_num'])){
                    $content3 .= '新闻:'.$data['week_news_num'].'条。';
                }
            }
            $content3 .= PHP_EOL.'全球搜建议用户保持网站内容的持续更新与完善,可参考谷歌关于创建实用、可靠、以用户为中心的内容的相关建议:https://developers.google.com/search/docs/fundamentals/creating-helpful-content?hl=zh-cn;';
        }
        if(!empty($content3)){
            $arr[] = $content3;
        }
        $content4 = '';
        if(!empty($data['main_update_num'])){
            $content4 .= '网站加载速度维护及主站页面更新'.$data['main_update_num'].'次。';
        }
        if(!empty($data['aggregation_update_num'])){
            $content4 .= '聚合页主站页面更新'.$data['aggregation_update_num'].'次。';
        }
        if(!empty($data['minor_update_num'])){
            $content4 .= '小语种站页面更新'.$data['minor_update_num'].'次。';
        }
        if(!empty($data['aggregation_minor_update_num'])){
            $content4 .= '聚合页小语种站页面'.$data['aggregation_minor_update_num'].'次。';
        }
        if(!empty($content4)){
            $content4 = PHP_EOL.'本周主要优化工作包括:TDK、H标签、Img标签等优化设置排查与进一步完善,Sitemap更新与网页收录提交,外链新增与排查。'.$content4;
        }
        if(!empty($content4)){
            $arr[] = $content4;
        }
        if(empty($arr)){
            return true;
        }
        foreach ($arr as $key => $val){
            $content .= ($key+1).','.$val.PHP_EOL.PHP_EOL;
        }
        $tomorrowNineAM = date('Y-m-d 09:00:00', time());
        if(empty($content)){
            return true;
        }
        $tips = 'Tips:'.PHP_EOL.'1、全球搜V6.0系统提供网页TDK、H标签、Img标签等用户自定义编辑接口且辅以AI创作工具,用户可进一步对相关优化设置进行精细化优化与调整;'.PHP_EOL.'2、全球搜V6.0系统提供小语种页面精准校对翻译功能,用户可进一步对已翻译小语种页面进行人工翻译校对;'.PHP_EOL.'3、全球搜V6.0系统支持绑定Facebook、LinkedIn、X(原Twitter)等社媒账号,可一键同步转发网站上发布的产品和新闻至社媒账号动态,建议用户用起来哦;'.PHP_EOL.'4、如用户有较丰富的企业、产品、服务相关视频素材,全球搜建议用户及时创建YouTube主页,并在YouTube和网站相关网页上同步发布视频;';
        $message = "【全球搜V6.0周报】" . PHP_EOL . $content . PHP_EOL . $tips;
        $param = [
            'project_id'=>$project_id,
            'friend_id'=>$friend_id,
            'type'=>MessagePush::TYPE_WEEK,
            'content'=> $message,
            'ref_ids'=>'',
            'send_time'=>$tomorrowNineAM,
            'status'=>0,
        ];
        //写入一条推送消息  自动消费
        $messagePushModel = new MessagePush();
        $messagePushModel->add($param);
        return true;
    }
}