1. 需求分析
项目需求:根据时间区间查询elasticsearch中的数据
查询最近7天的数据,前端请求路径:
https://10.87.67.226/chahua/api/v1/list?endTime=1651288728694&startTime=1650683928694&timeScope=last7d
查询最近30天的数据,前端请求路径:
endTime=1651288728694&startTime=1650683928694&timeScope=last30d
查询最近3个月的数据,前端请求路径:
endTime=1651289076819&startTime=1643513076819&timeScope=last3m
查询最近半年的数据,前端请求路径:
endTime=1651289131524&startTime=1635737131524&timeScope=lasthalfyear
根据自定义时间区间查询,前端请求路径:
endTime=1652803199999&startTime=1649865600000&timeScope=custom
2. 时间区间枚举类TimeScopeEnum
@AllArgsConstructor
@Getter
public enum TimeScopeEnum {
/**
* 最近24小时
*/
LAST_24_HOURS("last24h", 1),
/**
* 最近7天
*/
LAST_7_DAYS("last7d", 7),
/**
* 最近14天
*/
LAST_14_DAYS("last14d", 14),
/**
* 最近30天
*/
LAST_30_DAYS("last30d", 30),
/**
* 最近三个月
*/
LAST_3_MONTH("last3m", 3),
/**
* 最近半年
*/
LAST_HALF_YEAR("lasthalfyear", 6);
/**
* 前端传入参数名称
*/
private final String name;
/**
* 对应天数
*/
private final Integer value;
/**
* 根据前端传入参数名称获取TimeScopeEnum
*
* @param name last_7_days...
* @return TimeScopeEnum
*/
public static TimeScopeEnum getTimeScopeByName(String name) {
for (TimeScopeEnum timeScopeEnum : TimeScopeEnum.values()) {
if (timeScopeEnum.getName().equals(name)) {
return timeScopeEnum;
}
}
return null;
}
}
3. 前端请求Qo类
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "用户表的查询参数")
public class AssetsStatisticQo implements Serializable {
private static final long serialVersionUID = 438544871152602645L;
@ApiModelProperty("开始时间")
@NotNull(message = "开始时间不能为空")
private Long startTime;
@ApiModelProperty("结束时间")
@NotNull(message = "结束时间不能为空")
private Long endTime;
@NotBlank
@ApiModelProperty("时间范围")
private String timeScope;
}
4. 时间处理的工具类
@Slf4j
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(description = "统计日期查询")
public class TimeArgumentQo implements Serializable {
private static final long serialVersionUID = 942383215460551593L;
/**
* 创建时间
*/
private final Date nowDate = DateUtil.date();
/**
* 起始时间
*/
private Date startDate = null;
/**
* 截止时间
*/
private Date endDate = null;
/**
* 时间范围参数
*/
private TimeScopeEnum timeScope = null;
/**
* 计算出起始和结束时间
*/
public TimeArgumentQo(Long startTimestamp, Long endTimestamp, String timeScopeStr) {
if (StringUtils.isBlank(timeScopeStr)) {
log.error("input time parameter error. timeScopeStr: {}", timeScopeStr);
throw new StatisticException("input.params.time.error");
}
// 如果是自定义查询时间
if ("custom".equals(timeScopeStr)) {
if (startTimestamp != null && startTimestamp > 0L) {
startDate = DateUtil.date(startTimestamp);
}
if (endTimestamp != null && endTimestamp > 0L) {
endDate = DateUtil.date(endTimestamp);
}
boolean flag = startDate != null && endDate != null && (startDate.equals(endDate) || startDate.after(endDate));
if (flag) {
throw new StatisticException("input.params.time.error");
}
} else {
// 如果不是自定义查询时间
timeScope = TimeScopeEnum.getTimeScopeByName(timeScopeStr);
if (Objects.isNull(timeScope)) {
throw new StatisticException("input.params.time.error");
}
if (TimeScopeEnum.LAST_24_HOURS.equals(timeScope) || TimeScopeEnum.LAST_7_DAYS.equals(timeScope) || TimeScopeEnum.LAST_14_DAYS.equals(timeScope)
|| TimeScopeEnum.LAST_30_DAYS.equals(timeScope)) {
/* 最近24小时,最近x天(x>1) */
startDate = DateUtil.offsetDay(nowDate, -timeScope.getValue());
endDate = nowDate;
} else {
/* 最近3个月,最近半年 */
startDate = DateUtil.offsetMonth(nowDate, -timeScope.getValue());
endDate = nowDate;
}
}
}
}
5. 执行查询
public void queryList(AssetsStatisticQo assetsStatisticQo) {
// 转换时间区间
TimeArgumentQo timeArgumentQo = new TimeArgumentQo(
assetsStatisticQo.getStartTime(),
assetsStatisticQo.getEndTime(),
assetsStatisticQo.getTimeScope()
);
getHasFallAssets(timeArgumentQo)
}
private List<AssetsStatisticEntity> getHasFallAssets(TimeArgumentQo timeArgumentQo) {
SearchRequest searchRequest = new SearchRequest("future-index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// 查询日期区间
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// lastTime为es中的字段
RangeQueryBuilder timeRangeQuery = QueryBuilders.rangeQuery("lastTime")
.gte(timeArgumentQo.getStartDate().getTime())
.lte(timeArgumentQo.getEndDate().getTime());
boolQuery.must(timeRangeQuery);
}