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