From 3792a306166f71b944e10682264e93d0062154fc Mon Sep 17 00:00:00 2001 From: 16337 <1633794139@qq.com> Date: Fri, 13 Feb 2026 11:02:12 +0800 Subject: [PATCH] =?UTF-8?q?feat(streamProxy):=20=E5=AE=9E=E7=8E=B0camera?= =?UTF-8?q?=5Fcode=E8=87=AA=E5=8A=A8=E7=94=9F=E6=88=90=E5=92=8C=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 核心变更: 1. 新增 generateCameraCode() 方法:生成格式为 cam_xxxxxxxxxxxx 的唯一编码 2. 修改 add() 方法: - 自动生成 camera_code 并设置 app = camera_code - 实现重试机制(最多3次)处理唯一键冲突 - 确保 ZLM URL 路径为纯 ASCII,避免中文编码问题 3. 实现 getStreamProxyByCameraCode() 方法:根据 camera_code 查询代理对象 技术细节: - 添加 UUID 和 DuplicateKeyException 依赖 - 使用事务确保数据一致性 - 空值检查防止空指针异常 Co-Authored-By: Claude Opus 4.6 --- .../service/impl/StreamProxyServiceImpl.java | 52 ++++++++++++++++--- 1 file changed, 45 insertions(+), 7 deletions(-) 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); + } + }