| | |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.google.common.collect.ImmutableMap; |
| | | import com.xiaopeng.api.dto.account.GetUserCouponDto; |
| | | import com.xiaopeng.api.dto.automaticPilot.PushOrderDto; |
| | | import com.xiaopeng.api.dto.operation.LonLatDto; |
| | | import com.xiaopeng.api.dto.order.GetOrderNumDto; |
| | | import com.xiaopeng.api.dto.order.HistoryEndPointsDto; |
| | |
| | | import com.xiaopeng.api.dto.vehicleConvoy.BaseVehicleUserDto; |
| | | import com.xiaopeng.api.feignClient.account.XpAppUserClient; |
| | | import com.xiaopeng.api.feignClient.account.XpAppUserCouponClient; |
| | | import com.xiaopeng.api.feignClient.automaticPilot.OrderMissionClient; |
| | | import com.xiaopeng.api.feignClient.operation.XpPointClient; |
| | | import com.xiaopeng.api.feignClient.operation.XpPricingClient; |
| | | import com.xiaopeng.api.feignClient.operation.XpSystemSettingClient; |
| | |
| | | import com.xiaopeng.api.model.operation.XpGeoQueryEntity; |
| | | import com.xiaopeng.api.model.operation.XpFeedbackType; |
| | | import com.xiaopeng.api.model.operation.XpPoint; |
| | | import com.xiaopeng.api.model.order.XpOrder; |
| | | import com.xiaopeng.api.model.order.XpOrderCancel; |
| | | import com.xiaopeng.api.model.order.XpOrderEvaluate; |
| | | import com.xiaopeng.api.model.order.XpOrderReassign; |
| | | import com.xiaopeng.api.model.operation.XpPricing; |
| | | import com.xiaopeng.api.model.order.*; |
| | | import com.xiaopeng.api.model.vehicleConvoy.XpFleet; |
| | | import com.xiaopeng.api.model.vehicleConvoy.XpVehicle; |
| | | import com.xiaopeng.api.vo.account.UserCouponVo; |
| | | import com.xiaopeng.api.vo.automaticPilot.proto.down.cloudOrderOperation.OrderOperationType; |
| | | import com.xiaopeng.api.vo.order.*; |
| | | import com.xiaopeng.api.vo.vehicleConvoy.AddTaxiPassengerVo; |
| | | import com.xiaopeng.api.vo.vehicleConvoy.CancelTaxiPassengerVo; |
| | | import com.xiaopeng.common.core.constant.CacheConstants; |
| | | import com.xiaopeng.common.core.domain.R; |
| | |
| | | import com.xiaopeng.order.job.jobs.OrderCancelJob; |
| | | import com.xiaopeng.order.mangodb.model.OrderTrajectory; |
| | | import com.xiaopeng.order.mangodb.service.OrderTrajectoryService; |
| | | import com.xiaopeng.order.mapper.XpOrderDetailMapper; |
| | | import com.xiaopeng.order.mapper.XpOrderMapper; |
| | | import com.xiaopeng.order.model.dto.XpOrderCommentDto; |
| | | import com.xiaopeng.order.model.dto.XpOrderPayDto; |
| | |
| | | private final XpSystemSettingClient xpSystemSettingClient; |
| | | private final OrderTrajectoryService orderTrajectoryService; |
| | | private final XpPushMessageClient xpPushMessageClient; |
| | | private final OrderMissionClient orderMissionClient; |
| | | private final XpOrderDetailMapper xpOrderDetailMapper; |
| | | private final OrderMissionClient orderMissionClient; |
| | | |
| | | @Autowired |
| | | private MongoTemplate mongoTemplate; |
| | |
| | | // TODO 加配置文件取 |
| | | cancelTaxiPassengerVo.setAppId(""); |
| | | |
| | | |
| | | BaseVehicleUserDto baseVehicleUserDto = userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo); |
| | | if (baseVehicleUserDto.getCode() != 200) { |
| | | throw new RuntimeException("取消订单失败"); |
| | |
| | | Integer i = Integer.valueOf(cacheObject.toString()); |
| | | redisService.setCacheCancelOrder("CANCEL_ORDER_" + uid, i + 1); |
| | | } |
| | | |
| | | // 下发命令 |
| | | PushOrderDto pushOrderDto = new PushOrderDto(); |
| | | pushOrderDto.setOrderId(order.getId()); |
| | | pushOrderDto.setVin(xpVehicle.getVehicleVin()); |
| | | pushOrderDto.setOperation_type(OrderOperationType.VEHICLE_CANCEL_ORDER); |
| | | orderMissionClient.cancelOrder(pushOrderDto); |
| | | } |
| | | |
| | | @Override |
| | |
| | | xpOrderCancelService.save(xpOrderCancel); |
| | | |
| | | |
| | | // 推送消息 |
| | | R<XpVehicle> xpVehicleR = xpVehicleClient.queryById(order.getVehicleId()); |
| | | XpVehicle xpVehicle = xpVehicleR.getData(); |
| | | |
| | | |
| | | // 消息推送 |
| | | Map<String, Object> params = new HashMap<>(); |
| | | Map<String, Object> content = new HashMap<>(); |
| | |
| | | sendMessageDTO.setAppUserId(String.valueOf(order.getAppUserId())); |
| | | xpPushMessageClient.sendStatus(sendMessageDTO); |
| | | log.info("订单取消消息推送完毕"); |
| | | |
| | | // 下发命令 |
| | | PushOrderDto pushOrderDto = new PushOrderDto(); |
| | | pushOrderDto.setOrderId(order.getId()); |
| | | pushOrderDto.setVin(xpVehicle.getVehicleVin()); |
| | | pushOrderDto.setOperation_type(OrderOperationType.CLOUD_CANCEL_ORDER); |
| | | orderMissionClient.cancelOrder(pushOrderDto); |
| | | } |
| | | |
| | | /** |
| | |
| | | evaluate.setFeedbackContent(dto.getFeedbackContent()); |
| | | evaluate.setFeedbackPictures(dto.getFeedbackPictures()); |
| | | evaluate.setFeedbackTypeId(dto.getFeedbackTypeId()); |
| | | evaluate.setCreateTime(LocalDateTime.now()); |
| | | xpOrderEvaluateService.save(evaluate); |
| | | |
| | | } |
| | |
| | | |
| | | @Override |
| | | public void endTrip(Long orderId, String uid) { |
| | | List<XpOrderDetail> xpOrderDetails = new ArrayList<>(); |
| | | // 起步价格明细 |
| | | List<FareBreakdownDetailVo> start = new ArrayList<>(); |
| | | // 里程费价格明细 |
| | |
| | | |
| | | userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo); |
| | | } |
| | | // 根据订单所属开通城市id 查询定价 |
| | | R<XpPricing> pricingByCityId = xpPricingClient.getPricingByCityId(order.getCityId()); |
| | | XpPricing pricing = pricingByCityId.getData(); |
| | | if (pricing == null) { |
| | | throw new ServiceException("当前城市未配置定价规则", I18nKeyConstant.ORDER_PRICING_NOT_EXISTS); |
| | | } |
| | | // 费用 |
| | | // 查询订单轨迹 |
| | | List<OrderTrajectory> trajectories = mongoTemplate.find( |
| | |
| | | ); |
| | | List<TaxiPricingDemoService.GpsPoint> gpsPoints = new ArrayList<>(); |
| | | for (OrderTrajectory trajectory : trajectories) { |
| | | TaxiPricingDemoService.GpsPoint point = new TaxiPricingDemoService.GpsPoint(trajectory.getDistance(),trajectory.getLocatetime() ); |
| | | TaxiPricingDemoService.GpsPoint point = new TaxiPricingDemoService.GpsPoint(trajectory.getDistance(), trajectory.getLocatetime()); |
| | | gpsPoints.add(point); |
| | | } |
| | | TaxiPricingDemoService.PricingConfig config = new TaxiPricingDemoService.PricingConfig(); |
| | | config.peak = new TaxiPricingDemoService.PricingRule("高峰期", "14:40", "14:46", 15.0, 3.0, 5.0, 3.0, 0.8); |
| | | config.night = new TaxiPricingDemoService.PricingRule("夜间行驶", "14:47", "14:48", 18.0, 3.0, 5.0, 3.5, 1.0); |
| | | config.holiday = new TaxiPricingDemoService.PricingRule("节假日", "18:47", "18:48", 18.0, 3.0, 5.0, 4, 2.0); |
| | | config.normals.add(new TaxiPricingDemoService.PricingRule("普通时段", "14:46", "14:47", 10.0, 3.0, 5.0, 2.4, 0.5)); |
| | | config.normals.add(new TaxiPricingDemoService.PricingRule("普通时段", "14:48", "17:59", 10.0, 3.0, 5.0, 2.4, 0.5)); |
| | | JSONArray startingFareJsonArray = JSONArray.parseArray(pricing.getStartingFareJson()); |
| | | JSONObject basicPricingJson = JSONObject.parseObject(pricing.getBasicPricingJson()); |
| | | |
| | | config.peaks.add(new TaxiPricingDemoService.PricingRule("高峰期", basicPricingJson.getString("num21").split("-")[0], basicPricingJson.getString("num21").split("-")[1], Double.parseDouble(basicPricingJson.getString("num24")), Double.parseDouble(basicPricingJson.getString("num25")), Double.parseDouble(basicPricingJson.getString("num26")), Double.parseDouble(basicPricingJson.getString("num27")), Double.parseDouble(basicPricingJson.getString("num28")))); |
| | | config.peaks.add(new TaxiPricingDemoService.PricingRule("高峰期", basicPricingJson.getString("num22").split("-")[0], basicPricingJson.getString("num22").split("-")[1], Double.parseDouble(basicPricingJson.getString("num24")), Double.parseDouble(basicPricingJson.getString("num25")), Double.parseDouble(basicPricingJson.getString("num26")), Double.parseDouble(basicPricingJson.getString("num27")), Double.parseDouble(basicPricingJson.getString("num28")))); |
| | | config.night = new TaxiPricingDemoService.PricingRule("夜间行驶", basicPricingJson.getString("num14").split("-")[0], basicPricingJson.getString("num14").split("-")[1], Double.parseDouble(basicPricingJson.getString("num16")), Double.parseDouble(basicPricingJson.getString("num17")), Double.parseDouble(basicPricingJson.getString("num18")), Double.parseDouble(basicPricingJson.getString("num19")), Double.parseDouble(basicPricingJson.getString("num20"))); |
| | | config.holiday = new TaxiPricingDemoService.PricingRule("节假日", "00:00", "23:59", Double.parseDouble(basicPricingJson.getString("num30")), Double.parseDouble(basicPricingJson.getString("num31")), Double.parseDouble(basicPricingJson.getString("num32")), Double.parseDouble(basicPricingJson.getString("num33")), Double.parseDouble(basicPricingJson.getString("num234"))); |
| | | for (Object o : startingFareJsonArray) { |
| | | // 转化为jsonObject |
| | | JSONObject jsonObject = (JSONObject) o; |
| | | String num1 = jsonObject.getString("num1"); |
| | | String num2 = jsonObject.getString("num2"); |
| | | String num3 = jsonObject.getString("num3"); |
| | | String num4 = jsonObject.getString("num4"); |
| | | String num5 = jsonObject.getString("num5"); |
| | | String num6 = jsonObject.getString("num6"); |
| | | String num7 = jsonObject.getString("num7"); |
| | | config.normals.add(new TaxiPricingDemoService.PricingRule("普通时段", num1, num2, Double.parseDouble(num3), Double.parseDouble(num4), Double.parseDouble(num5), Double.parseDouble(num6), Double.parseDouble(num7))); |
| | | } |
| | | // --- 远途加价区间配置 (关键修改) --- |
| | | // 1. 超过 num1(12) 不足 num2(20), 加收 num3(1.2) |
| | | config.longSteps.add(new TaxiPricingDemoService.LongRangeStep(5.0, 6.0, 1.2)); |
| | | config.longSteps.add(new TaxiPricingDemoService.LongRangeStep(Double.parseDouble(basicPricingJson.getString("num6")), Double.parseDouble(basicPricingJson.getString("num7")), Double.parseDouble(basicPricingJson.getString("num8")))); |
| | | // 2. 超过 num4(20) 不足 num5(35), 加收 num6(2.0) |
| | | config.longSteps.add(new TaxiPricingDemoService.LongRangeStep(6.0, 7.0, 2.0)); |
| | | config.longSteps.add(new TaxiPricingDemoService.LongRangeStep(Double.parseDouble(basicPricingJson.getString("num9")), Double.parseDouble(basicPricingJson.getString("num10")), Double.parseDouble(basicPricingJson.getString("num11")))); |
| | | // 3. 超过 num7(35) 以后, 加收 num8(3.5) -> numEnd 传个极大值 |
| | | config.longSteps.add(new TaxiPricingDemoService.LongRangeStep(7.0, 8.0, 3.5)); |
| | | config.longSteps.add(new TaxiPricingDemoService.LongRangeStep(Double.parseDouble(basicPricingJson.getString("num12")), 999999, Double.parseDouble(basicPricingJson.getString("num13")))); |
| | | |
| | | TaxiPricingDemoService.TaxiPricingService service = new TaxiPricingDemoService.TaxiPricingService(); |
| | | Map<String, BigDecimal> bill = service.calculateOrderPrice(DateUtils.toDate(order.getCreateTime()), order.getMileageKilometers(), gpsPoints, config); |
| | |
| | | BigDecimal totalAmount = bill.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | System.err.println("--------------------------"); |
| | | System.err.println("应付总额: " + totalAmount + " 元"); |
| | | // 封装费用明细数据 |
| | | for (Map.Entry<String, BigDecimal> stringBigDecimalEntry : bill.entrySet()) { |
| | | // 封装起步价 |
| | | FareBreakdownDetailVo startDetail = new FareBreakdownDetailVo(); |
| | | String key = stringBigDecimalEntry.getKey(); |
| | | if (key.contains("起步价")) { |
| | | startDetail.setTime(key.split("\\|")[1]); |
| | | startDetail.setMoney(stringBigDecimalEntry.getValue()); |
| | | if (key.contains("普通时段")) { |
| | | startDetail.setType(1); |
| | | } else if (key.contains("夜间")) { |
| | | startDetail.setType(2); |
| | | } else if (key.contains("高峰")) { |
| | | startDetail.setType(3); |
| | | } else if (key.contains("节假")) { |
| | | startDetail.setType(4); |
| | | } |
| | | startDetail.setDuration(Long.parseLong(key.split("=")[1])); |
| | | startDetail.setMileage(new BigDecimal(key.split("&")[1])); |
| | | start.add(startDetail); |
| | | } |
| | | // 封装里程费 |
| | | if (!key.contains("起步")&&!key.contains("时长")&&!key.contains("远途")&&!key.contains("distance")) { |
| | | FareBreakdownDetailVo mileageDetail = new FareBreakdownDetailVo(); |
| | | if (key.contains("普通时段")){ |
| | | mileageDetail.setType(1); |
| | | String key1 = "distance普通时段"+key.split("\\|")[1]; |
| | | String key2 = "普通时段"+key.split("\\|")[1]; |
| | | BigDecimal distance = bill.get(key1); |
| | | BigDecimal money = bill.get(key2); |
| | | mileageDetail.setMileage(distance); |
| | | mileageDetail.setMoney(money); |
| | | }else if (key.contains("夜间行驶")){ |
| | | mileageDetail.setType(2); |
| | | String key1 = "distance夜间行驶"+key.split("\\|")[1]; |
| | | String key2 = "夜间行驶"+key.split("\\|")[1]; |
| | | BigDecimal distance = bill.get(key1); |
| | | BigDecimal money = bill.get(key2); |
| | | mileageDetail.setMileage(distance); |
| | | mileageDetail.setMoney(money); |
| | | } |
| | | else if (key.contains("高峰期")){ |
| | | mileageDetail.setType(3); |
| | | String key1 = "distance高峰期"+key.split("\\|")[1]; |
| | | String key2 = "高峰期"+key.split("\\|")[1]; |
| | | BigDecimal distance = bill.get(key1); |
| | | BigDecimal money = bill.get(key2); |
| | | mileageDetail.setMileage(distance); |
| | | mileageDetail.setMoney(money); |
| | | } |
| | | else if (key.contains("节假")){ |
| | | mileageDetail.setType(4); |
| | | String key1 = "distance节假日"+key.split("\\|")[1]; |
| | | String key2 = "节假日"+key.split("\\|")[1]; |
| | | BigDecimal distance = bill.get(key1); |
| | | BigDecimal money = bill.get(key2); |
| | | mileageDetail.setMileage(distance); |
| | | mileageDetail.setMoney(money); |
| | | } |
| | | mileage.add(mileageDetail); |
| | | |
| | | // // 计算实际价格 |
| | | // // 根据订单所属开通城市id 查询定价 |
| | | // R<XpPricing> pricingByCityId = xpPricingClient.getPricingByCityId(order.getCityId()); |
| | | // XpPricing pricing = pricingByCityId.getData(); |
| | | // if (pricing == null) { |
| | | // throw new ServiceException("当前城市未配置定价规则", I18nKeyConstant.ORDER_PRICING_NOT_EXISTS); |
| | | // } |
| | | // // 查询订单轨迹 |
| | | // List<OrderTrajectory> trajectories = mongoTemplate.find( |
| | | // new Query(Criteria.where("orderId").is(orderId)) |
| | | // .with(Sort.by(Sort.Direction.ASC, "locatetime")), |
| | | // OrderTrajectory.class |
| | | // ); |
| | | // // 计算等待时间 |
| | | // LocalDateTime boardingTime = order.getBoardingTime();// 上车时间 |
| | | // LocalDateTime arrivalTime = order.getArrivalTime();// 车辆到达上车点时间 |
| | | // // 行程开始时间 |
| | | // Integer waitTime = Math.abs((int) Duration.between(boardingTime, arrivalTime).getSeconds()); |
| | | // |
| | | // // 行程总时间 秒 |
| | | // LocalDateTime tripBegin = order.getTripBegin(); |
| | | // LocalDateTime tripEnd = order.getTripEnd(); |
| | | // long seconds = Duration.between(tripBegin, tripEnd).getSeconds(); |
| | | // // 默认费率1 |
| | | // double priceRate = 1; |
| | | // if (pricing.getIsDynamicPrice() == 1) { |
| | | // // 先判断是否已经调价过了 |
| | | // Object userDynamicPriceObj = redisService.getCacheObject("USER_DYNAMIC_PRICE_" + order.getCityId() + "_" + uid); |
| | | // if (userDynamicPriceObj != null) { |
| | | // // 是否调价过了 |
| | | // priceRate = Double.parseDouble(userDynamicPriceObj.toString()); |
| | | // } else { |
| | | // // 没有调过 |
| | | // //是否触发动态调价 redis获取 |
| | | // Object dynamicPriceObj = redisService.getCacheObject("DYNAMIC_PRICE_" + order.getCityId()); |
| | | // if (dynamicPriceObj != null) { |
| | | // JSONObject jsonObject = JSONObject.parseObject(pricing.getDynamicPricingJson()); |
| | | // // 触发动态调价 |
| | | // // value=时间 |
| | | // String timeStr = dynamicPriceObj.toString(); |
| | | // // 判断当前距离这个时间范围的新增订单数(排除取消) / 上浮数量 算出应该增加的价格率 |
| | | // Integer num = this.getOrderNum(new GetOrderNumDto(timeStr, order.getCityId())); |
| | | // // X单上升一次调价 |
| | | // Integer orderNum = getOrderNum(jsonObject, 4); |
| | | // // 需要调价的次数 |
| | | // int count = num / orderNum; |
| | | // if (count > 0) { |
| | | // // 计算每次上升的费率 |
| | | // Integer upRate = getOrderNum(jsonObject, 5); |
| | | // BigDecimal divide = new BigDecimal(upRate).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP); |
| | | // for (int i = count; i > 0; i--) { |
| | | // // 当前费率+(费率*上升百分比) |
| | | // priceRate = new BigDecimal(priceRate).multiply(divide).add(new BigDecimal(priceRate)).setScale(2, RoundingMode.HALF_UP).doubleValue(); |
| | | // } |
| | | // // 冷却时间 |
| | | // Integer time = getOrderNum(jsonObject, 6); |
| | | // // 触发调价了 |
| | | // redisService.setCacheObject("USER_DYNAMIC_PRICE_" + order.getCityId() + "_" + uid, priceRate, time.longValue(), TimeUnit.MINUTES); |
| | | // } |
| | | // |
| | | // } |
| | | // } |
| | | // } |
| | | // if (trajectories.isEmpty()) { |
| | | // return; |
| | | // } |
| | | // // 起步价规则 |
| | | // String startingFareJson = pricing.getStartingFareJson(); |
| | | // JSONArray startingFareJsonArray = JSONArray.parseArray(startingFareJson); |
| | | // // 基础信息规则 |
| | | // String basicPricing = pricing.getBasicPricingJson(); |
| | | // JSONObject basicPricingJson = JSONObject.parseObject(basicPricing); |
| | | // |
| | | // // 计算过后得到起步价 |
| | | // String num3 = ""; |
| | | // String num4 = ""; |
| | | // String num5 = ""; |
| | | // String num6 = ""; |
| | | // String num7 = ""; |
| | | // String startTime = ""; |
| | | // String endTime = ""; |
| | | // // 等待费设置 |
| | | // String num4Wait = basicPricingJson.getString("num4"); |
| | | // String num5Wait = basicPricingJson.getString("num5"); |
| | | // // 远途费设置 |
| | | // String numLong6 = basicPricingJson.getString("num6"); |
| | | // String numLong7 = basicPricingJson.getString("num7"); |
| | | // String numLong8 = basicPricingJson.getString("num8"); |
| | | // String numLong9 = basicPricingJson.getString("num9"); |
| | | // String numLong10 = basicPricingJson.getString("num10"); |
| | | // String numLong11 = basicPricingJson.getString("num11"); |
| | | // String numLong12 = basicPricingJson.getString("num12"); |
| | | // String numLong13 = basicPricingJson.getString("num13"); |
| | | // String numLong14 = basicPricingJson.getString("num14"); |
| | | // String numLong15 = basicPricingJson.getString("num15"); |
| | | // // 节假日基础价格规则 |
| | | // String num29 = basicPricingJson.getString("num29"); |
| | | // String num30 = basicPricingJson.getString("num30"); |
| | | // String num31 = basicPricingJson.getString("num31"); |
| | | // String num32 = basicPricingJson.getString("num32"); |
| | | // String num33 = basicPricingJson.getString("num33"); |
| | | // String num34 = basicPricingJson.getString("num34"); |
| | | // |
| | | // // 高峰期基础价格规则 |
| | | // String num21 = basicPricingJson.getString("num21"); |
| | | // String num22 = basicPricingJson.getString("num22"); |
| | | // String num23 = basicPricingJson.getString("num23"); |
| | | // String num24 = basicPricingJson.getString("num24"); |
| | | // String num25 = basicPricingJson.getString("num25"); |
| | | // String num26 = basicPricingJson.getString("num26"); |
| | | // String num27 = basicPricingJson.getString("num27"); |
| | | // String num28 = basicPricingJson.getString("num28"); |
| | | // // 夜间行驶基础价格规则 |
| | | // String num14 = basicPricingJson.getString("num14"); |
| | | // String num15 = basicPricingJson.getString("num15"); |
| | | // String num16 = basicPricingJson.getString("num16"); |
| | | // String num17 = basicPricingJson.getString("num17"); |
| | | // String num18 = basicPricingJson.getString("num18"); |
| | | // String num19 = basicPricingJson.getString("num19"); |
| | | // String num20 = basicPricingJson.getString("num20"); |
| | | // // 起步里程 |
| | | // Double startDistance = 0.00D; |
| | | // // 临时超出起步里程的额外里程 |
| | | // Double mileageDistance = 0.00D; |
| | | // // 起步价所属时段 type 1 普通时段 2 夜间行驶时段 3 高峰时段 4 节假日时段 |
| | | // Integer startType = 1; |
| | | // // 里程费所属时段 type 0默认临时 1 普通时段 2 夜间行驶时段 3 高峰时段 4 节假日时段 |
| | | // Integer mileageType = 0; |
| | | // // 里程费所属时段临时字段 用于区分时段是否变化 type 0默认临时 1 普通时段 2 夜间行驶时段 3 高峰时段 4 节假日时段 |
| | | // Integer mileageTypeTemp = 0; |
| | | // |
| | | // // 起步价时段开始时间 |
| | | // Date startDate = DateUtils.toDate(order.getTripBegin()); |
| | | // // 根据订单创建时间确定使用哪个起步价规则 |
| | | // Date createTime = DateUtils.toDate(order.getCreateTime()); |
| | | // // 起步价时段结束时间 |
| | | // Date endDate = new Date(); |
| | | // // 计算订单总行驶距离,单位米 |
| | | // Double totalDistance = 0.00D; |
| | | // // 起步价计算完成表示 |
| | | // boolean startFlag = true; |
| | | // SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm"); |
| | | // if (pricing.getPricingType() == 1) { |
| | | // |
| | | // // 计算起步价 |
| | | // for (Object o : startingFareJsonArray) { |
| | | // JSONObject startingFare = (JSONObject) o; |
| | | // Calendar calendarStart = Calendar.getInstance(); |
| | | // calendarStart.setTime(createTime); |
| | | // calendarStart.set(Calendar.HOUR_OF_DAY, Integer.valueOf(startingFare.getString("num1").split(":")[0])); |
| | | // calendarStart.set(Calendar.MINUTE, Integer.valueOf(startingFare.getString("num1").split(":")[1])); |
| | | // |
| | | // Calendar calendarEnd = Calendar.getInstance(); |
| | | // calendarEnd.setTime(createTime); |
| | | // calendarEnd.set(Calendar.HOUR_OF_DAY, Integer.valueOf(startingFare.getString("num2").split(":")[0])); |
| | | // calendarEnd.set(Calendar.MINUTE, Integer.valueOf(startingFare.getString("num2").split(":")[1])); |
| | | // // 找到符合条件的直接跳出循环 |
| | | // if (createTime.getTime() > calendarStart.getTimeInMillis() && createTime.getTime() < calendarEnd.getTimeInMillis()) { |
| | | // num3 = startingFare.getString("num3"); |
| | | // num4 = startingFare.getString("num4"); |
| | | // num5 = startingFare.getString("num5"); |
| | | // num6 = startingFare.getString("num6"); |
| | | // num7 = startingFare.getString("num7"); |
| | | // startTime = startingFare.getString("num1"); |
| | | // endTime = startingFare.getString("num2"); |
| | | // break; |
| | | // } |
| | | // } |
| | | // // 判断是否为夜间行驶 起步价修改 |
| | | // Calendar calendarStart = Calendar.getInstance(); |
| | | // calendarStart.setTime(createTime); |
| | | // calendarStart.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num14.split("-")[0].split(":")[0])); |
| | | // calendarStart.set(Calendar.MINUTE, Integer.valueOf(num14.split("-")[0].split(":")[1])); |
| | | // Calendar calendarEnd = Calendar.getInstance(); |
| | | // calendarEnd.setTime(createTime); |
| | | // calendarEnd.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num14.split("-")[1].split(":")[0])); |
| | | // calendarEnd.set(Calendar.MINUTE, Integer.valueOf(num14.split("-")[1].split(":")[1])); |
| | | // if (createTime.getTime() > calendarStart.getTimeInMillis() && createTime.getTime() < calendarEnd.getTimeInMillis() |
| | | // ) { |
| | | // num3 = num15; |
| | | // num6 = num16; |
| | | // num7 = num17; |
| | | // startType = 2; |
| | | // |
| | | // } |
| | | // // 判断是否为高峰期 |
| | | // Calendar calendar1Start = Calendar.getInstance(); |
| | | // calendar1Start.setTime(createTime); |
| | | // calendar1Start.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num21.split("-")[0].split(":")[0])); |
| | | // calendar1Start.set(Calendar.MINUTE, Integer.valueOf(num21.split("-")[0].split(":")[1])); |
| | | // |
| | | // Calendar calendar1End = Calendar.getInstance(); |
| | | // calendar1End.setTime(createTime); |
| | | // calendar1End.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num21.split("-")[1].split(":")[0])); |
| | | // calendar1End.set(Calendar.MINUTE, Integer.valueOf(num21.split("-")[1].split(":")[1])); |
| | | // |
| | | // Calendar calendar2Start = Calendar.getInstance(); |
| | | // calendar2Start.setTime(createTime); |
| | | // calendar2Start.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num22.split("-")[0].split("-")[0].split(":")[0])); |
| | | // calendar2Start.set(Calendar.MINUTE, Integer.valueOf(num22.split("-")[0].split("-")[0].split(":")[1])); |
| | | // |
| | | // Calendar calendar2End = Calendar.getInstance(); |
| | | // calendar2End.setTime(createTime); |
| | | // calendar2End.set(Calendar.HOUR_OF_DAY, Integer.valueOf(num22.split("-")[1].split(":")[0])); |
| | | // calendar2End.set(Calendar.MINUTE, Integer.valueOf(num22.split("-")[1].split(":")[1])); |
| | | // // 判断是否为高峰期 起步价,里程费,时长费修改 |
| | | // if ((createTime.getTime() > calendar1Start.getTimeInMillis() && createTime.getTime() < calendar1End.getTimeInMillis()) |
| | | // || (createTime.getTime() > calendar2Start.getTimeInMillis() && createTime.getTime() < calendar2End.getTimeInMillis())) { |
| | | // num3 = num23; |
| | | // num6 = num24; |
| | | // num7 = num25; |
| | | // startType = 3; |
| | | // } |
| | | // // 判断当前是否属于节假日 |
| | | // boolean holiday = holidayUtil.isHoliday(DateUtils.toLocalDate(createTime)); |
| | | // if (holiday) { |
| | | // // 判断是否为节假日 起步价修改 |
| | | // num3 = num29; |
| | | // num6 = num30; |
| | | // num7 = num31; |
| | | // startType = 4; |
| | | // } |
| | | // // 查询起步价结束时间段 |
| | | // for (OrderTrajectory trajectory : trajectories) { |
| | | // Long locatetime = trajectory.getLocatetime(); |
| | | // endDate = new Date(locatetime); |
| | | // LocalDateTime end = DateUtils.dateToLocalDateTime(endDate); |
| | | // if (end.isAfter(tripBegin)) { |
| | | // // 行程开始 开始计算里程数 |
| | | // if (startDistance >= Double.parseDouble(num4)) { |
| | | // // 行驶里程大于基础配置里程 那么起步价时段计算完成 |
| | | // break; |
| | | // } |
| | | // startDistance += trajectory.getDistance(); |
| | | // } |
| | | // } |
| | | // // 起步价价格明细封装 |
| | | // FareBreakdownDetailVo startDetail = new FareBreakdownDetailVo(); |
| | | // startDetail.setType(startType); |
| | | // startDetail.setTime(timeFormat.format(startDate) + "-" + timeFormat.format(endDate)); |
| | | // startDetail.setMileage(new BigDecimal(startDistance / 1000).setScale(2, RoundingMode.HALF_UP)); |
| | | // |
| | | // // 计算startDate和endDate相差多少分钟 |
| | | // // 将 Date 转换为 LocalDateTime |
| | | // LocalDateTime startDateTime = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); |
| | | // LocalDateTime endDateTime = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); |
| | | // |
| | | // // 计算时间差(单位:分钟) |
| | | // long minutesDifference = Duration.between(startDateTime, endDateTime).toMinutes(); |
| | | // startDetail.setDuration(minutesDifference); |
| | | // startDetail.setMoney(new BigDecimal(num3)); |
| | | // start.add(startDetail); |
| | | // |
| | | // |
| | | // // 计算起步价格、里程、时段、行驶时间 |
| | | //// calculateStartingFare(trajectories, tripBegin, startFlag, startDistance, startingFareJsonArray, num3, num4, num5, endDate, order, num14, num15, num16, num17, startType, num21, num22, num23, num24, num25, num29, num30, num31, timeFormat, startDate, start); |
| | | // |
| | | // for (OrderTrajectory trajectory : trajectories) { |
| | | //// FareBreakdownDetailVo mileageDetail = new FareBreakdownDetailVo(); |
| | | //// mileageDetail.setType(); |
| | | //// mileageDetail.setTime(); |
| | | //// mileageDetail.setMileage(); |
| | | //// mileageDetail.setDuration(); |
| | | //// mileageDetail.setMoney(); |
| | | // |
| | | // Long locatetime = trajectory.getLocatetime(); |
| | | // Date mileageDate = new Date(locatetime); |
| | | // LocalDateTime begin = DateUtils.dateToLocalDateTime(mileageDate); |
| | | // if (begin.isAfter(tripBegin)) { |
| | | // totalDistance += trajectory.getDistance(); |
| | | // if (totalDistance >= startDistance) { |
| | | // // 开始累加起步里程 |
| | | // mileageDistance += trajectory.getDistance(); |
| | | // // 判断当前里程费属于什么时段 |
| | | //// mileageTypeTemp |
| | | // MileageDto param = new MileageDto(); |
| | | // param.setMileage(num6); |
| | | // param.setTime(num7); |
| | | // param.setMileageTypeTemp(mileageTypeTemp); |
| | | // MileageDto mileageDto = mileageType(param,startingFareJsonArray, mileageDate, begin, num14, num16, num17, num21, num22, num24, num25, num30, num31); |
| | | // if (mileageType==0){ |
| | | // // 首次 |
| | | // mileageType = mileageDto.getMileageTypeTemp(); |
| | | // mileageTypeTemp= mileageDto.getMileageTypeTemp(); |
| | | // } else if (mileageType!=mileageTypeTemp){ |
| | | // // 新时段 |
| | | // FareBreakdownDetailVo fareBreakdownDetailVo = new FareBreakdownDetailVo(); |
| | | // fareBreakdownDetailVo.setType(mileageType); |
| | | // fareBreakdownDetailVo.setTime(timeFormat.format(endDate)+"-"+timeFormat.format(mileageDate)); |
| | | // double md = mileageDistance / 1000; |
| | | // fareBreakdownDetailVo.setMileage(new BigDecimal(md).setScale(2, RoundingMode.HALF_UP)); |
| | | // // 计算startDate和endDate相差多少分钟 |
| | | // // 将 Date 转换为 LocalDateTime |
| | | // LocalDateTime startMileageTime = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); |
| | | // LocalDateTime endMileageTime = mileageDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); |
| | | // |
| | | // // 计算时间差(单位:分钟) |
| | | // long minutesDifferenceMileage = Duration.between(startMileageTime, endMileageTime).toMinutes(); |
| | | // startDetail.setDuration(minutesDifference); |
| | | // fareBreakdownDetailVo.setDuration(minutesDifferenceMileage); |
| | | // // 如果md小数位是0 那么舍弃小数,如果小数位不为0 那么进1 |
| | | // fareBreakdownDetailVo.setMileage(new BigDecimal(md).setScale(2, RoundingMode.HALF_UP)); |
| | | // Integer temp = (int)md; |
| | | // if (md> temp){ |
| | | // temp=temp+1; |
| | | // } |
| | | // // 超出的里程 |
| | | // fareBreakdownDetailVo.setMoney(new BigDecimal(temp*6)); |
| | | // mileage.add(fareBreakdownDetailVo); |
| | | // // 修改时段标识 |
| | | // mileageType = mileageTypeTemp; |
| | | // // 修改新时段开始时间 |
| | | // endDate = mileageDate; |
| | | // }else{ |
| | | // // 时段未变化 |
| | | // } |
| | | // } |
| | | // } |
| | | // } |
| | | // // 开始计算里程费用 |
| | | // for (OrderTrajectory trajectory : trajectories) { |
| | | // Long locatetime = trajectory.getLocatetime(); |
| | | // Date mileageDate = new Date(locatetime); |
| | | // LocalDateTime begin = DateUtils.dateToLocalDateTime(mileageDate); |
| | | // // 行驶里程大于起步里程配置 开始计算里程和里程费 |
| | | // if (begin.isAfter(tripBegin)) { |
| | | // totalDistance += trajectory.getDistance(); |
| | | // double v = totalDistance / 1000.0; |
| | | // if (v >= Double.parseDouble(num5)) { |
| | | // // 增加超出起步里程的里程数 |
| | | // mileageDistance += trajectory.getDistance(); |
| | | // |
| | | // } |
| | | // if (mileageType == 0) { |
| | | // // 第一次计算里程费 |
| | | // |
| | | // } |
| | | // } |
| | | // } |
| | | // } else { |
| | | // |
| | | // } |
| | | // |
| | | //// XpPricingCardVo xpPricingCardVo = xpPricingUtil.calculationPrice( |
| | | //// order.getAppUserId().toString(),JSON.parseObject(pricing.getBasicPricingJson()), |
| | | //// JSON.parseArray(pricing.getStartingFareJson()), |
| | | //// pricing.getDynamicPricingJson(), |
| | | //// pricing.getIsDynamicPrice(), |
| | | //// totalDistance, |
| | | //// seconds, |
| | | //// order.getCityId() |
| | | //// ); |
| | | |
| | | } |
| | | // 封装时长费 |
| | | FareBreakdownDetailVo timeDetail = new FareBreakdownDetailVo(); |
| | | if (key.contains("时长费")) { |
| | | timeDetail.setType(startDetail.getType()); |
| | | timeDetail.setMoney(stringBigDecimalEntry.getValue()); |
| | | timeDetail.setDuration(Long.parseLong(key.split("&")[1])); |
| | | duration.add(timeDetail); |
| | | } |
| | | // 封装远途费 |
| | | FareBreakdownDetailVo longDetail = new FareBreakdownDetailVo(); |
| | | if (key.contains("远途费")) { |
| | | longDetail.setType(startDetail.getType()); |
| | | longDetail.setMoney(stringBigDecimalEntry.getValue()); |
| | | longDetail.setMileage(new BigDecimal(key.split("&")[1])); |
| | | longDistance.add(longDetail); |
| | | } |
| | | } |
| | | for (FareBreakdownDetailVo fareBreakdownDetailVo : start) { |
| | | XpOrderDetail xpOrderDetail = new XpOrderDetail(); |
| | | BeanUtils.copyProperties(fareBreakdownDetailVo, xpOrderDetail); |
| | | xpOrderDetail.setOrderId(orderId); |
| | | xpOrderDetail.setDetailType(1); |
| | | xpOrderDetail.setCreateTime(LocalDateTime.now()); |
| | | xpOrderDetails.add(xpOrderDetail); |
| | | } |
| | | BigDecimal mileageMoney = BigDecimal.ZERO; |
| | | for (FareBreakdownDetailVo fareBreakdownDetailVo : mileage) { |
| | | XpOrderDetail xpOrderDetail = new XpOrderDetail(); |
| | | BeanUtils.copyProperties(fareBreakdownDetailVo, xpOrderDetail); |
| | | xpOrderDetail.setOrderId(orderId); |
| | | xpOrderDetail.setDetailType(2); |
| | | xpOrderDetail.setCreateTime(LocalDateTime.now()); |
| | | mileageMoney = mileageMoney.add(fareBreakdownDetailVo.getMoney()); |
| | | xpOrderDetails.add(xpOrderDetail); |
| | | } |
| | | order.setMileageMoney(mileageMoney); |
| | | for (XpOrderDetail xpOrderDetail : xpOrderDetails) { |
| | | xpOrderDetailMapper.insert(xpOrderDetail); |
| | | } |
| | | for (FareBreakdownDetailVo fareBreakdownDetailVo : duration) { |
| | | order.setDurationType(fareBreakdownDetailVo.getType()); |
| | | order.setDurationMoney(fareBreakdownDetailVo.getMoney()); |
| | | order.setDuration(Double.parseDouble(fareBreakdownDetailVo.getDuration()+"")); |
| | | } |
| | | for (FareBreakdownDetailVo fareBreakdownDetailVo : longDistance) { |
| | | order.setLongDistanceType(fareBreakdownDetailVo.getType()); |
| | | order.setLongDistance(fareBreakdownDetailVo.getMileage().doubleValue()); |
| | | order.setLongDistancemoney(fareBreakdownDetailVo.getMoney()); |
| | | } |
| | | baseMapper.updateById(order); |
| | | |
| | | } |
| | | |
| | |
| | | orderDetailVo.setFeedbackPictures(evaluate.getFeedbackPictures()); |
| | | orderDetailVo.setFeedbackContent(evaluate.getFeedbackContent()); |
| | | orderDetailVo.setOrderRating(evaluate.getOrderRating()); |
| | | XpFeedbackType feedbackType = xpSystemSettingClient.getFeedbackTypeById(evaluate.getFeedbackTypeId()).getData(); |
| | | orderDetailVo.setFeedbackTypeName(feedbackType.getFeedbackType()); |
| | | if(evaluate.getFeedbackTypeId()!=null){ |
| | | XpFeedbackType feedbackType = xpSystemSettingClient.getFeedbackTypeById(evaluate.getFeedbackTypeId()).getData(); |
| | | orderDetailVo.setFeedbackTypeName(feedbackType.getFeedbackType()); |
| | | } |
| | | |
| | | } |
| | | List<OrderTrajectory> trajectories = mongoTemplate.find( |
| | | new Query(Criteria.where("orderId").is(orderId)) |
| | |
| | | @Transactional |
| | | // @ShardingTransactionType(TransactionType.BASE) |
| | | public void popOrder(PopOrderDto dto) { |
| | | |
| | | XpOrder order = this.getById(dto.getOrderId()); |
| | | order.setAcceptanceTime(LocalDateTime.now()); |
| | | |
| | | AddTaxiPassengerVo addTaxiPassengerVo = new AddTaxiPassengerVo(); |
| | | R<XpVehicle> byVehicleVin = xpVehicleClient.findByVehicleVin(dto.getXpVehicleVin()); |
| | | if (byVehicleVin.getCode()==200){ |
| | | if (byVehicleVin.getCode() == 200) { |
| | | order.setVehicleId(byVehicleVin.getData().getId()); |
| | | addTaxiPassengerVo.setVin(byVehicleVin.getData().getVehicleVin()); |
| | | } |
| | | order.setStatus(2); |
| | | |
| | | // Redis弹出这个队列元素 |
| | | // value 订单Id_经纬度_状态_用户id_订单编号_距离_时间 |
| | | String popFirstElement = redisService.popFirstElement(order.getQueueName()); |
| | | XpGeoQueryEntity xpGeoQueryEntity = new XpGeoQueryEntity(); |
| | | String[] split = popFirstElement.split("_"); |
| | | xpGeoQueryEntity.setOrderId(split[0]); |
| | | String[] split1 = split[1].split(","); |
| | | xpGeoQueryEntity.setLocation(new GeoJsonPoint(Double.parseDouble(split1[0]), Double.parseDouble(split1[1]))); |
| | | xpGeoQueryEntity.setTimestamp(new Date()); |
| | | // 计算2个时间的秒数 |
| | | LocalDateTime createTime = order.getCreateTime(); |
| | | LocalDateTime acceptanceTime = order.getAcceptanceTime(); |
| | | xpGeoQueryEntity.setSeconds((int) Duration.between(createTime, acceptanceTime).getSeconds()); |
| | | String currentTimeSlot = DateUtils.getCurrentTimeSlot(); |
| | | xpGeoQueryEntity.setTime(currentTimeSlot); |
| | | // 存mongo数据 |
| | | xpPricingClient.saveXpGeoQueryEntity(xpGeoQueryEntity); |
| | | this.updateById(order); |
| | | addTaxiPassengerVo.setUid(order.getAppUserId().toString()); |
| | | addTaxiPassengerVo.setOrderNo(order.getOrderNumber()); |
| | | // TODO appid |
| | | addTaxiPassengerVo.setAppId(""); |
| | | |
| | | BaseVehicleUserDto baseVehicleUserDto = userVehicleClient.addTaxiPassenger(addTaxiPassengerVo); |
| | | if(baseVehicleUserDto.getCode()==200){ |
| | | |
| | | // Redis弹出这个队列元素 |
| | | // value 订单Id_经纬度_状态_用户id_订单编号_距离_时间 |
| | | String popFirstElement = redisService.popFirstElement(order.getQueueName()); |
| | | XpGeoQueryEntity xpGeoQueryEntity = new XpGeoQueryEntity(); |
| | | String[] split = popFirstElement.split("_"); |
| | | xpGeoQueryEntity.setOrderId(split[0]); |
| | | // 存mongo数据 |
| | | xpPricingClient.updateXpGeoQueryEntity(split[0]); |
| | | this.updateById(order); |
| | | |
| | | } |
| | | } |
| | | |
| | | |