280 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			280 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			PHP
		
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace app\controller\manager\mall;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use app\controller\manager\Base;
							 | 
						||
| 
								 | 
							
								use app\controller\manager\Upload;
							 | 
						||
| 
								 | 
							
								use app\exception\RepositoryException;
							 | 
						||
| 
								 | 
							
								use app\model\mall\SpuLimitTime;
							 | 
						||
| 
								 | 
							
								use app\model\sku\SpecParam;
							 | 
						||
| 
								 | 
							
								use app\model\sku\SpecValue;
							 | 
						||
| 
								 | 
							
								use app\model\sku\SpuType;
							 | 
						||
| 
								 | 
							
								use app\model\Spu;
							 | 
						||
| 
								 | 
							
								use app\model\Sku as SkuModel;
							 | 
						||
| 
								 | 
							
								use Exception;
							 | 
						||
| 
								 | 
							
								use think\facade\Db;
							 | 
						||
| 
								 | 
							
								use think\response\Json;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class Sku extends Base
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    protected $noNeedRight = [
							 | 
						||
| 
								 | 
							
								        'spuTypeData', 'attrSpecData', 'specValueCreate',
							 | 
						||
| 
								 | 
							
								        'specCreate', 'specValueDelete', 'specDelete', 'upload', 'skuData'
							 | 
						||
| 
								 | 
							
								    ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 获取SKU数据
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @throws Exception
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function skuData(): Json
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $productId = input('product_id', 0);
							 | 
						||
| 
								 | 
							
								        if ($productId == 0) {
							 | 
						||
| 
								 | 
							
								            return $this->json(200, 'success', []);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $spu = Spu::findById($productId, ['id', 'activity_id', 'activity_type', 'multi_spec']);
							 | 
						||
| 
								 | 
							
								        $res       = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        switch ($spu['activity_type']) {
							 | 
						||
| 
								 | 
							
								            case SpuLimitTime::TYPE:
							 | 
						||
| 
								 | 
							
								                $where = ['spu_activity_id' => $spu['activity_id'], 'type' => $spu['activity_type']];
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								            default:
							 | 
						||
| 
								 | 
							
								                $where = ['spu_id' => $productId];
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if ($spu['multi_spec'] > 0) {
							 | 
						||
| 
								 | 
							
								            $list = SkuModel::where($where)->whereNull('deleted_at')->whereNotNull('indexes')->select();
							 | 
						||
| 
								 | 
							
								            foreach ($list as $item) {
							 | 
						||
| 
								 | 
							
								                $key = $item['indexes'];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                $res[sprintf("skus[%s][%s]", $key, 'id')]             = $item['id'];
							 | 
						||
| 
								 | 
							
								                $res[sprintf("skus[%s][%s]", $key, 'stock')]          = $item['stock'];
							 | 
						||
| 
								 | 
							
								                $res[sprintf("skus[%s][%s]", $key, 'original_price')] = $item['original_price'];
							 | 
						||
| 
								 | 
							
								                $res[sprintf("skus[%s][%s]", $key, 'price')]          = $item['price'];
							 | 
						||
| 
								 | 
							
								                $res[sprintf("skus[%s][%s]", $key, 'picture')]        = $item['picture'];
							 | 
						||
| 
								 | 
							
								                $res[sprintf("skus[%s][%s]", $key, 'is_default')]     = $item['is_default'];
							 | 
						||
| 
								 | 
							
								                $res[sprintf("skus[%s][%s]", $key, 'coding')]         = $item['coding'];
							 | 
						||
| 
								 | 
							
								                $res[sprintf("skus[%s][%s]", $key, 'status')]         = $item['status'];
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            $item = SkuModel::where($where)->where('is_default', 1)->find();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            $res['skus[id]']             = $item['id'];
							 | 
						||
| 
								 | 
							
								            $res['skus[stock]']          = $item['stock'];
							 | 
						||
| 
								 | 
							
								            $res['skus[original_price]'] = $item['original_price'];
							 | 
						||
| 
								 | 
							
								            $res['skus[price]']          = $item['price'];
							 | 
						||
| 
								 | 
							
								            $res['skus[coding]']         = $item['coding'];
							 | 
						||
| 
								 | 
							
								            $res['skus[status]']         = $item['status'];
							 | 
						||
| 
								 | 
							
								            $res['skus[is_default]']     = $item['is_default'];
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return $this->json(200, 'success', $res);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 获取商品类型列表
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @throws Exception
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function spuTypeData(): Json
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $list = SpuType::where('status', SpuType::COMMON_ON)
							 | 
						||
| 
								 | 
							
								            ->order('sort', 'desc')
							 | 
						||
| 
								 | 
							
								            ->order('id', 'asc')
							 | 
						||
| 
								 | 
							
								            ->field('id,title')
							 | 
						||
| 
								 | 
							
								            ->select();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return $this->json(200, 'success', $list);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 获取商品类型下的规格和属性
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @throws Exception
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function attrSpecData(): Json
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $spuTypeId  = input('product_type_id/d');
							 | 
						||
| 
								 | 
							
								        $productId  = input('product_id/d', 0);//商品ID
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $spuInfo = Spu::findById($productId, ['id', 'activity_id', 'activity_type', 'multi_spec', 'spec']);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $selectSpec = [];
							 | 
						||
| 
								 | 
							
								        if ($spuInfo) {
							 | 
						||
| 
								 | 
							
								            switch ($spuInfo['activity_type']) {
							 | 
						||
| 
								 | 
							
								                case SpuLimitTime::TYPE:
							 | 
						||
| 
								 | 
							
								                    $selectSpec = SpuLimitTime::where('id', $spuInfo['activity_id'])->value('spec');
							 | 
						||
| 
								 | 
							
								                    break;
							 | 
						||
| 
								 | 
							
								                default:
							 | 
						||
| 
								 | 
							
								                    $selectSpec = $spuInfo['spec'];
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            $selectSpec = json_decode($selectSpec, true);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $specIds    = SpuType::where('id', $spuTypeId)->value('spec_ids');
							 | 
						||
| 
								 | 
							
								        $specIdArr  = explode(',', $specIds);
							 | 
						||
| 
								 | 
							
								        $list       = SpecParam::whereIn('id', $specIdArr)
							 | 
						||
| 
								 | 
							
								            ->where('status', SpecParam::COMMON_ON)
							 | 
						||
| 
								 | 
							
								            ->with([
							 | 
						||
| 
								 | 
							
								                'specValue' => function ($q) {
							 | 
						||
| 
								 | 
							
								                    $q->where('status', SpecValue::COMMON_ON)->order('sort', 'desc')->order('id', 'asc');
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            ])
							 | 
						||
| 
								 | 
							
								            ->order('sort', 'desc')
							 | 
						||
| 
								 | 
							
								            ->order('id', 'asc')
							 | 
						||
| 
								 | 
							
								            ->field('id,title')
							 | 
						||
| 
								 | 
							
								            ->select();
							 | 
						||
| 
								 | 
							
								        $spec       = [];//规格
							 | 
						||
| 
								 | 
							
								        $attr       = [];//属性
							 | 
						||
| 
								 | 
							
								        $list->each(function ($item) use (&$spec, $selectSpec) {
							 | 
						||
| 
								 | 
							
								            $arr            = [];
							 | 
						||
| 
								 | 
							
								            $arr['id']      = (string) $item->id;
							 | 
						||
| 
								 | 
							
								            $arr['title']   = $item->title;
							 | 
						||
| 
								 | 
							
								            $arr['options'] = $item->specValue->each(function ($spec) {
							 | 
						||
| 
								 | 
							
								                $spec->id = (string) $spec->id;
							 | 
						||
| 
								 | 
							
								                unset($spec->sort);
							 | 
						||
| 
								 | 
							
								                unset($spec->spec_id);
							 | 
						||
| 
								 | 
							
								                unset($spec->status);
							 | 
						||
| 
								 | 
							
								                unset($spec->created_at);
							 | 
						||
| 
								 | 
							
								                unset($spec->updated_at);
							 | 
						||
| 
								 | 
							
								            });
							 | 
						||
| 
								 | 
							
								            $arr['value']   = $selectSpec[$item->id] ?? [];
							 | 
						||
| 
								 | 
							
								            $spec[]         = $arr;
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return $this->json(200, 'success', ['spec' => $spec, 'attribute' => $attr]);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 创建规格值
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @throws Exception
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function specValueCreate(): Json
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $params = input('post.');
							 | 
						||
| 
								 | 
							
								        $rules  = [
							 | 
						||
| 
								 | 
							
								            'spec_id|规格ID' => 'require|number',
							 | 
						||
| 
								 | 
							
								            'title|规格值'    => 'require',
							 | 
						||
| 
								 | 
							
								        ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $validate = $this->validateByApi($params, $rules);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if ($validate !== true) {
							 | 
						||
| 
								 | 
							
								            return $validate;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $count = SpecValue::where('spec_id', $params['spec_id'])
							 | 
						||
| 
								 | 
							
								            ->where('title', $params['title'])
							 | 
						||
| 
								 | 
							
								            ->where('status', SpecValue::COMMON_ON)
							 | 
						||
| 
								 | 
							
								            ->count();
							 | 
						||
| 
								 | 
							
								        if ($count > 0) {
							 | 
						||
| 
								 | 
							
								            return $this->json(4000, '规格值已存在');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $value = SpecValue::create([
							 | 
						||
| 
								 | 
							
								            'spec_id' => $params['spec_id'],
							 | 
						||
| 
								 | 
							
								            'title'   => $params['title'],
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return $this->json(200, 'success', ['id' => $value->id]);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 创建规格
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @return bool|Json
							 | 
						||
| 
								 | 
							
								     * @throws Exception
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function specCreate()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $params = input('post.');
							 | 
						||
| 
								 | 
							
								        $rules  = [
							 | 
						||
| 
								 | 
							
								            'product_type_id|商品类型' => 'require|number',
							 | 
						||
| 
								 | 
							
								            'title|规格名称'           => 'require',
							 | 
						||
| 
								 | 
							
								        ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $validate = $this->validateByApi($params, $rules);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if ($validate !== true) {
							 | 
						||
| 
								 | 
							
								            return $validate;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $count = SpecParam::where('spu_type_id', $params['product_type_id'])
							 | 
						||
| 
								 | 
							
								            ->where('title', $params['title'])
							 | 
						||
| 
								 | 
							
								            ->where('status', SpecParam::COMMON_ON)
							 | 
						||
| 
								 | 
							
								            ->count();
							 | 
						||
| 
								 | 
							
								        if ($count > 0) {
							 | 
						||
| 
								 | 
							
								            return $this->json(4000, '规格名称已存在');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $param = SpecParam::create([
							 | 
						||
| 
								 | 
							
								            'spu_type_id' => $params['product_type_id'],
							 | 
						||
| 
								 | 
							
								            'title'       => $params['title'],
							 | 
						||
| 
								 | 
							
								        ]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $specIds = SpecParam::where('spu_type_id', $params['product_type_id'])->column('id');
							 | 
						||
| 
								 | 
							
								        // 更新商品类型
							 | 
						||
| 
								 | 
							
								        SpuType::where('id', $params['product_type_id'])->save(['spec_ids' => implode(',', $specIds)]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return $this->json(200, 'success', ['id' => $param->id]);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 规格删除
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @return Json
							 | 
						||
| 
								 | 
							
								     * @throws Exception
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function specDelete(): Json
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $id = input('post.id/d', 0);
							 | 
						||
| 
								 | 
							
								        if ($id <= 0) {
							 | 
						||
| 
								 | 
							
								            return $this->json(4000, '参数错误');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        SpecParam::where('id', $id)->save(['status' => -1]);
							 | 
						||
| 
								 | 
							
								        SpecValue::where('spec_id', $id)->save(['status' => -1]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return $this->json(200, 'success');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 规格值删除
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @return Json
							 | 
						||
| 
								 | 
							
								     * @throws Exception
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function specValueDelete(): Json
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $id = input('post.id/d', 0);
							 | 
						||
| 
								 | 
							
								        if ($id <= 0) {
							 | 
						||
| 
								 | 
							
								            return $this->json(4000, '参数错误');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        SpecValue::where('id', $id)->save(['status' => -1]);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return $this->json(200, 'success');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 上传图片
							 | 
						||
| 
								 | 
							
								     *
							 | 
						||
| 
								 | 
							
								     * @return Json
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function upload(): Json
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        // 字段名 image-image避免冲突 layui组件自动生成的隐藏file input框中name容易重名冲突
							 | 
						||
| 
								 | 
							
								        $image = request()->file('file');
							 | 
						||
| 
								 | 
							
								        try {
							 | 
						||
| 
								 | 
							
								            $res        = (new Upload())->uploadImage($image);
							 | 
						||
| 
								 | 
							
								            $res['url'] = $res['src'];
							 | 
						||
| 
								 | 
							
								            return $this->json(200, '上传成功', $res);
							 | 
						||
| 
								 | 
							
								        } catch (RepositoryException $e) {
							 | 
						||
| 
								 | 
							
								            return $this->json(1, $e->getMessage());
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |