feat(api-pull): 完善全悉设备接入并修复 NDR 边界重复采集

- 增加全悉设备 API 日志拉取及消费处理
- 完善全悉日志解析、字段映射和标准化逻辑
- NDR 采集窗口统一采用左闭右开规则
- 对设备秒级查询范围向外取整,并在本地精确过滤
- 区分接口原始返回数和实际接收数,保证分页偏移正确推进
- 补充时间窗口、边界过滤和分页推进测试
- 更新设备 API 拉取及对接说明文档
This commit is contained in:
王绍宏
2026-09-07 18:05:27 +08:00
parent 957f7193a3
commit 0837dd116a
23 changed files with 1337 additions and 36 deletions
@@ -0,0 +1,32 @@
package com.common.util;
/** Explicit opt-in rule action: keep text only within its UTF-8 budget, never truncate or decode. */
public final class BoundedText {
private BoundedText() { }
public static int limit(Object value) {
if (!(value instanceof Number)) throw new IllegalArgumentException("max_utf8_bytes must be an integer");
Number n = (Number) value;
int limit = n.intValue();
if (n.doubleValue() != limit || limit < 1 || limit > 1048576)
throw new IllegalArgumentException("max_utf8_bytes out of range");
return limit;
}
public static String map(Object value, int maxBytes) {
if (!(value instanceof String)) return null;
String text = (String) value;
int bytes = 0;
for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
if (c <= 0x7f) bytes++;
else if (c <= 0x7ff) bytes += 2;
else if (Character.isHighSurrogate(c) && i + 1 < text.length()
&& Character.isLowSurrogate(text.charAt(i + 1))) { bytes += 4; i++; }
else if (Character.isSurrogate(c)) return null;
else bytes += 3;
if (bytes > maxBytes) return null;
}
return text;
}
}