liujie
2026-04-24 9e02dfdb98980ab1e6371592481afc396e3b9e47
修改bug
10个文件已修改
174 ■■■■■ 已修改文件
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/query/XpUserCollectAddrListQuery.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/vo/XpAppUserCollectAddrVO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCollectAddrServiceImpl.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/operation/XpPointClientFallbackFactory.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/operation/XpPointClient.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/order/XpPointsListVo.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpPointController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/XpPointService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPointServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpPointMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/query/XpUserCollectAddrListQuery.java
@@ -2,10 +2,16 @@
import com.xiaopeng.common.core.web.page.BasePage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "用户收藏地址列表查询参数")
public class XpUserCollectAddrListQuery extends BasePage {
    @ApiModelProperty(value = "纬度")
    private Double latitude;
    @ApiModelProperty(value = "经度")
    private Double longitude;
}
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/vo/XpAppUserCollectAddrVO.java
@@ -4,6 +4,9 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import com.xiaopeng.api.vo.order.XpPointsListVo;
import java.util.List;
@Data
@ApiModel("用户收藏地址列表")
public class XpAppUserCollectAddrVO {
@@ -31,4 +34,29 @@
    @ApiModelProperty("展示地址。站点收藏展示点位地址,场站收藏展示代表点位地址")
    private String pointAddress;
    // 新增字段
    @ApiModelProperty(value = "区域id")
    private  Long electronicAreaId;
    @ApiModelProperty(value = "停车时长")
    private  Integer time;
    @ApiModelProperty(value = "距离 米")
    private  Double distance;
    @ApiModelProperty(value = "开始时间")
    private  String startTime;
    @ApiModelProperty(value = "结束时间")
    private  String endTime;
    @ApiModelProperty("是否收藏 1是 2否")
    private Integer isCollect=1;
    @ApiModelProperty("场站下面的站点")
    private List<XpPointsListVo> children;
}
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCollectAddrServiceImpl.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.alibaba.fastjson2.JSON;
import com.xiaopeng.account.mapper.XpAppUserCollectAddrMapper;
import com.xiaopeng.account.model.dto.CollectAddrDTO;
import com.xiaopeng.account.model.query.XpUserCollectAddrListQuery;
@@ -15,14 +16,21 @@
import com.xiaopeng.api.model.account.XpAppUserCollectAddr;
import com.xiaopeng.api.model.operation.XpPoint;
import com.xiaopeng.api.model.operation.XpStation;
import com.xiaopeng.api.vo.order.XpPointsListVo;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.exception.ServiceException;
import com.xiaopeng.common.core.web.page.PageInfo;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
/**
@@ -111,21 +119,23 @@
    public Page<XpAppUserCollectAddrVO> userCollectAddrList(XpUserCollectAddrListQuery query, String uid) {
        Page<XpAppUserCollectAddrVO> page = new Page<>(query.getPageNum(), query.getPageSize());
        Page<XpAppUserCollectAddrVO> pageData = this.baseMapper.userCollectAddrPageList(page, query, Long.parseLong(uid));
        Set<Long> collectedPointIds = new HashSet<>(getPointIdsByUserId(Long.parseLong(uid)));
        pageData.getRecords().forEach(xpAppUserCollectAddrVO -> {
            if(xpAppUserCollectAddrVO.getItemType() == 1){
                XpPointExportExcelQuery xpPointExportExcelQuery = new XpPointExportExcelQuery();
                xpPointExportExcelQuery.setPointIds(Arrays.asList(xpAppUserCollectAddrVO.getPointId()));
                List<XpPoint> data = xpPointClient.getByIds(xpPointExportExcelQuery).getData();
                if(null != data && data.size() > 0){
                    xpAppUserCollectAddrVO.setPointName(data.get(0).getPointName());
                    xpAppUserCollectAddrVO.setPointAddress(data.get(0).getPointAddress());
                    fillPointInfo(xpAppUserCollectAddrVO, data.get(0), query);
                }
            }
            if(xpAppUserCollectAddrVO.getItemType() == 2){
                fillCollectPointInfo(xpAppUserCollectAddrVO, query);
                XpStation data = xpStationClient.getXpStationById(xpAppUserCollectAddrVO.getStationId()).getData();
                if(null != data){
                    xpAppUserCollectAddrVO.setPointName(data.getStationName());
                }
                xpAppUserCollectAddrVO.setChildren(buildStationChildren(xpAppUserCollectAddrVO.getStationId(), query, collectedPointIds));
            }
        });
@@ -135,6 +145,92 @@
        return page;
    }
    private List<XpPointsListVo> buildStationChildren(Long stationId, XpUserCollectAddrListQuery query, Set<Long> collectedPointIds) {
        if (stationId == null) {
            return Collections.emptyList();
        }
        R<List<XpPointsListVo>> result = xpPointClient.getStationChildren(stationId);
        List<XpPointsListVo> children = result == null ? Collections.emptyList() : result.getData();
        if (children == null || children.isEmpty()) {
            return Collections.emptyList();
        }
        return children.stream()
                .peek(child -> fillChildInfo(child, query, collectedPointIds))
                .collect(Collectors.toList());
    }
    private void fillChildInfo(XpPointsListVo child, XpUserCollectAddrListQuery query, Set<Long> collectedPointIds) {
        fillChildDistance(child, query);
        if (collectedPointIds.contains(child.getId())) {
            child.setIsCollect(1);
        }
    }
    private void fillChildDistance(XpPointsListVo child, XpUserCollectAddrListQuery query) {
        if (query.getLatitude() == null || query.getLongitude() == null || child.getLatitude() == null || child.getLongitude() == null) {
            return;
        }
        double distance = distanceFast(query.getLatitude(), query.getLongitude(), child.getLatitude(), child.getLongitude());
        child.setDistance(BigDecimal.valueOf(distance).setScale(2, RoundingMode.HALF_UP).doubleValue());
    }
    private void fillCollectPointInfo(XpAppUserCollectAddrVO collectAddrVO, XpUserCollectAddrListQuery query) {
        XpPointExportExcelQuery xpPointExportExcelQuery = new XpPointExportExcelQuery();
        xpPointExportExcelQuery.setPointIds(Arrays.asList(collectAddrVO.getPointId()));
        List<XpPoint> data = xpPointClient.getByIds(xpPointExportExcelQuery).getData();
        if (data == null || data.isEmpty()) {
            return;
        }
        fillPointInfo(collectAddrVO, data.get(0), query);
    }
    private void fillPointInfo(XpAppUserCollectAddrVO collectAddrVO, XpPoint point, XpUserCollectAddrListQuery query) {
        collectAddrVO.setPointName(point.getPointName());
        collectAddrVO.setPointAddress(point.getPointAddress());
        collectAddrVO.setElectronicAreaId(point.getElectronicAreaId());
        collectAddrVO.setTime(point.getParkingTimeLimit());
        fillEffectiveTime(collectAddrVO, point.getEffectiveTimePeriod());
        fillDistance(collectAddrVO, point, query);
    }
    private void fillEffectiveTime(XpAppUserCollectAddrVO collectAddrVO, String effectiveTimePeriod) {
        if (effectiveTimePeriod == null || effectiveTimePeriod.isEmpty()) {
            return;
        }
        List<String> timeRanges;
        try {
            timeRanges = JSON.parseArray(effectiveTimePeriod, String.class);
        } catch (Exception e) {
            return;
        }
        if (timeRanges == null || timeRanges.isEmpty()) {
            return;
        }
        String[] timeRange = timeRanges.get(0).split("-");
        if (timeRange.length != 2) {
            return;
        }
        collectAddrVO.setStartTime(timeRange[0].trim());
        collectAddrVO.setEndTime(timeRange[1].trim());
    }
    private void fillDistance(XpAppUserCollectAddrVO collectAddrVO, XpPoint point, XpUserCollectAddrListQuery query) {
        if (query.getLatitude() == null || query.getLongitude() == null || point.getPointLat() == null || point.getPointLon() == null) {
            return;
        }
        double distance = distanceFast(query.getLatitude(), query.getLongitude(), point.getPointLat(), point.getPointLon());
        collectAddrVO.setDistance(BigDecimal.valueOf(distance).setScale(2, RoundingMode.HALF_UP).doubleValue());
    }
    private double distanceFast(double lat1, double lon1, double lat2, double lon2) {
        double latDistance = Math.toRadians(lat2 - lat1);
        double lonDistance = Math.toRadians(lon2 - lon1);
        double value = Math.sin(latDistance / 2) * Math.sin(latDistance / 2)
                + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2))
                * Math.sin(lonDistance / 2) * Math.sin(lonDistance / 2);
        return 6371000 * 2 * Math.atan2(Math.sqrt(value), Math.sqrt(1 - value));
    }
    @Override
    public List<Long> getPointIdsByUserId(Long uid) {
        return this.list(buildUserCollectQuery(uid)
xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/operation/XpPointClientFallbackFactory.java
@@ -15,6 +15,7 @@
import com.xiaopeng.api.vo.order.XpHistoryEndPointsVo;
import com.xiaopeng.api.vo.order.XpHistoryStartPointsVo;
import com.xiaopeng.api.vo.order.XpPointInfoVo;
import com.xiaopeng.api.vo.order.XpPointsListVo;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.web.page.PageInfo;
import lombok.extern.slf4j.Slf4j;
@@ -111,6 +112,12 @@
            }
            @Override
            public R<List<XpPointsListVo>> getStationChildren(Long stationId) {
                log.error("get station children failed:{}", cause.getMessage());
                return R.ok(Collections.emptyList());
            }
            @Override
            public R<Boolean> nowInTimePoint(Long pointId) {
                log.error("判断点位是在有效期内失败:{}", cause.getMessage());
                return R.fail("判断点位是在有效期内失败");
xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/operation/XpPointClient.java
@@ -14,6 +14,7 @@
import com.xiaopeng.api.query.operation.PointPageListListQuery;
import com.xiaopeng.api.vo.order.XpHistoryEndPointsVo;
import com.xiaopeng.api.vo.order.XpHistoryStartPointsVo;
import com.xiaopeng.api.vo.order.XpPointsListVo;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum;
import com.xiaopeng.common.core.web.page.PageInfo;
@@ -93,6 +94,9 @@
    @PostMapping("/logan/inner/v1/point/getPointsInfo")
    R<List<XpPoint>> getPointsInfo(@RequestBody Set<Long> points);
    @GetMapping("/logan/inner/v1/point/getStationChildren")
    R<List<XpPointsListVo>> getStationChildren(@RequestParam Long stationId);
    /**
     * 判断点位是在有效期内
     *
xp-robotaxi-api/src/main/java/com/xiaopeng/api/vo/order/XpPointsListVo.java
@@ -58,6 +58,9 @@
    @ApiModelProperty("状态 1=可用 0=不可用")
    private Integer state = 1;
    @ApiModelProperty(value = "停车时长")
    private  Integer time;
    @ApiModelProperty("场站子点位列表")
    private List<XpPointsListVo> children;
}
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpPointController.java
@@ -7,6 +7,7 @@
import com.xiaopeng.api.vo.order.XpHistoryEndPointsVo;
import com.xiaopeng.api.vo.order.XpHistoryStartPointsVo;
import com.xiaopeng.api.vo.order.XpPointInfoVo;
import com.xiaopeng.api.vo.order.XpPointsListVo;
import com.xiaopeng.api.vo.order.XpPointsSearchVo;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.web.controller.BaseController;
@@ -94,6 +95,11 @@
        return R.ok(xpPoints);
    }
    @GetMapping("/logan/inner/v1/point/getStationChildren")
    public R<List<XpPointsListVo>> getStationChildren(@RequestParam Long stationId){
        return R.ok(xpPointService.getStationChildren(stationId));
    }
    /**
     * 获取下单最大距离 最小距离
     */
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/XpPointService.java
@@ -8,6 +8,7 @@
import com.xiaopeng.api.query.operation.PointPageListListQuery;
import com.xiaopeng.api.vo.order.XpHistoryEndPointsVo;
import com.xiaopeng.api.vo.order.XpHistoryStartPointsVo;
import com.xiaopeng.api.vo.order.XpPointsListVo;
import com.xiaopeng.api.vo.order.XpPointsSearchVo;
import com.xiaopeng.common.core.web.page.PageInfo;
import com.xiaopeng.operation.dto.NearestDto;
@@ -74,6 +75,8 @@
     */
    XpPointsSearchVo queryPointByName(@Valid PointByNameQuery query,String uid);
    List<XpPointsListVo> getStationChildren(Long stationId);
    /**
     * 获取可下单距离
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpPointServiceImpl.java
@@ -183,7 +183,7 @@
                nearestNextVo.setAddress(xpPoint.getPointAddress());
                nearestNextVo.setTime(xpPoint.getParkingTimeLimit());
                nearestNextVo.setElectronicAreaId(xpPoint.getElectronicAreaId());
                nearestNextVo.setStationId(xpPoint.getStationId().toString());
                nearestNextVo.setStationId(xpPoint.getStationId()==null?null:xpPoint.getStationId().toString());
                // 判断是否收藏
                if(pointIdsByUserId!=null && !pointIdsByUserId.getData().isEmpty()){
@@ -534,6 +534,14 @@
        return searchVo;
    }
    @Override
    public List<XpPointsListVo> getStationChildren(Long stationId) {
        if (stationId == null) {
            return Collections.emptyList();
        }
        return this.baseMapper.queryStationChildren(Arrays.asList(stationId));
    }
    private List<XpPointsListVo> buildStationSearchResults(List<XpPointsListVo> stationList,
                                                           List<XpPointsListVo> stationChildren,
                                                           PointByNameQuery query) {
xp-robotaxi-operation-boot/src/main/resources/mapper/operation/XpPointMapper.xml
@@ -105,6 +105,7 @@
            p.point_address as address,
            p.point_lon as longitude,
            p.point_lat as latitude,
            p.parking_time_limit as time,
            p.station_sort_no as stationSortNo,
            p.effective_period as effectivePeriod,
            p.effective_time_period as effectiveTimePeriod
@@ -147,6 +148,7 @@
            coalesce(dp.point_address, fp.point_address) as address,
            coalesce(s.center_lon, dp.point_lon, fp.point_lon) as longitude,
            coalesce(s.center_lat, dp.point_lat, fp.point_lat) as latitude,
            coalesce(dp.parking_time_limit, fp.parking_time_limit) as time,
            s.effective_period as effectivePeriod,
            s.effective_time_period as effectiveTimePeriod
        from xp_station s
@@ -168,7 +170,7 @@
            limit 1
        )
        where s.is_deleted = 0
          and s.status = 6
          and s.status = 2
          and xefa.is_deleted = 0
          and xefa.area_status = 1
          and s.city_code = #{query.cityCode}
@@ -215,6 +217,7 @@
            p.point_address as address,
            p.point_lon as longitude,
            p.point_lat as latitude,
            p.parking_time_limit as time,
            p.station_sort_no as stationSortNo,
            p.effective_period as effectivePeriod,
            p.effective_time_period as effectiveTimePeriod
@@ -225,7 +228,7 @@
          and p.point_type = 1
          and p.operation_status = 2
          and s.is_deleted = 0
          and s.status = 6
          and s.status = 2
          and xefa.is_deleted = 0
          and xefa.area_status = 1
          and p.station_id in