yyy
2026-04-22 e032ce14c50d1d7ff769485d83b945754e356674
1.修改场站问题
2.给接口添加查询条件
12个文件已修改
132 ■■■■■ 已修改文件
xp-robotaxi-api/src/main/java/com/xiaopeng/api/query/operation/XpStationQuery.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpPointManagementController.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/XpStationService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpPointServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpStationServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpOpenCityController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/mapper/XpVehicleMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/model/query/VehicleMapQuery.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-vehicle-convoy-boot/src/main/resources/mapper/vehicleConvoy/XpVehicleMapper.xml 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/query/operation/XpStationQuery.java
@@ -14,6 +14,8 @@
    @ApiModelProperty(value = "场站名称编码")
    private String stationNameOrNumber;
    @ApiModelProperty(value = "点位经纬度")
    private String pointLonAndLat;
    @ApiModelProperty(value = "场站状态 0=草稿 1=待启用 2=启用中 3=已停用 4=失效")
    private Integer status;
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpPointManagementController.java
@@ -3,7 +3,9 @@
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.xiaopeng.api.dto.map.XpPointExportExcelQuery;
import com.xiaopeng.api.dto.operation.PointAddDto;
import com.xiaopeng.api.dto.operation.PointUpdateDto;
@@ -72,12 +74,16 @@
    @ApiOperation(value = "获取所有运营中的区域", response = XpElectronicFenceArea.class)
    @PostMapping("/listElectronicFenceArea")
    public R<List<XpElectronicFenceArea>> listElectronicFenceArea(@RequestParam String cityCode) {
    public R<List<XpElectronicFenceArea>> listElectronicFenceArea(@RequestParam(required = false) String cityCode) {
        // 获取所有启用的电子围栏
        List<XpElectronicFence> electronicFences = xpElectronicFenceService.lambdaQuery()
                .eq(XpElectronicFence::getStatus, 2)
                .eq(XpElectronicFence::getCityCode, cityCode)
                .list();
        LambdaQueryChainWrapper<XpElectronicFence> eq = xpElectronicFenceService.lambdaQuery()
                .eq(XpElectronicFence::getStatus, 2);
        if(StrUtil.isNotBlank(cityCode)){
            eq.eq(XpElectronicFence::getCityCode, cityCode);
        }
        List<XpElectronicFence> electronicFences = xpElectronicFenceService.list(eq);
        List<Long> electronicFenceIds = electronicFences.stream().map(XpElectronicFence::getId).collect(Collectors.toList());
        if (electronicFenceIds.isEmpty()) {
            return R.ok(new ArrayList<XpElectronicFenceArea>());
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/XpStationService.java
@@ -26,6 +26,8 @@
    PageInfo<XpStation> pageList(XpStationQuery query);
    boolean isPolygonInPolygon(String innerFencePoints, String outerFencePoints);
    void validate(XpStationVo dto);
    @Transactional
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpPointServiceImpl.java
@@ -57,6 +57,7 @@
import org.redisson.api.RedissonClient;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -104,6 +105,7 @@
    private XpElectronicFenceMapper xpElectronicFenceMapper;
    @Resource
    @Lazy
    private XpStationService xpStationService;
    @Resource
@@ -385,12 +387,12 @@
                        continue;
                    }
                    String downloadUrl ="";
                    try {
                        downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
                        log.info("downloadUrl:{}", downloadUrl);
                    } catch (UnsupportedEncodingException e) {
                        log.error("获取图片下载地址失败", e);
                    }
//                    try { todo 20260422 yyy暂时注释
//                        downloadUrl = aliOssService.getDownloadUrl(jsonObject.getString("id"), jsonObject.getString("name"), true);
//                        log.info("downloadUrl:{}", downloadUrl);
//                    } catch (UnsupportedEncodingException e) {
//                        log.error("获取图片下载地址失败", e);
//                    }
                    jsonObject.put("url", downloadUrl);
                }
                log.info("jsonArray:{}", jsonArray);
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/service/serviceimpl/XpStationServiceImpl.java
@@ -26,6 +26,7 @@
import org.apache.shardingsphere.transaction.annotation.ShardingSphereTransactionType;
import org.apache.shardingsphere.transaction.core.TransactionType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.geo.GeoJsonPolygon;
import org.springframework.data.mongodb.core.query.Criteria;
@@ -65,6 +66,7 @@
    private GDMapGeocodingUtil gdMapGeocodingUtil;
    @Autowired
    private XpRegionMapper xpRegionMapper;
    @Lazy
    @Resource
    private XpPointService xpPointService;
@@ -167,6 +169,7 @@
     * @param outerFencePoints 外部围栏点位字符串(参考围栏),格式为 "lng1_lat1,lng2_lat2,..."
     * @return 是否在内 true在内 false不在
     */
    @Override
    public boolean isPolygonInPolygon(String innerFencePoints, String outerFencePoints) {
        if (innerFencePoints == null || innerFencePoints.trim().isEmpty()
                || outerFencePoints == null || outerFencePoints.trim().isEmpty()) {
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpOpenCityController.java
@@ -47,6 +47,11 @@
        return R.ok(xpOpenCityService.citiesList());
    }
    @ApiOperation(value = "获取开通城市启用列表",tags = {"管理后台-开通城市-获取启用的数据"},response = XpOpenCityVo.class)
    @GetMapping("/api/v1/openCity/findLstEnable")
    public R<XpOpenCityVo> openCityFindList() {
        return R.ok(xpOpenCityService.citiesList());
    }
    /**
     * 获取开通城市列表(管理后台使用)
     * 用于路线规划配置的新增和编辑
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/TaskOrderUtil.java
@@ -130,6 +130,7 @@
    /**
     * 5秒执行一次
     * 播单
     */
    @Scheduled(cron = "0/5 * * * * ?")
    public void taskOrder() {
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/controller/XpVehicleController.java
@@ -863,8 +863,8 @@
            @ApiImplicitParam(name = "orderId", value = "订单ID", required = true, dataTypeClass = Long.class),
            @ApiImplicitParam(name = "orderType", value = "订单类型(1=用户单,2=测试单)", required = true, dataTypeClass = Integer.class)
    })
    public R<List<XpVehicle>> listAvailableVehicles(@RequestParam Long orderId, Integer orderType) {
        List<XpVehicle> list = xpVehicleService.listAvailableVehicles(orderId, orderType);
    public R<List<XpVehicleVO>> listAvailableVehicles(@RequestParam Long orderId, Integer orderType, String plateNumber, String fleetName) {
        List<XpVehicleVO> list = xpVehicleService.listAvailableVehicles(orderId, orderType,plateNumber,fleetName);
        return R.ok(list);
    }
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/mapper/XpVehicleMapper.java
@@ -65,6 +65,8 @@
     */
    List<XpVehicleVO> pageList(@Param("pageInfo") PageInfo<XpVehicleVO> pageInfo, @Param("query") VehicleMapQuery query);
    List<XpVehicleVO> findList(@Param("query") VehicleMapQuery query);
    /**
     * 在库车辆管理分页查询
     *
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/model/query/VehicleMapQuery.java
@@ -14,6 +14,10 @@
    private String plateNumber;
    @ApiModelProperty(value = "运营状态 1运营中 2维修中 3已收车 4车辆异常")
    private String status;
    @ApiModelProperty(value = "运营状态 1运营中 2维修中 3已收车 4车辆异常")
    private Integer operatingStatus;
    @ApiModelProperty(value = "车辆接单状态 1接单中 0空闲")
    private Integer state;
    @ApiModelProperty(value = "围栏id")
    private String electronicId;
@@ -25,4 +29,11 @@
    private Long operationsUserId;
    @ApiModelProperty(value = "车辆id集合 前端忽略")
    private List<Long> vehicleIds;
    @ApiModelProperty(value = "车辆类型 1=在库 2=运营")
    private Integer vehicleType;
    @ApiModelProperty(value = "车队名称")
    private String fleetName;
}
xp-robotaxi-vehicle-convoy-boot/src/main/java/com/xiaopeng/vehicleConvoy/service/impl/XpVehicleServiceImpl.java
@@ -82,7 +82,6 @@
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
@@ -169,7 +168,7 @@
     * @return
     */
    @Override
    public List<XpVehicle> listAvailableVehicles(Long orderId, Integer orderType) {
    public List<XpVehicleVO> listAvailableVehicles(Long orderId, Integer orderType, String plateNumber, String fleetName) {
        // 1. 通过订单ID查询订单信息,获取区域ID
        Long areaId = null;
@@ -212,16 +211,15 @@
        }
        // 3. 根据围栏ID查询车辆列表 (operatingStatus=1 且 state=0)
        LambdaQueryWrapper<XpVehicle> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(XpVehicle::getElectronicId, electronicId)
                .eq(XpVehicle::getOperatingStatus, 1)
                .eq(XpVehicle::getVehicleType, 2)
                .eq(XpVehicle::getState, 0);
        VehicleMapQuery query = new VehicleMapQuery();
        query.setState(0);
        query.setVehicleType(2);
        query.setOperatingStatus(1);
        query.setElectronicId(electronicId.toString());
        query.setFleetName(fleetName);
        query.setPlateNumber(plateNumber);
        // 排序:按电量降序、入库时间降序
        wrapper.orderByDesc(XpVehicle::getCurrentElectricity)
                .orderByDesc(XpVehicle::getWarehousingTime);
        List<XpVehicle> list = this.list(wrapper);
        List<XpVehicleVO> list = baseMapper.findList(query);
        //获取车的位置 和订单的位置 并计算 距离 和 时间
        if(!list.isEmpty()){
            for (XpVehicle xpVehicle : list) {
xp-robotaxi-vehicle-convoy-boot/src/main/resources/mapper/vehicleConvoy/XpVehicleMapper.xml
@@ -96,6 +96,58 @@
        ORDER BY create_time DESC
    </select>
    <select id="findList" resultType="com.xiaopeng.vehicleConvoy.model.vo.XpVehicleVO">
        SELECT a.*
        FROM xp_vehicle as a
        <where> a.is_deleted = 0
            <if test="query.vehicleType != null and query.vehicleType != ''">
                AND a.vehicle_type = #{query.vehicleType}
            </if>
            <if test="query.plateNumber != null and query.plateNumber != ''">
                AND a.plate_number LIKE CONCAT('%', #{query.plateNumber}, '%')
            </if>
            <!-- 运营状态 1运营中 2维修中 3已收车 4车辆异常 -->
            <if test="query.operatingStatus != null and query.operatingStatus != ''">
                AND a.operating_status = #{query.operatingStatus}
            </if>
            <!-- 车辆接单状态 1接单中 0空闲 -->
            <if test="query.state != null and query.state != ''">
                AND a.state = #{query.state}
            </if>
            <if test="query.statusList != null and query.statusList.size()>0">
                AND a.operating_status in
                <foreach item="item" collection="query.statusList" separator="," open="(" close=")">
                    #{item}
                </foreach>
            </if>
            <if test="query.electronicId != null and query.electronicId != ''">
                    AND a.electronic_id #{query.electronicId}
                </if>
            <if test="query.electronicIdList != null and query.electronicIdList.size()>0">
                AND a.electronic_id in
                <foreach item="item" collection="query.electronicIdList" separator="," open="(" close=")">
                    #{item}
                </foreach>
            </if>
            <if test="query.vehicleIds != null and query.vehicleIds.size()>0">
                AND a.id in
                <foreach item="item" collection="query.vehicleIds" separator="," open="(" close=")">
                    #{item}
                </foreach>
            </if>
            <if test="query.fleetName != null and query.fleetName != ''">
                AND EXISTS (
                    SELECT 1 FROM xp_fleet_vehicle xfv
                    LEFT JOIN xp_fleet xf ON xfv.fleet_id = xf.id
                    WHERE xfv.vehicle_id = a.id
                    AND xf.fleet_name LIKE CONCAT('%', #{query.fleetName}, '%')
                )
            </if>
        </where>
        ORDER BY a.current_electricity DESC,a.warehousing_time desc
    </select>
    <!-- 在库车辆管理分页查询条件 -->
    <sql id="Vehicle_Page_Where">
        AND vehicle_type = 1