ProductLogic.php 11.7 KB
<?php

namespace App\Http\Logic\Bside\Product;

use App\Helper\Arr;
use App\Http\Logic\Bside\BaseLogic;
use App\Models\Product\CategoryRelated;
use App\Models\Product\Product;
use App\Models\RouteMap\RouteMap;
use App\Models\Template\BTemplate;
use Illuminate\Support\Facades\DB;

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

    /**
     * @remark :保存产品
     * @name   :productSave
     * @author :lyh
     * @method :post
     * @time   :2023/8/21 18:35
     */
    public function productSave(){
        //参数处理
        $this->param = $this->handleSaveParam($this->param);
        DB::beginTransaction();
        try {
            if(isset($this->param['id']) && !empty($this->param['id'])){
                //查看路由是否更新
                $id = $this->editProductRoute($this->param['id'],$this->param['route']);
                $this->model->edit($this->param,['id'=>$this->param['id']]);
            }else{
                $this->param['project_id'] = $this->user['project_id'];
                $this->param['created_at'] = date('Y-m-d H:i:s');
                $this->param['updated_at'] = $this->param['created_at'];
                $id = $this->model->addReturnId($this->param);
            }
            //路由映射
            $route = RouteMap::setRoute($this->param['route'], RouteMap::SOURCE_PRODUCT, $id, $this->user['project_id']);
            //更新路由
            $this->model->edit(['route'=>$route],['id'=>$id]);
            DB::commit();
        }catch (\Exception $e){
            DB::rollBack();
            $this->fail('保存失败');
        }
        //通知更新
        $this->updateNotify(['project_id'=>$this->user['project_id'], 'type'=>RouteMap::SOURCE_PRODUCT, 'route'=>$route]);
        return $this->success();
    }

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

    /**
     * @remark :不使用save处理参数
     * @name   :handleSaveParam
     * @author :lyh
     * @method :post
     * @time   :2023/8/21 17:03
     */
    public function handleSaveParam(&$param){
        if(isset($param['gallery']) && !empty($param['gallery'])){
            foreach ($param['gallery'] as $k => $v){
                $v['url'] = str_replace_url($v['url']);
                $param['gallery'][$k] = $v;
            }
            $param['thumb'] = Arr::a2s($param['gallery'][0] ?? '');
            $param['gallery'] = Arr::a2s($param['gallery'] ?? '');
        }
        $param['attrs'] = Arr::a2s($param['attrs'] ?? '');
        $param['attr_id'] = Arr::arrToSet($param['attr_id'] ?? '');
        $param['category_id'] = ','.Arr::arrToSet($param['category_id']).',';
        $param['keyword_id'] = ','.Arr::arrToSet($param['keyword_id']).',';
        $param['describe'] = Arr::a2s($param['describe'] ?? '');
        $param['describe_id'] = Arr::arrToSet($param['describe_id'] ?? '');
        $param['seo_mate'] = Arr::a2s($param['seo_mate'] ?? '');
        $param['related_product_id'] = Arr::arrToSet($param['related_product_id'] ?? '');
        if(isset($param['icon']) && !empty($param['icon'])){
            foreach ($param['icon'] as $k1 => $v1){
                $param['icon'][$k1] = str_replace_url($v1);
            }
            $param['icon'] = Arr::a2s($param['icon'] ?? '');
        }
        $param['created_uid'] = $this->user['id'];
        return $param;
    }


    /**
     * @remark :删除数据
     * @name   :delete
     * @author :lyh
     * @method :post
     * @time   :2023/8/21 17:11
     */
    public function productDelete(){
        DB::beginTransaction();
        try {
            foreach ($this->param['ids'] as $k => $id) {
                $info = $this->model->read(['id'=>$id]);
                if($info['status'] == Product::STATUS_RECYCLE){
                    //删除路由映射
                    RouteMap::delRoute(RouteMap::SOURCE_PRODUCT, $id, $this->user['project_id']);
                    //生成一条删除路由记录
                    $data = [
                        'source'=>RouteMap::SOURCE_PRODUCT,
                        'route'=>$info['route'],
                    ];
                    $this->setRouteDeleteSave($data);
                    //删除当前产品模版
                    $this->delProductModule($id);
                    $this->model->del(['id'=>$id]);
                }else{
                    //回收站
                    $this->model->edit(['status'=>Product::STATUS_RECYCLE],['id'=>$id]);
                }
            }
            DB::commit();
        }catch (\Exception $e){
            DB::rollBack();
            $this->fail('删除失败');
        }

        return $this->success();
    }

    /**
     * @remark :统计数据
     * @name   :getStatusNumber
     * @author :lyh
     * @method :post
     * @time   :2023/8/9 10:17
     */
    public function getStatusNumber(){
        //三种状态 0:草稿 1:发布 2:回收站
        $data = ['dra'=>0,'pub'=>1,'del'=>2,'tal'=>3];
        foreach ($data as $k => $v){
            if($v == 3){
                $data[$k] = $this->model->where(['project_id'=>$this->user['project_id']])->count();
            }else{
                $data[$k] = $this->model->where(['status'=>$v,'project_id'=>$this->user['project_id']])->count();
            }
        }
        return $this->success($data);
    }

    /**
     * @remark :复制产品
     * @name   :setCopyProduct
     * @author :lyh
     * @method :post
     * @time   :2023/7/29 15:03
     */
    public function setCopyProduct(){
        $info = $this->model->read(['id'=>$this->param['id']]);
        $param = $this->setProductParams($info);
        $save_id = $this->model->insertGetId($param);
        //同步路由信息
        $this->copyRoute($save_id,$param['route'].'-'.$save_id);
        //同步可视化装修数据
        $this->copyTemplate($this->param['id'],$info['project_id'],$save_id);
        return $this->success();
    }

    /**
     * @remark :同步模版数据
     * @name   :copyTemplate
     * @author :lyh
     * @method :post
     * @time   :2023/7/29 15:53
     */
    public function copyTemplate($id,$project_id,$save_id){
        $BTemplateModel = new BTemplate();
        $list = $BTemplateModel->list(['source'=>2,'source_id'=>$id,'project_id'=>$project_id]);
        if(!empty($list)){
            $data = [];
            foreach ($list as $k => $v){
                $data[] = $this->setTemplateParams($v,$project_id,$save_id);
            }
            $rs = $BTemplateModel->insert($data);
            if($rs === false){
                $this->fail('error');
            }
        }
        return $this->success();
    }

    /**
     * @remark :同步路由表
     * @name   :copyRoute
     * @author :lyh
     * @method :post
     * @time   :2023/8/19 11:53
     */
    public function copyRoute($news_id,$new_route){
        $routeModel = new RouteMap();
        $data = [
            'source'=>$routeModel::SOURCE_PRODUCT,
            'source_id'=>$news_id,
            'project_id'=>$this->user['project_id'],
            'route'=>$new_route,
        ];
        return $routeModel->add($data);
    }

    /**
     * @remark :组装模版数据
     * @name   :setTemplateParams
     * @author :lyh
     * @method :post
     * @time   :2023/7/29 15:54
     */
    public function setTemplateParams($v,$project_id,$save_id){
        $param = [
            'html'=>$v['html'],
            'project_id'=>$project_id,
            'source'=>$v['source'],
            'source_id'=>$save_id,
            'template_id'=>$v['template_id'],
            'section_list_id'=>$v['section_list_id'],
            'head_html'=>$v['head_html'],
            'main_html'=>$v['main_html'],
            'footer_html'=>$v['footer_html'],
            'head_css'=>$v['head_css'],
            'main_css'=>$v['main_css'],
            'footer_css'=>$v['footer_css'],
            'created_at'=>$v['created_at'],
            'updated_at'=>$v['updated_at']
        ];
        return $this->success($param);
    }

    /**
     * @remark :组装数据
     * @name   :setParams
     * @author :lyh
     * @method :post
     * @time   :2023/7/29 15:45
     */
    public function setProductParams($info){
        $param = [
            'project_id'=>$info['project_id'],
            'title'=>$info['title']."-copy",
            'thumb'=>Arr::a2s($info['thumb']),
            'gallery'=>Arr::a2s($info['gallery']),
            'attrs'=>Arr::a2s($info['attrs']),
            'attr_id'=>Arr::arrToSet($info['attr_id']),
            'category_id'=>','.Arr::arrToSet($info['category_id']).',',
            'keyword_id'=>','.Arr::arrToSet($info['keyword_id']).',',
            'intro'=>$info['intro'],
            'content'=>$info['content'],
            'describe'=>Arr::a2s($info['describe']),
            'describe_id'=>Arr::arrToSet($info['describe_id']),
            'seo_mate'=>Arr::a2s($info['seo_mate']),
            'related_product_id'=>Arr::arrToSet($info['related_product_id']),
            'sort'=>$info['sort'],
            'status'=>$info['status'],
            'product_type'=>$info['product_type'],
            'created_uid'=>$this->user['id'],
            'icon'=>Arr::a2s($info['icon']),
            'route'=>$info['route']."-copy",
            'created_at'=>date('Y-m-d H:i:s'),
            'updated_at'=>date('Y-m-d H:i:s'),
        ];
        return $param;
    }

    /**
     * @remark :删除当前产品所有模块
     * @name   :delProductModule
     * @author :lyh
     * @method :post
     * @time   :2023/7/31 10:31
     */
    public function delProductModule($id){
        $param = [
            'source' => BTemplate::SOURCE_PRODUCT,
            'source_id' => $id,
            'project_id'=>$this->user['project_id'],
        ];
        $bTemplateModel = new BTemplate();
        $rs = $bTemplateModel->del($param);
        if($rs === false){
            $this->fail('error');
        }
        return $rs;
    }

    /**
     * @remark :批量设置产品分类及状态
     * @name   :batchSetCategory
     * @author :lyh
     * @method :post
     * @time   :2023/8/15 17:53
     */
    public function batchSetCategory(){
        DB::beginTransaction();
        try {
            //删除分类关联表记录
            $categoryRelatedModel = new CategoryRelated();
            $categoryRelatedModel->del(['product_id'=>['in',$this->param['id']]]);
            //批量
            $param = [
                'category_id'=>Arr::arrToSet($this->param['category_id']),
                'status'=>$this->param['status']
            ];
            $this->model->edit($param,['id'=>['in',$this->param['id']]]);
            DB::commit();
            //对应添加关联表
        }catch (\Exception $e){
            DB::rollBack();
            $this->fail('error');
        }
        return $this->success();
    }

    /**
     * @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();
    }
}