diff --git a/docs/sql/ivs_camera.sql b/docs/sql/ivs_camera.sql
index 7faa7457..d078f578 100644
--- a/docs/sql/ivs_camera.sql
+++ b/docs/sql/ivs_camera.sql
@@ -26,7 +26,7 @@ CREATE TABLE IF NOT EXISTS `ivs_camera` (
`reserve` varchar(500) DEFAULT NULL COMMENT '预留字段',
`custom_fields` text COMMENT '自定义字段',
`function_type` varchar(255) DEFAULT NULL COMMENT '功能类型',
- `ptz_supported` tinyint DEFAULT NULL COMMENT '云台能力:1支持,0不支持,NULL未知',
+ `capabilities` varchar(1000) DEFAULT NULL COMMENT '功能能力JSON:{"ptz":true,"wiper":true,"position3d":false},缺失键表示未知',
`monitor_direction` varchar(32) DEFAULT NULL COMMENT '监控方向',
`owner_aps_id` varchar(128) DEFAULT NULL COMMENT '所属 APS 编码',
`security_level_code_string` varchar(32) DEFAULT NULL COMMENT '安全等级编码',
diff --git a/src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackUiConfig.java b/src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackUiConfig.java
index 1abf3ea7..85be80df 100644
--- a/src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackUiConfig.java
+++ b/src/main/java/com/inspect/nvr/hik/domain/HikNvrPlaybackUiConfig.java
@@ -6,6 +6,7 @@ import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
+import java.util.Map;
@Data
@Builder
@@ -94,7 +95,11 @@ public class HikNvrPlaybackUiConfig {
/** 设备分组名称。 */
private String group;
- /** 该通道是否支持云台控制,供前端对不可控通道置灰云台面板。 */
- private Boolean ptzSupported;
+ /**
+ * 功能能力,供前端按功能置灰:如 {"ptz":true,"wiper":true,"position3d":false}。
+ *
+ *
键缺失表示未知,前端按可用处理;为 null 表示尚未探测。
+ */
+ private Map capabilities;
}
}
diff --git a/src/main/java/com/inspect/nvr/hik/service/HikNvrDeviceTreeService.java b/src/main/java/com/inspect/nvr/hik/service/HikNvrDeviceTreeService.java
index e087cbf0..c5aca80e 100644
--- a/src/main/java/com/inspect/nvr/hik/service/HikNvrDeviceTreeService.java
+++ b/src/main/java/com/inspect/nvr/hik/service/HikNvrDeviceTreeService.java
@@ -6,6 +6,8 @@ import com.inspect.nvr.ivs.mapper.IvsNvrMapper;
import com.inspect.nvr.ivs.pojo.IvsCamera;
import com.inspect.nvr.ivs.pojo.IvsNvr;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -27,6 +29,8 @@ public class HikNvrDeviceTreeService {
private static final int CHANNEL_CODE_LENGTH = 3;
/** IVS 摄像机没有位置和型号时使用的页面分组名称。 */
private static final String DEFAULT_GROUP = "摄像机";
+ /** 解析能力 JSON 的共享 ObjectMapper,线程安全。 */
+ private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
/** 查询已由定时同步任务写入 ivs_camera 的摄像机记录。 */
@Resource
@@ -161,7 +165,7 @@ public class HikNvrDeviceTreeService {
.nvrName(nvrName)
.name(name)
.group(group)
- .ptzSupported(resolvePtzSupported(camera.getPtzSupported()))
+ .capabilities(parseCapabilities(camera.getCapabilities()))
.build());
}
// 将去重后的有序映射转换为响应列表。
@@ -169,16 +173,24 @@ public class HikNvrDeviceTreeService {
}
/**
- * 把 ivs_camera 中落库的云台能力转换为页面布尔值。
+ * 解析 ivs_camera 中落库的功能能力 JSON,供页面按功能置灰。
*
- * 能力值由人工维护:1 支持、0 不支持、NULL 未知。未知必须按"支持"返回,
- * 否则尚未维护的通道会被整片误置灰。
+ * 解析失败或内容为空一律返回 null(未知),前端按可用处理,避免把能用的按钮误灰。
*
- * @param capability ivs_camera.ptz_supported 落库值
- * @return 支持云台控制返回 true
+ * @param capabilities ivs_camera.capabilities 落库值
+ * @return 能力键值对;无法解析返回 null
*/
- private boolean resolvePtzSupported(Integer capability) {
- return capability == null || capability.intValue() != 0;
+ private Map parseCapabilities(String capabilities) {
+ if (!hasText(capabilities)) {
+ return null;
+ }
+ try {
+ return OBJECT_MAPPER.readValue(capabilities,
+ new TypeReference