building-sign/app/controller/api/v1/Goods.php

395 lines
12 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace app\controller\api\v1;
use app\controller\api\Base;
use app\model\Account;
use app\model\GoodsArea;
use app\model\GoodsCategory;
use think\Collection;
use think\facade\Log;
use think\response\Json;
class Goods extends Base
{
protected $noNeedLogin = [
'list', 'detail', 'category', 'area'
];
// 物品列表
public function list(): Json
{
$page = input('page/d', 1);
$size = input('size/d', 20);
$keyword = input('keyword/s');
$categoryId = input('category_id/d', 0);
$areaId = input('area_id/d', 0);
$where = [];
if (!empty($keyword)) {
$where[] = ['a.nickname|g.title|gc.title|g.phone|ga.title', 'like', '%'.$keyword.'%'];
}
if ($categoryId > 0) {
$where[] = ['g.category_id', '=', $categoryId];
}
if ($areaId > 0) {
$where[] = ['g.area_id', '=', $areaId];
}
$where[] = ['g.status', '=', 0];//进行中
$query = \app\model\Goods::alias('g')
->leftJoin('goods_category gc', 'gc.id = g.category_id')
->leftJoin('account a', 'a.id = g.account_id')
->leftJoin('goods_area ga', 'ga.id = g.area_id')
->field('g.id,g.cover,g.title,g.images,price,original_price')
->where($where);
$total = $query->count();
$res = [
'total' => $total,
'current' => $page ?: 1,
'size' => $size ?: 20,
'list' => new Collection(),
];
if ($total > 0) {
$res['list'] = $query->page($page, $size)->order('g.sort', 'desc')->order('g.id', 'desc')->select();
$domain = request()->domain(true);
$res['list']->each(function ($item) use ($domain) {
$item->cover = resourceJoin((string) $item->cover, $domain);
$images = explode(',', $item->images);
foreach ($images as $k => $img) {
if (!empty($img)) {
$images[$k] = resourceJoin($img, $domain);
} else {
unset($images[$k]);
}
}
$item->images = $images;
});
}
return $this->json(0, 'success', $res);
}
// 物品详情
public function detail(): Json
{
$id = input('id/d', 0);
$field = 'g.id,g.title,g.cover,g.images,g.content,g.price,g.original_price,g.phone,ga.title as area_name,gc.title as category_name';
$item = \app\model\Goods::alias('g')
->leftJoin('goods_area ga','ga.id = g.area_id')
->leftJoin('goods_category gc','gc.id = g.category_id')
->where('g.status', 0)
->where('g.id', $id)
->field($field)
->find();
if (!$item) {
return $this->json(4004, '物品不存在或已售出');
}
$domain = request()->domain(true);
$item->cover = resourceJoin((string) $item->cover, $domain);
$images = explode(',', $item->images);
foreach ($images as &$img) {
$img = resourceJoin($img, $domain);
}
$item->images = $images;
return $this->json(0, 'success', $item);
}
/**
* 物品添加
* @return \think\response\Json
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
* @throws \Exception
*/
public function add(): Json
{
if (!$this->request->isPost()) {
return $this->json(4000, '无效请求');
}
$accountId = $this->request->user['user_id'] ?? 0;
if (!$account = Account::field('id,nickname,status')->find((int) $accountId)) {
return $this->json(6001, '请先登录');
}
if ($account['status'] != Account::STATUS_NORMAL) {
return $this->json(4003, '用户状态异常');
}
$input = input('post.');
$rules = [
'title|标题' => 'require|max:100|min:4',
'cover|封面图' => 'require',
'category_id|所属分类' => 'require',
'area_id|所属小区' => 'require',
'price|价格' => 'require|number',
];
$validate = $this->validateByApi($input, $rules);
if ($validate !== true) {
return $validate;
}
if (!isset($input['images']) && !isset($input['content'])) {
return $this->json(4005, '详情组图和内容至少填一个');
}
try {
$originalPrice = 0;
if (isset($input['original_price'])) {
$originalPrice = $input['original_price'] ?: $input['price'];
}
\app\model\Goods::create([
'title' => $input['title'],
'cover' => $input['cover'],
'category_id' => $input['category_id'],
'content' => $input['content'] ?? '',
'phone' => $input['phone'] ?? '',
'price' => $input['price'] ?? 0,
'original_price' => $originalPrice,
'account_id' => $accountId,
'area_id' => $input['area_id'] ?? 0,
'images' => $input['images'] ?? '',
'created_at' => date('Y-m-d H:i:s'),
]);
return $this->json();
} catch (\Exception $e) {
Log::error('闲置物品添加失败line '.$e->getLine().' '.$e->getMessage());
return $this->json(5000, '物品添加失败');
}
}
/**
* 物品编辑
*
* @return \think\response\Json
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
* @throws \Exception
*/
public function edit(): Json
{
if (!$this->request->isPost()) {
return $this->json(4000, '无效请求');
}
$accountId = $this->request->user['user_id'] ?? 0;
if (!$account = Account::field('id,nickname,status')->find((int) $accountId)) {
return $this->json(6001, '请先登录');
}
if ($account['status'] != Account::STATUS_NORMAL) {
return $this->json(4003, '用户状态异常');
}
$input = input('post.');
$rules = [
'id|ID' => 'require|number',
'title|标题' => 'require|max:100|min:4',
'cover|封面图' => 'require',
'category_id|所属分类' => 'require',
'area_id|所属小区' => 'require',
'price|价格' => 'require|number',
];
$validate = $this->validateByApi($input, $rules);
if ($validate !== true) {
return $validate;
}
try {
if (!$item = \app\model\Goods::find((int) $input['id'])) {
return $this->json(4004, '记录不存在');
}
if ($item['account_id'] != $accountId) {
return $this->json(4003, '不是您发布的物品');
}
if (!isset($input['images']) && !isset($input['content'])) {
return $this->json(4005, '详情组图和内容至少填一个');
}
$originalPrice = 0;
if (isset($input['original_price'])) {
$originalPrice = $input['original_price'] ?: $input['price'];
}
$item->save([
'title' => $input['title'],
'cover' => $input['cover'],
'category_id' => $input['category_id'],
'content' => $input['content'] ?? '',
'phone' => $input['phone'] ?? '',
'price' => $input['price'] ?? 0,
'original_price' => $originalPrice,
'area_id' => $input['area_id'] ?? 0,
'images' => $input['images'] ?? '',
]);
return $this->json();
} catch (\Exception $e) {
Log::error('闲置物品编辑失败line '.$e->getLine().' '.$e->getMessage());
return $this->json(5000, '物品编辑失败');
}
}
/**
* 删除
*
* @return \think\response\Json
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function del(): Json
{
if (!$this->request->isPost()) {
return $this->json(4000, '无效请求');
}
$accountId = $this->request->user['user_id'] ?? 0;
if (!$account = Account::field('id,nickname,status')->find((int) $accountId)) {
return $this->json(6001, '请先登录');
}
if ($account['status'] != Account::STATUS_NORMAL) {
return $this->json(4003, '用户状态异常');
}
$ids = input('id');
try {
$ids = explode(',', $ids);
if (!empty($ids)) {
\app\model\Goods::whereIn('id', $ids)->where('account_id', $accountId)->delete();
}
return $this->json();
} catch (\Exception $e) {
Log::error('闲置物品删除失败line '.$e->getLine().' '.$e->getMessage());
return $this->json(5000, '闲置物品删除失败');
}
}
// 小区
public function area(): Json
{
$page = input('page/d', 1);
$size = input('size/d', 20);
$keyword = input('keyword/s');
$where = [];
if (!empty($keyword)) {
$where[] = ['title', 'like', '%'.$keyword.'%'];
}
$query = GoodsArea::field('id,title')->where($where);
$total = $query->count();
$res = [
'total' => $total,
'current' => $page ?: 1,
'size' => $size ?: 20,
'list' => new Collection(),
];
if ($total > 0) {
$res['list'] = $query->page($page, $size)->order('sort', 'desc')->order('id', 'desc')->select();
}
return $this->json(0, 'success', $res);
}
// 分类
public function category(): Json
{
$keyword = input('keyword/s');
$where = [];
if (!empty($keyword)) {
$where[] = ['title', 'like', '%'.$keyword.'%'];
}
$res = GoodsCategory::field('id,title')->where($where)->order('sort', 'desc')->order('id', 'asc')->select();
return $this->json(0, 'success', $res);
}
/**
* 设置状态 0=展示 1=不展示(已完成)
*
* @return \think\response\Json
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function setStatus(): Json
{
if (!$this->request->isPost()) {
return $this->json(4000, '无效请求');
}
$accountId = $this->request->user['user_id'] ?? 0;
if (!$account = Account::field('id,nickname,status')->find((int) $accountId)) {
return $this->json(6001, '请先登录');
}
if ($account['status'] != Account::STATUS_NORMAL) {
return $this->json(4003, '用户状态异常');
}
$id = input('id/d');
$status = input('status/d', 0);
if (!in_array($status, [0, 1])) {
return $this->json(4001, '参数错误');
}
try {
if (!$item = \app\model\Goods::findById($id, ['id', 'status', 'account_id'])) {
return $this->json(4004, '物品不存在');
}
if ($item['account_id'] != $accountId) {
return $this->json(4003, '不是您发布的物品');
}
$item->save([
'status' => $status
]);
return $this->json();
} catch (\Exception $e) {
Log::error('闲置物品状态修改失败line '.$e->getLine().' '.$e->getMessage());
return $this->json(5000, '状态设置失败');
}
}
}