puzhibing
2026-02-13 40c97867e634b0c4949dfd964bf06da35fc4bd88
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -8,6 +8,7 @@
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;
@@ -20,6 +21,7 @@
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;
@@ -32,14 +34,14 @@
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;
@@ -61,6 +63,7 @@
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;
@@ -126,6 +129,9 @@
    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;
@@ -725,7 +731,6 @@
        // TODO 加配置文件取
        cancelTaxiPassengerVo.setAppId("");
        BaseVehicleUserDto baseVehicleUserDto = userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo);
        if (baseVehicleUserDto.getCode() != 200) {
            throw new RuntimeException("取消订单失败");
@@ -748,6 +753,13 @@
            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
@@ -768,7 +780,10 @@
        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<>();
@@ -783,6 +798,13 @@
        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);
    }
    /**
@@ -816,6 +838,7 @@
        evaluate.setFeedbackContent(dto.getFeedbackContent());
        evaluate.setFeedbackPictures(dto.getFeedbackPictures());
        evaluate.setFeedbackTypeId(dto.getFeedbackTypeId());
        evaluate.setCreateTime(LocalDateTime.now());
        xpOrderEvaluateService.save(evaluate);
    }
@@ -881,6 +904,7 @@
    @Override
    public void endTrip(Long orderId, String uid) {
        List<XpOrderDetail> xpOrderDetails = new ArrayList<>();
        // 起步价格明细
        List<FareBreakdownDetailVo> start = new ArrayList<>();
        // 里程费价格明细
@@ -921,6 +945,12 @@
            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(
@@ -930,23 +960,36 @@
        );
        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);
@@ -956,360 +999,118 @@
        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);
    }
@@ -1651,8 +1452,11 @@
            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))
@@ -1684,35 +1488,35 @@
    @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);
        }
    }