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.*; 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 getIndexPieSummary() { Map onlineMap = new HashMap<>(); try{ onlineMap = redisTemplate.opsForHash().entries(ONLINE_DEVICE_CACHE); }catch (RedisConnectionFailureException e){ log.error("获取在线设备缓存失败",e); return getPieSummaryVOS(); } //TODO 记得改回从缓存里取值 // Map 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 deviceIdList = onlineMap.keySet().stream().map(Long::parseLong).toList(); List deviceVOList = deviceService.getDeviceVOByIds(deviceIdList); //将所有设备按不同的设备品牌进行分组 Map> deviceGroup = new HashMap<>(); for (DeviceVO deviceVO : deviceVOList) { if(deviceGroup.containsKey(deviceVO.getProduct().getCode())){ deviceGroup.get(deviceVO.getProduct().getCode()).add(deviceVO); }else { List deviceVOList1 = new ArrayList<>(); deviceVOList1.add(deviceVO); deviceGroup.put(deviceVO.getProduct().getCode(), deviceVOList1); } } List 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 xAxisData = new ArrayList<>(); List dataList = deviceService.getPressureChartData(deviceId,startTime,endTime); //将查询到的结果组装成LineSummaryVO返回给前端 LineSummaryVO lineSummaryVO = new LineSummaryVO(); lineSummaryVO.setTitle(deviceVO.getGasWell().getName()); //设置图例数据 List legendData = new ArrayList<>(); legendData.add("油压"); legendData.add("套压"); legendData.add("输压"); lineSummaryVO.setLegendData(legendData); List oilPressureData = new ArrayList<>(); List casPressureData = new ArrayList<>(); List prePressureData = 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()); prePressureData.add(StringUtils.isEmpty(deviceHistoryVO.getPrePressure())?"0":deviceHistoryVO.getPrePressure()); } //设置x轴数据(日期) lineSummaryVO.setXAxisData(xAxisData); //设置y轴数据(油压、套压) List 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 = deviceService.getDevice(deviceId); if(deviceVO == null){ throw new RuntimeException("设备不存在"); } List xAxisData = new ArrayList<>(); List dataList = deviceService.getSwitchStatusData(deviceId,startTime,endTime,deviceVO.getProduct().getCode()); LineSummaryVO lineSummaryVO = new LineSummaryVO(); lineSummaryVO.setTitle(deviceVO.getGasWell().getName()); //设置图例数据 List legendData = new ArrayList<>(); legendData.add("开关状态"); lineSummaryVO.setLegendData(legendData); List 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 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 getPieSummaryVOS() { List 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> deviceGroup, Map onlineMap, List pieSummaryVOList, String title) { List 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); } }