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