From a3972e331b703c703ba29e6070432997428bb00f Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期三, 06 五月 2026 16:53:13 +0800
Subject: [PATCH] 发票功能

---
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java |  152 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 148 insertions(+), 4 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 2bdfd0c..b694dfd 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
@@ -20,10 +20,7 @@
 import com.xiaopeng.api.dto.map.OrderRouteAndFareDto;
 import com.xiaopeng.api.dto.map.RouteAndFareDto;
 import com.xiaopeng.api.dto.operation.LonLatDto;
-import com.xiaopeng.api.dto.order.GetOrderNumDto;
-import com.xiaopeng.api.dto.order.HistoryEndPointsDto;
-import com.xiaopeng.api.dto.order.HistoryStartPointsDto;
-import com.xiaopeng.api.dto.order.PopOrderDto;
+import com.xiaopeng.api.dto.order.*;
 import com.xiaopeng.api.dto.pushMessage.SendMessageDTO;
 import com.xiaopeng.api.dto.statistics.DailyCountDTO;
 import com.xiaopeng.api.dto.statistics.OrderStatisticsDTO;
@@ -46,6 +43,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.UserCouponVo;
@@ -4483,4 +4482,149 @@
 
         return R.ok();
     }
+
+
+    /**
+     * 发票列表
+     * @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