package com.isu.gaswellwatch.service.impl; import com.isu.gaswellwatch.service.DeviceService; import com.isu.gaswellwatch.service.SummaryService; import com.isu.gaswellwatch.vo.DeviceVO; import com.isu.gaswellwatch.vo.summary.PieDataVO; import com.isu.gaswellwatch.vo.summary.PieSummaryVO; import jakarta.annotation.Resource; 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) public class SummaryServiceImpl implements SummaryService { @Resource(name = "stringRedisTemplate") private RedisTemplate redisTemplate; @Resource private DeviceService deviceService; @Override public List getIndexPieSummary() { // Map onlineMap = redisTemplate.opsForHash().entries(ONLINE_DEVICE_CACHE); //TODO 记得改回从缓存里取值 Map onlineMap = new HashMap<>(); onlineMap.put("1","true"); onlineMap.put("2","false"); onlineMap.put("3","true"); onlineMap.put("4","true"); 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; } 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); } }