liujie
2026-05-18 df7ea92f6e128abf309d389bd99ffc4602ee2049
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.operation.*;
@@ -56,6 +60,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.*;
@@ -207,6 +212,9 @@
    @Resource
    private XpPayFrontClient xpPayFrontClient;
    @Resource
    private XpFrdXfipEventClient xpFrdXfipEventClient;
    @Value("${robotaxi.appId:xp_robotaxi_api}")
    private String appid;
@@ -3358,6 +3366,9 @@
            creditOrderCreateDto.setPayType("13");
            creditOrderCreateDto.setPayCallbackUrl("");
            creditOrderCreateDto.setBusinessExtendData("{\"mainOrderId\":\"" +order.getOrderNumber() + "\"}");
            // 信用下单
            ArrayList<CreditOrderCreateDto.PostPayment> postPayments = new ArrayList<>(1);
@@ -3375,6 +3386,7 @@
                order.setPayType(3);
                order.setAuthOrderId(data.getAuthOrderId());
                order.setBusinessOrderId(creditOrderCreateDto.getBusinessOrderId());
                order.setMainOrderId(order.getOrderNumber());
                return R.ok(resultMap);
            }
@@ -3386,7 +3398,7 @@
            CreditPrecreateDto creditPrecreateDto = new CreditPrecreateDto();
            creditPrecreateDto.setUid(uid);
            creditPrecreateDto.setBizId("xp-robotaxi");
            creditPrecreateDto.setBizOrderId("");
            creditPrecreateDto.setBizOrderId(OrderCodeUtil.getOrderCode("MMZF"));
            creditPrecreateDto.setPayScene(99);
            creditPrecreateDto.setAmount(order.getOrderMoney().multiply(new BigDecimal(100)).intValue());
            creditPrecreateDto.setCategory("009001");
@@ -3398,11 +3410,19 @@
            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);
            }
        }
@@ -4747,13 +4767,37 @@
                    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();
@@ -4783,6 +4827,97 @@
        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);
    }
@@ -4845,7 +4980,7 @@
            itinerary.setCity(xpOrder.getCityName());
            itinerary.setStartPoint(xpOrder.getStartAddress());
            itinerary.setEndPoint(xpOrder.getEndAddress());
            itinerary.setMileage(xpOrder.getMileageKilometers().toString());
            itinerary.setMileage(xpOrder.getMileageKilometers()!=null ? xpOrder.getMileageKilometers().toString() :"0");
            itinerary.setAmount(xpOrder.getOrderMoney());
            xpInvoiceVo.setItinerary(itinerary);