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