|
|
@@ -18,6 +18,7 @@ namespace app\adminapi\lists\master_worker;
|
|
|
use app\adminapi\lists\BaseAdminDataLists;
|
|
|
use app\common\model\master_worker\MasterWorker;
|
|
|
use app\common\lists\ListsSearchInterface;
|
|
|
+use app\common\model\works\ServiceWork;
|
|
|
use think\db\Query;
|
|
|
|
|
|
/**
|
|
|
@@ -27,7 +28,7 @@ use think\db\Query;
|
|
|
*/
|
|
|
class MasterWorkerLists extends BaseAdminDataLists implements ListsSearchInterface
|
|
|
{
|
|
|
-
|
|
|
+ public $count = 0;
|
|
|
|
|
|
/**
|
|
|
* @notes 设置搜索条件
|
|
|
@@ -74,19 +75,55 @@ class MasterWorkerLists extends BaseAdminDataLists implements ListsSearchInterfa
|
|
|
*/
|
|
|
public function lists(): array
|
|
|
{
|
|
|
- return MasterWorker::alias('mw')
|
|
|
- ->join('master_worker_register mwr', 'mwr.worker_id = mw.id')
|
|
|
- ->where($this->searchWhere)
|
|
|
- ->where($this->queryWhere())
|
|
|
- ->field([
|
|
|
- 'mw.*',
|
|
|
- 'mwr.maintain_exp_type',
|
|
|
- 'mwr.other_exp_type',
|
|
|
- ])
|
|
|
- ->limit($this->limitOffset, $this->limitLength)
|
|
|
- ->order(['mw.id' => 'desc'])
|
|
|
- ->select()
|
|
|
- ->toArray();
|
|
|
+ $customer_lon = 0;
|
|
|
+ $customer_lat = 0;
|
|
|
+ if(isset($this->params['order_id']) && $this->params['order_id']){
|
|
|
+ $lon_lat = (ServiceWork::where('id',$this->params['order_id'])->column("lon,lat"))[0];
|
|
|
+ $customer_lon = $lon_lat['lon'];
|
|
|
+ $customer_lat = $lon_lat['lat'];
|
|
|
+ }
|
|
|
+ // 无人在0,0坐标上
|
|
|
+ if($customer_lon && $customer_lat){
|
|
|
+ // 查出所有的师傅 -> 计算距离 -> 按距离排序 -> 分页
|
|
|
+ $allList = MasterWorker::alias('mw')
|
|
|
+ ->join('master_worker_register mwr', 'mwr.worker_id = mw.id')
|
|
|
+ ->where($this->searchWhere)
|
|
|
+ ->where($this->queryWhere())
|
|
|
+ ->field([
|
|
|
+ 'mw.*',
|
|
|
+ 'mwr.maintain_exp_type',
|
|
|
+ 'mwr.other_exp_type',
|
|
|
+ ])
|
|
|
+ //->limit($this->limitOffset, $this->limitLength)
|
|
|
+ ->order(['mw.id' => 'desc'])
|
|
|
+ ->select()
|
|
|
+ ->toArray();
|
|
|
+ $allList = array_column($allList, null, 'id');
|
|
|
+ $mastersDistances = $this->mastersDistance($allList,$customer_lon,$customer_lat);
|
|
|
+ $list = $this->limitPage($allList,$mastersDistances,$this->params['page_no']??1,$this->params['page_size']??10);
|
|
|
+ $this->count = count($allList);
|
|
|
+ }else{
|
|
|
+ $list = MasterWorker::alias('mw')
|
|
|
+ ->join('master_worker_register mwr', 'mwr.worker_id = mw.id')
|
|
|
+ ->where($this->searchWhere)
|
|
|
+ ->where($this->queryWhere())
|
|
|
+ ->field([
|
|
|
+ 'mw.*',
|
|
|
+ 'mwr.maintain_exp_type',
|
|
|
+ 'mwr.other_exp_type',
|
|
|
+ ])
|
|
|
+ ->limit($this->limitOffset, $this->limitLength)
|
|
|
+ ->order(['mw.id' => 'desc'])
|
|
|
+ ->select()
|
|
|
+ ->toArray();
|
|
|
+ $this->count = MasterWorker::alias('mw')
|
|
|
+ ->join('master_worker_register mwr', 'mwr.worker_id = mw.id')
|
|
|
+ ->field([
|
|
|
+ 'mw.*'])
|
|
|
+ ->where($this->searchWhere)->where($this->queryWhere())
|
|
|
+ ->count();
|
|
|
+ }
|
|
|
+ return $list;
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -98,12 +135,54 @@ class MasterWorkerLists extends BaseAdminDataLists implements ListsSearchInterfa
|
|
|
*/
|
|
|
public function count(): int
|
|
|
{
|
|
|
- return MasterWorker::alias('mw')
|
|
|
+ /*return MasterWorker::alias('mw')
|
|
|
->join('master_worker_register mwr', 'mwr.worker_id = mw.id')
|
|
|
->field([
|
|
|
'mw.*'])
|
|
|
->where($this->searchWhere)->where($this->queryWhere())
|
|
|
- ->count();
|
|
|
+ ->count();*/
|
|
|
+ return $this->count;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private function limitPage($allList,$data,$page,$itemsPerPage)
|
|
|
+ {
|
|
|
+ $startIndex = (($page??1) - 1) * $itemsPerPage;
|
|
|
+ $currentPageData = array_slice($data, $startIndex, $itemsPerPage, true);
|
|
|
+ $lon_lat_masters = [];
|
|
|
+ foreach ($currentPageData as $key => $value){
|
|
|
+ $lon_lat_masters[$key] = $allList[$key];
|
|
|
+ $lon_lat_masters[$key]['user_distance'] = number_format($value,2);
|
|
|
+ }
|
|
|
+ return $lon_lat_masters?array_values($lon_lat_masters):[];
|
|
|
+ }
|
|
|
+ private function mastersDistance($masters,$customer_lon,$customer_lat)
|
|
|
+ {
|
|
|
+ $nearbyMasters = [];
|
|
|
+ foreach ($masters as $master) {
|
|
|
+ $distance = $this->haversineDistance($customer_lat, $customer_lon, $master['lat'], $master['lon']);
|
|
|
+ $nearbyMasters[$master['id']] = $distance;
|
|
|
+ /*if ($distance <= 10000) { // 距离小于或等于10公里
|
|
|
+ $nearbyMasters[] = $master;
|
|
|
+ }*/
|
|
|
+ }
|
|
|
+ asort($nearbyMasters);
|
|
|
+ return $nearbyMasters;
|
|
|
+ }
|
|
|
+ private function haversineDistance($lat1, $lon1, $lat2, $lon2) {
|
|
|
+ $lat1 = deg2rad($lat1);
|
|
|
+ $lon1 = deg2rad($lon1);
|
|
|
+ $lat2 = deg2rad($lat2);
|
|
|
+ $lon2 = deg2rad($lon2);
|
|
|
+
|
|
|
+ $dlon = $lon2 - $lon1;
|
|
|
+ $dlat = $lat2 - $lat1;
|
|
|
+ $a = sin($dlat / 2)**2 + cos($lat1) * cos($lat2) * sin($dlon / 2)**2;
|
|
|
+ $c = 2 * asin(sqrt($a));
|
|
|
+ $r = 6371; // 地球平均半径,单位为公里
|
|
|
+ $distance = $c * $r;
|
|
|
+
|
|
|
+ return $distance;
|
|
|
}
|
|
|
|
|
|
}
|