| | |
| | | public class XpPointServiceImpl extends ServiceImpl<XpPointMapper, XpPoint> implements XpPointService { |
| | | |
| | | private static final String POINT_BIZ_TYPE = "PUD"; |
| | | private static final int MAX_POINTS_PER_FENCE = 15; |
| | | private static final int SERIAL_WIDTH = 6; |
| | | private static final int LOCK_WAIT_SECONDS = 5; |
| | | private static final int LOCK_LEASE_SECONDS = 30; |
| | |
| | | if (!locked) { |
| | | throw new ServiceException("点位编号生成繁忙,请稍后重试", I18nKeyConstant.POINT_NUMBER_LOCK_FAIL); |
| | | } |
| | | validateFencePointCountLimit(pointAddDto.getElectronicAreaId()); |
| | | String maxPointNumber = this.baseMapper.selectMaxPointNumber(cityPrefix, POINT_BIZ_TYPE); |
| | | int nextSerial = 1; |
| | | if (StringUtils.hasText(maxPointNumber)) { |
| | |
| | | return getPinyinInitials(prefix).toUpperCase(); |
| | | } |
| | | |
| | | private void validateFencePointCountLimit(Long electronicAreaId) { |
| | | if (electronicAreaId == null || electronicAreaId == 0L) { |
| | | return; |
| | | } |
| | | XpElectronicFenceArea currentArea = xpElectronicFenceAreaService.getById(electronicAreaId); |
| | | if (currentArea == null) { |
| | | throw new ServiceException("运营区域不存在", I18nKeyConstant.POINT_ELECTRONIC_AREA_NOT_EXIST); |
| | | } |
| | | Long fenceId = currentArea.getElectronicId(); |
| | | if (fenceId == null) { |
| | | throw new ServiceException("运营区域不存在", I18nKeyConstant.POINT_ELECTRONIC_AREA_NOT_EXIST); |
| | | } |
| | | List<Long> areaIds = xpElectronicFenceAreaService.lambdaQuery() |
| | | .eq(XpElectronicFenceArea::getElectronicId, fenceId) |
| | | .list() |
| | | .stream() |
| | | .map(XpElectronicFenceArea::getId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toList()); |
| | | if (areaIds.isEmpty()) { |
| | | return; |
| | | } |
| | | long pointCount = this.lambdaQuery() |
| | | .in(XpPoint::getElectronicAreaId, areaIds) |
| | | .count(); |
| | | if (pointCount >= MAX_POINTS_PER_FENCE) { |
| | | throw new ServiceException("当前围栏最多只能添加15个点位", I18nKeyConstant.POINT_FENCE_POINT_LIMIT_EXCEEDED); |
| | | } |
| | | } |
| | | |
| | | private static String buildPointNumberLockKey(String cityPrefix, String bizType) { |
| | | return "xp:point:number:" + cityPrefix + ":" + bizType; |
| | | } |