diff --git a/src/main/java/com/genersoft/iot/vmp/streamProxy/service/impl/StreamProxyServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/streamProxy/service/impl/StreamProxyServiceImpl.java index 854a43a5c..afc9b7b2b 100755 --- a/src/main/java/com/genersoft/iot/vmp/streamProxy/service/impl/StreamProxyServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/streamProxy/service/impl/StreamProxyServiceImpl.java @@ -29,6 +29,7 @@ import com.github.pagehelper.PageInfo; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.event.EventListener; +import org.springframework.dao.DuplicateKeyException; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @@ -41,6 +42,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.UUID; /** * 视频代理业务 @@ -73,6 +75,15 @@ public class StreamProxyServiceImpl implements IStreamProxyService { @Autowired TransactionDefinition transactionDefinition; + /** + * 生成唯一的 camera_code + * 格式:cam_xxxxxxxxxxxx(12位随机字符) + * @return 唯一的 camera_code + */ + private String generateCameraCode() { + return "cam_" + UUID.randomUUID().toString().replace("-", "").substring(0, 12); + } + /** * 流到来的处理 */ @@ -143,14 +154,33 @@ public class StreamProxyServiceImpl implements IStreamProxyService { if (streamProxyInDb != null) { throw new ControllerException(ErrorCode.ERROR100.getCode(), "APP+STREAM已经存在"); } - if (streamProxy.getGbDeviceId() != null) { - gbChannelService.add(streamProxy.buildCommonGBChannel()); + + // 自动生成 camera_code(最多重试3次避免冲突) + int retryCount = 0; + while (retryCount < 3) { + String cameraCode = generateCameraCode(); + streamProxy.setCameraCode(cameraCode); + // 强制设置 app = camera_code(确保 ZLM URL 纯 ASCII) + streamProxy.setApp(cameraCode); + + streamProxy.setCreateTime(DateUtil.getNow()); + streamProxy.setUpdateTime(DateUtil.getNow()); + + try { + if (streamProxy.getGbDeviceId() != null) { + gbChannelService.add(streamProxy.buildCommonGBChannel()); + } + streamProxyMapper.add(streamProxy); + streamProxy.setDataType(ChannelDataType.STREAM_PROXY); + streamProxy.setDataDeviceId(streamProxy.getId()); + return; + } catch (DuplicateKeyException e) { + retryCount++; + if (retryCount >= 3) { + throw new RuntimeException("生成 camera_code 失败,请重试"); + } + } } - streamProxy.setCreateTime(DateUtil.getNow()); - streamProxy.setUpdateTime(DateUtil.getNow()); - streamProxyMapper.add(streamProxy); - streamProxy.setDataType(ChannelDataType.STREAM_PROXY); - streamProxy.setDataDeviceId(streamProxy.getId()); } @Override @@ -380,4 +410,12 @@ public class StreamProxyServiceImpl implements IStreamProxyService { return streamProxyMapper.select(id); } + @Override + public StreamProxy getStreamProxyByCameraCode(String cameraCode) { + if (ObjectUtils.isEmpty(cameraCode)) { + return null; + } + return streamProxyMapper.selectByCameraCode(cameraCode); + } + }