Massager.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <?php
  2. namespace app\api\model\massager;
  3. use app\admin\model\Service;
  4. use app\api\model\BaseModel;
  5. use app\api\model\order\Order;
  6. use app\api\model\Store;
  7. use redis\RedisClient;
  8. class Massager extends BaseModel
  9. {
  10. // 表名
  11. protected $name = 'massager';
  12. static function fmtMassager(&$massager)
  13. {
  14. if (null === $massager)
  15. return null;
  16. unset($massager['password']);
  17. return $massager;
  18. }
  19. public function fetchAppMassager(
  20. $city_code,
  21. array $lng_lat,
  22. $search_text = null,
  23. $distance = 1000,
  24. $service_status = null,
  25. $gender = [\E_GENDER_TYPE::Man, \E_GENDER_TYPE::Woman],
  26. $free_travel = false,
  27. $hot = false,
  28. $service_id = null,
  29. $sort = 'def',
  30. $page = 1,
  31. $size = 10,
  32. $user_id = null,
  33. $level = -1)
  34. {
  35. $where = [
  36. // 'status' => \E_BASE_STATUS::Normal,
  37. 'type' => \E_SERVICE_TYPE::App,
  38. ];
  39. if (!is_null($service_status)) {
  40. $where["online"] = $service_status;
  41. }
  42. $subQuery = $this->field("*,round(st_distance_sphere (point($lng_lat[0],$lng_lat[1]), point ( `lng`, `lat` ))) distance")
  43. ->where($where)
  44. ->where("status", "in", [\E_MASSAGER_STATUS::Hidden, \E_BASE_STATUS::Normal])
  45. ->where("gender", "in", $gender);
  46. if ($search_text)
  47. $subQuery->where("name", "like", "%$search_text%");
  48. $query = $this->table($subQuery->buildSql() . ' distance')
  49. ->where($where)
  50. ->where("gender", "in", $gender)
  51. ->where("distance", "<=", $distance * 1000);
  52. if ($service_id > 0) {
  53. $service = (new Service())->get($service_id);
  54. if ($service) {
  55. $query->where("level", $service["level"]);
  56. }
  57. }
  58. if ($level !== null && (int)$level === 0) {
  59. $query->where("level", $level);
  60. }
  61. if ($search_text)
  62. $query->where("name", "like", "%$search_text%");
  63. if ($hot)
  64. $query->where('hot', 1);
  65. if ($free_travel)
  66. $query->where('free_travel', 1);
  67. $query->order("online", "DESC");
  68. switch ($sort) {
  69. case "weight": // 默认排序
  70. $query->order("weight", "DESC");
  71. break;
  72. case "distance": // 距离排序
  73. $query->order('distance', 'ASC');
  74. break;
  75. case "praise_rate": // 评价最高
  76. $query->order('praise_rate', 'DESC');
  77. break;
  78. case "order_count": //接单量优先
  79. $query->order('order_count', 'DESC');
  80. break;
  81. case "collect_count": // 人气最高
  82. $query->order('collect_count', 'DESC');
  83. break;
  84. case "new_people": // 新人推荐
  85. $query->order('createtime', 'DESC');
  86. break;
  87. }
  88. return $query
  89. ->with(['store', 'nearly_two_days_orders'])
  90. ->page($page)
  91. ->paginate($size);
  92. }
  93. public function fetchStoreMassager($store_id, $service_id = null, $search_text = null, $hot = false, $gender = [\E_GENDER_TYPE::Man, \E_GENDER_TYPE::Woman], $page = 1, $size = 10)
  94. {
  95. $where = [
  96. 'status' => \E_BASE_STATUS::Normal,
  97. // 'type' => \E_SERVICE_TYPE::Store,
  98. 'store_id' => $store_id,
  99. // "online" => 1,
  100. ];
  101. $query = $this->where($where)
  102. ->where("gender", "in", $gender);
  103. // if ($service_id > 0)
  104. // $query->where("FIND_IN_SET($service_id, service_ids)");
  105. // if ($search_text)
  106. // $query->where("name", "like", "%$search_text%");
  107. // if ($hot)
  108. // $query->where('hot', 1);
  109. return $query
  110. ->with(['store', 'nearly_two_days_orders'])
  111. ->page($page)
  112. ->paginate($size);
  113. }
  114. public function fetchHiddenAndNormal($id, $with = ["store"])
  115. {
  116. return $this->where([
  117. 'ma_massager.id' => $id,
  118. ])->where("ma_massager.status", "in", [\E_MASSAGER_STATUS::Hidden, \E_MASSAGER_STATUS::Normal])
  119. ->with($with)
  120. ->find();
  121. }
  122. public function getMassager($id, $with = ["store"])
  123. {
  124. return $this->where([
  125. 'id' => $id,
  126. "status" => \E_MASSAGER_STATUS::Normal
  127. ])->with($with)
  128. ->find();
  129. }
  130. public function store()
  131. {
  132. return $this->hasOne(Store::class, 'id', 'store_id');
  133. }
  134. public function findByMobile($mobile)
  135. {
  136. return $this->where("mobile", $mobile)
  137. ->find();
  138. }
  139. public function login($account, $password)
  140. {
  141. $m = $this->where([
  142. "mobile" => $account,
  143. "password" => md5($password),
  144. ])->find();
  145. if (!$m)
  146. return null;
  147. return self::fmtMassager($m);
  148. }
  149. public function findByUnionId($unionId)
  150. {
  151. return $this->where("union_id", $unionId)->find();
  152. }
  153. public function nearlyTwoDaysOrders()
  154. {
  155. return $this->hasMany(Order::class, 'massager_id', 'id')
  156. ->where('service_end_date', '>=', date('Y-m-d H:i:s', time()))
  157. ->where('status', 'in', [
  158. \E_ORDER_STATUS::Purchase,
  159. \E_ORDER_STATUS::Proceed,
  160. ]);
  161. }
  162. }