|
|
@@ -16,10 +16,12 @@ namespace app\adminapi\lists\master_worker;
|
|
|
|
|
|
|
|
|
use app\adminapi\lists\BaseAdminDataLists;
|
|
|
+use app\adminapi\service\DistributeLeafletsService;
|
|
|
use app\common\model\master_worker\MasterWorker;
|
|
|
use app\common\lists\ListsSearchInterface;
|
|
|
use app\common\model\works\ServiceWork;
|
|
|
use think\db\Query;
|
|
|
+use think\facade\Log;
|
|
|
|
|
|
/**
|
|
|
* MasterWorker列表
|
|
|
@@ -29,6 +31,8 @@ use think\db\Query;
|
|
|
class MasterWorkerLists extends BaseAdminDataLists implements ListsSearchInterface
|
|
|
{
|
|
|
public $count = 0;
|
|
|
+ public $lon = 0;
|
|
|
+ public $lat = 0;
|
|
|
|
|
|
/**
|
|
|
* @notes 设置搜索条件
|
|
|
@@ -57,11 +61,21 @@ class MasterWorkerLists extends BaseAdminDataLists implements ListsSearchInterfa
|
|
|
$where[] = ['mwr.maintain_exp_type', '=', $this->params['worker_exp_type']];
|
|
|
}
|
|
|
if(isset($this->params['min_work_number']) && is_numeric($this->params['min_work_number'])){
|
|
|
- $where[] =[ 'work_total','>=',$this->params['min_work_number']];
|
|
|
+ $where[] =[ 'mw.work_total','>=',$this->params['min_work_number']];
|
|
|
}
|
|
|
if(isset($this->params['max_work_number']) && is_numeric($this->params['max_work_number'])){
|
|
|
- $where[] =[ 'work_total','work_total <= ',$this->params['max_work_number']];
|
|
|
+ $where[] =[ 'mw.work_total','<= ',$this->params['max_work_number']];
|
|
|
}
|
|
|
+ $goods_category_id = 0;
|
|
|
+ if(isset($this->params['order_id']) && $this->params['order_id']){
|
|
|
+ $lon_lat = (ServiceWork::where('id',$this->params['order_id'])->column("lon,lat,goods_category_id"))[0];
|
|
|
+ $this->lon = $lon_lat['lon'];
|
|
|
+ $this->lat = $lon_lat['lat'];
|
|
|
+ $goods_category_id = $lon_lat['goods_category_id'];
|
|
|
+ }
|
|
|
+ $ids = DistributeLeafletsService::getIntersection($this->lon, $this->lat,$goods_category_id);
|
|
|
+ $where[] = [ 'mw.id','IN',$ids];
|
|
|
+ Log::debug('MasterWorker-where:'.json_encode($where));
|
|
|
return $where;
|
|
|
}
|
|
|
/**
|
|
|
@@ -75,59 +89,22 @@ class MasterWorkerLists extends BaseAdminDataLists implements ListsSearchInterfa
|
|
|
*/
|
|
|
public function lists(): array
|
|
|
{
|
|
|
- $customer_lon = 0;
|
|
|
- $customer_lat = 0;
|
|
|
- $goods_category_id = 0;
|
|
|
- if(isset($this->params['order_id']) && $this->params['order_id']){
|
|
|
- $lon_lat = (ServiceWork::where('id',$this->params['order_id'])->column("lon,lat,goods_category_id"))[0];
|
|
|
- $customer_lon = $lon_lat['lon'];
|
|
|
- $customer_lat = $lon_lat['lat'];
|
|
|
- $goods_category_id = $lon_lat['goods_category_id'];
|
|
|
-
|
|
|
- // whereFindInSet('category_ids',$goods_category_id)->
|
|
|
- }
|
|
|
- // 无人在0,0坐标上
|
|
|
- if($customer_lon && $customer_lat){
|
|
|
- // 查出所有的师傅 -> 计算距离 -> 按距离排序 -> 分页
|
|
|
- $allList = MasterWorker::alias('mw')->join('master_worker_register mwr', 'mwr.worker_id = mw.id');
|
|
|
- if($goods_category_id) $allList->whereFindInSet('mw.category_ids',$goods_category_id);
|
|
|
- $allList = $allList->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');
|
|
|
- if($goods_category_id) $list->whereFindInSet('mw.category_ids',$goods_category_id);
|
|
|
- $list = $list->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');
|
|
|
- if($goods_category_id) $this->count->whereFindInSet('mw.category_ids',$goods_category_id);
|
|
|
- $this->count = $this->count->field([
|
|
|
- 'mw.*'])
|
|
|
- ->where($this->searchWhere)->where($this->queryWhere())
|
|
|
- ->count();
|
|
|
+ $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();
|
|
|
+ $distances = DistributeLeafletsService::locationIds($this->lon, $this->lat,0,array_keys(array_column($list, 'distance','id')));
|
|
|
+ foreach ($list as &$item){
|
|
|
+ $item['user_distance'] = $distances[$item['id']]??0;
|
|
|
}
|
|
|
return $list;
|
|
|
}
|
|
|
@@ -141,54 +118,12 @@ 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();*/
|
|
|
- return $this->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;
|
|
|
- }
|
|
|
-
|
|
|
}
|