| | |
| | | package com.xiaopeng.operation.utils; |
| | | |
| | | import cn.hutool.core.bean.BeanUtil; |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.xiaopeng.api.dto.automaticPilot.PushOrderDto; |
| | | import com.xiaopeng.api.dto.map.RouteAndFareDto; |
| | | import com.xiaopeng.api.dto.operation.LonLatDto; |
| | | import com.xiaopeng.api.dto.operation.VehiclePositionByVinDto; |
| | | import com.xiaopeng.api.dto.pushMessage.SendMessageDTO; |
| | | import com.xiaopeng.api.dto.vehicleConvoy.BaseVehicleUserDto; |
| | | import com.xiaopeng.api.feignClient.automaticPilot.OrderMissionClient; |
| | | import com.xiaopeng.api.feignClient.map.XpMapClient; |
| | | import com.xiaopeng.api.feignClient.order.XpCruiseOrderClient; |
| | | import com.xiaopeng.api.feignClient.order.XpOrderClient; |
| | | import com.xiaopeng.api.feignClient.pushMessage.XpPushMessageClient; |
| | | import com.xiaopeng.api.feignClient.vehicleConvoy.UserVehicleClient; |
| | | import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient; |
| | | import com.xiaopeng.api.model.operation.XpElectronicFence; |
| | |
| | | import com.xiaopeng.api.vo.operation.VehiclePositionVo; |
| | | import com.xiaopeng.api.vo.vehicleConvoy.AddTaxiPassengerVo; |
| | | import com.xiaopeng.common.core.constant.CacheConstants; |
| | | import com.xiaopeng.common.core.constant.Constants; |
| | | import com.xiaopeng.common.core.domain.R; |
| | | import com.xiaopeng.common.redis.service.RedisService; |
| | | import com.xiaopeng.operation.mapper.XpElectronicFenceMapper; |
| | |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.*; |
| | | import java.util.concurrent.LinkedBlockingQueue; |
| | | import java.util.concurrent.ThreadPoolExecutor; |
| | | import java.util.concurrent.TimeUnit; |
| | | import java.util.stream.Collectors; |
| | | |
| | |
| | | @Resource |
| | | private RedisService redisService; |
| | | |
| | | @Autowired |
| | | @Resource |
| | | private XpPointService xpPointService; |
| | | |
| | | @Autowired |
| | | @Resource |
| | | private IXpElectronicFenceAreaService xpElectronicFenceAreaService; |
| | | |
| | | @Autowired |
| | | @Resource |
| | | private XpOrderClient xpOrderClient; |
| | | |
| | | @Autowired |
| | | @Resource |
| | | private VehiclePositionService vehiclePositionService; |
| | | |
| | | @Autowired |
| | | @Resource |
| | | private IXpTradingStrategyService xpTradingStrategyService; |
| | | |
| | | @Autowired |
| | | @Resource |
| | | private XpCruiseOrderClient xpCruiseOrderClient; |
| | | |
| | | @Autowired |
| | | @Resource |
| | | private XpVehicleClient xpVehicleClient; |
| | | |
| | | @Autowired |
| | | @Resource |
| | | private RedissonClient redissonClient; |
| | | |
| | | @Autowired |
| | | @Resource |
| | | private XpMapClient xpMapClient; |
| | | // |
| | | @Autowired |
| | | @Resource |
| | | private OrderMissionClient orderMissionClient; |
| | | |
| | | @Resource |
| | | private XpPushMessageClient xpPushMessageClient; |
| | | |
| | | @Resource |
| | | private XpElectronicFenceMapper xpElectronicFenceMapper; |
| | | |
| | | |
| | | // 自定义线程池 |
| | | private static final ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); |
| | | |
| | | static { |
| | | threadPoolTaskExecutor.setCorePoolSize(50); |
| | | threadPoolTaskExecutor.setCorePoolSize(20); |
| | | threadPoolTaskExecutor.setMaxPoolSize(100); |
| | | threadPoolTaskExecutor.setQueueCapacity(20); |
| | | threadPoolTaskExecutor.setKeepAliveSeconds(60); |
| | | threadPoolTaskExecutor.setThreadNamePrefix("taskOrder-"); |
| | | threadPoolTaskExecutor.initialize(); |
| | | } |
| | | |
| | | @Autowired |
| | | private XpElectronicFenceMapper xpElectronicFenceMapper; |
| | | |
| | | /** |
| | | * 5秒执行一次 |
| | |
| | | // 后台配置的规则 |
| | | String planRule = firstElement.split("_")[7]; |
| | | |
| | | |
| | | // 经纬度 |
| | | String[] split = lonLat.split(","); |
| | | |
| | | // 5轮找车辆 |
| | | //每次查找车辆推单后的等待秒数 |
| | | int sleepTime = 3; |
| | | Integer onePushTime = xpTradingStrategy.getOnePushTime(); |
| | | int count = onePushTime / 3; |
| | | Double onePushDistance = xpTradingStrategy.getOnePushDistance(); |
| | | int count = onePushTime / sleepTime; |
| | | // 第一轮推单 |
| | | processPushOrder(quoteName, count, uid, split, orderNo, xpTradingStrategy, distance, duration, planRule); |
| | | |
| | | // |
| | | // for (int i = 0; i < count; i++) { |
| | | // // 根据距离找车 |
| | | // // 车多则根据配置找具体车数量 根据距离最近 |
| | | // List<VehiclePosition> availableVehiclesNearby = vehiclePositionService.findAvailableVehiclesNearby(Double.parseDouble(split[0]), Double.parseDouble(split[1]), one.getOnePushDistance(), one.getSimultaneouslyOrderCount()); |
| | | // if (!availableVehiclesNearby.isEmpty()) { |
| | | // if (availableVehiclesNearby.size() > 1) { |
| | | // // 走权重 |
| | | // } else { |
| | | // // 直接派单 定义一个锁来锁定车辆 |
| | | // VehiclePosition vehiclePosition = availableVehiclesNearby.get(0); |
| | | // Long vehicleId = vehiclePosition.getVehicle_id(); |
| | | // // 查询车辆状态 |
| | | // VehiclePosition vehicleId1 = vehiclePositionService.findByVehicleId(vehicleId); |
| | | // if (vehicleId1.getStatus() != 1 || vehicleId1.getState() != 0) { |
| | | // continue; |
| | | // } |
| | | // if (vehiclePosition.getHasOrder() == 1) { |
| | | // // 关闭巡游单子 TODO |
| | | // } |
| | | // |
| | | // AddTaxiPassengerVo addTaxiPassengerVo = new AddTaxiPassengerVo(); |
| | | // addTaxiPassengerVo.setVin(vehiclePosition.getVin()); |
| | | // addTaxiPassengerVo.setUid(uid); |
| | | // addTaxiPassengerVo.setOrderNo(orderNo); |
| | | // // TODO |
| | | // addTaxiPassengerVo.setAppId(""); |
| | | // BaseVehicleUserDto baseVehicleUserDto = userVehicleClient.addTaxiPassenger(addTaxiPassengerVo); |
| | | // if (baseVehicleUserDto.getCode() == 200) { |
| | | // redisService.popFirstElement(quoteName); |
| | | // |
| | | // } |
| | | // } |
| | | // |
| | | // } |
| | | // } |
| | | |
| | | log.info("开始第一轮推单 {}", orderNo); |
| | | Boolean processed = processPushOrder(quoteName, count, sleepTime, uid, split, orderNo, xpTradingStrategy, onePushDistance, distance, duration, planRule); |
| | | if(processed){ |
| | | log.info("订单推送成功 {}", orderNo); |
| | | return; |
| | | } |
| | | // 第二轮推单 |
| | | Integer twoPushTime = xpTradingStrategy.getTwoPushTime(); |
| | | count = twoPushTime / 3; |
| | | processPushOrder(quoteName, count, uid, split, orderNo, xpTradingStrategy, distance, duration, planRule); |
| | | Double twoPushDistance = xpTradingStrategy.getTwoPushDistance(); |
| | | count = twoPushTime / sleepTime; |
| | | log.info("开始第二轮推单 {}", orderNo); |
| | | processed = processPushOrder(quoteName, count, sleepTime, uid, split, orderNo, xpTradingStrategy, twoPushDistance, distance, duration, planRule); |
| | | if(processed){ |
| | | log.info("订单推送成功 {}", orderNo); |
| | | return; |
| | | } |
| | | |
| | | // 第三轮推单 |
| | | Integer threePushTime = xpTradingStrategy.getThreePushTime(); |
| | | count = threePushTime / 3; |
| | | processPushOrder(quoteName, count, uid, split, orderNo, xpTradingStrategy, distance, duration, planRule); |
| | | Double threePushDistance = xpTradingStrategy.getThreePushDistance(); |
| | | count = threePushTime / sleepTime; |
| | | log.info("开始第三轮推单 {}", orderNo); |
| | | processed = processPushOrder(quoteName, count, sleepTime, uid, split, orderNo, xpTradingStrategy, threePushDistance, distance, duration, planRule); |
| | | if(processed){ |
| | | log.info("订单推送成功 {}", orderNo); |
| | | return; |
| | | } |
| | | |
| | | // 第四轮推单 |
| | | Integer fourPushTime = xpTradingStrategy.getFourPushTime(); |
| | | count = fourPushTime / 3; |
| | | processPushOrder(quoteName, count, uid, split, orderNo, xpTradingStrategy, distance, duration, planRule); |
| | | Double fourPushDistance = xpTradingStrategy.getFourPushDistance(); |
| | | count = fourPushTime / sleepTime; |
| | | log.info("开始第四轮推单 {}", orderNo); |
| | | processed = processPushOrder(quoteName, count, sleepTime, uid, split, orderNo, xpTradingStrategy, fourPushDistance, distance, duration, planRule); |
| | | if(processed){ |
| | | log.info("订单推送成功 {}", orderNo); |
| | | return; |
| | | } |
| | | |
| | | // 第五轮推单 |
| | | Integer fivePushTime = xpTradingStrategy.getFivePushTime(); |
| | | count = fivePushTime / 3; |
| | | processPushOrder(quoteName, count, uid, split, orderNo, xpTradingStrategy, distance, duration, planRule); |
| | | |
| | | Double fivePushDistance = xpTradingStrategy.getFivePushDistance(); |
| | | count = fivePushTime / sleepTime; |
| | | log.info("开始第五轮推单 {}", orderNo); |
| | | processed = processPushOrder(quoteName, count, sleepTime, uid, split, orderNo, xpTradingStrategy, fivePushDistance, distance, duration, planRule); |
| | | if(processed){ |
| | | log.info("订单推送成功 {}", orderNo); |
| | | return; |
| | | } |
| | | |
| | | // 取消订单 |
| | | R<XpOrder> xpOrderR = xpOrderClient.queryOrderById(Long.valueOf(orderId)); |
| | | if (xpOrderR.getCode() == 200) { |
| | | if (xpOrderR.getData().getStatus() == 1) { |
| | | XpOrder xpOrder = xpOrderR.getData(); |
| | | if (xpOrder.getStatus() == 1) { |
| | | log.error("五轮推单结束,无车辆接单,执行取消订单 {}", orderNo); |
| | | xpOrderClient.cancelOrder(orderId); |
| | | |
| | | // 最终没找到车 |
| | | //推送订单状态给乘客 |
| | | SendMessageDTO dto = new SendMessageDTO(); |
| | | dto.setAppUserId(xpOrder.getAppUserId().toString()); |
| | | dto.setMessage("{\"type\":\"ORDER_STATUS\",\"content\":\"{\\\"orderId\\\":\\\"" + orderId + "\\\",\\\"status\\\":0}\",\"timestamp\":\"" + System.currentTimeMillis() + "\"}"); |
| | | R<String> stringR = xpPushMessageClient.sendStatus(dto); |
| | | //推送失败,重试3次 |
| | | if(stringR.getCode() != Constants.SUCCESS){ |
| | | ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>()); |
| | | executor.execute(() -> { |
| | | for (int i = 0; i < 3; i++) { |
| | | R<String> stringR1 = xpPushMessageClient.sendStatus(dto); |
| | | if(stringR1.getCode() == Constants.SUCCESS){ |
| | | break; |
| | | } |
| | | try { |
| | | Thread.sleep(1000); |
| | | } catch (InterruptedException e) { |
| | | throw new RuntimeException(e); |
| | | } |
| | | log.info("五轮推单结束后,无车辆接单,推送取消消息失败:{} {} {}", stringR1.getMsg(), JSON.toJSONString(dto), xpOrder.getOrderNumber()); |
| | | } |
| | | }); |
| | | } |
| | | //将订单从队列中移除 |
| | | log.info("五轮推单结束,无车辆接单,执行队列移除订单 {}", orderNo); |
| | | redisService.popFirstElement(quoteName); |
| | | } |
| | | } |
| | |
| | | * @param xpTradingStrategy 规则 |
| | | */ |
| | | @SneakyThrows |
| | | private void processPushOrder(String quoteName, int count, String uid, String[] split, String orderNo, XpTradingStrategy xpTradingStrategy, String distance, String duration, String planRule) { |
| | | // 卡住3秒 |
| | | Thread.sleep(3000); |
| | | System.out.println("进入推单环环节"); |
| | | private Boolean processPushOrder(String quoteName, int count, int sleepTime, String uid, String[] split, String orderNo, XpTradingStrategy xpTradingStrategy, Double pushDistance, String distance, String duration, String planRule) { |
| | | log.info("进入推单环节 单号 {}", orderNo); |
| | | if (count == 0) { |
| | | count = 1; |
| | | } |
| | | // 订单状态 |
| | | R<XpOrder> xpOrderR = xpOrderClient.queryOrderByOrderNo(orderNo); |
| | | if (xpOrderR.getCode() != 200) { |
| | | return; |
| | | return false; |
| | | } |
| | | if (xpOrderR.getData().getStatus() != 1) { |
| | | return; |
| | | return true; |
| | | } |
| | | XpOrder xpOrder = xpOrderR.getData(); |
| | | if (xpOrder.getStatus() == 0) { |
| | | redisService.removeByPattern(quoteName, xpOrder.getOrderNumber()); |
| | | } |
| | | |
| | | // 找出围栏id |
| | | Long xpElectronicFenceAreaId = xpOrder.getXpElectronicFenceAreaId(); |
| | |
| | | XpElectronicFence xpElectronicFence = xpElectronicFenceMapper.selectById(electronicId); |
| | | |
| | | for (int i = 0; i < count; i++) { |
| | | System.out.println("进入找车环节"); |
| | | //等到sleepTime秒钟 |
| | | Thread.sleep(sleepTime * 1000); |
| | | // 根据距离找车 |
| | | // 车多则根据配置找具体车数量 根据距离最近 |
| | | // 更改 暂不限制数量 |
| | | |
| | | List<VehiclePosition> positionList = vehiclePositionService.findAvailableVehiclesNearby(Double.parseDouble(split[0]), Double.parseDouble(split[1]), xpTradingStrategy.getOnePushDistance(), xpTradingStrategy.getSimultaneouslyOrderCount()); |
| | | log.info("根据距离找车 距离 {}KM 经度 {} 维度 {} 查找结果 {}", xpTradingStrategy.getOnePushDistance(), split[0], split[1], positionList); |
| | | List<VehiclePosition> positionList = vehiclePositionService.findAvailableVehiclesNearby(Double.parseDouble(split[0]), Double.parseDouble(split[1]), pushDistance, xpTradingStrategy.getSimultaneouslyOrderCount()); |
| | | log.info("根据距离找车 {} 距离 {}KM 经度 {} 维度 {} 查找结果 {} 单号 {}", orderNo, pushDistance, split[0], split[1], positionList, orderNo); |
| | | // 获取车辆的区域信息 |
| | | if (positionList.isEmpty()) { |
| | | continue; |
| | | } |
| | | List<String> vinList = positionList.stream().map(VehiclePosition::getVin).collect(Collectors.toList()); |
| | | Set<String> vinList = positionList.stream().map(VehiclePosition::getVin).collect(Collectors.toSet()); |
| | | |
| | | // 获取车辆的信息 筛选出可用车辆 |
| | | R<List<String>> vehiclePositionVos = xpVehicleClient.queryVehiclePositionByVin(new VehiclePositionByVinDto(xpElectronicFence.getId(), vinList, xpTradingStrategy.getSimultaneouslyOrderCount())); |
| | | log.info("筛选可用车辆结果 {}", JSON.toJSONString(vehiclePositionVos)); |
| | | log.info("筛选可用车辆结果 {} 单号 {}", JSON.toJSONString(vehiclePositionVos), orderNo); |
| | | if (vehiclePositionVos.getCode() != 200) { |
| | | continue; |
| | | } |
| | |
| | | |
| | | // 找出符合条件的 |
| | | availableVehiclesNearby = availableVehiclesNearby.stream().filter(e -> data.contains(e.getVin())).collect(Collectors.toList()); |
| | | |
| | | // List<VehiclePositionVo> availableVehiclesNearby =vehiclePositionVos.getData(); |
| | | |
| | | if (!availableVehiclesNearby.isEmpty()) { |
| | | if (availableVehiclesNearby.size() > 1) { |
| | | log.info("附近有 {} 辆车,进入权重判断流程", availableVehiclesNearby.size()); |
| | | log.info("附近有 {} 辆车,进入权重判断流程 单号 {}", availableVehiclesNearby.size(), orderNo); |
| | | // 走权重 |
| | | |
| | | // 订单价值 |
| | |
| | | // 时间价值 |
| | | Integer tendencyTime = xpTradingStrategy.getTendencyTime(); |
| | | |
| | | try { |
| | | |
| | | // 电量价值 |
| | | Integer tendencyElectricity = xpTradingStrategy.getTendencyElectricity(); |
| | | // 找出最大的值是那个 |
| | | Integer max = Math.max(tendencyOrderValue, Math.max(tendencyDistance, Math.max(tendencyTime, tendencyElectricity))); |
| | | if (max.equals(tendencyOrderValue)) { |
| | | // 订单价值 |
| | | // 时间差权重 |
| | | Integer weightTimeDifference = xpTradingStrategy.getWeightTimeDifference(); |
| | | // 距离差权重 |
| | | Integer weightDistanceDifference = xpTradingStrategy.getWeightDistanceDifference(); |
| | | // 距离权重 |
| | | Integer weightDistance = xpTradingStrategy.getWeightDistance(); |
| | | // 时间权重 |
| | | Integer weightTime = xpTradingStrategy.getWeightTime(); |
| | | // 电量权重 |
| | | Integer weightElectricity = xpTradingStrategy.getWeightElectricity(); |
| | | |
| | | // 电量价值 |
| | | Integer tendencyElectricity = xpTradingStrategy.getTendencyElectricity(); |
| | | // 找出最大的值是那个 |
| | | Integer max1 = Math.max(weightTimeDifference, Math.max(weightDistanceDifference, Math.max(weightDistance, Math.max(weightTime, weightElectricity)))); |
| | | Integer max = Math.max(tendencyOrderValue, Math.max(tendencyDistance, Math.max(tendencyTime, tendencyElectricity))); |
| | | if (max.equals(tendencyOrderValue)) { |
| | | // 订单价值 |
| | | // 时间差权重 |
| | | Integer weightTimeDifference = xpTradingStrategy.getWeightTimeDifference(); |
| | | // 距离差权重 |
| | | Integer weightDistanceDifference = xpTradingStrategy.getWeightDistanceDifference(); |
| | | // 距离权重 |
| | | Integer weightDistance = xpTradingStrategy.getWeightDistance(); |
| | | // 时间权重 |
| | | Integer weightTime = xpTradingStrategy.getWeightTime(); |
| | | // 电量权重 |
| | | Integer weightElectricity = xpTradingStrategy.getWeightElectricity(); |
| | | |
| | | // 时间差 |
| | | if (max1.equals(weightTimeDifference)) { |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | RouteAndFareDto routeAndFareDto = new RouteAndFareDto(); |
| | | LonLatDto lonLatDto = new LonLatDto(); |
| | | lonLatDto.setLongitude(vehiclePosition.getPoint().getX()); |
| | | lonLatDto.setLatitude(vehiclePosition.getPoint().getY()); |
| | | routeAndFareDto.setOrigin(lonLatDto); |
| | | LonLatDto lonLatDto1 = new LonLatDto(); |
| | | lonLatDto1.setLongitude(Double.valueOf(split[0])); |
| | | lonLatDto1.setLatitude(Double.valueOf(split[1])); |
| | | routeAndFareDto.setDestination(lonLatDto1); |
| | | routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule)); |
| | | R<RouteVo> distanceAndDuration = xpMapClient.getDistanceAndDuration(routeAndFareDto); |
| | | if (distanceAndDuration.getCode() == 200) { |
| | | // 送驾- 接驾 |
| | | Integer durationDifference = Integer.parseInt(duration) - distanceAndDuration.getData().getDuration(); |
| | | vehiclePosition.setTimeDifference(durationDifference); |
| | | } |
| | | } |
| | | } |
| | | // 找出最大的值是那个 |
| | | Integer max1 = Math.max(weightTimeDifference, Math.max(weightDistanceDifference, Math.max(weightDistance, Math.max(weightTime, weightElectricity)))); |
| | | |
| | | if (max1.equals(weightDistanceDifference)) { |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | RouteAndFareDto routeAndFareDto = new RouteAndFareDto(); |
| | | LonLatDto lonLatDto = new LonLatDto(); |
| | | lonLatDto.setLongitude(vehiclePosition.getPoint().getX()); |
| | | lonLatDto.setLatitude(vehiclePosition.getPoint().getY()); |
| | | routeAndFareDto.setOrigin(lonLatDto); |
| | | LonLatDto lonLatDto1 = new LonLatDto(); |
| | | lonLatDto1.setLongitude(Double.valueOf(split[0])); |
| | | lonLatDto1.setLatitude(Double.valueOf(split[1])); |
| | | routeAndFareDto.setDestination(lonLatDto1); |
| | | routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule)); |
| | | R<RouteVo> distanceAndDuration = xpMapClient.getDistanceAndDuration(routeAndFareDto); |
| | | if (distanceAndDuration.getCode() == 200) { |
| | | // 送驾- 接驾 |
| | | Integer distanceDifference = Integer.parseInt(distance) - distanceAndDuration.getData().getDistance(); |
| | | vehiclePosition.setDistanceDifference(distanceDifference); |
| | | // 时间差 |
| | | if (max1.equals(weightTimeDifference)) { |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | RouteAndFareDto routeAndFareDto = new RouteAndFareDto(); |
| | | LonLatDto lonLatDto = new LonLatDto(); |
| | | lonLatDto.setLongitude(vehiclePosition.getPoint().getX()); |
| | | lonLatDto.setLatitude(vehiclePosition.getPoint().getY()); |
| | | routeAndFareDto.setOrigin(lonLatDto); |
| | | LonLatDto lonLatDto1 = new LonLatDto(); |
| | | lonLatDto1.setLongitude(Double.valueOf(split[0])); |
| | | lonLatDto1.setLatitude(Double.valueOf(split[1])); |
| | | routeAndFareDto.setDestination(lonLatDto1); |
| | | if(planRule!=null&& !"null".equals(planRule)){ |
| | | routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule)); |
| | | } |
| | | R<RouteVo> distanceAndDuration = xpMapClient.getDistanceAndDuration(routeAndFareDto); |
| | | if (distanceAndDuration.getCode() == 200) { |
| | | // 送驾- 接驾 |
| | | Integer durationDifference = Integer.parseInt(duration) - distanceAndDuration.getData().getDuration(); |
| | | vehiclePosition.setTimeDifference(durationDifference); |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | if (max1.equals(weightDistance)) { |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | RouteAndFareDto routeAndFareDto = new RouteAndFareDto(); |
| | | LonLatDto lonLatDto = new LonLatDto(); |
| | | lonLatDto.setLongitude(vehiclePosition.getPoint().getX()); |
| | | lonLatDto.setLatitude(vehiclePosition.getPoint().getY()); |
| | | routeAndFareDto.setOrigin(lonLatDto); |
| | | LonLatDto lonLatDto1 = new LonLatDto(); |
| | | lonLatDto1.setLongitude(Double.parseDouble(split[0])); |
| | | lonLatDto1.setLatitude(Double.parseDouble(split[1])); |
| | | // 距离差 |
| | | |
| | | routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule)); |
| | | routeAndFareDto.setDestination(lonLatDto1); |
| | | // 调用地图 获取时间 |
| | | R<RouteVo> r = xpMapClient.getDistanceAndDuration(routeAndFareDto); |
| | | if (r.getCode() == 200) { |
| | | vehiclePosition.setDistance(Double.valueOf(r.getData().getDistance())); |
| | | } else { |
| | | vehiclePosition.setDistance(0.0); |
| | | if (max1.equals(weightDistanceDifference)) { |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | RouteAndFareDto routeAndFareDto = new RouteAndFareDto(); |
| | | LonLatDto lonLatDto = new LonLatDto(); |
| | | lonLatDto.setLongitude(vehiclePosition.getPoint().getX()); |
| | | lonLatDto.setLatitude(vehiclePosition.getPoint().getY()); |
| | | routeAndFareDto.setOrigin(lonLatDto); |
| | | LonLatDto lonLatDto1 = new LonLatDto(); |
| | | lonLatDto1.setLongitude(Double.valueOf(split[0])); |
| | | lonLatDto1.setLatitude(Double.valueOf(split[1])); |
| | | routeAndFareDto.setDestination(lonLatDto1); |
| | | if(planRule!=null&& !"null".equals(planRule)){ |
| | | routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule)); |
| | | } |
| | | R<RouteVo> distanceAndDuration = xpMapClient.getDistanceAndDuration(routeAndFareDto); |
| | | if (distanceAndDuration.getCode() == 200) { |
| | | // 送驾- 接驾 |
| | | Integer distanceDifference = Integer.parseInt(distance) - distanceAndDuration.getData().getDistance(); |
| | | vehiclePosition.setDistanceDifference(distanceDifference); |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | if (max1.equals(weightTime)) { |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | RouteAndFareDto routeAndFareDto = new RouteAndFareDto(); |
| | | LonLatDto lonLatDto = new LonLatDto(); |
| | | lonLatDto.setLongitude(vehiclePosition.getPoint().getX()); |
| | | lonLatDto.setLatitude(vehiclePosition.getPoint().getY()); |
| | | routeAndFareDto.setOrigin(lonLatDto); |
| | | LonLatDto lonLatDto1 = new LonLatDto(); |
| | | lonLatDto1.setLongitude(Double.parseDouble(split[0])); |
| | | lonLatDto1.setLatitude(Double.parseDouble(split[1])); |
| | | |
| | | routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule)); |
| | | routeAndFareDto.setDestination(lonLatDto1); |
| | | // 调用地图 获取时间 |
| | | R<RouteVo> r = xpMapClient.getDistanceAndDuration(routeAndFareDto); |
| | | if (r.getCode() == 200) { |
| | | vehiclePosition.setSecond(r.getData().getDuration()); |
| | | } else { |
| | | vehiclePosition.setSecond(0); |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (max1.equals(weightElectricity)) { |
| | | // 计算车的分数 分数最大是车的size |
| | | availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getCurrentElectricity).reversed()).collect(Collectors.toList()); |
| | | int size = tendencyElectricity; |
| | | // 做比对的分数 |
| | | int temp = availableVehiclesNearby.get(0).getCurrentElectricity(); |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | vehiclePosition.setCurrentElectricityScore(vehiclePosition.getCurrentElectricityScore() + size); |
| | | if (temp != vehiclePosition.getCurrentElectricity()) { |
| | | size--; |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | // 算出总分 再来排序计算 |
| | | for (VehiclePositionVo vehiclePositionVo : availableVehiclesNearby) { |
| | | vehiclePositionVo.setOrderValueTotal(vehiclePositionVo.getCurrentElectricityScore() + vehiclePositionVo.getDistanceScore() + vehiclePositionVo.getTimeScore() + vehiclePositionVo.getDistanceDifference() + vehiclePositionVo.getTimeDifference()); |
| | | } |
| | | availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getOrderValueTotal).reversed()).collect(Collectors.toList()); |
| | | |
| | | |
| | | int size = tendencyOrderValue; |
| | | // 做比对的分数 |
| | | double temp = availableVehiclesNearby.get(0).getOrderValueTotal(); |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | vehiclePosition.setValueScore(vehiclePosition.getValueScore() + size); |
| | | if (temp != vehiclePosition.getOrderValueTotal()) { |
| | | size--; |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | // 距离分数 |
| | | if (max.equals(tendencyDistance)) { |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | RouteAndFareDto routeAndFareDto = new RouteAndFareDto(); |
| | | LonLatDto lonLatDto = new LonLatDto(); |
| | | lonLatDto.setLongitude(vehiclePosition.getPoint().getX()); |
| | | lonLatDto.setLatitude(vehiclePosition.getPoint().getY()); |
| | | routeAndFareDto.setOrigin(lonLatDto); |
| | | LonLatDto lonLatDto1 = new LonLatDto(); |
| | | lonLatDto1.setLongitude(Double.parseDouble(split[0])); |
| | | lonLatDto1.setLatitude(Double.parseDouble(split[1])); |
| | | |
| | | routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule)); |
| | | routeAndFareDto.setDestination(lonLatDto1); |
| | | // 调用地图 获取时间 |
| | | R<RouteVo> r = xpMapClient.getDistanceAndDuration(routeAndFareDto); |
| | | if (r.getCode() == 200) { |
| | | vehiclePosition.setDistance(Double.valueOf(r.getData().getDistance())); |
| | | } else { |
| | | vehiclePosition.setDistance(0.0); |
| | | } |
| | | } |
| | | availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getDistance)).collect(Collectors.toList()); |
| | | int size = tendencyDistance; |
| | | // 做比对的分数 |
| | | double temp = availableVehiclesNearby.get(0).getDistance(); |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | vehiclePosition.setDistanceScore(vehiclePosition.getDistanceScore() + size); |
| | | if (temp != vehiclePosition.getDistance()) { |
| | | size--; |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | // 时间分数 |
| | | if (max.equals(tendencyTime)) { |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | RouteAndFareDto routeAndFareDto = new RouteAndFareDto(); |
| | | LonLatDto lonLatDto = new LonLatDto(); |
| | | lonLatDto.setLongitude(vehiclePosition.getPoint().getX()); |
| | | lonLatDto.setLatitude(vehiclePosition.getPoint().getY()); |
| | | routeAndFareDto.setOrigin(lonLatDto); |
| | | LonLatDto lonLatDto1 = new LonLatDto(); |
| | | lonLatDto1.setLongitude(Double.parseDouble(split[0])); |
| | | lonLatDto1.setLatitude(Double.parseDouble(split[1])); |
| | | |
| | | routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule)); |
| | | routeAndFareDto.setDestination(lonLatDto1); |
| | | // 调用地图 获取时间 |
| | | R<RouteVo> r = xpMapClient.getDistanceAndDuration(routeAndFareDto); |
| | | if (r.getCode() == 200) { |
| | | vehiclePosition.setSecond(r.getData().getDuration()); |
| | | } else { |
| | | vehiclePosition.setSecond(0); |
| | | } |
| | | } |
| | | availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getSecond)).collect(Collectors.toList()); |
| | | int size = tendencyTime; |
| | | // 做比对的分数 |
| | | double temp = availableVehiclesNearby.get(0).getSecond(); |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | vehiclePosition.setTimeScore(vehiclePosition.getTimeScore() + size); |
| | | if (temp != vehiclePosition.getSecond()) { |
| | | size--; |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | // 电量分数 |
| | | if (max.equals(tendencyElectricity)) { |
| | | // 计算车的分数 分数最大是车的size |
| | | availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getCurrentElectricity).reversed()).collect(Collectors.toList()); |
| | | int size = tendencyElectricity; |
| | | // 做比对的分数 |
| | | int temp = availableVehiclesNearby.get(0).getCurrentElectricity(); |
| | | |
| | | int maxTemp = 0; |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | vehiclePosition.setCurrentElectricityScore(vehiclePosition.getCurrentElectricityScore() + size); |
| | | if (temp != vehiclePosition.getCurrentElectricity()) { |
| | | size--; |
| | | } else { |
| | | maxTemp++; |
| | | } |
| | | } |
| | | |
| | | if (maxTemp > 1) { |
| | | // 证明有最高相同电量的 找下一个 |
| | | // 找出最第二大的值是那个 |
| | | // 将四个值放入列表 |
| | | List<Integer> values = Arrays.asList(tendencyOrderValue, tendencyDistance, tendencyTime); |
| | | // 降序排序 |
| | | values.sort(Collections.reverseOrder()); |
| | | // 获取第二大值 |
| | | Integer secondMax = values.get(1); |
| | | |
| | | // 判断第二大的是哪个 |
| | | if (Objects.equals(secondMax, tendencyDistance)) { |
| | | if (max1.equals(weightDistance)) { |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | RouteAndFareDto routeAndFareDto = new RouteAndFareDto(); |
| | | LonLatDto lonLatDto = new LonLatDto(); |
| | |
| | | LonLatDto lonLatDto1 = new LonLatDto(); |
| | | lonLatDto1.setLongitude(Double.parseDouble(split[0])); |
| | | lonLatDto1.setLatitude(Double.parseDouble(split[1])); |
| | | |
| | | routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule)); |
| | | if(planRule!=null&& !"null".equals(planRule)){ |
| | | routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule)); |
| | | } |
| | | routeAndFareDto.setDestination(lonLatDto1); |
| | | // 调用地图 获取时间 |
| | | R<RouteVo> r = xpMapClient.getDistanceAndDuration(routeAndFareDto); |
| | |
| | | } else { |
| | | vehiclePosition.setDistance(0.0); |
| | | } |
| | | |
| | | } |
| | | |
| | | // 分数计算 把时间短的分数调高 |
| | | availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getDistance)).collect(Collectors.toList()); |
| | | int size1 = tendencyDistance; |
| | | // 做比对的分数 |
| | | double temp1 = availableVehiclesNearby.get(0).getDistance(); |
| | | double score = 10; |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | vehiclePosition.setDistanceScore(vehiclePosition.getDistanceScore() + size1); |
| | | if (temp1 != vehiclePosition.getDistance()) { |
| | | size1--; |
| | | } |
| | | vehiclePosition.setDistance(score); |
| | | score--; |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | if (Objects.equals(secondMax, tendencyTime)) { |
| | | if (max1.equals(weightTime)) { |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | RouteAndFareDto routeAndFareDto = new RouteAndFareDto(); |
| | | LonLatDto lonLatDto = new LonLatDto(); |
| | |
| | | LonLatDto lonLatDto1 = new LonLatDto(); |
| | | lonLatDto1.setLongitude(Double.parseDouble(split[0])); |
| | | lonLatDto1.setLatitude(Double.parseDouble(split[1])); |
| | | |
| | | routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule)); |
| | | if(planRule!=null&& !"null".equals(planRule)){ |
| | | routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule)); |
| | | } |
| | | routeAndFareDto.setDestination(lonLatDto1); |
| | | // 调用地图 获取时间 |
| | | R<RouteVo> r = xpMapClient.getDistanceAndDuration(routeAndFareDto); |
| | |
| | | vehiclePosition.setSecond(0); |
| | | } |
| | | } |
| | | // 分数计算 把时间短的分数调高 |
| | | availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getSecond)).collect(Collectors.toList()); |
| | | int size1 = tendencyTime; |
| | | // 做比对的分数 |
| | | double temp1 = availableVehiclesNearby.get(0).getSecond(); |
| | | int score = 10; |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | vehiclePosition.setTimeScore(vehiclePosition.getTimeScore() + size1); |
| | | if (temp1 != vehiclePosition.getSecond()) { |
| | | size1--; |
| | | vehiclePosition.setSecond(score); |
| | | score--; |
| | | } |
| | | |
| | | } |
| | | |
| | | if (max1.equals(weightElectricity)) { |
| | | // 计算车的分数 分数最大是车的size |
| | | availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getCurrentElectricity).reversed()).collect(Collectors.toList()); |
| | | int size = tendencyElectricity; |
| | | // 做比对的分数 |
| | | int temp = availableVehiclesNearby.get(0).getCurrentElectricity(); |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | vehiclePosition.setCurrentElectricityScore(vehiclePosition.getCurrentElectricityScore() + size); |
| | | if (temp != vehiclePosition.getCurrentElectricity()) { |
| | | size--; |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | // 订单价值 |
| | | if (Objects.equals(secondMax, tendencyOrderValue)) { |
| | | // 订单价值 |
| | | // 时间差权重 |
| | | Integer weightTimeDifference = xpTradingStrategy.getWeightTimeDifference(); |
| | | // 距离差权重 |
| | | Integer weightDistanceDifference = xpTradingStrategy.getWeightDistanceDifference(); |
| | | // 距离权重 |
| | | Integer weightDistance = xpTradingStrategy.getWeightDistance(); |
| | | // 时间权重 |
| | | Integer weightTime = xpTradingStrategy.getWeightTime(); |
| | | // 电量权重 |
| | | Integer weightElectricity = xpTradingStrategy.getWeightElectricity(); |
| | | // 算出总分 再来排序计算 |
| | | for (VehiclePositionVo vehiclePositionVo : availableVehiclesNearby) { |
| | | vehiclePositionVo.setOrderValueTotal(vehiclePositionVo.getCurrentElectricityScore() + vehiclePositionVo.getDistanceScore() + vehiclePositionVo.getTimeScore() + vehiclePositionVo.getDistanceDifference() + vehiclePositionVo.getTimeDifference()+vehiclePositionVo.getSecond()+vehiclePositionVo.getDistance().intValue()); |
| | | } |
| | | availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getOrderValueTotal).reversed()).collect(Collectors.toList()); |
| | | |
| | | // 找出最大的值是那个 |
| | | Integer max1 = Math.max(weightTimeDifference, Math.max(weightDistanceDifference, Math.max(weightDistance, Math.max(weightTime, weightElectricity)))); |
| | | |
| | | // 时间差 |
| | | if (max1.equals(weightTimeDifference)) { |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | RouteAndFareDto routeAndFareDto = new RouteAndFareDto(); |
| | | LonLatDto lonLatDto = new LonLatDto(); |
| | | lonLatDto.setLongitude(vehiclePosition.getPoint().getX()); |
| | | lonLatDto.setLatitude(vehiclePosition.getPoint().getY()); |
| | | routeAndFareDto.setOrigin(lonLatDto); |
| | | LonLatDto lonLatDto1 = new LonLatDto(); |
| | | lonLatDto1.setLongitude(Double.valueOf(split[0])); |
| | | lonLatDto1.setLatitude(Double.valueOf(split[1])); |
| | | routeAndFareDto.setDestination(lonLatDto1); |
| | | routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule)); |
| | | R<RouteVo> distanceAndDuration = xpMapClient.getDistanceAndDuration(routeAndFareDto); |
| | | if (distanceAndDuration.getCode() == 200) { |
| | | // 送驾- 接驾 |
| | | Integer durationDifference = Integer.parseInt(duration) - distanceAndDuration.getData().getDuration(); |
| | | vehiclePosition.setTimeDifference(durationDifference); |
| | | } |
| | | } |
| | | int size = tendencyOrderValue; |
| | | // 做比对的分数 |
| | | double temp = availableVehiclesNearby.get(0).getOrderValueTotal(); |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | vehiclePosition.setValueScore(vehiclePosition.getValueScore() + size); |
| | | if (temp != vehiclePosition.getOrderValueTotal()) { |
| | | size--; |
| | | } |
| | | } |
| | | |
| | | if (max1.equals(weightDistanceDifference)) { |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | RouteAndFareDto routeAndFareDto = new RouteAndFareDto(); |
| | | LonLatDto lonLatDto = new LonLatDto(); |
| | | lonLatDto.setLongitude(vehiclePosition.getPoint().getX()); |
| | | lonLatDto.setLatitude(vehiclePosition.getPoint().getY()); |
| | | routeAndFareDto.setOrigin(lonLatDto); |
| | | LonLatDto lonLatDto1 = new LonLatDto(); |
| | | lonLatDto1.setLongitude(Double.valueOf(split[0])); |
| | | lonLatDto1.setLatitude(Double.valueOf(split[1])); |
| | | routeAndFareDto.setDestination(lonLatDto1); |
| | | routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule)); |
| | | R<RouteVo> distanceAndDuration = xpMapClient.getDistanceAndDuration(routeAndFareDto); |
| | | if (distanceAndDuration.getCode() == 200) { |
| | | // 送驾- 接驾 |
| | | Integer distanceDifference = Integer.parseInt(distance) - distanceAndDuration.getData().getDistance(); |
| | | vehiclePosition.setDistanceDifference(distanceDifference); |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | // 距离分数 |
| | | if (max.equals(tendencyDistance)) { |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | RouteAndFareDto routeAndFareDto = new RouteAndFareDto(); |
| | | LonLatDto lonLatDto = new LonLatDto(); |
| | | lonLatDto.setLongitude(vehiclePosition.getPoint().getX()); |
| | | lonLatDto.setLatitude(vehiclePosition.getPoint().getY()); |
| | | routeAndFareDto.setOrigin(lonLatDto); |
| | | LonLatDto lonLatDto1 = new LonLatDto(); |
| | | lonLatDto1.setLongitude(Double.parseDouble(split[0])); |
| | | lonLatDto1.setLatitude(Double.parseDouble(split[1])); |
| | | |
| | | if(planRule!=null&& !"null".equals(planRule)){ |
| | | routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule)); |
| | | } |
| | | routeAndFareDto.setDestination(lonLatDto1); |
| | | // 调用地图 获取时间 |
| | | R<RouteVo> r = xpMapClient.getDistanceAndDuration(routeAndFareDto); |
| | | if (r.getCode() == 200) { |
| | | vehiclePosition.setDistance(Double.valueOf(r.getData().getDistance())); |
| | | } else { |
| | | vehiclePosition.setDistance(0.0); |
| | | } |
| | | } |
| | | // availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getDistance)).collect(Collectors.toList()); |
| | | // int size = tendencyDistance; |
| | | // // 做比对的分数 |
| | | // double temp = availableVehiclesNearby.get(0).getDistance(); |
| | | // for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | // vehiclePosition.setDistanceScore(vehiclePosition.getDistanceScore() + size); |
| | | // if (temp != vehiclePosition.getDistance()) { |
| | | // size--; |
| | | // } |
| | | // } |
| | | |
| | | if (max1.equals(weightDistance)) { |
| | | // 分数计算 把时间短的分数调高 |
| | | availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getDistance)).collect(Collectors.toList()); |
| | | int score = 10; |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | vehiclePosition.setDistanceScore(score); |
| | | score--; |
| | | } |
| | | } |
| | | |
| | | |
| | | // 时间分数 |
| | | if (max.equals(tendencyTime)) { |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | RouteAndFareDto routeAndFareDto = new RouteAndFareDto(); |
| | | LonLatDto lonLatDto = new LonLatDto(); |
| | | lonLatDto.setLongitude(vehiclePosition.getPoint().getX()); |
| | | lonLatDto.setLatitude(vehiclePosition.getPoint().getY()); |
| | | routeAndFareDto.setOrigin(lonLatDto); |
| | | LonLatDto lonLatDto1 = new LonLatDto(); |
| | | lonLatDto1.setLongitude(Double.parseDouble(split[0])); |
| | | lonLatDto1.setLatitude(Double.parseDouble(split[1])); |
| | | |
| | | if(planRule!=null&& !"null".equals(planRule)){ |
| | | routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule)); |
| | | } |
| | | routeAndFareDto.setDestination(lonLatDto1); |
| | | // 调用地图 获取时间 |
| | | R<RouteVo> r = xpMapClient.getDistanceAndDuration(routeAndFareDto); |
| | | if (r.getCode() == 200) { |
| | | vehiclePosition.setSecond(r.getData().getDuration()); |
| | | } else { |
| | | vehiclePosition.setSecond(0); |
| | | } |
| | | } |
| | | |
| | | // 分数计算 把时间短的分数调高 |
| | | availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getSecond)).collect(Collectors.toList()); |
| | | int score = 10; |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | vehiclePosition.setTimeScore(score); |
| | | score--; |
| | | } |
| | | // availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getSecond)).collect(Collectors.toList()); |
| | | // int size = tendencyTime; |
| | | // // 做比对的分数 |
| | | // double temp = availableVehiclesNearby.get(0).getSecond(); |
| | | // for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | // vehiclePosition.setTimeScore(vehiclePosition.getTimeScore() + size); |
| | | // if (temp != vehiclePosition.getSecond()) { |
| | | // size--; |
| | | // } |
| | | // } |
| | | |
| | | } |
| | | |
| | | |
| | | // 电量分数 |
| | | if (max.equals(tendencyElectricity)) { |
| | | // 计算车的分数 分数最大是车的size |
| | | availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getCurrentElectricity).reversed()).collect(Collectors.toList()); |
| | | int size = tendencyElectricity; |
| | | // 做比对的分数 |
| | | int temp = availableVehiclesNearby.get(0).getCurrentElectricity(); |
| | | |
| | | int maxTemp = 0; |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | vehiclePosition.setCurrentElectricityScore(vehiclePosition.getCurrentElectricityScore() + size); |
| | | if (temp != vehiclePosition.getCurrentElectricity()) { |
| | | size--; |
| | | } else { |
| | | maxTemp++; |
| | | } |
| | | } |
| | | |
| | | if (maxTemp > 1) { |
| | | // 证明有最高相同电量的 找下一个 |
| | | // 找出最第二大的值是那个 |
| | | // 将四个值放入列表 |
| | | List<Integer> values = Arrays.asList(tendencyOrderValue, tendencyDistance, tendencyTime); |
| | | // 降序排序 |
| | | values.sort(Collections.reverseOrder()); |
| | | // 获取第二大值 |
| | | Integer secondMax = values.get(1); |
| | | |
| | | // 判断第二大的是哪个 |
| | | if (Objects.equals(secondMax, tendencyDistance)) { |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | RouteAndFareDto routeAndFareDto = new RouteAndFareDto(); |
| | | LonLatDto lonLatDto = new LonLatDto(); |
| | |
| | | LonLatDto lonLatDto1 = new LonLatDto(); |
| | | lonLatDto1.setLongitude(Double.parseDouble(split[0])); |
| | | lonLatDto1.setLatitude(Double.parseDouble(split[1])); |
| | | |
| | | routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule)); |
| | | if(planRule!=null&& !"null".equals(planRule)){ |
| | | routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule)); |
| | | } |
| | | routeAndFareDto.setDestination(lonLatDto1); |
| | | // 调用地图 获取时间 |
| | | R<RouteVo> r = xpMapClient.getDistanceAndDuration(routeAndFareDto); |
| | |
| | | vehiclePosition.setDistance(0.0); |
| | | } |
| | | } |
| | | availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getDistance)).collect(Collectors.toList()); |
| | | int size1 = tendencyDistance; |
| | | // 做比对的分数 |
| | | double temp1 = availableVehiclesNearby.get(0).getDistance(); |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | vehiclePosition.setDistanceScore(vehiclePosition.getDistanceScore() + size1); |
| | | if (temp1 != vehiclePosition.getDistance()) { |
| | | size1--; |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (max1.equals(weightTime)) { |
| | | |
| | | if (Objects.equals(secondMax, tendencyTime)) { |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | RouteAndFareDto routeAndFareDto = new RouteAndFareDto(); |
| | | LonLatDto lonLatDto = new LonLatDto(); |
| | |
| | | lonLatDto1.setLongitude(Double.parseDouble(split[0])); |
| | | lonLatDto1.setLatitude(Double.parseDouble(split[1])); |
| | | |
| | | routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule)); |
| | | if(planRule!=null&& !"null".equals(planRule)){ |
| | | routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule)); |
| | | } |
| | | routeAndFareDto.setDestination(lonLatDto1); |
| | | // 调用地图 获取时间 |
| | | R<RouteVo> r = xpMapClient.getDistanceAndDuration(routeAndFareDto); |
| | |
| | | vehiclePosition.setSecond(0); |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (max1.equals(weightElectricity)) { |
| | | // 计算车的分数 分数最大是车的size |
| | | availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getCurrentElectricity).reversed()).collect(Collectors.toList()); |
| | | int size1 = tendencyElectricity; |
| | | availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getSecond)).collect(Collectors.toList()); |
| | | int size1 = tendencyTime; |
| | | // 做比对的分数 |
| | | int temp1 = availableVehiclesNearby.get(0).getCurrentElectricity(); |
| | | double temp1 = availableVehiclesNearby.get(0).getSecond(); |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | vehiclePosition.setCurrentElectricityScore(vehiclePosition.getCurrentElectricityScore() + size1); |
| | | if (temp1 != vehiclePosition.getCurrentElectricity()) { |
| | | vehiclePosition.setTimeScore(vehiclePosition.getTimeScore() + size1); |
| | | if (temp1 != vehiclePosition.getSecond()) { |
| | | size1--; |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | // 订单价值 |
| | | if (Objects.equals(secondMax, tendencyOrderValue)) { |
| | | // 订单价值 |
| | | // 时间差权重 |
| | | Integer weightTimeDifference = xpTradingStrategy.getWeightTimeDifference(); |
| | | // 距离差权重 |
| | | Integer weightDistanceDifference = xpTradingStrategy.getWeightDistanceDifference(); |
| | | // 距离权重 |
| | | Integer weightDistance = xpTradingStrategy.getWeightDistance(); |
| | | // 时间权重 |
| | | Integer weightTime = xpTradingStrategy.getWeightTime(); |
| | | // 电量权重 |
| | | Integer weightElectricity = xpTradingStrategy.getWeightElectricity(); |
| | | |
| | | // 找出最大的值是那个 |
| | | Integer max1 = Math.max(weightTimeDifference, Math.max(weightDistanceDifference, Math.max(weightDistance, Math.max(weightTime, weightElectricity)))); |
| | | |
| | | // 时间差 |
| | | if (max1.equals(weightTimeDifference)) { |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | RouteAndFareDto routeAndFareDto = new RouteAndFareDto(); |
| | | LonLatDto lonLatDto = new LonLatDto(); |
| | | lonLatDto.setLongitude(vehiclePosition.getPoint().getX()); |
| | | lonLatDto.setLatitude(vehiclePosition.getPoint().getY()); |
| | | routeAndFareDto.setOrigin(lonLatDto); |
| | | LonLatDto lonLatDto1 = new LonLatDto(); |
| | | lonLatDto1.setLongitude(Double.valueOf(split[0])); |
| | | lonLatDto1.setLatitude(Double.valueOf(split[1])); |
| | | routeAndFareDto.setDestination(lonLatDto1); |
| | | if(planRule!=null&& !"null".equals(planRule)){ |
| | | routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule)); |
| | | } |
| | | R<RouteVo> distanceAndDuration = xpMapClient.getDistanceAndDuration(routeAndFareDto); |
| | | if (distanceAndDuration.getCode() == 200) { |
| | | // 送驾- 接驾 |
| | | Integer durationDifference = Integer.parseInt(duration) - distanceAndDuration.getData().getDuration(); |
| | | vehiclePosition.setTimeDifference(durationDifference); |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (max1.equals(weightDistanceDifference)) { |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | RouteAndFareDto routeAndFareDto = new RouteAndFareDto(); |
| | | LonLatDto lonLatDto = new LonLatDto(); |
| | | lonLatDto.setLongitude(vehiclePosition.getPoint().getX()); |
| | | lonLatDto.setLatitude(vehiclePosition.getPoint().getY()); |
| | | routeAndFareDto.setOrigin(lonLatDto); |
| | | LonLatDto lonLatDto1 = new LonLatDto(); |
| | | lonLatDto1.setLongitude(Double.valueOf(split[0])); |
| | | lonLatDto1.setLatitude(Double.valueOf(split[1])); |
| | | routeAndFareDto.setDestination(lonLatDto1); |
| | | if(planRule!=null&& !"null".equals(planRule)){ |
| | | routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule)); |
| | | } |
| | | R<RouteVo> distanceAndDuration = xpMapClient.getDistanceAndDuration(routeAndFareDto); |
| | | if (distanceAndDuration.getCode() == 200) { |
| | | // 送驾- 接驾 |
| | | Integer distanceDifference = Integer.parseInt(distance) - distanceAndDuration.getData().getDistance(); |
| | | vehiclePosition.setDistanceDifference(distanceDifference); |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | if (max1.equals(weightDistance)) { |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | RouteAndFareDto routeAndFareDto = new RouteAndFareDto(); |
| | | LonLatDto lonLatDto = new LonLatDto(); |
| | | lonLatDto.setLongitude(vehiclePosition.getPoint().getX()); |
| | | lonLatDto.setLatitude(vehiclePosition.getPoint().getY()); |
| | | routeAndFareDto.setOrigin(lonLatDto); |
| | | LonLatDto lonLatDto1 = new LonLatDto(); |
| | | lonLatDto1.setLongitude(Double.parseDouble(split[0])); |
| | | lonLatDto1.setLatitude(Double.parseDouble(split[1])); |
| | | if(planRule!=null&& !"null".equals(planRule)){ |
| | | routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule)); |
| | | } |
| | | routeAndFareDto.setDestination(lonLatDto1); |
| | | // 调用地图 获取时间 |
| | | R<RouteVo> r = xpMapClient.getDistanceAndDuration(routeAndFareDto); |
| | | if (r.getCode() == 200) { |
| | | vehiclePosition.setDistance(Double.valueOf(r.getData().getDistance())); |
| | | } else { |
| | | vehiclePosition.setDistance(0.0); |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (max1.equals(weightTime)) { |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | RouteAndFareDto routeAndFareDto = new RouteAndFareDto(); |
| | | LonLatDto lonLatDto = new LonLatDto(); |
| | | lonLatDto.setLongitude(vehiclePosition.getPoint().getX()); |
| | | lonLatDto.setLatitude(vehiclePosition.getPoint().getY()); |
| | | routeAndFareDto.setOrigin(lonLatDto); |
| | | LonLatDto lonLatDto1 = new LonLatDto(); |
| | | lonLatDto1.setLongitude(Double.parseDouble(split[0])); |
| | | lonLatDto1.setLatitude(Double.parseDouble(split[1])); |
| | | if(planRule!=null&& !"null".equals(planRule)){ |
| | | routeAndFareDto.setRoutePlanRule(Integer.valueOf(planRule)); |
| | | } |
| | | routeAndFareDto.setDestination(lonLatDto1); |
| | | // 调用地图 获取时间 |
| | | R<RouteVo> r = xpMapClient.getDistanceAndDuration(routeAndFareDto); |
| | | if (r.getCode() == 200) { |
| | | vehiclePosition.setSecond(r.getData().getDuration()); |
| | | } else { |
| | | vehiclePosition.setSecond(0); |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (max1.equals(weightElectricity)) { |
| | | // 计算车的分数 分数最大是车的size |
| | | availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getCurrentElectricity).reversed()).collect(Collectors.toList()); |
| | | int size1 = tendencyElectricity; |
| | | // 做比对的分数 |
| | | int temp1 = availableVehiclesNearby.get(0).getCurrentElectricity(); |
| | | for (VehiclePositionVo vehiclePosition : availableVehiclesNearby) { |
| | | vehiclePosition.setCurrentElectricityScore(vehiclePosition.getCurrentElectricityScore() + size1); |
| | | if (temp1 != vehiclePosition.getCurrentElectricity()) { |
| | | size1--; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 算出总分 再来排序计算 |
| | | for (VehiclePositionVo vehiclePositionVo : availableVehiclesNearby) { |
| | | vehiclePositionVo.setOrderValueTotal(vehiclePositionVo.getCurrentElectricityScore() + vehiclePositionVo.getDistanceScore() + vehiclePositionVo.getTimeScore() + vehiclePositionVo.getDistanceDifference() + vehiclePositionVo.getTimeDifference()); |
| | | vehiclePositionVo.setOrderValueTotal(vehiclePositionVo.getCurrentElectricityScore() + vehiclePositionVo.getDistanceScore() + vehiclePositionVo.getTimeScore() + vehiclePositionVo.getDistanceDifference() + vehiclePositionVo.getTimeDifference()+vehiclePositionVo.getSecond()+vehiclePositionVo.getDistance().intValue()); |
| | | } |
| | | availableVehiclesNearby = availableVehiclesNearby.stream().sorted(Comparator.comparing(VehiclePositionVo::getOrderValueTotal).reversed()).collect(Collectors.toList()); |
| | | |
| | |
| | | } |
| | | |
| | | |
| | | } catch (Exception e) { |
| | | log.error("异常", e); |
| | | } |
| | | |
| | | // 判断总分来计算 |
| | |
| | | |
| | | RLock lock = redissonClient.getLock("FIND_CAR_" + vehiclePositionVo.getVin()); |
| | | lock.lock(10, TimeUnit.SECONDS); |
| | | System.err.println("队列:" + quoteName + " 车辆:" + vehiclePositionVo.getVin() + "订单" + orderNo); |
| | | log.info("队列 {} 车辆 {} 单号 {}", quoteName, vehiclePositionVo.getVin(), orderNo); |
| | | try { |
| | | |
| | | |
| | | |
| | | |
| | | // VehiclePosition vehiclePosition = vehiclePositionService.findByVehicleId(vehiclePositionVo.getVehicle_id()); |
| | | R<XpVehicle> vehiclePositionR = xpVehicleClient.findByVehicleVin(vehiclePositionVo.getVin()); |
| | | if (vehiclePositionR.getCode() != 200) { |
| | | continue; |
| | | } |
| | | XpVehicle vehiclePosition = vehiclePositionR.getData(); |
| | | log.info("符合条件的车辆 {} ,直接推单XPU", vehiclePosition.getPlateNumber()); |
| | | log.info("当前车辆状态 {}", vehiclePosition.getStatus()); |
| | | if (vehiclePosition.getStatus() != 1 || vehiclePosition.getState() != 0 || vehiclePosition.getVehicleType()==1) { |
| | | log.info("符合条件的车辆 {} ,直接推单XPU。单号 {}", vehiclePosition.getPlateNumber(), orderNo); |
| | | log.info("当前车辆状态 {} 单号 {}", vehiclePosition.getStatus(), orderNo); |
| | | if (vehiclePosition.getOperatingStatus() != 1 || vehiclePosition.getState() != 0 || vehiclePosition.getVehicleType() == 1) { |
| | | continue; |
| | | } |
| | | // 关闭巡游单子 |
| | | xpCruiseOrderClient.updateCruiseOrder(vehiclePosition.getVehicleVin()); |
| | | |
| | | // 再次查询一下订单 看是否取消 |
| | | xpOrderR = xpOrderClient.queryOrderByOrderNo(orderNo); |
| | | if (xpOrderR.getCode() != 200) { |
| | | continue; |
| | | } |
| | | xpOrder = xpOrderR.getData(); |
| | | if (xpOrder.getStatus() != 1) { |
| | | continue; |
| | | } |
| | | |
| | | |
| | | // 关闭巡游单子 |
| | | R stringR = xpCruiseOrderClient.cancelCruiseOrderByVin(vehiclePosition.getVehicleVin()); |
| | | if (stringR == null || stringR.getCode() != 200) { |
| | | log.info("关闭巡游单子失败 车牌号 {}", vehiclePosition.getPlateNumber()); |
| | | continue; |
| | | } |
| | | log.info("关闭巡游单成功 {} {}", vehiclePosition.getPlateNumber(), orderNo); |
| | | // 下发命令 |
| | | PushOrderDto pushOrderDto = new PushOrderDto(); |
| | | pushOrderDto.setVin(vehiclePosition.getVehicleVin()); |
| | |
| | | pushOrderDto.setOrderType(OrderType.USER_ORDER); |
| | | pushOrderDto.setStage(1); |
| | | // 调用推送服务 orderId + carVin |
| | | // orderMissionClient.pushOrder(pushOrderDto); |
| | | log.info("开始推送 {} 订单到XPU", xpOrder.getOrderNumber()); |
| | | orderMissionClient.pushOrder(pushOrderDto); |
| | | log.info("开始推送 {} 订单到XPU。单号 {}", xpOrder.getOrderNumber(), orderNo); |
| | | |
| | | redisService.popFirstElement(quoteName); |
| | | log.info("将订单 {} 从队列 {} 弹出去", xpOrder.getOrderNumber(), quoteName); |
| | | return; |
| | | redisService.removeByPattern(quoteName,xpOrder.getOrderNumber()); |
| | | log.info("将订单 {} 从队列 {} 弹出去", orderNo, quoteName); |
| | | return true; |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } finally { |
| | |
| | | |
| | | } else { |
| | | // 直接派单 定义一个锁来锁定车辆 |
| | | VehiclePosition vehiclePosition = positionList.get(0); |
| | | VehiclePositionVo vehiclePosition = availableVehiclesNearby.get(0); |
| | | String vehicleVin = vehiclePosition.getVin(); |
| | | |
| | | RLock lock = redissonClient.getLock("FIND_CAR_" + vehiclePosition.getVin()); |
| | |
| | | continue; |
| | | } |
| | | XpVehicle vehicleId1 = vehicleR.getData(); |
| | | log.info("附近只有一个车辆 {} ,直接推单XPU", vehicleId1.getPlateNumber()); |
| | | log.info("当前车辆状态 {} 运营状态 {}", vehicleId1.getOperatingStatus(), vehicleId1.getState()); |
| | | if (vehicleId1.getOperatingStatus() != 1 || vehicleId1.getState() != 0 || vehicleId1.getVehicleType()==1) { |
| | | lock.unlock(); |
| | | log.info("附近只有一个车辆 {} ,直接推单XPU。单号 {}", vehicleId1.getPlateNumber(), orderNo); |
| | | log.info("当前车辆状态 {} 运营状态 {} 单号 {}", vehicleId1.getOperatingStatus(), vehicleId1.getState(), orderNo); |
| | | if (vehicleId1.getOperatingStatus() != 1 || vehicleId1.getState() != 0 || vehicleId1.getVehicleType() == 1) { |
| | | continue; |
| | | } |
| | | // 关闭巡游单子 |
| | | xpCruiseOrderClient.updateCruiseOrder(vehicleId1.getVehicleVin()); |
| | | |
| | | |
| | | // 再次查询一下订单 看是否取消 |
| | | xpOrderR = xpOrderClient.queryOrderByOrderNo(orderNo); |
| | | if (xpOrderR.getCode() != 200) { |
| | | continue; |
| | | } |
| | | xpOrder = xpOrderR.getData(); |
| | | if (xpOrder.getStatus() != 1) { |
| | | continue; |
| | | } |
| | | |
| | | // 关闭巡游单子 |
| | | R<?> stringR = xpCruiseOrderClient.cancelCruiseOrderByVin(vehicleId1.getVehicleVin()); |
| | | if (stringR == null || stringR.getCode() != 200) { |
| | | log.info("关闭巡游单子失败 车牌号 {}", vehicleId1.getPlateNumber()); |
| | | continue; |
| | | } |
| | | log.info("关闭巡游单成功 {} {}", vehicleId1.getPlateNumber(), orderNo); |
| | | PushOrderDto pushOrderDto = new PushOrderDto(); |
| | | pushOrderDto.setVin(vehiclePosition.getVin()); |
| | | pushOrderDto.setOrderId(xpOrder.getId().toString()); |
| | |
| | | pushOrderDto.setOrderType(OrderType.USER_ORDER); |
| | | pushOrderDto.setStage(1); |
| | | // 调用推送服务 orderId + carVin |
| | | // orderMissionClient.pushOrder(pushOrderDto); |
| | | orderMissionClient.pushOrder(pushOrderDto); |
| | | log.info("开始推送 {} 订单到XPU", xpOrder.getOrderNumber()); |
| | | redisService.popFirstElement(quoteName); |
| | | log.info("将订单 {} 从队列 {} 弹出去", xpOrder.getOrderNumber(), quoteName); |
| | | return; |
| | | |
| | | log.info("将订单 {} 从队列 {} 弹出去", orderNo, quoteName); |
| | | return true; |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } finally { |
| | |
| | | } |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | /** |
| | |
| | | continue; |
| | | } |
| | | // 关闭巡游单子 |
| | | xpCruiseOrderClient.updateCruiseOrder(vehicleId1.getVehicleVin()); |
| | | R<?> stringR = xpCruiseOrderClient.cancelCruiseOrderByVin(vehicleId1.getVehicleVin()); |
| | | if (stringR == null || stringR.getData() == null) { |
| | | log.info("关闭巡游单子失败"); |
| | | continue; |
| | | } |
| | | |
| | | PushOrderDto pushOrderDto = new PushOrderDto(); |
| | | pushOrderDto.setVin(vehiclePosition.getVin()); |
| | |
| | | orderMissionClient.pushOrder(pushOrderDto); |
| | | |
| | | } catch (Exception e) { |
| | | |
| | | throw new RuntimeException(e); |
| | | } finally { |
| | | lock.unlock(); |
| | | } |