From 5c66a7f02f62ce8f5293a59b467461b0468c4e51 Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期六, 18 四月 2026 17:40:18 +0800
Subject: [PATCH] merge

---
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java                                 |   20 ++
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/vehicleConvoy/ServiceVehicleListDto.java                          |   22 ++
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/dto/UserOrderListDto.java                                    |   26 ++
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java                         |   46 +++++
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/vehicleConvoy/XpVehicleClient.java                        |   10 +
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/CustomerServiceController.java                    |  144 ++++++++++++++++
 xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java      |   20 ++
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java                 |    7 
 xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/IXpVehicleService.java              |   11 +
 xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/vehicleConvoy/XpVehicleClientFallbackFactory.java             |   11 +
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/ServiceOrderVo.java                                       |   26 ++
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/UserOrderListVo.java                                      |   27 +++
 xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java         |   13 +
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/TaskReassignVo.java                           |   15 +
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRuleServiceImpl.java |    8 
 xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java              |   16 
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/ServiceVehicleListVo.java                                 |   15 +
 xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/OrderInfoVo.java                                          |   51 +++++
 18 files changed, 470 insertions(+), 18 deletions(-)

diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/vehicleConvoy/ServiceVehicleListDto.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/vehicleConvoy/ServiceVehicleListDto.java
new file mode 100644
index 0000000..f12e025
--- /dev/null
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/dto/vehicleConvoy/ServiceVehicleListDto.java
@@ -0,0 +1,22 @@
+package com.xiaopeng.api.dto.vehicleConvoy;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel
+public class ServiceVehicleListDto {
+    @ApiModelProperty("车牌号")
+    private String plateNumber;
+    @ApiModelProperty("vim码")
+    private String vim;
+    @ApiModelProperty("页码")
+    @NotNull(message = "页码不能为空")
+    private Integer pageNo;
+    @ApiModelProperty("每页数量")
+    @NotNull(message = "每页数量不能为空")
+    private Integer pageSize;
+}
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/vehicleConvoy/XpVehicleClientFallbackFactory.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/vehicleConvoy/XpVehicleClientFallbackFactory.java
index 845ed86..6eb47e0 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/vehicleConvoy/XpVehicleClientFallbackFactory.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/vehicleConvoy/XpVehicleClientFallbackFactory.java
@@ -1,6 +1,7 @@
 package com.xiaopeng.api.factory.vehicleConvoy;
 
 import com.xiaopeng.api.dto.operation.VehiclePositionByVinDto;
+import com.xiaopeng.api.dto.vehicleConvoy.ServiceVehicleListDto;
 import com.xiaopeng.api.dto.vehicleConvoy.UpdateVehicleStateDto;
 import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
 import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
@@ -12,6 +13,7 @@
 import org.springframework.stereotype.Component;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -105,6 +107,13 @@
             public R<Boolean> getVehicleTrunkOpenStatus(Long uid, Long id) {
                 log.error("获取车辆后备箱开关状态失败,原因: {}", cause.getMessage());
                 return R.fail("获取车辆后备箱开关状态失败:" + cause.getMessage());
-            }};
+            }
+
+            @Override
+            public R<List<XpVehicle>> getServiceVehicleList(ServiceVehicleListDto dto) {
+                log.error("获取服务车辆列表失败,原因: {}", cause.getMessage());
+                return R.fail("获取服务车辆列表失败:" + cause.getMessage());
+            }
+        };
     }
 }
diff --git a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/vehicleConvoy/XpVehicleClient.java b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/vehicleConvoy/XpVehicleClient.java
index fcc42a6..4fddad9 100644
--- a/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/vehicleConvoy/XpVehicleClient.java
+++ b/xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/vehicleConvoy/XpVehicleClient.java
@@ -1,6 +1,7 @@
 package com.xiaopeng.api.feignClient.vehicleConvoy;
 
 import com.xiaopeng.api.dto.operation.VehiclePositionByVinDto;
+import com.xiaopeng.api.dto.vehicleConvoy.ServiceVehicleListDto;
 import com.xiaopeng.api.dto.vehicleConvoy.UpdateVehicleStateDto;
 import com.xiaopeng.api.factory.vehicleConvoy.XpVehicleClientFallbackFactory;
 import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
@@ -134,4 +135,13 @@
     @PostMapping("/logan/inner/vi/vehicle/getVehicleTrunkOpenStatus")
     R<Boolean> getVehicleTrunkOpenStatus(@RequestParam("uid") Long uid, @RequestParam("id") Long id);
 
+
+    /**
+     * 分页获取运营车辆列表
+     * @param dto
+     * @return
+     */
+    @PostMapping("/logan/inner/vehicle/getServiceVehicleList")
+    R<List<XpVehicle>> getServiceVehicleList(@RequestBody ServiceVehicleListDto dto);
+
 }
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java
index 3dca308..c0c942f 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/controller/XpTaskController.java
@@ -30,6 +30,7 @@
 import com.xiaopeng.maintenance.service.XpTaskService;
 import com.xiaopeng.maintenance.vo.TaskCleanDetailVO;
 import com.xiaopeng.maintenance.vo.TaskDetectionDetailVO;
+import com.xiaopeng.maintenance.vo.TaskReassignVo;
 import com.xiaopeng.maintenance.vo.VehicleListVO;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -50,6 +51,8 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+
+import static net.sf.jsqlparser.parser.feature.Feature.comment;
 
 /**
  * <p>
@@ -108,8 +111,8 @@
 
     @ApiOperation(value = "工单改派", tags = "运维APP-任务中心")
     @PostMapping("/maintenance-app/api/v1/task/reassign")
-    public R<?> reassign(@RequestParam("taskId") Long taskId, @RequestParam("comment") String comment) {
-        xpTaskService.reassign(taskId, comment);
+    public R<?> reassign(@RequestBody TaskReassignVo vo) {
+        xpTaskService.reassign(vo.getTaskId(), vo.getComment());
         return R.ok();
     }
 
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRuleServiceImpl.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRuleServiceImpl.java
index 2f90dbf..91a7c34 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRuleServiceImpl.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpCruiseCheckInRuleServiceImpl.java
@@ -92,7 +92,7 @@
                 .eq(XpCruiseCheckInRecord::getDeleted, 0)
                 .eq(XpCruiseCheckInRecord::getCruiseCheckInRuleId, ruleId)
                 .eq(XpCruiseCheckInRecord::getOperationsUserId, uid)
-                .last(" and DATE_FORMAT(check_in_time, '%Y-%m-%d') = DATE_FORMAT(NOW(), '%Y-%m-%d"));
+                .last(" and DATE(check_in_time) = DATE(NOW())"));
         //构建返回结果
         for (XpCruiseCheckInRuleLocation xpCruiseCheckInRuleLocation : list) {
             XpCruiseCheckInRecord xpCruiseCheckInRecord = list1.stream().filter(x -> x.getCheckLocationId().equals(xpCruiseCheckInRuleLocation.getCheckLocationId())).findFirst().orElse(null);
@@ -132,7 +132,7 @@
                 .eq(XpCruiseCheckInRecord::getDeleted, 0)
                 .eq(XpCruiseCheckInRecord::getCheckLocationId, checkLocationId)
                 .eq(XpCruiseCheckInRecord::getOperationsUserId, dto.getOperationsUserId())
-                .last(" and DATE_FORMAT(check_in_time, '%Y-%m-%d') = DATE_FORMAT(NOW(), '%Y-%m-%d')"));
+                .last(" and DATE(check_in_time) = DATE(NOW())"));
         if(null != cruiseCheckInRecord){
             throw new ServiceException("不能重复打卡", I18nKeyConstant.CANNOT_REPEAT_CLOCKING_IN);
         }
@@ -169,7 +169,7 @@
                 .eq(XpCruiseCheckInRecord::getCruiseCheckInRuleId, dto.getId())
                 .eq(XpCruiseCheckInRecord::getDeleted, 0)
                 .eq(XpCruiseCheckInRecord::getOperationsUserId, uid)
-                .last(" and DATE_FORMAT(check_in_time, '%Y-%m-%d') = DATE_FORMAT(NOW(), '%Y-%m-%d') order by check_in_time desc limit 1"));
+                .last(" and DATE(check_in_time) = DATE(NOW()) order by check_in_time desc limit 1"));
         XpCruiseCheckInRuleLocation cruiseCheckInRuleLocation = null;
         //没有打卡的情况,用第一个打卡点位
         if(null == cruiseCheckInRecord){
@@ -232,6 +232,6 @@
                 .eq(XpCruiseCheckInRecord::getCheckLocationId, locationId)
                 .eq(XpCruiseCheckInRecord::getDeleted, 0)
                 .eq(XpCruiseCheckInRecord::getOperationsUserId, uid)
-                .last(" and DATE_FORMAT(check_in_time, '%Y-%m-%d') = DATE_FORMAT(NOW(), '%Y-%m-%d')"));
+                .last(" and DATE(check_in_time) = DATE(NOW())"));
     }
 }
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java
index b2650fd..2416bfe 100644
--- a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/service/impl/XpTaskServiceImpl.java
@@ -68,6 +68,7 @@
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.geo.Point;
 import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
 import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.stereotype.Service;
@@ -1392,7 +1393,7 @@
             throw new ServiceException("未配置车辆事故任务分配规则");
         }
         List<Long> excludedUserIds = Optional.ofNullable(task.getExcluded()).orElse(new ArrayList<>());
-        excludedUserIds.add(Long.valueOf(task.getHandleUserId()));
+        excludedUserIds.addAll(Arrays.asList(task.getHandleUserId().split(",")).stream().map(Long::parseLong).collect(Collectors.toList()));
         task.setExcluded(excludedUserIds);
         Long fleetId = xpFleetVehicleClient.getFleetIdByVehicleId(vehicle.getId()).getData();
         List<Long> roleIds = taskRuleRole.stream().map(XpTaskRuleRole::getRoleId).collect(Collectors.toList());
@@ -1402,7 +1403,9 @@
                 .filter(ids::contains)
                 .filter(id -> !excludedUserIds.contains(id))
                 .map(String::valueOf).collect(Collectors.joining(","));
-        VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vehicle.getVehicleVin())), VehiclePosition.class);
+//        VehiclePosition vehiclePosition = mongoTemplate.findOne(new Query(Criteria.where("vin").is(vehicle.getVehicleVin())), VehiclePosition.class);
+        VehiclePosition vehiclePosition = new VehiclePosition();
+        vehiclePosition.setPoint(new GeoJsonPoint(103.12615621, 30.264561));
         String handlerUser = chooseNearestAvailableOperationsUser(belongUserIds, vehiclePosition);
         task.setHandleUserId(handlerUser);
         if(handlerUser == null) {
@@ -1410,12 +1413,9 @@
             noticeAdministrator(task);//TODO 需要通知管理员手动处理,考虑再AliPushUtil 中给管理员发送消息
         }
         updateById(task);
-        // 存储事故处理日志
-        XpTaskHandleDetail xpTaskHandleDetail = new XpTaskHandleDetail();
-        xpTaskHandleDetail.setTaskId(task.getId());
-        xpTaskHandleDetail.setResponsibleDescription(msg);
-        xpTaskHandleDetailMapper.insert(xpTaskHandleDetail);
-        sendAccidentNotificationAsync(task, vehicle.getPlateNumber(), taskRule.getProcessingTimeLimit());
+        if(StringUtils.isNotBlank(task.getHandleUserId())){
+            sendAccidentNotificationAsync(task, vehicle.getPlateNumber(), taskRule.getProcessingTimeLimit());
+        }
     }
 
 
diff --git a/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/TaskReassignVo.java b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/TaskReassignVo.java
new file mode 100644
index 0000000..50218fa
--- /dev/null
+++ b/xp-robotaxi-maintenance-boot/src/main/java/com/xiaopeng/maintenance/vo/TaskReassignVo.java
@@ -0,0 +1,15 @@
+package com.xiaopeng.maintenance.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel
+public class TaskReassignVo {
+    @ApiModelProperty("任务id")
+    private Long taskId;
+
+    @ApiModelProperty("说明")
+    private String comment;
+}
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/CustomerServiceController.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/CustomerServiceController.java
new file mode 100644
index 0000000..ad80371
--- /dev/null
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/CustomerServiceController.java
@@ -0,0 +1,144 @@
+package com.xiaopeng.order.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.xiaopeng.api.dto.account.UcUserInfo;
+import com.xiaopeng.api.dto.vehicleConvoy.ServiceVehicleListDto;
+import com.xiaopeng.api.feignClient.account.UserResourcesClient;
+import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
+import com.xiaopeng.api.model.order.XpOrder;
+import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
+import com.xiaopeng.common.core.domain.R;
+import com.xiaopeng.common.core.utils.StringUtils;
+import com.xiaopeng.order.dto.UserOrderListDto;
+import com.xiaopeng.order.service.IXpOrderService;
+import com.xiaopeng.order.vo.OrderInfoVo;
+import com.xiaopeng.order.vo.ServiceOrderVo;
+import com.xiaopeng.order.vo.ServiceVehicleListVo;
+import com.xiaopeng.order.vo.UserOrderListVo;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 提供三方客服系统接口
+ */
+@RestController
+@RequestMapping("/logan/rt/customerService")
+public class CustomerServiceController {
+
+    @Resource
+    private XpVehicleClient xpVehicleClient;
+
+    @Resource
+    private IXpOrderService xpOrderService;
+
+    @Resource
+    private UserResourcesClient userResourcesClient;
+
+
+    /**
+     * 1. 判断 VIN 是否为 robotaxi 车辆
+     * @param vim
+     * @return
+     */
+    @GetMapping("/isRobotaxi/{vim}")
+    @ApiOperation(value = "判断 VIN 是否为 robotaxi 车辆", notes = "客服系统对接")
+    @ApiImplicitParam(name = "vim", value = "VIN码", required = true, dataType = "string", paramType = "path")
+    public R<Boolean> isRobotaxi(@PathVariable String vim){
+        if(StringUtils.isEmpty(vim)){
+            return R.fail("VIM码不能为空");
+        }
+        XpVehicle xpVehicle = xpVehicleClient.findByVehicleVin(vim).getData();
+        if(null != xpVehicle){
+            return R.ok(true);
+        }
+        return R.ok(false);
+    }
+
+
+    /**
+     * 2. 根据 VIN 查询在途/最近订单客户手机号
+     * @param vim
+     * @return
+     */
+    @GetMapping("/getServiceOrder/{vim}")
+    @ApiOperation(value = "根据 VIN 查询在途/最近订单客户手机号", notes = "客服系统对接")
+    @ApiImplicitParam(name = "vim", value = "VIN码", required = true, dataType = "string", paramType = "path")
+    public R<ServiceOrderVo> getServiceOrder(@PathVariable String vim){
+        if(StringUtils.isEmpty(vim)){
+            return R.fail("VIM码不能为空");
+        }
+        XpVehicle xpVehicle = xpVehicleClient.findByVehicleVin(vim).getData();
+        if(null == xpVehicle){
+            return R.fail("VIM码不存在");
+        }
+        XpOrder one = xpOrderService.getOne(new QueryWrapper<XpOrder>().eq("vehicle_id", xpVehicle.getId())
+                .eq("is_deleted", 0).last(" order by create_time desc limit 1"));
+        if(null == one){
+            return R.ok(new ServiceOrderVo());
+        }
+        ServiceOrderVo vo = new ServiceOrderVo();
+        vo.setOrderId(one.getId());
+        UcUserInfo ucUserInfo = userResourcesClient.getBaseUserByUid(one.getAppUserId().toString());
+        vo.setCustomerPhone(null != ucUserInfo ? ucUserInfo.getMobile() : null);
+        vo.setHasActiveOrder(!Arrays.asList(0, 8, 9, 10).contains(one.getStatus()));
+        return R.ok(vo);
+    }
+
+
+    /**
+     * 3. 获取当前在运营车辆列表
+     * @param dto
+     * @return
+     */
+    @PostMapping("/getServiceVehicleList")
+    @ApiOperation(value = "获取当前在运营车辆列表", notes = "客服系统对接")
+    public R<List<ServiceVehicleListVo>> getServiceVehicleList(@RequestBody ServiceVehicleListDto dto){
+        R<List<XpVehicle>> serviceVehicleList = xpVehicleClient.getServiceVehicleList(dto);
+        if(serviceVehicleList.getCode() != 200){
+            return R.fail(serviceVehicleList.getMsg());
+        }
+        List<ServiceVehicleListVo> collect = serviceVehicleList.getData().stream().map(xpVehicle -> {
+            ServiceVehicleListVo vo = new ServiceVehicleListVo();
+            vo.setVim(xpVehicle.getVehicleVin());
+            vo.setPlateNumber(xpVehicle.getPlateNumber());
+            return vo;
+        }).collect(Collectors.toList());
+        return R.ok(collect);
+    }
+
+
+    /**
+     * 4. 根据 UID 查询用户是否有 RT 订单 & 订单列表
+     * @param dto
+     * @return
+     */
+    @PostMapping("/getUserOrderList")
+    @ApiOperation(value = "根据 UID 查询用户是否有 RT 订单 & 订单列表", notes = "客服系统对接")
+    public R<List<UserOrderListVo>> getUserOrderList(@RequestBody UserOrderListDto dto){
+        List<UserOrderListVo> userOrderList = xpOrderService.getUserOrderList(dto);
+        return R.ok(userOrderList);
+    }
+
+
+    /**
+     * 5. 根据订单号查询订单详情
+     * @param orderId
+     * @return
+     */
+    @GetMapping("/getOrderDetail/{orderId}")
+    @ApiOperation(value = "根据订单号查询订单详情", notes = "客服系统对接")
+    @ApiImplicitParam(name = "orderId", value = "订单ID", required = true, dataType = "Long", paramType = "path")
+    public R<OrderInfoVo> getOrderDetail(@PathVariable Long orderId){
+        if(null == orderId){
+            return R.fail("订单ID不能为空");
+        }
+        return R.ok(xpOrderService.getOrderInfo(orderId));
+    }
+}
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/dto/UserOrderListDto.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/dto/UserOrderListDto.java
new file mode 100644
index 0000000..83615b3
--- /dev/null
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/dto/UserOrderListDto.java
@@ -0,0 +1,26 @@
+package com.xiaopeng.order.dto;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel
+public class UserOrderListDto {
+    @ApiModelProperty("用户id")
+    @NotNull(message = "用户id不能为空")
+    private Long uid;
+    @ApiModelProperty("订单id")
+    private Long orderId;
+    @ApiModelProperty("订单状态")
+    private Integer orderStatus;
+    @ApiModelProperty("页码")
+    @NotNull(message = "页码不能为空")
+    private Integer pageNo;
+    @ApiModelProperty("每页数量")
+    @NotNull(message = "每页数量不能为空")
+    private Integer pageSize;
+}
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java
index cb4ebe7..0d80091 100644
--- a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/IXpOrderService.java
@@ -14,6 +14,7 @@
 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.dto.UserOrderListDto;
 import com.xiaopeng.order.mangodb.model.OrderTrajectory;
 import com.xiaopeng.order.model.dto.XpOrderCommentDto;
 import com.xiaopeng.order.model.dto.XpOrderPayDto;
@@ -24,6 +25,10 @@
 import com.xiaopeng.order.model.vo.XpOrderHistoryVO;
 import com.xiaopeng.order.model.vo.XpOrderPageVO;
 import com.xiaopeng.order.vo.OrderDetailVo;
+import com.xiaopeng.order.vo.OrderInfoVo;
+import com.xiaopeng.order.vo.UserOrderListVo;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
 
 import java.math.BigDecimal;
 import java.util.List;
@@ -242,4 +247,19 @@
      */
     Integer getWaitPayOrderNum(String uid);
 
+
+    /**
+     * 根据 UID 查询用户是否有 RT 订单 & 订单列表
+     * @param dto
+     * @return
+     */
+    List<UserOrderListVo> getUserOrderList(UserOrderListDto dto);
+
+
+    /**
+     * 获取订单信息
+     * @param orderId
+     * @return
+     */
+    OrderInfoVo getOrderInfo(Long orderId);
 }
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 381eda9..0cbcea9 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
@@ -7,6 +7,7 @@
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.ImmutableMap;
@@ -69,6 +70,7 @@
 import com.xiaopeng.common.security.utils.SecurityUtils;
 import com.xiaopeng.order.constant.I18nKeyConstant;
 import com.xiaopeng.order.dto.MileageDto;
+import com.xiaopeng.order.dto.UserOrderListDto;
 import com.xiaopeng.order.job.base.QuartzManager;
 import com.xiaopeng.order.job.base.TimeJobType;
 import com.xiaopeng.order.job.jobs.*;
@@ -87,6 +89,8 @@
 import com.xiaopeng.order.utils.*;
 import com.xiaopeng.order.utils.holiday.HolidayUtil;
 import com.xiaopeng.order.vo.OrderDetailVo;
+import com.xiaopeng.order.vo.OrderInfoVo;
+import com.xiaopeng.order.vo.UserOrderListVo;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.shardingsphere.transaction.annotation.ShardingSphereTransactionType;
@@ -109,6 +113,7 @@
 import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
 import java.time.*;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadPoolExecutor;
@@ -3803,4 +3808,45 @@
         );
         return num.intValue();
     }
+
+
+    /**
+     * 根据 UID 查询用户是否有 RT 订单 & 订单列表
+     * @param dto
+     * @return
+     */
+    @Override
+    public List<UserOrderListVo> getUserOrderList(UserOrderListDto dto) {
+        List<XpOrder> list = this.list(new QueryWrapper<XpOrder>().eq("app_user_id", dto.getUid())
+                .eq("is_deleted", 0)
+                .eq(dto.getOrderStatus() != null, "status", dto.getOrderStatus())
+                .eq(dto.getOrderId() != null, "id", dto.getOrderId())
+                .last(" order by create_time desc limit " + dto.getPageNo() + "," + dto.getPageSize())
+        );
+        List<UserOrderListVo> collect = list.stream().map(order -> {
+            UserOrderListVo vo = new UserOrderListVo();
+            vo.setOrderId(order.getId());
+            vo.setOrderStatus(order.getStatus());
+            vo.setOrderCreatedAt(order.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+
+            XpPoint startPoint = xpPointClient.queryById(order.getStartPointId()).getData();
+            vo.setPickupAddress(null != startPoint ? startPoint.getPointAddress() : null);
+            XpPoint endPoint = xpPointClient.queryById(order.getEndPointId()).getData();
+            vo.setDestAddress(null != endPoint ? endPoint.getPointAddress() : null);
+            vo.setTotalPrice(order.getOrderMoney());
+            return vo;
+        }).collect(Collectors.toList());
+        return collect;
+    }
+
+
+    /**
+     * 获取订单详情
+     * @param orderId
+     * @return
+     */
+    @Override
+    public OrderInfoVo getOrderInfo(Long orderId) {
+        return null;
+    }
 }
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/OrderInfoVo.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/OrderInfoVo.java
new file mode 100644
index 0000000..80af97a
--- /dev/null
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/OrderInfoVo.java
@@ -0,0 +1,51 @@
+package com.xiaopeng.order.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@ApiModel
+public class OrderInfoVo {
+    @ApiModelProperty("订单id")
+    private Long orderId;
+    @ApiModelProperty("订单状态(0=已取消,1=待接单,2=待出发,3=接驾中,4=待客上车,5=乘客已上车,6=服务中,7=待客下车,8=待付款,9=待评价,10=已完成)")
+    private Integer orderStatus;
+    @ApiModelProperty("预约上车点")
+    private String pickupAddress;
+    @ApiModelProperty("预约目的地")
+    private String destAddress;
+    @ApiModelProperty("靠边停车点")
+    private String pullOverAddress;
+    @ApiModelProperty("预计到达时间")
+    private String estimatedArrivalTime;
+    @ApiModelProperty("实际到达时间")
+    private String actualArrivalTime;
+    @ApiModelProperty("实际行驶里程(浮点数,如 21.1)")
+    private BigDecimal actualMileage;
+    @ApiModelProperty("订单总价")
+    private BigDecimal totalPrice;
+    @ApiModelProperty("起步价")
+    private BigDecimal startPrice;
+    @ApiModelProperty("等待费")
+    private BigDecimal waitFee;
+    @ApiModelProperty("里程费")
+    private BigDecimal mileageFee;
+    @ApiModelProperty("时长费")
+    private BigDecimal durationFee;
+    @ApiModelProperty("远途费")
+    private BigDecimal longDistanceFee;
+    @ApiModelProperty("优惠券使用金额")
+    private BigDecimal couponDiscount;
+    @ApiModelProperty("实际支付费用")
+    private BigDecimal actualPayment;
+    @ApiModelProperty("接单车辆 VIN")
+    private String vin;
+    @ApiModelProperty("接单车辆车牌号")
+    private String plateNumber;
+    @ApiModelProperty("取消原因类型(用户取消/系统取消/超时取消,仅已取消订单)")
+    private String cancelReasonType;
+
+}
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/ServiceOrderVo.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/ServiceOrderVo.java
new file mode 100644
index 0000000..8678116
--- /dev/null
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/ServiceOrderVo.java
@@ -0,0 +1,26 @@
+package com.xiaopeng.order.vo;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel
+public class ServiceOrderVo {
+    /**
+     * 订单id
+     */
+    @ApiModelProperty("订单id")
+    private Long orderId;
+    /**
+     * 客户手机号
+     */
+    @ApiModelProperty("客户手机号")
+    private String customerPhone;
+    /**
+     * 是否有在途订单(布尔值)
+     */
+    @ApiModelProperty("是否有在途订单(布尔值)")
+    private Boolean hasActiveOrder;
+}
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/ServiceVehicleListVo.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/ServiceVehicleListVo.java
new file mode 100644
index 0000000..0b7df7e
--- /dev/null
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/ServiceVehicleListVo.java
@@ -0,0 +1,15 @@
+package com.xiaopeng.order.vo;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel
+public class ServiceVehicleListVo {
+    @ApiModelProperty("vim码")
+    private String vim;
+    @ApiModelProperty("车牌号")
+    private String plateNumber;
+}
diff --git a/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/UserOrderListVo.java b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/UserOrderListVo.java
new file mode 100644
index 0000000..8220e67
--- /dev/null
+++ b/xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/UserOrderListVo.java
@@ -0,0 +1,27 @@
+package com.xiaopeng.order.vo;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@ApiModel
+public class UserOrderListVo {
+    @ApiModelProperty("订单id")
+    private Long orderId;
+    @ApiModelProperty("订单状态(0=已取消,1=待接单,2=待出发,3=接驾中,4=待客上车,5=乘客已上车,6=服务中,7=待客下车,8=待付款,9=待评价,10=已完成)")
+    private Integer orderStatus;
+    @ApiModelProperty("下单时间")
+    private String orderCreatedAt;
+    @ApiModelProperty("预约上车点")
+    private String pickupAddress;
+    @ApiModelProperty("预约目的地")
+    private String destAddress;
+    @ApiModelProperty("到达目的地时间")
+    private String arrivedDestinationAt;
+    @ApiModelProperty("支付金额")
+    private BigDecimal totalPrice;
+}
diff --git a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
index ef7a9b2..16352b9 100644
--- a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
+++ b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
@@ -11,8 +11,10 @@
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.mongodb.client.MongoCollection;
 import com.xiaopeng.api.dto.operation.VehiclePositionByVinDto;
+import com.xiaopeng.api.dto.vehicleConvoy.ServiceVehicleListDto;
 import com.xiaopeng.api.dto.vehicleConvoy.UpdateVehicleStateDto;
 import com.xiaopeng.api.dto.vehicleConvoy.VehicleTemperatureDto;
 import com.xiaopeng.api.feignClient.maintenance.*;
@@ -1097,8 +1099,13 @@
 
 
 
-    public R<String> generateBluetoothUnlockToken(){
-
-        return null;
+    /**
+     * 分页获取运营车辆列表
+     * @param dto
+     * @return
+     */
+    @PostMapping("/logan/inner/vehicle/getServiceVehicleList")
+    public R<List<XpVehicle>> getServiceVehicleList(@RequestBody ServiceVehicleListDto dto){
+        return R.ok(xpVehicleService.getServiceVehicleList(dto));
     }
 }
diff --git a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/IXpVehicleService.java b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/IXpVehicleService.java
index db51536..ee7be12 100644
--- a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/IXpVehicleService.java
+++ b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/IXpVehicleService.java
@@ -1,6 +1,8 @@
 package com.xiaopeng.vehicleConvoy.service;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.xiaopeng.api.dto.vehicleConvoy.ServiceVehicleListDto;
 import com.xiaopeng.api.dto.vehicleConvoy.VehicleTemperatureDto;
 import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
 import com.xiaopeng.common.core.web.page.PageInfo;
@@ -8,6 +10,7 @@
 import com.xiaopeng.vehicleConvoy.model.importExcel.XpVehicleImportExcel;
 import com.xiaopeng.vehicleConvoy.model.query.*;
 import com.xiaopeng.vehicleConvoy.model.vo.XpVehicleVO;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
@@ -198,4 +201,12 @@
      * @return
      */
     Boolean getVehicleTrunkOpenStatus(String uid, Long id);
+
+
+    /**
+     * 分页获取运营车辆列表
+     * @param dto
+     * @return
+     */
+    List<XpVehicle> getServiceVehicleList(ServiceVehicleListDto dto);
 }
diff --git a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java
index 739518c..49d193f 100644
--- a/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java
+++ b/xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java
@@ -5,12 +5,14 @@
 import cn.hutool.core.lang.Validator;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.ImmutableMap;
 import com.xiaopeng.api.dto.pushMessage.SendMessageDTO;
+import com.xiaopeng.api.dto.vehicleConvoy.ServiceVehicleListDto;
 import com.xiaopeng.api.dto.vehicleConvoy.VehicleTemperatureDto;
 import com.xiaopeng.api.feignClient.automaticPilot.XpuVinClient;
 import com.xiaopeng.api.feignClient.map.AdcFencePushClient;
@@ -1114,4 +1116,22 @@
             return false;
         }
     }
+
+
+    /**
+     * 获取服务车辆列表
+     * @param dto
+     * @return
+     */
+    @Override
+    public List<XpVehicle> getServiceVehicleList(ServiceVehicleListDto dto) {
+        List<XpVehicle> list = this.list(new QueryWrapper<XpVehicle>().eq("vehicle_type", 2)
+                .eq("status", 2).eq("operating_status", 1)
+                .eq("is_deleted", 0).like(StringUtils.isNotBlank(dto.getPlateNumber()), "plate_number", dto.getPlateNumber())
+                .like(StringUtils.isNotBlank(dto.getVim()), "vehicle_vin", dto.getVim())
+                .last(" order by create_time desc limit " + dto.getPageNo() + "," + dto.getPageSize())
+        );
+
+        return list;
+    }
 }

--
Gitblit v1.7.1