package com.ylx.massage.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.ylx.common.exception.ServiceException; import com.ylx.common.utils.DateUtils; import com.ylx.massage.domain.TGeoFence; import com.ylx.massage.mapper.TGeoFenceMapper; import com.ylx.massage.service.TGeoFenceService; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.List; /** * 地理围栏服务实现类 */ @Service public class TGeoFenceServiceImpl extends ServiceImpl implements TGeoFenceService { private static final BigDecimal MIN_LONGITUDE = new BigDecimal("-180"); private static final BigDecimal MAX_LONGITUDE = new BigDecimal("180"); private static final BigDecimal MIN_LATITUDE = new BigDecimal("-90"); private static final BigDecimal MAX_LATITUDE = new BigDecimal("90"); private static final int RISK_LOW = 1; private static final int RISK_MEDIUM = 2; private static final int RISK_HIGH = 3; private static final int NOT_DELETE = 0; @Override public Page pageGeoFence(Page page, TGeoFence geoFence) { LambdaQueryWrapper queryWrapper = buildQueryWrapper(geoFence); queryWrapper.orderByAsc(TGeoFence::getId); return this.page(page, queryWrapper); } @Override public List listMapGeoFence(TGeoFence geoFence) { LambdaQueryWrapper queryWrapper = buildQueryWrapper(geoFence); queryWrapper.select(TGeoFence::getId, TGeoFence::getCityCode, TGeoFence::getCityName, TGeoFence::getFenceName, TGeoFence::getAddress, TGeoFence::getLongitude, TGeoFence::getLatitude, TGeoFence::getRadiusKm, TGeoFence::getRiskLevel); queryWrapper.isNotNull(TGeoFence::getLongitude) .isNotNull(TGeoFence::getLatitude) .orderByAsc(TGeoFence::getId); return this.list(queryWrapper); } @Override public Boolean addGeoFence(TGeoFence geoFence) { validateGeoFenceParam(geoFence); geoFence.setId(null); geoFence.setIsDelete(NOT_DELETE); geoFence.setCreateTime(DateUtils.getNowDate()); geoFence.setUpdateTime(DateUtils.getNowDate()); boolean saved = this.save(geoFence); if (!saved) { throw new ServiceException("新增围栏失败"); } return true; } @Override public Boolean updateGeoFence(TGeoFence geoFence) { validateUpdateParam(geoFence); TGeoFence exists = this.getById(geoFence.getId()); if (exists == null) { throw new ServiceException("围栏不存在"); } TGeoFence update = new TGeoFence(); update.setId(geoFence.getId()); update.setCityCode(geoFence.getCityCode()); update.setCityName(geoFence.getCityName()); update.setFenceName(geoFence.getFenceName()); update.setFenceIntro(geoFence.getFenceIntro()); update.setAddress(geoFence.getAddress()); update.setLongitude(geoFence.getLongitude()); update.setLatitude(geoFence.getLatitude()); update.setRadiusKm(geoFence.getRadiusKm()); update.setRiskLevel(geoFence.getRiskLevel()); update.setUpdateTime(DateUtils.getNowDate()); boolean updated = this.updateById(update); if (!updated) { throw new ServiceException("编辑围栏失败"); } return true; } @Override public Boolean deleteGeoFence(TGeoFence geoFence) { Long id = getValidId(geoFence); TGeoFence exists = this.getById(id); if (exists == null) { throw new ServiceException("围栏不存在"); } boolean removed = this.removeById(id); if (!removed) { throw new ServiceException("删除围栏失败"); } return true; } private void validateUpdateParam(TGeoFence geoFence) { if (geoFence == null) { throw new ServiceException("参数不能为空"); } if (geoFence.getId() == null || geoFence.getId() <= 0) { throw new ServiceException("围栏ID不能为空"); } validateGeoFenceParam(geoFence); } private Long getValidId(TGeoFence geoFence) { if (geoFence == null) { throw new ServiceException("参数不能为空"); } if (geoFence.getId() == null || geoFence.getId() <= 0) { throw new ServiceException("围栏ID不能为空"); } return geoFence.getId(); } private void validateGeoFenceParam(TGeoFence geoFence) { if (geoFence == null) { throw new ServiceException("参数不能为空"); } if (StringUtils.isBlank(geoFence.getCityCode())) { throw new ServiceException("城市编码不能为空"); } if (StringUtils.isBlank(geoFence.getCityName())) { throw new ServiceException("城市名称不能为空"); } if (StringUtils.isBlank(geoFence.getFenceName())) { throw new ServiceException("围栏名称不能为空"); } if (StringUtils.isBlank(geoFence.getFenceIntro())) { throw new ServiceException("围栏介绍不能为空"); } if (geoFence.getRadiusKm() == null || geoFence.getRadiusKm().compareTo(BigDecimal.ZERO) <= 0) { throw new ServiceException("围栏半径必须大于0"); } if (!isValidRiskLevel(geoFence.getRiskLevel())) { throw new ServiceException("风险等级值不正确"); } validateCoordinate(geoFence.getLongitude(), geoFence.getLatitude()); } private boolean isValidRiskLevel(Integer riskLevel) { return riskLevel != null && (riskLevel == RISK_LOW || riskLevel == RISK_MEDIUM || riskLevel == RISK_HIGH); } private LambdaQueryWrapper buildQueryWrapper(TGeoFence geoFence) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); if (geoFence != null) { queryWrapper.eq(StringUtils.isNotBlank(geoFence.getCityCode()), TGeoFence::getCityCode, geoFence.getCityCode()) .eq(StringUtils.isNotBlank(geoFence.getCityName()), TGeoFence::getCityName, geoFence.getCityName()) .like(StringUtils.isNotBlank(geoFence.getFenceName()), TGeoFence::getFenceName, geoFence.getFenceName()) .like(StringUtils.isNotBlank(geoFence.getAddress()), TGeoFence::getAddress, geoFence.getAddress()); } return queryWrapper; } /** * 验证地理坐标栏中心点坐标是否有效。 * * @param longitude 经度 * @param latitude 纬度 */ private void validateCoordinate(BigDecimal longitude, BigDecimal latitude) { if (longitude == null) { throw new ServiceException("围栏中心点经度不能为空"); } if (latitude == null) { throw new ServiceException("围栏中心点纬度不能为空"); } if (longitude.compareTo(MIN_LONGITUDE) < 0 || longitude.compareTo(MAX_LONGITUDE) > 0) { throw new ServiceException("经度必须在-180到180之间"); } if (latitude.compareTo(MIN_LATITUDE) < 0 || latitude.compareTo(MAX_LATITUDE) > 0) { throw new ServiceException("纬度必须在-90到90之间"); } } }