“mitao”
2026-03-23 b91c1ee0a758cfa20ae5b0ed896a7281fb34622f
bugfix
3个文件已添加
9个文件已修改
448 ■■■■■ 已修改文件
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpVehicleRepair.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpVehicleRepairController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/XpVehicleRepairMgtVO.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/XpVehicleRepairVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/IXpVehicleRepairService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpVehicleRepairServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpCruiseOrderController.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/model/exportExcel/XpCruiseOrderExportExcel.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/model/query/XpCruiseOrderExcelQuery.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/model/vo/XpOrderDetailVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpCruiseOrderService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpCruiseOrderServiceImpl.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/maintenance/XpVehicleRepair.java
@@ -43,11 +43,11 @@
    private Long vehicleId;
    @ApiModelProperty(value = "开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @JsonFormat(pattern = "yyyy年MM月dd日", timezone = "GMT+8")
    private LocalDate startTime;
    @ApiModelProperty(value = "结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @JsonFormat(pattern = "yyyy年MM月dd日", timezone = "GMT+8")
    private LocalDate endTime;
    @ApiModelProperty(value = "维修原因")
@@ -66,14 +66,14 @@
    private Long sendUserId;
    @ApiModelProperty(value = "送修时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @JsonFormat(pattern = "yyyy年MM月dd日 HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime sendTime;
    @ApiModelProperty(value = "取回人")
    private Long returnUserId;
    @ApiModelProperty(value = "取回时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @JsonFormat(pattern = "yyyy年MM月dd日 HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime returnTime;
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpVehicleRepairController.java
@@ -14,6 +14,7 @@
import com.xiaopeng.maintenance.dto.XpVehicleRepairReturnDTO;
import com.xiaopeng.maintenance.dto.XpVehicleRepairStartDTO;
import com.xiaopeng.maintenance.model.query.XpVehicleRepairPageQuery;
import com.xiaopeng.maintenance.model.vo.XpVehicleRepairMgtVO;
import com.xiaopeng.maintenance.model.vo.XpVehicleRepairVO;
import com.xiaopeng.maintenance.schedule.InsuranceInspectionScheduleTask;
import com.xiaopeng.maintenance.service.IXpVehicleRepairService;
@@ -141,10 +142,10 @@
     */
    @ApiOperation(value = "通过车辆id查询维修分页列表", tags = {"管理后台-车辆管理-运营车辆管理"})
    @PostMapping("/api/v1/vehicle/queryRepairByVehicleId")
    public R<PageInfo<XpVehicleRepairVO>> queryRepairByVehicleId(@Valid @RequestBody XpVehicleRepairPageQuery query) throws UnsupportedEncodingException {
        PageInfo<XpVehicleRepairVO> pageInfo = xpVehicleRepairService.queryDetectionByVehicleId(query);
    public R<PageInfo<XpVehicleRepairMgtVO>> queryRepairByVehicleId(@Valid @RequestBody XpVehicleRepairPageQuery query) throws UnsupportedEncodingException {
        PageInfo<XpVehicleRepairMgtVO> pageInfo = xpVehicleRepairService.queryDetectionByVehicleId(query);
        for (XpVehicleRepairVO record : pageInfo.getRecords()) {
        for (XpVehicleRepairMgtVO record : pageInfo.getRecords()) {
            String vehiclePictures = record.getVehiclePictures();
            if (StringUtils.isNotBlank(vehiclePictures)) {
                JSONObject jsonObject = JSONObject.parseObject(vehiclePictures);
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/XpVehicleRepairMgtVO.java
New file
@@ -0,0 +1,84 @@
package com.xiaopeng.maintenance.model.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.xiaopeng.api.model.maintenance.XpVehicleRepair;
import com.xiaopeng.common.core.web.domain.BaseModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
@ApiModel(value = "管理后台-车辆维修返回VO")
public class XpVehicleRepairMgtVO extends BaseModel {
    @ApiModelProperty(value = "ID")
    private Long id;
    @ApiModelProperty(value = "任务id")
    private Long taskId;
    @ApiModelProperty(value = "车辆id")
    private Long vehicleId;
    @ApiModelProperty(value = "开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate startTime;
    @ApiModelProperty(value = "结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate endTime;
    @ApiModelProperty(value = "维修原因")
    private String repairReason;
    @ApiModelProperty(value = "维修前图片")
    private String startRepairPicture;
    @ApiModelProperty(value = "维修费用")
    private Double repairMoney;
    @ApiModelProperty(value = "维修费用明细")
    private String repairMoneyDetail;
    @ApiModelProperty(value = "送修人")
    private Long sendUserId;
    @ApiModelProperty(value = "送修时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime sendTime;
    @ApiModelProperty(value = "取回人")
    private Long returnUserId;
    @ApiModelProperty(value = "取回时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime returnTime;
    @ApiModelProperty(value = "车牌号")
    private String plateNumber;
    @ApiModelProperty(value = "车辆图片")
    private String vehiclePictures;
    @ApiModelProperty(value = "当前模式 1接单 2测试")
    private Integer acceptOrTest;
    @ApiModelProperty(value = "车辆颜色")
    private String vehicleColor;
    @ApiModelProperty(value = "开始操作人")
    private String operatorStartName;
    @ApiModelProperty(value = "结束操作人")
    private String operatorEndName;
    @ApiModelProperty(value = "操作时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime operationTime;
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/model/vo/XpVehicleRepairVO.java
@@ -31,7 +31,7 @@
    private String operatorEndName;
    @ApiModelProperty(value = "操作时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @JsonFormat(pattern = "yyyy年MM月dd日 HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime operationTime;
}
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/IXpVehicleRepairService.java
@@ -6,6 +6,7 @@
import com.xiaopeng.maintenance.dto.XpVehicleRepairReturnDTO;
import com.xiaopeng.maintenance.dto.XpVehicleRepairStartDTO;
import com.xiaopeng.maintenance.model.query.XpVehicleRepairPageQuery;
import com.xiaopeng.maintenance.model.vo.XpVehicleRepairMgtVO;
import com.xiaopeng.maintenance.model.vo.XpVehicleRepairVO;
import com.xiaopeng.maintenance.vo.RepairStatusVO;
@@ -34,7 +35,7 @@
     *
     * @return
     */
    PageInfo<XpVehicleRepairVO> queryDetectionByVehicleId(@Valid XpVehicleRepairPageQuery query);
    PageInfo<XpVehicleRepairMgtVO> queryDetectionByVehicleId(@Valid XpVehicleRepairPageQuery query);
    /**
     * 获取车辆维修状态
xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpVehicleRepairServiceImpl.java
@@ -19,6 +19,7 @@
import com.xiaopeng.maintenance.dto.XpVehicleRepairStartDTO;
import com.xiaopeng.maintenance.mapper.XpVehicleRepairMapper;
import com.xiaopeng.maintenance.model.query.XpVehicleRepairPageQuery;
import com.xiaopeng.maintenance.model.vo.XpVehicleRepairMgtVO;
import com.xiaopeng.maintenance.model.vo.XpVehicleRepairVO;
import com.xiaopeng.maintenance.service.IXpVehicleRepairService;
import com.xiaopeng.maintenance.vo.ChargingStatusVO;
@@ -81,7 +82,7 @@
    }
    @Override
    public PageInfo<XpVehicleRepairVO> queryDetectionByVehicleId(XpVehicleRepairPageQuery query) {
    public PageInfo<XpVehicleRepairMgtVO> queryDetectionByVehicleId(XpVehicleRepairPageQuery query) {
        // 1. 如果有操作人姓名过滤条件,先查询符合条件的用户ID列表
        List<Long> userIds = null;
        if (StringUtils.isNotBlank(query.getSendUserName())) {
@@ -131,7 +132,7 @@
        Page<XpVehicleRepair> resultPage = this.page(page, wrapper);
        // 4. 转换为 VO 并填充操作人姓名
        List<XpVehicleRepairVO> records = new ArrayList<>();
        List<XpVehicleRepairMgtVO> records = new ArrayList<>();
        if (!CollectionUtils.isEmpty(resultPage.getRecords())) {
            // 提取所有操作人ID
            List<Long> allUserIds = resultPage.getRecords().stream()
@@ -155,7 +156,7 @@
            // 转换并填充数据
            for (XpVehicleRepair chargingRecord : resultPage.getRecords()) {
                XpVehicleRepairVO vo = new XpVehicleRepairVO();
                XpVehicleRepairMgtVO vo = new XpVehicleRepairMgtVO();
                BeanUtils.copyProperties(chargingRecord, vo);
                vo.setOperationTime(chargingRecord.getCreateTime());
@@ -168,9 +169,6 @@
                    String userName = userNameMap.get(chargingRecord.getReturnUserId());
                    vo.setOperatorEndName(userName);
                }
                String RepairMoneyDetail = vo.getRepairMoneyDetail();
                if (StringUtils.isNotBlank(RepairMoneyDetail)) {
@@ -213,16 +211,12 @@
                    }
                    vo.setStartRepairPicture(JSONArray.toJSONString(jsonArray));
                }
                records.add(vo);
            }
        }
        // 5. 构建分页结果
        PageInfo<XpVehicleRepairVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        PageInfo<XpVehicleRepairMgtVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        pageInfo.setRecords(records);
        pageInfo.setTotal(resultPage.getTotal());
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/XpCruiseOrderController.java
@@ -1,6 +1,8 @@
package com.xiaopeng.order.controller;
import cn.hutool.core.util.IdUtil;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.xiaopeng.api.dto.automaticPilot.PushOrderDto;
import com.xiaopeng.api.dto.order.AddCruiseMissionDto;
@@ -8,22 +10,29 @@
import com.xiaopeng.api.model.order.XpCruiseOrder;
import com.xiaopeng.api.vo.OrderType;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.utils.WebUtils;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.order.model.exportExcel.XpCruiseOrderExportExcel;
import com.xiaopeng.order.model.exportExcel.XpOrderExportExcel;
import com.xiaopeng.order.model.query.XpCruiseOrderExcelQuery;
import com.xiaopeng.order.model.vo.XpOrderPageVO;
import com.xiaopeng.order.service.IXpCruiseOrderService;
import com.xiaopeng.order.model.query.XpCruiseOrderPageQuery;
import com.xiaopeng.order.model.vo.XpCruiseOrderPageVO;
import com.xiaopeng.order.service.IXpOrderService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.context.annotation.Lazy;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.List;
/**
 * <p>
@@ -46,6 +55,7 @@
    /**
     * 根据车辆VIN码取消订单
     * 发送取消订单XPU报文
     *
     * @param
     */
    @PostMapping("/inner/cruiseOrder/cancelCruiseOrderByVin")
@@ -53,6 +63,7 @@
        Long id = xpCruiseOrderService.cancelCruiseOrderByVin(vin);
        return R.ok(id);
    }
    /**
     * 完成订单
     *
@@ -67,22 +78,24 @@
    /**
     * 根据订单ID查询取消订单
     *
     * @param orderId
     * @return
     */
    @PostMapping("/inner/cruiseOrder/cancelCruiseOrderById")
    public R<?> cancelCruiseOrderById(@RequestParam Long orderId){
    public R<?> cancelCruiseOrderById(@RequestParam Long orderId) {
        return xpCruiseOrderService.cancelCruiseOrderById(orderId);
    }
    /**
     * 查询订单信息
     *
     * @param orderId
     * @return
     */
    @PostMapping("/inner/cruiseOrder/getCruiseOrder")
    public R<XpCruiseOrder> getCruiseOrder(@RequestParam Long orderId){
    public R<XpCruiseOrder> getCruiseOrder(@RequestParam Long orderId) {
        return R.ok(xpCruiseOrderService.getById(orderId));
    }
@@ -132,26 +145,86 @@
    /**
     * 添加巡游任务 下发命令
     *
     * @param
     * @param
     */
    @PostMapping("/inner/cruiseOrder/addCruiseMission")
    public R<?> addCruiseMission(@RequestBody AddCruiseMissionDto dto){
        xpOrderService.addCruiseMission(dto.getVehicle(),dto.getOrder());
    public R<?> addCruiseMission(@RequestBody AddCruiseMissionDto dto) {
        xpOrderService.addCruiseMission(dto.getVehicle(), dto.getOrder());
        return R.ok();
    }
    /**
     * 终止所有没结束或者终止的订单
     *
     * @param vin
     * @return
     */
    @PostMapping("/inner/cruiseOrder/stopAllCruiseOrder")
    public R<?> stopAllCruiseOrder(@RequestParam String vin){
    public R<?> stopAllCruiseOrder(@RequestParam String vin) {
        xpCruiseOrderService.update(new UpdateWrapper<XpCruiseOrder>().eq("vehicleVin", vin)
                .in("status", Arrays.asList(0, 1)).set("status", 2));
        return R.ok();
    }
    /**
     * 巡游订单导出
     *
     * @param query 查询参数
     */
    @ApiOperation(value = "巡游订单导出", tags = {"管理后台-巡游订单"})
    @PostMapping("/api/v1/cruiseOrder/exportExcel")
    public void exportExcel(@RequestBody XpCruiseOrderExcelQuery query) {
        // 1. 查询导出数据
        List<XpCruiseOrderPageVO> dataList = xpCruiseOrderService.getExportList(query);
        // 2. 转换为导出对象
        List<XpCruiseOrderExportExcel> exportList = BeanUtil.copyToList(dataList, XpCruiseOrderExportExcel.class);
        // 3. 生成 Excel
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), XpCruiseOrderExportExcel.class, exportList);
        // 4. 输出到响应流
        HttpServletResponse response = WebUtils.response();
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        ServletOutputStream outputStream = null;
        try {
            String fileName = URLEncoder.encode("巡游订单订单列表.xls", "utf-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName);
            outputStream = response.getOutputStream();
            workbook.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (outputStream != null) {
                    outputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 删除巡游订单
     * @param id
     * @return
     */
    @ApiOperation(value = "删除巡游订单", tags = {"管理后台-巡游订单"})
    @DeleteMapping(value = "/api/v1/cruise-order/deleteById/{id}")
    public R<?> deleteById(@PathVariable Long id){
        xpCruiseOrderService.removeById(id);
        return R.ok();
    }
    @ApiOperation(value = "巡游订单详情", tags = {"管理后台-巡游订单"})
    @GetMapping(value = "/api/v1/cruise-order/getDetailById/{id}")
    public R<XpCruiseOrder> getDetailById(@PathVariable Long id){
        XpCruiseOrder xpCruiseOrder = xpCruiseOrderService.getById(id);
        return R.ok(xpCruiseOrder);
    }
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/model/exportExcel/XpCruiseOrderExportExcel.java
New file
@@ -0,0 +1,42 @@
package com.xiaopeng.order.model.exportExcel;
import cn.afterturn.easypoi.excel.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * 巡游订单导出Excel
 *
 * @author mitao
 */
@Data
public class XpCruiseOrderExportExcel {
    @Excel(name = "订单编号", width = 25)
    private Long id;
    @Excel(name = "下单时间", width = 20, exportFormat = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @Excel(name = "订单来源", width = 15, replace = {"小鹏小程序_1"})
    private String orderSource;
    @Excel(name = "起点", width = 30)
    private String startAddress;
    @Excel(name = "终点", width = 30)
    private String endAddress;
    @Excel(name = "接单车辆", width = 15)
    private String plateNumber;
    @Excel(name = "归属车队", width = 15)
    private String fleetName;
    @Excel(name = "状态", width = 12, replace = {"进行中_1", "已停止_2", "已完成_3"})
    private Integer status;
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/model/query/XpCruiseOrderExcelQuery.java
New file
@@ -0,0 +1,49 @@
package com.xiaopeng.order.model.query;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.xiaopeng.common.core.web.page.BasePage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotNull;
import java.time.LocalDate;
import java.util.List;
/**
 * 巡游订单分页查询请求
 *
 * @author mitao
 */
@Data
@ApiModel(value = "巡游订单导出查询请求", description = "巡游订单导出查询请求")
public class XpCruiseOrderExcelQuery {
    @ApiModelProperty(value = "巡游计划ID", required = true)
    @NotNull(message = "巡游计划ID不能为空")
    private Long missionId;
    @ApiModelProperty(value = "订单ID")
    private Long id;
    @ApiModelProperty(value = "车牌号")
    private String plateNumber;
    @ApiModelProperty(value = "车队ID")
    private Long fleetId;
    @ApiModelProperty(value = "状态 1进行中 2已停止 3 已完成")
    private Integer status;
    @ApiModelProperty(value = "开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate startTime;
    @ApiModelProperty(value = "结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDate endTime;
    @ApiModelProperty(value = "巡游订单ID列表")
    private List<Long> ids;
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/model/vo/XpOrderDetailVO.java
@@ -176,6 +176,9 @@
    @ApiModelProperty(value = "优惠券抵扣金额")
    private BigDecimal couponMoney;
    @ApiModelProperty(value = "里程公里")
    private Double mileageKilometers;
    // ========== 评价信息 ==========
    @ApiModelProperty(value = "订单评分 1-5分")
    private Integer orderRating;
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpCruiseOrderService.java
@@ -1,30 +1,12 @@
package com.xiaopeng.order.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xiaopeng.api.dto.order.GetOrderNumDto;
import com.xiaopeng.api.dto.order.PopOrderDto;
import com.xiaopeng.api.dto.statistics.OrderStatisticsDTO;
import com.xiaopeng.api.dto.statistics.StatisticsQueryDTO;
import com.xiaopeng.api.model.order.XpCruiseOrder;
import com.xiaopeng.api.model.order.XpOrder;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.vo.order.FareBreakdownVo;
import com.xiaopeng.api.vo.order.XpHistoryEndPointsVo;
import com.xiaopeng.api.vo.order.XpHistoryStartPointsVo;
import com.xiaopeng.api.vo.order.XpPointInfoVo;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.order.mangodb.model.OrderTrajectory;
import com.xiaopeng.order.model.dto.XpOrderCommentDto;
import com.xiaopeng.order.model.dto.XpOrderPayDto;
import com.xiaopeng.order.model.query.XpHistoryOrderListQuery;
import com.xiaopeng.order.model.query.XpOrderPageQuery;
import com.xiaopeng.order.model.query.XpCruiseOrderExcelQuery;
import com.xiaopeng.order.model.query.XpCruiseOrderPageQuery;
import com.xiaopeng.order.model.vo.XpCruiseOrderPageVO;
import com.xiaopeng.order.model.vo.XpOrderDetailVO;
import com.xiaopeng.order.model.vo.XpOrderHistoryVO;
import com.xiaopeng.order.model.vo.XpOrderPageVO;
import com.xiaopeng.order.vo.OrderDetailVo;
import java.util.List;
@@ -55,5 +37,11 @@
     */
    PageInfo<XpCruiseOrderPageVO> pageList(XpCruiseOrderPageQuery query);
    /**
     * 巡游订单导出列表
     * @param query
     * @return
     */
    List<XpCruiseOrderPageVO> getExportList(XpCruiseOrderExcelQuery query);
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpCruiseOrderServiceImpl.java
@@ -17,6 +17,7 @@
import com.xiaopeng.common.core.web.domain.BaseModel;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.order.mapper.XpCruiseOrderMapper;
import com.xiaopeng.order.model.query.XpCruiseOrderExcelQuery;
import com.xiaopeng.order.model.query.XpCruiseOrderPageQuery;
import com.xiaopeng.order.model.vo.XpCruiseOrderPageVO;
import com.xiaopeng.order.service.IXpCruiseOrderService;
@@ -224,4 +225,114 @@
        pageInfo.setRecords(voList);
        return pageInfo;
    }
    @Override
    public List<XpCruiseOrderPageVO> getExportList(XpCruiseOrderExcelQuery query) {
        LambdaQueryWrapper<XpCruiseOrder> wrapper = new LambdaQueryWrapper<XpCruiseOrder>()
                .eq(XpCruiseOrder::getMissionId, String.valueOf(query.getMissionId()))
                .like(Objects.nonNull(query.getId()), XpCruiseOrder::getId, query.getId())
                .eq(query.getStatus() != null, XpCruiseOrder::getStatus, query.getStatus())
                .eq(Objects.nonNull(query.getFleetId()), XpCruiseOrder::getFleetId, query.getFleetId());
        if (query.getStartTime() != null) {
            wrapper.ge(BaseModel::getCreateTime, query.getStartTime().atStartOfDay());
        }
        if (query.getEndTime() != null) {
            wrapper.le(BaseModel::getCreateTime, query.getEndTime().plusDays(1).atStartOfDay());
        }
        //使用订单中的车队ID进行查询
        // if (query.getFleetId() != null) {
        //     R<List<Long>> fleetVehicleResult = xpFleetVehicleClient.listVehicleIdsByFleetId(query.getFleetId());
        //     if (fleetVehicleResult == null || CollectionUtils.isEmpty(fleetVehicleResult.getData())) {
        //         pageInfo.setRecords(Collections.emptyList());
        //         return pageInfo;
        //     }
        //     wrapper.in(XpCruiseOrder::getVehicleId, fleetVehicleResult.getData());
        // }
        if (StringUtils.isNotBlank(query.getPlateNumber())) {
            R<List<XpVehicle>> vehicleResult = xpVehicleClient.listByPlateNumber(query.getPlateNumber());
            if (vehicleResult == null || CollectionUtils.isEmpty(vehicleResult.getData())) {
                return Collections.emptyList();
            }
            List<Long> vehicleIds = vehicleResult.getData().stream().map(XpVehicle::getId).collect(Collectors.toList());
            wrapper.in(XpCruiseOrder::getVehicleId, vehicleIds);
        }
        if (!CollectionUtils.isEmpty(query.getIds())) {
            wrapper.in(XpCruiseOrder::getId, query.getIds());
        }
        wrapper.orderByDesc(XpCruiseOrder::getCreateTime);
        List<XpCruiseOrder> resultList = this.list(wrapper);
        if (CollectionUtils.isEmpty(resultList)) {
            return Collections.emptyList();
        }
        Set<Long> vehicleIds = resultList.stream()
                .map(XpCruiseOrder::getVehicleId)
                .filter(Objects::nonNull)
                .collect(Collectors.toSet());
        Map<Long, XpVehicle> vehicleMap;
        if (!vehicleIds.isEmpty()) {
            R<List<XpVehicle>> vehicleResult = xpVehicleClient.listByIds(new ArrayList<>(vehicleIds));
            if (vehicleResult != null && !CollectionUtils.isEmpty(vehicleResult.getData())) {
                vehicleMap = vehicleResult.getData().stream().collect(Collectors.toMap(XpVehicle::getId, v -> v));
            } else {
                vehicleMap = Collections.emptyMap();
            }
        } else {
            vehicleMap = Collections.emptyMap();
        }
        // Map<Long, Long> vehicleFleetIdMap = new HashMap<>();
        // if (!vehicleIds.isEmpty()) {
        //     for (Long vehicleId : vehicleIds) {
        //         R<Long> fleetIdResult = xpFleetVehicleClient.getFleetIdByVehicleId(vehicleId);
        //         if (fleetIdResult != null && fleetIdResult.getData() != null) {
        //             vehicleFleetIdMap.put(vehicleId, fleetIdResult.getData());
        //         }
        //     }
        // }
        // Map<Long, String> fleetNameMap;
        // if (!vehicleFleetIdMap.isEmpty()) {
        //     List<Long> fleetIds = vehicleFleetIdMap.values().stream().distinct().collect(Collectors.toList());
        //     R<List<XpFleet>> fleetResult = xpFleetClient.listByIds(fleetIds);
        //     if (fleetResult != null && !CollectionUtils.isEmpty(fleetResult.getData())) {
        //         fleetNameMap = fleetResult.getData().stream()
        //                 .collect(Collectors.toMap(XpFleet::getId, XpFleet::getFleetName, (a, b) -> a));
        //     } else {
        //         fleetNameMap = Collections.emptyMap();
        //     }
        // } else {
        //     fleetNameMap = Collections.emptyMap();
        // }
        Map<Long, String> fleetNameMap;
        Set<Long> fleetIds = resultList.stream()
                .map(XpCruiseOrder::getFleetId)
                .filter(Objects::nonNull)
                .collect(Collectors.toSet());
        if (!fleetIds.isEmpty()) {
            R<List<XpFleet>> fleetResult = xpFleetClient.listByIds(new ArrayList<>(fleetIds));
            if (fleetResult != null && !CollectionUtils.isEmpty(fleetResult.getData())) {
                fleetNameMap = fleetResult.getData().stream()
                        .collect(Collectors.toMap(XpFleet::getId, XpFleet::getFleetName, (a, b) -> a));
            } else {
                fleetNameMap = Collections.emptyMap();
            }
        } else {
            fleetNameMap = Collections.emptyMap();
        }
        List<XpCruiseOrderPageVO> voList = resultList.stream().map(order -> {
            XpCruiseOrderPageVO vo = new XpCruiseOrderPageVO();
            BeanUtils.copyProperties(order, vo);
            XpVehicle vehicle = vehicleMap.get(order.getVehicleId());
            if (vehicle != null) {
                vo.setPlateNumber(vehicle.getPlateNumber());
            }
            // Long fleetId = vehicleFleetIdMap.get(order.getVehicleId());
            Long fleetId = order.getFleetId();
            if (fleetId != null) {
                vo.setFleetName(fleetNameMap.get(fleetId));
            }
            return vo;
        }).collect(Collectors.toList());
        return voList;
    }
}