113 lines
3.8 KiB
PHP
113 lines
3.8 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Client;
|
|
|
|
use App\Exceptions\RepositoryException;
|
|
use App\Http\Requests\Client\SpecialBatchAddRequest;
|
|
use App\Http\Requests\Client\SpecialFormRequest;
|
|
use App\Models\HomeSpecialModel;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
use Modules\AnnoRoute\Attribute\DeleteRoute;
|
|
use Modules\AnnoRoute\Attribute\GetRoute;
|
|
use Modules\AnnoRoute\Attribute\PostRoute;
|
|
use Modules\AnnoRoute\Attribute\PutRoute;
|
|
use Modules\AnnoRoute\Attribute\RequestAttribute;
|
|
use Modules\Common\Http\Controllers\BaseController;
|
|
|
|
/**
|
|
* 特价推荐商品配置(小程序首页)
|
|
*/
|
|
#[RequestAttribute('/client/special', 'client.special')]
|
|
class SpecialController extends BaseController
|
|
{
|
|
protected array $searchField = [
|
|
'status' => '=',
|
|
];
|
|
|
|
/** 推荐列表(默认按排序升序;keyword 按商品名模糊搜索) */
|
|
#[GetRoute(authorize: 'query')]
|
|
public function query(Request $request): JsonResponse
|
|
{
|
|
$params = $request->all();
|
|
$pageSize = $params['pageSize'] ?? 10;
|
|
$query = $this->buildSearch($params, HomeSpecialModel::query()->with('product'));
|
|
|
|
$keyword = trim((string) ($params['keyword'] ?? ''));
|
|
if ($keyword !== '') {
|
|
$query->whereHas('product', static function ($q) use ($keyword) {
|
|
$q->where('name', 'like', '%' . $keyword . '%');
|
|
});
|
|
}
|
|
|
|
$data = $query->orderBy('sort')
|
|
->orderBy('id')
|
|
->paginate($pageSize)
|
|
->toArray();
|
|
return $this->success($data);
|
|
}
|
|
|
|
/** 批量添加推荐商品(已在推荐中的自动跳过) */
|
|
#[PostRoute('/batch', 'create')]
|
|
public function batchAdd(SpecialBatchAddRequest $request): JsonResponse
|
|
{
|
|
$productIds = $request->validated()['product_ids'];
|
|
$exists = HomeSpecialModel::whereIn('product_id', $productIds)->pluck('product_id')->all();
|
|
$newIds = array_values(array_diff($productIds, $exists));
|
|
|
|
foreach ($newIds as $productId) {
|
|
HomeSpecialModel::create([
|
|
'product_id' => $productId,
|
|
'sort' => 0,
|
|
'status' => HomeSpecialModel::STATUS_NORMAL,
|
|
]);
|
|
}
|
|
|
|
return $this->success([
|
|
'added' => count($newIds),
|
|
'skipped' => count($productIds) - count($newIds),
|
|
]);
|
|
}
|
|
|
|
/** 编辑推荐(仅排序与状态) */
|
|
#[PutRoute(route: '/{id}', authorize: 'update', where: ['id' => '[0-9]+'])]
|
|
public function update(int $id, SpecialFormRequest $request): JsonResponse
|
|
{
|
|
$model = HomeSpecialModel::find($id);
|
|
if (empty($model)) {
|
|
throw new RepositoryException('推荐不存在');
|
|
}
|
|
$model->update($request->validated());
|
|
return $this->success();
|
|
}
|
|
|
|
/** 删除推荐 */
|
|
#[DeleteRoute(route: '/{id}', authorize: 'delete', where: ['id' => '[0-9]+'])]
|
|
public function delete(int $id): JsonResponse
|
|
{
|
|
$model = HomeSpecialModel::find($id);
|
|
if (empty($model)) {
|
|
throw new RepositoryException('推荐不存在');
|
|
}
|
|
$model->delete();
|
|
return $this->success();
|
|
}
|
|
|
|
/** 批量删除推荐 */
|
|
#[DeleteRoute('/batch', 'delete')]
|
|
public function batchDelete(Request $request): JsonResponse
|
|
{
|
|
$data = $request->validate([
|
|
'ids' => 'required|array|min:1',
|
|
'ids.*' => 'integer|distinct',
|
|
], [
|
|
'ids.required' => '请选择要删除的推荐',
|
|
'ids.min' => '请选择要删除的推荐',
|
|
'ids.*.integer' => '推荐 ID 格式错误',
|
|
'ids.*.distinct' => '存在重复的推荐',
|
|
]);
|
|
HomeSpecialModel::whereIn('id', $data['ids'])->delete();
|
|
return $this->success();
|
|
}
|
|
}
|