| | |
| | | order.setStatus(0); |
| | | order.setAppUserId(null); |
| | | baseMapper.updateById(order); |
| | | redisService.setCacheObject("ORDER_STATUS:" + order.getId(), 0, 24L, TimeUnit.HOURS); |
| | | // 消息推送 |
| | | Map<String, Object> params = new HashMap<>(); |
| | | Map<String, Object> content = new HashMap<>(); |
| | |
| | | order.setStatus(0); |
| | | order.setAppUserId(null); |
| | | baseMapper.updateById(order); |
| | | redisService.setCacheObject("ORDER_STATUS:" + order.getId(), 0, 24L, TimeUnit.HOURS); |
| | | return; |
| | | } |
| | | order.setStatus(0); |
| | | order.setAppUserId(null); |
| | | baseMapper.updateById(order); |
| | | redisService.setCacheObject("ORDER_STATUS:" + order.getId(), 0, 24L, TimeUnit.HOURS); |
| | | XpOrderCancel xpOrderCancel = new XpOrderCancel(); |
| | | xpOrderCancel.setOrderId(orderId); |
| | | xpOrderCancel.setUserId(Long.valueOf(uid)); |
| | |
| | | Integer i = Integer.valueOf(cacheObject.toString()); |
| | | redisService.setCacheCancelOrder("CANCEL_ORDER_" + uid, i + 1); |
| | | } |
| | | |
| | | // 消息推送 |
| | | // Map<String, Object> params = new HashMap<>(); |
| | | // Map<String, Object> content = new HashMap<>(); |
| | | // content.put("orderId", order.getId().toString()); |
| | | // content.put("status", OrderStatusEnum.CANCELED.getCode()); |
| | | // params.put("type", PushMessageTypeEnum.ORDER_STATUS.getDesc()); |
| | | // params.put("content", JSONObject.toJSONString(content)); |
| | | // params.put("timestamp", new Date().getTime() + ""); |
| | | // String message = JSONObject.toJSONString(params); |
| | | // SendMessageDTO sendMessageDTO = new SendMessageDTO(); |
| | | // sendMessageDTO.setMessage(message); |
| | | // sendMessageDTO.setAppUserId(uid); |
| | | // xpPushMessageClient.sendStatus(sendMessageDTO); |
| | | // log.info("订单取消消息推送完毕"); |
| | | |
| | | // 移除mongo数据 |
| | | xpPricingClient.deleteXpGeoQueryEntity(order.getId().toString()); |
| | |
| | | order.setStatus(0); |
| | | order.setAppUserId(null); |
| | | baseMapper.updateById(order); |
| | | redisService.setCacheObject("ORDER_STATUS:" + order.getId(), 0, 24L, TimeUnit.HOURS); |
| | | XpOrderCancel xpOrderCancel = new XpOrderCancel(); |
| | | xpOrderCancel.setOrderId(Long.valueOf(orderId)); |
| | | xpOrderCancel.setUserId(1l); |
| | |
| | | xpOrder.setAppUserId(null); |
| | | xpOrder.setStatus(10); |
| | | baseMapper.updateById(xpOrder); |
| | | redisService.setCacheObject("ORDER_STATUS:" + xpOrder.getId(), 10, 24L, TimeUnit.HOURS); |
| | | |
| | | XpOrderEvaluate evaluate = new XpOrderEvaluate(); |
| | | evaluate.setOrderId(xpOrder.getId()); |
| | |
| | | if(xpOrder.getStatus() >= 8){ |
| | | return R.fail("订单已结束"); |
| | | } |
| | | Long appUserId = xpOrder.getAppUserId(); |
| | | // 查询车辆 |
| | | XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData(); |
| | | switch (status) { |
| | | case 4: |
| | | // 查询起点点位 |
| | |
| | | LocalDateTime now = LocalDateTime.now(); |
| | | xpOrder.setBoardingTime(now); |
| | | xpOrder.setRideTime(now); |
| | | //推送行起点到终点的驶轨迹给乘客端 |
| | | sendRoute(appUserId.toString(), orderId, "ORDER_NAVIGATION_END_DATA", xpVehicle.getVehicleVin()); |
| | | // 删除定时任务job |
| | | QuartzManager.removeJob((OrderCancelJob.name + xpOrder.getId()).toUpperCase(), TimeJobType.ORDER_CANCEL); |
| | | break; |
| | |
| | | case 7: |
| | | xpOrder.setGetoffTime(LocalDateTime.now()); |
| | | // 解析下车地点 |
| | | // 查询车辆 |
| | | XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData(); |
| | | VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class); |
| | | if(Objects.nonNull(vehiclePosition)){ |
| | | GeoJsonPoint point = vehiclePosition.getPoint(); |
| | |
| | | xpOrder.setGetoffAddress(geocode.get("address")); |
| | | } |
| | | } |
| | | //计算行驶总距离和时长 |
| | | List<OrderTrajectory> orderTrajectoryList = mongoTemplate.find(new Query().addCriteria(Criteria.where("orderId").is(xpOrder.getId())), OrderTrajectory.class); |
| | | Double reduce = orderTrajectoryList.stream().map(OrderTrajectory::getDistance).reduce(0.0, Double::sum); |
| | | xpOrder.setMileageKilometers(new BigDecimal(reduce).divide(new BigDecimal(1000)).setScale(4, RoundingMode.HALF_EVEN).doubleValue()); |
| | | long duration = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")) - xpOrder.getTripBegin().toEpochSecond(ZoneOffset.of("+8")); |
| | | xpOrder.setDuration(new BigDecimal(duration).divide(new BigDecimal(60), 2, RoundingMode.HALF_EVEN).doubleValue()); |
| | | |
| | | // 推送倒计时消息 |
| | | Map<String, Object> params = new HashMap<>(); |
| | | Map<String, Object> content = new HashMap<>(); |
| | |
| | | endTripJobMaps |
| | | ); |
| | | // 添加车辆到达终点后限停时间到后驶离的定时任务 |
| | | //时间到后添加巡游订单,解绑车辆关系,车辆驶离点位 |
| | | //时间到后将车辆状态回滚到空闲、添加巡游订单,解绑用户和车辆关系,车辆驶离点位 |
| | | XpPoint point = xpPointClient.queryById(xpOrder.getEndPointId()).getData(); |
| | | Map<String, ? extends Object> jobMaps = |
| | | new ImmutableMap.Builder<String, String>() |
| | |
| | | xpOrder.setStatus(status); |
| | | xpOrder.setAppUserId(null); |
| | | this.updateById(xpOrder); |
| | | redisService.setCacheObject("ORDER_STATUS:" + xpOrder.getId(), status, 24L, TimeUnit.HOURS); |
| | | return R.ok(); |
| | | } |
| | | |
| | |
| | | order.setStatus(8); |
| | | order.setAppUserId(null); |
| | | order.setTripEnd(LocalDateTime.now()); |
| | | |
| | | double exactMinutes = Duration.between(order.getBoardingTime(), order.getTripEnd()).toMillis() / (1000.0 * 60); |
| | | exactMinutes = new BigDecimal(exactMinutes).setScale(2, RoundingMode.HALF_UP).doubleValue(); |
| | | order.setDuration(exactMinutes); |
| | | |
| | | baseMapper.updateById(order); |
| | | redisService.setCacheObject("ORDER_STATUS:" + order.getId(), 8, 24L, TimeUnit.HOURS); |
| | | |
| | | // 根据订单所属开通城市id 查询定价 |
| | | R<XpPricing> pricingByCityId = xpPricingClient.getPricingByCid(order.getCityId()); |
| | |
| | | xpOrderDetail.setOrderId(orderId); |
| | | xpOrderDetail.setType(1); |
| | | xpOrderDetail.setMileage(new BigDecimal(mileageKilometers).setScale(2, RoundingMode.HALF_UP)); |
| | | String currentTimeSlot = DateUtils.getCurrentTimeSlot(); |
| | | xpOrderDetail.setTime(currentTimeSlot); |
| | | xpOrderDetail.setDuration(duration1); |
| | | xpOrderDetail.setMoney(new BigDecimal(xpPricingCardVo.getStartPrice()).setScale(2, RoundingMode.HALF_UP)); |
| | | xpOrderDetails.add(xpOrderDetail); |
| | |
| | | xpOrderDetail.setDetailType(2); |
| | | xpOrderDetail.setOrderId(orderId); |
| | | xpOrderDetail.setType(1); |
| | | xpOrderDetail.setMileage(new BigDecimal(mileageKilometers).setScale(2, RoundingMode.HALF_UP)); |
| | | xpOrderDetail.setMoney(new BigDecimal(xpPricingCardVo.getDistancePrice()).setScale(2,RoundingMode.HALF_UP)); |
| | | xpOrderDetails.add(xpOrderDetail); |
| | | xpOrderDetail = new XpOrderDetail(); |
| | |
| | | |
| | | @Override |
| | | public R<FareBreakdownVo> fareBreakdown(Long orderId, String uid) { |
| | | |
| | | XpOrder order = this.getById(orderId); |
| | | order.setAppUserId(null); |
| | | // 查询订单轨迹 |
| | | List<OrderTrajectory> trajectories = mongoTemplate.find( |
| | | new Query(Criteria.where("orderId").is(orderId)) |
| | | .with(Sort.by(Sort.Direction.ASC, "locatetime")), |
| | | OrderTrajectory.class |
| | | ); |
| | | |
| | | FareBreakdownVo res = new FareBreakdownVo(); |
| | | res.setChangeMoneyFlag(order.getChangeMoneyFlag()); |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | // if (order.getDuration() != null && order.getDuration() > 0) { |
| | | // FareBreakdownDetailVo durationDetail = new FareBreakdownDetailVo(); |
| | | // durationDetail.setType(order.getDurationType()); |
| | | // durationDetail.setDuration(order.getDuration()); |
| | | // durationDetail.setMoney(order.getDurationMoney()); |
| | | // duration.add(durationDetail); |
| | | // } |
| | | |
| | | // |
| | | // if (order.getLongDistance() != null && order.getLongDistance() > 0) { |
| | | // FareBreakdownDetailVo longDistanceDetail = new FareBreakdownDetailVo(); |
| | | // longDistanceDetail.setType(order.getLongDistanceType()); |
| | | // longDistanceDetail.setMileage(BigDecimal.valueOf(order.getLongDistance())); |
| | | // longDistanceDetail.setMoney(order.getLongDistancemoney()); |
| | | // longDistance.add(longDistanceDetail); |
| | | // } |
| | | res.setStart(start); |
| | | res.setMileage(mileage); |
| | | res.setDuration(duration); |
| | |
| | | order.setTripEnd(tripEnd); |
| | | this.updateById(order); |
| | | } |
| | | |
| | | double exactMinutes = Duration.between(order.getBoardingTime(), order.getTripEnd()).toMillis() / (1000.0 * 60); |
| | | res.setTime(new BigDecimal(exactMinutes).setScale(2, RoundingMode.HALF_UP)); |
| | | res.setTime(new BigDecimal(order.getDuration() == null ? 0 : order.getDuration()).multiply(new BigDecimal(60)).setScale(0, RoundingMode.HALF_UP)); |
| | | return R.ok(res); |
| | | } |
| | | |
| | |
| | | |
| | | } |
| | | baseMapper.updateById(order); |
| | | redisService.setCacheObject("ORDER_STATUS:" + order.getId(), 9, 24L, TimeUnit.HOURS); |
| | | return R.ok(); |
| | | } |
| | | |
| | |
| | | @Override |
| | | public void saveVehicleLocation(OrderTrajectory orderTrajectory) { |
| | | // 查询订单信息 |
| | | XpOrder xpOrder = this.getById(orderTrajectory.getOrderId()); |
| | | if(xpOrder.getStatus() != 6){ |
| | | Integer status = redisService.getCacheObject("ORDER_STATUS:" + orderTrajectory.getOrderId()); |
| | | if(status != 6){ |
| | | return; |
| | | } |
| | | |
| | |
| | | // 获取上一次定位 |
| | | String oldLocation = redisService.getCacheObject(CacheConstants.ORDER_OLD_LOCATION + orderTrajectory.getOrderId()); |
| | | if (StringUtils.isEmpty(oldLocation)) { |
| | | // 首次定位 |
| | | xpOrder.setMileageKilometers(0D); |
| | | xpOrder.setAppUserId(null); |
| | | this.updateById(xpOrder); |
| | | orderTrajectory.setDistance(0D); |
| | | // 存储mongo数据 |
| | | mongoTemplate.save(orderTrajectory); |
| | |
| | | Map<String, Double> distance = GeodesyUtil.getDistance(orderTrajectory.getLocation(), oldLocation); |
| | | if (null != distance) { |
| | | Double distance1 = distance.get("WGS84"); |
| | | if (distance1 > 50 && xpOrder.getStatus() == 6) {//大于50米表示在移动,且在服务中的时候记录里程 |
| | | xpOrder.setMileageKilometers(BigDecimal.valueOf(xpOrder.getMileageKilometers()).add(new BigDecimal(distance1).divide(new BigDecimal(1000)).setScale(4, RoundingMode.HALF_EVEN)).doubleValue()); |
| | | xpOrder.setAppUserId(null); |
| | | this.updateById(xpOrder); |
| | | // 存储本次距离 |
| | | orderTrajectory.setDistance(distance1); |
| | | // 存储mongo数据 |
| | | mongoTemplate.save(orderTrajectory); |
| | | // 更新定位 |
| | | redisService.setCacheObject(CacheConstants.ORDER_OLD_LOCATION + orderTrajectory.getOrderId(), orderTrajectory.getLocation()); |
| | | } |
| | | // 存储本次距离 |
| | | orderTrajectory.setDistance(distance1); |
| | | // 存储mongo数据 |
| | | mongoTemplate.save(orderTrajectory); |
| | | // 更新定位 |
| | | redisService.setCacheObject(CacheConstants.ORDER_OLD_LOCATION + orderTrajectory.getOrderId(), orderTrajectory.getLocation()); |
| | | } else { |
| | | log.error("调用高德计算距离出错"); |
| | | } |
| | |
| | | } |
| | | // 存mongo数据 |
| | | xpPricingClient.updateXpGeoQueryEntity(order.getId().toString()); |
| | | |
| | | |
| | | // 修改车辆信息 |
| | | vehicle.setState(1); |
| | | xpVehicleClient.updateVehicleById(vehicle); |
| | | |
| | | //绑定用户和车辆关系 |
| | | addTaxiPassengerVo.setUid(appUserId.toString()); |
| | | |
| | | order.setAppUserId(null); |
| | | this.updateById(order); |
| | | |
| | | //构建推送消息 |
| | | Map<String, Object> params = new HashMap<>(); |
| | | Map<String, Object> content = new HashMap<>(); |
| | | content.put("orderId", orderId.toString()); |
| | | content.put("status", 2); |
| | | params.put("type", PushMessageTypeEnum.ORDER_STATUS.getDesc()); |
| | | params.put("content", JSONObject.toJSONString(content)); |
| | | params.put("timestamp", System.currentTimeMillis() + ""); |
| | | String message = JSONObject.toJSONString(params); |
| | | SendMessageDTO dto1 = new SendMessageDTO(); |
| | | dto1.setAppUserId(appUserId + ""); |
| | | dto1.setMessage(message); |
| | | R<String> stringR = xpPushMessageClient.sendStatus(dto1); |
| | | |
| | | //推送失败,重试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(dto1); |
| | | if(stringR1.getCode() == Constants.SUCCESS){ |
| | | break; |
| | | } |
| | | try { |
| | | Thread.sleep(1000); |
| | | } catch (InterruptedException e) { |
| | | throw new RuntimeException(e); |
| | | } |
| | | log.info("推送订单状态消息失败:{} {} {}", stringR1.getMsg(), JSON.toJSONString(dto), order.getOrderNumber()); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | |
| | | redisService.setCacheObject("ORDER_STATUS:" + order.getId(), 2, 24L, TimeUnit.HOURS); |
| | | addTaxiPassengerVo.setOrderNo(order.getOrderNumber()); |
| | | // TODO appid |
| | | addTaxiPassengerVo.setAppId(appid); |
| | | userVehicleClient.addTaxiPassenger(addTaxiPassengerVo); |
| | | //推送乘客车辆到达预约点的导航数据 |
| | | sendRoute(addTaxiPassengerVo.getUid(), orderId, "ORDER_NAVIGATION_START_DATA", dto.getXpVehicleVin()); |
| | | } else { |
| | | //推送行起点到终点的驶轨迹给乘客端 |
| | | sendRoute(appUserId.toString(), orderId, "ORDER_NAVIGATION_END_DATA", dto.getXpVehicleVin()); |
| | | } |
| | | } |
| | | } |