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.

162 lines
6.1 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. ->where([
  26. ''.$goodsTable.'.market_id' => $params['market_id'],
  27. ''.$goodsTable.'.on_sale' => GoodsConstants::ON_SALE_YES
  28. ])
  29. ->whereRaw(''.$goodsTable.'.deleted_at IS NULL')
  30. ->with(['store'])
  31. ->where(function ($query) use ($goodsTable) {
  32. $query->where(''.$goodsTable.'.inventory', '>', 0)->orWhere(''.$goodsTable.'.is_infinite', '=', 1);
  33. });
  34. if (isset($params['store_id']) && $params['store_id']) {
  35. $builder->where([''.$goodsTable.'.store_id' => $params['store_id']]);
  36. }
  37. if (isset($params['type_id']) && $params['type_id']) {
  38. $typeIds = explode(',', $params['type_id']);
  39. $builder->whereIn(''.$goodsTable.'.category_id', $typeIds);
  40. }
  41. if (isset($params['goods_category_ids']) && $params['goods_category_ids']) {
  42. $typeIds = explode(',', $params['goods_category_ids']);
  43. $builder->whereIn(''.$goodsTable.'.goods_category_id', $typeIds);
  44. }
  45. if (isset($params['keyword']) && $params['keyword']) {
  46. // 二级分类
  47. $categoryIds = Category::query()->where('title', 'like', '%'.$params['keyword'].'%')->pluck('id');
  48. // 三级分类
  49. $goodsCategoryIds = GoodsCategory::query()->where('title', 'like', '%'.$params['keyword'].'%')->pluck('id');
  50. $builder->where(function ($query) use ($params, $categoryIds, $goodsCategoryIds, $goodsTable) {
  51. $query->where(''.$goodsTable.'.name', 'like', '%'.$params['keyword'].'%')
  52. ->orWhereIn(''.$goodsTable.'.category_id', $categoryIds)
  53. ->orWhereIn(''.$goodsTable.'.goods_category_id', $goodsCategoryIds);
  54. });
  55. }
  56. if (isset($params['order_by']) && $params['order_by']) {
  57. $sort = $params['sort'] ?? 'desc';
  58. switch ($params['order_by']) {
  59. case 'sales':
  60. $builder->orderBySales($sort);
  61. break;
  62. case 'price':
  63. $builder->orderByPrice($sort);
  64. break;
  65. default:
  66. $builder->orderByDefault($sort);
  67. break;
  68. }
  69. }
  70. $builder->select(''.$goodsTable.'.*')->addSelect([''.$goodsTable.'.sales as total_sales']);
  71. $paginate = $builder->groupBy(''.$goodsTable.'.id')->paginate($params['pagesize']);
  72. $goods = $paginate->toArray();
  73. return ['has_more_pages' => $paginate->hasMorePages(), 'goods' => $goods['data']];
  74. }
  75. public function doForStores($params)
  76. {
  77. $storeTable = ApplicationContext::getContainer()->get(Store::class)->getTable();
  78. $goodsTable = ApplicationContext::getContainer()->get(Goods::class)->getTable();
  79. $builder = Store::query()
  80. ->select(''.$storeTable.'.*')
  81. ->join($goodsTable,''.$storeTable.'.id', '=', ''.$goodsTable.'.store_id')
  82. ->where([''.$goodsTable.'.on_sale' => GoodsConstants::ON_SALE_YES])
  83. ->where([''.$goodsTable.'.market_id' => $params['market_id']])
  84. ->where(function ($query) use ($goodsTable) {
  85. $query->where(''.$goodsTable.'.inventory', '>', 0)->orWhere(''.$goodsTable.'.is_infinite', '=', 1);
  86. })
  87. ->whereRaw(''.$goodsTable.'.deleted_at IS NULL')
  88. ->where([''.$storeTable.'.market_id' => $params['market_id']]);
  89. if (isset($params['store_id']) && $params['store_id']) {
  90. $builder->where([''.$storeTable.'.store_id' => $params['store_id']]);
  91. }
  92. if (isset($params['type_id']) && $params['type_id']) {
  93. $builder->where([''.$storeTable.'.category_id' => $params['type_id']]);
  94. }
  95. if (isset($params['keyword']) && $params['keyword']) {
  96. $builder->where(''.$storeTable.'.name', 'like', '%'.$params['keyword'].'%');
  97. }
  98. if (isset($params['order_by']) && $params['order_by']) {
  99. $sort = $params['sort'] ?? 'desc';
  100. switch ($params['order_by']) {
  101. case 'sales':
  102. $builder->orderBySales($sort);
  103. break;
  104. default:
  105. $builder->orderByDefault($sort);
  106. break;
  107. }
  108. }
  109. $paginate = $builder->groupBy(''.$storeTable.'.id')->paginate($params['pagesize']);
  110. $stores = $paginate->map(function ($item, $key) {
  111. $item->goods;
  112. return $item;
  113. })->all();
  114. return ['has_more_pages' => $paginate->hasMorePages(), 'stores' => $stores];
  115. }
  116. public function getHotKeywords($type)
  117. {
  118. $keywords = [
  119. 'goods' => ['酱油','油','生蚝'],
  120. 'store' => ['黄姐','王姐','黄姐蔬菜摊'],
  121. ];
  122. return $keywords[$type];
  123. }
  124. public function do()
  125. {
  126. // TODO: Implement do() method.
  127. }
  128. public function check()
  129. {
  130. // TODO: Implement check() method.
  131. }
  132. public function undo()
  133. {
  134. // TODO: Implement undo() method.
  135. }
  136. }