MasterWorkerLists.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | likeadmin快速开发前后端分离管理后台(PHP版)
  4. // +----------------------------------------------------------------------
  5. // | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
  6. // | 开源版本可自由商用,可去除界面版权logo
  7. // | gitee下载:https://gitee.com/likeshop_gitee/likeadmin
  8. // | github下载:https://github.com/likeshop-github/likeadmin
  9. // | 访问官网:https://www.likeadmin.cn
  10. // | likeadmin团队 版权所有 拥有最终解释权
  11. // +----------------------------------------------------------------------
  12. // | author: likeadminTeam
  13. // +----------------------------------------------------------------------
  14. namespace app\adminapi\lists\master_worker;
  15. use app\adminapi\lists\BaseAdminDataLists;
  16. use app\common\model\master_worker\MasterWorker;
  17. use app\common\lists\ListsSearchInterface;
  18. use app\common\model\works\ServiceWork;
  19. use think\db\Query;
  20. /**
  21. * MasterWorker列表
  22. * Class MasterWorkerLists
  23. * @package app\adminapi\listsmaster_worker
  24. */
  25. class MasterWorkerLists extends BaseAdminDataLists implements ListsSearchInterface
  26. {
  27. public $count = 0;
  28. /**
  29. * @notes 设置搜索条件
  30. * @return \string[][]
  31. * @author likeadmin
  32. * @date 2024/07/10 18:17
  33. */
  34. public function setSearch(): array
  35. {
  36. return [
  37. '=' => ['mw.sn', 'mw.real_name', 'mw.account', 'mw.password', 'mw.mobile', 'mw.sex', 'mw.channel', 'mw.is_disable', 'mw.is_new_user', 'mw.create_time', 'mw.update_time'],
  38. ];
  39. }
  40. public function queryWhere(){
  41. $where = [];
  42. // 用户昵称
  43. if (isset($this->params['nickname']) && !empty($this->params['nickname'])) {
  44. $where[] = ['mw.nickname|mw.worker_number', 'like','%' .$this->params['nickname'] . '%'];
  45. }
  46. if (isset($this->params['worker_number']) && !empty($this->params['worker_number'])) {
  47. $where[] = ['mw.worker_number', 'like','%' .$this->params['worker_number'] . '%'];
  48. }
  49. if (isset($this->params['worker_exp_type']) && !empty($this->params['worker_exp_type'])) {
  50. $where[] = ['mwr.maintain_exp_type', '=', $this->params['worker_exp_type']];
  51. }
  52. if(isset($this->params['min_work_number']) && is_numeric($this->params['min_work_number'])){
  53. $where[] =[ 'work_total','>=',$this->params['min_work_number']];
  54. }
  55. if(isset($this->params['max_work_number']) && is_numeric($this->params['max_work_number'])){
  56. $where[] =[ 'work_total','work_total <= ',$this->params['max_work_number']];
  57. }
  58. return $where;
  59. }
  60. /**
  61. * @notes 获取列表
  62. * @return array
  63. * @throws \think\db\exception\DataNotFoundException
  64. * @throws \think\db\exception\DbException
  65. * @throws \think\db\exception\ModelNotFoundException
  66. * @author likeadmin
  67. * @date 2024/07/10 18:17
  68. */
  69. public function lists(): array
  70. {
  71. $customer_lon = 0;
  72. $customer_lat = 0;
  73. $goods_category_id = 0;
  74. if(isset($this->params['order_id']) && $this->params['order_id']){
  75. $lon_lat = (ServiceWork::where('id',$this->params['order_id'])->column("lon,lat,goods_category_id"))[0];
  76. $customer_lon = $lon_lat['lon'];
  77. $customer_lat = $lon_lat['lat'];
  78. $goods_category_id = $lon_lat['goods_category_id'];
  79. // whereFindInSet('category_ids',$goods_category_id)->
  80. }
  81. // 无人在0,0坐标上
  82. if($customer_lon && $customer_lat){
  83. // 查出所有的师傅 -> 计算距离 -> 按距离排序 -> 分页
  84. $allList = MasterWorker::alias('mw')->join('master_worker_register mwr', 'mwr.worker_id = mw.id');
  85. if($goods_category_id) $allList->whereFindInSet('mw.category_ids',$goods_category_id);
  86. $allList = $allList->where($this->searchWhere)
  87. ->where($this->queryWhere())
  88. ->field([
  89. 'mw.*',
  90. 'mwr.maintain_exp_type',
  91. 'mwr.other_exp_type',
  92. ])
  93. //->limit($this->limitOffset, $this->limitLength)
  94. ->order(['mw.id' => 'desc'])
  95. ->select()
  96. ->toArray();
  97. $allList = array_column($allList, null, 'id');
  98. $mastersDistances = $this->mastersDistance($allList,$customer_lon,$customer_lat);
  99. $list = $this->limitPage($allList,$mastersDistances,$this->params['page_no']??1,$this->params['page_size']??10);
  100. $this->count = count($allList);
  101. }else{
  102. $list = MasterWorker::alias('mw')->join('master_worker_register mwr', 'mwr.worker_id = mw.id');
  103. if($goods_category_id) $list->whereFindInSet('mw.category_ids',$goods_category_id);
  104. $list = $list->where($this->searchWhere)
  105. ->where($this->queryWhere())
  106. ->field([
  107. 'mw.*',
  108. 'mwr.maintain_exp_type',
  109. 'mwr.other_exp_type',
  110. ])
  111. ->limit($this->limitOffset, $this->limitLength)
  112. ->order(['mw.id' => 'desc'])
  113. ->select()
  114. ->toArray();
  115. $this->count = MasterWorker::alias('mw')
  116. ->join('master_worker_register mwr', 'mwr.worker_id = mw.id');
  117. if($goods_category_id) $this->count->whereFindInSet('mw.category_ids',$goods_category_id);
  118. $this->count = $this->count->field([
  119. 'mw.*'])
  120. ->where($this->searchWhere)->where($this->queryWhere())
  121. ->count();
  122. }
  123. return $list;
  124. }
  125. /**
  126. * @notes 获取数量
  127. * @return int
  128. * @author likeadmin
  129. * @date 2024/07/10 18:17
  130. */
  131. public function count(): int
  132. {
  133. /*return MasterWorker::alias('mw')
  134. ->join('master_worker_register mwr', 'mwr.worker_id = mw.id')
  135. ->field([
  136. 'mw.*'])
  137. ->where($this->searchWhere)->where($this->queryWhere())
  138. ->count();*/
  139. return $this->count;
  140. }
  141. private function limitPage($allList,$data,$page,$itemsPerPage)
  142. {
  143. $startIndex = (($page??1) - 1) * $itemsPerPage;
  144. $currentPageData = array_slice($data, $startIndex, $itemsPerPage, true);
  145. $lon_lat_masters = [];
  146. foreach ($currentPageData as $key => $value){
  147. $lon_lat_masters[$key] = $allList[$key];
  148. $lon_lat_masters[$key]['user_distance'] = number_format($value,2);
  149. }
  150. return $lon_lat_masters?array_values($lon_lat_masters):[];
  151. }
  152. private function mastersDistance($masters,$customer_lon,$customer_lat)
  153. {
  154. $nearbyMasters = [];
  155. foreach ($masters as $master) {
  156. $distance = $this->haversineDistance($customer_lat, $customer_lon, $master['lat'], $master['lon']);
  157. $nearbyMasters[$master['id']] = $distance;
  158. /*if ($distance <= 10000) { // 距离小于或等于10公里
  159. $nearbyMasters[] = $master;
  160. }*/
  161. }
  162. asort($nearbyMasters);
  163. return $nearbyMasters;
  164. }
  165. private function haversineDistance($lat1, $lon1, $lat2, $lon2) {
  166. $lat1 = deg2rad($lat1);
  167. $lon1 = deg2rad($lon1);
  168. $lat2 = deg2rad($lat2);
  169. $lon2 = deg2rad($lon2);
  170. $dlon = $lon2 - $lon1;
  171. $dlat = $lat2 - $lat1;
  172. $a = sin($dlat / 2)**2 + cos($lat1) * cos($lat2) * sin($dlon / 2)**2;
  173. $c = 2 * asin(sqrt($a));
  174. $r = 6371; // 地球平均半径,单位为公里
  175. $distance = $c * $r;
  176. return $distance;
  177. }
  178. }