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 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 queryDriverPosition(String lon, String lat, Double scope) throws Exception { List 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 locations = mongoTemplate.find(query, Location.class); List collect = locations.stream().map(Location::getDriverId).collect(Collectors.toList()); List drivers = this.selectList(new EntityWrapper().in("id", collect).eq("approvalStatus", 2).eq("serverStatus", 1).eq("status", 1)); collect = drivers.stream().map(Driver::getId).collect(Collectors.toList()); List driverWorks = driverWorkService.selectList(new EntityWrapper().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 distance = GeodesyUtil.getDistance(value, lon + "," + lat); nearbyDriverWarpper.setDistance(distance.get("WGS84") / 1000); nearbyDriverWarpper.setDriverId(driverWork.getDriverId()); list.add(nearbyDriverWarpper); } } return list; } }