WorkerForm.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630
  1. <?php
  2. namespace app\modules\client\models\v1;
  3. use app\constants\OptionSetting;
  4. use app\models\District;
  5. use app\models\Favorite;
  6. use app\models\Goods;
  7. use app\models\GoodsPic;
  8. use app\models\Option;
  9. use app\models\Order;
  10. use app\models\OrderComment;
  11. use app\models\OrderDetail;
  12. use app\models\Worker;
  13. use app\models\WorkerCat;
  14. use app\models\WorkerCatExt;
  15. use app\models\WorkerGoods;
  16. use app\models\WorkerGoodsCat;
  17. use app\models\WorkerGoodsExt;
  18. use app\models\WorkerOrderExt;
  19. use app\models\WorkerPic;
  20. use app\modules\client\models\v1\order\OrderForm;
  21. use yii\base\Model;
  22. class WorkerForm extends Model
  23. {
  24. public $latitude;
  25. public $longitude;
  26. public $sort;
  27. public $cat_id;
  28. public $distance;
  29. public $district_id;
  30. public $time_type;
  31. public $store_id;
  32. public $name;
  33. public $id;
  34. public function rules()
  35. {
  36. return [
  37. [['latitude', 'longitude', 'distance', 'name', 'cat_id'], 'string'],
  38. [['sort', 'district_id', 'time_type', 'store_id', 'id'], 'integer']
  39. ];
  40. }
  41. //获取服务人员列表
  42. public function workerList()
  43. {
  44. try {
  45. $store_id = $this->store_id;
  46. $latitude = !empty($this->latitude) ? $this->latitude : '0.00';
  47. $longitude = !empty($this->longitude) ? $this->longitude : '0.00';
  48. $cat_id = $this->cat_id;
  49. $name = $this->name;
  50. $sort = $this->sort ?? 0;
  51. $distance = $this->distance;
  52. $distance_ = 0;
  53. $district_id = $this->district_id;
  54. $time_type = $this->time_type;
  55. //判断附近
  56. if (strpos($distance, 'km') !== false) {
  57. //1-5km
  58. $km = strpos($distance, 'km');
  59. $distance_ = substr($distance, 0, $km);
  60. $distance_ = $distance_ * 1000;
  61. } else {
  62. if (strpos($distance, 'm') !== false) {
  63. //500m
  64. $km = strpos($distance, 'm');
  65. $distance_ = substr($distance, 0, $km);
  66. }
  67. }
  68. // //收藏
  69. // $favorite = "SELECT SUM(worker_id) as favorite_num, worker_id FROM cyy_favorite GROUP BY worker_id";
  70. $sql = $this->getSql($latitude, $longitude, $store_id);
  71. //存在分类
  72. if ($cat_id) {
  73. $cat_id = explode(',', $cat_id);
  74. $worker_ = WorkerCatExt::find()->where(['cat_id' => $cat_id, 'is_delete' => 0])->select('worker_id')->column();
  75. $worker_ = array_merge($worker_, [0]);
  76. $worker_ = implode(',', $worker_);
  77. $sql .= " AND (w.id in ({$worker_})) ";
  78. }
  79. //存在名称搜索
  80. if ($name) {
  81. $sql .= " AND w.name LIKE '%{$name}%' ";
  82. }
  83. //判断距离
  84. if ($distance_ > 0) {
  85. $sql .= " AND w_.distance < {$distance_}";
  86. } else {
  87. if ($district_id) {
  88. $sql .= " AND w.district_id = {$district_id}";
  89. }
  90. }
  91. //判断服务时间
  92. if ($time_type) {
  93. switch ($time_type) {
  94. case 1:
  95. $start_time = 0000;
  96. $end_time = 0500;
  97. break;
  98. case 2:
  99. $start_time = 0500;
  100. $end_time = 1000;
  101. break;
  102. case 3:
  103. $start_time = 1000;
  104. $end_time = 1400;
  105. break;
  106. case 4:
  107. $start_time = 1400;
  108. $end_time = 1700;
  109. break;
  110. case 5:
  111. $start_time = 1700;
  112. $end_time = 2100;
  113. break;
  114. case 6:
  115. $start_time = 2100;
  116. $end_time = 2400;
  117. break;
  118. default:
  119. $start_time = 0000;
  120. $end_time = 2400;
  121. break;
  122. }
  123. // |_________|
  124. // |____|
  125. // |_____|
  126. // |______|
  127. // |__________________|
  128. //
  129. $sql .= " AND ((w.book_start_time > {$start_time} AND w.book_end_time < {$end_time}) OR
  130. (w.book_start_time < {$start_time} AND w.book_end_time > {$start_time} AND w.book_end_time < {$end_time}) OR
  131. (w.book_start_time > {$start_time} AND w.book_start_time < {$end_time} AND w.book_end_time > {$end_time}) OR
  132. (w.book_start_time < {$start_time} AND w.book_end_time > {$end_time})
  133. ) AND (w.book_start_time > 0 OR w.book_end_time > 0)";
  134. } else {
  135. $end_time = date("Hi");
  136. $sql .= " AND (w.book_end_time > {$end_time}) ";
  137. }
  138. //距离排序
  139. switch ($sort) {
  140. case 1://距离优先
  141. $sql .= " ORDER BY distance ASC";
  142. break;
  143. case 2://好评优先
  144. $sql .= " ORDER BY w.star DESC";
  145. break;
  146. case 3://销量优先
  147. $sql .= " ORDER BY o.order_num DESC";
  148. break;
  149. default:
  150. $sql .= " ORDER BY w.id ASC";
  151. break;
  152. }
  153. $pageNo = get_params('pageNo', get_params('page', 1));
  154. $pageSize = get_params('pageSize', \Yii::$app->params['pageSize']);
  155. $pageInitNum = ($pageNo - 1) * $pageSize;
  156. $count = \Yii::$app->db->createCommand($sql)->query()->count();
  157. $sql .= " LIMIT {$pageSize} OFFSET {$pageInitNum}";
  158. $list = \Yii::$app->db->createCommand($sql)->queryAll();
  159. if (!$list) {
  160. return [
  161. 'code' => 0,
  162. 'msg' => "获取成功",
  163. 'data' => [
  164. 'data' => [],
  165. 'pageNo' => $pageNo,
  166. 'totalCount' => $count
  167. ]
  168. ];
  169. }
  170. foreach ($list as &$item) {
  171. //距离格式化
  172. $item['distance'] = $this->distance((float)$item['distance']);
  173. //收藏列表
  174. $item['favorite_num'] = Favorite::find()->where(['worker_id' => $item['id'], 'is_delete' => 0])
  175. ->select('id')->count() ?? 0;
  176. $order_ids = WorkerOrderExt::find()->where(['worker_id' => $item['id']])->select('order_id')->column();
  177. $item['comment_num'] = 0;
  178. //评价数量
  179. if (!empty($order_ids)) {
  180. $item['comment_num'] = OrderComment::find()->where(['order_id' => $order_ids])->select('id')->count();
  181. }
  182. //是否开业
  183. $item['open_status'] = (int)$item['open_status'];
  184. $time = str_pad($item['book_start_time'], 4, 0, STR_PAD_LEFT);
  185. //工作开始时间
  186. $item['begin_time'] = substr($time, -4, 2) . ':' . substr($time, -2);
  187. $times = new OrderForm();
  188. $result = $times->workerTime($item['id']);
  189. if ($result['code'] === 0) {
  190. $arr['time'] = $result['data'];
  191. if ($arr['time']) {
  192. $times = $result['data'][0]['time'][0]['times'];
  193. foreach ($times as $time) {
  194. if ($time['status'] === 0) {
  195. $item['begin_time'] = date('H:i', $time['time_int']);
  196. break;
  197. }
  198. }
  199. }
  200. }
  201. //订单数量
  202. $item['order_num'] = (int)$item['order_num'];
  203. $certified = [];
  204. //实名认证
  205. if ($item['tel']) {
  206. array_push($certified, 1);
  207. }
  208. $worker_pic = WorkerPic::findOne(['worker_id' => $item['id']]);
  209. //资质认证
  210. array_push($certified, 2);
  211. if ($worker_pic) {
  212. array_push($certified, 3);
  213. }
  214. //存在图片
  215. $item['certified'] = implode(',', $certified);
  216. unset($item['book_start_time']);
  217. }
  218. return [
  219. 'code' => 0,
  220. 'msg' => "获取成功",
  221. 'data' => [
  222. 'data' => $list,
  223. 'pageNo' => $pageNo,
  224. 'totalCount' => $count
  225. ]
  226. ];
  227. } catch (\Exception $e) {
  228. return [
  229. 'code' => 1,
  230. 'msg' => $e->getMessage()
  231. ];
  232. }
  233. }
  234. //获取服务人员列表筛选项目
  235. public function workerIndex() {
  236. $latitude = !empty($this->latitude) ? $this->latitude : '0.00';
  237. $longitude = !empty($this->longitude) ? $this->longitude : '0.00';
  238. $store_id = $this->store_id;
  239. //获取区列表
  240. $tencent_map_key = Option::get('tencent_map_key', 0, 'saas', '')['value'];
  241. if (get_store_id() > 0) {
  242. $tencent_map_key = Option::get(OptionSetting::TENCENT_MAP_KEY, get_store_id(), 'pay', Option::get(OptionSetting::TENCENT_MAP_KEY, get_store_id(), 'store', '')['value'] ?: $tencent_map_key)['value'];
  243. }
  244. $place_url = 'https://apis.map.qq.com/ws/geocoder/v1/?location=' . $latitude . ',' . $longitude . '&key=' . $tencent_map_key;
  245. $json_place = file_get_contents($place_url);
  246. $place_arr = json_decode($json_place, true);
  247. $address = $place_arr['result']['address_component'];
  248. $city_id = District::findOne(['name' => $address['city'], 'level' => 'city'])->id;
  249. $district = [];
  250. if ($city_id) {
  251. $district = District::find()->where(['parent_id' => $city_id, 'level' => 'district'])->select('id, name')->asArray()->all();
  252. }
  253. //获取分类
  254. $work_cate = WorkerCat::find()->where(['store_id' => $store_id, 'is_delete' => 0, 'is_show' => 1])
  255. ->select('id, name')->orderBy('sort desc')->asArray()->all();
  256. return [
  257. 'code' => 0,
  258. 'msg' => 'success',
  259. 'data' => [
  260. 'district' => $district,
  261. 'cate' => $work_cate
  262. ]
  263. ];
  264. }
  265. //获取服务人员详情
  266. public function workerInfo() {
  267. try {
  268. $id = $this->id;
  269. $latitude = !empty($this->latitude) ? $this->latitude : '0.00';
  270. $longitude = !empty($this->longitude) ? $this->longitude : '0.00';
  271. if (!$id) {
  272. return [
  273. 'code' => 0,
  274. 'msg' => '获取成功',
  275. 'data' => [
  276. 'info' => []
  277. ]
  278. ];
  279. }
  280. $sql = "SELECT `id`, `name`, `logo`, `desc`, `visited`, `tel`, acos(cos({$latitude}*pi()/180 )*cos(lat*pi()/180)*cos({$longitude}*pi()/180 -lng*pi()/180)+sin({$latitude}*pi()/180 )*sin(lat*pi()/180))*6370996.81 as
  281. distance FROM cyy_worker WHERE id = {$id}";
  282. $info = \Yii::$app->db->createCommand($sql)->queryOne();
  283. if (!$info) {
  284. return [
  285. 'code' => 0,
  286. 'msg' => '获取成功',
  287. 'data' => [
  288. 'info' => []
  289. ]
  290. ];
  291. }
  292. $order_ext = WorkerOrderExt::find()->where(['worker_id' => $info['id']])->select('order_id')->asArray()->all();
  293. $info['distance'] = $this->distance($info['distance']);
  294. $info['order_num'] = count($order_ext);
  295. $info['favorite_num'] = Favorite::find()->where(['worker_id' => $info['id']])->select('order_id')
  296. ->count() ?? 0;
  297. $info['is_favorite'] = (int)Favorite::find()->where(['worker_id' => $info['id'], 'user_id' => get_user_id()])->one();
  298. $order_id = array_column($order_ext, 'order_id');
  299. //好评比例
  300. $order_comment = OrderComment::find()->where(['order_id' => $order_id])->select('score')->column();
  301. $info['proportion'] = 100;
  302. if (!empty($order_comment)) {
  303. $max = array_sum(array_filter($order_comment, function($item) {
  304. if ($item > 2) {
  305. return $item;
  306. }
  307. }));
  308. $total = array_sum($order_comment);
  309. if ($total > 0) {
  310. $info['proportion'] = sprintf('%.2f', (($max / $total) * 100));
  311. }
  312. }
  313. $info['pic_url'] = WorkerPic::find()->where(['worker_id' => $id, 'is_delete' => 0])->asArray()->all();
  314. foreach ($info['pic_url'] as &$value) {
  315. if (strpos($value['pic_url'], 'https:') === false && strpos($value['pic_url'], 'http:') === false) {
  316. $value['pic_url'] = 'https:' . $value['pic_url'];
  317. }
  318. }
  319. $info['goods_list'] = WorkerGoods::find()->alias('wg')->where(['wg.worker_id' => $info['id'],
  320. 'wg.status' => 1, 'g.product_type' => Goods::GOODS_TYPE_WORKER, 'g.status' => 1, 'g.is_delete' => 0])
  321. ->leftJoin(['g' => Goods::tableName()], 'wg.goods_id = g.id')
  322. ->leftJoin(['wge' => WorkerGoodsExt::tableName()], 'wge.goods_id = g.id')
  323. ->select('g.id, g.name, g.price, g.original_price, g.cover_pic, wge.desc')->asArray()->all();
  324. foreach ($info['goods_list'] as &$item) {
  325. $item['price'] = sprintf("%.2f", $item['price']);
  326. $item['original_price'] = sprintf("%.2f", $item['original_price']);
  327. if ($item['desc']) {
  328. $item['desc'] = explode(',', $item['desc']);
  329. } else {
  330. $item['desc'] = null;
  331. }
  332. }
  333. $certified = [];
  334. //实名认证
  335. if ($info['tel']) {
  336. array_push($certified, 1);
  337. }
  338. $worker_pic = WorkerPic::findOne(['worker_id' => $info['id']]);
  339. //资质认证
  340. array_push($certified, 2);
  341. if ($worker_pic) {
  342. array_push($certified, 3);
  343. }
  344. //存在图片
  345. $info['certified'] = implode(',', $certified);
  346. //增加浏览量
  347. $worker = Worker::findOne($info['id']);
  348. $worker->visited += 1;
  349. $worker->save();
  350. return [
  351. 'code' => 0,
  352. 'msg' => '获取成功',
  353. 'data' => [
  354. 'info' => $info
  355. ]
  356. ];
  357. } catch (\Exception $e) {
  358. return [
  359. 'code' => 1,
  360. 'msg' => $e->getMessage()
  361. ];
  362. }
  363. }
  364. //获取商品详情
  365. public function workerGoodsInfo() {
  366. try {
  367. $id = $this->id;
  368. $store_id = $this->store_id;
  369. $latitude = !empty($this->latitude) ? $this->latitude : '0.00';
  370. $longitude = !empty($this->longitude) ? $this->longitude : '0.00';
  371. $info = Goods::find()->alias('g')->where(['g.product_type' => Goods::GOODS_TYPE_WORKER, 'g.status' => 1, 'g.is_delete' => 0, 'g.id' => $id])
  372. ->leftJoin(['wge' => WorkerGoodsExt::tableName()], 'g.id = wge.goods_id')->select('g.id, g.name, g.price, g.service, wge.desc, g.detail, wge.warn, g.cover_pic, wge.bind_worker, g.virtual_sales')->asArray()->one();
  373. // $info['order_num'] = OrderDetail::find()->alias('od')->where(['od.goods_id' => $info['id']])
  374. // ->leftJoin(['o' => Order::tableName()], 'od.order_id = o.id')
  375. // ->select('od.id')->groupBy('o.user_id')->count() ?? 0;
  376. $info['bind_worker'] = (int)$info['bind_worker'];
  377. $info['order_num'] = OrderDetail::find()->alias('od')->where(['od.goods_id' => $info['id'], 'o.is_pay' => 1])
  378. ->leftJoin(['o' => Order::tableName()], 'o.id = od.order_id')->select('o.user_id')->groupBy('o.user_id')->count() ?? 0;
  379. $info['order_num'] += $info['virtual_sales'];
  380. $info['goods_pic'] = GoodsPic::find()->where(['is_delete' => 0, 'goods_id' => $info['id']])->select('pic_url')->asArray()->all() ?: [];
  381. $worker_id = WorkerGoods::find()->where(['goods_id' => $id, 'status' => 1])->select('worker_id')->column();
  382. $worker_id = array_merge($worker_id, [0]);
  383. $worker_id = implode(',', $worker_id);
  384. $sql = $this->getSql($latitude, $longitude, $store_id);
  385. // $info['goods_pic'] = array_merge($info['goods_pic'], [['pic_url' => $info['cover_pic']]]);
  386. $time_ = date("Hi");
  387. $sql .= " AND w.id in ({$worker_id}) AND w.open_status = 1 AND (w.book_end_time > {$time_}) ORDER BY distance ASC";
  388. $info['worker_list'] = \Yii::$app->db->createCommand($sql)->queryAll();
  389. if ($info['worker_list']) {
  390. foreach ($info['worker_list'] as &$item) {
  391. $item['distance'] = $this->distance($item['distance']);
  392. $item['open_status'] = (int)$item['open_status'];
  393. $item['favorite_num'] = Favorite::find()->where(['worker_id' => $item['id'], 'is_delete' => 0])
  394. ->select('id')->count();
  395. $order_ids = WorkerOrderExt::find()->where(['worker_id' => $item['id']])->select('order_id')->column();
  396. $item['comment_num'] = 0;
  397. //评价数量
  398. if (!empty($order_ids)) {
  399. $item['comment_num'] = OrderComment::find()->where(['order_id' => $order_ids])->select('id')->count();
  400. }
  401. //工作开始时间
  402. $time = str_pad($item['book_start_time'], 4, 0, STR_PAD_LEFT);
  403. $item['begin_time'] = substr($time, -4, 2) . ':' . substr($time, -2);
  404. $times = new OrderForm();
  405. $result = $times->workerTime($item['id']);
  406. if ($result['code'] === 0) {
  407. $arr['time'] = $result['data'];
  408. if ($arr['time']) {
  409. $times = $result['data'][0]['time'][0]['times'];
  410. foreach ($times as $time) {
  411. if ($time['status'] === 0) {
  412. $item['begin_time'] = date('H:i', $time['time_int']);
  413. break;
  414. }
  415. }
  416. }
  417. }
  418. //订单数量
  419. $item['order_num'] = (int)$item['order_num'];
  420. $certified = [];
  421. //实名认证
  422. if ($item['tel']) {
  423. array_push($certified, 1);
  424. }
  425. $worker_pic = WorkerPic::findOne(['worker_id' => $item['id']]);
  426. //资质认证
  427. array_push($certified, 2);
  428. if ($worker_pic) {
  429. array_push($certified, 3);
  430. }
  431. //存在图片
  432. $item['certified'] = implode(',', $certified);
  433. unset($item['book_start_time']);
  434. }
  435. }
  436. if ($info['desc']) {
  437. $info['desc'] = explode(',', $info['desc']);
  438. } else {
  439. $info['desc'] = null;
  440. }
  441. if ($info['service']) {
  442. $info['service'] = explode(',', $info['service']);
  443. } else {
  444. $info['service'] = null;
  445. }
  446. return [
  447. 'code' => 0,
  448. 'msg' => '获取成功',
  449. 'data' => [
  450. 'info' => $info
  451. ]
  452. ];
  453. } catch (\Exception $e) {
  454. return [
  455. 'code' => 1,
  456. 'msg' => $e->getMessage()
  457. ];
  458. }
  459. }
  460. //获取商品列表
  461. public function workerGoodsCateList() {
  462. try {
  463. $store_id = $this->store_id;
  464. $data = WorkerGoodsCat::find()->where(['store_id' => $store_id, 'is_delete' => 0, 'is_show' => 1])
  465. ->select('id, name')
  466. ->orderBy('sort desc')->asArray()->all();
  467. return [
  468. 'code' => 0,
  469. 'msg' => 'success',
  470. 'data' => [
  471. 'list' => $data
  472. ]
  473. ];
  474. } catch (\Exception $e) {
  475. return [
  476. 'code' => 1,
  477. 'msg' => $e->getMessage()
  478. ];
  479. }
  480. }
  481. //获取服务类目列表
  482. public function workerCateList() {
  483. try {
  484. $store_id = $this->store_id;
  485. $data = WorkerCat::find()->where(['store_id' => $store_id, 'is_delete' => 0, 'is_show' => 1])
  486. ->select('id, name')
  487. ->orderBy('sort desc')->asArray()->all();
  488. return [
  489. 'code' => 0,
  490. 'msg' => 'success',
  491. 'data' => [
  492. 'list' => $data
  493. ]
  494. ];
  495. } catch (\Exception $e) {
  496. return [
  497. 'code' => 1,
  498. 'msg' => $e->getMessage()
  499. ];
  500. }
  501. }
  502. //获取商品列表
  503. public function workerGoodsList() {
  504. try {
  505. $cat_id = $this->cat_id;
  506. $store_id = $this->store_id;
  507. $query = WorkerGoodsExt::find()->alias('wge')->leftJoin(['g' => Goods::tableName()], 'wge.goods_id = g.id')
  508. ->where(['wge.cat_id' => $cat_id, 'wge.store_id' => $store_id, 'g.is_delete' => 0, 'g.status' => 1])
  509. ->select('g.id, g.name,g.cover_pic, g.price, g.original_price, wge.desc, g.virtual_sales')->orderBy('g.sort desc');
  510. $list = pagination_make($query);
  511. foreach ($list['list'] as &$item) {
  512. // $item['order_num'] = OrderDetail::find()->alias('od')->leftJoin(['o' => Order::tableName()], 'o.id = od.order_id')
  513. // ->where(['od.goods_id' => $item['id'], 'o.is_pay' => 1])->groupBy('o.user_id')->select('od.id')->count() ?? 0;
  514. $item['order_num'] = OrderDetail::find()->alias('od')->where(['od.goods_id' => $item['id'], 'o.is_pay' => 1])
  515. ->leftJoin(['o' => Order::tableName()], 'o.id = od.order_id')->select('od.num')->sum('od.num') ?? 0;
  516. $item['order_num'] += $item['virtual_sales'];
  517. if ($item['desc']) {
  518. $item['desc'] = explode(',', $item['desc']);
  519. } else {
  520. $item['desc'] = null;
  521. }
  522. }
  523. return [
  524. 'code' => 0,
  525. 'msg' => 'success',
  526. 'data' => [
  527. 'list' => $list['list'],
  528. 'pageNo' => $list['pageNo'],
  529. 'totalCount' => $list['totalCount']
  530. ]
  531. ];
  532. } catch (\Exception $e) {
  533. return [
  534. 'code' => 1,
  535. 'msg' => $e->getMessage()
  536. ];
  537. }
  538. }
  539. public function distance($distance)
  540. {
  541. if ($distance == -1) {
  542. return -1;
  543. }
  544. if ($distance > 1000) {
  545. $distance = round($distance / 1000, 2) . 'km';
  546. } else {
  547. $distance = round($distance, 2);
  548. $distance .= 'm';
  549. }
  550. return $distance;
  551. }
  552. public function getSql($latitude, $longitude, $store_id) {
  553. //服务订单数量 (用于排序)
  554. $order = "SELECT count(order_id) as order_num, worker_id FROM cyy_worker_order_ext GROUP BY worker_id";
  555. //中间嵌套相同的cyy_worker用于判断距离
  556. $sql = "SELECT w.id, w.name, w.logo, w.lat, w.lng, w.open_status, w.star, w_.distance, o.order_num, w.tel, w.book_start_time
  557. FROM cyy_worker w
  558. LEFT JOIN (select id, acos(cos({$latitude}*pi()/180 )*cos(lat*pi()/180)*cos({$longitude}*pi()/180 -lng*pi()/180)+sin({$latitude}*pi()/180 )*sin(lat*pi()/180))*6370996.81 as
  559. distance from cyy_worker) as w_ ON w_.id = w.id
  560. LEFT JOIN ( {$order} ) AS o ON o.worker_id = w.id
  561. WHERE w.store_id = {$store_id} AND w.status = " . Worker::STATUS_VALID;//LEFT JOIN ( {$favorite} ) as f ON f.worker_id = w.id
  562. return $sql;
  563. }
  564. }