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.

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