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

247 lines
9.5 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.isu.gaswellwatch.service.impl;
import com.isu.gaswellwatch.service.DeviceService;
import com.isu.gaswellwatch.service.SummaryService;
import com.isu.gaswellwatch.vo.DeviceHistoryVO;
import com.isu.gaswellwatch.vo.DeviceVO;
import com.isu.gaswellwatch.vo.summary.LineDataVO;
import com.isu.gaswellwatch.vo.summary.LineSummaryVO;
import com.isu.gaswellwatch.vo.summary.PieDataVO;
import com.isu.gaswellwatch.vo.summary.PieSummaryVO;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
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.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
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();
}
//TODO 记得改回从缓存里取值
// Map<String,String> onlineMap = new HashMap<>();
// onlineMap.put("1","true");
// onlineMap.put("2","false");
// onlineMap.put("3","true");
// onlineMap.put("4","true");
if(onlineMap.isEmpty()){
return getPieSummaryVOS();
}
List<Long> deviceIdList = onlineMap.keySet().stream().map(Long::parseLong).toList();
List<DeviceVO> deviceVOList = deviceService.getDeviceVOByIds(deviceIdList);
//将所有设备按不同的设备品牌进行分组
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,"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;
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 = 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("套压");
lineSummaryVO.setLegendData(legendData);
List<String> oilPressureData = new ArrayList<>();
List<String> casPressureData = new ArrayList<>();
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());
}
//设置x轴数据日期
lineSummaryVO.setXAxisData(xAxisData);
//设置y轴数据油压、套压
List<LineDataVO> series = new ArrayList<>();
LineDataVO oil = new LineDataVO();
oil.setName("油压");
oil.setType("line");
oil.setData(oilPressureData);
LineDataVO cas = new LineDataVO();
cas.setName("套压");
cas.setType("line");
cas.setData(casPressureData);
series.add(oil);
series.add(cas);
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;
}
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);
}
}