You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
5.7 KiB
142 lines
5.7 KiB
<?php
|
|
|
|
namespace App\Controller\v3;
|
|
|
|
use App\Constants\v3\Goods as GoodsConstants;
|
|
use App\Constants\v3\Store as StoreConstants;
|
|
use App\Constants\v3\Tabs;
|
|
use App\Controller\BaseController;
|
|
use App\Model\v3\Goods;
|
|
use App\Model\v3\GoodsCategory;
|
|
use App\Model\v3\Store;
|
|
use Hyperf\Utils\ApplicationContext;
|
|
|
|
/**
|
|
* 推荐商品相关
|
|
* Class GoodsRecommend
|
|
* @package App\Controller\v3
|
|
*/
|
|
class GoodsRecommendController extends BaseController
|
|
{
|
|
|
|
/**
|
|
* 获取首页tabs推荐商品列表
|
|
* 1、前端上传tab标识
|
|
* 2、根据tab标识从Elasticsearch中获取商品IDs
|
|
* 3、根据IDs获取商品数据
|
|
* 4、返回数据,id、封面图、名称、原价、现价、库存、月销、tag、规格、购物车相关、商户id、商户avatar、商户名
|
|
*/
|
|
public function getByTabsForAppletIndex()
|
|
{
|
|
$tab = $this->request->input('tab', '');
|
|
$marketId = $this->request->input('market_id', 0);
|
|
$page = $this->request->input('page', 1);
|
|
$pagesize = $this->request->input('pagesize', 10);
|
|
|
|
$storeTable = ApplicationContext::getContainer()->get(Store::class)->getTable();
|
|
$goodsTable = ApplicationContext::getContainer()->get(Goods::class)->getTable();
|
|
|
|
$builder = Goods::query()
|
|
->join($storeTable,''.$storeTable.'.id', '=', ''.$goodsTable.'.store_id')
|
|
->where([
|
|
''.$storeTable.'.is_open' => StoreConstants::IS_OPEN_YES,
|
|
''.$storeTable.'.status' => StoreConstants::STATUS_PASS,
|
|
''.$storeTable.'.is_rest' => StoreConstants::IS_REST_NO
|
|
])
|
|
->with(['store'])
|
|
->where([
|
|
''.$goodsTable.'.market_id' => $marketId,
|
|
''.$goodsTable.'.on_sale' => GoodsConstants::ON_SALE_YES
|
|
])
|
|
->whereRaw(''.$goodsTable.'.deleted_at IS NULL')
|
|
->where(function ($query) use ($goodsTable) {
|
|
$query->where(''.$goodsTable.'.inventory', '>', 0)->orWhere(''.$goodsTable.'.is_infinite', '=', 1);
|
|
});
|
|
|
|
// $builder = Goods::query()->with('store')
|
|
// ->where('market_id', $marketId)
|
|
// ->where(function ($query) {
|
|
// $query->where('inventory', '>', 0)->orWhere('is_infinite', '=', 1);
|
|
// });
|
|
|
|
switch ($tab) {
|
|
case Tabs::APPLET_INDEX_RECOMMEND:
|
|
$builder = $builder->orderBy(''.$goodsTable.'.sales', 'desc');
|
|
break;
|
|
case Tabs::APPLET_INDEX_NEW:
|
|
$builder = $builder->orderBy(''.$goodsTable.'.created_at', 'desc');
|
|
break;
|
|
case Tabs::APPLET_INDEX_FRESH:
|
|
$builder = $builder->orderBy(''.$goodsTable.'.price', 'asc');
|
|
break;
|
|
case Tabs::APPLET_INDEX_OFFICE:
|
|
$categoryIds = [97,98];
|
|
// 查询出三级分类
|
|
$goodsCategoryIds = GoodsCategory::query()->whereIn('category_id', $categoryIds)->pluck('id');
|
|
$builder = $builder->where(function ($query) use ($categoryIds, $goodsCategoryIds, $goodsTable) {
|
|
$query->whereIn(''.$goodsTable.'.category_id', $categoryIds)
|
|
->orWhereIn(''.$goodsTable.'.goods_category_id', $goodsCategoryIds);
|
|
});
|
|
break;
|
|
}
|
|
|
|
$builder->select(''.$goodsTable.'.*')->addSelect([''.$goodsTable.'.sales as total_sales']);
|
|
$paginate = $builder->groupBy(''.$goodsTable.'.id')->paginate($pagesize);
|
|
$goods = $paginate->toArray();
|
|
return $this->success(['has_more_pages' => $paginate->hasMorePages(), 'tab_data' => $goods['data']]);
|
|
|
|
}
|
|
|
|
/**
|
|
* 获取推荐商品列表
|
|
* 1、前端上传标识
|
|
* recommend_search_goods
|
|
* recommend_search_stores
|
|
* recommend_user_index
|
|
* 2、根据标识从Elasticsearch中获取商品IDs
|
|
* 3、根据IDs获取商品数据
|
|
* 4、返回数据,id、封面图、名称、原价、现价、库存、月销、tag、规格、购物车相关、商户id、商户avatar、商户名
|
|
*/
|
|
public function getByTab()
|
|
{
|
|
$marketId = $this->request->input('market_id', 0);
|
|
|
|
$storeTable = ApplicationContext::getContainer()->get(Store::class)->getTable();
|
|
$goodsTable = ApplicationContext::getContainer()->get(Goods::class)->getTable();
|
|
|
|
$goods = Goods::query()
|
|
->select(''.$goodsTable.'.*')
|
|
->addSelect(''.$goodsTable.'.sales as total_sales')
|
|
->join($storeTable,''.$storeTable.'.id', '=', ''.$goodsTable.'.store_id')
|
|
->where([
|
|
''.$storeTable.'.is_open' => StoreConstants::IS_OPEN_YES,
|
|
''.$storeTable.'.status' => StoreConstants::STATUS_PASS,
|
|
''.$storeTable.'.is_rest' => StoreConstants::IS_REST_NO
|
|
])
|
|
->with(['store'])
|
|
->where([
|
|
''.$goodsTable.'.market_id' => $marketId,
|
|
''.$goodsTable.'.on_sale' => GoodsConstants::ON_SALE_YES
|
|
])
|
|
->whereRaw(''.$goodsTable.'.deleted_at IS NULL')
|
|
->where(function ($query) use ($goodsTable) {
|
|
$query->where(''.$goodsTable.'.inventory', '>', 0)->orWhere(''.$goodsTable.'.is_infinite', '=', 1);
|
|
})
|
|
->inRandomOrder()
|
|
->limit(20)
|
|
->get()->toArray();
|
|
|
|
// $goods = Goods::query()
|
|
// ->with(['store'])
|
|
// ->where('market_id', $marketId)
|
|
// ->where(function ($query) {
|
|
// $query->where('inventory', '>', 0)->orWhere('is_infinite', '=', 1);
|
|
// })
|
|
// ->inRandomOrder()
|
|
// ->limit(20)
|
|
// ->get()->toArray();
|
|
return $this->success(['has_more_pages' => false, 'tab_data' => $goods]);
|
|
}
|
|
|
|
|
|
}
|