| | |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.google.common.collect.ImmutableMap; |
| | | import com.xiaopeng.api.dto.account.UcUserInfo; |
| | | import com.xiaopeng.api.dto.pushMessage.SendMessageDTO; |
| | | import com.xiaopeng.api.dto.map.OrderRouteAndFareDto; |
| | | import com.xiaopeng.api.dto.operation.LonLatDto; |
| | | import com.xiaopeng.api.dto.vehicleConvoy.ServiceVehicleListDto; |
| | | import com.xiaopeng.api.dto.vehicleConvoy.VehicleTemperatureDto; |
| | | import com.xiaopeng.api.feignClient.account.UserResourcesClient; |
| | | import com.xiaopeng.api.feignClient.automaticPilot.XpuVinClient; |
| | | import com.xiaopeng.api.feignClient.map.AdcFencePushClient; |
| | | import com.xiaopeng.api.feignClient.map.XpMapClient; |
| | | import com.xiaopeng.api.feignClient.operation.XpElectronicClient; |
| | | import com.xiaopeng.api.feignClient.operation.XpSystemSettingClient; |
| | | import com.xiaopeng.api.feignClient.order.XpOrderClient; |
| | | import com.xiaopeng.api.feignClient.order.XpTestOrderClient; |
| | | import com.xiaopeng.api.feignClient.pushMessage.XpPushMessageClient; |
| | |
| | | import com.xiaopeng.api.model.operation.XpElectronicFenceArea; |
| | | import com.xiaopeng.api.model.order.XpOrder; |
| | | import com.xiaopeng.api.model.order.XpTestOrder; |
| | | import com.xiaopeng.api.model.vehicleConvoy.*; |
| | | import com.xiaopeng.api.model.vehicleConvoy.XpFleetOperations; |
| | | import com.xiaopeng.api.model.vehicleConvoy.XpFleetVehicle; |
| | | import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; |
| | | import com.xiaopeng.api.model.vehicleConvoy.XpVehicleAnnualRecord; |
| | | import com.xiaopeng.api.vo.automaticPilot.VehiclePosition; |
| | | import com.xiaopeng.api.vo.operation.ElectronicFenceDetailVo; |
| | | import com.xiaopeng.api.vo.operation.RouteVo; |
| | | import com.xiaopeng.api.vo.vehicleConvoy.*; |
| | | import com.xiaopeng.common.core.constant.CacheConstants; |
| | | import com.xiaopeng.common.core.domain.R; |
| | | import com.xiaopeng.common.core.enums.OrderStatusEnum; |
| | | import com.xiaopeng.common.core.enums.PushMessageTypeEnum; |
| | | import com.xiaopeng.common.core.exception.ServiceException; |
| | | import com.xiaopeng.common.core.utils.DateUtils; |
| | | import com.xiaopeng.common.core.utils.GeodesyUtil; |
| | | import com.xiaopeng.common.core.web.page.PageInfo; |
| | | import com.xiaopeng.common.redis.service.RedisService; |
| | | import com.xiaopeng.evi.oss.service.AliOssService; |
| | | import com.xiaopeng.vehicleConvoy.constant.I18nKeyConstant; |
| | | import com.xiaopeng.vehicleConvoy.mapper.XpFleetMapper; |
| | | import com.xiaopeng.vehicleConvoy.mapper.XpFleetOperationsMapper; |
| | | import com.xiaopeng.vehicleConvoy.mapper.XpVehicleMapper; |
| | | import com.xiaopeng.vehicleConvoy.model.dto.*; |
| | | import com.xiaopeng.vehicleConvoy.model.importExcel.XpVehicleImportExcel; |
| | | import com.xiaopeng.vehicleConvoy.model.query.*; |
| | | import com.xiaopeng.vehicleConvoy.model.vo.XpVehicleVO; |
| | | import com.xiaopeng.vehicleConvoy.service.IXpFleetService; |
| | | import com.xiaopeng.vehicleConvoy.service.IXpVehicleAnnualRecordService; |
| | | import com.xiaopeng.vehicleConvoy.service.IXpFleetVehicleService; |
| | | import com.xiaopeng.vehicleConvoy.service.IXpVehicleAnnualRecordService; |
| | | import com.xiaopeng.vehicleConvoy.service.IXpVehicleService; |
| | | import com.xiaopeng.vehicleConvoy.util.VehicleControlUtil; |
| | | import lombok.extern.slf4j.Slf4j; |
| | |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.context.i18n.LocaleContextHolder; |
| | | import org.springframework.data.geo.Point; |
| | | 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.util.CollectionUtils; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.time.LocalTime; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | import java.util.regex.Pattern; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * <p> |
| | |
| | | private RedisService redisService; |
| | | @Autowired |
| | | private MongoTemplate mongoTemplate; |
| | | @Resource |
| | | private XpMapClient xpMapClient; |
| | | @Autowired |
| | | private AliOssService aliOssService; |
| | | @Autowired |
| | |
| | | return super.listByIds(ids); |
| | | } |
| | | |
| | | /** |
| | | * |
| | | * @param orderId |
| | | * @param orderType 订单类型(1=用户单,2=测试单) |
| | | * @return |
| | | */ |
| | | @Override |
| | | public List<XpVehicle> listAvailableVehicles(Long orderId, Integer orderType) { |
| | | // 1. 通过订单ID查询订单信息,获取区域ID |
| | | Long areaId = null; |
| | | |
| | | Double longitude =null;//经度 |
| | | Double latitude =null;//纬度 |
| | | if (null == orderType || 1 == orderType) { |
| | | R<XpOrder> orderResult = xpOrderClient.queryOrderById(orderId); |
| | | if (orderResult == null || orderResult.getData() == null) { |
| | |
| | | |
| | | XpOrder order = orderResult.getData(); |
| | | areaId = order.getXpElectronicFenceAreaId(); |
| | | longitude = order.getStartLon(); |
| | | latitude = order.getStartLat(); |
| | | } else { |
| | | XpTestOrder testOrder = xpTestOrderClient.queryOrderById(orderId).getData(); |
| | | areaId = testOrder.getXpElectronicFenceAreaId(); |
| | | longitude = testOrder.getStartLon(); |
| | | latitude = testOrder.getStartLat(); |
| | | } |
| | | |
| | | if (areaId == null) { |
| | |
| | | // 排序:按电量降序、入库时间降序 |
| | | wrapper.orderByDesc(XpVehicle::getCurrentElectricity) |
| | | .orderByDesc(XpVehicle::getWarehousingTime); |
| | | List<XpVehicle> list = this.list(wrapper); |
| | | //获取车的位置 和订单的位置 并计算 距离 和 时间 |
| | | if(!list.isEmpty()){ |
| | | for (XpVehicle xpVehicle : list) { |
| | | |
| | | return this.list(wrapper); |
| | | VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class); |
| | | |
| | | if(vehiclePosition == null){ |
| | | continue; |
| | | } |
| | | |
| | | OrderRouteAndFareDto dto = new OrderRouteAndFareDto(); |
| | | dto.setOrderId(orderId); |
| | | |
| | | LonLatDto origin = new LonLatDto(); |
| | | origin.setLongitude(longitude); |
| | | origin.setLatitude(latitude); |
| | | dto.setOrigin(origin); |
| | | |
| | | LonLatDto destination = new LonLatDto(); |
| | | destination.setLongitude(vehiclePosition.getPoint().getX()); |
| | | destination.setLatitude(vehiclePosition.getPoint().getY()); |
| | | dto.setDestination(destination); |
| | | dto.setRouteType(1); |
| | | // dto.setVehicleId(xpVehicle.getId()); |
| | | |
| | | R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto); |
| | | if (200 != routeVoR.getCode()) { |
| | | throw new RuntimeException("获取订单线路失败"); |
| | | } |
| | | if(routeVoR.getData() != null){ |
| | | |
| | | xpVehicle.setArrivalDistance(routeVoR.getData().getDistance()); |
| | | xpVehicle.setArrivalTimeSecond(routeVoR.getData().getDuration()); |
| | | if(routeVoR.getData().getDuration() != null){ |
| | | |
| | | BigDecimal time = new BigDecimal(routeVoR.getData().getDuration()); |
| | | if(time.compareTo(new BigDecimal("60"))<0){ //秒 |
| | | xpVehicle.setArrivalTime(time.toPlainString()+"秒"); |
| | | }else if(time.compareTo(new BigDecimal("60"))>0 && time.compareTo(new BigDecimal("3600"))<0){//分 |
| | | BigDecimal min = time.divide(new BigDecimal("60"), 0, RoundingMode.HALF_UP); |
| | | xpVehicle.setArrivalTime(min.toPlainString()+"分钟"); |
| | | }else if(time.compareTo(new BigDecimal("3600"))>0){//小时 |
| | | // 计算小时和分钟 |
| | | long totalSeconds = time.longValue(); |
| | | long hours = totalSeconds / 3600; |
| | | long minutes = (totalSeconds % 3600) / 60; |
| | | StringBuilder timeStr = new StringBuilder(); |
| | | if (hours > 0) { |
| | | timeStr.append(hours).append("小时"); |
| | | } |
| | | if (minutes > 0 || hours == 0) { |
| | | timeStr.append(minutes).append("分钟"); |
| | | } |
| | | xpVehicle.setArrivalTime(timeStr.toString()); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | // 按预计到达时间(秒)升序排序 |
| | | list.sort(Comparator.comparing(XpVehicle::getArrivalTimeSecond, Comparator.nullsLast(Comparator.naturalOrder()))); |
| | | } |
| | | return list; |
| | | } |
| | | |
| | | @Override |