gasWellWatch/src/main/java/com/isu/gaswellwatch/service/impl/SummaryServiceImpl.java

286 lines
11 KiB
Java
Raw Normal View History

2024-11-28 01:30:00 +08:00
package com.isu.gaswellwatch.service.impl;
import com.isu.gaswellwatch.service.DeviceService;
import com.isu.gaswellwatch.service.SummaryService;
2024-12-10 21:17:08 +08:00
import com.isu.gaswellwatch.vo.DeviceHistoryVO;
2024-11-28 01:30:00 +08:00
import com.isu.gaswellwatch.vo.DeviceVO;
2024-12-11 17:55:13 +08:00
import com.isu.gaswellwatch.vo.summary.*;
2024-11-28 01:30:00 +08:00
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
2024-12-10 21:17:08 +08:00
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.RedisConnectionFailureException;
2024-11-28 01:30:00 +08:00
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
2024-11-28 01:30:00 +08:00
import static com.isu.gaswellwatch.modbus.data.PersistenceHandler.*;
@Service("summaryService")
@Transactional(rollbackFor = Exception.class)
@Slf4j
2025-02-21 13:53:37 +08:00
public class SummaryServiceImpl implements SummaryService {
2024-11-28 01:30:00 +08:00
@Resource(name = "stringRedisTemplate")
private RedisTemplate redisTemplate;
@Resource
private DeviceService deviceService;
@Override
public List<PieSummaryVO> getIndexPieSummary() {
2025-02-21 13:53:37 +08:00
Map<String, String> onlineMap = new HashMap<>();
try {
onlineMap = this.redisTemplate.opsForHash().entries(ONLINE_DEVICE_CACHE);
} catch (RedisConnectionFailureException e) {
log.error("获取在线设备缓存失败", e);
return getPieSummaryVOS();
}
2025-02-21 13:53:37 +08:00
if (onlineMap.isEmpty()) {
return getPieSummaryVOS();
2024-12-01 15:26:37 +08:00
}
2024-12-28 13:09:14 +08:00
// List<Long> deviceIdList = onlineMap.keySet().stream().map(Long::parseLong).toList();
2024-11-28 01:30:00 +08:00
2025-02-21 13:53:37 +08:00
List<DeviceVO> deviceVOList = this.deviceService.getDeviceVOByIds(null);
2024-11-28 01:30:00 +08:00
//将所有设备按不同的设备品牌进行分组
2025-02-21 13:53:37 +08:00
Map<String, List<DeviceVO>> deviceGroup = new HashMap<>();
2024-11-28 01:30:00 +08:00
for (DeviceVO deviceVO : deviceVOList) {
2025-02-21 13:53:37 +08:00
if (deviceGroup.containsKey(deviceVO.getProduct().getCode())) {
2024-11-28 01:30:00 +08:00
deviceGroup.get(deviceVO.getProduct().getCode()).add(deviceVO);
2025-02-21 13:53:37 +08:00
} else {
2024-11-28 03:12:34 +08:00
List<DeviceVO> deviceVOList1 = new ArrayList<>();
deviceVOList1.add(deviceVO);
deviceGroup.put(deviceVO.getProduct().getCode(), deviceVOList1);
2024-11-28 01:30:00 +08:00
}
}
List<PieSummaryVO> pieSummaryVOList = new ArrayList<>();
addKNPCDeviceSummary(KNPCV1_MODBUS_TYPE, deviceGroup, onlineMap, pieSummaryVOList, "KNPC");
2025-02-21 13:53:37 +08:00
addKNPCDeviceSummary(ETC_MODBUS_TYPE, deviceGroup, onlineMap, pieSummaryVOList, "ETC");
addKNPCDeviceSummary(SCSS_MODBUS_TYPE, deviceGroup, onlineMap, pieSummaryVOList, "四川双晟");
addKNPCDeviceSummary(WEPS_PLUG_MODBUS_TYPE, deviceGroup, onlineMap, pieSummaryVOList, "威尔普斯");
2024-11-28 01:30:00 +08:00
//计算总数
PieSummaryVO pieSummaryVO = new PieSummaryVO();
pieSummaryVO.setChartName("total");
pieSummaryVO.setTitle("设备总数");
Integer onLineCount = 0;
Integer offLineCount = 0;
2024-12-27 15:24:41 +08:00
2025-02-21 13:53:37 +08:00
for (DeviceVO deviceVO : deviceVOList) {
if ("true".equalsIgnoreCase(onlineMap.get(deviceVO.getId().toString()))) {
2024-11-28 01:30:00 +08:00
onLineCount++;
2025-02-21 13:53:37 +08:00
} else {
2024-11-28 01:30:00 +08:00
offLineCount++;
}
}
2025-02-21 13:53:37 +08:00
PieDataVO onlinePieDataVO = new PieDataVO("在线", onLineCount);
PieDataVO offlinePieDataVO = new PieDataVO("离线", offLineCount);
pieSummaryVO.setData(List.of(onlinePieDataVO, offlinePieDataVO));
2024-11-28 01:30:00 +08:00
pieSummaryVOList.add(pieSummaryVO);
return pieSummaryVOList;
}
2024-12-10 21:17:08 +08:00
@Override
public LineSummaryVO getPressureChartData(String startTime, String endTime, Long deviceId) {
//根据设备ID、时间范围查询设备历史数据表的油压 套压
2025-02-21 13:53:37 +08:00
DeviceVO deviceVO = this.deviceService.getDevice(deviceId);
if (deviceVO == null) {
2024-12-10 21:17:08 +08:00
throw new RuntimeException("设备不存在");
}
List<String> xAxisData = new ArrayList<>();
2025-02-21 13:53:37 +08:00
List<DeviceHistoryVO> dataList = this.deviceService.getPressureChartData(deviceId, startTime, endTime);
2024-12-10 21:17:08 +08:00
//将查询到的结果组装成LineSummaryVO返回给前端
LineSummaryVO lineSummaryVO = new LineSummaryVO();
lineSummaryVO.setTitle(deviceVO.getGasWell().getName());
//设置图例数据
List<String> legendData = new ArrayList<>();
legendData.add("油压");
legendData.add("套压");
2024-12-11 17:55:13 +08:00
legendData.add("输压");
2024-12-10 21:17:08 +08:00
lineSummaryVO.setLegendData(legendData);
List<String> oilPressureData = new ArrayList<>();
List<String> casPressureData = new ArrayList<>();
2024-12-11 17:55:13 +08:00
List<String> prePressureData = new ArrayList<>();
2024-12-10 21:17:08 +08:00
2025-02-21 13:53:37 +08:00
for (DeviceHistoryVO deviceHistoryVO : dataList) {
2024-12-10 21:17:08 +08:00
xAxisData.add(deviceHistoryVO.getCollectionTime());
2025-02-21 13:53:37 +08:00
oilPressureData.add(StringUtils.isEmpty(deviceHistoryVO.getOilPressure()) ? "0" : deviceHistoryVO.getOilPressure());
casPressureData.add(StringUtils.isEmpty(deviceHistoryVO.getCasPressure()) ? "0" : deviceHistoryVO.getCasPressure());
prePressureData.add(StringUtils.isEmpty(deviceHistoryVO.getPrePressure()) ? "0" : deviceHistoryVO.getPrePressure());
2024-12-10 21:17:08 +08:00
}
//设置x轴数据日期
lineSummaryVO.setXAxisData(xAxisData);
//设置y轴数据油压、套压
List<LineDataVO> series = new ArrayList<>();
LineDataVO oil = new LineDataVO();
oil.setName("油压");
oil.setType("line");
oil.setData(oilPressureData);
2024-12-11 17:55:13 +08:00
//设置线条颜色 #A50021 深红 #333399 深蓝
ItemStyleVO itemStyleVO = new ItemStyleVO();
NormalStyleVO normalStyleVO = new NormalStyleVO();
normalStyleVO.setColor("#A50021");
LineStyleVO lineStyleVO = new LineStyleVO();
lineStyleVO.setColor("#A50021");
normalStyleVO.setLineStyle(lineStyleVO);
itemStyleVO.setNormal(normalStyleVO);
oil.setItemStyle(itemStyleVO);
2024-12-10 21:17:08 +08:00
LineDataVO cas = new LineDataVO();
cas.setName("套压");
cas.setType("line");
cas.setData(casPressureData);
2024-12-11 17:55:13 +08:00
//设置线条颜色
ItemStyleVO itemStyleVO1 = new ItemStyleVO();
NormalStyleVO normalStyleVO1 = new NormalStyleVO();
normalStyleVO1.setColor("#333399");
LineStyleVO lineStyleVO1 = new LineStyleVO();
lineStyleVO1.setColor("#333399");
2024-12-11 18:16:15 +08:00
normalStyleVO1.setLineStyle(lineStyleVO1);
2024-12-11 17:55:13 +08:00
itemStyleVO1.setNormal(normalStyleVO1);
cas.setItemStyle(itemStyleVO1);
LineDataVO pre = new LineDataVO();
pre.setName("输压");
pre.setType("line");
pre.setData(prePressureData);
2024-12-10 21:17:08 +08:00
series.add(oil);
series.add(cas);
2024-12-11 17:55:13 +08:00
series.add(pre);
2024-12-10 21:17:08 +08:00
lineSummaryVO.setSeries(series);
return lineSummaryVO;
}
@Override
public LineSummaryVO getSwitchChartData(String startTime, String endTime, Long deviceId) {
2025-02-21 13:53:37 +08:00
DeviceVO deviceVO = this.deviceService.getDevice(deviceId);
if (deviceVO == null) {
2024-12-10 21:17:08 +08:00
throw new RuntimeException("设备不存在");
}
List<String> xAxisData = new ArrayList<>();
2025-02-21 13:53:37 +08:00
List<DeviceHistoryVO> dataList = this.deviceService.getSwitchStatusData(deviceId, startTime, endTime, deviceVO.getProduct().getCode());
2024-12-10 21:17:08 +08:00
LineSummaryVO lineSummaryVO = new LineSummaryVO();
lineSummaryVO.setTitle(deviceVO.getGasWell().getName());
//设置图例数据
List<String> legendData = new ArrayList<>();
legendData.add("开关状态");
lineSummaryVO.setLegendData(legendData);
List<String> switchStatusData = new ArrayList<>();
2025-02-21 13:53:37 +08:00
for (DeviceHistoryVO deviceHistoryVO : dataList) {
2024-12-10 21:17:08 +08:00
xAxisData.add(deviceHistoryVO.getCollectionTime());
2025-02-21 13:53:37 +08:00
switchStatusData.add(StringUtils.isEmpty(deviceHistoryVO.getWellStatus()) ? "0" : deviceHistoryVO.getWellStatus());
2024-12-10 21:17:08 +08:00
}
//设置x轴数据日期
lineSummaryVO.setXAxisData(xAxisData);
//设置y轴数据开关状态
List<LineDataVO> series = new ArrayList<>();
LineDataVO status = new LineDataVO();
status.setName("开关状态");
status.setType("line");
status.setData(switchStatusData);
series.add(status);
lineSummaryVO.setSeries(series);
return lineSummaryVO;
}
private static List<PieSummaryVO> getPieSummaryVOS() {
List<PieSummaryVO> result = new ArrayList<>();
PieSummaryVO pieSummaryVO = new PieSummaryVO();
pieSummaryVO.setChartName("total");
pieSummaryVO.setTitle("设备总数");
pieSummaryVO.setData(List.of());
result.add(pieSummaryVO);
PieSummaryVO pieSummaryVO1 = new PieSummaryVO();
pieSummaryVO1.setChartName(KNPCV1_MODBUS_TYPE);
pieSummaryVO1.setTitle("KNPCV1");
pieSummaryVO1.setData(List.of());
result.add(pieSummaryVO1);
PieSummaryVO pieSummaryVO2 = new PieSummaryVO();
pieSummaryVO2.setChartName(ETC_MODBUS_TYPE);
pieSummaryVO2.setTitle("ETC");
pieSummaryVO2.setData(List.of());
result.add(pieSummaryVO2);
PieSummaryVO pieSummaryVO3 = new PieSummaryVO();
pieSummaryVO3.setChartName(SCSS_MODBUS_TYPE);
pieSummaryVO3.setTitle("四川双晟");
pieSummaryVO3.setData(List.of());
result.add(pieSummaryVO3);
PieSummaryVO pieSummaryVO4 = new PieSummaryVO();
pieSummaryVO4.setChartName(WEPS_PLUG_MODBUS_TYPE);
pieSummaryVO4.setTitle("威尔普斯");
pieSummaryVO4.setData(List.of());
result.add(pieSummaryVO4);
PieSummaryVO pieSummaryVO5 = new PieSummaryVO();
pieSummaryVO5.setChartName(MI_WEPS_PLUG_MODBUS_TYPE);
pieSummaryVO5.setTitle("MI威尔普斯");
pieSummaryVO5.setData(List.of());
result.add(pieSummaryVO5);
return result;
}
2024-11-28 01:30:00 +08:00
private static void addKNPCDeviceSummary(String productName, Map<String, List<DeviceVO>> deviceGroup, Map<String, String> onlineMap, List<PieSummaryVO> pieSummaryVOList, String title) {
List<DeviceVO> knpcDeviceList = deviceGroup.get(productName);
if (Objects.equals(WEPS_PLUG_MODBUS_TYPE, productName)) {
if (ObjectUtils.isNotEmpty(knpcDeviceList)) {
knpcDeviceList = deviceGroup.get(MI_WEPS_PLUG_MODBUS_TYPE);
} else {
knpcDeviceList.addAll(Optional.ofNullable(deviceGroup.get(MI_WEPS_PLUG_MODBUS_TYPE)).orElse(List.of()));
}
}
2024-11-28 01:30:00 +08:00
PieSummaryVO pieSummaryVO = new PieSummaryVO();
pieSummaryVO.setChartName(productName);
pieSummaryVO.setTitle(title);
if (Objects.isNull(knpcDeviceList)) {
2024-11-28 01:30:00 +08:00
//根据设备列表查找在线map中的状态进行统计在线数量
int onLineCount = 0, offLineCount = 0;
2025-02-21 13:53:37 +08:00
for (DeviceVO deviceVO : knpcDeviceList) {
if ("true".equalsIgnoreCase(onlineMap.get(deviceVO.getId().toString()))) {
2024-11-28 01:30:00 +08:00
onLineCount++;
2025-02-21 13:53:37 +08:00
} else {
2024-11-28 01:30:00 +08:00
offLineCount++;
}
}
pieSummaryVO.setData(List.of(new PieDataVO("在线", onLineCount),
new PieDataVO("离线", offLineCount)));
2025-02-21 13:53:37 +08:00
} else {
2024-11-28 01:30:00 +08:00
//无值时需要构建空值结构
pieSummaryVO.setData(new ArrayList<>());
}
pieSummaryVOList.add(pieSummaryVO);
}
}