| | |
| | | package com.whyc.service; |
| | | |
| | | import com.whyc.dto.Response; |
| | | import com.whyc.constant.BattSingalIdEnum; |
| | | import com.whyc.constant.BattCapperformanceEnum; |
| | | import com.whyc.constant.DevAlarmEnum; |
| | | import com.whyc.constant.PowerAlarmEnum; |
| | | import com.whyc.dto.*; |
| | | import com.whyc.factory.BattCapFactory; |
| | | import com.whyc.factory.ThreadPoolExecutorFactory; |
| | | import com.whyc.pojo.db_batt_testdata.BatttestdataId; |
| | | import com.whyc.pojo.db_batt_testdata.BatttestdataInf; |
| | | import com.whyc.pojo.db_param.AppParam; |
| | | import com.whyc.pojo.db_station.BattInf; |
| | | import com.whyc.pojo.db_station.PowerInf; |
| | | import com.whyc.pojo.db_station.StationInf; |
| | | import com.whyc.util.DateUtil; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalTime; |
| | | import java.util.*; |
| | | import java.util.concurrent.CountDownLatch; |
| | | import java.util.concurrent.ThreadPoolExecutor; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import java.time.LocalDateTime; |
| | | import java.util.List; |
| | | |
| | | import static com.whyc.util.DateUtil.convertToLocalDateTime; |
| | | |
| | | |
| | | @Service |
| | | public class LeaderHomeService { |
| | |
| | | private StationInfService stationInfService; |
| | | |
| | | @Autowired |
| | | private BattTestDataInfService bdTestDataInfService; |
| | | private BatttestdataInfService battTestDataInfService; |
| | | |
| | | public Response getAll() { |
| | | @Autowired |
| | | private PwrdevAlarmService powerAlarmService; |
| | | |
| | | @Autowired |
| | | private DevalarmDataService devAlarmService; |
| | | |
| | | @Autowired |
| | | private BattalarmDataService battAlarmService; |
| | | |
| | | @Autowired |
| | | private AppParamService appParamService; |
| | | |
| | | @Autowired |
| | | private BatttestdataIdService battTestDataIdService; |
| | | |
| | | |
| | | public Response getAll(Integer userId) { |
| | | Response response = new Response(); |
| | | Map<String,Object> map = new HashMap<>(); |
| | | |
| | | CountDownLatch latch = new CountDownLatch(1); |
| | | CountDownLatch latch = new CountDownLatch(6); |
| | | ThreadPoolExecutor poolExecutor = ThreadPoolExecutorFactory.getPoolExecutor(); |
| | | |
| | | //站点信息统计,按站点类型和站点电压 TODO 待李军明确站点类型是什么字段,目前没有 |
| | | //站点信息统计, |
| | | poolExecutor.execute(() -> { |
| | | List<StationInf> stationInfList =stationInfService.getAllWithFields("station_type"); |
| | | Map<String, List<StationInf>> typeMap = stationInfList.stream().collect(Collectors.groupingBy(StationInf::getStationType)); |
| | | stationInfoStatistics(userId, map); |
| | | latch.countDown(); |
| | | }); |
| | | |
| | | //电源信息(品牌及电压)统计 |
| | | poolExecutor.execute(() -> { |
| | | powerInfoStatistics(userId, map); |
| | | latch.countDown(); |
| | | }); |
| | | //蓄电池信息(品牌及电压)统计 |
| | | poolExecutor.execute(() -> { |
| | | batteryInfoStatistics(userId, map); |
| | | latch.countDown(); |
| | | }); |
| | | //测试数据信息统计 |
| | | poolExecutor.execute(() -> { |
| | | testDataInfoStatistics(userId, map); |
| | | latch.countDown(); |
| | | }); |
| | | //10类基础资产信息统计 |
| | | poolExecutor.execute(() -> { |
| | | deviceInfoStatistics(userId, map); |
| | | latch.countDown(); |
| | | }); |
| | | |
| | | /** |
| | | * 实时告警信息统计 |
| | | * 逻辑更新: |
| | | * 电池里面的单体(单体1,单体2..)单项,可以合并. 电源里面的整流器(整流器1,整流器2..)告警单项可以合并 |
| | | * 合并后时间采用最先产生报警的那个时间 |
| | | */ |
| | | poolExecutor.execute(() -> { |
| | | alarmRealtimeStatistics(userId, map); |
| | | latch.countDown(); |
| | | }); |
| | | |
| | | return response; |
| | | } |
| | | |
| | | private void deviceInfoStatistics(Integer userId, Map<String, Object> map) { |
| | | NameValueIntDto baseDto = new NameValueIntDto(); |
| | | int powerCount = powerInfService.getListByUserId(userId).size(); |
| | | map.put("powerCount", powerCount); |
| | | List<BattInf> battInfList = battInfService.getListByUserId(userId); |
| | | int battCount = battInfList.size(); |
| | | Map<Integer, List<BattInf>> devIdMap = battInfList.stream().collect(Collectors.groupingBy(BattInf::getDevId)); |
| | | map.put("devCount", devIdMap.size()); |
| | | map.put("battCount",battCount); |
| | | int monCountTotal = 0; |
| | | for (int i = 0; i < battCount; i++) { |
| | | int monCount = battInfList.get(i).getMoncount().intValue(); |
| | | monCountTotal += monCount; |
| | | } |
| | | map.put("monCount", monCountTotal); |
| | | |
| | | LocalDateTime now = LocalDateTime.now(); |
| | | //本年第一天 |
| | | LocalDateTime yearStart = now.withDayOfYear(1).withHour(0).withMinute(0).withSecond(0).withNano(0); |
| | | Date yearStartTime = DateUtil.convertToDate(yearStart); |
| | | //去年的第一天 |
| | | LocalDateTime lastYearStart = now.minusYears(1).withDayOfYear(1).withHour(0).withMinute(0).withSecond(0).withNano(0); |
| | | //去年的最后一天 |
| | | int lastYear = now.minusYears(1).getYear(); |
| | | LocalDate lastDayOfLastYear = LocalDate.of(lastYear, 12, 31); |
| | | LocalDateTime lastYearEnd = lastDayOfLastYear.atTime(LocalTime.MAX); |
| | | Date lastYearStartTime = DateUtil.convertToDate(lastYearStart); |
| | | Date lastYearEndTime = DateUtil.convertToDate(lastYearEnd); |
| | | |
| | | //本年已放电电池数量 |
| | | //本年未放电电池数量 |
| | | //去年已放电电池数量 |
| | | //去年未放电电池数量 |
| | | int hrDisBattCount = battTestDataInfService.getHrDisCount(userId,yearStartTime,null); |
| | | int hrNoDisBattCount = battCount - hrDisBattCount; |
| | | int hrDisBattCountLastYear = battTestDataInfService.getHrDisCount(userId,lastYearStartTime,lastYearEndTime); |
| | | int hrNoDisBattCountLastYear = battCount - hrDisBattCountLastYear; |
| | | map.put("hrDisBattCount", hrDisBattCount); |
| | | map.put("hrNoDisBattCount", hrNoDisBattCount); |
| | | map.put("hrDisBattCountLastYear", hrDisBattCountLastYear); |
| | | map.put("hrNoDisBattCountLastYear", hrNoDisBattCountLastYear); |
| | | |
| | | //本年优良劣化损坏数量 |
| | | List<BattCapInfoDto> battCapInfoList = getBattCapInfo(battInfList,yearStartTime,null); |
| | | long battGoodCount = battCapInfoList.stream().filter(battCapInfo -> battCapInfo.getPerformance().equals(BattCapperformanceEnum.BATTSTATE_1.getStateName())).count(); |
| | | long battBadCount = battCapInfoList.stream().filter(battCapInfo -> battCapInfo.getPerformance().equals(BattCapperformanceEnum.BATTSTATE_2.getStateName())).count(); |
| | | long battDamageCount = battCapInfoList.stream().filter(battCapInfo -> battCapInfo.getPerformance().equals(BattCapperformanceEnum.BATTSTATE_3.getStateName())).count(); |
| | | //去年优良劣化损坏数量 |
| | | List<BattCapInfoDto> battCapInfoListLastYear = getBattCapInfo(battInfList,lastYearStartTime,lastYearEndTime); |
| | | long battGoodCountLastYear = battCapInfoListLastYear.stream().filter(battCapInfo -> battCapInfo.getPerformance().equals(BattCapperformanceEnum.BATTSTATE_1.getStateName())).count(); |
| | | long battBadCountLastYear = battCapInfoListLastYear.stream().filter(battCapInfo -> battCapInfo.getPerformance().equals(BattCapperformanceEnum.BATTSTATE_2.getStateName())).count(); |
| | | long battDamageCountLastYear = battCapInfoListLastYear.stream().filter(battCapInfo -> battCapInfo.getPerformance().equals(BattCapperformanceEnum.BATTSTATE_3.getStateName())).count(); |
| | | map.put("battGoodCount", battGoodCount); |
| | | map.put("battBadCount", battBadCount); |
| | | map.put("battDamageCount", battDamageCount); |
| | | map.put("battGoodCountLastYear", battGoodCountLastYear); |
| | | map.put("battBadCountLastYear", battBadCountLastYear); |
| | | map.put("battDamageCountLastYear", battDamageCountLastYear); |
| | | //TODO 优良电源数量 |
| | | map.put("powerGoodCount","优良判定标准待确定" ); |
| | | } |
| | | |
| | | |
| | | private void alarmRealtimeStatistics(Integer userId, Map<String, Object> map) { |
| | | //电池告警信息统计 |
| | | List<AlarmDto> battAlarmListNew = new ArrayList<>(); |
| | | List<AlarmDto> battAlarmList = battAlarmService.getListByUserId(userId, null); |
| | | //合并单体告警的告警信息,对AlarmDto中AlmId 在17~28之间的进行合并. |
| | | Map<String, List<AlarmDto>> mergeMap = battAlarmList.stream() |
| | | .filter(alarm -> alarm.getAlmId() >= 17 && alarm.getAlmId() <= 28) |
| | | .collect(Collectors.groupingBy(temp -> temp.getBattGroupId()+"_"+temp.getAlmId())); |
| | | mergeMap.forEach((almId, list) -> { |
| | | //对list内的字段 单体编号进行合并. 时间取最小的 |
| | | List<AlarmDto> mergeList = list.stream() |
| | | .sorted(Comparator.comparing(AlarmDto::getAlmStartTime)) |
| | | .collect(Collectors.toList()); |
| | | AlarmDto alarmDto = mergeList.get(0); |
| | | //按单体编号排序 |
| | | mergeList.sort(Comparator.comparing(AlarmDto::getMonNum)); |
| | | alarmDto.setMonNumStr(mergeList.stream() |
| | | .map(AlarmDto::getMonNum) |
| | | .map(String::valueOf) |
| | | .collect(Collectors.joining(","))); |
| | | alarmDto.setMonNum(null); |
| | | battAlarmListNew.add(alarmDto); |
| | | }); |
| | | |
| | | List<AlarmDto> battAlarmListOther = battAlarmList.stream().filter(alarm -> alarm.getAlmId() < 17).collect(Collectors.toList()); |
| | | battAlarmListNew.addAll(battAlarmListOther); |
| | | //对告警名称赋值 |
| | | battAlarmListNew.forEach(alarmDto -> { |
| | | alarmDto.setAlmName(BattSingalIdEnum.getValue(alarmDto.getAlmId())); |
| | | }); |
| | | |
| | | //设备告警信息统计 |
| | | List<AlarmDto> devAlarmList = devAlarmService.getListByUserId(userId,null); |
| | | //对告警名称赋值 |
| | | devAlarmList.forEach(alarmDto -> { |
| | | alarmDto.setAlmName(DevAlarmEnum.getValue(alarmDto.getAlmId())); |
| | | }); |
| | | |
| | | //电源告警信息统计 |
| | | List<AlarmDto> powerAlarmListNew = new ArrayList<>(); |
| | | List<AlarmDto> powerAlarmList = powerAlarmService.getListByUserId(userId,null); |
| | | //整流器总故障合并 |
| | | //ALARM_3300001(3300001,"整流器1总故障告警"), |
| | | // ALARM_3300002(3300002,"整流器2总故障告警"), |
| | | // ALARM_3300003(3300003,"整流器3总故障告警"), |
| | | // ALARM_3300004(3300004,"整流器4总故障告警"), |
| | | // ALARM_3300005(3300005,"整流器5总故障告警"), |
| | | // ALARM_3300006(3300006,"整流器6总故障告警"), |
| | | // ALARM_3300007(3300007,"整流器7总故障告警"), |
| | | // ALARM_3300008(3300008,"整流器8总故障告警"), |
| | | // ALARM_3300009(3300009,"整流器9总故障告警"), |
| | | // ALARM_3300010(3300010,"整流器10总故障告警"), |
| | | // ALARM_3300011(3300011,"整流器11总故障告警"), |
| | | // ALARM_3300012(3300012,"整流器12总故障告警"), |
| | | // ALARM_3300013(3300013,"整流器13总故障告警"), |
| | | // ALARM_3300014(3300014,"整流器14总故障告警"), |
| | | // ALARM_3300015(3300015,"整流器15总故障告警"), |
| | | // ALARM_3300016(3300016,"整流器16总故障告警"), |
| | | Map<Integer, List<AlarmDto>> powerMergeMap = powerAlarmList.stream() |
| | | .filter(alarm -> alarm.getAlmId() >= 3300001 && alarm.getAlmId() <= 3300016) |
| | | .collect(Collectors.groupingBy(AlarmDto::getPowerId)); |
| | | powerMergeMap.forEach((powerId, list) -> { |
| | | //对list内的字段 整流器编号进行合并,合并到rectifierName. 时间取最小的 |
| | | List<AlarmDto> mergeList = list.stream() |
| | | .sorted(Comparator.comparing(AlarmDto::getAlmStartTime)) |
| | | .collect(Collectors.toList()); |
| | | AlarmDto alarmDto = mergeList.get(0); |
| | | //按告警id排序 |
| | | mergeList.sort(Comparator.comparing(AlarmDto::getAlmId)); |
| | | StringBuilder rectifierNameSb = new StringBuilder(); |
| | | rectifierNameSb.append("整流器"); |
| | | for (int i = 0; i < list.size(); i++) { |
| | | int almId = list.get(i).getAlmId(); |
| | | switch (almId){ |
| | | case 3300001: |
| | | rectifierNameSb.append("1,"); |
| | | break; |
| | | case 3300002: |
| | | rectifierNameSb.append("2,"); |
| | | break; |
| | | case 3300003: |
| | | rectifierNameSb.append("3,"); |
| | | break; |
| | | case 3300004: |
| | | rectifierNameSb.append("4,"); |
| | | break; |
| | | case 3300005: |
| | | rectifierNameSb.append("5,"); |
| | | break; |
| | | case 3300006: |
| | | rectifierNameSb.append("6,"); |
| | | break; |
| | | case 3300007: |
| | | rectifierNameSb.append("7,"); |
| | | break; |
| | | case 3300008: |
| | | rectifierNameSb.append("8,"); |
| | | break; |
| | | case 3300009: |
| | | rectifierNameSb.append("9,"); |
| | | break; |
| | | case 3300010: |
| | | rectifierNameSb.append("10,"); |
| | | break; |
| | | case 3300011: |
| | | rectifierNameSb.append("11,"); |
| | | break; |
| | | case 3300012: |
| | | rectifierNameSb.append("12,"); |
| | | break; |
| | | case 3300013: |
| | | rectifierNameSb.append("13,"); |
| | | break; |
| | | case 3300014: |
| | | rectifierNameSb.append("14,"); |
| | | break; |
| | | case 3300015: |
| | | rectifierNameSb.append("15,"); |
| | | break; |
| | | case 3300016: |
| | | rectifierNameSb.append("16,"); |
| | | break; |
| | | |
| | | } |
| | | } |
| | | //最后一个,去掉 |
| | | rectifierNameSb.deleteCharAt(rectifierNameSb.length()-1); |
| | | rectifierNameSb.append("总故障告警"); |
| | | alarmDto.setRectifierName(rectifierNameSb.toString()); |
| | | powerAlarmListNew.add(alarmDto); |
| | | }); |
| | | |
| | | //整流器过压合并 |
| | | //ALARM_3300017(3300017,"整流器1过压告警"), |
| | | // ALARM_3300018(3300018,"整流器2过压告警"), |
| | | // ALARM_3300019(3300019,"整流器3过压告警"), |
| | | // ALARM_3300020(3300020,"整流器4过压告警"), |
| | | // ALARM_3300021(3300021,"整流器5过压告警"), |
| | | // ALARM_3300022(3300022,"整流器6过压告警"), |
| | | // ALARM_3300023(3300023,"整流器7过压告警"), |
| | | // ALARM_3300024(3300024,"整流器8过压告警"), |
| | | // ALARM_3300025(3300025,"整流器9过压告警"), |
| | | // ALARM_3300026(3300026,"整流器10过压告警"), |
| | | // ALARM_3300027(3300027,"整流器11过压告警"), |
| | | // ALARM_3300028(3300028,"整流器12过压告警"), |
| | | // ALARM_3300029(3300029,"整流器13过压告警"), |
| | | // ALARM_3300030(3300030,"整流器14过压告警"), |
| | | // ALARM_3300031(3300031,"整流器15过压告警"), |
| | | // ALARM_3300032(3300032,"整流器16过压告警"), |
| | | Map<Integer, List<AlarmDto>> powerOverVolMergeMap = powerAlarmList.stream() |
| | | .filter(alarm -> alarm.getAlmId() >= 3300017 && alarm.getAlmId() <= 3300032) |
| | | .collect(Collectors.groupingBy(AlarmDto::getPowerId)); |
| | | powerOverVolMergeMap.forEach((powerId, list) -> { |
| | | //对list内的字段 整流器编号进行合并,合并到rectifierName. 时间取最小的 |
| | | List<AlarmDto> mergeList = list.stream() |
| | | .sorted(Comparator.comparing(AlarmDto::getAlmStartTime)) |
| | | .collect(Collectors.toList()); |
| | | AlarmDto alarmDto = mergeList.get(0); |
| | | //按告警id排序 |
| | | mergeList.sort(Comparator.comparing(AlarmDto::getAlmId)); |
| | | StringBuilder rectifierNameSb = new StringBuilder(); |
| | | rectifierNameSb.append("整流器"); |
| | | for (int i = 0; i < list.size(); i++) { |
| | | int almId = list.get(i).getAlmId(); |
| | | switch (almId){ |
| | | case 3300017: |
| | | rectifierNameSb.append("1,"); |
| | | break; |
| | | case 3300018: |
| | | rectifierNameSb.append("2,"); |
| | | break; |
| | | case 3300019: |
| | | rectifierNameSb.append("3,"); |
| | | break; |
| | | case 3300020: |
| | | rectifierNameSb.append("4,"); |
| | | break; |
| | | case 3300021: |
| | | rectifierNameSb.append("5,"); |
| | | break; |
| | | case 3300022: |
| | | rectifierNameSb.append("6,"); |
| | | break; |
| | | case 3300023: |
| | | rectifierNameSb.append("7,"); |
| | | break; |
| | | case 3300024: |
| | | rectifierNameSb.append("8,"); |
| | | break; |
| | | case 3300025: |
| | | rectifierNameSb.append("9,"); |
| | | break; |
| | | case 3300026: |
| | | rectifierNameSb.append("10,"); |
| | | break; |
| | | case 3300027: |
| | | rectifierNameSb.append("11,"); |
| | | break; |
| | | case 3300028: |
| | | rectifierNameSb.append("12,"); |
| | | break; |
| | | case 3300029: |
| | | rectifierNameSb.append("13,"); |
| | | break; |
| | | case 3300030: |
| | | rectifierNameSb.append("14,"); |
| | | break; |
| | | case 3300031: |
| | | rectifierNameSb.append("15,"); |
| | | break; |
| | | case 3300032: |
| | | rectifierNameSb.append("16,"); |
| | | break; |
| | | } |
| | | } |
| | | //最后一个,去掉 |
| | | rectifierNameSb.deleteCharAt(rectifierNameSb.length()-1); |
| | | rectifierNameSb.append("过压告警"); |
| | | alarmDto.setRectifierName(rectifierNameSb.toString()); |
| | | powerAlarmListNew.add(alarmDto); |
| | | }); |
| | | //整流器欠压合并 |
| | | //ALARM_3300033(3300033,"整流器1欠压告警"), |
| | | // ALARM_3300034(3300034,"整流器2欠压告警"), |
| | | // ALARM_3300035(3300035,"整流器3欠压告警"), |
| | | // ALARM_3300036(3300036,"整流器4欠压告警"), |
| | | // ALARM_3300037(3300037,"整流器5欠压告警"), |
| | | // ALARM_3300038(3300038,"整流器6欠压告警"), |
| | | // ALARM_3300039(3300039,"整流器7欠压告警"), |
| | | // ALARM_3300040(3300040,"整流器8欠压告警"), |
| | | // ALARM_3300041(3300041,"整流器9欠压告警"), |
| | | // ALARM_3300042(3300042,"整流器10欠压告警"), |
| | | // ALARM_3300043(3300043,"整流器11欠压告警"), |
| | | // ALARM_3300044(3300044,"整流器12欠压告警"), |
| | | // ALARM_3300045(3300045,"整流器13欠压告警"), |
| | | // ALARM_3300046(3300046,"整流器14欠压告警"), |
| | | // ALARM_3300047(3300047,"整流器15欠压告警"), |
| | | // ALARM_3300048(3300048,"整流器16欠压告警"), |
| | | Map<Integer, List<AlarmDto>> powerBellowVolMergeMap = powerAlarmList.stream() |
| | | .filter(alarm -> alarm.getAlmId() >= 3300033 && alarm.getAlmId() <= 3300048) |
| | | .collect(Collectors.groupingBy(AlarmDto::getPowerId)); |
| | | powerBellowVolMergeMap.forEach((powerId, list) -> { |
| | | //对list内的字段 整流器编号进行合并,合并到rectifierName. 时间取最小的 |
| | | List<AlarmDto> mergeList = list.stream() |
| | | .sorted(Comparator.comparing(AlarmDto::getAlmStartTime)) |
| | | .collect(Collectors.toList()); |
| | | AlarmDto alarmDto = mergeList.get(0); |
| | | //按告警id排序 |
| | | mergeList.sort(Comparator.comparing(AlarmDto::getAlmId)); |
| | | StringBuilder rectifierNameSb = new StringBuilder(); |
| | | rectifierNameSb.append("整流器"); |
| | | for (int i = 0; i < list.size(); i++) { |
| | | int almId = list.get(i).getAlmId(); |
| | | switch (almId){ |
| | | case 3300033: |
| | | rectifierNameSb.append("1,"); |
| | | break; |
| | | case 3300034: |
| | | rectifierNameSb.append("2,"); |
| | | break; |
| | | case 3300035: |
| | | rectifierNameSb.append("3,"); |
| | | break; |
| | | case 3300036: |
| | | rectifierNameSb.append("4,"); |
| | | break; |
| | | case 3300037: |
| | | rectifierNameSb.append("5,"); |
| | | break; |
| | | case 3300038: |
| | | rectifierNameSb.append("6,"); |
| | | break; |
| | | case 3300039: |
| | | rectifierNameSb.append("7,"); |
| | | break; |
| | | case 3300040: |
| | | rectifierNameSb.append("8,"); |
| | | break; |
| | | case 3300041: |
| | | rectifierNameSb.append("9,"); |
| | | break; |
| | | case 3300042: |
| | | rectifierNameSb.append("10,"); |
| | | break; |
| | | case 3300043: |
| | | rectifierNameSb.append("11,"); |
| | | break; |
| | | case 3300044: |
| | | rectifierNameSb.append("12,"); |
| | | break; |
| | | case 3300045: |
| | | rectifierNameSb.append("13,"); |
| | | break; |
| | | case 3300046: |
| | | rectifierNameSb.append("14,"); |
| | | break; |
| | | case 3300047: |
| | | rectifierNameSb.append("15,"); |
| | | break; |
| | | case 3300048: |
| | | rectifierNameSb.append("16,"); |
| | | break; |
| | | } |
| | | } |
| | | //最后一个,去掉 |
| | | rectifierNameSb.deleteCharAt(rectifierNameSb.length()-1); |
| | | rectifierNameSb.append("欠压告警"); |
| | | alarmDto.setRectifierName(rectifierNameSb.toString()); |
| | | powerAlarmListNew.add(alarmDto); |
| | | }); |
| | | |
| | | //整流器过流告警合并 |
| | | //ALARM_3300049(3300049,"整流器1过流告警"), |
| | | // ALARM_3300050(3300050,"整流器2过流告警"), |
| | | // ALARM_3300051(3300051,"整流器3过流告警"), |
| | | // ALARM_3300052(3300052,"整流器4过流告警"), |
| | | // ALARM_3300053(3300053,"整流器5过流告警"), |
| | | // ALARM_3300054(3300054,"整流器6过流告警"), |
| | | // ALARM_3300055(3300055,"整流器7过流告警"), |
| | | // ALARM_3300056(3300056,"整流器8过流告警"), |
| | | // ALARM_3300057(3300057,"整流器9过流告警"), |
| | | // ALARM_3300058(3300058,"整流器10过流告警"), |
| | | // ALARM_3300059(3300059,"整流器11过流告警"), |
| | | // ALARM_3300060(3300060,"整流器12过流告警"), |
| | | // ALARM_3300061(3300061,"整流器13过流告警"), |
| | | // ALARM_3300062(3300062,"整流器14过流告警"), |
| | | // ALARM_3300063(3300063,"整流器15过流告警"), |
| | | // ALARM_3300064(3300064,"整流器16过流告警"), |
| | | Map<Integer, List<AlarmDto>> powerOverCurrentMergeMap = powerAlarmList.stream() |
| | | .filter(alarm -> alarm.getAlmId() >= 3300049 && alarm.getAlmId() <= 3300064) |
| | | .collect(Collectors.groupingBy(AlarmDto::getPowerId)); |
| | | powerOverCurrentMergeMap.forEach((powerId, list) -> { |
| | | //对list内的字段 整流器编号进行合并,合并到rectifierName. 时间取最小的 |
| | | List<AlarmDto> mergeList = list.stream() |
| | | .sorted(Comparator.comparing(AlarmDto::getAlmStartTime)) |
| | | .collect(Collectors.toList()); |
| | | AlarmDto alarmDto = mergeList.get(0); |
| | | //按告警id排序 |
| | | mergeList.sort(Comparator.comparing(AlarmDto::getAlmId)); |
| | | StringBuilder rectifierNameSb = new StringBuilder(); |
| | | rectifierNameSb.append("整流器"); |
| | | for (int i = 0; i < list.size(); i++) { |
| | | int almId = list.get(i).getAlmId(); |
| | | switch (almId){ |
| | | case 3300049: |
| | | rectifierNameSb.append("1,"); |
| | | break; |
| | | case 3300050: |
| | | rectifierNameSb.append("2,"); |
| | | break; |
| | | case 3300051: |
| | | rectifierNameSb.append("3,"); |
| | | break; |
| | | case 3300052: |
| | | rectifierNameSb.append("4,"); |
| | | break; |
| | | case 3300053: |
| | | rectifierNameSb.append("5,"); |
| | | break; |
| | | case 3300054: |
| | | rectifierNameSb.append("6,"); |
| | | break; |
| | | case 3300055: |
| | | rectifierNameSb.append("7,"); |
| | | break; |
| | | case 3300056: |
| | | rectifierNameSb.append("8,"); |
| | | break; |
| | | case 3300057: |
| | | rectifierNameSb.append("9,"); |
| | | break; |
| | | case 3300058: |
| | | rectifierNameSb.append("10,"); |
| | | break; |
| | | case 3300059: |
| | | rectifierNameSb.append("11,"); |
| | | break; |
| | | case 3300060: |
| | | rectifierNameSb.append("12,"); |
| | | break; |
| | | case 3300061: |
| | | rectifierNameSb.append("13,"); |
| | | break; |
| | | case 3300062: |
| | | rectifierNameSb.append("14,"); |
| | | break; |
| | | case 3300063: |
| | | rectifierNameSb.append("15,"); |
| | | break; |
| | | case 3300064: |
| | | rectifierNameSb.append("16,"); |
| | | break; |
| | | } |
| | | } |
| | | //最后一个,去掉 |
| | | rectifierNameSb.deleteCharAt(rectifierNameSb.length()-1); |
| | | rectifierNameSb.append("过流告警"); |
| | | alarmDto.setRectifierName(rectifierNameSb.toString()); |
| | | powerAlarmListNew.add(alarmDto); |
| | | }); |
| | | |
| | | //整流器交流异常告警合并 |
| | | //ALARM_3300065(3300065,"整流器1交流异常告警"), |
| | | // ALARM_3300066(3300066,"整流器2交流异常告警"), |
| | | // ALARM_3300067(3300067,"整流器3交流异常告警"), |
| | | // ALARM_3300068(3300068,"整流器4交流异常告警"), |
| | | // ALARM_3300069(3300069,"整流器5交流异常告警"), |
| | | // ALARM_3300070(3300070,"整流器6交流异常告警"), |
| | | // ALARM_3300071(3300071,"整流器7交流异常告警"), |
| | | // ALARM_3300072(3300072,"整流器8交流异常告警"), |
| | | // ALARM_3300073(3300073,"整流器9交流异常告警"), |
| | | // ALARM_3300074(3300074,"整流器10交流异常告警"), |
| | | // ALARM_3300075(3300075,"整流器11交流异常告警"), |
| | | // ALARM_3300076(3300076,"整流器12交流异常告警"), |
| | | // ALARM_3300077(3300077,"整流器13交流异常告警"), |
| | | // ALARM_3300078(3300078,"整流器14交流异常告警"), |
| | | // ALARM_3300079(3300079,"整流器15交流异常告警"), |
| | | // ALARM_3300080(3300080,"整流器16交流异常告警"), |
| | | Map<Integer, List<AlarmDto>> powerACMergeMap = powerAlarmList.stream() |
| | | .filter(alarm -> alarm.getAlmId() >= 3300065 && alarm.getAlmId() <= 3300080) |
| | | .collect(Collectors.groupingBy(AlarmDto::getPowerId)); |
| | | powerACMergeMap.forEach((powerId, list) -> { |
| | | //对list内的字段 整流器编号进行合并,合并到rectifierName. 时间取最小的 |
| | | List<AlarmDto> mergeList = list.stream() |
| | | .sorted(Comparator.comparing(AlarmDto::getAlmStartTime)) |
| | | .collect(Collectors.toList()); |
| | | AlarmDto alarmDto = mergeList.get(0); |
| | | //按告警id排序 |
| | | mergeList.sort(Comparator.comparing(AlarmDto::getAlmId)); |
| | | StringBuilder rectifierNameSb = new StringBuilder(); |
| | | rectifierNameSb.append("整流器"); |
| | | for (int i = 0; i < list.size(); i++) { |
| | | int almId = list.get(i).getAlmId(); |
| | | switch (almId){ |
| | | case 3300065: |
| | | rectifierNameSb.append("1,"); |
| | | break; |
| | | case 3300066: |
| | | rectifierNameSb.append("2,"); |
| | | break; |
| | | case 3300067: |
| | | rectifierNameSb.append("3,"); |
| | | break; |
| | | case 3300068: |
| | | rectifierNameSb.append("4,"); |
| | | break; |
| | | case 3300069: |
| | | rectifierNameSb.append("5,"); |
| | | break; |
| | | case 3300070: |
| | | rectifierNameSb.append("6,"); |
| | | break; |
| | | case 3300071: |
| | | rectifierNameSb.append("7,"); |
| | | break; |
| | | case 3300072: |
| | | rectifierNameSb.append("8,"); |
| | | break; |
| | | case 3300073: |
| | | rectifierNameSb.append("9,"); |
| | | break; |
| | | case 3300074: |
| | | rectifierNameSb.append("10,"); |
| | | break; |
| | | case 3300075: |
| | | rectifierNameSb.append("11,"); |
| | | break; |
| | | case 3300076: |
| | | rectifierNameSb.append("12,"); |
| | | break; |
| | | case 3300077: |
| | | rectifierNameSb.append("13,"); |
| | | break; |
| | | case 3300078: |
| | | rectifierNameSb.append("14,"); |
| | | break; |
| | | case 3300079: |
| | | rectifierNameSb.append("15,"); |
| | | break; |
| | | case 3300080: |
| | | rectifierNameSb.append("16,"); |
| | | break; |
| | | } |
| | | } |
| | | //最后一个,去掉 |
| | | rectifierNameSb.deleteCharAt(rectifierNameSb.length()-1); |
| | | rectifierNameSb.append("交流异常告警"); |
| | | alarmDto.setRectifierName(rectifierNameSb.toString()); |
| | | powerAlarmListNew.add(alarmDto); |
| | | }); |
| | | |
| | | //过滤掉产生合并的告警 |
| | | List<AlarmDto> powerAlarmListOther = powerAlarmList.stream().filter(alarm -> alarm.getAlmId() < 3300001 || alarm.getAlmId() > 3300080).collect(Collectors.toList()); |
| | | powerAlarmListNew.addAll(powerAlarmListOther); |
| | | //对告警名称赋值 |
| | | powerAlarmListNew.forEach(alarmDto -> { |
| | | alarmDto.setAlmName(PowerAlarmEnum.getValue(alarmDto.getAlmId())); |
| | | }); |
| | | //对存在RectifierName的元素,将rectifierName字段赋值给almName字段 |
| | | powerAlarmListNew.forEach(alarmDto -> { |
| | | if(alarmDto.getRectifierName() != null){ |
| | | alarmDto.setAlmName(alarmDto.getRectifierName()); |
| | | } |
| | | }); |
| | | |
| | | |
| | | //整合所有的告警 |
| | | powerAlarmListNew.addAll(devAlarmList); |
| | | powerAlarmListNew.addAll(battAlarmListNew); |
| | | |
| | | //按照时间进行倒序 |
| | | powerAlarmListNew.sort(Comparator.comparing(AlarmDto::getAlmStartTime).reversed()); |
| | | map.put("alarmList",powerAlarmListNew); |
| | | } |
| | | |
| | | |
| | | protected void testDataInfoStatistics(Integer userId, Map<String, Object> map) { |
| | | List<BatttestdataInf> testInfList = battTestDataInfService.getListByUserId(userId); |
| | | //过滤出本月的 |
| | | LocalDateTime startOfMonth = DateUtil.getStartOfMonth(); |
| | | List<BatttestdataInf> testInfListOfMonth = testInfList.stream() |
| | | .filter(testData -> { |
| | | LocalDateTime startTime = convertToLocalDateTime(testData.getTestStarttime()); |
| | | return !startTime.isBefore(startOfMonth); |
| | | }) |
| | | .collect(Collectors.toList()); |
| | | |
| | | //统计本月各种充放电类型及数量 |
| | | List<NameValueDto> testInfOfMonth = getChargeAndDischargeStatistics(testInfListOfMonth); |
| | | map.put("testInf_month",testInfOfMonth); |
| | | |
| | | //过滤出本季度的 |
| | | LocalDateTime startOfQuarter = DateUtil.getStartOfQuarter(); |
| | | List<BatttestdataInf> testInfListOfQuarter = testInfList.stream() |
| | | .filter(testData -> { |
| | | LocalDateTime startTime = convertToLocalDateTime(testData.getTestStarttime()); |
| | | return !startTime.isBefore(startOfQuarter); |
| | | }) |
| | | .collect(Collectors.toList()); |
| | | |
| | | //统计本季度各种充放电类型及数量 |
| | | List<NameValueDto> testInfOfQuarter = getChargeAndDischargeStatistics(testInfListOfQuarter); |
| | | map.put("testInf_quarter",testInfOfQuarter); |
| | | |
| | | //过滤出本年的 |
| | | LocalDateTime startOfYear = DateUtil.getStartOfYear(); |
| | | List<BatttestdataInf> testInfListOfYear = testInfList.stream() |
| | | .filter(testData -> { |
| | | LocalDateTime startTime = convertToLocalDateTime(testData.getTestStarttime()); |
| | | return !startTime.isBefore(startOfYear); |
| | | }) |
| | | .collect(Collectors.toList()); |
| | | |
| | | //统计本年各种充放电类型及数量 |
| | | List<NameValueDto> testInfOfYear = getChargeAndDischargeStatistics(testInfListOfYear); |
| | | map.put("testInf_year",testInfOfYear); |
| | | } |
| | | |
| | | /** |
| | | * 统计各种充放电类型及数量 |
| | | * @param testInfListOfMonth 被统计的列表 |
| | | * @return |
| | | */ |
| | | private List<NameValueDto> getChargeAndDischargeStatistics(List<BatttestdataInf> testInfListOfMonth) { |
| | | List<NameValueDto> testInfOfMonth = new ArrayList<>(); |
| | | int chargeHr = 0; |
| | | int chargeJc = 0; |
| | | int dischargeHr = 0; |
| | | int dischargeJc = 0; |
| | | for (int i = 0; i < testInfListOfMonth.size(); i++) { |
| | | BatttestdataInf testData = testInfListOfMonth.get(i); |
| | | if (testData.getTestType() == 3) { // 测试类型为放电 |
| | | if (testData.getTestStarttype() == 3) { //核容放电 |
| | | dischargeHr++; |
| | | } else if(testData.getTestStarttype() != 4){ //监测放电 |
| | | dischargeJc++; |
| | | } |
| | | } else if (testData.getTestType() == 2) { // 测试类型为充电 |
| | | if (testData.getTestStarttype() == 3) { //核容充电 |
| | | chargeHr++; |
| | | } else { //监测充电 |
| | | chargeJc++; |
| | | } |
| | | } |
| | | } |
| | | //核容放电,核容充电,监测放电,检测充电 |
| | | testInfOfMonth.add(new NameValueDto("核容放电",String.valueOf(dischargeHr))); |
| | | testInfOfMonth.add(new NameValueDto("核容充电",String.valueOf(chargeHr))); |
| | | testInfOfMonth.add(new NameValueDto("监测放电",String.valueOf(dischargeJc))); |
| | | testInfOfMonth.add(new NameValueDto("监测充电",String.valueOf(chargeJc))); |
| | | return testInfOfMonth; |
| | | } |
| | | |
| | | protected void batteryInfoStatistics(Integer userId, Map<String, Object> map) { |
| | | List<BattInf> battInfList = battInfService.getListByUserId(userId); |
| | | Map<String, List<BattInf>> brandMap = battInfList.stream().collect(Collectors.groupingBy(BattInf::getProduct)); |
| | | Map<Float, List<BattInf>> volMap = battInfList.stream().collect(Collectors.groupingBy(BattInf::getMonvolstd)); |
| | | |
| | | List<NameValueDto> brandList = new ArrayList<>(); |
| | | brandMap.forEach((k,v)->{ |
| | | NameValueDto brandDto = new NameValueDto(k, String.valueOf(v.size())); |
| | | brandList.add(brandDto); |
| | | }); |
| | | map.put("battGroupInfo_brand",brandList); |
| | | |
| | | List<NameValueDto> volList = new ArrayList<>(); |
| | | volMap.forEach((k,v)->{ |
| | | NameValueDto volDto = new NameValueDto(String.valueOf(k), String.valueOf(v.size())); |
| | | volList.add(volDto); |
| | | }); |
| | | map.put("battGroupInfo_vol",volList); |
| | | } |
| | | |
| | | protected void powerInfoStatistics(Integer userId, Map<String, Object> map) { |
| | | List<PowerInf> powerInfList = powerInfService.getListByUserId(userId); |
| | | Map<String, List<PowerInf>> brandMap = powerInfList.stream().collect(Collectors.groupingBy(PowerInf::getCompany)); |
| | | Map<Integer, List<PowerInf>> typeMap = powerInfList.stream().collect(Collectors.groupingBy(PowerInf::getPowerType)); |
| | | |
| | | List<NameValueDto> brandList = new ArrayList<>(); |
| | | brandMap.forEach((k,v)->{ |
| | | NameValueDto brandDto = new NameValueDto(k, String.valueOf(v.size())); |
| | | brandList.add(brandDto); |
| | | }); |
| | | map.put("powerInfo_brand",brandList); |
| | | |
| | | List<NameValueDto> typeList = new ArrayList<>(); |
| | | //电源类型:1:直流,2:通讯,3:配网 |
| | | typeMap.forEach((k,v)->{ |
| | | NameValueDto typeDto = new NameValueDto(); |
| | | switch (k){ |
| | | case 1: |
| | | typeDto.setName("直流"); |
| | | break; |
| | | case 2: |
| | | typeDto.setName("通讯"); |
| | | break; |
| | | case 3: |
| | | typeDto.setName("配网"); |
| | | break; |
| | | } |
| | | typeDto.setValue(String.valueOf(v.size())); |
| | | typeList.add(typeDto); |
| | | }); |
| | | map.put("powerInfo_type",typeList); |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 按站点类型和站点电压 |
| | | * 站点类型:节点/非节点 |
| | | */ |
| | | private void stationInfoStatistics(Integer userId, Map<String, Object> map) { |
| | | List<StationInf> stationInfList =stationInfService.getListByUserId(userId); |
| | | Map<Integer, List<StationInf>> nodeMap = stationInfList.stream().collect(Collectors.groupingBy(StationInf::getNodeStation)); |
| | | Map<String, List<StationInf>> volMap = stationInfList.stream().collect(Collectors.groupingBy(StationInf::getStationType)); |
| | | |
| | | List<NameValueDto> stationTypeList = new ArrayList<>(); |
| | | List<NameValueDto> stationVolList = new ArrayList<>(); |
| | | nodeMap.forEach((k,v)->{ |
| | | NameValueDto stationTypeDto = new NameValueDto(k == 0 ? "非节点" : "节点", String.valueOf(v.size())); |
| | | stationTypeList.add(stationTypeDto); |
| | | }); |
| | | volMap.forEach((k,v)->{ |
| | | NameValueDto stationVolDto = new NameValueDto(k, String.valueOf(v.size())); |
| | | stationVolList.add(stationVolDto); |
| | | }); |
| | | |
| | | map.put("stationInfo_stationType",stationTypeList); |
| | | map.put("stationInfo_stationVol",stationVolList); |
| | | } |
| | | |
| | | //同一时间同一品牌电池性能统计 |
| | | public Response getBattPerformanceOfSameTimeSameBrand(Integer userId, NameValueIntDto nameValueDto) { |
| | | String brand = nameValueDto.getName(); |
| | | Integer year = nameValueDto.getValue(); |
| | | //投入使用时间条件筛选 |
| | | LocalDateTime startTime = LocalDateTime.now().minusYears(year); |
| | | Date inuseTimeStart = DateUtil.convertToDate(startTime); |
| | | BattInf battInf = new BattInf(); |
| | | battInf.setInuseTime(inuseTimeStart); |
| | | battInf.setProduct(brand); |
| | | //查询满足条件的蓄电池列表 |
| | | List<BattInf> battInfList = battInfService.getListByCondition(userId,battInf); |
| | | List<BattCapInfoDto> battCapInfoList = getBattCapInfo(battInfList,null,null); |
| | | //data,和data2分别返回 统计数量和 站点优良,劣化,损坏 前二的信息 |
| | | List<NameValueIntDto> data = new ArrayList<>(); |
| | | List<NameValueListDto> data2 = new ArrayList<>(); |
| | | //筛选出 站点优良,劣化,损坏 的电池组,并按照这个字段分组 |
| | | List<BattCapInfoDto> goodList = battCapInfoList.stream().filter(battCapInfo -> battCapInfo.getPerformance().equals(BattCapperformanceEnum.BATTSTATE_1.getStateName())) |
| | | .sorted(Comparator.comparing(BattCapInfoDto::getRealCap).reversed()).collect(Collectors.toList()); |
| | | if(goodList.size()==0){ |
| | | data.add(new NameValueIntDto("优良",0)); |
| | | data2.add(new NameValueListDto("优良",goodList)); |
| | | }else{ |
| | | data.add(new NameValueIntDto("优良",goodList.size())); |
| | | data2.add(new NameValueListDto("优良",goodList.subList(0, Math.min(goodList.size(), 2)))); |
| | | } |
| | | List<BattCapInfoDto> badList = battCapInfoList.stream().filter(battCapInfo -> battCapInfo.getPerformance().equals(BattCapperformanceEnum.BATTSTATE_2.getStateName())) |
| | | .sorted(Comparator.comparing(BattCapInfoDto::getRealCap)).collect(Collectors.toList()); |
| | | if(badList.size()==0){ |
| | | data.add(new NameValueIntDto("劣化",0)); |
| | | data2.add(new NameValueListDto("劣化",badList)); |
| | | }else{ |
| | | data.add(new NameValueIntDto("劣化",badList.size())); |
| | | data2.add(new NameValueListDto("劣化",badList.subList(0, Math.min(badList.size(), 2)))); |
| | | } |
| | | List<BattCapInfoDto> damageList = battCapInfoList.stream().filter(battCapInfo -> battCapInfo.getPerformance().equals(BattCapperformanceEnum.BATTSTATE_3.getStateName())) |
| | | .sorted(Comparator.comparing(BattCapInfoDto::getRealCap)).collect(Collectors.toList()); |
| | | if(damageList.size()==0){ |
| | | data.add(new NameValueIntDto("损坏",0)); |
| | | data2.add(new NameValueListDto("损坏",damageList)); |
| | | }else{ |
| | | data.add(new NameValueIntDto("损坏",damageList.size())); |
| | | data2.add(new NameValueListDto("损坏",damageList.subList(0, Math.min(damageList.size(), 2)))); |
| | | } |
| | | return new Response().setII(1,data,data2,""); |
| | | |
| | | } |
| | | |
| | | public Response getBattPerformanceOfSameTimeDiffBrand(Integer userId, int year) { |
| | | //投入使用时间条件筛选 |
| | | LocalDateTime startTime = LocalDateTime.now().minusYears(year); |
| | | Date inuseTimeStart = DateUtil.convertToDate(startTime); |
| | | BattInf battInf = new BattInf(); |
| | | battInf.setInuseTime(inuseTimeStart); |
| | | //查询满足条件的蓄电池列表 |
| | | List<BattInf> battInfList = battInfService.getListByCondition(userId,battInf); |
| | | List<BattCapInfoDto> battCapInfoList = getBattCapInfo(battInfList,null,null); |
| | | |
| | | //data,根据品牌分组统计百分比 |
| | | Map<String, List<BattCapInfoDto>> brandMap = battCapInfoList.stream().collect(Collectors.groupingBy(BattCapInfoDto::getProduct)); |
| | | List<NameValueListDto<NameValueDto>> data = new ArrayList<>(); |
| | | brandMap.forEach((brand,battCapInfoListTemp)->{ |
| | | //k -品牌 |
| | | long goodCount = battCapInfoListTemp.stream().filter(battCapInfo -> battCapInfo.getPerformance().equals(BattCapperformanceEnum.BATTSTATE_1.getStateName())).count(); |
| | | long badCount = battCapInfoListTemp.stream().filter(battCapInfo -> battCapInfo.getPerformance().equals(BattCapperformanceEnum.BATTSTATE_2.getStateName())).count(); |
| | | long damageCount = battCapInfoListTemp.stream().filter(battCapInfo -> battCapInfo.getPerformance().equals(BattCapperformanceEnum.BATTSTATE_3.getStateName())).count(); |
| | | long total = goodCount + badCount + damageCount; |
| | | //良好,劣化,损坏的百分比.(保留0位小数) |
| | | int goodPercent = Math.round((float) goodCount / total * 100); |
| | | int badPercent = Math.round((float) badCount / total * 100); |
| | | int damagePercent = Math.round((float) damageCount / total * 100); |
| | | |
| | | List<NameValueDto> performanceList = new ArrayList<>(); |
| | | performanceList.add(new NameValueDto("优良",String.format("%d%%",goodPercent))); |
| | | performanceList.add(new NameValueDto("劣化",String.format("%d%%",badPercent))); |
| | | performanceList.add(new NameValueDto("损坏",String.format("%d%%",damagePercent))); |
| | | |
| | | NameValueListDto brandPerformance = new NameValueListDto(brand,performanceList); |
| | | data.add(brandPerformance); |
| | | }); |
| | | //data2,优良里面最大的和最小的品牌 |
| | | List<NameValueListDto<NameValueDto>> data2 = new ArrayList<>(); |
| | | List<BattCapInfoDto> goodList = battCapInfoList.stream().filter(battCapInfo -> battCapInfo.getPerformance().equals(BattCapperformanceEnum.BATTSTATE_1.getStateName())) |
| | | .sorted(Comparator.comparing(BattCapInfoDto::getRealCap)).collect(Collectors.toList()); |
| | | NameValueListDto<NameValueDto> goodListDto = new NameValueListDto<>(); |
| | | List<NameValueDto> goodListValue = new ArrayList<>(); |
| | | NameValueDto goodMaxDto = new NameValueDto(); |
| | | NameValueDto goodMinDto = new NameValueDto(); |
| | | goodMaxDto.setName("max"); |
| | | goodMinDto.setName("min"); |
| | | if (goodList.size()==0){ |
| | | goodMaxDto.setValue("-"); |
| | | goodMinDto.setValue("-"); |
| | | }else{ |
| | | goodMinDto.setValue(goodList.get(0).getProduct()); |
| | | goodMaxDto.setValue(goodList.get(goodList.size()-1).getProduct()); |
| | | } |
| | | goodListValue.add(goodMaxDto); |
| | | goodListValue.add(goodMinDto); |
| | | |
| | | goodListDto.setName("优良"); |
| | | goodListDto.setValue(goodListValue); |
| | | data2.add(goodListDto); |
| | | //劣化里面最大的和最小的品牌 |
| | | List<BattCapInfoDto> badList = battCapInfoList.stream().filter(battCapInfo -> battCapInfo.getPerformance().equals(BattCapperformanceEnum.BATTSTATE_2.getStateName())) |
| | | .sorted(Comparator.comparing(BattCapInfoDto::getRealCap)).collect(Collectors.toList()); |
| | | NameValueListDto<NameValueDto> badListDto = new NameValueListDto<>(); |
| | | List<NameValueDto> badListValue = new ArrayList<>(); |
| | | NameValueDto badMaxDto = new NameValueDto(); |
| | | NameValueDto badMinDto = new NameValueDto(); |
| | | badMaxDto.setName("max"); |
| | | badMinDto.setName("min"); |
| | | if (badList.size()==0){ |
| | | badMaxDto.setValue("-"); |
| | | badMinDto.setValue("-"); |
| | | }else{ |
| | | badMinDto.setValue(badList.get(0).getProduct()); |
| | | badMaxDto.setValue(badList.get(badList.size()-1).getProduct()); |
| | | } |
| | | badListValue.add(badMaxDto); |
| | | badListValue.add(badMinDto); |
| | | |
| | | badListDto.setName("劣化"); |
| | | badListDto.setValue(badListValue); |
| | | data2.add(badListDto); |
| | | |
| | | //损坏里面最大的和最小的品牌 |
| | | List<BattCapInfoDto> damageList = battCapInfoList.stream().filter(battCapInfo -> battCapInfo.getPerformance().equals(BattCapperformanceEnum.BATTSTATE_3.getStateName())) |
| | | .sorted(Comparator.comparing(BattCapInfoDto::getRealCap)).collect(Collectors.toList()); |
| | | |
| | | NameValueListDto<NameValueDto> damageListDto = new NameValueListDto<>(); |
| | | List<NameValueDto> damageListValue = new ArrayList<>(); |
| | | NameValueDto damageMaxDto = new NameValueDto(); |
| | | NameValueDto damageMinDto = new NameValueDto(); |
| | | damageMaxDto.setName("max"); |
| | | damageMinDto.setName("min"); |
| | | if (damageList.size()==0){ |
| | | damageMaxDto.setValue("-"); |
| | | damageMinDto.setValue("-"); |
| | | }else if (damageList.size()==1){ |
| | | damageMaxDto.setValue(damageList.get(0).getProduct()); |
| | | damageMinDto.setValue(damageList.get(0).getProduct()); |
| | | }else{ |
| | | damageMinDto.setValue(damageList.get(0).getProduct()); |
| | | damageMaxDto.setValue(damageList.get(damageList.size()-1).getProduct()); |
| | | } |
| | | damageListValue.add(damageMaxDto); |
| | | damageListValue.add(damageMinDto); |
| | | |
| | | damageListDto.setName("损坏"); |
| | | damageListDto.setValue(damageListValue); |
| | | data2.add(damageListDto); |
| | | |
| | | //data3. 性能最佳品牌 TODO 威尔逊置信区间法以及贝叶斯平均法,通过设置的权重,计算各个品牌在指定投运时间内的得分 |
| | | return new Response().setIII(1,data,data2,"性能最佳品牌:TODO 威尔逊置信区间法以及贝叶斯平均法,通过设置的权重,计算各个品牌在指定投运时间内的得分",null); |
| | | |
| | | } |
| | | |
| | | public Response getBattPerformanceOfDiffTimeSameBrand(Integer userId, String brand) { |
| | | BattInf battInf = new BattInf(); |
| | | battInf.setProduct(brand); |
| | | //查询满足条件的蓄电池列表 |
| | | List<BattInf> battInfList = battInfService.getListByCondition(userId,battInf); |
| | | List<BattCapInfoDto> battCapInfoList = getBattCapInfo(battInfList,null,null); |
| | | |
| | | //data,TODO 投运时间的维度参数,先固定变量,后续从数据库获取 |
| | | //time1和time2的单位为年 |
| | | int time1 = 3; |
| | | int time2 = 5; |
| | | |
| | | //筛选battCapInfoList中对象的inuseTime属性 跟当前时间对比,年份差在time1之内,time1-time2之间,time2之后的数据 |
| | | // --------------time2Limit------time1Limit-------now |
| | | LocalDateTime time1DateLimit = LocalDateTime.now().minusYears(time1); |
| | | Date time1Limit = DateUtil.convertToDate(time1DateLimit); |
| | | LocalDateTime time2DateLimit = LocalDateTime.now().minusYears(time2); |
| | | Date time2Limit = DateUtil.convertToDate(time2DateLimit); |
| | | |
| | | //大于time1的数据 |
| | | List<BattCapInfoDto> time1List = battCapInfoList.stream(). |
| | | filter(battCapInfo -> battCapInfo.getInuseTime().compareTo(time1Limit)>=0).collect(Collectors.toList()); |
| | | //在time1和time2之间的数据 |
| | | List<BattCapInfoDto> time12List = battCapInfoList.stream(). |
| | | filter(battCapInfo -> battCapInfo.getInuseTime().compareTo(time2Limit)>0 && battCapInfo.getInuseTime().compareTo(time1Limit)<=0).collect(Collectors.toList()); |
| | | //小于time2的数据 |
| | | List<BattCapInfoDto> time2List = battCapInfoList.stream(). |
| | | filter(battCapInfo -> battCapInfo.getInuseTime().compareTo(time2Limit)<0).collect(Collectors.toList()); |
| | | |
| | | //data |
| | | List<NameValueListDto<NameValueIntDto>> data = new ArrayList<>(); |
| | | NameValueListDto<NameValueIntDto> time1Dto = new NameValueListDto<>(); |
| | | time1Dto.setName(time1+"年内"); |
| | | List<BattCapInfoDto> badListOfTime1 = time1List.stream().filter(battCapInfo -> battCapInfo.getPerformance().equals(BattCapperformanceEnum.BATTSTATE_2.getStateName())) |
| | | .sorted(Comparator.comparing(BattCapInfoDto::getRealCap)).collect(Collectors.toList()); |
| | | List<BattCapInfoDto> damageListOfTime1 = time1List.stream().filter(battCapInfo -> battCapInfo.getPerformance().equals(BattCapperformanceEnum.BATTSTATE_3.getStateName())) |
| | | .sorted(Comparator.comparing(BattCapInfoDto::getRealCap)).collect(Collectors.toList()); |
| | | NameValueIntDto time1BadDto = new NameValueIntDto(); |
| | | time1BadDto.setName("劣化"); |
| | | time1BadDto.setValue(badListOfTime1.size()); |
| | | NameValueIntDto time1DamageDto = new NameValueIntDto(); |
| | | time1DamageDto.setName("损坏"); |
| | | time1DamageDto.setValue(damageListOfTime1.size()); |
| | | time1Dto.setValue(Arrays.asList(time1BadDto,time1DamageDto)); |
| | | |
| | | NameValueListDto<NameValueIntDto> time12Dto = new NameValueListDto<>(); |
| | | time12Dto.setName(time1+"-"+time2+"年"); |
| | | List<BattCapInfoDto> badListOfTime12 = time12List.stream().filter(battCapInfo -> battCapInfo.getPerformance().equals(BattCapperformanceEnum.BATTSTATE_2.getStateName())) |
| | | .sorted(Comparator.comparing(BattCapInfoDto::getRealCap)).collect(Collectors.toList()); |
| | | List<BattCapInfoDto> damageListOfTime12 = time12List.stream().filter(battCapInfo -> battCapInfo.getPerformance().equals(BattCapperformanceEnum.BATTSTATE_3.getStateName())) |
| | | .sorted(Comparator.comparing(BattCapInfoDto::getRealCap)).collect(Collectors.toList()); |
| | | NameValueIntDto time12BadDto = new NameValueIntDto(); |
| | | time12BadDto.setName("劣化"); |
| | | time12BadDto.setValue(badListOfTime12.size()); |
| | | NameValueIntDto time12DamageDto = new NameValueIntDto(); |
| | | time12DamageDto.setName("损坏"); |
| | | time12DamageDto.setValue(damageListOfTime12.size()); |
| | | time12Dto.setValue(Arrays.asList(time12BadDto,time12DamageDto)); |
| | | |
| | | NameValueListDto<NameValueIntDto> time2Dto = new NameValueListDto<>(); |
| | | time2Dto.setName(time2+"年以上"); |
| | | List<BattCapInfoDto> badListOfTime2 = time2List.stream().filter(battCapInfo -> battCapInfo.getPerformance().equals(BattCapperformanceEnum.BATTSTATE_2.getStateName())) |
| | | .sorted(Comparator.comparing(BattCapInfoDto::getRealCap)).collect(Collectors.toList()); |
| | | List<BattCapInfoDto> damageListOfTime2 = time2List.stream().filter(battCapInfo -> battCapInfo.getPerformance().equals(BattCapperformanceEnum.BATTSTATE_3.getStateName())) |
| | | .sorted(Comparator.comparing(BattCapInfoDto::getRealCap)).collect(Collectors.toList()); |
| | | NameValueIntDto time2BadDto = new NameValueIntDto(); |
| | | time2BadDto.setName("劣化"); |
| | | time2BadDto.setValue(badListOfTime2.size()); |
| | | NameValueIntDto time2DamageDto = new NameValueIntDto(); |
| | | time2DamageDto.setName("损坏"); |
| | | time2DamageDto.setValue(damageListOfTime2.size()); |
| | | time2Dto.setValue(Arrays.asList(time2BadDto,time2DamageDto)); |
| | | |
| | | data.add(time1Dto); |
| | | data.add(time12Dto); |
| | | data.add(time2Dto); |
| | | |
| | | //data2 |
| | | List<NameValueListDto<NameValueObjectDto<BattCapInfoDto>>> data2 = new ArrayList<>(); |
| | | NameValueListDto<NameValueObjectDto<BattCapInfoDto>> time1ObjectDto = new NameValueListDto<>(); |
| | | time1ObjectDto.setName(time1+"年内"); |
| | | NameValueObjectDto<BattCapInfoDto> time1BadObjectDto = new NameValueObjectDto(); |
| | | time1BadObjectDto.setName("劣化"); |
| | | time1BadObjectDto.setValue(badListOfTime1.size()==0?new BattCapInfoDto():badListOfTime1.get(0)); |
| | | |
| | | NameValueObjectDto<BattCapInfoDto> time1DamageObjectDto = new NameValueObjectDto(); |
| | | time1DamageObjectDto.setName("损坏"); |
| | | time1DamageObjectDto.setValue(damageListOfTime1.size()==0?new BattCapInfoDto():damageListOfTime1.get(0)); |
| | | time1ObjectDto.setValue(Arrays.asList(time1BadObjectDto,time1DamageObjectDto)); |
| | | data2.add(time1ObjectDto); |
| | | |
| | | NameValueListDto<NameValueObjectDto<BattCapInfoDto>> time12ObjectDto = new NameValueListDto<>(); |
| | | time12ObjectDto.setName(time1+"-"+time2+"年"); |
| | | NameValueObjectDto<BattCapInfoDto> time12BadObjectDto = new NameValueObjectDto(); |
| | | time12BadObjectDto.setName("劣化"); |
| | | time12BadObjectDto.setValue(badListOfTime12.size()==0?new BattCapInfoDto():badListOfTime12.get(0)); |
| | | NameValueObjectDto<BattCapInfoDto> time12DamageObjectDto = new NameValueObjectDto(); |
| | | time12DamageObjectDto.setName("损坏"); |
| | | time12DamageObjectDto.setValue(damageListOfTime12.size()==0?new BattCapInfoDto():damageListOfTime12.get(0)); |
| | | time12ObjectDto.setValue(Arrays.asList(time12BadObjectDto,time12DamageObjectDto)); |
| | | data2.add(time12ObjectDto); |
| | | |
| | | NameValueListDto<NameValueObjectDto<BattCapInfoDto>> time2ObjectDto = new NameValueListDto<>(); |
| | | time2ObjectDto.setName(time2+"年以上"); |
| | | NameValueObjectDto<BattCapInfoDto> time2BadObjectDto = new NameValueObjectDto(); |
| | | time2BadObjectDto.setName("劣化"); |
| | | time2BadObjectDto.setValue(badListOfTime2.size()==0?new BattCapInfoDto():badListOfTime2.get(0)); |
| | | NameValueObjectDto<BattCapInfoDto> time2DamageObjectDto = new NameValueObjectDto(); |
| | | time2DamageObjectDto.setName("损坏"); |
| | | time2DamageObjectDto.setValue(damageListOfTime2.size()==0?new BattCapInfoDto():damageListOfTime2.get(0)); |
| | | time2ObjectDto.setValue(Arrays.asList(time2BadObjectDto,time2DamageObjectDto)); |
| | | data2.add(time2ObjectDto); |
| | | |
| | | return new Response().setII(1,data,data2,""); |
| | | |
| | | } |
| | | |
| | | public List<BattCapInfoDto> getBattCapInfo(List<BattInf> battInfList,Date startTime, Date endTime) { |
| | | //获取核容优劣,损坏参数 |
| | | List<AppParam> paramList=appParamService.getHrParam(); |
| | | Float badValue=0f; |
| | | Float damageValue=0f; |
| | | if(paramList!=null){ |
| | | for (AppParam param:paramList) { |
| | | if(param.getParamNamePsx().equals("batt_mon_deteriorate_val")){ |
| | | badValue=param.getParamValue(); |
| | | } |
| | | if(param.getParamNamePsx().equals("batt_mon_damage_val")){ |
| | | damageValue=param.getParamValue(); |
| | | } |
| | | |
| | | } |
| | | } |
| | | //1查询符合条件的电池组 |
| | | if(battInfList==null||battInfList.size()==0){ |
| | | //return new Response().set(1,false,"当前用户未管理满足条件的电池组"); |
| | | } |
| | | List<BattCapInfoDto> capInfoList = new ArrayList<>(); |
| | | |
| | | for (BattInf battInf:battInfList) { |
| | | BattCapInfoDto capInfo = new BattCapInfoDto(); |
| | | capInfo.setStationName(battInf.getStationName()); |
| | | capInfo.setBattGroupName(battInf.getBattgroupName()); |
| | | capInfo.setDeviceName(battInf.getDevName()); |
| | | capInfo.setProduct(battInf.getProduct()); |
| | | capInfo.setInuseTime(battInf.getInuseTime()); |
| | | |
| | | //2.获取电池组在给定时间段的放电记录(指定时间段的标准核容放电) |
| | | //BatttestdataInf testInf = battTestDataInfService.getLastStandardTestDataByTime(battInf.getBattgroupId(), battInf.getInuseTime(),null); |
| | | BatttestdataInf testInf = battTestDataInfService.getLastStandardTestDataByTime(battInf.getBattgroupId(), startTime,endTime); |
| | | if (testInf == null) { |
| | | capInfo.setRealCap(0f); |
| | | capInfo.setCapPercentage("0"); |
| | | capInfo.setPerformance(BattCapperformanceEnum.BATTSTATE_4.getStateName()); |
| | | continue; |
| | | } |
| | | //找这次放电的最后一笔数据 |
| | | List<BatttestdataId> idDataList = battTestDataIdService.getLastDataByBattgroupId(testInf.getBattgroupId(), testInf.getTestRecordCount(), testInf.getRecordNum()); |
| | | if (idDataList == null || idDataList.size() == 0) { |
| | | capInfo.setRealCap(0f); |
| | | capInfo.setCapPercentage("0"); |
| | | capInfo.setPerformance(BattCapperformanceEnum.BATTSTATE_4.getStateName()); |
| | | continue; |
| | | } |
| | | Float moncapStd = battInf.getMoncapstd(); |
| | | int hourRate = BattCapFactory.GetHourRate(testInf.getTestCap(), testInf.getTestCurr()); |
| | | Float groupRealCap = (float) BattCapFactory.GetMonomerCap(battInf.getMoncapstd(), hourRate, testInf.getTestCap(), testInf.getMaxMonvol(), testInf.getMinMonvol(), testInf.getGroupVol(), BattCapFactory.CapType_Real); |
| | | capInfo.setRealCap(groupRealCap); |
| | | if (groupRealCap >= moncapStd * badValue) { |
| | | capInfo.setPerformance(BattCapperformanceEnum.BATTSTATE_1.getStateName()); |
| | | } |
| | | if (groupRealCap <= moncapStd * damageValue) { |
| | | capInfo.setPerformance(BattCapperformanceEnum.BATTSTATE_3.getStateName()); |
| | | } |
| | | if ((groupRealCap > moncapStd * damageValue) && (groupRealCap < moncapStd * badValue)) { |
| | | capInfo.setPerformance(BattCapperformanceEnum.BATTSTATE_2.getStateName()); |
| | | } |
| | | //保留5位小数 |
| | | String capPercentage = String.format("%.5f", (groupRealCap / battInf.getMoncapstd() * 100)); |
| | | capInfo.setCapPercentage(capPercentage); |
| | | |
| | | capInfoList.add(capInfo); |
| | | } |
| | | return capInfoList; |
| | | } |
| | | |
| | | } |