From fbd12d3fc911601c2889d613ba0e94eb6cbe14cd Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期五, 28 十一月 2025 16:50:39 +0800
Subject: [PATCH] Merge branch 'dev' of http://120.76.84.145:10101/gitblit/r/java/mx_charging_pile

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java                              |   79 +
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/ConnectorStatusInfo.java                      |   19 
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/EDIMessagePack.java                          |   39 
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/HttpRequestUtil.java                          |   85 +
 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/Site.java                                        |   21 
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Encodes.java                                  |  142 ++
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/enu/ConnectorTypeEnum.java                         |   39 
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/CDStationInfo.java                           |  128 ++
 ruoyi-api/ruoyi-api-jianguan/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports |    3 
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/ChengDuJianGuanController.java                     |  565 ++++++++++
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/ChengDuJianGuanUtil.java                           |  542 ++++++++++
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Exceptions.java                               |   72 +
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Cryptos.java                                  |  249 ++++
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/NotificationStationFee.java                  |   29 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingGunServiceImpl.java                  |   29 
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/enu/InterfaceUrlEnum.java                          |   43 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java              |    7 
 ruoyi-service/ruoyi-jianguan/src/main/resources/bootstrap.yml                                                                    |    2 
 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TChargingPile.java                               |   12 
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/SignUtils.java                                |  116 ++
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationInfo.java                              |    2 
 ruoyi-api/ruoyi-api-jianguan/src/main/java/com/ruoyi/integration/api/vo/NotificationConnectorChargeStatusVo.java                 |   15 
 ruoyi-api/ruoyi-api-jianguan/src/main/java/com/ruoyi/integration/api/feignClient/ChengDuJianGuanClient.java                      |   60 +
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/enu/StationStatusEnum.java                         |   38 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/ConnectorInfo.java                            |   36 
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/ConnectorChargeStatusInfo.java               |  129 ++
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/CDOrderInfo.java                             |  122 ++
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java                                                  |   19 
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/CDEquipmentInfo.java                         |   68 +
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java                 |   17 
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/enu/ConstructionEnum.java                          |   49 
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/ChargeFeeDetail.java                         |   41 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingPileController.java                    |    7 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java                          |   10 
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Digests.java                                  |  113 ++
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java                               |    2 
 ruoyi-api/ruoyi-api-jianguan/src/main/java/com/ruoyi/integration/api/factory/ChengDuJianGuanClientFallbackFactory.java           |   39 
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/enu/EquipmentTypeEnum.java                         |   42 
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/enu/StationTypeEnum.java                           |   45 
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/GBSignUtils.java                              |   58 +
 40 files changed, 3,096 insertions(+), 37 deletions(-)

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 7e6c33f..d604215 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
@@ -459,20 +459,11 @@
 	@TableField("isOpenSynchronization")
 	@ApiModelProperty(value = "引流平台数据同步(0=否,1=是)")
 	private Integer isOpenSynchronization;
-//	/**
-//	 * 换电设备信息
-//	 */
-//	@TableField("swap_equipment_infos")
-//	@ApiModelProperty(value = "2.0修改字段-换电设备信息 站点分类为2或3时必填 示例:" +
-//			"[{" +
-//			"\"SwapMechanicalEquipmentID\": \"A564778B\"," +
-//			"\"MechanicalEquipmentPower\": 128.0000" +
-//			"}," +
-//			"{" +
-//			"\"SwapMechanicalEquipmentID\": \"A564778C\"," +
-//			"\"MechanicalEquipmentPower\": 150.0000" +
-//			"}" +
-//			"]")
-//	private String swapEquipmentInfos;
+	/**
+	 * 是否有储能设施(0:无,1:有)
+	 */
+	@TableField("isEnergyStorage")
+	@ApiModelProperty(value = "是否有储能设施(0:无,1:有)")
+	private Integer isEnergyStorage;
 
 }
diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TChargingPile.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TChargingPile.java
index f57b585..b3c714a 100644
--- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TChargingPile.java
+++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TChargingPile.java
@@ -112,4 +112,16 @@
     @ApiModelProperty(value = "充电设备纬度")
     @TableField("equipment_lat")
     private String equipmentLat;
+    @ApiModelProperty(value = "设备出厂编码")
+    @TableField("equipment_product_code")
+    private String equipmentProductCode;
+    @ApiModelProperty(value = "设备用途 1:公共,50:个人, 100:公交(专用), 101:环卫(专用),102:物流(专用),103:出租车(专用),104:分时租赁(专用),106:单位(专用),107:移动站点(移动储能设备), 108:居民小区(公共), 109:居民小区(专用)")
+    @TableField("equipment_purpose")
+    private Integer equipmentPurpose;
+    @ApiModelProperty(value = "新国标 0:否,1:是")
+    @TableField("new_national_standard")
+    private Integer newNationalStandard;
+    @ApiModelProperty(value = "是否支持VIN码识别 0:否,1:是")
+    @TableField("vin_flag")
+    private Integer vinFlag;
 }
diff --git a/ruoyi-api/ruoyi-api-jianguan/src/main/java/com/ruoyi/integration/api/factory/ChengDuJianGuanClientFallbackFactory.java b/ruoyi-api/ruoyi-api-jianguan/src/main/java/com/ruoyi/integration/api/factory/ChengDuJianGuanClientFallbackFactory.java
new file mode 100644
index 0000000..4df1516
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-jianguan/src/main/java/com/ruoyi/integration/api/factory/ChengDuJianGuanClientFallbackFactory.java
@@ -0,0 +1,39 @@
+package com.ruoyi.integration.api.factory;
+
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.integration.api.feignClient.ChengDuJianGuanClient;
+import com.ruoyi.integration.api.vo.NotificationConnectorChargeStatusVo;
+import org.springframework.cloud.openfeign.FallbackFactory;
+
+public class ChengDuJianGuanClientFallbackFactory implements FallbackFactory<ChengDuJianGuanClient> {
+    @Override
+    public ChengDuJianGuanClient create(Throwable cause) {
+        return new ChengDuJianGuanClient() {
+            @Override
+            public R notificationStationInfo(Integer siteId) {
+                return R.fail("充电站信息变化推送失败:" + cause.getMessage());
+            }
+
+            @Override
+            public R notificationStationFee(Integer chargingPileId) {
+                return R.fail("站点费率变化推送失败:" + cause.getMessage());
+            }
+
+            @Override
+            public R notificationStationStatus(Integer chargingGunId) {
+                return R.fail("设备状态变化推送失败:" + cause.getMessage());
+            }
+
+            @Override
+            public R notificationConnectorChargeStatus(NotificationConnectorChargeStatusVo vo) {
+                return R.fail("设备充电中状态变化推送失败:" + cause.getMessage());
+            }
+
+
+            @Override
+            public R notificationOrderInfo(NotificationConnectorChargeStatusVo vo) {
+                return R.fail("订单信息推送失败:" + cause.getMessage());
+            }
+        };
+    }
+}
diff --git a/ruoyi-api/ruoyi-api-jianguan/src/main/java/com/ruoyi/integration/api/feignClient/ChengDuJianGuanClient.java b/ruoyi-api/ruoyi-api-jianguan/src/main/java/com/ruoyi/integration/api/feignClient/ChengDuJianGuanClient.java
new file mode 100644
index 0000000..a8af05d
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-jianguan/src/main/java/com/ruoyi/integration/api/feignClient/ChengDuJianGuanClient.java
@@ -0,0 +1,60 @@
+package com.ruoyi.integration.api.feignClient;
+
+
+import com.ruoyi.common.core.constant.ServiceNameConstants;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.integration.api.factory.ChengDuJianGuanClientFallbackFactory;
+import com.ruoyi.integration.api.vo.NotificationConnectorChargeStatusVo;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@FeignClient(contextId = "ChengDuJianGuanClient", value = ServiceNameConstants.JIANGUAN_SERVICE, fallbackFactory = ChengDuJianGuanClientFallbackFactory.class)
+public interface ChengDuJianGuanClient {
+
+
+    /**
+     * 充电站信息变化推送
+     * @param siteId
+     * @return
+     */
+    @PostMapping("/chengdu/jianguan/notificationStationInfo")
+    R notificationStationInfo(@RequestParam("siteId") Integer siteId);
+
+
+    /**
+     * 站点费率变化推送
+     * @param chargingPileId
+     * @return
+     */
+    @PostMapping("/chengdu/jianguan/notificationStationFee")
+    R notificationStationFee(@RequestParam("chargingPileId") Integer chargingPileId);
+
+
+    /**
+     * 设备状态变化推送
+     * @param chargingGunId
+     * @return
+     */
+    @PostMapping("/chengdu/jianguan/notificationStationStatus")
+    R notificationStationStatus(@RequestParam("chargingGunId") Integer chargingGunId);
+
+
+    /**
+     * 设备充电中状态变化推送
+     * @param vo
+     * @return
+     */
+    @PostMapping("/chengdu/jianguan/notificationConnectorChargeStatus")
+    R notificationConnectorChargeStatus(@RequestBody NotificationConnectorChargeStatusVo vo);
+
+
+    /**
+     * 订单信息推送
+     * @param vo
+     * @return
+     */
+    @PostMapping("/chengdu/jianguan/notificationOrderInfo")
+    R notificationOrderInfo(@RequestBody NotificationConnectorChargeStatusVo vo);
+}
diff --git a/ruoyi-api/ruoyi-api-jianguan/src/main/java/com/ruoyi/integration/api/vo/NotificationConnectorChargeStatusVo.java b/ruoyi-api/ruoyi-api-jianguan/src/main/java/com/ruoyi/integration/api/vo/NotificationConnectorChargeStatusVo.java
new file mode 100644
index 0000000..334aebc
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-jianguan/src/main/java/com/ruoyi/integration/api/vo/NotificationConnectorChargeStatusVo.java
@@ -0,0 +1,15 @@
+package com.ruoyi.integration.api.vo;
+
+import lombok.Data;
+
+@Data
+public class NotificationConnectorChargeStatusVo {
+    /**
+     * 充电枪id
+     */
+    private Integer chargingGunId;
+    /**
+     * 充电订单code
+     */
+    private String orderCode;
+}
diff --git a/ruoyi-api/ruoyi-api-jianguan/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-api/ruoyi-api-jianguan/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
index ffd095b..9957a99 100644
--- a/ruoyi-api/ruoyi-api-jianguan/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ b/ruoyi-api/ruoyi-api-jianguan/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -1,2 +1,3 @@
 com.ruoyi.integration.api.factory.ChargingMessageClientFallbackFactory
-com.ruoyi.integration.api.factory.ELuTongClientFallbackFactory
\ No newline at end of file
+com.ruoyi.integration.api.factory.ELuTongClientFallbackFactory
+com.ruoyi.integration.api.factory.ChengDuJianGuanClientFallbackFactory
\ No newline at end of file
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java
index 46fc1b1..fac99a8 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java
@@ -27,6 +27,7 @@
 import com.ruoyi.common.security.annotation.RequiresPermissions;
 import com.ruoyi.common.security.service.TokenService;
 import com.ruoyi.common.security.utils.SecurityUtils;
+import com.ruoyi.integration.api.feignClient.ChengDuJianGuanClient;
 import com.ruoyi.integration.api.feignClient.IntegrationClient;
 import com.ruoyi.integration.api.feignClient.TCECClient;
 import com.ruoyi.system.api.domain.SysUser;
@@ -76,6 +77,9 @@
     
     @Resource
     private TCECClient tcecClient;
+
+    @Resource
+    private ChengDuJianGuanClient chengDuJianGuanClient;
 
 
     @Autowired
@@ -140,6 +144,7 @@
             List<TChargingPile> list = chargingPileService.lambdaQuery().eq(TChargingPile::getSiteId, dto.getSiteId()).eq(TChargingPile::getDelFlag, 0).list();
             for (TChargingPile tChargingPile : list) {
                 integrationClient.setupBillingModel1(tChargingPile.getCode(), JSON.toJSONString(dto.getAccountingStrategyDetails()));
+                chengDuJianGuanClient.notificationStationFee(tChargingPile.getId());
             }
         }
         return AjaxResult.ok(dto.getId());
@@ -217,6 +222,7 @@
             List<TChargingPile> list = chargingPileService.lambdaQuery().eq(TChargingPile::getSiteId, dto.getSiteId()).eq(TChargingPile::getDelFlag, 0).list();
             for (TChargingPile tChargingPile : list) {
                 integrationClient.setupBillingModel1(tChargingPile.getCode(), JSON.toJSONString(dto.getAccountingStrategyDetails()));
+                chengDuJianGuanClient.notificationStationFee(tChargingPile.getId());
             }
         }
         return AjaxResult.success();
@@ -407,6 +413,7 @@
                 List<TChargingPile> list = chargingPileService.lambdaQuery().eq(TChargingPile::getSiteId, byId.getSiteId()).list();
                 for (TChargingPile tChargingPile : list) {
                     integrationClient.setupBillingModel1(tChargingPile.getCode(), JSON.toJSONString(accountingStrategyDetails));
+                    chengDuJianGuanClient.notificationStationFee(tChargingPile.getId());
                 }
             }
         }else {
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingPileController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingPileController.java
index c1d17cf..03d76d8 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingPileController.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingPileController.java
@@ -33,6 +33,7 @@
 import com.ruoyi.common.security.annotation.RequiresPermissions;
 import com.ruoyi.integration.api.elutong.model.ConnectorStatusInfo;
 import com.ruoyi.integration.api.elutong.model.ConnectorStatusReq;
+import com.ruoyi.integration.api.feignClient.ChengDuJianGuanClient;
 import com.ruoyi.integration.api.feignClient.ELuTongClient;
 import com.ruoyi.integration.api.feignClient.TCECClient;
 import com.ruoyi.order.api.feignClient.ChargingOrderClient;
@@ -88,6 +89,9 @@
 
 	@Resource
 	private ELuTongClient eLuTongClient;
+
+	@Resource
+	private ChengDuJianGuanClient chengDuJianGuanClient;
 
 
 
@@ -266,7 +270,8 @@
 		TChargingGun tChargingGun = chargingGunService.getOne(new LambdaQueryWrapper<TChargingGun>().eq(TChargingGun::getFullNumber, (pile_code + gun_code)).eq(TChargingGun::getDelFlag, 0));
 		if(null != tChargingGun){
 			redisTemplate.opsForHash().put("charging_gun_online", tChargingGun.getFullNumber(), System.currentTimeMillis());
-			
+			//上传成都监管
+			chengDuJianGuanClient.notificationStationStatus(tChargingGun.getId());
 			TChargingPile chargingPile = chargingPileService.getById(tChargingGun.getChargingPileId());
 			//枪处于离线或者故障,返回状态为正常,则修改其状态
 			if(0 == status && tChargingGun.getStatus() != 2){
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 9cf18a7..f462eb1 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
@@ -26,6 +26,7 @@
 import com.ruoyi.common.security.service.TokenService;
 import com.ruoyi.common.security.utils.SecurityUtils;
 import com.ruoyi.integration.api.elutong.model.*;
+import com.ruoyi.integration.api.feignClient.ChengDuJianGuanClient;
 import com.ruoyi.integration.api.feignClient.ELuTongClient;
 import com.ruoyi.integration.api.feignClient.IntegrationClient;
 import com.ruoyi.integration.api.feignClient.TCECClient;
@@ -47,6 +48,7 @@
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.LinkedBlockingDeque;
+import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
@@ -99,6 +101,9 @@
 	private TCECClient tcecClient;
 
 	@Resource ELuTongClient eLuTongClient;
+
+	@Resource
+	private ChengDuJianGuanClient chengDuJianGuanClient;
 	
 	
 	/**
@@ -205,7 +210,8 @@
 		}
 		site.setMark(0);
 		this.save(site);
-
+		//推送成都监管
+		chengDuJianGuanClient.notificationStationInfo(site.getId());
 		if(StringUtils.isNotEmpty(site.getSerAreaCode())){
 			ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
 			threadPoolExecutor.execute(()->{
@@ -415,6 +421,8 @@
 		
 		this.updateById(site);
 		tcecClient.superviseNotificationStationInfo(site.getId());
+		//推送成都监管
+		chengDuJianGuanClient.notificationStationInfo(site.getId());
 		if(StringUtils.isNotEmpty(site.getSerAreaCode())){
 			ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
 			threadPoolExecutor.execute(()->{
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 f7fcef5..bc52e49 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
@@ -23,6 +23,7 @@
 import com.ruoyi.common.core.web.page.PageInfo;
 import com.ruoyi.common.security.service.TokenService;
 import com.ruoyi.common.security.utils.SecurityUtils;
+import com.ruoyi.integration.api.feignClient.ChengDuJianGuanClient;
 import com.ruoyi.integration.api.feignClient.SendMessageClient;
 import com.ruoyi.integration.api.feignClient.TCECClient;
 import com.ruoyi.integration.api.model.QrCodeDelivery;
@@ -38,6 +39,10 @@
 
 import javax.annotation.Resource;
 import java.util.*;
+import java.util.concurrent.LinkedBlockingDeque;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -121,8 +126,15 @@
         return pageInfo;
     }
 
-@Autowired
-private SiteMapper siteMapper;
+    @Autowired
+    private SiteMapper siteMapper;
+
+    @Resource
+    private ChengDuJianGuanClient chengDuJianGuanClient;
+
+
+
+
     /**
      * 添加充电枪
      * @param dto
@@ -155,8 +167,11 @@
         qrCodeDelivery.setCreate_time(new Date());
         qrCodeDelivery.setLast_time(new Date());
         sendMessageClient.qrCodeDelivery(qrCodeDelivery);
-        Site site = siteMapper.selectById(chargingPile.getSiteId());
-        // 推送充换电站信息
+        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
+        threadPoolExecutor.execute(()->{
+            //推送成都监管
+            chengDuJianGuanClient.notificationStationInfo(chargingPile.getSiteId());
+        });
         return AjaxResult.success();
     }
     
@@ -198,7 +213,11 @@
         qrCodeDelivery.setLast_time(new Date());
         sendMessageClient.qrCodeDelivery(qrCodeDelivery);
         tcecClient.superviseNotificationStationInfo(one.getSiteId());
-
+        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
+        threadPoolExecutor.execute(()->{
+            //推送成都监管
+            chengDuJianGuanClient.notificationStationInfo(chargingPile.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 5466368..11d045d 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
@@ -54,6 +54,9 @@
 import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.util.*;
+import java.util.concurrent.LinkedBlockingDeque;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -128,6 +131,9 @@
 
 	@Resource
 	private AppUserClient appUserClient;
+
+	@Resource
+	private ChengDuJianGuanClient chengDuJianGuanClient;
 	
 	
 
@@ -211,6 +217,11 @@
 			chargingPile.setIotdDeviceId(showDeviceResp.getDeviceId());
 		}
 		this.save(chargingPile);
+		ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
+		threadPoolExecutor.execute(()->{
+			//推送成都监管
+			chengDuJianGuanClient.notificationStationInfo(chargingPile.getSiteId());
+		});
 		return AjaxResult.success();
 	}
 	
@@ -330,6 +341,12 @@
 			sendMessageClient.qrCodeDelivery(qrCodeDelivery);
 		}
 		tcecClient.superviseNotificationStationInfo(chargingPile.getSiteId());
+
+		ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
+		threadPoolExecutor.execute(()->{
+			//推送成都监管
+			chengDuJianGuanClient.notificationStationInfo(chargingPile.getSiteId());
+		});
 		return AjaxResult.success();
 	}
 	
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/ConnectorInfo.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/ConnectorInfo.java
index 0c364ea..1b4d62f 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/ConnectorInfo.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/ConnectorInfo.java
@@ -1,6 +1,5 @@
 package com.ruoyi.integration.drainage.model;
 
-import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -86,28 +85,53 @@
 	@Null
 	@JsonProperty("QRCode")
 	private String QRCode;
+	/**
+	 * 恒功率电压上限
+	 */
 	@Null
 	@JsonProperty("ConstantVoltageUpperLimits")
 	private BigDecimal constantVoltageUpperLimits;
+	/**
+	 * 恒功率电压下限
+	 */
 	@Null
 	@JsonProperty("ConstantVoltageLowerLimits")
 	private BigDecimal constantVoltageLowerLimits;
-
+	/**
+	 * 恒功率电压上限
+	 */
 	@Null
 	@JsonProperty("ConstantCurrentUpperLimits")
 	private BigDecimal constantCurrentUpperLimits;
-
+	/**
+	 * 恒功率电压下限
+	 */
 	@Null
 	@JsonProperty("ConstantCurrentLowerLimits")
 	private BigDecimal constantCurrentLowerLimits;
+	/**
+	 * 辅助电源
+	 * 1:12V
+	 * 2:24V
+	 */
 	@NotNull
 	@JsonProperty("AuxPower")
 	private Integer auxPower;
-
+	/**
+	 * 运营状态
+	 * 0:未知
+	 * 1:建设中
+	 * 5:关闭下线
+	 * 6:维护中
+	 * 50:正常使用
+	 */
 	@NotNull
-	@TableField("OpreateStatus")
+	@JsonProperty("OpreateStatus")
 	private Integer opreateStatus;
+	/**
+	 * 运营时间
+	 */
 	@Null
-	@TableField("OpreateHours")
+	@JsonProperty("OpreateHours")
 	private String opreateHours;
 }
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 e603f9e..3502eb0 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
@@ -26,6 +26,7 @@
 	 * 2:占用(未充电)
 	 * 3:占用(充电中)
 	 * 4:占用(预约锁定)
+	 * 5:占用(放电中)
 	 * 255:故障
 	 */
 	@NotNull
@@ -49,17 +50,29 @@
 	@Null
 	@JsonProperty("LookStatus")
 	private Integer lookStatus;
-
+	/**
+	 *
+	 */
 	@JsonProperty("ConnectorStatusInfo")
 	private ConnectorStatusInfo connectorStatusInfo;
-
-
+	/**
+	 * 运营平台ID
+	 */
 	@JsonProperty("OperatorID")
 	private String OperatorID;
+	/**
+	 * 产权所属单位ID
+	 */
 	@JsonProperty("EquipmentOwnerID")
 	private String EquipmentOwnerID;
+	/**
+	 * 充电站ID
+	 */
 	@JsonProperty("StationID")
 	private String StationID;
+	/**
+	 * 充电设备编码
+	 */
 	@JsonProperty("EquipmentID")
 	private String EquipmentID;
 	/**
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationInfo.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationInfo.java
index 7bcb042..4229ea2 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationInfo.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationInfo.java
@@ -1,8 +1,6 @@
 package com.ruoyi.integration.drainage.model;
 
-import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import javax.validation.constraints.NotNull;
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/ChengDuJianGuanController.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/ChengDuJianGuanController.java
new file mode 100644
index 0000000..5afccfb
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/ChengDuJianGuanController.java
@@ -0,0 +1,565 @@
+package com.ruoyi.jianguan.chengdujianguan;
+
+
+import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyDetailClient;
+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.TAccountingStrategyDetail;
+import com.ruoyi.chargingPile.api.model.TChargingGun;
+import com.ruoyi.chargingPile.api.model.TChargingPile;
+import com.ruoyi.chargingPile.api.vo.GetChargingGunByChargingPileIdsVo;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.integration.api.vo.NotificationConnectorChargeStatusVo;
+import com.ruoyi.jianguan.chengdujianguan.enu.*;
+import com.ruoyi.jianguan.chengdujianguan.model.*;
+import com.ruoyi.jianguan.model.ChargeDetail;
+import com.ruoyi.jianguan.model.ConnectorInfo;
+import com.ruoyi.jianguan.model.ConnectorStatusInfo;
+import com.ruoyi.order.api.feignClient.ChargingOrderAccountingStrategyClient;
+import com.ruoyi.order.api.feignClient.ChargingOrderClient;
+import com.ruoyi.order.api.model.TChargingOrder;
+import com.ruoyi.order.api.model.TChargingOrderAccountingStrategy;
+import com.ruoyi.other.api.feignClient.SystemConfigurationClient;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+@RestController
+@RequestMapping("/chengdu/jianguan")
+public class ChengDuJianGuanController {
+
+    @Resource
+    private RedisTemplate<String, Object> redisTemplate;
+
+    @Resource
+    private SiteClient siteClient;
+
+    @Resource
+    private ChargingPileClient chargingPileClient;
+
+    @Resource
+    private ChargingGunClient chargingGunClient;
+
+    @Resource
+    private SystemConfigurationClient systemConfigurationClient;
+
+    @Resource
+    private AccountingStrategyDetailClient accountingStrategyDetailClient;
+
+    @Resource
+    private ChargingOrderClient chargingOrderClient;
+
+    @Resource
+    private ChargingOrderAccountingStrategyClient chargingOrderAccountingStrategyClient;
+    //成都、眉山、阿坝
+    private List<String> list = Arrays.asList("510100", "511400", "513200");
+
+
+    /**
+     * 充电站信息变化推送
+     * @param siteId
+     * @return
+     */
+    @PostMapping("/notificationStationInfo")
+    public R notificationStationInfo(@RequestParam("siteId") Integer siteId){
+        Site site = siteClient.getSiteByIds(Arrays.asList(siteId)).getData().get(0);
+        if(StringUtils.isNotEmpty(site.getCityCode()) && list.contains(site.getCityCode())){
+            ChengDuJianGuanUtil.notificationStationInfo(redisTemplate, buildStationInfo(site));
+        }
+        return R.ok();
+    }
+
+
+    private CDStationInfo buildStationInfo(Site site){
+        String serviceTel = systemConfigurationClient.getServerPhone().getData();
+        CDStationInfo stationInfo = new CDStationInfo();
+        stationInfo.setStationID(site.getCode());
+        stationInfo.setOperatorID("906171535");
+        stationInfo.setEquipmentOwnerID("906171535");
+        stationInfo.setStationName(site.getName());
+        stationInfo.setIsAloneApply(site.getBusinessExpandType());
+        stationInfo.setAccountNumber(site.getResidentNo());
+        stationInfo.setCapacity(site.getCapacity());
+        stationInfo.setCountryCode(StringUtils.isNotEmpty(site.getCountryCode()) ? site.getCountryCode() : "CN");
+        stationInfo.setAreaCode(site.getDistrictsCode());
+        stationInfo.setAreaCodeCountryside(site.getDistrictsCode() + "000000");
+        stationInfo.setAddress(site.getAddress());
+        stationInfo.setStationTel(StringUtils.isNotEmpty(serviceTel) ? serviceTel.split(",")[0] : "");
+        stationInfo.setServiceTel(StringUtils.isNotEmpty(serviceTel) ? serviceTel.split(",")[0] : "");
+        switch (site.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;
+        }
+        stationInfo.setIsOpen(1);
+        if(site.getStatus() == 1){
+            stationInfo.setStationStatus(StationStatusEnum.NORMAL_USE.getStatus());
+        }
+        if(site.getStatus() == 2){
+            stationInfo.setStationStatus(StationStatusEnum.MAINTAIN.getStatus());
+        }
+        if(site.getStatus() == 3){
+            stationInfo.setStationStatus(StationStatusEnum.OFF_LINE.getStatus());
+        }
+        stationInfo.setParkNums(site.getParkingSpace());
+        stationInfo.setStationLng(new BigDecimal(site.getLon()).setScale(6, RoundingMode.HALF_EVEN));
+        stationInfo.setStationLat(new BigDecimal(site.getLat()).setScale(6, RoundingMode.HALF_EVEN));
+        stationInfo.setSiteGuide(site.getGuide());
+        stationInfo.setConstruction(site.getConstructionSite() == 0 ? ConstructionEnum.OTHER.getType() : site.getConstructionSite());
+        stationInfo.setPictures(StringUtils.isNotEmpty(site.getImgUrl()) ? Arrays.asList(site.getImgUrl().split(",")) : new ArrayList<>());
+        stationInfo.setMatchCars(site.getVehicleDescription());
+        stationInfo.setParkInfo("");
+        stationInfo.setParkOwner("");
+        stationInfo.setParkManager("");
+        stationInfo.setOpenAllDay(1);
+        stationInfo.setBusinessHours("周一至周日00:00-24:00");
+        stationInfo.setElectricityFee(site.getRateDescription());
+        stationInfo.setServiceFee(site.getServiceFee());
+        stationInfo.setParkFeeType(site.getParkType());
+        stationInfo.setParkFee(site.getParkFee());
+        stationInfo.setPayment("线上");
+        stationInfo.setSupportOrder(site.getSupportOrder());
+        stationInfo.setRemark(site.getRemark());
+        if(StringUtils.isNotEmpty(site.getSupportingFacilities())){
+            List<String> list = Arrays.asList(site.getSupportingFacilities().split(","));
+            stationInfo.setToiletFlag(list.contains("1") ? 1 : 0);
+            stationInfo.setStoreFlag(list.contains("2") ? 1 : 0);
+            stationInfo.setLoungeFlag(list.contains("4") ? 1 : 0);
+            stationInfo.setCanopyFlag(list.contains("5") ? 1 : 0);
+        }else{
+            stationInfo.setToiletFlag(0);
+            stationInfo.setStoreFlag(0);
+            stationInfo.setLoungeFlag(0);
+            stationInfo.setCanopyFlag(0);
+        }
+        stationInfo.setPrinterFlag(site.getPrinterFlag());
+        stationInfo.setBarrierFlag(site.getBarrierFlag());
+        stationInfo.setParkingLockFlag(site.getParkingLockFlag());
+        stationInfo.setIsDemandResponse(1);
+        stationInfo.setIsSupportOrderlyCharging(1);
+        stationInfo.setIsEnergyStorage(site.getIsEnergyStorage());
+        stationInfo.setElectricityType(site.getElectricityType());
+        stationInfo.setRatedPower(site.getRatedPower());
+        stationInfo.setPeriodFee(site.getPeriodFee());
+        stationInfo.setOfficialRunTime(site.getOfficialRunTime());
+        stationInfo.setVideoMonitor(site.getVideoMonitor());
+        stationInfo.setEquipmentInfos1(buildEquipmentInfo(site.getId()));
+        return stationInfo;
+    }
+
+
+    private List<CDEquipmentInfo> buildEquipmentInfo(Integer siteId){
+        List<TChargingPile> tChargingPiles = chargingPileClient.getChargingPileBySiteIds(Arrays.asList(siteId)).getData();
+        List<Integer> collect1 = tChargingPiles.stream().map(TChargingPile::getId).collect(Collectors.toList());
+        GetChargingGunByChargingPileIdsVo vo = new GetChargingGunByChargingPileIdsVo();
+        vo.setChargingPileIds(collect1);
+        List<TChargingGun> chargingGunList = chargingGunClient.getChargingGunByChargingPileIds(vo).getData();
+        List<CDEquipmentInfo> equipmentInfos = new ArrayList<>();
+        for (TChargingPile tChargingPile : tChargingPiles) {
+            CDEquipmentInfo cdEquipmentInfo = new CDEquipmentInfo();
+            cdEquipmentInfo.setEquipmentID(tChargingPile.getCode());
+            if(StringUtils.isNotEmpty(tChargingPile.getManufacturerCode())){
+                String substring = tChargingPile.getManufacturerCode().substring(8, 17);
+                cdEquipmentInfo.setManufacturerID(substring);
+            }else{
+                cdEquipmentInfo.setManufacturerID("");
+            }
+            cdEquipmentInfo.setManufacturerName(tChargingPile.getManufacturer());
+            cdEquipmentInfo.setEquipmentModel(tChargingPile.getEquipmentType());
+            cdEquipmentInfo.setEquipmentProductCode(tChargingPile.getEquipmentProductCode());
+            cdEquipmentInfo.setEquipmentName(tChargingPile.getName());
+            cdEquipmentInfo.setConstructionTime(tChargingPile.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+            if(null != tChargingPile.getProductionDate()){
+                cdEquipmentInfo.setProductionDate(tChargingPile.getProductionDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+            }
+            switch (tChargingPile.getType()){
+                case 0:
+                    cdEquipmentInfo.setEquipmentType(EquipmentTypeEnum.OTHER.getType());
+                    break;
+                case 1:
+                    cdEquipmentInfo.setEquipmentType(EquipmentTypeEnum.DIRECT_CURRENT.getType());
+                    break;
+                case 2:
+                    cdEquipmentInfo.setEquipmentType(EquipmentTypeEnum.ALTERNATING_CURRENT.getType());
+                    break;
+                case 3:
+                    cdEquipmentInfo.setEquipmentType(EquipmentTypeEnum.ALTERNATING_DIRECT.getType());
+                    break;
+                case 4:
+                    cdEquipmentInfo.setEquipmentType(EquipmentTypeEnum.WIRELESS_DEVICE.getType());
+                    break;
+                case 5:
+                    cdEquipmentInfo.setEquipmentType(EquipmentTypeEnum.ORDER.getType());
+                    break;
+                case 6:
+                    cdEquipmentInfo.setEquipmentType(EquipmentTypeEnum.V2G.getType());
+                    break;
+            }
+            switch (tChargingPile.getStatus()){
+                case 1:
+                    cdEquipmentInfo.setEquipmentStatus(50);
+                    break;
+                case 2:
+                    cdEquipmentInfo.setEquipmentStatus(5);
+                    break;
+                case 3:
+                    cdEquipmentInfo.setEquipmentStatus(5);
+                    break;
+            }
+            cdEquipmentInfo.setEquipmentPurpose(tChargingPile.getEquipmentPurpose());
+            cdEquipmentInfo.setEquipmentPower(tChargingPile.getRatedPower());
+            cdEquipmentInfo.setNewNationalStandard(tChargingPile.getNewNationalStandard());
+            if(null != tChargingPile.getEquipmentLng()){
+                cdEquipmentInfo.setEquipmentLng(new BigDecimal(tChargingPile.getEquipmentLng()).setScale(6, RoundingMode.HALF_EVEN));
+            }else{
+                cdEquipmentInfo.setEquipmentLng(BigDecimal.ZERO.setScale(6, RoundingMode.HALF_EVEN));
+            }
+            if(null != tChargingPile.getEquipmentLat()){
+                cdEquipmentInfo.setEquipmentLat(new BigDecimal(tChargingPile.getEquipmentLat()).setScale(6, RoundingMode.HALF_EVEN));
+            }else{
+                cdEquipmentInfo.setEquipmentLat(BigDecimal.ZERO.setScale(6, RoundingMode.HALF_EVEN));
+            }
+            cdEquipmentInfo.setVinFlag(tChargingPile.getVinFlag());
+            cdEquipmentInfo.setConnectorInfos(buildConnectorInfo(tChargingPile.getId(), chargingGunList));
+            equipmentInfos.add(cdEquipmentInfo);
+        }
+        return equipmentInfos;
+    }
+
+
+    private List<ConnectorInfo> buildConnectorInfo(Integer chargingPileId, List<TChargingGun> chargingGunList){
+        List<TChargingGun> tChargingGunList = chargingGunList.stream().filter(s -> s.getChargingPileId().equals(chargingPileId)).collect(Collectors.toList());
+        List<ConnectorInfo> connectorInfos = new ArrayList<>();
+        for (TChargingGun chargingGun : tChargingGunList) {
+            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());
+            connectorInfo.setVoltageLowerLimits(chargingGun.getLowerLimitOfRatedVoltage());
+            connectorInfo.setCurrent(chargingGun.getRatedCurrent().intValue());
+            connectorInfo.setPower(chargingGun.getRatedPower());
+            connectorInfo.setNationalStandard(null != chargingGun.getNationalStandard() ? Integer.valueOf(chargingGun.getNationalStandard()) : 2);
+            connectorInfo.setAuxPower(chargingGun.getAuxPower());
+            connectorInfo.setOpreateStatus(chargingGun.getParkingStatus());
+            connectorInfo.setParkNo("");
+            connectorInfo.setOpreateHours(chargingGun.getOpreateHours());
+            connectorInfos.add(connectorInfo);
+        }
+        return connectorInfos;
+    }
+
+
+    /**
+     * 站点费率变化推送
+     * @param chargingPileId
+     * @return
+     */
+    @PostMapping("/notificationStationFee")
+    public R notificationStationFee(@RequestParam("chargingPileId") Integer chargingPileId){
+        TChargingPile chargingPile = chargingPileClient.getChargingPileById(chargingPileId).getData();
+        Site site = siteClient.getSiteByIds(Arrays.asList(chargingPile.getSiteId())).getData().get(0);
+        if(StringUtils.isNotEmpty(site.getCityCode()) && list.contains(site.getCityCode())){
+            NotificationStationFee notificationStationFee = new NotificationStationFee();
+            notificationStationFee.setOperatorID("906171535");
+            notificationStationFee.setStationID(site.getCode());
+            List<ChargeFeeDetail> chargeFeeDetail = new ArrayList<>();
+            List<TAccountingStrategyDetail> strategyDetails = accountingStrategyDetailClient.getDetailListByCode(chargingPile.getCode()).getData();
+            for (TAccountingStrategyDetail accountingStrategyDetail : strategyDetails) {
+                ChargeFeeDetail chargeFeeDetail1 = new ChargeFeeDetail();
+                chargeFeeDetail1.setEquipmentType(chargingPile.getType());
+                chargeFeeDetail1.setStartTime(accountingStrategyDetail.getStartTime());
+                chargeFeeDetail1.setEndTime(accountingStrategyDetail.getEndTime());
+                chargeFeeDetail1.setElectricityFee(accountingStrategyDetail.getElectrovalence());
+                chargeFeeDetail1.setServiceFee(accountingStrategyDetail.getServiceCharge());
+                chargeFeeDetail.add(chargeFeeDetail1);
+                notificationStationFee.setChargeFeeDetail(chargeFeeDetail);
+            }
+            ChengDuJianGuanUtil.notificationStationFee(redisTemplate, notificationStationFee);
+        }
+        return R.ok();
+    }
+
+
+    /**
+     * 设备状态变化推送
+     * @param chargingGunId
+     * @return
+     */
+    @PostMapping("/notificationStationStatus")
+    public R notificationStationStatus(@RequestParam("chargingGunId") Integer chargingGunId){
+        TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingGunId).getData();
+        TChargingPile chargingPile = chargingPileClient.getChargingPileById(chargingGun.getChargingPileId()).getData();
+        Site site = siteClient.getSiteByIds(Arrays.asList(chargingPile.getSiteId())).getData().get(0);
+        if(StringUtils.isNotEmpty(site.getCityCode()) && list.contains(site.getCityCode())){
+            ConnectorStatusInfo connectorStatusInfo = new ConnectorStatusInfo();
+            connectorStatusInfo.setOperatorID("906171535");
+            connectorStatusInfo.setEquipmentOwnerID("906171535");
+            connectorStatusInfo.setStationID(site.getCode());
+            connectorStatusInfo.setEquipmentID(chargingPile.getCode());
+            connectorStatusInfo.setEquipmentClassification(1);
+            connectorStatusInfo.setConnectorID(chargingGun.getFullNumber());
+            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(7);
+                    break;
+            }
+            connectorStatusInfo.setParkStatus(0);
+            connectorStatusInfo.setLookStatus(0);
+            ChengDuJianGuanUtil.notificationStationStatus(redisTemplate, connectorStatusInfo);
+        }
+
+        return R.ok();
+    }
+
+
+    /**
+     * 设备充电中状态变化推送
+     * @param vo
+     * @return
+     */
+    @PostMapping("/notificationConnectorChargeStatus")
+    public R notificationConnectorChargeStatus(@RequestBody NotificationConnectorChargeStatusVo vo){
+        TChargingGun chargingGun = chargingGunClient.getChargingGunById(vo.getChargingGunId()).getData();
+        TChargingPile chargingPile = chargingPileClient.getChargingPileById(chargingGun.getChargingPileId()).getData();
+        Site site = siteClient.getSiteByIds(Arrays.asList(chargingPile.getSiteId())).getData().get(0);
+        if(StringUtils.isNotEmpty(site.getCityCode()) && list.contains(site.getCityCode())){
+            TChargingOrder chargingOrder = chargingOrderClient.getOrderByCode(vo.getOrderCode()).getData();
+            ConnectorChargeStatusInfo connectorChargeStatusInfo = new ConnectorChargeStatusInfo();
+            connectorChargeStatusInfo.setOperatorID("906171535");
+            connectorChargeStatusInfo.setEquipmentOwnerID("906171535");
+            connectorChargeStatusInfo.setStationID(site.getCode());
+            connectorChargeStatusInfo.setEquipmentID(chargingPile.getCode());
+            connectorChargeStatusInfo.setConnectorID(chargingGun.getFullNumber());
+            connectorChargeStatusInfo.setStartChargeSeq(chargingOrder.getCode());
+            switch (chargingGun.getStatus()){
+                case 1:
+                    connectorChargeStatusInfo.setConnectorStatus(1);
+                    break;
+                case 2:
+                    connectorChargeStatusInfo.setConnectorStatus(1);
+                    break;
+                case 3:
+                    connectorChargeStatusInfo.setConnectorStatus(2);
+                    break;
+                case 4:
+                    connectorChargeStatusInfo.setConnectorStatus(3);
+                    break;
+                case 5:
+                    connectorChargeStatusInfo.setConnectorStatus(2);
+                    break;
+                case 6:
+                    connectorChargeStatusInfo.setConnectorStatus(4);
+                    break;
+                case 7:
+                    connectorChargeStatusInfo.setConnectorStatus(255);
+                    break;
+            }
+            switch (chargingOrder.getStatus()){
+                case -1:
+                    connectorChargeStatusInfo.setOrderStatus(7);
+                    break;
+                case 0:
+                    connectorChargeStatusInfo.setOrderStatus(7);
+                    break;
+                case 1:
+                    connectorChargeStatusInfo.setOrderStatus(1);
+                    break;
+                case 2:
+                    connectorChargeStatusInfo.setOrderStatus(1);
+                    break;
+                case 3:
+                    connectorChargeStatusInfo.setOrderStatus(2);
+                    break;
+                case 4:
+                    connectorChargeStatusInfo.setOrderStatus(3);
+                    break;
+                case 5:
+                    connectorChargeStatusInfo.setOrderStatus(4);
+                    break;
+            }
+            connectorChargeStatusInfo.setCurrentA(chargingOrder.getCurrent());
+            connectorChargeStatusInfo.setVoltageA(chargingOrder.getVoltage());
+            connectorChargeStatusInfo.setSoc(chargingOrder.getTotalElectricity());
+            connectorChargeStatusInfo.setStartTime((null != chargingOrder.getStartTime() ? chargingOrder.getStartTime() : LocalDateTime.now()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            connectorChargeStatusInfo.setEndTime((null != chargingOrder.getEndTime() ? chargingOrder.getEndTime() : LocalDateTime.now()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            connectorChargeStatusInfo.setPushTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            String key = "CHENGDU_JIANGUAN:" + chargingOrder.getCode();
+            Object o = redisTemplate.opsForValue().get(key);
+            String lastPushTime = null;
+            if(null == o){
+                lastPushTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+            }else{
+                lastPushTime = o.toString();
+            }
+            connectorChargeStatusInfo.setLastPushTime(lastPushTime);
+            connectorChargeStatusInfo.setTotalPower(chargingOrder.getElectricity());
+            connectorChargeStatusInfo.setElecMoney(chargingOrder.getElectrovalence());
+            connectorChargeStatusInfo.setSeviceMoney(chargingOrder.getServiceCharge());
+            connectorChargeStatusInfo.setTotalMoney(chargingOrder.getPaymentAmount());
+            connectorChargeStatusInfo.setSoc1(chargingOrder.getTotalElectricity());
+            ChengDuJianGuanUtil.notificationConnectorChargeStatus(redisTemplate, connectorChargeStatusInfo);
+            redisTemplate.opsForValue().set(key, connectorChargeStatusInfo.getPushTime(), 5, TimeUnit.DAYS);
+        }
+        return R.ok();
+    }
+
+
+    /**
+     * 订单信息推送
+     * @param vo
+     * @return
+     */
+    @PostMapping("/notificationOrderInfo")
+    public R notificationOrderInfo(@RequestBody NotificationConnectorChargeStatusVo vo){
+        TChargingGun chargingGun = chargingGunClient.getChargingGunById(vo.getChargingGunId()).getData();
+        TChargingPile chargingPile = chargingPileClient.getChargingPileById(chargingGun.getChargingPileId()).getData();
+        Site site = siteClient.getSiteByIds(Arrays.asList(chargingPile.getSiteId())).getData().get(0);
+        if(StringUtils.isNotEmpty(site.getCityCode()) && list.contains(site.getCityCode())){
+            TChargingOrder chargingOrder = chargingOrderClient.getOrderByCode(vo.getOrderCode()).getData();
+            CDOrderInfo orderInfo = new CDOrderInfo();
+            orderInfo.setOperatorID("906171535");
+            orderInfo.setEquipmentOwnerID("906171535");
+            orderInfo.setStationID(site.getCode());
+            orderInfo.setEquipmentID(chargingPile.getCode());
+            orderInfo.setConnectorID(chargingGun.getFullNumber());
+            orderInfo.setEquipmentClassification(1);
+            orderInfo.setStartChargeSeq(chargingOrder.getCode());
+            orderInfo.setUserChargeType(1);
+            orderInfo.setMoney(chargingOrder.getPaymentAmount());
+            orderInfo.setElectMoney(chargingOrder.getElectrovalence());
+            orderInfo.setServiceMoney(chargingOrder.getServiceCharge());
+            orderInfo.setElect(chargingOrder.getElectricity());
+            orderInfo.setStartTime((null != chargingOrder.getStartTime() ? chargingOrder.getStartTime() : LocalDateTime.now()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            orderInfo.setEndTime((null != chargingOrder.getEndTime() ? chargingOrder.getEndTime() : LocalDateTime.now()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            orderInfo.setPaymentAmount(chargingOrder.getPaymentAmount());
+            orderInfo.setPayChannel(chargingOrder.getRechargePaymentType() == 2 ? 1 : 2);
+            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(1);
+                    break;
+            }
+            orderInfo.setPower(chargingOrder.getPower());
+            if(null == chargingOrder.getStartTime()){
+                orderInfo.setChargeLast(0L);
+            }else{
+                Long time = chargingOrder.getEndTime().toEpochSecond(ZoneOffset.UTC) - chargingOrder.getStartTime().toEpochSecond(ZoneOffset.UTC);
+                orderInfo.setChargeLast(time);
+            }
+            orderInfo.setMeterValueStart(new BigDecimal(0));
+            orderInfo.setMeterValueEnd(new BigDecimal(0));
+            orderInfo.setPushTimeStamp(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+
+            List<TChargingOrderAccountingStrategy> data = chargingOrderAccountingStrategyClient.getChargingOrderAccountingStrategyByOrderId(chargingOrder.getId()).getData();
+            List<ChargeDetail> chargeDetails = new ArrayList<>();
+            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().setScale(2, BigDecimal.ROUND_HALF_EVEN));
+                chargeDetail.setDetailElecMoney(datum.getPeriodElectricPrice());
+                chargeDetail.setDetailSeviceMoney(datum.getPeriodServicePrice());
+
+                chargeDetails.add(chargeDetail);
+            }
+            orderInfo.setChargeDetails(chargeDetails);
+            ChengDuJianGuanUtil.notificationOrderInfo(redisTemplate, orderInfo);
+        }
+        return R.ok();
+    }
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/ChengDuJianGuanUtil.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/ChengDuJianGuanUtil.java
new file mode 100644
index 0000000..61d0fdb
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/ChengDuJianGuanUtil.java
@@ -0,0 +1,542 @@
+package com.ruoyi.jianguan.chengdujianguan;
+
+
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.nacos.common.utils.JacksonUtils;
+import com.ruoyi.jianguan.chengdujianguan.model.*;
+import com.ruoyi.jianguan.chengdujianguan.util.Cryptos;
+import com.ruoyi.jianguan.chengdujianguan.util.Encodes;
+import com.ruoyi.jianguan.chengdujianguan.util.GBSignUtils;
+import com.ruoyi.jianguan.chengdujianguan.util.HttpRequestUtil;
+import com.ruoyi.jianguan.model.ConnectorInfo;
+import com.ruoyi.jianguan.model.ConnectorStatusInfo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.core.RedisTemplate;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+@Slf4j
+public class ChengDuJianGuanUtil {
+
+    private static String OperatorID = "906171535";
+    private static String OperatorSecret = "amq62RxDSvtqDKYn";    // 运营商秘钥
+    private static String SigSecret = "r7UIikKAXCBj3WI9";              // 签名秘钥
+    private static String DataSecret = "bQHUTLvEFPFGoGYl";           // 消息密钥
+    private static String DataSecretIV = "GBRyCjqbzlPFQjPu";        // 消息密钥初始化向量
+    private static String requestUrl = "https://dataex.cdczpt.com:8101/shevcs/v1";
+
+    //测试环境
+//    private static String OperatorSecret = "9jG8qysc5RxdbjvnvdmuRYQg6J82FwjL";    // 运营商秘钥
+//    private static String SigSecret = "RruzbZxnr74tqxeW";              // 签名秘钥
+//    private static String DataSecret = "3QJXn4MSj78zcpWF";           // 消息密钥
+//    private static String DataSecretIV = "jhqj64V9gX8NHbuf";        // 消息密钥初始化向量
+//    private static String requestUrl = "http://106.14.123.68:8101/shevcs/v1";
+
+
+//    public static void main(String[] args) {
+//        CDStationInfo stationInfo = new CDStationInfo();
+//        stationInfo.setStationID("241231001");
+//        stationInfo.setOperatorID("906171535");
+//        stationInfo.setEquipmentOwnerID("M01234567");
+//        stationInfo.setStationName("灵泉大道充电站");
+//        stationInfo.setIsAloneApply(1);
+//        stationInfo.setAccountNumber("0110042963");
+//        stationInfo.setCapacity(new BigDecimal(1250));
+//        stationInfo.setCountryCode("CN");
+//        stationInfo.setAreaCode("510903");
+//        stationInfo.setAreaCodeCountryside("510903000000");
+//        stationInfo.setAddress("灵泉大道中国石化僧家沟加油站B区旁边前进150米");
+//        stationInfo.setStationTel("18081278695");
+//        stationInfo.setServiceTel("18081278695");
+//        stationInfo.setStationType(1);
+//        stationInfo.setIsOpen(1);
+//        stationInfo.setStationStatus(5);
+//        stationInfo.setParkNums(10);
+//        stationInfo.setStationLng(new BigDecimal(105.616058).setScale(6, RoundingMode.HALF_EVEN));
+//        stationInfo.setStationLat(new BigDecimal(30.527943).setScale(6, RoundingMode.HALF_EVEN));
+//        stationInfo.setSiteGuide("-----");
+//        stationInfo.setConstruction(8);
+//        stationInfo.setPictures(Arrays.asList("https://comppad.didistatic.com/static/comp-pad/da2f2f5f52e2af3a.blob",
+//                "https://comppad.didistatic.com/static/comp-pad/19b79f9d586f78ed.blob",
+//                "https://comppad.didistatic.com/static/comp-pad/fedcbe7d7e342e6c.blob"));
+//        stationInfo.setMatchCars("司机乘用车、出租车");
+//        stationInfo.setParkInfo("");
+//        stationInfo.setParkOwner("");
+//        stationInfo.setParkManager("");
+//        stationInfo.setOpenAllDay(1);
+//        stationInfo.setBusinessHours("全天");
+//        stationInfo.setElectricityFee("0.49");
+//        stationInfo.setServiceFee("0.52");
+//        stationInfo.setParkFeeType(0);
+//        stationInfo.setParkFee("入场充电车辆,可享受停车减免2小时,超时按场地实际收费为准,临牌不支持减免");
+//        stationInfo.setPayment("线上");
+//        stationInfo.setSupportOrder(0);
+//        stationInfo.setRemark("");
+//        stationInfo.setParkFeeType(3);
+//        stationInfo.setToiletFlag(0);
+//        stationInfo.setStoreFlag(0);
+//        stationInfo.setLoungeFlag(0);
+//        stationInfo.setCanopyFlag(0);
+//        stationInfo.setPrinterFlag(0);
+//        stationInfo.setBarrierFlag(1);
+//        stationInfo.setParkingLockFlag(0);
+//        stationInfo.setIsDemandResponse(1);
+//        stationInfo.setIsSupportOrderlyCharging(1);
+//        stationInfo.setIsEnergyStorage(0);
+//        stationInfo.setElectricityType(3);
+//        stationInfo.setRatedPower(new BigDecimal(600));
+//        stationInfo.setPeriodFee(1);
+//        stationInfo.setOfficialRunTime("2024-12-31");
+//        stationInfo.setVideoMonitor(1);
+//        List<CDEquipmentInfo> equipmentInfos1 = new ArrayList<>();
+//        CDEquipmentInfo cdEquipmentInfo = new CDEquipmentInfo();
+//        cdEquipmentInfo.setEquipmentID("2024123100001001");
+//        cdEquipmentInfo.setManufacturerID("123456789");
+//        cdEquipmentInfo.setManufacturerName("12345");
+//        cdEquipmentInfo.setEquipmentModel("123");
+//        cdEquipmentInfo.setEquipmentProductCode("12345");
+//        cdEquipmentInfo.setEquipmentName("灵泉大道1号桩");
+//        cdEquipmentInfo.setProductionDate("2024-06-31");
+//        cdEquipmentInfo.setConstructionTime("2024-12-31");
+//        cdEquipmentInfo.setEquipmentType(1);
+//        cdEquipmentInfo.setEquipmentStatus(5);
+//        cdEquipmentInfo.setEquipmentPurpose(1);
+//        cdEquipmentInfo.setEquipmentPower(new BigDecimal(120));
+//        cdEquipmentInfo.setNewNationalStandard(1);
+//        cdEquipmentInfo.setEquipmentLng(new BigDecimal(105.616058).setScale(6, RoundingMode.HALF_EVEN));
+//        cdEquipmentInfo.setEquipmentLat(new BigDecimal(30.527943).setScale(6, RoundingMode.HALF_EVEN));
+//        cdEquipmentInfo.setVinFlag(0);
+//        List<ConnectorInfo> connectorInfos = new ArrayList<>();
+//        ConnectorInfo connectorInfo = new ConnectorInfo();
+//        connectorInfo.setConnectorID("202412310000100101");
+//        connectorInfo.setConnectorName("1号桩01枪");
+//        connectorInfo.setConnectorType(4);
+//        connectorInfo.setVoltageUpperLimits(new BigDecimal(380));
+//        connectorInfo.setVoltageLowerLimits(new BigDecimal(220));
+//        connectorInfo.setCurrent(120);
+//        connectorInfo.setPower(new BigDecimal(250));
+//        connectorInfo.setNationalStandard(2);
+//        connectorInfo.setAuxPower(1);
+//        connectorInfo.setOpreateStatus(5);
+//        connectorInfo.setParkNo("01");
+//        connectorInfos.add(connectorInfo);
+//        cdEquipmentInfo.setConnectorInfos(connectorInfos);
+//        equipmentInfos1.add(cdEquipmentInfo);
+//        stationInfo.setEquipmentInfos1(equipmentInfos1);
+//        ChengDuJianGuanUtil.notificationStationInfo(null, stationInfo);
+//    }
+
+
+
+//    public static void main(String[] args) {
+//        NotificationStationFee notificationStationFee = new NotificationStationFee();
+//        notificationStationFee.setOperatorID(OperatorID);
+//        notificationStationFee.setStationID("241231001");
+//        List<ChargeFeeDetail> chargeFeeDetail = new ArrayList<>();
+//        ChargeFeeDetail chargeFeeDetail1 = new ChargeFeeDetail();
+//        chargeFeeDetail1.setEquipmentType(1);
+//        chargeFeeDetail1.setStartTime("00:00");
+//        chargeFeeDetail1.setEndTime("23:59");
+//        chargeFeeDetail1.setElectricityFee(new BigDecimal(0.49));
+//        chargeFeeDetail1.setServiceFee(new BigDecimal(0.51));
+//        chargeFeeDetail.add(chargeFeeDetail1);
+//        notificationStationFee.setChargeFeeDetail(chargeFeeDetail);
+//        ChengDuJianGuanUtil.notificationStationFee(null, notificationStationFee);
+//    }
+
+
+//    public static void main(String[] args) {
+//        ConnectorStatusInfo connectorStatusInfo = new ConnectorStatusInfo();
+//        connectorStatusInfo.setOperatorID(OperatorID);
+//        connectorStatusInfo.setEquipmentOwnerID("M01234567");
+//        connectorStatusInfo.setStationID("241231001");
+//        connectorStatusInfo.setEquipmentID("2024123100001001");
+//        connectorStatusInfo.setEquipmentClassification(1);
+//        connectorStatusInfo.setConnectorID("202412310000100101");
+//        connectorStatusInfo.setStatus(1);
+//        connectorStatusInfo.setParkStatus(0);
+//        connectorStatusInfo.setLookStatus(0);
+//        ChengDuJianGuanUtil.notificationStationStatus(null, connectorStatusInfo);
+//    }
+
+
+//    public static void main(String[] args) {
+//        ConnectorChargeStatusInfo connectorChargeStatusInfo = new ConnectorChargeStatusInfo();
+//        connectorChargeStatusInfo.setOperatorID(OperatorID);
+//        connectorChargeStatusInfo.setEquipmentOwnerID("M01234567");
+//        connectorChargeStatusInfo.setStationID("241231001");
+//        connectorChargeStatusInfo.setEquipmentID("2024123100001001");
+//        connectorChargeStatusInfo.setStartChargeSeq("0000001");
+//        connectorChargeStatusInfo.setConnectorID("202412310000100101");
+//        connectorChargeStatusInfo.setConnectorStatus(3);
+//        connectorChargeStatusInfo.setOrderStatus(2);
+//        connectorChargeStatusInfo.setCurrentA(new BigDecimal(120));
+//        connectorChargeStatusInfo.setVoltageA(new BigDecimal(120));
+//        connectorChargeStatusInfo.setSoc(new BigDecimal(60));
+//        connectorChargeStatusInfo.setStartTime("2025-11-26 13:00:00");
+//        connectorChargeStatusInfo.setEndTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+//        connectorChargeStatusInfo.setPushTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+//        connectorChargeStatusInfo.setLastPushTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+//        connectorChargeStatusInfo.setTotalPower(new BigDecimal(20));
+//        connectorChargeStatusInfo.setElecMoney(new BigDecimal(22));
+//        connectorChargeStatusInfo.setSeviceMoney(new BigDecimal(28));
+//        connectorChargeStatusInfo.setTotalMoney(new BigDecimal(50));
+//        connectorChargeStatusInfo.setSoc1(new BigDecimal(62));
+//        ChengDuJianGuanUtil.notificationConnectorChargeStatus(null, connectorChargeStatusInfo);
+//    }
+
+
+
+//    public static void main(String[] args) {
+//        CDOrderInfo orderInfo = new CDOrderInfo();
+//        orderInfo.setOperatorID(OperatorID);
+//        orderInfo.setEquipmentOwnerID("M01234567");
+//        orderInfo.setStationID("241231001");
+//        orderInfo.setEquipmentID("2024123100001001");
+//        orderInfo.setConnectorID("202412310000100101");
+//        orderInfo.setEquipmentClassification(1);
+//        orderInfo.setStartChargeSeq("0000001");
+//        orderInfo.setUserChargeType(1);
+//        orderInfo.setMoney(new BigDecimal(50));
+//        orderInfo.setElectMoney(new BigDecimal(22));
+//        orderInfo.setServiceMoney(new BigDecimal(28));
+//        orderInfo.setElect(new BigDecimal(20));
+//        orderInfo.setStartTime("2025-11-26 13:00:00");
+//        orderInfo.setEndTime("2025-11-26 15:50:00");
+//        orderInfo.setPaymentAmount(new BigDecimal(50));
+//        orderInfo.setPayChannel(2);
+//        orderInfo.setStopReason(1);
+//        orderInfo.setPower(new BigDecimal(120));
+//        orderInfo.setChargeLast(10200);
+//        orderInfo.setMeterValueStart(new BigDecimal(0));
+//        orderInfo.setMeterValueEnd(new BigDecimal(0));
+//        orderInfo.setPushTimeStamp(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+//
+//        List<ChargeDetail> chargeDetails = new ArrayList<>();
+//        ChargeDetail chargeDetail = new ChargeDetail();
+//        chargeDetail.setDetailStartTime("2025-11-26 13:00:00");
+//        chargeDetail.setDetailEndTime("2025-11-26 15:50:00");
+//        chargeDetail.setElecPrice(new BigDecimal(0.49));
+//        chargeDetail.setSevicePrice(new BigDecimal(0.51));
+//        chargeDetail.setDetailPower(new BigDecimal(20));
+//        chargeDetail.setDetailElecMoney(new BigDecimal(22));
+//        chargeDetail.setDetailSeviceMoney(new BigDecimal(28));
+//        chargeDetails.add(chargeDetail);
+//        orderInfo.setChargeDetails(chargeDetails);
+//        ChengDuJianGuanUtil.notificationOrderInfo(null, orderInfo);
+//    }
+
+
+
+    /**
+     * 请求联联,获取token
+     */
+    public static String getToken(RedisTemplate redisTemplate) {
+        try {
+            Object o = redisTemplate.opsForValue().get("LLTOKEN");
+            if(null != o){
+                return o.toString();
+            }
+            // 请求data
+            Map<String, String> data = new HashMap<>();
+            data.put("OperatorID", OperatorID);
+            data.put("OperatorSecret", OperatorSecret);
+            String dataJson = JacksonUtils.toJson(data);
+
+            // 加密
+            byte[] encryptText = Cryptos.aesEncrypt(dataJson.getBytes("UTF-8"),
+                    DataSecret.getBytes(), DataSecretIV.getBytes());
+            String strData = Encodes.encodeBase64(encryptText);
+
+            Map<String, String> request = new LinkedHashMap<>();
+            request.put("OperatorID", OperatorID);
+            request.put("Data", strData);
+            request.put("TimeStamp", System.currentTimeMillis() + "");
+            request.put("Seq", "0001");
+
+            // 生成签名
+            String sig = GBSignUtils.sign(request, SigSecret);
+            request.put("Sig", sig);
+            String tokenRequest = JacksonUtils.toJson(request);
+            log.info("【成都监管-获取token】请求参数明文:" + dataJson);
+            log.info("【成都监管-获取token】请求参数密文:" + tokenRequest);
+            String response = HttpUtil.post(requestUrl + "/query_token", tokenRequest);
+            EDIMessagePack result = JacksonUtils.toObj(response, EDIMessagePack.class);
+            log.info("【成都监管-获取token】响应参数密文:" + response);
+            if (result.getRet() == 0) {
+                //解密data
+                byte[] plainText = Cryptos.aesDecrypt(Encodes.decodeBase64((String) result.getData()),
+                        DataSecret.getBytes(), DataSecretIV.getBytes());
+                String dataStr = new String(plainText, "UTF-8");
+                log.info("【成都监管-获取token】响应参数明文:" + dataStr);
+                JSONObject jsonObject = JSON.parseObject(dataStr);
+
+                String accessToken = jsonObject.getString("AccessToken");
+                Long tokenAvailableTime = jsonObject.getLong("TokenAvailableTime");
+                redisTemplate.opsForValue().set("LLTOKEN", accessToken, Long.valueOf(tokenAvailableTime), TimeUnit.SECONDS);
+                return accessToken;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.info("【成都监管-获取token】获取Token异常", e);
+        }
+        return null;
+    }
+
+
+    /**
+     * 充电站信息变化推送
+     * @param redisTemplate
+     * @param stationInfo
+     */
+    public static void notificationStationInfo(RedisTemplate redisTemplate, CDStationInfo stationInfo){
+        try {
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("StationInfo", stationInfo);
+            String dataJson = JacksonUtils.toJson(jsonObject);
+            byte[] encryptText = Cryptos.aesEncrypt(dataJson.getBytes("UTF-8"),
+                    DataSecret.getBytes(), DataSecretIV.getBytes());
+            String strData = Encodes.encodeBase64(encryptText);
+
+            Map<String, String> request = new LinkedHashMap<>();
+            request.put("OperatorID", OperatorID);
+            request.put("Data", strData);
+            request.put("TimeStamp", System.currentTimeMillis() + "");
+            request.put("Seq", "0001");
+
+            //生成签名
+            String sig = GBSignUtils.sign(request, SigSecret);
+            request.put("Sig", sig);
+            String notifyStartResult = JacksonUtils.toJson(request);
+            log.info("【成都监管-充电站信息变化推送】请求参数明文:" + dataJson);
+            log.info("【成都监管-充电站信息变化推送】请求参数密文:" + notifyStartResult);
+            String response = HttpRequestUtil.httpPost(requestUrl + "/notification_stationInfo", notifyStartResult, "Bearer " + getToken(redisTemplate));
+            log.info("【成都监管-充电站信息变化推送】响应参数密文:" + response);
+            EDIMessagePack result = JacksonUtils.toObj(response, EDIMessagePack.class);
+            if(4002 == result.getRet()){
+                redisTemplate.delete("LLTOKEN");
+                notificationStationInfo(redisTemplate, stationInfo);
+                return;
+            }
+            if(0 != result.getRet()){
+                log.info("【成都监管-充电站信息变化推送】失败:", result.getMsg());
+                return;
+            }
+            String rData = result.getData().toString();
+            byte[] plainText = Cryptos.aesDecrypt(Encodes.decodeBase64(rData),
+                    DataSecret.getBytes(), DataSecretIV.getBytes());
+            String plainData = new String(plainText, "UTF-8");
+            log.info("【成都监管-充电站信息变化推送】响应参数明文:" + plainData);
+
+        }catch (Exception e){
+            e.printStackTrace();
+            log.info("【成都监管-充电站信息变化推送】异常:" + e.getMessage());
+        }
+    }
+
+
+    /**
+     * 站点费率变化推送
+     * @param redisTemplate
+     * @param notificationStationFee
+     */
+    public static void notificationStationFee(RedisTemplate redisTemplate, NotificationStationFee notificationStationFee){
+        try {
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("StationFee", notificationStationFee);
+            String dataJson = JacksonUtils.toJson(jsonObject);
+            byte[] encryptText = Cryptos.aesEncrypt(dataJson.getBytes("UTF-8"),
+                    DataSecret.getBytes(), DataSecretIV.getBytes());
+            String strData = Encodes.encodeBase64(encryptText);
+
+            Map<String, String> request = new LinkedHashMap<>();
+            request.put("OperatorID", OperatorID);
+            request.put("Data", strData);
+            request.put("TimeStamp", System.currentTimeMillis() + "");
+            request.put("Seq", "0001");
+
+            //生成签名
+            String sig = GBSignUtils.sign(request, SigSecret);
+            request.put("Sig", sig);
+            String notifyStartResult = JacksonUtils.toJson(request);
+            log.info("【成都监管-站点费率变化推送】请求参数明文:" + dataJson);
+            log.info("【成都监管-站点费率变化推送】请求参数密文:" + notifyStartResult);
+            String response = HttpRequestUtil.httpPost(requestUrl + "/notification_stationFee", notifyStartResult, "Bearer " + getToken(redisTemplate));
+            log.info("【成都监管-站点费率变化推送】响应参数密文:" + response);
+            EDIMessagePack result = JacksonUtils.toObj(response, EDIMessagePack.class);
+            if(4002 == result.getRet()){
+                redisTemplate.delete("LLTOKEN");
+                notificationStationFee(redisTemplate, notificationStationFee);
+                return;
+            }
+            if(0 != result.getRet()){
+                log.info("【成都监管-站点费率变化推送】失败:", result.getMsg());
+                return;
+            }
+            String rData = result.getData().toString();
+            byte[] plainText = Cryptos.aesDecrypt(Encodes.decodeBase64(rData),
+                    DataSecret.getBytes(), DataSecretIV.getBytes());
+            String plainData = new String(plainText, "UTF-8");
+            log.info("【成都监管-站点费率变化推送】响应参数明文:" + plainData);
+
+        }catch (Exception e){
+            e.printStackTrace();
+            log.info("【成都监管-站点费率变化推送】异常:" + e.getMessage());
+        }
+    }
+
+
+    /**
+     * 设备状态变化推送
+     * @param redisTemplate
+     * @param connectorStatusInfo
+     */
+    public static void notificationStationStatus(RedisTemplate redisTemplate, ConnectorStatusInfo connectorStatusInfo){
+        try {
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("ConnectorStatusInfo", connectorStatusInfo);
+            String dataJson = JacksonUtils.toJson(jsonObject);
+            byte[] encryptText = Cryptos.aesEncrypt(dataJson.getBytes("UTF-8"),
+                    DataSecret.getBytes(), DataSecretIV.getBytes());
+            String strData = Encodes.encodeBase64(encryptText);
+            Map<String, String> request = new LinkedHashMap<>();
+            request.put("OperatorID", OperatorID);
+            request.put("Data", strData);
+            request.put("TimeStamp", System.currentTimeMillis() + "");
+            request.put("Seq", "0001");
+
+            //生成签名
+            String sig = GBSignUtils.sign(request, SigSecret);
+            request.put("Sig", sig);
+            String notifyStartResult = JacksonUtils.toJson(request);
+            log.info("【成都监管-设备状态变化推送】请求参数明文:" + dataJson);
+            log.info("【成都监管-设备状态变化推送】请求参数密文:" + notifyStartResult);
+            String response = HttpRequestUtil.httpPost(requestUrl + "/notification_stationStatus", notifyStartResult, "Bearer " + getToken(redisTemplate));
+            log.info("【成都监管-设备状态变化推送】响应参数密文:" + response);
+            EDIMessagePack result = JacksonUtils.toObj(response, EDIMessagePack.class);
+            if(4002 == result.getRet()){
+                redisTemplate.delete("LLTOKEN");
+                notificationStationStatus(redisTemplate, connectorStatusInfo);
+                return;
+            }
+            if(0 != result.getRet()){
+                log.info("【成都监管-站点费率变化推送】失败:", result.getMsg());
+                return;
+            }
+            String rData = result.getData().toString();
+            byte[] plainText = Cryptos.aesDecrypt(Encodes.decodeBase64(rData),
+                    DataSecret.getBytes(), DataSecretIV.getBytes());
+            String plainData = new String(plainText, "UTF-8");
+            log.info("【成都监管-设备状态变化推送】响应参数明文:" + plainData);
+
+        }catch (Exception e){
+            e.printStackTrace();
+            log.info("【成都监管-设备状态变化推送】异常:" + e.getMessage());
+        }
+    }
+
+
+    /**
+     * 设备充电中状态变化推送
+     * @param redisTemplate
+     * @param connectorChargeStatusInfo
+     */
+    public static void notificationConnectorChargeStatus(RedisTemplate redisTemplate, ConnectorChargeStatusInfo connectorChargeStatusInfo){
+        try {
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("ConnectorChargeStatusInfo", connectorChargeStatusInfo);
+            String dataJson = JacksonUtils.toJson(jsonObject);
+            byte[] encryptText = Cryptos.aesEncrypt(dataJson.getBytes("UTF-8"),
+                    DataSecret.getBytes(), DataSecretIV.getBytes());
+            String strData = Encodes.encodeBase64(encryptText);
+            Map<String, String> request = new LinkedHashMap<>();
+            request.put("OperatorID", OperatorID);
+            request.put("Data", strData);
+            request.put("TimeStamp", System.currentTimeMillis() + "");
+            request.put("Seq", "0001");
+
+            //生成签名
+            String sig = GBSignUtils.sign(request, SigSecret);
+            request.put("Sig", sig);
+            String notifyStartResult = JacksonUtils.toJson(request);
+            log.info("【成都监管-设备充电中状态变化推送】请求参数明文:" + dataJson);
+            log.info("【成都监管-设备充电中状态变化推送】请求参数密文:" + notifyStartResult);
+            String response = HttpRequestUtil.httpPost(requestUrl + "/notification_connector_charge_status", notifyStartResult, "Bearer " + getToken(redisTemplate));
+            log.info("【成都监管-设备充电中状态变化推送】响应参数密文:" + response);
+            EDIMessagePack result = JacksonUtils.toObj(response, EDIMessagePack.class);
+            if(4002 == result.getRet()){
+                redisTemplate.delete("LLTOKEN");
+                notificationConnectorChargeStatus(redisTemplate, connectorChargeStatusInfo);
+                return;
+            }
+            if(0 != result.getRet()){
+                log.info("【成都监管-站点费率变化推送】失败:", result.getMsg());
+                return;
+            }
+            String rData = result.getData().toString();
+            byte[] plainText = Cryptos.aesDecrypt(Encodes.decodeBase64(rData),
+                    DataSecret.getBytes(), DataSecretIV.getBytes());
+            String plainData = new String(plainText, "UTF-8");
+            log.info("【成都监管-设备充电中状态变化推送】响应参数明文:" + plainData);
+
+        }catch (Exception e){
+            e.printStackTrace();
+            log.info("【成都监管-设备充电中状态变化推送】异常:" + e.getMessage());
+        }
+    }
+
+
+    /**
+     * 订单信息推送
+     * @param redisTemplate
+     * @param orderInfo
+     */
+    public static void notificationOrderInfo(RedisTemplate redisTemplate, CDOrderInfo orderInfo){
+        try {
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("OrderInfo", orderInfo);
+            String dataJson = JacksonUtils.toJson(jsonObject);
+            byte[] encryptText = Cryptos.aesEncrypt(dataJson.getBytes("UTF-8"),
+                    DataSecret.getBytes(), DataSecretIV.getBytes());
+            String strData = Encodes.encodeBase64(encryptText);
+            Map<String, String> request = new LinkedHashMap<>();
+            request.put("OperatorID", OperatorID);
+            request.put("Data", strData);
+            request.put("TimeStamp", System.currentTimeMillis() + "");
+            request.put("Seq", "0001");
+
+            //生成签名
+            String sig = GBSignUtils.sign(request, SigSecret);
+            request.put("Sig", sig);
+            String notifyStartResult = JacksonUtils.toJson(request);
+            log.info("【成都监管-订单信息推送】请求参数明文:" + dataJson);
+            log.info("【成都监管-订单信息推送】请求参数密文:" + notifyStartResult);
+            String response = HttpRequestUtil.httpPost(requestUrl + "/notification_orderInfo", notifyStartResult, "Bearer " + getToken(redisTemplate));
+            log.info("【成都监管-订单信息推送】响应参数密文:" + response);
+            EDIMessagePack result = JacksonUtils.toObj(response, EDIMessagePack.class);
+            if(4002 == result.getRet()){
+                redisTemplate.delete("LLTOKEN");
+                notificationOrderInfo(redisTemplate, orderInfo);
+                return;
+            }
+            if(0 != result.getRet()){
+                log.info("【成都监管-站点费率变化推送】失败:", result.getMsg());
+                return;
+            }
+            String rData = result.getData().toString();
+            byte[] plainText = Cryptos.aesDecrypt(Encodes.decodeBase64(rData),
+                    DataSecret.getBytes(), DataSecretIV.getBytes());
+            String plainData = new String(plainText, "UTF-8");
+            log.info("【成都监管-订单信息推送】响应参数明文:" + plainData);
+
+        }catch (Exception e){
+            e.printStackTrace();
+            log.info("【成都监管-订单信息推送】异常:" + e.getMessage());
+        }
+    }
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/enu/ConnectorTypeEnum.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/enu/ConnectorTypeEnum.java
new file mode 100644
index 0000000..aac974a
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/enu/ConnectorTypeEnum.java
@@ -0,0 +1,39 @@
+package com.ruoyi.jianguan.chengdujianguan.enu;
+
+/**
+ * 充电设备接口类型
+ * @author zhibing.pu
+ * @Date 2025/1/21 14:14
+ */
+public enum ConnectorTypeEnum {
+	HOUSEHOLD_SOCKET(1, "家用插座"),
+	AC_SOCKET(2, "交流接口插座"),
+	AC_INTERFACE_PLUG(3, "交流接口插头"),
+	DC_INTERFACE_GUN_HEAD(4, "直流接口枪头"),
+	WIRELESS_CHARGING_STAND(5, "无线充电座"),
+	OTHER(6, "其他")
+	;
+	private Integer type;
+	private String note;
+	
+	ConnectorTypeEnum(Integer type, String note) {
+		this.type = type;
+		this.note = note;
+	}
+	
+	public Integer getType() {
+		return type;
+	}
+	
+	public void setType(Integer type) {
+		this.type = type;
+	}
+	
+	public String getNote() {
+		return note;
+	}
+	
+	public void setNote(String note) {
+		this.note = note;
+	}
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/enu/ConstructionEnum.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/enu/ConstructionEnum.java
new file mode 100644
index 0000000..a9f8aad
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/enu/ConstructionEnum.java
@@ -0,0 +1,49 @@
+package com.ruoyi.jianguan.chengdujianguan.enu;
+
+/**
+ * 建设场所
+ * @author zhibing.pu
+ * @Date 2025/1/21 13:25
+ */
+public enum ConstructionEnum {
+	RESIDENTIAL_AREA(1, "居民区"),
+	PUBLIC_INSTITUTION(2, "公共机构"),
+	ENTERPRISE(3, "企事业单位"),
+	OFFICE_BUILDING(4, "写字楼"),
+	INDUSTRIAL_PARK(5, "工业园区"),
+	TRANSPORTATION_JUNCTION(6, "交通枢纽"),
+	CULTURE_AND_SPORTS(7, "大型文体设施"),
+	URBAN_GREEN_SPACE(8, "城市绿地"),
+	ANCILLARY_PARKING_LOT(9, "大型建筑配建停车场"),
+	OFF_STREET_PARKING_SPACE(10, "路边停车位"),
+	HIGH_SPEED_SERVICE_AREA(11, "城际高速服务区"),
+	SCENIC_SPOT(12, "风景区"),
+	BUS_YARD(13, "公交场站"),
+	REFUELING_STATION(14, "加油加气站"),
+	TAXI(15, "出租车"),
+	OTHER(255, "其他");
+	
+	private Integer type;
+	private String note;
+	
+	ConstructionEnum(Integer type, String note) {
+		this.type = type;
+		this.note = note;
+	}
+	
+	public Integer getType() {
+		return type;
+	}
+	
+	public void setType(Integer type) {
+		this.type = type;
+	}
+	
+	public String getNote() {
+		return note;
+	}
+	
+	public void setNote(String note) {
+		this.note = note;
+	}
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/enu/EquipmentTypeEnum.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/enu/EquipmentTypeEnum.java
new file mode 100644
index 0000000..9310697
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/enu/EquipmentTypeEnum.java
@@ -0,0 +1,42 @@
+package com.ruoyi.jianguan.chengdujianguan.enu;
+
+/**
+ * 设备类型
+ * @author zhibing.pu
+ * @Date 2025/1/21 13:59
+ */
+public enum EquipmentTypeEnum {
+	DIRECT_CURRENT(1, "直流设备"),
+	ALTERNATING_CURRENT(2, "交流设备"),
+	ALTERNATING_DIRECT(3, "交直流一体设备"),
+	WIRELESS_DEVICE(4, "无线设备"),
+	OTHER(5, "其他"),
+	ORDER(6, "有序"),
+	V2G(7, "V2G")
+	;
+	
+	
+	private Integer type;
+	private String note;
+	
+	EquipmentTypeEnum(Integer type, String note) {
+		this.type = type;
+		this.note = note;
+	}
+	
+	public Integer getType() {
+		return type;
+	}
+	
+	public void setType(Integer type) {
+		this.type = type;
+	}
+	
+	public String getNote() {
+		return note;
+	}
+	
+	public void setNote(String note) {
+		this.note = note;
+	}
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/enu/InterfaceUrlEnum.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/enu/InterfaceUrlEnum.java
new file mode 100644
index 0000000..fe8c9b8
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/enu/InterfaceUrlEnum.java
@@ -0,0 +1,43 @@
+package com.ruoyi.jianguan.chengdujianguan.enu;
+
+/**
+ * 接口地址枚举
+ * @author zhibing.pu
+ * @Date 2025/1/21 14:38
+ */
+public enum InterfaceUrlEnum {
+	QUERY_TOKEN("/query_token", "获取权限token"),
+	NOTIFICATION_STATION_STATUS("/notification_stationStatus", "设备状态变化推送"),
+	NOTIFICATION_STATION_CHANGE("/notification_station_change", "站点计费策略变更推送"),
+	NOTIFICATION_START_CHARGE_RESULT("/notification_start_charge_result", "推送启动充电结果"),
+	NOTIFICATION_EQUIP_CHARGE_STATUS("/notification_equip_charge_status", "推送充电状态"),
+	NOTIFICATION_STOP_CHARGE_RESULT("/notification_stop_charge_result", "推送停止充电结果"),
+	NOTIFICATION_CHARGE_ORDER_INFO("/notification_charge_order_info", "推送充电订单信息"),
+	CHECK_CHARGE_ORDERS("/check_charge_orders", "推送订单对账结果信息"),
+	;
+	
+	private String url;
+	private String note;
+	
+	InterfaceUrlEnum(String url, String note) {
+		this.url = url;
+		this.note = note;
+	}
+	
+	
+	public String getUrl() {
+		return url;
+	}
+	
+	public void setUrl(String url) {
+		this.url = url;
+	}
+	
+	public String getNote() {
+		return note;
+	}
+	
+	public void setNote(String note) {
+		this.note = note;
+	}
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/enu/StationStatusEnum.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/enu/StationStatusEnum.java
new file mode 100644
index 0000000..a00313a
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/enu/StationStatusEnum.java
@@ -0,0 +1,38 @@
+package com.ruoyi.jianguan.chengdujianguan.enu;
+
+/**
+ * 站点状态
+ * @author zhibing.pu
+ * @Date 2025/1/21 12:10
+ */
+public enum StationStatusEnum {
+	UNKNOWN(0, "未知"),
+	UNDER_CONSTRUCTION(1, "建设中"),
+	OFF_LINE(5, "关闭下线"),
+	MAINTAIN(6, "维护中"),
+	NORMAL_USE(50, "正常使用")
+	;
+	private Integer status;
+	private String note;
+	
+	StationStatusEnum(Integer status, String note) {
+		this.status = status;
+		this.note = note;
+	}
+	
+	public Integer getStatus() {
+		return status;
+	}
+	
+	public void setStatus(Integer status) {
+		this.status = status;
+	}
+	
+	public String getNote() {
+		return note;
+	}
+	
+	public void setNote(String note) {
+		this.note = note;
+	}
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/enu/StationTypeEnum.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/enu/StationTypeEnum.java
new file mode 100644
index 0000000..90da4ce
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/enu/StationTypeEnum.java
@@ -0,0 +1,45 @@
+package com.ruoyi.jianguan.chengdujianguan.enu;
+
+/**
+ * 站点类型
+ * @author zhibing.pu
+ * @Date 2025/1/21 12:00
+ */
+public enum StationTypeEnum {
+	PUBLIC(1, "公共"),
+	PERSONAGE(50, "个人"),
+	BUS_SPECIFIC(100, "公交(专用)"),
+	SANITATION_SPECIFIC(101, "环卫(专用)"),
+	LOGISTICS_SPECIFIC(102, "物流(专用)"),
+	TEXT_SPECIFIC(103, "出租车(专用)"),
+	PERIODIC_LEASE(104, "分时租赁(专用)"),
+	CELL_SHARING(105, "小区共享(专用)"),
+	DEPARTMENT(106, "单位(专用)"),
+	PRIVATE_SHARED_PILE(107, "私人共享桩(专用)"),
+	OTHER(255, "其他")
+	;
+	
+	private Integer type;
+	private String note;
+	
+	StationTypeEnum(Integer type, String note) {
+		this.type = type;
+		this.note = note;
+	}
+	
+	public Integer getType() {
+		return type;
+	}
+	
+	public void setType(Integer type) {
+		this.type = type;
+	}
+	
+	public String getNote() {
+		return note;
+	}
+	
+	public void setNote(String note) {
+		this.note = note;
+	}
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/CDEquipmentInfo.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/CDEquipmentInfo.java
new file mode 100644
index 0000000..72fa45a
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/CDEquipmentInfo.java
@@ -0,0 +1,68 @@
+package com.ruoyi.jianguan.chengdujianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ruoyi.jianguan.model.EquipmentInfo;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 充电设备信息
+ */
+@Data
+public class CDEquipmentInfo extends EquipmentInfo {
+    /**
+     * 设备出厂编码
+     */
+    @JsonProperty("EquipmentProductCode")
+    private String equipmentProductCode;
+    /**
+     * 建设时间
+     * yyyy-MM-dd
+     */
+    @JsonProperty("ConstructionTime")
+    private String constructionTime;
+    /**
+     * 设备状态
+     * 0:未知
+     * 1:建设中
+     * 5:关闭下线
+     * 6:维护中
+     * 50:正常使用
+     */
+    @JsonProperty("EquipmentStatus")
+    private Integer equipmentStatus;
+    /**
+     * 设备用途
+     * 1:公共
+     * 50:个人
+     * 100:公交(专用)
+     * 101:环卫(专用)
+     * 102:物流(专用)
+     * 103:出租车(专用)
+     * 104:分时租赁(专用)
+     * 106:单位(专用)
+     * 107:移动站点(移动储能设备)
+     * 108:居民小区(公共)
+     * 109:居民小区(专用)
+     */
+    @JsonProperty("EquipmentPurpose")
+    private Integer equipmentPurpose;
+    /**
+     * 额定功率
+     */
+    @JsonProperty("EquipmentPower")
+    private BigDecimal equipmentPower;
+    /**
+     * 新国标
+     * 0:否,1:是
+     */
+    @JsonProperty("NewNationalStandard")
+    private Integer newNationalStandard;
+    /**
+     * 是否支持VIN码识别
+     * 0:否,1:是
+     */
+    @JsonProperty("VinFlag")
+    private Integer vinFlag;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/CDOrderInfo.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/CDOrderInfo.java
new file mode 100644
index 0000000..159660f
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/CDOrderInfo.java
@@ -0,0 +1,122 @@
+package com.ruoyi.jianguan.chengdujianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ruoyi.jianguan.model.ChargeDetail;
+import com.ruoyi.jianguan.model.SupChargeOrderInfo;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class CDOrderInfo extends SupChargeOrderInfo {
+    /**
+     * 充电订单号
+     */
+    @JsonProperty("StartChargeSeq")
+    private String startChargeSeq;
+    /**
+     * 用户发起充电类型
+     * 1:非蓉城充启动
+     * 2:卡启动
+     * 3:蓉城充启动
+     * 10:其他
+     */
+    @JsonProperty("UserChargeType")
+    private Integer userChargeType;
+    /**
+     * 用户手机号
+     */
+    @JsonProperty("MobileNumber")
+    private String mobileNumber;
+    /**
+     * 本次充电消费总金额
+     */
+    @JsonProperty("Money")
+    private BigDecimal money;
+    /**
+     * 本次充电电费总金额
+     */
+    @JsonProperty("ElectMoney")
+    private BigDecimal electMoney;
+    /**
+     * 本次充电服务费总金额
+     */
+    @JsonProperty("ServiceMoney")
+    private BigDecimal serviceMoney;
+    /**
+     * 本次充电电量
+     */
+    @JsonProperty("Elect")
+    private BigDecimal elect;
+    /**
+     * 本次充放电开始时间
+     * yyyy-MM-dd HH:mm:ss
+     */
+    @JsonProperty("StartTime")
+    private String startTime;
+    /**
+     * 本次充放电开始时间
+     * yyyy-MM-dd HH:mm:ss
+     */
+    @JsonProperty("EndTime")
+    private String endTime;
+    /**
+     * 支付金额
+     */
+    @JsonProperty("PaymentAmount")
+    private BigDecimal paymentAmount;
+    /**
+     * 支付方式
+     * 1:支付宝
+     * 2:微信支付
+     * 3:交通卡
+     * 4:预充卡
+     * 5:银联
+     * 6:其他自定义
+     */
+    @JsonProperty("PayChannel")
+    private Integer payChannel;
+    /**
+     * 结束充电原因
+     * 0:用户手动停止充电
+     * 1:客户归属运营商平台停止充电
+     * 2:BMS停止充电
+     * 3:充电机设备故障
+     * 4:连接器断开
+     * 5-99:自定义
+     */
+    @JsonProperty("StopReason")
+    private Integer stopReason;
+    /**
+     * 接口额定功率
+     */
+    @JsonProperty("Power")
+    private BigDecimal power;
+    /**
+     * 充电时长 秒
+     */
+    @JsonProperty("ChargeLast")
+    private Long chargeLast;
+    /**
+     * 电表总起值
+     */
+    @JsonProperty("MeterValueStart")
+    private BigDecimal meterValueStart;
+    /**
+     * 电表总止值
+     */
+    @JsonProperty("MeterValueEnd")
+    private BigDecimal meterValueEnd;
+    /**
+     * 充电明细信息
+     */
+    @JsonProperty("ChargeDetails")
+    private List<ChargeDetail> chargeDetails;
+    /**
+     * 推送时间
+     * yyyy-MM-dd HH:mm:ss
+     */
+    @JsonProperty("PushTimeStamp")
+    private String pushTimeStamp;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/CDStationInfo.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/CDStationInfo.java
new file mode 100644
index 0000000..a7c727c
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/CDStationInfo.java
@@ -0,0 +1,128 @@
+package com.ruoyi.jianguan.chengdujianguan.model;
+
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ruoyi.jianguan.model.StationInfo;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Null;
+import java.util.List;
+
+
+/**
+ * 充电站信息
+ */
+@Data
+public class CDStationInfo extends StationInfo {
+    /**
+     * 是否独立报桩
+     * 0否,1是
+     */
+    @JsonProperty("IsAloneApply")
+    private Integer isAloneApply;
+    /**
+     * 户号
+     * 国家电网账单户号
+     */
+    @JsonProperty("AccountNumber")
+    private String accountNumber;
+    /**
+     * 小区是否对外开放
+     * 0:否,1:是
+     */
+    @JsonProperty("IsOpen")
+    private Integer isOpen;
+    /**
+     * 停车场产权人
+     */
+    @JsonProperty("ParkOwner")
+    private String parkOwner;
+    /**
+     * 停车场管理人
+     */
+    @JsonProperty("ParkManager")
+    private String parkManager;
+    /**
+     * 是否全天开放
+     * 0:否,1:是
+     */
+    @JsonProperty("OpenAllDay")
+    private Integer openAllDay;
+    /**
+     * 营业时间
+     */
+    @Null
+    @JsonProperty("BusinessHours")
+    private String businessHours;
+    /**
+     * 停车收费类型
+     * 0:停车收费
+     * 1:停车免费
+     * 2:限时免费
+     * 3:充电限免
+     */
+    @JsonProperty("ParkFeeType")
+    private Integer parkFeeType;
+    /**
+     * 是否配备卫生间
+     * 0:无,1:有
+     */
+    @JsonProperty("ToiletFlag")
+    private Integer toiletFlag;
+    /**
+     * 是否配备便利店
+     * 0:无,1:有
+     */
+    @JsonProperty("StoreFlag")
+    private Integer storeFlag;
+    /**
+     * 是否配备休息室
+     * 0:无,1:有
+     */
+    @JsonProperty("LoungeFlag")
+    private Integer loungeFlag;
+    /**
+     * 是否配备雨棚
+     * 0:无,1:有
+     */
+    @JsonProperty("CanopyFlag")
+    private Integer canopyFlag;
+    /**
+     * 是否有道闸
+     * 0:无,1:有
+     */
+    @JsonProperty("BarrierFlag")
+    private Integer barrierFlag;
+    /**
+     * 是否有地锁
+     * 0:无,1:有
+     */
+    @JsonProperty("ParkingLockFlag")
+    private Integer parkingLockFlag;
+    /**
+     * 是否参与需求响应
+     * 0:无,1:有
+     */
+    @JsonProperty("IsDemandResponse")
+    private Integer isDemandResponse;
+    /**
+     * 有序充电场站
+     * 0:无,1:有
+     */
+    @JsonProperty("IsSupportOrderlyCharging")
+    private Integer isSupportOrderlyCharging;
+    /**
+     * 是否有储能设施
+     * 0:无,1:有
+     */
+    @JsonProperty("IsEnergyStorage")
+    private Integer isEnergyStorage;
+    /**
+     * 充电设备信息列表
+     */
+    @NotNull
+    @JsonProperty("EquipmentInfos")
+    private List<CDEquipmentInfo> equipmentInfos1;
+
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/ChargeFeeDetail.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/ChargeFeeDetail.java
new file mode 100644
index 0000000..b25e28d
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/ChargeFeeDetail.java
@@ -0,0 +1,41 @@
+package com.ruoyi.jianguan.chengdujianguan.model;
+
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class ChargeFeeDetail {
+    /**
+     * 设备类型
+     * 1:直流设备
+     * 2:交流设备
+     * 3:交直流一体设备
+     */
+    @JsonProperty("EquipmentType")
+    private Integer equipmentType;
+    /**
+     * 计费开始时间
+     * 00:00
+     */
+    @JsonProperty("StartTime")
+    private String startTime;
+    /**
+     * 计费结束时间
+     * 00:00
+     */
+    @JsonProperty("EndTime")
+    private String endTime;
+    /**
+     * 电费
+     */
+    @JsonProperty("ElectricityFee")
+    private BigDecimal electricityFee;
+    /**
+     * 服务费
+     */
+    @JsonProperty("ServiceFee")
+    private BigDecimal serviceFee;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/ConnectorChargeStatusInfo.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/ConnectorChargeStatusInfo.java
new file mode 100644
index 0000000..1ddd450
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/ConnectorChargeStatusInfo.java
@@ -0,0 +1,129 @@
+package com.ruoyi.jianguan.chengdujianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class ConnectorChargeStatusInfo {
+    /**
+     * 运营平台ID
+     */
+    @JsonProperty("OperatorID")
+    private String operatorID;
+    /**
+     * 产权所属单位ID
+     */
+    @JsonProperty("EquipmentOwnerID")
+    private String equipmentOwnerID;
+    /**
+     * 充电站ID
+     */
+    @JsonProperty("StationID")
+    private String stationID;
+    /**
+     * 充电设备编码
+     */
+    @JsonProperty("EquipmentID")
+    private String equipmentID;
+    /**
+     * 充电订单号
+     */
+    @JsonProperty("StartChargeSeq")
+    private String startChargeSeq;
+    /**
+     * 充电设备接口编码
+     */
+    @JsonProperty("ConnectorID")
+    private String connectorID;
+    /**
+     * 充电设备接口状态
+     * 1:空闲
+     * 2:占用(未充电)
+     * 3:占用(充电中)
+     * 4:占用(预约锁定)
+     * 5:占用(放电中)
+     * 255:故障
+     */
+    @JsonProperty("ConnectorStatus")
+    private Integer connectorStatus;
+    /**
+     * 充电订单状态
+     * 1:启动中
+     * 2:充电中
+     * 3:停止中
+     * 4:充放电完成
+     * 5:订单挂起
+     * 6:充电异常结束
+     * 7:启动失败
+     * 8:放电中
+     */
+    @JsonProperty("OrderStatus")
+    private Integer orderStatus;
+    /**
+     * A相电流
+     */
+    @JsonProperty("CurrentA")
+    private BigDecimal currentA;
+    /**
+     * A相电压
+     */
+    @JsonProperty("VoltageA")
+    private BigDecimal voltageA;
+    /**
+     * 电池剩余电量
+     */
+    @JsonProperty("Soc")
+    private BigDecimal soc;
+    /**
+     * 开始充电时间
+     * yyyy-MM-dd HH:mm:ss
+     */
+    @JsonProperty("StartTime")
+    private String startTime;
+    /**
+     * 结束充电时间
+     * yyyy-MM-dd HH:mm:ss
+     */
+    @JsonProperty("EndTime")
+    private String endTime;
+    /**
+     * 本次推送时间
+     * yyyy-MM-dd HH:mm:ss
+     */
+    @JsonProperty("PushTime")
+    private String pushTime;
+    /**
+     * 上次推送时间
+     * yyyy-MM-dd HH:mm:ss
+     */
+    @JsonProperty("LastPushTime")
+    private String lastPushTime;
+    /**
+     * 累计充电量
+     */
+    @JsonProperty("TotalPower")
+    private BigDecimal totalPower;
+    /**
+     * 累计电费
+     */
+    @JsonProperty("ElecMoney")
+    private BigDecimal elecMoney;
+    /**
+     * 累计服务费
+     */
+    @JsonProperty("SeviceMoney")
+    private BigDecimal seviceMoney;
+    /**
+     * 累计总金额
+     */
+    @JsonProperty("TotalMoney")
+    private BigDecimal totalMoney;
+    /**
+     * 电池剩余电量
+     */
+    @JsonProperty("SOC")
+    private BigDecimal soc1;
+
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/EDIMessagePack.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/EDIMessagePack.java
new file mode 100644
index 0000000..8fe6744
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/EDIMessagePack.java
@@ -0,0 +1,39 @@
+package com.ruoyi.jianguan.chengdujianguan.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+/**
+ * 返回结果
+ *
+ * @author 联联充电
+ *
+ */
+@Data
+public class EDIMessagePack {
+
+	/**
+	 * 系统错误码
+	 */
+	@JsonProperty("Ret")
+	int ret = 0;
+
+	/**
+	 * 返回提示信息
+	 */
+	@JsonProperty("Msg")
+	String msg = "";
+
+	/**
+	 * 返回结果
+	 */
+	@JsonProperty("Data")
+	Object data;
+
+	/**
+	 * 签名
+	 */
+	@JsonProperty("Sig")
+	String sig;
+
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/NotificationStationFee.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/NotificationStationFee.java
new file mode 100644
index 0000000..d1b4685
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/NotificationStationFee.java
@@ -0,0 +1,29 @@
+package com.ruoyi.jianguan.chengdujianguan.model;
+
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 站点费率
+ */
+@Data
+public class NotificationStationFee {
+    /**
+     * 运营平台ID
+     */
+    @JsonProperty("OperatorID")
+    private String operatorID;
+    /**
+     * 充电站ID
+     */
+    @JsonProperty("StationID")
+    private String stationID;
+    /**
+     * 费率详情
+     */
+    @JsonProperty("ChargeFeeDetail")
+    private List<ChargeFeeDetail> chargeFeeDetail;
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Cryptos.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Cryptos.java
new file mode 100644
index 0000000..f3de662
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Cryptos.java
@@ -0,0 +1,249 @@
+/**
+ */
+package com.ruoyi.jianguan.chengdujianguan.util;
+
+
+import javax.crypto.Cipher;
+import javax.crypto.KeyGenerator;
+import javax.crypto.Mac;
+import javax.crypto.SecretKey;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.UnsupportedEncodingException;
+import java.security.GeneralSecurityException;
+import java.security.SecureRandom;
+import java.util.Arrays;
+
+public class Cryptos {
+
+	private static final String AES = "AES";
+	private static final String AES_CBC = "AES/CBC/PKCS5Padding";
+	private static final String HMACSHA1 = "HmacSHA1";
+
+	private static final String DEFAULT_URL_ENCODING = "UTF-8";
+	private static final int DEFAULT_HMACSHA1_KEYSIZE = 160; //RFC2401
+	private static final int DEFAULT_AES_KEYSIZE = 128;
+	private static final int DEFAULT_IVSIZE = 16;
+
+	private static final byte[] DEFAULT_KEY = new byte[]{-97,88,-94,9,70,-76,126,25,0,3,-20,113,108,28,69,125};
+
+	private static SecureRandom random = new SecureRandom();
+
+	//-- HMAC-SHA1 funciton --//
+	/**
+	 * 使用HMAC-SHA1进行消息签名, 返回字节数组,长度为20字节.
+	 *
+	 * @param input 原始输入字符数组
+	 * @param key HMAC-SHA1密钥
+	 */
+	public static byte[] hmacSha1(byte[] input, byte[] key) {
+		try {
+			SecretKey secretKey = new SecretKeySpec(key, HMACSHA1);
+			Mac mac = Mac.getInstance(HMACSHA1);
+			mac.init(secretKey);
+			return mac.doFinal(input);
+		} catch (GeneralSecurityException e) {
+			throw Exceptions.unchecked(e);
+		}
+	}
+
+	/**
+	 * 校验HMAC-SHA1签名是否正确.
+	 *
+	 * @param expected 已存在的签名
+	 * @param input 原始输入字符串
+	 * @param key 密钥
+	 */
+	public static boolean isMacValid(byte[] expected, byte[] input, byte[] key) {
+		byte[] actual = hmacSha1(input, key);
+		return Arrays.equals(expected, actual);
+	}
+
+	/**
+	 * 生成HMAC-SHA1密钥,返回字节数组,长度为160位(20字节).
+	 * HMAC-SHA1算法对密钥无特殊要求, RFC2401建议最少长度为160位(20字节).
+	 */
+	public static byte[] generateHmacSha1Key() {
+		try {
+			KeyGenerator keyGenerator = KeyGenerator.getInstance(HMACSHA1);
+			keyGenerator.init(DEFAULT_HMACSHA1_KEYSIZE);
+			SecretKey secretKey = keyGenerator.generateKey();
+			return secretKey.getEncoded();
+		} catch (GeneralSecurityException e) {
+			throw Exceptions.unchecked(e);
+		}
+	}
+
+	//-- AES funciton --//
+
+	/**
+	 * 使用AES加密原始字符串.
+	 *
+	 * @param input 原始输入字符数组
+	 */
+	public static String aesEncrypt(String input) {
+		try {
+			return Encodes.encodeHex(aesEncrypt(input.getBytes(DEFAULT_URL_ENCODING), DEFAULT_KEY));
+		} catch (UnsupportedEncodingException e) {
+			return "";
+		}
+	}
+
+	/**
+	 * 使用AES加密原始字符串.
+	 *
+	 * @param input 原始输入字符数组
+	 * @param key 符合AES要求的密钥
+	 */
+	public static String aesEncrypt(String input, String key) {
+		try {
+			return Encodes.encodeHex(aesEncrypt(input.getBytes(DEFAULT_URL_ENCODING), Encodes.decodeHex(key)));
+		} catch (UnsupportedEncodingException e) {
+			return "";
+		}
+	}
+
+	/**
+	 * 使用AES加密原始字符串.
+	 *
+	 * @param input 原始输入字符数组
+	 * @param key 符合AES要求的密钥
+	 */
+	public static byte[] aesEncrypt(byte[] input, byte[] key) {
+		return aes(input, key, Cipher.ENCRYPT_MODE);
+	}
+
+	/**
+	 * 使用AES加密原始字符串.
+	 *
+	 * @param input 原始输入字符数组
+	 * @param key 符合AES要求的密钥
+	 * @param iv 初始向量
+	 */
+	public static byte[] aesEncrypt(byte[] input, byte[] key, byte[] iv) {
+		return aes(input, key, iv, Cipher.ENCRYPT_MODE);
+	}
+
+	/**
+	 * 使用AES解密字符串, 返回原始字符串.
+	 *
+	 * @param input Hex编码的加密字符串
+	 */
+	public static String aesDecrypt(String input) {
+		try {
+			return new String(aesDecrypt(Encodes.decodeHex(input), DEFAULT_KEY), DEFAULT_URL_ENCODING);
+		} catch (UnsupportedEncodingException e) {
+			return "";
+		}
+	}
+
+	/**
+	 * 使用AES解密字符串, 返回原始字符串.
+	 *
+	 * @param input Hex编码的加密字符串
+	 * @param key 符合AES要求的密钥
+	 */
+	public static String aesDecrypt(String input, String key) {
+		try {
+			return new String(aesDecrypt(Encodes.decodeHex(input), Encodes.decodeHex(key)), DEFAULT_URL_ENCODING);
+		} catch (UnsupportedEncodingException e) {
+			return "";
+		}
+	}
+
+	/**
+	 * 使用AES解密字符串, 返回原始字符串.
+	 *
+	 * @param input Hex编码的加密字符串
+	 * @param key 符合AES要求的密钥
+	 */
+	public static byte[] aesDecrypt(byte[] input, byte[] key) {
+		return aes(input, key, Cipher.DECRYPT_MODE);
+	}
+
+	/**
+	 * 使用AES解密字符串, 返回原始字符串.
+	 *
+	 * @param input Hex编码的加密字符串
+	 * @param key 符合AES要求的密钥
+	 * @param iv 初始向量
+	 */
+	public static byte[] aesDecrypt(byte[] input, byte[] key, byte[] iv) {
+		return aes(input, key, iv, Cipher.DECRYPT_MODE);
+	}
+
+	/**
+	 * 使用AES加密或解密无编码的原始字节数组, 返回无编码的字节数组结果.
+	 *
+	 * @param input 原始字节数组
+	 * @param key 符合AES要求的密钥
+	 * @param mode Cipher.ENCRYPT_MODE 或 Cipher.DECRYPT_MODE
+	 */
+	private static byte[] aes(byte[] input, byte[] key, int mode) {
+		try {
+			SecretKey secretKey = new SecretKeySpec(key, AES);
+			Cipher cipher = Cipher.getInstance(AES);
+			cipher.init(mode, secretKey);
+			return cipher.doFinal(input);
+		} catch (GeneralSecurityException e) {
+			throw Exceptions.unchecked(e);
+		}
+	}
+
+	/**
+	 * 使用AES加密或解密无编码的原始字节数组, 返回无编码的字节数组结果.
+	 *
+	 * @param input 原始字节数组
+	 * @param key 符合AES要求的密钥
+	 * @param iv 初始向量
+	 * @param mode Cipher.ENCRYPT_MODE 或 Cipher.DECRYPT_MODE
+	 */
+	private static byte[] aes(byte[] input, byte[] key, byte[] iv, int mode) {
+		try {
+			SecretKey secretKey = new SecretKeySpec(key, AES);
+			IvParameterSpec ivSpec = new IvParameterSpec(iv);
+			Cipher cipher = Cipher.getInstance(AES_CBC);
+			cipher.init(mode, secretKey, ivSpec);
+			return cipher.doFinal(input);
+		} catch (GeneralSecurityException e) {
+			throw Exceptions.unchecked(e);
+		}
+	}
+
+	/**
+	 * 生成AES密钥,返回字节数组, 默认长度为128位(16字节).
+	 */
+	public static String generateAesKeyString() {
+		return Encodes.encodeHex(generateAesKey(DEFAULT_AES_KEYSIZE));
+	}
+
+	/**
+	 * 生成AES密钥,返回字节数组, 默认长度为128位(16字节).
+	 */
+	public static byte[] generateAesKey() {
+		return generateAesKey(DEFAULT_AES_KEYSIZE);
+	}
+
+	/**
+	 * 生成AES密钥,可选长度为128,192,256位.
+	 */
+	public static byte[] generateAesKey(int keysize) {
+		try {
+			KeyGenerator keyGenerator = KeyGenerator.getInstance(AES);
+			keyGenerator.init(keysize);
+			SecretKey secretKey = keyGenerator.generateKey();
+			return secretKey.getEncoded();
+		} catch (GeneralSecurityException e) {
+			throw Exceptions.unchecked(e);
+		}
+	}
+
+	/**
+	 * 生成随机向量,默认大小为cipher.getBlockSize(), 16字节.
+	 */
+	public static byte[] generateIV() {
+		byte[] bytes = new byte[DEFAULT_IVSIZE];
+		random.nextBytes(bytes);
+		return bytes;
+	}
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Digests.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Digests.java
new file mode 100644
index 0000000..a399c0f
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Digests.java
@@ -0,0 +1,113 @@
+/**
+ */
+package com.ruoyi.jianguan.chengdujianguan.util;
+
+import org.apache.commons.lang3.Validate;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.GeneralSecurityException;
+import java.security.MessageDigest;
+import java.security.SecureRandom;
+
+public class Digests {
+
+	private static final String SHA1 = "SHA-1";
+	private static final String MD5 = "MD5";
+
+	private static SecureRandom random = new SecureRandom();
+
+	/**
+	 * 对输入字符串进行md5散列.
+	 */
+	public static byte[] md5(byte[] input) {
+		return digest(input, MD5, null, 1);
+	}
+	public static byte[] md5(byte[] input, int iterations) {
+		return digest(input, MD5, null, iterations);
+	}
+
+	/**
+	 * 对输入字符串进行sha1散列.
+	 */
+	public static byte[] sha1(byte[] input) {
+		return digest(input, SHA1, null, 1);
+	}
+
+	public static byte[] sha1(byte[] input, byte[] salt) {
+		return digest(input, SHA1, salt, 1);
+	}
+
+	public static byte[] sha1(byte[] input, byte[] salt, int iterations) {
+		return digest(input, SHA1, salt, iterations);
+	}
+
+	/**
+	 * 对字符串进行散列, 支持md5与sha1算法.
+	 */
+	private static byte[] digest(byte[] input, String algorithm, byte[] salt, int iterations) {
+		try {
+			MessageDigest digest = MessageDigest.getInstance(algorithm);
+
+			if (salt != null) {
+				digest.update(salt);
+			}
+
+			byte[] result = digest.digest(input);
+
+			for (int i = 1; i < iterations; i++) {
+				digest.reset();
+				result = digest.digest(result);
+			}
+			return result;
+		} catch (GeneralSecurityException e) {
+			throw Exceptions.unchecked(e);
+		}
+	}
+
+	/**
+	 * 生成随机的Byte[]作为salt.
+	 *
+	 * @param numBytes byte数组的大小
+	 */
+	public static byte[] generateSalt(int numBytes) {
+		Validate.isTrue(numBytes > 0, "numBytes argument must be a positive integer (1 or larger)", numBytes);
+
+		byte[] bytes = new byte[numBytes];
+		random.nextBytes(bytes);
+		return bytes;
+	}
+
+	/**
+	 * 对文件进行md5散列.
+	 */
+	public static byte[] md5(InputStream input) throws IOException {
+		return digest(input, MD5);
+	}
+
+	/**
+	 * 对文件进行sha1散列.
+	 */
+	public static byte[] sha1(InputStream input) throws IOException {
+		return digest(input, SHA1);
+	}
+
+	private static byte[] digest(InputStream input, String algorithm) throws IOException {
+		try {
+			MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
+			int bufferLength = 8 * 1024;
+			byte[] buffer = new byte[bufferLength];
+			int read = input.read(buffer, 0, bufferLength);
+
+			while (read > -1) {
+				messageDigest.update(buffer, 0, read);
+				read = input.read(buffer, 0, bufferLength);
+			}
+
+			return messageDigest.digest();
+		} catch (GeneralSecurityException e) {
+			throw Exceptions.unchecked(e);
+		}
+	}
+
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Encodes.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Encodes.java
new file mode 100644
index 0000000..78b9f63
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Encodes.java
@@ -0,0 +1,142 @@
+/**
+ * Copyright (c) 2005-2012 springside.org.cn
+ */
+package com.ruoyi.jianguan.chengdujianguan.util;
+
+import org.apache.commons.codec.DecoderException;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.codec.binary.Hex;
+import org.apache.commons.lang3.StringEscapeUtils;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+
+public class Encodes {
+
+	private static final String DEFAULT_URL_ENCODING = "UTF-8";
+	private static final char[] BASE62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray();
+
+	/**
+	 * Hex编码.
+	 */
+	public static String encodeHex(byte[] input) {
+		return new String(Hex.encodeHex(input));
+	}
+
+	/**
+	 * Hex解码.
+	 */
+	public static byte[] decodeHex(String input) {
+		try {
+			return Hex.decodeHex(input.toCharArray());
+		} catch (DecoderException e) {
+			throw Exceptions.unchecked(e);
+		}
+	}
+
+	/**
+	 * Base64编码.
+	 */
+	public static String encodeBase64(byte[] input) {
+		return new String(Base64.encodeBase64(input));
+	}
+
+	/**
+	 * Base64编码.
+	 */
+	public static String encodeBase64(String input) {
+		try {
+			return new String(Base64.encodeBase64(input.getBytes(DEFAULT_URL_ENCODING)));
+		} catch (UnsupportedEncodingException e) {
+			return "";
+		}
+	}
+
+//	/**
+//	 * Base64编码, URL安全(将Base64中的URL非法字符'+'和'/'转为'-'和'_', 见RFC3548).
+//	 */
+//	public static String encodeUrlSafeBase64(byte[] input) {
+//		return Base64.encodeBase64URLSafe(input);
+//	}
+
+	/**
+	 * Base64解码.
+	 */
+	public static byte[] decodeBase64(String input) {
+		return Base64.decodeBase64(input.getBytes());
+	}
+
+	/**
+	 * Base64解码.
+	 */
+	public static String decodeBase64String(String input) {
+		try {
+			return new String(Base64.decodeBase64(input.getBytes()), DEFAULT_URL_ENCODING);
+		} catch (UnsupportedEncodingException e) {
+			return "";
+		}
+	}
+
+	/**
+	 * Base62编码。
+	 */
+	public static String encodeBase62(byte[] input) {
+		char[] chars = new char[input.length];
+		for (int i = 0; i < input.length; i++) {
+			chars[i] = BASE62[((input[i] & 0xFF) % BASE62.length)];
+		}
+		return new String(chars);
+	}
+
+	/**
+	 * Html 转码.
+	 */
+	public static String escapeHtml(String html) {
+		return StringEscapeUtils.escapeHtml4(html);
+	}
+
+	/**
+	 * Html 解码.
+	 */
+	public static String unescapeHtml(String htmlEscaped) {
+		return StringEscapeUtils.unescapeHtml4(htmlEscaped);
+	}
+
+	/**
+	 * Xml 转码.
+	 */
+	public static String escapeXml(String xml) {
+		return StringEscapeUtils.escapeXml10(xml);
+	}
+
+	/**
+	 * Xml 解码.
+	 */
+	public static String unescapeXml(String xmlEscaped) {
+		return StringEscapeUtils.unescapeXml(xmlEscaped);
+	}
+
+	/**
+	 * URL 编码, Encode默认为UTF-8.
+	 */
+	public static String urlEncode(String part) {
+		try {
+			return URLEncoder.encode(part, DEFAULT_URL_ENCODING);
+		} catch (UnsupportedEncodingException e) {
+			throw Exceptions.unchecked(e);
+		}
+	}
+
+	/**
+	 * URL 解码, Encode默认为UTF-8.
+	 */
+	public static String urlDecode(String part) {
+
+		try {
+			return URLDecoder.decode(part, DEFAULT_URL_ENCODING);
+		} catch (UnsupportedEncodingException e) {
+			throw Exceptions.unchecked(e);
+		}
+	}
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Exceptions.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Exceptions.java
new file mode 100644
index 0000000..a1c776f
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Exceptions.java
@@ -0,0 +1,72 @@
+package com.ruoyi.jianguan.chengdujianguan.util;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+/**
+ * 关于异常的工具类.
+ */
+public class Exceptions {
+	private static Logger logger = LoggerFactory.getLogger(Exceptions.class);
+
+	/**
+	 * 将CheckedException转换为UncheckedException.
+	 */
+	public static RuntimeException unchecked(Exception e) {
+		if (e instanceof RuntimeException) {
+			return (RuntimeException) e;
+		} else {
+			return new RuntimeException(e);
+		}
+	}
+
+	/**
+	 * 将ErrorStack转化为String.
+	 */
+	public static String getStackTraceAsString(Throwable e) {
+		if (e == null) {
+			return "";
+		}
+		StringWriter stringWriter = new StringWriter();
+		e.printStackTrace(new PrintWriter(stringWriter));
+		return stringWriter.toString();
+	}
+
+	/**
+	 * 判断异常是否由某些底层的异常引起.
+	 */
+	public static boolean isCausedBy(Exception ex, Class<? extends Exception>... causeExceptionClasses) {
+		Throwable cause = ex.getCause();
+		while (cause != null) {
+			for (Class<? extends Exception> causeClass : causeExceptionClasses) {
+				if (causeClass.isInstance(cause)) {
+					return true;
+				}
+			}
+			cause = cause.getCause();
+		}
+		return false;
+	}
+
+	/**
+	 * 在request中获取异常类
+	 *
+	 * @param request
+	 * @return
+	 */
+	public static Throwable getThrowable(HttpServletRequest request) {
+		Throwable ex = null;
+		if (request.getAttribute("exception") != null) {
+			ex = (Throwable) request.getAttribute("exception");
+		} else if (request.getAttribute("javax.servlet.error.exception") != null) {
+			ex = (Throwable) request.getAttribute("javax.servlet.error.exception");
+		}
+		return ex;
+	}
+
+
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/GBSignUtils.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/GBSignUtils.java
new file mode 100644
index 0000000..d8714f5
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/GBSignUtils.java
@@ -0,0 +1,58 @@
+package com.ruoyi.jianguan.chengdujianguan.util;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.crypto.Mac;
+import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
+import java.util.Map;
+
+public class GBSignUtils {
+
+    public static final Logger logger = LoggerFactory.getLogger(GBSignUtils.class);
+
+    public static String sign(Map<String, String> paramValues, String secret) {
+        try {
+            StringBuilder sb = new StringBuilder();
+            for (String value : paramValues.values()) {
+                if (StringUtils.isNotBlank(value)) {
+                    sb.append(value);
+                }
+            }
+            logger.debug("需要签名的内容:{},密钥{}", sb.toString(), secret);
+            System.out.println("需要签名的内容:" + sb.toString() + ",密钥" + secret);
+            byte[] md5Digest = HmacMD5Encrypt(sb.toString(), secret);
+            String result = Encodes.encodeHex(md5Digest).toUpperCase();
+            logger.debug("HmacSHA1的签名内容:{}", result);
+            System.out.println("HmacSHA1的签名内容:" + result);
+            return result;
+        } catch (Exception e) {
+            throw new RuntimeException("数据签名出错", e);
+        }
+    }
+
+    /**
+     * 使用 HMAC-MD5 签名方法对对encryptText进行签名
+     *
+     * @param encryptText 被签名的字符串
+     * @param encryptKey  密钥
+     * @return
+     * @throws Exception
+     */
+    public static byte[] HmacMD5Encrypt(String encryptText, String encryptKey) throws Exception {
+        byte[] data = encryptKey.getBytes("UTF-8");
+        // 根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
+        SecretKey secretKey = new SecretKeySpec(data, "HmacMD5");
+        // 生成一个指定 Mac 算法 的 Mac 对象
+        Mac mac = Mac.getInstance("HmacMD5");
+        // 用给定密钥初始化 Mac 对象
+        mac.init(secretKey);
+
+        byte[] text = encryptText.getBytes("UTF-8");
+        // 完成 Mac 操作
+        return mac.doFinal(text);
+    }
+
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/HttpRequestUtil.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/HttpRequestUtil.java
new file mode 100644
index 0000000..bf33862
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/HttpRequestUtil.java
@@ -0,0 +1,85 @@
+package com.ruoyi.jianguan.chengdujianguan.util;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+
+/**
+ * @author 联联充电
+ */
+@Slf4j
+@SuppressWarnings(value = "unused")
+public class HttpRequestUtil {
+
+
+    /**
+     * httpClient--post请求--http
+     *
+     * @param url
+     * @param json
+     * @return
+     */
+    public static String httpPost(String url, String json, String token) {
+        CloseableHttpClient httpClient = HttpClients.createDefault();
+        CloseableHttpResponse response = null;
+        try {
+            //创建httpPost
+            HttpPost httpPost = new HttpPost(url);
+
+            //设置Content-Type
+            httpPost.setHeader("Content-Type", "application/json");
+            httpPost.setHeader("Authorization", token);
+
+            //写入json数据
+            httpPost.setEntity(new StringEntity(json));
+
+            RequestConfig requestConfig = RequestConfig.custom()
+                    .setConnectTimeout(50000)
+                    .setConnectionRequestTimeout(50000)
+                    .setSocketTimeout(50000)
+                    .build();
+            httpPost.setConfig(requestConfig);
+
+            //发起请求,获取response对象
+            response = httpClient.execute(httpPost);
+
+            //获取结果状态码
+            int resultCode = response.getStatusLine().getStatusCode();
+            if (resultCode == 200) {
+                //获取返回数据实体对象
+                HttpEntity entity = response.getEntity();
+
+                //转化为字符串
+                String result = EntityUtils.toString(entity, "UTF-8");
+                //封装统一的返回数据接收类
+                //ResponseMsg responseMsg = (ResponseMsg) JSON.parse(result);
+                return result;
+            } else {
+                log.info("http请求失败");
+            }
+        } catch (Exception e) {
+            log.info("http请求异常");
+        } finally {
+            try {
+                if (httpClient != null) {
+                    httpClient.close();
+                }
+                if (response != null) {
+                    response.close();
+                }
+            } catch (Exception e) {
+                log.info(e.getMessage(), e);
+            }
+        }
+
+        return null;
+    }
+
+
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/SignUtils.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/SignUtils.java
new file mode 100644
index 0000000..e8d7be2
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/SignUtils.java
@@ -0,0 +1,116 @@
+package com.ruoyi.jianguan.chengdujianguan.util;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.security.GeneralSecurityException;
+import java.security.MessageDigest;
+import java.util.*;
+
+public class SignUtils {
+
+	private static String UTF_8 = "UTF-8";
+
+	/**
+	 * 使用<code>secret</code>对paramValues按以下算法进行签名: <br/>
+	 * uppercase(hex(sha1(secretkey1value1key2value2...secret))
+	 *
+	 * @param paramValues
+	 *            参数列表
+	 * @param secret
+	 * @return
+	 */
+	public static String sign(Map<String, String> paramValues, String secret) {
+		return sign(paramValues, null, secret);
+	}
+
+	/**
+	 * 对paramValues进行签名,其中ignoreParamNames这些参数不参与签名
+	 * 
+	 * @param paramValues
+	 * @param ignoreParamNames
+	 * @param secret
+	 * @return
+	 */
+	public static String sign(Map<String, String> paramValues, List<String> ignoreParamNames, String secret) {
+		try {
+			StringBuilder sb = new StringBuilder();
+			List<String> paramNames = new ArrayList<String>(paramValues.size());
+			paramNames.addAll(paramValues.keySet());
+			if (ignoreParamNames != null && ignoreParamNames.size() > 0) {
+				for (String ignoreParamName : ignoreParamNames) {
+					paramNames.remove(ignoreParamName);
+				}
+			}
+			Collections.sort(paramNames);
+
+			sb.append(secret);
+			for (String paramName : paramNames) {
+				sb.append(paramName).append(paramValues.get(paramName));
+			}
+			sb.append(secret);
+			System.out.println("原始的签名:" + sb.toString());
+			byte[] sha1Digest = getSHA1Digest(sb.toString());
+			System.out.println("sha-1的二进制码:" + String.valueOf(sha1Digest));
+			return byte2hex(sha1Digest);
+		} catch (IOException e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	public static String utf8Encoding(String value, String sourceCharsetName) {
+		try {
+			return new String(value.getBytes(sourceCharsetName), UTF_8);
+		} catch (UnsupportedEncodingException e) {
+			throw new IllegalArgumentException(e);
+		}
+	}
+
+	private static byte[] getSHA1Digest(String data) throws IOException {
+		byte[] bytes = null;
+		try {
+			MessageDigest md = MessageDigest.getInstance("SHA-1");
+			bytes = md.digest(data.getBytes(UTF_8));
+		} catch (GeneralSecurityException gse) {
+			throw new IOException(gse.getMessage())	;
+		}
+		return bytes;
+	}
+
+	//    private static byte[] getMD5Digest(String data) throws IOException {
+	//        byte[] bytes = null;
+	//        try {
+	//            MessageDigest md = MessageDigest.getInstance("MD5");
+	//            bytes = md.digest(data.getBytes(UTF_8));
+	//        } catch (GeneralSecurityException gse) {
+	//            throw new IOException(gse.getMessage());
+	//        }
+	//        return bytes;
+	//    }
+
+	/**
+	 * 二进制转十六进制字符串
+	 *
+	 * @param bytes
+	 * @return
+	 */
+	private static String byte2hex(byte[] bytes) {
+		StringBuilder sign = new StringBuilder();
+		for (int i = 0; i < bytes.length; i++) {
+			String hex = Integer.toHexString(bytes[i] & 0xFF);
+			if (hex.length() == 1) {
+				sign.append("0");
+			}
+			sign.append(hex.toUpperCase());
+		}
+		System.out.println("最终的签名:" + sign);
+		return sign.toString();
+	}
+
+	public static String getUUID() {
+		UUID uuid = UUID.randomUUID();
+		return uuid.toString().toUpperCase();
+	}
+	
+
+
+}
diff --git a/ruoyi-service/ruoyi-jianguan/src/main/resources/bootstrap.yml b/ruoyi-service/ruoyi-jianguan/src/main/resources/bootstrap.yml
index 073be15..ff76b29 100644
--- a/ruoyi-service/ruoyi-jianguan/src/main/resources/bootstrap.yml
+++ b/ruoyi-service/ruoyi-jianguan/src/main/resources/bootstrap.yml
@@ -2,7 +2,7 @@
   port: 9900
   tomcat:
     basedir: /data/tomcat
-# Spring
+
 spring:
   application:
     # 应用名称
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
index ff3a2bc..9ddfb48 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -34,6 +34,7 @@
 import com.ruoyi.integration.api.model.*;
 import com.ruoyi.integration.api.vo.ChargingOrderVo;
 import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply;
+import com.ruoyi.integration.api.vo.NotificationConnectorChargeStatusVo;
 import com.ruoyi.integration.api.vo.StartChargeResult;
 import com.ruoyi.order.api.dto.SettlementConfirmAdd;
 import com.ruoyi.order.api.feignClient.AccountingStrategyDetailOrderClient;
@@ -232,6 +233,9 @@
 	
 	@Resource
 	private ChargingMessageClient chargingMessageClient;
+
+	@Resource
+	private ChengDuJianGuanClient chengDuJianGuanClient;
 	
 	
 	/**
@@ -769,6 +773,17 @@
 		
 		log.info(chargingOrder.getCode() + ":-------------------远程调起开始充电请求-------------------" + platformStartCharging.toString());
 		sendMessageClient.platformStartCharging(platformStartCharging);
+
+		ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
+		threadPoolExecutor.execute(()->{
+			//推送成都监管
+			NotificationConnectorChargeStatusVo vo = new NotificationConnectorChargeStatusVo();
+			vo.setOrderCode(chargingOrder.getCode());
+			vo.setChargingGunId(chargingOrder.getChargingGunId());
+			chengDuJianGuanClient.notificationConnectorChargeStatus(vo);
+		});
+
+
 //		//异步线程检测远程启动的应答结果。如果失败,则需要全额退款
 //		Long id = chargingOrder.getId();
 //		//执行5分钟的定时任务检测
@@ -832,6 +847,7 @@
 				chargingOrder.setStartTime(LocalDateTime.now());
 			}
 			this.updateById(chargingOrder);
+
 			if (chargingOrder.getStatus() == 3) {
 				//推送监管平台订单状态
 				new Thread(() -> {
@@ -846,6 +862,14 @@
 			if (2 == chargingOrder.getOrderSource() && 1 == site.getIsOpenSynchronization()) {
 				tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
 			}
+			ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
+			threadPoolExecutor.execute(()->{
+				//推送成都监管
+				NotificationConnectorChargeStatusVo vo = new NotificationConnectorChargeStatusVo();
+				vo.setOrderCode(chargingOrder.getCode());
+				vo.setChargingGunId(chargingOrder.getChargingGunId());
+				chengDuJianGuanClient.notificationConnectorChargeStatus(vo);
+			});
 			return true;
 		} else {
 			Integer counter = boot_failed_map.get(code);
@@ -880,6 +904,14 @@
 			if (2 == chargingOrder.getOrderSource() && 1 == site.getIsOpenSynchronization()) {
 				tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
 			}
+			ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
+			threadPoolExecutor.execute(()->{
+				//推送成都监管
+				NotificationConnectorChargeStatusVo vo = new NotificationConnectorChargeStatusVo();
+				vo.setOrderCode(chargingOrder.getCode());
+				vo.setChargingGunId(chargingOrder.getChargingGunId());
+				chengDuJianGuanClient.notificationConnectorChargeStatus(vo);
+			});
 			return true;
 		}
 	}
@@ -1305,7 +1337,14 @@
 		if (2 == order.getOrderSource() && 1 == site.getIsOpenSynchronization()) {
 			tcecClient.notificationEquipChargeStatus(order.getStartChargeSeq(), order.getOperatorId());
 		}
-		
+		ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
+		threadPoolExecutor.execute(()->{
+			//推送成都监管
+			NotificationConnectorChargeStatusVo vo = new NotificationConnectorChargeStatusVo();
+			vo.setOrderCode(order.getCode());
+			vo.setChargingGunId(order.getChargingGunId());
+			chengDuJianGuanClient.notificationConnectorChargeStatus(vo);
+		});
 		return AjaxResult.success();
 	}
 	
@@ -2611,6 +2650,16 @@
 					}
 				}).start();
 			}
+			ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
+			TChargingOrder finalChargingOrder1 = chargingOrder;
+			threadPoolExecutor.execute(()->{
+				//推送成都监管
+				NotificationConnectorChargeStatusVo statusVo = new NotificationConnectorChargeStatusVo();
+				statusVo.setOrderCode(finalChargingOrder1.getCode());
+				statusVo.setChargingGunId(finalChargingOrder1.getChargingGunId());
+				chengDuJianGuanClient.notificationConnectorChargeStatus(statusVo);
+				chengDuJianGuanClient.notificationOrderInfo(statusVo);
+			});
 			
 			//开始将优惠券优惠的金额添加到明细中
 			BigDecimal couponDiscountAmount = chargingOrder.getCouponDiscountAmount();
@@ -2982,6 +3031,18 @@
 					chargingOrderRefundService.save(chargingOrderRefund);
 					
 				}
+			}
+
+			if(5 == tChargingOrder.getStatus()){
+				ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
+				threadPoolExecutor.execute(()->{
+					//推送成都监管
+					NotificationConnectorChargeStatusVo statusVo = new NotificationConnectorChargeStatusVo();
+					statusVo.setOrderCode(tChargingOrder.getCode());
+					statusVo.setChargingGunId(tChargingOrder.getChargingGunId());
+					chengDuJianGuanClient.notificationConnectorChargeStatus(statusVo);
+					chengDuJianGuanClient.notificationOrderInfo(statusVo);
+				});
 			}
 		}
 		if (payOrderQueryDto.getType() == 2) {
@@ -4137,6 +4198,14 @@
 			//推送三方平台订单状态
 			tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
 		}
+		ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
+		threadPoolExecutor.execute(()->{
+			//推送成都监管
+			NotificationConnectorChargeStatusVo statusVo = new NotificationConnectorChargeStatusVo();
+			statusVo.setOrderCode(chargingOrder.getCode());
+			statusVo.setChargingGunId(chargingOrder.getChargingGunId());
+			chengDuJianGuanClient.notificationConnectorChargeStatus(statusVo);
+		});
 		return R.ok();
 	}
 	
@@ -4186,6 +4255,14 @@
 			log.info("【" + code1 + "】三方平台请求停止充电发起消息结束");
 			log.info(platformStopCharging.toString());
 		});
+		ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
+		threadPoolExecutor.execute(()->{
+			//推送成都监管
+			NotificationConnectorChargeStatusVo statusVo = new NotificationConnectorChargeStatusVo();
+			statusVo.setOrderCode(chargingOrder.getCode());
+			statusVo.setChargingGunId(chargingOrder.getChargingGunId());
+			chengDuJianGuanClient.notificationConnectorChargeStatus(statusVo);
+		});
 		return R.ok();
 	}
 	
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java
index 3247f43..9bdeb53 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java
@@ -92,7 +92,7 @@
 	@Autowired
 	private RedissonClient redissonClient;
 
-	
+
 	
 	
 	
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java
index eb84ab1..533d71e 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java
@@ -20,11 +20,13 @@
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.redis.service.RedisService;
 import com.ruoyi.integration.api.feignClient.ChargingMessageClient;
+import com.ruoyi.integration.api.feignClient.ChengDuJianGuanClient;
 import com.ruoyi.integration.api.feignClient.TCECClient;
 import com.ruoyi.integration.api.feignClient.UploadRealTimeMonitoringDataClient;
 import com.ruoyi.integration.api.model.TransactionRecord;
 import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
 import com.ruoyi.integration.api.vo.ChargingOrderVo;
+import com.ruoyi.integration.api.vo.NotificationConnectorChargeStatusVo;
 import com.ruoyi.order.api.model.*;
 import com.ruoyi.order.api.vo.AccountingStrategyDetailOrderVo;
 import com.ruoyi.order.api.vo.TransactionRecordMessageVO;
@@ -63,6 +65,9 @@
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
 import java.util.*;
+import java.util.concurrent.LinkedBlockingDeque;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -129,6 +134,9 @@
 
     @Resource
     private ITChargingOrderSummaryDataService chargingOrderSummaryDataService;
+
+    @Resource
+    private ChengDuJianGuanClient chengDuJianGuanClient;
 
 
     //十分钟循环执行的定时任务
@@ -620,6 +628,17 @@
             if (2 == order.getOrderSource() && 1 == site.getIsOpenSynchronization()) {
                 tcecClient.pushChargingGunStatus(chargingGun.getFullNumber(), 2);
             }
+            ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
+            TChargingOrder finalOrder = order;
+            threadPoolExecutor.execute(()->{
+                //推送成都监管
+                NotificationConnectorChargeStatusVo statusVo = new NotificationConnectorChargeStatusVo();
+                statusVo.setOrderCode(finalOrder.getCode());
+                statusVo.setChargingGunId(finalOrder.getChargingGunId());
+                chengDuJianGuanClient.notificationConnectorChargeStatus(statusVo);
+                chengDuJianGuanClient.notificationOrderInfo(statusVo);
+            });
+
 
             //添加积分
             if (1 == order.getOrderSource()) {

--
Gitblit v1.7.1