From 414a3acae0686fd39f9296aec3dad512ac2e2f74 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期四, 27 十一月 2025 09:50:09 +0800
Subject: [PATCH] 新增加成都监管对接代码

---
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/EDIMessagePack.java                          |    4 
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/HttpRequestUtil.java                          |    2 
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Encodes.java                                  |    2 
 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                           |   35 +
 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                     |  303 ++++++++++
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/ChengDuJianGuanUtil.java                           |  517 +++++++++++++++++
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Exceptions.java                               |    2 
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Cryptos.java                                  |    5 
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/NotificationStationFee.java                  |    5 
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/enu/InterfaceUrlEnum.java                          |   43 +
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/SignUtils.java                                |    2 
 ruoyi-api/ruoyi-api-jianguan/src/main/java/com/ruoyi/integration/api/feignClient/ChengDuJianGuanClient.java                      |   33 +
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/enu/StationStatusEnum.java                         |   38 +
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/ConnectorChargeStatusInfo.java               |    2 
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/CDOrderInfo.java                             |    9 
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/CDEquipmentInfo.java                         |    9 
 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                         |    2 
 /dev/null                                                                                                                        |  402 -------------
 ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Digests.java                                  |    3 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java                               |  123 ++-
 ruoyi-api/ruoyi-api-jianguan/src/main/java/com/ruoyi/integration/api/factory/ChengDuJianGuanClientFallbackFactory.java           |   23 
 ruoyi-api/ruoyi-api-jianguan/src/main/java/com/ruoyi/integration/api/vo/NotificationStationFeeVo.java                            |   23 
 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                              |    3 
 28 files changed, 1,284 insertions(+), 484 deletions(-)

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..a7b995e
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-jianguan/src/main/java/com/ruoyi/integration/api/factory/ChengDuJianGuanClientFallbackFactory.java
@@ -0,0 +1,23 @@
+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.NotificationStationFeeVo;
+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(NotificationStationFeeVo 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..4e3489f
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-jianguan/src/main/java/com/ruoyi/integration/api/feignClient/ChengDuJianGuanClient.java
@@ -0,0 +1,33 @@
+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.NotificationStationFeeVo;
+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 vo
+     * @return
+     */
+    @PostMapping("/chengdu/jianguan/notificationStationFee")
+    R notificationStationFee(@RequestBody NotificationStationFeeVo vo);
+}
diff --git a/ruoyi-api/ruoyi-api-jianguan/src/main/java/com/ruoyi/integration/api/vo/NotificationStationFeeVo.java b/ruoyi-api/ruoyi-api-jianguan/src/main/java/com/ruoyi/integration/api/vo/NotificationStationFeeVo.java
new file mode 100644
index 0000000..4d8ad3c
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-jianguan/src/main/java/com/ruoyi/integration/api/vo/NotificationStationFeeVo.java
@@ -0,0 +1,23 @@
+package com.ruoyi.integration.api.vo;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+@Data
+public class NotificationStationFeeVo {
+    /**
+     * 站点code
+     */
+    private String siteCode;
+    /**
+     * 设备类型
+     * 1:直流设备
+     * 2:交流设备
+     * 3:交直流一体设备
+     */
+    private Integer equipmentType;
+    /**
+     * 充电桩code
+     */
+    private String chargingPileCode;
+}
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-integration/src/main/java/com/ruoyi/integration/chengdujianguan/ChengDuJianGuanUtil.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/ChengDuJianGuanUtil.java
deleted file mode 100644
index 35cb92b..0000000
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/ChengDuJianGuanUtil.java
+++ /dev/null
@@ -1,402 +0,0 @@
-package com.ruoyi.integration.chengdujianguan;
-
-
-import cn.hutool.http.HttpUtil;
-import cn.hutool.json.JSONUtil;
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-import com.alibaba.nacos.common.utils.JacksonUtils;
-import com.ruoyi.integration.chengdujianguan.model.*;
-import com.ruoyi.integration.chengdujianguan.util.Cryptos;
-import com.ruoyi.integration.chengdujianguan.util.Encodes;
-import com.ruoyi.integration.chengdujianguan.util.GBSignUtils;
-import com.ruoyi.integration.chengdujianguan.util.HttpRequestUtil;
-import com.ruoyi.integration.drainage.model.ConnectorInfo;
-import com.ruoyi.integration.drainage.model.ConnectorStatusInfo;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.data.redis.core.RedisTemplate;
-
-import java.math.BigDecimal;
-import java.util.*;
-import java.util.concurrent.TimeUnit;
-
-@Slf4j
-public class ChengDuJianGuanUtil {
-
-    private static String OperatorID = "987654321";
-    private static String OperatorSecret = "1234567890abcdef";    // 运营商秘钥
-    private static String SigSecret = "1234567890abcdef";              // 签名秘钥
-    private static String DataSecret = "1234567890abcdef";           // 消息密钥
-    private static String DataSecretIV = "1234567890abcdef";        // 消息密钥初始化向量
-    private static String requestUrl = "http://testdataexchange.evchargeonline.com:82/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.setCountryCode("CN");
-        stationInfo.setAreaCode("510903");
-        stationInfo.setAreaCodeCountryside("510903000000");
-        stationInfo.setAddress("灵泉大道中国石化僧家沟加油站B区旁边前进150米");
-        stationInfo.setServiceTel("18081278695");
-        stationInfo.setStationType(1);
-        stationInfo.setStationStatus(50);
-        stationInfo.setParkNums(10);
-        stationInfo.setStationLng(new BigDecimal(105.616058));
-        stationInfo.setStationLat(new BigDecimal(30.527943));
-        stationInfo.setConstruction(8);
-        stationInfo.setOpenAllDay(1);
-        stationInfo.setElectricityFee("{\"00:00-07:00\":\"0.42\",\n" +
-                "\"07:00-10:00\":\"0.49\",\n" +
-                "\"10:00-12:00\":\"0.52\",\n" +
-                "\"12:00-15:00\":\"0.49\",\n" +
-                "\"15:00-21:00\":\"0.52\",\n" +
-                "\"21:00-23:00\":\"0.49\",\n" +
-                "\"23:00-00:00\":\"0.42\"}");
-        stationInfo.setServiceFee("{\"00:00-07:00\":\"0.42\",\n" +
-                "\"07:00-10:00\":\"0.49\",\n" +
-                "\"10:00-12:00\":\"0.52\",\n" +
-                "\"12:00-15:00\":\"0.49\",\n" +
-                "\"15:00-21:00\":\"0.52\",\n" +
-                "\"21:00-23:00\":\"0.49\",\n" +
-                "\"23:00-00:00\":\"0.42\"}");
-        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("12345");
-        cdEquipmentInfo.setManufacturerName("12345");
-        cdEquipmentInfo.setEquipmentModel("123");
-        cdEquipmentInfo.setEquipmentProductCode("12345");
-        cdEquipmentInfo.setConstructionTime("2024-12-31");
-        cdEquipmentInfo.setEquipmentType(1);
-        cdEquipmentInfo.setEquipmentStatus(50);
-        cdEquipmentInfo.setEquipmentPurpose(1);
-        cdEquipmentInfo.setEquipmentPower(new BigDecimal(120));
-        cdEquipmentInfo.setNewNationalStandard(1);
-        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(50);
-        connectorInfos.add(connectorInfo);
-        cdEquipmentInfo.setConnectorInfos(connectorInfos);
-        equipmentInfos1.add(cdEquipmentInfo);
-        stationInfo.setEquipmentInfos1(equipmentInfos1);
-        ChengDuJianGuanUtil.notificationStationInfo(null, stationInfo);
-    }
-
-
-
-
-    /**
-     * 请求联联,获取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);
-
-                Map<String, String> resultMap = (Map<String, String>) JSON.parse(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(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(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(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(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("ConnectorStatusInfo", 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(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/ChengDuJianGuanController.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/ChengDuJianGuanController.java
new file mode 100644
index 0000000..4fcecf1
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/ChengDuJianGuanController.java
@@ -0,0 +1,303 @@
+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.NotificationStationFeeVo;
+import com.ruoyi.integration.api.vo.SiteVo;
+import com.ruoyi.integration.api.vo.TAccountingStrategyDetailVo;
+import com.ruoyi.integration.api.vo.TChargingPileVo;
+import com.ruoyi.jianguan.chengdujianguan.enu.*;
+import com.ruoyi.jianguan.chengdujianguan.model.CDEquipmentInfo;
+import com.ruoyi.jianguan.chengdujianguan.model.CDStationInfo;
+import com.ruoyi.jianguan.chengdujianguan.model.ChargeFeeDetail;
+import com.ruoyi.jianguan.chengdujianguan.model.NotificationStationFee;
+import com.ruoyi.jianguan.model.ConnectorInfo;
+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.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+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;
+
+
+    /**
+     * 充电站信息变化推送
+     * @param siteId
+     * @return
+     */
+    @PostMapping("/notificationStationInfo")
+    public R notificationStationInfo(@RequestParam("siteId") Integer siteId){
+        Site site = siteClient.getSiteByIds(Arrays.asList(siteId)).getData().get(0);
+        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();
+        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());
+            cdEquipmentInfo.setManufacturerID(tChargingPile.getManufacturerCode());
+            cdEquipmentInfo.setManufacturerName(tChargingPile.getManufacturer());
+            cdEquipmentInfo.setEquipmentModel(tChargingPile.getEquipmentType());
+            cdEquipmentInfo.setEquipmentProductCode();
+            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();
+            cdEquipmentInfo.setEquipmentPower(tChargingPile.getRatedPower());
+            cdEquipmentInfo.setNewNationalStandard();
+            cdEquipmentInfo.setEquipmentLng(new BigDecimal(tChargingPile.getEquipmentLng()).setScale(6, RoundingMode.HALF_EVEN));
+            cdEquipmentInfo.setEquipmentLat(new BigDecimal(tChargingPile.getEquipmentLat()).setScale(6, RoundingMode.HALF_EVEN));
+            cdEquipmentInfo.setVinFlag();
+            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(Integer.valueOf(chargingGun.getNationalStandard()));
+            connectorInfo.setAuxPower(chargingGun.getAuxPower());
+            connectorInfo.setOpreateStatus(chargingGun.getParkingStatus());
+            connectorInfo.setParkNo("");
+            connectorInfo.setOpreateHours(chargingGun.getOpreateHours());
+            connectorInfos.add(connectorInfo);
+        }
+        return connectorInfos;
+    }
+
+
+    /**
+     * 站点费率变化推送
+     * @param vo
+     * @return
+     */
+    @PostMapping("/notificationStationFee")
+    public R notificationStationFee(@RequestBody NotificationStationFeeVo vo){
+        NotificationStationFee notificationStationFee = new NotificationStationFee();
+        notificationStationFee.setOperatorID("906171535");
+        notificationStationFee.setStationID(vo.getSiteCode());
+        List<ChargeFeeDetail> chargeFeeDetail = new ArrayList<>();
+        List<TAccountingStrategyDetail> strategyDetails = accountingStrategyDetailClient.getDetailListByCode(vo.getChargingPileCode()).getData();
+        for (TAccountingStrategyDetail accountingStrategyDetail : strategyDetails) {
+            ChargeFeeDetail chargeFeeDetail1 = new ChargeFeeDetail();
+            chargeFeeDetail1.setEquipmentType(vo.getEquipmentType());
+            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();
+    }
+}
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..d75c096
--- /dev/null
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/ChengDuJianGuanUtil.java
@@ -0,0 +1,517 @@
+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.*;
+
+@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);
+
+                Map<String, String> resultMap = (Map<String, String>) JSON.parse(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(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(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(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(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(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-integration/src/main/java/com/ruoyi/integration/chengdujianguan/model/CDEquipmentInfo.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/CDEquipmentInfo.java
similarity index 88%
rename from ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/model/CDEquipmentInfo.java
rename to ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/CDEquipmentInfo.java
index 85ce83c..72fa45a 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/model/CDEquipmentInfo.java
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/CDEquipmentInfo.java
@@ -1,13 +1,14 @@
-package com.ruoyi.integration.chengdujianguan.model;
+package com.ruoyi.jianguan.chengdujianguan.model;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
-import com.ruoyi.integration.drainage.model.ConnectorInfo;
-import com.ruoyi.integration.drainage.model.EquipmentInfo;
+import com.ruoyi.jianguan.model.EquipmentInfo;
 import lombok.Data;
 
 import java.math.BigDecimal;
-import java.util.List;
 
+/**
+ * 充电设备信息
+ */
 @Data
 public class CDEquipmentInfo extends EquipmentInfo {
     /**
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/model/CDOrderInfo.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/CDOrderInfo.java
similarity index 92%
rename from ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/model/CDOrderInfo.java
rename to ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/CDOrderInfo.java
index d78d811..20c74a0 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/model/CDOrderInfo.java
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/CDOrderInfo.java
@@ -1,11 +1,12 @@
-package com.ruoyi.integration.chengdujianguan.model;
+package com.ruoyi.jianguan.chengdujianguan.model;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
-import com.ruoyi.integration.drainage.model.ChargeDetail;
-import com.ruoyi.integration.drainage.model.SupChargeOrderInfo;
+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 {
@@ -111,7 +112,7 @@
      * 充电明细信息
      */
     @JsonProperty("ChargeDetails")
-    private ChargeDetail chargeDetails;
+    private List<ChargeDetail> chargeDetails;
     /**
      * 推送时间
      * yyyy-MM-dd HH:mm:ss
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/model/CDStationInfo.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/CDStationInfo.java
similarity index 76%
rename from ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/model/CDStationInfo.java
rename to ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/CDStationInfo.java
index d746fa9..a7c727c 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/model/CDStationInfo.java
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/CDStationInfo.java
@@ -1,15 +1,18 @@
-package com.ruoyi.integration.chengdujianguan.model;
+package com.ruoyi.jianguan.chengdujianguan.model;
 
 
 import com.fasterxml.jackson.annotation.JsonProperty;
-import com.ruoyi.integration.drainage.model.EquipmentInfo;
-import com.ruoyi.integration.drainage.model.StationInfo;
+import com.ruoyi.jianguan.model.StationInfo;
 import lombok.Data;
 
 import javax.validation.constraints.NotNull;
-import java.math.BigDecimal;
+import javax.validation.constraints.Null;
 import java.util.List;
 
+
+/**
+ * 充电站信息
+ */
 @Data
 public class CDStationInfo extends StationInfo {
     /**
@@ -25,13 +28,35 @@
     @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:限时免费
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/model/ChargeFeeDetail.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/ChargeFeeDetail.java
similarity index 93%
rename from ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/model/ChargeFeeDetail.java
rename to ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/ChargeFeeDetail.java
index 1ea1e78..b25e28d 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/model/ChargeFeeDetail.java
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/ChargeFeeDetail.java
@@ -1,4 +1,4 @@
-package com.ruoyi.integration.chengdujianguan.model;
+package com.ruoyi.jianguan.chengdujianguan.model;
 
 
 import com.fasterxml.jackson.annotation.JsonProperty;
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/model/ConnectorChargeStatusInfo.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/ConnectorChargeStatusInfo.java
similarity index 97%
rename from ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/model/ConnectorChargeStatusInfo.java
rename to ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/ConnectorChargeStatusInfo.java
index ff1ac15..1ddd450 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/model/ConnectorChargeStatusInfo.java
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/ConnectorChargeStatusInfo.java
@@ -1,4 +1,4 @@
-package com.ruoyi.integration.chengdujianguan.model;
+package com.ruoyi.jianguan.chengdujianguan.model;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/model/EDIMessagePack.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/EDIMessagePack.java
similarity index 84%
rename from ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/model/EDIMessagePack.java
rename to ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/EDIMessagePack.java
index aa539a0..8fe6744 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/model/EDIMessagePack.java
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/EDIMessagePack.java
@@ -1,9 +1,7 @@
-package com.ruoyi.integration.chengdujianguan.model;
+package com.ruoyi.jianguan.chengdujianguan.model;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;
-
-import java.util.Map;
 
 /**
  * 返回结果
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/model/NotificationStationFee.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/NotificationStationFee.java
similarity index 86%
rename from ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/model/NotificationStationFee.java
rename to ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/NotificationStationFee.java
index 371e2a2..d1b4685 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/model/NotificationStationFee.java
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/model/NotificationStationFee.java
@@ -1,4 +1,4 @@
-package com.ruoyi.integration.chengdujianguan.model;
+package com.ruoyi.jianguan.chengdujianguan.model;
 
 
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -6,6 +6,9 @@
 
 import java.util.List;
 
+/**
+ * 站点费率
+ */
 @Data
 public class NotificationStationFee {
     /**
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/util/Cryptos.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Cryptos.java
similarity index 97%
rename from ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/util/Cryptos.java
rename to ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Cryptos.java
index 5008d27..a54e75a 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/util/Cryptos.java
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Cryptos.java
@@ -1,6 +1,9 @@
 /**
  */
-package com.ruoyi.integration.chengdujianguan.util;
+package com.ruoyi.jianguan.chengdujianguan.util;
+
+import com.ruoyi.integration.chengdujianguan.util.Encodes;
+import com.ruoyi.integration.chengdujianguan.util.Exceptions;
 
 import javax.crypto.Cipher;
 import javax.crypto.KeyGenerator;
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/util/Digests.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Digests.java
similarity index 95%
rename from ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/util/Digests.java
rename to ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Digests.java
index 8d58e05..5ee9857 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/util/Digests.java
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Digests.java
@@ -1,7 +1,8 @@
 /**
  */
-package com.ruoyi.integration.chengdujianguan.util;
+package com.ruoyi.jianguan.chengdujianguan.util;
 
+import com.ruoyi.integration.chengdujianguan.util.Exceptions;
 import org.apache.commons.lang3.Validate;
 
 import java.io.IOException;
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/util/Encodes.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Encodes.java
similarity index 97%
rename from ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/util/Encodes.java
rename to ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Encodes.java
index 6a5fec4..78b9f63 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/util/Encodes.java
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Encodes.java
@@ -1,7 +1,7 @@
 /**
  * Copyright (c) 2005-2012 springside.org.cn
  */
-package com.ruoyi.integration.chengdujianguan.util;
+package com.ruoyi.jianguan.chengdujianguan.util;
 
 import org.apache.commons.codec.DecoderException;
 import org.apache.commons.codec.binary.Base64;
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/util/Exceptions.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Exceptions.java
similarity index 96%
rename from ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/util/Exceptions.java
rename to ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Exceptions.java
index 2c914d2..a1c776f 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/util/Exceptions.java
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/Exceptions.java
@@ -1,4 +1,4 @@
-package com.ruoyi.integration.chengdujianguan.util;
+package com.ruoyi.jianguan.chengdujianguan.util;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/util/GBSignUtils.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/GBSignUtils.java
similarity index 94%
rename from ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/util/GBSignUtils.java
rename to ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/GBSignUtils.java
index d02a1d1..c88a720 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/util/GBSignUtils.java
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/GBSignUtils.java
@@ -1,5 +1,6 @@
-package com.ruoyi.integration.chengdujianguan.util;
+package com.ruoyi.jianguan.chengdujianguan.util;
 
+import com.ruoyi.integration.chengdujianguan.util.Encodes;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/util/HttpRequestUtil.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/HttpRequestUtil.java
similarity index 97%
rename from ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/util/HttpRequestUtil.java
rename to ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/HttpRequestUtil.java
index 0af8fda..bf33862 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/util/HttpRequestUtil.java
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/HttpRequestUtil.java
@@ -1,4 +1,4 @@
-package com.ruoyi.integration.chengdujianguan.util;
+package com.ruoyi.jianguan.chengdujianguan.util;
 
 import lombok.extern.slf4j.Slf4j;
 import org.apache.http.HttpEntity;
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/util/SignUtils.java b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/SignUtils.java
similarity index 98%
rename from ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/util/SignUtils.java
rename to ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/SignUtils.java
index 4158a2f..e8d7be2 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/chengdujianguan/util/SignUtils.java
+++ b/ruoyi-service/ruoyi-jianguan/src/main/java/com/ruoyi/jianguan/chengdujianguan/util/SignUtils.java
@@ -1,4 +1,4 @@
-package com.ruoyi.integration.chengdujianguan.util;
+package com.ruoyi.jianguan.chengdujianguan.util;
 
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
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 09b19fc..d3e63cb 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
@@ -30,6 +30,9 @@
 import com.ruoyi.other.api.feignClient.GoodsClient;
 import com.ruoyi.other.api.feignClient.InvoiceTypeClient;
 import io.seata.spring.annotation.GlobalTransactional;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
@@ -40,6 +43,7 @@
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -84,11 +88,10 @@
 	
 	@Resource
 	private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService;
+    @Autowired
+    private RedissonClient redissonClient;
 
-	
-	
-	
-	
+
 	/**
 	 * 添加开票申请
 	 * @param addOrderInvoice
@@ -97,57 +100,67 @@
 	@Override
 	public AjaxResult addOrderInvoice(AddOrderInvoice addOrderInvoice) {
 		Long userId = tokenService.getLoginUserApplet().getUserId();
-		String orders = addOrderInvoice.getOrders();
-		if(StringUtils.isEmpty(orders)){
-			return AjaxResult.error("请选择有效的订单");
-		}
-		JSONArray parse = JSONArray.parse(orders);
-		List<Long> orderIds = new ArrayList<>();
-		Map<Long, BigDecimal> map = new HashMap<>();
-		for (int i = 0; i < parse.size(); i++) {
-			JSONObject jsonObject = parse.getJSONObject(i);
-			Long id = jsonObject.getLong("id");
-			BigDecimal amount = jsonObject.getBigDecimal("amount");
-			orderIds.add(id);
-			map.put(id, amount);
-		}
-		long count = orderInvoiceDetailService.count(new LambdaQueryWrapper<TOrderInvoiceDetail>().eq(TOrderInvoiceDetail::getOrderType, addOrderInvoice.getOrderType())
-				.in(TOrderInvoiceDetail::getOrderId, orderIds));
-		if(count > 0){
-			return AjaxResult.error("不能重复申请开票,请刷新数据后重试");
-		}
-		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
-		String code = Double.valueOf(Math.random() * 1000).intValue() + sdf.format(new Date());
-		//获取开票类型
-		TInvoiceType invoiceType = invoiceTypeClient.getInvoiceType(addOrderInvoice.getInvoiceTypeId()).getData();
-		addOrderInvoice.setInvoicingCompany(invoiceType.getInvoicingCompany());
-		addOrderInvoice.setInvoiceType(invoiceType.getName());
-		addOrderInvoice.setInvoiceMaterial(2);
-		addOrderInvoice.setInvoicingMethod(invoiceType.getInvoicingMethod());
-		addOrderInvoice.setAppUserId(userId);
-		addOrderInvoice.setCode(code);
-		addOrderInvoice.setStatus(1);
-		addOrderInvoice.setCreateTime(LocalDateTime.now());
-		this.save(addOrderInvoice);
-		for (Long orderId : orderIds) {
-			List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>()
-					.eq(TChargingOrderAccountingStrategy::getChargingOrderId, orderId));
-			BigDecimal electrovalence = list.stream().map(TChargingOrderAccountingStrategy::getElectrovalence).reduce(BigDecimal.ZERO, BigDecimal::add);
-			BigDecimal serviceCharge = list.stream().map(TChargingOrderAccountingStrategy::getServiceCharge).reduce(BigDecimal.ZERO, BigDecimal::add);
-			
-			TOrderInvoiceDetail orderInvoiceDetail = new TOrderInvoiceDetail();
-			orderInvoiceDetail.setOrderInvoiceId(addOrderInvoice.getId());
-			orderInvoiceDetail.setInvoiceAmount(map.get(orderId));
-			orderInvoiceDetail.setOrderType(addOrderInvoice.getOrderType());
-			orderInvoiceDetail.setOrderId(orderId);
-			orderInvoiceDetail.setElectricityTariff(invoiceType.getElectricityTariff());
-			orderInvoiceDetail.setServiceTariff(invoiceType.getServiceTariff());
-			orderInvoiceDetail.setAddedServiceTariff(invoiceType.getAddedServiceTariff());
-			orderInvoiceDetail.setElectrovalence(electrovalence);
-			orderInvoiceDetail.setServiceCharge(serviceCharge);
-			orderInvoiceDetail.setAddedService(serviceCharge.multiply(null == invoiceType.getAddedServiceTariff()
-					? new BigDecimal(1) : invoiceType.getAddedServiceTariff().divide(new BigDecimal(100))));
-			orderInvoiceDetailService.save(orderInvoiceDetail);
+		RLock lock = redissonClient.getLock("ADD_ORDER_INVOICE:" + userId);
+		try {
+			boolean tryLock = lock.tryLock(5, TimeUnit.SECONDS);
+			if(tryLock){
+				String orders = addOrderInvoice.getOrders();
+				if(StringUtils.isEmpty(orders)){
+					return AjaxResult.error("请选择有效的订单");
+				}
+				JSONArray parse = JSONArray.parse(orders);
+				List<Long> orderIds = new ArrayList<>();
+				Map<Long, BigDecimal> map = new HashMap<>();
+				for (int i = 0; i < parse.size(); i++) {
+					JSONObject jsonObject = parse.getJSONObject(i);
+					Long id = jsonObject.getLong("id");
+					BigDecimal amount = jsonObject.getBigDecimal("amount");
+					orderIds.add(id);
+					map.put(id, amount);
+				}
+				long count = orderInvoiceDetailService.count(new LambdaQueryWrapper<TOrderInvoiceDetail>().eq(TOrderInvoiceDetail::getOrderType, addOrderInvoice.getOrderType())
+						.in(TOrderInvoiceDetail::getOrderId, orderIds));
+				if(count > 0){
+					return AjaxResult.error("不能重复申请开票,请刷新数据后重试");
+				}
+				SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+				String code = Double.valueOf(Math.random() * 1000).intValue() + sdf.format(new Date());
+				//获取开票类型
+				TInvoiceType invoiceType = invoiceTypeClient.getInvoiceType(addOrderInvoice.getInvoiceTypeId()).getData();
+				addOrderInvoice.setInvoicingCompany(invoiceType.getInvoicingCompany());
+				addOrderInvoice.setInvoiceType(invoiceType.getName());
+				addOrderInvoice.setInvoiceMaterial(2);
+				addOrderInvoice.setInvoicingMethod(invoiceType.getInvoicingMethod());
+				addOrderInvoice.setAppUserId(userId);
+				addOrderInvoice.setCode(code);
+				addOrderInvoice.setStatus(1);
+				addOrderInvoice.setCreateTime(LocalDateTime.now());
+				this.save(addOrderInvoice);
+				for (Long orderId : orderIds) {
+					List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>()
+							.eq(TChargingOrderAccountingStrategy::getChargingOrderId, orderId));
+					BigDecimal electrovalence = list.stream().map(TChargingOrderAccountingStrategy::getElectrovalence).reduce(BigDecimal.ZERO, BigDecimal::add);
+					BigDecimal serviceCharge = list.stream().map(TChargingOrderAccountingStrategy::getServiceCharge).reduce(BigDecimal.ZERO, BigDecimal::add);
+
+					TOrderInvoiceDetail orderInvoiceDetail = new TOrderInvoiceDetail();
+					orderInvoiceDetail.setOrderInvoiceId(addOrderInvoice.getId());
+					orderInvoiceDetail.setInvoiceAmount(map.get(orderId));
+					orderInvoiceDetail.setOrderType(addOrderInvoice.getOrderType());
+					orderInvoiceDetail.setOrderId(orderId);
+					orderInvoiceDetail.setElectricityTariff(invoiceType.getElectricityTariff());
+					orderInvoiceDetail.setServiceTariff(invoiceType.getServiceTariff());
+					orderInvoiceDetail.setAddedServiceTariff(invoiceType.getAddedServiceTariff());
+					orderInvoiceDetail.setElectrovalence(electrovalence);
+					orderInvoiceDetail.setServiceCharge(serviceCharge);
+					orderInvoiceDetail.setAddedService(serviceCharge.multiply(null == invoiceType.getAddedServiceTariff()
+							? new BigDecimal(1) : invoiceType.getAddedServiceTariff().divide(new BigDecimal(100))));
+					orderInvoiceDetailService.save(orderInvoiceDetail);
+				}
+			}
+		}catch (Exception e){
+			e.printStackTrace();
+		}finally {
+			lock.unlock();
 		}
 		return AjaxResult.success();
 	}

--
Gitblit v1.7.1