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

488 lines
14 KiB
PHP
Raw Normal View History

2022-05-25 11:35:57 +00:00
<?php
namespace app\controller\manager\mall;
use app\controller\manager\Base;
use app\exception\RepositoryException;
use app\model\Config;
use app\model\Log;
use app\model\mall\SpuCategoryPivot;
use app\model\Sku;
use app\model\Spu as SpuModel;
use app\repository\SpuRepository;
use app\service\Math;
use Exception;
use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
use think\db\exception\ModelNotFoundException;
use think\exception\ValidateException;
use think\facade\Db;
use think\response\Json;
use think\response\View;
class Spu extends Base
{
protected $noNeedRight = ['getSpuList', 'getSkuList', 'checkActivity', 'getSpu'];
/**
* @throws ModelNotFoundException
* @throws DbException
* @throws DataNotFoundException
* @throws Exception
*/
public function index()
{
if ($this->request->isPost()) {
$params = input();
$res = SpuRepository::getInstance()->list($params);
$res['list'] = $res['list']->each(function ($item) {
$text = $item->saleable ? '已上架' : '已下架';
if ($item->is_activity > 0) {
$activityText = SpuModel::activityTextList()[$item->activity_type];
$text = '<span style="color: red;">'.$text.' '.$activityText.'中</span>';
}
$item->saleable_text = $text;
});
return $this->json(0, 'success', $res);
}
$this->data['mpPath'] = Config::MINI_PATH_SPU_INFO;;
$this->data['statusList'] = SpuModel::statusTextList();
$this->data['spuTypeList'] = SpuModel::spuTypeTextList();
return $this->view();
}
/**
* @throws ModelNotFoundException
* @throws DbException
* @throws DataNotFoundException
* @throws Exception
*/
public function score()
{
if ($this->request->isPost()) {
$params = input();
$params['type'] = SpuModel::TYPE_SCORE;
$res = SpuRepository::getInstance()->list($params);
$res['list'] = $res['list']->each(function ($item) {
$text = $item->saleable ? '已上架' : '已下架';
$item->saleable_text = $text;
});
return $this->json(0, 'success', $res);
}
$this->data['mpPath'] = Config::MINI_PATH_SPU_INFO;;
$this->data['statusList'] = SpuModel::statusTextList();
$this->data['spuTypeList'] = SpuModel::spuTypeTextList();
$this->data['url'] = '/manager/mall/spu/score';
$this->data['type'] = SpuModel::TYPE_SCORE;
return $this->view('manager/mall/spu/index');
}
/**
* 添加
*
* @return Json|View
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public function add()
{
$repo = SpuRepository::getInstance();
$type = input('type', SpuModel::TYPE_NORMAL);
if ($this->request->isPost()) {
$item = $this->request->param('item/a', []);
$item['is_score'] = $type == SpuModel::TYPE_SCORE;
$item['is_activity'] = in_array($type, SpuModel::activityList());
$item['activity_type'] = $type;
$multiSpec = input('post.is_attribute');// 是否多规格 0否 1是
$skus = input('post.skus');//规格数据
$item['spu_type_id'] = input('post.product_type');//商品类型ID
$item['multi_spec'] = $multiSpec;
if ($multiSpec == SpuModel::COMMON_OFF) {
$skus = [$skus];
}
try {
$this->checkData($item, $skus);
$repo->addSpu($item, $skus);
} catch (RepositoryException $e) {
return $this->json(4002, $e->getMessage());
} catch (Exception $e) {
}
return $this->json();
}
$categoryList = $repo->categoryXmSelect([], [], true);
$this->data['statusList'] = SpuModel::statusTextList();
$this->data['spuTypeList'] = SpuModel::spuTypeTextList();
$this->data['limitList'] = SpuModel::limitList();
$this->data['categoryJson'] = json_encode($categoryList, JSON_UNESCAPED_UNICODE);
$this->data['type'] = $type;
$this->data['isScore'] = $type === SpuModel::TYPE_SCORE;
return $this->view();
}
/**
* 检测商品是否处于活动
*
* @return Json
* @throws RepositoryException
*/
public function checkActivity(): Json
{
$repo = SpuRepository::getInstance();
$id = $this->request->param('id/d', 0);
$spu = $repo->findById($id);
if (empty($spu)) {
return $this->json(4000, '没有相关的商品记录!');
}
if ($spu->is_activity > 0) {
$activityText = SpuModel::activityTextList()[$spu['activity_type']] ?? '';
$msg = '该商品正在参与'.$activityText.'活动 无法进行此操作!';
return $this->json(4000, $msg);
}
return $this->json();
}
/**
* @throws DataNotFoundException
* @throws ModelNotFoundException
* @throws DbException|RepositoryException
*/
public function edit()
{
$repo = SpuRepository::getInstance();
$id = $this->request->param('id/d', 0);
$spu = $repo->findById($id);
if (empty($spu)) {
return $this->json(4000, '没有相关的商品记录!');
}
if ($spu->is_activity > 0) {
$activityText = SpuModel::activityTextList()[$spu['activity_type']] ?? '';
$msg = '该商品正在参与'.$activityText.'活动 无法进行此操作!';
if ($this->request->isPost()) {
return $this->json(4000, $msg);
} else {
return $this->error($msg);
}
}
$skuList = Sku::where('spu_id', $id)
->where('spu_activity_id', 0)
->where('enable', Sku::COMMON_ON)
->order('sort', 'asc')
->order('id', 'asc')->select()->toArray();
if ($this->request->isPost()) {
$item = $this->request->param('item/a', []);
$multiSpec = input('post.is_attribute');// 是否多规格 0否 1是
$skus = input('post.skus');//规格数据
$item['spu_type_id'] = input('post.product_type');//商品类型ID
$item['multi_spec'] = $multiSpec;
if ($multiSpec == SpuModel::COMMON_OFF) {
$skus = [$skus];
}
try {
$this->checkData($item, $skus);
$repo->editSpu($id, $item, $skus, $skuList);
} catch (RepositoryException $e) {
return $this->json(4002, $e->getMessage());
} catch (Exception $e) {
}
return $this->json();
}
$hasCategories = SpuCategoryPivot::where('spu_id', $id)->column('category_id');
$categoryList = $repo->categoryXmSelect($hasCategories, [], true);
$this->data['statusList'] = SpuModel::statusTextList();
$this->data['spuTypeList'] = SpuModel::spuTypeTextList();
$this->data['limitList'] = SpuModel::limitList();
$this->data['categoryJson'] = json_encode($categoryList, JSON_UNESCAPED_UNICODE);
$this->data['isScore'] = $spu->is_score;
$this->data['item'] = $spu;
$this->data['skuList'] = $skuList;
$this->data['id'] = $id;
return $this->view();
}
/**
* 检查数据
*
* @throws RepositoryException
* @throws Exception
*/
protected function checkData(array $item, array $skus)
{
// 基础信息验证
$validate = $this->validateByApi($item, [
'name|商品名称' => 'require|max:250',
'cover|商品封面' => 'require|max:250',
'saleable|商品状态' => 'in:0,1',
'published_at|发布日期' => 'requireIf:saleable,1|date',
'subtitle|副标题' => 'max:2000',
]);
if ($validate !== true) {
return $validate;
}
if (empty($skus)) {
throw new RepositoryException('规格信息不能为空');
}
foreach ($skus as $k) {
if ($this->validateSku($k) !== true) {
return $validate;
}
}
return $validate;
}
/**
* 获取验证结果
*
* @param $sku
* @return bool|Json
* @throws Exception
*/
protected function validateSku($sku)
{
return $this->validateByApi($sku, [
'stock' => 'require|number|gt:0',
'original_price' => 'number',
'price' => 'number',
'score' => 'number',
'is_default' => 'require|in:0,1',
]);
}
/**
* @throws ModelNotFoundException
* @throws DbException
* @throws DataNotFoundException
* @throws Exception
*/
public function modify()
{
if (!$this->request->isPost()) {
return $this->json(4000, '非法请求');
}
$item = input('post.');
$validate = $this->validateByApi($item, [
'field' => 'require',
'value' => 'require',
]);
if ($validate !== true) {
return $validate;
}
if (!$info = SpuModel::findById($item['id'])) {
return $this->json(4001, '记录不存在');
}
if ($item['field'] == 'home_display') {
$v = $item['value'] == 1 ? 'big' : 'normal';
$item['value'] = $v;
}
$update = [$item['field'] => $item['value']];
try {
$info->save($update);
return $this->json();
} catch (ValidateException $e) {
return $this->json(4001, $e->getError());
} catch (Exception $e) {
return $this->json(5000, '修改失败');
}
}
/**
* @return Json
*/
public function del(): Json
{
if (!$this->request->isPost()) {
return $this->json(4000, '非法请求');
}
$ids = $this->request->param('ids/a', []);
if (empty($ids)) {
$ids[] = $this->request->param('id/d', 0);
$ids = array_filter($ids);
}
try {
if (count($ids)) {
$count = SpuModel::whereIn('id', $ids)
->where('is_activity|saleable', SpuModel::COMMON_ON)
->count();
if ($count > 0) {
return $this->json(4002, '当前商品状态不可删除!');
}
SpuRepository::getInstance()->deleteSpu($ids);
Log::write(get_class(), 'del', '删除了商品信息涉及到的ID为'.implode(',', $ids));
}
} catch (RepositoryException $e) {
return $this->json(4001, $e->getMessage());
}
return $this->json();
}
/**
* 商品详情
*/
public function info()
{
$skuId = $this->request->param('id/d', 0);
$repo = SpuRepository::getInstance();
try {
$sku = $repo->findById($skuId, []);
} catch (RepositoryException $e) {
$sku = null;
}
$this->data['item'] = $sku;
return $this->view();
}
/**
* 商品状态下拉选项
*
* @param array $selected
* @param array $disabled
* @return false|string
*/
private function handleXmStatus(array $selected = [], array $disabled = [])
{
$items = SpuModel::statusTextList();
$list = [];
foreach ($items as $key => $val) {
$list[] = [
'name' => $val,
'value' => $key,
'selected' => in_array($key, $selected),
'disabled' => in_array($key, $disabled),
];
}
return json_encode($list, JSON_UNESCAPED_UNICODE);
}
/**
* @throws Exception
*/
public function getSpuList(): Json
{
if ($this->request->isPost()) {
$input = [
'type' => SpuModel::TYPE_NORMAL,
'saleable' => SpuModel::COMMON_ON,
'keyword' => input('keyword/s', '')
];
$data = SpuRepository::getInstance()->list($input);
return $this->json(0, 'success', $data);
}
return $this->json(4000, '操作错误');
}
/**
* @throws Exception
*/
public function getSpu(): Json
{
if ($this->request->isPost()) {
$id = input('id/d');
$data = SpuModel::findById($id, ['id', 'spu_type_id', 'multi_spec']);
return $this->json(0, 'success', $data);
}
return $this->json(4000, '操作错误');
}
/**
* @throws Exception
*/
public function getSkuList(): Json
{
if ($this->request->isPost()) {
$spuId = input('id/d', 0);
$data = Sku::where('spu_id', $spuId)->select();
$data = $data->each(function ($item) {
$item->original_price = Math::fen2Yuan($item->original_price);
$item->price = Math::fen2Yuan($item->price);
});
return $this->json(0, 'success', $data);
}
return $this->json(4000, '操作错误');
}
/**
* 批量审核
*
* @return View|Json
* @throws Exception
*/
public function check()
{
$id = input('id/s', '');
if ($this->request->isPost()) {
$ids = input('ids/s');
$check = input('is_check/d');
if (!in_array($check, [SpuModel::COMMON_ON, SpuModel::COMMON_OFF])) {
return $this->json(4001, '请选择是否展示');
}
$ids = explode(',', $ids);
Db::startTrans();
try {
(new SpuModel())->whereIn('id', $ids)->save(['is_check' => $check]);
Db::commit();
return $this->json(0, '操作成功');
} catch (Exception $e) {
Db::rollback();
Log::error('商品批量审核操作失败'.$e->getMessage());
return $this->json(5001, '商品批量审核操作失败');
}
}
$this->data['id'] = $id;
return $this->view();
}
}