From 7cb8a6506062d0489dcd601a375f9dc89cbf6b4a Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期三, 16 四月 2025 09:02:53 +0800
Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/mx_charging_pile

---
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java                  |  442 +++
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationPowerInfo.java       |   31 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStationStatus.java        |    7 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatsInfoResult.java    |   18 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingStatisticeVO.java                          |   21 
 ruoyi-service/ruoyi-integration/src/test/java/com/ruoyi/integration/RuoYiIntegrationApplicationTests.java         |  364 +++
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/util/JianGuanTask.java                        |   44 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/RuoYiOtherApplication.java                                |    9 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupChargeOrderInfo.java        |  145 +
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationPowerInfoResult.java |   17 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatsInfo.java          |   50 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingGunServiceImpl.java   |   13 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java                  |   12 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/EquipmentStatsInfo.java        |   29 
 ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/TCECClient.java               |   10 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/RuoYiIntegrationApplication.java              |    6 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/TaskUtil.java                   |  211 ++
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECUtil.java                        |   14 
 ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/TCECClientFallbackFactory.java    |    7 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupConnectorPowerInfo.java     |   25 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java  |    1 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java             |   10 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseRequestJianGuan.java       |   21 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseModelJianGuan.java         |   47 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/TCECCJianGuanontroller.java     | 2463 +++++++++++++++++++++++++
 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/SiteClient.java             |   10 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECSuperviseUtil.java               |  499 +++++
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupEquipChargeStatus.java      |  134 +
 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/SiteFallbackFactory.java        |    5 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/ConnectorStatusInfo.java       |   23 
 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/Site.java                         |   28 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/SequenceGenerator.java          |   56 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/ConnectorStatsInfo.java        |   22 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/SupSwapEquipmentInfo.java            |   34 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java              |   13 
 ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TChargingGunMapper.xml                    |    5 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationInfo.java            |  210 ++
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/HttpUtils.java                           |   74 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java                  |   24 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/RuoYiOrderApplication.java                                |    7 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/HMacMD5Util.java                |  122 +
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/dto/ChargingStatisticeDTO.java                        |   23 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupEquipmentPowerInfo.java     |   28 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatusInfo.java         |    4 
 /dev/null                                                                                                         |   44 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECPushUtil.java                    |  212 ++
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/AesEncryption.java              |   55 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java           |    3 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java   |   26 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationInfoResult.java      |   20 
 50 files changed, 5,533 insertions(+), 165 deletions(-)

diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/SiteFallbackFactory.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/SiteFallbackFactory.java
index 433567d..a0e15e4 100644
--- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/SiteFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/SiteFallbackFactory.java
@@ -64,6 +64,11 @@
             public PageInfo<Site> getSiteListPaging(Integer PageNo, Integer PageSize, List<String> ids) {
                 return null;
             }
+
+            @Override
+            public PageInfo<Site> getSiteListPagingJianGuan(Integer PageNo, Integer PageSize, List<String> ids) {
+                return null;
+            }
         };
     }
 }
diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/SiteClient.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/SiteClient.java
index 37cb56a..5581f7f 100644
--- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/SiteClient.java
+++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/SiteClient.java
@@ -55,4 +55,14 @@
 	PageInfo<Site> getSiteListPaging(@RequestParam("PageNo") Integer PageNo,
 	                                 @RequestParam("PageSize") Integer PageSize,
 	                                 @RequestParam("ids") List<String> ids);
+	/**
+	 * 分页查询站电数据
+	 * @param PageNo
+	 * @param PageSize
+	 * @return
+	 */
+	@PostMapping("/site/getSiteListPagingJianGuan")
+	PageInfo<Site> getSiteListPagingJianGuan(@RequestParam("PageNo") Integer PageNo,
+	                                 @RequestParam("PageSize") Integer PageSize,
+	                                 @RequestParam("ids") List<String> ids);
 }
diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/Site.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/Site.java
index a6e396f..5b58570 100644
--- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/Site.java
+++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/Site.java
@@ -286,11 +286,12 @@
 	@ApiModelProperty(value = "2.0修改字段-停车费免费时长 单位分钟")
 	private Integer parkFeeFree;
 	/**
-	 * 停车费类型
+	 * 报装类型
 	 */
 	@TableField("business_expand_type")
 	@ApiModelProperty(value = "2.0修改字段-报装类型,是否独立报装:0:否1:是")
 	private Integer businessExpandType;
+
 	/**
 	 * 电费类型
 	 */
@@ -329,10 +330,10 @@
 	@ApiModelProperty(value = "2.0修改字段-充换电站方位 1:地面-停车场2:地面-路侧3:地下停车4:立体式停车楼")
 	private Integer stationOrientation;
 	/**
-	 *充换电站方位
+	 *充换电站建设面积
 	 */
 	@TableField("station_area")
-	@ApiModelProperty(value = "2.0修改字段-充换电站方位 充换电站建设面积")
+	@ApiModelProperty(value = "2.0修改字段-充换电站建设面积 充换电站建设面积")
 	private BigDecimal stationArea;
 	/**
 	 *充换电站人
@@ -349,15 +350,13 @@
 	@ApiModelProperty(value = "2.0修改字段-视频监控配套情况 0:无1:有")
 	private Integer videoMonitor;
 	/**
-	 视频监控配
-	 套情况
+	 周边配套设施
 	 */
 	@TableField("supporting_facilities")
 	@ApiModelProperty(value = "2.0修改字段-周边配套设施 1:卫生间2:便利店3:餐厅4:休息室5:雨棚,多个逗号拼接")
 	private String supportingFacilities;
 	/**
-	 视频监控配
-	 套情况
+	 是否有小票机
 	 */
 	@TableField("printer_flag")
 	@ApiModelProperty(value = "2.0修改字段-是否有小票机 0:无1:有")
@@ -430,11 +429,24 @@
 	@ApiModelProperty(value = "2.0修改字段-服务费描述,示例:\"00:00:00-00:30:00\":\"0.4901\",\"00:00:30-01:00:00\":\"0.1234\"")
 	private String serviceFee;
 	/**
-	 * 服务费描述
+	 * 充电站全省唯一备案号
 	 */
 	@TableField("record_unique_no")
 	@ApiModelProperty(value = "2.0修改字段-充电站全省唯一备案号")
 	private String recordUniqueNo;
+
+	/**
+	 * 支付方式
+	 */
+	@TableField("payment")
+	@ApiModelProperty(value = "2.0修改字段-支付方式 1刷卡 2线上 3现金")
+	private Integer payment;
+	/**
+	 * 是否支持预约
+	 */
+	@TableField("supportOrder")
+	@ApiModelProperty(value = "2.0修改字段-是否支持预约 0不支持1支持")
+	private Integer supportOrder;
 //	/**
 //	 * 换电设备信息
 //	 */
diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/TCECClientFallbackFactory.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/TCECClientFallbackFactory.java
index 91cd74b..ab7cfb8 100644
--- a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/TCECClientFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/TCECClientFallbackFactory.java
@@ -17,7 +17,12 @@
 		
 		
 		return new TCECClient() {
-			@Override
+            @Override
+            public R superviseNotificationStationInfo(Integer id) {
+				return R.fail("推送充换电站信息失败:" + cause.getMessage());
+            }
+
+            @Override
 			public R pushChargingGunStatus(String getFullNumber, Integer status) {
 				return R.fail("接口状态变化后推送给第三方失败:" + cause.getMessage());
 			}
diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/TCECClient.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/TCECClient.java
index 3e3becc..be1d542 100644
--- a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/TCECClient.java
+++ b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/TCECClient.java
@@ -17,8 +17,14 @@
  */
 @FeignClient(contextId = "TCECClient", value = ServiceNameConstants.INTEGRATION_SERVICE, fallbackFactory = TCECClientFallbackFactory.class)
 public interface TCECClient {
-	
-	
+	/**
+	 * 推送充换电站信息
+	 * @param id
+	 * @return
+	 */
+	@PostMapping("/evcs/v2.0/supervise_notification_station_info")
+	R  superviseNotificationStationInfo(@RequestParam("id") Integer id);
+
 	/**
 	 * 接口状态变化后推送给第三方
 	 * @return
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/dto/ChargingStatisticeDTO.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/dto/ChargingStatisticeDTO.java
new file mode 100644
index 0000000..bb7b7f1
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/dto/ChargingStatisticeDTO.java
@@ -0,0 +1,23 @@
+package com.ruoyi.order.api.dto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.ruoyi.order.api.model.TChargingOrder;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@ApiModel(value = "监管平台充电用能DTO",description = "监管平台充电用能DTO")
+public class ChargingStatisticeDTO {
+    @ApiModelProperty(value = "开始时间2020-01-01 00:00:00")
+    private LocalDateTime startTime;
+    @ApiModelProperty(value = "结束时间2020-01-01 23:59:59")
+    private LocalDateTime endTime;
+    @ApiModelProperty(value = "站点id")
+    private Integer siteId;
+}
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
index b1f6b08..6d50bbe 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
@@ -3,6 +3,7 @@
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.dto.ChargingOrderGroup;
 import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
+import com.ruoyi.order.api.dto.ChargingStatisticeDTO;
 import com.ruoyi.order.api.feignClient.ChargingOrderClient;
 import com.ruoyi.order.api.model.AddTripartitePlatformOrder;
 import com.ruoyi.order.api.model.ChargingListQuery;
@@ -174,8 +175,13 @@
             public R<List<TChargingOrder>> getChargingOrder(TChargingOrderVo order) {
                 return R.fail("获取充电订单数据失败:" + throwable.getMessage());
             }
-    
-    
+
+            @Override
+            public R<List<TChargingOrder>> getChargingStatistics(ChargingStatisticeDTO dto) {
+                return R.fail("获取充电订单数据失败-监管:" + throwable.getMessage());
+            }
+
+
             @Override
             public R<List<TChargingOrder>> getCarChargingOrder(Long carId, String startTime, String endTime) {
                 return R.fail("根据车辆id获取指定时间范围内的数据失败:" + throwable.getMessage());
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
index 2a22b03..fc03e1f 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
@@ -5,6 +5,7 @@
 import com.ruoyi.common.core.dto.ChargingOrderGroup;
 import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
 import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.order.api.dto.ChargingStatisticeDTO;
 import com.ruoyi.order.api.factory.ChargingOrderFallbackFactory;
 import com.ruoyi.order.api.model.AddTripartitePlatformOrder;
 import com.ruoyi.order.api.model.ChargingListQuery;
@@ -235,8 +236,15 @@
      */
     @PostMapping("/t-charging-order/getChargingOrder")
     R<List<TChargingOrder>> getChargingOrder(@RequestBody TChargingOrderVo order);
-    
-    
+    /**
+     * 获取充电订单数据
+     * @param
+     * @return
+     */
+    @PostMapping(value = "/t-charging-order/getChargingStatistics")
+    public R<List<TChargingOrder>> getChargingStatistics(@RequestBody ChargingStatisticeDTO dto);
+
+
     /**
      * 根据车辆id获取指定时间范围内的数据
      * @param carId
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingStatisticeVO.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingStatisticeVO.java
new file mode 100644
index 0000000..6760d25
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingStatisticeVO.java
@@ -0,0 +1,21 @@
+package com.ruoyi.order.api.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@ApiModel(value = "监管平台充电用能DTO",description = "监管平台充电用能DTO")
+public class ChargingStatisticeVO {
+    @ApiModelProperty(value = "站点id")
+    private Integer siteId;
+    @ApiModelProperty(value = "累计充电量")
+    private BigDecimal startTime;
+    @ApiModelProperty(value = "累计充电时间")
+    private Integer chargingTime;
+
+
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/HttpUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/HttpUtils.java
index c41fbbd..c990aed 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/HttpUtils.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/HttpUtils.java
@@ -178,6 +178,80 @@
         return result.toString();
     }
 
+    /**
+     * 向指定 URL 发送POST方法的请求
+     *
+     * @param url 发送请求的 URL
+     * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
+     * @param token token
+     * @return 所代表远程资源的响应结果
+     */
+    public static String sendPost(String url, String param,String token)
+    {
+        PrintWriter out = null;
+        BufferedReader in = null;
+        StringBuilder result = new StringBuilder();
+        try
+        {
+            log.info("sendPost - {}", url);
+            URL realUrl = new URL(url);
+            URLConnection conn = realUrl.openConnection();
+            conn.setRequestProperty("accept", "*/*");
+            conn.setRequestProperty("connection", "Keep-Alive");
+            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            conn.setRequestProperty("Accept-Charset", "utf-8");
+            conn.setRequestProperty("Content-Type", "application/json");
+            conn.setRequestProperty("Authorization", "Bearer "+token);
+            conn.setDoOutput(true);
+            conn.setDoInput(true);
+            out = new PrintWriter(conn.getOutputStream());
+            out.print(param);
+            out.flush();
+            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8));
+            String line;
+            while ((line = in.readLine()) != null)
+            {
+                result.append(line);
+            }
+            log.info("recv - {}", result);
+        }
+        catch (ConnectException e)
+        {
+            log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e);
+        }
+        catch (SocketTimeoutException e)
+        {
+            log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e);
+        }
+        catch (IOException e)
+        {
+            log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e);
+        }
+        catch (Exception e)
+        {
+            log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e);
+        }
+        finally
+        {
+            try
+            {
+                if (out != null)
+                {
+                    out.close();
+                }
+                if (in != null)
+                {
+                    in.close();
+                }
+            }
+            catch (IOException ex)
+            {
+                log.error("调用in.close Exception, url=" + url + ",param=" + param, ex);
+            }
+        }
+        return result.toString();
+    }
+
     public static String sendSSLPost(String url, String param)
     {
         StringBuilder result = new StringBuilder();
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java
index 426df03..f06476c 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java
@@ -635,4 +635,17 @@
 				.ne(Site::getSiteType, 2).page(pageInfo);
 		return page;
 	}
+	/**
+	 * 分页查询站电数据
+	 * @param PageNo
+	 * @param PageSize
+	 * @return
+	 */
+	@PostMapping("/getSiteListPagingJianGuan")
+	public PageInfo<Site> getSiteListPagingJianGuan(@RequestParam("PageNo") Integer PageNo, @RequestParam("PageSize") Integer PageSize,
+	                                        @RequestParam("ids") List<String> ids){
+		PageInfo<Site> pageInfo = new PageInfo<>(PageNo, PageSize);
+		PageInfo<Site> page = siteService.lambdaQuery().eq(Site::getStatus, 1).in(ids.size() > 0, Site::getId, ids).page(pageInfo);
+		return page;
+	}
 }
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java
index 3f991b8..ed2cadc 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java
@@ -196,7 +196,6 @@
 		}
 		site.setMark(0);
 		this.save(site);
-		// 推送充电站数据给监管平台
 		return AjaxResult.success();
 	}
 	
@@ -227,6 +226,8 @@
 		}
 		
 		this.updateById(site);
+		tcecClient.superviseNotificationStationInfo(site.getId());
+
 		return AjaxResult.success();
 	}
 	
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingGunServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingGunServiceImpl.java
index 1ab951e..3e0bc3c 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingGunServiceImpl.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingGunServiceImpl.java
@@ -11,6 +11,7 @@
 import com.ruoyi.chargingPile.api.query.TChargingGunQuery;
 import com.ruoyi.chargingPile.api.vo.*;
 import com.ruoyi.chargingPile.api.domain.SiteMenu;
+import com.ruoyi.chargingPile.mapper.SiteMapper;
 import com.ruoyi.chargingPile.mapper.TChargingGunMapper;
 import com.ruoyi.chargingPile.service.IPartnerService;
 import com.ruoyi.chargingPile.service.TChargingGunService;
@@ -23,6 +24,7 @@
 import com.ruoyi.common.security.service.TokenService;
 import com.ruoyi.common.security.utils.SecurityUtils;
 import com.ruoyi.integration.api.feignClient.SendMessageClient;
+import com.ruoyi.integration.api.feignClient.TCECClient;
 import com.ruoyi.integration.api.model.QrCodeDelivery;
 import com.ruoyi.other.api.feignClient.RoleSiteClient;
 import com.ruoyi.other.api.feignClient.UserSiteClient;
@@ -72,7 +74,8 @@
     @Resource
     private SiteClient siteClient;
 
-
+    @Autowired
+    private TCECClient tcecClient;
     @Resource
     private TokenService tokenService;
     
@@ -117,7 +120,9 @@
         pageInfo.setRecords(list);
         return pageInfo;
     }
-    
+
+@Autowired
+private SiteMapper siteMapper;
     /**
      * 添加充电枪
      * @param dto
@@ -148,6 +153,8 @@
         qrCodeDelivery.setCode_prefix(code_prefix);
         qrCodeDelivery.setQr_code(code_prefix + chargingPile.getCode() + dto.getCode());
         sendMessageClient.qrCodeDelivery(qrCodeDelivery);
+        Site site = siteMapper.selectById(chargingPile.getSiteId());
+        // 推送充换电站信息
         return AjaxResult.success();
     }
     
@@ -186,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();
     }
 
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java
index 8ef4300..bf9828a 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java
+++ b/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();
 	}
 	
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TChargingGunMapper.xml b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TChargingGunMapper.xml
index eff0ffe..650eaa7 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TChargingGunMapper.xml
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TChargingGunMapper.xml
@@ -34,9 +34,8 @@
     </sql>
     <select id="pageList" resultType="com.ruoyi.chargingPile.api.vo.TChargingGunVO">
         SELECT
-        tcg.id, tcg.code, tcg.site_id, tcg.partner_id, tcg.charging_pile_id, tcg.`name`, tcg.`type`, tcg.status, tcg.charge_mode, tcg.accounting_strategy_id,
-        tcg.upper_rated_voltage, tcg.lower_limit_of_rated_voltage, tcg.rated_current, tcg.rated_power, tcg.parking_number, tcg.parking_status,
-        tcg.parking_lock_state, tcg.national_standard, tcg.remark, tcg.create_time, tcg.del_flag,tas.name AS strategyName
+            tcg.*,
+        tas.name AS strategyName
         FROM t_charging_gun tcg
         LEFT JOIN t_accounting_strategy tas ON tas.id = tcg.accounting_strategy_id
         <where>
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/RuoYiIntegrationApplication.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/RuoYiIntegrationApplication.java
index a6e9f2b..8848895 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/RuoYiIntegrationApplication.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/RuoYiIntegrationApplication.java
@@ -27,7 +27,11 @@
 @EnableBinding({ Source.class, Sink.class })
 public class RuoYiIntegrationApplication {
     public static void main(String[] args) {
-        SpringApplication.run(RuoYiIntegrationApplication.class, args);
+        try{
+            SpringApplication.run(RuoYiIntegrationApplication.class, args);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
         System.out.println("(♥◠‿◠)ノ゙  硬件集成模块启动成功   ლ(´ڡ`ლ)゙  \n" +
                 " .-------.       ____     __        \n" +
                 " |  _ _   \\      \\   \\   /  /    \n" +
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/SupSwapEquipmentInfo.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/SupSwapEquipmentInfo.java
new file mode 100644
index 0000000..889346d
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/SupSwapEquipmentInfo.java
@@ -0,0 +1,34 @@
+package com.ruoyi.integration.drainage;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 换电设备信
+ * 息
+ */
+@Data
+public class SupSwapEquipmentInfo {
+    //换电设备
+    //编码
+    @JsonProperty("SwapMechanicalEquipmentID")
+    private String SwapMechanicalEquipmentID;
+    //换电设备
+    //生产商组
+    //织机构代
+    //码
+    @JsonProperty("SwapManufacturerID")
+    private String SwapManufacturerID;
+    //换电设备
+    //生产商名
+    //称
+    @JsonProperty("SwapManufacturerName")
+    private String SwapManufacturerName;
+    //换电机械
+    //设备额定
+    //功率
+    @JsonProperty("MechanicalEquipmentPower")
+    private BigDecimal MechanicalEquipmentPower;
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java
index 5f4ca19..3d77b64 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java
@@ -1,6 +1,7 @@
 package com.ruoyi.integration.drainage;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.alibaba.nacos.common.utils.JacksonUtils;
 import com.ruoyi.chargingPile.api.feignClient.*;
 import com.ruoyi.chargingPile.api.model.*;
@@ -13,6 +14,9 @@
 import com.ruoyi.integration.drainage.kuaidian.model.*;
 import com.ruoyi.integration.drainage.model.*;
 import com.ruoyi.integration.drainage.model.enu.*;
+import com.ruoyi.integration.drainage.util.AesEncryption;
+import com.ruoyi.integration.drainage.util.HMacMD5Util;
+import com.ruoyi.integration.drainage.util.SequenceGenerator;
 import com.ruoyi.integration.mongodb.service.UploadRealTimeMonitoringDataService;
 import com.ruoyi.order.api.feignClient.ChargingOrderAccountingStrategyClient;
 import com.ruoyi.order.api.feignClient.ChargingOrderClient;
@@ -25,12 +29,15 @@
 import com.ruoyi.other.api.feignClient.SystemConfigurationClient;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.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;
@@ -82,8 +89,9 @@
 	
 	@Resource
 	private SystemConfigurationClient systemConfigurationClient;
-	
-	
+	@Autowired
+	private TCECSuperviseUtil tcecSuperviseUtil;
+	private final static String operatorId = "906171535";
 	
 	/**
 	 * 请求校验
@@ -99,19 +107,22 @@
 		Long mapKey = Long.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
 		baseResult.setTimeStamp(mapKey);
 		baseResult.setSeq("0001");
+
 		//校验token和签名
 		String operatorID = baseRequest.getOperatorID();
 		String sig = baseRequest.getSig();
 		Long timeStamp = baseRequest.getTimeStamp();
 		String data = baseRequest.getData();
 		String seq = baseRequest.getSeq();
+
 		if(StringUtils.isEmpty(operatorID) || StringUtils.isEmpty(sig) || StringUtils.isEmpty(data) || StringUtils.isEmpty(seq) || null == timeStamp){
 			baseResult.setRet(4003);
 			baseResult.setMsg("参数异常");
 			return baseResult;
 		}
-		
+
 		R<Operator> r = operatorClient.getOperator(operatorID);
+
 		if(200 != r.getCode()){
 			baseResult.setRet(500);
 			baseResult.setMsg("系统异常");
@@ -135,6 +146,30 @@
 		if(!sign.equals(sig)){
 			baseResult.setRet(4001);
 			baseResult.setMsg("签名校验失败");
+			return baseResult;
+		}
+		return baseResult;
+	}
+	public BaseResult requestCheckJianGuan(Boolean tokenCheck, BaseRequest baseRequest, HttpServletRequest request){
+		Operator operator = new Operator();
+		BaseResult baseResult = new BaseResult();
+		baseResult.setRet(0);
+		baseResult.setMsg("成功");
+		baseResult.setOperatorID(baseRequest.getOperatorID());
+		operator.setOperatorId(baseRequest.getOperatorID());
+		Long mapKey = Long.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
+		baseResult.setTimeStamp(mapKey);
+		baseResult.setSeq("0001");
+		//校验token和签名
+		String operatorID = baseRequest.getOperatorID();
+		String sig = baseRequest.getSig();
+		Long timeStamp = baseRequest.getTimeStamp();
+		String data = baseRequest.getData();
+		String seq = baseRequest.getSeq();
+		baseResult.setOperator(operator);
+		if(StringUtils.isEmpty(operatorID) || StringUtils.isEmpty(sig) || StringUtils.isEmpty(data) || StringUtils.isEmpty(seq) || null == timeStamp){
+			baseResult.setRet(4003);
+			baseResult.setMsg("参数异常");
 			return baseResult;
 		}
 		return baseResult;
@@ -210,6 +245,48 @@
 		log.info("三方平台获取token响应参数:" + JacksonUtils.toJson(baseResult));
 		return baseResult;
 	}
+	/**
+	 * 获取token
+	 * @return
+	 */
+	@PostMapping("/query_token_jianguan")
+	public BaseResult queryTokenJianguan(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		log.info("三方平台获取token请求参数:" + JacksonUtils.toJson(baseRequest));
+		BaseResult baseResult = requestCheckJianGuan(false, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			log.info("三方平台获取token响应Data:");
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("三方平台获取token响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		QueryTokenResult queryTokenResult = new QueryTokenResult();
+		//生成token
+		Operator operator = baseResult.getOperator();
+		Map<String, Object> token = tokenUtil.createToken(operator);
+		String access_token = token.get("access_token").toString();
+		Long expires_in = Long.valueOf(token.get("expires_in").toString());
+
+		queryTokenResult.setOperatorID("906171535");
+		queryTokenResult.setSuccStat(0);
+		queryTokenResult.setFailReason(0);
+		queryTokenResult.setAccessToken(access_token);
+		queryTokenResult.setTokenAvailableTime(expires_in * 60);
+		//参数加密
+		String jsonString = JacksonUtils.toJson(queryTokenResult);
+		log.info("三方平台获取token响应Data:" + jsonString);
+//		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+//		baseResult.setData(encrypt);
+		String timeStamp = System.currentTimeMillis() + "";
+		SequenceGenerator generator = new SequenceGenerator();
+		String nextSequence = generator.getNextSequence();
+		String data = AesEncryption.encrypt(OurDataSecret, OurDataSecretIV,jsonString);
+		String hmacMD5 = HMacMD5Util.getHMacMD5(OperatorID,timeStamp, data,nextSequence,OurSigSecret);
+		baseResult.setData(data);
+		baseResult.setSig(hmacMD5);
+		log.info("三方平台获取token响应参数:" + JacksonUtils.toJson(baseResult));
+		return baseResult;
+	}
 	
 	
 	
@@ -223,7 +300,7 @@
 	public BaseResult queryStationsInfo(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
 		log.info("三方平台查询充电站信息请求参数:" + JacksonUtils.toJson(baseRequest));
 		//校验token和签名
-		BaseResult baseResult = requestCheck(true, baseRequest, request);
+		BaseResult baseResult = requestCheckJianGuan(true, baseRequest, request);
 		if(0 != baseResult.getRet()){
 			log.info("三方平台查询充电站信息响应Data:");
 			baseResult.setData("");
@@ -1697,19 +1774,8 @@
 	 */
 	@PostMapping("/supervise_query_operator_info")
 	public BaseResult superviseQueryOperatorInfo(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
-		log.info("监管平台查询充电站信息请求参数:" + JacksonUtils.toJson(baseRequest));
-		//校验token和签名
-		BaseResult baseResult = requestCheck(true, baseRequest, request);
-		if(0 != baseResult.getRet()){
-			log.info("监管平台查询充电站信息响应Data:");
-			baseResult.setData("");
-			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
-			log.info("监管平台查询充电站信息响应参数:" + JacksonUtils.toJson(baseResult));
-			return baseResult;
-		}
-		Operator operator = baseResult.getOperator();
 		//解密参数
-		String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		String decrypt = AESUtil.decrypt(baseRequest.getData(), OurDataSecret, OurDataSecretIV);
 		log.info("监管平台查询充电站信息请求Data:" + decrypt);
 		SuperviseQueryOperatorInfo superviseQueryOperatorInfo = JSON.parseObject(decrypt, SuperviseQueryOperatorInfo.class);
 		Integer pageNo = superviseQueryOperatorInfo.getPageNo();
@@ -1736,12 +1802,17 @@
 		// 将superviseQueryOperatorInfoResults转化为json数组
 		superviseQueryOperatorInfoResultPage.setOperatorInfos(superviseQueryOperatorInfoResults);
 		String jsonString = JacksonUtils.toJson(superviseQueryOperatorInfoResultPage);
-		//参数加密
-		log.info("监管平台查询充电站信息响应Data:" + jsonString);
-		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
-		baseResult.setData(encrypt);
-		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
-		log.info("监管平台查询充电站信息响应参数:" + JacksonUtils.toJson(baseResult));
+		String timeStamp = System.currentTimeMillis() + "";
+		SequenceGenerator generator = new SequenceGenerator();
+		String nextSequence = generator.getNextSequence();
+		String data = AesEncryption.encrypt(OurDataSecret, OurDataSecretIV,JSONObject.toJSONString(superviseQueryOperatorInfoResultPage));
+		String hmacMD5 = HMacMD5Util.getHMacMD5(OperatorID,timeStamp, data,nextSequence,OurSigSecret);
+		BaseResult baseResult = new BaseResult();
+		baseResult.setData(data);
+		baseResult.setSig(hmacMD5);
+		baseResult.setRet(0);
+		baseResult.setMsg("OK");
+		baseResult.setOperatorID(OperatorID);
 		return baseResult;
 	}
 
@@ -1755,20 +1826,9 @@
 	 */
 	@PostMapping("/supervise_query_stations_info")
 	public BaseResult superviseQueryStationsInfo(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
-		log.info("监管平台查询充电站信息请求参数:" + JacksonUtils.toJson(baseRequest));
-		//校验token和签名
-		BaseResult baseResult = requestCheck(true, baseRequest, request);
-		if(0 != baseResult.getRet()){
-			log.info("监管平台查询充电站信息响应Data:");
-			baseResult.setData("");
-			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
-			log.info("监管平台查询充电站信息响应参数:" + JacksonUtils.toJson(baseResult));
-			return baseResult;
-		}
-		Operator operator = baseResult.getOperator();
+		String decrypt = AESUtil.decrypt(baseRequest.getData(), OurDataSecret, OurDataSecretIV);
+		log.info("监管平台supervise_query_stations_infoData:" + decrypt);
 		//解密参数
-		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();
@@ -1786,75 +1846,283 @@
 		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()));
-		//参数加密
-		String jsonString = JacksonUtils.toJson(queryStationsInfoResult);
-		log.info("监管平台查询充电站信息响应Data:" + jsonString);
-		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
-		baseResult.setData(encrypt);
-		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
-		log.info("监管平台查询充电站信息响应参数:" + JacksonUtils.toJson(baseResult));
+		String timeStamp = System.currentTimeMillis() + "";
+		SequenceGenerator generator = new SequenceGenerator();
+		String nextSequence = generator.getNextSequence();
+		String data = AesEncryption.encrypt(OurDataSecret, OurDataSecretIV,JSONObject.toJSONString(queryStationsInfoResult));
+		String hmacMD5 = HMacMD5Util.getHMacMD5(OurOperatorID,timeStamp, data,nextSequence,OurSigSecret);
+		BaseResult baseResult = new BaseResult();
+		baseResult.setData(data);
+		baseResult.setSig(hmacMD5);
+		baseResult.setRet(0);
+		baseResult.setMsg("OK");
+		baseResult.setOperatorID(OurOperatorID);
 		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));
-		//校验token和签名
-		BaseResult baseResult = requestCheck(true, baseRequest, request);
-		if(0 != baseResult.getRet()){
-			log.info("监管平台查询充电站信息响应Data:");
-			baseResult.setData("");
-			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
-			log.info("监管平台查询充电站信息响应参数:" + JacksonUtils.toJson(baseResult));
-			return baseResult;
-		}
-		Operator operator = baseResult.getOperator();
+	@PostMapping("/supervise_query_station_status")
+	public BaseResult superviseQueryStationStatus(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		log.info("监管平台查询充换电站状态信息请求参数:" + JacksonUtils.toJson(baseRequest));
+		String decrypt = AESUtil.decrypt(baseRequest.getData(), OurDataSecret, OurDataSecretIV);
+		log.info("监管平台supervise_query_station_statusData:" + decrypt);
 		//解密参数
-		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(operatorId);
+					stationStatusInfo.setStationID(String.valueOf(stationID));
+					List<ConnectorStatusInfo> connectorStatusInfos = new ArrayList<>();
+					for (TChargingGun chargingGun : chargingGuns) {
+						ConnectorStatusInfo connectorStatusInfo = new ConnectorStatusInfo();
+						connectorStatusInfo.setOperatorID(operatorId);
+						connectorStatusInfo.setEquipmentOwnerID(operatorId);
+						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()));
+						connectorStatusInfos.add(connectorStatusInfo);
+					}
+					stationStatusInfo.setConnectorStatusInfos(connectorStatusInfos);
+					stationStatusInfos.add(stationStatusInfo);
+				}
+			}
+			queryStationStatusResult.setStationStatusInfos(stationStatusInfos);
 		}
-		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()));
-		//参数加密
-		String jsonString = JacksonUtils.toJson(queryStationsInfoResult);
-		log.info("监管平台查询充电站信息响应Data:" + jsonString);
-		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
-		baseResult.setData(encrypt);
-		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
-		log.info("监管平台查询充电站信息响应参数:" + JacksonUtils.toJson(baseResult));
+		String timeStamp = System.currentTimeMillis() + "";
+		SequenceGenerator generator = new SequenceGenerator();
+		String nextSequence = generator.getNextSequence();
+		String data = AesEncryption.encrypt(OurDataSecret, OurDataSecretIV,JSONObject.toJSONString(queryStationStatusResult));
+		String hmacMD5 = HMacMD5Util.getHMacMD5(OurOperatorID,timeStamp, data,nextSequence,OurSigSecret);
+		BaseResult baseResult = new BaseResult();
+		baseResult.setData(data);
+		baseResult.setSig(hmacMD5);
+		baseResult.setRet(0);
+		baseResult.setMsg("OK");
+		baseResult.setOperatorID(OurOperatorID);
 		return baseResult;
 	}
+
+	// 测试环境
+	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 OurDataSecret = "50a61b93919c9605";
+	private static final String OurDataSecretIV = "7c8ac6861661d585";
+	private static final String OurSigSecret = "a6fedf0e1b27d6f6";
+	private static final String OurOperatorID = "MA01H3BQ3";
+	private static final String OurOperatorSecret = "f1331ef0b37c2d1a";
+
+
+
 
 	/**
-	 * 推送充换电站信息
-	 * @param site
+	 * 推送充电设备接口状态信息
+	 * @param chargingGun
 	 * @return
 	 */
-	@PostMapping("/supervise_notification_station_info")
-	public BaseResult superviseNotificationStationInfo(@RequestBody Site site){
-		BaseResult baseResult = new BaseResult();
-
-		return baseResult;
+	public R pushSuperviseNotificationStationStatus(TChargingGun chargingGun){
+		ConnectorStatusInfo connectorStatusInfo = new ConnectorStatusInfo();
+		connectorStatusInfo.setOperatorID(operatorId);
+		connectorStatusInfo.setEquipmentOwnerID(operatorId);
+		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(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(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(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());
+		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();
+	}
+
+
+
 //
 //
 //	/**
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECPushUtil.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECPushUtil.java
new file mode 100644
index 0000000..9cfdc7c
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECPushUtil.java
@@ -0,0 +1,212 @@
+package com.ruoyi.integration.drainage;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.nacos.common.utils.JacksonUtils;
+import com.ruoyi.chargingPile.api.feignClient.*;
+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.web.page.PageInfo;
+import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
+import com.ruoyi.integration.api.vo.StartChargeResult;
+import com.ruoyi.integration.drainage.kuaidian.TCECKDUtil;
+import com.ruoyi.integration.drainage.kuaidian.model.*;
+import com.ruoyi.integration.drainage.model.*;
+import com.ruoyi.integration.drainage.model.enu.*;
+import com.ruoyi.integration.mongodb.service.UploadRealTimeMonitoringDataService;
+import com.ruoyi.order.api.feignClient.ChargingOrderAccountingStrategyClient;
+import com.ruoyi.order.api.feignClient.ChargingOrderClient;
+import com.ruoyi.order.api.model.AddTripartitePlatformOrder;
+import com.ruoyi.order.api.model.TChargingOrder;
+import com.ruoyi.order.api.model.TChargingOrderAccountingStrategy;
+import com.ruoyi.other.api.domain.Operator;
+import com.ruoyi.other.api.feignClient.OperatorClient;
+import com.ruoyi.other.api.feignClient.SystemConfigurationClient;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+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;
+import java.util.*;
+import java.util.concurrent.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author zhibing.pu
+ * @Date 2025/1/21 17:52
+ */
+@Slf4j
+@Component
+public class TCECPushUtil {
+	
+	@Resource
+	private ChargingGunClient chargingGunClient;
+	
+	@Resource
+	private OperatorClient operatorClient;
+	
+	@Autowired
+	private TCECSuperviseUtil tcecSuperviseUtil;
+	private final static String operatorId = "906171535";
+	
+	/**
+	 * 推送充电设备接口状态信息
+	 * @param chargingGun
+	 * @return
+	 */
+	public R pushSuperviseNotificationStationStatus(TChargingGun chargingGun){
+		ConnectorStatusInfo connectorStatusInfo = new ConnectorStatusInfo();
+		connectorStatusInfo.setOperatorID(operatorId);
+		connectorStatusInfo.setEquipmentOwnerID(operatorId);
+		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(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);
+		return R.ok();
+	}
+	/**
+	 * 推送充电订单信息
+	 * @param chargingOrder
+	 * @return
+	 */
+	public R pushSuperviseNotificationChargeOrderInfo(TChargingOrder chargingOrder){
+		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());
+		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);
+		return R.ok();
+	}
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECSuperviseUtil.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECSuperviseUtil.java
new file mode 100644
index 0000000..27ad97f
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECSuperviseUtil.java
@@ -0,0 +1,499 @@
+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.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.MapperFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ruoyi.common.core.utils.HttpUtils;
+import com.ruoyi.common.redis.service.RedisService;
+import com.ruoyi.integration.drainage.model.*;
+import com.ruoyi.integration.drainage.util.AesEncryption;
+import com.ruoyi.integration.drainage.util.HMacMD5Util;
+import com.ruoyi.integration.drainage.util.SequenceGenerator;
+import com.ruoyi.other.api.domain.Operator;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+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;
+
+import static com.ruoyi.integration.drainage.TCECUtil.getToken;
+
+/**
+ * 中电联TCEC标准
+ * @author zhibing.pu
+ * @Date 2025/1/21 11:48
+ */
+@Slf4j
+@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 = "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";
+	private static final String OurDataSecretIV = "7c8ac6861661d585";
+	private static final String OurSigSecret = "a6fedf0e1b27d6f6";
+	private static final String OurOperatorID = "MA01H3BQ3";
+	private static final String OurOperatorSecret = "f1331ef0b37c2d1a";
+	@Autowired
+	private RedisService redisService;
+	public static final String TOKEN_KEY = "charge_token:";
+	/**
+	 * 获取token
+	 */
+	private final static String query_token = "/query_token";
+	/**
+	 * 推送充电设备接口状态信息
+	 */
+	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";
+	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", "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;
+//	}
+
+
+	/**
+	 * 设备状态变化推送
+	 * @param info
+	 */
+	public 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(), DataSecret, DataSecretIV);
+		log.info("推送三方平台设备状态Data:" + decrypt);
+		NotificationStationStatusResult notificationStationStatusResult = JSON.parseObject(decrypt, NotificationStationStatusResult.class);
+		return notificationStationStatusResult;
+	}
+
+
+	/**
+	 * 推动充电状态
+	 * @param info
+	 * @return
+	 */
+	public 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(), DataSecret, DataSecretIV);
+		log.info("推送三方平台充电状态Data:" + decrypt);
+		NotificationEquipChargeStatusResult notificationEquipChargeStatusResult = JSON.parseObject(decrypt, NotificationEquipChargeStatusResult.class);
+		return notificationEquipChargeStatusResult;
+	}
+
+
+	/**
+	 * 推送充电订单信息
+	 * @param info
+	 * @return
+	 */
+	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()){
+			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(), DataSecret, DataSecretIV);
+		log.info("推送三方平台充电订单信息Data:" + decrypt);
+		NotificationChargeOrderInfoResult notificationChargeOrderInfoResult = JSON.parseObject(decrypt, NotificationChargeOrderInfoResult.class);
+		return notificationChargeOrderInfoResult;
+	}
+
+
+	/**
+	 * 构建请求参数和消息头
+	 * @param post
+	 * @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());
+		BaseRequestJianGuan baseRequest = new BaseRequestJianGuan();
+		baseRequest.setOperatorID("906171535");
+		baseRequest.setTimeStamp(timeStamp+"");
+		baseRequest.setSeq("0001");
+		// 使用 Jackson 转换为 JSON
+		ObjectMapper objectMapper = new ObjectMapper();
+		objectMapper.enable(MapperFeature.USE_ANNOTATIONS); // 启用注解支持
+        String jsonString = null;
+        try {
+			jsonString = objectMapper.writeValueAsString(o);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+		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("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);
+	}
+
+	/**
+	 * 推送充电用能统计
+	 * @param info
+	 * @return
+	 */
+	public void superviseNotificationOperationStatsInfo(StationStatsInfoResult info){
+		Operator operator = new Operator();
+		HttpRequest post = HttpUtil.createPost(url+supervise_notification_operation_stats_info);
+		buildBody(post, info, operator);
+		HttpResponse execute = post.execute();
+		if(200 != execute.getStatus()){
+			log.error("推送充电用能统计失败:" + execute.body());
+			return ;
+		}
+		log.info("推送充电用能统计信息响应:" + execute.body());
+		BaseResult baseResult = JSON.parseObject(execute.body(), BaseResult.class);
+		Integer Ret = baseResult.getRet();
+		if(0 != Ret){
+			log.error("推送充电用能统计信息失败:" + baseResult.getMsg());
+			return ;
+		}
+		//解密参数
+		String decrypt = AESUtil.decrypt(baseResult.getData(), DataSecret, DataSecretIV);
+		log.info("推送充电用能统计信息Data:" + decrypt);
+
+	}
+	/**
+	 * 推送充换电站信息
+	 * @param info
+	 * @return
+	 */
+	public void superviseNotificationStationInfo(SupStationInfoResult info){
+		Operator operator = new Operator();
+		HttpRequest post = HttpUtil.createPost(url+supervise_notification_station_info);
+		buildBody(post, info, operator);
+		HttpResponse execute = post.execute();
+		if(200 != execute.getStatus()){
+			log.error("推送充换电站信息失败:" + execute.body());
+			return ;
+		}
+		log.info("推送充换电站信息信息响应:" + execute.body());
+		BaseResult baseResult = JSON.parseObject(execute.body(), BaseResult.class);
+		Integer Ret = baseResult.getRet();
+		if(0 != Ret){
+			log.error("推送充换电站信息失败:" + baseResult.getMsg());
+			return ;
+		}
+		//解密参数
+		String decrypt = AESUtil.decrypt(baseResult.getData(), DataSecret, DataSecretIV);
+		log.info("推送充换电站信息信息Data:" + decrypt);
+	}
+	/**
+	 * 充换电站功率信息
+	 * @param info
+	 * @return
+	 */
+	public void superviseNotificationRealtimePowerInfo(SupStationPowerInfoResult info){
+		Operator operator = new Operator();
+		HttpRequest post = HttpUtil.createPost(url+supervise_notification_realtime_power_info);
+		buildBodyStatus(post, info, operator);
+		HttpResponse execute = post.execute();
+		if(200 != execute.getStatus()){
+			log.error("推送充换电站实时功率失败:" + execute.body());
+			return ;
+		}
+		log.info("推送充换电站实时功率信息响应:" + execute.body());
+		BaseResult baseResult = JSON.parseObject(execute.body(), BaseResult.class);
+		Integer Ret = baseResult.getRet();
+		if(0 != Ret){
+			log.error("推送充换电站实时功率信息失败:" + baseResult.getMsg());
+			return ;
+		}
+		//解密参数
+		String decrypt = AESUtil.decrypt(baseResult.getData(), DataSecret, DataSecretIV);
+		log.info("推送充换电站实时功率信息Data:" + decrypt);
+	}
+
+	public static void main(String[] args) {
+		BaseModel model = new BaseModel();
+		model.setOperatorID("MA01H3BQ2");
+		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);
+	}
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECUtil.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECUtil.java
index edc211e..2478762 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECUtil.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECUtil.java
@@ -337,6 +337,20 @@
 		}
 		return sign;
 	}
+	public static String ourBuildSignJianGuan(BaseModel model){
+		Operator operator = model.getOperator();
+		if(null == operator){
+			return "";
+		}
+		//签名秘钥SigSecret
+		String key = operator.getOurSigSecret();
+		String sign = "";
+		//进行字符串拼接、计算
+		String m1 = new StringBuilder(model.getOperatorID()).append(model.getData()).append(model.getTimeStamp()).append(model.getSeq()).toString();
+		sign = SignUtil.hmacSign(m1, key);
+		return sign;
+	}
+
 
 	
 	
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseModelJianGuan.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseModelJianGuan.java
new file mode 100644
index 0000000..b9626d0
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseModelJianGuan.java
@@ -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;
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseRequestJianGuan.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseRequestJianGuan.java
new file mode 100644
index 0000000..5a580a1
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseRequestJianGuan.java
@@ -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;
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/ConnectorStatsInfo.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/ConnectorStatsInfo.java
index 74431bf..2af5097 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/ConnectorStatsInfo.java
+++ b/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;
 }
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/ConnectorStatusInfo.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/ConnectorStatusInfo.java
index 215b381..e603f9e 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/ConnectorStatusInfo.java
+++ b/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;
 }
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/EquipmentStatsInfo.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/EquipmentStatsInfo.java
index 33d9c11..7dcb6c0 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/EquipmentStatsInfo.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/EquipmentStatsInfo.java
@@ -27,6 +27,35 @@
 	@JsonProperty("EquipmentElectricity")
 	private BigDecimal equipmentElectricity;
 	/**
+	 * 设备分类 1:车辆充电设备
+	 * 2:换电站内的电池
+	 * 箱充电设备
+	 */
+	@NotNull
+	@JsonProperty("EquipmentClassification")
+	private Integer equipmentClassification;
+	/**
+	 * 充电设备累计充电时长 单位分钟
+	 */
+	@NotNull
+	@JsonProperty("EquipmentTotalChargeTime")
+	private Long equipmentTotalChargeTime;
+	/**
+	 * 充电设备累计充
+	 * 电次数
+	 */
+	@NotNull
+	@JsonProperty("EquipmentTotalChargeNum")
+	private Integer equipmentTotalChargeNum;
+	/**
+	 * 充电设备累计充
+	 * 电次数
+	 */
+	@NotNull
+	@JsonProperty("EquipmentTotalWarningNum")
+	private Integer equipmentTotalWarningNum;
+
+	/**
 	 * 充电设备接口统计信息列表
 	 */
 	@NotNull
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStationStatus.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStationStatus.java
index 2ee411f..27c112d 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStationStatus.java
+++ b/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;
 }
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatsInfo.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatsInfo.java
index e06100b..5662a1c 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatsInfo.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatsInfo.java
@@ -21,6 +21,27 @@
 	@JsonProperty("StationID")
 	private String stationID;
 	/**
+	 * 设备所属方ID
+	 * 设备所属运营平台组织机构代码
+	 */
+	@NotNull
+	@JsonProperty("EquipmentOwnerID")
+	private String equipmentOwnerID;
+	/**
+	 * 运营商ID
+	 */
+	@NotNull
+	@JsonProperty("OperatorID")
+	private String operatorID;
+	/**
+	 * 站点分类 1:充电站
+	 * 2:换电站
+	 * 3:充换电一体站
+	 */
+	@NotNull
+	@JsonProperty("StationClassification")
+	private Integer stationClassification;
+	/**
 	 * 统计的开始时间
 	 * yyyy-MM-dd
 	 */
@@ -41,6 +62,35 @@
 	@JsonProperty("StationElectricity")
 	private BigDecimal stationElectricity;
 	/**
+	 * 充换电站累计
+	 * 充电量
+	 */
+	@NotNull
+	@JsonProperty("StationTotalChargeEnergy")
+	private BigDecimal stationTotalChargeEnergy;
+
+	/**
+	 * 充换电站累计
+	 * 告警数量
+	 */
+	@NotNull
+	@JsonProperty("StationTotalWarningNum")
+	private Integer stationTotalWarningNum;
+	/**
+	 充换电站累计
+	 其他电量
+	 */
+	@NotNull
+	@JsonProperty("StationTotalOtherEnergy")
+	private BigDecimal stationTotalOtherEnergy;
+	/**
+	 充换电站累计
+	 充电次数
+	 */
+	@NotNull
+	@JsonProperty("StationTotalChargeNum")
+	private Integer stationTotalChargeNum;
+	/**
 	 * 充电设备统计信息列表
 	 */
 	@NotNull
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatsInfoResult.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatsInfoResult.java
new file mode 100644
index 0000000..560a0d2
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatsInfoResult.java
@@ -0,0 +1,18 @@
+package com.ruoyi.integration.drainage.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 充电站统计信息
+ * @author zhibing.pu
+ * @Date 2025/1/21 15:17
+ */
+@Data
+public class StationStatsInfoResult {
+	private List<StationStatsInfo> stationStatsInfos;
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatusInfo.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatusInfo.java
index 2998a11..01bd389 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatusInfo.java
+++ b/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;
 }
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupChargeOrderInfo.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupChargeOrderInfo.java
new file mode 100644
index 0000000..e120afd
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupChargeOrderInfo.java
@@ -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;
+
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupConnectorPowerInfo.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupConnectorPowerInfo.java
new file mode 100644
index 0000000..61bb8d2
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupConnectorPowerInfo.java
@@ -0,0 +1,25 @@
+package com.ruoyi.integration.drainage.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 充电设备接口功率信息
+ */
+@Data
+public class SupConnectorPowerInfo {
+    @JsonProperty("ConnectorID")
+
+    private String ConnectorID;
+    @JsonProperty("EquipmentClassification")
+
+    private Integer EquipmentClassification;
+    @JsonProperty("DataTime")
+
+    private String DataTime;
+    @JsonProperty("ConnectorRealTimePower")
+
+    private BigDecimal ConnectorRealTimePower;
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupEquipChargeStatus.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupEquipChargeStatus.java
new file mode 100644
index 0000000..01e29d7
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupEquipChargeStatus.java
@@ -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;
+
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupEquipmentPowerInfo.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupEquipmentPowerInfo.java
new file mode 100644
index 0000000..43ee464
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupEquipmentPowerInfo.java
@@ -0,0 +1,28 @@
+package com.ruoyi.integration.drainage.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 充电设备功率信息
+ */
+@Data
+public class SupEquipmentPowerInfo {
+    @JsonProperty("EquipmentID")
+
+    private String EquipmentID;
+    @JsonProperty("EquipmentClassification")
+
+    private Integer EquipmentClassification;
+    @JsonProperty("DataTime")
+
+    private String DataTime;
+    @JsonProperty("EquipRealTimePower")
+
+    private BigDecimal EquipRealTimePower;
+    @JsonProperty("ConnectorPowerInfos")
+    private List<SupConnectorPowerInfo> ConnectorPowerInfos;
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationInfo.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationInfo.java
new file mode 100644
index 0000000..f0b8ee7
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationInfo.java
@@ -0,0 +1,210 @@
+package com.ruoyi.integration.drainage.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ruoyi.integration.drainage.SupSwapEquipmentInfo;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 充换电站信息
+ */
+@Data
+public class SupStationInfo {
+    // 充换电站ID
+    @JsonProperty("StationID")
+    private String StationID;
+    // 充换电站唯一编码
+    @JsonProperty("StationUniqueNumber")
+    private String StationUniqueNumber;
+    //平台运营商
+    //ID
+    @JsonProperty("OperatorID")
+    private String OperatorID;
+    //充换电服务
+    //运营商ID
+    @JsonProperty("EquipmentOwnerID")
+    private String EquipmentOwnerID;
+    //充换电站名
+    //称
+    @JsonProperty("StationName")
+    private String StationName;
+    //充换电站国
+    //家代码
+    @JsonProperty("CountryCode")
+    private String CountryCode;
+    //充换电站省
+    //市辖区编码
+    @JsonProperty("AreaCode")
+    private String AreaCode;
+    //详细地址
+    @JsonProperty("Address")
+    private String Address;
+    //充换电站所
+    //在县以下行
+    //政区划代码
+    @JsonProperty("AreaCodeCountryside")
+    private String AreaCodeCountryside;
+    // 站点电话
+    @JsonProperty("StationTel")
+    private String StationTel;
+    // 服务电话
+    @JsonProperty("ServiceTel")
+    private String ServiceTel;
+    // 站点分类
+    @JsonProperty("StationClassification")
+    private Integer StationClassification;
+    //通用类型
+    @JsonProperty("GeneralApplicationType")
+    private Integer GeneralApplicationType;
+    //站点类型
+    @JsonProperty("StationType")
+    private Integer StationType;
+    //站点状态
+    @JsonProperty("StationStatus")
+    private Integer StationStatus;
+    //车位数量
+    @JsonProperty("ParkNums")
+    private Integer ParkNums;
+    //经度
+    @JsonProperty("StationLng")
+    private BigDecimal StationLng;
+    //纬度
+    @JsonProperty("StationLat")
+    private BigDecimal StationLat;
+    //站点引导
+    @JsonProperty("SiteGuide")
+    private String SiteGuide;
+    //建设场所
+    @JsonProperty("Construction")
+    private Integer Construction;
+    //站点照片
+    @JsonProperty("Pictures")
+    private List<String> Pictures;
+    //使用车型描
+    //述
+    @JsonProperty("MatchCars")
+    private String MatchCars;
+    //服务车型描
+    //述
+    @JsonProperty("SwapMatchCars")
+    private List<String> SwapMatchCars;
+    //车位楼层及
+    //数量描述
+    @JsonProperty("ParkInfo")
+    private String ParkInfo;
+    //营业时间
+    @JsonProperty("BusineHours")
+    private String BusineHours;
+    //7*24小时营
+    //业
+    @JsonProperty("RoundTheClock")
+    private Integer RoundTheClock;
+    //停车费类型
+    @JsonProperty("ParkType")
+    private Integer ParkType;
+    //停车费描述
+    @JsonProperty("ParkFee")
+    private String ParkFee;
+    //支付方式
+    @JsonProperty("Payment")
+    private String Payment;
+    //是否支持预
+    //约
+    @JsonProperty("SupportOrder")
+    private Integer SupportOrder;
+    //备注
+    @JsonProperty("Remark")
+    private String Remark;
+    //电费类型
+    @JsonProperty("ElectricityType")
+    private Integer ElectricityType;
+    //报装类型
+    @JsonProperty("BusinessExpandType")
+    private Integer BusinessExpandType;
+    //报装电源容
+    //量
+    @JsonProperty("Capacity")
+    private BigDecimal Capacity;
+    //站点额定总
+    //功率
+    @JsonProperty("RatedPower")
+    private BigDecimal RatedPower;
+    //峰谷分时
+    @JsonProperty("PeriodFee")
+    private Integer PeriodFee;
+    //正式投运时
+    //间
+    @JsonProperty("OfficialRunTime")
+    private String OfficialRunTime;
+    //充换电站方
+    //位
+    @JsonProperty("StationOrientation")
+    private Integer StationOrientation;
+    //充换电站建
+    //设面积
+    @JsonProperty("StationArea")
+    private BigDecimal StationArea;
+    //充换电站人
+    //工值守
+    @JsonProperty("HavePerson")
+    private Integer HavePerson;
+    //视频监控配
+    //套情况
+    @JsonProperty("VideoMonitor")
+    private Integer VideoMonitor;
+    //周边配套设
+    // 施
+    @JsonProperty("SupportingFacilities")
+    private List<Integer> SupportingFacilities;
+    //是否有小票
+    //机
+    @JsonProperty("PrinterFlag")
+    private Integer PrinterFlag;
+    //是否有道闸
+    @JsonProperty("BarrierFlag")
+    private Integer BarrierFlag;
+    //是否有地锁
+    @JsonProperty("ParkingLockFlag")
+    private Integer ParkingLockFlag;
+    //充电设备信
+    //息列表
+    @JsonProperty("EquipmentInfos")
+    private List<EquipmentInfo> EquipmentInfos;
+    //换电设备信
+    //息
+    @JsonProperty("SwapEquipmentInfos")
+    private List<SupSwapEquipmentInfo> SwapEquipmentInfos;
+    //充电电费描
+    //述
+    @JsonProperty("ElectricityFee")
+    private String ElectricityFee;
+    //设备所属方
+    //名称
+    @JsonProperty("EquipmentOwnerName")
+    private String EquipmentOwnerName;
+    //供电局用户
+    //编号
+    @JsonProperty("ResidentNo")
+    private String ResidentNo;
+    //供电类型
+    @JsonProperty("SupplyType")
+    private Integer SupplyType;
+    //表号
+    @JsonProperty("WattHourMeterNo")
+    private String WattHourMeterNo;
+    //外电功率
+    @JsonProperty("ForwardPower")
+    private BigDecimal ForwardPower;
+    //服务费描述
+    @JsonProperty("ServiceFee")
+    private String ServiceFee;
+    //充电站全省
+    //唯一备案号
+    @JsonProperty("RecordUniqueNo")
+    private String RecordUniqueNo;
+
+
+
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationInfoResult.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationInfoResult.java
new file mode 100644
index 0000000..6cb8297
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationInfoResult.java
@@ -0,0 +1,20 @@
+package com.ruoyi.integration.drainage.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ruoyi.integration.drainage.model.EquipmentInfo;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 充换电站信息
+ */
+@Data
+public class SupStationInfoResult {
+    @JsonProperty("SupStationInfo")
+    private StationInfo SupStationInfo;
+
+
+
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationPowerInfo.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationPowerInfo.java
new file mode 100644
index 0000000..74793ea
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationPowerInfo.java
@@ -0,0 +1,31 @@
+package com.ruoyi.integration.drainage.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 推送充换电站实时功率
+ */
+@Data
+public class SupStationPowerInfo {
+    @NotNull
+    @JsonProperty("OperatorID")
+    private String OperatorID;
+    @JsonProperty("EquipmentOwnerID")
+    private String EquipmentOwnerID;
+    @JsonProperty("StationID")
+    private String StationID;
+    @JsonProperty("StationClassification")
+    private Integer StationClassification;
+    @JsonProperty("DataTime")
+    private String DataTime;
+    @JsonProperty("StationRealTimePower")
+    private BigDecimal StationRealTimePower;
+    @JsonProperty("EquipmentPowerInfos")
+    private List<SupEquipmentPowerInfo> EquipmentPowerInfos;
+
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationPowerInfoResult.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationPowerInfoResult.java
new file mode 100644
index 0000000..4b66b99
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/SupStationPowerInfoResult.java
@@ -0,0 +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 implements Serializable {
+
+    @JsonProperty("SupStationPowerInfos")
+    private List<SupStationPowerInfo> SupStationPowerInfos;
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/AesEncryption.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/AesEncryption.java
new file mode 100644
index 0000000..e8b4bcc
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/AesEncryption.java
@@ -0,0 +1,55 @@
+package com.ruoyi.integration.drainage.util;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.util.Base64;
+
+/**
+ * 充电桩交互的数据的加密解密
+ */
+public class AesEncryption {
+
+    /**
+     * 加密
+     * @param key
+     * @param iv
+     * @param data
+     * @return
+     */
+    public static String encrypt(String key, String iv, String data) {
+        try {
+            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
+            SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");
+            IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes());
+            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
+            byte[] encrypted = cipher.doFinal(data.getBytes());
+            return Base64.getEncoder().encodeToString(encrypted);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 解密
+     * @param key
+     * @param iv
+     * @param encryptedData
+     * @return
+     */
+    public static String decrypt(String key, String iv, String encryptedData) {
+        try {
+            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
+            SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");
+            IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes());
+            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
+            byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
+            return new String(decrypted);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+}
\ No newline at end of file
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/HMacMD5Util.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/HMacMD5Util.java
new file mode 100644
index 0000000..fd7a3c6
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/HMacMD5Util.java
@@ -0,0 +1,122 @@
+package com.ruoyi.integration.drainage.util;
+
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+public class HMacMD5Util {
+
+    /**
+     * 加签
+     * @param operatorId
+     * @param timeStamp
+     * @param data
+     * @param seq
+     * @param SigSecret
+     * @return
+     */
+    public static String getHMacMD5(String operatorId,String timeStamp, String data, String seq,String SigSecret) {
+        String m = new StringBuilder(operatorId).append(data).append(timeStamp).append(seq).toString();
+        byte[] macMD5 = HMacMD5Util.getHMacMD5Bytes(SigSecret.getBytes(), m.getBytes());
+        return HMacMD5Util.bytesToHexString(macMD5);
+    }
+
+
+    /**
+    * HmacMd5的计算公式为:HMAC(K,M) = H(K⊕opad∣H(K⊕ipad∣M))
+    * 其中:K是密钥(byte[] key),长度可为64字节(后面涉及描述都是以字节byte进行),若小于该长度,在密钥后面用0(即0x00)补齐。
+    * M是消息内容(byte[] m);
+    * H是散列函数(此处采用MD5);
+    * opad和ipad分别是由若干个0x5c和0x36组成的字符串;
+    * ⊕表示异或运算;
+    * ∣表示连接操作。
+    **/
+    private static byte[] getHMacMD5Bytes(byte[] key, byte[] m) {
+        try {
+            //定义长度
+            int length = 64;
+            //定义opad和ipad
+            byte[] opad = new byte[length];
+            byte[] ipad = new byte[length];
+            for (int i = 0; i < 64; i++) {
+                opad[i] = 0x5C;
+                ipad[i] = 0x36;
+            }
+            byte[] actualKey = key;
+            byte[] keyArr = new byte[length];
+            //如果密钥长度,大于64字节,就使用MD5算法计算其散列值,作为密钥
+            if (key.length > length) {
+                actualKey = md5(key);
+            }
+            for (int i = 0; i < actualKey.length; i++) {
+                keyArr[i] = actualKey[i];
+            }
+            //如果密钥长度不足64字节,就使用0x00补齐到64字节
+            if (actualKey.length < length) {
+            for (int i = key.length; i < length; i++)
+                keyArr[i] = 0x00;
+            }
+            //使用密钥和ipad进行异或运算【K⊕ipad】
+            byte[] kIpadXorResult = new byte[length];
+            for (int i = 0; i < length; i++) {
+                kIpadXorResult[i] = (byte) (keyArr[i] ^ ipad[i]);
+            }
+            //将待加密数据M追加到kIpadXorResult后面【K⊕ipad∣M】
+            byte[] firstAppendResult = new byte[kIpadXorResult.length + m.length];
+            for (int i = 0; i < kIpadXorResult.length; i++) {
+                firstAppendResult[i] = kIpadXorResult[i];
+            }
+            for (int i = 0; i < m.length; i++) {
+                firstAppendResult[i + keyArr.length] = m[i];
+            }
+            //做MD5运算【H(K⊕ipad∣M)】
+            byte[] firstHashResult = md5(firstAppendResult);
+
+            //使用密钥和opad进行异或运算【K⊕opad】
+            byte[] kOpadXorResult = new byte[length];
+            for (int i = 0; i < length; i++) {
+                kOpadXorResult[i] = (byte) (keyArr[i] ^ opad[i]);
+            }
+            //将firstHashResult追加到kOpadXorResult后面【K⊕opad∣H(K⊕ipad∣M)】
+            byte[] secondAppendResult = new byte[kOpadXorResult.length + firstHashResult.length];
+            for (int i = 0; i < kOpadXorResult.length; i++) {
+                secondAppendResult[i] = kOpadXorResult[i];
+            }
+            for (int i = 0; i < firstHashResult.length; i++) {
+                secondAppendResult[kOpadXorResult.length + i] = firstHashResult[i];
+            }
+            //做MD5运算【H(K⊕opad∣H(K⊕ipad∣M))】
+            return md5(secondAppendResult);
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+    * MD5(产生出一个128位(16字节)的散列值)
+    **/
+    private static byte[] md5(byte[] str) throws NoSuchAlgorithmException {
+        MessageDigest md = MessageDigest.getInstance("MD5");
+        md.update(str);
+        return md.digest();
+    }
+
+    /**
+    * HEX转化为字符串
+    **/
+    private static String bytesToHexString(byte[] m) {
+        StringBuilder stringBuilder = new StringBuilder();
+        if (m == null || m.length <= 0) {
+            return null;
+        }
+        for (int i = 0; i < m.length; i++) {
+            int v = m[i] & 0xFF;
+            String hv = Integer.toHexString(v);
+            if (hv.length() < 2) {
+                stringBuilder.append(0);
+            }
+            stringBuilder.append(hv);
+        }
+        return stringBuilder.toString().toUpperCase();
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/SequenceGenerator.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/SequenceGenerator.java
new file mode 100644
index 0000000..45da471
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/SequenceGenerator.java
@@ -0,0 +1,56 @@
+package com.ruoyi.integration.drainage.util;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class SequenceGenerator {
+    private final ConcurrentHashMap<Long, AtomicInteger> counterMap = new ConcurrentHashMap<>();
+
+    public synchronized String getNextSequence() {
+        long currentTimestamp = System.currentTimeMillis() / 1000; // 获取当前秒级时间戳
+
+        AtomicInteger counter = counterMap.get(currentTimestamp);
+        if (counter == null) {
+            counter = new AtomicInteger(1); // 新的一秒,初始化计数器为1
+            counterMap.put(currentTimestamp, counter);
+        } else {
+            counter.incrementAndGet(); // 同一秒内,计数器递增
+        }
+
+        // 生成四位序列号
+        String sequence = String.format("%04d", counter.get());
+
+        return sequence;
+    }
+
+    public static void main(String[] args) {
+        SequenceGenerator generator = new SequenceGenerator();
+
+        // 测试生成多个序列号
+        for (int i = 0; i < 10; i++) {
+            System.out.println(generator.getNextSequence());
+            try {
+                Thread.sleep(100); // 模拟同一秒内的多次调用
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        }
+
+        // 模拟进入新的一秒
+        try {
+            Thread.sleep(1100); // 等待超过1秒
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+
+        // 再次生成序列号
+        for (int i = 0; i < 10; i++) {
+            System.out.println(generator.getNextSequence());
+            try {
+                Thread.sleep(100); // 模拟同一秒内的多次调用
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/TCECCJianGuanontroller.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/TCECCJianGuanontroller.java
new file mode 100644
index 0000000..49cfba5
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/TCECCJianGuanontroller.java
@@ -0,0 +1,2463 @@
+package com.ruoyi.integration.drainage.util;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.nacos.common.utils.JacksonUtils;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.MapperFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ruoyi.chargingPile.api.feignClient.*;
+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;
+import com.ruoyi.integration.drainage.AESUtil;
+import com.ruoyi.integration.drainage.TCECSuperviseUtil;
+import com.ruoyi.integration.drainage.TCECUtil;
+import com.ruoyi.integration.drainage.TokenUtil;
+import com.ruoyi.integration.drainage.kuaidian.TCECKDUtil;
+import com.ruoyi.integration.drainage.kuaidian.model.*;
+import com.ruoyi.integration.drainage.model.*;
+import com.ruoyi.integration.drainage.model.enu.*;
+import com.ruoyi.integration.mongodb.service.UploadRealTimeMonitoringDataService;
+import com.ruoyi.order.api.feignClient.ChargingOrderAccountingStrategyClient;
+import com.ruoyi.order.api.feignClient.ChargingOrderClient;
+import com.ruoyi.order.api.model.AddTripartitePlatformOrder;
+import com.ruoyi.order.api.model.TChargingOrder;
+import com.ruoyi.order.api.model.TChargingOrderAccountingStrategy;
+import com.ruoyi.other.api.domain.Operator;
+import com.ruoyi.other.api.feignClient.OperatorClient;
+import com.ruoyi.other.api.feignClient.SystemConfigurationClient;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.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;
+import java.util.*;
+import java.util.concurrent.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author zhibing.pu
+ * @Date 2025/1/21 17:52
+ */
+@Slf4j
+@RestController
+@RequestMapping("/evcs/v2.0")
+public class TCECCJianGuanontroller {
+	
+	@Resource
+	private SiteClient siteClient;
+	
+	@Resource
+	private ChargingPileClient chargingPileClient;
+	
+	@Resource
+	private ChargingGunClient chargingGunClient;
+	
+	@Resource
+	private ChargingOrderClient chargingOrderClient;
+	
+	@Resource
+	private OperatorClient operatorClient;
+	
+	@Resource
+	private AccountingStrategyDetailClient accountingStrategyDetailClient;
+	
+	@Resource
+	private ChargingOrderAccountingStrategyClient chargingOrderAccountingStrategyClient;
+	
+	@Resource
+	private UploadRealTimeMonitoringDataService uploadRealTimeMonitoringDataService;
+	
+	@Resource
+	private TokenUtil tokenUtil;
+
+	@Resource
+	private ParkingLotClient parkingLotClient;
+	
+	@Resource
+	private ParkingRecordClient parkingRecordClient;
+	
+	@Resource
+	private SystemConfigurationClient systemConfigurationClient;
+	@Autowired
+	private TCECSuperviseUtil tcecSuperviseUtil;
+	private final static String operatorId = "906171535";
+	
+	/**
+	 * 请求校验
+	 * @param baseRequest
+	 * @param request
+	 * @return
+	 */
+	public BaseResult requestCheck(Boolean tokenCheck, BaseRequest baseRequest, HttpServletRequest request){
+		BaseResult baseResult = new BaseResult();
+		baseResult.setRet(0);
+		baseResult.setMsg("成功");
+		baseResult.setOperatorID(baseRequest.getOperatorID());
+		Long mapKey = Long.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
+		baseResult.setTimeStamp(mapKey);
+		baseResult.setSeq("0001");
+
+		//校验token和签名
+		String operatorID = baseRequest.getOperatorID();
+		String sig = baseRequest.getSig();
+		Long timeStamp = baseRequest.getTimeStamp();
+		String data = baseRequest.getData();
+		String seq = baseRequest.getSeq();
+
+		if(StringUtils.isEmpty(operatorID) || StringUtils.isEmpty(sig) || StringUtils.isEmpty(data) || StringUtils.isEmpty(seq) || null == timeStamp){
+			baseResult.setRet(4003);
+			baseResult.setMsg("参数异常");
+			return baseResult;
+		}
+
+		R<Operator> r = operatorClient.getOperator(operatorID);
+
+		if(200 != r.getCode()){
+			baseResult.setRet(500);
+			baseResult.setMsg("系统异常");
+			return baseResult;
+		}
+		//校验token
+		if(tokenCheck){
+			Operator loginUser = tokenUtil.getLoginUser(request);
+			if(null == loginUser){
+				baseResult.setRet(4002);
+				baseResult.setMsg("身份校验失败,无效的token");
+				return baseResult;
+			}
+		}
+		
+		Operator operator = r.getData();
+		baseResult.setOperator(operator);
+		baseRequest.setOperator(operator);
+		//校验签名
+		String sign = TCECUtil.ourBuildSign(baseRequest);
+		if(!sign.equals(sig)){
+			baseResult.setRet(4001);
+			baseResult.setMsg("签名校验失败");
+			return baseResult;
+		}
+		return baseResult;
+	}
+	public BaseResult requestCheckJianGuan(Boolean tokenCheck, BaseRequest baseRequest, HttpServletRequest request){
+		Operator operator = new Operator();
+		BaseResult baseResult = new BaseResult();
+		baseResult.setRet(0);
+		baseResult.setMsg("成功");
+		baseResult.setOperatorID(baseRequest.getOperatorID());
+		operator.setOperatorId(baseRequest.getOperatorID());
+		Long mapKey = Long.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
+		baseResult.setTimeStamp(mapKey);
+		baseResult.setSeq("0001");
+		//校验token和签名
+		String operatorID = baseRequest.getOperatorID();
+		String sig = baseRequest.getSig();
+		Long timeStamp = baseRequest.getTimeStamp();
+		String data = baseRequest.getData();
+		String seq = baseRequest.getSeq();
+		baseResult.setOperator(operator);
+		if(StringUtils.isEmpty(operatorID) || StringUtils.isEmpty(sig) || StringUtils.isEmpty(data) || StringUtils.isEmpty(seq) || null == timeStamp){
+			baseResult.setRet(4003);
+			baseResult.setMsg("参数异常");
+			return baseResult;
+		}
+		return baseResult;
+	}
+	
+	
+	
+	
+	
+
+	/**
+	 * 获取token
+	 * @return
+	 */
+	@PostMapping("/query_token")
+	public BaseResult queryToken(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		log.info("三方平台获取token请求参数:" + JacksonUtils.toJson(baseRequest));
+		BaseResult baseResult = requestCheckJianGuan(false, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			log.info("三方平台获取token响应Data:");
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("三方平台获取token响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		QueryTokenResult queryTokenResult = new QueryTokenResult();
+		//生成token
+		Operator operator = baseResult.getOperator();
+		Map<String, Object> token = tokenUtil.createToken(operator);
+		String access_token = token.get("access_token").toString();
+		Long expires_in = Long.valueOf(token.get("expires_in").toString());
+
+		queryTokenResult.setOperatorID("906171535");
+		queryTokenResult.setSuccStat(0);
+		queryTokenResult.setFailReason(0);
+		queryTokenResult.setAccessToken(access_token);
+		queryTokenResult.setTokenAvailableTime(expires_in * 60);
+		//参数加密
+		String jsonString = JacksonUtils.toJson(queryTokenResult);
+		log.info("三方平台获取token响应Data:" + jsonString);
+//		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+//		baseResult.setData(encrypt);
+		String timeStamp = System.currentTimeMillis() + "";
+		SequenceGenerator generator = new SequenceGenerator();
+		String nextSequence = generator.getNextSequence();
+		String data = AesEncryption.encrypt(OurDataSecret, OurDataSecretIV,jsonString);
+		String hmacMD5 = HMacMD5Util.getHMacMD5(OperatorID,timeStamp, data,nextSequence,OurSigSecret);
+		baseResult.setData(data);
+		baseResult.setSig(hmacMD5);
+		log.info("三方平台获取token响应参数:" + JacksonUtils.toJson(baseResult));
+		return baseResult;
+	}
+	
+	
+	
+	
+	
+	/**
+	 * 查询充电站信息
+	 * @return
+	 */
+	@PostMapping("/query_stations_info")
+	public BaseResult queryStationsInfo(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		log.info("三方平台查询充电站信息请求参数:" + JacksonUtils.toJson(baseRequest));
+		//校验token和签名
+		BaseResult baseResult = requestCheckJianGuan(true, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			log.info("三方平台查询充电站信息响应Data:");
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.ourBuildSign(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();
+		if(null == pageNo){
+			pageNo = 1;
+		}
+		if(null == pageSize){
+			pageSize = 10;
+		}
+		PageInfo<Site> siteListPaging = siteClient.getSiteListPaging(pageNo, pageSize, new ArrayList<>());
+		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()));
+		//参数加密
+		String jsonString = JacksonUtils.toJson(queryStationsInfoResult);
+		log.info("三方平台查询充电站信息响应Data:" + jsonString);
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+		log.info("三方平台查询充电站信息响应参数:" + JacksonUtils.toJson(baseResult));
+		return baseResult;
+	}
+	
+	
+	/**
+	 * 构建站点数据
+	 * @param sites
+	 * @return
+	 */
+	public List<StationInfo> buildSite(List<TParkingLot> parkingLots, List<Site> sites){
+		List<Integer> siteIds = sites.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();
+		String serviceTel = systemConfigurationClient.getServerPhone().getData();
+		List<StationInfo> StationInfos = new ArrayList<>();
+		for (Site datum : sites) {
+			StationInfo stationInfo = new StationInfo();
+			stationInfo.setStationUniqueNumber(datum.getCode());
+			stationInfo.setAreaCodeCountryside(datum.getCountryCode());
+			stationInfo.setStationClassification(datum.getStationClassification());
+			stationInfo.setGeneralApplicationType(datum.getGeneralApplicationType());
+			if (org.springframework.util.StringUtils.hasLength(datum.getSwapMatchCars())){
+				stationInfo.setSwapMatchCars(Arrays.asList(datum.getSwapMatchCars().split(",")));
+			}
+			stationInfo.setSiteGuide(datum.getGuide());
+			stationInfo.setBusineHours(datum.getStartServiceTime());
+			stationInfo.setRoundTheClock(datum.getRoundTheClock());
+			stationInfo.setParkType(datum.getParkType());
+			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());
+			stationInfo.setBusinessExpandType(datum.getBusinessExpandType());
+			stationInfo.setCapacity(datum.getCapacity());
+			stationInfo.setRatedPower(datum.getRatedPower());
+			stationInfo.setPeriodFee(datum.getPeriodFee());
+			stationInfo.setOfficialRunTime(datum.getOfficialRunTime());
+			stationInfo.setStationOrientation(datum.getStationOrientation());
+			stationInfo.setStationArea(datum.getStationArea());
+			stationInfo.setHavePerson(datum.getHavePerson());
+			stationInfo.setVideoMonitor(datum.getVideoMonitor());
+			if (StringUtils.isNotEmpty(datum.getSupportingFacilities())){
+				String[] split = datum.getSupportingFacilities().split(",");
+				List<Integer> collect = Arrays.stream(split).map(Integer::parseInt).collect(Collectors.toList());
+				stationInfo.setSupportingFacilities(collect);
+			}
+			stationInfo.setPrinterFlag(datum.getPrinterFlag());
+			stationInfo.setBarrierFlag(datum.getBarrierFlag());
+			stationInfo.setParkingLockFlag(datum.getParkingLockFlag());
+			stationInfo.setEquipmentOwnerName(datum.getEquipmentOwnerName());
+			stationInfo.setResidentNo(datum.getResidentNo());
+			stationInfo.setSupplyType(datum.getSupplyType());
+			stationInfo.setWattHourMeterNo(datum.getWattHourMeterNo());
+			BigDecimal forwardPower = datum.getForwardPower();
+			if (forwardPower!=null){
+				stationInfo.setForwardPower(forwardPower.setScale(4, BigDecimal.ROUND_HALF_UP).toString());
+			}
+			stationInfo.setRecordUniqueNo(datum.getRecordUniqueNo());
+			stationInfo.setStationID(datum.getId().toString());
+			stationInfo.setOperatorID("906171535");
+			stationInfo.setEquipmentOwnerID("906171535");
+			stationInfo.setStationName(datum.getName());
+			stationInfo.setCountryCode(StringUtils.isNotEmpty(datum.getCountryCode()) ? datum.getCountryCode() : "CN");
+			stationInfo.setAreaCode(datum.getDistrictsCode());
+			stationInfo.setAddress(datum.getAddress());
+			stationInfo.setStationTel(datum.getPhone());
+			stationInfo.setServiceTel(serviceTel);
+			switch (datum.getSiteType()){
+				case 0:
+					stationInfo.setStationType(StationTypeEnum.OTHER.getType());
+					break;
+				case 1:
+					stationInfo.setStationType(StationTypeEnum.PUBLIC.getType());
+					break;
+				case 2:
+					stationInfo.setStationType(StationTypeEnum.PERSONAGE.getType());
+					break;
+				case 3:
+					stationInfo.setStationType(StationTypeEnum.BUS_SPECIFIC.getType());
+					break;
+				case 4:
+					stationInfo.setStationType(StationTypeEnum.SANITATION_SPECIFIC.getType());
+					break;
+				case 5:
+					stationInfo.setStationType(StationTypeEnum.LOGISTICS_SPECIFIC.getType());
+					break;
+				case 6:
+					stationInfo.setStationType(StationTypeEnum.TEXT_SPECIFIC.getType());
+					break;
+			}
+			if(datum.getStatus() == 1){
+				stationInfo.setStationStatus(StationStatusEnum.NORMAL_USE.getStatus());
+			}
+			if(datum.getStatus() == 2){
+				stationInfo.setStationStatus(StationStatusEnum.MAINTAIN.getStatus());
+			}
+			if(datum.getStatus() == 3){
+				stationInfo.setStationStatus(StationStatusEnum.OFF_LINE.getStatus());
+			}
+			stationInfo.setParkNums(datum.getParkingSpace());
+			stationInfo.setStationLat(new BigDecimal(datum.getLat()).setScale(6, RoundingMode.DOWN));
+			stationInfo.setStationLng(new BigDecimal(datum.getLon()).setScale(6, RoundingMode.DOWN));
+			stationInfo.setConstruction(datum.getConstructionSite() == 0 ? ConstructionEnum.OTHER.getType() : datum.getConstructionSite());
+			stationInfo.setPictures(StringUtils.isNotEmpty(datum.getImgUrl()) ? Arrays.asList(datum.getImgUrl().split(",")) : new ArrayList<>());
+			stationInfo.setSiteGuide(datum.getGuide());
+			stationInfo.setMatchCars(datum.getVehicleDescription());
+//			stationInfo.setBusineHours(datum.getStartServiceTime() + "-" + datum.getEndServiceTime());
+			stationInfo.setElectricityFee(datum.getRateDescription());
+			//添加停车费信息
+			Optional<TParkingLot> first = parkingLots.stream().filter(s -> s.getSiteId().equals(datum.getId())).findFirst();
+			if(first.isPresent()){
+				TParkingLot tParkingLot = first.get();
+				buildPlaceHolder(tParkingLot, stationInfo);
+			}
+			//构建充电设备信息数据
+			stationInfo.setEquipmentInfos(buildEquipmentInfo(datum.getId(), tChargingPiles, chargingGunList));
+			StationInfos.add(stationInfo);
+			
+		}
+		return StationInfos;
+	}
+	
+	
+	/**
+	 * 构建停车费信息
+	 * @param tParkingLot
+	 * @param stationInfo
+	 */
+	public void buildPlaceHolder(TParkingLot tParkingLot, StationInfo stationInfo){
+		stationInfo.setOvertimeFee(tParkingLot.getName() + "停车费");
+		PlaceHolder placeHolder = new PlaceHolder();
+		placeHolder.setFreeTime(tParkingLot.getChargeFreeDuration());
+		placeHolder.setMaxFee(tParkingLot.getChargeCapping());
+		List<PlaceHolderPrice> PlaceHolderPrices = new ArrayList<>();
+		PlaceHolderPrice placeHolderPrice = new PlaceHolderPrice();
+		placeHolderPrice.setStartTime("00:00");
+		placeHolderPrice.setEndTime("23:59");
+		placeHolderPrice.setPrice(tParkingLot.getChargeRate());
+		PlaceHolderPrices.add(placeHolderPrice);
+		placeHolder.setPlaceHolderPrices(PlaceHolderPrices);
+		stationInfo.setPlaceHolder(placeHolder);
+	}
+	
+	
+	
+	
+	/**
+	 * 构建桩数据
+	 * @param tChargingPiles
+	 * @return
+	 */
+	public List<EquipmentInfo> buildEquipmentInfo(Integer siteId, List<TChargingPile> tChargingPiles, List<TChargingGun> chargingGunList){
+		List<EquipmentInfo> equipmentInfos = new ArrayList<>();
+		List<TChargingPile> collect = tChargingPiles.stream().filter(s -> s.getSiteId().equals(siteId)).collect(Collectors.toList());
+		for (TChargingPile tChargingPile : collect) {
+			EquipmentInfo equipmentInfo = new EquipmentInfo();
+			equipmentInfo.setEquipmentID(tChargingPile.getId().toString());
+			equipmentInfo.setManufacturerID(tChargingPile.getManufacturerCode());
+			equipmentInfo.setEquipmentName(tChargingPile.getName());
+			equipmentInfo.setManufacturerName(tChargingPile.getManufacturer());
+			equipmentInfo.setEquipmentModel(tChargingPile.getEquipmentType());
+			equipmentInfo.setEquipmentUniqueNumber(tChargingPile.getEquipmentUniqueNumber());
+			equipmentInfo.setEquipmentClassification(tChargingPile.getEquipmentClassification());
+			if(null != tChargingPile.getProductionDate()){
+				equipmentInfo.setProductionDate(tChargingPile.getProductionDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+			}
+			switch (tChargingPile.getType()){
+				case 0:
+					equipmentInfo.setEquipmentType(EquipmentTypeEnum.OTHER.getType());
+					break;
+				case 1:
+					equipmentInfo.setEquipmentType(EquipmentTypeEnum.DIRECT_CURRENT.getType());
+					break;
+				case 2:
+					equipmentInfo.setEquipmentType(EquipmentTypeEnum.ALTERNATING_CURRENT.getType());
+					break;
+				case 3:
+					equipmentInfo.setEquipmentType(EquipmentTypeEnum.ALTERNATING_DIRECT.getType());
+					break;
+				case 4:
+					equipmentInfo.setEquipmentType(EquipmentTypeEnum.WIRELESS_DEVICE.getType());
+					break;
+				case 5:
+					equipmentInfo.setEquipmentType(EquipmentTypeEnum.ORDER.getType());
+					break;
+				case 6:
+					equipmentInfo.setEquipmentType(EquipmentTypeEnum.V2G.getType());
+					break;
+			}
+			
+			//构建设备接口信息
+			equipmentInfo.setConnectorInfos(buildConnectorInfos(tChargingPile.getId(), tChargingPile.getCode(), chargingGunList));
+			equipmentInfo.setPower(tChargingPile.getRatedPower());
+			equipmentInfos.add(equipmentInfo);
+		}
+		return equipmentInfos;
+	}
+	
+	
+	/**
+	 * 构建接口数据
+	 * @param chargingGunList
+	 * @return
+	 */
+	public List<ConnectorInfo> buildConnectorInfos(Integer chargingPileId, String code, List<TChargingGun> chargingGunList){
+		List<ConnectorInfo> connectorInfos = new ArrayList<>();
+		List<TChargingGun> collect = chargingGunList.stream().filter(s -> s.getChargingPileId().equals(chargingPileId)).collect(Collectors.toList());
+		for (TChargingGun chargingGun : collect) {
+			ConnectorInfo connectorInfo = new ConnectorInfo();
+			connectorInfo.setConnectorID(chargingGun.getFullNumber());
+			connectorInfo.setConnectorName(chargingGun.getName());
+			connectorInfo.setEquipmentClassification(chargingGun.getEquipmentClassification());
+			connectorInfo.setConstantVoltageLowerLimits(chargingGun.getConstantVoltageLowerLimits());
+			connectorInfo.setConstantVoltageUpperLimits(chargingGun.getConstantVoltageUpperLimits());
+			connectorInfo.setConstantCurrentLowerLimits(chargingGun.getConstantCurrentLowerLimits());
+			connectorInfo.setConstantCurrentUpperLimits(chargingGun.getConstantCurrentUpperLimits());
+			connectorInfo.setAuxPower(chargingGun.getAuxPower());
+			connectorInfo.setOpreateStatus(chargingGun.getOpreateStatus());
+			connectorInfo.setOpreateHours(chargingGun.getOpreateHours());
+			switch (chargingGun.getType()){
+				case 0:
+					connectorInfo.setConnectorType(ConnectorTypeEnum.OTHER.getType());
+					break;
+				case 1:
+					connectorInfo.setConnectorType(ConnectorTypeEnum.HOUSEHOLD_SOCKET.getType());
+					break;
+				case 2:
+					connectorInfo.setConnectorType(ConnectorTypeEnum.AC_SOCKET.getType());
+					break;
+				case 3:
+					connectorInfo.setConnectorType(ConnectorTypeEnum.AC_INTERFACE_PLUG.getType());
+					break;
+				case 4:
+					connectorInfo.setConnectorType(ConnectorTypeEnum.DC_INTERFACE_GUN_HEAD.getType());
+					break;
+				case 5:
+					connectorInfo.setConnectorType(ConnectorTypeEnum.WIRELESS_CHARGING_STAND.getType());
+					break;
+			}
+			connectorInfo.setCurrent(chargingGun.getRatedCurrent().intValue());
+			connectorInfo.setPower(chargingGun.getRatedPower());
+			connectorInfo.setParkNo(chargingGun.getParkingNumber());
+			connectorInfo.setNationalStandard(Integer.valueOf(chargingGun.getNationalStandard()));
+			connectorInfo.setQRCode("https://mxcd.zhinenganguan.com?No=" + code + chargingGun.getCode());
+			connectorInfos.add(connectorInfo);
+		}
+		return connectorInfos;
+	}
+	
+	
+	/**
+	 * 接口状态变化后推送给第三方
+	 * @return
+	 */
+	@PostMapping("/pushChargingGunStatus")
+	public R pushChargingGunStatus(@RequestParam("fullNumber") String fullNumber, @RequestParam("status") Integer status){
+		ConnectorStatusInfo connectorStatusInfo = new ConnectorStatusInfo();
+		connectorStatusInfo.setConnectorID(fullNumber);
+		switch (status){
+			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 connectorStatusInfo1 = new ConnectorStatusInfo();
+		BeanUtils.copyProperties(connectorStatusInfo, connectorStatusInfo1);
+		connectorStatusInfo.setConnectorStatusInfo(connectorStatusInfo1);
+		List<Operator> operators = operatorClient.getAllOperator().getData();
+		for (Operator operator : operators) {
+			TCECUtil.notificationStationStatus(operator, connectorStatusInfo);
+		}
+		return R.ok();
+	}
+	
+	
+	
+	/**
+	 * 设备接口状态查询
+	 * @return
+	 */
+	@PostMapping("/query_station_status")
+	public BaseResult queryStationStatus(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		log.info("三方平台获取设备接口状态请求参数:" + JacksonUtils.toJson(baseRequest));
+		BaseResult baseResult = requestCheck(true, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			log.info("三方平台获取设备接口状态响应Data:");
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.ourBuildSign(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);
+		QueryStationStatus queryStationsInfo = JSON.parseObject(decrypt, QueryStationStatus.class);
+		List<Integer> collect = queryStationsInfo.getStationIDs().stream().map(Integer::valueOf).collect(Collectors.toList());
+		List<Site> data = siteClient.getSiteByIds(collect).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();
+		
+		QueryStationStatusResult result = new QueryStationStatusResult();
+		result.setTotal(data.size());
+		List<StationStatusInfo> StationStatusInfos = new ArrayList<>();
+		for (Site datum : data) {
+			StationStatusInfo stationStatusInfo = new StationStatusInfo();
+			stationStatusInfo.setStationID(datum.getId().toString());
+			//构建接口状态
+			List<ConnectorStatusInfo> ConnectorStatusInfos = new ArrayList<>();
+			List<TChargingGun> collect2 = chargingGunList.stream().filter(s -> s.getSiteId().equals(datum.getId())).collect(Collectors.toList());
+			for (TChargingGun chargingGun : collect2) {
+				ConnectorStatusInfo info = new ConnectorStatusInfo();
+				info.setConnectorID(chargingGun.getFullNumber());
+				switch (chargingGun.getStatus()){
+					case 1:
+						info.setStatus(0);
+						break;
+					case 2:
+						info.setStatus(1);
+						break;
+					case 3:
+						info.setStatus(2);
+						break;
+					case 4:
+						info.setStatus(3);
+						break;
+					case 5:
+						info.setStatus(3);
+						break;
+					case 6:
+						info.setStatus(4);
+						break;
+					case 7:
+						info.setStatus(255);
+						break;
+				}
+				ConnectorStatusInfos.add(info);
+			}
+			stationStatusInfo.setConnectorStatusInfos(ConnectorStatusInfos);
+			StationStatusInfos.add(stationStatusInfo);
+		}
+		result.setStationStatusInfos(StationStatusInfos);
+		//参数加密
+		String jsonString = JacksonUtils.toJson(result);
+		log.info("三方平台获取设备接口状态响应Data:" + jsonString);
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+		log.info("三方平台获取设备接口状态响应参数:" + JacksonUtils.toJson(baseResult));
+		return baseResult;
+	}
+	
+	
+	
+	
+	
+	/**
+	 * 查询统计信息
+	 * @return
+	 */
+	@PostMapping("/query_station_stats")
+	public BaseResult queryStationStats(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		log.info("三方平台获取统计信息请求参数:" + JacksonUtils.toJson(baseRequest));
+		//校验token和签名
+		BaseResult baseResult = requestCheck(true, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			log.info("三方平台获取统计信息响应Data:");
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.ourBuildSign(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);
+		QueryStationStats queryStationStats = JSON.parseObject(decrypt, QueryStationStats.class);
+		QueryStationStatsResult result = new QueryStationStatsResult();
+		ChargingPercentProvinceDto dto = new ChargingPercentProvinceDto();
+		dto.setDate1(LocalDate.parse(queryStationStats.getStartTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+		dto.setDate2(LocalDate.parse(queryStationStats.getEndTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+		dto.setSiteIds(new HashSet<>(Integer.valueOf(queryStationStats.getStationID())));
+		dto.setTripartitePlatformName(operator.getName());
+		List<TChargingOrder> chargingOrders = chargingOrderClient.getOrderBySiteIdAndTime(dto).getData();
+		BigDecimal reduce = chargingOrders.stream().map(TChargingOrder::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
+		StationStatsInfo stationStats = new StationStatsInfo();
+		stationStats.setStationID(chargingOrders.get(0).getSiteId().toString());
+		stationStats.setStartTime(queryStationStats.getStartTime());
+		stationStats.setEndTime(queryStationStats.getEndTime());
+		stationStats.setStationElectricity(reduce);
+		//构建设备统计数据
+		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.setEquipmentID(integer.toString());
+			equipmentStatsInfo.setEquipmentElectricity(reduce1);
+			
+			//构建设备接口统计数据
+			Map<Integer, List<TChargingOrder>> collect2 = tChargingOrders.stream().collect(Collectors.groupingBy(TChargingOrder::getChargingGunId));
+			List<ConnectorStatsInfo> ConnectorStatsInfos = new ArrayList<>();
+			for (Integer integer1 : collect2.keySet()) {
+				List<TChargingOrder> tChargingOrders1 = collect2.get(integer1);
+				BigDecimal reduce2 = tChargingOrders1.stream().map(TChargingOrder::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
+				
+				TChargingGun chargingGun = chargingGunClient.getChargingGunById(integer1).getData();
+				ConnectorStatsInfo connectorStatsInfo = new ConnectorStatsInfo();
+				connectorStatsInfo.setConnectorID(chargingGun.getFullNumber());
+				connectorStatsInfo.setConnectorElectricity(reduce2);
+				ConnectorStatsInfos.add(connectorStatsInfo);
+			}
+			equipmentStatsInfo.setConnectorStatsInfos(ConnectorStatsInfos);
+			EquipmentStatsInfos.add(equipmentStatsInfo);
+		}
+		stationStats.setEquipmentStatsInfos(EquipmentStatsInfos);
+		result.setStationStats(stationStats);
+		//参数加密
+		String jsonString = JacksonUtils.toJson(result);
+		log.info("三方平台获取统计信息响应Data:" + jsonString);
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+		log.info("三方平台获取统计信息响应参数:" + JacksonUtils.toJson(baseResult));
+		return baseResult;
+	}
+	
+	
+	/**
+	 * 请求设备认证
+	 * @return
+	 */
+	@PostMapping("/query_equip_auth")
+	public BaseResult queryEquipAuth(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		log.info("三方平台设备认证请求参数:" + JacksonUtils.toJson(baseRequest));
+		//校验token和签名
+		BaseResult baseResult = requestCheck(true, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			log.info("三方平台设备认证响应Data:");
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.ourBuildSign(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);
+		QueryEquipAuth queryEquipAuth = JSON.parseObject(decrypt, QueryEquipAuth.class);
+		String connectorID = queryEquipAuth.getConnectorID();
+		TChargingGun tChargingGun = chargingGunClient.getChargingGunByFullNumber(connectorID).getData();
+		if(null == tChargingGun){
+			baseResult.setRet(4004);
+			baseResult.setMsg("connectorID 参数无效");
+			log.info("三方平台设备认证响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		QueryEquipAuthResult queryEquipAuthResult = new QueryEquipAuthResult();
+		queryEquipAuthResult.setEquipAuthSeq(queryEquipAuth.getEquipAuthSeq());
+		queryEquipAuthResult.setConnectorID(connectorID);
+		//1=离线,2=空闲,3=占用(未充电),4=占用(充电中),5=占用(已充满),6=占用(预约锁定),7=故障
+		switch (tChargingGun.getStatus()){
+			case 1:
+				queryEquipAuthResult.setSuccStat(1);
+				queryEquipAuthResult.setFailReason(2);
+				break;
+			case 2:
+				queryEquipAuthResult.setSuccStat(0);
+				queryEquipAuthResult.setFailReason(0);
+				break;
+			case 3:
+				queryEquipAuthResult.setSuccStat(0);
+				queryEquipAuthResult.setFailReason(1);
+				break;
+			case 4:
+				queryEquipAuthResult.setSuccStat(1);
+				queryEquipAuthResult.setFailReason(4);
+				break;
+			case 5:
+				queryEquipAuthResult.setSuccStat(1);
+				queryEquipAuthResult.setFailReason(5);
+				break;
+			case 6:
+				queryEquipAuthResult.setSuccStat(1);
+				queryEquipAuthResult.setFailReason(6);
+				break;
+			case 7:
+				queryEquipAuthResult.setSuccStat(1);
+				queryEquipAuthResult.setFailReason(2);
+				break;
+		}
+		//参数加密
+		String jsonString = JacksonUtils.toJson(queryEquipAuthResult);
+		log.info("三方平台设备认证响应Data:" + jsonString);
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+		log.info("三方平台设备认证响应参数:" + JacksonUtils.toJson(baseResult));
+		return baseResult;
+	}
+	
+	
+	
+	/**
+	 * 查询业务策略信息
+	 * @return
+	 */
+	@PostMapping("/query_equip_business_policy")
+	public BaseResult queryEquipBusinessPolicy(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		log.info("三方平台查询业务策略信息请求参数:" + JacksonUtils.toJson(baseRequest));
+		//校验token和签名
+		BaseResult baseResult = requestCheck(true, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			log.info("三方平台查询业务策略信息响应Data:");
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.ourBuildSign(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);
+		QueryEquipBusinessPolicy queryEquipBusinessPolicy = JSON.parseObject(decrypt, QueryEquipBusinessPolicy.class);
+		
+		//构建返回结果
+		QueryEquipBusinessPolicyResult queryEquipBusinessPolicyResult = new QueryEquipBusinessPolicyResult();
+		queryEquipBusinessPolicyResult.setEquipBizSeq(queryEquipBusinessPolicy.getEquipBizSeq());
+		queryEquipBusinessPolicyResult.setConnectorID(queryEquipBusinessPolicy.getConnectorID());
+		queryEquipBusinessPolicyResult.setSuccStat(0);
+		queryEquipBusinessPolicyResult.setFailReason(0);
+		String connectorID = queryEquipBusinessPolicy.getConnectorID();
+		TChargingGun tChargingGun = chargingGunClient.getChargingGunByFullNumber(connectorID).getData();
+		if(null == tChargingGun){
+			baseResult.setRet(4004);
+			baseResult.setMsg("connectorID 参数无效");
+			//参数加密
+			String jsonString = JacksonUtils.toJson(queryEquipBusinessPolicyResult);
+			log.info("三方平台查询业务策略信息响应Data:" + jsonString);
+			String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+			baseResult.setData(encrypt);
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("三方平台查询业务策略信息响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		Integer accountingStrategyId = tChargingGun.getAccountingStrategyId();
+		if(null == accountingStrategyId){
+			List<Site> data = siteClient.getSiteByIds(Arrays.asList(tChargingGun.getSiteId())).getData();
+			accountingStrategyId = data.get(0).getAccountingStrategyId();
+		}
+		List<TAccountingStrategyDetail> accountingStrategyDetails = accountingStrategyDetailClient.getListByAccountingStrategyId(accountingStrategyId).getData();
+		if(accountingStrategyDetails.size() == 0){
+			queryEquipBusinessPolicyResult.setSuccStat(1);
+			queryEquipBusinessPolicyResult.setFailReason(1);
+			queryEquipBusinessPolicyResult.setSumPeriod(0);
+			//参数加密
+			String jsonString = JacksonUtils.toJson(queryEquipBusinessPolicyResult);
+			log.info("三方平台查询业务策略信息响应Data:" + jsonString);
+			String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+			baseResult.setData(encrypt);
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("三方平台查询业务策略信息响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		List<PolicyInfo> PolicyInfos = new ArrayList<>();
+		for (TAccountingStrategyDetail accountingStrategyDetail : accountingStrategyDetails) {
+			PolicyInfo policyInfo = new PolicyInfo();
+			policyInfo.setStartTime(accountingStrategyDetail.getStartTime().replaceAll(":", "") + "00");
+			policyInfo.setElecPrice(accountingStrategyDetail.getElectrovalence());
+			policyInfo.setSevicePrice(accountingStrategyDetail.getServiceCharge());
+			PolicyInfos.add(policyInfo);
+		}
+		queryEquipBusinessPolicyResult.setSumPeriod(PolicyInfos.size());
+		queryEquipBusinessPolicyResult.setPolicyInfos(PolicyInfos);
+		//参数加密
+		String jsonString = JacksonUtils.toJson(queryEquipBusinessPolicyResult);
+		log.info("三方平台查询业务策略信息响应Data:" + jsonString);
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+		log.info("三方平台查询业务策略信息响应参数:" + JacksonUtils.toJson(baseResult));
+		return baseResult;
+	}
+	
+	
+	/**
+	 * 站点变更推送通知(快电)
+	 * @param siteIds
+	 * @return
+	 */
+	@PostMapping("/notificationStationChange")
+	public R notificationStationChange(@RequestParam("siteIds") List<Integer> siteIds){
+		Operator operator = operatorClient.getOperatorByName("KuaiDian").getData();
+		NotificationStationChangeResult notificationStationChange = TCECKDUtil.notificationStationChange(operator, 3, siteIds);
+		//启动重试推送机制
+		if(null == notificationStationChange || 1 == notificationStationChange.getSuccStat()){
+			ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
+			threadPoolExecutor.execute(new Runnable() {
+				//计数器
+				Integer size = 0;
+				@Override
+				public void run() {
+					NotificationStationChangeResult notificationStationChange1 = TCECKDUtil.notificationStationChange(operator, 3, siteIds);
+					//启动重试推送机制
+					if(null != notificationStationChange1 && 0 == notificationStationChange1.getSuccStat()){
+						threadPoolExecutor.shutdown();
+						return;
+					}
+					size++;
+					if(size >= 5){
+						threadPoolExecutor.shutdown();
+						return;
+					}
+					//间隔一分钟重试一次
+					try {
+						Thread.sleep(60000);
+					} catch (InterruptedException e) {
+						throw new RuntimeException(e);
+					}
+				}
+			});
+		}
+		return R.ok();
+	}
+	
+	
+	
+	
+	/**
+	 * 请求开始充电
+	 * @return
+	 */
+	@PostMapping("/query_start_charge")
+	public BaseResult queryStartCharge(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		log.info("三方平台请求开始充电请求参数:" + JacksonUtils.toJson(baseRequest));
+		//校验token和签名
+		BaseResult baseResult = requestCheck(true, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			log.info("三方平台请求开始充电响应Data:");
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.ourBuildSign(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);
+		QueryStartCharge queryStartCharge = JSON.parseObject(decrypt, QueryStartCharge.class);
+		
+		//构建返回结果
+		QueryStartChargeResult result = new QueryStartChargeResult();
+		result.setStartChargeSeq(queryStartCharge.getStartChargeSeq());
+		result.setConnectorID(queryStartCharge.getConnectorID());
+		String connectorID = queryStartCharge.getConnectorID();
+		TChargingGun tChargingGun = chargingGunClient.getChargingGunByFullNumber(connectorID).getData();
+		//设备不存在
+		if(null == tChargingGun){
+			baseResult.setRet(4004);
+			baseResult.setMsg("connectorID 参数无效");
+			result.setSuccStat(1);
+			result.setFailReason(1);
+			result.setStartChargeSeqStat(5);
+			//参数加密
+			String jsonString = JacksonUtils.toJson(result);
+			log.info("三方平台请求开始充电响应Data:" + jsonString);
+			String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+			baseResult.setData(encrypt);
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("三方平台请求开始充电响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		//设备离线
+		if(tChargingGun.getStatus() == 1){
+			result.setSuccStat(1);
+			result.setFailReason(2);
+			result.setStartChargeSeqStat(5);
+			//参数加密
+			String jsonString = JacksonUtils.toJson(result);
+			log.info("三方平台请求开始充电响应Data:" + jsonString);
+			String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+			baseResult.setData(encrypt);
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("三方平台请求开始充电响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		//调用充电接口
+		AddTripartitePlatformOrder addTripartitePlatformOrder = new AddTripartitePlatformOrder();
+		addTripartitePlatformOrder.setStartChargeSeq(queryStartCharge.getStartChargeSeq());
+		addTripartitePlatformOrder.setChargingGunId(tChargingGun.getId());
+		addTripartitePlatformOrder.setOperatorId(operator.getOperatorId());
+		addTripartitePlatformOrder.setPaymentAmount(null == queryStartCharge.getChargingAmt() ? new BigDecimal(9999) : queryStartCharge.getChargingAmt());
+		addTripartitePlatformOrder.setRechargePaymentType(0);
+		addTripartitePlatformOrder.setPlateNum(queryStartCharge.getPlateNum());
+		R order = chargingOrderClient.addTripartitePlatformOrder(addTripartitePlatformOrder);
+		//启动失败
+		if(200 != order.getCode()){
+			result.setSuccStat(1);
+			result.setFailReason(1);
+			result.setStartChargeSeqStat(2);
+			//参数加密
+			String jsonString = JacksonUtils.toJson(result);
+			log.info("三方平台请求开始充电响应Data:" + jsonString);
+			String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+			baseResult.setData(encrypt);
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("三方平台请求开始充电响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		result.setStartChargeSeqStat(1);
+		result.setSuccStat(0);
+		result.setFailReason(0);
+		//参数加密
+		String jsonString = JacksonUtils.toJson(result);
+		log.info("三方平台请求开始充电响应Data:" + jsonString);
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+		log.info("三方平台请求开始充电响应参数:" + JacksonUtils.toJson(baseResult));
+		
+		//定义定时任务推送订单状态
+		ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
+		Runnable task = new Runnable() {
+			@Override
+			public void run() {
+				try {
+					TChargingOrder chargingOrder = chargingOrderClient.getChargingOrderByStartChargeSeq(result.getStartChargeSeq()).getData();
+					if(chargingOrder.getStatus() != 3){
+						scheduler.shutdown();
+						return;
+					}
+					log.info("开始执行三方平台定时推送");
+					notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
+				}catch (Exception e){
+					e.printStackTrace();
+				}
+			}
+		};
+		//一分钟执行一次
+		scheduler.scheduleAtFixedRate(task, 10, 10, TimeUnit.SECONDS);
+		return baseResult;
+	}
+	
+	
+	/**
+	 * 启动充电结果推送
+	 * @param result
+	 * @return
+	 */
+	@PostMapping("/notificationStartChargeResult")
+	public R notificationStartChargeResult(@RequestBody StartChargeResult result){
+		NotificationStartCharge notificationStartCharge = new NotificationStartCharge();
+		BeanUtils.copyProperties(result, notificationStartCharge);
+		Operator operator = operatorClient.getOperator(result.getOperatorID()).getData();
+		NotificationStartChargeResult notificationStartChargeResult = TCECUtil.notificationStartChargeResult(operator, notificationStartCharge);
+		//启动重试推送机制
+		if(null == notificationStartChargeResult || 1 == notificationStartChargeResult.getSuccStat()){
+			
+			ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
+			threadPoolExecutor.execute(new Runnable() {
+				//计数器
+				Integer size = 0;
+				@Override
+				public void run() {
+					NotificationStartChargeResult notificationStartChargeResult1 = TCECUtil.notificationStartChargeResult(operator, notificationStartCharge);
+					//启动重试推送机制
+					if(null != notificationStartChargeResult1 && 0 == notificationStartChargeResult1.getSuccStat()){
+						threadPoolExecutor.shutdown();
+						return;
+					}
+					size++;
+					if(size >= 5){
+						threadPoolExecutor.shutdown();
+						return;
+					}
+					//间隔一分钟重试一次
+					try {
+						Thread.sleep(60000);
+					} catch (InterruptedException e) {
+						throw new RuntimeException(e);
+					}
+				}
+			});
+		}
+		return R.ok();
+	}
+	
+	
+	
+	/**
+	 * 查询充电状态
+	 * @return
+	 */
+	@PostMapping("/query_equip_charge_status")
+	public BaseResult queryEquipChargeStatus(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		log.info("三方平台查询充电状态请求参数:" + JacksonUtils.toJson(baseRequest));
+		//校验token和签名
+		BaseResult baseResult = requestCheck(true, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			log.info("三方平台查询充电状态响应Data:");
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.ourBuildSign(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);
+		QueryEquipChargeStatus queryEquipChargeStatus = JSON.parseObject(decrypt, QueryEquipChargeStatus.class);
+		//校验token和签名
+		QueryEquipChargeStatusResult queryEquipChargeStatusResult = buildQueryEquipChargeStatusResult(queryEquipChargeStatus.getStartChargeSeq());
+		//参数加密
+		String jsonString = JacksonUtils.toJson(queryEquipChargeStatusResult);
+		log.info("三方平台查询充电状态响应Data:" + jsonString);
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+		log.info("三方平台查询充电状态响应参数:" + JacksonUtils.toJson(baseResult));
+		return baseResult;
+	}
+	
+	
+	/**
+	 * 构建充电状态结果
+	 * @param startChargeSeq
+	 * @return
+	 */
+	public QueryEquipChargeStatusResult buildQueryEquipChargeStatusResult(String startChargeSeq){
+		//构建返回结果
+		QueryEquipChargeStatusResult queryEquipChargeStatusResult = new QueryEquipChargeStatusResult();
+		queryEquipChargeStatusResult.setStartChargeSeq(startChargeSeq);
+		TChargingOrder chargingOrder = chargingOrderClient.getChargingOrderByStartChargeSeq(startChargeSeq).getData();
+		if(null == chargingOrder){
+			return null;
+		}
+		//0=未知,1=等待中/已插枪,2=启动中,3=充电中,4=停止中,5=已结束
+		switch (chargingOrder.getStatus()){
+			case 0:
+				queryEquipChargeStatusResult.setStartChargeSeqStat(5);
+				break;
+			case 1:
+				queryEquipChargeStatusResult.setStartChargeSeqStat(0);
+				break;
+			case 2:
+				queryEquipChargeStatusResult.setStartChargeSeqStat(1);
+				break;
+			case 3:
+				queryEquipChargeStatusResult.setStartChargeSeqStat(2);
+				break;
+			case 4:
+				queryEquipChargeStatusResult.setStartChargeSeqStat(3);
+				break;
+			case 5:
+				queryEquipChargeStatusResult.setStartChargeSeqStat(4);
+				break;
+		}
+		TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
+		queryEquipChargeStatusResult.setConnectorID(chargingGun.getFullNumber());
+		//1=离线,2=空闲,3=占用(未充电),4=占用(充电中),5=占用(已充满),6=占用(预约锁定),7=故障
+		switch (chargingGun.getStatus()){
+			case 1:
+				queryEquipChargeStatusResult.setConnectorStatus(0);
+				break;
+			case 2:
+				queryEquipChargeStatusResult.setConnectorStatus(1);
+				break;
+			case 3:
+				queryEquipChargeStatusResult.setConnectorStatus(2);
+				break;
+			case 4:
+				queryEquipChargeStatusResult.setConnectorStatus(3);
+				break;
+			case 5:
+				queryEquipChargeStatusResult.setConnectorStatus(1);
+				break;
+			case 6:
+				queryEquipChargeStatusResult.setConnectorStatus(4);
+				break;
+			case 7:
+				queryEquipChargeStatusResult.setConnectorStatus(255);
+				break;
+		}
+		queryEquipChargeStatusResult.setCurrentA(chargingOrder.getCurrent());
+		queryEquipChargeStatusResult.setVoltageA(chargingOrder.getVoltage());
+		UploadRealTimeMonitoringData timeMonitoringData = uploadRealTimeMonitoringDataService.getLastDataById(chargingOrder.getCode());
+		queryEquipChargeStatusResult.setSoc(null == timeMonitoringData ? BigDecimal.ZERO : new BigDecimal(timeMonitoringData.getSoc()));
+		queryEquipChargeStatusResult.setStartTime((null == chargingOrder.getStartTime() ? chargingOrder.getCreateTime() : chargingOrder.getStartTime()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+		queryEquipChargeStatusResult.setEndTime((null == chargingOrder.getEndTime() ? LocalDateTime.now() : chargingOrder.getEndTime()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+		queryEquipChargeStatusResult.setTotalPower(chargingOrder.getElectricity());
+		
+		List<TChargingOrderAccountingStrategy> data = chargingOrderAccountingStrategyClient.getChargingOrderAccountingStrategyByOrderId(chargingOrder.getId()).getData();
+		if(data.size() > 0){
+			BigDecimal totalElectricity = data.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+			BigDecimal serviceCharge = data.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+			queryEquipChargeStatusResult.setElecMoney(totalElectricity);
+			queryEquipChargeStatusResult.setSeviceMoney(serviceCharge);
+			queryEquipChargeStatusResult.setTotalMoney(chargingOrder.getPaymentAmount());
+		}else{
+			queryEquipChargeStatusResult.setElecMoney(chargingOrder.getRechargeAmount().subtract(chargingOrder.getResidualAmount()));
+			queryEquipChargeStatusResult.setSeviceMoney(BigDecimal.ZERO);
+			queryEquipChargeStatusResult.setTotalMoney(chargingOrder.getRechargeAmount().subtract(chargingOrder.getResidualAmount()));
+		}
+		
+		//构建充电明细
+		List<ChargeDetail> chargeDetails = new ArrayList<>();
+		
+		LocalDateTime startTime = null == chargingOrder.getStartTime() ? LocalDateTime.now() : chargingOrder.getStartTime();
+		LocalDateTime endTime = null == chargingOrder.getEndTime() ? LocalDateTime.now() : chargingOrder.getEndTime();
+		String s_format = startTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+		String e_format = endTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+		for (TChargingOrderAccountingStrategy datum : data) {
+			ChargeDetail chargeDetail = new ChargeDetail();
+			if(s_format.equals(e_format)){
+				chargeDetail.setDetailStartTime(s_format + " " + datum.getStartTime() + ":00");
+				chargeDetail.setDetailEndTime(s_format + " " + datum.getEndTime() + ":59");
+			}else{
+				String substring = datum.getEndTime().substring(0, datum.getEndTime().indexOf(":"));
+				if(Integer.valueOf(substring) > 12){
+					chargeDetail.setDetailStartTime(s_format + " " + datum.getStartTime() + ":00");
+					chargeDetail.setDetailEndTime(s_format + " " + datum.getEndTime() + ":59");
+				}else{
+					chargeDetail.setDetailStartTime(e_format + " " + datum.getStartTime() + ":00");
+					chargeDetail.setDetailEndTime(e_format + " " + datum.getEndTime() + ":59");
+				}
+			}
+			chargeDetail.setElecPrice(datum.getElectrovalence());
+			chargeDetail.setSevicePrice(datum.getServiceCharge());
+			chargeDetail.setDetailPower(datum.getChargingCapacity());
+			chargeDetail.setDetailElecMoney(datum.getPeriodElectricPrice());
+			chargeDetail.setDetailSeviceMoney(datum.getPeriodServicePrice());
+			chargeDetails.add(chargeDetail);
+		}
+		queryEquipChargeStatusResult.setChargeDetails(chargeDetails);
+		return queryEquipChargeStatusResult;
+	}
+	
+	
+	/**
+	 * 推送充电状态
+	 * @param startChargeSeq
+	 * @return
+	 */
+	@PostMapping("/notificationEquipChargeStatus")
+	public R notificationEquipChargeStatus(@RequestParam(value = "startChargeSeq") String startChargeSeq, @RequestParam(value = "operatorId") Integer operatorId){
+		QueryEquipChargeStatusResult queryEquipChargeStatusResult = buildQueryEquipChargeStatusResult(startChargeSeq);
+		Operator operator = operatorClient.getOperatorById(operatorId).getData();
+		NotificationEquipChargeStatusResult notificationEquipChargeStatusResult = TCECUtil.notificationEquipChargeStatus(operator, queryEquipChargeStatusResult);
+		//启动重试推送机制
+		if(null == notificationEquipChargeStatusResult || 1 == notificationEquipChargeStatusResult.getSuccStat()){
+			ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
+			threadPoolExecutor.execute(new Runnable() {
+				//计数器
+				Integer size = 0;
+				@Override
+				public void run() {
+					NotificationEquipChargeStatusResult notificationEquipChargeStatusResult1 = TCECUtil.notificationEquipChargeStatus(operator, queryEquipChargeStatusResult);
+					//启动重试推送机制
+					if(null != notificationEquipChargeStatusResult1 && 0 == notificationEquipChargeStatusResult1.getSuccStat()){
+						threadPoolExecutor.shutdown();
+						return;
+					}
+					size++;
+					if(size >= 5){
+						threadPoolExecutor.shutdown();
+						return;
+					}
+					//间隔一分钟重试一次
+					try {
+						Thread.sleep(60000);
+					} catch (InterruptedException e) {
+						throw new RuntimeException(e);
+					}
+				}
+			});
+		}
+		return R.ok();
+	}
+	
+	
+	/**
+	 * 请求停止充电
+	 * @return
+	 */
+	@PostMapping("/query_stop_charge")
+	public BaseResult queryStopCharge(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		log.info("三方平台请求停止充电请求参数:" + JacksonUtils.toJson(baseRequest));
+		//校验token和签名
+		BaseResult baseResult = requestCheck(true, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			log.info("三方平台请求停止充电响应Data:");
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.ourBuildSign(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);
+		QueryStopCharge queryStopCharge = JSON.parseObject(decrypt, QueryStopCharge.class);
+		QueryStopChargeResult queryStopChargeResult = new QueryStopChargeResult();
+		queryStopChargeResult.setStartChargeSeq(queryStopCharge.getStartChargeSeq());
+		queryStopChargeResult.setStartChargeSeqStat(3);
+		queryStopChargeResult.setSuccStat(0);
+		queryStopChargeResult.setFailReason(0);
+		//执行停机操作
+		R r = chargingOrderClient.tripartitePlatformStopCharge(queryStopCharge.getStartChargeSeq());
+		if(200 != r.getCode()){
+			queryStopChargeResult.setStartChargeSeqStat(5);
+			queryStopChargeResult.setSuccStat(1);
+			queryStopChargeResult.setFailReason(3);
+			//参数加密
+			String jsonString = JacksonUtils.toJson(queryStopChargeResult);
+			log.info("三方平台请求停止充电响应Data:" + jsonString);
+			String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+			baseResult.setData(encrypt);
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("三方平台请求停止充电响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		//参数加密
+		String jsonString = JacksonUtils.toJson(queryStopChargeResult);
+		log.info("三方平台请求停止充电响应Data:" + jsonString);
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+		log.info("三方平台请求停止充电响应参数:" + JacksonUtils.toJson(baseResult));
+		return baseResult;
+	}
+	
+	
+	
+	/**
+	 * 推送停止充电结果
+	 * @param startChargeSeq    充电订单号
+	 * @param connectorID       充电设备接口编码
+	 * @return
+	 */
+	@PostMapping("/notificationStopChargeResult")
+	public R notificationStopChargeResult(@RequestParam("startChargeSeq") String startChargeSeq, @RequestParam("connectorID") String connectorID,
+	                                      @RequestParam("operatorId") Integer operatorId){
+		Operator operator = operatorClient.getOperatorById(operatorId).getData();
+		NotificationStopChargeResult info = new NotificationStopChargeResult();
+		info.setStartChargeSeq(startChargeSeq);
+		info.setStartChargeSeqStat(4);
+		info.setConnectorID(connectorID);
+		info.setSuccStat(0);
+		info.setFailReason(0);
+		NotificationStopCharge notificationStopCharge = TCECUtil.notificationStopChargeResult(operator, info);
+		//启动重试推送机制
+		if(null == notificationStopCharge || 1 == notificationStopCharge.getSuccStat()){
+			ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
+			threadPoolExecutor.execute(new Runnable() {
+				//计数器
+				Integer size = 0;
+				@Override
+				public void run() {
+					NotificationStopCharge notificationStopCharge1 = TCECUtil.notificationStopChargeResult(operator, info);
+					//启动重试推送机制
+					if(null != notificationStopCharge1 && 0 == notificationStopCharge1.getSuccStat()){
+						threadPoolExecutor.shutdown();
+						return;
+					}
+					size++;
+					if(size >= 5){
+						threadPoolExecutor.shutdown();
+						return;
+					}
+					//间隔一分钟重试一次
+					try {
+						Thread.sleep(60000);
+					} catch (InterruptedException e) {
+						throw new RuntimeException(e);
+					}
+				}
+			});
+		}
+		return R.ok();
+	}
+	
+	
+	/**
+	 * 推送订单信息
+	 * @param startChargeSeq
+	 * @return
+	 */
+	@PostMapping("/notificationChargeOrderInfo")
+	public R notificationChargeOrderInfo(@RequestParam("startChargeSeq") String startChargeSeq, @RequestParam("operatorId") Integer operatorId){
+		NotificationChargeOrderInfo info = buildNotificationChargeOrderInfo(startChargeSeq);
+		Operator operator = operatorClient.getOperatorById(operatorId).getData();
+		NotificationChargeOrderInfoResult notificationChargeOrderInfoResult = TCECUtil.notificationChargeOrderInfo(operator, info);
+		//启动重试推送机制
+		if(null == notificationChargeOrderInfoResult || 1 == notificationChargeOrderInfoResult.getConfirmResult()){
+			ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
+			threadPoolExecutor.execute(new Runnable() {
+				//计数器
+				Integer size = 0;
+				@Override
+				public void run() {
+					NotificationChargeOrderInfoResult notificationChargeOrderInfoResult1 = TCECUtil.notificationChargeOrderInfo(operator, info);
+					//启动重试推送机制
+					if(null != notificationChargeOrderInfoResult1 && 0 == notificationChargeOrderInfoResult1.getConfirmResult()){
+						threadPoolExecutor.shutdown();
+						return;
+					}
+					size++;
+					if(size >= 5){
+						threadPoolExecutor.shutdown();
+						return;
+					}
+					//间隔一分钟重试一次
+					try {
+						Thread.sleep(60000);
+					} catch (InterruptedException e) {
+						throw new RuntimeException(e);
+					}
+				}
+			});
+		}
+		return R.ok();
+	}
+	
+	
+	/**
+	 * 构建推送订单信息
+	 * @param startChargeSeq
+	 * @return
+	 */
+	public NotificationChargeOrderInfo buildNotificationChargeOrderInfo(String startChargeSeq){
+		//构建返回结果
+		NotificationChargeOrderInfo notificationChargeOrderInfo = new NotificationChargeOrderInfo();
+		notificationChargeOrderInfo.setStartChargeSeq(startChargeSeq);
+		TChargingOrder chargingOrder = chargingOrderClient.getChargingOrderByStartChargeSeq(startChargeSeq).getData();
+		if(null == chargingOrder){
+			return null;
+		}
+		TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
+		notificationChargeOrderInfo.setConnectorID(chargingGun.getFullNumber());
+		notificationChargeOrderInfo.setStartTime((null == chargingOrder.getStartTime() ? chargingOrder.getCreateTime() : chargingOrder.getStartTime()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+		notificationChargeOrderInfo.setEndTime((null == chargingOrder.getEndTime() ? LocalDateTime.now() : chargingOrder.getEndTime()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+		notificationChargeOrderInfo.setTotalPower(chargingOrder.getElectricity());
+		
+		List<TChargingOrderAccountingStrategy> data = chargingOrderAccountingStrategyClient.getChargingOrderAccountingStrategyByOrderId(chargingOrder.getId()).getData();
+		if(data.size() > 0){
+			BigDecimal totalElectricity = data.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+			BigDecimal serviceCharge = data.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+			notificationChargeOrderInfo.setTotalElecMoney(totalElectricity.setScale(2, RoundingMode.HALF_EVEN));
+			notificationChargeOrderInfo.setTotalSeviceMoney(serviceCharge.setScale(2, RoundingMode.HALF_EVEN));
+			notificationChargeOrderInfo.setTotalMoney(chargingOrder.getPaymentAmount());
+		}else{
+			notificationChargeOrderInfo.setTotalElecMoney(chargingOrder.getRechargeAmount().subtract(chargingOrder.getResidualAmount()));
+			notificationChargeOrderInfo.setTotalSeviceMoney(BigDecimal.ZERO);
+			notificationChargeOrderInfo.setTotalMoney(chargingOrder.getRechargeAmount().subtract(chargingOrder.getResidualAmount()));
+		}
+		
+		
+		TParkingRecord parkingRecord = parkingRecordClient.getParkingRecordByChargingOrderId(chargingOrder.getId()).getData();
+		if(null != parkingRecord && parkingRecord.getStatus() == 3){
+			notificationChargeOrderInfo.setTotalDelayMoney(parkingRecord.getPayment());
+		}
+		
+		//结束方式(0=异常终止,1=主动终止,2=满电终止,3=费用不足终止)
+		switch (chargingOrder.getEndMode()){
+			case 0:
+				notificationChargeOrderInfo.setStopReason(3);
+				break;
+			case 1:
+				notificationChargeOrderInfo.setStopReason(0);
+				break;
+			case 2:
+				notificationChargeOrderInfo.setStopReason(2);
+				break;
+			case 3:
+				notificationChargeOrderInfo.setStopReason(5);
+				break;
+		}
+		
+		//构建充电明细
+		List<ChargeDetail> chargeDetails = new ArrayList<>();
+		
+		LocalDateTime startTime = null == chargingOrder.getStartTime() ? LocalDateTime.now() : chargingOrder.getStartTime();
+		LocalDateTime endTime = null == chargingOrder.getEndTime() ? LocalDateTime.now() : chargingOrder.getEndTime();
+		String s_format = startTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+		String e_format = endTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+		for (TChargingOrderAccountingStrategy datum : data) {
+			ChargeDetail chargeDetail = new ChargeDetail();
+			if(s_format.equals(e_format)){
+				chargeDetail.setDetailStartTime(s_format + " " + datum.getStartTime() + ":00");
+				chargeDetail.setDetailEndTime(s_format + " " + datum.getEndTime() + ":59");
+			}else{
+				String substring = datum.getEndTime().substring(0, datum.getEndTime().indexOf(":"));
+				if(Integer.valueOf(substring) > 12){
+					chargeDetail.setDetailStartTime(s_format + " " + datum.getStartTime() + ":00");
+					chargeDetail.setDetailEndTime(s_format + " " + datum.getEndTime() + ":59");
+				}else{
+					chargeDetail.setDetailStartTime(e_format + " " + datum.getStartTime() + ":00");
+					chargeDetail.setDetailEndTime(e_format + " " + datum.getEndTime() + ":59");
+				}
+			}
+			chargeDetail.setElecPrice(datum.getElectrovalence());
+			chargeDetail.setSevicePrice(datum.getServiceCharge());
+			chargeDetail.setDetailPower(datum.getChargingCapacity());
+			chargeDetail.setDetailElecMoney(datum.getPeriodElectricPrice());
+			chargeDetail.setDetailSeviceMoney(datum.getPeriodServicePrice());
+			chargeDetails.add(chargeDetail);
+		}
+		notificationChargeOrderInfo.setChargeDetails(chargeDetails);
+		return notificationChargeOrderInfo;
+	}
+	
+	
+	/**
+	 * 二维码查询枪号(快电)
+	 * @param baseRequest
+	 * @param request
+	 * @return
+	 */
+	@PostMapping("/query_terminal_code")
+	public BaseResult queryTerminalCode(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		log.info("三方平台二维码查询枪号请求参数:" + JacksonUtils.toJson(baseRequest));
+		//校验token和签名
+		BaseResult baseResult = requestCheck(true, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			log.info("三方平台二维码查询枪号响应Data:");
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.ourBuildSign(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);
+		QueryTerminalCode queryTerminalCode = JSON.parseObject(decrypt, QueryTerminalCode.class);
+		String qrCode = queryTerminalCode.getQRCode();
+		String substring = qrCode.substring(qrCode.indexOf("=") + 1);
+		TChargingGun chargingGun = chargingGunClient.getChargingGunByFullNumber(substring).getData();
+		QueryTerminalCodeResult queryTerminalCodeResult = new QueryTerminalCodeResult();
+		if(null != chargingGun){
+			queryTerminalCodeResult.setTerminalCode(chargingGun.getId().toString());
+		}
+		
+		//参数加密
+		String jsonString = JacksonUtils.toJson(queryTerminalCodeResult);
+		log.info("三方平台二维码查询枪号响应Data:" + jsonString);
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+		log.info("三方平台二维码查询枪号响应参数:" + JacksonUtils.toJson(baseResult));
+		return baseResult;
+	}
+	
+	
+	/**
+	 * 推送充电车牌号
+	 * 客户归属运营商向设备运营商推送充电用户车牌号减免停车费,多次推送以最后一次车牌号为准
+	 * @param baseRequest
+	 * @param request
+	 * @return
+	 */
+	@PostMapping("/notification_charge_carnum")
+	public BaseResult notificationChargeCarnum(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		//校验token和签名
+		BaseResult baseResult = requestCheck(true, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.buildSign(baseResult));
+			return baseResult;
+		}
+		Operator operator = baseResult.getOperator();
+		//解密参数
+		String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getDataSecret(), operator.getDataSecretIv());
+		NotificationChargeCarnum notificationChargeCarnum = JSON.parseObject(decrypt, NotificationChargeCarnum.class);
+		
+		NotificationChargeCarnumResult notificationChargeCarnumResult = new NotificationChargeCarnumResult();
+		notificationChargeCarnumResult.setStartChargeSeqs(notificationChargeCarnum.getStartChargeSeqs());
+		notificationChargeCarnumResult.setSuccStat(0);
+		notificationChargeCarnumResult.setFailReason(0);
+		TChargingOrder chargingOrder = chargingOrderClient.getChargingOrderByStartChargeSeq(notificationChargeCarnum.getStartChargeSeqs()).getData();
+		if(null == chargingOrder){
+			notificationChargeCarnumResult.setSuccStat(1);
+			notificationChargeCarnumResult.setFailReason(1);
+		}else{
+			//待处理相关业务逻辑
+		}
+		//参数加密
+		String jsonString = JacksonUtils.toJson(notificationChargeCarnumResult);
+		String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.buildSign(baseResult));
+		return baseResult;
+	}
+	
+	
+	/**
+	 * 账单拉取(快电)
+	 * @param baseRequest
+	 * @param request
+	 * @return
+	 */
+	@PostMapping("/query_charge_order_info")
+	public BaseResult queryChargeOrderInfo(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		log.info("三方平台账单拉取请求参数:" + JacksonUtils.toJson(baseRequest));
+		//校验token和签名
+		BaseResult baseResult = requestCheck(true, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			log.info("三方平台账单拉取响应Data:");
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.ourBuildSign(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);
+		QueryChargeOrderInfo queryChargeOrderInfo = JSON.parseObject(decrypt, QueryChargeOrderInfo.class);
+		//构建返回结果
+		QueryChargeOrderInfoResult result = buildQueryChargeOrderInfoResult(queryChargeOrderInfo);
+		//参数加密
+		String jsonString = JacksonUtils.toJson(result);
+		log.info("三方平台账单拉取响应Data:" + jsonString);
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+		log.info("三方平台账单拉取响应参数:" + JacksonUtils.toJson(baseResult));
+		return baseResult;
+	}
+	
+	
+	
+	/**
+	 * 构建充电账单拉取实体
+	 * @param queryChargeOrderInfo
+	 * @return
+	 */
+	public QueryChargeOrderInfoResult buildQueryChargeOrderInfoResult(QueryChargeOrderInfo queryChargeOrderInfo){
+		//构建返回结果
+		QueryChargeOrderInfoResult queryChargeOrderInfoResult = new QueryChargeOrderInfoResult();
+		List<OrderInfo> orderInfos = new ArrayList<>();
+		List<String> startChargeSeqs = queryChargeOrderInfo.getStartChargeSeqs();
+		List<TChargingOrder> chargingOrders = chargingOrderClient.getChargingOrderByStartChargeSeqs(startChargeSeqs).getData();
+		for (TChargingOrder chargingOrder : chargingOrders) {
+			if(null == chargingOrder){
+				return null;
+			}
+			TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
+			OrderInfo orderInfo = new OrderInfo();
+			orderInfo.setStartChargeSeq(chargingOrder.getStartChargeSeq());
+			orderInfo.setConnectorID(chargingGun.getFullNumber());
+			orderInfo.setStartTime((null == chargingOrder.getStartTime() ? chargingOrder.getCreateTime() : chargingOrder.getStartTime()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+			orderInfo.setEndTime((null == chargingOrder.getEndTime() ? LocalDateTime.now() : chargingOrder.getEndTime()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+			orderInfo.setTotalPower(chargingOrder.getTotalElectricity());
+			orderInfo.setTotalElecMoney(chargingOrder.getElectrovalence());
+			orderInfo.setTotalSeviceMoney(chargingOrder.getServiceCharge());
+			orderInfo.setTotalMoney(chargingOrder.getTotalElectricity().add(chargingOrder.getServiceCharge()));
+			//结束方式(0=异常终止,1=主动终止,2=满电终止,3=费用不足终止)
+			switch (chargingOrder.getEndMode()){
+				case 0:
+					orderInfo.setStopReason(3);
+					break;
+				case 1:
+					orderInfo.setStopReason(0);
+					break;
+				case 2:
+					orderInfo.setStopReason(2);
+					break;
+				case 3:
+					orderInfo.setStopReason(4);
+					break;
+			}
+			//构建充电明细
+			List<ChargeDetail> chargeDetails = new ArrayList<>();
+			List<TChargingOrderAccountingStrategy> data = chargingOrderAccountingStrategyClient.getChargingOrderAccountingStrategyByOrderId(chargingOrder.getId()).getData();
+			
+			LocalDateTime startTime = chargingOrder.getStartTime();
+			LocalDateTime endTime = null == chargingOrder.getEndTime() ? LocalDateTime.now() : chargingOrder.getEndTime();
+			String s_format = startTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+			String e_format = endTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+			for (TChargingOrderAccountingStrategy datum : data) {
+				ChargeDetail chargeDetail = new ChargeDetail();
+				if(s_format.equals(e_format)){
+					chargeDetail.setDetailStartTime(s_format + " " + datum.getStartTime() + ":00");
+					chargeDetail.setDetailEndTime(s_format + " " + datum.getEndTime() + ":59");
+				}else{
+					String substring = datum.getEndTime().substring(0, datum.getEndTime().indexOf(":"));
+					if(Integer.valueOf(substring) > 12){
+						chargeDetail.setDetailStartTime(s_format + " " + datum.getStartTime() + ":00");
+						chargeDetail.setDetailEndTime(s_format + " " + datum.getEndTime() + ":59");
+					}else{
+						chargeDetail.setDetailStartTime(e_format + " " + datum.getStartTime() + ":00");
+						chargeDetail.setDetailEndTime(e_format + " " + datum.getEndTime() + ":59");
+					}
+				}
+				chargeDetail.setElecPrice(datum.getElectrovalence());
+				chargeDetail.setSevicePrice(datum.getServiceCharge());
+				chargeDetail.setDetailPower(datum.getChargingCapacity());
+				chargeDetail.setDetailElecMoney(datum.getPeriodElectricPrice());
+				chargeDetail.setDetailSeviceMoney(datum.getPeriodServicePrice());
+				chargeDetails.add(chargeDetail);
+			}
+			orderInfo.setChargeDetails(chargeDetails);
+			orderInfos.add(orderInfo);
+		}
+		queryChargeOrderInfoResult.setOrderInfos(orderInfos);
+		return queryChargeOrderInfoResult;
+	}
+	
+	
+	
+	/*********************数据监管平台接口*********************/
+	/**
+	 * 查询运营商信息
+	 * @param baseRequest
+	 * @param request
+	 * @return
+	 */
+	@PostMapping("/supervise_query_operator_info")
+	public BaseResult superviseQueryOperatorInfo(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		//解密参数
+		String decrypt = AESUtil.decrypt(baseRequest.getData(), OurDataSecret, OurDataSecretIV);
+		log.info("监管平台查询充电站信息请求Data:" + decrypt);
+		SuperviseQueryOperatorInfo superviseQueryOperatorInfo = JSON.parseObject(decrypt, SuperviseQueryOperatorInfo.class);
+		Integer pageNo = superviseQueryOperatorInfo.getPageNo();
+		Integer pageSize = superviseQueryOperatorInfo.getPageSize();
+		if(null == pageNo){
+			pageNo = 1;
+		}
+		if(null == pageSize){
+			pageSize = 50;
+		}
+		String operatorTel = systemConfigurationClient.getServerPhone().getData();
+		SuperviseQueryOperatorInfoResultPage superviseQueryOperatorInfoResultPage = new SuperviseQueryOperatorInfoResultPage();
+		superviseQueryOperatorInfoResultPage.setPageNo(1);
+		superviseQueryOperatorInfoResultPage.setPageCount(1);
+		superviseQueryOperatorInfoResultPage.setItemSize(1);
+
+		SuperviseQueryOperatorInfoResult superviseQueryOperatorInfoResult = new SuperviseQueryOperatorInfoResult();
+		superviseQueryOperatorInfoResult.setOperatorID("906171535");
+		superviseQueryOperatorInfoResult.setOperatorUSCID("91510903906171535D");
+		superviseQueryOperatorInfoResult.setOperatorName("四川明星新能源科技有限公司");
+		superviseQueryOperatorInfoResult.setOperatorTel1(operatorTel);
+		List<SuperviseQueryOperatorInfoResult> superviseQueryOperatorInfoResults = new ArrayList<>();
+		superviseQueryOperatorInfoResults.add(superviseQueryOperatorInfoResult);
+		// 将superviseQueryOperatorInfoResults转化为json数组
+		superviseQueryOperatorInfoResultPage.setOperatorInfos(superviseQueryOperatorInfoResults);
+		String jsonString = JacksonUtils.toJson(superviseQueryOperatorInfoResultPage);
+		String timeStamp = System.currentTimeMillis() + "";
+		SequenceGenerator generator = new SequenceGenerator();
+		String nextSequence = generator.getNextSequence();
+		// 使用 Jackson 转换为 JSON
+		ObjectMapper objectMapper = new ObjectMapper();
+		objectMapper.enable(MapperFeature.USE_ANNOTATIONS); // 启用注解支持
+		String json = null;
+		try {
+			json = objectMapper.writeValueAsString(superviseQueryOperatorInfoResultPage);
+		} catch (JsonProcessingException e) {
+			throw new RuntimeException(e);
+		}
+		String data = AesEncryption.encrypt(OurDataSecret, OurDataSecretIV,json);
+		String hmacMD5 = HMacMD5Util.getHMacMD5(OperatorID,timeStamp, data,nextSequence,OurSigSecret);
+		BaseResult baseResult = new BaseResult();
+		baseResult.setData(data);
+		baseResult.setSig(hmacMD5);
+		baseResult.setRet(0);
+		baseResult.setMsg("OK");
+		Long mapKey = Long.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
+		baseResult.setTimeStamp(mapKey);
+		baseResult.setSeq("0001");
+		baseResult.setOperatorID(OperatorID);
+		return baseResult;
+	}
+
+
+	
+	/**
+	 * 查询充电站信息
+	 * @param baseRequest
+	 * @param request
+	 * @return
+	 */
+	@PostMapping("/supervise_query_stations_info")
+	public BaseResult superviseQueryStationsInfo(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		String decrypt = AESUtil.decrypt(baseRequest.getData(), OurDataSecret, OurDataSecretIV);
+		log.info("监管平台supervise_query_stations_infoData:" + 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;
+		}
+		if(null == pageSize){
+			pageSize = 50;
+		}
+		if(stationIDs==null){
+			stationIDs = new ArrayList<String>();
+		}
+		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()));
+		for (StationInfo stationInfo : queryStationsInfoResult.getStationInfos()) {
+			stationInfo.setStationClassification(stationInfo.getStationClassification()==null?1:stationInfo.getStationClassification());
+			stationInfo.setGeneralApplicationType(stationInfo.getGeneralApplicationType()==null?1:stationInfo.getGeneralApplicationType());
+			stationInfo.setSiteGuide(org.springframework.util.StringUtils.hasLength(stationInfo.getSiteGuide()) ?stationInfo.getSiteGuide():"站点引导");
+			if (stationInfo.getConstruction()!=null){
+				stationInfo.setConstruction(stationInfo.getConstruction() == 0 ? ConstructionEnum.OTHER.getType() : stationInfo.getConstruction());
+			}else{
+				stationInfo.setConstruction(255);
+			}
+			stationInfo.setRoundTheClock(stationInfo.getRoundTheClock()==null?1:stationInfo.getRoundTheClock());
+			stationInfo.setParkType(stationInfo.getParkType()==null?1:stationInfo.getParkType());
+			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(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;
+			for (EquipmentInfo equipmentInfo : stationInfo.getEquipmentInfos()) {
+				i++;
+				equipmentInfo.setManufacturerID("906171534");
+				equipmentInfo.setEquipmentUniqueNumber(org.springframework.util.StringUtils.hasLength(equipmentInfo.getEquipmentUniqueNumber())?equipmentInfo.getEquipmentUniqueNumber():"OIX123"+i);
+				equipmentInfo.setManufacturerName(org.springframework.util.StringUtils.hasLength(equipmentInfo.getManufacturerName())?equipmentInfo.getManufacturerName():"生产商");
+				equipmentInfo.setEquipmentModel(org.springframework.util.StringUtils.hasLength(equipmentInfo.getEquipmentModel())?equipmentInfo.getEquipmentModel():"DEVICE"+i);
+				equipmentInfo.setProductionDate(org.springframework.util.StringUtils.hasLength(equipmentInfo.getProductionDate())?equipmentInfo.getProductionDate():"2024-01-01");
+				equipmentInfo.setEquipmentType(equipmentInfo.getEquipmentType()==null?1:equipmentInfo.getEquipmentType());
+				for (ConnectorInfo connectorInfo : equipmentInfo.getConnectorInfos()) {
+					connectorInfo.setEquipmentClassification(connectorInfo.getEquipmentClassification()==null?1:connectorInfo.getEquipmentClassification());
+					connectorInfo.setVoltageUpperLimits(connectorInfo.getConstantVoltageUpperLimits()==null?new BigDecimal("1.0000"):connectorInfo.getConstantVoltageUpperLimits());
+					connectorInfo.setVoltageLowerLimits(connectorInfo.getConstantVoltageLowerLimits()==null?new BigDecimal("1.0000"):connectorInfo.getConstantVoltageLowerLimits());
+					connectorInfo.setCurrent(connectorInfo.getCurrent()==null?1:connectorInfo.getCurrent());
+					connectorInfo.setPower(connectorInfo.getPower()==null?new BigDecimal("1.0000"):connectorInfo.getPower());
+					connectorInfo.setNationalStandard(connectorInfo.getNationalStandard()==null?1:connectorInfo.getNationalStandard());
+					connectorInfo.setAuxPower(connectorInfo.getAuxPower()==null?1:connectorInfo.getAuxPower());
+					connectorInfo.setOpreateStatus(connectorInfo.getOpreateStatus()==null?50:connectorInfo.getOpreateStatus());
+				}
+				equipmentInfo.setPower(equipmentInfo.getPower()==null?new BigDecimal("1.0000"):equipmentInfo.getPower());
+				equipmentInfo.setEquipmentClassification(equipmentInfo.getEquipmentClassification()==null?1:equipmentInfo.getEquipmentClassification());
+
+			}
+			stationInfo.setEquipmentOwnerName("明星新能源");
+			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("-", ""); // 去除'-'
+			if (org.springframework.util.StringUtils.hasLength(stationInfo.getRecordUniqueNo())){
+				stationInfo.setRecordUniqueNo(stationInfo.getRecordUniqueNo());
+			}else{
+				stationInfo.setRecordUniqueNo(randomString);
+			}
+		}
+		String timeStamp = System.currentTimeMillis() + "";
+		SequenceGenerator generator = new SequenceGenerator();
+		String nextSequence = generator.getNextSequence();
+		// 使用 Jackson 转换为 JSON
+		ObjectMapper objectMapper = new ObjectMapper();
+		objectMapper.enable(MapperFeature.USE_ANNOTATIONS); // 启用注解支持
+        String json = null;
+        try {
+            json = objectMapper.writeValueAsString(queryStationsInfoResult);
+        } catch (JsonProcessingException e) {
+            throw new RuntimeException(e);
+        }
+        String data = AesEncryption.encrypt(OurDataSecret, OurDataSecretIV,json);
+		String hmacMD5 = HMacMD5Util.getHMacMD5(OurOperatorID,timeStamp, data,nextSequence,OurSigSecret);
+		BaseResult baseResult = new BaseResult();
+		baseResult.setData(data);
+		baseResult.setSig(hmacMD5);
+		baseResult.setRet(0);
+		baseResult.setMsg("OK");
+		Long mapKey = Long.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
+		baseResult.setTimeStamp(mapKey);
+		baseResult.setSeq("0001");
+		baseResult.setOperatorID("906171535");
+		return baseResult;
+	}
+
+
+
+	/**
+	 * 查询充换电站状态信息
+	 * @param baseRequest
+	 * @param request
+	 * @return
+	 */
+	@PostMapping("/supervise_query_station_status")
+	public BaseResult superviseQueryStationStatus(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		log.info("监管平台查询充换电站状态信息请求参数:" + JacksonUtils.toJson(baseRequest));
+		String decrypt = AESUtil.decrypt(baseRequest.getData(), OurDataSecret, OurDataSecretIV);
+		log.info("监管平台supervise_query_station_statusData:" + decrypt);
+		//解密参数
+		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));
+		}
+
+		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(operatorId);
+					stationStatusInfo.setStationID(String.valueOf(stationID));
+					List<ConnectorStatusInfo> connectorStatusInfos = new ArrayList<>();
+					for (TChargingGun chargingGun : chargingGuns) {
+						ConnectorStatusInfo connectorStatusInfo = new ConnectorStatusInfo();
+						connectorStatusInfo.setOperatorID(operatorId);
+						connectorStatusInfo.setEquipmentOwnerID(operatorId);
+						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()));
+						connectorStatusInfos.add(connectorStatusInfo);
+					}
+					stationStatusInfo.setConnectorStatusInfos(connectorStatusInfos);
+					stationStatusInfos.add(stationStatusInfo);
+				}
+			}
+			queryStationStatusResult.setStationStatusInfos(stationStatusInfos);
+		}
+		String timeStamp = System.currentTimeMillis() + "";
+		SequenceGenerator generator = new SequenceGenerator();
+		String nextSequence = generator.getNextSequence();
+		// 使用 Jackson 转换为 JSON
+		ObjectMapper objectMapper = new ObjectMapper();
+		objectMapper.enable(MapperFeature.USE_ANNOTATIONS); // 启用注解支持
+		String json = null;
+		try {
+			json = objectMapper.writeValueAsString(queryStationStatusResult);
+		} catch (JsonProcessingException e) {
+			throw new RuntimeException(e);
+		}
+		String data = AesEncryption.encrypt(OurDataSecret, OurDataSecretIV,json);
+		String hmacMD5 = HMacMD5Util.getHMacMD5(OurOperatorID,timeStamp, data,nextSequence,OurSigSecret);
+		BaseResult baseResult = new BaseResult();
+		baseResult.setData(data);
+		baseResult.setSig(hmacMD5);
+		baseResult.setRet(0);
+		baseResult.setMsg("OK");
+		Long mapKey = Long.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
+		baseResult.setTimeStamp(mapKey);
+		baseResult.setSeq("0001");
+		baseResult.setOperatorID("906171535");
+		return baseResult;
+	}
+
+	// 测试环境
+	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 OurDataSecret = "50a61b93919c9605";
+	private static final String OurDataSecretIV = "7c8ac6861661d585";
+	private static final String OurSigSecret = "a6fedf0e1b27d6f6";
+	private static final String OurOperatorID = "MA01H3BQ3";
+	private static final String OurOperatorSecret = "f1331ef0b37c2d1a";
+
+
+
+
+	/**
+	 * 推送充电设备接口状态信息
+	 * @param chargingGun
+	 * @return
+	 */
+	public R pushSuperviseNotificationStationStatus(TChargingGun chargingGun){
+		ConnectorStatusInfo connectorStatusInfo = new ConnectorStatusInfo();
+		connectorStatusInfo.setOperatorID(operatorId);
+		connectorStatusInfo.setEquipmentOwnerID(operatorId);
+		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(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(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());
+
+		tcecSuperviseUtil.notificationSupEquipChargeStatus(new Operator(), supEquipChargeStatus);
+		return R.ok();
+	}
+	/**
+	 * 推送充电订单信息
+	 * @param chargingOrder
+	 * @return
+	 */
+	public R pushSuperviseNotificationChargeOrderInfo(TChargingOrder chargingOrder){
+		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());
+		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);
+		return R.ok();
+	}
+
+
+	/**
+	 * 推送充换电站信息
+	 * @param id
+	 * @return
+	 */
+	@PostMapping("/supervise_notification_station_info")
+	public R superviseNotificationStationInfo(@RequestParam("id") Integer id){
+		String serviceTel = systemConfigurationClient.getServerPhone().getData();
+		Site site = siteClient.getSiteAll().getData().stream().filter(e -> e.getId().equals(id)).findFirst().orElse(new Site());
+		List<Site> sites = new ArrayList<>();
+		sites.add(site);
+
+		List<TParkingLot> parkingLots = parkingLotClient.getAllParkingLot().getData();
+		QueryStationsInfoResult queryStationsInfoResult = new QueryStationsInfoResult();
+		queryStationsInfoResult.setStationInfos(buildSite(parkingLots, sites));
+		for (StationInfo stationInfo : queryStationsInfoResult.getStationInfos()) {
+			stationInfo.setStationClassification(stationInfo.getStationClassification()==null?1:stationInfo.getStationClassification());
+			stationInfo.setGeneralApplicationType(stationInfo.getGeneralApplicationType()==null?1:stationInfo.getGeneralApplicationType());
+			stationInfo.setSiteGuide(org.springframework.util.StringUtils.hasLength(stationInfo.getSiteGuide()) ?stationInfo.getSiteGuide():"站点引导");
+			if (stationInfo.getConstruction()!=null){
+				stationInfo.setConstruction(stationInfo.getConstruction() == 0 ? ConstructionEnum.OTHER.getType() : stationInfo.getConstruction());
+			}else{
+				stationInfo.setConstruction(255);
+			}
+			stationInfo.setRoundTheClock(stationInfo.getRoundTheClock()==null?1:stationInfo.getRoundTheClock());
+			stationInfo.setRoundTheClock(0);
+			stationInfo.setParkType(stationInfo.getParkType()==null?1:stationInfo.getParkType());
+			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());
+			stationInfo.setRatedPower(stationInfo.getCapacity()==null?new BigDecimal("40.0000"):stationInfo.getCapacity());
+			stationInfo.setPeriodFee(1);
+			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;
+			for (EquipmentInfo equipmentInfo : stationInfo.getEquipmentInfos()) {
+				i++;
+				equipmentInfo.setManufacturerID("906171534");
+				equipmentInfo.setEquipmentUniqueNumber(org.springframework.util.StringUtils.hasLength(equipmentInfo.getEquipmentUniqueNumber())?equipmentInfo.getEquipmentUniqueNumber():"OIX123"+i);
+				equipmentInfo.setManufacturerName(org.springframework.util.StringUtils.hasLength(equipmentInfo.getManufacturerName())?equipmentInfo.getManufacturerName():"生产商");
+				equipmentInfo.setEquipmentModel(org.springframework.util.StringUtils.hasLength(equipmentInfo.getEquipmentModel())?equipmentInfo.getEquipmentModel():"DEVICE"+i);
+				equipmentInfo.setProductionDate(org.springframework.util.StringUtils.hasLength(equipmentInfo.getProductionDate())?equipmentInfo.getProductionDate():"2024-01-01");
+				equipmentInfo.setEquipmentType(equipmentInfo.getEquipmentType()==null?1:equipmentInfo.getEquipmentType());
+				for (ConnectorInfo connectorInfo : equipmentInfo.getConnectorInfos()) {
+					connectorInfo.setEquipmentClassification(connectorInfo.getEquipmentClassification()==null?1:connectorInfo.getEquipmentClassification());
+					connectorInfo.setVoltageUpperLimits(connectorInfo.getConstantVoltageUpperLimits()==null?new BigDecimal("1.0000"):connectorInfo.getConstantVoltageUpperLimits());
+					connectorInfo.setVoltageLowerLimits(connectorInfo.getConstantVoltageLowerLimits()==null?new BigDecimal("1.0000"):connectorInfo.getConstantVoltageLowerLimits());
+					connectorInfo.setCurrent(connectorInfo.getCurrent()==null?1:connectorInfo.getCurrent());
+					connectorInfo.setPower(connectorInfo.getPower()==null?new BigDecimal("1.0000"):connectorInfo.getPower());
+					connectorInfo.setNationalStandard(connectorInfo.getNationalStandard()==null?1:connectorInfo.getNationalStandard());
+					connectorInfo.setAuxPower(connectorInfo.getAuxPower()==null?1:connectorInfo.getAuxPower());
+					connectorInfo.setOpreateStatus(connectorInfo.getOpreateStatus()==null?50:connectorInfo.getOpreateStatus());
+				}
+				equipmentInfo.setPower(equipmentInfo.getPower()==null?new BigDecimal("1.0000"):equipmentInfo.getPower());
+				equipmentInfo.setEquipmentClassification(equipmentInfo.getEquipmentClassification()==null?1:equipmentInfo.getEquipmentClassification());
+
+			}
+			if (org.springframework.util.StringUtils.hasLength(site.getEquipmentOwnerName())){
+				stationInfo.setEquipmentOwnerName(site.getEquipmentOwnerName());
+			}else{
+				stationInfo.setEquipmentOwnerName("明星新能源");
+
+			}
+			if (org.springframework.util.StringUtils.hasLength(site.getResidentNo())){
+				stationInfo.setResidentNo(site.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("-", ""); // 去除'-'
+			if (org.springframework.util.StringUtils.hasLength(site.getRecordUniqueNo())){
+				stationInfo.setRecordUniqueNo(site.getRecordUniqueNo());
+			}else{
+				stationInfo.setRecordUniqueNo("A123998987hjn4");
+
+			}
+
+		}
+		BaseResult baseResult = new BaseResult();
+		SupStationInfoResult supStationInfoResult = new SupStationInfoResult();
+		supStationInfoResult.setSupStationInfo(queryStationsInfoResult.getStationInfos().get(0));
+		tcecSuperviseUtil.superviseNotificationStationInfo(supStationInfoResult);
+		return R.ok(baseResult);
+	}
+//
+//
+//	/**
+//	 * 构建站点数据
+//	 * @param sites
+//	 * @return
+//	 */
+//	public List<StationInfo> superviseBuildSite(List<TParkingLot> parkingLots, List<Site> sites){
+//		List<Integer> siteIds = sites.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();
+//		String serviceTel = systemConfigurationClient.getServerPhone().getData();
+//		List<StationInfo> StationInfos = new ArrayList<>();
+//		for (Site datum : sites) {
+//			StationInfo stationInfo = new StationInfo();
+//			stationInfo.setStationID(datum.getId().toString());
+//			stationInfo.setStationUniqueNumber(datum.getDistrictsCode() + "906171535" + datum.getId());
+//			stationInfo.setOperatorID("906171535");
+//			stationInfo.setEquipmentOwnerID("906171535");
+//			stationInfo.setStationName(datum.getName());
+//			stationInfo.setCountryCode(StringUtils.isNotEmpty(datum.getCountryCode()) ? datum.getCountryCode() : "CN");
+//			stationInfo.setAreaCode(datum.getDistrictsCode());
+//			stationInfo.setAreaCodeCountryside();
+//			stationInfo.setAddress(datum.getAddress());
+//			stationInfo.setStationTel(datum.getPhone());
+//			stationInfo.setServiceTel(serviceTel);
+//			switch (datum.getSiteType()){
+//				case 0:
+//					stationInfo.setStationType(StationTypeEnum.OTHER.getType());
+//					break;
+//				case 1:
+//					stationInfo.setStationType(StationTypeEnum.PUBLIC.getType());
+//					break;
+//				case 2:
+//					stationInfo.setStationType(StationTypeEnum.PERSONAGE.getType());
+//					break;
+//				case 3:
+//					stationInfo.setStationType(StationTypeEnum.BUS_SPECIFIC.getType());
+//					break;
+//				case 4:
+//					stationInfo.setStationType(StationTypeEnum.SANITATION_SPECIFIC.getType());
+//					break;
+//				case 5:
+//					stationInfo.setStationType(StationTypeEnum.LOGISTICS_SPECIFIC.getType());
+//					break;
+//				case 6:
+//					stationInfo.setStationType(StationTypeEnum.TEXT_SPECIFIC.getType());
+//					break;
+//			}
+//			if(datum.getStatus() == 1){
+//				stationInfo.setStationStatus(StationStatusEnum.NORMAL_USE.getStatus());
+//			}
+//			if(datum.getStatus() == 2){
+//				stationInfo.setStationStatus(StationStatusEnum.MAINTAIN.getStatus());
+//			}
+//			if(datum.getStatus() == 3){
+//				stationInfo.setStationStatus(StationStatusEnum.OFF_LINE.getStatus());
+//			}
+//			stationInfo.setParkNums(datum.getParkingSpace());
+//			stationInfo.setStationLat(new BigDecimal(datum.getLat()).setScale(6, RoundingMode.DOWN));
+//			stationInfo.setStationLng(new BigDecimal(datum.getLon()).setScale(6, RoundingMode.DOWN));
+//			stationInfo.setConstruction(datum.getConstructionSite() == 0 ? ConstructionEnum.OTHER.getType() : datum.getConstructionSite());
+//			stationInfo.setPictures(StringUtils.isNotEmpty(datum.getImgUrl()) ? Arrays.asList(datum.getImgUrl().split(",")) : new ArrayList<>());
+//			stationInfo.setSiteGuide(datum.getGuide());
+//			stationInfo.setMatchCars(datum.getVehicleDescription());
+//			stationInfo.setBusineHours(datum.getStartServiceTime() + "-" + datum.getEndServiceTime());
+//			stationInfo.setElectricityFee(datum.getRateDescription());
+//			//添加停车费信息
+//			Optional<TParkingLot> first = parkingLots.stream().filter(s -> s.getSiteId().equals(datum.getId())).findFirst();
+//			if(first.isPresent()){
+//				TParkingLot tParkingLot = first.get();
+//				superviseBuildPlaceHolder(tParkingLot, stationInfo);
+//			}
+//
+//			//构建充电设备信息数据
+//			stationInfo.setEquipmentInfos(superviseBuildEquipmentInfo(datum.getId(), tChargingPiles, chargingGunList));
+//			StationInfos.add(stationInfo);
+//
+//		}
+//		return StationInfos;
+//	}
+//
+//
+//	/**
+//	 * 构建停车费信息
+//	 * @param tParkingLot
+//	 * @param stationInfo
+//	 */
+//	public void superviseBuildPlaceHolder(TParkingLot tParkingLot, StationInfo stationInfo){
+//		stationInfo.setOvertimeFee(tParkingLot.getName() + "停车费");
+//		PlaceHolder placeHolder = new PlaceHolder();
+//		placeHolder.setFreeTime(tParkingLot.getChargeFreeDuration());
+//		placeHolder.setMaxFee(tParkingLot.getChargeCapping());
+//		List<PlaceHolderPrice> PlaceHolderPrices = new ArrayList<>();
+//		PlaceHolderPrice placeHolderPrice = new PlaceHolderPrice();
+//		placeHolderPrice.setStartTime("00:00");
+//		placeHolderPrice.setEndTime("23:59");
+//		placeHolderPrice.setPrice(tParkingLot.getChargeRate());
+//		PlaceHolderPrices.add(placeHolderPrice);
+//		placeHolder.setPlaceHolderPrices(PlaceHolderPrices);
+//		stationInfo.setPlaceHolder(placeHolder);
+//	}
+//
+//
+//
+//
+//	/**
+//	 * 构建桩数据
+//	 * @param tChargingPiles
+//	 * @return
+//	 */
+//	public List<EquipmentInfo> superviseBuildEquipmentInfo(Integer siteId, List<TChargingPile> tChargingPiles, List<TChargingGun> chargingGunList){
+//		List<EquipmentInfo> equipmentInfos = new ArrayList<>();
+//		List<TChargingPile> collect = tChargingPiles.stream().filter(s -> s.getSiteId().equals(siteId)).collect(Collectors.toList());
+//		for (TChargingPile tChargingPile : collect) {
+//			EquipmentInfo equipmentInfo = new EquipmentInfo();
+//			equipmentInfo.setEquipmentID(tChargingPile.getId().toString());
+//			equipmentInfo.setManufacturerID(tChargingPile.getManufacturerCode());
+//			equipmentInfo.setManufacturerName(tChargingPile.getManufacturer());
+//			equipmentInfo.setEquipmentModel(tChargingPile.getEquipmentType());
+//			if(null != tChargingPile.getProductionDate()){
+//				equipmentInfo.setProductionDate(tChargingPile.getProductionDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+//			}
+//			switch (tChargingPile.getType()){
+//				case 0:
+//					equipmentInfo.setEquipmentType(EquipmentTypeEnum.OTHER.getType());
+//					break;
+//				case 1:
+//					equipmentInfo.setEquipmentType(EquipmentTypeEnum.DIRECT_CURRENT.getType());
+//					break;
+//				case 2:
+//					equipmentInfo.setEquipmentType(EquipmentTypeEnum.ALTERNATING_CURRENT.getType());
+//					break;
+//				case 3:
+//					equipmentInfo.setEquipmentType(EquipmentTypeEnum.ALTERNATING_DIRECT.getType());
+//					break;
+//				case 4:
+//					equipmentInfo.setEquipmentType(EquipmentTypeEnum.WIRELESS_DEVICE.getType());
+//					break;
+//			}
+//
+//			//构建设备接口信息
+//			equipmentInfo.setConnectorInfos(superviseBuildConnectorInfos(tChargingPile.getId(), tChargingPile.getCode(), chargingGunList));
+//			equipmentInfo.setPower(tChargingPile.getRatedPower());
+//			equipmentInfos.add(equipmentInfo);
+//		}
+//		return equipmentInfos;
+//	}
+//
+//
+//	/**
+//	 * 构建接口数据
+//	 * @param chargingGunList
+//	 * @return
+//	 */
+//	public List<ConnectorInfo> superviseBuildConnectorInfos(Integer chargingPileId, String code, List<TChargingGun> chargingGunList){
+//		List<ConnectorInfo> connectorInfos = new ArrayList<>();
+//		List<TChargingGun> collect = chargingGunList.stream().filter(s -> s.getChargingPileId().equals(chargingPileId)).collect(Collectors.toList());
+//		for (TChargingGun chargingGun : collect) {
+//			ConnectorInfo connectorInfo = new ConnectorInfo();
+//			connectorInfo.setConnectorID(chargingGun.getFullNumber());
+//			connectorInfo.setConnectorName(chargingGun.getName());
+//			switch (chargingGun.getType()){
+//				case 0:
+//					connectorInfo.setConnectorType(ConnectorTypeEnum.OTHER.getType());
+//					break;
+//				case 1:
+//					connectorInfo.setConnectorType(ConnectorTypeEnum.HOUSEHOLD_SOCKET.getType());
+//					break;
+//				case 2:
+//					connectorInfo.setConnectorType(ConnectorTypeEnum.AC_SOCKET.getType());
+//					break;
+//				case 3:
+//					connectorInfo.setConnectorType(ConnectorTypeEnum.AC_INTERFACE_PLUG.getType());
+//					break;
+//				case 4:
+//					connectorInfo.setConnectorType(ConnectorTypeEnum.DC_INTERFACE_GUN_HEAD.getType());
+//					break;
+//				case 5:
+//					connectorInfo.setConnectorType(ConnectorTypeEnum.WIRELESS_CHARGING_STAND.getType());
+//					break;
+//			}
+//			connectorInfo.setVoltageUpperLimits(chargingGun.getUpperRatedVoltage().intValue());
+//			connectorInfo.setVoltageLowerLimits(chargingGun.getLowerLimitOfRatedVoltage().intValue());
+//			connectorInfo.setCurrent(chargingGun.getRatedCurrent().intValue());
+//			connectorInfo.setPower(chargingGun.getRatedPower());
+//			connectorInfo.setParkNo(chargingGun.getParkingNumber());
+//			connectorInfo.setNationalStandard(Integer.valueOf(chargingGun.getNationalStandard()));
+//			connectorInfo.setQRCode("https://mxcd.zhinenganguan.com?No=" + code + chargingGun.getCode());
+//			connectorInfos.add(connectorInfo);
+//		}
+//		return connectorInfos;
+//	}
+	
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/TaskUtil.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/TaskUtil.java
new file mode 100644
index 0000000..3df2601
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/TaskUtil.java
@@ -0,0 +1,211 @@
+package com.ruoyi.integration.drainage.util;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.chargingPile.api.feignClient.*;
+import com.ruoyi.chargingPile.api.model.Site;
+import com.ruoyi.chargingPile.api.model.TChargingGun;
+import com.ruoyi.chargingPile.api.model.TChargingPile;
+import com.ruoyi.common.core.utils.DateUtils;
+import com.ruoyi.integration.drainage.TCECSuperviseUtil;
+import com.ruoyi.integration.drainage.TokenUtil;
+import com.ruoyi.integration.drainage.model.*;
+import com.ruoyi.integration.drainage.model.enu.ConnectorTypeEnum;
+import com.ruoyi.integration.drainage.model.enu.EquipmentTypeEnum;
+import com.ruoyi.integration.mongodb.service.UploadRealTimeMonitoringDataService;
+import com.ruoyi.order.api.dto.ChargingStatisticeDTO;
+import com.ruoyi.order.api.feignClient.ChargingOrderAccountingStrategyClient;
+import com.ruoyi.order.api.feignClient.ChargingOrderClient;
+import com.ruoyi.order.api.model.TChargingBill;
+import com.ruoyi.order.api.model.TChargingOrder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author zhibing.pu
+ * @date 2023/7/11 8:39
+ */
+@Component
+public class TaskUtil {
+
+
+    @Resource
+    private SiteClient siteClient;
+    @Autowired
+    private TCECSuperviseUtil tcecSuperviseUtil;
+
+    @Resource
+    private ChargingGunClient chargingGunClient;
+
+    @Resource
+    private ChargingOrderClient chargingOrderClient;
+
+    @Resource
+    private ChargingPileClient chargingPileClient;
+
+    // 每天凌晨12点30执行 推送充电用能统计
+    @Scheduled(cron = "0 30 0 * * ?")
+    public void superviseNotificationOperationStatsInfo() {
+        StationStatsInfoResult res = new StationStatsInfoResult();
+        int dayOfMonth1 = LocalDateTime.now().getYear();
+        int dayOfMonth2 = LocalDateTime.now().getMonthValue();
+        int dayOfMonth3 = LocalDateTime.now().getDayOfMonth();
+        List<Site> data = siteClient.getSiteAll().getData();
+        LocalDateTime startLocalDateTime = LocalDateTime.of(dayOfMonth1, dayOfMonth2, dayOfMonth3, 0, 0, 0);
+        LocalDateTime endLocalDateTime = LocalDateTime.of(dayOfMonth1, dayOfMonth2, dayOfMonth3, 23, 59, 59);
+        String start = DateUtils.localDateTimeToString(startLocalDateTime);
+        String end = DateUtils.localDateTimeToString(endLocalDateTime);
+        ChargingStatisticeDTO chargingStatisticeDTO = new ChargingStatisticeDTO();
+        chargingStatisticeDTO.setStartTime(startLocalDateTime);
+        chargingStatisticeDTO.setEndTime(endLocalDateTime);
+        List<TChargingOrder> data1 = chargingOrderClient.getChargingStatistics(chargingStatisticeDTO).getData();
+        List<StationStatsInfo> stationStatsInfos = new ArrayList<>();
+        for (Site datum : data) {
+            StationStatsInfo stationStatsInfo = new StationStatsInfo();
+            stationStatsInfo.setStationID(datum.getId().toString());
+            stationStatsInfo.setEquipmentOwnerID("906171535");
+            stationStatsInfo.setOperatorID("906171535");
+            stationStatsInfo.setStationClassification(1);
+            stationStatsInfo.setStartTime(start);
+            stationStatsInfo.setEndTime(end);
+            List<TChargingOrder> chargingOrders = data1.stream().filter(e -> e.getSiteId().equals(datum.getId())).collect(Collectors.toList());
+            // 充电电量
+            BigDecimal electricity = new BigDecimal("0");
+            int chargingCount = 0;
+            for (TChargingOrder chargingOrder : chargingOrders) {
+                if (chargingOrder.getElectricity()!=null){
+                    electricity = electricity.add(chargingOrder.getElectricity());
+                    chargingCount++;
+                }
+            }
+            stationStatsInfo.setStationElectricity(electricity.divide(new BigDecimal("24")).setScale(4, BigDecimal.ROUND_DOWN));
+            stationStatsInfo.setStationTotalChargeEnergy(electricity.setScale(4, BigDecimal.ROUND_DOWN));
+            stationStatsInfo.setStationTotalWarningNum(0);
+            stationStatsInfo.setStationTotalOtherEnergy(new BigDecimal("0"));
+            stationStatsInfo.setStationTotalChargeNum(chargingCount);
+            //构建设备统计数据
+            List<EquipmentStatsInfo> EquipmentStatsInfos = new ArrayList<>();
+            Map<Integer, List<TChargingOrder>> collect = chargingOrders.stream().collect(Collectors.groupingBy(TChargingOrder::getChargingPileId));
+            for (Integer integer : collect.keySet()) {
+                List<TChargingOrder> tChargingOrders = collect.get(integer);
+                BigDecimal reduce1 = tChargingOrders.stream().map(TChargingOrder::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
+                EquipmentStatsInfo equipmentStatsInfo = new EquipmentStatsInfo();
+                equipmentStatsInfo.setEquipmentClassification(1);
+                long chargingTime = 0L;
+                for (TChargingOrder tChargingOrder : tChargingOrders) {
+                    // 累加充电时长
+                    LocalDateTime startTime = tChargingOrder.getStartTime();
+                    LocalDateTime endTime = tChargingOrder.getEndTime();
+                    // 计算时间差 单位分钟
+                    chargingTime += ChronoUnit.SECONDS.between(startTime, endTime)/60;
+                }
+                equipmentStatsInfo.setEquipmentTotalChargeTime(chargingTime);
+                equipmentStatsInfo.setEquipmentTotalChargeNum(tChargingOrders.size());
+                equipmentStatsInfo.setEquipmentTotalWarningNum(0);
+                equipmentStatsInfo.setEquipmentID(integer.toString());
+                equipmentStatsInfo.setEquipmentElectricity(reduce1);
+                //构建设备接口统计数据
+                Map<Integer, List<TChargingOrder>> collect2 = tChargingOrders.stream().collect(Collectors.groupingBy(TChargingOrder::getChargingGunId));
+                List<ConnectorStatsInfo> ConnectorStatsInfos = new ArrayList<>();
+                for (Integer integer1 : collect2.keySet()) {
+                    List<TChargingOrder> tChargingOrders1 = collect2.get(integer1);
+                    BigDecimal reduce2 = tChargingOrders1.stream().map(TChargingOrder::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
+
+                    TChargingGun chargingGun = chargingGunClient.getChargingGunById(integer1).getData();
+                    ConnectorStatsInfo connectorStatsInfo = new ConnectorStatsInfo();
+                    connectorStatsInfo.setConnectorID(chargingGun.getFullNumber());
+                    connectorStatsInfo.setConnectorElectricity(reduce2);
+                    ConnectorStatsInfos.add(connectorStatsInfo);
+                }
+                equipmentStatsInfo.setConnectorStatsInfos(ConnectorStatsInfos);
+                EquipmentStatsInfos.add(equipmentStatsInfo);
+            }
+            stationStatsInfo.setEquipmentStatsInfos(EquipmentStatsInfos);
+            stationStatsInfos.add(stationStatsInfo);
+        }
+        res.setStationStatsInfos(stationStatsInfos);
+        tcecSuperviseUtil.superviseNotificationOperationStatsInfo(res);
+    }
+    // 每15分钟执行一次的定时任务
+    @Scheduled(cron = "0 0/15 * * * ?")
+    public void supervise_notification_realtime_power_info() {
+        List<Site> data = siteClient.getSiteAll().getData();
+        List<Integer> siteIds = data.stream().map(Site::getId).collect(Collectors.toList());
+        List<TChargingPile> tChargingPiles = chargingPileClient.getChargingPileBySiteIds(siteIds).getData();
+        List<Integer> collect1 = tChargingPiles.stream().map(TChargingPile::getId).collect(Collectors.toList());
+        List<TChargingGun> chargingGunList = chargingGunClient.getChargingGunByChargingPileIds(collect1).getData();
+        SupStationPowerInfoResult supStationPowerInfoResult = new SupStationPowerInfoResult();
+        List<SupStationPowerInfo> stationStatsInfos = new ArrayList<>();
+        LocalDateTime now = LocalDateTime.now();
+        LocalDateTime startLocalDateTime = now.minusMinutes(15);
+        ChargingStatisticeDTO chargingStatisticeDTO = new ChargingStatisticeDTO();
+        chargingStatisticeDTO.setStartTime(startLocalDateTime);
+        chargingStatisticeDTO.setEndTime(now);
+        List<TChargingOrder> data1 = chargingOrderClient.getChargingStatistics(chargingStatisticeDTO).getData();
+        for (Site datum : data) {
+            List<TChargingOrder> collect = data1.stream().filter(e -> e.getSiteId().equals(datum.getId())
+            &&e.getChargingPower()!=null).collect(Collectors.toList());
+            SupStationPowerInfo supStationPowerInfo = new SupStationPowerInfo();
+            supStationPowerInfo.setOperatorID("906171535");
+            supStationPowerInfo.setEquipmentOwnerID("906171535");
+            supStationPowerInfo.setStationID(datum.getId().toString());
+            supStationPowerInfo.setStationClassification(1);
+            supStationPowerInfo.setDataTime(DateUtils.localDateTimeToString(LocalDateTime.now()));
+            BigDecimal divide = collect.stream().map(TChargingOrder::getChargingPower).reduce(BigDecimal::add).get().divide(new BigDecimal(collect.size()).setScale(4, BigDecimal.ROUND_DOWN));
+            supStationPowerInfo.setStationRealTimePower(divide);
+            supStationPowerInfo.setEquipmentPowerInfos(buildEquipmentPowerInfo(datum.getId(), tChargingPiles, chargingGunList));
+            stationStatsInfos.add(supStationPowerInfo);
+        }
+        supStationPowerInfoResult.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;
+    }
+    /**
+     * 构建接口数据
+     * @param chargingGunList
+     * @return
+     */
+    public List<SupConnectorPowerInfo> buildConnectorPowerInfos(Integer chargingPileId, String code, List<TChargingGun> chargingGunList){
+        List<SupConnectorPowerInfo> connectorInfos = new ArrayList<>();
+        List<TChargingGun> collect = chargingGunList.stream().filter(s -> s.getChargingPileId().equals(chargingPileId)).collect(Collectors.toList());
+        for (TChargingGun chargingGun : collect) {
+            SupConnectorPowerInfo connectorInfo = new SupConnectorPowerInfo();
+            connectorInfo.setConnectorID(chargingGun.getFullNumber());
+            connectorInfo.setEquipmentClassification(chargingGun.getEquipmentClassification());
+            connectorInfo.setDataTime(DateUtils.localDateTimeToString(LocalDateTime.now()));
+            connectorInfo.setConnectorRealTimePower(chargingGun.getChargingPower());
+            connectorInfos.add(connectorInfo);
+        }
+        return connectorInfos;
+    }
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java
index 045faca..112bc2a 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/ChargingMessageListener.java
@@ -13,6 +13,7 @@
 import com.ruoyi.chargingPile.api.vo.UpdateChargingPileStatusVo;
 import com.ruoyi.common.redis.service.RedisService;
 import com.ruoyi.integration.api.model.*;
+import com.ruoyi.integration.drainage.TCECPushUtil;
 import com.ruoyi.integration.iotda.constant.SendTagConstant;
 import com.ruoyi.integration.iotda.enums.ServiceIdMenu;
 import com.ruoyi.integration.iotda.utils.tools.CP56Time2aConverter;
@@ -119,10 +120,14 @@
     private QrCodeDeliveryReplyService qrCodeDeliveryReplyService;
     @Autowired
     private SecurityDetectionService securityDetectionService;
-    
+    @Autowired
+    private TCECPushUtil tcecPushUtil;
+
     @Resource
     private ChargingPileClient chargingPileClient;
-    
+    @Resource
+    private ChargingGunClient chargingGunClient;
+
     @Resource
     private RedisTemplate redisTemplate;
     
@@ -161,6 +166,11 @@
                 vo1.setPile_code(pingMessage.getCharging_pile_code());
                 vo1.setStatus(pingMessage.getCharging_gun_status());
                 chargingPileClient.updateChargingPileStatus(vo1);
+                try {
+                    tcecPushUtil.pushSuperviseNotificationStationStatus(chargingGunClient.getChargingGunByFullNumber(pingMessage.getCharging_pile_code()+pingMessage.getCharging_gun_code()).getData());
+                }catch (Exception e){
+                    System.out.println("设备状态推送监管平台失败:"+e.getMessage());
+                }
                 break;
             case SendTagConstant.END_CHARGE:
                 EndChargeMessage endChargeMessage = message.getEndChargeMessage();
@@ -171,6 +181,15 @@
                 endChargeService.create(endCharge);
                 // 业务处理
                 chargingOrderClient.endCharge(endCharge.getTransaction_serial_number());
+                // 监管平台
+                // 查询订单信息
+                try {
+                    TChargingOrder chargingOrder = chargingOrderClient.getOrderByCode(endCharge.getTransaction_serial_number()).getData();
+                    tcecPushUtil.pushSuperviseNotificationChargeOrderInfo(chargingOrder);
+                    tcecPushUtil.pushSuperviseNotificationEquipChargeStatus(chargingOrder);
+                }catch (Exception e){
+                    System.out.println("充电结束推送监管平台失败:"+e.getMessage());
+                }
                 break;
             case SendTagConstant.ERROR_MESSAGE:
                 ErrorMessageMessage errorMessageMessage1 = message.getErrorMessageMessage();
@@ -235,6 +254,9 @@
                     UploadRealTimeMonitoringDataQuery query = new UploadRealTimeMonitoringDataQuery();
                     BeanUtils.copyProperties(uploadRealTimeMonitoringData, query);
                     chargingOrderClient.chargeMonitoring(query);
+                    chargingOrder.setEndSoc(uploadRealTimeMonitoringDataMessage.getSoc()+"");
+                    tcecPushUtil.pushSuperviseNotificationEquipChargeStatus(chargingOrder);
+
                 } catch (Exception e) {
                     e.printStackTrace();
                 }
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/util/JianGuanTask.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/util/JianGuanTask.java
new file mode 100644
index 0000000..5ddedce
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/util/JianGuanTask.java
@@ -0,0 +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();
+//    }
+//}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/util/TaskUtil.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/util/TaskUtil.java
deleted file mode 100644
index 09ac391..0000000
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/util/TaskUtil.java
+++ /dev/null
@@ -1,44 +0,0 @@
-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 TaskUtil {
-
-    @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();
-    }
-}
diff --git a/ruoyi-service/ruoyi-integration/src/test/java/com/ruoyi/integration/RuoYiIntegrationApplicationTests.java b/ruoyi-service/ruoyi-integration/src/test/java/com/ruoyi/integration/RuoYiIntegrationApplicationTests.java
index 7c0b24e..e069794 100644
--- a/ruoyi-service/ruoyi-integration/src/test/java/com/ruoyi/integration/RuoYiIntegrationApplicationTests.java
+++ b/ruoyi-service/ruoyi-integration/src/test/java/com/ruoyi/integration/RuoYiIntegrationApplicationTests.java
@@ -1,15 +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 {
@@ -18,10 +45,341 @@
 	
 	@Resource
 	private ParkingOrderService parkingOrderService;
+	@Resource
+	private SiteClient siteClient;
+	@Resource
+	private ChargingGunClient chargingGunClient;
+
+	@Resource
+	private ChargingOrderClient chargingOrderClient;
+
+	@Resource
+	private OperatorClient operatorClient;
 	@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);
+		/**
+		 * 推送充电设备接口状态信息
+		 * @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;
+	}
+
 }
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/RuoYiOrderApplication.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/RuoYiOrderApplication.java
index 7255afa..51c767e 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/RuoYiOrderApplication.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/RuoYiOrderApplication.java
@@ -24,7 +24,12 @@
 @EnableTransactionManagement//开启事务
 public class RuoYiOrderApplication {
     public static void main(String[] args) {
-        SpringApplication.run(RuoYiOrderApplication.class, args);
+        try {
+            SpringApplication.run(RuoYiOrderApplication.class, args);
+
+        }catch (Exception e){
+            e.printStackTrace();
+        }
         System.out.println("(♥◠‿◠)ノ゙  订单模块启动成功   ლ(´ڡ`ლ)゙  \n" +
                 " .-------.       ____     __        \n" +
                 " |  _ _   \\      \\   \\   /  /    \n" +
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
index 139f142..e452064 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -36,6 +36,7 @@
 import com.ruoyi.integration.api.feignClient.UploadRealTimeMonitoringDataClient;
 import com.ruoyi.integration.api.model.ChargingOrderAndUploadRealTimeMonitoringDataDto;
 import com.ruoyi.integration.api.model.UploadRealTimeMonitoringPageData;
+import com.ruoyi.order.api.dto.ChargingStatisticeDTO;
 import com.ruoyi.order.api.model.*;
 import com.ruoyi.order.api.query.ChargingOrderQuery;
 import com.ruoyi.common.core.dto.MongoChargingOrderQuery;
@@ -157,10 +158,25 @@
     private RoleSiteClient roleSiteClient;
     @Resource
     private SysUserRoleClient sysUserRoleClient;
-    
-    
-    
-    
+
+
+
+    /**
+     * 远程调用 监管平台查询前一天用能统计
+     * @return
+     */
+    @ResponseBody
+    @PostMapping(value = "/getChargingStatistics")
+    public R<List<TChargingOrder>> getChargingStatistics(@RequestBody ChargingStatisticeDTO dto) {
+        List<Long> collect = chargingOrderAccountingStrategyService.lambdaQuery().between(TChargingOrderAccountingStrategy::getCreateTime, dto.getStartTime(), dto.getEndTime())
+                .list().stream().map(TChargingOrderAccountingStrategy::getChargingOrderId).collect(Collectors.toList());
+        if (!collect.isEmpty()){
+            List<TChargingOrder> list = chargingOrderService.lambdaQuery()
+                    .in(TChargingOrder::getId,collect).list();
+            return R.ok(list);
+        }
+        return R.ok(new ArrayList<TChargingOrder>());
+    }
 
     /**
      * 远程调用 增加管理后台赠送会员记录
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/RuoYiOtherApplication.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/RuoYiOtherApplication.java
index f1b9f56..500f478 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/RuoYiOtherApplication.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/RuoYiOtherApplication.java
@@ -25,8 +25,13 @@
 @EnableTransactionManagement//开启事务
 public class RuoYiOtherApplication {
     public static void main(String[] args) {
-        SpringApplication.run(RuoYiOtherApplication.class, args);
-        new NettyServer().bind();
+        try {
+            SpringApplication.run(RuoYiOtherApplication.class, args);
+            new NettyServer().bind();
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+
         System.out.println("(♥◠‿◠)ノ゙  基础模块启动成功   ლ(´ڡ`ლ)゙  \n" +
                 " .-------.       ____     __        \n" +
                 " |  _ _   \\      \\   \\   /  /    \n" +

--
Gitblit v1.7.1