作者 赵彬吉

update

... ... @@ -25,7 +25,7 @@ class AttrController extends BaseController
$map[] = ['title', 'like', "%{$this->param['search']}%"];
}
$sort = ['id' => 'desc'];
$data = $logic->getList($map, $sort, ['id', 'title', 'remark', 'value_num']);
$data = $logic->getList($map, $sort, ['id', 'title', 'attrs']);
return $this->success($data);
}
... ... @@ -36,7 +36,7 @@ class AttrController extends BaseController
'id.required' => 'ID不能为空'
]);
$data = $logic->getInfo($this->param['id']);
return $this->success(Arr::twoKeepKeys($data, ['id', 'title', 'remark', 'values']));
return $this->success(Arr::twoKeepKeys($data, ['id', 'title', 'attrs']));
}
public function save(AttrRequest $request, AttrLogic $logic)
... ...
... ... @@ -28,7 +28,7 @@ class KeywordController extends BaseController
$sort = ['id' => 'desc'];
$data = $logic->getList($map, $sort, ['id', 'title', 'seo_title', 'seo_keywords', 'seo_description', 'status', 'created_at']);
foreach ($data['list'] as &$v){
$v['product_num'] = $logic->getProductNum($v['title']);
$v['product_num'] = $logic->getProductNum($v['id']);
$v['tdk'] = boolval($v['seo_title']) * boolval($v['seo_keywords']) * boolval($v['seo_description']);
//todo 获取域名 拼接链接
$v['url'] = $v['route'];
... ...
... ... @@ -9,6 +9,7 @@ use App\Http\Controllers\Bside\BaseController;
use App\Http\Logic\Bside\Product\ProductLogic;
use App\Http\Requests\Bside\Product\ProductRequest;
use App\Models\Product\CategoryRelated;
use App\Models\Product\KeywordRelated;
use App\Rules\Ids;
use Illuminate\Http\Request;
... ... @@ -34,6 +35,10 @@ class ProductController extends BaseController
$ids = CategoryRelated::where('cate_id', $this->param['category_id'])->pluck('product_id')->toArray();
$map[] = ['id', 'in', $ids];
}
if(!empty($this->param['keyword_id'])){
$ids = KeywordRelated::where('keyword_id', $this->param['keyword_id'])->pluck('product_id')->toArray();
$map[] = ['id', 'in', $ids];
}
if(isset($this->param['status'])){
$map[] = ['status', $this->param['status']];
}
... ...
... ... @@ -36,10 +36,11 @@ class InquiryLogic extends BaseLogic
public function save($param)
{
//todo 根据域名 判断 project_id
$param['ip_info'] = Arr::s2a($param['ip_info']);
$param['ip'] = $param['ip_info']['ip'] ?? '';
$param['ip_country'] = $param['ip_info']['country'] ?? '';
return parent::save($param);
Logic::save($param);
}
}
... ...
... ... @@ -4,8 +4,6 @@ namespace App\Http\Logic\Bside\Product;
use App\Http\Logic\Bside\BaseLogic;
use App\Models\Product\Attr;
use App\Models\Product\AttrValue;
use Illuminate\Support\Facades\DB;
/**
* Class AttrLogic
... ... @@ -22,47 +20,5 @@ class AttrLogic extends BaseLogic
$this->model = new Attr();
}
public function getInfo($id){
$info = parent::getCacheInfo($id);
if(!$info){
$this->fail('数据不存在或者已经删除');
}
$info->values;
return $this->success($info->toArray());
}
public function save($param){
$param['values'] = array_unique($param['values']);
DB::beginTransaction();
try {
//删除之前的参数值
if(!empty($param['id'])){
AttrValue::where('attr_id', $param['id'])->delete();
}
//保存参数名称
$data = $param;
unset($data['values']);
$data['value_num'] = count($param['values']);
$res = parent::save($data);
$attr_id = $res['id'];
//保存参数值
$values = [];
foreach ($param['values'] as $value){
$values[] = [
'attr_id' => $attr_id,
'value' => $value
];
}
AttrValue::insert($values);
DB::commit();
}catch (\Exception $e){
DB::rollBack();
errorLog('产品参数保存失败', $param, $e);
$this->fail('保存失败');
}
return $this->success();
}
}
... ...
... ... @@ -65,7 +65,6 @@ class CategoryLogic extends BaseLogic
*/
public function getProductNum($cate_id){
$cate_ids = $this->model->getChildIdsArr($cate_id);
$product_ids = CategoryRelated::whereIn('cate_id', $cate_ids)->pluck('id');
return Product::whereIn('id', $product_ids)->count();
return CategoryRelated::whereIn('cate_id', $cate_ids)->count();
}
}
... ...
... ... @@ -4,7 +4,7 @@ namespace App\Http\Logic\Bside\Product;
use App\Helper\Arr;
use App\Http\Logic\Bside\BaseLogic;
use App\Models\Product\Product;
use App\Models\Product\KeywordRelated;
use App\Models\RouteMap;
use App\Models\Product\Keyword;
use Illuminate\Support\Facades\DB;
... ... @@ -47,6 +47,16 @@ class KeywordLogic extends BaseLogic
parent::delete($ids);
foreach ($ids as $id){
$info = $this->getCacheInfo($id);
if(!$info){
continue;
}
//是否有对应商品
if(KeywordRelated::where('keyword_id', $id)->count()){
$this->fail("关键词{$info['title']}存在产品,不能删除");
}
//删除路由映射
RouteMap::delRoute(RouteMap::SOURCE_PRODUCT_KEYWORD, $id, $this->user['project_id']);
}
... ... @@ -60,7 +70,7 @@ class KeywordLogic extends BaseLogic
return $this->success();
}
public function getProductNum($title){
return Product::whereRaw("find_in_set('{$title}',`keywords`)")->count();
public function getProductNum($keyword_id){
return KeywordRelated::where('keyword_id', $keyword_id)->count();
}
}
... ...
... ... @@ -6,6 +6,7 @@ use App\Helper\Arr;
use App\Http\Logic\Bside\BaseLogic;
use App\Http\Logic\Bside\User\UserLogic;
use App\Models\Product\CategoryRelated;
use App\Models\Product\KeywordRelated;
use App\Models\Product\Product;
use App\Models\RouteMap;
use Illuminate\Support\Facades\DB;
... ... @@ -62,6 +63,8 @@ class ProductLogic extends BaseLogic
$res = parent::save($data);
//关联分类
CategoryRelated::saveRelated($res['id'], $data['category_id']);
//关联关键词
KeywordRelated::saveRelated($res['id'], $data['keyword_id']);
//路由映射
RouteMap::setRoute($param['route'], RouteMap::SOURCE_PRODUCT, $res['id'], $this->user['project_id']);
DB::commit();
... ... @@ -86,6 +89,9 @@ class ProductLogic extends BaseLogic
//删除分类关联
CategoryRelated::where('product_id', $id)->delete();
//删除关键词关联
KeywordRelated::where('product_id', $id)->delete();
}
DB::commit();
... ...
... ... @@ -31,8 +31,16 @@ class AttrRequest extends FormRequest
{
return [
'title' => 'required|max:50',
'remark' => 'max:200',
'values' => 'required|array'
'attrs' => ['required', 'array', function ($attribute, $value, $fail) {
foreach ($value as $v) {
if (empty($v['key'])) {
$fail('属性名不能为空');
}
if (empty($v['value'])) {
$fail('属性值不能为空');
}
}
}]
];
}
... ... @@ -41,9 +49,8 @@ class AttrRequest extends FormRequest
return [
'title.required' => '请输入参数名称',
'title.max' => '参数名称不能超过50个字符',
'remark.max' => '备注不能超过200个字符',
'values.required' => '请添加参数值',
'values.array' => '参数值格式异常',
'attrs.required' => '请添加属性参数',
'attrs.array' => '属性参数格式异常',
];
}
... ...
... ... @@ -2,6 +2,7 @@
namespace App\Models\Product;
use App\Helper\Arr;
use App\Models\Base;
use Illuminate\Database\Eloquent\SoftDeletes;
... ... @@ -9,12 +10,24 @@ class Attr extends Base
{
use SoftDeletes;
protected $appends = ['attr_num'];
//设置关联表名
protected $table = 'gl_product_attr';
public function values()
public function setAttrsAttribute($value)
{
$this->attributes['attrs'] = Arr::a2s($value);
}
public function getAttrsAttribute($value)
{
return Arr::s2a($value);
}
public function getAttrNumAttribute()
{
return $this->hasMany(AttrValue::class, 'attr_id', 'id')->orderBy('id');
return count($this->attrs);
}
}
... ...
<?php
namespace App\Models\Product;
use App\Models\Base;
class AttrValue extends Base
{
//设置关联表名
protected $table = 'gl_product_attr_value';
}
<?php
namespace App\Models\Product;
use App\Helper\Arr;
use App\Models\Base;
class KeywordRelated extends Base
{
//设置关联表名
protected $table = 'gl_product_keyword_related';
const CREATED_AT = null;
const UPDATED_AT = null;
/**
* 关联产品关键词
* @param $product_id
* @param $keyword_ids
* @author zbj
* @date 2023/5/4
*/
public static function saveRelated($product_id, $keyword_ids)
{
if(!is_array($keyword_ids)){
$keyword_ids = array_filter(Arr::splitFilterToArray($keyword_ids), 'intval');
}
//先删除
self::where('product_id', $product_id)->delete();
//批量保存
$data = [];
foreach ($keyword_ids as $keyword_id){
$data[] = [
'product_id' => $product_id,
'keyword_id' => $keyword_id
];
}
self::insert($data);
}
}
... ...