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.

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