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