KeywordLogic.php 13.1 KB
<?php

namespace App\Http\Logic\Bside\Product;

use App\Exceptions\BsideGlobalException;
use App\Helper\Arr;
use App\Helper\Common;
use App\Http\Logic\Bside\BaseLogic;
use App\Models\Com\NoticeLog;
use App\Models\News\News;
use App\Models\Product\Keyword;
use App\Models\Product\KeywordRelated;
use App\Models\Product\Product;
use App\Models\RouteMap\RouteMap;
use Illuminate\Support\Facades\DB;

/**
 * Class KeywordLogic
 * @package App\Http\Logic\Bside\APublicModel
 * @author zbj
 * @date 2023/4/15
 */
class KeywordLogic extends  BaseLogic
{
    public function __construct()
    {
        parent::__construct();
        $this->param = $this->requestAll;
        $this->model = new Keyword();
    }

    /**
     * @remark :获取数据详情
     * @name   :getInfo
     * @author :lyh
     * @method :post
     * @time   :2023/8/23 16:50
     */
    public function getKeywordInfo()
    {
        $info = $this->model->read($this->param);
        if($info !== false){
            $info['url'] = $this->user['domain'] . $info['route'];
            $info['related_news_info'] = News::whereIn('id',  $info['related_news_ids'])->select(['id', 'name'])->get();
            $info['product_list'] = $this->getProduct($info['id']);
        }
        return $this->success($info);
    }

    /**
     * @remark :保存
     * @name   :keywordSave
     * @author :lyh
     * @method :post
     * @time   :2023/8/23 16:50
     */
    public function keywordSave(){
        $this->param = $this->handleSaveParam($this->param);
        if(isset($this->param['id']) && !empty($this->param['id'])){
            $info = $this->model->read(['title'=>$this->param['title'],'id'=>['!=',$this->param['id']]]);
            if($info !== false){
                $this->fail('当前title已存在');
            }
            $route = RouteMap::setRoute($this->param['route'], RouteMap::SOURCE_PRODUCT_KEYWORD, $this->param['id'], $this->user['project_id']);
            $this->param['route'] = $route;
            //todo::通知C端生成
            if(isset($this->param['is_video_keyword']) && ($this->param['is_video_keyword'] == 1)){
                $info = $this->model->read(['id'=>$this->param['id']],['id','is_video_keyword','video']);
                if(($info['is_video_keyword'] != $this->param['is_video_keyword']) && ($info['video'] != null || $info['video'] != '')){
                    $this->sendHttpC([$route]);
                }
            }
            $this->model->edit($this->param,['id'=>$this->param['id']]);
            $data = ['id'=>$this->param['id']];
        }else{
            $info = $this->model->read(['title'=>$this->param['title']]);
            if($info !== false){
                return $this->success(['id'=>$info['id']]);
            }
            $this->param = $this->addHandleParam($this->param);
            $id = $this->model->insertGetId($this->param);
            //路由映射
            $route = RouteMap::setRoute($this->param['title'], RouteMap::SOURCE_PRODUCT_KEYWORD, $id, $this->user['project_id']);
            $this->model->edit(['route'=>$route],['id'=>$id]);
            $data = ['id'=>$id];
        }
        Common::del_user_cache('product_keyword',$this->user['project_id']);
        $this->addUpdateNotify(RouteMap::SOURCE_PRODUCT_KEYWORD,$route);
        $this->curlDelRoute(['new_route'=>$route]);
        return $this->success($data);
    }

    /**
     * @remark :添加组装数据
     * @name   :addHandleParam
     * @author :lyh
     * @method :post
     * @time   :2023/11/30 15:00
     */
    public function addHandleParam($param){
        $param['project_id'] = $this->user['project_id'];
        $param['created_at'] = date('Y-m-d H:i:s');
        $param['updated_at'] = $param['created_at'];
        return $this->success($param);
    }

    /**
     * @remark :保存数据时参数处理
     * @name   :handleSaveParam
     * @author :lyh
     * @method :post
     * @time   :2023/10/23 14:47
     */
    public function handleSaveParam($param){
        if(isset($param['keyword_top_banner'])){
            $param['keyword_top_banner'] = str_replace_url($param['keyword_top_banner'] ?? []);
        }
        if(isset($param['keyword_foot_banner'])){
            $param['keyword_foot_banner'] = str_replace_url($param['keyword_foot_banner'] ?? []);
        }
        if(isset($param['keyword_video'])){
            $param['keyword_video'] = Arr::a2s($param['keyword_video'] ?? []);
        }
        if(!empty($param['related_news_ids'])){
            $param['related_news_ids'] = Arr::arrToSet($param['related_news_ids'] ?? []);
        }
        if(!empty($param['related_blog_ids'])){
            $param['related_blog_ids'] = Arr::arrToSet($param['related_blog_ids'] ?? []);
        }
        if(!isset($param['is_video_keyword']) || $param['is_video_keyword'] == null){
            $param['is_video_keyword'] = 0;
        }
        $param['first_word'] = $this->first_word($param['title']);
        return $param;
    }

    /**
     * @remark :获取字符串首字符
     * @name   :first_word
     * @author :lyh
     * @method :post
     * @time   :2024/10/28 10:47
     */
    public function first_word($title){
        $first_title = mb_substr($title, 0, 1);
        //返回对应的键
        $keywordModel = new Keyword();
        $firstNumWord = $keywordModel->firstNumWord;
        foreach($firstNumWord as $k => $v){
            if(strtolower($v) == strtolower($first_title)){
                return $k;
            }
        }
        return 27;
    }

    /**
     * @remark :批量添加关键词任务, 异步处理
     * @name   :batchAdd
     * @author :lyh
     * @method :post
     * @time   :2024/6/6 10:27
     */
    public function batchAdd(){
        try {
            foreach ($this->param['title'] as $k=>$v){
                if(empty($v)){
                    continue;
                }
                $this->model = new Keyword();
                $info = $this->model->read(['title'=>$v],['id']);
                if($info === false){
                    $param['project_id'] = $this->user['project_id'];
                    $param['created_at'] = date('Y-m-d H:i:s');
                    $param['updated_at'] = $param['created_at'];
                    $param['title'] = $v;
                    $param['first_word'] = $this->first_word($param['title']);
                    $this->model->insertGetId($param);
                }
            }
        }catch (\Exception $e){
            $this->fail('保存失败,请联系管理员');
        }
        Common::del_user_cache('product_keyword',$this->user['project_id']);
        NoticeLog::createLog(NoticeLog::TYPE_INIT_KEYWORD, ['project_id' => $this->user['project_id']]);
        return $this->success();
    }

    /**
     * @remark :删除标签
     * @name   :keywordDelete
     * @author :lyh
     * @method :post
     * @time   :2023/8/28 11:28
     */
    public function keywordDelete(){
        $ids = $this->param['ids'];
        $productModel = new Product();
        foreach ($ids as $id){
            $replace_id = ','.$id.',';
            $productModel->where('keyword_id', 'like', '%,' . $id . ',%')
                ->update([
                    'keyword_id' => DB::raw("REPLACE(keyword_id, '$replace_id' , ',')")
                ]);
            $productModel->where('keyword_id', ',')
                ->update([
                    'keyword_id' => DB::raw("REPLACE(keyword_id, ',' , '')")
                ]);
            $this->delRoute($id);
            $this->model->del(['id'=>$id]);
        }
        (new KeywordRelated())->del(['keyword_id'=>['in',$ids]]);
        //清除缓存
        Common::del_user_cache('product_keyword',$this->user['project_id']);
        return $this->success();
    }

    /**
     * @remark :删除路由
     * @name   :delRoute
     * @author :lyh
     * @method :post
     * @time   :2023/9/7 10:50
     */
    public function delRoute($id){
        //删除路由映射
        RouteMap::delRoute(RouteMap::SOURCE_PRODUCT_KEYWORD, $id, $this->user['project_id']);
        //生成一条删除路由记录
        $info = $this->model->read(['id'=>$id],['id','route']);
        if($info !== false){
            $this->curlDelRoute(['old_route'=>$info['route']]);
        }
        return $this->success();
    }

    /**
     * 产品导入:关键词处理
     * @param $project_id
     * @param $keyword
     * @return string
     * @throws \Exception
     * @author Akun
     * @date 2023/09/21 14:55
     */
    public function importProductKeyword($project_id,$keyword){
        $return = [];
        $keyword_arr = explode('^v6sp$',$keyword);
        foreach ($keyword_arr as $v){
            if($v){
                $keyword_info = $this->model->read(['title'=>$v]);
                if(!$keyword_info){
                    $k_id = $this->model->addReturnId(['title'=>$v,'first_word' => $this->first_word($v),'project_id'=>$project_id]);
                    $route = RouteMap::setRoute($v, RouteMap::SOURCE_PRODUCT_KEYWORD, $k_id, $project_id);
                    $this->model->edit(['route'=>$route],['id'=>$k_id]);
                }else{
                    $k_id = $keyword_info['id'];
                }
                $return[] = $k_id;
            }
        }
        //清除缓存
        Common::del_user_cache('product_keyword',$project_id);
        return ','.implode(',',$return).',';
    }

    /**
     * 批量删除
     * @return array
     * @throws BsideGlobalException
     * @throws \App\Exceptions\AsideGlobalException
     * @author zbj
     * @date 2023/11/22
     */
    public function batchDel(){
        try {
            $productModel = new Product();
            foreach ($this->param['title'] as $v){
                $info = $this->model->read(['title'=>$v]);
                if($info){
                    $this->delRoute($info['id']);
                    $this->model->del(['id'=>$info['id']]);
                    $id = $info['id'];
                    $replace_id = ','.$id.',';
                    $productModel->where('keyword_id', 'like', '%,' . $id . ',%')
                        ->update([
                            'keyword_id' => DB::raw("REPLACE(keyword_id, '$replace_id' , ',')")
                        ]);
                    $productModel->where('keyword_id', ',')
                        ->update([
                            'keyword_id' => DB::raw("REPLACE(keyword_id, ',' , '')")
                        ]);
                    (new KeywordRelated())->del(['keyword_id'=>$id]);
                }
            }
            //清除缓存
            Common::del_user_cache('product_keyword',$this->user['project_id']);
        }catch (\Exception $e){
            $this->fail('error');
        }
        return $this->success();
    }

    /**
     * @remark :根据关键字获取产品
     * @name   :getProduct
     * @author :lyh
     * @method :post
     * @time   :2024/11/28 9:26
     */
    public function getProduct($keyword_id){
        $productList = [];
        $keywordRelatedModel = new KeywordRelated();
        $productIdArr = $keywordRelatedModel->selectField(['keyword_id'=>$keyword_id],'product_id');
        if(!empty($productIdArr)){
            $productModel = new Product();
            $productList = $productModel->list(['id'=>['in',$productIdArr]],['id','title','route']);
            foreach ($productList as $k => $v){
                $v['route'] = $this->user['domain'].$v['route'];
                $productList[$k] = $v;
            }
        }
        return $this->success($productList);
    }

    /**
     * @remark :对应删除关联关系
     * @name   :delRelated
     * @author :lyh
     * @method :post
     * @time   :2024/11/28 9:46
     */
    public function delRelated($keyword_id,$product_id){
        $productModel = new Product();
        $productModel->where('id', $product_id)
            ->update(['keyword_id' => DB::raw("REPLACE(keyword_id, ',$keyword_id,' , ',')"),'keyword_video_id' => DB::raw("REPLACE(keyword_video_id, ',$keyword_id,' , ',')")]);
        $productModel->where('id', $product_id)->where('keyword_id',',')->orWhere('keyword_video_id',',')
        ->update(['keyword_id' => DB::raw("REPLACE(keyword_id, ',' , '')"),'keyword_video_id' => DB::raw("REPLACE(keyword_video_id, ',' , '')")]);
        $keywordRelatedModel = new KeywordRelated();
        $keywordRelatedModel->del(['product_id'=>$product_id,'keyword_id'=>$keyword_id]);
        return $this->success();
    }

    /**
     * @remark :删除所有的关键字
     * @name   :delAllKeyword
     * @author :lyh
     * @method :post
     * @time   :2024/12/5 15:37
     */
    public function delAllKeyword(){
        DB::beginTransaction();
        try {
            //截断关联表
            KeywordRelated::truncate();
            //截断关键词表
            Keyword::truncate();
            //清空产品表的keyword_id字段
            $routeMapModel = new RouteMap();
            $routeMapModel->del(['source'=>'product_keyword']);
            $productModel = new Product();
            $productModel->edit(['keyword_id'=>''],['id'=>['>',0]]);
            DB::commit();
        }catch (\Exception $e){
            DB::rollBack();
            $this->fail('操作失败,请联系管理员');
        }
        return $this->success();
    }

}