package com.xiaopeng.account.service.impl; 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.xiaopeng.account.mapper.XpAppUserCollectAddrMapper; import com.xiaopeng.account.model.dto.CollectAddrDTO; import com.xiaopeng.account.model.query.XpUserCollectAddrListQuery; import com.xiaopeng.account.model.vo.CollectAddrTargetVO; import com.xiaopeng.account.model.vo.XpAppUserCollectAddrVO; import com.xiaopeng.account.service.IXpAppUserCollectAddrService; import com.xiaopeng.api.dto.map.XpPointExportExcelQuery; import com.xiaopeng.api.feignClient.map.XpStationClient; import com.xiaopeng.api.feignClient.operation.XpPointClient; import com.xiaopeng.api.model.account.XpAppUserCollectAddr; import com.xiaopeng.api.model.operation.XpPoint; import com.xiaopeng.api.model.operation.XpStation; 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.util.Arrays; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; /** *

* 用户收藏地址 服务实现类 *

* * @author ck * @since 2026-04-10 */ @Service public class XpAppUserCollectAddrServiceImpl extends ServiceImpl implements IXpAppUserCollectAddrService { private static final int COLLECT_TYPE_ADD = 1; private static final int COLLECT_TYPE_CANCEL = 2; private static final int ITEM_TYPE_POINT = 1; private static final int ITEM_TYPE_STATION = 2; private static final int COLLECT_LIMIT = 50; @Resource private XpPointClient xpPointClient; @Resource private XpStationClient xpStationClient; /** * 收藏地址。 * 收藏表显式保存 item_type / station_id: * 1. 站点收藏:item_type=1,point_id 保存站点自身。 * 2. 场站收藏:item_type=2,station_id 保存场站id,point_id 保存代表点位id。 * 这样取消收藏、列表回显和后续扩展都不需要再做隐式推断。 */ @Override public Boolean collectAddr(CollectAddrDTO dto, String uid) { Long userId = Long.parseLong(uid); if(dto.getItemType() == 1){//收藏对象类型 1=站点 2=场站,不传时默认按站点处理 if(dto.getLatitude() == null || dto.getLongitude() == null){ throw new ServiceException("经度、纬度不能为空"); } XpPointExportExcelQuery xpPointExportExcelQuery = new XpPointExportExcelQuery(); xpPointExportExcelQuery.setPointIds(Arrays.asList(dto.getPointId())); List data = xpPointClient.getByIds(xpPointExportExcelQuery).getData(); if(null == data || data.size() == 0){ throw new ServiceException("站点不存在"); } } if(dto.getItemType() == 2){ XpStation data = xpStationClient.getXpStationById(dto.getStationId()).getData(); if(null == data){ throw new ServiceException("场站不存在"); } } if(1 == dto.getType()){ XpAppUserCollectAddr collectAddr = new XpAppUserCollectAddr(); collectAddr.setAppUserId(userId); collectAddr.setItemType(dto.getItemType()); collectAddr.setPointId(dto.getPointId()); collectAddr.setStationId(dto.getStationId()); collectAddr.setLongitude(dto.getLongitude()); collectAddr.setLatitude(dto.getLatitude()); return this.save(collectAddr); }else{ if(dto.getItemType() == 1){ return this.remove(new LambdaQueryWrapper().eq(XpAppUserCollectAddr::getAppUserId, userId) .eq(XpAppUserCollectAddr::getPointId, dto.getPointId())); } if(dto.getItemType() == 2){ return this.remove(new LambdaQueryWrapper().eq(XpAppUserCollectAddr::getAppUserId, userId) .eq(XpAppUserCollectAddr::getStationId, dto.getStationId())); } } return false; } /** * 收藏地址列表。 * 列表查询直接联表回显,场站/站点通过 item_type 直接区分。 */ @Override public Page userCollectAddrList(XpUserCollectAddrListQuery query, String uid) { Page page = new Page<>(query.getPageNum(), query.getPageSize()); Page pageData = this.baseMapper.userCollectAddrPageList(page, query, Long.parseLong(uid)); pageData.getRecords().forEach(xpAppUserCollectAddrVO -> { if(xpAppUserCollectAddrVO.getItemType() == 1){ XpPointExportExcelQuery xpPointExportExcelQuery = new XpPointExportExcelQuery(); xpPointExportExcelQuery.setPointIds(Arrays.asList(xpAppUserCollectAddrVO.getPointId())); List data = xpPointClient.getByIds(xpPointExportExcelQuery).getData(); if(null != data && data.size() > 0){ xpAppUserCollectAddrVO.setPointName(data.get(0).getPointName()); xpAppUserCollectAddrVO.setPointAddress(data.get(0).getPointAddress()); } } if(xpAppUserCollectAddrVO.getItemType() == 2){ XpStation data = xpStationClient.getXpStationById(xpAppUserCollectAddrVO.getStationId()).getData(); if(null != data){ xpAppUserCollectAddrVO.setPointName(data.getStationName()); } } }); page.setTotal(pageData.getTotal()); page.setRecords(pageData.getRecords()); return page; } @Override public List getPointIdsByUserId(Long uid) { return this.list(buildUserCollectQuery(uid) .eq(XpAppUserCollectAddr::getItemType, ITEM_TYPE_POINT)) .stream() .map(XpAppUserCollectAddr::getPointId) .filter(Objects::nonNull) .distinct() .collect(Collectors.toList()); } @Override public List getStationIdsByUserId(Long uid) { return this.list(buildUserCollectQuery(uid) .eq(XpAppUserCollectAddr::getItemType, ITEM_TYPE_STATION)) .stream() .map(XpAppUserCollectAddr::getStationId) .filter(Objects::nonNull) .distinct() .collect(Collectors.toList()); } private LambdaQueryWrapper buildUserCollectQuery(Long uid) { return new LambdaQueryWrapper() .eq(XpAppUserCollectAddr::getAppUserId, uid) .eq(XpAppUserCollectAddr::getDeleted, 0); } }