You've already forked FrameTour-BE
feat(printer):优化人脸样本使用逻辑并增强景区列表查询
- 修改 useSample 接口返回类型为 FaceRecognizeResp - 增加根据样本ID和类型查询来源实体的逻辑 - 在景区列表查询中添加参数校验和异常处理 - 完善景区信息处理流程,增加设备数量统计 -优化景区距离计算与筛选逻辑 - 增加人脸匹配后自动添加照片到用户相册的功能 - 添加 XML 映射文件中新的查询语句实现
This commit is contained in:
@@ -220,58 +220,98 @@ public class AppScenicServiceImpl implements AppScenicService {
|
||||
|
||||
@Override
|
||||
public List<ScenicAppVO> scenicListByLnLa(ScenicIndexVO scenicIndexVO) {
|
||||
// 参数校验
|
||||
if (scenicIndexVO == null) {
|
||||
log.warn("scenicListByLnLa 接收到空参数");
|
||||
return Collections.emptyList();
|
||||
}
|
||||
if (scenicIndexVO.getLatitude() == null || scenicIndexVO.getLongitude() == null) {
|
||||
log.warn("scenicListByLnLa 缺少必要的经纬度参数, latitude={}, longitude={}",
|
||||
scenicIndexVO.getLatitude(), scenicIndexVO.getLongitude());
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
// 从 scenicRepository 获取所有景区(1000个)
|
||||
ScenicReqQuery query = new ScenicReqQuery();
|
||||
query.setPageNum(1);
|
||||
query.setPageSize(1000);
|
||||
List<ScenicV2DTO> scenicList = scenicRepository.list(query);
|
||||
|
||||
|
||||
if (scenicList == null || scenicList.isEmpty()) {
|
||||
log.info("未查询到任何景区数据");
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
List<ScenicAppVO> list = new ArrayList<>();
|
||||
|
||||
|
||||
// 为每个景区获取详细信息(包含经纬度)
|
||||
for (ScenicV2DTO scenicDTO : scenicList) {
|
||||
try {
|
||||
// ID 格式校验
|
||||
if (StringUtils.isBlank(scenicDTO.getId())) {
|
||||
log.warn("景区 ID 为空,跳过该景区");
|
||||
continue;
|
||||
}
|
||||
|
||||
// 获取景区详细信息(包含经纬度)
|
||||
ScenicEntity scenicEntity = scenicRepository.getScenic(Long.parseLong(scenicDTO.getId()));
|
||||
if (scenicEntity != null && scenicEntity.getLatitude() != null && scenicEntity.getLongitude() != null) {
|
||||
// 计算距离
|
||||
BigDecimal distance = calculateDistance(
|
||||
scenicIndexVO.getLatitude(),
|
||||
scenicIndexVO.getLongitude(),
|
||||
scenicEntity.getLatitude(),
|
||||
scenicEntity.getLongitude()
|
||||
);
|
||||
|
||||
// 根据距离和范围筛选景区
|
||||
if (scenicEntity.getRadius() != null &&
|
||||
distance.compareTo(scenicEntity.getRadius().multiply(BigDecimal.valueOf(1_000L))) < 0) {
|
||||
|
||||
// 转换为 ScenicAppVO
|
||||
ScenicAppVO scenicAppVO = new ScenicAppVO();
|
||||
scenicAppVO.setId(scenicEntity.getId());
|
||||
scenicAppVO.setName(scenicEntity.getName());
|
||||
scenicAppVO.setPhone(scenicEntity.getPhone());
|
||||
scenicAppVO.setIntroduction(scenicEntity.getIntroduction());
|
||||
scenicAppVO.setCoverUrl(scenicEntity.getCoverUrl());
|
||||
scenicAppVO.setLongitude(scenicEntity.getLongitude());
|
||||
scenicAppVO.setLatitude(scenicEntity.getLatitude());
|
||||
scenicAppVO.setRadius(scenicEntity.getRadius());
|
||||
scenicAppVO.setProvince(scenicEntity.getProvince());
|
||||
scenicAppVO.setCity(scenicEntity.getCity());
|
||||
scenicAppVO.setArea(scenicEntity.getArea());
|
||||
scenicAppVO.setAddress(scenicEntity.getAddress());
|
||||
scenicAppVO.setDistance(distance);
|
||||
scenicAppVO.setDeviceNum(deviceRepository.getAllDeviceByScenicId(scenicEntity.getId()).size());
|
||||
|
||||
list.add(scenicAppVO);
|
||||
}
|
||||
if (scenicEntity == null) {
|
||||
log.warn("景区详情查询失败, scenicId={}", scenicDTO.getId());
|
||||
continue;
|
||||
}
|
||||
|
||||
if (scenicEntity.getLatitude() == null || scenicEntity.getLongitude() == null) {
|
||||
log.warn("景区缺少经纬度信息, scenicId={}, scenicName={}",
|
||||
scenicEntity.getId(), scenicEntity.getName());
|
||||
continue;
|
||||
}
|
||||
|
||||
// 计算距离
|
||||
BigDecimal distance = calculateDistance(
|
||||
scenicIndexVO.getLatitude(),
|
||||
scenicIndexVO.getLongitude(),
|
||||
scenicEntity.getLatitude(),
|
||||
scenicEntity.getLongitude()
|
||||
);
|
||||
|
||||
// 根据距离和范围筛选景区
|
||||
if (scenicEntity.getRadius() != null &&
|
||||
distance.compareTo(scenicEntity.getRadius().multiply(BigDecimal.valueOf(1_000L))) < 0) {
|
||||
|
||||
// 转换为 ScenicAppVO
|
||||
ScenicAppVO scenicAppVO = new ScenicAppVO();
|
||||
scenicAppVO.setId(scenicEntity.getId());
|
||||
scenicAppVO.setName(scenicEntity.getName());
|
||||
scenicAppVO.setPhone(scenicEntity.getPhone());
|
||||
scenicAppVO.setIntroduction(scenicEntity.getIntroduction());
|
||||
scenicAppVO.setCoverUrl(scenicEntity.getCoverUrl());
|
||||
scenicAppVO.setLongitude(scenicEntity.getLongitude());
|
||||
scenicAppVO.setLatitude(scenicEntity.getLatitude());
|
||||
scenicAppVO.setRadius(scenicEntity.getRadius());
|
||||
scenicAppVO.setProvince(scenicEntity.getProvince());
|
||||
scenicAppVO.setCity(scenicEntity.getCity());
|
||||
scenicAppVO.setArea(scenicEntity.getArea());
|
||||
scenicAppVO.setAddress(scenicEntity.getAddress());
|
||||
scenicAppVO.setDistance(distance);
|
||||
|
||||
// 获取设备数量
|
||||
List<DeviceV2DTO> devices = deviceRepository.getAllDeviceByScenicId(scenicEntity.getId());
|
||||
scenicAppVO.setDeviceNum(devices != null ? devices.size() : 0);
|
||||
|
||||
list.add(scenicAppVO);
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
log.error("景区 ID 格式错误,无法转换为 Long 类型, scenicId={}, error={}",
|
||||
scenicDTO.getId(), e.getMessage());
|
||||
} catch (Exception e) {
|
||||
// 单个景区获取失败,继续处理下一个
|
||||
continue;
|
||||
log.error("处理景区信息时发生异常, scenicId={}, error={}",
|
||||
scenicDTO != null ? scenicDTO.getId() : "unknown", e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
log.info("根据经纬度筛选景区完成, 输入坐标=({}, {}), 符合条件的景区数量={}",
|
||||
scenicIndexVO.getLatitude(), scenicIndexVO.getLongitude(), list.size());
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user