无关风月
2025-03-26 3b4bd94a21864b9b638395c95c467bb82a2f157e
监管平台
8个文件已修改
9个文件已添加
1074 ■■■■ 已修改文件
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/TCECClientFallbackFactory.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/TCECClient.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/dto/ChargingStatisticeDTO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingGunServiceImpl.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/SupSwapEquipmentInfo.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController1.java 258 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECSuperviseUtil.java 108 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatsInfoResult.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupConnectorPowerInfo.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupEquipmentPowerInfo.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationInfo.java 210 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationInfoResult.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationPowerInfo.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationPowerInfoResult.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/TaskUtil.java 220 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/TCECClientFallbackFactory.java
@@ -17,7 +17,12 @@
        
        
        return new TCECClient() {
            @Override
            @Override
            public R superviseNotificationStationInfo(Integer id) {
                return R.fail("推送充换电站信息失败:" + cause.getMessage());
            }
            @Override
            public R pushChargingGunStatus(String getFullNumber, Integer status) {
                return R.fail("接口状态变化后推送给第三方失败:" + cause.getMessage());
            }
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/TCECClient.java
@@ -17,8 +17,14 @@
 */
@FeignClient(contextId = "TCECClient", value = ServiceNameConstants.INTEGRATION_SERVICE, fallbackFactory = TCECClientFallbackFactory.class)
public interface TCECClient {
    /**
     * 推送充换电站信息
     * @param id
     * @return
     */
    @PostMapping("/evcs/v1.0/supervise_notification_station_info")
    R  superviseNotificationStationInfo(@RequestParam Integer id);
    /**
     * 接口状态变化后推送给第三方
     * @return
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/dto/ChargingStatisticeDTO.java
@@ -18,4 +18,6 @@
    private LocalDateTime startTime;
    @ApiModelProperty(value = "结束时间2020-01-01 23:59:59")
    private LocalDateTime endTime;
    @ApiModelProperty(value = "站点id")
    private Integer siteId;
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java
@@ -196,7 +196,6 @@
        }
        site.setMark(0);
        this.save(site);
        // 推送充电站数据给监管平台
        return AjaxResult.success();
    }
    
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingGunServiceImpl.java
@@ -11,6 +11,7 @@
import com.ruoyi.chargingPile.api.query.TChargingGunQuery;
import com.ruoyi.chargingPile.api.vo.*;
import com.ruoyi.chargingPile.api.domain.SiteMenu;
import com.ruoyi.chargingPile.mapper.SiteMapper;
import com.ruoyi.chargingPile.mapper.TChargingGunMapper;
import com.ruoyi.chargingPile.service.IPartnerService;
import com.ruoyi.chargingPile.service.TChargingGunService;
@@ -23,6 +24,7 @@
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.integration.api.feignClient.SendMessageClient;
import com.ruoyi.integration.api.feignClient.TCECClient;
import com.ruoyi.integration.api.model.QrCodeDelivery;
import com.ruoyi.other.api.feignClient.RoleSiteClient;
import com.ruoyi.other.api.feignClient.UserSiteClient;
@@ -72,7 +74,8 @@
    @Resource
    private SiteClient siteClient;
    @Autowired
    private TCECClient tcecClient;
    @Resource
    private TokenService tokenService;
    
@@ -117,7 +120,9 @@
        pageInfo.setRecords(list);
        return pageInfo;
    }
@Autowired
private SiteMapper siteMapper;
    /**
     * 添加充电枪
     * @param dto
@@ -148,6 +153,9 @@
        qrCodeDelivery.setCode_prefix(code_prefix);
        qrCodeDelivery.setQr_code(code_prefix + chargingPile.getCode() + dto.getCode());
        sendMessageClient.qrCodeDelivery(qrCodeDelivery);
        Site site = siteMapper.selectById(chargingPile.getSiteId());
        // 推送充换电站信息
        tcecClient.superviseNotificationStationInfo(site.getId());
        return AjaxResult.success();
    }
    
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/SupSwapEquipmentInfo.java
New file
@@ -0,0 +1,34 @@
package com.ruoyi.integration.drainage;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * 换电设备信
 * 息
 */
@Data
public class SupSwapEquipmentInfo {
    //换电设备
    //编码
    @JsonProperty("SwapMechanicalEquipmentID")
    private String SwapMechanicalEquipmentID;
    //换电设备
    //生产商组
    //织机构代
    //码
    @JsonProperty("SwapManufacturerID")
    private String SwapManufacturerID;
    //换电设备
    //生产商名
    //称
    @JsonProperty("SwapManufacturerName")
    private String SwapManufacturerName;
    //换电机械
    //设备额定
    //功率
    @JsonProperty("MechanicalEquipmentPower")
    private BigDecimal MechanicalEquipmentPower;
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java
@@ -2051,16 +2051,85 @@
        return R.ok();
    }
    /**
     * 推送充换电站信息
     * @param site
     * @param id
     * @return
     */
    @PostMapping("/supervise_notification_station_info")
    public BaseResult superviseNotificationStationInfo(@RequestBody Site site){
        BaseResult baseResult = new BaseResult();
    public R superviseNotificationStationInfo(@RequestParam Integer id){
        String serviceTel = systemConfigurationClient.getServerPhone().getData();
        Site site = siteClient.getSiteAll().getData().stream().filter(e -> e.getId().equals(id)).findFirst().orElse(new Site());
        return baseResult;
        List<TChargingPile> tChargingPiles = chargingPileClient.getChargingPileBySiteIds(Collections.singletonList(site.getId())).getData();
        List<Integer> collect1 = tChargingPiles.stream().map(TChargingPile::getId).collect(Collectors.toList());
        List<TChargingGun> chargingGunList = chargingGunClient.getChargingGunByChargingPileIds(collect1).getData();
        SupStationInfo supStationInfo = new SupStationInfo();
        supStationInfo.setStationID(site.getId().toString());
        supStationInfo.setStationUniqueNumber(site.getDistrictsCode() + "906171535" + site.getId());
        supStationInfo.setOperatorID("906171535");
        supStationInfo.setEquipmentOwnerID("906171535");
        supStationInfo.setStationName(site.getName());
        supStationInfo.setCountryCode(site.getCountryCode());
        supStationInfo.setAreaCode(site.getCityCode());
        supStationInfo.setAddress(site.getAddress());
        supStationInfo.setAreaCodeCountryside(site.getAreaCodeCountryside());
        supStationInfo.setStationTel(site.getPhone());
        supStationInfo.setServiceTel(serviceTel);
        supStationInfo.setStationClassification(site.getStationClassification());
        supStationInfo.setGeneralApplicationType(site.getGeneralApplicationType());
        supStationInfo.setStationType(site.getSiteType());
        supStationInfo.setStationStatus(site.getStatus());
        supStationInfo.setParkNums(site.getParkingSpace());
        supStationInfo.setStationLat(new BigDecimal(site.getLat()).setScale(6, RoundingMode.DOWN));
        supStationInfo.setStationLng(new BigDecimal(site.getLon()).setScale(6, RoundingMode.DOWN));
        supStationInfo.setSiteGuide(site.getGuide());
        supStationInfo.setConstruction(site.getConstructionSite() == 0 ? ConstructionEnum.OTHER.getType() : site.getConstructionSite());
        supStationInfo.setPictures(StringUtils.isNotEmpty(site.getImgUrl()) ? Arrays.asList(site.getImgUrl().split(",")) : new ArrayList<>());
        supStationInfo.setMatchCars(site.getVehicleDescription());
        if (org.springframework.util.StringUtils.hasLength(site.getSwapMatchCars())){
            supStationInfo.setSwapMatchCars(Arrays.asList(site.getSwapMatchCars().split(",")));
        }
        supStationInfo.setBusineHours(site.getStartServiceTime());
        supStationInfo.setRoundTheClock(site.getRoundTheClock());
        supStationInfo.setParkType(site.getParkType());
        supStationInfo.setParkFee("{\"rules\":"+site.getParkFee()+","+"\"freeDuration\":"+site.getParkFeeFree()+"}");
        supStationInfo.setElectricityType(site.getElectricityType());
        supStationInfo.setBusinessExpandType(site.getBusinessExpandType());
        supStationInfo.setCapacity(site.getCapacity());
        supStationInfo.setRatedPower(site.getRatedPower());
        supStationInfo.setPeriodFee(site.getPeriodFee());
        supStationInfo.setOfficialRunTime(site.getOfficialRunTime());
        supStationInfo.setStationOrientation(site.getStationOrientation());
        supStationInfo.setStationArea(site.getStationArea());
        supStationInfo.setHavePerson(site.getHavePerson());
        supStationInfo.setVideoMonitor(site.getVideoMonitor());
        if (StringUtils.isNotEmpty(site.getSupportingFacilities())){
            String[] split = site.getSupportingFacilities().split(",");
            List<Integer> collect = Arrays.stream(split).map(Integer::parseInt).collect(Collectors.toList());
            supStationInfo.setSupportingFacilities(collect);
        }
        supStationInfo.setPrinterFlag(site.getPrinterFlag());
        supStationInfo.setBarrierFlag(site.getBarrierFlag());
        supStationInfo.setParkingLockFlag(site.getParkingLockFlag());
        supStationInfo.setEquipmentInfos(buildEquipmentInfo(site.getId(), tChargingPiles, chargingGunList));
//        supStationInfo.setSwapEquipmentInfos();
        supStationInfo.setElectricityFee("{"+site.getElectricityFee()+"}");
        supStationInfo.setEquipmentOwnerName(site.getEquipmentOwnerName());
        supStationInfo.setResidentNo(site.getResidentNo());
        supStationInfo.setSupplyType(site.getSupplyType());
        supStationInfo.setWattHourMeterNo(site.getWattHourMeterNo());
        supStationInfo.setForwardPower(site.getForwardPower());
        supStationInfo.setServiceFee("{"+site.getServiceFee()+"}");
        supStationInfo.setRecordUniqueNo(site.getRecordUniqueNo());
        BaseResult baseResult = new BaseResult();
        SupStationInfoResult supStationInfoResult = new SupStationInfoResult();
        supStationInfoResult.setSupStationInfo(supStationInfo);
        tcecSuperviseUtil.superviseNotificationStationInfo(supStationInfoResult);
        return R.ok(baseResult);
    }
//
//
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController1.java
@@ -31,6 +31,7 @@
import com.ruoyi.other.api.feignClient.SystemConfigurationClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@@ -56,7 +57,8 @@
    
    @Resource
    private SiteClient siteClient;
    @Autowired
    private TCECSuperviseUtil tcecSuperviseUtil;
    @Resource
    private ChargingPileClient chargingPileClient;
    
@@ -1809,262 +1811,8 @@
        log.info("监管平台查询充电站信息响应参数:" + JacksonUtils.toJson(baseResult));
        return baseResult;
    }
    /**
     * 推送充电用能统计
     * @return
     */
    @PostMapping("/supervise_notification_operation_stats_info")
    public void superviseNotificationOperationStatsInfo(){
        List<Site> data = siteClient.getSiteAll().getData();
        LocalDateTime now = LocalDateTime.now();
        LocalDateTime startLocalDateTime = now.minusDays(1);
        LocalDateTime endLocalDateTime = now.minusDays(1);
        // 获取今天凌晨
        startLocalDateTime.withHour(0);
        startLocalDateTime.withMinute(0);
        startLocalDateTime.withSecond(0);
        String start = DateUtils.localDateTimeToString(startLocalDateTime);
        endLocalDateTime.withHour(23);
        endLocalDateTime.withMinute(59);
        endLocalDateTime.withSecond(59);
        String end = DateUtils.localDateTimeToString(endLocalDateTime);
        ChargingStatisticeDTO chargingStatisticeDTO = new ChargingStatisticeDTO();
        chargingStatisticeDTO.setStartTime(startLocalDateTime);
        chargingStatisticeDTO.setEndTime(endLocalDateTime);
        List<TChargingOrder> data1 = chargingOrderClient.getChargingStatistics(chargingStatisticeDTO).getData();
        List<StationStatsInfo> 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<TChargingOrder> 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<EquipmentStatsInfo> EquipmentStatsInfos = new ArrayList<>();
            Map<Integer, List<TChargingOrder>> collect = chargingOrders.stream().collect(Collectors.groupingBy(TChargingOrder::getChargingPileId));
            for (Integer integer : collect.keySet()) {
                List<TChargingOrder> 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<Integer, List<TChargingOrder>> collect2 = tChargingOrders.stream().collect(Collectors.groupingBy(TChargingOrder::getChargingGunId));
                List<ConnectorStatsInfo> ConnectorStatsInfos = new ArrayList<>();
                for (Integer integer1 : collect2.keySet()) {
                    List<TChargingOrder> 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);
        }
    }
    /**
     * 推送充换电站实时功率
     * @return
     */
    @PostMapping("/supervise_notification_realtime_power_info")
    public void superviseNotificationRealtimePowerInfo(){
    }
    /**
     * 推送充换电站信息
     * @param datum
     * @return
     */
    @PostMapping("/supervise_notification_station_info")
    public void superviseNotificationStationInfo(@RequestBody Site datum){
        BaseResult baseResult = new BaseResult();
        StationInfo stationInfo = new StationInfo();
        List<TChargingPile> tChargingPiles = chargingPileClient.getChargingPileBySiteIds(Collections.singletonList(datum.getId())).getData();
        List<Integer> collect1 = tChargingPiles.stream().map(TChargingPile::getId).collect(Collectors.toList());
        List<TChargingGun> chargingGunList = chargingGunClient.getChargingGunByChargingPileIds(collect1).getData();
        String serviceTel = systemConfigurationClient.getServerPhone().getData();
        stationInfo.setAreaCodeCountryside(datum.getAreaCodeCountryside());
        stationInfo.setStationClassification(datum.getStationClassification());
        stationInfo.setGeneralApplicationType(datum.getGeneralApplicationType());
        if (org.springframework.util.StringUtils.hasLength(datum.getSwapMatchCars())){
            stationInfo.setSwapMatchCars(Arrays.asList(datum.getSwapMatchCars().split(",")));
        }
        stationInfo.setBusineHours(datum.getStartServiceTime());
        stationInfo.setRoundTheClock(datum.getRoundTheClock());
        stationInfo.setParkType(datum.getParkType());
        stationInfo.setElectricityFee("{"+datum.getElectricityFee()+"}");
        stationInfo.setServiceFee("{"+datum.getServiceFee()+"}");
        stationInfo.setParkFee("{\"rules\":"+datum.getParkFee()+","+"\"freeDuration\":"+datum.getParkFeeFree()+"}");
        stationInfo.setElectricityType(datum.getElectricityType());
        stationInfo.setBusinessExpandType(datum.getBusinessExpandType());
        stationInfo.setCapacity(datum.getCapacity());
        stationInfo.setRatedPower(datum.getRatedPower());
        stationInfo.setPeriodFee(datum.getPeriodFee());
        stationInfo.setOfficialRunTime(datum.getOfficialRunTime());
        stationInfo.setStationOrientation(datum.getStationOrientation());
        stationInfo.setStationArea(datum.getStationArea());
        stationInfo.setHavePerson(datum.getHavePerson());
        stationInfo.setVideoMonitor(datum.getVideoMonitor());
        if (StringUtils.isNotEmpty(datum.getSupportingFacilities())){
            String[] split = datum.getSupportingFacilities().split(",");
            List<Integer> collect = Arrays.stream(split).map(Integer::parseInt).collect(Collectors.toList());
            stationInfo.setSupportingFacilities(collect);
        }
        stationInfo.setPrinterFlag(datum.getPrinterFlag());
        stationInfo.setBarrierFlag(datum.getBarrierFlag());
        stationInfo.setParkingLockFlag(datum.getParkingLockFlag());
        stationInfo.setEquipmentOwnerName(datum.getEquipmentOwnerName());
        stationInfo.setResidentNo(datum.getResidentNo());
        stationInfo.setSupplyType(datum.getSupplyType());
        stationInfo.setWattHourMeterNo(datum.getWattHourMeterNo());
        BigDecimal forwardPower = datum.getForwardPower();
        if (forwardPower!=null){
            stationInfo.setForwardPower(forwardPower.setScale(4, BigDecimal.ROUND_HALF_UP).toString());
        }
        stationInfo.setRecordUniqueNo(datum.getRecordUniqueNo());
        stationInfo.setStationID(datum.getId().toString());
        stationInfo.setOperatorID("906171535");
        stationInfo.setEquipmentOwnerID("906171535");
        stationInfo.setStationName(datum.getName());
        stationInfo.setCountryCode(StringUtils.isNotEmpty(datum.getCountryCode()) ? datum.getCountryCode() : "CN");
        stationInfo.setAreaCode(datum.getDistrictsCode());
        stationInfo.setAddress(datum.getAddress());
        stationInfo.setStationTel(datum.getPhone());
        stationInfo.setServiceTel(serviceTel);
        switch (datum.getSiteType()){
            case 0:
                stationInfo.setStationType(StationTypeEnum.OTHER.getType());
                break;
            case 1:
                stationInfo.setStationType(StationTypeEnum.PUBLIC.getType());
                break;
            case 2:
                stationInfo.setStationType(StationTypeEnum.PERSONAGE.getType());
                break;
            case 3:
                stationInfo.setStationType(StationTypeEnum.BUS_SPECIFIC.getType());
                break;
            case 4:
                stationInfo.setStationType(StationTypeEnum.SANITATION_SPECIFIC.getType());
                break;
            case 5:
                stationInfo.setStationType(StationTypeEnum.LOGISTICS_SPECIFIC.getType());
                break;
            case 6:
                stationInfo.setStationType(StationTypeEnum.TEXT_SPECIFIC.getType());
                break;
        }
        if(datum.getStatus() == 1){
            stationInfo.setStationStatus(StationStatusEnum.NORMAL_USE.getStatus());
        }
        if(datum.getStatus() == 2){
            stationInfo.setStationStatus(StationStatusEnum.MAINTAIN.getStatus());
        }
        if(datum.getStatus() == 3){
            stationInfo.setStationStatus(StationStatusEnum.OFF_LINE.getStatus());
        }
        stationInfo.setParkNums(datum.getParkingSpace());
        stationInfo.setStationLat(new BigDecimal(datum.getLat()).setScale(6, RoundingMode.DOWN));
        stationInfo.setStationLng(new BigDecimal(datum.getLon()).setScale(6, RoundingMode.DOWN));
        stationInfo.setConstruction(datum.getConstructionSite() == 0 ? ConstructionEnum.OTHER.getType() : datum.getConstructionSite());
        stationInfo.setPictures(StringUtils.isNotEmpty(datum.getImgUrl()) ? Arrays.asList(datum.getImgUrl().split(",")) : new ArrayList<>());
        stationInfo.setSiteGuide(datum.getGuide());
        stationInfo.setMatchCars(datum.getVehicleDescription());
        stationInfo.setElectricityFee(datum.getRateDescription());
        //构建充电设备信息数据
        stationInfo.setEquipmentInfos(buildEquipmentInfo(datum.getId(), tChargingPiles, chargingGunList));
        // 推送
        HttpRequest post = HttpUtil.createPost(url + "supervise_notification_station_info");
        buildBody(post, stationInfo);
        HttpResponse execute = post.execute();
        if(200 != execute.getStatus()){
            log.error("推送监管平台电站信息失败:" + execute.body());
            return ;
        }
        log.info("推送监管平台电站信息响应:" + execute.body());
        String data = baseResult.getData();
        // 转化为json
        if(!data.contains("0")){
            log.error("推送监管平台电站信息失败:" + baseResult.getMsg());
            // 重试
            for (int i = 1; i <= 3; i++) {
                try {
                    Thread.sleep(5000);
                    HttpRequest post1 = HttpUtil.createPost(url + "supervise_notification_station_info");
                    buildBody(post1, stationInfo);
                    HttpResponse execute1 = post1.execute();
                    if(200 == execute1.getStatus()){
                        log.info("重试次数:"+i+"推送监管平台电站信息响应:" + execute1.body());
                        BaseResult baseResult2 = JSON.parseObject(execute1.body(), BaseResult.class);
                        String data1 = baseResult2.getData();
                        if (data1.contains("0")){
                            break;
                        }
                    }
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
    /**
     * 构建请求参数和消息头
     * @param post
     * @param o
     */
    public static void buildBody(HttpRequest post, Object o){
        Long timeStamp = Long.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
        post.contentType("application/json;charset=utf-8");
//        post.header("Authorization", "Bearer " + getToken(operator));
        BaseRequest baseRequest = new BaseRequest();
        baseRequest.setOperatorID("906171535");
        baseRequest.setTimeStamp(timeStamp);
        baseRequest.setSeq("0001");
        String jsonString = JacksonUtils.toJson(o);
        String encrypt = AESUtil.encrypt(jsonString, ourDataSecret, ourDataSecretIv);
        baseRequest.setData(encrypt);
        baseRequest.setSig(TCECUtil.ourBuildSign(baseRequest));
        log.info("监管平台推送参数:" + JacksonUtils.toJson(baseRequest));
        String request_json = JacksonUtils.toJson(baseRequest);
        post.body(request_json);
    }
//
//
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECSuperviseUtil.java
@@ -20,6 +20,7 @@
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.concurrent.TimeUnit;
import static com.ruoyi.integration.drainage.TCECUtil.getToken;
@@ -59,13 +60,16 @@
     *推送充电订单信息
     */
    private final static String supervise_notification_charge_order_info = "/supervise_notification_charge_order_info";
    private final static String supervise_notification_operation_stats_info = "/supervise_notification_operation_stats_info";
    private final static String supervise_notification_realtime_power_info = "/supervise_notification_realtime_power_info";
    private final static String supervise_notification_station_info = "/supervise_notification_station_info";
    /**
     * 获取token
     */
    public String queryToken(Operator operator){
    public String queryToken(){
        String token = redisService.getCacheObject(TOKEN_KEY);
        if(StringUtils.hasLength(token)){
            return token;
@@ -96,8 +100,7 @@
        redisService.setCacheObject(TOKEN_KEY,token, (long) (TokenAvailableTime - 60), TimeUnit.SECONDS);
        return token;
    }
    /**
     * 设备状态变化推送
@@ -124,8 +127,8 @@
        NotificationStationStatusResult notificationStationStatusResult = JSON.parseObject(decrypt, NotificationStationStatusResult.class);
        return notificationStationStatusResult;
    }
    /**
     * 推动充电状态
     * @param info
@@ -152,8 +155,8 @@
        NotificationEquipChargeStatusResult notificationEquipChargeStatusResult = JSON.parseObject(decrypt, NotificationEquipChargeStatusResult.class);
        return notificationEquipChargeStatusResult;
    }
    /**
     * 推送充电订单信息
     * @param info
@@ -180,8 +183,8 @@
        NotificationChargeOrderInfoResult notificationChargeOrderInfoResult = JSON.parseObject(decrypt, NotificationChargeOrderInfoResult.class);
        return notificationChargeOrderInfoResult;
    }
    /**
     * 构建请求参数和消息头
     * @param post
@@ -190,7 +193,7 @@
    public void buildBody(HttpRequest post, Object o, Operator operator){
        Long timeStamp = Long.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
        post.contentType("application/json;charset=utf-8");
        post.header("Authorization", "Bearer " + getToken(operator));
        post.header("Authorization", "Bearer " + queryToken());
        BaseRequest baseRequest = new BaseRequest();
        baseRequest.setOperatorID(operator.getOurOperatorId());
        baseRequest.setTimeStamp(timeStamp);
@@ -207,8 +210,83 @@
        log.info("推送三方平台请求Data:" + jsonString);
    }
    /**
     * 推送充电用能统计
     * @param info
     * @return
     */
    public void superviseNotificationOperationStatsInfo(StationStatsInfoResult info){
        Operator operator = new Operator();
        HttpRequest post = HttpUtil.createPost(url+supervise_notification_operation_stats_info);
        buildBody(post, info, operator);
        HttpResponse execute = post.execute();
        if(200 != execute.getStatus()){
            log.error("推送充电用能统计失败:" + execute.body());
            return ;
        }
        log.info("推送充电用能统计信息响应:" + execute.body());
        BaseResult baseResult = JSON.parseObject(execute.body(), BaseResult.class);
        Integer Ret = baseResult.getRet();
        if(0 != Ret){
            log.error("推送充电用能统计信息失败:" + baseResult.getMsg());
            return ;
        }
        //解密参数
        String decrypt = AESUtil.decrypt(baseResult.getData(), operator.getDataSecret(), operator.getDataSecretIv());
        log.info("推送充电用能统计信息Data:" + decrypt);
    }
    /**
     * 推送充换电站信息
     * @param info
     * @return
     */
    public void superviseNotificationStationInfo(SupStationInfoResult info){
        Operator operator = new Operator();
        HttpRequest post = HttpUtil.createPost(url+supervise_notification_station_info);
        buildBody(post, info, operator);
        HttpResponse execute = post.execute();
        if(200 != execute.getStatus()){
            log.error("推送充换电站信息失败:" + execute.body());
            return ;
        }
        log.info("推送充换电站信息信息响应:" + execute.body());
        BaseResult baseResult = JSON.parseObject(execute.body(), BaseResult.class);
        Integer Ret = baseResult.getRet();
        if(0 != Ret){
            log.error("推送充换电站信息失败:" + baseResult.getMsg());
            return ;
        }
        //解密参数
        String decrypt = AESUtil.decrypt(baseResult.getData(), operator.getDataSecret(), operator.getDataSecretIv());
        log.info("推送充换电站信息信息Data:" + decrypt);
    }
    /**
     * 充换电站功率信息
     * @param info
     * @return
     */
    public void superviseNotificationRealtimePowerInfo(SupStationPowerInfoResult info){
        Operator operator = new Operator();
        HttpRequest post = HttpUtil.createPost(url+supervise_notification_realtime_power_info);
        buildBody(post, info, operator);
        HttpResponse execute = post.execute();
        if(200 != execute.getStatus()){
            log.error("推送充换电站实时功率失败:" + execute.body());
            return ;
        }
        log.info("推送充换电站实时功率信息响应:" + execute.body());
        BaseResult baseResult = JSON.parseObject(execute.body(), BaseResult.class);
        Integer Ret = baseResult.getRet();
        if(0 != Ret){
            log.error("推送充换电站实时功率信息失败:" + baseResult.getMsg());
            return ;
        }
        //解密参数
        String decrypt = AESUtil.decrypt(baseResult.getData(), operator.getDataSecret(), operator.getDataSecretIv());
        log.info("推送充换电站实时功率信息Data:" + decrypt);
    }
    public static void main(String[] args) {
        BaseModel model = new BaseModel();
        model.setOperatorID("MA25CNM38");
@@ -226,8 +304,8 @@
        // 打印计算得到的签名Sig
        String s = SignUtil.bytesToHexString(hmacMd5);
        System.err.println(s);
//        BaseModel model = new BaseModel();
//        model.setOperatorID("MA25CNM38");
//        model.setData("xQYYEPiwoc4JENnQsF50qP6Tmnj7uU/AshWn3QbIgrMIk8zvFpy6fWLIiLzQHcLPFCihqH1uzoNhGVNcS8Wvf5gIx9+cWJvYtjwtsjAGMEwNQ6y+rF1jjKnqCNcQbHbhqJ2l76sD54QCFKyenKxymrXri19bDV8hizn3nBw+jcHBtqKHWzjdSHwPDWPIw4rXnrbWLya2PXVgYtVg93WPtliw+0xsqW0BxJamE70/Ilbg4wB5fOAOvXmbLFI+v9jRjpcA7ImhprqPMYkXYAfa2QlICrJEBK7DfpJvRMzKzeT90kOAITqIqFvbfV0ti+greRqToLP6ni4o6w3ID42UmKasIpLTnx+qtR4bVTBTRuDzXvNXDA92RqHaJO21xbSen1eHN/yGfrchBIM0gmav7EpaYAerfU4ubnmJ6xujR6okYepJwBD5DiSIrObfS+GWVPRekvnjvm7BC02NXTrGKA==");
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatsInfoResult.java
New file
@@ -0,0 +1,18 @@
package com.ruoyi.integration.drainage.model;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;
/**
 * 充电站统计信息
 * @author zhibing.pu
 * @Date 2025/1/21 15:17
 */
@Data
public class StationStatsInfoResult {
    private List<StationStatsInfo> stationStatsInfos;
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupConnectorPowerInfo.java
New file
@@ -0,0 +1,25 @@
package com.ruoyi.integration.drainage.model;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * 充电设备接口功率信息
 */
@Data
public class SupConnectorPowerInfo {
    @JsonProperty("ConnectorID")
    private String ConnectorID;
    @JsonProperty("EquipmentClassification")
    private Integer EquipmentClassification;
    @JsonProperty("DataTime")
    private String DataTime;
    @JsonProperty("ConnectorRealTimePower")
    private BigDecimal ConnectorRealTimePower;
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupEquipmentPowerInfo.java
New file
@@ -0,0 +1,29 @@
package com.ruoyi.integration.drainage.model;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
 * 充电设备功率信息
 */
@Data
public class SupEquipmentPowerInfo {
    @JsonProperty("EquipmentID")
    private String EquipmentID;
    @JsonProperty("EquipmentClassification")
    private Integer EquipmentClassification;
    @JsonProperty("DataTime")
    private String DataTime;
    @JsonProperty("EquipRealTimePower")
    private BigDecimal EquipRealTimePower;
    @JsonProperty("DataTime")
    private List<SupConnectorPowerInfo> ConnectorPowerInfos;
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationInfo.java
New file
@@ -0,0 +1,210 @@
package com.ruoyi.integration.drainage.model;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.ruoyi.integration.drainage.SupSwapEquipmentInfo;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
 * 充换电站信息
 */
@Data
public class SupStationInfo {
    // 充换电站ID
    @JsonProperty("StationID")
    private String StationID;
    // 充换电站唯一编码
    @JsonProperty("StationUniqueNumber")
    private String StationUniqueNumber;
    //平台运营商
    //ID
    @JsonProperty("OperatorID")
    private String OperatorID;
    //充换电服务
    //运营商ID
    @JsonProperty("EquipmentOwnerID")
    private String EquipmentOwnerID;
    //充换电站名
    //称
    @JsonProperty("StationName")
    private String StationName;
    //充换电站国
    //家代码
    @JsonProperty("CountryCode")
    private String CountryCode;
    //充换电站省
    //市辖区编码
    @JsonProperty("AreaCode")
    private String AreaCode;
    //详细地址
    @JsonProperty("Address")
    private String Address;
    //充换电站所
    //在县以下行
    //政区划代码
    @JsonProperty("AreaCodeCountryside")
    private String AreaCodeCountryside;
    // 站点电话
    @JsonProperty("StationTel")
    private String StationTel;
    // 服务电话
    @JsonProperty("ServiceTel")
    private String ServiceTel;
    // 站点分类
    @JsonProperty("StationClassification")
    private Integer StationClassification;
    //通用类型
    @JsonProperty("GeneralApplicationType")
    private Integer GeneralApplicationType;
    //站点类型
    @JsonProperty("StationType")
    private Integer StationType;
    //站点状态
    @JsonProperty("StationStatus")
    private Integer StationStatus;
    //车位数量
    @JsonProperty("ParkNums")
    private Integer ParkNums;
    //经度
    @JsonProperty("StationLng")
    private BigDecimal StationLng;
    //纬度
    @JsonProperty("StationLat")
    private BigDecimal StationLat;
    //站点引导
    @JsonProperty("SiteGuide")
    private String SiteGuide;
    //建设场所
    @JsonProperty("Construction")
    private Integer Construction;
    //站点照片
    @JsonProperty("Pictures")
    private List<String> Pictures;
    //使用车型描
    //述
    @JsonProperty("MatchCars")
    private String MatchCars;
    //服务车型描
    //述
    @JsonProperty("SwapMatchCars")
    private List<String> SwapMatchCars;
    //车位楼层及
    //数量描述
    @JsonProperty("ParkInfo")
    private String ParkInfo;
    //营业时间
    @JsonProperty("BusineHours")
    private String BusineHours;
    //7*24小时营
    //业
    @JsonProperty("RoundTheClock")
    private Integer RoundTheClock;
    //停车费类型
    @JsonProperty("ParkType")
    private Integer ParkType;
    //停车费描述
    @JsonProperty("ParkFee")
    private String ParkFee;
    //支付方式
    @JsonProperty("Payment")
    private String Payment;
    //是否支持预
    //约
    @JsonProperty("SupportOrder")
    private Integer SupportOrder;
    //备注
    @JsonProperty("Remark")
    private String Remark;
    //电费类型
    @JsonProperty("ElectricityType")
    private Integer ElectricityType;
    //报装类型
    @JsonProperty("BusinessExpandType")
    private Integer BusinessExpandType;
    //报装电源容
    //量
    @JsonProperty("Capacity")
    private BigDecimal Capacity;
    //站点额定总
    //功率
    @JsonProperty("RatedPower")
    private BigDecimal RatedPower;
    //峰谷分时
    @JsonProperty("PeriodFee")
    private Integer PeriodFee;
    //正式投运时
    //间
    @JsonProperty("OfficialRunTime")
    private String OfficialRunTime;
    //充换电站方
    //位
    @JsonProperty("StationOrientation")
    private Integer StationOrientation;
    //充换电站建
    //设面积
    @JsonProperty("StationArea")
    private BigDecimal StationArea;
    //充换电站人
    //工值守
    @JsonProperty("HavePerson")
    private Integer HavePerson;
    //视频监控配
    //套情况
    @JsonProperty("VideoMonitor")
    private Integer VideoMonitor;
    //周边配套设
    // 施
    @JsonProperty("SupportingFacilities")
    private List<Integer> SupportingFacilities;
    //是否有小票
    //机
    @JsonProperty("PrinterFlag")
    private Integer PrinterFlag;
    //是否有道闸
    @JsonProperty("BarrierFlag")
    private Integer BarrierFlag;
    //是否有地锁
    @JsonProperty("ParkingLockFlag")
    private Integer ParkingLockFlag;
    //充电设备信
    //息列表
    @JsonProperty("EquipmentInfos")
    private List<EquipmentInfo> EquipmentInfos;
    //换电设备信
    //息
    @JsonProperty("SwapEquipmentInfos")
    private List<SupSwapEquipmentInfo> SwapEquipmentInfos;
    //充电电费描
    //述
    @JsonProperty("ElectricityFee")
    private String ElectricityFee;
    //设备所属方
    //名称
    @JsonProperty("EquipmentOwnerName")
    private String EquipmentOwnerName;
    //供电局用户
    //编号
    @JsonProperty("ResidentNo")
    private String ResidentNo;
    //供电类型
    @JsonProperty("SupplyType")
    private Integer SupplyType;
    //表号
    @JsonProperty("WattHourMeterNo")
    private String WattHourMeterNo;
    //外电功率
    @JsonProperty("ForwardPower")
    private BigDecimal ForwardPower;
    //服务费描述
    @JsonProperty("ServiceFee")
    private String ServiceFee;
    //充电站全省
    //唯一备案号
    @JsonProperty("RecordUniqueNo")
    private String RecordUniqueNo;
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationInfoResult.java
New file
@@ -0,0 +1,19 @@
package com.ruoyi.integration.drainage.model;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.ruoyi.integration.drainage.model.EquipmentInfo;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
 * 充换电站信息
 */
@Data
public class SupStationInfoResult {
    private SupStationInfo SupStationInfo;
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationPowerInfo.java
New file
@@ -0,0 +1,31 @@
package com.ruoyi.integration.drainage.model;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;
/**
 * 推送充换电站实时功率
 */
@Data
public class SupStationPowerInfo {
    @NotNull
    @JsonProperty("OperatorID")
    private String OperatorID;
    @JsonProperty("EquipmentOwnerID")
    private String EquipmentOwnerID;
    @JsonProperty("StationID")
    private String StationID;
    @JsonProperty("StationClassification")
    private Integer StationClassification;
    @JsonProperty("DataTime")
    private String DataTime;
    @JsonProperty("StationRealTimePower")
    private BigDecimal StationRealTimePower;
    @JsonProperty("EquipmentPowerInfos")
    private List<SupEquipmentPowerInfo> EquipmentPowerInfos;
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationPowerInfoResult.java
New file
@@ -0,0 +1,13 @@
package com.ruoyi.integration.drainage.model;
import lombok.Data;
import java.util.List;
/**
 * 推送充换电站实时功率
 */
@Data
public class SupStationPowerInfoResult {
    private List<SupStationPowerInfo> stationStatsInfos;
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/TaskUtil.java
New file
@@ -0,0 +1,220 @@
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.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.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 {
    @Resource
    private SiteClient siteClient;
    @Autowired
    private TCECSuperviseUtil tcecSuperviseUtil;
    @Resource
    private ChargingGunClient chargingGunClient;
    @Resource
    private ChargingOrderClient chargingOrderClient;
    @Resource
    private ChargingPileClient chargingPileClient;
    // 每天凌晨12点30执行 推送充电用能统计
    @Scheduled(cron = "0 30 0 * * ?")
    public void superviseNotificationOperationStatsInfo() {
        StationStatsInfoResult res = new StationStatsInfoResult();
        List<Site> data = siteClient.getSiteAll().getData();
        LocalDateTime now = LocalDateTime.now();
        LocalDateTime startLocalDateTime = now.minusDays(1);
        LocalDateTime endLocalDateTime = now.minusDays(1);
        // 获取今天凌晨
        startLocalDateTime.withHour(0);
        startLocalDateTime.withMinute(0);
        startLocalDateTime.withSecond(0);
        String start = DateUtils.localDateTimeToString(startLocalDateTime);
        endLocalDateTime.withHour(23);
        endLocalDateTime.withMinute(59);
        endLocalDateTime.withSecond(59);
        String end = DateUtils.localDateTimeToString(endLocalDateTime);
        ChargingStatisticeDTO chargingStatisticeDTO = new ChargingStatisticeDTO();
        chargingStatisticeDTO.setStartTime(startLocalDateTime);
        chargingStatisticeDTO.setEndTime(endLocalDateTime);
        List<TChargingOrder> data1 = chargingOrderClient.getChargingStatistics(chargingStatisticeDTO).getData();
        List<StationStatsInfo> 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<TChargingOrder> 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<EquipmentStatsInfo> EquipmentStatsInfos = new ArrayList<>();
            Map<Integer, List<TChargingOrder>> collect = chargingOrders.stream().collect(Collectors.groupingBy(TChargingOrder::getChargingPileId));
            for (Integer integer : collect.keySet()) {
                List<TChargingOrder> 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<Integer, List<TChargingOrder>> collect2 = tChargingOrders.stream().collect(Collectors.groupingBy(TChargingOrder::getChargingGunId));
                List<ConnectorStatsInfo> ConnectorStatsInfos = new ArrayList<>();
                for (Integer integer1 : collect2.keySet()) {
                    List<TChargingOrder> 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() {
        List<Site> data = siteClient.getSiteAll().getData();
        List<Integer> siteIds = data.stream().map(Site::getId).collect(Collectors.toList());
        List<TChargingPile> tChargingPiles = chargingPileClient.getChargingPileBySiteIds(siteIds).getData();
        List<Integer> collect1 = tChargingPiles.stream().map(TChargingPile::getId).collect(Collectors.toList());
        List<TChargingGun> chargingGunList = chargingGunClient.getChargingGunByChargingPileIds(collect1).getData();
        SupStationPowerInfoResult supStationPowerInfoResult = new SupStationPowerInfoResult();
        List<SupStationPowerInfo> stationStatsInfos = new ArrayList<>();
        LocalDateTime now = LocalDateTime.now();
        LocalDateTime startLocalDateTime = now.minusMinutes(15);
        ChargingStatisticeDTO chargingStatisticeDTO = new ChargingStatisticeDTO();
        chargingStatisticeDTO.setStartTime(startLocalDateTime);
        chargingStatisticeDTO.setEndTime(now);
        List<TChargingOrder> data1 = chargingOrderClient.getChargingStatistics(chargingStatisticeDTO).getData();
        for (Site datum : data) {
            List<TChargingOrder> 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::add).get().divide(new BigDecimal(collect.size()).setScale(4, BigDecimal.ROUND_DOWN));
            supStationPowerInfo.setStationRealTimePower(divide);
            supStationPowerInfo.setEquipmentPowerInfos(buildEquipmentPowerInfo(datum.getId(), tChargingPiles, chargingGunList));
            stationStatsInfos.add(supStationPowerInfo);
        }
        supStationPowerInfoResult.setStationStatsInfos(stationStatsInfos);
        tcecSuperviseUtil.superviseNotificationRealtimePowerInfo(supStationPowerInfoResult);
    }
    /**
     * 构建桩数据
     * @param tChargingPiles
     * @return
     */
    public List<SupEquipmentPowerInfo> buildEquipmentPowerInfo(Integer siteId, List<TChargingPile> tChargingPiles, List<TChargingGun> chargingGunList){
        List<SupEquipmentPowerInfo> equipmentInfos = new ArrayList<>();
        List<TChargingPile> 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<SupConnectorPowerInfo> buildConnectorPowerInfos(Integer chargingPileId, String code, List<TChargingGun> chargingGunList){
        List<SupConnectorPowerInfo> connectorInfos = new ArrayList<>();
        List<TChargingGun> 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;
    }
}