puzhibing
2026-05-19 2d0312de30b3783ecf254d146dc6322d74690762
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -18,6 +18,9 @@
import com.xiaopeng.api.dto.account.UseUserCouponDto;
import com.xiaopeng.api.dto.automaticPilot.PushOrderDto;
import com.xiaopeng.api.dto.automaticPilot.VehicleEventDTO;
import com.xiaopeng.api.dto.frdXfipEvent.XpFrdXfipEventCouponLineDTO;
import com.xiaopeng.api.dto.frdXfipEvent.XpFrdXfipEventIngestContentDTO;
import com.xiaopeng.api.dto.frdXfipEvent.XpFrdXfipEventIngestReqDTO;
import com.xiaopeng.api.dto.map.OrderRouteAndFareDto;
import com.xiaopeng.api.dto.map.RouteAndFareDto;
import com.xiaopeng.api.dto.operation.LonLatDto;
@@ -34,6 +37,7 @@
import com.xiaopeng.api.feignClient.account.XpAppUserCouponClient;
import com.xiaopeng.api.feignClient.automaticPilot.OrderMissionClient;
import com.xiaopeng.api.feignClient.automaticPilot.VehicleBuriedPointClient;
import com.xiaopeng.api.feignClient.frdXfipEvent.XpFrdXfipEventClient;
import com.xiaopeng.api.feignClient.maintenance.XpTaskRuleClient;
import com.xiaopeng.api.feignClient.map.XpMapClient;
import com.xiaopeng.api.feignClient.map.XpStationClient;
@@ -57,6 +61,7 @@
import com.xiaopeng.api.vo.automaticPilot.protobuf.OrderOperationType;
import com.xiaopeng.api.vo.automaticPilot.protobuf.OrderStatus;
import com.xiaopeng.api.vo.automaticPilot.protobuf.TaskActionType;
import com.xiaopeng.api.vo.frdXfipEvent.XpFrdXfipEventIngestRespVO;
import com.xiaopeng.api.vo.operation.NearestNextVo;
import com.xiaopeng.api.vo.operation.RouteVo;
import com.xiaopeng.api.vo.order.*;
@@ -218,6 +223,9 @@
    private XpPayFrontClient xpPayFrontClient;
    @Resource
    private XpStationClient xpStationClient;
    @Resource
    private XpFrdXfipEventClient xpFrdXfipEventClient;
    @Value("${robotaxi.appId:xp_robotaxi_api}")
    private String appid;
@@ -3418,87 +3426,100 @@
    public R payment(XpOrderPayDto dto, String uid) {
//        XpOrder order = this.getById(dto.getOrderId());
//
//        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(OrderCodeUtil.getOrderCode("MMZF"));
//        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("009001");
//            creditOrderCreateDto.setBusinessOrderId("");
//            creditOrderCreateDto.setSubject("小鹏集团|robotaxi");
//            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);
//
//                order.setPayType(3);
//                order.setAuthOrderId(data.getAuthOrderId());
//
//                return R.ok(resultMap);
//            }
//
//        }else {
//
//            // 未签约
//            // 调用预下单接口
//            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);
//            }
//        }
//        return R.fail();
        XpOrder order = this.getById(dto.getOrderId());
        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(OrderCodeUtil.getOrderCode("MMZF"));
        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("009001");
            creditOrderCreateDto.setBusinessOrderId(OrderCodeUtil.getOrderCode("MMZF"));
            creditOrderCreateDto.setSubject("小鹏集团|robotaxi");
            creditOrderCreateDto.setPayType("13");
            creditOrderCreateDto.setPayCallbackUrl("");
            creditOrderCreateDto.setBusinessExtendData("{\"mainOrderId\":\"" +order.getOrderNumber() + "\"}");
            // 信用下单
            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);
                order.setPayType(3);
                order.setAuthOrderId(data.getAuthOrderId());
                order.setBusinessOrderId(creditOrderCreateDto.getBusinessOrderId());
                order.setMainOrderId(order.getOrderNumber());
                return R.ok(resultMap);
            }
        }else {
            // 未签约
            // 调用预下单接口
            CreditPrecreateDto creditPrecreateDto = new CreditPrecreateDto();
            creditPrecreateDto.setUid(uid);
            creditPrecreateDto.setBizId("xp-robotaxi");
            creditPrecreateDto.setBizOrderId(OrderCodeUtil.getOrderCode("MMZF"));
            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);
            creditPrecreateDto.setExtBusinessData2("{\"mainOrderId\":\"" +order.getOrderNumber() + "\"}");
            R<CreditPrecreateVo> creditPrecreateVoR = xpPayFrontClient.precreate(creditPrecreateDto);
            if (creditPrecreateVoR.getCode()==200) {
                CreditPrecreateVo data = creditPrecreateVoR.getData();
                resultMap.put("status", 2);
                resultMap.put("value", data);
                order.setPayType(1);
                order.setBusinessOrderId(creditPrecreateDto.getBizOrderId());
                order.setMainOrderId(order.getOrderNumber());
                this.updateById(order);
                return R.ok(resultMap);
            }
        }
@@ -3522,7 +3543,7 @@
        }
        baseMapper.updateById(order);
        bootCommonService.setCache_orderStatus(order.getId(), order, null);
        return R.ok();
        return R.fail();
    }
    /**
@@ -4885,19 +4906,157 @@
                    postPayments.add(postPayment);
                    creditOrderWxPayDto.setPostPayments(postPayments);
                    R<CreditOrderWxPayVo> creditOrderWxPayVoR = xpPayFrontClient.creditOrderWxPay(creditOrderWxPayDto);
                }else if(creditOrderQueryVo.getCreditOrderStatus().equals("CREATED") || creditOrderQueryVo.getCreditOrderStatus().equals("DOING")){
                }
            }
        }else {
            // 微信支付也需要查询下
            PayOrderQueryDto queryDto = new PayOrderQueryDto();
            queryDto.setBizId("xp-robotaxi");
            queryDto.setBizOrderId(order.getBusinessOrderId());
            R<PayOrderQueryVo> payOrderQueryVoR = xpPayFrontClient.queryPayOrder(queryDto);
            if(payOrderQueryVoR.getCode()==200){
                PayOrderQueryVo payOrderQueryVo = payOrderQueryVoR.getData();
                if(payOrderQueryVo.getPayStatus()==1){
                    // 支付成功
                    order.setStatus(9);
                    order.setAppUserId(null);
                    order.setAuthOrderId(payOrderQueryVo.getPayOrderId());
                    if(payOrderQueryVo.getPayType()==13){
                        order.setPayType(3);
                    }
                    this.updateById(order);
                    // 财务推送
                    xpFrdXfipEventPush(order,payOrderQueryVo.getAmount(),payOrderQueryVo.getPayOrderId());
                }
            }
        }
        OrderStatusFromOrderIdVo orderStatusFromOrderIdVo = new OrderStatusFromOrderIdVo();
        orderStatusFromOrderIdVo.setOrderId(order.getId());
        orderStatusFromOrderIdVo.setStatus(order.getStatus());
        return orderStatusFromOrderIdVo;
    }
    @Override
    public void creditPayCall(XpOrder order) {
        CreditOrderWxPayDto dto = new CreditOrderWxPayDto();
        dto.setBusinessId("xp-robotaxi");
        dto.setBusinessOrderId(order.getBusinessOrderId());
        dto.setAuthOrderId(order.getAuthOrderId());
        dto.setCategory("009001");
        dto.setPayCallbackUrl("");
        dto.setTotalAmount(order.getOrderMoney().multiply(BigDecimal.valueOf(100)).longValue());
        dto.setSubject("小鹏集团|robotaxi");
        dto.setPayType("13");
        List<CreditOrderCreateDto.PostPayment> postPayments = new ArrayList<>();
        CreditOrderCreateDto.PostPayment postPayment = new CreditOrderCreateDto.PostPayment();
        postPayment.setName("收费标准");
        postPayment.setDescription("行程价格动态浮动,具体详情可在费用详情或计价规则查看");
        dto.setPostPayments(postPayments);
        R<CreditOrderWxPayVo> creditOrderWxPayVoR = xpPayFrontClient.creditOrderWxPay(dto);
    }
    /**
     * 对接财务数据推送
     * @param order
     */
    @Override
    public void xpFrdXfipEventPush(XpOrder order,Long payFee,String orderId) {
        if(order.getFrdXfipEvenetStatus()==1){
            return;
        }
        XpFrdXfipEventIngestReqDTO xpFrdXfipEventIngestReqDTO = new XpFrdXfipEventIngestReqDTO();
        xpFrdXfipEventIngestReqDTO.setEventId("RT_04");
        xpFrdXfipEventIngestReqDTO.setBusinessLine("RT");
        xpFrdXfipEventIngestReqDTO.setReqId(OrderCodeUtil.getOrderCode("FRDXFOPEVENT"));
        XpFrdXfipEventIngestContentDTO xpFrdXfipEventIngestContentDTO = new XpFrdXfipEventIngestContentDTO();
        xpFrdXfipEventIngestContentDTO.setCompanyCode("8000");
        xpFrdXfipEventIngestContentDTO.setOrderType("SELF_OPERATED");
        xpFrdXfipEventIngestContentDTO.setBusinessOrderNo(order.getMainOrderId());
        xpFrdXfipEventIngestContentDTO.setSubOrderNo(order.getBusinessOrderId());
        xpFrdXfipEventIngestContentDTO.setPaymentType("POST_PAY");
        xpFrdXfipEventIngestContentDTO.setOrderStatus("结算完成");
        xpFrdXfipEventIngestContentDTO.setSettlementDate(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")));
        xpFrdXfipEventIngestContentDTO.setMaterialNo("XE2000398");
        xpFrdXfipEventIngestContentDTO.setBusinessPartnerCode("5004901");
        xpFrdXfipEventIngestContentDTO.setCurrency("CNY");
        xpFrdXfipEventIngestContentDTO.setConfirmedRevenueAmount(order.getOrderMoney());
        xpFrdXfipEventIngestContentDTO.setCashCollectedAmount(new BigDecimal(payFee).divide(BigDecimal.valueOf(100), 2,RoundingMode.HALF_UP));
        xpFrdXfipEventIngestContentDTO.setCouponConsumedTotal(order.getCouponMoney()==null?BigDecimal.ZERO:order.getCouponMoney());
        xpFrdXfipEventIngestContentDTO.setPaymentFlowNo(orderId);
        xpFrdXfipEventIngestContentDTO.setPaymentFlowAmount(new BigDecimal(payFee).divide(BigDecimal.valueOf(100), 2,RoundingMode.HALF_UP));
        xpFrdXfipEventIngestContentDTO.setPaymentChannel("WECHAT");
        if(order.getCouponId()!=null){
            ArrayList<XpFrdXfipEventCouponLineDTO> list = new ArrayList<>(1);
            XpFrdXfipEventCouponLineDTO xpFrdXfipEventCouponLineDTO = new XpFrdXfipEventCouponLineDTO();
            xpFrdXfipEventCouponLineDTO.setCouponId(String.valueOf(order.getCouponId()));
            xpFrdXfipEventCouponLineDTO.setCouponType("ACTIVITY");
//            xpFrdXfipEventCouponLineDTO.setCouponIssuerCompanyCode("5004901");
//            xpFrdXfipEventCouponLineDTO.setSelfBorneAmount(order.getCouponMoney());
//            xpFrdXfipEventCouponLineDTO.setThirdPartyBorneAmount(BigDecimal.ZERO);
            xpFrdXfipEventCouponLineDTO.setCouponDeductionAmount(order.getCouponMoney());
            xpFrdXfipEventCouponLineDTO.setCouponIssuerCompanyCode("8000");
            list.add(xpFrdXfipEventCouponLineDTO);
            xpFrdXfipEventIngestContentDTO.setCouponLines(list);
        }
        xpFrdXfipEventIngestReqDTO.setContent(xpFrdXfipEventIngestContentDTO);
        R<XpFrdXfipEventIngestRespVO> ingest = xpFrdXfipEventClient.ingest(xpFrdXfipEventIngestReqDTO);
        if(ingest.getCode()==200){
            XpFrdXfipEventIngestRespVO data = ingest.getData();
            if(!data.getReceiveStatus().equals("REJECTED")){
                // 推送成功
                order.setFrdXfipEvenetStatus(1);
                order.setFrdXfipEvenetId(data.getEventId());
            }else {
                // 推送失败
                order.setFrdXfipEvenetStatus(2);
                order.setFrdXfipEvenetId(data.getEventId());
            }
            log.info("xpFrdXfipEventPush:{}",data);
        }else {
            // 重试1次
            ingest = xpFrdXfipEventClient.ingest(xpFrdXfipEventIngestReqDTO);
            XpFrdXfipEventIngestRespVO data = ingest.getData();
            if(ingest.getCode()==200){
                if(!data.getReceiveStatus().equals("REJECTED")){
                    // 推送成功
                    order.setFrdXfipEvenetStatus(1);
                    order.setFrdXfipEvenetId(data.getEventId());
                }else {
                    // 推送失败
                    order.setFrdXfipEvenetStatus(2);
                    order.setFrdXfipEvenetId(data.getEventId());
                }
                log.info("xpFrdXfipEventPush:{}",data);
            }else {
                // 推送失败
                order.setFrdXfipEvenetStatus(2);
                order.setFrdXfipEvenetId(data.getEventId());
            }
            log.info("xpFrdXfipEventPush:{}",ingest.getMsg());
        }
        order.setAppUserId(null);
        updateById(order);
    }
@@ -4921,10 +5080,10 @@
        // 通过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, startTime, endTime));
            Page<XpOrder> orderPage = this.baseMapper.selectPage(page, new LambdaQueryWrapper<XpOrder>().eq(XpOrder::getAppUserId, Long.valueOf(query.getUid())).ge(XpOrder::getStatus, 9).between(BaseModel::getCreateTime, startTime, endTime).orderByDesc(BaseModel::getCreateTime));
            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, startTime, endTime));
            list = this.baseMapper.selectList(new LambdaQueryWrapper<XpOrder>().eq(XpOrder::getAppUserId, Long.valueOf(query.getUid())).ge(XpOrder::getStatus, 9).between(BaseModel::getCreateTime, startTime, endTime).orderByDesc(BaseModel::getCreateTime));
        }
        if(list.isEmpty()){
@@ -4944,18 +5103,18 @@
            xpInvoiceVo.setOrderNo(xpOrder.getOrderNumber());
            xpInvoiceVo.setOrderTotalAmount(xpOrder.getOrderMoney());
            xpInvoiceVo.setOrderDiscountAmount(xpOrder.getCouponMoney());
            xpInvoiceVo.setOrderFinishTime(String.valueOf(xpOrder.getTripEnd()));
            xpInvoiceVo.setOrderFinishTime(xpOrder.getTripEnd()!=null?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")));
            itinerary.setTripStartDate(xpOrder.getAcceptanceTime()!=null?xpOrder.getAcceptanceTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")):"");
            itinerary.setTripEndDate(xpOrder.getTripEnd()!=null?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.setTripStartDate(xpOrder.getBoardingTime()!=null?xpOrder.getBoardingTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")):"");
            itinerary.setCity(xpOrder.getCityName());
            itinerary.setStartPoint(xpOrder.getStartAddress());