From a155690a38eb156a4dbef88452b3d5decc833e77 Mon Sep 17 00:00:00 2001 From: Pu Zhibing <393733352@qq.com> Date: 星期五, 24 一月 2025 15:27:41 +0800 Subject: [PATCH] 新增引流接口及业务逻辑 --- ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java | 47 +++ ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java | 220 +++++++++++----- ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/UploadRealTimeMonitoringDataMessageListener.java | 6 ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/Operator.java | 27 ++ ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECUtil.java | 155 +++++++---- ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/OperatorController.java | 45 +++ ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/TCECClientFallbackFactory.java | 45 +++ ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/enu/InterfaceUrlEnum.java | 10 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java | 10 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/NotificationStopCharge.java | 2 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStopCharge.java | 2 /dev/null | 43 --- ruoyi-api/ruoyi-api-integration/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports | 3 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStationStats.java | 5 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingPileController.java | 14 + ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/OperatorClient.java | 28 ++ ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/StartChargeResult.java | 7 ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/TCECClient.java | 69 +++++ ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/OperatorFallbackFactory.java | 17 + 19 files changed, 557 insertions(+), 198 deletions(-) diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/TCECClientFallbackFactory.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/TCECClientFallbackFactory.java new file mode 100644 index 0000000..ddd9bce --- /dev/null +++ b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/TCECClientFallbackFactory.java @@ -0,0 +1,45 @@ +package com.ruoyi.integration.api.factory; + +import com.ruoyi.common.core.domain.R; +import com.ruoyi.integration.api.feignClient.TCECClient; +import com.ruoyi.integration.api.vo.StartChargeResult; +import org.springframework.cloud.openfeign.FallbackFactory; + +/** + * @author zhibing.pu + * @Date 2025/1/24 10:33 + */ +public class TCECClientFallbackFactory implements FallbackFactory<TCECClient> { + @Override + public TCECClient create(Throwable cause) { + + + return new TCECClient() { + @Override + public R pushChargingGunStatus(Integer id, Integer status) { + return R.fail("接口状态变化后推送给第三方失败:" + cause.getMessage()); + } + + @Override + public R notificationStartChargeResult(StartChargeResult result) { + return R.fail("启动充电结果推送失败:" + cause.getMessage()); + } + + @Override + public R notificationEquipChargeStatus(String startChargeSeq, Integer operatorId) { + return R.fail("推送充电状态失败:" + cause.getMessage()); + } + + @Override + public R notificationStopChargeResult(String startChargeSeq, String connectorID, Integer operatorId) { + return R.fail("推送停止充电结果失败:" + cause.getMessage()); + } + + + @Override + public R notificationChargeOrderInfo(String startChargeSeq, Integer operatorId) { + return R.fail("推送订单信息失败:" + cause.getMessage()); + } + }; + } +} diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/TCECClient.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/TCECClient.java new file mode 100644 index 0000000..8e7e738 --- /dev/null +++ b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/TCECClient.java @@ -0,0 +1,69 @@ +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.TCECClientFallbackFactory; +import com.ruoyi.integration.api.vo.StartChargeResult; +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; + +/** + * @author zhibing.pu + * @Date 2025/1/24 10:32 + */ +@FeignClient(contextId = "TCECClient", value = ServiceNameConstants.INTEGRATION_SERVICE, fallbackFactory = TCECClientFallbackFactory.class) +public interface TCECClient { + + + /** + * 接口状态变化后推送给第三方 + * @return + */ + @PostMapping("/evcs/v1.0/pushChargingGunStatus") + R pushChargingGunStatus(@RequestParam("id") Integer id, @RequestParam("status") Integer status); + + + + /** + * 启动充电结果推送 + * @param result + * @return + */ + @PostMapping("/evcs/v1.0/notificationStartChargeResult") + R notificationStartChargeResult(@RequestBody StartChargeResult result); + + + + + /** + * 推送充电状态 + * @param startChargeSeq + * @return + */ + @PostMapping("/evcs/v1.0/notificationEquipChargeStatus") + R notificationEquipChargeStatus(@RequestParam("startChargeSeq") String startChargeSeq, @RequestParam("operatorId") Integer operatorId); + + + + /** + * 推送停止充电结果 + * @param startChargeSeq 充电订单号 + * @param connectorID 充电设备接口编码 + * @return + */ + @PostMapping("/evcs/v1.0/notificationStopChargeResult") + R notificationStopChargeResult(@RequestParam("startChargeSeq") String startChargeSeq, @RequestParam("connectorID") String connectorID, + @RequestParam("operatorId") Integer operatorId); + + + + /** + * 推送订单信息 + * @param startChargeSeq + * @return + */ + @PostMapping("/notificationChargeOrderInfo") + R notificationChargeOrderInfo(@RequestParam("startChargeSeq") String startChargeSeq, @RequestParam("operatorId") Integer operatorId); +} diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/StartChargeResult.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/StartChargeResult.java similarity index 83% rename from ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/StartChargeResult.java rename to ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/StartChargeResult.java index 6e09c38..a0017cb 100644 --- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/StartChargeResult.java +++ b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/StartChargeResult.java @@ -1,4 +1,4 @@ -package com.ruoyi.order.api.model; +package com.ruoyi.integration.api.vo; import lombok.Data; @@ -33,7 +33,12 @@ private String ConnectorID; /** * 充电启动时间 + * yyyy-MM-dd HH:mm:ss */ @NotNull private String StartTime; + /** + * 合作商ID + */ + private String operatorID; } diff --git a/ruoyi-api/ruoyi-api-integration/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-api/ruoyi-api-integration/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 3e8f391..dfcb4b7 100644 --- a/ruoyi-api/ruoyi-api-integration/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-api/ruoyi-api-integration/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -7,4 +7,5 @@ com.ruoyi.integration.api.factory.SwitchwayGateFallbackFactory com.ruoyi.integration.api.factory.IotInterfaceFallbackFactory com.ruoyi.integration.api.factory.SecurityDetectionFallbackFactory -com.ruoyi.integration.api.factory.BmsDemandAndChargerExportationFallbackFactory \ No newline at end of file +com.ruoyi.integration.api.factory.BmsDemandAndChargerExportationFallbackFactory +com.ruoyi.integration.api.factory.TCECClientFallbackFactory \ No newline at end of file diff --git a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/Operator.java b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/Operator.java index 895cc2b..206524e 100644 --- a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/Operator.java +++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/Operator.java @@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; +import java.time.LocalDateTime; + /** * 运营商信息 * @author zhibing.pu @@ -50,6 +52,31 @@ @TableField("sigSecret") private String sigSecret; /** + * 测试接口地址 + */ + @TableField("test_url") + private String testUrl; + /** + * 接口地址 + */ + @TableField("url") + private String url; + /** + * 我方登录三方秘钥 + */ + @TableField("ourOperatorSecret") + private String ourOperatorSecret; + /** + * 各平台登录token + */ + @TableField("accessToken") + private String accessToken; + /** + * token过期时间(秒) + */ + @TableField("tokenAvailableTime") + private LocalDateTime tokenAvailableTime; + /** * token */ @TableField(exist = false) diff --git a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/OperatorFallbackFactory.java b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/OperatorFallbackFactory.java index d223fba..53ccf8e 100644 --- a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/OperatorFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/OperatorFallbackFactory.java @@ -5,6 +5,8 @@ import com.ruoyi.other.api.feignClient.OperatorClient; import org.springframework.cloud.openfeign.FallbackFactory; +import java.util.List; + /** * @author zhibing.pu * @Date 2025/1/22 15:16 @@ -17,9 +19,24 @@ return new OperatorClient() { @Override + public R<Operator> getOperatorById(Integer id) { + return R.fail("获取运营商数据失败:" + cause.getMessage()); + } + + @Override public R<Operator> getOperator(String operatorId) { return R.fail("获取运营商数据失败:" + cause.getMessage()); } + + @Override + public R<List<Operator>> getAllOperator() { + return R.fail("获取所有运营商失败:" + cause.getMessage()); + } + + @Override + public R editOperator(Operator operator) { + return R.fail("更新运营商数据失败:" + cause.getMessage()); + } }; } } diff --git a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/OperatorClient.java b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/OperatorClient.java index 8dcbee4..d75bc3a 100644 --- a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/OperatorClient.java +++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/OperatorClient.java @@ -6,7 +6,10 @@ import com.ruoyi.other.api.factory.OperatorFallbackFactory; 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; + +import java.util.List; /** * @author zhibing.pu @@ -16,6 +19,14 @@ public interface OperatorClient { + /** + * 获取运营商数据 + * @param id + * @return + */ + @PostMapping("/operator/getOperatorById") + R<Operator> getOperatorById(@RequestParam("id") Integer id); + /** * 获取运营商数据 @@ -24,6 +35,19 @@ */ @PostMapping("/operator/getOperator") R<Operator> getOperator(@RequestParam("operatorId") String operatorId); - - + + + /** + * 获取所有运营商 + * @return + */ + @PostMapping("/operator/getAllOperator") + R<List<Operator>> getAllOperator(); + + /** + * 更新运营商数据 + * @return + */ + @PostMapping("/operator/editOperator") + R editOperator(@RequestBody Operator operator); } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ObsUploadUtil.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ObsUploadUtil.java deleted file mode 100644 index f5239c8..0000000 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ObsUploadUtil.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.ruoyi.common.core.utils; - -import com.obs.services.ObsClient; -import com.obs.services.model.ObjectMetadata; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.io.InputStream; -import java.util.UUID; - -public class ObsUploadUtil { - - public static String endPoint = "obs.cn-southwest-2.myhuaweicloud.com"; - public static String accessKeyId = "LP9N1TLAYN8ERS1PVIYK"; - public static String accessKeySecret = "bV55lFHi1cG0SYBvnab8yIgDX6etKRSLh5j1gkPR"; - public static String bucketName = "haitunyingyu"; - public static String oss_domain = "https://haitunyingyu.obs.cn-southwest-2.myhuaweicloud.com/"; - // 创建ObsClient实例 - public static ObsClient obsClient = new ObsClient(accessKeyId, accessKeySecret, endPoint); - - public static String obsUpload(MultipartFile file) throws IOException{ - //CommonsMultipartFile file = (CommonsMultipartFile)multipartFile; - String fileName = ""; - if(file!=null && !"".equals(file.getOriginalFilename()) && file.getOriginalFilename()!=null){ - InputStream content = file.getInputStream();//获得指定文件的输入流 - ObjectMetadata meta = new ObjectMetadata();// 创建上传Object的Metadata - meta.setContentLength(file.getSize()); // 必须设置ContentLength - String originalFilename = file.getOriginalFilename(); - if (originalFilename.contains("apk")){ - fileName = "bf2fe5c5499341e5bc0d56c0c7d5fb2e.apk"; - System.err.println("apk"); - }else{ - fileName = UUID.randomUUID().toString().replaceAll("-","") + originalFilename.subSequence(originalFilename.lastIndexOf("."), originalFilename.length()); - } - obsClient.putObject(bucketName,"admin/"+fileName,content,meta);// 上传Object. - if(fileName != null && !"".equals(fileName)){ - System.out.println(fileName); - fileName = oss_domain+"admin/"+fileName; - } - } - return fileName; - } - - /** - * 删除某个Object - * - * @param bucketUrl - * @return - */ - public static boolean deleteObject(String bucketUrl) { - try { - bucketUrl=bucketUrl.replace(oss_domain+"web",""); - // 删除Object. - obsClient.deleteObject(bucketName, bucketUrl); - } catch (Exception e) { - e.printStackTrace(); - return false; - } finally { - //ossClient.shutdown(); - } - return true; - } - -// public static void createBucket(String bucketName) -// { -// //初始化 OSSClient -//// ossClient = new OssClient(endPoint, accessKeyId, accessKeySecret); -// -// // 新建一个Bucket -// Bucket bucket = ossClient.createBucket(bucketName); -// System.out.println(bucket.getName()); -// System.out.println(bucket.getCreationDate()); -// } -// -// public static void main(String[] args) { -// OssUploadUtil.createBucket("ssfdfsd"); -// } -} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/obs/OBSUtil.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/obs/OBSUtil.java deleted file mode 100644 index 018c46b..0000000 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/obs/OBSUtil.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.ruoyi.common.core.utils.obs; - -import com.obs.services.ObsClient; -import com.obs.services.model.PutObjectRequest; -import com.obs.services.model.PutObjectResult; - -import java.io.InputStream; - -/** - * 对象存储上传 - * @author zhibing.pu - * @date 2023/3/15 11:32 - */ -public class OBSUtil { - - public static String endPoint = "https://obs.cn-southwest-2.myhuaweicloud.com"; - public static String ak = "ONCVMOIXDX55ADAU5MFS"; - public static String sk = "3uuS3p3rcw2WYSpFVPveIGm7wVvx5OtoCNhbBv3n"; - public static String bucketname = "yixingtong"; - - /** - * 上传文件 - * @param inputStream - * @param objectKey - * @return - */ - public static String putObjectToBucket(InputStream inputStream, String objectKey) { - try { - // 创建ObsClient实例 - ObsClient obsClient = new ObsClient(ak, sk, endPoint); - // 待上传的本地文件路径,需要指定到具体的文件名 - PutObjectRequest request = new PutObjectRequest(); - request.setBucketName(bucketname); - request.setObjectKey(objectKey); - request.setInput(inputStream); - PutObjectResult putObjectResult = obsClient.putObject(request); - return putObjectResult.getObjectUrl(); - }catch (Exception e){ - e.printStackTrace(); - } - return null; - } -} 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 86b27c7..6fa0fb2 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 @@ -30,6 +30,7 @@ import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.annotation.Logical; import com.ruoyi.common.security.annotation.RequiresPermissions; +import com.ruoyi.integration.api.feignClient.TCECClient; import com.ruoyi.order.api.feignClient.ChargingOrderClient; import com.ruoyi.order.api.model.TChargingOrder; import com.ruoyi.order.api.vo.TChargingOrderVo; @@ -74,6 +75,9 @@ @Resource private ChargingOrderClient chargingOrderClient; + + @Resource + private TCECClient tcecClient; @Autowired @@ -259,6 +263,9 @@ tChargingGun1.setId(tChargingGun.getId()); tChargingGun1.setStatus(2); chargingGunService.updateById(tChargingGun1); + //推送状态给三方平台 + tcecClient.pushChargingGunStatus(tChargingGun.getId(), tChargingGun1.getStatus()); + if(chargingPile.getStatus() != 1){ TChargingPile chargingPile1 = new TChargingPile(); chargingPile1.setId(chargingPile.getId()); @@ -279,6 +286,8 @@ tChargingGun1.setId(tChargingGun.getId()); tChargingGun1.setStatus(7); chargingGunService.updateById(tChargingGun1); + //推送状态给三方平台 + tcecClient.pushChargingGunStatus(tChargingGun.getId(), tChargingGun1.getStatus()); //桩处于正常,桩所属的枪都处于非正常,修改桩状态为异常 List<TChargingGun> list = chargingGunService.list(new LambdaQueryWrapper<TChargingGun>().eq(TChargingGun::getChargingPileId, chargingPile.getId()).eq(TChargingGun::getDelFlag, 0)); @@ -321,11 +330,16 @@ } tChargingGun1.setId(tChargingGun.getId()); chargingGunService.updateById(tChargingGun1); + + //推送状态给三方平台 + tcecClient.pushChargingGunStatus(tChargingGun.getId(), tChargingGun1.getStatus()); }else{ TChargingGun tChargingGun1 = new TChargingGun(); tChargingGun1.setId(tChargingGun.getId()); tChargingGun1.setStatus(3); chargingGunService.updateById(tChargingGun1); + //推送状态给三方平台 + tcecClient.pushChargingGunStatus(tChargingGun.getId(), tChargingGun1.getStatus()); } List<TFaultMessage> list = faultMessageService.list(new LambdaQueryWrapper<TFaultMessage>().eq(TFaultMessage::getChargingGunId, tChargingGun.getId()) 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 b9b4859..2372b5f 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 @@ -26,10 +26,7 @@ import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.common.security.utils.SecurityUtils; -import com.ruoyi.integration.api.feignClient.IntegrationClient; -import com.ruoyi.integration.api.feignClient.IotInterfaceClient; -import com.ruoyi.integration.api.feignClient.SendMessageClient; -import com.ruoyi.integration.api.feignClient.UploadRealTimeMonitoringDataClient; +import com.ruoyi.integration.api.feignClient.*; import com.ruoyi.integration.api.model.QrCodeDelivery; import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData; import com.ruoyi.integration.api.vo.AddDevice; @@ -69,6 +66,9 @@ @Resource private TChargingGunService chargingGunService; + + @Resource + private TCECClient tcecClient; @Resource private SysUserClient sysUserClient; @@ -689,6 +689,8 @@ chargingGun1.setId(chargingGun.getId()); chargingGun1.setStatus(1); chargingGunService.updateById(chargingGun1); + //推送状态给三方平台 + tcecClient.pushChargingGunStatus(chargingGun1.getId(), chargingGun1.getStatus()); //桩处于正常,桩所属的枪都处于非正常,修改桩状态为异常 TChargingPile chargingPile = this.getById(chargingGun.getChargingPileId()); diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java index 3aa324b..71d189a 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java @@ -13,13 +13,12 @@ import com.ruoyi.common.core.dto.ChargingPercentProvinceDto; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.web.page.PageInfo; -import com.ruoyi.common.security.service.TokenService; import com.ruoyi.integration.drainage.model.*; import com.ruoyi.integration.drainage.model.enu.*; import com.ruoyi.order.api.feignClient.ChargingOrderAccountingStrategyClient; import com.ruoyi.order.api.feignClient.ChargingOrderClient; import com.ruoyi.order.api.model.AddTripartitePlatformOrder; -import com.ruoyi.order.api.model.StartChargeResult; +import com.ruoyi.integration.api.vo.StartChargeResult; import com.ruoyi.order.api.model.TChargingOrder; import com.ruoyi.order.api.model.TChargingOrderAccountingStrategy; import com.ruoyi.other.api.domain.Operator; @@ -36,6 +35,9 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** @@ -132,7 +134,7 @@ Operator operator = r.getData(); baseRequest.setOperator(operator); //校验签名 - String sign = buildSign(baseRequest); + String sign = TCECUtil.buildSign(baseRequest); if(!sign.equals(sig)){ baseResult.setRet(4001); baseResult.setMsg("签名校验失败"); @@ -140,32 +142,6 @@ } baseResult.setOperator(operator); return baseResult; - } - - - /** - * 构建签名字符串 - * @param model - * @return - */ - public String buildSign(BaseModel model){ - Operator operator = model.getOperator(); - //签名秘钥SigSecret - String key = operator.getSigSecret(); - String sign = ""; - switch (operator.getName()){ - case "XinDianTu": - //进行字符串拼接、计算 - String m = new StringBuilder(model.getOperatorID()).append(model.getData()).append(model.getTimeStamp()).append(model.getSeq()).toString(); - byte[] hmacMd5 = SignUtil.getHMacMD5Bytes(key.getBytes(), m.getBytes()); - // 打印计算得到的签名Sig - sign = SignUtil.bytesToHexString(hmacMd5); - break; - case "KuaiDian": - sign = SignUtil.hmacSign(model.getData(), key); - break; - } - return sign; } @@ -181,7 +157,7 @@ BaseResult baseResult = requestCheck(false, baseRequest, request); if(0 != baseResult.getRet()){ baseResult.setData(""); - baseResult.setSig(buildSign(baseResult)); + baseResult.setSig(TCECUtil.buildSign(baseResult)); return baseResult; } QueryTokenResult queryTokenResult = new QueryTokenResult(); @@ -189,6 +165,11 @@ if(null == operator){ queryTokenResult.setSuccStat(1); queryTokenResult.setFailReason(1); + //参数加密 + String jsonString = JSON.toJSONString(queryTokenResult); + String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv()); + baseResult.setData(encrypt); + baseResult.setSig(TCECUtil.buildSign(baseResult)); return baseResult; } @@ -202,7 +183,7 @@ String jsonString = JSON.toJSONString(queryTokenResult); String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv()); baseResult.setData(encrypt); - baseResult.setSig(buildSign(baseResult)); + baseResult.setSig(TCECUtil.buildSign(baseResult)); return baseResult; } @@ -219,7 +200,7 @@ String jsonString = JSON.toJSONString(queryTokenResult); String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv()); baseResult.setData(encrypt); - baseResult.setSig(buildSign(baseResult)); + baseResult.setSig(TCECUtil.buildSign(baseResult)); return baseResult; } @@ -237,7 +218,7 @@ BaseResult baseResult = requestCheck(true, baseRequest, request); if(0 != baseResult.getRet()){ baseResult.setData(""); - baseResult.setSig(buildSign(baseResult)); + baseResult.setSig(TCECUtil.buildSign(baseResult)); return baseResult; } Operator operator = baseResult.getOperator(); @@ -262,7 +243,7 @@ String jsonString = JSON.toJSONString(queryStationsInfoResult); String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv()); baseResult.setData(encrypt); - baseResult.setSig(buildSign(baseResult)); + baseResult.setSig(TCECUtil.buildSign(baseResult)); return baseResult; } @@ -458,7 +439,10 @@ connectorStatusInfo.setStatus(255); break; } - NotificationStationStatusResult result = TCECUtil.notificationStationStatus(connectorStatusInfo); + List<Operator> operators = operatorClient.getAllOperator().getData(); + for (Operator operator : operators) { + TCECUtil.notificationStationStatus(operator, connectorStatusInfo); + } return R.ok(); } @@ -473,7 +457,7 @@ BaseResult baseResult = requestCheck(true, baseRequest, request); if(0 != baseResult.getRet()){ baseResult.setData(""); - baseResult.setSig(buildSign(baseResult)); + baseResult.setSig(TCECUtil.buildSign(baseResult)); return baseResult; } Operator operator = baseResult.getOperator(); @@ -532,7 +516,7 @@ String jsonString = JSON.toJSONString(result); String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv()); baseResult.setData(encrypt); - baseResult.setSig(buildSign(baseResult)); + baseResult.setSig(TCECUtil.buildSign(baseResult)); return baseResult; } @@ -550,7 +534,7 @@ BaseResult baseResult = requestCheck(true, baseRequest, request); if(0 != baseResult.getRet()){ baseResult.setData(""); - baseResult.setSig(buildSign(baseResult)); + baseResult.setSig(TCECUtil.buildSign(baseResult)); return baseResult; } Operator operator = baseResult.getOperator(); @@ -602,7 +586,7 @@ String jsonString = JSON.toJSONString(result); String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv()); baseResult.setData(encrypt); - baseResult.setSig(buildSign(baseResult)); + baseResult.setSig(TCECUtil.buildSign(baseResult)); return baseResult; } @@ -617,7 +601,7 @@ BaseResult baseResult = requestCheck(true, baseRequest, request); if(0 != baseResult.getRet()){ baseResult.setData(""); - baseResult.setSig(buildSign(baseResult)); + baseResult.setSig(TCECUtil.buildSign(baseResult)); return baseResult; } Operator operator = baseResult.getOperator(); @@ -669,7 +653,7 @@ String jsonString = JSON.toJSONString(queryEquipAuthResult); String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv()); baseResult.setData(encrypt); - baseResult.setSig(buildSign(baseResult)); + baseResult.setSig(TCECUtil.buildSign(baseResult)); return baseResult; } @@ -685,7 +669,7 @@ BaseResult baseResult = requestCheck(true, baseRequest, request); if(0 != baseResult.getRet()){ baseResult.setData(""); - baseResult.setSig(buildSign(baseResult)); + baseResult.setSig(TCECUtil.buildSign(baseResult)); return baseResult; } Operator operator = baseResult.getOperator(); @@ -708,7 +692,7 @@ String jsonString = JSON.toJSONString(queryEquipBusinessPolicyResult); String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv()); baseResult.setData(encrypt); - baseResult.setSig(buildSign(baseResult)); + baseResult.setSig(TCECUtil.buildSign(baseResult)); return baseResult; } Integer accountingStrategyId = tChargingGun.getAccountingStrategyId(); @@ -725,7 +709,7 @@ String jsonString = JSON.toJSONString(queryEquipBusinessPolicyResult); String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv()); baseResult.setData(encrypt); - baseResult.setSig(buildSign(baseResult)); + baseResult.setSig(TCECUtil.buildSign(baseResult)); return baseResult; } List<PolicyInfo> PolicyInfos = new ArrayList<>(); @@ -742,7 +726,7 @@ String jsonString = JSON.toJSONString(queryEquipBusinessPolicyResult); String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv()); baseResult.setData(encrypt); - baseResult.setSig(buildSign(baseResult)); + baseResult.setSig(TCECUtil.buildSign(baseResult)); return baseResult; } @@ -757,7 +741,7 @@ BaseResult baseResult = requestCheck(true, baseRequest, request); if(0 != baseResult.getRet()){ baseResult.setData(""); - baseResult.setSig(buildSign(baseResult)); + baseResult.setSig(TCECUtil.buildSign(baseResult)); return baseResult; } Operator operator = baseResult.getOperator(); @@ -782,7 +766,7 @@ String jsonString = JSON.toJSONString(result); String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv()); baseResult.setData(encrypt); - baseResult.setSig(buildSign(baseResult)); + baseResult.setSig(TCECUtil.buildSign(baseResult)); return baseResult; } //设备离线 @@ -794,14 +778,14 @@ String jsonString = JSON.toJSONString(result); String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv()); baseResult.setData(encrypt); - baseResult.setSig(buildSign(baseResult)); + baseResult.setSig(TCECUtil.buildSign(baseResult)); return baseResult; } //调用充电接口 AddTripartitePlatformOrder addTripartitePlatformOrder = new AddTripartitePlatformOrder(); addTripartitePlatformOrder.setStartChargeSeq(queryStartCharge.getStartChargeSeq()); addTripartitePlatformOrder.setChargingGunId(tChargingGun.getId()); -// addTripartitePlatformOrder.setOperatorId(query.get); + addTripartitePlatformOrder.setOperatorId(operator.getOperatorId()); addTripartitePlatformOrder.setPaymentAmount(queryStartCharge.getPaymentAmount()); addTripartitePlatformOrder.setRechargePaymentType(queryStartCharge.getPaymentType()); R order = chargingOrderClient.addTripartitePlatformOrder(addTripartitePlatformOrder); @@ -814,7 +798,7 @@ String jsonString = JSON.toJSONString(result); String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv()); baseResult.setData(encrypt); - baseResult.setSig(buildSign(baseResult)); + baseResult.setSig(TCECUtil.buildSign(baseResult)); return baseResult; } result.setStartChargeSeqStat(1); @@ -824,7 +808,7 @@ String jsonString = JSON.toJSONString(result); String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv()); baseResult.setData(encrypt); - baseResult.setSig(buildSign(baseResult)); + baseResult.setSig(TCECUtil.buildSign(baseResult)); return baseResult; } @@ -838,10 +822,36 @@ public R notificationStartChargeResult(@RequestBody StartChargeResult result){ NotificationStartCharge notificationStartCharge = new NotificationStartCharge(); BeanUtils.copyProperties(result, notificationStartCharge); - com.ruoyi.integration.drainage.model.NotificationStartChargeResult notificationStartChargeResult = TCECUtil.notificationStartChargeResult(notificationStartCharge); + Operator operator = operatorClient.getOperator(result.getOperatorID()).getData(); + com.ruoyi.integration.drainage.model.NotificationStartChargeResult notificationStartChargeResult = TCECUtil.notificationStartChargeResult(operator, notificationStartCharge); //启动重试推送机制 if(null == notificationStartChargeResult || 1 == notificationStartChargeResult.getSuccStat()){ - + + ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); + threadPoolExecutor.execute(new Runnable() { + //计数器 + Integer size = 0; + @Override + public void run() { + NotificationStartChargeResult notificationStartChargeResult1 = TCECUtil.notificationStartChargeResult(operator, notificationStartCharge); + //启动重试推送机制 + if(null != notificationStartChargeResult1 && 0 == notificationStartChargeResult1.getSuccStat()){ + threadPoolExecutor.shutdown(); + return; + } + size++; + if(size >= 5){ + threadPoolExecutor.shutdown(); + return; + } + //间隔一分钟重试一次 + try { + Thread.sleep(60000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + }); } return R.ok(); } @@ -858,7 +868,7 @@ BaseResult baseResult = requestCheck(true, baseRequest, request); if(0 != baseResult.getRet()){ baseResult.setData(""); - baseResult.setSig(buildSign(baseResult)); + baseResult.setSig(TCECUtil.buildSign(baseResult)); return baseResult; } Operator operator = baseResult.getOperator(); @@ -871,7 +881,7 @@ String jsonString = JSON.toJSONString(queryEquipChargeStatusResult); String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv()); baseResult.setData(encrypt); - baseResult.setSig(buildSign(baseResult)); + baseResult.setSig(TCECUtil.buildSign(baseResult)); return baseResult; } @@ -987,12 +997,37 @@ * @return */ @PostMapping("/notificationEquipChargeStatus") - public R notificationEquipChargeStatus(@RequestParam("startChargeSeq") String startChargeSeq){ + public R notificationEquipChargeStatus(@RequestParam("startChargeSeq") String startChargeSeq, @RequestParam("operatorId") Integer operatorId){ QueryEquipChargeStatusResult queryEquipChargeStatusResult = buildQueryEquipChargeStatusResult(startChargeSeq); - NotificationEquipChargeStatusResult notificationEquipChargeStatusResult = TCECUtil.notificationEquipChargeStatus(queryEquipChargeStatusResult); + Operator operator = operatorClient.getOperatorById(operatorId).getData(); + NotificationEquipChargeStatusResult notificationEquipChargeStatusResult = TCECUtil.notificationEquipChargeStatus(operator, queryEquipChargeStatusResult); //启动重试推送机制 if(null == notificationEquipChargeStatusResult || 1 == notificationEquipChargeStatusResult.getSuccStat()){ - + ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); + threadPoolExecutor.execute(new Runnable() { + //计数器 + Integer size = 0; + @Override + public void run() { + NotificationEquipChargeStatusResult notificationEquipChargeStatusResult1 = TCECUtil.notificationEquipChargeStatus(operator, queryEquipChargeStatusResult); + //启动重试推送机制 + if(null != notificationEquipChargeStatusResult1 && 0 == notificationEquipChargeStatusResult1.getSuccStat()){ + threadPoolExecutor.shutdown(); + return; + } + size++; + if(size >= 5){ + threadPoolExecutor.shutdown(); + return; + } + //间隔一分钟重试一次 + try { + Thread.sleep(60000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + }); } return R.ok(); } @@ -1008,7 +1043,7 @@ BaseResult baseResult = requestCheck(true, baseRequest, request); if(0 != baseResult.getRet()){ baseResult.setData(""); - baseResult.setSig(buildSign(baseResult)); + baseResult.setSig(TCECUtil.buildSign(baseResult)); return baseResult; } Operator operator = baseResult.getOperator(); @@ -1030,14 +1065,14 @@ String jsonString = JSON.toJSONString(queryStopChargeResult); String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv()); baseResult.setData(encrypt); - baseResult.setSig(buildSign(baseResult)); + baseResult.setSig(TCECUtil.buildSign(baseResult)); return baseResult; } //参数加密 String jsonString = JSON.toJSONString(queryStopChargeResult); String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv()); baseResult.setData(encrypt); - baseResult.setSig(buildSign(baseResult)); + baseResult.setSig(TCECUtil.buildSign(baseResult)); return baseResult; } @@ -1050,17 +1085,43 @@ * @return */ @PostMapping("/notificationStopChargeResult") - public R notificationStopChargeResult(@RequestParam("startChargeSeq") String startChargeSeq, @RequestParam("connectorID") String connectorID){ + public R notificationStopChargeResult(@RequestParam("startChargeSeq") String startChargeSeq, @RequestParam("connectorID") String connectorID, + @RequestParam("operatorId") Integer operatorId){ + Operator operator = operatorClient.getOperatorById(operatorId).getData(); NotificationStopChargeResult info = new NotificationStopChargeResult(); info.setStartChargeSeq(startChargeSeq); info.setStartChargeSeqStat(4); info.setConnectorID(connectorID); info.setSuccStat(0); info.setFailReason(0); - NotificationStopCharge notificationStopCharge = TCECUtil.notificationStopChargeResult(info); + NotificationStopCharge notificationStopCharge = TCECUtil.notificationStopChargeResult(operator, info); //启动重试推送机制 if(null == notificationStopCharge || 1 == notificationStopCharge.getSuccStat()){ - + ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); + threadPoolExecutor.execute(new Runnable() { + //计数器 + Integer size = 0; + @Override + public void run() { + NotificationStopCharge notificationStopCharge1 = TCECUtil.notificationStopChargeResult(operator, info); + //启动重试推送机制 + if(null != notificationStopCharge1 && 0 == notificationStopCharge1.getSuccStat()){ + threadPoolExecutor.shutdown(); + return; + } + size++; + if(size >= 5){ + threadPoolExecutor.shutdown(); + return; + } + //间隔一分钟重试一次 + try { + Thread.sleep(60000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + }); } return R.ok(); } @@ -1072,12 +1133,37 @@ * @return */ @PostMapping("/notificationChargeOrderInfo") - public R notificationChargeOrderInfo(@RequestParam("startChargeSeq") String startChargeSeq){ + public R notificationChargeOrderInfo(@RequestParam("startChargeSeq") String startChargeSeq, @RequestParam("operatorId") Integer operatorId){ NotificationChargeOrderInfo info = buildNotificationChargeOrderInfo(startChargeSeq); - NotificationChargeOrderInfoResult notificationChargeOrderInfoResult = TCECUtil.notificationChargeOrderInfo(info); + Operator operator = operatorClient.getOperatorById(operatorId).getData(); + NotificationChargeOrderInfoResult notificationChargeOrderInfoResult = TCECUtil.notificationChargeOrderInfo(operator, info); //启动重试推送机制 if(null == notificationChargeOrderInfoResult || 1 == notificationChargeOrderInfoResult.getConfirmResult()){ - + ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); + threadPoolExecutor.execute(new Runnable() { + //计数器 + Integer size = 0; + @Override + public void run() { + NotificationChargeOrderInfoResult notificationChargeOrderInfoResult1 = TCECUtil.notificationChargeOrderInfo(operator, info); + //启动重试推送机制 + if(null != notificationChargeOrderInfoResult1 && 0 == notificationChargeOrderInfoResult1.getConfirmResult()){ + threadPoolExecutor.shutdown(); + return; + } + size++; + if(size >= 5){ + threadPoolExecutor.shutdown(); + return; + } + //间隔一分钟重试一次 + try { + Thread.sleep(60000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + }); } return R.ok(); } diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECUtil.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECUtil.java index 0cadb76..697d9d9 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECUtil.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECUtil.java @@ -3,9 +3,14 @@ import cn.hutool.http.*; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.core.utils.SpringUtils; import com.ruoyi.integration.drainage.model.*; +import com.ruoyi.integration.drainage.model.enu.InterfaceUrlEnum; +import com.ruoyi.other.api.domain.Operator; +import com.ruoyi.other.api.feignClient.OperatorClient; import lombok.extern.slf4j.Slf4j; +import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; @@ -23,18 +28,8 @@ * 运营商标识 */ private static final String OperatorID = ""; - /** - * 运营商秘钥 - */ - private static final String OperatorSecret = ""; - /** - * tokne - */ - private static String token = ""; - /** - * token过期时间,秒 - */ - private static Long TokenAvailableTime = 0L; + + private static OperatorClient operatorClient = SpringUtils.getBean(OperatorClient.class); private static Map<Long, Integer> map = new HashMap<>(); @@ -42,26 +37,31 @@ /** * 获取token */ - public static void queryToken(){ + public static String queryToken(Operator operator){ HttpRequest post = HttpUtil.createPost(""); post.contentType("application/json;charset=utf-8"); JSONObject body = new JSONObject(); body.put("OperatorID", OperatorID); - body.put("OperatorSecret", OperatorSecret); + body.put("OperatorSecret", operator.getOurOperatorSecret()); post.body(body.toJSONString()); HttpResponse execute = post.execute(); if(200 != execute.getStatus()){ - log.error("获取token失败:" + execute.body()); - return; + log.error("获取三方token失败:" + execute.body()); + return null; } JSONObject jsonObject = JSON.parseObject(execute.body()); Integer succStat = jsonObject.getInteger("SuccStat"); if(0 != succStat){ - log.error("获取token失败:" + jsonObject.getString("FailReason")); - return; + log.error("获取三方token失败:" + jsonObject.getString("FailReason")); + return null; } - token = jsonObject.getString("AccessToken"); - TokenAvailableTime = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC) + jsonObject.getLong("TokenAvailableTime"); + String token = jsonObject.getString("AccessToken"); + Long tokenAvailableTime = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC) + jsonObject.getLong("TokenAvailableTime"); + LocalDateTime localDateTime = Instant.ofEpochSecond(tokenAvailableTime).atOffset(ZoneOffset.UTC).toLocalDateTime(); + operator.setAccessToken(token); + operator.setTokenAvailableTime(localDateTime); + operatorClient.editOperator(operator); + return token; } @@ -69,12 +69,12 @@ * 获取token * @return */ - public static String getToken(){ - long second = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC); - if(second >= TokenAvailableTime){ - queryToken(); + public static String getToken(Operator operator){ + if(null != operator.getTokenAvailableTime() && operator.getTokenAvailableTime().isBefore(LocalDateTime.now())){ + return operator.getAccessToken(); + }else{ + return queryToken(operator); } - return token; } @@ -83,12 +83,12 @@ * 设备状态变化推送 * @param info */ - public static NotificationStationStatusResult notificationStationStatus(ConnectorStatusInfo info) { - HttpRequest post = HttpUtil.createPost(""); - buildBody(post, info); + public static NotificationStationStatusResult notificationStationStatus(Operator operator, ConnectorStatusInfo info) { + HttpRequest post = HttpUtil.createPost(operator.getTestUrl() + InterfaceUrlEnum.NOTIFICATION_STATION_STATUS.getUrl()); + buildBody(post, info, operator); HttpResponse execute = post.execute(); if(200 != execute.getStatus()){ - log.error("设备状态变化推送失败:" + execute.body()); + log.error("推送三方设备状态变化失败:" + execute.body()); return null; } return JSON.parseObject(execute.body(), NotificationStationStatusResult.class); @@ -100,18 +100,18 @@ * @param info * @return */ - public static NotificationStartChargeResult notificationStartChargeResult(NotificationStartCharge info){ - HttpRequest post = HttpUtil.createPost(""); - buildBody(post, info); + public static NotificationStartChargeResult notificationStartChargeResult(Operator operator, NotificationStartCharge info){ + HttpRequest post = HttpUtil.createPost(operator.getTestUrl() + InterfaceUrlEnum.NOTIFICATION_START_CHARGE_RESULT.getUrl()); + buildBody(post, info, operator); HttpResponse execute = post.execute(); if(200 != execute.getStatus()){ - log.error("启动充电结果推送失败:" + execute.body()); + log.error("推送三方启动充电结果失败:" + execute.body()); return null; } JSONObject jsonObject = JSON.parseObject(execute.body()); Integer ret = jsonObject.getInteger("Ret"); if(0 != ret){ - log.error("启动充电结果推送失败:" + execute.body()); + log.error("推送三方启动充电结果失败:" + execute.body()); return null; } return jsonObject.getObject("Data", NotificationStartChargeResult.class); @@ -128,18 +128,18 @@ * @param info * @return */ - public static NotificationEquipChargeStatusResult notificationEquipChargeStatus(QueryEquipChargeStatusResult info){ - HttpRequest post = HttpUtil.createPost(""); - buildBody(post, info); + public static NotificationEquipChargeStatusResult notificationEquipChargeStatus(Operator operator, QueryEquipChargeStatusResult info){ + HttpRequest post = HttpUtil.createPost(operator.getTestUrl() + InterfaceUrlEnum.NOTIFICATION_EQUIP_CHARGE_STATUS.getUrl()); + buildBody(post, info, operator); HttpResponse execute = post.execute(); if(200 != execute.getStatus()){ - log.error("推送充电状态失败:" + execute.body()); + log.error("推送三方充电状态失败:" + execute.body()); return null; } JSONObject jsonObject = JSON.parseObject(execute.body()); Integer ret = jsonObject.getInteger("Ret"); if(0 != ret){ - log.error("推送充电状态失败:" + execute.body()); + log.error("推送三方充电状态失败:" + execute.body()); return null; } return jsonObject.getObject("Data", NotificationEquipChargeStatusResult.class); @@ -151,18 +151,18 @@ * @param info * @return */ - public static NotificationStopCharge notificationStopChargeResult(NotificationStopChargeResult info){ - HttpRequest post = HttpUtil.createPost(""); - buildBody(post, info); + public static NotificationStopCharge notificationStopChargeResult(Operator operator, NotificationStopChargeResult info){ + HttpRequest post = HttpUtil.createPost(operator.getTestUrl() + InterfaceUrlEnum.NOTIFICATION_STOP_CHARGE_RESULT.getUrl()); + buildBody(post, info, operator); HttpResponse execute = post.execute(); if(200 != execute.getStatus()){ - log.error("推送停止充电结果失败:" + execute.body()); + log.error("推送三方停止充电结果失败:" + execute.body()); return null; } JSONObject jsonObject = JSON.parseObject(execute.body()); Integer ret = jsonObject.getInteger("Ret"); if(0 != ret){ - log.error("推送停止充电结果失败:" + execute.body()); + log.error("推送三方停止充电结果失败:" + execute.body()); return null; } return jsonObject.getObject("Data", NotificationStopCharge.class); @@ -176,18 +176,18 @@ * @param info * @return */ - public static NotificationChargeOrderInfoResult notificationChargeOrderInfo(NotificationChargeOrderInfo info){ - HttpRequest post = HttpUtil.createPost(""); - buildBody(post, info); + public static NotificationChargeOrderInfoResult notificationChargeOrderInfo(Operator operator, NotificationChargeOrderInfo info){ + HttpRequest post = HttpUtil.createPost(operator.getTestUrl() + InterfaceUrlEnum.NOTIFICATION_CHARGE_ORDER_INFO.getUrl()); + buildBody(post, info, operator); HttpResponse execute = post.execute(); if(200 != execute.getStatus()){ - log.error("推送充电订单信息失败:" + execute.body()); + log.error("推送三方充电订单信息失败:" + execute.body()); return null; } JSONObject jsonObject = JSON.parseObject(execute.body()); Integer ret = jsonObject.getInteger("Ret"); if(0 != ret){ - log.error("推送充电订单信息失败:" + execute.body()); + log.error("推送三方充电订单信息失败:" + execute.body()); return null; } return jsonObject.getObject("Data", NotificationChargeOrderInfoResult.class); @@ -199,30 +199,59 @@ * @param post * @param o */ - public static void buildBody(HttpRequest post, Object o){ - Long key = Long.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); - Integer integer = map.get(key); + public static void buildBody(HttpRequest post, Object o, Operator operator){ + Long timeStamp = Long.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + Integer integer = map.get(timeStamp); if(null == integer){ integer = 1; }else{ integer++; } - map.put(key, integer); + map.put(timeStamp, integer); post.contentType("application/json;charset=utf-8"); - post.header("Authorization", "Bearer " + getToken()); - JSONObject body = new JSONObject(); - body.put("OperatorID", OperatorID); - body.put("Data", AESUtil.encrypt(JSON.toJSONString(o))); - body.put("TimeStamp", key); - body.put("Seq", String.format("%04d", integer)); - body.put("Sig", ""); - post.body(body.toJSONString()); - + post.header("Authorization", "Bearer " + getToken(operator)); + BaseRequest baseRequest = new BaseRequest(); + baseRequest.setOperatorID(OperatorID); + baseRequest.setTimeStamp(timeStamp); + baseRequest.setSeq(String.format("%04d", integer)); + String jsonString = JSON.toJSONString(o); + String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv()); + baseRequest.setData(encrypt); + baseRequest.setOperator(operator); + baseRequest.setSig(buildSign(baseRequest)); + post.body(JSON.toJSONString(baseRequest)); //清空小于当前时间的map中的无效数据 for (Long k : map.keySet()) { - if(k <= (key - 10)){ + if(k <= (timeStamp - 10)){ map.remove(k); } } } + + + /** + * 构建签名字符串 + * @param model + * @return + */ + public static String buildSign(BaseModel model){ + Operator operator = model.getOperator(); + //签名秘钥SigSecret + String key = operator.getSigSecret(); + String sign = ""; + switch (operator.getName()){ + case "XinDianTu": + //进行字符串拼接、计算 + String m = new StringBuilder(model.getOperatorID()).append(model.getData()).append(model.getTimeStamp()).append(model.getSeq()).toString(); + byte[] hmacMd5 = SignUtil.getHMacMD5Bytes(key.getBytes(), m.getBytes()); + // 打印计算得到的签名Sig + sign = SignUtil.bytesToHexString(hmacMd5); + break; + case "KuaiDian": + sign = SignUtil.hmacSign(model.getData(), key); + break; + } + return sign; + } + } diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/NotificationStopCharge.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/NotificationStopCharge.java similarity index 90% rename from ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/NotificationStopCharge.java rename to ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/NotificationStopCharge.java index a1e4a99..3fae0bf 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/NotificationStopCharge.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/NotificationStopCharge.java @@ -1,4 +1,4 @@ -package com.ruoyi.integration.drainage; +package com.ruoyi.integration.drainage.model; import lombok.Data; diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStationStats.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStationStats.java index 8d1928e..fd22d00 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStationStats.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStationStats.java @@ -12,11 +12,6 @@ @Data public class QueryStationStats { /** - * 运营商ID - */ - @NotNull - private String OperatorID; - /** * 充电站ID */ @NotNull diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/QueryStopCharge.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStopCharge.java similarity index 87% rename from ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/QueryStopCharge.java rename to ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStopCharge.java index 49bea78..8c2677b 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/QueryStopCharge.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStopCharge.java @@ -1,4 +1,4 @@ -package com.ruoyi.integration.drainage; +package com.ruoyi.integration.drainage.model; import lombok.Data; diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/enu/InterfaceUrlEnum.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/enu/InterfaceUrlEnum.java index eebc932..c609fed 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/enu/InterfaceUrlEnum.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/enu/InterfaceUrlEnum.java @@ -6,10 +6,12 @@ * @Date 2025/1/21 14:38 */ public enum InterfaceUrlEnum { - QUERY_STATIONS_INFO("query_stations_info", "查询充电站信息"), - NOTIFICATION_STATION_STATUS("notification_stationStatus", "设备状态变化推送"), - QUERY_STATION_STATUS("query_station_status", "设备接口状态查询"), - + NOTIFICATION_STATION_STATUS("/notification_station_status", "设备状态变化推送"), + 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; diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/UploadRealTimeMonitoringDataMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/UploadRealTimeMonitoringDataMessageListener.java index a08aeb8..834bc06 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/UploadRealTimeMonitoringDataMessageListener.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/UploadRealTimeMonitoringDataMessageListener.java @@ -7,6 +7,7 @@ import com.ruoyi.chargingPile.api.model.TChargingGun; import com.ruoyi.chargingPile.api.model.TFaultMessage; import com.ruoyi.chargingPile.api.vo.GetChargingGunByCode; +import com.ruoyi.integration.api.feignClient.TCECClient; import com.ruoyi.integration.api.model.Online; import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData; import com.ruoyi.integration.mongodb.service.UploadRealTimeMonitoringDataService; @@ -51,6 +52,9 @@ private ChargingGunClient chargingGunClient; @Resource private FaultMessageClient faultMessageClient; + + @Resource + private TCECClient tcecClient; @Override @@ -124,6 +128,8 @@ } } chargingGunClient.updateChargingGunById(chargingGun); + //推送状态给三方平台 + tcecClient.pushChargingGunStatus(chargingGun.getId(), chargingGun.getStatus()); } } 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 d30ab60..c10feaf 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 @@ -32,6 +32,7 @@ import com.ruoyi.integration.api.feignClient.*; import com.ruoyi.integration.api.model.*; import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply; +import com.ruoyi.integration.api.vo.StartChargeResult; import com.ruoyi.order.api.dto.SettlementConfirmAdd; import com.ruoyi.order.api.feignClient.AccountingStrategyDetailOrderClient; import com.ruoyi.order.api.feignClient.AccountingStrategyOrderClient; @@ -141,7 +142,7 @@ private UploadRealTimeMonitoringDataClient uploadRealTimeMonitoringDataClient; @Resource - private ChargingHandshakeClient chargingHandshakeClient; + private TCECClient tcecClient; @Resource private SendMessageClient sendMessageClient; @@ -747,6 +748,10 @@ } this.updateById(order); redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS); + //推送三方平台订单状态 + if(2 == chargingOrder.getOrderSource()){ + tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId()); + } return true; }else{ Integer counter = boot_failed_map.get(code); @@ -777,6 +782,10 @@ order.setEndMode(0); this.updateById(order); redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS); + //推送三方平台订单状态 + if(2 == chargingOrder.getOrderSource()){ + tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId()); + } return true; } } @@ -836,9 +845,24 @@ TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData(); chargingGun.setStatus(4); chargingGunClient.updateChargingGunById(chargingGun); + //推送状态给三方平台 + tcecClient.pushChargingGunStatus(chargingGun.getId(), chargingGun.getStatus()); } redisService.setCacheObject("AQJC_" + order.getChargingGunId(), preChargeCheck1, 24L, TimeUnit.HOURS); this.updateById(order); + //推送三方平台启动充电结果 + if(2 == order.getOrderSource()){ + StartChargeResult result = new StartChargeResult(); + result.setStartChargeSeq(order.getStartChargeSeq()); + result.setStartChargeSeqStat(3 == order.getStatus() ? 2 : 4); + result.setConnectorID(order.getChargingGunId().toString()); + result.setStartTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + Operator operator = operatorClient.getOperatorById(order.getOperatorId()).getData(); + result.setOperatorID(operator.getOperatorId()); + tcecClient.notificationStartChargeResult(result); + + tcecClient.notificationEquipChargeStatus(order.getStartChargeSeq(), order.getOperatorId()); + } } /** @@ -1003,7 +1027,6 @@ chargingOrder.setStatus(4); chargingOrder.setEndMode(1); this.updateById(chargingOrder); - String code1 = order.getCode(); TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData(); //异步线程处理停机 @@ -1018,6 +1041,11 @@ log.info(code1 + ":-------------------远程停止充电请求-------------------"); log.info(platformStopCharging.toString()); }); + //推送三方平台 + if(2 == order.getOrderSource()){ + tcecClient.notificationEquipChargeStatus(order.getStartChargeSeq(), order.getOperatorId()); + } + return AjaxResult.success(); } @@ -2256,6 +2284,14 @@ this.updateById(order); chargingOrder = this.getById(order.getId()); + //推送三方平台 + if(2 == chargingOrder.getOrderSource()){ + tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId()); + tcecClient.notificationStopChargeResult(chargingOrder.getStartChargeSeq(), chargingOrder.getChargingGunId().toString(), + chargingOrder.getOperatorId()); + tcecClient.notificationChargeOrderInfo(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId()); + } + //开始将优惠券优惠的金额添加到明细中 BigDecimal couponDiscountAmount = order.getCouponDiscountAmount(); if(null != couponDiscountAmount && couponDiscountAmount.compareTo(BigDecimal.ZERO) > 0){ @@ -2277,6 +2313,8 @@ chargingGun.setStatus(2); chargingGun.setChargingPower(BigDecimal.ZERO); chargingGunClient.updateChargingGunById(chargingGun); + //推送状态给三方平台 + tcecClient.pushChargingGunStatus(chargingGun.getId(), chargingGun.getStatus()); //添加积分 TIntegralRule integralRule = integralRuleClient.getSet().getData(); @@ -4074,6 +4112,9 @@ scheduler.shutdown(); } }, 5, 1, TimeUnit.SECONDS); + + //推送三方平台订单状态 + tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId()); return R.ok(); } @@ -4101,6 +4142,8 @@ chargingOrder.setEndMode(1); this.updateById(chargingOrder); + tcecClient.notificationEquipChargeStatus(order.getStartChargeSeq(), order.getOperatorId()); + String code1 = order.getCode(); TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData(); //异步线程处理停机 diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/OperatorController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/OperatorController.java index a23961c..491f45e 100644 --- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/OperatorController.java +++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/OperatorController.java @@ -4,12 +4,10 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.other.api.domain.Operator; import com.ruoyi.other.service.OperatorService; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import java.util.List; /** * @author zhibing.pu @@ -23,6 +21,21 @@ private OperatorService operatorService; + + /** + * 获取运营商数据 + * @param id + * @return + */ + @PostMapping("/getOperatorById") + public R<Operator> getOperatorById(@RequestParam("id") Integer id){ + Operator operator = operatorService.getById(id); + return R.ok(operator); + } + + + + /** * 获取运营商数据 * @param operatorId @@ -33,4 +46,28 @@ Operator operator = operatorService.getOne(new LambdaQueryWrapper<Operator>().eq(Operator::getOperatorId, operatorId)); return R.ok(operator); } + + + + /** + * 获取所有运营商 + * @return + */ + @PostMapping("/getAllOperator") + public R<List<Operator>> getAllOperator(){ + List<Operator> list = operatorService.list(); + return R.ok(list); + } + + + + /** + * 更新运营商数据 + * @return + */ + @PostMapping("/editOperator") + public R editOperator(@RequestBody Operator operator){ + operatorService.updateById(operator); + return R.ok(); + } } -- Gitblit v1.7.1