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

270 lines
10 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;
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.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.isu.gaswellwatch.modbus.data.PersistenceHandler.*;
@Service("summaryService")
@Transactional(rollbackFor = Exception.class)
@Slf4j
2024-11-28 01:30:00 +08:00
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 = redisTemplate.opsForHash().entries(ONLINE_DEVICE_CACHE);
}catch (RedisConnectionFailureException e){
log.error("获取在线设备缓存失败",e);
return getPieSummaryVOS();
}
2024-12-01 15:26: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
2024-12-28 13:09:14 +08:00
List<DeviceVO> deviceVOList = deviceService.getDeviceVOByIds(null);
2024-11-28 01:30:00 +08:00
//将所有设备按不同的设备品牌进行分组
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 {
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,"KNPCV1");
addKNPCDeviceSummary(ETC_MODBUS_TYPE,deviceGroup, onlineMap, pieSummaryVOList,"ETC");
addKNPCDeviceSummary(SCSS_MODBUS_TYPE,deviceGroup, onlineMap, pieSummaryVOList,"四川双晟");
//计算总数
PieSummaryVO pieSummaryVO = new PieSummaryVO();
pieSummaryVO.setChartName("total");
pieSummaryVO.setTitle("设备总数");
Integer onLineCount = 0;
Integer offLineCount = 0;
2024-12-27 15:24:41 +08:00
2024-12-28 13:09:14 +08:00
for(DeviceVO deviceVO : deviceVOList){
2024-11-28 01:30:00 +08:00
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;
}
2024-12-10 21:17:08 +08:00
@Override
public LineSummaryVO getPressureChartData(String startTime, String endTime, Long deviceId) {
//根据设备ID、时间范围查询设备历史数据表的油压 套压
DeviceVO deviceVO = deviceService.getDevice(deviceId);
if(deviceVO == null){
throw new RuntimeException("设备不存在");
}
List<String> xAxisData = new ArrayList<>();
List<DeviceHistoryVO> dataList = deviceService.getPressureChartData(deviceId,startTime,endTime);
//将查询到的结果组装成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
for(DeviceHistoryVO deviceHistoryVO : dataList){
xAxisData.add(deviceHistoryVO.getCollectionTime());
oilPressureData.add(StringUtils.isEmpty(deviceHistoryVO.getOilPressure())?"0":deviceHistoryVO.getOilPressure());
casPressureData.add(StringUtils.isEmpty(deviceHistoryVO.getCasPressure())?"0":deviceHistoryVO.getCasPressure());
2024-12-11 17:55:13 +08:00
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) {
DeviceVO deviceVO = deviceService.getDevice(deviceId);
if(deviceVO == null){
throw new RuntimeException("设备不存在");
}
List<String> xAxisData = new ArrayList<>();
List<DeviceHistoryVO> dataList = 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);
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);
PieSummaryVO pieSummaryVO = new PieSummaryVO();
pieSummaryVO.setChartName(productName);
pieSummaryVO.setTitle(title);
if(knpcDeviceList != null){
//根据设备列表查找在线map中的状态进行统计在线数量
Integer onLineCount = 0;
Integer offLineCount = 0;
for(DeviceVO deviceVO : knpcDeviceList){
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));
}else{
//无值时需要构建空值结构
pieSummaryVO.setData(new ArrayList<>());
}
pieSummaryVOList.add(pieSummaryVO);
}
}