优化逻辑

This commit is contained in:
weitang 2025-05-20 16:24:25 +08:00
parent acee04de35
commit 778e365e18
6 changed files with 227 additions and 50 deletions

View File

@ -40,6 +40,5 @@ public class MessageConfig {
messageService.save(message);
long count =
messageService.count(new LambdaQueryWrapper<Message>().eq(Message::getStatus, "1"));
ServerSendEventServer.sendMessage(count + "");
}
}

View File

@ -1,10 +1,12 @@
package com.yfd.platform.modules.auxcontrol.controller;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yfd.platform.config.ResponseResult;
import com.yfd.platform.modules.auxcontrol.domain.DeviceSignal;
import com.yfd.platform.modules.auxcontrol.domain.DeviceWorkData;
import com.yfd.platform.modules.auxcontrol.domain.TimeConfig;
import com.yfd.platform.modules.auxcontrol.service.IDeviceSignalService;
import com.yfd.platform.modules.auxcontrol.service.IDeviceWorkDataService;
import io.swagger.annotations.Api;
@ -50,7 +52,6 @@ public class DeviceWorkDataController {
return ResponseResult.successData(deviceWorkDataPage);
}
@GetMapping("/getDeviceWorkData")
@ApiOperation("查询变电站设备运行数据")
public ResponseResult getDeviceWorkData(String stationId) {
@ -58,61 +59,157 @@ public class DeviceWorkDataController {
return ResponseResult.successData(map);
}
// public Map<String, Object> processDeviceData(List<DeviceWorkData> deviceWorkDataList, String signalId) {
// // 生成过去60分钟的分钟时间槽
// LocalDateTime now = LocalDateTime.now().truncatedTo(ChronoUnit.MINUTES);
// LocalDateTime startTime = now.minusMinutes(59);
// List<LocalDateTime> minuteSlots = new ArrayList<>();
// for (int i = 0; i < 60; i++) {
// minuteSlots.add(startTime.plusMinutes(i));
// }
//
// // 按分钟分组数据
// Map<LocalDateTime, String> minuteDataMap = new HashMap<>();
// for (DeviceWorkData data : deviceWorkDataList) {
// LocalDateTime minuteKey = data.getStartTime().truncatedTo(ChronoUnit.MINUTES);
// minuteDataMap.put(minuteKey, data.getValue());
// }
//
// // 构建xAxis和series数据
// List<String> xAxisData = new ArrayList<>();
// List<Double> seriesData = new ArrayList<>();
// DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH时mm分");
// for (LocalDateTime slot : minuteSlots) {
// xAxisData.add(slot.format(formatter));
// String value = minuteDataMap.getOrDefault(slot, "0");
// if (!NumberUtil.isNumber(value)) {
// value="0";
// }
// seriesData.add(NumberUtil.parseDouble(value));
// }
//
// // 构建ECharts数据结构
// Map<String, Object> result = new HashMap<>();
//
// Map<String, Object> xAxis = new HashMap<>();
// xAxis.put("type", "category");
// xAxis.put("data", xAxisData);
// result.put("xAxis", xAxis);
//
// Map<String, Object> yAxis = new HashMap<>();
// yAxis.put("type", "value");
// result.put("yAxis", yAxis);
// DeviceSignal deviceSignal = deviceSignalService.getById(signalId);
// String name = deviceSignal == null ? "" : deviceSignal.getSignalName();
// List<Map<String, Object>> seriesList = new ArrayList<>();
// Map<String, Object> series = new HashMap<>();
// series.put("name", name);
// series.put("type", "line");
// series.put("step", "start");
// series.put("data", seriesData);
// seriesList.add(series);
//
// // 如果需要多个系列可以继续添加
// // 例如复制series并修改name和step
//
// result.put("series", seriesList);
//
// return result;
// }
public Map<String, Object> processDeviceData(List<DeviceWorkData> deviceWorkDataList, String signalId,
String type) {
// 根据类型生成时间槽和配置参数
TimeConfig config = generateTimeConfig(type);
public Map<String, Object> processDeviceData(List<DeviceWorkData> deviceWorkDataList, String signalId) {
// 生成过去60分钟的分钟时间槽
LocalDateTime now = LocalDateTime.now().truncatedTo(ChronoUnit.MINUTES);
LocalDateTime startTime = now.minusMinutes(59);
List<LocalDateTime> minuteSlots = new ArrayList<>();
for (int i = 0; i < 60; i++) {
minuteSlots.add(startTime.plusMinutes(i));
}
// 按分钟分组数据
Map<LocalDateTime, String> minuteDataMap = new HashMap<>();
for (DeviceWorkData data : deviceWorkDataList) {
LocalDateTime minuteKey = data.getStartTime().truncatedTo(ChronoUnit.MINUTES);
minuteDataMap.put(minuteKey, data.getValue());
}
// 按时间单位分组数据
Map<LocalDateTime, String> timeDataMap = groupDataByTimeUnit(deviceWorkDataList, config.getTruncateUnit());
// 构建xAxis和series数据
List<String> xAxisData = new ArrayList<>();
List<Double> seriesData = new ArrayList<>();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH时mm分");
for (LocalDateTime slot : minuteSlots) {
xAxisData.add(slot.format(formatter));
String value = minuteDataMap.getOrDefault(slot, "0");
if (!NumberUtil.isNumber(value)) {
value="0";
}
seriesData.add(NumberUtil.parseDouble(value));
for (LocalDateTime slot : config.getTimeSlots()) {
xAxisData.add(slot.format(config.getFormatter()));
String value = timeDataMap.getOrDefault(slot, "0");
seriesData.add(NumberUtil.parseDouble(NumberUtil.isNumber(value) ? value : "0"));
}
// 构建ECharts数据结构
return buildEChartsResult(xAxisData, seriesData, signalId);
}
/**
* 生成时间配置
*/
private TimeConfig generateTimeConfig(String type) {
List<LocalDateTime> timeSlots = new ArrayList<>();
DateTimeFormatter formatter;
ChronoUnit truncateUnit;
if ("2".equals(type)) {
// 类型2过去24小时每小时一个点
LocalDateTime now = LocalDateTime.now().truncatedTo(ChronoUnit.HOURS);
LocalDateTime startTime = now.minusHours(23);
for (int i = 0; i < 24; i++) {
timeSlots.add(startTime.plusHours(i));
}
formatter = DateTimeFormatter.ofPattern("HH时");
truncateUnit = ChronoUnit.HOURS;
} else {
// 默认类型1过去60分钟每分钟一个点
LocalDateTime now = LocalDateTime.now().truncatedTo(ChronoUnit.MINUTES);
LocalDateTime startTime = now.minusMinutes(59);
for (int i = 0; i < 60; i++) {
timeSlots.add(startTime.plusMinutes(i));
}
formatter = DateTimeFormatter.ofPattern("HH时mm分");
truncateUnit = ChronoUnit.MINUTES;
}
return new TimeConfig(timeSlots, formatter, truncateUnit);
}
/**
* 按时间单位分组数据
*/
private Map<LocalDateTime, String> groupDataByTimeUnit(List<DeviceWorkData> dataList, ChronoUnit unit) {
Map<LocalDateTime, String> map = new HashMap<>();
for (DeviceWorkData data : dataList) {
LocalDateTime key = data.getStartTime().truncatedTo(unit);
map.put(key, data.getValue());
}
return map;
}
/**
* 构建ECharts结果
*/
private Map<String, Object> buildEChartsResult(List<String> xAxisData, List<Double> seriesData, String signalId) {
Map<String, Object> result = new HashMap<>();
// xAxis配置
Map<String, Object> xAxis = new HashMap<>();
xAxis.put("type", "category");
xAxis.put("data", xAxisData);
result.put("xAxis", xAxis);
// yAxis配置
Map<String, Object> yAxis = new HashMap<>();
yAxis.put("type", "value");
result.put("yAxis", yAxis);
// 系列数据配置
DeviceSignal deviceSignal = deviceSignalService.getById(signalId);
String name = deviceSignal == null ? "" : deviceSignal.getSignalName();
String seriesName = deviceSignal != null ? deviceSignal.getSignalName() : "";
List<Map<String, Object>> seriesList = new ArrayList<>();
Map<String, Object> series = new HashMap<>();
series.put("name", name);
series.put("name", seriesName);
series.put("type", "line");
series.put("step", "start");
series.put("data", seriesData);
seriesList.add(series);
// 如果需要多个系列可以继续添加
// 例如复制series并修改name和step
result.put("series", seriesList);
return result;
@ -122,7 +219,8 @@ public class DeviceWorkDataController {
@ApiOperation("查询历史曲线")
public ResponseResult getHistoricalCurve(String signalId, String type) {
List<DeviceWorkData> deviceWorkDataList = deviceWorkDataService.getHistoricalCurve(signalId);
Map<String, Object> map = processDeviceData(deviceWorkDataList, signalId);
type = StrUtil.isBlank(type) ? "1" : type;
Map<String, Object> map = processDeviceData(deviceWorkDataList, signalId, type);
return ResponseResult.successData(map);
}

View File

@ -0,0 +1,46 @@
package com.yfd.platform.modules.auxcontrol.domain;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.List;
/**
* 时间配置类内部类
*/
public class TimeConfig {
private List<LocalDateTime> timeSlots;
private DateTimeFormatter formatter;
private ChronoUnit truncateUnit;
public TimeConfig(List<LocalDateTime> timeSlots, DateTimeFormatter formatter, ChronoUnit truncateUnit) {
this.timeSlots = timeSlots;
this.formatter = formatter;
this.truncateUnit = truncateUnit;
}
public void setFormatter(DateTimeFormatter formatter) {
this.formatter = formatter;
}
public ChronoUnit getTruncateUnit() {
return truncateUnit;
}
public void setTimeSlots(List<LocalDateTime> timeSlots) {
this.timeSlots = timeSlots;
}
public DateTimeFormatter getFormatter() {
return formatter;
}
public List<LocalDateTime> getTimeSlots() {
return timeSlots;
}
public void setTruncateUnit(ChronoUnit truncateUnit) {
this.truncateUnit = truncateUnit;
}
}

View File

@ -16,11 +16,12 @@
package com.yfd.platform.utils;
import cn.hutool.http.HttpUtil;
import cn.hutool.http.useragent.Browser;
import cn.hutool.http.useragent.UserAgent;
import cn.hutool.http.useragent.UserAgentUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.yfd.platform.constant.Constant;
import eu.bitwalker.useragentutils.Browser;
import eu.bitwalker.useragentutils.UserAgent;
import lombok.SneakyThrows;
import org.lionsoul.ip2region.DataBlock;
import org.lionsoul.ip2region.DbConfig;
@ -262,7 +263,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
}
public static String getBrowser(HttpServletRequest request) {
UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));
UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent"));
Browser browser = userAgent.getBrowser();
return browser.getName();
}

View File

@ -1,12 +1,11 @@
package com.yfd.platform.utils;
import cn.hutool.core.util.NumberUtil;
public class TestFileDir {
public static void main(String[] args) throws Exception {
if (NumberUtil.isNumber("23")) {
System.out.println("是数字");
}
double resultvalue = 50;
double baseValue = 100;
double abs = Math.abs((resultvalue - baseValue) / baseValue * 100);
System.out.println(abs);
}
}

View File

@ -42,23 +42,57 @@
ORDER BY
start_time DESC
</select>
<!-- <select id="getDeviceWorkData" resultType="java.util.Map">-->
<!-- SELECT-->
<!-- ds.signal_id,-->
<!-- ds.signal_code itemcode,-->
<!-- ds.signal_name dictname,-->
<!-- COALESCE ( ds.yc_value, '无' ) AS value,-->
<!-- ds.signal_unit unit-->
<!-- FROM-->
<!-- fk_device_signal ds-->
<!-- INNER JOIN iis_substation_component sc ON ds.main_component_id = sc.component_id-->
<!-- INNER JOIN iis_substation ss ON ss.station_code = sc.station_code-->
<!-- WHERE-->
<!-- sc.component_name = '微气象设备部件'-->
<!-- <if test="stationId != null and stationId != ''">-->
<!-- AND ss.station_id=#{stationId}-->
<!-- </if>-->
<!-- ORDER BY orderno-->
<!-- </select>-->
<select id="getDeviceWorkData" resultType="java.util.Map">
SELECT
ds.signal_id,
ds.signal_code itemcode,
ds.signal_name dictname,
COALESCE ( ds.yc_value, '无' ) AS value,
ds.signal_unit unit
di.itemcode,
di.dictname,
a.signal_id,
COALESCE ( a.yc_value, '无' )
VALUE
,
a.unit
FROM
fk_device_signal ds
INNER JOIN iis_substation_component sc ON ds.main_component_id = sc.component_id
INNER JOIN iis_substation ss ON ss.station_code = sc.station_code
WHERE
sc.component_name = '微气象设备部件'
sys_dictionary_items di
LEFT JOIN (
SELECT
ds.signal_id,
ds.signal_code itemcode,
ds.signal_name dictname,
ds.yc_value,
ds.signal_unit unit
FROM
fk_device_signal ds
INNER JOIN iis_substation_component sc ON ds.main_component_id = sc.component_id
INNER JOIN iis_substation ss ON ss.station_code = sc.station_code
WHERE
sc.component_name = '微气象设备部件'
<if test="stationId != null and stationId != ''">
AND ss.station_id=#{stationId}
</if>
ORDER BY orderno
) a ON di.itemcode = a.itemcode
WHERE
di.parentcode = 'environment'
ORDER BY
di.custom3
</select>
<select id="getHistoricalCurveList" resultType="com.yfd.platform.modules.auxcontrol.domain.DeviceWorkData">
SELECT