BlogCategoryLogic.php 12.3 KB
<?php

namespace App\Http\Logic\Bside\Blog;

use App\Http\Logic\Bside\BaseLogic;
use App\Models\Blog\Blog as BlogModel;
use App\Models\Blog\BlogCategory as BlogCategoryModel;
use App\Models\RouteMap\RouteMap;
use Illuminate\Support\Facades\DB;

class BlogCategoryLogic extends BaseLogic
{
    public function __construct()
    {
        parent::__construct();

        $this->model = new BlogCategoryModel();
        $this->param = $this->requestAll;
    }

    /**
     * @remark :保存数据
     * @name   :categorySave
     * @author :lyh
     * @method :post
     * @time   :2023/9/7 13:42
     */
    public function categorySave(){
        //验证名称是否存在
        $this->verifyParamName($this->param['name']);
        DB::beginTransaction();
        try {
            if(isset($this->param['id']) && !empty($this->param['id'])){
                //查看路由是否更新
                $id = $this->editCategoryRoute($this->param['id'], $this->param['alias']);
                $this->editHandleCategory($this->param['id'],$this->param['pid']);
                $this->param['operator_id'] = $this->user['id'];
                $this->edit($this->param,['id'=>$this->param['id']]);
            }else{
                //拼接参数
                $this->param = $this->addParamProcessing($this->param);
                $id = $this->model->addReturnId($this->param);
                //处理子集
                $this->addProcessingSon($id);
            }
            $route = RouteMap::setRoute(isset($this->param['alias']) ? $this->param['alias'] : $this->param['name'],
                RouteMap::SOURCE_BLOG_CATE, $id, $this->user['project_id']);
            $this->edit(['alias'=>$route],['id'=>$id]);
            DB::commit();
        }catch (\Exception $e){
            DB::rollBack();
            $this->fail('系统错误,请联系管理');
        }
        //通知更新
        $this->updateNotify(['project_id'=>$this->user['project_id'], 'type'=>RouteMap::SOURCE_BLOG_CATE, 'route'=>$route]);
        return $this->success();
    }

    /**
     * @remark :编辑分类,处理博客数据
     * @name   :editCategory
     * @author :lyh
     * @method :post
     * @time   :2023/10/20 9:32
     */
    public function editHandleCategory($id,$pid){
        $info = $this->model->read(['id'=>$id],['id','pid']);
        if($info['pid'] != $pid){
            @file_put_contents(storage_path('logs/lyh_error.log'), var_export(111, true) . PHP_EOL, FILE_APPEND);
            //修改勒上级,先查看上级是否拥有博客
            $blogModel = new BlogModel();
            $blogCount = $blogModel->formatQuery(['category_id'=>['like','%,'.$pid.',%']])->count();
            @file_put_contents(storage_path('logs/lyh_error.log'), var_export(2222, true) . PHP_EOL, FILE_APPEND);
            if($blogCount > 0){
                //随机获取最后一级id
                $replacement = $this->getLastId($id);
                @file_put_contents(storage_path('logs/lyh_error.log'), var_export(333, true) . PHP_EOL, FILE_APPEND);
                //存在博客时,移动所有博客到当前分类最后一级
                $blogModel->where('category_id', 'like', '%,' . $pid . ',%')->where('category_id', 'like', '%,' . $replacement . ',%')
                    ->update(['category_id' => DB::raw("REPLACE(category_id, ',$pid,', ',')")]);
                $blogModel->where('category_id', 'like', '%,' . $pid . ',%')
                    ->update(['category_id' => DB::raw("REPLACE(category_id, ',$pid,', ',$replacement,')")]);
            }
        }
        return $this->success();
    }

    /**
     * @remark :随机获取当前id下最后一级的id
     * @name   :getLastId
     * @author :lyh
     * @method :post
     * @time   :2023/10/20 9:45
     */
    public function getLastId($id){
        $info = $this->model->read(['pid'=>$id],['id']);
        if($info !== false){
            return $this->getLastId($id);
        }else{
            return $id;
        }

    }

    /**
     * @remark :编辑路由时生成路由记录
     * @name   :editCategoryRoute
     * @author :lyh
     * @method :post
     * @time   :2023/9/7 10:51
     */
    public function editCategoryRoute($id,$route){
        //生成一条删除路由记录
        $info = $this->model->read(['id'=>$id],['id','alias']);
        if($info['alias'] != $route){
            $data = [
                'source'=>RouteMap::SOURCE_NEWS_CATE,
                'route'=>$info['alias'],
            ];
            $this->setRouteDeleteSave($data);
        }
        return $this->success($id);
    }

    /**
     * @name :详情
     * @return array
     * @author :liyuhang
     * @method
     */
    public function info_blog_category(){
        $info = $this->model->read($this->param);
        return $this->success($info);
    }

    /**
     * @name :编辑状态与排序
     * @return void
     * @author :liyuhang
     * @method
     */
    public function status_blog_category(){
        $this->param['operator_id'] = $this->user['id'];
        $rs = $this->model->edit($this->param,['id'=>$this->param['id']]);
        if($rs ===  false){
            $this->fail('error');
        }
        return $this->success();
    }
    /**
     * @name :删除博客分类
     * @return void
     * @author :liyuhang
     * @method
     */
    public function delBlogCategory(){
        foreach ($this->param['id'] as $id){
            $this->verifyIsDelete($id);
            //删除路由
            $this->delRoute($id);
            $this->model->del(['id'=>$id]);
        }
        return $this->success();
    }

    /**
     * @remark :验证是否可删除
     * @name   :VerifyIsDelete
     * @author :lyh
     * @method :post
     * @time   :2023/9/7 14:40
     */
    public function verifyIsDelete($id){
        //查询是否有子分类
        $rs = $this->model->read(['pid'=>$id],['id']);
        if($rs !== false){
            $this->response('当前分类拥有子分类不允许删除');
        }
        //查看当前分内下是否有博客
        $blogModel = new BlogModel();
        $rs = $blogModel->read(['category_id'=>['like','%,'.$id.',%']],['id']);
        if($rs !== false){
            $this->response('当前分类拥有博客,不允许删除');
        }
        return $this->success();
    }

    /**
     * @name   :(添加分类时获取1级分类)categoryTopList
     * @author :lyh
     * @method :post
     * @time   :2023/6/13 9:09
     */
    public function categoryTopList(){
        $this->param['project_id'] = $this->user['project_id'];
        $this->param['status'] = 0;
        if(isset($this->param['id']) && !empty($this->param['id'])){
            $str = [];
            //排序掉当前id下所有子集
            $str = $this->getAllSub($this->param['id'],$str);
            $str[] = (int)$this->param['id'];
            $this->param['id'] = ['not in',$str];
        }
        $menu = array();
        $list = $this->model->list($this->param);
        if(!empty($list)){
            foreach ($list as $k => $v){
                if($v['pid'] == 0){
                    $v['sub'] = _get_child($v['id'],$list);
                    $menu[]   = $v;
                }
            }
        }
        return $this->success($menu);
    }

    /**
     * @remark :获取当前id下所有子集
     * @name   :getAllSub
     * @author :lyh
     * @method :post
     * @time   :2023/10/18 15:10
     */
    public function getAllSub($id,&$str = []){
        $list = $this->model->list(['pid'=>$id,'status'=>0],['id','pid']);
        if(!empty($list)){
            foreach ($list as $v){
                $str[] = $v['id'];
                $this->getAllSub($v['id'],$str);
            }
        }
        return $str;
    }

    /**
     * @name   :(参数处理)paramProcessing
     * @author :lyh
     * @method :post
     * @time   :2023/6/13 11:30
     */
    public function addParamProcessing($param){
        $param['project_id'] = $this->user['project_id'];
        $param['operator_id'] = $this->user['id'];
        $param['create_id'] = $this->user['id'];
        return $this->success($param);
    }

    /**
     * @name   :(验证名称是否存在)verifyParamName
     * @author :lyh
     * @method :post
     * @time   :2023/6/13 11:41
     */
    public function verifyParamName($name){
        if(isset($this->param['id']) && !empty($this->param['id'])){
            $condition = [
                'id'=>['!=',$this->param['id']],
                'name'=>$name,
            ];
        }else{
            $condition = ['name'=>$name];
        }
        $info = $this->model->read($condition);
        if($info !== false){
            $this->fail('当前分类名称已存在');
        }
        return $this->success();
    }

    /**
     * @param $cate_id
     * @name   :(处理子集)addProcessingSon
     * @author :lyh
     * @method :post
     * @time   :2023/6/13 11:59
     */
    public function addProcessingSon($cate_id){
        if(!isset($this->param['pid'])){
            $this->param['pid'] = 0;
        }
        //判断为子分类时
        if($this->param['pid'] != 0){
            //查看当前上级分类下是否有其他子分类
            $cate_info = $this->model->read(['pid' => $this->param['pid'], 'id' => ['!=', $cate_id]]);
            if ($cate_info === false) {
                //查看当前上一级分类下是否有新闻
                $blogModel = new BlogModel();
                $blog_count = $blogModel->where('category_id','like', '%,' . $this->param['pid'] . ',%')->count();
                if ($blog_count > 0) {
                    $replacement = ',' . $cate_id . ',';
                    $old = ',' . $this->param['pid'] . ',';
                    //更新所有商品到当前分类
                    $blogModel->where('category_id', 'like', '%' . $old . '%')
                        ->update(['category_id' => DB::raw("REPLACE(category_id, '$old', '$replacement')")]);
                }
            }
        }
        return $this->success();
    }

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

    /**
     * 新闻导入:分类处理
     * @param $project_id
     * @param $user_id
     * @param $category
     * @return string
     * @throws \Exception
     * @author Akun
     * @date 2023/09/20 17:35
     */
    public function importBlogCategory($project_id,$user_id,$category){
        $return = [];

        $cate_arr = explode('/',$category);
        $p_cate = $cate_arr[0];
        $c_cate = $cate_arr[1];

        $p_category = $this->model->read(['name'=>$p_cate,'pid'=>0]);
        if(!$p_category){
            $p_id = $this->model->addReturnId(['name'=>$p_cate,'project_id'=>$project_id,'operator_id'=>$user_id,'create_id'=>$user_id]);

            $route = RouteMap::setRoute($p_cate, RouteMap::SOURCE_BLOG_CATE, $p_id, $project_id);
            $this->model->edit(['alias'=>$route],['id'=>$p_id]);
        }else{
            $p_id = $p_category['id'];
        }
        $return[] = $p_id;

        if($c_cate){
            $c_category = $this->model->read(['name'=>$c_cate,'pid'=>$p_id]);
            if(!$c_category){
                $c_id = $this->model->addReturnId(['name'=>$c_cate,'pid'=>$p_id,'project_id'=>$project_id,'operator_id'=>$user_id,'create_id'=>$user_id]);

                $route = RouteMap::setRoute($c_cate, RouteMap::SOURCE_BLOG_CATE, $c_id, $project_id);
                $this->model->edit(['alias'=>$route],['id'=>$c_id]);
            }else{
                $c_id = $c_category['id'];
            }
            $return[] = $c_id;
        }
        return ','.implode(',',$return).',';
    }

    /**
     * @remark :排序
     * @name   :setSort
     * @author :lyh
     * @method :post
     * @time   :2023/8/19 11:16
     */
    public function setSort(){
        $rs = $this->model->edit(['sort'=>$this->param['sort']],['id'=>$this->param['id']]);
        if($rs === false){
            $this->fail('error');
        }
        return $this->success();
    }
}