From c05a14bba4b86d83918d7cdc01635785bf5694c2 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期二, 03 六月 2025 00:26:08 +0800
Subject: [PATCH] 拆分mongodb查询服务

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java                                            |   40 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/ChargingHandshakeServiceImpl.java              |   39 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java                                            |    1 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java   |  174 
 ruoyi-service/ruoyi-integration/pom.xml                                                                                                        |   28 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/PlatformStartChargingReplyService.java              |   17 
 ruoyi-service/ruoyi-chargingPile/pom.xml                                                                                                       |    5 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/ChargingHandshakeService.java                       |   13 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/PlatformStopChargingReplyServiceImpl.java                    |   48 
 ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/SendMessageFallbackFactory.java                                |    3 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/TransactionRecordServiceImpl.java              |   51 
 ruoyi-api/ruoyi-api-integration/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports            |    2 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/UploadRealTimeMonitoringDataService.java                          |   31 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/BmsDemandAndChargerExportationServiceImpl.java               |   49 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderEvaluateServiceImpl.java                                            |    1 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/SecurityDetectionService.java                                     |   17 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/TransactionRecordService.java                       |   14 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/UploadRealTimeMonitoringDataController.java                     |   10 
 ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/IntegrationFallbackFactory.java                                |  100 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyDetailController.java                      |    2 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/PlatformStopChargingReplyServiceImpl.java      |   48 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/PlatformStartChargingReplyServiceImpl.java                   |   47 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java                                               |    5 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/SecurityDetectionService.java                       |   17 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/PlatformStartChargingReplyServiceImpl.java     |   47 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/PlatformStartChargingReplyService.java                            |   17 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/TransactionRecordServiceImpl.java                            |   51 
 ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/IntegrationClient.java                                     | 14859 ------------------------------------------------------
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/BmsDemandAndChargerExportationService.java          |   20 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/PlatformStopChargingReplyService.java                             |   15 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/SecurityDetectionServiceImpl.java                            |   49 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/PlatformStopChargingReplyService.java               |   15 
 ruoyi-service/ruoyi-order/pom.xml                                                                                                              |    7 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/ChargingHandshakeService.java                                     |   13 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java                               |    7 
 /dev/null                                                                                                                                      |   26 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/base/BaseService.java                                                     |   28 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/BmsDemandAndChargerExportationService.java                        |   20 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/SecurityDetectionServiceImpl.java              |   49 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TApplyChargingPileController.java                             |    7 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java                                             |    1 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java                 |  174 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/base/BaseService.java                                       |   28 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/TransactionRecordService.java                                     |   14 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/ChargingHandshakeServiceImpl.java                            |   39 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/BmsDemandAndChargerExportationServiceImpl.java |   48 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java                               |    2 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/UploadRealTimeMonitoringDataService.java            |   31 
 48 files changed, 1,270 insertions(+), 15,059 deletions(-)

diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/BmsDemandAndChargerExportationFallbackFactory.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/BmsDemandAndChargerExportationFallbackFactory.java
deleted file mode 100644
index e723828..0000000
--- a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/BmsDemandAndChargerExportationFallbackFactory.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.ruoyi.integration.api.factory;
-
-import com.ruoyi.common.core.domain.R;
-import com.ruoyi.common.core.dto.MongoChargingOrderQuery;
-import com.ruoyi.integration.api.feignClient.BmsDemandAndChargerExportationClient;
-import com.ruoyi.integration.api.feignClient.UploadRealTimeMonitoringDataClient;
-import com.ruoyi.integration.api.model.BmsDemandAndChargerExportation;
-import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
-import com.ruoyi.integration.api.model.UploadRealTimeMonitoringPageData;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * 充电桩服务降级处理
- * 
- * @author ruoyi
- */
-@Component
-public class BmsDemandAndChargerExportationFallbackFactory implements org.springframework.cloud.openfeign.FallbackFactory<BmsDemandAndChargerExportationClient>
-{
-    private static final Logger log = LoggerFactory.getLogger(BmsDemandAndChargerExportationFallbackFactory.class);
-
-    @Override
-    public BmsDemandAndChargerExportationClient create(Throwable throwable) {
-        log.error("调用充电桩实时监测数据失败:{}", throwable.getMessage());
-        return new BmsDemandAndChargerExportationClient() {
-    
-            @Override
-            public R<BmsDemandAndChargerExportation> getBmsDemandAndChargerExportation(String orderCode) {
-                return R.fail("获取充电中bms数据失败:" + throwable.getMessage());
-            }
-        };
-    }
-}
diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/ChargingHandshakeFallbackFactory.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/ChargingHandshakeFallbackFactory.java
deleted file mode 100644
index a1b0f16..0000000
--- a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/ChargingHandshakeFallbackFactory.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.ruoyi.integration.api.factory;
-
-import com.ruoyi.common.core.domain.R;
-import com.ruoyi.integration.api.feignClient.ChargingHandshakeClient;
-import com.ruoyi.integration.api.feignClient.UploadRealTimeMonitoringDataClient;
-import com.ruoyi.integration.api.model.ChargingHandshake;
-import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.cloud.openfeign.FallbackFactory;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * 充电桩服务降级处理
- * 
- * @author ruoyi
- */
-@Component
-public class ChargingHandshakeFallbackFactory implements FallbackFactory<ChargingHandshakeClient>
-{
-    private static final Logger log = LoggerFactory.getLogger(ChargingHandshakeFallbackFactory.class);
-
-    @Override
-    public ChargingHandshakeClient create(Throwable throwable) {
-        log.error("调用充电握手数据失败:{}", throwable.getMessage());
-        return new ChargingHandshakeClient() {
-    
-    
-            @Override
-            public R<ChargingHandshake> getDataByOrderCode(String code) {
-                return R.fail("根据订单号查询充电握手数据失败:" + throwable.getMessage());
-            }
-        };
-    }
-}
diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/IntegrationFallbackFactory.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/IntegrationFallbackFactory.java
index 3424e16..ebd6acc 100644
--- a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/IntegrationFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/IntegrationFallbackFactory.java
@@ -24,106 +24,6 @@
         return new IntegrationClient() {
 
             @Override
-            public R<String> onlineReply(OnlineReply onlineReply) {
-                return R.fail("登录认证应答调用失败:" + throwable.getMessage());
-            }
-
-            @Override
-            public R<String> pong(Pong pong) {
-                return R.fail("心跳包应答调用失败:" + throwable.getMessage());
-            }
-
-            @Override
-            public R<String> billingModeVerifyReply(BillingModeVerifyReply billingModeVerifyReply) {
-                return R.fail("计费模型验证请求应答调用失败:" + throwable.getMessage());
-            }
-
-            @Override
-            public R<String> acquisitionBillingModeReply(AcquisitionBillingModeReply acquisitionBillingModeReply) {
-                return R.fail("计费模型验证请求应答调用失败:" + throwable.getMessage());
-            }
-
-            @Override
-            public R<String> readRealTimeMonitoringData(ReadRealTimeMonitoringData readRealTimeMonitoringData) {
-                return R.fail("读取实时监测数据调用失败:" + throwable.getMessage());
-            }
-
-//            @Override
-//            public R<String> endCharge(EndCharge endCharge) {
-//                return R.fail("充电结束调用失败:" + throwable.getMessage());
-//            }
-
-            @Override
-            public R<String> platformConfirmationCharging(PlatformConfirmationCharging platformConfirmationCharging) {
-                return R.fail("运营平台确认启动充电调用失败:" + throwable.getMessage());
-            }
-
-            @Override
-            public R<String> platformStartCharging(PlatformStartCharging platformStartCharging) {
-                return R.fail("运营平台远程控制启机调用失败:" + throwable.getMessage());
-            }
-
-            @Override
-            public R<String> platformStopCharging(PlatformStopCharging platformStopCharging) {
-                return R.fail("运营平台远程停机调用失败:" + throwable.getMessage());
-            }
-
-            @Override
-            public R<String> confirmTransactionRecord(ConfirmTransactionRecord confirmTransactionRecord) {
-                return R.fail("交易记录确认调用失败:" + throwable.getMessage());
-            }
-
-            @Override
-            public R<String> updateBalance(UpdateBalance updateBalance) {
-                return R.fail("远程账户余额更新调用失败:" + throwable.getMessage());
-            }
-
-            @Override
-            public R<String> synchronizeOfflineCard(SynchronizeOfflineCard synchronizeOfflineCard) {
-                return R.fail("离线卡数据同步调用失败:" + throwable.getMessage());
-            }
-
-            @Override
-            public R<String> clearOfflineCard(ClearOfflineCard clearOfflineCard) {
-                return R.fail("离线卡数据清除调用失败:" + throwable.getMessage());
-            }
-
-            @Override
-            public R<String> queryOfflineCard(QueryOfflineCard queryOfflineCard) {
-                return R.fail("离线卡数据查询调用失败:" + throwable.getMessage());
-            }
-
-            @Override
-            public R<String> workingParameterSetting(WorkingParameterSetting workingParameterSetting) {
-                return R.fail("充电桩工作参数设置调用失败:" + throwable.getMessage());
-            }
-
-            @Override
-            public R<String> timingSetting(TimingSetting timingSetting) {
-                return R.fail("对时设置调用失败:" + throwable.getMessage());
-            }
-
-            @Override
-            public R<String> setupBillingModel(SetupBillingModel setupBillingModel) {
-                return R.fail("计费模型设置调用失败:" + throwable.getMessage());
-            }
-
-            @Override
-            public R<String> openOrCloseGroundLock(OpenOrCloseGroundLock openOrCloseGroundLock) {
-                return R.fail("遥控地锁升锁与降锁命令 (下行)调用失败:" + throwable.getMessage());
-            }
-
-            @Override
-            public R<String> platformRestart(PlatformRestart platformRestart) {
-                return R.fail("远程重启调用失败:" + throwable.getMessage());
-            }
-
-            @Override
-            public R<String> platformRemoteUpdate(PlatformRemoteUpdate platformRemoteUpdate) {
-                return R.fail("远程更新调用失败:" + throwable.getMessage());
-            }
-
-            @Override
             public R<String> setupBillingModel1(String deviceId, String json) {
                 return R.fail("远程更新硬件:" + throwable.getMessage());
             }
diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/SendMessageFallbackFactory.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/SendMessageFallbackFactory.java
index e063231..e8137f8 100644
--- a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/SendMessageFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/SendMessageFallbackFactory.java
@@ -1,9 +1,6 @@
 package com.ruoyi.integration.api.factory;
 
-import com.ruoyi.common.core.domain.R;
-import com.ruoyi.integration.api.feignClient.ChargingHandshakeClient;
 import com.ruoyi.integration.api.feignClient.SendMessageClient;
-import com.ruoyi.integration.api.model.ChargingHandshake;
 import com.ruoyi.integration.api.model.PlatformStartCharging;
 import com.ruoyi.integration.api.model.PlatformStopCharging;
 import com.ruoyi.integration.api.model.QrCodeDelivery;
diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/BmsDemandAndChargerExportationClient.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/BmsDemandAndChargerExportationClient.java
deleted file mode 100644
index f980896..0000000
--- a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/BmsDemandAndChargerExportationClient.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.ruoyi.integration.api.feignClient;
-
-import com.ruoyi.common.core.constant.ServiceNameConstants;
-import com.ruoyi.common.core.domain.R;
-import com.ruoyi.integration.api.factory.BmsDemandAndChargerExportationFallbackFactory;
-import com.ruoyi.integration.api.model.BmsDemandAndChargerExportation;
-import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-
-/**
- * @author zhibing.pu
- * @Date 2024/11/1 16:06
- */
-@FeignClient(contextId = "BmsDemandAndChargerExportationClient", value = ServiceNameConstants.INTEGRATION_SERVICE, fallbackFactory = BmsDemandAndChargerExportationFallbackFactory.class)
-public interface BmsDemandAndChargerExportationClient {
-	
-	
-	/**
-	 * 获取充电中bms数据
-	 * @param orderCode
-	 * @return
-	 */
-	@PostMapping("/bmsDemandAndChargerExportation/getBmsDemandAndChargerExportation")
-	R<BmsDemandAndChargerExportation> getBmsDemandAndChargerExportation(@RequestParam(value = "orderCode") String orderCode);
-
-}
diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/ChargingHandshakeClient.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/ChargingHandshakeClient.java
deleted file mode 100644
index b81372d..0000000
--- a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/ChargingHandshakeClient.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.ruoyi.integration.api.feignClient;
-
-import com.ruoyi.common.core.constant.ServiceNameConstants;
-import com.ruoyi.common.core.domain.R;
-import com.ruoyi.integration.api.factory.ChargingHandshakeFallbackFactory;
-import com.ruoyi.integration.api.model.ChargingHandshake;
-import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-
-/**
- * @author zhibing.pu
- * @Date 2024/8/28 10:46
- */
-@FeignClient(contextId = "ChargingHandshakeClient", value = ServiceNameConstants.INTEGRATION_SERVICE, fallbackFactory = ChargingHandshakeFallbackFactory.class)
-public interface ChargingHandshakeClient {
-	
-	
-	/**
-	 * 根据订单号查询充电握手数据
-	 * @param code
-	 * @return
-	 */
-	@PostMapping("/chargingHandshake/getDataByOrderCode")
-	R<ChargingHandshake> getDataByOrderCode(@RequestParam("code") String code);
-}
diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/IntegrationClient.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/IntegrationClient.java
index c08fcd0..42dc6fe 100644
--- a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/IntegrationClient.java
+++ b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/IntegrationClient.java
@@ -19,14864 +19,7 @@
 public interface IntegrationClient {
 
 
-    /**
-     * 登录认证应答
-     * @param onlineReply  实体对象
-     * @return
-     */
-    @PostMapping("/sendMessage/sendMessageonlineReply")
-    public R<String> onlineReply(@RequestBody OnlineReply onlineReply);
-
-    /**
-     * 心跳包应答
-     * @param pong 实体对象
-     * @return
-     */
-    @PostMapping("/sendMessage/sendMessagepong")
-    public R<String> pong(@RequestBody Pong pong);
-
-    /**
-     * 计费模型验证请求应答
-     * @param billingModeVerifyReply 实体对象
-     * @return
-     */
-    @PostMapping("/sendMessage/sendMessagebillingModeVerifyReply")
-    public R<String> billingModeVerifyReply(@RequestBody BillingModeVerifyReply billingModeVerifyReply);
-
-    /**
-     * 计费模型验证请求应答
-     * @param acquisitionBillingModeReply 实体对象
-     * @return
-     */
-    @PostMapping("/sendMessage/sendMessageacquisitionBillingModeReply")
-    public R<String> acquisitionBillingModeReply(@RequestBody AcquisitionBillingModeReply acquisitionBillingModeReply);
-
-    /**
-     * 读取实时监测数据
-     * @param readRealTimeMonitoringData 实体对象
-     * @return
-     */
-    @PostMapping("/sendMessage/sendMessagereadRealTimeMonitoringData")
-    public R<String> readRealTimeMonitoringData(@RequestBody ReadRealTimeMonitoringData readRealTimeMonitoringData);
-
-    /**
-     * 充电结束
-     * @param endCharge 实体对象
-     * @return
-     */
-//    @PostMapping("/sendMessage/sendMessageendCharge")
-//    public R<String> endCharge(@RequestBody EndCharge endCharge);
-
-    /**
-     * 运营平台确认启动充电
-     * @param platformConfirmationCharging 实体对象
-     * @return
-     */
-    @PostMapping("/sendMessage/sendMessageplatformConfirmationCharging")
-    public R<String> platformConfirmationCharging(@RequestBody PlatformConfirmationCharging platformConfirmationCharging);
-
-    /**
-     * 运营平台远程控制启机
-     * @param platformStartCharging 实体对象
-     * @return
-     */
-    @PostMapping("/sendMessage/sendMessageplatformStartCharging")
-    public R<String> platformStartCharging(@RequestBody PlatformStartCharging platformStartCharging);
-
-    /**
-     * 运营平台远程停机
-     * @param platformStopCharging 实体对象
-     * @return
-     */
-    @PostMapping("/sendMessage/sendMessageplatformStopCharging")
-    public R<String> platformStopCharging(@RequestBody PlatformStopCharging platformStopCharging);
-
-    /**
-     * 交易记录确认
-     * @param confirmTransactionRecord 实体对象
-     * @return
-     */
-    @PostMapping("/sendMessage/sendMessageconfirmTransactionRecord")
-    public R<String> confirmTransactionRecord(@RequestBody ConfirmTransactionRecord confirmTransactionRecord);
-
-    /**
-     * 远程账户余额更新
-     * @param updateBalance 实体对象
-     * @return
-     */
-    @PostMapping("/sendMessage/sendMessageupdateBalance")
-    public R<String> updateBalance(@RequestBody UpdateBalance updateBalance);
-
-    /**
-     * 离线卡数据同步
-     * @param synchronizeOfflineCard 实体对象
-     * @return
-     */
-    @PostMapping("/sendMessage/sendMessagesynchronizeOfflineCard")
-    public R<String> synchronizeOfflineCard(@RequestBody SynchronizeOfflineCard synchronizeOfflineCard);
-
-    /**
-     * 离线卡数据清除
-     * @param clearOfflineCard 实体对象
-     * @return
-     */
-    @PostMapping("/sendMessage/sendMessageclearOfflineCard")
-    public R<String> clearOfflineCard(@RequestBody ClearOfflineCard clearOfflineCard);
-
-    /**
-     * 离线卡数据查询
-     * @param queryOfflineCard 实体对象
-     * @return
-     */
-    @PostMapping("/sendMessage/sendMessagequeryOfflineCard")
-    public R<String> queryOfflineCard(@RequestBody QueryOfflineCard queryOfflineCard);
-
-    /**
-     * 充电桩工作参数设置
-     * @param workingParameterSetting 实体对象
-     * @return
-     */
-    @PostMapping("/sendMessage/sendMessageworkingParameterSetting")
-    public R<String> workingParameterSetting(@RequestBody WorkingParameterSetting workingParameterSetting);
-
-    /**
-     * 对时设置
-     * @param timingSetting 实体对象
-     * @return
-     */
-    @PostMapping("/sendMessage/sendMessagetimingSetting")
-    public R<String> timingSetting(@RequestBody TimingSetting timingSetting);
-
-    /**
-     * 计费模型设置
-     * @param setupBillingModel 实体对象
-     * @return
-     */
-    @PostMapping("/sendMessage/setupBillingModel")
-    public R<String> setupBillingModel(@RequestBody SetupBillingModel setupBillingModel);
-
-    /**
-     * 遥控地锁升锁与降锁命令 (下行)
-     * @param openOrCloseGroundLock 实体对象
-     * @return
-     */
-    @PostMapping("/sendMessage/sendMessageopenOrCloseGroundLock")
-    public R<String> openOrCloseGroundLock(@RequestBody OpenOrCloseGroundLock openOrCloseGroundLock);
-    /**
-     * 远程重启
-     * @param platformRestart 实体对象
-     * @return
-     */
-    @PostMapping("/sendMessage/sendMessageplatformRestart")
-    public R<String> platformRestart(@RequestBody PlatformRestart platformRestart);
-    /**
-     * 远程更新
-     * @param platformRemoteUpdate 实体对象
-     * @return
-     */
-    @PostMapping("/sendMessage/sendMessageplatformRemoteUpdate")
-    public R<String> platformRemoteUpdate(@RequestBody PlatformRemoteUpdate platformRemoteUpdate);
-
     @PostMapping("/iot/setupBillingModel")
-    public R<String> setupBillingModel1(@RequestParam("deviceId") String deviceId, @RequestParam("json") String json);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+    R<String> setupBillingModel1(@RequestParam("deviceId") String deviceId, @RequestParam("json") String json);
 
 }
diff --git a/ruoyi-api/ruoyi-api-integration/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-api/ruoyi-api-integration/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
index b52ff44..a85ce88 100644
--- a/ruoyi-api/ruoyi-api-integration/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ b/ruoyi-api/ruoyi-api-integration/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -1,12 +1,10 @@
 com.ruoyi.integration.api.factory.IntegrationFallbackFactory
 com.ruoyi.integration.api.factory.UploadRealTimeMonitoringDataFallbackFactory
-com.ruoyi.integration.api.factory.ChargingHandshakeFallbackFactory
 com.ruoyi.integration.api.factory.SendMessageFallbackFactory
 com.ruoyi.integration.api.factory.PlatformStartChargingReplyFallbackFactory
 com.ruoyi.integration.api.factory.PlatformStopChargingReplyFallbackFactory
 com.ruoyi.integration.api.factory.SwitchwayGateFallbackFactory
 com.ruoyi.integration.api.factory.IotInterfaceFallbackFactory
 com.ruoyi.integration.api.factory.SecurityDetectionFallbackFactory
-com.ruoyi.integration.api.factory.BmsDemandAndChargerExportationFallbackFactory
 com.ruoyi.integration.api.factory.TCECClientFallbackFactory
 com.ruoyi.integration.api.factory.TransactionRecordClientFallbackFactory
\ No newline at end of file
diff --git a/ruoyi-service/ruoyi-chargingPile/pom.xml b/ruoyi-service/ruoyi-chargingPile/pom.xml
index 40a8298..07f0e31 100644
--- a/ruoyi-service/ruoyi-chargingPile/pom.xml
+++ b/ruoyi-service/ruoyi-chargingPile/pom.xml
@@ -153,6 +153,11 @@
             <artifactId>javase</artifactId>
             <version>3.3.0</version>
         </dependency>
+        <!--mongodb-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-mongodb</artifactId>
+        </dependency>
     </dependencies>
 
     <build>
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 c58af1d..46e3915 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
@@ -178,7 +178,7 @@
         TAccountingStrategy accountingStrategy = accountingStrategyService.getById(site.getAccountingStrategyId());
         TAccountingStrategyDetail one = accountingStrategyDetailService.getOne(Wrappers.<TAccountingStrategyDetail>lambdaQuery()
                 .eq(TAccountingStrategyDetail::getAccountingStrategyId, accountingStrategy.getId())
-                .last(" and DATE_FORMAT(now(), '%H:%i') between start_time and end_time"));
+                .last(" and DATE_FORMAT(now(), '%H:%i') between start_time and (if(end_time = '00:00', '23:59', end_time))"));
         return R.ok(dto.getStrategyDetailId().equals(one.getId()));
     }
     
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TApplyChargingPileController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TApplyChargingPileController.java
index 31cee8d..918eaeb 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TApplyChargingPileController.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TApplyChargingPileController.java
@@ -11,6 +11,7 @@
 import com.ruoyi.chargingPile.api.model.Partner;
 import com.ruoyi.chargingPile.api.model.Site;
 import com.ruoyi.chargingPile.api.model.TChargingGun;
+import com.ruoyi.chargingPile.util.mongodb.service.UploadRealTimeMonitoringDataService;
 import com.ruoyi.common.core.utils.WebUtils;
 import com.ruoyi.common.core.web.domain.BasePojo;
 import com.ruoyi.common.core.web.page.PageInfo;
@@ -425,7 +426,7 @@
     @Resource
     private OtherClient otherClient;
     @Resource
-    private UploadRealTimeMonitoringDataClient uploadRealTimeMonitoringDataClient;
+    private UploadRealTimeMonitoringDataService uploadRealTimeMonitoringDataService;
     @ApiOperation(value = "下载", tags = {"管理后台-结算表记录"})
     @PutMapping("/downloadSettlement")
     @Log(title = "【结算表记录】下载结算表", businessType = BusinessType.EXPORT)
@@ -559,7 +560,7 @@
             settlementExportVO.setAverageServiceChargeReal("");
             settlementExportVO.setAverageServiceCharge("");
             // 获取充电时间
-            UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrder.getCode()).getData();
+            UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataService.getLastDataById(chargingOrder.getCode());
             if (data5!=null){
                 if (data5.getCumulative_charging_time()!=null){
                     settlementExportVO.setChargingSecond(data5.getCumulative_charging_time()+"");
@@ -568,7 +569,7 @@
             }
             // 获取开始SOC 结束soc
             if (chargingOrder.getCode()!=null){
-                List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataClient.getDataByOrderCode(chargingOrder.getCode()).getData();
+                List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode());
                 if (data6!=null && !data6.isEmpty()){
                     int min = 100;
                     int max = 0;
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java
index 6120ef0..2bfa42a 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java
@@ -19,6 +19,7 @@
 import com.ruoyi.chargingPile.dto.GetChargingGunMonitoring;
 import com.ruoyi.chargingPile.mapper.TChargingPileMapper;
 import com.ruoyi.chargingPile.service.*;
+import com.ruoyi.chargingPile.util.mongodb.service.UploadRealTimeMonitoringDataService;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.core.web.domain.AjaxResult;
@@ -96,7 +97,7 @@
 	private AppUserCarClient appUserCarClient;
 	
 	@Resource
-	private UploadRealTimeMonitoringDataClient uploadRealTimeMonitoringDataClient;
+	private UploadRealTimeMonitoringDataService uploadRealTimeMonitoringDataService;
 
 	@Resource
 	private SysUserRoleClient sysUserRoleClient;
@@ -406,7 +407,7 @@
 						// 查询正在充电的单子的实时记录
 						TChargingOrder chargingOrder = chargingOrderClient.getOrderDetailByGunId(chargingGun.getId()).getData();
 						if(Objects.nonNull(chargingOrder)){
-							UploadRealTimeMonitoringData uploadRealTimeMonitoringData = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrder.getCode()).getData();
+							UploadRealTimeMonitoringData uploadRealTimeMonitoringData = uploadRealTimeMonitoringDataService.getLastDataById(chargingOrder.getCode());
 							if(null != uploadRealTimeMonitoringData){
 								chargingGun.setSoc(uploadRealTimeMonitoringData.getSoc());
 							}else{
@@ -636,7 +637,7 @@
 						gunMonitoring.setLicensePlate(chargingOrder.getPlateNum());
 					}
 
-					UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrder.getCode()).getData();
+					UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataService.getLastDataById(chargingOrder.getCode());
 					gunMonitoring.setChargingRatio(BigDecimal.valueOf(data.getSoc()));
 					gunMonitoring.setElectricQuantity(data.getCharging_degree().toString());
 					gunMonitoring.setSoc(data.getSoc().toString());
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/base/BaseService.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/base/BaseService.java
new file mode 100644
index 0000000..bc66509
--- /dev/null
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/base/BaseService.java
@@ -0,0 +1,28 @@
+package com.ruoyi.chargingPile.util.mongodb.base;
+
+
+import java.util.List;
+
+public interface BaseService<T> {
+
+    /**
+     * 添加
+     * @param t 实体类
+     * @return 添加结果 1=成功 0=失败
+     */
+    int create(T t);
+
+    /**
+     * 根据id查询
+     * @param id 实体id
+     * @return 实体对象
+     */
+    T findById(String id);
+
+    /**
+     * 查询列表
+     * @return 实体列表
+     */
+    List<T> findAll();
+
+}
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/BmsDemandAndChargerExportationService.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/BmsDemandAndChargerExportationService.java
new file mode 100644
index 0000000..3a52d8f
--- /dev/null
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/BmsDemandAndChargerExportationService.java
@@ -0,0 +1,20 @@
+package com.ruoyi.chargingPile.util.mongodb.service;
+
+import com.ruoyi.chargingPile.util.mongodb.base.BaseService;
+import com.ruoyi.integration.api.model.BmsDemandAndChargerExportation;
+
+import java.util.List;
+
+public interface BmsDemandAndChargerExportationService extends BaseService<BmsDemandAndChargerExportation> {
+	
+	
+	/**
+	 * 获取bms数据
+	 * @param orderCode
+	 * @return
+	 */
+	List<BmsDemandAndChargerExportation> getBmsDemandAndChargerExportation(String orderCode);
+	
+
+	
+}
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/ChargingHandshakeService.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/ChargingHandshakeService.java
new file mode 100644
index 0000000..15f3b46
--- /dev/null
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/ChargingHandshakeService.java
@@ -0,0 +1,13 @@
+package com.ruoyi.chargingPile.util.mongodb.service;
+
+import com.ruoyi.chargingPile.util.mongodb.base.BaseService;
+import com.ruoyi.integration.api.model.ChargingHandshake;
+
+public interface ChargingHandshakeService extends BaseService<ChargingHandshake> {
+	
+	
+	ChargingHandshake getDataByOrderCode(String code);
+	
+	
+	
+}
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/PlatformStartChargingReplyService.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/PlatformStartChargingReplyService.java
new file mode 100644
index 0000000..c07be82
--- /dev/null
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/PlatformStartChargingReplyService.java
@@ -0,0 +1,17 @@
+package com.ruoyi.chargingPile.util.mongodb.service;
+
+import com.ruoyi.chargingPile.util.mongodb.base.BaseService;
+import com.ruoyi.integration.api.model.PlatformStartChargingReply;
+
+import java.util.List;
+
+public interface PlatformStartChargingReplyService extends BaseService<PlatformStartChargingReply> {
+	
+	/**
+	 * 根据订单编号查询远程启机应答数据
+	 * @param code
+	 * @return
+	 */
+	List<PlatformStartChargingReply> getPlatformStartChargingReply(String code);
+	
+}
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/PlatformStopChargingReplyService.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/PlatformStopChargingReplyService.java
new file mode 100644
index 0000000..491dfbd
--- /dev/null
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/PlatformStopChargingReplyService.java
@@ -0,0 +1,15 @@
+package com.ruoyi.chargingPile.util.mongodb.service;
+
+import com.ruoyi.chargingPile.util.mongodb.base.BaseService;
+import com.ruoyi.integration.api.model.PlatformStopChargingReply;
+import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply;
+
+public interface PlatformStopChargingReplyService extends BaseService<PlatformStopChargingReply> {
+	
+	/**
+	 * 根据枪编号获取停机应答
+	 * @return
+	 */
+	PlatformStopChargingReply getPlatformStopChargingReply(GetPlatformStopChargingReply query);
+	
+}
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/SecurityDetectionService.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/SecurityDetectionService.java
new file mode 100644
index 0000000..7c35873
--- /dev/null
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/SecurityDetectionService.java
@@ -0,0 +1,17 @@
+package com.ruoyi.chargingPile.util.mongodb.service;
+
+import com.ruoyi.chargingPile.util.mongodb.base.BaseService;
+import com.ruoyi.integration.api.model.SecurityDetection;
+
+/**
+ */
+public interface SecurityDetectionService extends BaseService<SecurityDetection> {
+	
+	
+	/**
+	 * 根据业务流水号查询数据
+	 * @param transactionSerialNumber
+	 * @return
+	 */
+	SecurityDetection getSecurityDetection(String transactionSerialNumber);
+}
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/TransactionRecordService.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/TransactionRecordService.java
new file mode 100644
index 0000000..e59fea6
--- /dev/null
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/TransactionRecordService.java
@@ -0,0 +1,14 @@
+package com.ruoyi.chargingPile.util.mongodb.service;
+
+import com.ruoyi.chargingPile.util.mongodb.base.BaseService;
+import com.ruoyi.integration.api.model.TransactionRecord;
+
+public interface TransactionRecordService extends BaseService<TransactionRecord> {
+	
+	/**
+	 * 根据订单流水号查询数据
+	 * @param code
+	 * @return
+	 */
+	TransactionRecord findOne(String code);
+}
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/UploadRealTimeMonitoringDataService.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/UploadRealTimeMonitoringDataService.java
new file mode 100644
index 0000000..ad7fb4d
--- /dev/null
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/UploadRealTimeMonitoringDataService.java
@@ -0,0 +1,31 @@
+package com.ruoyi.chargingPile.util.mongodb.service;
+
+import com.ruoyi.chargingPile.util.mongodb.base.BaseService;
+import com.ruoyi.common.core.dto.MongoChargingOrderQuery;
+import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
+import com.ruoyi.integration.api.model.UploadRealTimeMonitoringPageData;
+
+import java.text.ParseException;
+import java.util.List;
+
+public interface UploadRealTimeMonitoringDataService extends BaseService<UploadRealTimeMonitoringData> {
+	
+	/**
+	 * 根据订单号查询监控数据
+	 * @param code
+	 * @return
+	 */
+	List<UploadRealTimeMonitoringData> getDataByOrderCode(String code);
+	UploadRealTimeMonitoringPageData getDataAll(MongoChargingOrderQuery mongoChargingOrderQuery) throws ParseException;
+
+	/**
+	 * 查询订单最新一条数据
+	 * @param transaction_serial_number
+	 * @return
+	 */
+    UploadRealTimeMonitoringData getLastDataById(String transaction_serial_number);
+
+	void delete(String id);
+
+	void updateById(String id);
+}
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/BmsDemandAndChargerExportationServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/BmsDemandAndChargerExportationServiceImpl.java
new file mode 100644
index 0000000..37d320f
--- /dev/null
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/BmsDemandAndChargerExportationServiceImpl.java
@@ -0,0 +1,48 @@
+package com.ruoyi.chargingPile.util.mongodb.service.impl;
+
+import com.ruoyi.chargingPile.util.mongodb.service.BmsDemandAndChargerExportationService;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.integration.api.model.BmsDemandAndChargerExportation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class BmsDemandAndChargerExportationServiceImpl implements BmsDemandAndChargerExportationService {
+    @Autowired
+    private MongoTemplate mongoTemplate;
+    @Override
+    public int create(BmsDemandAndChargerExportation bmsDemandAndChargerExportation) {
+        mongoTemplate.save(bmsDemandAndChargerExportation);
+        return 1;
+    }
+
+    @Override
+    public BmsDemandAndChargerExportation findById(String id) {
+        return mongoTemplate.findById(id, BmsDemandAndChargerExportation.class);
+    }
+
+    @Override
+    public List<BmsDemandAndChargerExportation> findAll() {
+        return mongoTemplate.findAll(BmsDemandAndChargerExportation.class);
+    }
+    
+    
+    @Override
+    public List<BmsDemandAndChargerExportation> getBmsDemandAndChargerExportation(String orderCode) {
+        Query query = new Query();
+        if(StringUtils.isNotEmpty(orderCode)){
+            query.addCriteria(Criteria.where("transaction_serial_number").is(orderCode));
+        }
+        List<BmsDemandAndChargerExportation> uploadRealTimeMonitoringData = mongoTemplate.find(
+                query.with(Sort.by(Sort.Order.desc("create_time")))
+                , BmsDemandAndChargerExportation.class);
+        return uploadRealTimeMonitoringData;
+    }
+    
+}
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/ChargingHandshakeServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/ChargingHandshakeServiceImpl.java
new file mode 100644
index 0000000..e47accd
--- /dev/null
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/ChargingHandshakeServiceImpl.java
@@ -0,0 +1,39 @@
+package com.ruoyi.chargingPile.util.mongodb.service.impl;
+
+import com.ruoyi.chargingPile.util.mongodb.service.ChargingHandshakeService;
+import com.ruoyi.integration.api.model.ChargingHandshake;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class ChargingHandshakeServiceImpl implements ChargingHandshakeService {
+    @Autowired
+    private MongoTemplate mongoTemplate;
+    @Override
+    public int create(ChargingHandshake chargingHandshake) {
+        mongoTemplate.save(chargingHandshake);
+        return 1;
+    }
+
+    @Override
+    public ChargingHandshake findById(String id) {
+        return mongoTemplate.findById(id, ChargingHandshake.class);
+    }
+
+    @Override
+    public List<ChargingHandshake> findAll() {
+        return mongoTemplate.findAll(ChargingHandshake.class);
+    }
+    
+    @Override
+    public ChargingHandshake getDataByOrderCode(String code) {
+        List<ChargingHandshake> charging_gun_code = mongoTemplate.find(new Query().addCriteria(Criteria.where("transaction_serial_number").is(code)), ChargingHandshake.class);
+        return charging_gun_code.size() > 0 ? charging_gun_code.get(0) : null;
+    }
+    
+}
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/PlatformStartChargingReplyServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/PlatformStartChargingReplyServiceImpl.java
new file mode 100644
index 0000000..3c0c176
--- /dev/null
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/PlatformStartChargingReplyServiceImpl.java
@@ -0,0 +1,47 @@
+package com.ruoyi.chargingPile.util.mongodb.service.impl;
+
+import com.ruoyi.chargingPile.util.mongodb.service.PlatformStartChargingReplyService;
+import com.ruoyi.integration.api.model.PlatformStartChargingReply;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class PlatformStartChargingReplyServiceImpl implements PlatformStartChargingReplyService {
+    @Autowired
+    private MongoTemplate mongoTemplate;
+
+    @Override
+    public int create(PlatformStartChargingReply platformStartChargingReply) {
+        mongoTemplate.save(platformStartChargingReply);
+        return 1;
+    }
+
+    @Override
+    public PlatformStartChargingReply findById(String id) {
+        return mongoTemplate.findById(id, PlatformStartChargingReply.class);
+    }
+
+    @Override
+    public List<PlatformStartChargingReply> findAll() {
+        return mongoTemplate.findAll(PlatformStartChargingReply.class);
+    }
+    
+    
+    /**
+     * 根据订单编号查询远程启机应答数据
+     * @param code
+     * @return
+     */
+    @Override
+    public List<PlatformStartChargingReply> getPlatformStartChargingReply(String code) {
+        Query query = new Query();
+        query.addCriteria(Criteria.where("transaction_serial_number").is(code));
+        List<PlatformStartChargingReply> platformStartChargingReplies = mongoTemplate.find(query, PlatformStartChargingReply.class);
+        return platformStartChargingReplies;
+    }
+}
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/PlatformStopChargingReplyServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/PlatformStopChargingReplyServiceImpl.java
new file mode 100644
index 0000000..17d7e79
--- /dev/null
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/PlatformStopChargingReplyServiceImpl.java
@@ -0,0 +1,48 @@
+package com.ruoyi.chargingPile.util.mongodb.service.impl;
+
+import com.ruoyi.chargingPile.util.mongodb.service.PlatformStopChargingReplyService;
+import com.ruoyi.integration.api.model.PlatformStopChargingReply;
+import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Service;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class PlatformStopChargingReplyServiceImpl implements PlatformStopChargingReplyService {
+    @Autowired
+    private MongoTemplate mongoTemplate;
+    @Override
+    public int create(PlatformStopChargingReply platformStopChargingReply) {
+        mongoTemplate.save(platformStopChargingReply);
+        return 1;
+    }
+
+    @Override
+    public PlatformStopChargingReply findById(String id) {
+        return mongoTemplate.findById(id, PlatformStopChargingReply.class);
+    }
+
+    @Override
+    public List<PlatformStopChargingReply> findAll() {
+        return mongoTemplate.findAll(PlatformStopChargingReply.class);
+    }
+    
+    
+    /**
+     * 根据枪编号获取
+     * @return
+     */
+    @Override
+    public PlatformStopChargingReply getPlatformStopChargingReply(GetPlatformStopChargingReply query) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        List<PlatformStopChargingReply> platformStopChargingReplies = mongoTemplate.find(new Query().addCriteria(Criteria.where("charging_pile_code").is(query.getCharging_pile_code())
+                .and("charging_gun_code").is(query.getCharging_gun_code()).and("create_time").lte(sdf.format(new Date())).gte(query.getEnd_time())), PlatformStopChargingReply.class);
+        return platformStopChargingReplies.size() > 0 ? platformStopChargingReplies.get(0) : null;
+    }
+}
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/SecurityDetectionServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/SecurityDetectionServiceImpl.java
new file mode 100644
index 0000000..06a9877
--- /dev/null
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/SecurityDetectionServiceImpl.java
@@ -0,0 +1,49 @@
+package com.ruoyi.chargingPile.util.mongodb.service.impl;
+
+import com.ruoyi.chargingPile.util.mongodb.service.SecurityDetectionService;
+import com.ruoyi.integration.api.model.SecurityDetection;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+
+/**
+ * 心跳包应答实现类
+ **/
+@Service
+public class SecurityDetectionServiceImpl implements SecurityDetectionService {
+    @Autowired
+    private MongoTemplate mongoTemplate;
+
+    @Override
+    public int create(SecurityDetection securityDetection) {
+        mongoTemplate.save(securityDetection);
+        return 1;
+    }
+
+    @Override
+    public SecurityDetection findById(String id) {
+        return mongoTemplate.findById(id, SecurityDetection.class);
+    }
+
+    @Override
+    public List<SecurityDetection> findAll() {
+        return mongoTemplate.findAll(SecurityDetection.class);
+    }
+    
+    /**
+     * 根据业务流水号查询数据
+     * @param transactionSerialNumber
+     * @return
+     */
+    @Override
+    public SecurityDetection getSecurityDetection(String transactionSerialNumber) {
+        List<SecurityDetection> securityDetectionList = mongoTemplate.find(new Query().addCriteria(Criteria.where("transaction_serial_number")
+                .is(transactionSerialNumber)), SecurityDetection.class);
+        return securityDetectionList.size() > 0 ? securityDetectionList.get(0) : null;
+    }
+}
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/TransactionRecordServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/TransactionRecordServiceImpl.java
new file mode 100644
index 0000000..1475f99
--- /dev/null
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/TransactionRecordServiceImpl.java
@@ -0,0 +1,51 @@
+package com.ruoyi.chargingPile.util.mongodb.service.impl;
+
+import com.ruoyi.chargingPile.util.mongodb.service.TransactionRecordService;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.integration.api.model.TransactionRecord;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class TransactionRecordServiceImpl implements TransactionRecordService {
+    @Autowired
+    private MongoTemplate mongoTemplate;
+    @Override
+    public int create(TransactionRecord transactionRecord) {
+        mongoTemplate.save(transactionRecord);
+        return 1;
+    }
+
+    @Override
+    public TransactionRecord findById(String id) {
+        return mongoTemplate.findById(id, TransactionRecord.class);
+    }
+
+    @Override
+    public List<TransactionRecord> findAll() {
+        return mongoTemplate.findAll(TransactionRecord.class);
+    }
+    
+    /**
+     * 根据订单流水号查询数据
+     * @param code
+     * @return
+     */
+    @Override
+    public TransactionRecord findOne(String code) {
+        Query query = new Query();
+        if(StringUtils.isNotEmpty(code)){
+            query.addCriteria(Criteria.where("transaction_serial_number").is(code));
+        }
+        List<TransactionRecord> transactionRecords = mongoTemplate.find(
+                query.with(Sort.by(Sort.Order.desc("create_time")))
+                , TransactionRecord.class);
+        return transactionRecords.size() > 0 ? transactionRecords.get(0) : null;
+    }
+}
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java
new file mode 100644
index 0000000..67d3608
--- /dev/null
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/util/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java
@@ -0,0 +1,174 @@
+package com.ruoyi.chargingPile.util.mongodb.service.impl;
+
+import com.ruoyi.chargingPile.util.mongodb.service.UploadRealTimeMonitoringDataService;
+import com.ruoyi.common.core.dto.MongoChargingOrderQuery;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
+import com.ruoyi.integration.api.model.UploadRealTimeMonitoringPageData;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.data.mongodb.core.query.Update;
+import org.springframework.stereotype.Service;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class UploadRealTimeMonitoringDataServiceImpl implements UploadRealTimeMonitoringDataService {
+    @Autowired
+    private MongoTemplate mongoTemplate;
+
+    @Override
+    public int create(UploadRealTimeMonitoringData uploadRealTimeMonitoringData) {
+        mongoTemplate.save(uploadRealTimeMonitoringData);
+        return 1;
+    }
+
+    @Override
+    public UploadRealTimeMonitoringData findById(String id) {
+        return mongoTemplate.findById(id, UploadRealTimeMonitoringData.class);
+    }
+
+
+    @Override
+    public List<UploadRealTimeMonitoringData> findAll() {
+        return mongoTemplate.findAll(UploadRealTimeMonitoringData.class);
+    }
+    
+    
+    /**
+     * 根据订单号查询监控数据
+     * @param code
+     * @return
+     */
+    @Override
+    public List<UploadRealTimeMonitoringData> getDataByOrderCode(String code) {
+        Query query = new Query();
+        if(StringUtils.isNotEmpty(code)){
+            query.addCriteria(Criteria.where("transaction_serial_number").is(code));
+        }
+        List<UploadRealTimeMonitoringData> uploadRealTimeMonitoringData = mongoTemplate.find(
+                query.with(Sort.by(Sort.Order.desc("create_time")))
+                , UploadRealTimeMonitoringData.class);
+        return uploadRealTimeMonitoringData;
+    }
+
+    @Override
+    public UploadRealTimeMonitoringPageData getDataAll(MongoChargingOrderQuery mongoChargingOrderQuery) throws ParseException {
+        Query query = new Query();
+//        if (!values.isEmpty()){
+//            query.addCriteria(Criteria.where("transaction_serial_number").in(values));
+//        }
+        if (mongoChargingOrderQuery.getCode() != null && !mongoChargingOrderQuery.getCode().isEmpty()) {
+            query.addCriteria(Criteria.where("transaction_serial_number").regex(mongoChargingOrderQuery.getCode(),"i")); // "i" 表示不区分大小写
+        }
+        if (mongoChargingOrderQuery.getOrderType() !=null){
+            query.addCriteria(Criteria.where("orderType").is(mongoChargingOrderQuery.getOrderType()));
+        }
+        if (mongoChargingOrderQuery.getSiteId() != null){
+            query.addCriteria(Criteria.where("siteId").is(mongoChargingOrderQuery.getSiteId()));
+        }
+        if (!mongoChargingOrderQuery.getSiteIds().isEmpty()){
+            query.addCriteria(Criteria.where("siteId").in(mongoChargingOrderQuery.getSiteIds()));
+        }
+        if (mongoChargingOrderQuery.getChargingPileCode() != null && !mongoChargingOrderQuery.getChargingPileCode().isEmpty()) {
+            query.addCriteria(Criteria.where("charging_pile_code").is(mongoChargingOrderQuery.getChargingPileCode()));
+        }
+        if (mongoChargingOrderQuery.getChargingGunCode() != null && !mongoChargingOrderQuery.getChargingGunCode().isEmpty()){
+            query.addCriteria(Criteria.where("charging_gun_code").is(mongoChargingOrderQuery.getChargingGunCode()));
+        }
+        if (mongoChargingOrderQuery.getStatus() != null){
+            query.addCriteria(Criteria.where("status").is(mongoChargingOrderQuery.getStatus()));
+        }
+
+        if (mongoChargingOrderQuery.getCreateTime() != null) {
+            String[] split = mongoChargingOrderQuery.getCreateTime().split(" - ");
+
+            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            Date start = dateFormat.parse(split[0]);
+            Date end = dateFormat.parse(split[1]);
+            query.addCriteria(Criteria.where("create_time").gte(start).lt(end));
+        }
+
+        if (mongoChargingOrderQuery.getLastTime() != null && mongoChargingOrderQuery.getLastTime() != null) {
+            String[] split = mongoChargingOrderQuery.getLastTime().split(" - ");
+            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            Date start = dateFormat.parse(split[0]);
+            Date end = dateFormat.parse(split[1]);
+            query.addCriteria(Criteria.where("last_time").gte(start).lt(end));
+        }
+
+
+
+
+
+
+
+
+
+        long totalElements = mongoTemplate.count(query, UploadRealTimeMonitoringData.class);
+
+        // 创建带有排序的 Pageable 对象
+        Pageable pageable = PageRequest.of(
+                mongoChargingOrderQuery.getPageCurr()-1,
+                mongoChargingOrderQuery.getPageSize(),
+                Sort.by(Sort.Direction.DESC, "create_time")
+        );
+
+        // 设置分页和排序
+        query.with(pageable);
+
+        // 执行查询并获取 Page 对象
+        List<UploadRealTimeMonitoringData> page = mongoTemplate.find(query, UploadRealTimeMonitoringData.class,"upload_real_time_monitoring_data");
+
+        // 设置分页
+//        Pageable pageable = PageRequest.of(mongoChargingOrderQuery.getPageSize()*(mongoChargingOrderQuery.getPageCurr()-1), mongoChargingOrderQuery.getPageSize());
+//        query.with(pageable);
+//        query.with(Sort.by(Sort.Direction.DESC,"create_time"));
+        List<UploadRealTimeMonitoringData> uploadRealTimeMonitoringData = mongoTemplate.find(
+                query
+                , UploadRealTimeMonitoringData.class);
+
+        UploadRealTimeMonitoringPageData uploadRealTimeMonitoringPageData = new UploadRealTimeMonitoringPageData();
+        uploadRealTimeMonitoringPageData.setCount(totalElements);
+        uploadRealTimeMonitoringPageData.setRecords(page);
+        return uploadRealTimeMonitoringPageData;
+    }
+
+    @Override
+    public UploadRealTimeMonitoringData getLastDataById(String transaction_serial_number) {
+        Query query = new Query();
+        if (StringUtils.isNotEmpty(transaction_serial_number)){
+            query.addCriteria(Criteria.where("transaction_serial_number").is(transaction_serial_number));
+        }
+        // 按照 createdAt 字段降序排序
+        query.with(Sort.by(Sort.Direction.DESC, "create_time"));
+        // 限制结果只返回一条记录
+        query.limit(1);
+        return mongoTemplate.findOne(query, UploadRealTimeMonitoringData.class);
+    }
+
+    @Override
+    public void delete(String id) {
+        UploadRealTimeMonitoringData byId = findById(id.toString());
+        mongoTemplate.remove(byId);
+    }
+
+    @Override
+    public void updateById(String id) {
+        // 创建查询条件
+        Query query = new Query(Criteria.where("_id").is(id));
+        // 创建更新对象
+        Update update = new Update().set("last_time", new Date());
+        // 执行更新操作
+        mongoTemplate.updateFirst(query, update, UploadRealTimeMonitoringData.class);
+    }
+
+}
diff --git a/ruoyi-service/ruoyi-integration/pom.xml b/ruoyi-service/ruoyi-integration/pom.xml
index 9874e38..f7b1321 100644
--- a/ruoyi-service/ruoyi-integration/pom.xml
+++ b/ruoyi-service/ruoyi-integration/pom.xml
@@ -115,33 +115,7 @@
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
         </dependency>
-        <!--rocketmq-->
-<!--        <dependency>-->
-<!--            <groupId>com.alibaba.cloud</groupId>-->
-<!--            <artifactId>spring-cloud-starter-stream-rocketmq</artifactId>-->
-<!--            <version>2.2.2.RELEASE</version>-->
-<!--            <exclusions>-->
-<!--                <exclusion>-->
-<!--                    <groupId>org.apache.rocketmq</groupId>-->
-<!--                    <artifactId>rocketmq-client</artifactId>-->
-<!--                </exclusion>-->
-<!--                <exclusion>-->
-<!--                    <groupId>org.apache.rocketmq</groupId>-->
-<!--                    <artifactId>rocketmq-acl</artifactId>-->
-<!--                </exclusion>-->
-<!--            </exclusions>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>org.apache.rocketmq</groupId>-->
-<!--            <artifactId>rocketmq-client</artifactId>-->
-<!--            <version>4.7.1</version>-->
-<!--        </dependency>-->
-<!--        <dependency>-->
-<!--            <groupId>org.apache.rocketmq</groupId>-->
-<!--            <artifactId>rocketmq-acl</artifactId>-->
-<!--            <version>4.7.1</version>-->
-<!--        </dependency>-->
-    
+  
         <dependency>
             <groupId>org.apache.rocketmq</groupId>
             <artifactId>rocketmq-spring-boot-starter</artifactId>
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/UploadRealTimeMonitoringDataController.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/UploadRealTimeMonitoringDataController.java
index 1fa5baf..35b4c16 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/UploadRealTimeMonitoringDataController.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/UploadRealTimeMonitoringDataController.java
@@ -32,13 +32,9 @@
      * @return
      */
     @PostMapping(value = "/getOrderInfoByCode")
-    public R<UploadRealTimeMonitoringData> chargingOrderInfo(@RequestParam("orderId") String orderId){
-        List<UploadRealTimeMonitoringData> dataByOrderCode = uploadRealTimeMonitoringDataService.getDataByOrderCode(orderId);
-        if(dataByOrderCode.size() > 0){
-            UploadRealTimeMonitoringData uploadRealTimeMonitoringData = dataByOrderCode.get(0);
-            return R.ok(uploadRealTimeMonitoringData);
-        }
-        return R.ok();
+    public R<UploadRealTimeMonitoringData> getOrderInfoByCode(@RequestParam("orderId") String orderId){
+        UploadRealTimeMonitoringData dataByOrderCode = uploadRealTimeMonitoringDataService.getLastDataById(orderId);
+        return R.ok(dataByOrderCode);
     }
 
     /**
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java
index 6c047ac..048678b 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java
@@ -84,7 +84,7 @@
             if(!"}".equals(substring)){
                 content1 = content1.substring(0, content1.length() - 1) + "}";
             }
-            System.out.println("content1:"+content1);
+            log.info("content1:"+content1);
             content = JSON.parseObject(content1);
         }
         JSONObject header = jsonObject.getJSONObject("notify_data").getJSONObject("header");
diff --git a/ruoyi-service/ruoyi-order/pom.xml b/ruoyi-service/ruoyi-order/pom.xml
index c0c8fee..6df4555 100644
--- a/ruoyi-service/ruoyi-order/pom.xml
+++ b/ruoyi-service/ruoyi-order/pom.xml
@@ -150,7 +150,11 @@
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
         </dependency>
-
+        <!--mongodb-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-mongodb</artifactId>
+        </dependency>
         <dependency>
             <groupId>cn.afterturn</groupId>
             <artifactId>easypoi-spring-boot-starter</artifactId>
@@ -162,7 +166,6 @@
                 </exclusion>
             </exclusions>
         </dependency>
-
     </dependencies>
 
     <build>
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 2838c76..c67c52a 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
@@ -57,6 +57,7 @@
 import com.ruoyi.order.dto.*;
 import com.ruoyi.order.service.*;
 import com.ruoyi.order.util.PreviousSixMonths;
+import com.ruoyi.order.util.mongodb.service.UploadRealTimeMonitoringDataService;
 import com.ruoyi.order.vo.EndOfChargePageInfo;
 import com.ruoyi.order.vo.WatchChargingOrderVo;
 import com.ruoyi.other.api.feignClient.RoleSiteClient;
@@ -148,7 +149,7 @@
     @Resource
     private TOrderInvoiceService invoiceService;
     @Resource
-    private UploadRealTimeMonitoringDataClient uploadRealTimeMonitoringDataClient;
+    private UploadRealTimeMonitoringDataService uploadRealTimeMonitoringDataService;
     @Resource
     private PartnerClient partnerClient;
     @Resource
@@ -1243,7 +1244,7 @@
     @GetMapping(value = "/watch/deletes")
     @ApiOperation(value = "监控订单-删除", tags = {"管理后台-订单管理"})
     public R watchChargingOrder(@RequestParam String id) {
-        uploadRealTimeMonitoringDataClient.delete(id);
+        uploadRealTimeMonitoringDataService.delete(id);
         return R.ok();
     }
     
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 3c3e937..46af198 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
@@ -21,7 +21,6 @@
 import com.ruoyi.common.redis.service.RedisService;
 import com.ruoyi.common.security.service.TokenService;
 import com.ruoyi.common.security.utils.SecurityUtils;
-import com.ruoyi.integration.api.feignClient.ChargingHandshakeClient;
 import com.ruoyi.integration.api.feignClient.PlatformStartChargingReplyClient;
 import com.ruoyi.integration.api.feignClient.SendMessageClient;
 import com.ruoyi.integration.api.feignClient.UploadRealTimeMonitoringDataClient;
@@ -50,6 +49,9 @@
 import com.ruoyi.order.service.TChargingOrderService;
 import com.ruoyi.order.service.TOrderEvaluateService;
 import com.ruoyi.order.service.*;
+import com.ruoyi.order.util.mongodb.service.PlatformStartChargingReplyService;
+import com.ruoyi.order.util.mongodb.service.TransactionRecordService;
+import com.ruoyi.order.util.mongodb.service.UploadRealTimeMonitoringDataService;
 import com.ruoyi.order.vo.EndOfChargePageInfo;
 import com.ruoyi.other.api.domain.*;
 import com.ruoyi.order.vo.ChargingOrderListInfoVO;
@@ -140,7 +142,7 @@
 	private RedisService redisService;
 	
 	@Resource
-	private UploadRealTimeMonitoringDataClient uploadRealTimeMonitoringDataClient;
+	private UploadRealTimeMonitoringDataService uploadRealTimeMonitoringDataService;
 	
 	@Resource
 	private TCECClient tcecClient;
@@ -161,7 +163,7 @@
 	private AccountingStrategyClient accountingStrategyClient;
 
 	@Resource
-	private PlatformStartChargingReplyClient platformStartChargingReplyClient;
+	private PlatformStartChargingReplyService platformStartChargingReplyService;
 
 	@Resource
 	private TChargingOrderRefundService chargingOrderRefundService;
@@ -196,9 +198,6 @@
 	@Resource
 	private SecurityDetectionClient securityDetectionClient;
 	
-	@Resource
-	private BmsDemandAndChargerExportationClient bmsDemandAndChargerExportationClient;
-
 	//计数器
 	private Map<String, Integer> counter_map = new HashMap<>();
 	
@@ -209,7 +208,7 @@
 	private OperatorClient operatorClient;
 	
 	@Resource
-	private TransactionRecordClient transactionRecordClient;
+	private TransactionRecordService transactionRecordService;
 	
 	@Resource
 	private ITChargingOrderSummaryDataService chargingOrderSummaryDataService;
@@ -286,8 +285,12 @@
 		}else{
 			myChargingOrderInfo.setLicensePlate(chargingOrder.getPlateNum());
 		}
-		myChargingOrderInfo.setStartTime(chargingOrder.getStartTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000);
-		myChargingOrderInfo.setEndTime(chargingOrder.getEndTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000);
+		if(null != chargingOrder.getStartTime()){
+			myChargingOrderInfo.setStartTime(chargingOrder.getStartTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000);
+		}
+		if(null != chargingOrder.getEndTime()){
+			myChargingOrderInfo.setEndTime(chargingOrder.getEndTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000);
+		}
 		myChargingOrderInfo.setOrderAmount(chargingOrder.getOrderAmount());
 		myChargingOrderInfo.setPaymentAmount(chargingOrder.getPaymentAmount());
 		myChargingOrderInfo.setRechargeAmount(chargingOrder.getRechargeAmount());
@@ -299,7 +302,7 @@
 						.orderByAsc(TChargingOrderAccountingStrategy::getStartTime)
 		);
 		myChargingOrderInfo.setStageCost(stageCost);
-		List<UploadRealTimeMonitoringData> dataList = uploadRealTimeMonitoringDataClient.getDataByOrderCode(chargingOrder.getCode()).getData();
+		List<UploadRealTimeMonitoringData> dataList = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode());
 		if(null != dataList){
 			//在MongoDB中获取数据
 			SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
@@ -385,7 +388,6 @@
 	 * @return
 	 */
 	@Override
-	@GlobalTransactional(rollbackFor = Exception.class)
 	public AjaxResult paymentChargingOrder(AddChargingOrder addChargingOrder) {
 		Long userId = tokenService.getLoginUserApplet().getUserId();
 		TAppUser appUser = appUserClient.getUserById(userId).getData();
@@ -572,7 +574,6 @@
 	 * @return
 	 */
 	@Override
-	@GlobalTransactional(rollbackFor = Exception.class)
 	public AjaxResult chargingOrderCallback(Integer paymentType, String out_trade_no, String transaction_id, String attach) {
 		TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, out_trade_no));
 		if(chargingOrder.getRechargePaymentStatus() == 2){
@@ -725,7 +726,7 @@
 		}
 		String code = chargingOrder.getCode();
 		String key = "AQJC_" + chargingOrder.getChargingGunId();
-		List<PlatformStartChargingReply> data = platformStartChargingReplyClient.getPlatformStartChargingReply(code).getData();
+		List<PlatformStartChargingReply> data = platformStartChargingReplyService.getPlatformStartChargingReply(code);
 		log.info(code + ":-------------------开始检查调起充电结果-------------------" + data.toString());
 		if(data.size() != 0){
 			PlatformStartChargingReply platformStartChargingReply = data.get(1);
@@ -1095,7 +1096,7 @@
 		chargingDetails.setCode(one.getCode());
 		chargingDetails.setStatus(one.getStatus());
 		chargingDetails.setChargingCost(one.getResidualAmount());
-		UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataClient.chargingOrderInfo(one.getCode()).getData();
+		UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataService.getLastDataById(one.getCode());
 		if(null != data){
 			chargingDetails.setChargeCurrent(data.getOutput_current());
 			chargingDetails.setChargeVoltage(data.getOutput_voltage());
@@ -1124,7 +1125,6 @@
 	 * @return
 	 */
 	@Override
-	@GlobalTransactional(rollbackFor = Exception.class)
 	public AjaxResult stopCharging(String id) {
 		TChargingOrder order = this.getById(id);
 		Integer status = order.getStatus();
@@ -1736,7 +1736,7 @@
 			}
 			// 获取开始SOC 结束soc
 			if (chargingOrderListVO.getCode()!=null){
-				List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataClient.getDataByOrderCode(chargingOrderListVO.getCode()).getData();
+				List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrderListVO.getCode());
 
 			if (data6!=null && !data6.isEmpty()){
 				int min = 100;
@@ -2045,7 +2045,7 @@
 
 		// 获取开始SOC 结束soc
 		if (chargingOrder.getCode()!=null){
-			List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataClient.getDataByOrderCode(chargingOrder.getCode()).getData();
+			List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode());
 			if (data6!=null){
 				for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data6) {
 					if (uploadRealTimeMonitoringData.getOutput_current()!=null&&
@@ -2154,7 +2154,6 @@
 	 * @param orderCode
 	 */
 	@Override
-	@GlobalTransactional(rollbackFor = Exception.class)
 	public void endCharge(String orderCode, Integer endMode) {
 		TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, orderCode));
 		TChargingOrder chargingOrder = new TChargingOrder();
@@ -2179,7 +2178,6 @@
 	 * @param vo
 	 */
 	@Override
-	@GlobalTransactional(rollbackFor = Exception.class)
 	public R endChargeBillingCharge(TransactionRecordMessageVO vo) {
 		TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, vo.getTransaction_serial_number()));
 		if(null == chargingOrder){
@@ -2396,7 +2394,7 @@
 		TChargingOrder order = new TChargingOrder();
 		order.setId(chargingOrder.getId());
 		order.setAppUserId(chargingOrder.getAppUserId());
-		UploadRealTimeMonitoringData uploadRealTimeMonitoringData = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrder.getCode()).getData();
+		UploadRealTimeMonitoringData uploadRealTimeMonitoringData = uploadRealTimeMonitoringDataService.getLastDataById(chargingOrder.getCode());
 		if(null != uploadRealTimeMonitoringData && null == chargingOrder.getEndMode()){
 			Integer soc = uploadRealTimeMonitoringData.getSoc();
 			if(soc >= 98){
@@ -3990,7 +3988,7 @@
 				.ne(TChargingOrder::getElectricity, 0).in(TChargingOrder::getStatus, Arrays.asList(4, 5)));
 		List<Map<String, Object>> mapList = new ArrayList<>();
 		for (TChargingOrder order : list) {
-			TransactionRecord transactionRecord = transactionRecordClient.findTransactionRecord(order.getCode()).getData();
+			TransactionRecord transactionRecord = transactionRecordService.findOne(order.getCode());
 			Map<String, Object> map = new HashMap<>();
 			map.put("order", order);
 			map.put("transactionRecord", transactionRecord);
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderEvaluateServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderEvaluateServiceImpl.java
index 84b6550..c31e936 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderEvaluateServiceImpl.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderEvaluateServiceImpl.java
@@ -325,7 +325,6 @@
      * @return
      */
     @Override
-    @GlobalTransactional(rollbackFor = Exception.class)//分布式事务
     public AjaxResult addOrderEvaluate(OrderEvaluateVo query) {
         TOrderEvaluate orderEvaluate = this.getOne(new LambdaQueryWrapper<TOrderEvaluate>().eq(TOrderEvaluate::getOrderId, query.getOrderId())
                 .eq(TOrderEvaluate::getOrderType, query.getOrderType()).eq(TOrderEvaluate::getDelFlag, 0));
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java
index 16a0f3b..09b19fc 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java
@@ -95,7 +95,6 @@
 	 * @return
 	 */
 	@Override
-	@GlobalTransactional(rollbackFor = Exception.class)
 	public AjaxResult addOrderInvoice(AddOrderInvoice addOrderInvoice) {
 		Long userId = tokenService.getLoginUserApplet().getUserId();
 		String orders = addOrderInvoice.getOrders();
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java
index 7602a31..66eb669 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java
@@ -485,7 +485,6 @@
      * @return
      */
     @Override
-    @GlobalTransactional(rollbackFor = Exception.class)//分布式事务
     public AjaxResult cancelShoppingOrderWxRefund(String out_refund_no, String refund_id, String refund_status, String success_time) {
         TShoppingOrderRefund one = shoppingOrderRefundService.getOne(new LambdaQueryWrapper<TShoppingOrderRefund>().eq(TShoppingOrderRefund::getRefundCode, out_refund_no));
         one.setRefundStatus(2);
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/base/BaseService.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/base/BaseService.java
new file mode 100644
index 0000000..178015c
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/base/BaseService.java
@@ -0,0 +1,28 @@
+package com.ruoyi.order.util.mongodb.base;
+
+
+import java.util.List;
+
+public interface BaseService<T> {
+
+    /**
+     * 添加
+     * @param t 实体类
+     * @return 添加结果 1=成功 0=失败
+     */
+    int create(T t);
+
+    /**
+     * 根据id查询
+     * @param id 实体id
+     * @return 实体对象
+     */
+    T findById(String id);
+
+    /**
+     * 查询列表
+     * @return 实体列表
+     */
+    List<T> findAll();
+
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/BmsDemandAndChargerExportationService.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/BmsDemandAndChargerExportationService.java
new file mode 100644
index 0000000..524ef13
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/BmsDemandAndChargerExportationService.java
@@ -0,0 +1,20 @@
+package com.ruoyi.order.util.mongodb.service;
+
+import com.ruoyi.integration.api.model.BmsDemandAndChargerExportation;
+import com.ruoyi.order.util.mongodb.base.BaseService;
+
+import java.util.List;
+
+public interface BmsDemandAndChargerExportationService extends BaseService<BmsDemandAndChargerExportation> {
+	
+	
+	/**
+	 * 获取bms数据
+	 * @param orderCode
+	 * @return
+	 */
+	List<BmsDemandAndChargerExportation> getBmsDemandAndChargerExportation(String orderCode);
+	
+
+	
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/ChargingHandshakeService.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/ChargingHandshakeService.java
new file mode 100644
index 0000000..2ee0c10
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/ChargingHandshakeService.java
@@ -0,0 +1,13 @@
+package com.ruoyi.order.util.mongodb.service;
+
+import com.ruoyi.integration.api.model.ChargingHandshake;
+import com.ruoyi.order.util.mongodb.base.BaseService;
+
+public interface ChargingHandshakeService extends BaseService<ChargingHandshake> {
+	
+	
+	ChargingHandshake getDataByOrderCode(String code);
+	
+	
+	
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/PlatformStartChargingReplyService.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/PlatformStartChargingReplyService.java
new file mode 100644
index 0000000..7c0ed8c
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/PlatformStartChargingReplyService.java
@@ -0,0 +1,17 @@
+package com.ruoyi.order.util.mongodb.service;
+
+import com.ruoyi.integration.api.model.PlatformStartChargingReply;
+import com.ruoyi.order.util.mongodb.base.BaseService;
+
+import java.util.List;
+
+public interface PlatformStartChargingReplyService extends BaseService<PlatformStartChargingReply> {
+	
+	/**
+	 * 根据订单编号查询远程启机应答数据
+	 * @param code
+	 * @return
+	 */
+	List<PlatformStartChargingReply> getPlatformStartChargingReply(String code);
+	
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/PlatformStopChargingReplyService.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/PlatformStopChargingReplyService.java
new file mode 100644
index 0000000..7d22bc6
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/PlatformStopChargingReplyService.java
@@ -0,0 +1,15 @@
+package com.ruoyi.order.util.mongodb.service;
+
+import com.ruoyi.integration.api.model.PlatformStopChargingReply;
+import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply;
+import com.ruoyi.order.util.mongodb.base.BaseService;
+
+public interface PlatformStopChargingReplyService extends BaseService<PlatformStopChargingReply> {
+	
+	/**
+	 * 根据枪编号获取停机应答
+	 * @return
+	 */
+	PlatformStopChargingReply getPlatformStopChargingReply(GetPlatformStopChargingReply query);
+	
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/SecurityDetectionService.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/SecurityDetectionService.java
new file mode 100644
index 0000000..8ac54db
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/SecurityDetectionService.java
@@ -0,0 +1,17 @@
+package com.ruoyi.order.util.mongodb.service;
+
+import com.ruoyi.integration.api.model.SecurityDetection;
+import com.ruoyi.order.util.mongodb.base.BaseService;
+
+/**
+ */
+public interface SecurityDetectionService extends BaseService<SecurityDetection> {
+	
+	
+	/**
+	 * 根据业务流水号查询数据
+	 * @param transactionSerialNumber
+	 * @return
+	 */
+	SecurityDetection getSecurityDetection(String transactionSerialNumber);
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/TransactionRecordService.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/TransactionRecordService.java
new file mode 100644
index 0000000..0496189
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/TransactionRecordService.java
@@ -0,0 +1,14 @@
+package com.ruoyi.order.util.mongodb.service;
+
+import com.ruoyi.integration.api.model.TransactionRecord;
+import com.ruoyi.order.util.mongodb.base.BaseService;
+
+public interface TransactionRecordService extends BaseService<TransactionRecord> {
+	
+	/**
+	 * 根据订单流水号查询数据
+	 * @param code
+	 * @return
+	 */
+	TransactionRecord findOne(String code);
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/UploadRealTimeMonitoringDataService.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/UploadRealTimeMonitoringDataService.java
new file mode 100644
index 0000000..ae90d10
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/UploadRealTimeMonitoringDataService.java
@@ -0,0 +1,31 @@
+package com.ruoyi.order.util.mongodb.service;
+
+import com.ruoyi.common.core.dto.MongoChargingOrderQuery;
+import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
+import com.ruoyi.integration.api.model.UploadRealTimeMonitoringPageData;
+import com.ruoyi.order.util.mongodb.base.BaseService;
+
+import java.text.ParseException;
+import java.util.List;
+
+public interface UploadRealTimeMonitoringDataService extends BaseService<UploadRealTimeMonitoringData> {
+	
+	/**
+	 * 根据订单号查询监控数据
+	 * @param code
+	 * @return
+	 */
+	List<UploadRealTimeMonitoringData> getDataByOrderCode(String code);
+	UploadRealTimeMonitoringPageData getDataAll(MongoChargingOrderQuery mongoChargingOrderQuery) throws ParseException;
+
+	/**
+	 * 查询订单最新一条数据
+	 * @param transaction_serial_number
+	 * @return
+	 */
+    UploadRealTimeMonitoringData getLastDataById(String transaction_serial_number);
+
+	void delete(String id);
+
+	void updateById(String id);
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/BmsDemandAndChargerExportationServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/BmsDemandAndChargerExportationServiceImpl.java
new file mode 100644
index 0000000..e00ad2b
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/BmsDemandAndChargerExportationServiceImpl.java
@@ -0,0 +1,49 @@
+package com.ruoyi.order.util.mongodb.service.impl;
+
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.integration.api.model.BmsDemandAndChargerExportation;
+import com.ruoyi.order.util.mongodb.service.BmsDemandAndChargerExportationService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Service
+public class BmsDemandAndChargerExportationServiceImpl implements BmsDemandAndChargerExportationService {
+    @Autowired
+    private MongoTemplate mongoTemplate;
+    @Override
+    public int create(BmsDemandAndChargerExportation bmsDemandAndChargerExportation) {
+        mongoTemplate.save(bmsDemandAndChargerExportation);
+        return 1;
+    }
+
+    @Override
+    public BmsDemandAndChargerExportation findById(String id) {
+        return mongoTemplate.findById(id, BmsDemandAndChargerExportation.class);
+    }
+
+    @Override
+    public List<BmsDemandAndChargerExportation> findAll() {
+        return mongoTemplate.findAll(BmsDemandAndChargerExportation.class);
+    }
+    
+    
+    @Override
+    public List<BmsDemandAndChargerExportation> getBmsDemandAndChargerExportation(String orderCode) {
+        Query query = new Query();
+        if(StringUtils.isNotEmpty(orderCode)){
+            query.addCriteria(Criteria.where("transaction_serial_number").is(orderCode));
+        }
+        List<BmsDemandAndChargerExportation> uploadRealTimeMonitoringData = mongoTemplate.find(
+                query.with(Sort.by(Sort.Order.desc("create_time")))
+                , BmsDemandAndChargerExportation.class);
+        return uploadRealTimeMonitoringData;
+    }
+    
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/ChargingHandshakeServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/ChargingHandshakeServiceImpl.java
new file mode 100644
index 0000000..eeef842
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/ChargingHandshakeServiceImpl.java
@@ -0,0 +1,39 @@
+package com.ruoyi.order.util.mongodb.service.impl;
+
+import com.ruoyi.integration.api.model.ChargingHandshake;
+import com.ruoyi.order.util.mongodb.service.ChargingHandshakeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class ChargingHandshakeServiceImpl implements ChargingHandshakeService {
+    @Autowired
+    private MongoTemplate mongoTemplate;
+    @Override
+    public int create(ChargingHandshake chargingHandshake) {
+        mongoTemplate.save(chargingHandshake);
+        return 1;
+    }
+
+    @Override
+    public ChargingHandshake findById(String id) {
+        return mongoTemplate.findById(id, ChargingHandshake.class);
+    }
+
+    @Override
+    public List<ChargingHandshake> findAll() {
+        return mongoTemplate.findAll(ChargingHandshake.class);
+    }
+    
+    @Override
+    public ChargingHandshake getDataByOrderCode(String code) {
+        List<ChargingHandshake> charging_gun_code = mongoTemplate.find(new Query().addCriteria(Criteria.where("transaction_serial_number").is(code)), ChargingHandshake.class);
+        return charging_gun_code.size() > 0 ? charging_gun_code.get(0) : null;
+    }
+    
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/PlatformStartChargingReplyServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/PlatformStartChargingReplyServiceImpl.java
new file mode 100644
index 0000000..7b1e3ca
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/PlatformStartChargingReplyServiceImpl.java
@@ -0,0 +1,47 @@
+package com.ruoyi.order.util.mongodb.service.impl;
+
+import com.ruoyi.integration.api.model.PlatformStartChargingReply;
+import com.ruoyi.order.util.mongodb.service.PlatformStartChargingReplyService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class PlatformStartChargingReplyServiceImpl implements PlatformStartChargingReplyService {
+    @Autowired
+    private MongoTemplate mongoTemplate;
+
+    @Override
+    public int create(PlatformStartChargingReply platformStartChargingReply) {
+        mongoTemplate.save(platformStartChargingReply);
+        return 1;
+    }
+
+    @Override
+    public PlatformStartChargingReply findById(String id) {
+        return mongoTemplate.findById(id, PlatformStartChargingReply.class);
+    }
+
+    @Override
+    public List<PlatformStartChargingReply> findAll() {
+        return mongoTemplate.findAll(PlatformStartChargingReply.class);
+    }
+    
+    
+    /**
+     * 根据订单编号查询远程启机应答数据
+     * @param code
+     * @return
+     */
+    @Override
+    public List<PlatformStartChargingReply> getPlatformStartChargingReply(String code) {
+        Query query = new Query();
+        query.addCriteria(Criteria.where("transaction_serial_number").is(code));
+        List<PlatformStartChargingReply> platformStartChargingReplies = mongoTemplate.find(query, PlatformStartChargingReply.class);
+        return platformStartChargingReplies;
+    }
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/PlatformStopChargingReplyServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/PlatformStopChargingReplyServiceImpl.java
new file mode 100644
index 0000000..269c21c
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/PlatformStopChargingReplyServiceImpl.java
@@ -0,0 +1,48 @@
+package com.ruoyi.order.util.mongodb.service.impl;
+
+import com.ruoyi.integration.api.model.PlatformStopChargingReply;
+import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply;
+import com.ruoyi.order.util.mongodb.service.PlatformStopChargingReplyService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Service;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class PlatformStopChargingReplyServiceImpl implements PlatformStopChargingReplyService {
+    @Autowired
+    private MongoTemplate mongoTemplate;
+    @Override
+    public int create(PlatformStopChargingReply platformStopChargingReply) {
+        mongoTemplate.save(platformStopChargingReply);
+        return 1;
+    }
+
+    @Override
+    public PlatformStopChargingReply findById(String id) {
+        return mongoTemplate.findById(id, PlatformStopChargingReply.class);
+    }
+
+    @Override
+    public List<PlatformStopChargingReply> findAll() {
+        return mongoTemplate.findAll(PlatformStopChargingReply.class);
+    }
+    
+    
+    /**
+     * 根据枪编号获取
+     * @return
+     */
+    @Override
+    public PlatformStopChargingReply getPlatformStopChargingReply(GetPlatformStopChargingReply query) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        List<PlatformStopChargingReply> platformStopChargingReplies = mongoTemplate.find(new Query().addCriteria(Criteria.where("charging_pile_code").is(query.getCharging_pile_code())
+                .and("charging_gun_code").is(query.getCharging_gun_code()).and("create_time").lte(sdf.format(new Date())).gte(query.getEnd_time())), PlatformStopChargingReply.class);
+        return platformStopChargingReplies.size() > 0 ? platformStopChargingReplies.get(0) : null;
+    }
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/SecurityDetectionServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/SecurityDetectionServiceImpl.java
new file mode 100644
index 0000000..ec59a61
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/SecurityDetectionServiceImpl.java
@@ -0,0 +1,49 @@
+package com.ruoyi.order.util.mongodb.service.impl;
+
+import com.ruoyi.integration.api.model.SecurityDetection;
+import com.ruoyi.order.util.mongodb.service.SecurityDetectionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+
+/**
+ * 心跳包应答实现类
+ **/
+@Service
+public class SecurityDetectionServiceImpl implements SecurityDetectionService {
+    @Autowired
+    private MongoTemplate mongoTemplate;
+
+    @Override
+    public int create(SecurityDetection securityDetection) {
+        mongoTemplate.save(securityDetection);
+        return 1;
+    }
+
+    @Override
+    public SecurityDetection findById(String id) {
+        return mongoTemplate.findById(id, SecurityDetection.class);
+    }
+
+    @Override
+    public List<SecurityDetection> findAll() {
+        return mongoTemplate.findAll(SecurityDetection.class);
+    }
+    
+    /**
+     * 根据业务流水号查询数据
+     * @param transactionSerialNumber
+     * @return
+     */
+    @Override
+    public SecurityDetection getSecurityDetection(String transactionSerialNumber) {
+        List<SecurityDetection> securityDetectionList = mongoTemplate.find(new Query().addCriteria(Criteria.where("transaction_serial_number")
+                .is(transactionSerialNumber)), SecurityDetection.class);
+        return securityDetectionList.size() > 0 ? securityDetectionList.get(0) : null;
+    }
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/TransactionRecordServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/TransactionRecordServiceImpl.java
new file mode 100644
index 0000000..6fe533e
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/TransactionRecordServiceImpl.java
@@ -0,0 +1,51 @@
+package com.ruoyi.order.util.mongodb.service.impl;
+
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.integration.api.model.TransactionRecord;
+import com.ruoyi.order.util.mongodb.service.TransactionRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class TransactionRecordServiceImpl implements TransactionRecordService {
+    @Autowired
+    private MongoTemplate mongoTemplate;
+    @Override
+    public int create(TransactionRecord transactionRecord) {
+        mongoTemplate.save(transactionRecord);
+        return 1;
+    }
+
+    @Override
+    public TransactionRecord findById(String id) {
+        return mongoTemplate.findById(id, TransactionRecord.class);
+    }
+
+    @Override
+    public List<TransactionRecord> findAll() {
+        return mongoTemplate.findAll(TransactionRecord.class);
+    }
+    
+    /**
+     * 根据订单流水号查询数据
+     * @param code
+     * @return
+     */
+    @Override
+    public TransactionRecord findOne(String code) {
+        Query query = new Query();
+        if(StringUtils.isNotEmpty(code)){
+            query.addCriteria(Criteria.where("transaction_serial_number").is(code));
+        }
+        List<TransactionRecord> transactionRecords = mongoTemplate.find(
+                query.with(Sort.by(Sort.Order.desc("create_time")))
+                , TransactionRecord.class);
+        return transactionRecords.size() > 0 ? transactionRecords.get(0) : null;
+    }
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java
new file mode 100644
index 0000000..1e0b313
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java
@@ -0,0 +1,174 @@
+package com.ruoyi.order.util.mongodb.service.impl;
+
+import com.ruoyi.common.core.dto.MongoChargingOrderQuery;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
+import com.ruoyi.integration.api.model.UploadRealTimeMonitoringPageData;
+import com.ruoyi.order.util.mongodb.service.UploadRealTimeMonitoringDataService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.data.mongodb.core.query.Update;
+import org.springframework.stereotype.Service;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+@Service
+public class UploadRealTimeMonitoringDataServiceImpl implements UploadRealTimeMonitoringDataService {
+    @Autowired
+    private MongoTemplate mongoTemplate;
+
+    @Override
+    public int create(UploadRealTimeMonitoringData uploadRealTimeMonitoringData) {
+        mongoTemplate.save(uploadRealTimeMonitoringData);
+        return 1;
+    }
+
+    @Override
+    public UploadRealTimeMonitoringData findById(String id) {
+        return mongoTemplate.findById(id, UploadRealTimeMonitoringData.class);
+    }
+
+
+    @Override
+    public List<UploadRealTimeMonitoringData> findAll() {
+        return mongoTemplate.findAll(UploadRealTimeMonitoringData.class);
+    }
+    
+    
+    /**
+     * 根据订单号查询监控数据
+     * @param code
+     * @return
+     */
+    @Override
+    public List<UploadRealTimeMonitoringData> getDataByOrderCode(String code) {
+        Query query = new Query();
+        if(StringUtils.isNotEmpty(code)){
+            query.addCriteria(Criteria.where("transaction_serial_number").is(code));
+        }
+        List<UploadRealTimeMonitoringData> uploadRealTimeMonitoringData = mongoTemplate.find(
+                query.with(Sort.by(Sort.Order.desc("create_time")))
+                , UploadRealTimeMonitoringData.class);
+        return uploadRealTimeMonitoringData;
+    }
+
+    @Override
+    public UploadRealTimeMonitoringPageData getDataAll(MongoChargingOrderQuery mongoChargingOrderQuery) throws ParseException {
+        Query query = new Query();
+//        if (!values.isEmpty()){
+//            query.addCriteria(Criteria.where("transaction_serial_number").in(values));
+//        }
+        if (mongoChargingOrderQuery.getCode() != null && !mongoChargingOrderQuery.getCode().isEmpty()) {
+            query.addCriteria(Criteria.where("transaction_serial_number").regex(mongoChargingOrderQuery.getCode(),"i")); // "i" 表示不区分大小写
+        }
+        if (mongoChargingOrderQuery.getOrderType() !=null){
+            query.addCriteria(Criteria.where("orderType").is(mongoChargingOrderQuery.getOrderType()));
+        }
+        if (mongoChargingOrderQuery.getSiteId() != null){
+            query.addCriteria(Criteria.where("siteId").is(mongoChargingOrderQuery.getSiteId()));
+        }
+        if (!mongoChargingOrderQuery.getSiteIds().isEmpty()){
+            query.addCriteria(Criteria.where("siteId").in(mongoChargingOrderQuery.getSiteIds()));
+        }
+        if (mongoChargingOrderQuery.getChargingPileCode() != null && !mongoChargingOrderQuery.getChargingPileCode().isEmpty()) {
+            query.addCriteria(Criteria.where("charging_pile_code").is(mongoChargingOrderQuery.getChargingPileCode()));
+        }
+        if (mongoChargingOrderQuery.getChargingGunCode() != null && !mongoChargingOrderQuery.getChargingGunCode().isEmpty()){
+            query.addCriteria(Criteria.where("charging_gun_code").is(mongoChargingOrderQuery.getChargingGunCode()));
+        }
+        if (mongoChargingOrderQuery.getStatus() != null){
+            query.addCriteria(Criteria.where("status").is(mongoChargingOrderQuery.getStatus()));
+        }
+
+        if (mongoChargingOrderQuery.getCreateTime() != null) {
+            String[] split = mongoChargingOrderQuery.getCreateTime().split(" - ");
+
+            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            Date start = dateFormat.parse(split[0]);
+            Date end = dateFormat.parse(split[1]);
+            query.addCriteria(Criteria.where("create_time").gte(start).lt(end));
+        }
+
+        if (mongoChargingOrderQuery.getLastTime() != null && mongoChargingOrderQuery.getLastTime() != null) {
+            String[] split = mongoChargingOrderQuery.getLastTime().split(" - ");
+            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            Date start = dateFormat.parse(split[0]);
+            Date end = dateFormat.parse(split[1]);
+            query.addCriteria(Criteria.where("last_time").gte(start).lt(end));
+        }
+
+
+
+
+
+
+
+
+
+        long totalElements = mongoTemplate.count(query, UploadRealTimeMonitoringData.class);
+
+        // 创建带有排序的 Pageable 对象
+        Pageable pageable = PageRequest.of(
+                mongoChargingOrderQuery.getPageCurr()-1,
+                mongoChargingOrderQuery.getPageSize(),
+                Sort.by(Sort.Direction.DESC, "create_time")
+        );
+
+        // 设置分页和排序
+        query.with(pageable);
+
+        // 执行查询并获取 Page 对象
+        List<UploadRealTimeMonitoringData> page = mongoTemplate.find(query, UploadRealTimeMonitoringData.class,"upload_real_time_monitoring_data");
+
+        // 设置分页
+//        Pageable pageable = PageRequest.of(mongoChargingOrderQuery.getPageSize()*(mongoChargingOrderQuery.getPageCurr()-1), mongoChargingOrderQuery.getPageSize());
+//        query.with(pageable);
+//        query.with(Sort.by(Sort.Direction.DESC,"create_time"));
+        List<UploadRealTimeMonitoringData> uploadRealTimeMonitoringData = mongoTemplate.find(
+                query
+                , UploadRealTimeMonitoringData.class);
+
+        UploadRealTimeMonitoringPageData uploadRealTimeMonitoringPageData = new UploadRealTimeMonitoringPageData();
+        uploadRealTimeMonitoringPageData.setCount(totalElements);
+        uploadRealTimeMonitoringPageData.setRecords(page);
+        return uploadRealTimeMonitoringPageData;
+    }
+
+    @Override
+    public UploadRealTimeMonitoringData getLastDataById(String transaction_serial_number) {
+        Query query = new Query();
+        if (StringUtils.isNotEmpty(transaction_serial_number)){
+            query.addCriteria(Criteria.where("transaction_serial_number").is(transaction_serial_number));
+        }
+        // 按照 createdAt 字段降序排序
+        query.with(Sort.by(Sort.Direction.DESC, "create_time"));
+        // 限制结果只返回一条记录
+        query.limit(1);
+        return mongoTemplate.findOne(query, UploadRealTimeMonitoringData.class);
+    }
+
+    @Override
+    public void delete(String id) {
+        UploadRealTimeMonitoringData byId = findById(id.toString());
+        mongoTemplate.remove(byId);
+    }
+
+    @Override
+    public void updateById(String id) {
+        // 创建查询条件
+        Query query = new Query(Criteria.where("_id").is(id));
+        // 创建更新对象
+        Update update = new Update().set("last_time", new Date());
+        // 执行更新操作
+        mongoTemplate.updateFirst(query, update, UploadRealTimeMonitoringData.class);
+    }
+
+}

--
Gitblit v1.7.1