package com.stylefeng.guns.modular.system.service.impl; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar; import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService; import com.stylefeng.guns.modular.specialTrain.server.impl.OrderPrivateCarServiceImpl; import com.stylefeng.guns.modular.system.dao.DriverMapper; import com.stylefeng.guns.modular.system.dao.DriverServiceMapper; import com.stylefeng.guns.modular.system.model.Company; import com.stylefeng.guns.modular.system.model.Driver; import com.stylefeng.guns.modular.system.model.DriverService; import com.stylefeng.guns.modular.system.service.ICompanyCityService; import com.stylefeng.guns.modular.system.service.IDriverService; import com.stylefeng.guns.modular.system.util.GDMapElectricFenceUtil; import com.stylefeng.guns.modular.system.util.GDMapGeocodingUtil; import com.stylefeng.guns.modular.system.util.RedisUtil; import com.stylefeng.guns.modular.system.warpper.BaseWarpper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.*; import java.util.stream.Collectors; @Service public class DriverServiceImpl extends ServiceImpl implements IDriverService { @Resource private DriverMapper driverMapper; @Resource private DriverServiceMapper driverServiceMapper; @Autowired private RedisUtil redisUtil; @Autowired private GDMapElectricFenceUtil gdMapElectricFenceUtil; @Autowired private ICompanyCityService companyCityService; @Autowired private OrderPrivateCarServiceImpl orderPrivateCarServiceImpl; @Autowired private IOrderPrivateCarService orderPrivateCarService; /** * 获取distance公里内空闲司机数量 * @param type 业务类型(1=专车,2=快车,3=城际,4=小件物流-同城,5=小件物流-跨城,6=公务用车) * @param lon * @param lat * @return * @throws Exception */ @Override public List queryIdleDriver(Integer type, Double lon, Double lat, Double distance, Integer companyId) throws Exception { List drivers = driverMapper.queryIdleDriver(type, companyId); List list = new ArrayList<>(); for(Driver driver : drivers){ String value = redisUtil.getValue("DRIVER" + String.valueOf(driver.getId())); if(null != value){ /*Map distance1 = gdMapElectricFenceUtil.getDistance(lon + "," + lat, value, 0);//计算距离 double d = Double.valueOf(distance1.get("distance")).doubleValue();*/ double d = GDMapGeocodingUtil.getDistance(lat,lon,Double.parseDouble(value.split(",")[1]),Double.parseDouble(value.split(",")[0])); if(d < (distance * 1000)){ list.add(driver); } }else{ // System.err.println(driver.getName() + "-----------------没有上传经纬度----------------"); } } return list; } /** * 获取给定车型且空闲的司机 * @param type * @param serverCarModelId * @param lon * @param lat * @param distance * @param companyId * @return * @throws Exception */ @Override public List queryIdleDriver(Integer type, Integer serverCarModelId, Double lon, Double lat, Double distance, Integer companyId) throws Exception { List drivers = driverMapper.queryIdleDriver_(type, serverCarModelId, companyId); List list = new ArrayList<>(); for(Driver driver : drivers){ int count = orderPrivateCarService.selectCount(new EntityWrapper().eq("driverId", driver.getId()) .in("state", Arrays.asList(2, 3, 4, 5, 6, 11)).eq("isDelete", 1)); if(0 != count){ continue; } String value = redisUtil.getValue("DRIVER" + String.valueOf(driver.getId())); if(null != value){ /*Map distance1 = gdMapElectricFenceUtil.getDistance(lon + "," + lat, value, 0);//计算距离 double d = Double.valueOf(distance1.get("distance")).doubleValue();*/ // double d = GDMapGeocodingUtil.getDistance(lat,lon,Double.parseDouble(value.split(",")[1]),Double.parseDouble(value.split(",")[0])); double d = gdMapElectricFenceUtil.getDrivingRoute(lat,lon,Double.parseDouble(value.split(",")[1]),Double.parseDouble(value.split(",")[0])); if(d < (distance * 1000)){ list.add(driver); } } } return list; } /** * 获取给定车型且空闲的司机 * @param type * @param serverCarModelId * @param lon * @param lat * @param distance * @param companyId * @return */ @Override public List queryIdleDriver_(Integer type, Integer serverCarModelId, Double lon, Double lat, Double distance, Integer companyId) { List drivers = driverMapper.queryIdleDriverService_(type, serverCarModelId, companyId); List list = new ArrayList<>(); for(Driver driver : drivers){ int count = orderPrivateCarService.selectCount(new EntityWrapper().eq("driverId", driver.getId()) .in("state", Arrays.asList(2, 3, 4, 11)) .ne("orderType",2) .eq("isDelete", 1)); if(0 != count){ continue; } String value = redisUtil.getValue("DRIVER" + driver.getId()); if(null != value){ /*Map distance1 = gdMapElectricFenceUtil.getDistance(lon + "," + lat, value, 0);//计算距离 double d = Double.valueOf(distance1.get("distance")).doubleValue();*/ // double d = GDMapGeocodingUtil.getDistance(lat,lon,Double.parseDouble(value.split(",")[1]),Double.parseDouble(value.split(",")[0])); double d = gdMapElectricFenceUtil.getDrivingRoute(lat,lon,Double.parseDouble(value.split(",")[1]),Double.parseDouble(value.split(",")[0])); if(d < (distance * 1000)){ list.add(driver); } } } return list; } /** * 根据订单id获取司机数据 * @param orderId * @return * @throws Exception */ @Override public Map queryOrderDriver(Integer orderId, Integer orderType) throws Exception { return driverMapper.queryOrderDriver(orderId, orderType); } /** * 获取司机详情 * @param id * @return * @throws Exception */ @Override public Map queryDriverInfo(Integer id) throws Exception { Map map = driverMapper.queryDriverInfo(id); return map; } /** * 获取司机的业务类型 * @param uid * @return * @throws Exception */ @Override public List queryBusiness(Integer uid) throws Exception { List list = driverServiceMapper.queryBusiness(uid, null); List maps = new ArrayList<>(); for (DriverService d : list){ BaseWarpper baseWarpper = new BaseWarpper(); baseWarpper.setId(d.getType()); switch (d.getType()){ case 1: baseWarpper.setName("专车"); break; case 2: baseWarpper.setName("快车"); break; case 3: baseWarpper.setName("机场专线"); break; case 4: baseWarpper.setName("同城小件物流"); break; case 5: baseWarpper.setName("跨城小件物流"); break; } maps.add(baseWarpper); } return maps; } @Override public List queryDriverLimitTen(Integer type, Double lon, Double lat) { List drivers = driverMapper.queryIdleDriver(type, null); if(CollectionUtils.isEmpty(drivers)){ return new ArrayList<>(); } Iterator iterator = drivers.iterator(); while (iterator.hasNext()){ Driver driver = iterator.next(); String value = redisUtil.getValue("DRIVER" + driver.getId()); if(null != value){ double d = GDMapGeocodingUtil.getDistance(lat,lon,Double.parseDouble(value.split(",")[1]),Double.parseDouble(value.split(",")[0])); driver.setLon(Double.parseDouble(value.split(",")[0])); driver.setLat(Double.parseDouble(value.split(",")[1])); driver.setDistance(d); }else { System.err.println(driver.getName() + "------没有上传经纬度------"); iterator.remove(); } } if(drivers.size() > 10){ drivers.sort(Comparator.comparing(Driver::getDistance)); return drivers.stream().limit(10).collect(Collectors.toList()); }else { return drivers; } } }