ProductController.php 9.0 KB
<?php

namespace App\Http\Controllers\Api;

use App\Enums\Common\Code;
use App\Helper\Translate;
use App\Models\Product\Category;
use App\Models\Product\CategoryRelated;
use App\Models\Product\Product;
use App\Models\RouteMap\RouteMap;
use App\Services\CosService;
use App\Services\ProjectServer;
use App\Utils\LogUtils;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;

/**
 * Class ProductController
 * @package App\Http\Controllers\Api
 * @author zbj
 * @date 2024/2/1
 */
class ProductController extends BaseController
{
    /**
     * 获取项目随机产品的图片
     * @param Request $request
     * @return void
     */
    public function getImages(Request $request)
    {
        $project_id = $request->input('project_id');
        $project = ProjectServer::useProject($project_id);
        if (!$project) {
            $this->response('项目不存在', Code::SYSTEM_ERROR);
        }

        try {
            $info = Product::where('status', Product::STATUS_ON)->whereNotNull('gallery')->inRandomOrder()->select(['title', 'seo_mate', 'gallery'])->first();
            $info['gallery'] = array_map(function ($item) use ($project) {
                 $item['url'] = getImageUrl($item['url'], $project['storage_type'], $project['project_location']);
                 return $item;
            }, $info['gallery']);
        } catch (\Exception $e) {
            LogUtils::error('Project Id: ' . $project_id . ' getProductImages error:' . $e->getMessage());
            $info = [];
        }
        $this->response('success', Code::SUCCESS, $info);
    }

    /**
     * @remark :保存产品
     * @name   :saveProduct
     * @author :lyh
     * @method :post
     * @time   :2024/3/20 11:09
     */
    public function saveProduct(){
        $api_key = '8242LYUGaOfUQ1koc4Rq6MhEEOG7NW68oRaB7iO9coJDjG5L5gA1Q';
        if($this->request->header('api-key') != $api_key){
            $this->response('非法请求',Code::SYSTEM_ERROR);
        }
        $this->request->validate([
            'project_id'=>'required',
            'title'=>'required',
        ],[
            'project_id.required' => 'project_id不能为空',
            'title.required' => 'title不能为空',
        ]);
        $project = ProjectServer::useProject($this->param['project_id']);
        if (!$project) {
            $this->response('项目不存在', Code::SYSTEM_ERROR);
        }
        //处理图片
        $imageInfo = $this->handleImage($this->param['image'],$this->param['project_id']);
        $thumb = $imageInfo['thumb'];
        $gallery = $imageInfo['gallery'];
        //处理分类
        $category_id = $this->handleCategory($this->param['category_name'],$this->param['project_id']);
        try {
            $productModel = new Product();
            $productInfo = $productModel->read(['title'=>$this->param['title']]);
            if($productInfo === false){
                $productData = [
                    'project_id'=>$this->param['project_id'],
                    'title'=>$this->param['title'],
                    'intro'=>$this->param['intro'] ?? '',
                    'content'=>$this->param['content'] ?? '',
                    'thumb'=>json_encode($thumb,true),
                    'gallery'=>json_encode($gallery,true),
                    'created_at'=>date('Y-m-d H:i:s'),
                    'updated_at'=>date('Y-m-d H:i:s')
                ];
                if(!empty($category_id)){
                    $productData['category_id'] = ','.$category_id.',';
                }
                $product_id = $productModel->addReturnId($productData);
                $route = RouteMap::setRoute($productData['title'], RouteMap::SOURCE_PRODUCT, $product_id, $this->param['project_id']);
                $productModel->edit(['route'=>$route],['id'=>$product_id]);
                //添加到关联分类
                CategoryRelated::saveRelated($product_id, [$category_id]);
            }
        } catch (\Exception $e) {
            LogUtils::error('Project Id: ' . $this->param['project_id'] . ' saveProduct error:' . $e->getMessage());
            $this->response('保存失败,请联系管理员',Code::SYSTEM_ERROR);
        }
        $this->response('success');
    }

    /**
     * @remark :处理图片
     * @name   :handleImage
     * @author :lyh
     * @method :post
     * @time   :2024/3/20 14:44
     */
    public function handleImage($image,$project_id){
        $gallery = [];
        $thumb = [];
        if(!empty($image) && is_array($image)){
            foreach ($image as $k => $v){
                //TODO::图片转存
                $url = CosService::uploadRemote($project_id,'image_product',$v);
                if($k == 0){
                    $thumb = ['url'=>$url,'alt'=>''];
                }
                $gallery[] = ['url'=>$url,'alt'=>''];
            }
        }
        return ['thumb'=>$thumb,'gallery'=>$gallery];
    }

    /**
     * @remark :处理分类
     * @name   :handleCategory
     * @author :lyh
     * @method :post
     * @time   :2024/3/20 14:48
     */
    public function handleCategory($category_name,$project_id){
        $category_id = '';
        if(isset($category_name) && !empty($category_name)){
            $categoryModel = new Category();
            $cateInfo = $categoryModel->read(['title'=>$this->param['category_name']]);
            if($cateInfo === false){
                $cateData =[
                    'project_id'=>$project_id,
                    'title'=>$category_name,
                    'pid'=>0,
                    'created_at'=>date('Y-m-d H:i:s'),
                    'updated_at'=>date('Y-m-d H:i:s')
                ];
                $cate_id = $categoryModel->addReturnId($cateData);
                $route = RouteMap::setRoute($cateData['title'], RouteMap::SOURCE_PRODUCT_CATE, $cate_id, $project_id);
                $categoryModel->edit(['route'=>$route],['id'=>$cate_id]);
            }else{
                $cate_id = $cateInfo['id'];
            }
            $category_id = $cate_id;
        }
        return $category_id;
    }

    /**
     * @param Request $request
     * @author zbj
     * @date 2024/1/22
     */
    protected function searchProduct(Request $request)
    {
        $project_id = $request->input('project_id');
        $limit = $request->input('limit') ?: 5;
        $text = $request->input('text');
        $key = $request->input('key') ?: 'title';
        $key_limit = $request->input('key_limit') ?: 15;

        $project = ProjectServer::useProject($project_id);
        if (!$project) {
            $this->response('项目不存在', Code::SYSTEM_ERROR);
        }

        //匹配产品
        $products = Product::with('category')
            ->where("title", 'like', $text . '%')
            ->where("status", 1)
            ->orderBy("id", "DESC")
            ->limit($limit)
            ->select('title', 'thumb', 'id', 'route')
            ->get()
            ->toArray();

        //对应分类
        $categories = [];
        foreach ($products as &$product) {
            foreach ($product['category'] as $category) {
                $categories[$category['route']] = [
                    'title' => $category['title'],
                    'route' => '/' . $category['route'] . '/',
                ];
            }
            unset($product['id']);
            unset($product['category']);

            if(!empty($product['thumb']) && !empty($product['thumb']['url'])){
                $product['thumb'] = getImageUrl($product['thumb']['url'],$project['storage_type'] ?? 0,$project['project_location']);
            }

            $product['route'] = '/' . $product['route'] . '/';
        }

        $data = [
            'products' => $products,
            'categories' => array_values($categories),
            'suggestions' => $this->searchSuggestion($text, $key, $key_limit)
        ];

        $this->response('success', Code::SUCCESS, $data);

    }

    protected function searchSuggestion($text, $key, $key_limit): array
    {
        $model = new Product();
        $columns = $model->getConnection()->getSchemaBuilder()->getColumnListing($model->getTable());

        //产品字段
        if (in_array($key, $columns)) {
            //匹配产品
            $suggestions = Product::where("status", 1)
                ->where($key, 'like', $text . '%')
                ->orderBy("id", "DESC")
                ->limit($key_limit)
                ->select($key .' as title', 'route')
                ->get()
                ->toArray();
        } else {
            //扩展字段
            $suggestions = Product::leftJoin('gl_product_extend_info as pei', 'gl_product.id', '=', 'pei.product_id')
                ->where('pei.values', 'like', $text . '%')
                ->where("gl_product.status", 1)
                ->orderBy("gl_product.id", "DESC")
                ->limit($key_limit)
                ->select('pei.values','gl_product.route')
                ->get()
                ->toArray();
        }

        foreach ($suggestions as &$suggestion){
            $suggestion['route'] = '/' . $suggestion['route'] . '/';
        }

        return $suggestions;
    }
}