From 792cbb986fb8c32f6bbc1638c4ae264372e7a28f Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期四, 23 一月 2025 19:31:36 +0800
Subject: [PATCH] 新增引流接口及业务逻辑
---
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java | 147 ++
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/SiteFallbackFactory.java | 6
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStopChargeResult.java | 47
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/QueryStopCharge.java | 24
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/SignUtil.java | 208 +++
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java | 1155 ++++++++++++++++++++
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseModel.java | 40
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java | 16
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/NotificationStartCharge.java | 39
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryEquipAuth.java | 24
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/OperatorService.java | 11
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/OperatorServiceImpl.java | 15
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryToken.java | 24
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/NotificationStartChargeResult.java | 33
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderAccountingStrategyFallbackFactory.java | 6
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseResult.java | 13
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStationStats.java | 5
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java | 17
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingGunFallbackFactory.java | 5
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java | 40
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/OperatorMapper.java | 11
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStartChargeResult.java | 50
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java | 11
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyDetailController.java | 3
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java | 34
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/OperatorFallbackFactory.java | 25
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/dto/ChargingPercentProvinceDto.java | 9
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java | 106 +
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/NotificationStopCharge.java | 33
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseRequest.java | 24
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryTokenResult.java | 45
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderAccountingStrategyController.java | 15
ruoyi-api/ruoyi-api-other/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports | 3
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/StartChargeResult.java | 39
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/Operator.java | 67 +
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECUtil.java | 198 +++
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/OperatorController.java | 36
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TokenUtil.java | 165 ++
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java | 24
/dev/null | 259 ----
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ChargingGunClient.java | 10
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderAccountingStrategyClient.java | 10
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/AddTripartitePlatformOrder.java | 33
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/OperatorClient.java | 29
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStartCharge.java | 40
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/AESUtil.java | 107 +
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryEquipAuthResult.java | 40
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/NotificationStopChargeResult.java | 51
48 files changed, 2,973 insertions(+), 379 deletions(-)
diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingGunFallbackFactory.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingGunFallbackFactory.java
index 4da7d9e..384df0f 100644
--- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingGunFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingGunFallbackFactory.java
@@ -61,6 +61,11 @@
}
@Override
+ public R<List<TChargingGun>> getChargingGunByChargingPileIds(List<Integer> chargingPileIds) {
+ return R.fail("根据充电桩ids获取枪失败:" + throwable.getMessage());
+ }
+
+ @Override
public R pushChargingGunStatus(Integer id, Integer status) {
return R.fail("接口状态变化后推送给第三方失败:" + throwable.getMessage());
}
diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/SiteFallbackFactory.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/SiteFallbackFactory.java
index d33b267..241b97c 100644
--- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/SiteFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/SiteFallbackFactory.java
@@ -6,6 +6,7 @@
import com.ruoyi.chargingPile.api.model.Site;
import com.ruoyi.chargingPile.api.model.TChargingPile;
import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.web.page.PageInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
@@ -53,6 +54,11 @@
return R.fail("根据合作商id获取合作商详情失败:" + throwable.getMessage());
}
+
+ @Override
+ public PageInfo<Site> getSiteListPaging(Integer PageNo, Integer PageSize) {
+ return null;
+ }
};
}
}
diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ChargingGunClient.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ChargingGunClient.java
index 6370e8b..bb7bc35 100644
--- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ChargingGunClient.java
+++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ChargingGunClient.java
@@ -69,6 +69,16 @@
/**
+ * 根据充电桩ids获取枪
+ * @param chargingPileIds
+ * @return
+ */
+ @PostMapping("/t-charging-gun/getChargingGunByChargingPileIds")
+ R<List<TChargingGun>> getChargingGunByChargingPileIds(@RequestParam("chargingPileIds") List<Integer> chargingPileIds);
+
+
+
+ /**
* 接口状态变化后推送给第三方
* @param id
* @param status
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderAccountingStrategyFallbackFactory.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderAccountingStrategyFallbackFactory.java
index 7af99c0..a5a173c 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderAccountingStrategyFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderAccountingStrategyFallbackFactory.java
@@ -4,6 +4,7 @@
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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
@@ -38,6 +39,11 @@
public R<List<Double>> getDailyChargingDegree(Integer days, Set<Integer> siteIds) {
return R.fail("获取给定天数每天的充电度数失败:" + throwable.getMessage());
}
+
+ @Override
+ public R<List<TChargingOrderAccountingStrategy>> getChargingOrderAccountingStrategyByOrderId(Long chargingOrderId) {
+ return R.fail("根据订单id查询充电明细失败:" + throwable.getMessage());
+ }
};
}
}
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
index 0062651..23c64cf 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
@@ -4,6 +4,7 @@
import com.ruoyi.common.core.dto.ChargingOrderGroup;
import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
import com.ruoyi.order.api.feignClient.ChargingOrderClient;
+import com.ruoyi.order.api.model.AddTripartitePlatformOrder;
import com.ruoyi.order.api.model.ChargingListQuery;
import com.ruoyi.order.api.model.TChargingOrder;
import com.ruoyi.order.api.model.TSettlementConfirm;
@@ -63,7 +64,12 @@
public R<List<ChargingOrderGroup>> getBySiteIdAndTime(ChargingPercentProvinceDto chargingPercentProvinceDto) {
return null;
}
-
+
+ @Override
+ public R<List<TChargingOrder>> getOrderBySiteIdAndTime(ChargingPercentProvinceDto chargingPercentProvinceDto) {
+ return R.fail("根据站点id和时间区间查询订单数据失败:" + throwable.getMessage());
+ }
+
@Override
public R<Integer> getChargingCount(TChargingCountQuery req) {
return R.fail("根据会员id和有效期查询有效期内享受充电折扣次数:" + throwable.getMessage());
@@ -174,6 +180,22 @@
public R<List<TChargingOrder>> getCarChargingOrder(Long carId, String startTime, String endTime) {
return R.fail("根据车辆id获取指定时间范围内的数据失败:" + throwable.getMessage());
}
+
+ @Override
+ public R addTripartitePlatformOrder(AddTripartitePlatformOrder query) {
+ return R.fail("添加三方平台充电订单数据失败:" + throwable.getMessage());
+ }
+
+ @Override
+ public R<TChargingOrder> getChargingOrderByStartChargeSeq(String startChargeSeq) {
+ return R.fail("根据三方平台订单id获取充电数据失败:" + throwable.getMessage());
+ }
+
+
+ @Override
+ public R tripartitePlatformStopCharge(String startChargeSeq) {
+ return R.fail("三方平台请求停止充电失败:" + throwable.getMessage());
+ }
};
}
}
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderAccountingStrategyClient.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderAccountingStrategyClient.java
index 2f98b2c..43607fb 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderAccountingStrategyClient.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderAccountingStrategyClient.java
@@ -4,6 +4,7 @@
import com.ruoyi.common.core.domain.R;
import com.ruoyi.order.api.factory.ChargingOrderAccountingStrategyFallbackFactory;
import com.ruoyi.order.api.factory.ChargingOrderFallbackFactory;
+import com.ruoyi.order.api.model.TChargingOrderAccountingStrategy;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@@ -38,4 +39,13 @@
*/
@PostMapping("/t-charging-order-accounting-strategy/getDailyChargingDegree/{days}")
R<List<Double>> getDailyChargingDegree(@PathVariable("days") Integer days, @RequestParam("siteIds") Set<Integer> siteIds);
+
+
+ /**
+ * 根据订单id查询充电明细
+ * @param chargingOrderId
+ * @return
+ */
+ @PostMapping("/t-charging-order-accounting-strategy/getChargingOrderAccountingStrategyByOrderId")
+ R<List<TChargingOrderAccountingStrategy>> getChargingOrderAccountingStrategyByOrderId(@RequestParam("chargingOrderId") Long chargingOrderId);
}
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
index e54666c..ffd6ad3 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
@@ -6,6 +6,7 @@
import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.order.api.factory.ChargingOrderFallbackFactory;
+import com.ruoyi.order.api.model.AddTripartitePlatformOrder;
import com.ruoyi.order.api.model.ChargingListQuery;
import com.ruoyi.order.api.model.TChargingOrder;
import com.ruoyi.order.api.model.TSettlementConfirm;
@@ -42,6 +43,15 @@
@PostMapping(value = "/t-charging-order/getBySiteIdAndTime")
R<List<ChargingOrderGroup>> getBySiteIdAndTime(@RequestBody ChargingPercentProvinceDto chargingPercentProvinceDto);
+
+
+ /**
+ * 根据站点id和时间区间查询订单数据
+ * @param chargingPercentProvinceDto
+ * @return
+ */
+ @PostMapping(value = "/t-charging-order/getOrderBySiteIdAndTime")
+ R<List<TChargingOrder>> getOrderBySiteIdAndTime(@RequestBody ChargingPercentProvinceDto chargingPercentProvinceDto);
@@ -235,5 +245,33 @@
* @return
*/
@PostMapping("/t-charging-order/getCarChargingOrder")
- R<List<TChargingOrder>> getCarChargingOrder(@RequestParam("carId") Long carId, @RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime);
+ R<List<TChargingOrder>> getCarChargingOrder(@RequestParam("carId") Long carId, @RequestParam("startTime") String startTime,
+ @RequestParam("endTime") String endTime);
+
+
+
+ /**
+ * 添加三方平台充电订单数据
+ * @return
+ */
+ @PostMapping("/t-charging-order/addTripartitePlatformOrder")
+ R addTripartitePlatformOrder(@RequestBody AddTripartitePlatformOrder query);
+
+
+ /**
+ * 根据三方平台订单id获取充电数据
+ * @param startChargeSeq
+ * @return
+ */
+ @PostMapping("/t-charging-order/getChargingOrderByStartChargeSeq")
+ R<TChargingOrder> getChargingOrderByStartChargeSeq(@RequestParam("startChargeSeq") String startChargeSeq);
+
+
+ /**
+ * 三方平台请求停止充电
+ * @param startChargeSeq
+ * @return
+ */
+ @PostMapping("/t-charging-order/tripartitePlatformStopCharge")
+ R tripartitePlatformStopCharge(@RequestParam("startChargeSeq") String startChargeSeq);
}
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java
index 50ce67e..80bb36e 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java
@@ -24,10 +24,16 @@
*/
@FeignClient(contextId = "OrderClient", value = ServiceNameConstants.ORDER_SERVICE, fallbackFactory = OrderFallbackFactory.class)
public interface OrderClient {
+
+
@PostMapping(value = "/t-charging-order/management/give/vip")
- public R managementGiveVip(@RequestBody TGrantVip grantVip);
+ R managementGiveVip(@RequestBody TGrantVip grantVip);
+
+
@GetMapping("/t-exchange-order/getSalesCountByGoodsIds/{goodsIds}")
R<List<Integer>> getSalesCountByGoodsId(@PathVariable("goodsIds") String goodsIds);
+
+
@GetMapping("/t-exchange-order/getCount")
R<Integer> getSalesCountByGoodsIdgetCount(@RequestParam("goodId") Integer goodId,@RequestParam("goodeType")Integer goodeType,@RequestParam("buyType")Integer buyType);
@@ -37,21 +43,31 @@
* @return
*/
@GetMapping("/t-exchange-order/getCodeByOrderId/{goodsIds}")
- public R<List<String>> getCodeByOrderId(@PathVariable("goodsIds")String goodsIds);
+ R<List<String>> getCodeByOrderId(@PathVariable("goodsIds")String goodsIds);
+
+
//查询已兑换的订单数
@PostMapping("/t-exchange-order/getById")
- public R<Long> getExchangeById(@RequestParam("goodId") Integer goodId,@RequestParam("userId") Long userId,@RequestParam("goodType") Integer goodType);
+ R<Long> getExchangeById(@RequestParam("goodId") Integer goodId,@RequestParam("userId") Long userId,@RequestParam("goodType") Integer goodType);
@PostMapping("/t-exchange-order/create")
- public R<ExchangeBackDto> exchangeCreate(@RequestBody ExchangeDto exchangeDto);
+ R<ExchangeBackDto> exchangeCreate(@RequestBody ExchangeDto exchangeDto);
+
+
@PostMapping("/t-vip-order/addVipOrder1")
- public R<Long> addVipOrder(@RequestBody TVipOrder vipOrder);
+ R<Long> addVipOrder(@RequestBody TVipOrder vipOrder);
+
+
@PostMapping("/t-shopping-order/create")
- public R<TShoppingOrder> shopCreate(@RequestBody ExchangeDto exchangeDto);
+ R<TShoppingOrder> shopCreate(@RequestBody ExchangeDto exchangeDto);
+
+
@PostMapping("/t-shopping-order/callBack")
- public R callBack(@RequestParam("code")String code,@RequestParam("outTradeNo")String outTradeNo);
+ R callBack(@RequestParam("code")String code,@RequestParam("outTradeNo")String outTradeNo);
+
+
@PostMapping("/t-vip-order/callBack")
- public R vipCallBack(@RequestParam("code")String code,@RequestParam("outTradeNo")String outTradeNo);
+ R vipCallBack(@RequestParam("code")String code,@RequestParam("outTradeNo")String outTradeNo);
/**
@@ -61,6 +77,8 @@
*/
@PostMapping(value = "/t-exchange-order/activityStatistics")
R<TActivityVO> activityStatistics(@RequestBody TActivityStatisticsQuery dto);
+
+
@PostMapping(value = "/chargingBill/accountBillList")
@ApiOperation(value = "列表查询", tags = {"管理后台-账户结算账单"})
R<AccountListVO> accountBillList(@RequestBody ChargingListQuery dto);
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/AddTripartitePlatformOrder.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/AddTripartitePlatformOrder.java
new file mode 100644
index 0000000..fc54026
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/AddTripartitePlatformOrder.java
@@ -0,0 +1,33 @@
+package com.ruoyi.order.api.model;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author zhibing.pu
+ * @Date 2025/1/22 18:20
+ */
+@Data
+public class AddTripartitePlatformOrder {
+ /**
+ * 三方充电订单号
+ */
+ private String startChargeSeq;
+ /**
+ * 充电枪id
+ */
+ private Integer chargingGunId;
+ /**
+ * 运营商id
+ */
+ private String operatorId;
+ /**
+ * 支付方式(1=微信,2=支付宝)
+ */
+ private Integer rechargePaymentType;
+ /**
+ * 充电余额
+ */
+ private BigDecimal paymentAmount;
+}
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/StartChargeResult.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/StartChargeResult.java
new file mode 100644
index 0000000..6e09c38
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/StartChargeResult.java
@@ -0,0 +1,39 @@
+package com.ruoyi.order.api.model;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 推送启动充电结果
+ * @author zhibing.pu
+ * @Date 2025/1/22 18:40
+ */
+@Data
+public class StartChargeResult {
+ /**
+ * 充电订单号
+ */
+ @NotNull
+ private String StartChargeSeq;
+ /**
+ * 充电订单状态
+ * 1:启动中
+ * 2:充电中
+ * 3:停止中
+ * 4:已结束
+ * 5:未知
+ */
+ @NotNull
+ private Integer StartChargeSeqStat;
+ /**
+ * 充电设别接口编码
+ */
+ @NotNull
+ private String ConnectorID;
+ /**
+ * 充电启动时间
+ */
+ @NotNull
+ private String StartTime;
+}
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java
index 2562032..ef2e441 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java
@@ -48,9 +48,18 @@
@ApiModelProperty(value = "订单类型(1=充电订单(小程序),2=充电订单(刷卡))")
@TableField("order_type")
private Integer orderType;
- @ApiModelProperty(value = "0平台1其他")
+ @ApiModelProperty(value = "订单来源(1=自己平台,2=三方平台)")
@TableField("order_source")
private Integer orderSource;
+ @ApiModelProperty(value = "运营商id")
+ @TableField("operator_id")
+ private Integer operatorId;
+ @ApiModelProperty(value = "三方平台名称")
+ @TableField("tripartite_platform_name")
+ private String tripartitePlatformName;
+ @ApiModelProperty(value = "三方平台充电订单号")
+ @TableField("start_charge_seq")
+ private String startChargeSeq;
@ApiModelProperty(value = "平台或其他第三分名字")
@TableField("source_name")
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
new file mode 100644
index 0000000..895cc2b
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/Operator.java
@@ -0,0 +1,67 @@
+package com.ruoyi.other.api.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ * 运营商信息
+ * @author zhibing.pu
+ * @Date 2025/1/22 15:05
+ */
+@Data
+@TableName("t_operator")
+public class Operator {
+ /**
+ * 主键
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+ /**
+ * 运营商唯一码
+ */
+ @TableField("operatorId")
+ private String operatorId;
+ /**
+ * 运营商名称
+ */
+ @TableField("name")
+ private String name;
+ /**
+ * 运营商秘钥
+ */
+ @TableField("operatorSecret")
+ private String operatorSecret;
+ /**
+ * 数据加密秘钥
+ */
+ @TableField("dataSecret")
+ private String dataSecret;
+ /**
+ * 初始化向量
+ */
+ @TableField("dataSecretIv")
+ private String dataSecretIv;
+ /**
+ * 签名秘钥
+ */
+ @TableField("sigSecret")
+ private String sigSecret;
+ /**
+ * token
+ */
+ @TableField(exist = false)
+ private String token;
+ /**
+ * 登录时间
+ */
+ @TableField(exist = false)
+ private Long loginTime;
+ /**
+ * 过期时间
+ */
+ @TableField(exist = false)
+ private Long expireTime;
+}
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
new file mode 100644
index 0000000..d223fba
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/OperatorFallbackFactory.java
@@ -0,0 +1,25 @@
+package com.ruoyi.other.api.factory;
+
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.other.api.domain.Operator;
+import com.ruoyi.other.api.feignClient.OperatorClient;
+import org.springframework.cloud.openfeign.FallbackFactory;
+
+/**
+ * @author zhibing.pu
+ * @Date 2025/1/22 15:16
+ */
+public class OperatorFallbackFactory implements FallbackFactory<OperatorClient> {
+
+
+ @Override
+ public OperatorClient create(Throwable cause) {
+ return new OperatorClient() {
+
+ @Override
+ public R<Operator> getOperator(String operatorId) {
+ 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
new file mode 100644
index 0000000..8dcbee4
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/OperatorClient.java
@@ -0,0 +1,29 @@
+package com.ruoyi.other.api.feignClient;
+
+import com.ruoyi.common.core.constant.ServiceNameConstants;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.other.api.domain.Operator;
+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.RequestParam;
+
+/**
+ * @author zhibing.pu
+ * @Date 2025/1/22 15:15
+ */
+@FeignClient(contextId = "OperatorClient", value = ServiceNameConstants.OTHER_SERVICE, fallbackFactory = OperatorFallbackFactory.class)
+public interface OperatorClient {
+
+
+
+ /**
+ * 获取运营商数据
+ * @param operatorId
+ * @return
+ */
+ @PostMapping("/operator/getOperator")
+ R<Operator> getOperator(@RequestParam("operatorId") String operatorId);
+
+
+}
diff --git a/ruoyi-api/ruoyi-api-other/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-api/ruoyi-api-other/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
index 1d2b67a..9d2a866 100644
--- a/ruoyi-api/ruoyi-api-other/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ b/ruoyi-api/ruoyi-api-other/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -8,4 +8,5 @@
com.ruoyi.other.api.factory.CouponFallbackFactory
com.ruoyi.other.api.factory.InvoiceTypeFallbackFactory
com.ruoyi.other.api.factory.WebSocketFallbackFactory
-com.ruoyi.other.api.factory.UserTagFallbackFactory
\ No newline at end of file
+com.ruoyi.other.api.factory.UserTagFallbackFactory
+com.ruoyi.other.api.factory.OperatorFallbackFactory
\ No newline at end of file
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/dto/ChargingPercentProvinceDto.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/dto/ChargingPercentProvinceDto.java
index 1f8e948..40cd4a7 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/dto/ChargingPercentProvinceDto.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/dto/ChargingPercentProvinceDto.java
@@ -9,8 +9,9 @@
@Data
public class ChargingPercentProvinceDto {
- String provinceCode;
- LocalDate date1;
- LocalDate date2;
- Set<Integer> siteIds;
+ private String provinceCode;
+ private LocalDate date1;
+ private LocalDate date2;
+ private Set<Integer> siteIds;
+ private String tripartitePlatformName;
}
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyDetailController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyDetailController.java
index 9d81853..cb640f7 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyDetailController.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyDetailController.java
@@ -187,7 +187,8 @@
*/
@GetMapping("/getListByAccountingStrategyId")
public R<List<TAccountingStrategyDetail>> getListByAccountingStrategyId(@RequestParam("id") Integer id){
- List<TAccountingStrategyDetail> list = accountingStrategyDetailService.list(new LambdaQueryWrapper<TAccountingStrategyDetail>().eq(TAccountingStrategyDetail::getAccountingStrategyId, id));
+ List<TAccountingStrategyDetail> list = accountingStrategyDetailService.list(new LambdaQueryWrapper<TAccountingStrategyDetail>()
+ .eq(TAccountingStrategyDetail::getAccountingStrategyId, id).orderByAsc(TAccountingStrategyDetail::getStartTime));
return R.ok(list);
}
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java
index db5974b..961ab8a 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java
@@ -304,7 +304,21 @@
*/
@PostMapping("/getChargingGunByChargingPileId")
public R<List<TChargingGun>> getChargingGunByChargingPileId(@RequestParam("chargingPileId") Integer chargingPileId){
- List<TChargingGun> list = chargingGunService.list(new LambdaQueryWrapper<TChargingGun>().eq(TChargingGun::getChargingPileId, chargingPileId).eq(TChargingGun::getDelFlag, 0));
+ List<TChargingGun> list = chargingGunService.list(new LambdaQueryWrapper<TChargingGun>().eq(TChargingGun::getChargingPileId, chargingPileId)
+ .eq(TChargingGun::getDelFlag, 0));
+ return R.ok(list);
+ }
+
+
+ /**
+ * 根据充电桩ids获取枪
+ * @param chargingPileIds
+ * @return
+ */
+ @PostMapping("/getChargingGunByChargingPileIds")
+ public R<List<TChargingGun>> getChargingGunByChargingPileIds(@RequestParam("chargingPileIds") List<Integer> chargingPileIds){
+ List<TChargingGun> list = chargingGunService.list(new LambdaQueryWrapper<TChargingGun>().in(TChargingGun::getChargingPileId, chargingPileIds)
+ .eq(TChargingGun::getDelFlag, 0));
return R.ok(list);
}
}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/TCECController.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/TCECController.java
deleted file mode 100644
index 2f8cfaa..0000000
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/TCECController.java
+++ /dev/null
@@ -1,259 +0,0 @@
-package com.ruoyi.integration.controller;
-
-import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient;
-import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient;
-import com.ruoyi.chargingPile.api.feignClient.SiteClient;
-import com.ruoyi.chargingPile.api.model.Site;
-import com.ruoyi.chargingPile.api.model.TChargingGun;
-import com.ruoyi.chargingPile.api.model.TChargingPile;
-import com.ruoyi.common.core.domain.R;
-import com.ruoyi.common.core.utils.StringUtils;
-import com.ruoyi.common.core.web.page.PageInfo;
-import com.ruoyi.integration.drainage.TCECUtil;
-import com.ruoyi.integration.drainage.model.*;
-import com.ruoyi.integration.drainage.model.enu.*;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * @author zhibing.pu
- * @Date 2025/1/21 17:52
- */
-@RestController
-@RequestMapping("")
-public class TCECController {
-
- @Resource
- private SiteClient siteClient;
-
- @Resource
- private ChargingPileClient chargingPileClient;
-
- @Resource
- private ChargingGunClient chargingGunClient;
-
-
- /**
- * 查询充电站信息
- * @param query
- * @return
- */
- @PostMapping("/query_stations_info")
- public QueryStationsInfoResult queryStationsInfo(@RequestBody QueryStationsInfo query){
- Integer pageNo = query.getPageNo();
- Integer pageSize = query.getPageSize();
- if(null == pageNo){
- pageNo = 1;
- }
- if(null == pageSize){
- pageSize = 10;
- }
- PageInfo<Site> siteListPaging = siteClient.getSiteListPaging(pageNo, pageSize);
- QueryStationsInfoResult queryStationsInfoResult = new QueryStationsInfoResult();
- queryStationsInfoResult.setPageNo(pageNo);
- queryStationsInfoResult.setPageCount((0 == (siteListPaging.getTotal() % pageSize) ? 0 : 1) + Double.valueOf(siteListPaging.getTotal() / pageSize).intValue());
- queryStationsInfoResult.setItemSize(Long.valueOf(siteListPaging.getTotal()).intValue());
-
- List<StationInfo> StationInfos = new ArrayList<>();
- for (Site datum : siteListPaging.getRecords()) {
- StationInfo stationInfo = new StationInfo();
- stationInfo.setStationID(datum.getId().toString());
- stationInfo.setOperatorID();
- stationInfo.setEquipmentOwnerID();
- stationInfo.setStationName(datum.getName());
- stationInfo.setCountryCode(datum.getCountryCode());
- stationInfo.setAreaCode(datum.getDistrictsCode());
- stationInfo.setAddress(datum.getAddress());
- stationInfo.setStationTel(datum.getPhone());
- stationInfo.setServiceTel(datum.getServicePhone());
- switch (datum.getSiteType()){
- case 0:
- stationInfo.setStationType(StationTypeEnum.OTHER.getType());
- break;
- case 1:
- stationInfo.setStationType(StationTypeEnum.PUBLIC.getType());
- break;
- case 2:
- stationInfo.setStationType(StationTypeEnum.PERSONAGE.getType());
- break;
- case 3:
- stationInfo.setStationType(StationTypeEnum.BUS_SPECIFIC.getType());
- break;
- case 4:
- stationInfo.setStationType(StationTypeEnum.SANITATION_SPECIFIC.getType());
- break;
- case 5:
- stationInfo.setStationType(StationTypeEnum.LOGISTICS_SPECIFIC.getType());
- break;
- case 6:
- stationInfo.setStationType(StationTypeEnum.TEXT_SPECIFIC.getType());
- break;
- }
- if(datum.getStatus() == 1){
- stationInfo.setStationStatus(StationStatusEnum.NORMAL_USE.getStatus());
- }
- if(datum.getStatus() == 2){
- stationInfo.setStationStatus(StationStatusEnum.MAINTAIN.getStatus());
- }
- if(datum.getStatus() == 3){
- stationInfo.setStationStatus(StationStatusEnum.OFF_LINE.getStatus());
- }
- stationInfo.setParkNums(datum.getParkingSpace());
- stationInfo.setStationLat(new BigDecimal(datum.getLat()).setScale(6, RoundingMode.DOWN));
- stationInfo.setStationLng(new BigDecimal(datum.getLon()).setScale(6, RoundingMode.DOWN));
- stationInfo.setConstruction(datum.getConstructionSite() == 0 ? ConstructionEnum.OTHER.getType() : datum.getConstructionSite());
- stationInfo.setPictures(Arrays.asList(datum.getImgUrl().split(",")));
- stationInfo.setSiteGuide(datum.getGuide());
- stationInfo.setMatchCars(datum.getVehicleDescription());
- stationInfo.setBusineHours(datum.getStartServiceTime() + "-" + datum.getEndServiceTime());
- stationInfo.setElectricityFee(datum.getRateDescription());
- //构建充电设备信息数据
- List<TChargingPile> tChargingPiles = chargingPileClient.getChargingPileBySiteId(datum.getId()).getData();
- stationInfo.setEquipmentInfos(buildEquipmentInfo(tChargingPiles));
- StationInfos.add(stationInfo);
- }
- queryStationsInfoResult.setStationInfos(StationInfos);
- return queryStationsInfoResult;
- }
-
-
- /**
- * 构建桩数据
- * @param tChargingPiles
- * @return
- */
- public List<EquipmentInfo> buildEquipmentInfo(List<TChargingPile> tChargingPiles){
- List<EquipmentInfo> equipmentInfos = new ArrayList<>();
- for (TChargingPile tChargingPile : tChargingPiles) {
- EquipmentInfo equipmentInfo = new EquipmentInfo();
- equipmentInfo.setEquipmentID(tChargingPile.getId().toString());
- equipmentInfo.setManufacturerID(tChargingPile.getManufacturerCode());
- equipmentInfo.setManufacturerName(tChargingPile.getManufacturer());
- equipmentInfo.setEquipmentModel(tChargingPile.getEquipmentType());
- if(null != tChargingPile.getProductionDate()){
- equipmentInfo.setProductionDate(tChargingPile.getProductionDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
- }
- switch (tChargingPile.getType()){
- case 0:
- equipmentInfo.setEquipmentType(EquipmentTypeEnum.OTHER.getType());
- break;
- case 1:
- equipmentInfo.setEquipmentType(EquipmentTypeEnum.DIRECT_CURRENT.getType());
- break;
- case 2:
- equipmentInfo.setEquipmentType(EquipmentTypeEnum.ALTERNATING_CURRENT.getType());
- break;
- case 3:
- equipmentInfo.setEquipmentType(EquipmentTypeEnum.ALTERNATING_DIRECT.getType());
- break;
- case 4:
- equipmentInfo.setEquipmentType(EquipmentTypeEnum.WIRELESS_DEVICE.getType());
- break;
- }
-
- //构建设备接口信息
- List<TChargingGun> chargingGunList = chargingGunClient.getChargingGunByChargingPileId(tChargingPile.getId()).getData();
- equipmentInfo.setConnectorInfos(buildConnectorInfos(chargingGunList));
- equipmentInfos.add(equipmentInfo);
- }
- return equipmentInfos;
- }
-
-
- /**
- * 构建接口数据
- * @param chargingGunList
- * @return
- */
- public List<ConnectorInfo> buildConnectorInfos(List<TChargingGun> chargingGunList){
- List<ConnectorInfo> connectorInfos = new ArrayList<>();
- for (TChargingGun chargingGun : chargingGunList) {
- ConnectorInfo connectorInfo = new ConnectorInfo();
- connectorInfo.setConnectorID(chargingGun.getId().toString());
- connectorInfo.setConnectorName(chargingGun.getName());
- switch (chargingGun.getType()){
- case 0:
- connectorInfo.setConnectorType(ConnectorTypeEnum.OTHER.getType());
- break;
- case 1:
- connectorInfo.setConnectorType(ConnectorTypeEnum.HOUSEHOLD_SOCKET.getType());
- break;
- case 2:
- connectorInfo.setConnectorType(ConnectorTypeEnum.AC_SOCKET.getType());
- break;
- case 3:
- connectorInfo.setConnectorType(ConnectorTypeEnum.AC_INTERFACE_PLUG.getType());
- break;
- case 4:
- connectorInfo.setConnectorType(ConnectorTypeEnum.DC_INTERFACE_GUN_HEAD.getType());
- break;
- case 5:
- connectorInfo.setConnectorType(ConnectorTypeEnum.WIRELESS_CHARGING_STAND.getType());
- break;
- }
- connectorInfo.setVoltageUpperLimits(chargingGun.getUpperRatedVoltage().intValue());
- connectorInfo.setVoltageLowerLimits(chargingGun.getLowerLimitOfRatedVoltage().intValue());
- connectorInfo.setCurrent(chargingGun.getRatedCurrent().intValue());
- connectorInfo.setPower(chargingGun.getRatedPower());
- connectorInfo.setParkNo(chargingGun.getParkingNumber());
- connectorInfo.setNationalStandard(Integer.valueOf(chargingGun.getNationalStandard()));
- connectorInfos.add(connectorInfo);
- }
- return connectorInfos;
- }
-
-
- /**
- * 接口状态变化后推送给第三方
- * @return
- */
- @PostMapping("/pushChargingGunStatus")
- public R pushChargingGunStatus(@RequestParam("id") Integer id, @RequestParam("status") Integer status){
- ConnectorStatusInfo connectorStatusInfo = new ConnectorStatusInfo();
- connectorStatusInfo.setConnectorID(id.toString());
- switch (status){
- case 1:
- connectorStatusInfo.setStatus(0);
- break;
- case 2:
- connectorStatusInfo.setStatus(1);
- break;
- case 3:
- connectorStatusInfo.setStatus(2);
- break;
- case 4:
- connectorStatusInfo.setStatus(3);
- break;
- case 5:
- connectorStatusInfo.setStatus(3);
- break;
- case 6:
- connectorStatusInfo.setStatus(4);
- break;
- case 7:
- connectorStatusInfo.setStatus(255);
- break;
- }
- NotificationStationStatusResult result = TCECUtil.notificationStationStatus(connectorStatusInfo);
- return R.ok();
- }
-
-
-
- /**
- * 设备接口状态查询
- * @param query
- * @return
- */
- @PostMapping("/query_station_status")
- public QueryStationStatusResult queryStationStatus(@RequestBody QueryStationStatus query){
-
- }
-}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/AESUtil.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/AESUtil.java
new file mode 100644
index 0000000..b8e4433
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/AESUtil.java
@@ -0,0 +1,107 @@
+package com.ruoyi.integration.drainage;
+
+
+import com.ruoyi.common.core.utils.StringUtils;
+import org.springframework.util.Base64Utils;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
+/**
+ * 定义AES加密解密工具类
+ */
+public class AESUtil {
+
+ private static final String KEY_ALGORITHM = "AES";//加密方式
+
+ private static final String DEFAULT_CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";//默认的加密算法
+
+ private static final String KEY = "1234567890abcdef";//密码
+
+ private static final String IV_PARAMETER = "1234567890abcdef";//偏移量
+
+ private static final String CHARSET = "UTF-8";//编码
+
+
+
+ /**
+ * 加密操作
+ * @param content 待加密内容
+ * @return
+ * @throws Exception
+ */
+ public static String encrypt(String content) {
+ return encrypt(content, KEY, IV_PARAMETER);
+ }
+
+
+
+ /**
+ * 加密操作
+ * @param content 待加密内容
+ * @return
+ * @throws Exception
+ */
+ public static String encrypt(String content, String key, String iv_parameter) {
+ try {
+ if(StringUtils.isEmpty(content)){
+ return content;
+ }
+ Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
+ byte[] raw = key.getBytes(CHARSET);
+ SecretKeySpec skeySpec = new SecretKeySpec(raw, KEY_ALGORITHM);
+ IvParameterSpec iv = new IvParameterSpec(iv_parameter.getBytes());
+ cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
+ byte[] encrypted = cipher.doFinal(content.getBytes(CHARSET));
+ return Base64Utils.encodeToString(encrypted);
+ }catch (Exception e){
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+
+ public static String decrypt(String content) {
+ return decrypt(content, KEY, IV_PARAMETER);
+ }
+
+
+
+
+
+ /**
+ *解密操作
+ * @param content 待解密内容
+ * @return
+ * @throws Exception
+ */
+ public static String decrypt(String content, String key, String iv_parameter) {
+ try {
+ if(StringUtils.isEmpty(content)){
+ return content;
+ }
+ byte[] raw = key.getBytes(CHARSET);
+ SecretKeySpec skeySpec = new SecretKeySpec(raw, KEY_ALGORITHM);
+ Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
+ IvParameterSpec iv = new IvParameterSpec(iv_parameter.getBytes());
+ cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
+
+ byte[] encrypted1 = Base64Utils.decodeFromString(content);
+ byte[] original = cipher.doFinal(encrypted1);
+ String originalString = new String(original, CHARSET);
+ return originalString;
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ return null;
+ }
+
+
+ public static void main(String[] ages){
+ String encrypt = AESUtil.encrypt("{\"total\":1,\"stationStatusInfo\":{\"operationID\":\"123456789\",\"stationID\":\"111111111111111\",\"connectorStatusInfos\":{\"connectorID\":1,\"equipmentID\":\"10000000000000000000001\",\"status\":4,\"currentA\":0,\"currentB\":0,\"currentC\":0,\"voltageA\":0,\"voltageB\":0,\"voltageC\":0,\"soc\":10,}}}");
+ System.err.println(encrypt);
+// String travel = AESUtil.decrypt("IGc1VSVN8ruGbmmXUQQKZQ==");
+// System.err.println(travel);
+ }
+}
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/NotificationStopCharge.java
new file mode 100644
index 0000000..a1e4a99
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/NotificationStopCharge.java
@@ -0,0 +1,33 @@
+package com.ruoyi.integration.drainage;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 推送停止充电结果应答
+ * @author zhibing.pu
+ * @Date 2025/1/23 9:17
+ */
+@Data
+public class NotificationStopCharge {
+ /**
+ * 充电订单号
+ */
+ @NotNull
+ private String StartChargeSeq;
+ /**
+ * 操作结果
+ * 0:成功
+ * 1:失败
+ */
+ @NotNull
+ private Integer SuccStat;
+ /**
+ * 失败原因
+ * 0:无
+ * 1:接收失败
+ */
+ @NotNull
+ private Integer FailReason;
+}
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/QueryStopCharge.java
new file mode 100644
index 0000000..49bea78
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/QueryStopCharge.java
@@ -0,0 +1,24 @@
+package com.ruoyi.integration.drainage;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 请求停止充电
+ * @author zhibing.pu
+ * @Date 2025/1/22 19:56
+ */
+@Data
+public class QueryStopCharge {
+ /**
+ * 充电订单号
+ */
+ @NotNull
+ private String StartChargeSeq;
+ /**
+ * 充电设备接口编码
+ */
+ @NotNull
+ private String ConnectorID;
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/SignUtil.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/SignUtil.java
new file mode 100644
index 0000000..d3d43e9
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/SignUtil.java
@@ -0,0 +1,208 @@
+package com.ruoyi.integration.drainage;
+
+import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
+
+/**
+ * 签名工具
+ * @author zhibing.pu
+ * @Date 2025/1/23 11:30
+ */
+public class SignUtil {
+
+
+ /*************************************快电******************************************/
+
+ /**
+ * 签名算法
+ *
+ * @param aValue 加密的原文,即源数据
+ * @param aKey 密钥 这是针对一条字符串进行加密的方法
+ */
+ public static String hmacSign (String aValue, String aKey) {
+ byte k_ipad[] = new byte[64];
+ byte k_opad[] = new byte[64];
+ byte keyb[];
+ byte value[];
+ try {
+ keyb = aKey.getBytes("UTF-8");
+ value = aValue.getBytes("UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ keyb = aKey.getBytes();
+ value = aValue.getBytes();
+ }
+
+ Arrays.fill(k_ipad, keyb.length, 64, (byte) 54);
+ Arrays.fill(k_opad, keyb.length, 64, (byte) 92);
+ for (int i = 0; i < keyb.length; i++) {
+ k_ipad[i] = (byte) (keyb[i] ^ 0x36);
+ k_opad[i] = (byte) (keyb[i] ^ 0x5c);
+ }
+
+ MessageDigest md = null;
+ try {
+ md = MessageDigest.getInstance("MD5");
+ } catch (NoSuchAlgorithmException e) {
+ return null;
+ }
+ md.update(k_ipad);
+ md.update(value);
+ byte dg[] = md.digest();
+ md.reset();
+ md.update(k_opad);
+ md.update(dg, 0, 16);
+ dg = md.digest();
+ return toHex(dg);
+ }
+
+ public static String toHex (byte input[]) {
+ if (input == null) {
+ return null;
+ }
+ StringBuffer output = new StringBuffer(input.length * 2);
+ for (int i = 0; i < input.length; i++) {
+ int current = input[i] & 0xff;
+ if (current < 16) {
+ output.append("0");
+ }
+ output.append(Integer.toString(current, 16));
+ }
+ return output.toString().toUpperCase();
+ }
+
+
+
+ /*************************************新电途******************************************/
+
+ /**
+ * HmacMd5的计算公式为:HMAC(K,M) = H(K⊕opad∣H(K⊕ipad∣M))
+ * 其中:K是密钥(byte[] key),长度可为64字节(后面涉及描述都是以字节byte进行),若小于该长度,在密钥后面用0(即0x00)补齐。
+ * M是消息内容(byte[] m);
+ * H是散列函数(此处采用MD5);
+ * opad和ipad分别是由若干个0x5c和0x36组成的字符串;
+ * ⊕表示异或运算;
+ * ∣表示连接操作。
+ **/
+ public static byte[] getHMacMD5Bytes(byte[] key, byte[] m) {
+ try {
+ //定义长度
+ int length = 64;
+ //定义opad和ipad
+ byte[] opad = new byte[length];
+ byte[] ipad = new byte[length];
+ for (int i = 0; i < length; i++) {
+ opad[i] = 0x5C;
+ ipad[i] = 0x36;
+ }
+ byte[] actualKey = key;
+ byte[] keyArr = new byte[length];
+ //如果密钥长度,大于64字节,就使用MD5算法计算其散列值,作为密钥
+ if (key.length > length) {
+ actualKey = md5(key);
+ }
+ for (int i = 0; i < actualKey.length; i++) {
+ keyArr[i] = actualKey[i];
+ }
+ //如果密钥长度不足64字节,就使用0x00补齐到64字节
+ if (actualKey.length < length) {
+ for (int i = key.length; i < length; i++) {
+ keyArr[i] = 0x00;
+ }
+ }
+ //使用密钥和ipad进行异或运算【K⊕ipad】
+ byte[] kIpadXorResult = new byte[length];
+ for (int i = 0; i < length; i++) {
+ kIpadXorResult[i] = (byte) (keyArr[i] ^ ipad[i]);
+ }
+ //将待加密数据M追加到kIpadXorResult后面【K⊕ipad∣M】
+ byte[] firstAppendResult = new byte[kIpadXorResult.length + m.length];
+ for (int i = 0; i < kIpadXorResult.length; i++) {
+ firstAppendResult[i] = kIpadXorResult[i];
+ }
+ for (int i = 0; i < m.length; i++) {
+ firstAppendResult[i + keyArr.length] = m[i];
+ }
+ //做MD5运算【H(K⊕ipad∣M)】
+ byte[] firstHashResult = md5(firstAppendResult);
+
+ //使用密钥和opad进行异或运算【K⊕opad】
+ byte[] kOpadXorResult = new byte[length];
+ for (int i = 0; i < length; i++) {
+ kOpadXorResult[i] = (byte) (keyArr[i] ^ opad[i]);
+ }
+ //将firstHashResult追加到kOpadXorResult后面【K⊕opad∣H(K⊕ipad∣M)】
+ byte[] secondAppendResult = new byte[kOpadXorResult.length + firstHashResult.length];
+ for (int i = 0; i < kOpadXorResult.length; i++) {
+ secondAppendResult[i] = kOpadXorResult[i];
+ }
+ for (int i = 0; i < firstHashResult.length; i++) {
+ secondAppendResult[kOpadXorResult.length + i] = firstHashResult[i];
+ }
+ //做MD5运算【H(K⊕opad∣H(K⊕ipad∣M))】
+ return md5(secondAppendResult);
+ } catch (NoSuchAlgorithmException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ /**
+ * MD5(产生出一个128位(16字节)的散列值)
+ **/
+ private static byte[] md5(byte[] str) throws NoSuchAlgorithmException {
+ MessageDigest md = MessageDigest.getInstance("MD5");
+ md.update(str);
+ return md.digest();
+ }
+
+ /**
+ * HEX转化为字符串
+ **/
+ public static String bytesToHexString(byte[] m) {
+ StringBuilder stringBuilder = new StringBuilder();
+ if (m == null || m.length <= 0) {
+ return null;
+ }
+ for (int i = 0; i < m.length; i++) {
+ int v = m[i] & 0xFF;
+ String hv = Integer.toHexString(v);
+ if (hv.length() < 2) {
+ stringBuilder.append(0);
+ }
+ stringBuilder.append(hv);
+ }
+ //最后得到的签名,统一转化为大写
+ return stringBuilder.toString().toUpperCase();
+ }
+
+
+
+
+ public static void main(String[] args) {
+// String encrypt = AESUtil.encrypt("{\"total\":1,\"stationStatusInfo\":{\"operationID\":\"123456789\",\"stationID\":\"111111111111111\",\"connectorStatusInfos\":{\"connectorID\":1,\"equipmentID\":\"10000000000000000000001\",\"status\":4,\"currentA\":0,\"currentB\":0,\"currentC\":0,\"voltageA\":0,\"voltageB\":0,\"voltageC\":0,\"soc\":10,}}}");
+// String s = hmacSign(encrypt, "123456789abcdef");
+// System.err.println(s);
+
+
+ //签名秘钥SigSecret
+ String key = "1234567890abcdef";
+ //运营商标识OperatorId
+ String operatorId = "123456789";
+ //参数信息Data
+ String data = "il7B0BSEjFdzpyKzfOFpvg/Se1CP802RItKYFPfSLRxJ3jf0bVl9hvYOEktPAYW2nd7S8MBcyHYyacHKbISq5iTmDzG+ivnR+SZJv3USNTYVMz9rCQVSxd0cLlqsJauko79NnwQJbzDTyLooYoIwz75qBOH2/xOMirpeEqRJrF/EQjWekJmGk9RtboXePu2rka+Xm51syBPhiXJAq0GfbfaFu9tNqs/e2Vjja/ltE1M0lqvxfXQ6da6HrThsm5id4ClZFIi0acRfrsPLRixS/IQYtksxghvJwbqOsbIsITail9Ayy4tKcogeEZiOO+4Ed264NSKmk7l3wKwJLAFjCFogBx8GE3OBz4pqcAn/ydA=";
+ //时间戳TimeStamp(格式:年月日时分秒)
+ String timeStamp = "20160729142400";
+ //自增序列Seq
+ String seq = "0001";
+ //进行字符串拼接、计算
+ String m = new StringBuilder(operatorId).append(data).append(timeStamp).append(seq).toString();
+ byte[] hmacMd5 = getHMacMD5Bytes(key.getBytes(), m.getBytes());
+ // 打印计算得到的签名Sig
+ System.out.println(bytesToHexString(hmacMd5));
+ }
+}
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
new file mode 100644
index 0000000..3aa324b
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java
@@ -0,0 +1,1155 @@
+package com.ruoyi.integration.drainage;
+
+import com.alibaba.fastjson.JSON;
+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.common.core.domain.R;
+import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.common.core.web.page.PageInfo;
+import com.ruoyi.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.order.api.model.TChargingOrder;
+import com.ruoyi.order.api.model.TChargingOrderAccountingStrategy;
+import com.ruoyi.other.api.domain.Operator;
+import com.ruoyi.other.api.feignClient.OperatorClient;
+import com.ruoyi.system.api.model.LoginUser;
+import org.springframework.beans.BeanUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author zhibing.pu
+ * @Date 2025/1/21 17:52
+ */
+@RestController
+@RequestMapping("/evcs/v1.0")
+public class TCECController {
+
+ @Resource
+ private SiteClient siteClient;
+
+ @Resource
+ private ChargingPileClient chargingPileClient;
+
+ @Resource
+ private ChargingGunClient chargingGunClient;
+
+ @Resource
+ private ChargingOrderClient chargingOrderClient;
+
+ @Resource
+ private OperatorClient operatorClient;
+
+ @Resource
+ private AccountingStrategyDetailClient accountingStrategyDetailClient;
+
+ @Resource
+ private ChargingOrderAccountingStrategyClient chargingOrderAccountingStrategyClient;
+
+ @Resource
+ private TokenUtil tokenUtil;
+
+ private static Map<Long, Integer> map = new HashMap<>();
+
+
+ /**
+ * 请求校验
+ * @param baseRequest
+ * @param request
+ * @return
+ */
+ public BaseResult requestCheck(Boolean tokenCheck, BaseRequest baseRequest, HttpServletRequest request){
+ BaseResult baseResult = new BaseResult();
+ baseResult.setRet(0);
+ baseResult.setMsg("成功");
+ baseResult.setOperatorID(baseRequest.getOperatorID());
+ Long mapKey = Long.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
+ Integer integer = map.get(mapKey);
+ if(null == integer){
+ integer = 1;
+ }else{
+ integer++;
+ }
+ map.put(mapKey, integer);
+ baseResult.setTimeStamp(mapKey);
+ baseResult.setSeq(String.format("%04d", integer));
+ //清空小于当前时间的map中的无效数据
+ for (Long k : map.keySet()) {
+ if(k <= (mapKey - 10)){
+ map.remove(k);
+ }
+ }
+
+ //校验token和签名
+ String operatorID = baseRequest.getOperatorID();
+ String sig = baseRequest.getSig();
+ Long timeStamp = baseRequest.getTimeStamp();
+ String data = baseRequest.getData();
+ String seq = baseRequest.getSeq();
+ if(StringUtils.isEmpty(operatorID) || StringUtils.isEmpty(sig) || StringUtils.isEmpty(data) || StringUtils.isEmpty(seq) || null == timeStamp){
+ baseResult.setRet(4003);
+ baseResult.setMsg("参数异常");
+ return baseResult;
+ }
+
+ R<Operator> r = operatorClient.getOperator(operatorID);
+ if(200 != r.getCode()){
+ baseResult.setRet(500);
+ baseResult.setMsg("系统异常");
+ return baseResult;
+ }
+ //校验token
+ if(tokenCheck){
+ LoginUser loginUser = tokenUtil.getLoginUser(request);
+ if(null == loginUser){
+ baseResult.setRet(4002);
+ baseResult.setMsg("身份校验失败,无效的token");
+ return baseResult;
+ }
+ }
+
+ Operator operator = r.getData();
+ baseRequest.setOperator(operator);
+ //校验签名
+ String sign = buildSign(baseRequest);
+ if(!sign.equals(sig)){
+ baseResult.setRet(4001);
+ baseResult.setMsg("签名校验失败");
+ return baseResult;
+ }
+ 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;
+ }
+
+
+
+
+
+ /**
+ * 获取token
+ * @return
+ */
+ @PostMapping("/query_token")
+ public BaseResult queryToken(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+ BaseResult baseResult = requestCheck(false, baseRequest, request);
+ if(0 != baseResult.getRet()){
+ baseResult.setData("");
+ baseResult.setSig(buildSign(baseResult));
+ return baseResult;
+ }
+ QueryTokenResult queryTokenResult = new QueryTokenResult();
+ Operator operator = baseResult.getOperator();
+ if(null == operator){
+ queryTokenResult.setSuccStat(1);
+ queryTokenResult.setFailReason(1);
+ return baseResult;
+ }
+
+ //解密参数
+ String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getDataSecret(), operator.getDataSecretIv());
+ QueryToken queryToken = JSON.parseObject(decrypt, QueryToken.class);
+ if(!queryToken.getOperatorSecret().equals(operator.getOperatorSecret())){
+ queryTokenResult.setSuccStat(1);
+ queryTokenResult.setFailReason(2);
+ //参数加密
+ String jsonString = JSON.toJSONString(queryTokenResult);
+ String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+ baseResult.setData(encrypt);
+ baseResult.setSig(buildSign(baseResult));
+ return baseResult;
+ }
+
+ //生成token
+ Map<String, Object> token = tokenUtil.createToken(operator);
+ String access_token = token.get("access_token").toString();
+ Long expires_in = Long.valueOf(token.get("expires_in").toString());
+
+ queryTokenResult.setSuccStat(0);
+ queryTokenResult.setFailReason(0);
+ queryTokenResult.setAccessToken(access_token);
+ queryTokenResult.setTokenAvailableTime(expires_in * 60);
+ //参数加密
+ String jsonString = JSON.toJSONString(queryTokenResult);
+ String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+ baseResult.setData(encrypt);
+ baseResult.setSig(buildSign(baseResult));
+ return baseResult;
+ }
+
+
+
+
+
+ /**
+ * 查询充电站信息
+ * @return
+ */
+ @PostMapping("/query_stations_info")
+ public BaseResult queryStationsInfo(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+ //校验token和签名
+ BaseResult baseResult = requestCheck(true, baseRequest, request);
+ if(0 != baseResult.getRet()){
+ baseResult.setData("");
+ baseResult.setSig(buildSign(baseResult));
+ return baseResult;
+ }
+ Operator operator = baseResult.getOperator();
+ //解密参数
+ String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getDataSecret(), operator.getDataSecretIv());
+ QueryStationsInfo queryStationsInfo = JSON.parseObject(decrypt, QueryStationsInfo.class);
+ Integer pageNo = queryStationsInfo.getPageNo();
+ Integer pageSize = queryStationsInfo.getPageSize();
+ if(null == pageNo){
+ pageNo = 1;
+ }
+ if(null == pageSize){
+ pageSize = 10;
+ }
+ PageInfo<Site> siteListPaging = siteClient.getSiteListPaging(pageNo, pageSize);
+ QueryStationsInfoResult queryStationsInfoResult = new QueryStationsInfoResult();
+ queryStationsInfoResult.setPageNo(pageNo);
+ queryStationsInfoResult.setPageCount((0 == (siteListPaging.getTotal() % pageSize) ? 0 : 1) + Double.valueOf(siteListPaging.getTotal() / pageSize).intValue());
+ queryStationsInfoResult.setItemSize(Long.valueOf(siteListPaging.getTotal()).intValue());
+ queryStationsInfoResult.setStationInfos(buildSite(siteListPaging.getRecords()));
+ //参数加密
+ String jsonString = JSON.toJSONString(queryStationsInfoResult);
+ String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+ baseResult.setData(encrypt);
+ baseResult.setSig(buildSign(baseResult));
+ return baseResult;
+ }
+
+
+ /**
+ * 构建站点数据
+ * @param sites
+ * @return
+ */
+ public List<StationInfo> buildSite(List<Site> sites){
+ List<Integer> siteIds = sites.stream().map(Site::getId).collect(Collectors.toList());
+ List<TChargingPile> tChargingPiles = chargingPileClient.getChargingPileBySiteIds(siteIds).getData();
+ List<Integer> collect1 = tChargingPiles.stream().map(TChargingPile::getId).collect(Collectors.toList());
+ List<TChargingGun> chargingGunList = chargingGunClient.getChargingGunByChargingPileIds(collect1).getData();
+
+ List<StationInfo> StationInfos = new ArrayList<>();
+ for (Site datum : sites) {
+ StationInfo stationInfo = new StationInfo();
+ stationInfo.setStationID(datum.getId().toString());
+ stationInfo.setOperatorID("");
+ stationInfo.setEquipmentOwnerID("91510903906171535D");
+ stationInfo.setStationName(datum.getName());
+ stationInfo.setCountryCode(datum.getCountryCode());
+ stationInfo.setAreaCode(datum.getDistrictsCode());
+ stationInfo.setAddress(datum.getAddress());
+ stationInfo.setStationTel(datum.getPhone());
+ stationInfo.setServiceTel(datum.getServicePhone());
+ switch (datum.getSiteType()){
+ case 0:
+ stationInfo.setStationType(StationTypeEnum.OTHER.getType());
+ break;
+ case 1:
+ stationInfo.setStationType(StationTypeEnum.PUBLIC.getType());
+ break;
+ case 2:
+ stationInfo.setStationType(StationTypeEnum.PERSONAGE.getType());
+ break;
+ case 3:
+ stationInfo.setStationType(StationTypeEnum.BUS_SPECIFIC.getType());
+ break;
+ case 4:
+ stationInfo.setStationType(StationTypeEnum.SANITATION_SPECIFIC.getType());
+ break;
+ case 5:
+ stationInfo.setStationType(StationTypeEnum.LOGISTICS_SPECIFIC.getType());
+ break;
+ case 6:
+ stationInfo.setStationType(StationTypeEnum.TEXT_SPECIFIC.getType());
+ break;
+ }
+ if(datum.getStatus() == 1){
+ stationInfo.setStationStatus(StationStatusEnum.NORMAL_USE.getStatus());
+ }
+ if(datum.getStatus() == 2){
+ stationInfo.setStationStatus(StationStatusEnum.MAINTAIN.getStatus());
+ }
+ if(datum.getStatus() == 3){
+ stationInfo.setStationStatus(StationStatusEnum.OFF_LINE.getStatus());
+ }
+ stationInfo.setParkNums(datum.getParkingSpace());
+ stationInfo.setStationLat(new BigDecimal(datum.getLat()).setScale(6, RoundingMode.DOWN));
+ stationInfo.setStationLng(new BigDecimal(datum.getLon()).setScale(6, RoundingMode.DOWN));
+ stationInfo.setConstruction(datum.getConstructionSite() == 0 ? ConstructionEnum.OTHER.getType() : datum.getConstructionSite());
+ stationInfo.setPictures(Arrays.asList(datum.getImgUrl().split(",")));
+ stationInfo.setSiteGuide(datum.getGuide());
+ stationInfo.setMatchCars(datum.getVehicleDescription());
+ stationInfo.setBusineHours(datum.getStartServiceTime() + "-" + datum.getEndServiceTime());
+ stationInfo.setElectricityFee(datum.getRateDescription());
+ //构建充电设备信息数据
+ stationInfo.setEquipmentInfos(buildEquipmentInfo(datum.getId(), tChargingPiles, chargingGunList));
+ StationInfos.add(stationInfo);
+ }
+ return StationInfos;
+ }
+
+
+
+ /**
+ * 构建桩数据
+ * @param tChargingPiles
+ * @return
+ */
+ public List<EquipmentInfo> buildEquipmentInfo(Integer siteId, List<TChargingPile> tChargingPiles, List<TChargingGun> chargingGunList){
+ List<EquipmentInfo> equipmentInfos = new ArrayList<>();
+ List<TChargingPile> collect = tChargingPiles.stream().filter(s -> s.getSiteId().equals(siteId)).collect(Collectors.toList());
+ for (TChargingPile tChargingPile : collect) {
+ EquipmentInfo equipmentInfo = new EquipmentInfo();
+ equipmentInfo.setEquipmentID(tChargingPile.getId().toString());
+ equipmentInfo.setManufacturerID(tChargingPile.getManufacturerCode());
+ equipmentInfo.setManufacturerName(tChargingPile.getManufacturer());
+ equipmentInfo.setEquipmentModel(tChargingPile.getEquipmentType());
+ if(null != tChargingPile.getProductionDate()){
+ equipmentInfo.setProductionDate(tChargingPile.getProductionDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+ }
+ switch (tChargingPile.getType()){
+ case 0:
+ equipmentInfo.setEquipmentType(EquipmentTypeEnum.OTHER.getType());
+ break;
+ case 1:
+ equipmentInfo.setEquipmentType(EquipmentTypeEnum.DIRECT_CURRENT.getType());
+ break;
+ case 2:
+ equipmentInfo.setEquipmentType(EquipmentTypeEnum.ALTERNATING_CURRENT.getType());
+ break;
+ case 3:
+ equipmentInfo.setEquipmentType(EquipmentTypeEnum.ALTERNATING_DIRECT.getType());
+ break;
+ case 4:
+ equipmentInfo.setEquipmentType(EquipmentTypeEnum.WIRELESS_DEVICE.getType());
+ break;
+ }
+
+ //构建设备接口信息
+ equipmentInfo.setConnectorInfos(buildConnectorInfos(tChargingPile.getId(), chargingGunList));
+ equipmentInfos.add(equipmentInfo);
+ }
+ return equipmentInfos;
+ }
+
+
+ /**
+ * 构建接口数据
+ * @param chargingGunList
+ * @return
+ */
+ public List<ConnectorInfo> buildConnectorInfos(Integer chargingPileId, List<TChargingGun> chargingGunList){
+ List<ConnectorInfo> connectorInfos = new ArrayList<>();
+ List<TChargingGun> collect = chargingGunList.stream().filter(s -> s.getChargingPileId().equals(chargingPileId)).collect(Collectors.toList());
+ for (TChargingGun chargingGun : collect) {
+ ConnectorInfo connectorInfo = new ConnectorInfo();
+ connectorInfo.setConnectorID(chargingGun.getId().toString());
+ connectorInfo.setConnectorName(chargingGun.getName());
+ switch (chargingGun.getType()){
+ case 0:
+ connectorInfo.setConnectorType(ConnectorTypeEnum.OTHER.getType());
+ break;
+ case 1:
+ connectorInfo.setConnectorType(ConnectorTypeEnum.HOUSEHOLD_SOCKET.getType());
+ break;
+ case 2:
+ connectorInfo.setConnectorType(ConnectorTypeEnum.AC_SOCKET.getType());
+ break;
+ case 3:
+ connectorInfo.setConnectorType(ConnectorTypeEnum.AC_INTERFACE_PLUG.getType());
+ break;
+ case 4:
+ connectorInfo.setConnectorType(ConnectorTypeEnum.DC_INTERFACE_GUN_HEAD.getType());
+ break;
+ case 5:
+ connectorInfo.setConnectorType(ConnectorTypeEnum.WIRELESS_CHARGING_STAND.getType());
+ break;
+ }
+ connectorInfo.setVoltageUpperLimits(chargingGun.getUpperRatedVoltage().intValue());
+ connectorInfo.setVoltageLowerLimits(chargingGun.getLowerLimitOfRatedVoltage().intValue());
+ connectorInfo.setCurrent(chargingGun.getRatedCurrent().intValue());
+ connectorInfo.setPower(chargingGun.getRatedPower());
+ connectorInfo.setParkNo(chargingGun.getParkingNumber());
+ connectorInfo.setNationalStandard(Integer.valueOf(chargingGun.getNationalStandard()));
+ connectorInfos.add(connectorInfo);
+ }
+ return connectorInfos;
+ }
+
+
+ /**
+ * 接口状态变化后推送给第三方
+ * @return
+ */
+ @PostMapping("/pushChargingGunStatus")
+ public R pushChargingGunStatus(@RequestParam("id") Integer id, @RequestParam("status") Integer status){
+ ConnectorStatusInfo connectorStatusInfo = new ConnectorStatusInfo();
+ connectorStatusInfo.setConnectorID(id.toString());
+ switch (status){
+ case 1:
+ connectorStatusInfo.setStatus(0);
+ break;
+ case 2:
+ connectorStatusInfo.setStatus(1);
+ break;
+ case 3:
+ connectorStatusInfo.setStatus(2);
+ break;
+ case 4:
+ connectorStatusInfo.setStatus(3);
+ break;
+ case 5:
+ connectorStatusInfo.setStatus(3);
+ break;
+ case 6:
+ connectorStatusInfo.setStatus(4);
+ break;
+ case 7:
+ connectorStatusInfo.setStatus(255);
+ break;
+ }
+ NotificationStationStatusResult result = TCECUtil.notificationStationStatus(connectorStatusInfo);
+ return R.ok();
+ }
+
+
+
+ /**
+ * 设备接口状态查询
+ * @return
+ */
+ @PostMapping("/query_station_status")
+ public BaseResult queryStationStatus(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+ BaseResult baseResult = requestCheck(true, baseRequest, request);
+ if(0 != baseResult.getRet()){
+ baseResult.setData("");
+ baseResult.setSig(buildSign(baseResult));
+ return baseResult;
+ }
+ Operator operator = baseResult.getOperator();
+ //解密参数
+ String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getDataSecret(), operator.getDataSecretIv());
+ QueryStationStatus queryStationsInfo = JSON.parseObject(decrypt, QueryStationStatus.class);
+ List<Integer> collect = queryStationsInfo.getStationIDs().stream().map(Integer::valueOf).collect(Collectors.toList());
+ List<Site> data = siteClient.getSiteByIds(collect).getData();
+ List<Integer> siteIds = data.stream().map(Site::getId).collect(Collectors.toList());
+ List<TChargingPile> tChargingPiles = chargingPileClient.getChargingPileBySiteIds(siteIds).getData();
+ List<Integer> collect1 = tChargingPiles.stream().map(TChargingPile::getId).collect(Collectors.toList());
+ List<TChargingGun> chargingGunList = chargingGunClient.getChargingGunByChargingPileIds(collect1).getData();
+
+ QueryStationStatusResult result = new QueryStationStatusResult();
+ result.setTotal(data.size());
+ List<StationStatusInfo> StationStatusInfos = new ArrayList<>();
+ for (Site datum : data) {
+ StationStatusInfo stationStatusInfo = new StationStatusInfo();
+ stationStatusInfo.setStationID(datum.getId().toString());
+ //构建接口状态
+ List<ConnectorStatusInfo> ConnectorStatusInfos = new ArrayList<>();
+ List<TChargingGun> collect2 = chargingGunList.stream().filter(s -> s.getSiteId().equals(datum.getId())).collect(Collectors.toList());
+ for (TChargingGun chargingGun : collect2) {
+ ConnectorStatusInfo info = new ConnectorStatusInfo();
+ info.setConnectorID(chargingGun.getId().toString());
+ switch (chargingGun.getStatus()){
+ case 1:
+ info.setStatus(0);
+ break;
+ case 2:
+ info.setStatus(1);
+ break;
+ case 3:
+ info.setStatus(2);
+ break;
+ case 4:
+ info.setStatus(3);
+ break;
+ case 5:
+ info.setStatus(3);
+ break;
+ case 6:
+ info.setStatus(4);
+ break;
+ case 7:
+ info.setStatus(255);
+ break;
+ }
+ ConnectorStatusInfos.add(info);
+ }
+ stationStatusInfo.setConnectorStatusInfos(ConnectorStatusInfos);
+ StationStatusInfos.add(stationStatusInfo);
+ }
+ result.setStationStatusInfos(StationStatusInfos);
+ //参数加密
+ String jsonString = JSON.toJSONString(result);
+ String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+ baseResult.setData(encrypt);
+ baseResult.setSig(buildSign(baseResult));
+ return baseResult;
+ }
+
+
+
+
+
+ /**
+ * 查询统计信息
+ * @return
+ */
+ @PostMapping("/query_station_stats")
+ public BaseResult queryStationStats(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+ //校验token和签名
+ BaseResult baseResult = requestCheck(true, baseRequest, request);
+ if(0 != baseResult.getRet()){
+ baseResult.setData("");
+ baseResult.setSig(buildSign(baseResult));
+ return baseResult;
+ }
+ Operator operator = baseResult.getOperator();
+ //解密参数
+ String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getDataSecret(), operator.getDataSecretIv());
+ QueryStationStats queryStationStats = JSON.parseObject(decrypt, QueryStationStats.class);
+ QueryStationStatsResult result = new QueryStationStatsResult();
+ ChargingPercentProvinceDto dto = new ChargingPercentProvinceDto();
+ dto.setDate1(LocalDate.parse(queryStationStats.getStartTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+ dto.setDate2(LocalDate.parse(queryStationStats.getEndTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+ dto.setSiteIds(new HashSet<>(Integer.valueOf(queryStationStats.getStationID())));
+ dto.setTripartitePlatformName(operator.getName());
+ List<TChargingOrder> chargingOrders = chargingOrderClient.getOrderBySiteIdAndTime(dto).getData();
+ BigDecimal reduce = chargingOrders.stream().map(TChargingOrder::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
+ StationStatsInfo stationStats = new StationStatsInfo();
+ stationStats.setStationID(chargingOrders.get(0).getSiteId().toString());
+ stationStats.setStartTime(queryStationStats.getStartTime());
+ stationStats.setEndTime(queryStationStats.getEndTime());
+ stationStats.setStationElectricity(reduce);
+ //构建设备统计数据
+ List<EquipmentStatsInfo> EquipmentStatsInfos = new ArrayList<>();
+ Map<Integer, List<TChargingOrder>> collect = chargingOrders.stream().collect(Collectors.groupingBy(TChargingOrder::getChargingPileId));
+ for (Integer integer : collect.keySet()) {
+ List<TChargingOrder> tChargingOrders = collect.get(integer);
+ BigDecimal reduce1 = tChargingOrders.stream().map(TChargingOrder::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
+
+ EquipmentStatsInfo equipmentStatsInfo = new EquipmentStatsInfo();
+ equipmentStatsInfo.setEquipmentID(integer.toString());
+ equipmentStatsInfo.setEquipmentElectricity(reduce1);
+
+ //构建设备接口统计数据
+ Map<Integer, List<TChargingOrder>> collect2 = tChargingOrders.stream().collect(Collectors.groupingBy(TChargingOrder::getChargingGunId));
+ List<ConnectorStatsInfo> ConnectorStatsInfos = new ArrayList<>();
+ for (Integer integer1 : collect2.keySet()) {
+ List<TChargingOrder> tChargingOrders1 = collect2.get(integer1);
+ BigDecimal reduce2 = tChargingOrders1.stream().map(TChargingOrder::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
+
+ ConnectorStatsInfo connectorStatsInfo = new ConnectorStatsInfo();
+ connectorStatsInfo.setConnectorID(integer1.toString());
+ connectorStatsInfo.setConnectorElectricity(reduce2);
+ ConnectorStatsInfos.add(connectorStatsInfo);
+ }
+ equipmentStatsInfo.setConnectorStatsInfos(ConnectorStatsInfos);
+ EquipmentStatsInfos.add(equipmentStatsInfo);
+ }
+ stationStats.setEquipmentStatsInfos(EquipmentStatsInfos);
+ result.setStationStats(stationStats);
+ //参数加密
+ String jsonString = JSON.toJSONString(result);
+ String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+ baseResult.setData(encrypt);
+ baseResult.setSig(buildSign(baseResult));
+ return baseResult;
+ }
+
+
+ /**
+ * 请求设备认证
+ * @return
+ */
+ @PostMapping("/query_equip_auth")
+ public BaseResult queryEquipAuth(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+ //校验token和签名
+ BaseResult baseResult = requestCheck(true, baseRequest, request);
+ if(0 != baseResult.getRet()){
+ baseResult.setData("");
+ baseResult.setSig(buildSign(baseResult));
+ return baseResult;
+ }
+ Operator operator = baseResult.getOperator();
+ //解密参数
+ String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getDataSecret(), operator.getDataSecretIv());
+ QueryEquipAuth queryEquipAuth = JSON.parseObject(decrypt, QueryEquipAuth.class);
+ String connectorID = queryEquipAuth.getConnectorID();
+ TChargingGun tChargingGun = chargingGunClient.getChargingGunById(Integer.valueOf(connectorID)).getData();
+ if(null == tChargingGun){
+ baseResult.setRet(4004);
+ baseResult.setMsg("connectorID 参数无效");
+ return baseResult;
+ }
+ QueryEquipAuthResult queryEquipAuthResult = new QueryEquipAuthResult();
+ queryEquipAuthResult.setEquipAuthSeq(queryEquipAuth.getEquipAuthSeq());
+ queryEquipAuthResult.setConnectorID(connectorID);
+ //1=离线,2=空闲,3=占用(未充电),4=占用(充电中),5=占用(已充满),6=占用(预约锁定),7=故障
+ switch (tChargingGun.getStatus()){
+ case 1:
+ queryEquipAuthResult.setSuccStat(1);
+ queryEquipAuthResult.setFailReason(2);
+ break;
+ case 2:
+ queryEquipAuthResult.setSuccStat(0);
+ queryEquipAuthResult.setFailReason(0);
+ break;
+ case 3:
+ queryEquipAuthResult.setSuccStat(0);
+ queryEquipAuthResult.setFailReason(1);
+ break;
+ case 4:
+ queryEquipAuthResult.setSuccStat(1);
+ queryEquipAuthResult.setFailReason(4);
+ break;
+ case 5:
+ queryEquipAuthResult.setSuccStat(1);
+ queryEquipAuthResult.setFailReason(5);
+ break;
+ case 6:
+ queryEquipAuthResult.setSuccStat(1);
+ queryEquipAuthResult.setFailReason(6);
+ break;
+ case 7:
+ queryEquipAuthResult.setSuccStat(1);
+ queryEquipAuthResult.setFailReason(2);
+ break;
+ }
+ //参数加密
+ String jsonString = JSON.toJSONString(queryEquipAuthResult);
+ String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+ baseResult.setData(encrypt);
+ baseResult.setSig(buildSign(baseResult));
+ return baseResult;
+ }
+
+
+
+ /**
+ * 查询业务策略信息
+ * @return
+ */
+ @PostMapping("/query_equip_business_policy")
+ public BaseResult queryEquipBusinessPolicy(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+ //校验token和签名
+ BaseResult baseResult = requestCheck(true, baseRequest, request);
+ if(0 != baseResult.getRet()){
+ baseResult.setData("");
+ baseResult.setSig(buildSign(baseResult));
+ return baseResult;
+ }
+ Operator operator = baseResult.getOperator();
+ //解密参数
+ String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getDataSecret(), operator.getDataSecretIv());
+ QueryEquipBusinessPolicy queryEquipBusinessPolicy = JSON.parseObject(decrypt, QueryEquipBusinessPolicy.class);
+
+ //构建返回结果
+ QueryEquipBusinessPolicyResult queryEquipBusinessPolicyResult = new QueryEquipBusinessPolicyResult();
+ queryEquipBusinessPolicyResult.setEquipBizSeq(queryEquipBusinessPolicy.getEquipBizSeq());
+ queryEquipBusinessPolicyResult.setConnectorID(queryEquipBusinessPolicy.getConnectorID());
+ queryEquipBusinessPolicyResult.setSuccStat(0);
+ queryEquipBusinessPolicyResult.setFailReason(0);
+ String connectorID = queryEquipBusinessPolicy.getConnectorID();
+ TChargingGun tChargingGun = chargingGunClient.getChargingGunById(Integer.valueOf(connectorID)).getData();
+ if(null == tChargingGun){
+ baseResult.setRet(4004);
+ baseResult.setMsg("connectorID 参数无效");
+ //参数加密
+ String jsonString = JSON.toJSONString(queryEquipBusinessPolicyResult);
+ String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+ baseResult.setData(encrypt);
+ baseResult.setSig(buildSign(baseResult));
+ return baseResult;
+ }
+ Integer accountingStrategyId = tChargingGun.getAccountingStrategyId();
+ if(null == accountingStrategyId){
+ List<Site> data = siteClient.getSiteByIds(Arrays.asList(tChargingGun.getSiteId())).getData();
+ accountingStrategyId = data.get(0).getAccountingStrategyId();
+ }
+ List<TAccountingStrategyDetail> accountingStrategyDetails = accountingStrategyDetailClient.getListByAccountingStrategyId(accountingStrategyId).getData();
+ if(accountingStrategyDetails.size() == 0){
+ queryEquipBusinessPolicyResult.setSuccStat(1);
+ queryEquipBusinessPolicyResult.setFailReason(1);
+ queryEquipBusinessPolicyResult.setSumPeriod(0);
+ //参数加密
+ String jsonString = JSON.toJSONString(queryEquipBusinessPolicyResult);
+ String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+ baseResult.setData(encrypt);
+ baseResult.setSig(buildSign(baseResult));
+ return baseResult;
+ }
+ List<PolicyInfo> PolicyInfos = new ArrayList<>();
+ for (TAccountingStrategyDetail accountingStrategyDetail : accountingStrategyDetails) {
+ PolicyInfo policyInfo = new PolicyInfo();
+ policyInfo.setStartTime(accountingStrategyDetail.getStartTime().replaceAll(":", "") + "00");
+ policyInfo.setElecPrice(accountingStrategyDetail.getElectrovalence());
+ policyInfo.setSevicePrice(accountingStrategyDetail.getServiceCharge());
+ PolicyInfos.add(policyInfo);
+ }
+ queryEquipBusinessPolicyResult.setSumPeriod(PolicyInfos.size());
+ queryEquipBusinessPolicyResult.setPolicyInfos(PolicyInfos);
+ //参数加密
+ String jsonString = JSON.toJSONString(queryEquipBusinessPolicyResult);
+ String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+ baseResult.setData(encrypt);
+ baseResult.setSig(buildSign(baseResult));
+ return baseResult;
+ }
+
+
+ /**
+ * 请求定充电
+ * @return
+ */
+ @PostMapping("/query_start_charge")
+ public BaseResult queryStartCharge(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+ //校验token和签名
+ BaseResult baseResult = requestCheck(true, baseRequest, request);
+ if(0 != baseResult.getRet()){
+ baseResult.setData("");
+ baseResult.setSig(buildSign(baseResult));
+ return baseResult;
+ }
+ Operator operator = baseResult.getOperator();
+ //解密参数
+ String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getDataSecret(), operator.getDataSecretIv());
+ QueryStartCharge queryStartCharge = JSON.parseObject(decrypt, QueryStartCharge.class);
+
+ //构建返回结果
+ QueryStartChargeResult result = new QueryStartChargeResult();
+ result.setStartChargeSeq(queryStartCharge.getStartChargeSeq());
+ result.setConnectorID(queryStartCharge.getConnectorID());
+ String connectorID = queryStartCharge.getConnectorID();
+ TChargingGun tChargingGun = chargingGunClient.getChargingGunById(Integer.valueOf(connectorID)).getData();
+ //设备不存在
+ if(null == tChargingGun){
+ baseResult.setRet(4004);
+ baseResult.setMsg("connectorID 参数无效");
+ result.setSuccStat(1);
+ result.setFailReason(1);
+ result.setStartChargeSeqStat(5);
+ //参数加密
+ String jsonString = JSON.toJSONString(result);
+ String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+ baseResult.setData(encrypt);
+ baseResult.setSig(buildSign(baseResult));
+ return baseResult;
+ }
+ //设备离线
+ if(tChargingGun.getStatus() == 1){
+ result.setSuccStat(1);
+ result.setFailReason(2);
+ result.setStartChargeSeqStat(5);
+ //参数加密
+ String jsonString = JSON.toJSONString(result);
+ String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+ baseResult.setData(encrypt);
+ baseResult.setSig(buildSign(baseResult));
+ return baseResult;
+ }
+ //调用充电接口
+ AddTripartitePlatformOrder addTripartitePlatformOrder = new AddTripartitePlatformOrder();
+ addTripartitePlatformOrder.setStartChargeSeq(queryStartCharge.getStartChargeSeq());
+ addTripartitePlatformOrder.setChargingGunId(tChargingGun.getId());
+// addTripartitePlatformOrder.setOperatorId(query.get);
+ addTripartitePlatformOrder.setPaymentAmount(queryStartCharge.getPaymentAmount());
+ addTripartitePlatformOrder.setRechargePaymentType(queryStartCharge.getPaymentType());
+ R order = chargingOrderClient.addTripartitePlatformOrder(addTripartitePlatformOrder);
+ //启动失败
+ if(200 != order.getCode()){
+ result.setSuccStat(1);
+ result.setFailReason(1);
+ result.setStartChargeSeqStat(2);
+ //参数加密
+ String jsonString = JSON.toJSONString(result);
+ String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+ baseResult.setData(encrypt);
+ baseResult.setSig(buildSign(baseResult));
+ return baseResult;
+ }
+ result.setStartChargeSeqStat(1);
+ result.setSuccStat(0);
+ result.setFailReason(0);
+ //参数加密
+ String jsonString = JSON.toJSONString(result);
+ String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+ baseResult.setData(encrypt);
+ baseResult.setSig(buildSign(baseResult));
+ return baseResult;
+ }
+
+
+ /**
+ * 启动充电结果推送
+ * @param result
+ * @return
+ */
+ @PostMapping("/notificationStartChargeResult")
+ public R notificationStartChargeResult(@RequestBody StartChargeResult result){
+ NotificationStartCharge notificationStartCharge = new NotificationStartCharge();
+ BeanUtils.copyProperties(result, notificationStartCharge);
+ com.ruoyi.integration.drainage.model.NotificationStartChargeResult notificationStartChargeResult = TCECUtil.notificationStartChargeResult(notificationStartCharge);
+ //启动重试推送机制
+ if(null == notificationStartChargeResult || 1 == notificationStartChargeResult.getSuccStat()){
+
+ }
+ return R.ok();
+ }
+
+
+
+ /**
+ * 查询充电状态
+ * @return
+ */
+ @PostMapping("/query_equip_charge_status")
+ public BaseResult queryEquipChargeStatus(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+ //校验token和签名
+ BaseResult baseResult = requestCheck(true, baseRequest, request);
+ if(0 != baseResult.getRet()){
+ baseResult.setData("");
+ baseResult.setSig(buildSign(baseResult));
+ return baseResult;
+ }
+ Operator operator = baseResult.getOperator();
+ //解密参数
+ String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getDataSecret(), operator.getDataSecretIv());
+ QueryEquipChargeStatus queryEquipChargeStatus = JSON.parseObject(decrypt, QueryEquipChargeStatus.class);
+ //校验token和签名
+ QueryEquipChargeStatusResult queryEquipChargeStatusResult = buildQueryEquipChargeStatusResult(queryEquipChargeStatus.getStartChargeSeq());
+ //参数加密
+ String jsonString = JSON.toJSONString(queryEquipChargeStatusResult);
+ String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+ baseResult.setData(encrypt);
+ baseResult.setSig(buildSign(baseResult));
+ return baseResult;
+ }
+
+
+ /**
+ * 构建充电状态结果
+ * @param startChargeSeq
+ * @return
+ */
+ public QueryEquipChargeStatusResult buildQueryEquipChargeStatusResult(String startChargeSeq){
+ //构建返回结果
+ QueryEquipChargeStatusResult queryEquipChargeStatusResult = new QueryEquipChargeStatusResult();
+ queryEquipChargeStatusResult.setStartChargeSeq(startChargeSeq);
+ TChargingOrder chargingOrder = chargingOrderClient.getChargingOrderByStartChargeSeq(startChargeSeq).getData();
+ if(null == chargingOrder){
+ return null;
+ }
+ //0=未知,1=等待中/已插枪,2=启动中,3=充电中,4=停止中,5=已结束
+ switch (chargingOrder.getStatus()){
+ case 0:
+ queryEquipChargeStatusResult.setStartChargeSeqStat(5);
+ break;
+ case 1:
+ queryEquipChargeStatusResult.setStartChargeSeqStat(0);
+ break;
+ case 2:
+ queryEquipChargeStatusResult.setStartChargeSeqStat(1);
+ break;
+ case 3:
+ queryEquipChargeStatusResult.setStartChargeSeqStat(2);
+ break;
+ case 4:
+ queryEquipChargeStatusResult.setStartChargeSeqStat(3);
+ break;
+ case 5:
+ queryEquipChargeStatusResult.setStartChargeSeqStat(4);
+ break;
+ }
+ queryEquipChargeStatusResult.setConnectorID(chargingOrder.getChargingGunId().toString());
+ TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
+ //1=离线,2=空闲,3=占用(未充电),4=占用(充电中),5=占用(已充满),6=占用(预约锁定),7=故障
+ switch (chargingGun.getStatus()){
+ case 1:
+ queryEquipChargeStatusResult.setConnectorStatus(0);
+ break;
+ case 2:
+ queryEquipChargeStatusResult.setConnectorStatus(1);
+ break;
+ case 3:
+ queryEquipChargeStatusResult.setConnectorStatus(2);
+ break;
+ case 4:
+ queryEquipChargeStatusResult.setConnectorStatus(3);
+ break;
+ case 5:
+ queryEquipChargeStatusResult.setConnectorStatus(1);
+ break;
+ case 6:
+ queryEquipChargeStatusResult.setConnectorStatus(4);
+ break;
+ case 7:
+ queryEquipChargeStatusResult.setConnectorStatus(255);
+ break;
+ }
+ queryEquipChargeStatusResult.setCurrentA(chargingOrder.getCurrent());
+ queryEquipChargeStatusResult.setVoltageA(chargingOrder.getVoltage());
+ queryEquipChargeStatusResult.setSoc(chargingOrder.getTotalElectricity());
+ queryEquipChargeStatusResult.setStartTime((null == chargingOrder.getStartTime() ? chargingOrder.getCreateTime() : chargingOrder.getStartTime()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+ queryEquipChargeStatusResult.setEndTime((null == chargingOrder.getStartTime() ? LocalDateTime.now() : chargingOrder.getEndTime()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+ queryEquipChargeStatusResult.setTotalPower(chargingOrder.getElectricity());
+ queryEquipChargeStatusResult.setElecMoney(chargingOrder.getTotalElectricity());
+ queryEquipChargeStatusResult.setSeviceMoney(chargingOrder.getServiceCharge());
+ queryEquipChargeStatusResult.setTotalMoney(chargingOrder.getTotalElectricity().add(chargingOrder.getServiceCharge()));
+
+ //构建充电明细
+ List<ChargeDetail> chargeDetails = new ArrayList<>();
+ List<TChargingOrderAccountingStrategy> data = chargingOrderAccountingStrategyClient.getChargingOrderAccountingStrategyByOrderId(chargingOrder.getId()).getData();
+
+ LocalDateTime startTime = chargingOrder.getStartTime();
+ LocalDateTime endTime = chargingOrder.getEndTime();
+ String s_format = startTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+ String e_format = endTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+ for (TChargingOrderAccountingStrategy datum : data) {
+ ChargeDetail chargeDetail = new ChargeDetail();
+ if(s_format.equals(e_format)){
+ chargeDetail.setDetailStartTime(s_format + " " + datum.getStartTime() + ":00");
+ chargeDetail.setDetailEndTime(s_format + " " + datum.getEndTime() + ":59");
+ }else{
+ String substring = datum.getEndTime().substring(0, datum.getEndTime().indexOf(":"));
+ if(Integer.valueOf(substring) > 12){
+ chargeDetail.setDetailStartTime(s_format + " " + datum.getStartTime() + ":00");
+ chargeDetail.setDetailEndTime(s_format + " " + datum.getEndTime() + ":59");
+ }else{
+ chargeDetail.setDetailStartTime(e_format + " " + datum.getStartTime() + ":00");
+ chargeDetail.setDetailEndTime(e_format + " " + datum.getEndTime() + ":59");
+ }
+ }
+ chargeDetail.setElecPrice(datum.getElectrovalence());
+ chargeDetail.setSevicePrice(datum.getServiceCharge());
+ chargeDetail.setDetailPower(datum.getChargingCapacity());
+ chargeDetail.setDetailElecMoney(datum.getPeriodElectricPrice());
+ chargeDetail.setDetailSeviceMoney(datum.getPeriodServicePrice());
+ chargeDetails.add(chargeDetail);
+ }
+ queryEquipChargeStatusResult.setChargeDetails(chargeDetails);
+ return queryEquipChargeStatusResult;
+ }
+
+
+ /**
+ * 推送充电状态
+ * @param startChargeSeq
+ * @return
+ */
+ @PostMapping("/notificationEquipChargeStatus")
+ public R notificationEquipChargeStatus(@RequestParam("startChargeSeq") String startChargeSeq){
+ QueryEquipChargeStatusResult queryEquipChargeStatusResult = buildQueryEquipChargeStatusResult(startChargeSeq);
+ NotificationEquipChargeStatusResult notificationEquipChargeStatusResult = TCECUtil.notificationEquipChargeStatus(queryEquipChargeStatusResult);
+ //启动重试推送机制
+ if(null == notificationEquipChargeStatusResult || 1 == notificationEquipChargeStatusResult.getSuccStat()){
+
+ }
+ return R.ok();
+ }
+
+
+ /**
+ * 请求停止充电
+ * @return
+ */
+ @PostMapping("/query_stop_charge")
+ public BaseResult queryStopCharge(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+ //校验token和签名
+ BaseResult baseResult = requestCheck(true, baseRequest, request);
+ if(0 != baseResult.getRet()){
+ baseResult.setData("");
+ baseResult.setSig(buildSign(baseResult));
+ return baseResult;
+ }
+ Operator operator = baseResult.getOperator();
+ //解密参数
+ String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getDataSecret(), operator.getDataSecretIv());
+ QueryStopCharge queryStopCharge = JSON.parseObject(decrypt, QueryStopCharge.class);
+ QueryStopChargeResult queryStopChargeResult = new QueryStopChargeResult();
+ queryStopChargeResult.setStartChargeSeq(queryStopCharge.getStartChargeSeq());
+ queryStopChargeResult.setStartChargeSeqStat(3);
+ queryStopChargeResult.setSuccStat(0);
+ queryStopChargeResult.setFailReason(0);
+ //执行停机操作
+ R r = chargingOrderClient.tripartitePlatformStopCharge(queryStopCharge.getStartChargeSeq());
+ if(200 != r.getCode()){
+ queryStopChargeResult.setStartChargeSeqStat(5);
+ queryStopChargeResult.setSuccStat(1);
+ queryStopChargeResult.setFailReason(3);
+ //参数加密
+ String jsonString = JSON.toJSONString(queryStopChargeResult);
+ String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+ baseResult.setData(encrypt);
+ baseResult.setSig(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));
+ return baseResult;
+ }
+
+
+
+ /**
+ * 推送停止充电结果
+ * @param startChargeSeq 充电订单号
+ * @param connectorID 充电设备接口编码
+ * @return
+ */
+ @PostMapping("/notificationStopChargeResult")
+ public R notificationStopChargeResult(@RequestParam("startChargeSeq") String startChargeSeq, @RequestParam("connectorID") String connectorID){
+ NotificationStopChargeResult info = new NotificationStopChargeResult();
+ info.setStartChargeSeq(startChargeSeq);
+ info.setStartChargeSeqStat(4);
+ info.setConnectorID(connectorID);
+ info.setSuccStat(0);
+ info.setFailReason(0);
+ NotificationStopCharge notificationStopCharge = TCECUtil.notificationStopChargeResult(info);
+ //启动重试推送机制
+ if(null == notificationStopCharge || 1 == notificationStopCharge.getSuccStat()){
+
+ }
+ return R.ok();
+ }
+
+
+ /**
+ * 推送订单信息
+ * @param startChargeSeq
+ * @return
+ */
+ @PostMapping("/notificationChargeOrderInfo")
+ public R notificationChargeOrderInfo(@RequestParam("startChargeSeq") String startChargeSeq){
+ NotificationChargeOrderInfo info = buildNotificationChargeOrderInfo(startChargeSeq);
+ NotificationChargeOrderInfoResult notificationChargeOrderInfoResult = TCECUtil.notificationChargeOrderInfo(info);
+ //启动重试推送机制
+ if(null == notificationChargeOrderInfoResult || 1 == notificationChargeOrderInfoResult.getConfirmResult()){
+
+ }
+ return R.ok();
+ }
+
+
+ /**
+ * 构建推送订单信息
+ * @param startChargeSeq
+ * @return
+ */
+ public NotificationChargeOrderInfo buildNotificationChargeOrderInfo(String startChargeSeq){
+ //构建返回结果
+ NotificationChargeOrderInfo notificationChargeOrderInfo = new NotificationChargeOrderInfo();
+ notificationChargeOrderInfo.setStartChargeSeq(startChargeSeq);
+ TChargingOrder chargingOrder = chargingOrderClient.getChargingOrderByStartChargeSeq(startChargeSeq).getData();
+ if(null == chargingOrder){
+ return null;
+ }
+ notificationChargeOrderInfo.setConnectorID(chargingOrder.getChargingGunId().toString());
+ notificationChargeOrderInfo.setStartTime((null == chargingOrder.getStartTime() ? chargingOrder.getCreateTime() : chargingOrder.getStartTime()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+ notificationChargeOrderInfo.setEndTime((null == chargingOrder.getStartTime() ? LocalDateTime.now() : chargingOrder.getEndTime()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+ notificationChargeOrderInfo.setTotalPower(chargingOrder.getElectricity());
+ notificationChargeOrderInfo.setTotalElecMoney(chargingOrder.getTotalElectricity());
+ notificationChargeOrderInfo.setTotalSeviceMoney(chargingOrder.getServiceCharge());
+ notificationChargeOrderInfo.setTotalMoney(chargingOrder.getTotalElectricity().add(chargingOrder.getServiceCharge()));
+ //结束方式(0=异常终止,1=主动终止,2=满电终止,3=费用不足终止)
+ switch (chargingOrder.getEndMode()){
+ case 0:
+ notificationChargeOrderInfo.setStopReason(3);
+ break;
+ case 1:
+ notificationChargeOrderInfo.setStopReason(0);
+ break;
+ case 2:
+ notificationChargeOrderInfo.setStopReason(2);
+ break;
+ case 3:
+ notificationChargeOrderInfo.setStopReason(5);
+ break;
+ }
+
+ //构建充电明细
+ List<ChargeDetail> chargeDetails = new ArrayList<>();
+ List<TChargingOrderAccountingStrategy> data = chargingOrderAccountingStrategyClient.getChargingOrderAccountingStrategyByOrderId(chargingOrder.getId()).getData();
+
+ LocalDateTime startTime = chargingOrder.getStartTime();
+ LocalDateTime endTime = chargingOrder.getEndTime();
+ String s_format = startTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+ String e_format = endTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+ for (TChargingOrderAccountingStrategy datum : data) {
+ ChargeDetail chargeDetail = new ChargeDetail();
+ if(s_format.equals(e_format)){
+ chargeDetail.setDetailStartTime(s_format + " " + datum.getStartTime() + ":00");
+ chargeDetail.setDetailEndTime(s_format + " " + datum.getEndTime() + ":59");
+ }else{
+ String substring = datum.getEndTime().substring(0, datum.getEndTime().indexOf(":"));
+ if(Integer.valueOf(substring) > 12){
+ chargeDetail.setDetailStartTime(s_format + " " + datum.getStartTime() + ":00");
+ chargeDetail.setDetailEndTime(s_format + " " + datum.getEndTime() + ":59");
+ }else{
+ chargeDetail.setDetailStartTime(e_format + " " + datum.getStartTime() + ":00");
+ chargeDetail.setDetailEndTime(e_format + " " + datum.getEndTime() + ":59");
+ }
+ }
+ chargeDetail.setElecPrice(datum.getElectrovalence());
+ chargeDetail.setSevicePrice(datum.getServiceCharge());
+ chargeDetail.setDetailPower(datum.getChargingCapacity());
+ chargeDetail.setDetailElecMoney(datum.getPeriodElectricPrice());
+ chargeDetail.setDetailSeviceMoney(datum.getPeriodServicePrice());
+ chargeDetails.add(chargeDetail);
+ }
+ notificationChargeOrderInfo.setChargeDetails(chargeDetails);
+ return notificationChargeOrderInfo;
+ }
+}
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 428a49e..0cadb76 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
@@ -2,8 +2,15 @@
import cn.hutool.http.*;
import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
import com.ruoyi.integration.drainage.model.*;
import lombok.extern.slf4j.Slf4j;
+
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import java.util.Map;
/**
* 中电联TCEC标准
@@ -12,6 +19,63 @@
*/
@Slf4j
public class TCECUtil {
+ /**
+ * 运营商标识
+ */
+ private static final String OperatorID = "";
+ /**
+ * 运营商秘钥
+ */
+ private static final String OperatorSecret = "";
+ /**
+ * tokne
+ */
+ private static String token = "";
+ /**
+ * token过期时间,秒
+ */
+ private static Long TokenAvailableTime = 0L;
+
+ private static Map<Long, Integer> map = new HashMap<>();
+
+
+ /**
+ * 获取token
+ */
+ public static void queryToken(){
+ HttpRequest post = HttpUtil.createPost("");
+ post.contentType("application/json;charset=utf-8");
+ JSONObject body = new JSONObject();
+ body.put("OperatorID", OperatorID);
+ body.put("OperatorSecret", OperatorSecret);
+ post.body(body.toJSONString());
+ HttpResponse execute = post.execute();
+ if(200 != execute.getStatus()){
+ log.error("获取token失败:" + execute.body());
+ return;
+ }
+ JSONObject jsonObject = JSON.parseObject(execute.body());
+ Integer succStat = jsonObject.getInteger("SuccStat");
+ if(0 != succStat){
+ log.error("获取token失败:" + jsonObject.getString("FailReason"));
+ return;
+ }
+ token = jsonObject.getString("AccessToken");
+ TokenAvailableTime = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC) + jsonObject.getLong("TokenAvailableTime");
+ }
+
+
+ /**
+ * 获取token
+ * @return
+ */
+ public static String getToken(){
+ long second = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC);
+ if(second >= TokenAvailableTime){
+ queryToken();
+ }
+ return token;
+ }
@@ -21,8 +85,7 @@
*/
public static NotificationStationStatusResult notificationStationStatus(ConnectorStatusInfo info) {
HttpRequest post = HttpUtil.createPost("");
- post.contentType(ContentType.JSON.toString());
- post.body(JSON.toJSONString(info));
+ buildBody(post, info);
HttpResponse execute = post.execute();
if(200 != execute.getStatus()){
log.error("设备状态变化推送失败:" + execute.body());
@@ -32,32 +95,32 @@
}
-
-
/**
- * 查询统计信息
- * @param query
+ * 推送启动充电结果
+ * @param info
* @return
*/
- public QueryStationStatsResult queryStationStats(QueryStationStats query){
- }
-
- /**
- * 查询业务策略信息
- * @param query
- * @return
- */
- public BaseResult<QueryEquipBusinessPolicyResult> queryEquipBusinessPolicy(QueryEquipBusinessPolicy query){
+ public static NotificationStartChargeResult notificationStartChargeResult(NotificationStartCharge info){
+ HttpRequest post = HttpUtil.createPost("");
+ buildBody(post, info);
+ HttpResponse execute = post.execute();
+ if(200 != execute.getStatus()){
+ log.error("启动充电结果推送失败:" + execute.body());
+ return null;
+ }
+ JSONObject jsonObject = JSON.parseObject(execute.body());
+ Integer ret = jsonObject.getInteger("Ret");
+ if(0 != ret){
+ log.error("启动充电结果推送失败:" + execute.body());
+ return null;
+ }
+ return jsonObject.getObject("Data", NotificationStartChargeResult.class);
}
- /**
- * 查询充电状态
- * @param query
- * @return
- */
- public BaseResult<QueryEquipChargeStatusResult> queryEquipChargeStatus(QueryEquipChargeStatus query){
- }
+
+
+
/**
@@ -65,18 +128,101 @@
* @param info
* @return
*/
- public BaseResult<NotificationEquipChargeStatusResult> notificationEquipChargeStatus(QueryEquipChargeStatusResult info){
+ public static NotificationEquipChargeStatusResult notificationEquipChargeStatus(QueryEquipChargeStatusResult info){
+ HttpRequest post = HttpUtil.createPost("");
+ buildBody(post, info);
+ HttpResponse execute = post.execute();
+ if(200 != execute.getStatus()){
+ log.error("推送充电状态失败:" + execute.body());
+ return null;
+ }
+ JSONObject jsonObject = JSON.parseObject(execute.body());
+ Integer ret = jsonObject.getInteger("Ret");
+ if(0 != ret){
+ log.error("推送充电状态失败:" + execute.body());
+ return null;
+ }
+ return jsonObject.getObject("Data", NotificationEquipChargeStatusResult.class);
}
/**
- * 推送充电订单信息
- * @param indo
+ * 推送停止充电结果
+ * @param info
* @return
*/
- public BaseResult<NotificationChargeOrderInfoResult> notificationChargeOrderInfo(NotificationChargeOrderInfo indo){
+ public static NotificationStopCharge notificationStopChargeResult(NotificationStopChargeResult info){
+ HttpRequest post = HttpUtil.createPost("");
+ buildBody(post, info);
+ HttpResponse execute = post.execute();
+ if(200 != execute.getStatus()){
+ log.error("推送停止充电结果失败:" + execute.body());
+ return null;
+ }
+ JSONObject jsonObject = JSON.parseObject(execute.body());
+ Integer ret = jsonObject.getInteger("Ret");
+ if(0 != ret){
+ log.error("推送停止充电结果失败:" + execute.body());
+ return null;
+ }
+ return jsonObject.getObject("Data", NotificationStopCharge.class);
}
+
+ /**
+ * 推送充电订单信息
+ * @param info
+ * @return
+ */
+ public static NotificationChargeOrderInfoResult notificationChargeOrderInfo(NotificationChargeOrderInfo info){
+ HttpRequest post = HttpUtil.createPost("");
+ buildBody(post, info);
+ HttpResponse execute = post.execute();
+ if(200 != execute.getStatus()){
+ log.error("推送充电订单信息失败:" + execute.body());
+ return null;
+ }
+ JSONObject jsonObject = JSON.parseObject(execute.body());
+ Integer ret = jsonObject.getInteger("Ret");
+ if(0 != ret){
+ log.error("推送充电订单信息失败:" + execute.body());
+ return null;
+ }
+ return jsonObject.getObject("Data", NotificationChargeOrderInfoResult.class);
+ }
+
+
+ /**
+ * 构建请求参数和消息头
+ * @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);
+ if(null == integer){
+ integer = 1;
+ }else{
+ integer++;
+ }
+ map.put(key, 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());
+
+ //清空小于当前时间的map中的无效数据
+ for (Long k : map.keySet()) {
+ if(k <= (key - 10)){
+ map.remove(k);
+ }
+ }
+ }
}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TokenUtil.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TokenUtil.java
new file mode 100644
index 0000000..5bc9ab1
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TokenUtil.java
@@ -0,0 +1,165 @@
+package com.ruoyi.integration.drainage;
+
+import com.ruoyi.common.core.constant.CacheConstants;
+import com.ruoyi.common.core.constant.SecurityConstants;
+import com.ruoyi.common.core.exception.auth.NotLoginException;
+import com.ruoyi.common.core.utils.JwtUtils;
+import com.ruoyi.common.core.utils.ServletUtils;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.common.core.utils.ip.IpUtils;
+import com.ruoyi.common.core.utils.uuid.IdUtils;
+import com.ruoyi.common.redis.service.RedisService;
+import com.ruoyi.common.security.utils.SecurityUtils;
+import com.ruoyi.other.api.domain.Operator;
+import com.ruoyi.system.api.model.LoginUser;
+import com.ruoyi.system.api.model.LoginUserApplet;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * token验证处理
+ *
+ * @author ruoyi
+ */
+@Component
+public class TokenUtil {
+ @Autowired
+ private RedisService redisService;
+
+ protected static final long MILLIS_SECOND = 1000;
+
+ protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND;
+
+ private final static long expireTime = CacheConstants.EXPIRATION;
+ private final static long expireAppletTime = CacheConstants.EXPIRATION_APPLET;
+
+ private final static String ACCESS_TOKEN = CacheConstants.LOGIN_TOKEN_KEY;
+
+ private final static Long MILLIS_MINUTE_TEN = CacheConstants.REFRESH_TIME * MILLIS_MINUTE;
+
+ /**
+ * 创建令牌
+ */
+ public Map<String, Object> createToken(Operator operator) {
+ String token = IdUtils.fastUUID();
+ operator.setToken(token);
+ refreshToken(operator);
+
+ // Jwt存储信息
+ Map<String, Object> claimsMap = new HashMap<String, Object>();
+ claimsMap.put(SecurityConstants.USER_KEY, token);
+ claimsMap.put(SecurityConstants.DETAILS_USER_ID, operator.getOperatorId());
+ claimsMap.put(SecurityConstants.USER_TYPE, "system");
+ claimsMap.put(SecurityConstants.DETAILS_USERNAME, operator.getName());
+
+ // 接口返回信息
+ Map<String, Object> rspMap = new HashMap<String, Object>();
+ rspMap.put("access_token", JwtUtils.createToken(claimsMap));
+ rspMap.put("expires_in", expireTime);
+ return rspMap;
+ }
+
+ /**
+ * 获取用户身份信息
+ *
+ * @return 用户信息
+ */
+ public LoginUser getLoginUser() {
+ LoginUser loginUser = getLoginUser(ServletUtils.getRequest());
+ if (loginUser == null) {
+ throw new NotLoginException("令牌已过期,请重新登录!");
+ }
+ return loginUser;
+ }
+
+ /**
+ * 获取用户身份信息
+ *
+ * @return 用户信息
+ */
+ public LoginUser getLoginUser(HttpServletRequest request) {
+ // 获取请求携带的令牌
+ String token = SecurityUtils.getToken(request);
+ return getLoginUser(token);
+ }
+
+ /**
+ * 获取用户身份信息
+ *
+ * @return 用户信息
+ */
+ public LoginUser getLoginUser(String token) {
+ LoginUser user = null;
+ try {
+ if (StringUtils.isNotEmpty(token)) {
+ String userkey = JwtUtils.getUserKey(token);
+ user = redisService.getCacheObject(getTokenKey(userkey));
+ return user;
+ }
+ } catch (Exception e) {
+ }
+ return user;
+ }
+
+ /**
+ * 设置用户身份信息
+ */
+ public void setLoginUser(Operator operator) {
+ if (StringUtils.isNotNull(operator) && StringUtils.isNotEmpty(operator.getToken())) {
+ refreshToken(operator);
+ }
+ }
+
+ /**
+ * 删除用户缓存信息
+ */
+ public void delLoginUser(String token) {
+ if (StringUtils.isNotEmpty(token)) {
+ String userkey = JwtUtils.getUserKey(token);
+ redisService.deleteObject(getTokenKey(userkey));
+ }
+ }
+
+ /**
+ * 验证令牌有效期,相差不足120分钟,自动刷新缓存
+ *
+ * @param operator
+ */
+ public void verifyToken(Operator operator) {
+ long expireTime = operator.getExpireTime();
+ long currentTime = System.currentTimeMillis();
+ if (expireTime - currentTime <= MILLIS_MINUTE_TEN) {
+ refreshToken(operator);
+ }
+ }
+
+ /**
+ * 刷新令牌有效期
+ *
+ * @param operator 登录信息
+ */
+ public void refreshToken(Operator operator) {
+ operator.setLoginTime(System.currentTimeMillis());
+ operator.setExpireTime(operator.getLoginTime() + expireTime * MILLIS_MINUTE);
+ // 根据uuid将loginUser缓存
+ String userKey = getTokenKey(operator.getToken());
+ redisService.setCacheObject(userKey, operator, expireTime, TimeUnit.MINUTES);
+ }
+
+ public void refreshToken1(LoginUserApplet dto) {
+ dto.setLoginTime(System.currentTimeMillis());
+ dto.setExpireTime(dto.getLoginTime() + expireAppletTime * MILLIS_MINUTE);
+ // 根据uuid将loginUser缓存
+ String userKey = getTokenKey(dto.getToken());
+ redisService.setCacheObject(userKey, dto, expireAppletTime, TimeUnit.MINUTES);
+ }
+
+ private String getTokenKey(String token) {
+ return ACCESS_TOKEN + token;
+ }
+}
\ No newline at end of file
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseModel.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseModel.java
new file mode 100644
index 0000000..e8b5882
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseModel.java
@@ -0,0 +1,40 @@
+package com.ruoyi.integration.drainage.model;
+
+import com.ruoyi.other.api.domain.Operator;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author zhibing.pu
+ * @Date 2025/1/23 18:33
+ */
+@Data
+public class BaseModel {
+ /**
+ * 运营商标识
+ */
+ @NotNull
+ private String OperatorID;
+ /**
+ * 参数内容
+ */
+ @NotNull
+ private String Data;
+ /**
+ * 时间戳
+ * yyyyMMddHHmmss
+ */
+ @NotNull
+ private Long TimeStamp;
+ /**
+ * 自增序列
+ * 4位自增序列取自时间戳,同一秒内按序列自增长,新秒重计。如 0001
+ */
+ @NotNull
+ private String Seq;
+ /**
+ * 运营商对象
+ */
+ private Operator operator;
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseRequest.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseRequest.java
index d2a11da..e5cec9e 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseRequest.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseRequest.java
@@ -10,29 +10,7 @@
* @Date 2025/1/21 17:08
*/
@Data
-public class BaseRequest<T> {
- /**
- * 运营商标识
- */
- @NotNull
- private String OperatorID;
- /**
- * 参数内容
- */
- @NotNull
- private T Data;
- /**
- * 时间戳
- * yyyyMMddHHmmss
- */
- @NotNull
- private Long TimeStamp;
- /**
- * 自增序列
- * 4位自增序列取自时间戳,同一秒内按序列自增长,新秒重计。如 0001
- */
- @NotNull
- private String Seq;
+public class BaseRequest extends BaseModel {
/**
* 数字签名
*/
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseResult.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseResult.java
index 0a94794..be66fd5 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseResult.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/BaseResult.java
@@ -1,5 +1,6 @@
package com.ruoyi.integration.drainage.model;
+import com.ruoyi.other.api.domain.Operator;
import lombok.Data;
import javax.validation.constraints.NotNull;
@@ -10,7 +11,7 @@
* @Date 2025/1/21 15:54
*/
@Data
-public class BaseResult<T> {
+public class BaseResult extends BaseModel {
/**
* 参数编码
* -1:系统繁忙,此时请求方稍后重试
@@ -29,13 +30,13 @@
@NotNull
private String Msg;
/**
- * 参数实体
- */
- @NotNull
- private T Data;
- /**
* 签名
*/
@NotNull
private String Sig;
+
+ /**
+ * 运营商对象
+ */
+ private Operator operator;
}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/NotificationStartCharge.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/NotificationStartCharge.java
new file mode 100644
index 0000000..226069a
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/NotificationStartCharge.java
@@ -0,0 +1,39 @@
+package com.ruoyi.integration.drainage.model;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 推送启动充电结果
+ * @author zhibing.pu
+ * @Date 2025/1/22 18:40
+ */
+@Data
+public class NotificationStartCharge {
+ /**
+ * 充电订单号
+ */
+ @NotNull
+ private String StartChargeSeq;
+ /**
+ * 充电订单状态
+ * 1:启动中
+ * 2:充电中
+ * 3:停止中
+ * 4:已结束
+ * 5:未知
+ */
+ @NotNull
+ private Integer StartChargeSeqStat;
+ /**
+ * 充电设别接口编码
+ */
+ @NotNull
+ private String ConnectorID;
+ /**
+ * 充电启动时间
+ */
+ @NotNull
+ private String StartTime;
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/NotificationStartChargeResult.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/NotificationStartChargeResult.java
new file mode 100644
index 0000000..3bde406
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/NotificationStartChargeResult.java
@@ -0,0 +1,33 @@
+package com.ruoyi.integration.drainage.model;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 推送启动充电结果返回值
+ * @author zhibing.pu
+ * @Date 2025/1/22 18:47
+ */
+@Data
+public class NotificationStartChargeResult {
+ /**
+ * 充电订单号
+ */
+ @NotNull
+ private String StartChargeSeq;
+ /**
+ * 操作结果
+ * 0:成功
+ * 1:失败
+ */
+ @NotNull
+ private Integer SuccStat;
+ /**
+ * 失败原因
+ * 0:无
+ * 1:接收失败
+ */
+ @NotNull
+ private Integer FailReason;
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/NotificationStopChargeResult.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/NotificationStopChargeResult.java
new file mode 100644
index 0000000..1a6802c
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/NotificationStopChargeResult.java
@@ -0,0 +1,51 @@
+package com.ruoyi.integration.drainage.model;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 推送停止充电结果
+ * @author zhibing.pu
+ * @Date 2025/1/23 9:13
+ */
+@Data
+public class NotificationStopChargeResult {
+ /**
+ * 充电订单号
+ */
+ @NotNull
+ private String StartChargeSeq;
+ /**
+ * 充电订单状态
+ * 1:启动中
+ * 2:充电中
+ * 3:停止中
+ * 4:已结束
+ * 5:未知
+ */
+ @NotNull
+ private Integer StartChargeSeqStat;
+ /**
+ * 充电设备接口编码
+ */
+ @NotNull
+ private String ConnectorID;
+ /**
+ * 操作结果
+ * 0:成功
+ * 1:失败
+ */
+ @NotNull
+ private Integer SuccStat;
+ /**
+ * 失败原因
+ * 0:无
+ * 1:此设备不存在
+ * 2:此设备离线
+ * 3:此设备已停止充电
+ * 4`9:自定义
+ */
+ @NotNull
+ private Integer FailReason;
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryEquipAuth.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryEquipAuth.java
new file mode 100644
index 0000000..46f0aa5
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryEquipAuth.java
@@ -0,0 +1,24 @@
+package com.ruoyi.integration.drainage.model;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 请求设备认证
+ * @author zhibing.pu
+ * @Date 2025/1/22 16:15
+ */
+@Data
+public class QueryEquipAuth {
+ /**
+ * 设备认证流水
+ */
+ @NotNull
+ private String EquipAuthSeq;
+ /**
+ * 充电设备接口编码
+ */
+ @NotNull
+ private String ConnectorID;
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryEquipAuthResult.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryEquipAuthResult.java
new file mode 100644
index 0000000..98d57f6
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryEquipAuthResult.java
@@ -0,0 +1,40 @@
+package com.ruoyi.integration.drainage.model;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 请求设备认证返回结果
+ * @author zhibing.pu
+ * @Date 2025/1/22 16:16
+ */
+@Data
+public class QueryEquipAuthResult {
+ /**
+ * 设备认证流水号
+ */
+ @NotNull
+ private String EquipAuthSeq;
+ /**
+ * 充电设备接口编码
+ */
+ @NotNull
+ private String ConnectorID;
+ /**
+ * 操作结果
+ * 0:成功
+ * 1:失败
+ */
+ @NotNull
+ private Integer SuccStat;
+ /**
+ * 失败原因
+ * 0:无
+ * 1:此设备尚未插枪
+ * 2:设备检测失败
+ * 3·99:自定义
+ */
+ @NotNull
+ private Integer FailReason;
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStartCharge.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStartCharge.java
new file mode 100644
index 0000000..358f366
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStartCharge.java
@@ -0,0 +1,40 @@
+package com.ruoyi.integration.drainage.model;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+/**
+ * 请求启动充电
+ * @author zhibing.pu
+ * @Date 2025/1/22 16:59
+ */
+@Data
+public class QueryStartCharge {
+ /**
+ * 充电订单号
+ */
+ @NotNull
+ private String StartChargeSeq;
+ /**
+ * 充电设备接口编码
+ */
+ @NotNull
+ private String ConnectorID;
+ /**
+ * 二维码其他信息
+ */
+ @NotNull
+ private String QRCode;
+ /**
+ * 支付方式(1=微信,2=支付宝)
+ */
+ @NotNull
+ private Integer paymentType;
+ /**
+ * 充电余额
+ */
+ @NotNull
+ private BigDecimal paymentAmount;
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStartChargeResult.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStartChargeResult.java
new file mode 100644
index 0000000..2cf489c
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStartChargeResult.java
@@ -0,0 +1,50 @@
+package com.ruoyi.integration.drainage.model;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 请求启动充电返回结果
+ * @author zhibing.pu
+ * @Date 2025/1/22 17:02
+ */
+@Data
+public class QueryStartChargeResult {
+ /**
+ * 充电订单号
+ */
+ @NotNull
+ private String StartChargeSeq;
+ /**
+ * 充电订单状态
+ * 1:启动中
+ * 2:充电中
+ * 3:停止中
+ * 4:已结束
+ * 5:未知
+ */
+ @NotNull
+ private Integer StartChargeSeqStat;
+ /**
+ * 充电设别接口编码
+ */
+ @NotNull
+ private String ConnectorID;
+ /**
+ * 操作结果
+ * 0:成功
+ * 1:失败
+ */
+ @NotNull
+ private Integer SuccStat;
+ /**
+ * 失败原因
+ * 0:无
+ * 1:此设备不存在
+ * 2:此设备离线
+ * 3`9:自定义
+ */
+ @NotNull
+ private Integer FailReason;
+}
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 fd22d00..8d1928e 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,6 +12,11 @@
@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/model/QueryStopChargeResult.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStopChargeResult.java
new file mode 100644
index 0000000..041bb6e
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryStopChargeResult.java
@@ -0,0 +1,47 @@
+package com.ruoyi.integration.drainage.model;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 请求停止充电返回结果
+ * @author zhibing.pu
+ * @Date 2025/1/22 19:58
+ */
+@Data
+public class QueryStopChargeResult {
+ /**
+ * 充电订单号
+ */
+ @NotNull
+ private String StartChargeSeq;
+ /**
+ * 充电订单状态
+ * 1:启动中
+ * 2:充电中
+ * 3:停止中
+ * 4:已结束
+ * 5:未知
+ */
+ @NotNull
+ private Integer StartChargeSeqStat;
+ /**
+ * 操作结果
+ * 0:成功
+ * 1:失败
+ */
+ @NotNull
+ private Integer SuccStat;
+ /**
+ * 失败原因
+ * 0:无
+ * 1:此设备不存在
+ * 2:此设备离线
+ * 3:此设备已停止充电
+ * 4`9:自定义
+ */
+ @NotNull
+ private Integer FailReason;
+
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryToken.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryToken.java
new file mode 100644
index 0000000..f901d65
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryToken.java
@@ -0,0 +1,24 @@
+package com.ruoyi.integration.drainage.model;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 获取token
+ * @author zhibing.pu
+ * @Date 2025/1/23 17:13
+ */
+@Data
+public class QueryToken {
+ /**
+ * 运营商标识
+ */
+ @NotNull
+ private String OperatorID;
+ /**
+ * 运营商秘钥
+ */
+ @NotNull
+ private String OperatorSecret;
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryTokenResult.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryTokenResult.java
new file mode 100644
index 0000000..4a9c4ae
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/QueryTokenResult.java
@@ -0,0 +1,45 @@
+package com.ruoyi.integration.drainage.model;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 获取token返回结果
+ * @author zhibing.pu
+ * @Date 2025/1/23 17:15
+ */
+@Data
+public class QueryTokenResult {
+ /**
+ * 运营商标识
+ */
+ @NotNull
+ private String OperatorID;
+ /**
+ * 成功状态
+ * 0:成功
+ * 1:失败
+ */
+ @NotNull
+ private Integer SuccStat;
+ /**
+ * 获取的凭证
+ */
+ @NotNull
+ private String AccessToken;
+ /**
+ * 凭证有效期,秒
+ */
+ @NotNull
+ private Long TokenAvailableTime;
+ /**
+ * 失败原因
+ * 0:无
+ * 1:无此运营商
+ * 2:秘钥错误
+ * 3`9自定义
+ */
+ @NotNull
+ private Integer FailReason;
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderAccountingStrategyController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderAccountingStrategyController.java
index b24aa02..11d0ca0 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderAccountingStrategyController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderAccountingStrategyController.java
@@ -1,7 +1,9 @@
package com.ruoyi.order.controller;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.core.domain.R;
+import com.ruoyi.order.api.model.TChargingOrderAccountingStrategy;
import com.ruoyi.order.service.TChargingOrderAccountingStrategyService;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.*;
@@ -52,5 +54,18 @@
List<Double> list = chargingOrderAccountingStrategyService.getDailyChargingDegree(days, siteIds);
return R.ok(list);
}
+
+
+
+ /**
+ * 根据订单id查询充电明细
+ * @param chargingOrderId
+ * @return
+ */
+ @PostMapping("/getChargingOrderAccountingStrategyByOrderId")
+ public R<List<TChargingOrderAccountingStrategy>> getChargingOrderAccountingStrategyByOrderId(@RequestParam("chargingOrderId") Long chargingOrderId){
+ List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrderId));
+ return R.ok(list);
+ }
}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
index 131e1fe..2b730f5 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -20,6 +20,7 @@
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.dto.ChargingOrderGroup;
import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
+import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.web.domain.BasePojo;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.security.annotation.Logical;
@@ -605,6 +606,27 @@
List<ChargingOrderGroup> groups = chargingOrderService.chargingOrderGroup(chargingPercentProvinceDto);
return R.ok(groups);
}
+
+
+ /**
+ * 根据站点id和时间区间查询订单数据
+ * @param chargingPercentProvinceDto
+ * @return
+ */
+ @PostMapping(value = "/getOrderBySiteIdAndTime")
+ public R<List<TChargingOrder>> getOrderBySiteIdAndTime(@RequestBody ChargingPercentProvinceDto chargingPercentProvinceDto){
+ LocalDate date1 = chargingPercentProvinceDto.getDate1();
+ LocalDate date2 = chargingPercentProvinceDto.getDate2();
+ String tripartitePlatformName = chargingPercentProvinceDto.getTripartitePlatformName();
+ List<TChargingOrder> list = chargingOrderService.list(new LambdaQueryWrapper<TChargingOrder>().in(TChargingOrder::getSiteId, chargingPercentProvinceDto.getSiteIds())
+ .between(null != date1 && null != date2, TChargingOrder::getPayTime, date1.atTime(0, 0, 0), date2.atTime(23, 59, 59))
+ .eq(TChargingOrder::getDelFlag, 0).eq(TChargingOrder::getStatus, 5)
+ .eq(StringUtils.isNotEmpty(tripartitePlatformName), TChargingOrder::getOrderSource, 2)
+ .eq(StringUtils.isNotEmpty(tripartitePlatformName), TChargingOrder::getTripartitePlatformName, tripartitePlatformName));
+ return R.ok(list);
+ }
+
+
/**
* 根据充电枪id获取正在进行中的订单
@@ -1988,51 +2010,7 @@
List<Integer> gunIds = list.stream().map(TChargingOrder::getChargingGunId).collect(Collectors.toList());
return R.ok(gunIds);
}
-
-
-
- private static List<TChargingOrder> getSampleData() {
- // 这里可以替换为实际查询逻辑
- List<TChargingOrder> list = new ArrayList<>();
- // 示例数据
- for (int i = 0; i < 24; i++) {
- TChargingOrder order = new TChargingOrder();
- order.setStartTime(LocalDateTime.now().minusHours(23 - i));
- order.setOrderAmount(BigDecimal.valueOf(i + 1));
- list.add(order);
- }
- return list;
- }
-
- private static List<Map<String, BigDecimal>> processData(List<TChargingOrder> list) {
- Map<LocalDateTime, BigDecimal> hourlySum = new HashMap<>();
-
- // 按每个小时分组并求和
- for (TChargingOrder order : list) {
- LocalDateTime hour = order.getStartTime().truncatedTo(ChronoUnit.HOURS);
- BigDecimal amount = order.getOrderAmount();
- hourlySum.merge(hour, amount, BigDecimal::add);
- }
-
- // 创建结果列表
- List<Map<String, BigDecimal>> resultList = new ArrayList<>();
- for (int i = 1; i <= 23; i++) {
- LocalDateTime keyHour = LocalDateTime.now().withHour(i);
- BigDecimal sum = BigDecimal.ZERO;
-
- // 计算键之后的一小时的数据之和
- for (int j = i + 1; j <= 23; j++) {
- LocalDateTime nextHour = LocalDateTime.now().withHour(j);
- sum = sum.add(hourlySum.getOrDefault(nextHour, BigDecimal.ZERO));
- }
-
- Map<String, BigDecimal> entry = new HashMap<>();
- entry.put(String.valueOf(i), sum);
- resultList.add(entry);
- }
-
- return resultList;
- }
+
/**
@@ -2116,4 +2094,42 @@
return R.ok(list);
}
+
+ /**
+ * 添加三方平台充电订单数据
+ * @return
+ */
+ @PostMapping("/addTripartitePlatformOrder")
+ public R addTripartitePlatformOrder(@RequestBody AddTripartitePlatformOrder query){
+ return chargingOrderService.addTripartitePlatformOrder(query.getChargingGunId(), query.getOperatorId(),
+ query.getRechargePaymentType(),
+ query.getPaymentAmount(),
+ query.getStartChargeSeq());
+ }
+
+
+
+
+
+ /**
+ * 根据三方平台订单id获取充电数据
+ * @param startChargeSeq
+ * @return
+ */
+ @PostMapping("/getChargingOrderByStartChargeSeq")
+ public R<TChargingOrder> getChargingOrderByStartChargeSeq(@RequestParam("startChargeSeq") String startChargeSeq){
+ TChargingOrder chargingOrder = chargingOrderService.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getStartChargeSeq, startChargeSeq));
+ return R.ok(chargingOrder);
+ }
+
+
+ /**
+ * 三方平台请求停止充电
+ * @param startChargeSeq
+ * @return
+ */
+ @PostMapping("/tripartitePlatformStopCharge")
+ public R tripartitePlatformStopCharge(@RequestParam("startChargeSeq") String startChargeSeq){
+ return chargingOrderService.tripartitePlatformStopCharge(startChargeSeq);
+ }
}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
index 097546f..175381f 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
@@ -19,7 +19,9 @@
import com.ruoyi.order.vo.ChargingOrderListInfoVO;
import com.ruoyi.order.vo.EndOfChargePageInfo;
import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
@@ -286,4 +288,19 @@
List<TChargingOrder> getChargingOrder(TChargingOrderVo order);
Long countCar(List<String> brands);
+
+
+ /**
+ * 添加三方平台充电订单数据
+ * @param chargingGunId
+ */
+ R addTripartitePlatformOrder(Integer chargingGunId, String operatorId, Integer rechargePaymentType, BigDecimal paymentAmount, String startChargeSeq);
+
+
+ /**
+ * 三方平台停止充电操作
+ * @param startChargeSeq
+ * @return
+ */
+ R tripartitePlatformStopCharge(@RequestParam("startChargeSeq") String startChargeSeq);
}
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 1b60d48..d30ab60 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
@@ -202,6 +202,9 @@
//计数器
private Map<String, Integer> boot_failed_map = new HashMap<>();
+
+ @Resource
+ private OperatorClient operatorClient;
@@ -465,7 +468,7 @@
chargingOrder.setRechargeAmount(addChargingOrder.getPaymentAmount());
chargingOrder.setAppCouponId(addChargingOrder.getAppUserCouponId());
chargingOrder.setVipDiscountAmount(BigDecimal.ZERO);
- chargingOrder.setOrderSource(0);
+ chargingOrder.setOrderSource(1);
chargingOrder.setTitle("【充电桩充电】" + chargingPile.getNumber() + "号桩/" + tChargingGun.getCode() + "号枪");
Site site = siteClient.getSiteByIds(Arrays.asList(tChargingGun.getSiteId())).getData().get(0);
@@ -845,7 +848,7 @@
public void refund(String code){
log.info(code + ":-------------------充电启动失败,执行退款-------------------");
TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code));
- if(chargingOrder.getStatus() == 2){
+ if(chargingOrder.getOrderSource() == 1 && chargingOrder.getStatus() == 2){
Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
//构建退款明细
@@ -3974,4 +3977,144 @@
public Long countCar(List<String> brands) {
return this.baseMapper.countCar(brands);
}
+
+
+ /**
+ * 添加三方平台充电订单数据
+ * @param chargingGunId
+ */
+ @Override
+ public R addTripartitePlatformOrder(Integer chargingGunId, String operatorId, Integer rechargePaymentType, BigDecimal paymentAmount, String startChargeSeq) {
+ //检查当前枪是否是正在使用中
+ TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getChargingGunId, chargingGunId)
+ .in(TChargingOrder::getStatus, Arrays.asList(1, 2, 3)).eq(TChargingOrder::getDelFlag, 0));
+ if(null != one){
+ return R.fail("充电枪正在充电中,启动失败");
+ }
+
+ //构建新的待支付订单
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+ TChargingOrder chargingOrder = new TChargingOrder();
+ String code = "CD" + Double.valueOf(Math.random() * 1000).intValue() + sdf.format(new Date());
+ chargingOrder.setCode(code);
+ chargingOrder.setOrderType(1);
+ chargingOrder.setOrderClassification(1);
+ TChargingGun tChargingGun = chargingGunClient.getChargingGunById(chargingGunId).getData();
+ TChargingPile chargingPile = chargingPileClient.getChargingPileById(tChargingGun.getChargingPileId()).getData();
+ chargingOrder.setSiteId(tChargingGun.getSiteId());
+ chargingOrder.setChargingPileId(tChargingGun.getChargingPileId());
+ chargingOrder.setChargingGunId(chargingGunId);
+ chargingOrder.setRechargePaymentType(rechargePaymentType);
+ chargingOrder.setRechargePaymentStatus(2);
+ chargingOrder.setRechargeAmount(paymentAmount);
+ chargingOrder.setVipDiscountAmount(BigDecimal.ZERO);
+ chargingOrder.setOrderSource(2);
+ Operator operator = operatorClient.getOperator(operatorId).getData();
+ chargingOrder.setOperatorId(operator.getId());
+ chargingOrder.setAppUserId(operator.getId().longValue());
+ chargingOrder.setTripartitePlatformName(operator.getName());
+ chargingOrder.setStartChargeSeq(startChargeSeq);
+ chargingOrder.setTitle("【充电桩充电】" + chargingPile.getNumber() + "号桩/" + tChargingGun.getCode() + "号枪");
+ chargingOrder.setStatus(2);
+ chargingOrder.setPayTime(LocalDateTime.now());
+ chargingOrder.setChargeAmount(chargingOrder.getRechargeAmount());
+ chargingOrder.setVipDiscountAmount(BigDecimal.ZERO);
+ this.save(chargingOrder);
+
+ Integer accountingStrategyId = tChargingGun.getAccountingStrategyId();
+ if(null == accountingStrategyId){
+ Site site = siteClient.getSiteByIds(Arrays.asList(tChargingGun.getSiteId())).getData().get(0);
+ //查询站点上面的计费策略
+ accountingStrategyId = site.getAccountingStrategyId();
+ }
+ TAccountingStrategy accountingStrategy = accountingStrategyClient.getAccountingStrategyById(accountingStrategyId).getData();
+
+ //添加订单的计费策略
+ List<TAccountingStrategyDetail> strategyDetailList = accountingStrategyDetailClient.getListByAccountingStrategyId(accountingStrategyId).getData();
+ AccountingStrategyOrder accountingStrategyOrder = new AccountingStrategyOrder();
+ BeanUtils.copyProperties(accountingStrategy, accountingStrategyOrder);
+ accountingStrategyOrder.setChargingOrderId(chargingOrder.getId());
+ accountingStrategyOrderService.save(accountingStrategyOrder);
+ List<AccountingStrategyDetailOrder> list1 = new ArrayList<>();
+ for (TAccountingStrategyDetail tAccountingStrategyDetail : strategyDetailList) {
+ AccountingStrategyDetailOrder accountingStrategyDetailOrder = new AccountingStrategyDetailOrder();
+ BeanUtils.copyProperties(tAccountingStrategyDetail, accountingStrategyDetailOrder);
+ accountingStrategyDetailOrder.setChargingOrderId(chargingOrder.getId());
+ list1.add(accountingStrategyDetailOrder);
+ }
+ accountingStrategyDetailOrderService.saveBatch(list1);
+
+
+ //添加安全检测数据到缓存中,每步安全检测完成后需要更新缓存数据
+ PreChargeCheck preChargeCheck = new PreChargeCheck();
+ preChargeCheck.setElectronicLockLock(false);
+ preChargeCheck.setInsulationTesting(false);
+ preChargeCheck.setSecureConnectionDetection(false);
+ preChargeCheck.setStartupSuccess(1);
+ String key = "AQJC_" + chargingOrder.getChargingGunId();
+ redisService.setCacheObject(key, preChargeCheck, 24L, TimeUnit.HOURS);
+
+ BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
+ //调用远程启动充电消息
+ PlatformStartCharging platformStartCharging = new PlatformStartCharging();
+ platformStartCharging.setTransaction_serial_number(chargingOrder.getCode());
+ platformStartCharging.setCharging_pile_code(chargingPile.getCode());
+ platformStartCharging.setCharging_gun_code(tChargingGun.getCode());
+ //使用订单id作为逻辑卡号
+ platformStartCharging.setCard_number(chargingOrder.getId().toString());
+ platformStartCharging.setAccount_balance(rechargeAmount);
+ log.info(chargingOrder.getCode() + ":-------------------远程调起开始充电请求-------------------" + platformStartCharging.toString());
+ sendMessageClient.platformStartCharging(platformStartCharging);
+ //异步线程检测远程启动的应答结果。如果失败,则需要全额退款
+ Long id = chargingOrder.getId();
+ //执行5分钟的定时任务检测
+ ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
+ scheduler.scheduleAtFixedRate(()->{
+ if(timingDetection(id)){
+ scheduler.shutdown();
+ }
+ }, 5, 1, TimeUnit.SECONDS);
+ return R.ok();
+ }
+
+
+ /**
+ * 三方平台停止充电操作
+ * @param startChargeSeq
+ * @return
+ */
+ @Override
+ public R tripartitePlatformStopCharge(String startChargeSeq) {
+ TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getStartChargeSeq, startChargeSeq));
+ Integer status = order.getStatus();
+ if(status != 3){
+ return R.fail("还未开始充电");
+ }
+ if(status == 4 || status == 5){
+ return R.fail("不能重复操作");
+ }
+ TChargingOrder chargingOrder = new TChargingOrder();
+ chargingOrder.setId(order.getId());
+ chargingOrder.setAppUserId(order.getOperatorId().longValue());
+ chargingOrder.setEndTime(LocalDateTime.now());
+ chargingOrder.setStatus(4);
+ chargingOrder.setEndMode(1);
+ this.updateById(chargingOrder);
+
+ String code1 = order.getCode();
+ TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData();
+ //异步线程处理停机
+ ExecutorService cachedThreadPool = Executors.newFixedThreadPool(1);
+ cachedThreadPool.execute(()->{
+ //调用硬件停止充电,停止成功后开始计算费用退款
+ TChargingPile chargingPile = chargingPileClient.getChargingPileById(order.getChargingPileId()).getData();
+ PlatformStopCharging platformStopCharging = new PlatformStopCharging();
+ platformStopCharging.setCharging_pile_code(chargingPile.getCode());
+ platformStopCharging.setCharging_gun_code(chargingGun.getCode());
+ sendMessageClient.platformStopCharging(platformStopCharging);
+ log.info(code1 + ":-------------------远程停止充电请求-------------------");
+ log.info(platformStopCharging.toString());
+ });
+ return R.ok();
+ }
}
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
new file mode 100644
index 0000000..a23961c
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/OperatorController.java
@@ -0,0 +1,36 @@
+package com.ruoyi.other.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+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 javax.annotation.Resource;
+
+/**
+ * @author zhibing.pu
+ * @Date 2025/1/22 15:12
+ */
+@RestController
+@RequestMapping("/operator")
+public class OperatorController {
+
+ @Resource
+ private OperatorService operatorService;
+
+
+ /**
+ * 获取运营商数据
+ * @param operatorId
+ * @return
+ */
+ @PostMapping("/getOperator")
+ public R<Operator> getOperator(@RequestParam("operatorId") String operatorId){
+ Operator operator = operatorService.getOne(new LambdaQueryWrapper<Operator>().eq(Operator::getOperatorId, operatorId));
+ return R.ok(operator);
+ }
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/OperatorMapper.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/OperatorMapper.java
new file mode 100644
index 0000000..70b8a21
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/OperatorMapper.java
@@ -0,0 +1,11 @@
+package com.ruoyi.other.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.other.api.domain.Operator;
+
+/**
+ * @author zhibing.pu
+ * @Date 2025/1/22 15:08
+ */
+public interface OperatorMapper extends BaseMapper<Operator> {
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/OperatorService.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/OperatorService.java
new file mode 100644
index 0000000..62cc953
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/OperatorService.java
@@ -0,0 +1,11 @@
+package com.ruoyi.other.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.other.api.domain.Operator;
+
+/**
+ * @author zhibing.pu
+ * @Date 2025/1/22 15:09
+ */
+public interface OperatorService extends IService<Operator> {
+}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/OperatorServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/OperatorServiceImpl.java
new file mode 100644
index 0000000..daae44b
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/OperatorServiceImpl.java
@@ -0,0 +1,15 @@
+package com.ruoyi.other.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.other.api.domain.Operator;
+import com.ruoyi.other.mapper.OperatorMapper;
+import com.ruoyi.other.service.OperatorService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author zhibing.pu
+ * @Date 2025/1/22 15:09
+ */
+@Service
+public class OperatorServiceImpl extends ServiceImpl<OperatorMapper, Operator> implements OperatorService {
+}
--
Gitblit v1.7.1