历史数据展示
This commit is contained in:
parent
0e688b3314
commit
d34e71b6bb
27
pom.xml
27
pom.xml
@ -140,6 +140,32 @@
|
||||
<scope>import</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- 核心:JUnit 4(Java 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>
|
||||
|
||||
@ -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));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -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/#(默认会取第一个主题)
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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())
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@ -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"));
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user