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.

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