package com.ruoyi.integration.drainage.util; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.chargingPile.api.feignClient.*; import com.ruoyi.chargingPile.api.model.Site; import com.ruoyi.chargingPile.api.model.TChargingGun; import com.ruoyi.chargingPile.api.model.TChargingPile; import com.ruoyi.chargingPile.api.vo.GetChargingGunByChargingPileIdsVo; import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.integration.drainage.TCECSuperviseUtil; import com.ruoyi.integration.drainage.TokenUtil; import com.ruoyi.integration.drainage.model.*; import com.ruoyi.integration.drainage.model.enu.ConnectorTypeEnum; import com.ruoyi.integration.drainage.model.enu.EquipmentTypeEnum; import com.ruoyi.integration.mongodb.service.UploadRealTimeMonitoringDataService; import com.ruoyi.order.api.dto.ChargingStatisticeDTO; import com.ruoyi.order.api.feignClient.ChargingOrderAccountingStrategyClient; import com.ruoyi.order.api.feignClient.ChargingOrderClient; import com.ruoyi.order.api.model.TChargingBill; import com.ruoyi.order.api.model.TChargingOrder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.web.context.WebServerInitializedEvent; import org.springframework.context.ApplicationListener; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.*; import java.util.stream.Collectors; /** * @author zhibing.pu * @date 2023/7/11 8:39 */ @Component public class TaskUtil implements ApplicationListener { @Resource private SiteClient siteClient; @Autowired private TCECSuperviseUtil tcecSuperviseUtil; @Resource private ChargingGunClient chargingGunClient; @Resource private ChargingOrderClient chargingOrderClient; @Resource private ChargingPileClient chargingPileClient; private Integer port = null; @Override public void onApplicationEvent(WebServerInitializedEvent event) { port = event.getWebServer().getPort(); System.out.println("端口号:" + port); } // 每天凌晨12点30执行 推送充电用能统计 @Scheduled(cron = "0 30 0 * * ?") public void superviseNotificationOperationStatsInfo() { if(null != port && port == 5701){ StationStatsInfoResult res = new StationStatsInfoResult(); int dayOfMonth1 = LocalDateTime.now().getYear(); int dayOfMonth2 = LocalDateTime.now().getMonthValue(); int dayOfMonth3 = LocalDateTime.now().getDayOfMonth(); List data = siteClient.getSiteAll().getData(); LocalDateTime startLocalDateTime = LocalDateTime.of(dayOfMonth1, dayOfMonth2, dayOfMonth3, 0, 0, 0); LocalDateTime endLocalDateTime = LocalDateTime.of(dayOfMonth1, dayOfMonth2, dayOfMonth3, 23, 59, 59); String start = DateUtils.localDateTimeToString(startLocalDateTime); String end = DateUtils.localDateTimeToString(endLocalDateTime); ChargingStatisticeDTO chargingStatisticeDTO = new ChargingStatisticeDTO(); chargingStatisticeDTO.setStartTime(startLocalDateTime); chargingStatisticeDTO.setEndTime(endLocalDateTime); List data1 = chargingOrderClient.getChargingStatistics(chargingStatisticeDTO).getData(); List stationStatsInfos = new ArrayList<>(); for (Site datum : data) { StationStatsInfo stationStatsInfo = new StationStatsInfo(); stationStatsInfo.setStationID(datum.getId().toString()); stationStatsInfo.setEquipmentOwnerID("906171535"); stationStatsInfo.setOperatorID("906171535"); stationStatsInfo.setStationClassification(1); stationStatsInfo.setStartTime(start); stationStatsInfo.setEndTime(end); List chargingOrders = data1.stream().filter(e -> e.getSiteId().equals(datum.getId())).collect(Collectors.toList()); // 充电电量 BigDecimal electricity = new BigDecimal("0"); int chargingCount = 0; for (TChargingOrder chargingOrder : chargingOrders) { if (chargingOrder.getElectricity()!=null){ electricity = electricity.add(chargingOrder.getElectricity()); chargingCount++; } } stationStatsInfo.setStationElectricity(electricity.divide(new BigDecimal("24")).setScale(4, BigDecimal.ROUND_DOWN)); stationStatsInfo.setStationTotalChargeEnergy(electricity.setScale(4, BigDecimal.ROUND_DOWN)); stationStatsInfo.setStationTotalWarningNum(0); stationStatsInfo.setStationTotalOtherEnergy(new BigDecimal("0")); stationStatsInfo.setStationTotalChargeNum(chargingCount); //构建设备统计数据 List EquipmentStatsInfos = new ArrayList<>(); Map> collect = chargingOrders.stream().collect(Collectors.groupingBy(TChargingOrder::getChargingPileId)); for (Integer integer : collect.keySet()) { List tChargingOrders = collect.get(integer); BigDecimal reduce1 = tChargingOrders.stream().map(TChargingOrder::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add); EquipmentStatsInfo equipmentStatsInfo = new EquipmentStatsInfo(); equipmentStatsInfo.setEquipmentClassification(1); long chargingTime = 0L; for (TChargingOrder tChargingOrder : tChargingOrders) { // 累加充电时长 LocalDateTime startTime = tChargingOrder.getStartTime(); LocalDateTime endTime = tChargingOrder.getEndTime(); // 计算时间差 单位分钟 chargingTime += ChronoUnit.SECONDS.between(startTime, endTime)/60; } equipmentStatsInfo.setEquipmentTotalChargeTime(chargingTime); equipmentStatsInfo.setEquipmentTotalChargeNum(tChargingOrders.size()); equipmentStatsInfo.setEquipmentTotalWarningNum(0); equipmentStatsInfo.setEquipmentID(integer.toString()); equipmentStatsInfo.setEquipmentElectricity(reduce1); //构建设备接口统计数据 Map> collect2 = tChargingOrders.stream().collect(Collectors.groupingBy(TChargingOrder::getChargingGunId)); List ConnectorStatsInfos = new ArrayList<>(); for (Integer integer1 : collect2.keySet()) { List tChargingOrders1 = collect2.get(integer1); BigDecimal reduce2 = tChargingOrders1.stream().map(TChargingOrder::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add); TChargingGun chargingGun = chargingGunClient.getChargingGunById(integer1).getData(); ConnectorStatsInfo connectorStatsInfo = new ConnectorStatsInfo(); connectorStatsInfo.setConnectorID(chargingGun.getFullNumber()); connectorStatsInfo.setConnectorElectricity(reduce2); ConnectorStatsInfos.add(connectorStatsInfo); } equipmentStatsInfo.setConnectorStatsInfos(ConnectorStatsInfos); EquipmentStatsInfos.add(equipmentStatsInfo); } stationStatsInfo.setEquipmentStatsInfos(EquipmentStatsInfos); stationStatsInfos.add(stationStatsInfo); } res.setStationStatsInfos(stationStatsInfos); tcecSuperviseUtil.superviseNotificationOperationStatsInfo(res); } } // 每15分钟执行一次的定时任务 @Scheduled(cron = "0 0/15 * * * ?") public void supervise_notification_realtime_power_info() { if(null != port && port == 5701){ List data = siteClient.getSiteAll().getData(); List siteIds = data.stream().filter(s->s.getStatus() == 1).map(Site::getId).collect(Collectors.toList()); List tChargingPiles = chargingPileClient.getChargingPileBySiteIds(siteIds).getData(); List collect1 = tChargingPiles.stream().map(TChargingPile::getId).collect(Collectors.toList()); GetChargingGunByChargingPileIdsVo vo = new GetChargingGunByChargingPileIdsVo(); vo.setChargingPileIds(collect1); List chargingGunList = chargingGunClient.getChargingGunByChargingPileIds(vo).getData(); SupStationPowerInfoResult supStationPowerInfoResult = new SupStationPowerInfoResult(); List stationStatsInfos = new ArrayList<>(); LocalDateTime now = LocalDateTime.now(); LocalDateTime startLocalDateTime = now.minusMinutes(15); ChargingStatisticeDTO chargingStatisticeDTO = new ChargingStatisticeDTO(); chargingStatisticeDTO.setStartTime(startLocalDateTime); chargingStatisticeDTO.setEndTime(now); List data1 = chargingOrderClient.getChargingStatistics(chargingStatisticeDTO).getData(); for (Site datum : data) { List collect = data1.stream().filter(e -> e.getSiteId().equals(datum.getId()) && e.getChargingPower()!=null).collect(Collectors.toList()); SupStationPowerInfo supStationPowerInfo = new SupStationPowerInfo(); supStationPowerInfo.setOperatorID("906171535"); supStationPowerInfo.setEquipmentOwnerID("906171535"); supStationPowerInfo.setStationID(datum.getId().toString()); supStationPowerInfo.setStationClassification(1); supStationPowerInfo.setDataTime(DateUtils.localDateTimeToString(LocalDateTime.now())); BigDecimal divide = collect.stream().map(TChargingOrder::getChargingPower).reduce(BigDecimal.ZERO, BigDecimal::add).divide(new BigDecimal(collect.size()).setScale(4, BigDecimal.ROUND_DOWN)); supStationPowerInfo.setStationRealTimePower(divide); supStationPowerInfo.setEquipmentPowerInfos(buildEquipmentPowerInfo(datum.getId(), tChargingPiles, chargingGunList)); stationStatsInfos.add(supStationPowerInfo); } supStationPowerInfoResult.setSupStationPowerInfos(stationStatsInfos); tcecSuperviseUtil.superviseNotificationRealtimePowerInfo(supStationPowerInfoResult); } } /** * 构建桩数据 * @param tChargingPiles * @return */ public List buildEquipmentPowerInfo(Integer siteId, List tChargingPiles, List chargingGunList){ List equipmentInfos = new ArrayList<>(); List collect = tChargingPiles.stream().filter(s -> s.getSiteId().equals(siteId)).collect(Collectors.toList()); for (TChargingPile tChargingPile : collect) { SupEquipmentPowerInfo equipmentInfo = new SupEquipmentPowerInfo(); equipmentInfo.setEquipmentID(tChargingPile.getId().toString()); equipmentInfo.setEquipmentClassification(1); equipmentInfo.setDataTime(DateUtils.localDateTimeToString(LocalDateTime.now())); equipmentInfo.setEquipRealTimePower(tChargingPile.getRatedPower()); //构建设备接口信息 equipmentInfo.setConnectorPowerInfos(buildConnectorPowerInfos(tChargingPile.getId(), tChargingPile.getCode(), chargingGunList)); equipmentInfos.add(equipmentInfo); } return equipmentInfos; } /** * 构建接口数据 * @param chargingGunList * @return */ public List buildConnectorPowerInfos(Integer chargingPileId, String code, List chargingGunList){ List connectorInfos = new ArrayList<>(); List collect = chargingGunList.stream().filter(s -> s.getChargingPileId().equals(chargingPileId)).collect(Collectors.toList()); for (TChargingGun chargingGun : collect) { SupConnectorPowerInfo connectorInfo = new SupConnectorPowerInfo(); connectorInfo.setConnectorID(chargingGun.getFullNumber()); connectorInfo.setEquipmentClassification(chargingGun.getEquipmentClassification()); connectorInfo.setDataTime(DateUtils.localDateTimeToString(LocalDateTime.now())); connectorInfo.setConnectorRealTimePower(chargingGun.getChargingPower()); connectorInfos.add(connectorInfo); } return connectorInfos; } }