From 4f7fd9e879d9de211b255eb21535a034893ffbff Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期四, 14 五月 2026 16:20:48 +0800
Subject: [PATCH] 合并代码

---
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java |  289 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 270 insertions(+), 19 deletions(-)

diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
index c263969..1232329 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
+++ b/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);
+                }
+            }
+
+        }
+
+
+    }
 }

--
Gitblit v1.7.1