Files
xin-procurement/app/Http/Controllers/Client/SpecialController.php
T
2026-08-31 22:21:59 +08:00

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();
}
}