无关风月
2025-04-15 2e44b182b43fecaf6a2510c9226f18ffd2cee6c9
监管平台调试完毕
15个文件已修改
2个文件已添加
897 ■■■■ 已修改文件
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/TCECClient.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingGunServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECPushUtil.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECSuperviseUtil.java 243 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseModelJianGuan.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseRequestJianGuan.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/ConnectorStatsInfo.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupEquipmentPowerInfo.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationInfoResult.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationPowerInfoResult.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/TCECCJianGuanontroller.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/TaskUtil.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/util/JianGuanTask.java 88 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/test/java/com/ruoyi/integration/RuoYiIntegrationApplicationTests.java 365 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/TCECClient.java
@@ -22,7 +22,7 @@
     * @param id
     * @return
     */
    @PostMapping("/evcs/v1.0/supervise_notification_station_info")
    @PostMapping("/evcs/v2.0/supervise_notification_station_info")
    R  superviseNotificationStationInfo(@RequestParam("id") Integer id);
    /**
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java
@@ -226,6 +226,8 @@
        }
        
        this.updateById(site);
        tcecClient.superviseNotificationStationInfo(site.getId());
        return AjaxResult.success();
    }
    
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingGunServiceImpl.java
@@ -155,7 +155,6 @@
        sendMessageClient.qrCodeDelivery(qrCodeDelivery);
        Site site = siteMapper.selectById(chargingPile.getSiteId());
        // 推送充换电站信息
        tcecClient.superviseNotificationStationInfo(site.getId());
        return AjaxResult.success();
    }
    
@@ -194,6 +193,8 @@
        qrCodeDelivery.setCode_prefix(code_prefix);
        qrCodeDelivery.setQr_code(code_prefix + chargingPile.getCode() + dto.getCode());
        sendMessageClient.qrCodeDelivery(qrCodeDelivery);
        tcecClient.superviseNotificationStationInfo(one.getSiteId());
        return AjaxResult.success();
    }
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java
@@ -323,6 +323,7 @@
            qrCodeDelivery.setQr_code(code_prefix + chargingPile.getCode() + chargingGun.getCode());
            sendMessageClient.qrCodeDelivery(qrCodeDelivery);
        }
        tcecClient.superviseNotificationStationInfo(chargingPile.getSiteId());
        return AjaxResult.success();
    }
    
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECPushUtil.java
@@ -6,7 +6,6 @@
import com.ruoyi.chargingPile.api.model.*;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
import com.ruoyi.integration.api.vo.StartChargeResult;
@@ -28,6 +27,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@@ -157,14 +157,12 @@
                break;
        }
        supEquipChargeStatus.setCurrentA(chargingOrder.getCurrent());
        supEquipChargeStatus.setSOC(new BigDecimal(chargingOrder.getEndSoc()));
        supEquipChargeStatus.setSOC(StringUtils.hasLength(chargingOrder.getEndSoc())?new BigDecimal(chargingOrder.getEndSoc()):new BigDecimal("1"));
        supEquipChargeStatus.setStartTime(chargingOrder.getStartTime() != null ? chargingOrder.getStartTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) : "");
        supEquipChargeStatus.setEndTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        supEquipChargeStatus.setTotalPower(chargingOrder.getElectrovalence());
        List<Operator> operators = operatorClient.getAllOperator().getData();
        for (Operator operator : operators) {
            tcecSuperviseUtil.notificationSupEquipChargeStatus(operator, supEquipChargeStatus);
        }
            tcecSuperviseUtil.notificationSupEquipChargeStatus(new Operator(), supEquipChargeStatus);
        return R.ok();
    }
    /**
@@ -208,10 +206,7 @@
                break;
        }
        List<Operator> operators = operatorClient.getAllOperator().getData();
        for (Operator operator : operators) {
            tcecSuperviseUtil.notificationChargeOrderInfo(operator, supChargeOrderInfo);
        }
            tcecSuperviseUtil.notificationChargeOrderInfo(new Operator(), supChargeOrderInfo);
        return R.ok();
    }
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECSuperviseUtil.java
@@ -22,6 +22,7 @@
import org.springframework.util.StringUtils;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -37,11 +38,23 @@
@Component
public class TCECSuperviseUtil {
    // 测试环境
//    private static final String OperatorID = "MA01H3BQ2";
//    private static final String OperatorSecret = "f1331ef0b37c2d1b";
//    private static final String SigSecret = "a6fedf0e1b27d6f7";
//    private static final String DataSecret = "50a61b93919c9604";
//    private static final String DataSecretIV = "7c8ac6861661d584";
//    private final static String url = "https://dev-gov-hlht-sc.unievbj.com/evcs/v1.0.0";
    // 正式环境
    private static final String OperatorID = "MA01H3BQ2";
    private static final String OperatorSecret = "f1331ef0b37c2d1b";
    private static final String SigSecret = "a6fedf0e1b27d6f7";
    private static final String DataSecret = "50a61b93919c9604";
    private static final String DataSecretIV = "7c8ac6861661d584";
    private static final String OperatorSecret = "a762796b2a8989b8";
    private static final String SigSecret = "52cd107eb677c004";
    private static final String DataSecret = "98f46ab6481d87c4";
    private static final String DataSecretIV = "978170fd1c11a70e";
    private final static String url = "https://hlht-dipper-sc.unievbj.com/evcs/v1.0.0";
    private static final String OurDataSecret = "50a61b93919c9605";
@@ -52,7 +65,6 @@
    @Autowired
    private RedisService redisService;
    public static final String TOKEN_KEY = "charge_token:";
    private final static String url = "https://dev-gov-hlht-sc.unievbj.com/evcs/v1.0.0/";
    /**
     * 获取token
     */
@@ -72,43 +84,118 @@
    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(){
//        String token = redisService.getCacheObject(TOKEN_KEY);
//        if(StringUtils.hasLength(token)){
//            return token;
//        }
//        JSONObject jsonObject = new JSONObject();
//        jsonObject.put("OperatorID", OperatorID);
//        jsonObject.put("OperatorSecret", OperatorSecret);
//        String params = jsonObject.toJSONString();
//        // 参数加密
//        String data = AesEncryption.encrypt(DataSecret, DataSecretIV, params);
//        // 获取签名
//        String timeStamp = System.currentTimeMillis() + "";
//        SequenceGenerator generator = new SequenceGenerator();
//        String nextSequence = generator.getNextSequence();
//        String hmacMD5 = HMacMD5Util.getHMacMD5(OperatorID,timeStamp, data,nextSequence,SigSecret);
//        jsonObject = new JSONObject();
//        jsonObject.put("OperatorID", OperatorID);
//        jsonObject.put("Data", data);
//        jsonObject.put("TimeStamp", timeStamp);
//        jsonObject.put("Seq", nextSequence);
//        jsonObject.put("Sig", hmacMD5);
//        String result = HttpUtils.sendPost(url+query_token, jsonObject.toJSONString());
//        String string = JSONObject.parseObject(result).getString("Data");
//        String decrypt = AesEncryption.decrypt(DataSecret, DataSecretIV, string);
//        JSONObject tokenResult = JSONObject.parseObject(decrypt);
//        token = tokenResult.getString("AccessToken");
//        Integer TokenAvailableTime = tokenResult.getInteger("TokenAvailableTime");
//        redisService.setCacheObject(TOKEN_KEY,token, (long) (TokenAvailableTime - 60), TimeUnit.SECONDS);
//        return token;
//    }
    public String queryToken(){
        HttpRequest post = HttpUtil.createPost(url + query_token);
        JSONObject info = new JSONObject();
        info.put("OperatorID", "906171535");
        info.put("OperatorSecret", OperatorSecret);
        Long timeStamp = Long.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
        post.contentType("application/json;charset=utf-8");
        BaseRequestJianGuan baseRequest = new BaseRequestJianGuan();
        baseRequest.setOperatorID("906171535");
        baseRequest.setTimeStamp(timeStamp+"");
        baseRequest.setSeq("0001");
        String jsonString = JacksonUtils.toJson(info);
        SequenceGenerator generator = new SequenceGenerator();
        String nextSequence = generator.getNextSequence();
        String data = AesEncryption.encrypt(DataSecret, DataSecretIV,jsonString);
        String hmacMD5 = HMacMD5Util.getHMacMD5("906171535",timeStamp+"", data,nextSequence,SigSecret);
        baseRequest.setData(data);
        baseRequest.setSig(hmacMD5);
        String request_json = JacksonUtils.toJson(baseRequest);
        log.info("获取三方平台授权token请求地址:" + post.getUrl());
        log.info("获取三方平台授权token请求参数:" + request_json);
        log.info("获取三方平台授权token请求Data:" + jsonString);
        post.body(request_json);
        HttpResponse execute = post.execute();
        if(200 != execute.getStatus()){
            log.error("获取三方平台授权token失败:" + execute.body());
            return null;
        }
        log.info("获取三方平台授权token响应参数:" + execute.body());
        BaseResult baseResult = JSON.parseObject(execute.body(), BaseResult.class);
        Integer Ret = baseResult.getRet();
        if(0 != Ret){
            log.error("获取三方平台授权token失败:" + baseResult.getMsg());
            return null;
        }
        //解密参数
        String decrypt = AESUtil.decrypt(baseResult.getData(), DataSecret, DataSecretIV);
        log.info("获取三方平台授权token响应Data:" + decrypt);
        QueryTokenResult queryTokenResult = JSON.parseObject(decrypt, QueryTokenResult.class);
        String token = queryTokenResult.getAccessToken();
//        Long tokenAvailableTime = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC) + queryTokenResult.getTokenAvailab
        return token;
    }
    /**
     * 获取token
     */
    public String queryToken(){
        String token = redisService.getCacheObject(TOKEN_KEY);
        if(StringUtils.hasLength(token)){
            return token;
        }
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("OperatorID", OperatorID);
        jsonObject.put("OperatorSecret", OperatorSecret);
        String params = jsonObject.toJSONString();
        // 参数加密
        String data = AesEncryption.encrypt(DataSecret, DataSecretIV, params);
        // 获取签名
        String timeStamp = System.currentTimeMillis() + "";
        SequenceGenerator generator = new SequenceGenerator();
        String nextSequence = generator.getNextSequence();
        String hmacMD5 = HMacMD5Util.getHMacMD5(OperatorID,timeStamp, data,nextSequence,SigSecret);
        jsonObject = new JSONObject();
        jsonObject.put("OperatorID", OperatorID);
        jsonObject.put("Data", data);
        jsonObject.put("TimeStamp", timeStamp);
        jsonObject.put("Seq", nextSequence);
        jsonObject.put("Sig", hmacMD5);
        String result = HttpUtils.sendPost(url+query_token, jsonObject.toJSONString());
        String string = JSONObject.parseObject(result).getString("Data");
        String decrypt = AesEncryption.decrypt(DataSecret, DataSecretIV, string);
        JSONObject tokenResult = JSONObject.parseObject(decrypt);
        token = tokenResult.getString("AccessToken");
        Integer TokenAvailableTime = tokenResult.getInteger("TokenAvailableTime");
        redisService.setCacheObject(TOKEN_KEY,token, (long) (TokenAvailableTime - 60), TimeUnit.SECONDS);
        return token;
    }
//    public String queryToken(){
//        String token = redisService.getCacheObject(TOKEN_KEY);
//        if(StringUtils.hasLength(token)){
//            return token;
//        }
//        JSONObject jsonObject = new JSONObject();
//        jsonObject.put("OperatorID", OperatorID);
//        jsonObject.put("OperatorSecret", OperatorSecret);
//        String params = jsonObject.toJSONString();
//        // 参数加密
//        String data = AesEncryption.encrypt(DataSecret, DataSecretIV, params);
//        // 获取签名
//        String timeStamp = System.currentTimeMillis() + "";
//        SequenceGenerator generator = new SequenceGenerator();
//        String nextSequence = generator.getNextSequence();
//        String hmacMD5 = HMacMD5Util.getHMacMD5(OperatorID,timeStamp, data,nextSequence,SigSecret);
//        jsonObject = new JSONObject();
//        jsonObject.put("OperatorID", "906171535");
//        jsonObject.put("OperatorSecret", OperatorSecret);
//        jsonObject.put("Data", data);
//        jsonObject.put("TimeStamp", timeStamp);
//        jsonObject.put("Seq", nextSequence);
//        jsonObject.put("Sig", hmacMD5);
//        String result = HttpUtils.sendPost(url+query_token, jsonObject.toJSONString());
//        String string = JSONObject.parseObject(result).getString("Data");
//        String decrypt = AesEncryption.decrypt(DataSecret, DataSecretIV, string);
//        JSONObject tokenResult = JSONObject.parseObject(decrypt);
//        token = tokenResult.getString("AccessToken");
//        Integer TokenAvailableTime = tokenResult.getInteger("TokenAvailableTime");
//        redisService.setCacheObject(TOKEN_KEY,token, (long) (TokenAvailableTime - 60), TimeUnit.SECONDS);
//        return token;
//    }
    /**
@@ -173,6 +260,34 @@
     */
    public NotificationChargeOrderInfoResult notificationChargeOrderInfo(Operator operator, SupChargeOrderInfo info){
        HttpRequest post = HttpUtil.createPost(url+supervise_notification_charge_order_info);
        if (info.getOrderStatus()!=null){
            switch (info.getOrderStatus()){
                case -1:
                    info.setOrderStatus(7);
                    break;
                case 0:
                    info.setOrderStatus(7);
                    break;
                case 1:
                    info.setOrderStatus(1);
                    break;
                case 2:
                    info.setOrderStatus(1);
                    break;
                case 3:
                    info.setOrderStatus(2);
                    break;
                case 4:
                    info.setOrderStatus(3);
                    break;
                case 5:
                    info.setOrderStatus(4);
                    break;
            }
        }else{
            info.setOrderStatus(5);
        }
        buildBody(post, info, operator);
        HttpResponse execute = post.execute();
        if(200 != execute.getStatus()){
@@ -197,15 +312,15 @@
    /**
     * 构建请求参数和消息头
     * @param post
     * @param o
     * @param
     */
    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 " + queryToken());
        BaseRequest baseRequest = new BaseRequest();
        baseRequest.setOperatorID(operator.getOurOperatorId());
        baseRequest.setTimeStamp(timeStamp);
        BaseRequestJianGuan baseRequest = new BaseRequestJianGuan();
        baseRequest.setOperatorID("906171535");
        baseRequest.setTimeStamp(timeStamp+"");
        baseRequest.setSeq("0001");
        // 使用 Jackson 转换为 JSON
        ObjectMapper objectMapper = new ObjectMapper();
@@ -216,18 +331,56 @@
        } catch (Exception e) {
            e.printStackTrace();
        }
        String encrypt = AesEncryption.encrypt(jsonString, DataSecret, DataSecretIV);
        String encrypt = AesEncryption.encrypt(DataSecret, DataSecretIV,jsonString);
//        String encrypt = AesEncryption.encrypt(DataSecret, DataSecretIV,jsonString);
        baseRequest.setData(encrypt);
        baseRequest.setOperator(operator);
        SequenceGenerator generator = new SequenceGenerator();
        String nextSequence = generator.getNextSequence();
        String hmacMD5 = HMacMD5Util.getHMacMD5(OperatorID,timeStamp+"", encrypt,nextSequence,SigSecret);
        String hmacMD5 = HMacMD5Util.getHMacMD5("906171535",timeStamp+"", encrypt,nextSequence,SigSecret);
//        String hmacMD5 = HMacMD5Util.getHMacMD5(OperatorID,timeStamp, data,nextSequence,OurSigSecret);
        baseRequest.setSig(hmacMD5);
        String request_json = JacksonUtils.toJson(baseRequest);
        post.body(request_json);
        log.info("推送三方平台请求地址:" + post.getUrl());
        log.info("推送三方平台请求参数:" + request_json);
        log.info("推送三方平台请求Data:" + jsonString);
    }
    /**
     * 构建请求参数和消息头
     * @param post
     * @param
     */
    public void buildBodyStatus(HttpRequest post, SupStationPowerInfoResult info, Operator operator){
        Long timeStamp = Long.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
        post.contentType("application/json;charset=utf-8");
        post.header("Authorization", "Bearer " + queryToken());
        BaseRequestJianGuan baseRequest = new BaseRequestJianGuan();
        baseRequest.setOperatorID("906171535");
        baseRequest.setTimeStamp(timeStamp+"");
        baseRequest.setSeq("0001");
        String request_json1 = JacksonUtils.toJson(info);
        String encrypt = AesEncryption.encrypt(DataSecret, DataSecretIV,request_json1);
//        String encrypt = AesEncryption.encrypt(DataSecret, DataSecretIV,jsonString);
        baseRequest.setData(encrypt);
        baseRequest.setOperator(operator);
        SequenceGenerator generator = new SequenceGenerator();
        String nextSequence = generator.getNextSequence();
        String hmacMD5 = HMacMD5Util.getHMacMD5("906171535",timeStamp+"", encrypt,nextSequence,SigSecret);
//        String hmacMD5 = HMacMD5Util.getHMacMD5(OperatorID,timeStamp, data,nextSequence,OurSigSecret);
        baseRequest.setSig(hmacMD5);
        String request_json = JacksonUtils.toJson(baseRequest);
        post.body(request_json);
        log.info("推送三方平台请求地址:" + post.getUrl());
        log.info("推送三方平台请求参数:" + request_json);
        log.info("推送三方平台请求Data:" + request_json1);
    }
    /**
@@ -289,7 +442,7 @@
    public void superviseNotificationRealtimePowerInfo(SupStationPowerInfoResult info){
        Operator operator = new Operator();
        HttpRequest post = HttpUtil.createPost(url+supervise_notification_realtime_power_info);
        buildBody(post, info, operator);
        buildBodyStatus(post, info, operator);
        HttpResponse execute = post.execute();
        if(200 != execute.getStatus()){
            log.error("推送充换电站实时功率失败:" + execute.body());
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseModelJianGuan.java
New file
@@ -0,0 +1,47 @@
package com.ruoyi.integration.drainage.model;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.ruoyi.other.api.domain.Operator;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
 * @author zhibing.pu
 * @Date 2025/1/23 18:33
 */
@Data
public class BaseModelJianGuan {
    /**
     * 运营商标识
     */
    @NotNull
    @JsonProperty("OperatorID")
    private String operatorID;
    /**
     * 参数内容
     */
    @NotNull
    @JsonProperty("Data")
    private String data;
    /**
     * 时间戳
     * yyyyMMddHHmmss
     */
    @NotNull
    @JsonProperty("TimeStamp")
    private String timeStamp;
    /**
     * 自增序列
     * 4位自增序列取自时间戳,同一秒内按序列自增长,新秒重计。如 0001
     */
    @NotNull
    @JsonProperty("Seq")
    private String seq;
    /**
     * 运营商对象
     */
    @JsonIgnore
    private Operator operator;
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseRequestJianGuan.java
New file
@@ -0,0 +1,21 @@
package com.ruoyi.integration.drainage.model;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
 * 公共请求
 * @author zhibing.pu
 * @Date 2025/1/21 17:08
 */
@Data
public class BaseRequestJianGuan extends BaseModelJianGuan {
    /**
     * 数字签名
     */
    @NotNull
    @JsonProperty("Sig")
    private String sig;
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/ConnectorStatsInfo.java
@@ -1,6 +1,7 @@
package com.ruoyi.integration.drainage.model;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.models.auth.In;
import lombok.Data;
import javax.validation.constraints.NotNull;
@@ -25,4 +26,25 @@
    @NotNull
    @JsonProperty("ConnectorElectricity")
    private BigDecimal connectorElectricity;
    /**
     * 充电设备接口累
     * 计充电时长
     */
    @NotNull
    @JsonProperty("ConnectorTotalChargeTime")
    private Integer ConnectorTotalChargeTime;
    /**
     * 充电设备接口累
     * 计充电次数
     */
    @NotNull
    @JsonProperty("ConnectorTotalChargeNum")
    private Integer ConnectorTotalChargeNum;
    /**
     * 充电设备接口累
     * 计告警数量
     */
    @NotNull
    @JsonProperty("ConnectorTotalWarningNum")
    private Integer ConnectorTotalWarningNum;
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupEquipmentPowerInfo.java
@@ -23,7 +23,6 @@
    @JsonProperty("EquipRealTimePower")
    private BigDecimal EquipRealTimePower;
    @JsonProperty("DataTime")
    @JsonProperty("ConnectorPowerInfos")
    private List<SupConnectorPowerInfo> ConnectorPowerInfos;
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationInfoResult.java
@@ -12,6 +12,7 @@
 */
@Data
public class SupStationInfoResult {
    @JsonProperty("SupStationInfo")
    private StationInfo SupStationInfo;
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationPowerInfoResult.java
@@ -1,13 +1,17 @@
package com.ruoyi.integration.drainage.model;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
 * 推送充换电站实时功率
 */
@Data
public class SupStationPowerInfoResult {
    private List<SupStationPowerInfo> stationStatsInfos;
public class SupStationPowerInfoResult implements Serializable {
    @JsonProperty("SupStationPowerInfos")
    private List<SupStationPowerInfo> SupStationPowerInfos;
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/TCECCJianGuanontroller.java
@@ -303,7 +303,9 @@
            stationInfo.setBusineHours(datum.getStartServiceTime());
            stationInfo.setRoundTheClock(datum.getRoundTheClock());
            stationInfo.setParkType(datum.getParkType());
            stationInfo.setElectricityFee("{"+datum.getElectricityFee()+"}");
            if (org.springframework.util.StringUtils.hasLength(datum.getElectricityFee())){
                stationInfo.setElectricityFee("{"+datum.getElectricityFee()+"}");
            }
            stationInfo.setServiceFee("{"+datum.getServiceFee()+"}");
            stationInfo.setParkFee("{\"rules\":"+datum.getParkFee()+","+"\"freeDuration\":"+datum.getParkFeeFree()+"}");
            stationInfo.setElectricityType(datum.getElectricityType());
@@ -1814,13 +1816,17 @@
            }
            stationInfo.setRoundTheClock(stationInfo.getRoundTheClock()==null?1:stationInfo.getRoundTheClock());
            stationInfo.setParkType(stationInfo.getParkType()==null?1:stationInfo.getParkType());
            stationInfo.setElectricityFee("{\"00:00:00-00:30:00\":\"0.4901\",\"00:00:30-01:00:00\":\"0.1234\"}");
            stationInfo.setServiceFee("{"+"\"00:00:00-00:30:00\":\"0.4901\",\"00:00:30-01:00:00\":\"0.1234\""+"}");
            if (!org.springframework.util.StringUtils.hasLength(stationInfo.getElectricityFee())){
                stationInfo.setElectricityFee("{\"00:00:00-00:30:00\":\"0.4901\",\"00:00:30-01:00:00\":\"0.1234\"}");
            }
            if (!org.springframework.util.StringUtils.hasLength(stationInfo.getServiceFee())){
                stationInfo.setServiceFee("{"+"\"00:00:00-00:30:00\":\"0.4901\",\"00:00:30-01:00:00\":\"0.1234\""+"}");
            }
            stationInfo.setElectricityType(stationInfo.getElectricityType()==null?1:stationInfo.getElectricityType());
            stationInfo.setBusinessExpandType(stationInfo.getBusinessExpandType()==null?1:stationInfo.getBusinessExpandType());
            stationInfo.setCapacity(stationInfo.getCapacity()==null?new BigDecimal("1.0000"):stationInfo.getCapacity());
            stationInfo.setRatedPower(stationInfo.getCapacity()==null?new BigDecimal("40.0000"):stationInfo.getCapacity());
            stationInfo.setPeriodFee(1);
            stationInfo.setPeriodFee(stationInfo.getPeriodFee()==null?1:stationInfo.getPeriodFee());
            stationInfo.setOfficialRunTime(org.springframework.util.StringUtils.hasLength(stationInfo.getOfficialRunTime())?stationInfo.getOfficialRunTime():"2025-01-01");
            stationInfo.setVideoMonitor(stationInfo.getVideoMonitor()==null?1:stationInfo.getVideoMonitor());
            int i = 0;
@@ -1847,14 +1853,22 @@
            }
            stationInfo.setEquipmentOwnerName("明星新能源");
            stationInfo.setResidentNo("A1234");
            if (org.springframework.util.StringUtils.hasLength(stationInfo.getResidentNo())){
                stationInfo.setResidentNo(stationInfo.getResidentNo());
            }else{
                stationInfo.setResidentNo("A1234");
            }
            stationInfo.setSupplyType(stationInfo.getSupplyType()==null?1:stationInfo.getSupplyType());
            stationInfo.setWattHourMeterNo(org.springframework.util.StringUtils.hasLength(stationInfo.getWattHourMeterNo())?stationInfo.getWattHourMeterNo():UUID.randomUUID().toString().replaceAll("-", ""));
            stationInfo.setForwardPower(stationInfo.getForwardPower()==null?"1.3654":stationInfo.getForwardPower());
            String uuid = UUID.randomUUID().toString();
            String randomString = uuid.replaceAll("-", ""); // 去除'-'
            stationInfo.setRecordUniqueNo(randomString);
            if (org.springframework.util.StringUtils.hasLength(stationInfo.getRecordUniqueNo())){
                stationInfo.setRecordUniqueNo(stationInfo.getRecordUniqueNo());
            }else{
                stationInfo.setRecordUniqueNo(randomString);
            }
        }
        String timeStamp = System.currentTimeMillis() + "";
        SequenceGenerator generator = new SequenceGenerator();
@@ -2104,10 +2118,8 @@
        supEquipChargeStatus.setStartTime(chargingOrder.getStartTime() != null ? chargingOrder.getStartTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) : "");
        supEquipChargeStatus.setEndTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        supEquipChargeStatus.setTotalPower(chargingOrder.getElectrovalence());
        List<Operator> operators = operatorClient.getAllOperator().getData();
        for (Operator operator : operators) {
            tcecSuperviseUtil.notificationSupEquipChargeStatus(operator, supEquipChargeStatus);
        }
        tcecSuperviseUtil.notificationSupEquipChargeStatus(new Operator(), supEquipChargeStatus);
        return R.ok();
    }
    /**
@@ -2150,11 +2162,7 @@
                supChargeOrderInfo.setStopDesc("费用不足中止");
                break;
        }
        List<Operator> operators = operatorClient.getAllOperator().getData();
        for (Operator operator : operators) {
            tcecSuperviseUtil.notificationChargeOrderInfo(operator, supChargeOrderInfo);
        }
        tcecSuperviseUtil.notificationChargeOrderInfo(new Operator(), supChargeOrderInfo);
        return R.ok();
    }
@@ -2184,9 +2192,18 @@
                stationInfo.setConstruction(255);
            }
            stationInfo.setRoundTheClock(stationInfo.getRoundTheClock()==null?1:stationInfo.getRoundTheClock());
            stationInfo.setRoundTheClock(0);
            stationInfo.setParkType(stationInfo.getParkType()==null?1:stationInfo.getParkType());
            stationInfo.setElectricityFee("{\"00:00:00-00:30:00\":\"0.4901\",\"00:00:30-01:00:00\":\"0.1234\"}");
            stationInfo.setServiceFee("{"+"\"00:00:00-00:30:00\":\"0.4901\",\"00:00:30-01:00:00\":\"0.1234\""+"}");
            if (org.springframework.util.StringUtils.hasLength(site.getElectricityFee())){
                stationInfo.setElectricityFee("{"+site.getElectricityFee()+"}");
            }else{
                stationInfo.setElectricityFee("{\"00:00:00-00:30:00\":\"0.4901\",\"00:00:30-01:00:00\":\"0.1234\"}");
            }
            if (org.springframework.util.StringUtils.hasLength(site.getServiceFee())){
                stationInfo.setServiceFee("{"+site.getServiceFee()+"}");
            }else{
                stationInfo.setServiceFee("{"+"\"00:00:00-00:30:00\":\"0.4901\",\"00:00:30-01:00:00\":\"0.1234\""+"}");
            }
            stationInfo.setElectricityType(stationInfo.getElectricityType()==null?1:stationInfo.getElectricityType());
            stationInfo.setBusinessExpandType(stationInfo.getBusinessExpandType()==null?1:stationInfo.getBusinessExpandType());
            stationInfo.setCapacity(stationInfo.getCapacity()==null?new BigDecimal("1.0000"):stationInfo.getCapacity());
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/TaskUtil.java
@@ -53,25 +53,17 @@
    @Resource
    private ChargingPileClient chargingPileClient;
    // 每天凌晨12点30执行 推送充电用能统计
    @Scheduled(cron = "0 30 0 * * ?")
    public void superviseNotificationOperationStatsInfo() {
        StationStatsInfoResult res = new StationStatsInfoResult();
        int dayOfMonth1 = LocalDateTime.now().getYear();
        int dayOfMonth2 = LocalDateTime.now().getMonthValue();
        int dayOfMonth3 = LocalDateTime.now().getDayOfMonth();
        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);
        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);
        endLocalDateTime.withHour(23);
        endLocalDateTime.withMinute(59);
        endLocalDateTime.withSecond(59);
        String end = DateUtils.localDateTimeToString(endLocalDateTime);
        ChargingStatisticeDTO chargingStatisticeDTO = new ChargingStatisticeDTO();
        chargingStatisticeDTO.setStartTime(startLocalDateTime);
@@ -172,10 +164,9 @@
            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);
        supStationPowerInfoResult.setSupStationPowerInfos(stationStatsInfos);
        tcecSuperviseUtil.superviseNotificationRealtimePowerInfo(supStationPowerInfoResult);
    }
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java
@@ -254,7 +254,7 @@
                    UploadRealTimeMonitoringDataQuery query = new UploadRealTimeMonitoringDataQuery();
                    BeanUtils.copyProperties(uploadRealTimeMonitoringData, query);
                    chargingOrderClient.chargeMonitoring(query);
                    chargingOrder.setEndSoc(uploadRealTimeMonitoringDataMessage.getSoc()+"");
                    tcecPushUtil.pushSuperviseNotificationEquipChargeStatus(chargingOrder);
                } catch (Exception e) {
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/util/JianGuanTask.java
@@ -1,44 +1,44 @@
package com.ruoyi.integration.util;
import com.ruoyi.integration.mongodb.service.PingService;
import com.ruoyi.integration.mongodb.service.PongService;
import com.ruoyi.integration.rocket.produce.ChargingMessageListener;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
 * @author zhibing.pu
 * @date 2023/7/11 8:39
 */
@Component
public class JianGuanTask {
    @Resource
    private ChargingMessageListener chargingMessageListener;
    @Resource
    private PingService pingService;
    @Resource
    private PongService pongService;
    /**
     * 5分钟执行的定时任务
     */
    @Scheduled(fixedRate = 300000)
    public void taskMonth() {
        chargingMessageListener.transactionRecord();
    }
    @Scheduled(cron = "0 0 3 * * ?")
    public void task2() {
//        pingService.delPing();
//        pongService.delPong();
    }
}
//package com.ruoyi.integration.util;
//
//import com.ruoyi.integration.mongodb.service.PingService;
//import com.ruoyi.integration.mongodb.service.PongService;
//import com.ruoyi.integration.rocket.produce.ChargingMessageListener;
//import org.springframework.scheduling.annotation.Scheduled;
//import org.springframework.stereotype.Component;
//
//import javax.annotation.Resource;
//
//
///**
// * @author zhibing.pu
// * @date 2023/7/11 8:39
// */
//@Component
//public class JianGuanTask {
//
//    @Resource
//    private ChargingMessageListener chargingMessageListener;
//
//    @Resource
//    private PingService pingService;
//
//    @Resource
//    private PongService pongService;
//
//
//    /**
//     * 5分钟执行的定时任务
//     */
//    @Scheduled(fixedRate = 300000)
//    public void taskMonth() {
//        chargingMessageListener.transactionRecord();
//    }
//
//
//
//    @Scheduled(cron = "0 0 3 * * ?")
//    public void task2() {
////        pingService.delPing();
////        pongService.delPong();
//    }
//}
ruoyi-service/ruoyi-integration/src/test/java/com/ruoyi/integration/RuoYiIntegrationApplicationTests.java
@@ -1,16 +1,42 @@
package com.ruoyi.integration;
import com.alibaba.fastjson2.JSON;
import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient;
import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient;
import com.ruoyi.chargingPile.api.feignClient.SiteClient;
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.domain.R;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
import com.ruoyi.integration.barrierGate.model.CloudParkingOrder;
import com.ruoyi.integration.barrierGate.server.ParkingOrderService;
import com.ruoyi.integration.drainage.TCECSuperviseUtil;
import com.ruoyi.integration.drainage.model.*;
import com.ruoyi.integration.mongodb.service.UploadRealTimeMonitoringDataService;
import com.ruoyi.order.api.dto.ChargingStatisticeDTO;
import com.ruoyi.order.api.feignClient.ChargingOrderClient;
import com.ruoyi.order.api.model.TChargingOrder;
import com.ruoyi.other.api.domain.Operator;
import com.ruoyi.other.api.feignClient.OperatorClient;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cglib.core.Local;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = RuoYiIntegrationApplication.class)
public class RuoYiIntegrationApplicationTests {
@@ -21,14 +47,339 @@
    private ParkingOrderService parkingOrderService;
    @Resource
    private SiteClient siteClient;
//    @Test
//    public void test(){
//        String json = "{\"appkey\":\"842ae0c027e64b3590af9eea6\",\"enterChannel\":\"001\",\"enterChannelName\":\"进口\",\"enterDateTime\":\"2024-11-01T11:25:15.677Z\",\"id\":\"17B51DA0983C11EFA99CA979A8A8386B\",\"kind\":\"临时卡\",\"name\":\"临时识别\",\"plate\":\"川JD34056\",\"plateColor\":\"绿色\",\"sign\":\"29A902820C2657C51FBE90235152534F\"}";
//        CloudParkingOrder order = JSON.parseObject(json, CloudParkingOrder.class);
//        parkingOrderService.cloudParkingInOrder(order);
//    }
    @Resource
    private ChargingGunClient chargingGunClient;
    @Resource
    private ChargingOrderClient chargingOrderClient;
    @Resource
    private OperatorClient operatorClient;
    @Test
    public void test(){
        /**
         * 推送充电设备接口状态信息
         * @param chargingGun
         * @return
         */
        List<TChargingGun> data = chargingGunClient.getAllGun().getData();
        TChargingGun chargingGun = data.stream().filter(e -> e.getId() == 61).findFirst().orElse(new TChargingGun());
        ConnectorStatusInfo connectorStatusInfo = new ConnectorStatusInfo();
            connectorStatusInfo.setOperatorID("906171535");
            connectorStatusInfo.setEquipmentOwnerID("906171535");
            connectorStatusInfo.setStationID(String.valueOf(chargingGun.getSiteId()));
            connectorStatusInfo.setEquipmentID(String.valueOf(chargingGun.getChargingPileId()));
            connectorStatusInfo.setConnectorID(chargingGun.getFullNumber());
            connectorStatusInfo.setEquipmentClassification(1);
            switch (chargingGun.getStatus()){
                case 1:
                    connectorStatusInfo.setStatus(0);
                    break;
                case 2:
                    connectorStatusInfo.setStatus(1);
                    break;
                case 3:
                    connectorStatusInfo.setStatus(2);
                    break;
                case 4:
                    connectorStatusInfo.setStatus(3);
                    break;
                case 5:
                    connectorStatusInfo.setStatus(3);
                    break;
                case 6:
                    connectorStatusInfo.setStatus(4);
                    break;
                case 7:
                    connectorStatusInfo.setStatus(255);
                    break;
            }
            connectorStatusInfo.setUpdateTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
//            List<Operator> operators = operatorClient.getAllOperator().getData();
//            for (Operator operator : operators) {
                tcecSuperviseUtil.notificationStationStatus(new Operator(), connectorStatusInfo);
//            }
    }
    @Autowired
    private TCECSuperviseUtil tcecSuperviseUtil;
    private final static String operatorId = "906171535";
    @Test
    public void test1(){
        TChargingOrder chargingOrder = chargingOrderClient.orderDetail(1884874763556048898L).getData();
        SupEquipChargeStatus supEquipChargeStatus = new SupEquipChargeStatus();
        supEquipChargeStatus.setOperatorID(operatorId);
        supEquipChargeStatus.setEquipmentOwnerID(operatorId);
        supEquipChargeStatus.setStationID(String.valueOf(chargingOrder.getSiteId()));
        supEquipChargeStatus.setEquipmentID(String.valueOf(chargingOrder.getChargingPileId()));
        supEquipChargeStatus.setOrderNo(operatorId+chargingOrder.getCode());
        switch (chargingOrder.getStatus()){
            case 2:
                supEquipChargeStatus.setConnectorStatus(1);
                break;
            case 3:
                supEquipChargeStatus.setConnectorStatus(2);
                break;
            case 4:
                supEquipChargeStatus.setConnectorStatus(3);
                break;
            case 5:
                supEquipChargeStatus.setConnectorStatus(4);
                break;
        }
        TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
        supEquipChargeStatus.setConnectorID(chargingGun.getFullNumber());
        supEquipChargeStatus.setEquipmentClassification(1);
        supEquipChargeStatus.setPushTimeStamp(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        switch (chargingGun.getStatus()){
            case 1:
                supEquipChargeStatus.setConnectorStatus(0);
                break;
            case 2:
                supEquipChargeStatus.setConnectorStatus(1);
                break;
            case 3:
                supEquipChargeStatus.setConnectorStatus(2);
                break;
            case 4:
                supEquipChargeStatus.setConnectorStatus(3);
                break;
            case 5:
                supEquipChargeStatus.setConnectorStatus(3);
                break;
            case 6:
                supEquipChargeStatus.setConnectorStatus(4);
                break;
            case 7:
                supEquipChargeStatus.setConnectorStatus(255);
                break;
        }
        supEquipChargeStatus.setCurrentA(chargingOrder.getCurrent());
        supEquipChargeStatus.setSOC(StringUtils.hasLength(chargingOrder.getEndSoc())?new BigDecimal(chargingOrder.getEndSoc()):new BigDecimal("1"));
        supEquipChargeStatus.setStartTime(chargingOrder.getStartTime() != null ? chargingOrder.getStartTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) : "");
        supEquipChargeStatus.setEndTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        supEquipChargeStatus.setTotalPower(chargingOrder.getElectrovalence());
        tcecSuperviseUtil.notificationSupEquipChargeStatus(new Operator(), supEquipChargeStatus);
    }
    @Test
    public void test2(){
        TChargingOrder chargingOrder = chargingOrderClient.orderDetail(1884874763556048898L).getData();
        SupChargeOrderInfo supChargeOrderInfo = new SupChargeOrderInfo();
        supChargeOrderInfo.setOperatorID(operatorId);
        supChargeOrderInfo.setEquipmentOwnerID(operatorId);
        supChargeOrderInfo.setStationID(String.valueOf(chargingOrder.getSiteId()));
        supChargeOrderInfo.setEquipmentID(String.valueOf(chargingOrder.getChargingPileId()));
        supChargeOrderInfo.setOrderNo(operatorId+chargingOrder.getCode());
        TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
        supChargeOrderInfo.setConnectorID(chargingGun.getFullNumber());
        supChargeOrderInfo.setEquipmentClassification(1);
        supChargeOrderInfo.setPushTimeStamp(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        supChargeOrderInfo.setStartTime(chargingOrder.getStartTime() != null ? chargingOrder.getStartTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) : "");
        supChargeOrderInfo.setEndTime(chargingOrder.getEndTime() != null ? chargingOrder.getEndTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) : "");
        supChargeOrderInfo.setTotalPower(chargingOrder.getElectrovalence());
        supChargeOrderInfo.setTotalElecMoney(chargingOrder.getElectrovalence());
        supChargeOrderInfo.setTotalServiceMoney(chargingOrder.getServiceCharge());
        supChargeOrderInfo.setTotalMoney(chargingOrder.getOrderAmount());
        supChargeOrderInfo.setOrderStatus(chargingOrder.getStatus());
        switch (chargingOrder.getEndMode()){
            case 0:
                supChargeOrderInfo.setStopReason(5);
                supChargeOrderInfo.setStopDesc("异常终止");
                break;
            case 1:
                supChargeOrderInfo.setStopReason(0);
                supChargeOrderInfo.setStopDesc("用户手动停止充电");
                break;
            case 2:
                supChargeOrderInfo.setStopReason(1);
                supChargeOrderInfo.setStopDesc("客户归属地运营商平台停止充电");
                break;
            case 3:
                supChargeOrderInfo.setStopReason(1);
                supChargeOrderInfo.setStopDesc("费用不足中止");
                break;
        }
        tcecSuperviseUtil.notificationChargeOrderInfo(new Operator(), supChargeOrderInfo);
    }
    @Test
    public void test3(){
        StationStatsInfoResult res = new StationStatsInfoResult();
        List<Site> data = siteClient.getSiteAll().getData();
        LocalDateTime now = LocalDateTime.now();
        LocalDateTime startLocalDateTime = now.minusDays(1);
        LocalDateTime endLocalDateTime = now.minusDays(1);
        LocalDateTime localDateTime1 = LocalDateTime.of(2025, 2, 3, 0, 0, 0);
        LocalDateTime localDateTime2 = LocalDateTime.of(2025, 2, 3, 23, 59, 59);
        // 获取今天凌晨
        startLocalDateTime.withHour(0);
        startLocalDateTime.withMinute(0);
        startLocalDateTime.withSecond(0);
        startLocalDateTime.withMonth(1);
        startLocalDateTime.withDayOfMonth(28);
        String start = DateUtils.localDateTimeToString(startLocalDateTime);
        endLocalDateTime.withHour(23);
        endLocalDateTime.withMinute(59);
        endLocalDateTime.withSecond(59);
        startLocalDateTime.withMonth(1);
        startLocalDateTime.withDayOfMonth(28);
        String end = DateUtils.localDateTimeToString(endLocalDateTime);
        ChargingStatisticeDTO chargingStatisticeDTO = new ChargingStatisticeDTO();
        chargingStatisticeDTO.setStartTime(localDateTime1);
        chargingStatisticeDTO.setEndTime(localDateTime2);
        List<TChargingOrder> data1 = chargingOrderClient.getChargingStatistics(chargingStatisticeDTO).getData();
        List<StationStatsInfo> stationStatsInfos = new ArrayList<>();
        String start1 = DateUtils.localDateTimeToString(localDateTime1);
        String start2 = DateUtils.localDateTimeToString(localDateTime2);
        for (Site datum : data) {
            StationStatsInfo stationStatsInfo = new StationStatsInfo();
            stationStatsInfo.setStationID(datum.getId().toString());
            stationStatsInfo.setEquipmentOwnerID("906171535");
            stationStatsInfo.setOperatorID("906171535");
            stationStatsInfo.setStationClassification(1);
            stationStatsInfo.setStartTime(start1);
            stationStatsInfo.setEndTime(start2);
            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"),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);
                    long chargingTime1 = 0L;
                    for (TChargingOrder chargingOrder : tChargingOrders1) {
                        // 累加充电时长
                        LocalDateTime startTime = chargingOrder.getStartTime();
                        LocalDateTime endTime = chargingOrder.getEndTime();
                        // 计算时间差 单位分钟
                        chargingTime += ChronoUnit.SECONDS.between(startTime, endTime)/60;
                    }
                    TChargingGun chargingGun = chargingGunClient.getChargingGunById(integer1).getData();
                    ConnectorStatsInfo connectorStatsInfo = new ConnectorStatsInfo();
                    connectorStatsInfo.setConnectorID(chargingGun.getFullNumber());
                    connectorStatsInfo.setConnectorElectricity(reduce2);
                    connectorStatsInfo.setConnectorTotalChargeTime(Integer.valueOf(chargingTime+""));
                    connectorStatsInfo.setConnectorTotalChargeNum(tChargingOrders1.size());
                    connectorStatsInfo.setConnectorTotalWarningNum(0);
                    ConnectorStatsInfos.add(connectorStatsInfo);
                }
                equipmentStatsInfo.setConnectorStatsInfos(ConnectorStatsInfos);
                EquipmentStatsInfos.add(equipmentStatsInfo);
            }
            stationStatsInfo.setEquipmentStatsInfos(EquipmentStatsInfos);
            stationStatsInfos.add(stationStatsInfo);
        }
        res.setStationStatsInfos(stationStatsInfos);
        tcecSuperviseUtil.superviseNotificationOperationStatsInfo(res);
    }
    @Resource
    private ChargingPileClient chargingPileClient;
    @Test
    public void test4(){
        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.of(2025, 2, 3, 23, 30, 0);
        LocalDateTime startLocalDateTime = LocalDateTime.of(2025, 2, 3, 20, 0, 0);
        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()));
            if (collect.isEmpty()){
                supStationPowerInfo.setStationRealTimePower(new BigDecimal("0"));
            }else{
                BigDecimal divide = collect.stream().map(TChargingOrder::getChargingPower).reduce(BigDecimal.ZERO,BigDecimal::add).divide(new BigDecimal(collect.size()),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<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;
    }
    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;
    }
}