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.

160 lines
6.0 KiB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
  1. <?php
  2. namespace App\Service\v3\Implementations;
  3. use App\Constants\v3\Goods as GoodsConstants;
  4. use App\Model\v3\Category;
  5. use App\Model\v3\Goods;
  6. use App\Model\v3\GoodsCategory;
  7. use App\Model\v3\Store;
  8. use App\Service\v3\Interfaces\SearchServiceInterface;
  9. use Hyperf\Paginator\Paginator;
  10. use Hyperf\Utils\ApplicationContext;
  11. use App\Constants\v3\Store as StoreConstants;
  12. class SearchService implements SearchServiceInterface
  13. {
  14. public function doForGoods($params)
  15. {
  16. $storeTable = ApplicationContext::getContainer()->get(Store::class)->getTable();
  17. $goodsTable = ApplicationContext::getContainer()->get(Goods::class)->getTable();
  18. $builder = Goods::query()
  19. ->join($storeTable,''.$storeTable.'.id', '=', ''.$goodsTable.'.store_id')
  20. ->where([
  21. ''.$storeTable.'.is_open' => StoreConstants::IS_OPEN_YES,
  22. ''.$storeTable.'.status' => StoreConstants::STATUS_PASS,
  23. ''.$storeTable.'.is_rest' => StoreConstants::IS_REST_NO
  24. ])
  25. ->with(['store'])
  26. ->where([''.$goodsTable.'.market_id' => $params['market_id']])
  27. ->where(function ($query) use ($goodsTable) {
  28. $query->where(''.$goodsTable.'.inventory', '>', 0)->orWhere(''.$goodsTable.'.is_infinite', '=', 1);
  29. });
  30. if (isset($params['store_id']) && $params['store_id']) {
  31. $builder->where([''.$goodsTable.'.store_id' => $params['store_id']]);
  32. }
  33. if (isset($params['type_id']) && $params['type_id']) {
  34. $typeIds = explode(',', $params['type_id']);
  35. $builder->whereIn(''.$goodsTable.'.category_id', $typeIds);
  36. }
  37. if (isset($params['goods_category_ids']) && $params['goods_category_ids']) {
  38. $typeIds = explode(',', $params['goods_category_ids']);
  39. $builder->whereIn(''.$goodsTable.'.goods_category_id', $typeIds);
  40. }
  41. if (isset($params['keyword']) && $params['keyword']) {
  42. // 二级分类
  43. $categoryIds = Category::query()->where('title', 'like', '%'.$params['keyword'].'%')->pluck('id');
  44. // 三级分类
  45. $goodsCategoryIds = GoodsCategory::query()->where('title', 'like', '%'.$params['keyword'].'%')->pluck('id');
  46. $builder->where(function ($query) use ($params, $categoryIds, $goodsCategoryIds, $goodsTable) {
  47. $query->where(''.$goodsTable.'.name', 'like', '%'.$params['keyword'].'%')
  48. ->orWhereIn(''.$goodsTable.'.category_id', $categoryIds)
  49. ->orWhereIn(''.$goodsTable.'.goods_category_id', $goodsCategoryIds);
  50. });
  51. }
  52. if (isset($params['order_by']) && $params['order_by']) {
  53. $sort = $params['sort'] ?? 'desc';
  54. switch ($params['order_by']) {
  55. case 'sales':
  56. $builder->orderBySales($sort);
  57. break;
  58. case 'price':
  59. $builder->orderByPrice($sort);
  60. break;
  61. default:
  62. $builder->orderByDefault($sort);
  63. break;
  64. }
  65. }
  66. $builder->select(''.$goodsTable.'.*')->addSelect([''.$goodsTable.'.sales as total_sales']);
  67. $paginate = $builder->groupBy(''.$goodsTable.'.id')->paginate($params['pagesize']);
  68. $goods = $paginate->toArray();
  69. return ['has_more_pages' => $paginate->hasMorePages(), 'goods' => $goods['data']];
  70. }
  71. public function doForStores($params)
  72. {
  73. $storeTable = ApplicationContext::getContainer()->get(Store::class)->getTable();
  74. $goodsTable = ApplicationContext::getContainer()->get(Goods::class)->getTable();
  75. $builder = Store::query()
  76. ->select(''.$storeTable.'.*')
  77. ->join($goodsTable,''.$storeTable.'.id', '=', ''.$goodsTable.'.store_id')
  78. ->where([''.$goodsTable.'.on_sale' => GoodsConstants::ON_SALE_YES])
  79. ->where([''.$goodsTable.'.market_id' => $params['market_id']])
  80. ->where(function ($query) use ($goodsTable) {
  81. $query->where(''.$goodsTable.'.inventory', '>', 0)->orWhere(''.$goodsTable.'.is_infinite', '=', 1);
  82. })
  83. // ->with(['goods' => function($query) {
  84. // return $query->select(['*'])->addSelect(['sales as total_sales']);
  85. // }])
  86. ->where([''.$storeTable.'.market_id' => $params['market_id']]);
  87. if (isset($params['store_id']) && $params['store_id']) {
  88. $builder->where([''.$storeTable.'.store_id' => $params['store_id']]);
  89. }
  90. if (isset($params['type_id']) && $params['type_id']) {
  91. $builder->where([''.$storeTable.'.category_id' => $params['type_id']]);
  92. }
  93. if (isset($params['keyword']) && $params['keyword']) {
  94. $builder->where(''.$storeTable.'.name', 'like', '%'.$params['keyword'].'%');
  95. }
  96. if (isset($params['order_by']) && $params['order_by']) {
  97. $sort = $params['sort'] ?? 'desc';
  98. switch ($params['order_by']) {
  99. case 'sales':
  100. $builder->orderBySales($sort);
  101. break;
  102. default:
  103. $builder->orderByDefault($sort);
  104. break;
  105. }
  106. }
  107. $paginate = $builder->groupBy(''.$storeTable.'.id')->paginate($params['pagesize']);
  108. $stores = $paginate->map(function ($item, $key) {
  109. $item->goods;
  110. return $item;
  111. })->all();
  112. return ['has_more_pages' => $paginate->hasMorePages(), 'stores' => $stores];
  113. }
  114. public function getHotKeywords($type)
  115. {
  116. $keywords = [
  117. 'goods' => ['酱油','油','生蚝'],
  118. 'store' => ['黄姐','王姐','黄姐蔬菜摊'],
  119. ];
  120. return $keywords[$type];
  121. }
  122. public function do()
  123. {
  124. // TODO: Implement do() method.
  125. }
  126. public function check()
  127. {
  128. // TODO: Implement check() method.
  129. }
  130. public function undo()
  131. {
  132. // TODO: Implement undo() method.
  133. }
  134. }