package com.agentdriving.user.modular.system.service.impl;
|
|
import com.agentdriving.user.core.util.ToolUtil;
|
import com.agentdriving.user.modular.system.dao.DriverMapper;
|
import com.agentdriving.user.modular.system.model.Driver;
|
import com.agentdriving.user.modular.system.model.DriverWork;
|
import com.agentdriving.user.modular.system.service.IDriverService;
|
import com.agentdriving.user.modular.system.service.IDriverWorkService;
|
import com.baomidou.mybatisplus.mapper.EntityWrapper;
|
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
|
import com.agentdriving.user.modular.system.util.GeodesyUtil;
|
import com.agentdriving.user.modular.system.util.RedisUtil;
|
import com.agentdriving.user.modular.system.util.mongodb.model.Location;
|
import com.agentdriving.user.modular.system.warpper.NearbyDriverWarpper;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.data.geo.Circle;
|
import org.springframework.data.geo.Distance;
|
import org.springframework.data.geo.Metrics;
|
import org.springframework.data.mongodb.core.MongoTemplate;
|
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
|
import org.springframework.data.mongodb.core.query.Criteria;
|
import org.springframework.data.mongodb.core.query.Query;
|
import org.springframework.stereotype.Service;
|
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.stream.Collectors;
|
|
/**
|
* 司机
|
* @author pzb
|
* @Date 2023/2/8 18:52
|
*/
|
@Service
|
public class DriverServiceImpl extends ServiceImpl<DriverMapper, Driver> implements IDriverService {
|
|
@Autowired
|
private MongoTemplate mongoTemplate;
|
|
@Autowired
|
private IDriverWorkService driverWorkService;
|
|
@Autowired
|
private RedisUtil redisUtil;
|
|
|
/**
|
* 获取5公里范围内的司机
|
* @param lon
|
* @param lat
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public List<NearbyDriverWarpper> queryDriverPosition(String lon, String lat, Double scope) throws Exception {
|
List<NearbyDriverWarpper> list = new ArrayList<>();
|
//找到中心点
|
GeoJsonPoint geoJsonPoint = new GeoJsonPoint(Double.valueOf(lon), Double.valueOf(lat));
|
//构造半径
|
Distance distanceR = new Distance(scope, Metrics.KILOMETERS);
|
//画圆
|
Circle circle = new Circle(geoJsonPoint, distanceR);
|
// 构造query对象
|
Query query = Query.query(Criteria.where("location").withinSphere(circle));
|
List<Location> locations = mongoTemplate.find(query, Location.class);
|
List<Integer> collect = locations.stream().map(Location::getDriverId).collect(Collectors.toList());
|
List<Driver> drivers = this.selectList(new EntityWrapper<Driver>().in("id", collect).eq("approvalStatus", 2).eq("serverStatus", 1).eq("status", 1));
|
collect = drivers.stream().map(Driver::getId).collect(Collectors.toList());
|
List<DriverWork> driverWorks = driverWorkService.selectList(new EntityWrapper<DriverWork>().in("driverId", collect).eq("status", 1));
|
for (DriverWork driverWork : driverWorks) {
|
String value = redisUtil.getValue("DRIVER" + driverWork.getDriverId());
|
if(ToolUtil.isNotEmpty(value)){
|
NearbyDriverWarpper nearbyDriverWarpper = new NearbyDriverWarpper();
|
nearbyDriverWarpper.setLonLat(value);
|
Map<String, Double> distance = GeodesyUtil.getDistance(value, lon + "," + lat);
|
nearbyDriverWarpper.setDistance(distance.get("WGS84") / 1000);
|
nearbyDriverWarpper.setDriverId(driverWork.getDriverId());
|
list.add(nearbyDriverWarpper);
|
}
|
}
|
return list;
|
}
|
|
|
|
|
|
|
|
}
|