puzhibing
2026-04-18 90b79ea008ef6bf7a9baac1f34fd81e3fb180d34
新增加客服系统接口
3个文件已添加
3个文件已修改
141 ■■■■■ 已修改文件
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpOrder.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/CustomerServiceController.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/dto/ServiceVehicleListDto.java 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/TrajectoryVo.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/VehicleRangeVo.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/order/XpOrder.java
@@ -221,6 +221,9 @@
    @ApiModelProperty(value = "行程开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime tripBegin;
    @ApiModelProperty(value = "预计到达时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime estimatedArrivalTime;
    @ApiModelProperty(value = "行程结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime tripEnd;
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/controller/CustomerServiceController.java
@@ -1,6 +1,7 @@
package com.xiaopeng.order.controller;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xiaopeng.api.dto.account.UcUserInfo;
import com.xiaopeng.api.dto.vehicleConvoy.ServiceVehicleListDto;
@@ -8,16 +9,18 @@
import com.xiaopeng.api.feignClient.vehicleConvoy.XpVehicleClient;
import com.xiaopeng.api.model.order.XpOrder;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.utils.StringUtils;
import com.xiaopeng.order.dto.UserOrderListDto;
import com.xiaopeng.order.mangodb.model.OrderTrajectory;
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 com.xiaopeng.order.vo.*;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@@ -41,6 +44,9 @@
    @Resource
    private UserResourcesClient userResourcesClient;
    @Resource
    private MongoTemplate mongoTemplate;
    /**
     * 1. 判断 VIN 是否为 robotaxi 车辆
@@ -51,9 +57,6 @@
    @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);
@@ -71,12 +74,9 @@
    @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码不存在");
            return R.ok(new ServiceOrderVo());
        }
        XpOrder one = xpOrderService.getOne(new QueryWrapper<XpOrder>().eq("vehicle_id", xpVehicle.getId())
                .eq("is_deleted", 0).last(" order by create_time desc limit 1"));
@@ -136,9 +136,47 @@
    @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));
    }
    /**
     * 7. 根据订单号查询实际行驶路径
     * @param orderId
     * @return
     */
    @GetMapping("/getOrderHistoryTrajectory/{orderId}")
    @ApiOperation(value = "根据订单号查询实际行驶路径", notes = "客服系统对接")
    @ApiImplicitParam(name = "orderId", value = "订单ID", required = true, dataType = "Long", paramType = "path")
    public R<List<TrajectoryVo>> getOrderHistoryTrajectory(@PathVariable Long orderId){
        List<OrderTrajectory> orderTrajectoryList = mongoTemplate.find(Query.query(Criteria.where("orderId").is(orderId)), OrderTrajectory.class);
        List<TrajectoryVo> collect = orderTrajectoryList.stream().map(trajectory -> {
            String[] split = trajectory.getLocation().split(",");
            TrajectoryVo jsonObject = new TrajectoryVo();
            jsonObject.setLng(Double.parseDouble(split[0]));
            jsonObject.setLat(Double.parseDouble(split[1]));
            return jsonObject;
        }).collect(Collectors.toList());
        return R.ok(collect);
    }
    /**
     * 10. 根据 VIN 查询剩余电量及预估续航
     * @param vin
     * @return
     */
    @GetMapping("/getVehicleRange/{vin}")
    @ApiOperation(value = "根据 VIN 查询剩余电量及预估续航", notes = "客服系统对接")
    @ApiImplicitParam(name = "vin", value = "vin码", required = true, dataType = "string", paramType = "path")
    public R<VehicleRangeVo> getVehicleRange(@PathVariable String vin){
        VehiclePosition vehiclePositions = mongoTemplate.findOne(Query.query(Criteria.where("vin").is(vin)), VehiclePosition.class);
        if(null == vehiclePositions){
            return R.ok(new VehicleRangeVo());
        }
        VehicleRangeVo vo = new VehicleRangeVo();
        vo.setBatteryLevel(vehiclePositions.getCurrentElectricity());
        vo.setEstimatedRange(Double.valueOf(vehiclePositions.getMileageRange()));
        return R.ok(vo);
    }
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/dto/ServiceVehicleListDto.java
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/service/impl/XpOrderServiceImpl.java
@@ -1897,6 +1897,12 @@
            case 6:
                // 行程开始时间
                xpOrder.setTripBegin(LocalDateTime.now());
                //添加预估到达时间
                String cacheObject = redisService.getCacheObject("ORDER_NAVIGATION_END_DATA:" + xpOrder.getAppUserId());
                if(StringUtils.isNotBlank(cacheObject)){
                    RouteVo routeVo = JSONObject.parseObject(cacheObject, RouteVo.class);
                    xpOrder.setEstimatedArrivalTime(LocalDateTime.now().plusSeconds(routeVo.getDuration()));
                }
                redisService.deleteObject("ORDER_NAVIGATION_START_DATA:" + xpOrder.getAppUserId());
                break;
            case 7:
@@ -3847,6 +3853,40 @@
     */
    @Override
    public OrderInfoVo getOrderInfo(Long orderId) {
        return null;
        XpOrder xpOrder = this.getById(orderId);
        OrderInfoVo vo = new OrderInfoVo();
        vo.setOrderId(xpOrder.getId());
        vo.setOrderStatus(xpOrder.getStatus());
        XpPoint startPoint = xpPointClient.queryById(xpOrder.getStartPointId()).getData();
        vo.setPickupAddress(startPoint.getPointAddress());
        XpPoint endPoint = xpPointClient.queryById(xpOrder.getEndPointId()).getData();
        vo.setDestAddress(endPoint.getPointAddress());
        vo.setPullOverAddress(xpOrder.getGetoffAddress());
        if(null != xpOrder.getEstimatedArrivalTime()){
            vo.setEstimatedArrivalTime(xpOrder.getEstimatedArrivalTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        }
        if(null != xpOrder.getGetoffTime()){
            vo.setActualArrivalTime(xpOrder.getGetoffTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        }
        if(null == xpOrder.getMileageKilometers()){
            vo.setActualMileage(BigDecimal.valueOf(xpOrder.getMileageKilometers()));
        }
        vo.setTotalPrice(xpOrder.getOrderMoney());
        vo.setStartPrice(xpOrder.getStartMoney());
        vo.setWaitFee(xpOrder.getWaitMoney());
        vo.setMileageFee(xpOrder.getMileageMoney());
        vo.setDurationFee(xpOrder.getDurationMoney());
        vo.setLongDistanceFee(xpOrder.getLongDistancemoney());
        vo.setCouponDiscount(xpOrder.getCouponMoney());
        vo.setActualPayment(xpOrder.getPayMoney());
        XpVehicle xpVehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
        if(null != xpVehicle){
            vo.setVin(xpVehicle.getVehicleVin());
        }
        XpOrderCancel orderCancel = xpOrderCancelService.getOne(new QueryWrapper<XpOrderCancel>().eq("order_id", orderId));
        if(null != orderCancel){
            vo.setCancelReasonType(orderCancel.getCancelReason());
        }
        return vo;
    }
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/TrajectoryVo.java
New file
@@ -0,0 +1,16 @@
package com.xiaopeng.order.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel
public class TrajectoryVo {
    @ApiModelProperty("经度")
    private Double lng;
    @ApiModelProperty("纬度")
    private Double lat;
}
xp-robotaxi-order-boot/src/main/java/com/xiaopeng/order/vo/VehicleRangeVo.java
New file
@@ -0,0 +1,14 @@
package com.xiaopeng.order.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel
public class VehicleRangeVo {
    @ApiModelProperty("剩余电量百分比(如 90)")
    private Integer batteryLevel;
    @ApiModelProperty("预估续航里程(km,如 450)")
    private Double estimatedRange;
}