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