UpdateRoute.php 13.3 KB
<?php
/**
 * @remark :
 * @name   :UpdateRoute.php
 * @author :lyh
 * @method :post
 * @time   :2023/11/20 15:07
 */

namespace App\Console\Commands\Test;

use App\Helper\Arr;
use App\Helper\Translate;
use App\Models\CustomModule\CustomModuleCategory;
use App\Models\Product\CategoryRelated;
use App\Models\Product\Keyword;
use App\Models\Product\Product;
use App\Models\Project\Project;
use App\Models\RouteMap\RouteMap;
use App\Services\ProjectServer;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;

/**
 * @remark :更新所有项目的路由
 * @name   :UpdateRoute
 * @author :lyh
 * @method :post
 * @time   :2023/11/20 15:08
 */
class UpdateRoute extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'update_route';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '更新路由';

    /**
     * @remark :统一更新路由
     * @name   :handle
     * @author :lyh
     * @method :post
     * @time   :2023/11/20 15:13
     */
    public function handle(){
        $projectModel = new Project();
        $list = $projectModel->list(['id'=>['in',[664]]]);
        $data = [];
        foreach ($list as $v){
            echo date('Y-m-d H:i:s') . 'project_id:'.$v['id'] . PHP_EOL;
            ProjectServer::useProject($v['id']);
//            $this->getProduct();
            $this->setProductKeyword();
            DB::disconnect('custom_mysql');
        }
        echo date('Y-m-d H:i:s') . 'end' . PHP_EOL;
    }

    public function setCustomRoute($project_id){
//        $customModel = new CustomModuleContent();
//        $list = $customModel->list();
//        foreach ($list as $v){
//                $route = RouteMap::setRoute($v['name'], RouteMap::SOURCE_MODULE, $v['id'], $project_id);
//                $customModel->edit(['route'=>$route],['id'=>$v['id']]);
//        }
        $cateModel = new CustomModuleCategory();
        $lists = $cateModel->list();
        foreach ($lists as $v1){
                $route = RouteMap::setRoute($v1['name'], RouteMap::SOURCE_MODULE_CATE, $v1['id'], $project_id);
                $cateModel->edit(['route'=>$route],['id'=>$v1['id']]);

        }
    }

    public function delProductKeyword(){
        $keywordModel = new Keyword();
        $lists = $keywordModel->list(['status'=>1],'id',['id','title']);
        foreach ($lists as $v){
            echo date('Y-m-d H:i:s') . 'id:'.$v['id'] . PHP_EOL;
            $info = $keywordModel->read(['id'=>['!=',$v['id'],'title'=>$v['title']]]);
            if($info !== false){
                $keywordModel->del(['id'=>$v['id']]);
            }
        }
    }

    /**
     * @remark :写入
     * @name   :getProductKeyword
     * @author :lyh
     * @method :post
     * @time   :2023/12/21 14:37
     */
    public function setProductKeyword(){
        $keywordModel = new Keyword();
        $lists = $keywordModel->list();
        if(!empty($lists)){
            foreach ($lists as $v){
                if(!empty($v['route'])){
                    echo date('Y-m-d H:i:s') . 'route :'.$v['id'] . PHP_EOL;
                    continue;
                }else{
                    echo date('Y-m-d H:i:s') . 'route :'.$v['id'] . PHP_EOL;
                    $route = Translate::tran($v['title'], 'en');
                    if(!empty($route)){
                        echo date('Y-m-d H:i:s') . $route . PHP_EOL;
                        $route = $this->setRoute($route, RouteMap::SOURCE_PRODUCT_KEYWORD, $v['id'], $v['project_id']);
                        $keywordModel->edit(['route'=>$route],['id'=>$v['id']]);
                    }
                }
            }
        }
    }

    /**
     * @param $title
     * @param $source
     * @param $source_id
     * @param int $project_id
     * @return bool
     * @throws \Exception
     * @author zbj
     * @date 2023/4/17
     */
    public static function setRoute($title, $source, $source_id, $project_id = 0){
        $route = self::generateRoute($title, $source, $source_id, $project_id);
        if(!$route){
            throw new \Exception('路由生成失败');
        }
        try {
            $route_map = RouteMap::where('project_id', $project_id)->where('source_id', $source_id)->where('source', $source)->first();
            if(!$route_map){
                $route_map = new RouteMap();
                $route_map->source = $source;
                $route_map->source_id = $source_id;
                $route_map->project_id = $project_id;
            }
            $route_map->route = $route;
            $route_map->save();
        }catch (\Exception $e){
            throw new \Exception('路由映射失败');
        }
        return $route;
    }

    /**
     * 生成路由标识
     * @param $title
     * @param $source
     * @param $source_id
     * @param $project_id
     * @return string
     * @author zbj
     * @date 2023/4/17
     */
    public static function generateRoute($title, $source, $source_id, $project_id){
        $i=1;
        $sign = generateRoute($title);
        $length = strlen($sign);
        if($length > 100){
            $sign = trim(mb_substr($sign, 0, 100, 'UTF-8'),'-');
        }
        $info = RouteMap::where(['project_id' => $project_id, 'source' => $source, 'source_id'=>$source_id])->first();
        $suffix = '';
        if(empty($info)){
            if($source == 'product'){
                $suffix = '-product';
            }
        }
        $route = $sign.$suffix;
        while(RouteMap::isExist($route, $source_id, $project_id)){
            $route = $sign .'-'.$i.$suffix;
            $i++;
        }
        return $route;
    }

    /**
     * @remark :产品关键字
     * @name   :getProductKeyword
     * @author :lyh
     * @method :post
     * @time   :2023/12/8 11:13
     */
    public function getProductKeyword(){
        $keywordModel = new Keyword();
        $lists = $keywordModel->list(['status'=>1,'route'=>'']);
        if(!empty($lists)){
            foreach ($lists as $v){
                $tag = "-tag";
                if (!(substr($v['route'], -strlen($tag)) === $tag)) {
                    echo date('Y-m-d H:i:s') . '拼接'.$tag . PHP_EOL;
                    $route = $v['route'].$tag;
                    // 如果不是以 '-tag' 结尾,则拼接上 '-tag'
                    $routeModel = new RouteMap();
                    $routeModel->edit(['route'=>$route],['source'=>RouteMap::SOURCE_PRODUCT_KEYWORD,'source_id'=>$v['id']]);
                    $keywordModel->edit(['route'=>$route],['id'=>$v['id']]);
                    echo date('Y-m-d H:i:s') . 'end'.$v['id'] . PHP_EOL;
                }
            }
        }
    }

    public function getProduct(){
        $productModel = new Product();
        $lists = $productModel->list(['status'=>1,'id'=>['<=',501]]);
        if(!empty($lists)){
            foreach ($lists as $v){
                if(!empty($v['route'])){
                    $tag = "-product";
                    if (!(substr($v['route'], -strlen($tag)) === $tag)) {
                        echo date('Y-m-d H:i:s') . '拼接'.$tag . PHP_EOL;
                        $route = $v['route'].$tag;
                        // 如果不是以 '-product' 结尾,则拼接上 '-product'
                        $route = RouteMap::setRoute($route, RouteMap::SOURCE_PRODUCT, $v['id'], $v['project_id']);
                        $productModel->edit(['route'=>$route],['id'=>$v['id']]);
                    }else{
//                        echo date('Y-m-d H:i:s') . 'id :'.$v['id'] . PHP_EOL;
//                        $route = RouteMap::setRoute($v['title'], RouteMap::SOURCE_PRODUCT, $v['id'], $v['project_id']);
//                        $productModel->edit(['route'=>$route],['id'=>$v['id']]);
                    }
                    continue;
                }else{
                    echo date('Y-m-d H:i:s') . 'id :'.$v['id'] . PHP_EOL;
                    $v['title'] = Translate::tran($v['title'], 'en');
                    $route = RouteMap::setRoute($v['title'], RouteMap::SOURCE_PRODUCT, $v['id'], $v['project_id']);
                    $productModel->edit(['route'=>$route],['id'=>$v['id']]);
                }
            }
        }
    }

    /**
     * @remark :升级项目同步路由
     * @name   :getRouteMap
     * @author :lyh
     * @method :post
     * @time   :2024/1/4 11:53
     */
    public function getRouteMap(){
        $routeMapModel = new RouteMap();
        $list = $routeMapModel->list(['source'=>'product','project_id'=>627]);
        foreach ($list as $k => $v){
            $product = new Product();
            $product->edit(['route'=>$v['route']],['id'=>$v['source_id']]);
            echo date('Y-m-d H:i:s') . '产品id:'.$v['source_id'] . PHP_EOL;
        }
    }

    /**
     * @remark :更新产品关联表
     * @name   :getProductCategory
     * @author :lyh
     * @method :post
     * @time   :2024/1/4 14:48
     */
    public function getProductCategory(){
        $product = new Product();
        $num = 30;
        while ($num > 0){
            $list = $product->lists(['status'=>1],$num,1000);
            foreach ($list['list'] as $k => $v){
                if(empty($v['category_id'])){
                    continue;
                }
                $category_ids = $v['category_id'];
                //产品分类关联
                echo date('Y-m-d H:i:s') . '产品id--1:'.$v['id'] . PHP_EOL;
                $this->saveRelated($v['id'], $category_ids);
                echo date('Y-m-d H:i:s') . '产品id:'.$v['id'] . PHP_EOL;
            }
            $num--;
        }
    }

    /**
     * 关联产品分类
     * @param $product_id
     * @param $cate_ids
     * @author zbj
     * @date 2023/4/21
     */
    public function saveRelated($product_id, $cate_ids)
    {
        if(!is_array($cate_ids)){
            $cate_ids = array_filter(Arr::splitFilterToArray($cate_ids), 'intval');
        }
        //先删除
        CategoryRelated::where('product_id', $product_id)->delete();
        //批量保存
        $data = [];
        if(!empty($cate_ids)){
            foreach ($cate_ids as $cate_id){
                $data[] = [
                    'product_id' => $product_id,
                    'cate_id' => $cate_id,
                    'created_at'=>date('Y-m-d H:i:s'),
                    'updated_at'=>date('Y-m-d H:i:s')
                ];
            }
            CategoryRelated::insert($data);
        }
        return true;
    }

    /**
     * @remark :删除路由通知C端
     * @name   :curlDelRoute
     * @author :lyh
     * @method :post
     * @time   :2023/11/30 14:43
     */
    public function curlDelRoute($data){
        $data['project_id'] = 75;
        $str = http_build_query($data);
        $url = 'https://www.zrutong.com/api/delHtml/?'.$str;
        curlGet($url);
        return true;
    }

    public function delRouteMap(){
        $productKeywordModel = new Keyword();
        $list = $productKeywordModel->list();
        foreach ($list as $k=>$v){
            RouteMap::setRoute($v['route'],'product_keyword',$v['id'],569);
        }
    }

    public function copyTable()
    {
        $sourceTable = 'gl_route_map';
        $destinationTable = 'gl_route_map_copy';

        if (!Schema::connection('custom_mysql')->hasTable($sourceTable)) {
            $this->error("Source table {$sourceTable} does not exist.");
            return false;
        }
        if (Schema::connection('custom_mysql')->hasTable($destinationTable)) {
            Schema::connection('custom_mysql')->dropIfExists($destinationTable);
        }
        $columns = DB::connection('custom_mysql')->select(DB::raw("SHOW COLUMNS FROM {$sourceTable}"));
        $columnsDefinition = collect($columns)->map(function($column) {
            $columnDefinition = $column->Field . ' ' . $column->Type .
                ($column->Null === 'NO' ? ' NOT NULL' : '') .
                ($column->Default !== null ? " DEFAULT '" . $column->Default . "'" : '') .
                ($column->Extra ? ' ' . $column->Extra : '');
            return $columnDefinition;
        })->implode(', ');
        // Add PRIMARY KEY to the id column
        $primaryKey = collect($columns)->firstWhere('Field', 'id') ? 'PRIMARY KEY (id)' : '';
        $columnsDefinition = $columnsDefinition . ($primaryKey ? ', ' . $primaryKey : '');
        DB::connection('custom_mysql')->statement("CREATE TABLE {$destinationTable} ({$columnsDefinition})");
        DB::connection('custom_mysql')->statement("INSERT INTO {$destinationTable} SELECT * FROM {$sourceTable}");
        $this->info("Table {$sourceTable} has been copied to {$destinationTable} successfully.");
    }


    /**
     * @remark :routeMap去重
     * @name   :routeMapDeduplication
     * @author :lyh
     * @method :post
     * @time   :2024/5/28 11:31
     */
    public function routeMapDeduplication(){
        $routeMapModel = new RouteMap();
        $lists = $routeMapModel->list(['source'=>'product_keyword'],'id',['id'],'asc');
        foreach ($lists as $v){
            echo date('Y-m-d H:i:s') . '关键字id:'.$v['id'] . PHP_EOL;
            //查询当前数据详情
            $info = $routeMapModel->read(['id'=>$v['id']],['id','source_id']);
            if($info !== false){
                //删除其他一样的数据
                $routeMapModel->del(['id'=>['!=',$info['id']],'source'=>'product_keyword','source_id'=>$info['source_id']]);
            }
        }
        return true;
    }
}