| | |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.*; |
| | | import java.util.concurrent.*; |
| | | import java.util.concurrent.LinkedBlockingQueue; |
| | | import java.util.concurrent.ThreadPoolExecutor; |
| | | import java.util.concurrent.TimeUnit; |
| | | import java.util.stream.Collectors; |
| | | |
| | | @Slf4j |
| | |
| | | |
| | | // 自定义线程池 |
| | | private static final ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); |
| | | |
| | | // ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(20); |
| | | |
| | | static { |
| | | threadPoolTaskExecutor.setCorePoolSize(20); |
| | |
| | | continue; |
| | | } |
| | | log.info("关闭巡游单成功 {} {}", vehicleId1.getPlateNumber(), orderNo); |
| | | PushOrderDto pushOrderDto = new PushOrderDto(); |
| | | PushOrderDto pushOrderDto = buildPushOrderDto(xpOrder); |
| | | pushOrderDto.setVin(vehiclePosition.getVin()); |
| | | pushOrderDto.setOrderId(xpOrder.getId().toString()); |
| | | pushOrderDto.setStartLatitude(xpOrder.getStartLat()); |
| | | pushOrderDto.setStartLongitude(xpOrder.getStartLon()); |
| | | pushOrderDto.setEndLatitude(xpOrder.getEndLat()); |
| | | pushOrderDto.setEndLongitude(xpOrder.getEndLon()); |
| | | pushOrderDto.setEndPoiName(xpOrder.getEndPointName()); |
| | | pushOrderDto.setOrderType(OrderType.USER_ORDER); |
| | | pushOrderDto.setStage(1); |
| | | // 调用推送服务 orderId + carVin |
| | | orderMissionClient.pushOrder(pushOrderDto); |
| | | log.info("开始推送 {} 订单到XPU", xpOrder.getOrderNumber()); |
| | |
| | | if (vehiclePositionVos.getCode() != 200) { |
| | | continue; |
| | | } |
| | | |
| | | LonLatDto lonLatDto = new LonLatDto(Double.parseDouble(split[0]), Double.parseDouble(split[1])); |
| | | RouteAndFareDto routeAndFareDto = new RouteAndFareDto(); |
| | | routeAndFareDto.setDestination(lonLatDto); |
| | | |
| | | Optional<XpOrder> lucyOrderOpt = servingVehicles.getData().stream() |
| | | //获取位置 |
| | |
| | | .map(xpOrderClient::queryOrderById) |
| | | .filter(R::isSuccess) |
| | | .map(R::getData) |
| | | .filter(o -> isClose(o, routeAndFareDto)) |
| | | .filter(o -> { |
| | | RouteAndFareDto routeAndFareDto = new RouteAndFareDto(); |
| | | routeAndFareDto.setDestination(lonLatDto); |
| | | return isClose(o, routeAndFareDto); |
| | | }) |
| | | .findAny(); |
| | | |
| | | if (lucyOrderOpt.isPresent()) { |
| | | XpOrder lucyOder = lucyOrderOpt.get(); |
| | | log.info("有空闲车辆 {} 订单 {}", lucyOder.getOrderNumber(), orderNo); |
| | | XpVehicle xpVehicle = xpVehicleClient.queryById(lucyOder.getVehicleId()).getData(); |
| | | // 设置路线信息 |
| | | RouteAndFareDto routeAndFareDto = new RouteAndFareDto(); |
| | | routeAndFareDto.setDestination(lonLatDto); |
| | | routeAndFareDto.setOrigin(new LonLatDto(lucyOder.getEndLon(),lucyOder.getEndLat())); |
| | | routeAndFareDto.setOrigin(lonLatDto); |
| | | |
| | | RouteAndFareDto routeAndFare = null;//TODO 获取导航路线 |
| | | if (null == routeAndFare) { //轨迹不在运营区 |
| | | continue; |
| | | } |
| | | // 当轨迹是否在运营区内,存储 |
| | | xpOrder.setStatus(1); |
| | | xpOrderClient.updateOrder(xpOrder); |
| | | scheduler.scheduleWithFixedDelay(this::pushProgress, 0, 5, TimeUnit.SECONDS); |
| | | Object cacheObject = redisService.getCacheObject(CacheConstants.navigationEnd(lucyOder.getAppUserId().toString())); |
| | | RouteVo routeRemain = JSON.parseObject(cacheObject.toString(), RouteVo.class); |
| | | RouteVo routeToOrigin = xpMapClient.getDistanceAndDuration(routeAndFareDto).getData(); |
| | | routeToOrigin.getPolyline().addAll(0, routeRemain.getPolyline()); |
| | | routeToOrigin.setDuration(routeToOrigin.getDuration() + routeRemain.getDuration()); |
| | | routeToOrigin.setDistance(routeToOrigin.getDistance() + routeRemain.getDistance()); |
| | | PushOrderDto pushOrderDto = buildPushOrderDto(xpOrder); |
| | | pushOrderDto.setVin(xpVehicle.getVehicleVin()); |
| | | // 订单流转 |
| | | orderMissionClient.pushOrder(pushOrderDto); |
| | | redisService.setCacheObject(CacheConstants.nextOrder(lucyOder.getId().toString()), xpOrder.getId()); |
| | | redisService.setCacheObject(CacheConstants.navigationStart(xpOrder.getAppUserId().toString()), routeToOrigin); |
| | | redisService.removeByPattern(quoteName,xpOrder.getOrderNumber()); |
| | | log.info("将订单 {} 从队列 {} 弹出去", orderNo, quoteName); |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | private void pushProgress() { |
| | | //TODO 调用push message 服务 |
| | | private static PushOrderDto buildPushOrderDto(XpOrder xpOrder) { |
| | | PushOrderDto pushOrderDto = new PushOrderDto(); |
| | | // pushOrderDto.setVin(lucyOrder.get().getVin()); |
| | | // pushOrderDto.setOrderId(xpOrder.getId().toString()); |
| | | // pushOrderDto.setStartLatitude(xpOrder.getStartLat()); |
| | | // pushOrderDto.setStartLongitude(xpOrder.getStartLon()); |
| | | // pushOrderDto.setEndLatitude(xpOrder.getEndLat()); |
| | | // pushOrderDto.setEndLongitude(xpOrder.getEndLon()); |
| | | // pushOrderDto.setOrderType(OrderType.USER_ORDER); |
| | | pushOrderDto.setOrderId(xpOrder.getId().toString()); |
| | | pushOrderDto.setStartLatitude(xpOrder.getStartLat()); |
| | | pushOrderDto.setStartLongitude(xpOrder.getStartLon()); |
| | | pushOrderDto.setEndLatitude(xpOrder.getEndLat()); |
| | | pushOrderDto.setEndLongitude(xpOrder.getEndLon()); |
| | | pushOrderDto.setEndPoiName(xpOrder.getEndPointName()); |
| | | pushOrderDto.setOrderType(OrderType.USER_ORDER); |
| | | pushOrderDto.setStage(1); |
| | | return pushOrderDto; |
| | | } |
| | | |
| | | private boolean isClose(XpOrder xpOrder,RouteAndFareDto routeAndFareDto) { |
| | |
| | | |
| | | @Resource |
| | | private MongoTemplate mongoTemplate; |
| | | boolean isClose(Long orderId) { |
| | | // yong id 去查目的地坐标,判断是否小于800 |
| | | return false; |
| | | } |
| | | |
| | | |
| | | |
| | | /** |