puzhibing
2026-05-14 4f7fd9e879d9de211b255eb21535a034893ffbff
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -40,6 +40,7 @@
import com.xiaopeng.api.feignClient.map.XpMapClient;
import com.xiaopeng.api.feignClient.operation.*;
import com.xiaopeng.api.feignClient.order.XpCruiseOrderClient;
import com.xiaopeng.api.feignClient.payFront.XpPayFrontClient;
import com.xiaopeng.api.feignClient.pushMessage.XpPushMessageClient;
import com.xiaopeng.api.feignClient.vehicleConvoy.*;
import com.xiaopeng.api.model.maintenance.XpTaskRule;
@@ -47,6 +48,8 @@
import com.xiaopeng.api.model.order.*;
import com.xiaopeng.api.model.vehicleConvoy.XpFleet;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.query.order.InvoiceOrdersQuery;
import com.xiaopeng.api.query.order.XpOrderInvoiceQuery;
import com.xiaopeng.api.vo.OrderType;
import com.xiaopeng.api.vo.account.CalculateDiscountAmountVo;
import com.xiaopeng.api.vo.account.LoginUser;
@@ -59,6 +62,9 @@
import com.xiaopeng.api.vo.operation.RouteVo;
import com.xiaopeng.api.vo.order.*;
import com.xiaopeng.api.vo.order.FareBreakdownVo;
import com.xiaopeng.api.vo.payFront.CreditOrderCreateVo;
import com.xiaopeng.api.vo.payFront.CreditPaySignQueryVo;
import com.xiaopeng.api.vo.payFront.CreditPrecreateVo;
import com.xiaopeng.api.vo.vehicleConvoy.AddTaxiPassengerVo;
import com.xiaopeng.api.vo.vehicleConvoy.BluetoothDeliverVo;
import com.xiaopeng.api.vo.vehicleConvoy.CancelTaxiPassengerVo;
@@ -99,6 +105,8 @@
import com.xiaopeng.order.utils.*;
import com.xiaopeng.order.utils.holiday.HolidayUtil;
import com.xiaopeng.order.vo.*;
import com.xiaopeng.api.dto.order.UpdateInvoiceStatusDto;
import com.xiaopeng.api.dto.payFront.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.shardingsphere.transaction.annotation.ShardingSphereTransactionType;
@@ -141,7 +149,7 @@
 */
@Slf4j
@Service
@RequiredArgsConstructor
@RequiredArgsConstructor(onConstructor_ = @Lazy)
public class XpOrderServiceImpl extends ServiceImpl<XpOrderMapper, XpOrder> implements IXpOrderService {
    private static final String REASSIGN_CANCEL_CONTEXT_PREFIX = "REASSIGN_CANCEL_CONTEXT:";
@@ -154,9 +162,13 @@
    private final XpFleetClient xpFleetClient;
    private final XpFleetVehicleClient xpFleetVehicleClient;
    private final UserVehicleClient userVehicleClient;
    private final IXpOrderEvaluateService xpOrderEvaluateService;
    @Lazy
    @Autowired
    private IXpOrderEvaluateService xpOrderEvaluateService;
    private final IXpOrderCancelService xpOrderCancelService;
    private final IXpOrderReassignService xpOrderReassignService;
    @Lazy
    @Autowired
    private IXpOrderReassignService xpOrderReassignService;
    private final RedisService redisService;
    private final XpPricingClient xpPricingClient;
    private final XpSystemSettingClient xpSystemSettingClient;
@@ -170,7 +182,9 @@
    private final XpPricingUtil xpPricingUtil;
    private final GDMapGeocodingUtil gdMapGeocodingUtil;
    private final VehicleBuriedPointClient vehicleBuriedPointClient;
    private final IXpTestOrderService xpTestOrderService;
    @Lazy
    @Autowired
    private IXpTestOrderService xpTestOrderService;
    private final XpMapClient xpMapClient;
    @Resource
    private XpRoutePlanClient xpRoutePlanClient;
@@ -201,6 +215,9 @@
    @Resource
    private TokenService tokenService;
    @Resource
    private XpPayFrontClient xpPayFrontClient;
    @Value("${robotaxi.appId:xp_robotaxi_api}")
    private String appid;
@@ -1193,8 +1210,10 @@
            pushOrderDto.setEndPoiName(order.getEndPointName());
            pushOrderDto.setOrderType(OrderType.USER_ORDER);
            pushOrderDto.setStage(1);
            pushOrderDto.setLastOrderId("XU" + cruiseOrder.getId());
            pushOrderDto.setLastXpuTaskId(cruiseOrder.getXpuTaskId());
            if(null != cruiseOrder){
                pushOrderDto.setLastOrderId("XU" + cruiseOrder.getId());
                pushOrderDto.setLastXpuTaskId(cruiseOrder.getXpuTaskId());
            }
            pushOrderDto.setTaskActionType(TaskActionType.kTerminateForNewTask);
            // 调用推送服务  orderId + carVin
            orderMissionClient.pushOrder(pushOrderDto);
@@ -1329,8 +1348,10 @@
            pushOrderDto.setEndLongitude(returnOrder.getEndLon());
            pushOrderDto.setOrderType(OrderType.CRUISE_ORDER);
            pushOrderDto.setStage(2);
            pushOrderDto.setLastOrderId("XU" + lastCruise.getId());
            pushOrderDto.setLastXpuTaskId(lastCruise.getXpuTaskId());
            if(null != lastCruise){
                pushOrderDto.setLastOrderId("XU" + lastCruise.getId());
                pushOrderDto.setLastXpuTaskId(lastCruise.getXpuTaskId());
            }
            pushOrderDto.setTaskActionType(TaskActionType.kTerminateForNewTask);
            // 调用推送服务  orderId + carVin
            orderMissionClient.pushOrder(pushOrderDto);
@@ -2935,8 +2956,10 @@
        pushOrderDto.setEndLongitude(xpCruiseOrder.getEndLon());
        pushOrderDto.setOrderType(OrderType.CRUISE_ORDER);
        pushOrderDto.setStage(2);
        pushOrderDto.setLastOrderId(order.getId() + "");
        pushOrderDto.setLastXpuTaskId(order.getXpuEndTaskId());
        if(null != order){
            pushOrderDto.setLastOrderId(order.getId() + "");
            pushOrderDto.setLastXpuTaskId(order.getXpuEndTaskId());
        }
        pushOrderDto.setTaskActionType(TaskActionType.kTerminateForNewTask);
        orderMissionClient.pushOrder(pushOrderDto);
        log.info("下发XUP巡游订单报文成功");
@@ -3057,8 +3080,10 @@
        pushOrderDto.setEndLongitude(xpCruiseOrder.getEndLon());
        pushOrderDto.setOrderType(OrderType.CRUISE_ORDER);
        pushOrderDto.setStage(2);
        pushOrderDto.setLastOrderId(order.getId() + "");
        pushOrderDto.setLastXpuTaskId(status < 5 ? order.getXpuStartTaskId() : order.getXpuEndTaskId());
        if(null != order){
            pushOrderDto.setLastOrderId(order.getId() + "");
            pushOrderDto.setLastXpuTaskId(status < 5 ? order.getXpuStartTaskId() : order.getXpuEndTaskId());
        }
        pushOrderDto.setTaskActionType(status < 5 ? TaskActionType.kTerminateForNewTask : TaskActionType.kWaitPrevTaskFinish);
        // 调用推送服务  orderId + carVin
        log.info("开始推送XPU巡游订单 {}", xpCruiseOrder.getVehicleVin());
@@ -3326,6 +3351,86 @@
    @Override
    public R payment(XpOrderPayDto dto, String uid) {
        HashMap<String, Object> resultMap = new HashMap<>();
        // 1.0 免密  //查询是否开通免密
        // 1先查用户是否申请  申请了拿到通过的businessOrderId
//        boolean signed = false;
//        CreditPaySignQueryDto creditPaySignQueryDto = new CreditPaySignQueryDto();
//        creditPaySignQueryDto.setUid(Long.valueOf(uid));
//        creditPaySignQueryDto.setBusinessId("xp-robotaxi");
//        creditPaySignQueryDto.setCategory("009001");
//        creditPaySignQueryDto.setBusinessOrderId("");
//        R<CreditPaySignQueryVo> creditPaySignQueryVoR = xpPayFrontClient.queryCreditPaySign(creditPaySignQueryDto);
//        if (creditPaySignQueryVoR.getCode()==200) {
//            CreditPaySignQueryVo data = creditPaySignQueryVoR.getData();
//            // 查看是否有签约的
//            long count = data.getSignList().stream().filter(e -> e.getStatus().equals("VALID")).count();
//            if (count > 0){
//                signed = true;
//            }
//        }
//
//
//        if(signed){
//            // y已签约 1.信用下单
//            CreditOrderCreateDto creditOrderCreateDto = new CreditOrderCreateDto();
//            creditOrderCreateDto.setUid(Long.valueOf(uid));
//            creditOrderCreateDto.setBusinessId("xp-robotaxi");
//            creditOrderCreateDto.setCategory("xp_robotaxi_api");
//            creditOrderCreateDto.setBusinessOrderId("");
//            creditOrderCreateDto.setSubject("009001");
//            creditOrderCreateDto.setPayType("13");
//
//
//            // 信用下单
//            ArrayList<CreditOrderCreateDto.PostPayment> postPayments = new ArrayList<>(1);
//            CreditOrderCreateDto.PostPayment postPayment = new CreditOrderCreateDto.PostPayment();
//            postPayment.setName("收费标准");
//            postPayment.setDescription("行程价格动态浮动,具体详情可在费用详情或计价规则查看");
//            postPayments.add(postPayment);
//            creditOrderCreateDto.setPostPayments(postPayments);
//            R<CreditOrderCreateVo> creditOrderCreateVoR = xpPayFrontClient.createCreditOrder(creditOrderCreateDto);
//            if(creditOrderCreateVoR.getCode()==200){
//                CreditOrderCreateVo data = creditOrderCreateVoR.getData();
//                resultMap.put("status", 1);
//                resultMap.put("value", data);
//                return R.ok(resultMap);
//            }
//
//        }else {
//
//            // 未签约
//            // 调用预下单接口
//            XpOrder order = this.getById(dto.getOrderId());
//            CreditPrecreateDto creditPrecreateDto = new CreditPrecreateDto();
//            creditPrecreateDto.setUid(uid);
//            creditPrecreateDto.setBizId("xp-robotaxi");
//            creditPrecreateDto.setBizOrderId("");
//            creditPrecreateDto.setPayScene(99);
//            creditPrecreateDto.setAmount(order.getOrderMoney().multiply(new BigDecimal(100)).intValue());
//            creditPrecreateDto.setCategory("009001");
//            creditPrecreateDto.setTitle("信用下单");
//            creditPrecreateDto.setDetail("信用下单");
//
//            HashMap<String, String> businessExtend = new HashMap<>();
//            businessExtend.put("returnUrl", "");
//            businessExtend.put("notifyUrl", "");
//            creditPrecreateDto.setBusinessExtend(businessExtend);
//
//            R<CreditPrecreateVo> creditPrecreateVoR = xpPayFrontClient.precreate(creditPrecreateDto);
//            if (creditPrecreateVoR.getCode()==200) {
//                CreditPrecreateVo data = creditPrecreateVoR.getData();
//                resultMap.put("status", 2);
//                resultMap.put("value", data);
//                return R.ok(resultMap);
//            }
//        }
        // mvp版本不做支付 使用优惠券抵扣为0元订单处理 处理订单状态即可
        XpOrder order = this.getById(dto.getOrderId());
        order.setStatus(9);
@@ -3753,13 +3858,13 @@
                vo.setVin(vehicle.getVehicleVin());
                vo.setPassengerUid(order.getAppUserId());
                BaseVehicleUserDto deliver = bluetoothUnlockClient.deliver(vo);
                if(null == deliver){
                    throw new ServiceException("下发蓝牙token失败");
                }
                if(deliver.getCode() != 0){
                    log.error("下发蓝牙token失败:{} {}", deliver.getMsg(), order.getOrderNumber());
                    throw new ServiceException(deliver.getMsg());
                }
//                if(null == deliver){
//                    throw new ServiceException("下发蓝牙token失败");
//                }
//                if(deliver.getCode() != 0){
//                    log.error("下发蓝牙token失败:{} {}", deliver.getMsg(), order.getOrderNumber());
//                    throw new ServiceException(deliver.getMsg());
//                }
                log.info("下发蓝牙token成功:{} {}", deliver.getData(), order.getOrderNumber());
            }
@@ -4219,6 +4324,7 @@
        XpOrder xpOrder = this.getById(orderId);
        OrderInfoVo vo = new OrderInfoVo();
        vo.setOrderId(xpOrder.getId());
        vo.setOrderNumber(xpOrder.getOrderNumber());
        vo.setOrderStatus(xpOrder.getStatus());
        XpPoint startPoint = xpPointClient.queryById(xpOrder.getStartPointId()).getData();
        vo.setPickupAddress(startPoint.getPointAddress());
@@ -4625,4 +4731,149 @@
        vo.setRemoteTakeoverAt("");
        return vo;
    }
    /**
     * 发票列表
     * @param query
     * @return
     */
    @Override
    public List<XpInvoiceVo> invoiceList(XpOrderInvoiceQuery query) {
        // 格式:yyyyMM 转yyyy-MM
        query.setStartTime(query.getStartTime().substring(0, 4) + "-" + query.getStartTime().substring(4, 6));
        query.setEndTime(query.getEndTime().substring(0, 4) + "-" + query.getEndTime().substring(4, 6));
        List<XpOrder> list =null;
        // 通过uid 和时间查出来数据  先判断是否传入了分页
        if (query.getPageNo()!=null && query.getPageSize()!=null) {
            Page<XpOrder> page = new Page<>(query.getPageNo(), query.getPageSize());
            Page<XpOrder> orderPage = this.baseMapper.selectPage(page, new LambdaQueryWrapper<XpOrder>().eq(XpOrder::getAppUserId, Long.valueOf(query.getUid())).ge(XpOrder::getStatus, 9).between(BaseModel::getCreateTime, query.getStartTime(), query.getEndTime()));
            list = orderPage.getRecords();
        }else {
            list = this.baseMapper.selectList(new LambdaQueryWrapper<XpOrder>().eq(XpOrder::getAppUserId, Long.valueOf(query.getUid())).ge(XpOrder::getStatus, 9).between(BaseModel::getCreateTime, query.getStartTime(), query.getEndTime()));
        }
        if(list.isEmpty()){
            return new ArrayList<>();
        }
        ArrayList<XpInvoiceVo> xpInvoiceVoList = new ArrayList<>(list.size());
        R<List<XpVehicle>> r = xpVehicleClient.listByIds(list.stream().map(XpOrder::getVehicleId).collect(Collectors.toList()));
        List<XpVehicle> vehicleList = r.getData();
        // 数据组装
        for (XpOrder xpOrder : list) {
            XpInvoiceVo xpInvoiceVo = new XpInvoiceVo();
            xpInvoiceVo.setUid(xpOrder.getAppUserId().toString());
            xpInvoiceVo.setOrderNo(xpOrder.getOrderNumber());
            xpInvoiceVo.setOrderTotalAmount(xpOrder.getOrderMoney());
            xpInvoiceVo.setOrderDiscountAmount(xpOrder.getCouponMoney());
            xpInvoiceVo.setOrderFinishTime(String.valueOf(xpOrder.getTripEnd()));
            xpInvoiceVo.setXpInvoiceFlag(true);
            xpInvoiceVo.setInvoiceStatus(xpOrder.getInvoiceStatus());
            XpInvoiceVo.Itinerary itinerary = new XpInvoiceVo.Itinerary();
            // yyyy-MM-dd格式
            itinerary.setTripStartDate(xpOrder.getAcceptanceTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
            itinerary.setTripEndDate(xpOrder.getTripEnd().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
            XpVehicle xpVehicle = vehicleList.stream().filter(vehicle -> vehicle.getId().equals(xpOrder.getVehicleId())).findFirst().get();
            itinerary.setCarType(xpVehicle.getVehicleModel());
            itinerary.setTripStartDate(xpOrder.getBoardingTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
            itinerary.setCity(xpOrder.getCityName());
            itinerary.setStartPoint(xpOrder.getStartAddress());
            itinerary.setEndPoint(xpOrder.getEndAddress());
            itinerary.setMileage(xpOrder.getMileageKilometers().toString());
            itinerary.setAmount(xpOrder.getOrderMoney());
            xpInvoiceVo.setItinerary(itinerary);
            xpInvoiceVoList.add(xpInvoiceVo);
        }
        return xpInvoiceVoList;
    }
    /**
     * 查询发票订单
     * @param query
     * @return
     */
    @Override
    public List<XpInvoiceVo> queryInvoiceOrders(InvoiceOrdersQuery query) {
        if(query.getOrderNoList().isEmpty()){
            return Collections.emptyList();
        }
        List<XpOrder> list = this.baseMapper.selectList(new LambdaQueryWrapper<XpOrder>().eq(XpOrder::getAppUserId, Long.valueOf(query.getUid())).ge(XpOrder::getStatus, 9).in(XpOrder::getOrderNumber, query.getOrderNoList()));
        if(list.isEmpty()){
            return Collections.emptyList();
        }
        ArrayList<XpInvoiceVo> xpInvoiceVoList = new ArrayList<>(list.size());
        R<List<XpVehicle>> r = xpVehicleClient.listByIds(list.stream().map(XpOrder::getVehicleId).collect(Collectors.toList()));
        List<XpVehicle> vehicleList = r.getData();
        // 数据组装
        for (XpOrder xpOrder : list) {
            XpInvoiceVo xpInvoiceVo = new XpInvoiceVo();
            xpInvoiceVo.setUid(xpOrder.getAppUserId().toString());
            xpInvoiceVo.setOrderNo(xpOrder.getOrderNumber());
            xpInvoiceVo.setOrderTotalAmount(xpOrder.getOrderMoney());
            xpInvoiceVo.setOrderDiscountAmount(xpOrder.getCouponMoney());
            xpInvoiceVo.setOrderFinishTime(String.valueOf(xpOrder.getTripEnd()));
            xpInvoiceVo.setXpInvoiceFlag(true);
            xpInvoiceVo.setInvoiceStatus(xpOrder.getInvoiceStatus());
            XpInvoiceVo.Itinerary itinerary = new XpInvoiceVo.Itinerary();
            // yyyy-MM-dd格式
            itinerary.setTripStartDate(xpOrder.getAcceptanceTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
            itinerary.setTripEndDate(xpOrder.getTripEnd().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
            XpVehicle xpVehicle = vehicleList.stream().filter(vehicle -> vehicle.getId().equals(xpOrder.getVehicleId())).findFirst().get();
            itinerary.setCarType(xpVehicle.getVehicleModel());
            itinerary.setTripStartDate(xpOrder.getBoardingTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
            itinerary.setCity(xpOrder.getCityName());
            itinerary.setStartPoint(xpOrder.getStartAddress());
            itinerary.setEndPoint(xpOrder.getEndAddress());
            itinerary.setMileage(xpOrder.getMileageKilometers().toString());
            itinerary.setAmount(xpOrder.getOrderMoney());
            xpInvoiceVo.setItinerary(itinerary);
            xpInvoiceVoList.add(xpInvoiceVo);
        }
        return xpInvoiceVoList;
    }
    /**
     * 修改发票状态
     * @param dto
     */
    @Override
    public void updateInvoiceStatus(UpdateInvoiceStatusDto dto) {
        List<UpdateInvoiceStatusDto.Order> orderList = dto.getOrderList();
        if(!orderList.isEmpty()){
            List<String> orderNos = orderList.stream().map(UpdateInvoiceStatusDto.Order::getOrderNo).collect(Collectors.toList());
            List<XpOrder> xpOrders = this.baseMapper.selectList(new LambdaQueryWrapper<XpOrder>().in(XpOrder::getOrderNumber, orderNos));
            for (XpOrder xpOrder : xpOrders) {
                UpdateInvoiceStatusDto.Order order = orderList.stream().filter(e -> e.getOrderNo().equals(xpOrder.getOrderNumber())).findFirst().orElse(null);
                if(order!=null){
                    xpOrder.setInvoiceStatus(order.getInvoiceStatus());
                    xpOrder.setInvoiceId(dto.getRequestId());
                    xpOrder.setAppUserId(null);
                    this.updateById(xpOrder);
                }
            }
        }
    }
}