Massager.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  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. // 获取线上技师 - 68元特惠价 必须在扫码10分钟内 登录app查看 只有当选择了服务的时候 才会去判断 该技师是否绑定了该门店
  58. if ($service_id == 276) {
  59. if ($user_id) {
  60. $exist = RedisClient::of()->get("scan:qr:codes:" . $user_id);
  61. if ($exist) {
  62. $query->where("store_id", $exist);
  63. }
  64. }
  65. }
  66. }
  67. if ($level !== null && (int)$level === 0) {
  68. $query->where("level", $level);
  69. }
  70. if ($search_text)
  71. $query->where("name", "like", "%$search_text%");
  72. if ($hot)
  73. $query->where('hot', 1);
  74. if ($free_travel)
  75. $query->where('free_travel', 1);
  76. $query->order("online", "desc");
  77. switch ($sort) {
  78. case "weight": // 默认排序
  79. $query->order("weight", "DESC");
  80. break;
  81. case "distance": // 距离排序
  82. $query->order('distance', 'ASC');
  83. break;
  84. case "praise_rate": // 评价最高
  85. $query->order('praise_rate', 'DESC');
  86. break;
  87. case "order_count": //接单量优先
  88. $query->order('order_count', 'DESC');
  89. break;
  90. case "collect_count": // 人气最高
  91. $query->order('collect_count', 'DESC');
  92. break;
  93. case "new_people": // 新人推荐
  94. $query->order('createtime', 'DESC');
  95. break;
  96. }
  97. return $paginate = $query
  98. ->with(['store', 'nearly_two_days_orders'])
  99. ->page($page)
  100. ->paginate($size);
  101. }
  102. 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)
  103. {
  104. $where = [
  105. 'status' => \E_BASE_STATUS::Normal,
  106. // 'type' => \E_SERVICE_TYPE::Store,
  107. 'store_id' => $store_id,
  108. // "online" => 1,
  109. ];
  110. $query = $this->where($where)
  111. ->where("gender", "in", $gender);
  112. // if ($service_id > 0)
  113. // $query->where("FIND_IN_SET($service_id, service_ids)");
  114. // if ($search_text)
  115. // $query->where("name", "like", "%$search_text%");
  116. // if ($hot)
  117. // $query->where('hot', 1);
  118. return $query
  119. ->with(['store', 'nearly_two_days_orders'])
  120. ->page($page)
  121. ->paginate($size);
  122. }
  123. public function fetchHiddenAndNormal($id, $with = ["store"])
  124. {
  125. return $this->where([
  126. 'ma_massager.id' => $id,
  127. ])->where("ma_massager.status", "in", [\E_MASSAGER_STATUS::Hidden, \E_MASSAGER_STATUS::Normal])
  128. ->with($with)
  129. ->find();
  130. }
  131. public function getMassager($id, $with = ["store"])
  132. {
  133. return $this->where([
  134. 'id' => $id,
  135. "status" => \E_MASSAGER_STATUS::Normal
  136. ])->with($with)
  137. ->find();
  138. }
  139. public function store()
  140. {
  141. return $this->hasOne(Store::class, 'id', 'store_id');
  142. }
  143. public function findByMobile($mobile)
  144. {
  145. return $this->where("mobile", $mobile)
  146. ->find();
  147. }
  148. public function login($account, $password)
  149. {
  150. $m = $this->where([
  151. "mobile" => $account,
  152. "password" => md5($password),
  153. ])->find();
  154. if (!$m)
  155. return null;
  156. return self::fmtMassager($m);
  157. }
  158. public function findByUnionId($unionId)
  159. {
  160. return $this->where("union_id", $unionId)->find();
  161. }
  162. public function nearlyTwoDaysOrders()
  163. {
  164. return $this->hasMany(Order::class, 'massager_id', 'id')
  165. ->where('service_end_date', '>=', date('Y-m-d H:i:s', time()))
  166. ->where('status', 'in', [
  167. \E_ORDER_STATUS::Purchase,
  168. \E_ORDER_STATUS::Proceed,
  169. ]);
  170. }
  171. }