refactor: banner新增相关分类数据字段

This commit is contained in:
2025-04-23 15:24:06 +08:00
parent d5b55b9782
commit 5f15a3f21b
5 changed files with 167 additions and 12 deletions

View File

@@ -3,8 +3,11 @@ declare (strict_types = 1);
namespace app\admin\controller\v1;
use app\admin\exception\InvalidOperateException;
use app\admin\model\v1\SysBannerItemModel;
use app\admin\model\v1\SysBannerProdCateMappingModel;
use app\admin\validate\v1\SysBannerItemValidate;
use think\facade\Log;
/**
* 横幅数据项控制器
@@ -67,7 +70,8 @@ class BannerItem
{
$id = request()->param('id');
$banner_item = SysBannerItemModel::withoutField([
$banner_item = SysBannerItemModel::with('prod_mapping.category')
->withoutField([
'created_at',
'updated_at',
'deleted_at'
@@ -88,6 +92,7 @@ class BannerItem
{
$post = request()->post([
'banner_id',
'rel_prod_cate_id',
'title',
'title_txt_color',
'desc',
@@ -106,8 +111,29 @@ class BannerItem
return error($validate->getError());
}
$banner_item = SysBannerItemModel::create($post);
if ($banner_item->isEmpty()) {
SysBannerItemModel::startTrans();
try {
$banner_item = SysBannerItemModel::create($post);
if ($banner_item->isEmpty()) {
throw new InvalidOperateException('新增横幅失败');
}
if (!empty($post['rel_prod_cate_id'])) {
$mapping = SysBannerProdCateMappingModel::create([
'banner_item_id' => $banner_item->id,
'product_category_id' => $post['rel_prod_cate_id']
]);
if ($mapping->isEmpty()) {
throw new InvalidOperateException('新增横幅与产品分类关联失败');
}
}
SysBannerItemModel::commit();
} catch (InvalidOperateException $e) {
SysBannerItemModel::rollback();
return error($e->getMessage());
} catch (\Throwable $th) {
SysBannerItemModel::rollback();
Log::error(sprintf('%s:%s %s', $th->getFile(), $th->getLine(), $th->getMessage()));
return error('操作失败');
}
@@ -120,6 +146,7 @@ class BannerItem
$id = request()->param('id');
$put = request()->put([
'banner_id',
'rel_prod_cate_id',
'title',
'title_txt_color',
'desc',
@@ -138,17 +165,45 @@ class BannerItem
return error($validate->getError());
}
$banner_item = SysBannerItemModel::bypk($id)->find();
if (empty($banner_item)) {
return error('请确认操作对象是否存在');
}
if ($put['type'] == 'video') {
unset($put['link']);
unset($put['link_to']);
}
if (!$banner_item->save($put)) {
SysBannerItemModel::startTrans();
try {
$banner_item = SysBannerItemModel::bypk($id)->find();
if (empty($banner_item)) {
throw new InvalidOperateException('请确认操作对象是否存在');
}
if ($put['type'] == 'video') {
unset($put['link']);
unset($put['link_to']);
}
if (!$banner_item->save($put)) {
throw new InvalidOperateException('操作失败');
}
// 更新关联的产品分类
if (!empty($put['rel_prod_cate_id'])) {
$ok = SysBannerProdCateMappingModel::where('banner_item_id', '=', $id)->delete();
if (!$ok) {
throw new InvalidOperateException('更新横幅与产品分类关联失败');
}
$mapping = SysBannerProdCateMappingModel::create([
'banner_item_id' => $id,
'product_category_id' => $put['rel_prod_cate_id']
]);
if ($mapping->isEmpty()) {
throw new InvalidOperateException('更新横幅与产品分类关联失败');
}
}
SysBannerItemModel::commit();
} catch (InvalidOperateException $e) {
SysBannerItemModel::rollback();
return error($e->getMessage());
} catch (\Throwable $th) {
SysBannerItemModel::rollback();
Log::error(sprintf('%s:%s %s', $th->getFile(), $th->getLine(), $th->getMessage()));
return error('操作失败');
}
return success('操作成功');
}