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.

115 lines
3.4 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
  1. <?php
  2. namespace App\Service\v3\Implementations;
  3. use App\Model\v3\Goods;
  4. use App\Model\v3\Store;
  5. use Hyperf\Paginator\Paginator;
  6. class SearchService implements \App\Service\v3\Interfaces\SearchServiceInterface
  7. {
  8. public function doForGoods($params)
  9. {
  10. $builder = Goods::query()
  11. ->with(['store' => function($query) {
  12. return $query->select(['id', 'logo', 'name']);
  13. }])
  14. ->where(['market_id' => $params['market_id']])
  15. ->where('inventory', '>', 0);
  16. if (isset($params['type_id']) && $params['type_id']) {
  17. $builder->where(['category_id' => $params['type_id']]);
  18. }
  19. if (isset($params['keyword']) && $params['keyword']) {
  20. $builder->where('name', 'like', '%'.$params['keyword'].'%');
  21. }
  22. if (isset($params['order_by']) && $params['order_by']) {
  23. $sort = $params['sort'] ?? 'desc';
  24. switch ($params['order_by']) {
  25. case 'sales':
  26. $builder->orderBySales($sort);
  27. break;
  28. case 'price':
  29. $builder->orderByPrice($sort);
  30. break;
  31. default:
  32. $builder->orderByDefault($sort);
  33. break;
  34. }
  35. }
  36. $builder->select(['*'])->addSelect(['sales as total_sales']);
  37. $paginate = $builder->paginate($params['pagesize']);
  38. $goods = $paginate->toArray();
  39. return ['has_more_pages' => $paginate->hasMorePages(), 'goods' => $goods['data']];
  40. }
  41. public function doForStores($params)
  42. {
  43. $builder = Store::query()
  44. ->with(['goods' => function($query) {
  45. return $query->limit(5)
  46. ->select(['*'])->addSelect(['sales as total_sales']);
  47. }])
  48. ->where(['market_id' => $params['market_id']]);
  49. if (isset($params['store_id']) && $params['store_id']) {
  50. $builder->where(['store_id' => $params['store_id']]);
  51. }
  52. if (isset($params['type_id']) && $params['type_id']) {
  53. $builder->where(['category_id' => $params['type_id']]);
  54. }
  55. if (isset($params['keyword']) && $params['keyword']) {
  56. $builder->where('name', 'like', '%'.$params['keyword'].'%');
  57. }
  58. if (isset($params['order_by']) && $params['order_by']) {
  59. $sort = $params['sort'] ?? 'desc';
  60. switch ($params['order_by']) {
  61. case 'sales':
  62. $builder->orderBySales($sort);
  63. break;
  64. default:
  65. $builder->orderByDefault($sort);
  66. break;
  67. }
  68. }
  69. $builder->select(['id', 'logo', 'name']);
  70. $paginate = $builder->paginate($params['pagesize']);
  71. $stores = $paginate->toArray();
  72. return ['has_more_pages' => $paginate->hasMorePages(), 'stores' => $stores['data']];
  73. }
  74. public function getHotKeywords($type)
  75. {
  76. $keywords = [
  77. 'goods' => ['酱油','油','生蚝'],
  78. 'store' => ['黄姐','王姐','黄姐蔬菜摊'],
  79. ];
  80. return $keywords[$type];
  81. }
  82. public function do()
  83. {
  84. // TODO: Implement do() method.
  85. }
  86. public function check()
  87. {
  88. // TODO: Implement check() method.
  89. }
  90. public function undo()
  91. {
  92. // TODO: Implement undo() method.
  93. }
  94. }