无关风月
2025-03-25 17c1bce278e9a727d30b00e02f021e83045c5501
Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/mx_charging_pile
6个文件已修改
3个文件已添加
826 ■■■■■ 已修改文件
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java 253 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECSuperviseUtil.java 254 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/ConnectorStatusInfo.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStationStatus.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatusInfo.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupChargeOrderInfo.java 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupEquipChargeStatus.java 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java
@@ -200,6 +200,7 @@
                    return AjaxResult.error("华为创建设备失败");
                }
            }else{
                log.error("华为创建设备失败" + JSON.toJSONString(deviceResp));
                return AjaxResult.error("华为创建设备失败");
            }
        }else{
@@ -693,7 +694,8 @@
        }
        for (TChargingGun chargingGun : list) {
            Long time = (Long) charging_gun_online.get(chargingGun.getFullNumber());
            if(null != time && System.currentTimeMillis() - time > 60000){
            //判断设备是否真的脸1分钟(1分钟+代码中的30秒间隔处理存储)
            if(null != time && System.currentTimeMillis() - time > 90000){
                TChargingGun chargingGun1 = new TChargingGun();
                chargingGun1.setId(chargingGun.getId());
                chargingGun1.setStatus(1);
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java
@@ -25,12 +25,14 @@
import com.ruoyi.other.api.feignClient.SystemConfigurationClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@@ -83,7 +85,7 @@
    @Resource
    private SystemConfigurationClient systemConfigurationClient;
    
    private final static String operatorId = "906171535";
    
    /**
     * 请求校验
@@ -1796,46 +1798,93 @@
        return baseResult;
    }
    /**
     * 查询充电站信息
     * 查询充换电站状态信息
     * @param baseRequest
     * @param request
     * @return
     */
    @PostMapping("/supervise_notification_operation_stats_info")
    public BaseResult superviseNotificationOperationStatsInfo(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
        log.info("监管平台查询充电站信息请求参数:" + JacksonUtils.toJson(baseRequest));
    @PostMapping("/supervise_query_station_status")
    public BaseResult superviseQueryStationStatus(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
        log.info("监管平台查询充换电站状态信息请求参数:" + JacksonUtils.toJson(baseRequest));
        //校验token和签名
        BaseResult baseResult = requestCheck(true, baseRequest, request);
        if(0 != baseResult.getRet()){
            log.info("监管平台查询充电站信息响应Data:");
            log.info("监管平台查询充换电站状态信息响应Data:");
            baseResult.setData("");
            baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
            log.info("监管平台查询充电站信息响应参数:" + JacksonUtils.toJson(baseResult));
            log.info("监管平台查询充换电站状态信息响应参数:" + JacksonUtils.toJson(baseResult));
            return baseResult;
        }
        Operator operator = baseResult.getOperator();
        //解密参数
        String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getOurDataSecret(), operator.getOurDataSecretIv());
        log.info("监管平台查询充电站信息请求Data:" + decrypt);
        QueryStationsInfo queryStationsInfo = JSON.parseObject(decrypt, QueryStationsInfo.class);
        Integer pageNo = queryStationsInfo.getPageNo();
        Integer pageSize = queryStationsInfo.getPageSize();
        List<String> stationIDs = queryStationsInfo.getStationIDs();
        if(null == pageNo){
            pageNo = 1;
        log.info("监管平台查询充换电站状态信息请求Data:" + decrypt);
        QueryStationStatus queryStationStatus = JSON.parseObject(decrypt, QueryStationStatus.class);
        List<String> stationIDs = queryStationStatus.getStationIDs();
        String operatorID = queryStationStatus.getOperatorID();
        List<Integer> stationIDList = new ArrayList<>();
        for (String stationID : stationIDs) {
            stationIDList.add(Integer.valueOf(stationID));
        }
        if(null == pageSize){
            pageSize = 50;
        QueryStationStatusResult queryStationStatusResult = new QueryStationStatusResult();
        List<StationStatusInfo> stationStatusInfos = new ArrayList<>();
        // 查询站点下的桩信息状态
        List<TChargingPile> chargingPiles = chargingPileClient.getChargingPileBySiteIds(stationIDList).getData();
        if(!CollectionUtils.isEmpty(chargingPiles)){
            List<Integer> pileIds = chargingPiles.stream().map(TChargingPile::getId).collect(Collectors.toList());
            List<TChargingGun> chargingGuns = chargingGunClient.getChargingGunByChargingPileIds(pileIds).getData();
            if(!CollectionUtils.isEmpty(chargingGuns)){
                for (Integer stationID : stationIDList) {
                    StationStatusInfo stationStatusInfo = new StationStatusInfo();
                    stationStatusInfo.setOperatorID(operatorID);
                    stationStatusInfo.setEquipmentOwnerID("999999999");
                    stationStatusInfo.setStationID(String.valueOf(stationID));
                    List<ConnectorStatusInfo> connectorStatusInfos = new ArrayList<>();
                    for (TChargingGun chargingGun : chargingGuns) {
                        ConnectorStatusInfo connectorStatusInfo = new ConnectorStatusInfo();
                        connectorStatusInfo.setOperatorID(operatorId);
                        connectorStatusInfo.setEquipmentOwnerID("999999999");
                        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;
        }
        PageInfo<Site> siteListPaging = siteClient.getSiteListPaging(pageNo, pageSize, stationIDs);
        List<TParkingLot> parkingLots = parkingLotClient.getAllParkingLot().getData();
        QueryStationsInfoResult queryStationsInfoResult = new QueryStationsInfoResult();
        queryStationsInfoResult.setPageNo(pageNo);
        queryStationsInfoResult.setPageCount((0 == (siteListPaging.getTotal() % pageSize) ? 0 : 1) + Double.valueOf(siteListPaging.getTotal() / pageSize).intValue());
        queryStationsInfoResult.setItemSize(Long.valueOf(siteListPaging.getTotal()).intValue());
        queryStationsInfoResult.setStationInfos(buildSite(parkingLots, siteListPaging.getRecords()));
                        connectorStatusInfo.setUpdateTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
                        connectorStatusInfos.add(connectorStatusInfo);
                    }
                    stationStatusInfo.setConnectorStatusInfos(connectorStatusInfos);
                    stationStatusInfos.add(stationStatusInfo);
                }
            }
            queryStationStatusResult.setStationStatusInfos(stationStatusInfos);
        }
        //参数加密
        String jsonString = JacksonUtils.toJson(queryStationsInfoResult);
        String jsonString = JacksonUtils.toJson(queryStationStatusResult);
        log.info("监管平台查询充电站信息响应Data:" + jsonString);
        String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
        baseResult.setData(encrypt);
@@ -1844,6 +1893,162 @@
        return baseResult;
    }
    /**
     * 推送充电设备接口状态信息
     * @param chargingGun
     * @return
     */
    public R pushSuperviseNotificationStationStatus(TChargingGun chargingGun){
        ConnectorStatusInfo connectorStatusInfo = new ConnectorStatusInfo();
        connectorStatusInfo.setOperatorID(operatorId);
        connectorStatusInfo.setEquipmentOwnerID("999999999");
        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(operator, connectorStatusInfo);
        }
        return R.ok();
    }
    /**
     * 推送充电状态信息
     * @param chargingOrder
     * @return
     */
    public R pushSuperviseNotificationEquipChargeStatus(TChargingOrder chargingOrder){
        SupEquipChargeStatus supEquipChargeStatus = new SupEquipChargeStatus();
        supEquipChargeStatus.setOperatorID(operatorId);
        supEquipChargeStatus.setEquipmentOwnerID("999999999");
        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(new BigDecimal(chargingOrder.getEndSoc()));
        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);
        }
        return R.ok();
    }
    /**
     * 推送充电订单信息
     * @param chargingOrder
     * @return
     */
    public R pushSuperviseNotificationChargeOrderInfo(TChargingOrder chargingOrder){
        SupChargeOrderInfo supChargeOrderInfo = new SupChargeOrderInfo();
        supChargeOrderInfo.setOperatorID(operatorId);
        supChargeOrderInfo.setEquipmentOwnerID("999999999");
        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());
        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;
        }
        List<Operator> operators = operatorClient.getAllOperator().getData();
        for (Operator operator : operators) {
            TCECSuperviseUtil.notificationChargeOrderInfo(operator, supChargeOrderInfo);
        }
        return R.ok();
    }
    /**
     * 推送充换电站信息
     * @param site
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECSuperviseUtil.java
New file
@@ -0,0 +1,254 @@
package com.ruoyi.integration.drainage;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.common.utils.JacksonUtils;
import com.ruoyi.common.core.utils.SpringUtils;
import com.ruoyi.integration.drainage.model.*;
import com.ruoyi.integration.drainage.model.enu.InterfaceUrlEnum;
import com.ruoyi.other.api.domain.Operator;
import com.ruoyi.other.api.feignClient.OperatorClient;
import lombok.extern.slf4j.Slf4j;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
/**
 * 中电联TCEC标准
 * @author zhibing.pu
 * @Date 2025/1/21 11:48
 */
@Slf4j
public class TCECSuperviseUtil {
    private static OperatorClient operatorClient = SpringUtils.getBean(OperatorClient.class);
    private final static String url = "https://dev-gov-hlht-sc.unievbj.com/evcs/v1.0.0/";
    /**
     * 推送充电设备接口状态信息
     */
    private final static String supervise_notification_station_status = "/supervise_notification_station_status";
    /**
     *推送充电状态信息
     */
    private final static String supervise_notification_equip_charge_status = "/supervise_notification_equip_charge_status";
    /**
     *推送充电订单信息
     */
    private final static String supervise_notification_charge_order_info = "/supervise_notification_charge_order_info";
    /**
     * 获取token
     */
    public static String queryToken(Operator operator){
        HttpRequest post = HttpUtil.createPost(operator.getUrl() + InterfaceUrlEnum.QUERY_TOKEN.getUrl());
        JSONObject info = new JSONObject();
        info.put("OperatorID", operator.getOurOperatorId());
        info.put("OperatorSecret", operator.getOperatorSecret());
        Long timeStamp = Long.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
        post.contentType("application/json;charset=utf-8");
        BaseRequest baseRequest = new BaseRequest();
        baseRequest.setOperatorID(operator.getOurOperatorId());
        baseRequest.setTimeStamp(timeStamp);
        baseRequest.setSeq("0001");
        String jsonString = JacksonUtils.toJson(info);
        String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
        baseRequest.setData(encrypt);
        baseRequest.setOperator(operator);
//        baseRequest.setSig(buildSign(baseRequest));
        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(), operator.getDataSecret(), operator.getDataSecretIv());
        log.info("获取三方平台授权token响应Data:" + decrypt);
        QueryTokenResult queryTokenResult = JSON.parseObject(decrypt, QueryTokenResult.class);
        String token = queryTokenResult.getAccessToken();
        Long tokenAvailableTime = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC) + queryTokenResult.getTokenAvailableTime();
        operator.setAccessToken(token);
        operator.setTokenAvailableTime(tokenAvailableTime);
        operatorClient.editOperator(operator);
        return token;
    }
    /**
     * 获取token
     * @return
     */
    public static String getToken(Operator operator){
        if(null != operator.getTokenAvailableTime() && operator.getTokenAvailableTime() > LocalDateTime.now().toEpochSecond(ZoneOffset.UTC)){
            return operator.getAccessToken();
        }else{
            return queryToken(operator);
        }
    }
    /**
     * 设备状态变化推送
     * @param info
     */
    public static NotificationStationStatusResult notificationStationStatus(Operator operator, ConnectorStatusInfo info) {
        HttpRequest post = HttpUtil.createPost(url+supervise_notification_station_status);
        buildBody(post, info, operator);
        HttpResponse execute = post.execute();
        if(200 != execute.getStatus()){
            log.error("推送三方平台设备状态失败:" + execute.body());
            return null;
        }
        log.info("推送三方平台设备状态响应:" + execute.body());
        BaseResult baseResult = JSON.parseObject(execute.body(), BaseResult.class);
        Integer Ret = baseResult.getRet();
        if(0 != Ret){
            log.error("推送三方平台设备状态失败:" + baseResult.getMsg());
            return null;
        }
        //解密参数
        String decrypt = AESUtil.decrypt(baseResult.getData(), operator.getDataSecret(), operator.getDataSecretIv());
        log.info("推送三方平台设备状态Data:" + decrypt);
        NotificationStationStatusResult notificationStationStatusResult = JSON.parseObject(decrypt, NotificationStationStatusResult.class);
        return notificationStationStatusResult;
    }
    /**
     * 推动充电状态
     * @param info
     * @return
     */
    public static NotificationEquipChargeStatusResult notificationSupEquipChargeStatus(Operator operator, SupEquipChargeStatus info){
        HttpRequest post = HttpUtil.createPost(url+supervise_notification_equip_charge_status);
        buildBody(post, info, operator);
        HttpResponse execute = post.execute();
        if(200 != execute.getStatus()){
            log.error("推送三方平台充电状态失败:" + execute.body());
            return null;
        }
        log.info("推送三方平台充电状态响应:" + execute.body());
        BaseResult baseResult = JSON.parseObject(execute.body(), BaseResult.class);
        Integer Ret = baseResult.getRet();
        if(0 != Ret){
            log.error("推送三方平台充电状态失败:" + baseResult.getMsg());
            return null;
        }
        //解密参数
        String decrypt = AESUtil.decrypt(baseResult.getData(), operator.getDataSecret(), operator.getDataSecretIv());
        log.info("推送三方平台充电状态Data:" + decrypt);
        NotificationEquipChargeStatusResult notificationEquipChargeStatusResult = JSON.parseObject(decrypt, NotificationEquipChargeStatusResult.class);
        return notificationEquipChargeStatusResult;
    }
    /**
     * 推送充电订单信息
     * @param info
     * @return
     */
    public static NotificationChargeOrderInfoResult notificationChargeOrderInfo(Operator operator, SupChargeOrderInfo info){
        HttpRequest post = HttpUtil.createPost(url+supervise_notification_charge_order_info);
        buildBody(post, info, operator);
        HttpResponse execute = post.execute();
        if(200 != execute.getStatus()){
            log.error("推送三方平台充电订单信息失败:" + execute.body());
            return null;
        }
        log.info("推送三方平台充电订单信息响应:" + execute.body());
        BaseResult baseResult = JSON.parseObject(execute.body(), BaseResult.class);
        Integer Ret = baseResult.getRet();
        if(0 != Ret){
            log.error("推送三方平台充电订单信息失败:" + baseResult.getMsg());
            return null;
        }
        //解密参数
        String decrypt = AESUtil.decrypt(baseResult.getData(), operator.getDataSecret(), operator.getDataSecretIv());
        log.info("推送三方平台充电订单信息Data:" + decrypt);
        NotificationChargeOrderInfoResult notificationChargeOrderInfoResult = JSON.parseObject(decrypt, NotificationChargeOrderInfoResult.class);
        return notificationChargeOrderInfoResult;
    }
    /**
     * 构建请求参数和消息头
     * @param post
     * @param o
     */
    public static 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));
        BaseRequest baseRequest = new BaseRequest();
        baseRequest.setOperatorID(operator.getOurOperatorId());
        baseRequest.setTimeStamp(timeStamp);
        baseRequest.setSeq("0001");
        String jsonString = JacksonUtils.toJson(o);
        String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
        baseRequest.setData(encrypt);
        baseRequest.setOperator(operator);
//        baseRequest.setSig(buildSign(baseRequest));
        String request_json = JacksonUtils.toJson(baseRequest);
        post.body(request_json);
        log.info("推送三方平台请求地址:" + post.getUrl());
        log.info("推送三方平台请求参数:" + request_json);
        log.info("推送三方平台请求Data:" + jsonString);
    }
    public static void main(String[] args) {
        BaseModel model = new BaseModel();
        model.setOperatorID("MA25CNM38");
        model.setData("AoArdDDcmHcmOMkCLHodTpY1xLtt9yhLqxvKPyfdlmEOBj1LJnQM+Z4JOZllt3Pj9rubfgxJ51zMAfzquQegJzHGAT9Y7JrKFzFe6jGtXo0=");
        model.setTimeStamp(20250205120800L);
        model.setSeq("0001");
        Operator operator = new Operator();
        operator.setName("XinDianTu");
        operator.setSigSecret("S94xUpTpOIlLJBk8");
        model.setOperator(operator);
        String key = operator.getSigSecret();
        String m = new StringBuilder(model.getOperatorID()).append(model.getData()).append(model.getTimeStamp()).append(model.getSeq()).toString();
        byte[] hmacMd5 = SignUtil.getHMacMD5Bytes(key.getBytes(), m.getBytes());
        // 打印计算得到的签名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==");
//        model.setTimeStamp(20250205161426L);
//        model.setSeq("0001");
//        Operator operator = new Operator();
//        operator.setOurOperatorId("2921700136");
//        operator.setOurSigSecret("KBm5J2fbGzyhX023");
//        model.setOperator(operator);
//        String key = operator.getOurSigSecret();
//
//        String m = new StringBuilder(operator.getOurOperatorId()).append(model.getData()).append(model.getTimeStamp()).append(model.getSeq()).toString();
//        byte[] hmacMd5 = SignUtil.getHMacMD5Bytes(key.getBytes(), m.getBytes());
//        // 打印计算得到的签名Sig
//        String s = SignUtil.bytesToHexString(hmacMd5);
//        System.err.println(s);
    }
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/ConnectorStatusInfo.java
@@ -52,4 +52,27 @@
    @JsonProperty("ConnectorStatusInfo")
    private ConnectorStatusInfo connectorStatusInfo;
    @JsonProperty("OperatorID")
    private String OperatorID;
    @JsonProperty("EquipmentOwnerID")
    private String EquipmentOwnerID;
    @JsonProperty("StationID")
    private String StationID;
    @JsonProperty("EquipmentID")
    private String EquipmentID;
    /**
     * 1:车辆充电设备接口
     * 2:换电站内的电池箱充
     * 电设备接口
     */
    @JsonProperty("EquipmentClassification")
    private Integer EquipmentClassification;
    /**
     * 本次状态变化的时间,
     * 格式“yyyy-MM-dd HH:mm:ss
     */
    @JsonProperty("UpdateTime")
    private String UpdateTime;
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStationStatus.java
@@ -20,4 +20,11 @@
    @NotNull
    @JsonProperty("StationIDs")
    private List<String> stationIDs;
    /**
     * 运营商服务平台ID,字符9位
     * 数组长度不超过50
     */
    @NotNull
    @JsonProperty("OperatorID")
    private String operatorID;
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatusInfo.java
@@ -24,4 +24,8 @@
     */
    @JsonProperty("ConnectorStatusInfos")
    private List<ConnectorStatusInfo> connectorStatusInfos;
    @JsonProperty("OperatorID")
    private String OperatorID;
    @JsonProperty("EquipmentOwnerID")
    private String EquipmentOwnerID;
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupChargeOrderInfo.java
New file
@@ -0,0 +1,145 @@
package com.ruoyi.integration.drainage.model;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
/**
 * 推送充电订单信息
 * 此接口用于数据提供方向数据需求方推送充电订单信息;充电
 * 订单在充电结束时实时推送,同一订单只可推送一次,禁止重复推
 * 送;推送失败时将推送失败的数据按小时级频率重试推送,直到推
 * 送成功。
 */
@Data
public class SupChargeOrderInfo {
    /**
     * 充换电平台运营商ID
     */
    @NotNull
    @JsonProperty("OperatorID")
    private String OperatorID;
    /**
     * 充换电服务运营商ID,
     * 所属方为个人时填写
     * 999999999
     */
    @NotNull
    @JsonProperty("EquipmentOwnerID")
    private String EquipmentOwnerID;
    /**
     * 充换电站ID
     */
    @NotNull
    @JsonProperty("StationID")
    private String StationID;
    /**
     * 充电设备编码
     */
    @NotNull
    @JsonProperty("EquipmentID")
    private String EquipmentID;
    /**
     * 充电订单号
     * 格式“运营商ID+唯一
     * 编号”,不超过64个字
     * 符
     */
    @NotNull
    @JsonProperty("OrderNo")
    private String OrderNo;
    /**
     * 充电订单状态
     * 1、启动中
     * 2、充电中
     * 3、停止中
     * 4、充电完成
     * 5、订单挂起
     * 6、充电异常结束
     * 7、启动失败
     */
    @NotNull
    @JsonProperty("OrderStatus")
    private Integer OrderStatus;
    /**
     * 充电设备接口编码
     */
    @NotNull
    @JsonProperty("ConnectorID")
    private String ConnectorID;
    /**
     * 设备接口分类
     * 1:车辆充电设备接口
     * 2:换电站内的电池箱
     * 充电设备接口
     */
    @NotNull
    @JsonProperty("EquipmentClassification")
    private Integer EquipmentClassification = 1;
    /**
     * 推送时间
     * yyyy-MM-dd HH:mm:ss ,充电设备推送给运
     */
    @NotNull
    @JsonProperty("PushTimeStamp")
    private String PushTimeStamp;
    /**
     * 开始充电时间
     */
    @NotNull
    @JsonProperty("StartTime")
    private String StartTime;
    /**
     * 本次采样时间
     */
    @NotNull
    @JsonProperty("EndTime")
    private String EndTime;
    /**
     * 累计充电量 小数点后4位
     */
    @NotNull
    @JsonProperty("TotalPower")
    private BigDecimal TotalPower;
    /**
     * 总电费
     */
    @NotNull
    @JsonProperty("TotalElecMoney")
    private BigDecimal TotalElecMoney;
    /**
     * 总服务费
     */
    @NotNull
    @JsonProperty("TotalServiceMoney")
    private BigDecimal TotalServiceMoney;
    /**
     * 累计总金额
     */
    @NotNull
    @JsonProperty("TotalMoney")
    private BigDecimal TotalMoney;
    /**
     * 充电结束原因
     * 0:用户手动停止充电
     * 1:客户归属地运营商平台停止充电
     * 2:BMS停止充电
     * 3:充电机设备故障
     * 4:连接器断开
     * 5~99: 自定义
     */
    @NotNull
    @JsonProperty("StopReason")
    private Integer StopReason;
    /**
     * 充电结束原因描
     * 述
     */
    @NotNull
    @JsonProperty("StopDesc")
    private String StopDesc;
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupEquipChargeStatus.java
New file
@@ -0,0 +1,134 @@
package com.ruoyi.integration.drainage.model;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
/**
 * 推送充电状态信息
 * 此接口用于数据提供方向数据需求方推送充电设备的充电状态
 * 开始充电实时推送一次、充电过程中50-60秒推送一
 * 次、充电结束实时推送一次
 */
@Data
public class SupEquipChargeStatus {
    /**
     * 充换电平台运营商ID
     */
    @NotNull
    @JsonProperty("OperatorID")
    private String OperatorID;
    /**
     * 充换电服务运营商ID,
     * 所属方为个人时填写
     * 999999999
     */
    @NotNull
    @JsonProperty("EquipmentOwnerID")
    private String EquipmentOwnerID;
    /**
     * 充换电站ID
     */
    @NotNull
    @JsonProperty("StationID")
    private String StationID;
    /**
     * 充电设备编码
     */
    @NotNull
    @JsonProperty("EquipmentID")
    private String EquipmentID;
    /**
     * 充电订单号
     * 格式“运营商ID+唯一
     * 编号”,不超过64个字
     * 符
     */
    @NotNull
    @JsonProperty("OrderNo")
    private String OrderNo;
    /**
     * 充电订单状态
     * 1、启动中
     * 2、充电中
     * 3、停止中
     * 4、充电完成
     * 5、订单挂起
     * 6、充电异常结束
     * 7、启动失败
     */
    @NotNull
    @JsonProperty("OrderStatus")
    private Integer OrderStatus;
    /**
     * 充电设备接口编码
     */
    @NotNull
    @JsonProperty("ConnectorID")
    private String ConnectorID;
    /**
     * 设备接口分类
     * 1:车辆充电设备接口
     * 2:换电站内的电池箱
     * 充电设备接口
     */
    @NotNull
    @JsonProperty("EquipmentClassification")
    private Integer EquipmentClassification = 1;
    /**
     * 推送时间
     * yyyy-MM-dd HH:mm:ss ,充电设备推送给运
     */
    @NotNull
    @JsonProperty("PushTimeStamp")
    private String PushTimeStamp;
    /**
     * 充电设备接口状态 ConnectorStatus
     * 0:离网
     * 1:空闲
     * 2: 占用(未充电)
     * 3: 占用(充电中)
     * 4: 占用(预约锁定)
     * 255:故障
     */
    @NotNull
    @JsonProperty("ConnectorStatus")
    private Integer ConnectorStatus;
    /**
     * A相电流
     * 小数点后4
     * 位
     */
    @NotNull
    @JsonProperty("CurrentA")
    private BigDecimal CurrentA;
    /**
     * 电池剩余电量 小数点后1
     * 位
     */
    @NotNull
    @JsonProperty("SOC")
    private BigDecimal SOC;
    /**
     * 开始充电时间
     */
    @NotNull
    @JsonProperty("StartTime")
    private String StartTime;
    /**
     * 本次采样时间
     */
    @NotNull
    @JsonProperty("EndTime")
    private String EndTime;
    /**
     * 累计充电量 小数点后4位
     */
    @NotNull
    @JsonProperty("TotalPower")
    private BigDecimal TotalPower;
}
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
@@ -1467,7 +1467,7 @@
        left join (select charging_order_id, sum(period_electric_price) as period_electric_price, sum(period_service_price) as period_service_price, sum(charging_capacity) as charging_capacity, sum(period_electric_price + period_service_price) as money from t_charging_order_accounting_strategy group by charging_order_id) b on (a.id = b.charging_order_id)
        WHERE a.del_flag = 0 and a.status = 5 and a.recharge_payment_status = 2  and DATE(
        <if test="statisticsQueryDto.type == 1">
            a.start_time
            a.create_time
        </if>
        <if test="statisticsQueryDto.type == 2">
            a.end_time