395 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			395 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
<?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, '状态设置失败');
 | 
						||
        }
 | 
						||
    }
 | 
						||
}
 |