fix(iot): 修复事件上报处理逻辑,支持 button_event 事件

1. CleanRuleProcessorManager 新增 processEventData() 方法
   - 区分处理属性上报和事件上报
   - 事件上报从 identifier 字段提取事件类型

2. ButtonEventRuleProcessor.parseButtonId() 支持事件上报格式
   - 属性上报:value 直接是按键ID
   - 事件上报:value 是 Map,包含 keyId 和 keyState 字段

Co-Authored-By: Claude (MiniMax-M2.1) <noreply@anthropic.com>
This commit is contained in:
lzh
2026-01-29 21:28:43 +08:00
parent ab1cc2bc62
commit 13c9b6564f
2 changed files with 55 additions and 3 deletions

View File

@@ -62,9 +62,45 @@ public class CleanRuleProcessorManager {
log.debug("[processMessage][设备({}) 处理{}上报,数据数量: {}]",
deviceId, "thing.event.post".equals(method) ? "事件" : "属性", data.size());
// 3. 顺序处理各数据项(与场景规则处理器保持一致)
data.forEach((identifier, value) ->
processDataSafely(deviceId, identifier, value));
// 3. 判断是属性上报还是事件上报
if (IotDeviceMessageMethodEnum.EVENT_POST.getMethod().equals(method)) {
// 事件上报params 结构为 {identifier: "...", eventTime: ..., params: {...}}
processEventData(deviceId, data);
} else {
// 属性上报:直接遍历 key-value
data.forEach((identifier, value) ->
processDataSafely(deviceId, identifier, value));
}
}
/**
* 处理事件上报数据
* <p>
* 事件上报的 params 结构:
* {
* "identifier": "button_event",
* "eventTime": 1234567890,
* "params": { keyId: 1, keyState: 1 }
* }
*/
private void processEventData(Long deviceId, Map<String, Object> data) {
String identifier = (String) data.get("identifier");
if (identifier == null) {
log.warn("[processEventData][设备({}) 事件缺少 identifier]", deviceId);
return;
}
Object params = data.get("params");
log.debug("[processEventData][设备({}) 事件: {}, params: {}]", deviceId, identifier, params);
// 路由到对应处理器
switch (identifier) {
case "button_event" ->
buttonEventRuleProcessor.processPropertyChange(deviceId, identifier, params);
default -> {
// 其他事件忽略
}
}
}
/**

View File

@@ -222,12 +222,28 @@ public class ButtonEventRuleProcessor {
/**
* 解析按键ID
* <p>
* 支持两种格式:
* 1. 属性上报value 直接是按键ID如 1
* 2. 事件上报value 是 Map包含 keyId 字段(如 {keyId: 1, keyState: 1}
*/
@SuppressWarnings("unchecked")
private Integer parseButtonId(Object value) {
if (value == null) {
return null;
}
// 事件上报格式value 是 Map包含 keyId 字段
if (value instanceof Map) {
Map<String, Object> map = (Map<String, Object>) value;
Object keyId = map.get("keyId");
if (keyId instanceof Number) {
return ((Number) keyId).intValue();
}
return null;
}
// 属性上报格式value 直接是按键ID
if (value instanceof Number) {
return ((Number) value).intValue();
}