fix(es): 电量消息 createTime range 改发 epoch 毫秒

electricitymessage 索引 createTime 是 date 类型
(format strict_date_optional_time||epoch_millis),yyyy-MM-dd HH:mm:ss
字符串会被 400 拒绝;对齐老系统 DateUtils.parseDate 转 Date 后由
transport 序列化为 epoch 毫秒的口径。
This commit is contained in:
my_local_kimi_dev2
2026-09-22 11:30:46 +08:00
parent 7613499dfb
commit d87a8752a1
2 changed files with 13 additions and 7 deletions
@@ -54,9 +54,11 @@ public class ElectricityMessageEsGatewayImpl implements ElectricityMessageEsGate
if (messageType != null) {
filters.addObject().putObject("term").putObject("messageType").put("value", messageType);
}
// 老代码 rangeQuery from(start,true).to(end,true),闭区间
// createTime 在索引里是 date 类型(format strict_date_optional_time||epoch_millis),
// 老系统经 DateUtils.parseDate 转 Date 后由 transport 序列化为 epoch 毫秒——
// 直接把 yyyy-MM-dd HH:mm:ss 字符串发过去会被 400 拒绝(format 不接受空格分隔)
ObjectNode range = filters.addObject().putObject("range").putObject("createTime");
range.put("gte", startTime).put("lte", endTime);
range.put("gte", toEpochMillis(startTime)).put("lte", toEpochMillis(endTime));
ObjectNode body = mapper.createObjectNode();
body.put("from", from).put("size", size);
@@ -86,9 +88,13 @@ public class ElectricityMessageEsGatewayImpl implements ElectricityMessageEsGate
}
}
private long toEpochMillis(String timeText) {
return TIME_FORMATTER.parse(timeText, Instant::from).toEpochMilli();
}
/**
* createTime 在索引里可能是 yyyy-MM-dd HH:mm:ss 文本(老 range 直接传字符串可证 ES 接受该格式),
* 也可能是 epoch 毫秒数;两种形态都归一为 yyyy-MM-dd HH:mm:ss 文本输出。
* createTime 在索引里是 date 类型,_source 里可能是 ISO 文本也可能是 epoch 毫秒数;
* 两种形态都归一为 Asia/Shanghai yyyy-MM-dd HH:mm:ss 文本输出。
*/
private static String createTimeText(JsonNode value) {
if (value == null || value.isNull()) {
@@ -98,10 +98,10 @@ class ElectricityMessageEsGatewayImplTest {
// messageType 传了才加 term
assertTrue(anyFilter(filters, f -> f.has("term")
&& f.get("term").get("messageType").get("value").asInt() == 0));
// createTime 闭区间 range
// createTime 闭区间 range,date 类型字段必须发 epoch 毫秒(空格分隔字符串会被 ES 400 拒绝)
assertTrue(anyFilter(filters, f -> f.has("range")
&& f.get("range").get("createTime").get("gte").asText().equals("2026-09-21 00:00:00")
&& f.get("range").get("createTime").get("lte").asText().equals("2026-09-21 23:59:59")));
&& f.get("range").get("createTime").get("gte").asLong() == 1789920000000L
&& f.get("range").get("createTime").get("lte").asLong() == 1790006399000L));
}
@Test