“mitao”
2026-02-13 bfb020da5cf8aa89c5eaae9e59e9ea8e04a49448
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -71,6 +71,7 @@
import com.xiaopeng.order.service.IXpOrderEvaluateService;
import com.xiaopeng.order.service.IXpOrderReassignService;
import com.xiaopeng.order.service.IXpOrderService;
import com.xiaopeng.order.utils.TaxiPricingDemoService;
import com.xiaopeng.order.utils.holiday.HolidayUtil;
import com.xiaopeng.order.vo.OrderDetailVo;
import io.swagger.annotations.ApiModelProperty;
@@ -771,11 +772,11 @@
        // 消息推送
        Map<String, Object> params = new HashMap<>();
        Map<String, Object> content = new HashMap<>();
        content.put("orderId",order.getId());
        content.put("orderId", order.getId());
        content.put("status", OrderStatusEnum.CANCELED.getCode());
        params.put("type", PushMessageTypeEnum.ORDER_STATUS.getDesc());
        params.put("content", com.alibaba.fastjson2.JSONObject.toJSONString(content));
        params.put("timestamp", new Date().getTime()+"");
        params.put("timestamp", new Date().getTime() + "");
        String message = JSONObject.toJSONString(params);
        SendMessageDTO sendMessageDTO = new SendMessageDTO();
        sendMessageDTO.setMessage(message);
@@ -920,7 +921,41 @@
            userVehicleClient.cancelTaxiPassenger(cancelTaxiPassengerVo);
        }
        // 计算起步价
        // 费用
        // 查询订单轨迹
        List<OrderTrajectory> trajectories = mongoTemplate.find(
                new Query(Criteria.where("orderId").is(orderId))
                        .with(Sort.by(Sort.Direction.ASC, "locatetime")),
                OrderTrajectory.class
        );
        List<TaxiPricingDemoService.GpsPoint> gpsPoints = new ArrayList<>();
        for (OrderTrajectory trajectory : trajectories) {
            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));
        // --- 远途加价区间配置 (关键修改) ---
        // 1. 超过 num1(12) 不足 num2(20), 加收 num3(1.2)
        config.longSteps.add(new TaxiPricingDemoService.LongRangeStep(5.0, 6.0, 1.2));
        // 2. 超过 num4(20) 不足 num5(35), 加收 num6(2.0)
        config.longSteps.add(new TaxiPricingDemoService.LongRangeStep(6.0, 7.0, 2.0));
        // 3. 超过 num7(35) 以后, 加收 num8(3.5) -> numEnd 传个极大值
        config.longSteps.add(new TaxiPricingDemoService.LongRangeStep(7.0, 8.0, 3.5));
        TaxiPricingDemoService.TaxiPricingService service = new TaxiPricingDemoService.TaxiPricingService();
        Map<String, BigDecimal> bill = service.calculateOrderPrice(DateUtils.toDate(order.getCreateTime()), order.getMileageKilometers(), gpsPoints, config);
        System.err.println("======= 订单计费账单 =======");
        bill.forEach((detail, price) -> System.err.println(detail + ": " + price + " 元"));
        BigDecimal totalAmount = bill.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add);
        System.err.println("--------------------------");
        System.err.println("应付总额: " + totalAmount + " 元");
//        // 计算实际价格
//        // 根据订单所属开通城市id 查询定价
@@ -1276,11 +1311,10 @@
////        );
    }
    private MileageDto  mileageType(MileageDto param,JSONArray startingFareJsonArray, Date mileageDate, LocalDateTime begin, String num14, String num16, String num17, String num21, String num22, String num24, String num25, String num30, String num31) {
    private MileageDto mileageType(MileageDto param, JSONArray startingFareJsonArray, Date mileageDate, LocalDateTime begin, String num14, String num16, String num17, String num21, String num22, String num24, String num25, String num30, String num31) {
        // 计算出是在哪个普通时间段内
        for (Object o : startingFareJsonArray) {
            JSONObject startingFare = (JSONObject) o;
@@ -1295,7 +1329,7 @@
            calendarEnd.set(Calendar.MINUTE, Integer.valueOf(startingFare.getString("num2").split(":")[1]));
            // 找到符合条件的直接跳出循环
            if (mileageDate.getTime() > calendarStart.getTimeInMillis() && mileageDate.getTime() < calendarEnd.getTimeInMillis()) {
                param.setMileage(startingFare.getString("num6")) ;
                param.setMileage(startingFare.getString("num6"));
                param.setTime(startingFare.getString("num7"));
                param.setMileageTypeTemp(1);
                break;
@@ -1317,7 +1351,7 @@
        if (date.getTime() > calendarStart.getTimeInMillis() && date.getTime() < calendarEnd.getTimeInMillis()
        ) {
            param.setMileage(num16) ;
            param.setMileage(num16);
            param.setTime(num17);
            param.setMileageTypeTemp(2);
        }
@@ -1344,7 +1378,7 @@
        if ((date.getTime() > calendar1Start.getTimeInMillis() && date.getTime() < calendar1End.getTimeInMillis())
                || (date.getTime() > calendar2Start.getTimeInMillis() && date.getTime() < calendar2End.getTimeInMillis())) {
            param.setMileage(num24) ;
            param.setMileage(num24);
            param.setTime(num25);
            param.setMileageTypeTemp(3);
        }
@@ -1352,7 +1386,7 @@
        boolean holiday = holidayUtil.isHoliday(localDate);
        if (holiday) {
            // 判断是否为节假日 起步价修改
            param.setMileage(num30) ;
            param.setMileage(num30);
            param.setTime(num31);
            param.setMileageTypeTemp(4);
        }
@@ -1604,7 +1638,7 @@
        BeanUtils.copyProperties(order, orderDetailVo);
        // 查询车辆信息
        XpVehicle vehicle = xpVehicleClient.queryById(order.getVehicleId()).getData();
        if (vehicle!=null){
        if (vehicle != null) {
            orderDetailVo.setVehicleCode(vehicle.getVehicleCode());
            orderDetailVo.setPlateNumber(vehicle.getPlateNumber());
            orderDetailVo.setVehicleColor(vehicle.getVehicleColor());
@@ -1626,15 +1660,15 @@
                OrderTrajectory.class
        );
        orderDetailVo.setTrajectories(trajectories);
        if (order.getTripBegin()!=null&&order.getTripEnd()!=null){
        if (order.getTripBegin() != null && order.getTripEnd() != null) {
            // 计算两个时间相差多少分钟
            long minutesDifference = Duration.between(order.getTripBegin(), order.getTripEnd()).toMinutes();
            orderDetailVo.setOrderTime(minutesDifference);
        }else{
        } else {
            orderDetailVo.setOrderTime(0l);
        }
        if (order.getStartMileage()!=null){
            orderDetailVo.setTotalMileage(order.getStartMileage()+(order.getMileageKilometers()!=null?order.getMileageKilometers():0D));
        if (order.getStartMileage() != null) {
            orderDetailVo.setTotalMileage(order.getStartMileage() + (order.getMileageKilometers() != null ? order.getMileageKilometers() : 0D));
        }
        return orderDetailVo;
@@ -1643,6 +1677,7 @@
    /**
     * 成功操作下发命令后调用 用于弹出redis队列的获取成功的数据
     *
     * @param dto
     */
    @Override
@@ -1652,12 +1687,16 @@
        XpOrder order = this.getById(dto.getOrderId());
        order.setAcceptanceTime(LocalDateTime.now());
        order.setVehicleId(dto.getXpVehicleId());
        R<XpVehicle> byVehicleVin = xpVehicleClient.findByVehicleVin(dto.getXpVehicleVin());
        if (byVehicleVin.getCode()==200){
            order.setVehicleId(byVehicleVin.getData().getId());
        }
        order.setStatus(2);
        // Redis弹出这个队列元素
        // value 订单Id_经纬度_状态_用户id_订单编号_距离_时间
        String popFirstElement = redisService.popFirstElement(dto.getQueueName());
        String popFirstElement = redisService.popFirstElement(order.getQueueName());
        XpGeoQueryEntity xpGeoQueryEntity = new XpGeoQueryEntity();
        String[] split = popFirstElement.split("_");
        xpGeoQueryEntity.setOrderId(split[0]);