caipan_shop_admin/app/controller/manager/mall/Sku.php

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