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 getIndexPieSummary() { Map 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 deviceIdList = onlineMap.keySet().stream().map(Long::parseLong).toList(); List deviceVOList = this.deviceService.getDeviceVOByIds(null); //将所有设备按不同的设备品牌进行分组 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, "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 xAxisData = new ArrayList<>(); List dataList = this.deviceService.getPressureChartData(deviceId, startTime, endTime, deviceVO.getProduct().getCode()); //将查询到的结果组装成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<>(dataList.size()); List casPressureData = new ArrayList<>(dataList.size()); List 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 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 xAxisData = new ArrayList<>(); List dataList = this.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); 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> deviceGroup, Map onlineMap, List pieSummaryVOList, String title) { List 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); } }