历史数据展示

This commit is contained in:
杨晓东 2026-01-13 13:52:49 +08:00
parent 0e688b3314
commit d34e71b6bb
7 changed files with 134 additions and 16 deletions

27
pom.xml
View File

@ -140,6 +140,32 @@
<scope>import</scope>
</dependency>
<!-- 核心JUnit 4Java 8标配 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<!-- Spring Boot测试整合适配JUnit 4 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<!-- 排除JUnit 5避免和JUnit 4冲突 -->
<exclusions>
<exclusion>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 阿里数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
@ -278,6 +304,7 @@
<module>zhitan-quartz</module>
<module>zhitan-generator</module>
<module>zhitan-common</module>
<module>zhitan-gateway</module>
</modules>
<profiles>

View File

@ -4,22 +4,30 @@ import com.zhitan.common.annotation.Log;
import com.zhitan.common.core.controller.BaseController;
import com.zhitan.common.core.domain.AjaxResult;
import com.zhitan.common.enums.BusinessType;
import com.zhitan.common.utils.StringUtil;
import com.zhitan.common.utils.poi.ExcelUtil;
import com.zhitan.realtimedata.domain.dto.EnergyIndexMonitorDTO;
import com.zhitan.realtimedata.domain.vo.EquipmentPointParametersExcel;
import com.zhitan.realtimedata.domain.vo.ExportrealtimeTrendVO;
import com.zhitan.realtimedata.service.RealtimeDatabaseService;
import com.zhitan.realtimedata.service.RealtimeTrendService;
import com.zhitan.realtimedata.service.impl.RealtimeTrendServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import static com.zhitan.realtimedata.service.impl.RealtimeTrendServiceImpl.*;
/**
* 实时监测控制类
**/
@ -48,8 +56,17 @@ public class RealtimeTrendController extends BaseController {
@Log(title = "获取历史模型节点关联采集指标数据", businessType = BusinessType.UPDATE)
@GetMapping("/chartByDay")
@ApiOperation(value = "获取历史模型节点关联采集指标数据")
public AjaxResult lineList(@RequestParam String tagCode, @RequestParam String dataTime) {
return AjaxResult.success(realtimeTrendService.chartByDay(tagCode, dataTime));
public AjaxResult lineList(@RequestParam String tagCode, @RequestParam(required = false) String dataTime) {
String endDataTime;
String status;
if (StringUtils.isNotEmpty(dataTime)) {
endDataTime = dataTime;
status = "1"; // 1是搜索
} else {
endDataTime = parseCstDateStrToString(String.valueOf(RealtimeTrendServiceImpl.getTodayOneClock()));
status = "0"; // 0是30天
}
return AjaxResult.success(realtimeTrendService.chartByDay(tagCode, endDataTime, status));
}
/**

View File

@ -151,7 +151,7 @@ rtdb:
###################### MQTT #################################
mqtt:
# 服务器地址
host: tcp://127.0.0.1:1883
host: tcp://192.168.1.103:1883
# ID唯一
clientId: MQTT_WK
# 主题 多个主题用逗号(,)分割 #表示这个主题下面所有topic1,topic2,topic2/topic22/#(默认会取第一个主题)

View File

@ -28,6 +28,22 @@
<artifactId>hutool-all</artifactId>
<version>5.2.4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -118,8 +118,8 @@ public class InfluxDBRepository {
public List<TagValue> getHistoryData(List<String> tagCodes, Date beginTime, Date endTime,
long interval) {
DateTime begin = new DateTime(beginTime);
DateTime end = new DateTime(endTime);
DateTime begin = new DateTime(beginTime).plusHours(1);
DateTime end = new DateTime(endTime).plusHours(1);
StringBuilder timeRange = new StringBuilder()
.append("|> range(start: ").append(Instant.ofEpochMilli(begin.getMillis()).toString())
.append(", stop: ").append(Instant.ofEpochMilli(end.getMillis()).toString())

View File

@ -18,7 +18,7 @@ public interface RealtimeTrendService {
* @param dataTime 时间
* @return
*/
List<RealTimeHistoryDataVO> chartByDay(String tagCode, String dataTime);
List<RealTimeHistoryDataVO> chartByDay(String tagCode, String dataTime, String status);
/**

View File

@ -20,10 +20,12 @@ import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@ -37,6 +39,11 @@ public class RealtimeTrendServiceImpl implements RealtimeTrendService {
private ISysDictDataService dictDataService;
private IMeterPointService iMeterPointService;
public static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 解析英文
public static final DateTimeFormatter CST_FORMATTER = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
public static final ZoneId ZONE_ID = ZoneId.of("Asia/Shanghai"); // 统一指定东八区和你的日期方法一致
@Override
public List<RealTimeDataVO> list(EnergyIndexMonitorDTO dto) {
@ -82,7 +89,8 @@ public class RealtimeTrendServiceImpl implements RealtimeTrendService {
List<MeterPoint> indexList = meterIndexMap.get(meter.getId());
if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(indexList)) {
List<String> indexCodeList = indexList.stream().map(MeterPoint::getCode).collect(Collectors.toList());
// List<String> indexCodeList = indexList.stream().map(MeterPoint::getCode).collect(Collectors.toList());
List<String> indexCodeList = indexList.stream().map(mp -> mp.getCode().split("_")[0]).collect(Collectors.toList());
Map<String, String> tagValueMap = tagValueList.stream().filter(li -> indexCodeList.contains(li.getTagCode()))
.collect(Collectors.toMap(TagValue::getTagCode,o->o.getValue() + "@" + DateUtil.format(o.getDataTime(),"yyyy-MM-dd HH:mm:ss" )));
for (MeterPoint meterPoint : indexList) {
@ -91,7 +99,7 @@ public class RealtimeTrendServiceImpl implements RealtimeTrendService {
model.setIndexCode(code);
model.setName(meterPoint.getName());
model.setUnit(meterPoint.getUnitId());
String tagValue = tagValueMap.get(code);
String tagValue = tagValueMap.get(code.split("_")[0]);
if (StringUtils.isNotEmpty(tagValue)) {
final String[] split = tagValue.split("@");
@ -111,13 +119,18 @@ public class RealtimeTrendServiceImpl implements RealtimeTrendService {
}
@Override
public List<RealTimeHistoryDataVO> chartByDay(String tagCode, String dataTime) {
public List<RealTimeHistoryDataVO> chartByDay(String tagCode, String dataTime, String status) {
List<RealTimeHistoryDataVO> realTimeList = new ArrayList<>();
Date begin = DateUtil.parseDateTime(dataTime);
Date finish = DateUtil.offsetDay(begin, 1);
Date begin;
if (status.equals("1")) {
begin = getLastDaySameTime(dataTime);
} else {
begin = getMonthSameTime(dataTime);
}
Date finish = Date.from(LocalDateTime.parse(dataTime, DATETIME_FORMATTER).atZone(ZONE_ID).toInstant());
long millis = finish.getTime() - begin.getTime();
int pointCount = Integer.parseInt(String.valueOf(millis / (1000 * 60 * 15)));
List<TagValue> tagValueList = realtimeDatabaseService.retrieve(tagCode,begin,finish,pointCount);
List<TagValue> tagValueList = realtimeDatabaseService.retrieve(tagCode.split("_")[0],begin,finish,pointCount);
if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(tagValueList)) {
for (TagValue tagValue : tagValueList) {
RealTimeHistoryDataVO historyData = new RealTimeHistoryDataVO();
@ -151,4 +164,49 @@ public class RealtimeTrendServiceImpl implements RealtimeTrendService {
});
return excelList;
}
/**
* 获取该时间的前一天 同一时刻的Date对象
* @param dataTime 时间字符串 例如2026-01-13 01:00:00
* @return 前一天同一时间Date 例如2026-01-12 01:00:00
*/
public static Date getLastDaySameTime(String dataTime) {
LocalDateTime currentTime = LocalDateTime.parse(dataTime, DATETIME_FORMATTER);
LocalDateTime lastDaySameTime = currentTime.minusDays(1); // 核心在原时间上减1天
return Date.from(lastDaySameTime.atZone(ZONE_ID).toInstant());
}
/**
* 获取 30天前 同一时刻的Date对象
* @param dataTime 时间字符串
* @return 前一天同一时间Date
*/
public static Date getMonthSameTime(String dataTime) {
LocalDateTime currentTime = LocalDateTime.parse(dataTime, DATETIME_FORMATTER);
LocalDateTime lastDaySameTime = currentTime.minusDays(30); // 核心在原时间上减30天
return Date.from(lastDaySameTime.atZone(ZONE_ID).toInstant());
}
/**
* 获取今天 01:00:00的Date对象 (严格指定东八区)
*/
public static Date getTodayOneClock() {
LocalDateTime todayOne = LocalDate.now(ZONE_ID)
.atTime(1, 0, 0); // 拼接 01:00:00 时间点
return Date.from(todayOne.atZone(ZONE_ID).toInstant());
}
/**
* 解析 CST格式字符串Tue Jan 13 01:00:00 CST 2026
* 无第二个参数无需传格式固定返回标准格式
* 强制转换为东八区/Asia/Shanghai北京时间
* 返回固定格式yyyy-MM-dd HH:mm:ss
* @param cstDateStr 待解析的CST格式字符串
* @return 东八区标准时间字符串 2026-01-13 01:00:00
*/
public static String parseCstDateStrToString(String cstDateStr) {
ZonedDateTime zonedDateTime = ZonedDateTime.parse(cstDateStr, CST_FORMATTER);
// 核心转为东八区 + 固定写死标准格式去掉所有多余参数
return zonedDateTime.withZoneSameInstant(ZONE_ID).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
}