280 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			280 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
| <?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());
 | |
|         }
 | |
|     }
 | |
| } |