优化逻辑
This commit is contained in:
parent
acee04de35
commit
778e365e18
@ -40,6 +40,5 @@ public class MessageConfig {
|
|||||||
messageService.save(message);
|
messageService.save(message);
|
||||||
long count =
|
long count =
|
||||||
messageService.count(new LambdaQueryWrapper<Message>().eq(Message::getStatus, "1"));
|
messageService.count(new LambdaQueryWrapper<Message>().eq(Message::getStatus, "1"));
|
||||||
ServerSendEventServer.sendMessage(count + "");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
package com.yfd.platform.modules.auxcontrol.controller;
|
package com.yfd.platform.modules.auxcontrol.controller;
|
||||||
|
|
||||||
import cn.hutool.core.util.NumberUtil;
|
import cn.hutool.core.util.NumberUtil;
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.yfd.platform.config.ResponseResult;
|
import com.yfd.platform.config.ResponseResult;
|
||||||
import com.yfd.platform.modules.auxcontrol.domain.DeviceSignal;
|
import com.yfd.platform.modules.auxcontrol.domain.DeviceSignal;
|
||||||
import com.yfd.platform.modules.auxcontrol.domain.DeviceWorkData;
|
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.IDeviceSignalService;
|
||||||
import com.yfd.platform.modules.auxcontrol.service.IDeviceWorkDataService;
|
import com.yfd.platform.modules.auxcontrol.service.IDeviceWorkDataService;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
@ -50,7 +52,6 @@ public class DeviceWorkDataController {
|
|||||||
return ResponseResult.successData(deviceWorkDataPage);
|
return ResponseResult.successData(deviceWorkDataPage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@GetMapping("/getDeviceWorkData")
|
@GetMapping("/getDeviceWorkData")
|
||||||
@ApiOperation("查询变电站设备运行数据")
|
@ApiOperation("查询变电站设备运行数据")
|
||||||
public ResponseResult getDeviceWorkData(String stationId) {
|
public ResponseResult getDeviceWorkData(String stationId) {
|
||||||
@ -58,61 +59,157 @@ public class DeviceWorkDataController {
|
|||||||
return ResponseResult.successData(map);
|
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分钟的分钟时间槽
|
Map<LocalDateTime, String> timeDataMap = groupDataByTimeUnit(deviceWorkDataList, config.getTruncateUnit());
|
||||||
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数据
|
// 构建xAxis和series数据
|
||||||
List<String> xAxisData = new ArrayList<>();
|
List<String> xAxisData = new ArrayList<>();
|
||||||
List<Double> seriesData = new ArrayList<>();
|
List<Double> seriesData = new ArrayList<>();
|
||||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH时mm分");
|
for (LocalDateTime slot : config.getTimeSlots()) {
|
||||||
for (LocalDateTime slot : minuteSlots) {
|
xAxisData.add(slot.format(config.getFormatter()));
|
||||||
xAxisData.add(slot.format(formatter));
|
String value = timeDataMap.getOrDefault(slot, "0");
|
||||||
String value = minuteDataMap.getOrDefault(slot, "0");
|
seriesData.add(NumberUtil.parseDouble(NumberUtil.isNumber(value) ? value : "0"));
|
||||||
if (!NumberUtil.isNumber(value)) {
|
|
||||||
value="0";
|
|
||||||
}
|
|
||||||
seriesData.add(NumberUtil.parseDouble(value));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 构建ECharts数据结构
|
// 构建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<>();
|
Map<String, Object> result = new HashMap<>();
|
||||||
|
|
||||||
|
// xAxis配置
|
||||||
Map<String, Object> xAxis = new HashMap<>();
|
Map<String, Object> xAxis = new HashMap<>();
|
||||||
xAxis.put("type", "category");
|
xAxis.put("type", "category");
|
||||||
xAxis.put("data", xAxisData);
|
xAxis.put("data", xAxisData);
|
||||||
result.put("xAxis", xAxis);
|
result.put("xAxis", xAxis);
|
||||||
|
|
||||||
|
// yAxis配置
|
||||||
Map<String, Object> yAxis = new HashMap<>();
|
Map<String, Object> yAxis = new HashMap<>();
|
||||||
yAxis.put("type", "value");
|
yAxis.put("type", "value");
|
||||||
result.put("yAxis", yAxis);
|
result.put("yAxis", yAxis);
|
||||||
|
|
||||||
|
// 系列数据配置
|
||||||
DeviceSignal deviceSignal = deviceSignalService.getById(signalId);
|
DeviceSignal deviceSignal = deviceSignalService.getById(signalId);
|
||||||
String name = deviceSignal == null ? "" : deviceSignal.getSignalName();
|
String seriesName = deviceSignal != null ? deviceSignal.getSignalName() : "";
|
||||||
|
|
||||||
List<Map<String, Object>> seriesList = new ArrayList<>();
|
List<Map<String, Object>> seriesList = new ArrayList<>();
|
||||||
Map<String, Object> series = new HashMap<>();
|
Map<String, Object> series = new HashMap<>();
|
||||||
series.put("name", name);
|
series.put("name", seriesName);
|
||||||
series.put("type", "line");
|
series.put("type", "line");
|
||||||
series.put("step", "start");
|
series.put("step", "start");
|
||||||
series.put("data", seriesData);
|
series.put("data", seriesData);
|
||||||
seriesList.add(series);
|
seriesList.add(series);
|
||||||
|
|
||||||
// 如果需要多个系列,可以继续添加
|
|
||||||
// 例如复制series并修改name和step
|
|
||||||
|
|
||||||
result.put("series", seriesList);
|
result.put("series", seriesList);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -122,7 +219,8 @@ public class DeviceWorkDataController {
|
|||||||
@ApiOperation("查询历史曲线")
|
@ApiOperation("查询历史曲线")
|
||||||
public ResponseResult getHistoricalCurve(String signalId, String type) {
|
public ResponseResult getHistoricalCurve(String signalId, String type) {
|
||||||
List<DeviceWorkData> deviceWorkDataList = deviceWorkDataService.getHistoricalCurve(signalId);
|
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);
|
return ResponseResult.successData(map);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -16,11 +16,12 @@
|
|||||||
package com.yfd.platform.utils;
|
package com.yfd.platform.utils;
|
||||||
|
|
||||||
import cn.hutool.http.HttpUtil;
|
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.JSONObject;
|
||||||
import cn.hutool.json.JSONUtil;
|
import cn.hutool.json.JSONUtil;
|
||||||
import com.yfd.platform.constant.Constant;
|
import com.yfd.platform.constant.Constant;
|
||||||
import eu.bitwalker.useragentutils.Browser;
|
|
||||||
import eu.bitwalker.useragentutils.UserAgent;
|
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
import org.lionsoul.ip2region.DataBlock;
|
import org.lionsoul.ip2region.DataBlock;
|
||||||
import org.lionsoul.ip2region.DbConfig;
|
import org.lionsoul.ip2region.DbConfig;
|
||||||
@ -262,7 +263,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static String getBrowser(HttpServletRequest request) {
|
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();
|
Browser browser = userAgent.getBrowser();
|
||||||
return browser.getName();
|
return browser.getName();
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,11 @@
|
|||||||
package com.yfd.platform.utils;
|
package com.yfd.platform.utils;
|
||||||
|
|
||||||
import cn.hutool.core.util.NumberUtil;
|
|
||||||
|
|
||||||
public class TestFileDir {
|
public class TestFileDir {
|
||||||
public static void main(String[] args) throws Exception {
|
public static void main(String[] args) throws Exception {
|
||||||
if (NumberUtil.isNumber("23")) {
|
double resultvalue = 50;
|
||||||
System.out.println("是数字");
|
double baseValue = 100;
|
||||||
}
|
double abs = Math.abs((resultvalue - baseValue) / baseValue * 100);
|
||||||
|
System.out.println(abs);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -42,23 +42,57 @@
|
|||||||
ORDER BY
|
ORDER BY
|
||||||
start_time DESC
|
start_time DESC
|
||||||
</select>
|
</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 id="getDeviceWorkData" resultType="java.util.Map">
|
||||||
SELECT
|
SELECT
|
||||||
ds.signal_id,
|
di.itemcode,
|
||||||
ds.signal_code itemcode,
|
di.dictname,
|
||||||
ds.signal_name dictname,
|
a.signal_id,
|
||||||
COALESCE ( ds.yc_value, '无' ) AS value,
|
COALESCE ( a.yc_value, '无' )
|
||||||
ds.signal_unit unit
|
VALUE
|
||||||
|
,
|
||||||
|
a.unit
|
||||||
FROM
|
FROM
|
||||||
fk_device_signal ds
|
sys_dictionary_items di
|
||||||
INNER JOIN iis_substation_component sc ON ds.main_component_id = sc.component_id
|
LEFT JOIN (
|
||||||
INNER JOIN iis_substation ss ON ss.station_code = sc.station_code
|
SELECT
|
||||||
WHERE
|
ds.signal_id,
|
||||||
sc.component_name = '微气象设备部件'
|
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 != ''">
|
<if test="stationId != null and stationId != ''">
|
||||||
AND ss.station_id=#{stationId}
|
AND ss.station_id=#{stationId}
|
||||||
</if>
|
</if>
|
||||||
ORDER BY orderno
|
) a ON di.itemcode = a.itemcode
|
||||||
|
WHERE
|
||||||
|
di.parentcode = 'environment'
|
||||||
|
ORDER BY
|
||||||
|
di.custom3
|
||||||
</select>
|
</select>
|
||||||
<select id="getHistoricalCurveList" resultType="com.yfd.platform.modules.auxcontrol.domain.DeviceWorkData">
|
<select id="getHistoricalCurveList" resultType="com.yfd.platform.modules.auxcontrol.domain.DeviceWorkData">
|
||||||
SELECT
|
SELECT
|
||||||
|
Loading…
Reference in New Issue
Block a user