Files
orico-official-website/app/admin/controller/v1/ProductAttr.php
2025-02-21 15:45:17 +08:00

201 lines
5.5 KiB
PHP

<?php
declare (strict_types = 1);
namespace app\admin\controller\v1;
use app\admin\model\v1\ProductAttrModel;
use app\admin\model\v1\ProductAttrPropModel;
use app\admin\validate\v1\ProductAttrValidate;
/**
* 产品属性管理控制器
*/
class ProductAttr
{
/**
* 属性列表
*/
public function index()
{
$params = request()->param([
'keywords' => '',
'page/d' => 1,
'size/d' => 10
]);
$attrs = ProductAttrModel::withoutField([
'language_id',
'created_at',
'updated_at',
'deleted_at',
])
->with(['props' => function ($query) {
$query->withoutField(['created_at'])->hidden(['attr_id']);
}])
->language(request()->lang_id)
->withSearch(['attr_name_nullable'], [
'attr_name_nullable' => $params['keywords']??null,
]);
if (!request()->has('scene')) {
$attrs = $attrs->paginate([
'list_rows' => $params['size'],
'page' => $params['page'],
]);
} else if ('list' == request()->param('scene')) {
$attrs = $attrs->select();
}
return success("获取成功", $attrs);
}
/**
* 属性详情
*/
public function read()
{
$id = request()->param('id');
$attr = ProductAttrModel::withoutField([
'language_id',
'created_at',
'updated_at',
'deleted_at',
])
->with(['props' => function ($query) {
$query->withoutField(['created_at'])->hidden(['attr_id']);
}])
->find($id);
if (empty($attr)) {
return error("获取失败");
}
return success("获取成功", $attr);
}
/**
* 属性新增
*/
public function save()
{
$post = request()->post([
'attr_type' => 2,
'attr_name' => '',
'is_system' => 0,
]);
$attr = array_merge($post, ['language_id' => request()->lang_id]);
// $[*].prop_name
// $[*].prop_value
$props = json_decode(request()->post('props/s', ''), true);
// 检验参数
$validate = new ProductAttrValidate;
$check_data = array_merge($attr, ['props' => $props]);
if (!$validate->check($check_data)) {
return error($validate->getError());
}
ProductAttrModel::startTrans();
try {
// 添加属性
$attr_ret = ProductAttrModel::create($attr);
if ($attr_ret->isEmpty()) {
throw new \Exception("操作失败");
}
// 添加属性特征
if (!empty($props)) {
foreach ($props as &$prop) {
$prop['attr_id'] = $attr_ret->id;
}
unset($prop);
$props_ret = (new ProductAttrPropModel)->saveAll($props);
if ($props_ret->isEmpty()) {
throw new \Exception("操作失败");
}
}
ProductAttrModel::commit();
} catch (\Throwable $th) {
ProductAttrModel::rollback();
return error($th->getMessage());
}
return success("操作成功");
}
/**
* 属性更新
*/
public function update()
{
$id = request()->param('id');
$put = request()->put([
'attr_type',
'attr_name',
'is_system' => 0,
]);
$attr = array_merge($put, ['language_id' => request()->lang_id]);
// $[*].prop_name
// $[*].prop_value
$props = json_decode(request()->post('props/s', ''), true);
// 检验参数
$validate = new ProductAttrValidate;
$check_data = array_merge($attr, ['id' => $id], ['props' => $props]);
if (!$validate->check($check_data)) {
return error($validate->getError());
}
ProductAttrModel::startTrans();
try {
// 更新属性
$attr_ret = ProductAttrModel::bypk($id)->find();
if ($attr_ret->isEmpty()) {
throw new \Exception("请确认操作对象是否正确");
}
if (!$attr_ret->save($attr)) {
throw new \Exception("操作失败");
}
// 删除旧属性特征
ProductAttrPropModel::attrId($attr_ret->id)->delete();
// 保存新属性特征
foreach ($props as &$prop) {
$prop['attr_id'] = $attr_ret->id;
}
unset($prop);
$props_ret = (new ProductAttrPropModel)->saveAll($props);
if ($props_ret->isEmpty()) {
throw new \Exception("操作失败");
}
ProductAttrModel::commit();
} catch (\Throwable $th) {
ProductAttrModel::rollback();
return error($th->getMessage());
}
return success("操作成功");
}
/**
* 属性删除
*/
public function delete()
{
$id = request()->param('id');
// 删除属性
$attr = ProductAttrModel::bypk($id)->find();
if (empty($attr)) {
return error("请确认操作对象是否正确");
}
if (!$attr->delete()) {
return error("操作失败");
}
return success("操作成功");
}
}