| | |
| | | private final IXpTestOrderService xpTestOrderService; |
| | | private final XpMapClient xpMapClient; |
| | | @Resource |
| | | private XpRoutePlanClient xpRoutePlanClient; |
| | | private XpRoutePlanClient xpRoutePlanClient; |
| | | @Resource |
| | | @Lazy |
| | | private BootCommonService bootCommonService; |
| | |
| | | |
| | | @Resource |
| | | private XpTradingStrategyClient tradingStrategyClient; |
| | | |
| | | @Resource |
| | | private OfficialPartnerUtil officialPartnerUtil; |
| | | |
| | | @Value("${robotaxi.appId:xp_robotaxi_api}") |
| | | private String appid; |
| | |
| | | } |
| | | wrapper.eq(Objects.nonNull(query.getUid()), XpOrder::getAppUserId, query.getUid()); |
| | | wrapper.orderByDesc(XpOrder::getCreateTime); |
| | | if(null != query.getActivityId()){ |
| | | if (null != query.getActivityId()) { |
| | | wrapper.eq(XpOrder::getActivityId, query.getActivityId()); |
| | | } |
| | | |
| | |
| | | @Override |
| | | @Transactional |
| | | @ShardingSphereTransactionType(TransactionType.BASE) |
| | | public void cancelOrCloseOrder(Long orderId, Integer type,Boolean isFree) { |
| | | public void cancelOrCloseOrder(Long orderId, Integer type, Boolean isFree) { |
| | | // 1. 校验订单是否存在 |
| | | XpOrder order = this.getById(orderId); |
| | | if (Objects.isNull(order)) { |
| | |
| | | throw new ServiceException("当前订单状态不允许取消,只有待接单、待出发、接驾中状态的订单可以取消", I18nKeyConstant.ORDER_CANCEL_FAILED); |
| | | } |
| | | } else { |
| | | if(isFree == null){ |
| | | if (isFree == null) { |
| | | throw new ServiceException("是否豁免费用不能为空", I18nKeyConstant.ORDER_CLOSE_FAILED); |
| | | } |
| | | // 关闭订单:0=已取消,1=待接单,2=待出发,3=接驾中,4=待客上车,5=乘客已上车,6=服务中 状态可以关闭 |
| | |
| | | } else { |
| | | // 关闭订单 |
| | | closeOrder(order); |
| | | if(isFree){ |
| | | if (isFree) { |
| | | this.setFree(order.getId()); |
| | | } |
| | | } |
| | |
| | | */ |
| | | private void cancelOrder(XpOrder order) { |
| | | redisService.removeByPattern(order.getQueueName(), order.getOrderNumber()); |
| | | //判断还原车辆状态 |
| | | if (null == order.getVehicleId()) { |
| | | Object cacheObject1 = redisService.getCacheObject("CREATE_ORDER:" + order.getId().toString()); |
| | | if (null != cacheObject1) { |
| | | com.alibaba.fastjson2.JSONObject jsonObject = com.alibaba.fastjson2.JSON.parseObject(cacheObject1.toString()); |
| | | String vin = jsonObject.getString("vin"); |
| | | XpVehicle vehicle = xpVehicleClient.findByVehicleVin(vin).getData(); |
| | | if (null != vehicle && 0 != vehicle.getState()) { |
| | | XpVehicle vehicle1 = new XpVehicle(); |
| | | vehicle1.setId(vehicle.getId()); |
| | | vehicle1.setState(0); |
| | | xpVehicleClient.updateVehicleById(vehicle1); |
| | | log.info("管理后台取消订单,车辆状态修改0 {}", vehicle.getPlateNumber()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | Long userId = order.getAppUserId(); |
| | | Integer status = order.getStatus(); |
| | |
| | | order.setAppUserId(null); |
| | | baseMapper.updateById(order); |
| | | order.setAppUserId(appUserId); |
| | | bootCommonService.setCache_orderStatus(order.getId(),order,null); |
| | | //删除蓝牙秘钥 |
| | | String token = redisService.getCacheObject("rt:bluetooth:unlock:order:" + order.getId()); |
| | | if(StringUtils.isNotBlank(token)){ |
| | | redisService.deleteObject("rt:bluetooth:unlock:" + token); |
| | | redisService.deleteObject("rt:bluetooth:unlock:order:" + order.getId()); |
| | | XpVehicle xpVehicle = xpVehicleClient.queryById(order.getVehicleId()).getData(); |
| | | BluetoothDeliverVo vo = new BluetoothDeliverVo(); |
| | | vo.setVim(xpVehicle.getVehicleVin()); |
| | | vo.setPassengerUid(order.getAppUserId()); |
| | | BaseVehicleUserDto delete = bluetoothUnlockClient.delete(vo); |
| | | if(null == delete || delete.getCode() != 0){ |
| | | log.error("删除蓝牙解锁失败:{} {}", delete.getMsg(), order.getOrderNumber()); |
| | | bootCommonService.setCache_orderStatus(order.getId(), order, null); |
| | | if(null == order.getOfficialPartnerId()){ |
| | | //删除蓝牙秘钥 |
| | | String token = redisService.getCacheObject("rt:bluetooth:unlock:order:" + order.getId()); |
| | | if (StringUtils.isNotBlank(token)) { |
| | | redisService.deleteObject("rt:bluetooth:unlock:" + token); |
| | | redisService.deleteObject("rt:bluetooth:unlock:order:" + order.getId()); |
| | | XpVehicle xpVehicle = xpVehicleClient.queryById(order.getVehicleId()).getData(); |
| | | BluetoothDeliverVo vo = new BluetoothDeliverVo(); |
| | | vo.setVim(xpVehicle.getVehicleVin()); |
| | | vo.setPassengerUid(order.getAppUserId()); |
| | | BaseVehicleUserDto delete = bluetoothUnlockClient.delete(vo); |
| | | if (null == delete || delete.getCode() != 0) { |
| | | log.error("删除蓝牙解锁失败:{} {}", delete.getMsg(), order.getOrderNumber()); |
| | | } |
| | | } |
| | | } |
| | | // 消息推送 |
| | |
| | | R<String> stringR = xpPushMessageClient.sendStatus(sendMessageDTO); |
| | | |
| | | //推送失败,重试3次 |
| | | if(stringR.getCode() != Constants.SUCCESS){ |
| | | 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(sendMessageDTO); |
| | | if(stringR1.getCode() == Constants.SUCCESS){ |
| | | if (stringR1.getCode() == Constants.SUCCESS) { |
| | | break; |
| | | } |
| | | try { |
| | |
| | | .eq(XpOrder::getId, order.getId()).update(); |
| | | order.setStatus(OrderStatusEnum.CANCELED.getCode()); |
| | | |
| | | bootCommonService.setCache_orderStatus(order.getId(),order,null); |
| | | bootCommonService.setCache_orderStatus(order.getId(), order, null); |
| | | |
| | | // 2. 保存取消记录 |
| | | XpOrderCancel orderCancel = new XpOrderCancel(); |
| | |
| | | sendMessageDTO.setAppUserId(String.valueOf(userId)); |
| | | R<String> stringR = xpPushMessageClient.sendStatus(sendMessageDTO); |
| | | //推送失败,重试3次 |
| | | if(stringR.getCode() != Constants.SUCCESS){ |
| | | 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(sendMessageDTO); |
| | | if(stringR1.getCode() == Constants.SUCCESS){ |
| | | if (stringR1.getCode() == Constants.SUCCESS) { |
| | | break; |
| | | } |
| | | try { |
| | |
| | | } |
| | | log.info("运营人员取消订单成功,推送乘客消息完成"); |
| | | |
| | | //查询车辆信息 |
| | | R<XpVehicle> xpVehicleR = xpVehicleClient.queryById(order.getVehicleId()); |
| | | if (xpVehicleR.getCode() == HttpStatus.SUCCESS && Objects.nonNull(xpVehicleR.getData())) { |
| | | XpVehicle xpVehicle = xpVehicleR.getData(); |
| | | // 组装调用车机参数 |
| | | CancelTaxiPassengerVo cancelTaxiPassengerVo = new CancelTaxiPassengerVo(); |
| | | cancelTaxiPassengerVo.setVin(xpVehicle.getVehicleVin()); |
| | | cancelTaxiPassengerVo.setUid(userId.toString()); |
| | | cancelTaxiPassengerVo.setOrderNo(order.getOrderNumber()); |
| | | cancelTaxiPassengerVo.setAppId(appid); |
| | | BaseVehicleUserDto baseVehicleUserDto = userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo); |
| | | if (baseVehicleUserDto == null) { |
| | | // TODO 本地无法调通 |
| | | if(null == order.getOfficialPartnerId()){ |
| | | //判断还原车辆状态 |
| | | if (null == order.getVehicleId()) { |
| | | Object cacheObject1 = redisService.getCacheObject("CREATE_ORDER:" + order.getId().toString()); |
| | | if (null != cacheObject1) { |
| | | com.alibaba.fastjson2.JSONObject jsonObject = com.alibaba.fastjson2.JSON.parseObject(cacheObject1.toString()); |
| | | String vin = jsonObject.getString("vin"); |
| | | XpVehicle vehicle = xpVehicleClient.findByVehicleVin(vin).getData(); |
| | | if (null != vehicle && 0 != vehicle.getState()) { |
| | | XpVehicle vehicle1 = new XpVehicle(); |
| | | vehicle1.setId(vehicle.getId()); |
| | | vehicle1.setState(0); |
| | | xpVehicleClient.updateVehicleById(vehicle1); |
| | | log.info("管理后台取消订单,车辆状态修改0 {}", vehicle.getPlateNumber()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | //查询车辆信息 |
| | | R<XpVehicle> xpVehicleR = xpVehicleClient.queryById(order.getVehicleId()); |
| | | if (xpVehicleR.getCode() == HttpStatus.SUCCESS && Objects.nonNull(xpVehicleR.getData())) { |
| | | XpVehicle xpVehicle = xpVehicleR.getData(); |
| | | // 组装调用车机参数 |
| | | CancelTaxiPassengerVo cancelTaxiPassengerVo = new CancelTaxiPassengerVo(); |
| | | cancelTaxiPassengerVo.setVin(xpVehicle.getVehicleVin()); |
| | | cancelTaxiPassengerVo.setUid(userId.toString()); |
| | | cancelTaxiPassengerVo.setOrderNo(order.getOrderNumber()); |
| | | cancelTaxiPassengerVo.setAppId(appid); |
| | | BaseVehicleUserDto baseVehicleUserDto = userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo); |
| | | if (baseVehicleUserDto == null) { |
| | | // TODO 本地无法调通 |
| | | // throw new RuntimeException("取消订单失败"); |
| | | } |
| | | } |
| | | |
| | | //还原车辆状态 |
| | | if(1 == xpVehicle.getState()){ |
| | | XpVehicle vehicle1 = new XpVehicle(); |
| | | vehicle1.setId(xpVehicle.getId()); |
| | | vehicle1.setState(0); |
| | | xpVehicleClient.updateVehicleById(vehicle1); |
| | | log.info("管理后台取消订单,车辆状态修改0 {}", xpVehicle.getPlateNumber()); |
| | | } |
| | | //还原车辆状态 |
| | | if (1 == xpVehicle.getState()) { |
| | | XpVehicle vehicle1 = new XpVehicle(); |
| | | vehicle1.setId(xpVehicle.getId()); |
| | | vehicle1.setState(0); |
| | | xpVehicleClient.updateVehicleById(vehicle1); |
| | | log.info("管理后台取消订单,车辆状态修改0 {}", xpVehicle.getPlateNumber()); |
| | | } |
| | | |
| | | // 下发命令 |
| | | // 下发命令 |
| | | // PushOrderDto pushOrderDto = new PushOrderDto(); |
| | | // pushOrderDto.setOrderId(order.getId().toString()); |
| | | // pushOrderDto.setVin(xpVehicle.getVehicleVin()); |
| | | // pushOrderDto.setOperation_type(OrderOperationType.CLOUD_CANCEL_ORDER); |
| | | // orderMissionClient.cancelOrder(pushOrderDto); |
| | | // log.info("运营人员取消订单成功,开始执行巡游订单 {}", order.getId()); |
| | | //车辆继续巡游 |
| | | addCruiseMission(order, status); |
| | | //车辆继续巡游 |
| | | addCruiseMission(order, status); |
| | | |
| | | } else { |
| | | log.info("查询车辆信息失败,订单ID: {}, 下发取消订单命令失败", order.getId()); |
| | | } else { |
| | | log.info("查询车辆信息失败,订单ID: {}, 下发取消订单命令失败", order.getId()); |
| | | } |
| | | log.info("订单取消成功,订单ID: {}, 操作人: {}", order.getId(), SecurityUtils.getUsername()); |
| | | }else{ |
| | | //流量接入-订单推送 推送取消订单 |
| | | officialPartnerUtil.pushCancelOrder(order.getOfficialPartnerId(), orderCancel, order.getStatus()); |
| | | } |
| | | log.info("订单取消成功,订单ID: {}, 操作人: {}", order.getId(), SecurityUtils.getUsername()); |
| | | |
| | | } |
| | | |
| | | /** |
| | |
| | | order.setGetoffTime(LocalDateTime.now()); |
| | | // 解析下车地点 |
| | | VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class); |
| | | if(Objects.nonNull(vehiclePosition)){ |
| | | if (Objects.nonNull(vehiclePosition)) { |
| | | GeoJsonPoint point = vehiclePosition.getPoint(); |
| | | if(Objects.nonNull(point)){ |
| | | if (Objects.nonNull(point)) { |
| | | double x = point.getX(); |
| | | double y = point.getY(); |
| | | Map<String, String> geocode = gdMapGeocodingUtil.geocode(String.valueOf(x), String.valueOf(y)); |
| | |
| | | order.setAppUserId(null); |
| | | this.updateById(order); |
| | | |
| | | bootCommonService.setCache_orderStatus(order.getId(),order,null); |
| | | bootCommonService.setCache_orderStatus(order.getId(), order, null); |
| | | |
| | | // 消息推送 |
| | | Map<String, Object> params1 = new HashMap<>(); |
| | |
| | | sendMessageDTO1.setAppUserId(appUserId.toString()); |
| | | R<String> stringR1 = xpPushMessageClient.sendStatus(sendMessageDTO1); |
| | | //推送失败,重试3次 |
| | | if(stringR1.getCode() != Constants.SUCCESS){ |
| | | if (stringR1.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> stringR2 = xpPushMessageClient.sendStatus(sendMessageDTO1); |
| | | if(stringR2.getCode() == Constants.SUCCESS){ |
| | | if (stringR2.getCode() == Constants.SUCCESS) { |
| | | break; |
| | | } |
| | | try { |
| | |
| | | sendMessageDTO.setAppUserId(appUserId.toString()); |
| | | R<String> stringR = xpPushMessageClient.sendStatus(sendMessageDTO); |
| | | //推送失败,重试3次 |
| | | if(stringR.getCode() != Constants.SUCCESS){ |
| | | 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> stringR2 = xpPushMessageClient.sendStatus(sendMessageDTO); |
| | | if(stringR2.getCode() == Constants.SUCCESS){ |
| | | if (stringR2.getCode() == Constants.SUCCESS) { |
| | | break; |
| | | } |
| | | try { |
| | |
| | | sendMessageDTO2.setAppUserId(appUserId.toString()); |
| | | R<String> stringR2 = xpPushMessageClient.sendStatus(sendMessageDTO2); |
| | | //推送失败,重试3次 |
| | | if(stringR2.getCode() != Constants.SUCCESS){ |
| | | if (stringR2.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> stringR3 = xpPushMessageClient.sendStatus(sendMessageDTO2); |
| | | if(stringR3.getCode() == Constants.SUCCESS){ |
| | | if (stringR3.getCode() == Constants.SUCCESS) { |
| | | break; |
| | | } |
| | | try { |
| | |
| | | }); |
| | | } |
| | | |
| | | //创建定时任务执行延迟驶离终点和下发巡游单 |
| | | XpPoint point = xpPointClient.queryById(order.getEndPointId()).getData(); |
| | | Map<String, ? extends Object> jobMaps = |
| | | new ImmutableMap.Builder<String, String>() |
| | | .put("id", order.getId().toString()) |
| | | .put("appid", appid) |
| | | .build(); |
| | | QuartzManager.addJob( |
| | | AddCruiseMissionJob.class, |
| | | (AddCruiseMissionJob.name + order.getId()).toUpperCase(), |
| | | TimeJobType.ADD_CRUISE_MISSION, |
| | | DateUtils.localDateTimeToDate(LocalDateTime.now().plusMinutes(point.getParkingTimeLimit())), |
| | | jobMaps |
| | | ); |
| | | if(order.getOfficialPartnerId() == null){ |
| | | //创建定时任务执行延迟驶离终点和下发巡游单 |
| | | XpPoint point = xpPointClient.queryById(order.getEndPointId()).getData(); |
| | | Map<String, ? extends Object> jobMaps = |
| | | new ImmutableMap.Builder<String, String>() |
| | | .put("id", order.getId().toString()) |
| | | .put("appid", appid) |
| | | .build(); |
| | | QuartzManager.addJob( |
| | | AddCruiseMissionJob.class, |
| | | (AddCruiseMissionJob.name + order.getId()).toUpperCase(), |
| | | TimeJobType.ADD_CRUISE_MISSION, |
| | | DateUtils.localDateTimeToDate(LocalDateTime.now().plusMinutes(point.getParkingTimeLimit())), |
| | | jobMaps |
| | | ); |
| | | }else{ |
| | | //流量接入-订单推送 推送关闭订单 |
| | | officialPartnerUtil.pushEndOrder(order.getOfficialPartnerId(), order, "运维人员关闭订单"); |
| | | } |
| | | } |
| | | |
| | | /** |
| | |
| | | if (Objects.isNull(newVehicle.getState()) || newVehicle.getState() != 0) { |
| | | throw new ServiceException("新车辆已接单,请重新选择", I18nKeyConstant.ORDER_REASSIGN_NEW_VEHICLE_NOT_FREE); |
| | | } |
| | | if (newVehicle.getOperatingStatus() != 1){ |
| | | if (newVehicle.getOperatingStatus() != 1) { |
| | | throw new ServiceException("新车辆状态为非运营状态,请重新选择", I18nKeyConstant.ORDER_REASSIGN_NEW_VEHICLE_NOT_OPERATIONAL); |
| | | } |
| | | VehiclePosition vehiclePosition = mongoTemplate.findOne(Query.query(Criteria.where("vin").is(newVehicle.getVehicleVin())), VehiclePosition.class); |
| | | if(null == vehiclePosition){ |
| | | if (null == vehiclePosition) { |
| | | throw new ServiceException("未能获取到新车的定位数据,请重新选择", I18nKeyConstant.ORDER_REASSIGN_NEW_VEHICLE_NOT_POSITION); |
| | | } |
| | | if(vehiclePosition.getCurrentElectricity() < 20){ |
| | | if (vehiclePosition.getCurrentElectricity() < 20) { |
| | | throw new ServiceException("新车电量不足,请重新选择", I18nKeyConstant.ORDER_REASSIGN_NEW_VEHICLE_BATTERY_LOW); |
| | | } |
| | | |
| | |
| | | * - 其他状态,默认返回原出发点 |
| | | * </p> |
| | | * |
| | | * @param order 当前订单信息 |
| | | * @param order 当前订单信息 |
| | | */ |
| | | private void createReturnCruiseOrder(Long vehicleId, XpOrder order) { |
| | | XpVehicle oldVehicle = xpVehicleClient.queryById(vehicleId).getData(); |
| | |
| | | |
| | | @Resource |
| | | private XpAppUserCollectAddrClient xpAppUserCollectAddrClient; |
| | | |
| | | @Override |
| | | public NearestNextVo quickCapsule(String uid, Long startPointId) { |
| | | |
| | |
| | | ret.setTime(endPoint.getParkingTimeLimit()); |
| | | ret.setElectronicAreaId(endPoint.getElectronicAreaId()); |
| | | // 判断是否收藏 |
| | | if(pointIdsByUserId.contains(endPoint.getId())){ |
| | | if (pointIdsByUserId.contains(endPoint.getId())) { |
| | | ret.setIsCollect(1); |
| | | } |
| | | return ret; |
| | |
| | | } |
| | | |
| | | @Override |
| | | public List<XpHistoryStartPointsVo> getHistoryStartPoints(String uid, double lon, double lat,Long electronicAreaId) { |
| | | public List<XpHistoryStartPointsVo> getHistoryStartPoints(String uid, double lon, double lat, Long electronicAreaId) { |
| | | // |
| | | List<XpOrder> xpOrders = this.baseMapper.getHistoryStartPoints(Long.valueOf(uid),electronicAreaId); |
| | | List<XpOrder> xpOrders = this.baseMapper.getHistoryStartPoints(Long.valueOf(uid), electronicAreaId); |
| | | // selectList(new LambdaQueryWrapper<XpOrder>().eq(XpOrder::getAppUserId, Long.parseLong(uid)).orderByDesc(BaseModel::getCreateTime).last("LIMIT 10")); |
| | | if (xpOrders.isEmpty()) { |
| | | return Collections.emptyList(); |
| | |
| | | // 获取点位信息 |
| | | List<Long> startPointsIds = xpOrders.stream().map(XpOrder::getStartPointId).collect(Collectors.toList()); |
| | | |
| | | R<List<XpHistoryStartPointsVo>> r = xpPointClient.getHistoryStartPoints(new HistoryStartPointsDto(startPointsIds, lon, lat,Long.valueOf(uid))); |
| | | R<List<XpHistoryStartPointsVo>> r = xpPointClient.getHistoryStartPoints(new HistoryStartPointsDto(startPointsIds, lon, lat, Long.valueOf(uid))); |
| | | |
| | | |
| | | List<XpHistoryStartPointsVo> data = r.getData(); |
| | |
| | | } |
| | | |
| | | @Override |
| | | public List<XpHistoryEndPointsVo> getHistoryEndPoints(String uid, double lon, double lat,Long electronicAreaId) { |
| | | public List<XpHistoryEndPointsVo> getHistoryEndPoints(String uid, double lon, double lat, Long electronicAreaId) { |
| | | // |
| | | List<XpOrder> xpOrders = this.baseMapper.getHistoryEndPoints(Long.valueOf(uid), electronicAreaId); |
| | | // selectList(new LambdaQueryWrapper<XpOrder>().eq(XpOrder::getAppUserId, Long.parseLong(uid)).orderByDesc(BaseModel::getCreateTime).last("LIMIT 10")); |
| | |
| | | // 获取点位信息 |
| | | List<Long> endPointsIds = xpOrders.stream().map(XpOrder::getEndPointId).collect(Collectors.toList()); |
| | | |
| | | R<List<XpHistoryEndPointsVo>> r = xpPointClient.getHistoryEndPoints(new HistoryEndPointsDto(endPointsIds, lon, lat,Long.valueOf(uid))); |
| | | R<List<XpHistoryEndPointsVo>> r = xpPointClient.getHistoryEndPoints(new HistoryEndPointsDto(endPointsIds, lon, lat, Long.valueOf(uid))); |
| | | |
| | | List<XpHistoryEndPointsVo> data = r.getData(); |
| | | |
| | |
| | | e.printStackTrace(); |
| | | } |
| | | Integer status = order.getStatus(); |
| | | //判断还原车辆状态 |
| | | if (null == order.getVehicleId()) { |
| | | Object cacheObject1 = redisService.getCacheObject("CREATE_ORDER:" + order.getId().toString()); |
| | | if (null != cacheObject1) { |
| | | JSONObject jsonObject = JSON.parseObject(cacheObject1.toString()); |
| | | String vin = jsonObject.getString("vin"); |
| | | XpVehicle vehicle = xpVehicleClient.findByVehicleVin(vin).getData(); |
| | | if (null != vehicle && 0 != vehicle.getState()) { |
| | | XpVehicle vehicle1 = new XpVehicle(); |
| | | vehicle1.setId(vehicle.getId()); |
| | | vehicle1.setState(0); |
| | | xpVehicleClient.updateVehicleById(vehicle1); |
| | | log.info("用户取消订单,车辆状态修改0 {}", vehicle.getPlateNumber()); |
| | | } |
| | | } |
| | | } |
| | | else{// 下发命令 |
| | | R<XpVehicle> xpVehicleR = xpVehicleClient.queryById(order.getVehicleId()); |
| | | XpVehicle xpVehicle = xpVehicleR.getData(); |
| | | if (xpVehicle == null) { |
| | | throw new ServiceException("车辆不存在", I18nKeyConstant.VEHICLE_NOT_EXISTS); |
| | | } |
| | | //是否能取消行程 |
| | | boolean cancelShow = this.isCancelShow(order,xpVehicle.getVehicleVin()); |
| | | if(cancelShow){ |
| | | throw new ServiceException("当前订单状态不允许取消,行程即将完成", I18nKeyConstant.ORDER_CANCEL_FAILED); |
| | | } |
| | | |
| | | // 组装调用车机参数 |
| | | CancelTaxiPassengerVo cancelTaxiPassengerVo = new CancelTaxiPassengerVo(); |
| | | cancelTaxiPassengerVo.setVin(xpVehicle.getVehicleVin()); |
| | | cancelTaxiPassengerVo.setUid(uid); |
| | | cancelTaxiPassengerVo.setOrderNo(order.getOrderNumber()); |
| | | cancelTaxiPassengerVo.setAppId(appid); |
| | | |
| | | BaseVehicleUserDto baseVehicleUserDto = userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo); |
| | | if (baseVehicleUserDto == null) { |
| | | // TODO 本地无法调通 |
| | | // throw new RuntimeException("取消订单失败"); |
| | | } |
| | | |
| | | //还原车辆状态 |
| | | if (1 == xpVehicle.getState()) { |
| | | XpVehicle vehicle1 = new XpVehicle(); |
| | | vehicle1.setId(xpVehicle.getId()); |
| | | vehicle1.setState(0); |
| | | xpVehicleClient.updateVehicleById(vehicle1); |
| | | log.info("用户取消订单,车辆状态修改0 {}", xpVehicle.getPlateNumber()); |
| | | } |
| | | //车辆继续巡游 |
| | | addCruiseMission(order, status); |
| | | } |
| | | order.setStatus(0); |
| | | Long appUserId = order.getAppUserId(); |
| | | order.setAppUserId(null); |
| | | baseMapper.updateById(order); |
| | | order.setAppUserId(appUserId); |
| | | bootCommonService.setCache_orderStatus(order.getId(),order,null); |
| | | //删除蓝牙秘钥 |
| | | String token = redisService.getCacheObject("rt:bluetooth:unlock:order:" + order.getId()); |
| | | if(StringUtils.isNotBlank(token)){ |
| | | redisService.deleteObject("rt:bluetooth:unlock:" + token); |
| | | redisService.deleteObject("rt:bluetooth:unlock:order:" + order.getId()); |
| | | XpVehicle xpVehicle = xpVehicleClient.queryById(order.getVehicleId()).getData(); |
| | | BluetoothDeliverVo vo = new BluetoothDeliverVo(); |
| | | vo.setVim(xpVehicle.getVehicleVin()); |
| | | vo.setPassengerUid(order.getAppUserId()); |
| | | BaseVehicleUserDto delete = bluetoothUnlockClient.delete(vo); |
| | | if(null == delete || delete.getCode() != 0){ |
| | | log.error("删除蓝牙解锁失败:{} {}", delete.getMsg(), order.getOrderNumber()); |
| | | } |
| | | } |
| | | bootCommonService.setCache_orderStatus(order.getId(), order, null); |
| | | |
| | | XpOrderCancel xpOrderCancel = new XpOrderCancel(); |
| | | xpOrderCancel.setOrderId(orderId); |
| | |
| | | xpOrderCancelService.save(xpOrderCancel); |
| | | // 移除mongo数据 |
| | | xpPricingClient.deleteXpGeoQueryEntity(order.getId().toString()); |
| | | |
| | | if(null == order.getOfficialPartnerId()){ |
| | | //判断还原车辆状态 |
| | | if (null == order.getVehicleId()) { |
| | | Object cacheObject1 = redisService.getCacheObject("CREATE_ORDER:" + order.getId().toString()); |
| | | if (null != cacheObject1) { |
| | | JSONObject jsonObject = JSON.parseObject(cacheObject1.toString()); |
| | | String vin = jsonObject.getString("vin"); |
| | | XpVehicle vehicle = xpVehicleClient.findByVehicleVin(vin).getData(); |
| | | if (null != vehicle && 0 != vehicle.getState()) { |
| | | XpVehicle vehicle1 = new XpVehicle(); |
| | | vehicle1.setId(vehicle.getId()); |
| | | vehicle1.setState(0); |
| | | xpVehicleClient.updateVehicleById(vehicle1); |
| | | log.info("用户取消订单,车辆状态修改0 {}", vehicle.getPlateNumber()); |
| | | } |
| | | } |
| | | } else {// 下发命令 |
| | | R<XpVehicle> xpVehicleR = xpVehicleClient.queryById(order.getVehicleId()); |
| | | XpVehicle xpVehicle = xpVehicleR.getData(); |
| | | if (xpVehicle == null) { |
| | | throw new ServiceException("车辆不存在", I18nKeyConstant.VEHICLE_NOT_EXISTS); |
| | | } |
| | | //是否能取消行程 |
| | | boolean cancelShow = this.isCancelShow(order, xpVehicle.getVehicleVin()); |
| | | if (cancelShow) { |
| | | throw new ServiceException("当前订单状态不允许取消,行程即将完成", I18nKeyConstant.ORDER_CANCEL_FAILED); |
| | | } |
| | | |
| | | // 组装调用车机参数 |
| | | CancelTaxiPassengerVo cancelTaxiPassengerVo = new CancelTaxiPassengerVo(); |
| | | cancelTaxiPassengerVo.setVin(xpVehicle.getVehicleVin()); |
| | | cancelTaxiPassengerVo.setUid(uid); |
| | | cancelTaxiPassengerVo.setOrderNo(order.getOrderNumber()); |
| | | cancelTaxiPassengerVo.setAppId(appid); |
| | | |
| | | BaseVehicleUserDto baseVehicleUserDto = userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo); |
| | | if (baseVehicleUserDto == null) { |
| | | // TODO 本地无法调通 |
| | | // throw new RuntimeException("取消订单失败"); |
| | | } |
| | | |
| | | //还原车辆状态 |
| | | if (1 == xpVehicle.getState()) { |
| | | XpVehicle vehicle1 = new XpVehicle(); |
| | | vehicle1.setId(xpVehicle.getId()); |
| | | vehicle1.setState(0); |
| | | xpVehicleClient.updateVehicleById(vehicle1); |
| | | log.info("用户取消订单,车辆状态修改0 {}", xpVehicle.getPlateNumber()); |
| | | } |
| | | //车辆继续巡游 |
| | | addCruiseMission(order, status); |
| | | } |
| | | |
| | | //删除蓝牙秘钥 |
| | | String token = redisService.getCacheObject("rt:bluetooth:unlock:order:" + order.getId()); |
| | | if (StringUtils.isNotBlank(token)) { |
| | | redisService.deleteObject("rt:bluetooth:unlock:" + token); |
| | | redisService.deleteObject("rt:bluetooth:unlock:order:" + order.getId()); |
| | | XpVehicle xpVehicle = xpVehicleClient.queryById(order.getVehicleId()).getData(); |
| | | BluetoothDeliverVo vo = new BluetoothDeliverVo(); |
| | | vo.setVim(xpVehicle.getVehicleVin()); |
| | | vo.setPassengerUid(order.getAppUserId()); |
| | | BaseVehicleUserDto delete = bluetoothUnlockClient.delete(vo); |
| | | if (null == delete || delete.getCode() != 0) { |
| | | log.error("删除蓝牙解锁失败:{} {}", delete.getMsg(), order.getOrderNumber()); |
| | | } |
| | | } |
| | | }else{ |
| | | //流量接入-订单推送 推送取消订单 |
| | | officialPartnerUtil.pushCancelOrder(order.getOfficialPartnerId(), xpOrderCancel, order.getStatus()); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | |
| | | order.setAppUserId(null); |
| | | baseMapper.updateById(order); |
| | | order.setAppUserId(appUserId); |
| | | bootCommonService.setCache_orderStatus(order.getId(),order,null); |
| | | //删除蓝牙秘钥 |
| | | String token = redisService.getCacheObject("rt:bluetooth:unlock:order:" + order.getId()); |
| | | if(StringUtils.isNotBlank(token)){ |
| | | redisService.deleteObject("rt:bluetooth:unlock:" + token); |
| | | redisService.deleteObject("rt:bluetooth:unlock:order:" + order.getId()); |
| | | XpVehicle xpVehicle = xpVehicleClient.queryById(order.getVehicleId()).getData(); |
| | | BluetoothDeliverVo vo = new BluetoothDeliverVo(); |
| | | vo.setVim(xpVehicle.getVehicleVin()); |
| | | vo.setPassengerUid(order.getAppUserId()); |
| | | BaseVehicleUserDto delete = bluetoothUnlockClient.delete(vo); |
| | | if(null == delete || delete.getCode() != 0){ |
| | | log.error("删除蓝牙解锁失败:{} {}", delete.getMsg(), order.getOrderNumber()); |
| | | bootCommonService.setCache_orderStatus(order.getId(), order, null); |
| | | if(null == order.getOfficialPartnerId()){ |
| | | //删除蓝牙秘钥 |
| | | String token = redisService.getCacheObject("rt:bluetooth:unlock:order:" + order.getId()); |
| | | if (StringUtils.isNotBlank(token)) { |
| | | redisService.deleteObject("rt:bluetooth:unlock:" + token); |
| | | redisService.deleteObject("rt:bluetooth:unlock:order:" + order.getId()); |
| | | XpVehicle xpVehicle = xpVehicleClient.queryById(order.getVehicleId()).getData(); |
| | | BluetoothDeliverVo vo = new BluetoothDeliverVo(); |
| | | vo.setVim(xpVehicle.getVehicleVin()); |
| | | vo.setPassengerUid(order.getAppUserId()); |
| | | BaseVehicleUserDto delete = bluetoothUnlockClient.delete(vo); |
| | | if (null == delete || delete.getCode() != 0) { |
| | | log.error("删除蓝牙解锁失败:{} {}", delete.getMsg(), order.getOrderNumber()); |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | sendMessageDTO.setAppUserId(String.valueOf(appUserId)); |
| | | R<String> stringR = xpPushMessageClient.sendStatus(sendMessageDTO); |
| | | //推送失败,重试3次 |
| | | if(stringR.getCode() != Constants.SUCCESS){ |
| | | 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(sendMessageDTO); |
| | | if(stringR1.getCode() == Constants.SUCCESS){ |
| | | if (stringR1.getCode() == Constants.SUCCESS) { |
| | | break; |
| | | } |
| | | try { |
| | |
| | | |
| | | // 移除mongo数据 |
| | | xpPricingClient.deleteXpGeoQueryEntity(order.getId().toString()); |
| | | |
| | | //流量接入-订单推送 推送取消订单 |
| | | if(Objects.nonNull(order.getOfficialPartnerId())){ |
| | | officialPartnerUtil.pushCancelOrder(order.getOfficialPartnerId(), xpOrderCancel, order.getStatus()); |
| | | } |
| | | return order; |
| | | } |
| | | |
| | |
| | | xpOrder.setAppUserId(null); |
| | | xpOrder.setStatus(10); |
| | | baseMapper.updateById(xpOrder); |
| | | bootCommonService.setCache_orderStatus(xpOrder.getId(),xpOrder,null); |
| | | bootCommonService.setCache_orderStatus(xpOrder.getId(), xpOrder, null); |
| | | |
| | | XpOrderEvaluate evaluate = new XpOrderEvaluate(); |
| | | evaluate.setOrderId(xpOrder.getId()); |
| | |
| | | if (xpOrder.getStatus() == 0) { |
| | | return R.fail("订单已取消"); |
| | | } |
| | | if(xpOrder.getStatus() >= 8){ |
| | | if (xpOrder.getStatus() >= 8) { |
| | | return R.fail("订单已结束"); |
| | | } |
| | | Long appUserId = xpOrder.getAppUserId(); |
| | | // 查询车辆 |
| | | XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData(); |
| | | VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class); |
| | | // 订单的状态 status =1 ( 状态 0=已取消,1=待接单,2=待出发,3=接驾中,4=待客上车,5=乘客已上车,6=服务中,7=待客下车,8=待付款,9=待评价,10=已完成) |
| | | switch (status) { |
| | | case 0://去掉订单 优惠卷需要返回 @todo yyy 这里可能不需要这个步骤 |
| | | //取消订单会将优惠卷 从占用修改成未使用 |
| | | if(xpOrder.getCouponId() != null){ |
| | | if (xpOrder.getCouponId() != null) { |
| | | UseUserCouponDto useUserCouponDto = new UseUserCouponDto(); |
| | | useUserCouponDto.setUserCouponId(xpOrder.getCouponId() ); |
| | | useUserCouponDto.setUserCouponId(xpOrder.getCouponId()); |
| | | xpAppUserCouponClient.backUserCoupon(useUserCouponDto); |
| | | } |
| | | break; |
| | |
| | | case 5: |
| | | LocalDateTime now = LocalDateTime.now(); |
| | | xpOrder.setBoardingTime(now); |
| | | if (Objects.nonNull(vehiclePosition)) { |
| | | GeoJsonPoint point = vehiclePosition.getPoint(); |
| | | if (Objects.nonNull(point)) { |
| | | double x = point.getX(); |
| | | double y = point.getY(); |
| | | Map<String, String> geocode = gdMapGeocodingUtil.geocode(String.valueOf(x), String.valueOf(y)); |
| | | xpOrder.setBoardingLon(x); |
| | | xpOrder.setBoardingLat(y); |
| | | xpOrder.setBoardingAddress(geocode.get("address")); |
| | | } |
| | | } |
| | | xpOrder.setRideTime(now); |
| | | //推送行起点到终点的驶轨迹给乘客端 |
| | | sendRoute(appUserId.toString(), orderId, "ORDER_NAVIGATION_END_DATA", xpVehicle.getVehicleVin()); |
| | |
| | | //乘客已上车,重新倒计时不开始行程取消订单 |
| | | XpPoint xpPoint1 = xpPointClient.queryById(xpOrder.getStartPointId()).getData(); |
| | | XpTradingStrategy tradingStrategy = tradingStrategyClient.getTradingStrategyByCityCode(xpPoint1.getCityCode()).getData(); |
| | | if(null != tradingStrategy){ |
| | | if (null != tradingStrategy) { |
| | | Map<String, ? extends Object> cancelJobMaps1 = |
| | | new ImmutableMap.Builder<String, Long>(). |
| | | put("id", xpOrder.getId()) |
| | |
| | | cancelJobMaps1 |
| | | ); |
| | | } |
| | | |
| | | // 车辆到达上车点时间 |
| | | xpOrder.setArrivalTime(LocalDateTime.now()); |
| | | break; |
| | | case 6: |
| | | // 删除定时任务job |
| | |
| | | xpOrder.setTripBegin(LocalDateTime.now()); |
| | | //添加预估到达时间 |
| | | String cacheObject = redisService.getCacheObject("ORDER_NAVIGATION_END_DATA:" + xpOrder.getAppUserId()); |
| | | if(StringUtils.isNotBlank(cacheObject)){ |
| | | if (StringUtils.isNotBlank(cacheObject)) { |
| | | RouteVo routeVo = JSONObject.parseObject(cacheObject, RouteVo.class); |
| | | xpOrder.setEstimatedArrivalTime(LocalDateTime.now().plusSeconds(routeVo.getDuration())); |
| | | } |
| | |
| | | case 7: |
| | | xpOrder.setGetoffTime(LocalDateTime.now()); |
| | | // 解析下车地点 |
| | | VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class); |
| | | if(Objects.nonNull(vehiclePosition)){ |
| | | if (Objects.nonNull(vehiclePosition)) { |
| | | GeoJsonPoint point = vehiclePosition.getPoint(); |
| | | if(Objects.nonNull(point)){ |
| | | if (Objects.nonNull(point)) { |
| | | double x = point.getX(); |
| | | double y = point.getY(); |
| | | Map<String, String> geocode = gdMapGeocodingUtil.geocode(String.valueOf(x), String.valueOf(y)); |
| | |
| | | sendMessageDTO.setAppUserId(String.valueOf(xpOrder.getAppUserId())); |
| | | R<String> stringR = xpPushMessageClient.sendStatus(sendMessageDTO); |
| | | //推送失败,重试3次 |
| | | if(stringR.getCode() != Constants.SUCCESS){ |
| | | 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(sendMessageDTO); |
| | | if(stringR1.getCode() == Constants.SUCCESS){ |
| | | if (stringR1.getCode() == Constants.SUCCESS) { |
| | | break; |
| | | } |
| | | try { |
| | |
| | | |
| | | //判断是否有连环单 |
| | | String json = redisService.getCacheObject(CacheConstants.nextOrder(xpOrder.getId().toString())); |
| | | if (StringUtils.isNotEmpty(json)){ |
| | | if (StringUtils.isNotEmpty(json)) { |
| | | JSONObject jsonObject = JSON.parseObject(json); |
| | | Long id = jsonObject.getLong("orderId"); |
| | | jobMaps = new ImmutableMap.Builder<String, String>() |
| | | .put("id", id.toString()) |
| | | .put("oldOrderId", xpOrder.getId().toString()) |
| | | .put("appid", appid) |
| | | .put("orderType", OrderType.USER_ORDER) |
| | | .build(); |
| | | .put("id", id.toString()) |
| | | .put("oldOrderId", xpOrder.getId().toString()) |
| | | .put("appid", appid) |
| | | .put("orderType", OrderType.USER_ORDER) |
| | | .build(); |
| | | |
| | | QuartzManager.addJob( |
| | | PushChainReactionOrderJob.class, |
| | |
| | | xpOrder.setStatus(status); |
| | | xpOrder.setAppUserId(null); |
| | | this.updateById(xpOrder); |
| | | bootCommonService.setCache_orderStatus(xpOrder.getId(),xpOrder,null); |
| | | bootCommonService.setCache_orderStatus(xpOrder.getId(), xpOrder, null); |
| | | return R.ok(); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * 行驶中车辆异常,订单状态修改- 修改状态=7 再修改 金额-再将状态修改成8 |
| | | */ |
| | | @Override |
| | | public R<String> carAbnormalUpdateOrderStatus(Long orderId){ |
| | | public R<String> carAbnormalUpdateOrderStatus(Long orderId) { |
| | | XpOrder xpOrder = this.getById(orderId); |
| | | if (Objects.isNull(xpOrder)) { |
| | | return R.fail("订单不存在"); |
| | |
| | | if (xpOrder.getStatus() == 0) { |
| | | return R.fail("订单已取消"); |
| | | } |
| | | if(xpOrder.getStatus() >= 8){ |
| | | if (xpOrder.getStatus() >= 8) { |
| | | return R.fail("订单已结束"); |
| | | } |
| | | // 查询车辆 |
| | |
| | | xpOrder.setGetoffTime(LocalDateTime.now()); |
| | | // 解析下车地点 |
| | | VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class); |
| | | if(Objects.nonNull(vehiclePosition)){ |
| | | if (Objects.nonNull(vehiclePosition)) { |
| | | GeoJsonPoint point = vehiclePosition.getPoint(); |
| | | if(Objects.nonNull(point)){ |
| | | if (Objects.nonNull(point)) { |
| | | double x = point.getX(); |
| | | double y = point.getY(); |
| | | Map<String, String> geocode = gdMapGeocodingUtil.geocode(String.valueOf(x), String.valueOf(y)); |
| | |
| | | xpOrder.setStatus(OrderStatusEnum.SEE_OFF_GUESTS.getCode());//待客下车 |
| | | xpOrder.setAppUserId(null); |
| | | this.updateById(xpOrder); |
| | | //结束行程,修改状态和计算费用 |
| | | this.endTrip(xpOrder.getId(),appUserId.toString()); |
| | | //结束行程,修改状态和计算费用 |
| | | this.endTrip(xpOrder.getId(), appUserId.toString()); |
| | | |
| | | //将支付金额修改成0 并将状态修改成 订单状态9 |
| | | setFree(xpOrder.getId()); |
| | |
| | | /** |
| | | * 豁免 |
| | | */ |
| | | public void setFree(Long id){ |
| | | public void setFree(Long id) { |
| | | |
| | | //将支付金额修改成0 并将状态修改成 订单状态9 |
| | | XpOrder xpOrder1 = new XpOrder(); |
| | | xpOrder1.setId(id); |
| | | xpOrder1.setIsFree( true);//豁免 |
| | | xpOrder1.setIsFree(true);//豁免 |
| | | xpOrder1.setPayMoney(BigDecimal.ZERO); |
| | | xpOrder1.setStatus(OrderStatusEnum.PENDING_PAYMENT.getCode()); |
| | | xpOrder1.setUpdateTime(LocalDateTime.now()); |
| | | baseMapper.updateById(xpOrder1); |
| | | bootCommonService.setCache_orderStatus(xpOrder1.getId(),xpOrder1,null); |
| | | bootCommonService.setCache_orderStatus(xpOrder1.getId(), xpOrder1, null); |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | @Override |
| | |
| | | order.setTripEnd(LocalDateTime.now()); |
| | | baseMapper.updateById(order); |
| | | order.setAppUserId(appUserId); |
| | | bootCommonService.setCache_orderStatus(order.getId(),order,null); |
| | | bootCommonService.setCache_orderStatus(order.getId(), order, null); |
| | | //删除蓝牙秘钥 |
| | | // String token = redisService.getCacheObject("rt:bluetooth:unlock:order:" + orderId); |
| | | // if(StringUtils.isNotBlank(token)){ |
| | |
| | | // } |
| | | |
| | | // 根据订单所属开通城市id 查询定价 |
| | | XpPricing pricing = bootCommonService.getXpPricing(order.getCityId(),order.getVehicleId()); |
| | | XpPricing pricing = bootCommonService.getXpPricing(order.getCityId(), order.getVehicleId()); |
| | | if (pricing == null) { |
| | | throw new ServiceException("当前城市未配置定价规则", I18nKeyConstant.ORDER_PRICING_NOT_EXISTS); |
| | | } |
| | |
| | | xpOrderDetail.setDetailType(2); |
| | | xpOrderDetail.setOrderId(orderId); |
| | | xpOrderDetail.setType(1); |
| | | xpOrderDetail.setMoney(new BigDecimal(xpPricingCardVo.getDistancePrice()).setScale(2,RoundingMode.HALF_UP)); |
| | | xpOrderDetail.setMoney(new BigDecimal(xpPricingCardVo.getDistancePrice()).setScale(2, RoundingMode.HALF_UP)); |
| | | xpOrderDetails.add(xpOrderDetail); |
| | | //时长费不是必填项 |
| | | if(null != xpPricingCardVo.getDurationPrice() && xpPricingCardVo.getDurationPrice() > 0){ |
| | | if (null != xpPricingCardVo.getDurationPrice() && xpPricingCardVo.getDurationPrice() > 0) { |
| | | xpOrderDetail = new XpOrderDetail(); |
| | | xpOrderDetail.setDetailType(3); |
| | | xpOrderDetail.setOrderId(orderId); |
| | |
| | | xpOrderDetails.add(xpOrderDetail); |
| | | } |
| | | |
| | | BigDecimal totalPrice =BigDecimal.ZERO; |
| | | BigDecimal totalPrice = BigDecimal.ZERO; |
| | | for (XpOrderDetail xpOrderDetail1 : xpOrderDetails) { |
| | | totalPrice = totalPrice.add(xpOrderDetail1.getMoney()); |
| | | xpOrderDetailMapper.insert(xpOrderDetail1); |
| | |
| | | order.setOrderMoney(totalPrice); |
| | | order.setAppUserId(null); |
| | | baseMapper.updateById(order); |
| | | } |
| | | else { |
| | | } else { |
| | | //动态计费 |
| | | if (pricing.getPricingType() == 1) { |
| | | for (int i = 0; i < startingFareJsonArray.size(); i++) { |
| | |
| | | |
| | | // 天气预报动态调价 |
| | | JSONArray ws = jsonObject.getJSONArray("weather"); |
| | | if(null != ws){ |
| | | if (null != ws) { |
| | | WeatherDTO data = xpMapClient.wether(order.getCityCode()).getData(); |
| | | List<WeatherDTO.Lives> lives = data.getLives(); |
| | | if(lives!=null && !lives.isEmpty()){ |
| | | if (lives != null && !lives.isEmpty()) { |
| | | String w = lives.get(0).getWeather(); |
| | | for (Object o : ws) { |
| | | JSONObject ele = JSONObject.parseObject(o.toString()); |
| | | if(w.contains(ele.getString("weatherType"))){ |
| | | if (w.contains(ele.getString("weatherType"))) { |
| | | double floatRate = jsonObject.getDouble("ratio"); |
| | | priceRate = new BigDecimal(priceRate).add(new BigDecimal(floatRate)).doubleValue(); |
| | | break; |
| | |
| | | // 封装时长费 |
| | | FareBreakdownDetailVo timeDetail = new FareBreakdownDetailVo(); |
| | | if (key.contains("时长费")) { |
| | | if(key.contains("普通时段")){ |
| | | if (key.contains("普通时段")) { |
| | | timeDetail.setType(1); |
| | | } |
| | | if(key.contains("夜间行驶")){ |
| | | if (key.contains("夜间行驶")) { |
| | | timeDetail.setType(2); |
| | | } |
| | | if(key.contains("高峰")){ |
| | | if (key.contains("高峰")) { |
| | | timeDetail.setType(3); |
| | | } |
| | | if(key.contains("节假")){ |
| | | if (key.contains("节假")) { |
| | | timeDetail.setType(4); |
| | | } |
| | | |
| | |
| | | UserCouponVo userCouponVo = userCouponVoR.getData(); |
| | | |
| | | // 提示是否换券 |
| | | boolean tip =false; |
| | | boolean tip = false; |
| | | if (userCouponVo != null) { |
| | | // 重新选券 |
| | | if(userCouponVo.getStatus()==2){ |
| | | if (userCouponVo.getStatus() == 2) { |
| | | getUserCouponDto.setUserId(Long.valueOf(uid)); |
| | | getUserCouponDto.setTotalAmount(order.getOrderMoney().doubleValue()); |
| | | getUserCouponDto.setUserCouponId(order.getCouponId()); |
| | | getUserCouponDto.setOpenCityId(order.getCityId()); |
| | | userCouponVoR = xpAppUserCouponClient.getUserCoupon(getUserCouponDto); |
| | | userCouponVo = userCouponVoR.getData(); |
| | | tip=true; |
| | | tip = true; |
| | | } |
| | | order.setCouponId(userCouponVo.getId()); |
| | | order.setCouponMoney(BigDecimal.valueOf(userCouponVo.getMoney())); |
| | |
| | | xpCruiseOrder.setXpuTaskId(snowflake.nextId() + ""); |
| | | |
| | | // 完成的直接走终点 终止的走起点 |
| | | if(null != xpCruiseOrders){ |
| | | if (null != xpCruiseOrders) { |
| | | if (temp == 0) { |
| | | //当上一笔单有起点点位,才需要将上一笔巡游单的起点作为本次的终点导航 |
| | | //上一笔单没有起点点位,统一用后面的巡游计划的第一个点位作为本次的终点导航 |
| | | if(null != xpCruiseOrders.getStartPointId()){ |
| | | if (null != xpCruiseOrders.getStartPointId()) { |
| | | xpCruiseOrder.setEndPointId(xpCruiseOrders.getStartPointId()); |
| | | xpCruiseOrder.setEndPointName(xpCruiseOrders.getStartPointName()); |
| | | xpCruiseOrder.setEndLon(xpCruiseOrders.getStartLon()); |
| | |
| | | xpCruiseOrder.setMissionId(xpCruiseOrders.getMissionId()); |
| | | } |
| | | //所有没有赋值终点点位的情况,全部导航到巡游计划的第一个点位开始执行巡游任务 |
| | | if(null == xpCruiseOrder.getEndPointId()){ |
| | | if (null == xpCruiseOrder.getEndPointId()) { |
| | | // 先找计划 |
| | | List<XpCruisePlanPoint> planPointList = xpCruisePlanClient.getCruisePlanPointList(vehicle.getId()).getData(); |
| | | XpCruisePlanPoint xpCruisePlanPoint = planPointList.get(0); |
| | |
| | | xpCruiseOrder.setCreateTime(LocalDateTime.now()); |
| | | |
| | | // 判断当前时分秒是否大于收车时间&&收车配置开启 |
| | | if(null != xpTaskRule && xpTaskRule.getVehicleCollection()){ |
| | | if (null != xpTaskRule && xpTaskRule.getVehicleCollection()) { |
| | | LocalTime vehicleCollectionTime = xpTaskRule.getVehicleCollectionTime(); |
| | | if (vehicleCollectionTime.isBefore(LocalTime.now())) { |
| | | XpVehicle vehicle1 = new XpVehicle(); |
| | |
| | | xpVehicleClient.updateVehicleById(vehicle1); |
| | | //找到车辆的收车点位 更新终点点位 |
| | | R<XpCruiseOrder> returnCruisePoint = xpCruisePlanClient.findReturnCruisePoint(xpCruiseOrder); |
| | | if(200 != returnCruisePoint.getCode()){ |
| | | if (200 != returnCruisePoint.getCode()) { |
| | | xpCruiseOrder = returnCruisePoint.getData(); |
| | | xpCruiseOrder.setOrderType(2); |
| | | xpCruiseOrder.setOrderReverse(1); |
| | |
| | | xpCruiseOrder.setStartLat(vehiclePosition.getPoint().getY()); |
| | | |
| | | // 完成的直接走终点 终止的走起点 |
| | | if(null != xpCruiseOrders){ |
| | | if (null != xpCruiseOrders) { |
| | | if (temp == 0) { |
| | | //当上一笔单有起点点位,才需要将上一笔巡游单的起点作为本次的终点导航 |
| | | //上一笔单没有起点点位,统一用后面的巡游计划的第一个点位作为本次的终点导航 |
| | | if(null != xpCruiseOrders.getStartPointId()){ |
| | | if (null != xpCruiseOrders.getStartPointId()) { |
| | | xpCruiseOrder.setEndPointId(xpCruiseOrders.getStartPointId()); |
| | | xpCruiseOrder.setEndPointName(xpCruiseOrders.getStartPointName()); |
| | | xpCruiseOrder.setEndLon(xpCruiseOrders.getStartLon()); |
| | |
| | | xpCruiseOrder.setMissionId(xpCruiseOrders.getMissionId()); |
| | | } |
| | | //所有没有赋值终点点位的情况,全部导航到巡游计划的第一个点位开始执行巡游任务 |
| | | if(null == xpCruiseOrder.getEndPointId()){ |
| | | if (null == xpCruiseOrder.getEndPointId()) { |
| | | // 先找计划 |
| | | List<XpCruisePlanPoint> planPointList = xpCruisePlanClient.getCruisePlanPointList(vehicle.getId()).getData(); |
| | | XpCruisePlanPoint xpCruisePlanPoint = planPointList.get(0); |
| | |
| | | xpCruiseOrder.setCreateTime(LocalDateTime.now()); |
| | | |
| | | // 判断当前时分秒是否大于收车时间&&收车配置开启 |
| | | if(null != xpTaskRule && xpTaskRule.getVehicleCollection()){ |
| | | if (null != xpTaskRule && xpTaskRule.getVehicleCollection()) { |
| | | LocalTime vehicleCollectionTime = xpTaskRule.getVehicleCollectionTime(); |
| | | if (vehicleCollectionTime.isBefore(LocalTime.now())) { |
| | | XpVehicle vehicle1 = new XpVehicle(); |
| | |
| | | xpVehicleClient.updateVehicleById(vehicle1); |
| | | //找到车辆的收车点位 更新终点点位 |
| | | R<XpCruiseOrder> returnCruisePoint = xpCruisePlanClient.findReturnCruisePoint(xpCruiseOrder); |
| | | if(200 != returnCruisePoint.getCode()){ |
| | | if (200 != returnCruisePoint.getCode()) { |
| | | xpCruiseOrder = returnCruisePoint.getData(); |
| | | xpCruiseOrder.setOrderType(2); |
| | | xpCruiseOrder.setOrderReverse(1); |
| | |
| | | public R<FareBreakdownVo> fareBreakdown(com.xiaopeng.order.vo.FareBreakdownVo vo, String uid) { |
| | | XpOrder order = this.getById(vo.getOrderId()); |
| | | //根据新的优惠券计算优惠金额 |
| | | if(null != order.getCouponId()){ |
| | | if (null != order.getCouponId()) { |
| | | CalculateDiscountAmountVo discountAmountVo = new CalculateDiscountAmountVo(); |
| | | BigDecimal data = xpAppUserCouponClient.calculateDiscountAmount(discountAmountVo).getData(); |
| | | order.setCouponId(vo.getUserCouponId()); |
| | |
| | | detail.setType(xpOrderDetail.getType()); |
| | | detail.setTime(xpOrderDetail.getTime()); |
| | | detail.setMileage(xpOrderDetail.getMileage()); |
| | | detail.setDuration((xpOrderDetail.getDuration() == null ? 0 : xpOrderDetail.getDuration())*60); |
| | | detail.setDuration((xpOrderDetail.getDuration() == null ? 0 : xpOrderDetail.getDuration()) * 60); |
| | | detail.setMoney(xpOrderDetail.getMoney()); |
| | | if (xpOrderDetail.getDetailType() == 1) { |
| | | start.add(detail); |
| | | } else if(xpOrderDetail.getDetailType()==2){ |
| | | } else if (xpOrderDetail.getDetailType() == 2) { |
| | | mileage.add(detail); |
| | | }else if(xpOrderDetail.getDetailType()==3){ |
| | | } else if (xpOrderDetail.getDetailType() == 3) { |
| | | duration.add(detail); |
| | | }else if(xpOrderDetail.getDetailType()==4){ |
| | | } else if (xpOrderDetail.getDetailType() == 4) { |
| | | longDistance.add(detail); |
| | | } |
| | | } |
| | |
| | | } |
| | | res.setTime(new BigDecimal(order.getDuration() == null ? 0 : order.getDuration()).multiply(new BigDecimal(60)).setScale(0, RoundingMode.HALF_UP)); |
| | | XpSystemSetting xpSystemSetting = xpSystemSettingClient.getSystemSettingOne().getData(); |
| | | if(null != xpSystemSetting){ |
| | | if (null != xpSystemSetting) { |
| | | res.setOperateFree(xpSystemSetting.getOperateFree()); |
| | | } |
| | | return R.ok(res); |
| | | } |
| | | |
| | | |
| | | |
| | | @Override |
| | |
| | | XpOrder order = this.getById(dto.getOrderId()); |
| | | order.setStatus(9); |
| | | order.setAppUserId(null); |
| | | if(order.getCouponId()!=null){ |
| | | if (order.getCouponId() != null) { |
| | | UseUserCouponDto useUserCouponDto = new UseUserCouponDto(); |
| | | useUserCouponDto.setUserCouponId(order.getCouponId()); |
| | | R<BigDecimal> decimalR = xpAppUserCouponClient.useUserCoupon(useUserCouponDto); |
| | | if(decimalR.getCode()==200){ |
| | | if (decimalR.getCode() == 200) { |
| | | order.setCouponMoney(decimalR.getData()); |
| | | if(order.getCouponMoney().compareTo(order.getOrderMoney())>0){ |
| | | if (order.getCouponMoney().compareTo(order.getOrderMoney()) > 0) { |
| | | order.setPayMoney(BigDecimal.ZERO); |
| | | order.setCouponMoney(order.getOrderMoney()); |
| | | }else { |
| | | } else { |
| | | order.setPayMoney(order.getOrderMoney().subtract(decimalR.getData())); |
| | | } |
| | | } |
| | | } |
| | | baseMapper.updateById(order); |
| | | bootCommonService.setCache_orderStatus(order.getId(),order,null); |
| | | bootCommonService.setCache_orderStatus(order.getId(), order, null); |
| | | return R.ok(); |
| | | } |
| | | |
| | |
| | | public void saveVehicleLocation(OrderTrajectory orderTrajectory) { |
| | | // 查询订单信息 |
| | | Integer status = redisService.getCacheObject("ORDER_STATUS:" + orderTrajectory.getOrderId()); |
| | | if(status < 6 || status > 8){ |
| | | if (status < 6 || status > 8) { |
| | | return; |
| | | } |
| | | |
| | |
| | | vehicleEventDTO.setOrderId(String.valueOf(dto.getOrderId())); |
| | | vehicleEventDTO.setEventKey("RT_xpu_vehicle_trace_upload"); |
| | | vehicleEventDTO.setEventTime(System.currentTimeMillis()); |
| | | Map<String,Object> attributes = new HashMap<>(); |
| | | attributes.put("vin",vehicleEventDTO.getVin()); |
| | | attributes.put("order_id",vehicleEventDTO.getOrderId()); |
| | | attributes.put("order_type","cruise_order"); |
| | | attributes.put("timestamp",vehicleEventDTO.getEventTime()); |
| | | Map<String, Object> attributes = new HashMap<>(); |
| | | attributes.put("vin", vehicleEventDTO.getVin()); |
| | | attributes.put("order_id", vehicleEventDTO.getOrderId()); |
| | | attributes.put("order_type", "cruise_order"); |
| | | attributes.put("timestamp", vehicleEventDTO.getEventTime()); |
| | | attributes.put("current_main_status", OrderStatus.ORDER_STARTED); |
| | | attributes.put("current_sub_status",""); |
| | | attributes.put("current_sub_status", ""); |
| | | VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(dto.getXpVehicleVin())), VehiclePosition.class); |
| | | if(Objects.nonNull(vehiclePosition)){ |
| | | attributes.put("odometer_km",vehiclePosition.getTotalOdometer()); |
| | | }else { |
| | | attributes.put("odometer_km",""); |
| | | if (Objects.nonNull(vehiclePosition)) { |
| | | attributes.put("odometer_km", vehiclePosition.getTotalOdometer()); |
| | | } else { |
| | | attributes.put("odometer_km", ""); |
| | | } |
| | | vehicleEventDTO.setAttributes(attributes); |
| | | vehicleBuriedPointClient.sendVehicleEvent(vehicleEventDTO); |
| | |
| | | addTaxiPassengerVo.setUid(appUserId.toString()); |
| | | order.setAppUserId(null); |
| | | this.updateById(order); |
| | | bootCommonService.setCache_orderStatus(order.getId(),order,null); |
| | | bootCommonService.setCache_orderStatus(order.getId(), order, null); |
| | | |
| | | //构建推送消息 |
| | | Map<String, Object> params = new HashMap<>(); |
| | |
| | | R<String> stringR = xpPushMessageClient.sendStatus(dto1); |
| | | |
| | | //推送失败,重试3次 |
| | | if(stringR.getCode() != Constants.SUCCESS){ |
| | | 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){ |
| | | if (stringR1.getCode() == Constants.SUCCESS) { |
| | | break; |
| | | } |
| | | try { |
| | |
| | | // log.info("下发蓝牙token成功:{} {}", deliver.getData(), order.getOrderNumber()); |
| | | } |
| | | |
| | | if(order.getStatus() == 2){ |
| | | if (order.getStatus() == 2) { |
| | | // 封装埋点消息实体 |
| | | VehicleEventDTO vehicleEventDTO = new VehicleEventDTO(); |
| | | vehicleEventDTO.setVin(dto.getXpVehicleVin()); |
| | |
| | | vehicleEventDTO.setOrderId(String.valueOf(dto.getOrderId())); |
| | | vehicleEventDTO.setEventKey("RT_xpu_vehicle_trace_upload"); |
| | | vehicleEventDTO.setEventTime(System.currentTimeMillis()); |
| | | Map<String,Object> attributes = new HashMap<>(); |
| | | attributes.put("vin",vehicleEventDTO.getVin()); |
| | | attributes.put("order_id",vehicleEventDTO.getOrderId()); |
| | | attributes.put("order_type","user_order"); |
| | | attributes.put("timestamp",vehicleEventDTO.getEventTime()); |
| | | attributes.put("current_main_status",OrderStatus.ORDER_EN_ROUTE_TO_PICKUP); |
| | | attributes.put("current_sub_status",""); |
| | | Map<String, Object> attributes = new HashMap<>(); |
| | | attributes.put("vin", vehicleEventDTO.getVin()); |
| | | attributes.put("order_id", vehicleEventDTO.getOrderId()); |
| | | attributes.put("order_type", "user_order"); |
| | | attributes.put("timestamp", vehicleEventDTO.getEventTime()); |
| | | attributes.put("current_main_status", OrderStatus.ORDER_EN_ROUTE_TO_PICKUP); |
| | | attributes.put("current_sub_status", ""); |
| | | VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(dto.getXpVehicleVin())), VehiclePosition.class); |
| | | if(Objects.nonNull(vehiclePosition)){ |
| | | attributes.put("odometer_km",vehiclePosition.getTotalOdometer()); |
| | | }else { |
| | | attributes.put("odometer_km",""); |
| | | if (Objects.nonNull(vehiclePosition)) { |
| | | attributes.put("odometer_km", vehiclePosition.getTotalOdometer()); |
| | | } else { |
| | | attributes.put("odometer_km", ""); |
| | | } |
| | | vehicleEventDTO.setAttributes(attributes); |
| | | vehicleBuriedPointClient.sendVehicleEvent(vehicleEventDTO); |
| | |
| | | R<String> stringR = xpPushMessageClient.sendRoute(messageDTO); |
| | | XpOrder xpOrder = this.getById(orderId); |
| | | //推送失败,重试3次 |
| | | if(stringR.getCode() != Constants.SUCCESS){ |
| | | 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(messageDTO); |
| | | if(stringR1.getCode() == Constants.SUCCESS){ |
| | | if (stringR1.getCode() == Constants.SUCCESS) { |
| | | break; |
| | | } |
| | | try { |
| | |
| | | xpOrderDetailVO.setVehiclePictures(vehicle.getVehiclePictures()); |
| | | } |
| | | Integer status = xpOrder.getStatus(); |
| | | if(status > 2 && status < 8){ |
| | | if (status > 2 && status < 8) { |
| | | // Boolean data = xpVehicleClient.getVehicleTrunkOpenStatus(xpOrder.getAppUserId(), xpOrder.getVehicleId()).getData(); |
| | | // xpOrder.setOpenTrunk(data ? 1 : 2); |
| | | // xpOrderDetailVO.setOpenTrunk(data ? 1 : 2); |
| | |
| | | } |
| | | |
| | | @Override |
| | | public XpOrderDetailVO getActiveOrder_itineraryManage(String uid){ |
| | | public XpOrderDetailVO getActiveOrder_itineraryManage(String uid) { |
| | | XpOrderDetailVO xpOrderDetailVO = new XpOrderDetailVO(); |
| | | XpOrder xpOrder = this.baseMapper.selectOne(new LambdaQueryWrapper<XpOrder>().eq(XpOrder::getAppUserId, Long.parseLong(uid)).in(XpOrder::getStatus, Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8)).orderByDesc(BaseModel::getCreateTime).last("LIMIT 1")); |
| | | if (xpOrder == null) { |
| | |
| | | |
| | | xpOrderDetailVO.setVehiclePictures(vehicle.getVehiclePictures()); |
| | | } |
| | | Boolean cancelShow = isCancelShow(xpOrder,xpOrderDetailVO.getVehicleVin()); //是否能取消行程 |
| | | Boolean cancelShow = isCancelShow(xpOrder, xpOrderDetailVO.getVehicleVin()); //是否能取消行程 |
| | | xpOrderDetailVO.setCancelShow(cancelShow); |
| | | return xpOrderDetailVO; |
| | | } |
| | | |
| | | /** |
| | | * 取消行程:若处于“送驾中”且离目的地小于10分钟路程(后台配置),【取消行程】按钮应置灰; |
| | | * 修改行程: |
| | | * 1. 当前剩余里程 < 800米 (后台配置)或 剩余时间 < 5分钟(后台配置)(以先到者为准),禁止修改,按钮置灰。 |
| | | * 2. 单次行程最多允许修改 2次 (后台配置)目的地,防恶意高频调用 |
| | | * 特殊豁免:若系统检测到车辆在当前坐标时速 < 3km/h 且持续时间 > 3分钟(后台配置)(判定为极度拥堵或异常停滞),此时解除限制,允许用户修改目的地或新增途径点以寻找更近的下车位置。 |
| | | * |
| | | * @return |
| | | */ |
| | | private boolean isCancelShow(XpOrder xpOrder,String vehicleVin) { |
| | | private boolean isCancelShow(XpOrder xpOrder, String vehicleVin) { |
| | | boolean isCancel = false; |
| | | |
| | | //获取系统配置 |
| | | XpSystemSetting systemSetting = xpSystemSettingClient.getSystemSettingOne().getData(); |
| | | if(systemSetting == null){ |
| | | if (systemSetting == null) { |
| | | throw new ServiceException("获取行程配置错误"); |
| | | } |
| | | //获取配置文件 |
| | |
| | | |
| | | |
| | | List<OrderTrajectory> orderTrajectories = queryOrderTrajectories(xpOrder.getId()); |
| | | if(!orderTrajectories.isEmpty()){// 减少3分钟 获取3分账内的 行程数据 |
| | | if (!orderTrajectories.isEmpty()) {// 减少3分钟 获取3分账内的 行程数据 |
| | | //3千米/小时 转换成分钟 50米/分钟 |
| | | BigDecimal suduDefault = new BigDecimal(xczSpeedPerHour);//3千米/小时 |
| | | BigDecimal suduDefault1 = suduDefault.multiply(BigDecimal.valueOf(1000)) ; |
| | | BigDecimal suduDefaultNew =suduDefault1.divide(BigDecimal.valueOf(60),2,RoundingMode.HALF_EVEN); |
| | | BigDecimal suduDefault1 = suduDefault.multiply(BigDecimal.valueOf(1000)); |
| | | BigDecimal suduDefaultNew = suduDefault1.divide(BigDecimal.valueOf(60), 2, RoundingMode.HALF_EVEN); |
| | | |
| | | LocalDateTime minutesBefore = LocalDateTime.now().minusMinutes(xczHmDuration); |
| | | long milliseconds = DateUtils.getMilliseconds(minutesBefore); |
| | | List<OrderTrajectory> orderTrajectoriesNew = new ArrayList<>(); |
| | | for (OrderTrajectory orderTrajectory : orderTrajectories) { |
| | | if(orderTrajectory.getLocatetime() > milliseconds){ |
| | | if (orderTrajectory.getLocatetime() > milliseconds) { |
| | | orderTrajectoriesNew.add(orderTrajectory); |
| | | } |
| | | } |
| | |
| | | */ |
| | | //计算行驶总距离和时长 |
| | | Double reduce = orderTrajectoriesNew.stream().map(OrderTrajectory::getDistance).reduce(0.0, Double::sum); |
| | | BigDecimal xcsudu = new BigDecimal(reduce).divide(new BigDecimal(xczHmDuration),2, RoundingMode.HALF_EVEN);//米/分钟 |
| | | BigDecimal xcsudu = new BigDecimal(reduce).divide(new BigDecimal(xczHmDuration), 2, RoundingMode.HALF_EVEN);//米/分钟 |
| | | |
| | | //特殊豁免:若系统检测到车辆在当前坐标时速 < 3km/h 且持续时间 > 3分钟(后台配置)(判定为极度拥堵或异常停滞),此时解除限制,允许用户修改目的地或新增途径点以寻找更近的下车位置。 |
| | | if(xcsudu.compareTo(suduDefaultNew)<0){ |
| | | if (xcsudu.compareTo(suduDefaultNew) < 0) { |
| | | return true; |
| | | } |
| | | } |
| | | |
| | | try { |
| | | RouteVo routeVo = this.getRouteVo(xpOrder, vehicleVin); |
| | | if(routeVo.getDistance() <sylc){ |
| | | if (routeVo.getDistance() < sylc) { |
| | | isCancel = true; |
| | | } |
| | | if(routeVo.getDuration() < sysj){ |
| | | if (routeVo.getDuration() < sysj) { |
| | | isCancel = true; |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("获取两个点位车的距离错误",e); |
| | | log.error("获取两个点位车的距离错误", e); |
| | | throw new ServiceException("获取两个点位车的距离错误"); |
| | | } |
| | | |
| | |
| | | |
| | | /** |
| | | * 获取两个点位车的距离 和时间 |
| | | * |
| | | * @param xpOrder |
| | | * @param vehicleVin |
| | | * @return |
| | | */ |
| | | private RouteVo getRouteVo(XpOrder xpOrder,String vehicleVin){ |
| | | private RouteVo getRouteVo(XpOrder xpOrder, String vehicleVin) { |
| | | |
| | | VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vehicleVin)), VehiclePosition.class); |
| | | // 计算距离 和 时间 |
| | |
| | | routeAndFareDto.setRoutePlanRule(xpRoutePlan.getRoutePlanRule()); |
| | | } |
| | | R<RouteVo> distanceAndDuration = xpMapClient.getDistanceAndDuration(routeAndFareDto); |
| | | if(distanceAndDuration.getCode()!=200){ |
| | | if (distanceAndDuration.getCode() != 200) { |
| | | throw new ServiceException("未找到路径", I18nKeyConstant.PATH_NOT_FOUND); |
| | | } |
| | | return distanceAndDuration.getData(); |
| | |
| | | sendMessageDTO.setAppUserId(String.valueOf(appUserId)); |
| | | R<String> stringR = xpPushMessageClient.sendStatus(sendMessageDTO); |
| | | //推送失败,重试3次 |
| | | if(stringR.getCode() != Constants.SUCCESS){ |
| | | 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(sendMessageDTO); |
| | | if(stringR1.getCode() == Constants.SUCCESS){ |
| | | if (stringR1.getCode() == Constants.SUCCESS) { |
| | | break; |
| | | } |
| | | try { |
| | |
| | | |
| | | /** |
| | | * 获取待支付订单数量 |
| | | * |
| | | * @param uid |
| | | * @return |
| | | */ |
| | |
| | | |
| | | /** |
| | | * 根据 UID 查询用户是否有 RT 订单 & 订单列表 |
| | | * |
| | | * @param dto |
| | | * @return |
| | | */ |
| | |
| | | |
| | | /** |
| | | * 获取订单详情 |
| | | * |
| | | * @param orderId |
| | | * @return |
| | | */ |
| | |
| | | XpPoint endPoint = xpPointClient.queryById(xpOrder.getEndPointId()).getData(); |
| | | vo.setDestAddress(endPoint.getPointAddress()); |
| | | vo.setPullOverAddress(xpOrder.getGetoffAddress()); |
| | | if(null != xpOrder.getEstimatedArrivalTime()){ |
| | | if (null != xpOrder.getEstimatedArrivalTime()) { |
| | | vo.setEstimatedArrivalTime(xpOrder.getEstimatedArrivalTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); |
| | | } |
| | | if(null != xpOrder.getGetoffTime()){ |
| | | if (null != xpOrder.getGetoffTime()) { |
| | | vo.setActualArrivalTime(xpOrder.getGetoffTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); |
| | | } |
| | | if(null == xpOrder.getMileageKilometers()){ |
| | | if (null == xpOrder.getMileageKilometers()) { |
| | | vo.setActualMileage(BigDecimal.valueOf(xpOrder.getMileageKilometers())); |
| | | } |
| | | vo.setTotalPrice(xpOrder.getOrderMoney()); |
| | |
| | | vo.setCouponDiscount(xpOrder.getCouponMoney()); |
| | | vo.setActualPayment(xpOrder.getPayMoney()); |
| | | XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData(); |
| | | if(null != xpVehicle){ |
| | | if (null != xpVehicle) { |
| | | vo.setVin(xpVehicle.getVehicleVin()); |
| | | } |
| | | XpOrderCancel orderCancel = xpOrderCancelService.getOne(new QueryWrapper<XpOrderCancel>().eq("order_id", orderId)); |
| | | if(null != orderCancel){ |
| | | if (null != orderCancel) { |
| | | vo.setCancelReasonType(orderCancel.getCancelReason()); |
| | | } |
| | | return vo; |
| | |
| | | /** |
| | | * |
| | | * 合作商更新订单状态 |
| | | * |
| | | * @param vo |
| | | */ |
| | | @Override |
| | | public void officialPartnerUpdateOrderStatus(UpdateOrderStatusVo vo) { |
| | | public R<?> officialPartnerUpdateOrderStatus(UpdateOrderStatusVo vo, Integer officialPartnerId) { |
| | | XpOrder xpOrder = this.getOne(new QueryWrapper<XpOrder>().eq("order_number", vo.getOrderNum())); |
| | | if (null == xpOrder) { |
| | | return R.fail("无效的订单编号"); |
| | | } |
| | | if (xpOrder.getStatus() >= 8) { |
| | | return R.fail("订单已结束,无法修改"); |
| | | } |
| | | |
| | | switch (vo.getOrderStatus()) { |
| | | case 2: |
| | | if (xpOrder.getStatus() != 1) { |
| | | return R.fail("订单状态不允许改为已接单"); |
| | | } |
| | | if (StringUtils.isEmpty(vo.getVehiclePlateNumber())) { |
| | | return R.fail("车牌号不能为空"); |
| | | } |
| | | if (null == vo.getAcceptanceTime()) { |
| | | return R.fail("接单时间不能为空"); |
| | | } |
| | | XpVehicle xpVehicle = xpVehicleClient.getVehicleByPlateNumber(vo.getVehiclePlateNumber(), officialPartnerId).getData(); |
| | | if (null == xpVehicle) { |
| | | return R.fail("车牌号不存在"); |
| | | } |
| | | xpOrder.setOfficialPartnerId(officialPartnerId); |
| | | xpOrder.setVehicleId(xpVehicle.getId()); |
| | | xpOrder.setAcceptanceTime(vo.getAcceptanceTime()); |
| | | redisService.setCacheObject("ORDER_STATUS:" + xpOrder.getId(), OrderStatusEnum.READY_DEPART.getCode(), 24L, TimeUnit.HOURS); |
| | | //将订单弹出队列 |
| | | try { |
| | | redisService.popFirstElement(xpOrder.getQueueName()); |
| | | } catch (Exception e) { |
| | | log.error("Redis弹出队列元素出错"); |
| | | } |
| | | // 存mongo数据 |
| | | xpPricingClient.updateXpGeoQueryEntity(xpOrder.getId().toString()); |
| | | bootCommonService.setCache_orderStatus(xpOrder.getId(), xpOrder, null); |
| | | |
| | | //生成前往上车点的导航数据 |
| | | //查询车辆位置 |
| | | VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(xpVehicle.getVehicleVin())), VehiclePosition.class); |
| | | if (Objects.isNull(vehiclePosition)) { |
| | | throw new RuntimeException("车辆位置信息不存在"); |
| | | } |
| | | |
| | | LonLatDto destination = new LonLatDto(); |
| | | LonLatDto origin = new LonLatDto(); |
| | | //查询司机当前位置到起点的线路 |
| | | origin.setLongitude(vehiclePosition.getPoint().getX()); |
| | | origin.setLatitude(vehiclePosition.getPoint().getY()); |
| | | destination.setLongitude(xpOrder.getStartLon()); |
| | | destination.setLatitude(xpOrder.getStartLat()); |
| | | |
| | | OrderRouteAndFareDto dto2 = new OrderRouteAndFareDto(); |
| | | dto2.setOrderId(xpOrder.getId()); |
| | | dto2.setOrigin(origin); |
| | | dto2.setDestination(destination); |
| | | dto2.setRouteType(1); |
| | | dto2.setVehicleId(xpVehicle.getId()); |
| | | R<RouteVo> routeVoR = xpMapClient.getOrderDistanceAndDuration(dto2); |
| | | if (200 != routeVoR.getCode()) { |
| | | throw new RuntimeException("获取订单线路和运费失败"); |
| | | } |
| | | RouteVo routeVo = routeVoR.getData(); |
| | | //缓存数据,用于后续推给乘客导航线路 |
| | | redisService.setCacheObject("ORDER_NAVIGATION_START_DATA:" + xpOrder.getAppUserId(), JSON.toJSONString(routeVo), 24L, TimeUnit.HOURS); |
| | | |
| | | //推送乘客车辆到达预约点的导航数据 |
| | | sendRoute(xpOrder.getAppUserId() + "", xpOrder.getId(), "ORDER_NAVIGATION_START_DATA", xpVehicle.getVehicleVin()); |
| | | break; |
| | | case 3: |
| | | if (xpOrder.getStatus() != 2) { |
| | | return R.fail("订单状态不允许改为接驾中"); |
| | | } |
| | | if (null == vo.getTripBegin()) { |
| | | return R.fail("行程开始时间不能为空"); |
| | | } |
| | | xpOrder.setTripBegin(vo.getTripBegin()); |
| | | redisService.setCacheObject("ORDER_STATUS:" + xpOrder.getId(), OrderStatusEnum.PICK_UP.getCode(), 24L, TimeUnit.HOURS); |
| | | break; |
| | | case 4: |
| | | if (xpOrder.getStatus() != 3) { |
| | | return R.fail("订单状态不允许改为到达上车点"); |
| | | } |
| | | if (null == vo.getArrivalTime()) { |
| | | return R.fail("车辆到达上车点时间不能为空"); |
| | | } |
| | | |
| | | // 查询起点点位 |
| | | Long startPointId = xpOrder.getStartPointId(); |
| | | XpPoint xpPoint = xpPointClient.queryById(startPointId).getData(); |
| | | // 添加取消订单定时任务job 时间为点位限停时长 |
| | | Map<String, ? extends Object> cancelJobMaps = |
| | | new ImmutableMap.Builder<String, Long>(). |
| | | put("id", xpOrder.getId()) |
| | | .build(); |
| | | QuartzManager.addJob( |
| | | OrderCancelJob.class, |
| | | (OrderCancelJob.name + xpOrder.getId()).toUpperCase(), |
| | | TimeJobType.ORDER_CANCEL, |
| | | DateUtils.localDateTimeToDate(LocalDateTime.now().plusMinutes(xpPoint.getParkingTimeLimit())), |
| | | cancelJobMaps |
| | | ); |
| | | |
| | | xpOrder.setArrivalTime(vo.getArrivalTime()); |
| | | redisService.setCacheObject("ORDER_STATUS:" + xpOrder.getId(), OrderStatusEnum.PICK_UP_GUESTS.getCode(), 24L, TimeUnit.HOURS); |
| | | break; |
| | | case 5: |
| | | if (xpOrder.getStatus() != 4) { |
| | | return R.fail("订单状态不允许改为乘客已上车"); |
| | | } |
| | | if (null == vo.getBoardingLon()) { |
| | | return R.fail("上车点经度不能为空"); |
| | | } |
| | | if (null == vo.getBoardingLat()) { |
| | | return R.fail("上车点纬度不能为空"); |
| | | } |
| | | if (StringUtils.isEmpty(vo.getBoardingAddress())) { |
| | | return R.fail("上车点地址不能为空"); |
| | | } |
| | | if (null == vo.getBoardingTime()) { |
| | | return R.fail("上车时间不能为空"); |
| | | } |
| | | xpOrder.setBoardingLon(vo.getBoardingLon()); |
| | | xpOrder.setBoardingLat(vo.getBoardingLat()); |
| | | xpOrder.setBoardingAddress(vo.getBoardingAddress()); |
| | | xpOrder.setBoardingTime(vo.getBoardingTime()); |
| | | xpOrder.setRideTime(vo.getBoardingTime()); |
| | | redisService.setCacheObject("ORDER_STATUS:" + xpOrder.getId(), OrderStatusEnum.PASSENGER_BOARDED.getCode(), 24L, TimeUnit.HOURS); |
| | | |
| | | XpVehicle xpVehicle1 = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData(); |
| | | |
| | | //推送行起点到终点的驶轨迹给乘客端 |
| | | sendRoute(xpOrder.getAppUserId() + "", xpOrder.getId(), "ORDER_NAVIGATION_END_DATA", xpVehicle1.getVehicleVin()); |
| | | // 删除定时任务job |
| | | QuartzManager.removeJob((OrderCancelJob.name + xpOrder.getId()).toUpperCase(), TimeJobType.ORDER_CANCEL); |
| | | //乘客已上车,重新倒计时不开始行程取消订单 |
| | | XpPoint xpPoint1 = xpPointClient.queryById(xpOrder.getStartPointId()).getData(); |
| | | XpTradingStrategy tradingStrategy = tradingStrategyClient.getTradingStrategyByCityCode(xpPoint1.getCityCode()).getData(); |
| | | if (null != tradingStrategy) { |
| | | Map<String, ? extends Object> cancelJobMaps1 = |
| | | new ImmutableMap.Builder<String, Long>(). |
| | | put("id", xpOrder.getId()) |
| | | .build(); |
| | | QuartzManager.addJob( |
| | | OrderCancelJob.class, |
| | | (OrderCancelJob.name + xpOrder.getId()).toUpperCase(), |
| | | TimeJobType.ORDER_CANCEL, |
| | | DateUtils.localDateTimeToDate(LocalDateTime.now().plusMinutes(tradingStrategy.getBdNotBoardedTime())), |
| | | cancelJobMaps1 |
| | | ); |
| | | } |
| | | break; |
| | | case 6: |
| | | if (xpOrder.getStatus() != 5) { |
| | | return R.fail("订单状态不允许改为服务中"); |
| | | } |
| | | // 删除定时任务job |
| | | QuartzManager.removeJob((OrderCancelJob.name + xpOrder.getId()).toUpperCase(), TimeJobType.ORDER_CANCEL); |
| | | xpOrder.setTripBegin(vo.getTripBegin()); |
| | | redisService.setCacheObject("ORDER_STATUS:" + xpOrder.getId(), OrderStatusEnum.IN_SERVICE.getCode(), 24L, TimeUnit.HOURS); |
| | | String cacheObject = redisService.getCacheObject("ORDER_NAVIGATION_END_DATA:" + xpOrder.getAppUserId()); |
| | | if (StringUtils.isNotBlank(cacheObject)) { |
| | | RouteVo routeVo1 = JSONObject.parseObject(cacheObject, RouteVo.class); |
| | | xpOrder.setEstimatedArrivalTime(LocalDateTime.now().plusSeconds(routeVo1.getDuration())); |
| | | } |
| | | redisService.deleteObject("ORDER_NAVIGATION_START_DATA:" + xpOrder.getAppUserId()); |
| | | break; |
| | | case 7: |
| | | if (xpOrder.getStatus() != 6) { |
| | | return R.fail("订单状态不允许改为待乘客下车"); |
| | | } |
| | | if (null == vo.getTripEnd()) { |
| | | return R.fail("行程结束时间不能为空"); |
| | | } |
| | | if (null == vo.getGetoffLon()) { |
| | | return R.fail("下车点经度不能为空"); |
| | | } |
| | | if (null == vo.getGetoffLat()) { |
| | | return R.fail("下车点纬度不能为空"); |
| | | } |
| | | if (StringUtils.isEmpty(vo.getGetoffAddress())) { |
| | | return R.fail("下车点地址不能为空"); |
| | | } |
| | | if (null == vo.getGetoffTime()) { |
| | | return R.fail("下车时间不能为空"); |
| | | } |
| | | xpOrder.setGetoffTime(vo.getGetoffTime()); |
| | | xpOrder.setGetoffLon(vo.getGetoffLon()); |
| | | xpOrder.setGetoffLat(vo.getGetoffLat()); |
| | | xpOrder.setGetoffAddress(vo.getGetoffAddress()); |
| | | xpOrder.setTripEnd(vo.getTripEnd()); |
| | | //计算行驶总距离和时长 |
| | | 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<>(); |
| | | content.put("orderId", xpOrder.getId().toString()); |
| | | content.put("isOpen", 1); |
| | | params.put("type", PushMessageTypeEnum.OPEN_TRUNK.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(String.valueOf(xpOrder.getAppUserId())); |
| | | R<String> stringR = xpPushMessageClient.sendStatus(sendMessageDTO); |
| | | //推送失败,重试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(sendMessageDTO); |
| | | if (stringR1.getCode() == Constants.SUCCESS) { |
| | | break; |
| | | } |
| | | try { |
| | | Thread.sleep(1000); |
| | | } catch (InterruptedException e) { |
| | | throw new RuntimeException(e); |
| | | } |
| | | log.info("推送倒计时消息失败:{} {} {}", stringR1.getMsg(), JSON.toJSONString(sendMessageDTO), xpOrder.getOrderNumber()); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | Integer arriveTime = xpSystemSettingClient.getOrderFinishTime().getData(); |
| | | // 添加自动结束行程定时任务job |
| | | Map<String, ? extends Object> endTripJobMaps = |
| | | new ImmutableMap.Builder<String, String>() |
| | | .put("id", xpOrder.getId().toString()) |
| | | .put("appid", appid) |
| | | .put("orderType", OrderType.USER_ORDER) |
| | | .build(); |
| | | QuartzManager.addJob( |
| | | EndTripJob.class, |
| | | (EndTripJob.name + xpOrder.getId()).toUpperCase(), |
| | | TimeJobType.END_TRIP, |
| | | DateUtils.localDateTimeToDate(LocalDateTime.now().plusMinutes(arriveTime)), |
| | | endTripJobMaps |
| | | ); |
| | | |
| | | |
| | | // 添加车辆到达终点后限停时间到后驶离的定时任务 |
| | | //时间到后将车辆状态回滚到空闲、添加巡游订单,解绑用户和车辆关系,车辆驶离点位 |
| | | XpPoint point = xpPointClient.queryById(xpOrder.getEndPointId()).getData(); |
| | | Map<String, ? extends Object> jobMaps = |
| | | new ImmutableMap.Builder<String, String>() |
| | | .put("id", xpOrder.getId().toString()) |
| | | .put("appid", appid) |
| | | .put("orderType", OrderType.USER_ORDER) |
| | | .build(); |
| | | |
| | | //判断是否有连环单 |
| | | String json = redisService.getCacheObject(CacheConstants.nextOrder(xpOrder.getId().toString())); |
| | | if (StringUtils.isNotEmpty(json)) { |
| | | JSONObject jsonObject = JSON.parseObject(json); |
| | | Long id = jsonObject.getLong("orderId"); |
| | | jobMaps = new ImmutableMap.Builder<String, String>() |
| | | .put("id", id.toString()) |
| | | .put("oldOrderId", xpOrder.getId().toString()) |
| | | .put("appid", appid) |
| | | .put("orderType", OrderType.USER_ORDER) |
| | | .build(); |
| | | |
| | | QuartzManager.addJob( |
| | | PushChainReactionOrderJob.class, |
| | | (PushChainReactionOrderJob.name + id).toUpperCase(), |
| | | TimeJobType.ADD_CHAIN_REACTION_ORDER_MISSION, |
| | | DateUtils.localDateTimeToDate(LocalDateTime.now().plusMinutes(point.getParkingTimeLimit())), |
| | | jobMaps |
| | | ); |
| | | } else { |
| | | QuartzManager.addJob( |
| | | AddCruiseMissionJob.class, |
| | | (AddCruiseMissionJob.name + xpOrder.getId()).toUpperCase(), |
| | | TimeJobType.ADD_CRUISE_MISSION, |
| | | DateUtils.localDateTimeToDate(LocalDateTime.now().plusMinutes(point.getParkingTimeLimit())), |
| | | jobMaps |
| | | ); |
| | | } |
| | | redisService.setCacheObject("ORDER_STATUS:" + xpOrder.getId(), OrderStatusEnum.SEE_OFF_GUESTS.getCode(), 24L, TimeUnit.HOURS); |
| | | break; |
| | | default: |
| | | return R.fail("无效的订单状态"); |
| | | } |
| | | xpOrder.setStatus(vo.getOrderStatus()); |
| | | this.updateById(xpOrder); |
| | | //推送订单状态给乘客端 |
| | | Map<String, Object> params = new HashMap<>(); |
| | | Map<String, Object> content = new HashMap<>(); |
| | | content.put("orderId", xpOrder.toString()); |
| | | content.put("status", vo.getOrderStatus()); |
| | | 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(xpOrder.getAppUserId() + ""); |
| | | 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(dto1), xpOrder.getOrderNumber()); |
| | | } |
| | | }); |
| | | } |
| | | |
| | | |
| | | return R.ok(); |
| | | } |
| | | } |