From cfc72c5a140e6f3dd750b28b9566c64c713806bc Mon Sep 17 00:00:00 2001
From: luodangjia <luodangjia>
Date: 星期四, 05 九月 2024 13:50:25 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java                                   |  544 +++++++
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyServiceImpl.java                |   16 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/BmsAbortMessageListener.java                      |   10 
 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TRepair.java                                          |    6 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/AccountingStrategyOrderServiceImpl.java                          |   15 
 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppCoupon.java                                                 |    3 
 ruoyi-api/ruoyi-api-chargingPile/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports  |    3 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/AccountingStrategyDetailOrderClient.java                      |   26 
 ruoyi-api/ruoyi-api-integration/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports   |    3 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderInvoiceController.java                                       |   83 +
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TRepairService.java                                     |   13 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java                                      |   29 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java                                                 |    7 
 ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml                                                    |  128 +
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderDto.java                                                          |    2 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/OrderInvoiceExport.java                                                |   79 +
 ruoyi-service/ruoyi-order/src/main/resources/bootstrap.yml                                                                            |    1 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/AccountingStrategyDetailOrderServiceImpl.java                    |   15 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java |   13 
 ruoyi-service/ruoyi-order/pom.xml                                                                                                     |   12 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/PlatformStopChargingReplyController.java               |   34 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java                                    |  102 +
 ruoyi-api/ruoyi-api-account/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports       |    3 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TFaultMessageServiceImpl.java                      |   15 
 ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/SendMessageClient.java                            |   12 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/TimingSettingMessage.java                            |   17 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderVO.java                                                   |    5 
 ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/GetPlatformStopChargingReply.java                          |   19 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderAppealController.java                                        |    1 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/AccountingStrategyOrderMapper.java                                     |   11 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java                          |   16 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyDetailServiceImpl.java          |   24 
 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyFallbackFactory.java              |   32 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/AccountingStrategyDetailOrderController.java                       |   39 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java                   |   25 
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java                                        |   10 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/EndChargeMessage.java                                |   29 
 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java                                        |    7 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TFaultMessageMapper.java                                 |   13 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java                                      |   50 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/AccountingStrategyDetailOrderMapper.java                               |   11 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/StrategyUtil.java                               |  271 ++++
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TAccountingStrategyDetailService.java                   |    8 
 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppCouponFallbackFactory.java                                 |    6 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/AccountingStrategyOrder.java                                        |   81 +
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TInviteUserController.java                                     |   48 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/controller/SendMessageController.java                       |   18 
 ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/IntegrationClient.java                            |    4 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChargingBillController.java                                        |   91 +
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ChargingListQuery.java                                                    |   32 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/AccountingStrategyDetailOrderFallbackFactory.java                 |   37 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/PlatformStopChargingReplyService.java             |    8 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TFaultMessageController.java                         |   46 
 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java                                   |    5 
 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyDetailClient.java             |   43 
 ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TRepairMapper.xml                                             |   19 
 ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/PlatformStopChargingReplyClient.java              |   27 
 ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserRoleController.java                                       |   33 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/enums/ServiceIdMenu.java                                    |   12 
 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/InviteUserFallbackFactory.java                                |   43 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoice.java                                                  |    2 
 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/InviteUserClient.java                                     |   48 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TRepairServiceImpl.java                            |   21 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/SendTagConstant.java                               |    6 
 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/GetInviteUser.java                                                 |   19 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/CP56Time2aConverter.java                        |   39 
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/SysUserRoleVo.java                                                |   49 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java                                                |    6 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoiceDetail.java                                            |   10 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/TOrderInvoiceQuery.java                                             |   41 
 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyDetailFallbackFactory.java        |   27 
 ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/IntegrationFallbackFactory.java                       |    8 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/AccountingStrategyDetailOrderService.java                             |   11 
 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/CheckChargingStrategyDTO.java                           |   19 
 ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TAccountingStrategyMapper.xml                                 |    1 
 ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/PlatformStopChargingReplyFallbackFactory.java         |   35 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingBillVO.java                                                    |   33 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/UploadRealTimeMonitoringDataMessageListener.java  |   36 
 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TParkingLot.java                                      |   12 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/MotorAbortMessageListener.java                    |   11 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TOrderInvoiceMapper.java                                               |   29 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java                                 |   15 
 ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TFaultMessageMapper.xml                                       |   16 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TRepairMapper.java                                       |   13 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TimingSettingMessageListener.java                 |   93 +
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserRoleFallbackFactory.java                                 |   26 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java                                               |   11 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/PlatformStopChargingReplyServiceImpl.java    |   15 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TOrderInvoiceVO.java                                                   |   31 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/BillingModeVerifyMessageListener.java             |   36 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TransactionRecordMessageListener.java             |   12 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/UploadRealTimeMonitoringDataService.java          |    7 
 ruoyi-service/ruoyi-integration/pom.xml                                                                                               |    4 
 ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceMapper.xml                                                     |  110 +
 ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/SendMessageFallbackFactory.java                       |    8 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TRepairController.java                               |   45 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/MessageUtil.java                                |   20 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/AccountingStrategyOrderService.java                                   |   11 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/EndChargeMessageListener.java                     |   98 +
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TOrderInvoiceService.java                                             |   26 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/EnhanceProduce.java                                |   21 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java                                            |   15 
 ruoyi-api/ruoyi-api-order/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports         |    3 
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java                                      |   28 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/ChargingOrderListInfoVO.java                                               |   13 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/AccountingStrategyDetailOrder.java                                  |   53 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyDetailController.java             |   98 +
 ruoyi-service/ruoyi-order/src/main/resources/mapper/order/AccountingStrategyDetailOrderMapper.xml                                     |   17 
 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppCouponClient.java                                      |   17 
 ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TAccountingStrategyDetailMapper.xml                           |    4 
 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyClient.java                   |   25 
 ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceDetailMapper.xml                                               |    5 
 ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserRoleClient.java                                      |   28 
 ruoyi-api/ruoyi-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports        |    1 
 /dev/null                                                                                                                             |   78 -
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrderAccountingStrategy.java                               |   13 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ChargingBillQuery.java                                                    |   37 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/AcquisitionBillingModeMessageListener.java        |   28 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java                               |   11 
 ruoyi-service/ruoyi-order/src/main/resources/mapper/order/AccountingStrategyOrderMapper.xml                                           |   23 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderQueryDto.java                                                     |    5 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java                      |    7 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TFaultMessageService.java                               |   12 
 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TFaultMessage.java                                    |    6 
 124 files changed, 3,569 insertions(+), 354 deletions(-)

diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppCouponFallbackFactory.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppCouponFallbackFactory.java
index fb8ff40..ab1d385 100644
--- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppCouponFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppCouponFallbackFactory.java
@@ -3,6 +3,7 @@
 import com.ruoyi.account.api.dto.GrantCouponDto;
 import com.ruoyi.account.api.feignClient.AppCouponClient;
 import com.ruoyi.account.api.feignClient.AppUserClient;
+import com.ruoyi.account.api.model.TAppCoupon;
 import com.ruoyi.account.api.query.ExchangeRecordGoodsQuery;
 import com.ruoyi.account.api.vo.ExchangeRecordVO;
 import com.ruoyi.common.core.domain.R;
@@ -53,6 +54,11 @@
             public R refund(String id) {
                 return R.fail("后台退款 退回优惠券失败:"+throwable.getMessage());
             }
+    
+            @Override
+            public R<TAppCoupon> getAppCouponById(Long id) {
+                return R.fail("根据id获取优惠券领取记录失败:" + throwable.getMessage());
+            }
         };
     }
 }
diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java
index 71dc82f..ab00b84 100644
--- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java
@@ -64,6 +64,11 @@
             }
 
             @Override
+            public R<List<TAppUser>> selectByPhoneLike(String phone) {
+                return R.fail("通过手机号模糊查询用户失败:"+throwable.getMessage());
+            }
+
+            @Override
             public R refundPoints(String param) {
                 return R.fail("后台兑换订单退款回退用户积分失败:"+throwable.getMessage());
             }
diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/InviteUserFallbackFactory.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/InviteUserFallbackFactory.java
new file mode 100644
index 0000000..ef781d1
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/InviteUserFallbackFactory.java
@@ -0,0 +1,43 @@
+package com.ruoyi.account.api.factory;
+
+import com.ruoyi.account.api.feignClient.InviteUserClient;
+import com.ruoyi.account.api.model.TInviteUser;
+import com.ruoyi.account.api.vo.GetInviteUser;
+import com.ruoyi.common.core.domain.R;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+
+/**
+ *
+ * @author ruoyi
+ */
+@Component
+public class InviteUserFallbackFactory implements org.springframework.cloud.openfeign.FallbackFactory<InviteUserClient>
+{
+    private static final Logger log = LoggerFactory.getLogger(InviteUserFallbackFactory.class);
+
+    @Override
+    public InviteUserClient create(Throwable throwable) {
+        log.error("邀请用户调用失败:{}", throwable.getMessage());
+        return new InviteUserClient() {
+    
+    
+            @Override
+            public R<TInviteUser> getInviteUser(GetInviteUser query) {
+                return R.fail("获取用户邀请数据失败:" + throwable.getMessage());
+            }
+    
+            @Override
+            public void updateInviteUser(TInviteUser query) {
+                R.fail("修改用户邀请数据失败:" + throwable.getMessage());
+            }
+    
+            @Override
+            public void saveInviteUser(TInviteUser query) {
+                R.fail("添加用户邀请数据失败:" + throwable.getMessage());
+            }
+        };
+    }
+}
diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppCouponClient.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppCouponClient.java
index a2d36ea..00990ee 100644
--- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppCouponClient.java
+++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppCouponClient.java
@@ -3,6 +3,7 @@
 import com.ruoyi.account.api.dto.GrantCouponDto;
 import com.ruoyi.account.api.factory.AppCouponFallbackFactory;
 import com.ruoyi.account.api.factory.AppUserFallbackFactory;
+import com.ruoyi.account.api.model.TAppCoupon;
 import com.ruoyi.account.api.query.ExchangeRecordGoodsQuery;
 import com.ruoyi.account.api.vo.ExchangeRecordVO;
 import com.ruoyi.common.core.constant.ServiceNameConstants;
@@ -12,6 +13,7 @@
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
 
@@ -46,7 +48,18 @@
      * 后台远程调用 给用户发放优惠券
      */
     @PostMapping("/t-app-coupon/grantCoupon")
-    R  grantCoupon(@RequestBody GrantCouponDto dto);
+    R grantCoupon(@RequestBody GrantCouponDto dto);
+    
+    
     @PostMapping(value = "/t-app-coupon/refund/{id}")
-     R refund(@PathVariable("id") String id);
+    R refund(@PathVariable("id") String id);
+    
+    
+    /**
+     * 根据id获取优惠券领取记录
+     * @param id
+     * @return
+     */
+    @PostMapping(value = "/t-app-coupon/getAppCouponById")
+    R<TAppCoupon> getAppCouponById(@RequestParam("id") Long id);
 }
diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java
index f7c1da1..f52c5d9 100644
--- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java
+++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java
@@ -69,6 +69,13 @@
     @GetMapping("/t-app-user/user/selectByPhone")
     R<TAppUser> selectByPhone(@RequestParam("phone") String phone);
     /**
+     * 通过手机号模糊查询用户
+     * @param phone
+     * @return
+     */
+    @GetMapping("/t-app-user/user/selectByPhoneLike")
+    R<List<TAppUser>> selectByPhoneLike(@RequestParam("phone") String phone);
+    /**
      * 远程调用 积分兑换订单 退款回退积分
      * @return
      */
diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/InviteUserClient.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/InviteUserClient.java
new file mode 100644
index 0000000..6fa93d4
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/InviteUserClient.java
@@ -0,0 +1,48 @@
+package com.ruoyi.account.api.feignClient;
+
+import com.ruoyi.account.api.factory.InviteUserFallbackFactory;
+import com.ruoyi.account.api.model.TInviteUser;
+import com.ruoyi.account.api.vo.GetInviteUser;
+import com.ruoyi.common.core.constant.ServiceNameConstants;
+import com.ruoyi.common.core.domain.R;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/9/4 17:54
+ */
+@FeignClient(contextId = "InviteUserClient", value = ServiceNameConstants.ACCOUNT_SERVICE, fallbackFactory = InviteUserFallbackFactory.class)
+public interface InviteUserClient {
+	
+	
+	/**
+	 * 获取用户邀请数据
+	 * @param query
+	 * @return
+	 */
+	@PostMapping("/t-invite-user/getInviteUser")
+	R<TInviteUser> getInviteUser(@RequestBody GetInviteUser query);
+	
+	
+	
+	
+	/**
+	 * 修改用户邀请数据
+	 * @param query
+	 * @return
+	 */
+	@PostMapping("/t-invite-user/updateInviteUser")
+	void updateInviteUser(@RequestBody TInviteUser query);
+	
+	
+	
+	/**
+	 * 添加用户邀请数据
+	 * @param query
+	 * @return
+	 */
+	@PostMapping("/t-invite-user/saveInviteUser")
+	void saveInviteUser(@RequestBody TInviteUser query);
+}
diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppCoupon.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppCoupon.java
index b3bea84..519c74a 100644
--- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppCoupon.java
+++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppCoupon.java
@@ -76,9 +76,6 @@
     @ApiModelProperty(value = "状态(1=未使用,2=已使用)")
     @TableField("status")
     private Integer status;
-    @ApiModelProperty(value = "订单id 后台发放的优惠券没有订单id")
-    @TableField("orderId")
-    private Long orderId;
 
     @ApiModelProperty(value = "当前领取优惠卷的json记录")
     @TableField("coupon_json")
diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/GetInviteUser.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/GetInviteUser.java
new file mode 100644
index 0000000..b20556b
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/GetInviteUser.java
@@ -0,0 +1,19 @@
+package com.ruoyi.account.api.vo;
+
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/9/4 17:58
+ */
+@Data
+public class GetInviteUser {
+	/**
+	 * 用户id
+	 */
+	private Long appUserId;
+	/**
+	 * 被邀请用户id
+	 */
+	private Long beInvitedAppUserId;
+}
diff --git a/ruoyi-api/ruoyi-api-account/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-api/ruoyi-api-account/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
index a0abd5c..d32b3a0 100644
--- a/ruoyi-api/ruoyi-api-account/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ b/ruoyi-api/ruoyi-api-account/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -3,4 +3,5 @@
 com.ruoyi.account.api.factory.AppUserCarFallbackFactory
 com.ruoyi.account.api.factory.AppUserIntegralChangeFallbackFactory
 com.ruoyi.account.api.factory.AppUserAddressFallbackFactory
-com.ruoyi.account.api.factory.AppUserVipDetailFallbackFactory
\ No newline at end of file
+com.ruoyi.account.api.factory.AppUserVipDetailFallbackFactory
+com.ruoyi.account.api.factory.InviteUserFallbackFactory
\ No newline at end of file
diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/CheckChargingStrategyDTO.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/CheckChargingStrategyDTO.java
new file mode 100644
index 0000000..79adcf8
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/CheckChargingStrategyDTO.java
@@ -0,0 +1,19 @@
+package com.ruoyi.chargingPile.api.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel(value = "校验计费模版是否准确DTO")
+public class CheckChargingStrategyDTO implements Serializable {
+
+    @ApiModelProperty(value = "桩编号code")
+    private String code;
+
+    @ApiModelProperty(value = "计费模型编号  id")
+    private Integer strategyDetailId;
+
+}
diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyDetailFallbackFactory.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyDetailFallbackFactory.java
index cdc9f16..844dbb9 100644
--- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyDetailFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyDetailFallbackFactory.java
@@ -1,5 +1,6 @@
 package com.ruoyi.chargingPile.api.factory;
 
+import com.ruoyi.chargingPile.api.dto.CheckChargingStrategyDTO;
 import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyDetailClient;
 import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
 import com.ruoyi.common.core.domain.R;
@@ -7,6 +8,8 @@
 import org.slf4j.LoggerFactory;
 import org.springframework.cloud.openfeign.FallbackFactory;
 import org.springframework.stereotype.Component;
+
+import java.util.List;
 
 /**
  * @author zhibing.pu
@@ -21,10 +24,30 @@
 	public AccountingStrategyDetailClient create(Throwable throwable) {
 		log.error("计费策略调用失败:{}", throwable.getMessage());
 		return new AccountingStrategyDetailClient(){
+
+			@Override
+			public R<TAccountingStrategyDetail> getDetailBySiteId(Integer siteId) {
+				return R.fail("通过站点id查询当前时段使用的策略明细失败:" + throwable.getMessage());
+			}
+
+			@Override
+			public R<TAccountingStrategyDetail> getDetailByCode(String code) {
+				return R.fail("通过桩编号查询当前时段使用的策略明细失败:" + throwable.getMessage());
+			}
+
+			@Override
+			public R<Boolean> checkChargingStrategy(CheckChargingStrategyDTO dto) {
+				return R.fail("校验充电桩计费模版是否准确失败:" + throwable.getMessage());
+			}
 			
 			@Override
-			public R<TAccountingStrategyDetail> getNowData(Integer accountingStrategyId) {
-				return R.fail("获取当前有效的计费策略明细失败:" + throwable.getMessage());
+			public R<List<TAccountingStrategyDetail>> getListByAccountingStrategyId(Integer id) {
+				throw new RuntimeException("根据计费策略主表id策略明细失败:" + throwable.getMessage());
+			}
+
+			@Override
+			public R<List<TAccountingStrategyDetail>> getDetailListByCode(String code) {
+				return R.fail("通过桩编号查询当前使用的策略明细列表失败:" + throwable.getMessage());
 			}
 		};
 	}
diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyFallbackFactory.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyFallbackFactory.java
new file mode 100644
index 0000000..108ab7d
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyFallbackFactory.java
@@ -0,0 +1,32 @@
+package com.ruoyi.chargingPile.api.factory;
+
+import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyClient;
+import com.ruoyi.chargingPile.api.model.TAccountingStrategy;
+import com.ruoyi.common.core.domain.R;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/8/28 18:33
+ */
+@Component
+public class AccountingStrategyFallbackFactory implements FallbackFactory<AccountingStrategyClient> {
+	private static final Logger log = LoggerFactory.getLogger(AccountingStrategyFallbackFactory.class);
+	
+	
+	@Override
+	public AccountingStrategyClient create(Throwable throwable) {
+		log.error("计费策略调用失败:{}", throwable.getMessage());
+		return new AccountingStrategyClient(){
+			
+			
+			@Override
+			public R<TAccountingStrategy> getAccountingStrategyById(Integer id) {
+				throw new RuntimeException("根据id查询计费策略失败:" + throwable.getMessage());
+			}
+		};
+	}
+}
diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyClient.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyClient.java
new file mode 100644
index 0000000..5e1afee
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyClient.java
@@ -0,0 +1,25 @@
+package com.ruoyi.chargingPile.api.feignClient;
+
+import com.ruoyi.chargingPile.api.factory.AccountingStrategyFallbackFactory;
+import com.ruoyi.chargingPile.api.model.TAccountingStrategy;
+import com.ruoyi.common.core.constant.ServiceNameConstants;
+import com.ruoyi.common.core.domain.R;
+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/9/4 15:51
+ */
+@FeignClient(contextId = "AccountingStrategyClient", value = ServiceNameConstants.CHARGINGPILE_SERVICE, fallbackFactory = AccountingStrategyFallbackFactory.class)
+public interface AccountingStrategyClient {
+	
+	/**
+	 * 根据id查询计费策略
+	 * @param id
+	 * @return
+	 */
+	@PostMapping("/t-accounting-strategy/getAccountingStrategyById")
+	R<TAccountingStrategy> getAccountingStrategyById(@RequestParam("id") Integer id);
+}
diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyDetailClient.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyDetailClient.java
index b63175e..94a055e 100644
--- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyDetailClient.java
+++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyDetailClient.java
@@ -1,12 +1,16 @@
 package com.ruoyi.chargingPile.api.feignClient;
 
+import com.ruoyi.chargingPile.api.dto.CheckChargingStrategyDTO;
 import com.ruoyi.chargingPile.api.factory.AccountingStrategyDetailFallbackFactory;
 import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
 import com.ruoyi.common.core.constant.ServiceNameConstants;
 import com.ruoyi.common.core.domain.R;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
 
 /**
  * @author zhibing.pu
@@ -16,11 +20,42 @@
 public interface AccountingStrategyDetailClient {
 	
 	
+	
 	/**
-	 * 获取当前有效的计费策略明细
-	 * @param accountingStrategyId
+	 * 通过站点id查询当前时段使用的策略明细
+	 * @param siteId
 	 * @return
 	 */
-	@PostMapping("/t-accounting-strategy-detail/getNowData")
-	R<TAccountingStrategyDetail> getNowData(@RequestParam("accountingStrategyId") Integer accountingStrategyId);
+	@PostMapping("/t-accounting-strategy-detail/getDetailBySiteId")
+	R<TAccountingStrategyDetail> getDetailBySiteId(@RequestParam("siteId") Integer siteId);
+	/**
+	 * 通过桩编号查询当前时段使用的策略明细
+	 * @param code
+	 * @return
+	 */
+	@PostMapping("/t-accounting-strategy-detail/getDetailByCode")
+	R<TAccountingStrategyDetail> getDetailByCode(@RequestParam("code") String code);
+	/**
+	 * 校验充电桩计费模版是否准确
+	 * @param
+	 * @return
+	 */
+	@PostMapping("/t-accounting-strategy-detail/checkChargingStrategy")
+	R<Boolean> checkChargingStrategy(@RequestBody CheckChargingStrategyDTO dto);
+	
+	
+	/**
+	 * 根据计费策略主表id策略明细
+	 * @param id
+	 * @return
+	 */
+	@PostMapping("/t-accounting-strategy-detail/getListByAccountingStrategyId")
+	R<List<TAccountingStrategyDetail>> getListByAccountingStrategyId(@RequestParam("id") Integer id);
+	/**
+	 * 通过桩编号查询当前使用的策略明细列表
+	 * @param code
+	 * @return
+	 */
+	@PostMapping("/t-accounting-strategy-detail/getDetailListByCode")
+	R<List<TAccountingStrategyDetail>> getDetailListByCode(@RequestParam("code") String code);
 }
diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TFaultMessage.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TFaultMessage.java
index 3301e51..2fd9933 100644
--- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TFaultMessage.java
+++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TFaultMessage.java
@@ -38,10 +38,16 @@
     @ApiModelProperty(value = "站点id")
     @TableField("site_id")
     private Integer siteId;
+    
+    @TableField(exist = false)
+    private String siteName;
 
     @ApiModelProperty(value = "充电桩id")
     @TableField("charging_pile_id")
     private Integer chargingPileId;
+    
+    @TableField(exist = false)
+    private String chargingPileName;
 
     @ApiModelProperty(value = "状态(1=离线,2=故障)")
     @TableField("status")
diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TParkingLot.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TParkingLot.java
index 15ecaff..288c211 100644
--- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TParkingLot.java
+++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TParkingLot.java
@@ -33,6 +33,10 @@
     @ApiModelProperty(value = "主键")
     @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
+    
+    @ApiModelProperty(value = "类型(1=自营,2=合作)")
+    @TableField("type")
+    private Integer type;
 
     @ApiModelProperty(value = "车场名称")
     @TableField("name")
@@ -41,6 +45,14 @@
     @ApiModelProperty(value = "第三方停车场编号")
     @TableField("code")
     private String code;
+    
+    @ApiModelProperty(value = "停车场标识")
+    @TableField("app_Key")
+    private String appKey;
+    
+    @ApiModelProperty(value = "停车场秘钥")
+    @TableField("secret_Key")
+    private String secretKey;
 
     @ApiModelProperty(value = "站点id")
     @TableField("site_id")
diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TRepair.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TRepair.java
index 49f609b..bc77f15 100644
--- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TRepair.java
+++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TRepair.java
@@ -37,10 +37,16 @@
     @ApiModelProperty(value = "站点id")
     @TableField("site_id")
     private Integer siteId;
+    
+    @TableField(exist = false)
+    private String siteName;
 
     @ApiModelProperty(value = "充电桩id")
     @TableField("charging_pile_id")
     private Integer chargingPileId;
+    
+    @TableField(exist = false)
+    private String chargingPileName;
 
     @ApiModelProperty(value = "报修内容")
     @TableField("content")
diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-api/ruoyi-api-chargingPile/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
index f015cf5..5e160da 100644
--- a/ruoyi-api/ruoyi-api-chargingPile/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -2,4 +2,5 @@
 com.ruoyi.chargingPile.api.factory.SiteFallbackFactory
 com.ruoyi.chargingPile.api.factory.ParkingLotFallbackFactory
 com.ruoyi.chargingPile.api.factory.ChargingGunFallbackFactory
-com.ruoyi.chargingPile.api.factory.AccountingStrategyDetailFallbackFactory
\ No newline at end of file
+com.ruoyi.chargingPile.api.factory.AccountingStrategyDetailFallbackFactory
+com.ruoyi.chargingPile.api.factory.AccountingStrategyFallbackFactory
\ No newline at end of file
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 195a34c..87a7d65 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
@@ -48,10 +48,10 @@
                 return R.fail("读取实时监测数据调用失败:" + throwable.getMessage());
             }
 
-            @Override
-            public R<String> endCharge(EndCharge endCharge) {
-                return R.fail("充电结束调用失败:" + throwable.getMessage());
-            }
+//            @Override
+//            public R<String> endCharge(EndCharge endCharge) {
+//                return R.fail("充电结束调用失败:" + throwable.getMessage());
+//            }
 
             @Override
             public R<String> platformConfirmationCharging(PlatformConfirmationCharging platformConfirmationCharging) {
diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/PlatformStopChargingReplyFallbackFactory.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/PlatformStopChargingReplyFallbackFactory.java
new file mode 100644
index 0000000..95601bc
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/PlatformStopChargingReplyFallbackFactory.java
@@ -0,0 +1,35 @@
+package com.ruoyi.integration.api.factory;
+
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.integration.api.feignClient.PlatformStopChargingReplyClient;
+import com.ruoyi.integration.api.feignClient.SendMessageClient;
+import com.ruoyi.integration.api.model.PlatformStartCharging;
+import com.ruoyi.integration.api.model.PlatformStopCharging;
+import com.ruoyi.integration.api.model.PlatformStopChargingReply;
+import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * 充电桩服务降级处理
+ *
+ * @author ruoyi
+ */
+@Component
+public class PlatformStopChargingReplyFallbackFactory implements org.springframework.cloud.openfeign.FallbackFactory<PlatformStopChargingReplyClient> {
+	private static final Logger log = LoggerFactory.getLogger(PlatformStopChargingReplyFallbackFactory.class);
+	
+	@Override
+	public PlatformStopChargingReplyClient create(Throwable throwable) {
+		log.error("远程停机命令应答失败:{}", throwable.getMessage());
+		return new PlatformStopChargingReplyClient() {
+			
+			
+			@Override
+			public R<PlatformStopChargingReply> getPlatformStopChargingReply(GetPlatformStopChargingReply query) {
+				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 8b9c02b..9db561c 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
@@ -5,6 +5,7 @@
 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 org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.cloud.openfeign.FallbackFactory;
@@ -27,9 +28,14 @@
     
     
             @Override
-            public void platformStartCharging(PlatformStartCharging platformStartCharging) {
+            public String platformStartCharging(PlatformStartCharging platformStartCharging) {
                 throw new RuntimeException("远程启机失败" + throwable.getMessage());
             }
+    
+            @Override
+            public String platformStopCharging(PlatformStopCharging platformStopCharging) {
+                throw new RuntimeException("远程停机失败" + throwable.getMessage());
+            }
         };
     }
 }
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 f8255a7..a6f1d64 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
@@ -61,8 +61,8 @@
      * @param endCharge 实体对象
      * @return
      */
-    @PostMapping("/sendMessage/sendMessageendCharge")
-    public R<String> endCharge(@RequestBody EndCharge endCharge);
+//    @PostMapping("/sendMessage/sendMessageendCharge")
+//    public R<String> endCharge(@RequestBody EndCharge endCharge);
 
     /**
      * 运营平台确认启动充电
diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/PlatformStopChargingReplyClient.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/PlatformStopChargingReplyClient.java
new file mode 100644
index 0000000..5de9b29
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/PlatformStopChargingReplyClient.java
@@ -0,0 +1,27 @@
+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.PlatformStopChargingReplyFallbackFactory;
+import com.ruoyi.integration.api.model.PlatformStopChargingReply;
+import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/9/2 17:05
+ */
+@FeignClient(contextId = "PlatformStopChargingReplyClient", value = ServiceNameConstants.INTEGRATION_SERVICE, fallbackFactory = PlatformStopChargingReplyFallbackFactory.class)
+public interface PlatformStopChargingReplyClient {
+	
+	
+	/**
+	 * 获取远程停机命令应答
+	 * @param query
+	 * @return
+	 */
+	@PostMapping("/platformStopChargingReply/getPlatformStopChargingReply")
+	R<PlatformStopChargingReply> getPlatformStopChargingReply(@RequestBody GetPlatformStopChargingReply query);
+}
diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/SendMessageClient.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/SendMessageClient.java
index c2c27be..df4db22 100644
--- a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/SendMessageClient.java
+++ b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/SendMessageClient.java
@@ -3,6 +3,7 @@
 import com.ruoyi.common.core.constant.ServiceNameConstants;
 import com.ruoyi.integration.api.factory.SendMessageFallbackFactory;
 import com.ruoyi.integration.api.model.PlatformStartCharging;
+import com.ruoyi.integration.api.model.PlatformStopCharging;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -21,5 +22,14 @@
 	 * @return
 	 */
 	@PostMapping("/sendMessage/platformStartCharging")
-	void platformStartCharging(@RequestBody PlatformStartCharging platformStartCharging);
+	String platformStartCharging(@RequestBody PlatformStartCharging platformStartCharging);
+	
+	
+	/**
+	 * 远程控制停机
+	 * @param platformStopCharging
+	 * @return
+	 */
+	@PostMapping("/sendMessage/platformStopCharging")
+	String platformStopCharging(@RequestBody PlatformStopCharging platformStopCharging);
 }
diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/GetPlatformStopChargingReply.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/GetPlatformStopChargingReply.java
new file mode 100644
index 0000000..dab2854
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/GetPlatformStopChargingReply.java
@@ -0,0 +1,19 @@
+package com.ruoyi.integration.api.vo;
+
+import lombok.Data;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/9/2 17:00
+ */
+@Data
+public class GetPlatformStopChargingReply {
+	/**
+	 * 充电桩编号
+	 */
+	private String charging_pile_code;
+	/**
+	 * 充电枪编号
+	 */
+	private String charging_gun_code;
+}
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 6cc32c5..a17191b 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
@@ -2,4 +2,5 @@
 com.ruoyi.integration.api.factory.UploadRealTimeMonitoringDataFallbackFactory
 com.ruoyi.integration.api.factory.ChargingHandshakeFallbackFactory
 com.ruoyi.integration.api.factory.SendMessageFallbackFactory
-com.ruoyi.integration.api.factory.PlatformStartChargingReplyFallbackFactory
\ No newline at end of file
+com.ruoyi.integration.api.factory.PlatformStartChargingReplyFallbackFactory
+com.ruoyi.integration.api.factory.PlatformStopChargingReplyFallbackFactory
\ No newline at end of file
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/AccountingStrategyDetailOrderFallbackFactory.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/AccountingStrategyDetailOrderFallbackFactory.java
new file mode 100644
index 0000000..d08a51c
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/AccountingStrategyDetailOrderFallbackFactory.java
@@ -0,0 +1,37 @@
+package com.ruoyi.order.api.factory;
+
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.order.api.feignClient.AccountingStrategyDetailOrderClient;
+import com.ruoyi.order.api.feignClient.ChargingOrderAccountingStrategyClient;
+import com.ruoyi.order.api.model.AccountingStrategyDetailOrder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 充电订单服务降级处理
+ * 
+ * @author ruoyi
+ */
+@Component
+public class AccountingStrategyDetailOrderFallbackFactory implements org.springframework.cloud.openfeign.FallbackFactory<AccountingStrategyDetailOrderClient>
+{
+    private static final Logger log = LoggerFactory.getLogger(AccountingStrategyDetailOrderFallbackFactory.class);
+
+    @Override
+    public AccountingStrategyDetailOrderClient create(Throwable throwable) {
+        log.error("计费策略调用失败:{}", throwable.getMessage());
+        return new AccountingStrategyDetailOrderClient() {
+    
+    
+            @Override
+            public R<AccountingStrategyDetailOrder> getNowAccountingStrategyDetailOrder(Long orderId) {
+                return R.fail("根据订单id获取当前有效的策略失败:" + throwable.getMessage());
+            }
+        };
+    }
+}
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
index 8738bb2..d53879f 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
@@ -68,6 +68,21 @@
             @Override
             public void chargeMonitoring(UploadRealTimeMonitoringDataQuery query) {
             }
+
+            @Override
+            public R<TChargingOrder> getOrderByCode(String code) {
+                return R.fail("通过流水号查询订单调用失败:" + throwable.getMessage());
+            }
+    
+            @Override
+            public void endCharge(String code) {
+        
+            }
+    
+            @Override
+            public void excelEndCharge(String code) {
+        
+            }
         };
     }
 }
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/AccountingStrategyDetailOrderClient.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/AccountingStrategyDetailOrderClient.java
new file mode 100644
index 0000000..dd73fbc
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/AccountingStrategyDetailOrderClient.java
@@ -0,0 +1,26 @@
+package com.ruoyi.order.api.feignClient;
+
+import com.ruoyi.common.core.constant.ServiceNameConstants;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.order.api.factory.AccountingStrategyDetailOrderFallbackFactory;
+import com.ruoyi.order.api.model.AccountingStrategyDetailOrder;
+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/9/4 16:11
+ */
+@FeignClient(contextId = "AccountingStrategyDetailOrderClient", value = ServiceNameConstants.ORDER_SERVICE, fallbackFactory = AccountingStrategyDetailOrderFallbackFactory.class)
+public interface AccountingStrategyDetailOrderClient {
+	
+	
+	/**
+	 * 根据订单id获取当前有效的策略
+	 * @param orderId
+	 * @return
+	 */
+	@PostMapping("/accountingStrategyDetailOrder/getNowAccountingStrategyDetailOrder")
+	R<AccountingStrategyDetailOrder> getNowAccountingStrategyDetailOrder(@RequestParam("orderId") Long orderId);
+}
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
index 96340a0..591a275 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
@@ -9,10 +9,7 @@
 import com.ruoyi.order.api.query.TChargingCountQuery;
 import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery;
 import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
@@ -70,4 +67,28 @@
      */
     @PostMapping(value = "/t-charging-order/chargeMonitoring")
     void chargeMonitoring(@RequestBody UploadRealTimeMonitoringDataQuery query);
+
+    /**
+     * 通过流水号查询订单
+     * @param code
+     * @return
+     */
+    @PostMapping(value = "/t-charging-order/getOrderByCode/{code}")
+    R<TChargingOrder> getOrderByCode(@PathVariable("code") String code);
+    
+    
+    /**
+     * 充电解释后处理逻辑
+     * @param code
+     */
+    @PostMapping("/t-charging-order/endCharge")
+    void endCharge(@RequestParam("code") String code);
+    
+    
+    /**
+     * 硬件异常结束充电后的处理逻辑
+     * @param code
+     */
+    @PostMapping("/t-charging-order/excelEndCharge")
+    void excelEndCharge(@RequestParam("code") String code);
 }
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/AccountingStrategyDetailOrder.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/AccountingStrategyDetailOrder.java
new file mode 100644
index 0000000..abe6a4f
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/AccountingStrategyDetailOrder.java
@@ -0,0 +1,53 @@
+package com.ruoyi.order.api.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/9/3 14:00
+ */
+@Data
+@TableName("t_accounting_strategy_detail_order")
+public class AccountingStrategyDetailOrder {
+	/**
+	 * 主键
+	 */
+	@TableField(value = "id")
+	private Integer id;
+	@ApiModelProperty(value = "策略id")
+	@TableField("accounting_strategy_id")
+	private Integer accountingStrategyId;
+	
+	@ApiModelProperty(value = "阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段)")
+	@TableField("type")
+	private Integer type;
+	
+	@ApiModelProperty(value = "开始时间")
+	@TableField("start_time")
+	private String startTime;
+	
+	@ApiModelProperty(value = "结束时间")
+	@TableField("end_time")
+	private String endTime;
+	
+	@ApiModelProperty(value = "电价")
+	@TableField("electrovalence")
+	private BigDecimal electrovalence;
+	
+	@ApiModelProperty(value = "服务费")
+	@TableField("service_charge")
+	private BigDecimal serviceCharge;
+	
+	@ApiModelProperty(value = "原价服务费")
+	@TableField("cost_service_charge")
+	private BigDecimal costServiceCharge;
+	
+	@ApiModelProperty(value = "充电订单id")
+	@TableField("charging_order_id")
+	private Long chargingOrderId;
+}
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/AccountingStrategyOrder.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/AccountingStrategyOrder.java
new file mode 100644
index 0000000..f8d1dcf
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/AccountingStrategyOrder.java
@@ -0,0 +1,81 @@
+package com.ruoyi.order.api.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.core.web.domain.BasePojo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/9/3 14:13
+ */
+@Data
+@TableName("t_accounting_strategy_order")
+public class AccountingStrategyOrder extends BasePojo {
+	
+	@ApiModelProperty(value = "主键")
+	@TableField(value = "id")
+	private Integer id;
+	
+	@ApiModelProperty(value = "站点id")
+	@TableField("site_id")
+	private Integer siteId;
+	
+	@ApiModelProperty(value = "申请人id")
+	@TableField("user_id")
+	private Long userId;
+	
+	@ApiModelProperty(value = "策略名称")
+	@TableField("name")
+	private String name;
+	
+	@ApiModelProperty(value = "策略说明")
+	@TableField("description")
+	private String description;
+	
+	@ApiModelProperty(value = "会员折扣")
+	@TableField("discount")
+	private BigDecimal discount;
+	
+	@ApiModelProperty(value = "一级审核用户id")
+	@TableField("first_user_id")
+	private Long firstUserId;
+	
+	@ApiModelProperty(value = "二级审核用户id")
+	@TableField("two_user_id")
+	private Long twoUserId;
+	
+	@ApiModelProperty(value = "一级审核备注")
+	@TableField("first_remark")
+	private String firstRemark;
+	
+	@ApiModelProperty(value = "二级审核备注")
+	@TableField("two_remark")
+	private String twoRemark;
+	
+	@ApiModelProperty(value = "审核状态(1=待审核一级,2=待审核二级,3=审核通过,4=驳回)")
+	@TableField("audit_status")
+	private Integer auditStatus;
+	
+	@ApiModelProperty(value = "一级审核时间")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("first_audit_time")
+	private LocalDateTime firstAuditTime;
+	
+	@ApiModelProperty(value = "二级审核时间")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	@TableField("two_audit_time")
+	private LocalDateTime twoAuditTime;
+	
+	@ApiModelProperty(value = "充电订单id")
+	@TableField("charging_order_id")
+	private Long chargingOrderId;
+}
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java
index 894820f..0059cad 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java
@@ -122,7 +122,11 @@
     @ApiModelProperty(value = "充值支付第三方流水号")
     @TableField("recharge_serial_number")
     private String rechargeSerialNumber;
-
+    
+    @ApiModelProperty(value = "充电金额(传给硬件方的金额)")
+    @TableField("charge_amount")
+    private BigDecimal chargeAmount;
+    
     @ApiModelProperty(value = "剩余金额(用于前端展示)")
     @TableField("residual_amount")
     private BigDecimal residualAmount;
@@ -185,4 +189,5 @@
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @TableField("pay_time")
     private LocalDateTime payTime;
+
 }
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrderAccountingStrategy.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrderAccountingStrategy.java
index 68c2568..b616194 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrderAccountingStrategy.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrderAccountingStrategy.java
@@ -11,6 +11,7 @@
 
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
 
 /**
  * <p>
@@ -35,6 +36,10 @@
     @ApiModelProperty(value = "充电订单id")
     @TableField("charging_order_id")
     private Long chargingOrderId;
+    
+    @ApiModelProperty(value = "计费策略明细id")
+    @TableField("accounting_strategy_detail_id")
+    private Integer accountingStrategyDetailId;
 
     @ApiModelProperty(value = "阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段)")
     @TableField("type")
@@ -71,6 +76,14 @@
     @ApiModelProperty(value = "时段服务费")
     @TableField("period_service_price")
     private BigDecimal periodServicePrice;
+    
+    @ApiModelProperty(value = "时段原服务费(不含折扣)")
+    @TableField("period_original_service_price")
+    private BigDecimal periodOriginalServicePrice;
+    
+    @ApiModelProperty(value = "首次添加时间")
+    @TableField("create_time")
+    private LocalDateTime createTime;
 
     @ApiModelProperty(value = "会员抵扣")
     @TableField(exist = false)
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoice.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoice.java
index 280b1b0..5eef671 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoice.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoice.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -114,6 +115,7 @@
     private LocalDateTime createTime;
     
     @ApiModelProperty(value = "开票时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @TableField("billing_time")
     private LocalDateTime billingTime;
     
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoiceDetail.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoiceDetail.java
index 6566de9..c28f9ce 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoiceDetail.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoiceDetail.java
@@ -59,6 +59,14 @@
     @ApiModelProperty(value = "增值服务费税率")
     @TableField("added_service_tariff")
     private BigDecimal addedServiceTariff;
-
+    @ApiModelProperty(value = "'电费'")
+    @TableField("electrovalence")
+    private BigDecimal electrovalence;
+    @ApiModelProperty(value = "'服务费'")
+    @TableField("service_charge")
+    private BigDecimal serviceCharge;
+    @ApiModelProperty(value = "'增值服务费'")
+    @TableField("added_service")
+    private BigDecimal addedService;
 
 }
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/TOrderInvoiceQuery.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/TOrderInvoiceQuery.java
new file mode 100644
index 0000000..f1bad4a
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/TOrderInvoiceQuery.java
@@ -0,0 +1,41 @@
+package com.ruoyi.order.api.query;
+
+import com.ruoyi.common.core.query.TimeRangePageQuery;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel(value = "发票管理Query")
+public class TOrderInvoiceQuery extends TimeRangePageQuery {
+
+    @ApiModelProperty(value = "开票公司")
+    private String invoicingCompany;
+
+    @ApiModelProperty(value = "发票类型")
+    private String invoiceType;
+
+    @ApiModelProperty(value = "抬头类型(1=个人,2=企业)")
+    private Integer invoicingObjectType;
+
+    @ApiModelProperty(value = "发票种类(1=纸质发票,2=电子发票)")
+    private Integer invoiceMaterial;
+
+    @ApiModelProperty(value = "开票方式(1=人工,2=自动)")
+    private Integer invoicingMethod;
+
+    @ApiModelProperty(value = "申请人电话")
+    private String userPhone;
+
+    @ApiModelProperty(value = "申请人姓名")
+    private String nickName;
+
+    @ApiModelProperty(value = "公司名称")
+    private String name;
+
+    @ApiModelProperty(value = "用户id 前端忽略")
+    private List<Long> userIds;
+
+}
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingBillVO.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingBillVO.java
new file mode 100644
index 0000000..ab1c46f
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingBillVO.java
@@ -0,0 +1,33 @@
+package com.ruoyi.order.api.vo;
+
+import com.ruoyi.common.core.web.page.PageInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@ApiModel(value = "ChargingBillVO对象",description = "充电算帐单")
+public class ChargingBillVO {
+    @ApiModelProperty(value = "充电总度数")
+    private BigDecimal chargingCapacity;
+    @ApiModelProperty(value = "实收金额")
+    private BigDecimal paymentAmount;
+    @ApiModelProperty(value = "订单总金额")
+    private BigDecimal orderAmount;
+    @ApiModelProperty(value = "累计电费")
+    private BigDecimal electrovalence;
+    @ApiModelProperty(value = "累计服务费")
+    private BigDecimal serviceCharge;
+    @ApiModelProperty(value = "订单数量")
+    private Integer orderCount;
+    @ApiModelProperty(value = "平台手续费")
+    private String commissionAmount;
+    @ApiModelProperty(value = "三方平台分佣")
+    private String sharingAmount;
+    @ApiModelProperty(value = "优惠抵扣")
+    private String discount;
+    @ApiModelProperty(value = "列表数据")
+    private PageInfo<ChargingOrderListVO> list;
+}
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderVO.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderVO.java
index 1c5ba30..61ba66b 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderVO.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderVO.java
@@ -30,10 +30,7 @@
     @ApiModelProperty(value = "手机号")
     private String phone;
 
-    @ApiModelProperty(value = "累计电费")
-    private BigDecimal electrovalence;
-    @ApiModelProperty(value = "累计服务费")
-    private BigDecimal serviceCharge;
+
     @ApiModelProperty(value = "时段数")
     private Integer count;
     @ApiModelProperty(value = "1明星充电 2快电 3新电途")
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TOrderInvoiceVO.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TOrderInvoiceVO.java
new file mode 100644
index 0000000..690a19c
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TOrderInvoiceVO.java
@@ -0,0 +1,31 @@
+package com.ruoyi.order.api.vo;
+
+import com.ruoyi.order.api.model.TOrderInvoice;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@ApiModel(value = "发票管理VO")
+public class TOrderInvoiceVO extends TOrderInvoice {
+
+    @ApiModelProperty(value = "电费税率")
+    private BigDecimal electricityTariff;
+
+    @ApiModelProperty(value = "服务费税率")
+    private BigDecimal serviceTariff;
+
+    @ApiModelProperty(value = "增值服务费税率")
+    private BigDecimal addedServiceTariff;
+    @ApiModelProperty(value = "电费")
+    private BigDecimal electrovalence;
+    @ApiModelProperty(value = "服务费")
+    private BigDecimal serviceCharge;
+    @ApiModelProperty(value = "增值服务费")
+    private BigDecimal addedService;
+    @ApiModelProperty(value = "用户电话")
+    private String userPhone;
+
+}
diff --git a/ruoyi-api/ruoyi-api-order/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-api/ruoyi-api-order/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
index 1a46e82..d5bf5d5 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ b/ruoyi-api/ruoyi-api-order/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -1,4 +1,5 @@
 com.ruoyi.order.api.factory.ChargingOrderFallbackFactory
 com.ruoyi.order.api.factory.OrderFallbackFactory
 com.ruoyi.order.api.factory.ExchangeOrderFallbackFactory
-com.ruoyi.order.api.factory.ChargingOrderAccountingStrategyFallbackFactory
\ No newline at end of file
+com.ruoyi.order.api.factory.ChargingOrderAccountingStrategyFallbackFactory
+com.ruoyi.order.api.factory.AccountingStrategyDetailOrderFallbackFactory
\ No newline at end of file
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserRoleFallbackFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserRoleFallbackFactory.java
new file mode 100644
index 0000000..6e743e9
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserRoleFallbackFactory.java
@@ -0,0 +1,26 @@
+package com.ruoyi.system.api.factory;
+
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.system.api.domain.SysRole;
+import com.ruoyi.system.api.domain.SysUser;
+import com.ruoyi.system.api.feignClient.SysUserClient;
+import com.ruoyi.system.api.feignClient.SysUserRoleClient;
+import com.ruoyi.system.api.model.*;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+public class SysUserRoleFallbackFactory implements org.springframework.cloud.openfeign.FallbackFactory<SysUserRoleClient> {
+    @Override
+    public SysUserRoleClient create(Throwable cause) {
+        return new SysUserRoleClient(){
+
+
+            @Override
+            public R<List<SysUserRoleVo>> getRoleByUserId(Long userId) {
+                return R.fail("根据用户id获取角色失败:" + cause.getMessage());
+            }
+        };
+    }
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserRoleClient.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserRoleClient.java
new file mode 100644
index 0000000..c14542b
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserRoleClient.java
@@ -0,0 +1,28 @@
+package com.ruoyi.system.api.feignClient;
+
+import com.ruoyi.common.core.constant.ServiceNameConstants;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.system.api.factory.SysUserRoleFallbackFactory;
+import com.ruoyi.system.api.model.SysUserRoleVo;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+/**
+ * @author zhibing.pu
+ * @date 2024/9/4 9:49
+ */
+@FeignClient(contextId = "SysUserRoleClient", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = SysUserRoleFallbackFactory.class)
+public interface SysUserRoleClient {
+
+
+    /**
+     * 根据用户id获取角色
+     * @param userId
+     * @return
+     */
+    @PostMapping("/userRole/getRoleByUserId")
+    R<List<SysUserRoleVo>> getRoleByUserId(@RequestParam("userId") Long userId);
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/SysUserRoleVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/SysUserRoleVo.java
new file mode 100644
index 0000000..9c850d1
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/SysUserRoleVo.java
@@ -0,0 +1,49 @@
+package com.ruoyi.system.api.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 用户和角色关联 sys_user_role
+ * 
+ * @author ruoyi
+ */
+public class SysUserRoleVo
+{
+    /** 用户ID */
+    @TableField("user_id")
+    private Long userId;
+    
+    /** 角色ID */
+    @TableField("role_id")
+    private Long roleId;
+
+    public Long getUserId()
+    {
+        return userId;
+    }
+
+    public void setUserId(Long userId)
+    {
+        this.userId = userId;
+    }
+
+    public Long getRoleId()
+    {
+        return roleId;
+    }
+
+    public void setRoleId(Long roleId)
+    {
+        this.roleId = roleId;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("userId", getUserId())
+            .append("roleId", getRoleId())
+            .toString();
+    }
+}
diff --git a/ruoyi-api/ruoyi-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-api/ruoyi-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
index 4dfeaf3..89b7d3a 100644
--- a/ruoyi-api/ruoyi-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ b/ruoyi-api/ruoyi-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -4,3 +4,4 @@
 com.ruoyi.system.api.factory.SysUserFallbackFactory
 com.ruoyi.system.api.factory.SysRoleFallbackFactory
 com.ruoyi.system.api.factory.SysLoginLogFallbackFactory
+com.ruoyi.system.api.factory.SysUserRoleFallbackFactory
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java
index 9c314ca..230ce8a 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java
@@ -372,5 +372,16 @@
         return LocalTime.parse(time, formatter);
     }
 
+    /**
+     * localdatetime转为字符串
+     *
+     * @param time localdatetime
+     * @return 字符串
+     */
+    public static String localDateTimeToString(LocalDateTime time) {
+        DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        return df.format(time);
+    }
+
 
 }
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserRoleController.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserRoleController.java
index b0ef148..4bd9ba1 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserRoleController.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserRoleController.java
@@ -1,20 +1,19 @@
 package com.ruoyi.system.controller;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.io.IOException;
 import javax.servlet.http.HttpServletResponse;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.system.api.model.SysUserRoleVo;
 import com.ruoyi.system.domain.SysUserRole;
 import com.ruoyi.system.service.ISysUserRoleService;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import com.ruoyi.common.log.annotation.Log;
 import com.ruoyi.common.log.enums.BusinessType;
 import com.ruoyi.common.security.annotation.RequiresPermissions;
@@ -96,4 +95,22 @@
 	public AjaxResult remove(@PathVariable Long[] userIds) {
 		return toAjax(sysUserRoleService.deleteSysUserRoleByUserIds(userIds));
 	}
+
+
+	/**
+	 * 根据用户id获取角色
+	 * @param userId
+	 * @return
+	 */
+	@PostMapping("/getRoleByUserId")
+	public R<List<SysUserRoleVo>> getRoleByUserId(@RequestParam("userId") Long userId){
+		List<SysUserRole> list = sysUserRoleService.list(new LambdaQueryWrapper<SysUserRole>().eq(SysUserRole::getUserId, userId));
+		List<SysUserRoleVo> data = new ArrayList<>();
+		for (SysUserRole sysUserRole : list) {
+			SysUserRoleVo vo = new SysUserRoleVo();
+			BeanUtils.copyProperties(sysUserRole, vo);
+			data.add(vo);
+		}
+		return R.ok(data);
+	}
 }
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java
index 6288f56..283a412 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java
@@ -65,13 +65,18 @@
     private TAppUserCarService appUserCarService;
     @Autowired
     private TokenService tokenService;
-    @Autowired
+    @Resource
     private ChargingPileClient chargingPileClient;
-    @Autowired
+    @Resource
     private ChargingOrderClient chargingOrderClient;
-
     @Resource
     private ChargingGunClient chargingGunClient;
+    
+    @Autowired
+    private TAppUserTagService appUserTagService;
+    @Autowired
+    private TAppUserService appUserService;
+    
 
     /**
      * 后台退款 回退优惠券使用状态
@@ -208,10 +213,7 @@
         return R.ok(tAppCouponService.lambdaQuery().le(TAppCoupon::getStartTime, now).ge(TAppCoupon::getEndTime, now).eq(TAppCoupon::getStatus, 1).count());
     }
 
-    @Autowired
-    private TAppUserTagService appUserTagService;
-    @Autowired
-    private TAppUserService appUserService;
+    
 
     /**
      * 后台远程调用 给用户发放优惠券
@@ -275,5 +277,17 @@
 
         return R.ok();
     }
+    
+    
+    /**
+     * 根据id获取优惠券领取记录
+     * @param id
+     * @return
+     */
+    @PostMapping("/getAppCouponById")
+    public R<TAppCoupon> getAppCouponById(@RequestParam("id") Long id){
+        TAppCoupon appCoupon = tAppCouponService.getById(id);
+        return R.ok(appCoupon);
+    }
 }
 
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
index 93d83d5..c40aeb7 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
@@ -725,6 +725,16 @@
                 .eq(TAppUser::getPhone,phone)
                 .last("LIMIT 1")));
     }
+    /**
+     * 通过手机号模糊查询用户
+     * @param phone
+     * @return
+     */
+    @GetMapping("/user/selectByPhoneLike")
+    public R<List<TAppUser>> selectByPhoneLike(@RequestParam("phone") String phone){
+        return R.ok(appUserService.list(Wrappers.lambdaQuery(TAppUser.class)
+                .eq(TAppUser::getPhone,phone)));
+    }
 
     @ApiOperation(value = "签到", tags = {"小程序-个人中心-签到"})
     @GetMapping(value = "/user/sign")
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TInviteUserController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TInviteUserController.java
index a9d9cd4..cb1aa05 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TInviteUserController.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TInviteUserController.java
@@ -1,8 +1,17 @@
 package com.ruoyi.account.controller;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.account.api.model.TInviteUser;
+import com.ruoyi.account.api.vo.GetInviteUser;
+import com.ruoyi.account.service.TInviteUserService;
+import com.ruoyi.common.core.domain.R;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
 
 /**
  * <p>
@@ -15,6 +24,43 @@
 @RestController
 @RequestMapping("/t-invite-user")
 public class TInviteUserController {
-
+	
+	@Resource
+	private TInviteUserService inviteUserService;
+	
+	
+	
+	
+	/**
+	 * 获取用户邀请数据
+	 * @param query
+	 * @return
+	 */
+	@PostMapping("/getInviteUser")
+	public R<TInviteUser> getInviteUser(@RequestBody GetInviteUser query){
+		TInviteUser one = inviteUserService.getOne(new LambdaQueryWrapper<TInviteUser>().eq(TInviteUser::getAppUserId, query.getBeInvitedAppUserId())
+				.eq(TInviteUser::getBeInvitedAppUserId, query.getBeInvitedAppUserId()));
+		return R.ok(one);
+	}
+	
+	
+	/**
+	 * 修改邀请数据
+	 * @param query
+	 */
+	@PostMapping("/updateInviteUser")
+	public void updateInviteUser(@RequestBody TInviteUser query){
+		inviteUserService.updateById(query);
+	}
+	
+	
+	/**
+	 * 添加邀请数据
+	 * @param query
+	 */
+	@PostMapping("/saveInviteUser")
+	public void saveInviteUser(@RequestBody TInviteUser query){
+		inviteUserService.save(query);
+	}
 }
 
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java
index bac569b..e326bf4 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java
@@ -92,7 +92,7 @@
     public AjaxResult<List<TAccountingStrategyDetailVO>> queryAccountingStrategyDetailByStrategyId(@RequestParam("strategyId") Integer strategyId) {
         List<TAccountingStrategyDetailVO> list = accountingStrategyDetailService.queryAccountingStrategyDetailByStrategyId(strategyId);
         list.forEach(detail -> {
-            detail.setTotalPrice(detail.getElectrovalence().add(detail.getElectrovalence()));
+            detail.setTotalPrice(detail.getElectrovalence().add(detail.getServiceCharge()));
         });
         return AjaxResult.ok(list);
     }
@@ -110,6 +110,11 @@
         Boolean flag = accountingStrategyDetailService.isStrategy24Hour(dto.getAccountingStrategyDetails());
         if(flag){
             return AjaxResult.error("计费模板时间设置有误差");
+        }
+        // 判断同阶段是否价格不一致
+        Boolean flag1 = accountingStrategyDetailService.isStrategyPriceConsistent(dto.getAccountingStrategyDetails());
+        if(!flag1){
+            return AjaxResult.error("同阶段费率值需一致");
         }
         Long userId = SecurityUtils.getLoginUser().getUserid();
         dto.setUserId(userId);
@@ -130,6 +135,11 @@
         Boolean flag = accountingStrategyDetailService.isStrategy24Hour(dto.getAccountingStrategyDetails());
         if(flag){
             return AjaxResult.error("计费模板时间设置有误差");
+        }
+        // 判断同阶段是否价格不一致
+        Boolean flag1 = accountingStrategyDetailService.isStrategyPriceConsistent(dto.getAccountingStrategyDetails());
+        if(!flag1){
+            return AjaxResult.error("同阶段费率值需一致");
         }
         // 判断修改的计费策略是否为已通过
         if(dto.getAuditStatus() == 3 || dto.getAuditStatus() == 4){
@@ -411,5 +421,18 @@
 
         return R.ok(res);
     }
+    
+    
+    /**
+     * 根据id查询数据
+     * @param id
+     * @return
+     */
+    @PostMapping(value = "/getAccountingStrategyById")
+    public R<TAccountingStrategy> getAccountingStrategyById(@RequestParam("id") Integer id) {
+        TAccountingStrategy accountingStrategy = accountingStrategyService.getById(id);
+        return R.ok(accountingStrategy);
+    }
+    
 }
 
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 5234673..35c031e 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
@@ -3,14 +3,17 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.chargingPile.api.dto.CheckChargingStrategyDTO;
 import com.ruoyi.chargingPile.api.model.Site;
 import com.ruoyi.chargingPile.api.model.TAccountingStrategy;
 import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
+import com.ruoyi.chargingPile.api.model.TChargingPile;
 import com.ruoyi.chargingPile.api.vo.StrategyPriceVO;
 import com.ruoyi.chargingPile.api.vo.TAccountingStrategyDetailVO;
 import com.ruoyi.chargingPile.service.ISiteService;
 import com.ruoyi.chargingPile.service.TAccountingStrategyDetailService;
 import com.ruoyi.chargingPile.service.TAccountingStrategyService;
+import com.ruoyi.chargingPile.service.TChargingPileService;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.exception.ServiceException;
 import com.ruoyi.common.core.web.domain.AjaxResult;
@@ -36,12 +39,14 @@
 public class TAccountingStrategyDetailController {
 
     private final ISiteService siteService;
+    private final TChargingPileService chargingPileService;
     private final TAccountingStrategyService accountingStrategyService;
     private final TAccountingStrategyDetailService accountingStrategyDetailService;
 
     @Autowired
-    public TAccountingStrategyDetailController(ISiteService siteService, TAccountingStrategyService accountingStrategyService, TAccountingStrategyDetailService accountingStrategyDetailService) {
+    public TAccountingStrategyDetailController(ISiteService siteService, TChargingPileService chargingPileService, TAccountingStrategyService accountingStrategyService, TAccountingStrategyDetailService accountingStrategyDetailService) {
         this.siteService = siteService;
+        this.chargingPileService = chargingPileService;
         this.accountingStrategyService = accountingStrategyService;
         this.accountingStrategyDetailService = accountingStrategyDetailService;
     }
@@ -79,17 +84,96 @@
     }
     
     
+   
+
     /**
-     * 获取当前有效的计费模板
-     * @param accountingStrategyId
+     * 通过站点id查询当前时段使用的策略明细
+     * @param siteId
      * @return
      */
-    @PostMapping("/getNowData")
-    public R<TAccountingStrategyDetail> getNowData(@RequestParam("accountingStrategyId") Integer accountingStrategyId){
-        TAccountingStrategyDetail one = accountingStrategyDetailService.getOne(new LambdaQueryWrapper<TAccountingStrategyDetail>()
-                .eq(TAccountingStrategyDetail::getAccountingStrategyId, accountingStrategyId)
+    @PostMapping("/getDetailBySiteId")
+    public R<TAccountingStrategyDetail> getDetailBySiteId(@RequestParam("siteId") Integer siteId){
+        Site site = siteService.getById(siteId);
+        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"));
         return R.ok(one);
     }
+    /**
+     * 通过桩id查询当前时段使用的策略明细
+     * @param code 设备编号
+     * @return
+     */
+    @PostMapping("/getDetailByCode")
+    public R<TAccountingStrategyDetail> getDetailByPileId(@RequestParam("code") String code){
+        // 查询桩
+        TChargingPile chargingPile = chargingPileService.getOne(Wrappers.lambdaQuery(TChargingPile.class)
+                .eq(TChargingPile::getCode,code)
+                .last("LIMIT 1"));
+        if(Objects.isNull(chargingPile)){
+            return R.fail("未查询到该桩设备");
+        }
+        Site site = siteService.getById(chargingPile.getSiteId());
+        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"));
+        return R.ok(one);
+    }
+    /**
+     * 校验充电桩计费模版是否准确
+     * @param
+     * @return
+     */
+    @PostMapping("/checkChargingStrategy")
+    public R<Boolean> checkChargingStrategy(@RequestBody CheckChargingStrategyDTO dto){
+        // 查询桩
+        TChargingPile chargingPile = chargingPileService.getOne(Wrappers.lambdaQuery(TChargingPile.class)
+                .eq(TChargingPile::getCode,dto.getCode())
+                .last("LIMIT 1"));
+        if(Objects.isNull(chargingPile)){
+            return R.ok(false);
+        }
+        Site site = siteService.getById(chargingPile.getSiteId());
+        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"));
+        return R.ok(dto.getStrategyDetailId().equals(one.getId()));
+    }
+    
+    
+    /**
+     * 根据计费策略主表id策略明细
+     * @param id
+     * @return
+     */
+    @PostMapping("/getListByAccountingStrategyId")
+    public R<List<TAccountingStrategyDetail>> getListByAccountingStrategyId(@RequestParam("id") Integer id){
+        List<TAccountingStrategyDetail> list = accountingStrategyDetailService.list(new LambdaQueryWrapper<TAccountingStrategyDetail>().eq(TAccountingStrategyDetail::getAccountingStrategyId, id));
+        return R.ok(list);
+    }
+
+    /**
+     * 通过桩编号查询当前使用的策略明细列表
+     * @param code
+     * @return
+     */
+    @PostMapping("/t-accounting-strategy-detail/getDetailListByCode")
+    public R<List<TAccountingStrategyDetail>> getDetailListByCode(@RequestParam("code") String code){
+        // 查询桩
+        TChargingPile chargingPile = chargingPileService.getOne(Wrappers.lambdaQuery(TChargingPile.class)
+                .eq(TChargingPile::getCode,code)
+                .last("LIMIT 1"));
+        if(Objects.isNull(chargingPile)){
+            return R.fail("未查询到该桩设备");
+        }
+        Site site = siteService.getById(chargingPile.getSiteId());
+        TAccountingStrategy accountingStrategy = accountingStrategyService.getById(site.getAccountingStrategyId());
+        List<TAccountingStrategyDetail> accountingStrategyDetails = accountingStrategyDetailService.list(Wrappers.<TAccountingStrategyDetail>lambdaQuery()
+                .eq(TAccountingStrategyDetail::getAccountingStrategyId, accountingStrategy.getId()));
+        return R.ok(accountingStrategyDetails);
+    }
 }
 
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java
index fe5e167..9d3546f 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingGunController.java
@@ -21,6 +21,8 @@
 import com.ruoyi.common.log.annotation.Log;
 import com.ruoyi.common.log.enums.BusinessType;
 import com.ruoyi.common.log.enums.OperatorType;
+import com.ruoyi.integration.api.feignClient.IntegrationClient;
+import com.ruoyi.integration.api.model.EndCharge;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -51,18 +53,16 @@
 @RequestMapping("/t-charging-gun")
 public class TChargingGunController {
 
-    private final TChargingGunService chargingGunService;
-    
+    @Autowired
+    private TChargingGunService chargingGunService;
+    @Autowired
+    private IntegrationClient integrationClient;
+
     @Resource
     private TChargingPileService chargingPileService;
     @Resource
     private ISiteService siteService;
 
-    @Autowired
-    public TChargingGunController(TChargingGunService chargingGunService) {
-        this.chargingGunService = chargingGunService;
-    }
-    
     /**
      * 查询充电枪列表
      */
@@ -132,6 +132,8 @@
     @PutMapping(value = "/stopCharging")
     public AjaxResult<String> stopCharging(@RequestParam("id") Integer id) {
         // TODO 硬件 结束充电
+//        EndCharge endCharge = new EndCharge();
+//        integrationClient.endCharge(endCharge);
         return AjaxResult.success();
     }
     
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TFaultMessageController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TFaultMessageController.java
index 9acebda..fade8ba 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TFaultMessageController.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TFaultMessageController.java
@@ -6,16 +6,17 @@
 import com.ruoyi.chargingPile.service.TChargingPileService;
 import com.ruoyi.chargingPile.service.TFaultMessageService;
 import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.core.web.page.BasePage;
+import com.ruoyi.common.core.web.page.PageInfo;
 import com.ruoyi.common.log.annotation.Log;
 import com.ruoyi.common.log.enums.BusinessType;
 import com.ruoyi.common.log.enums.OperatorType;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
 
 /**
  * <p>
@@ -46,7 +47,40 @@
         faultMessageService.add(dto);
         return AjaxResult.success();
     }
-
-
+    
+    
+    /**
+     * 获取故障信息列表
+     * @param siteId
+     * @param basePage
+     * @return
+     */
+    @ResponseBody
+    @GetMapping("/getFaultMessageList")
+    @ApiOperation(value = "获取故障信息列表数据", tags = {"管理后台-设备监控"})
+    public AjaxResult<PageInfo<TFaultMessage>> getFaultMessageList(Integer siteId, BasePage basePage){
+        PageInfo<TFaultMessage> pageInfo = new PageInfo<>(basePage.getPageCurr(), basePage.getPageSize());
+        List<TFaultMessage> faultMessageList = faultMessageService.getFaultMessageList(pageInfo, siteId);
+        pageInfo.setRecords(faultMessageList);
+        return AjaxResult.success(pageInfo);
+    }
+    
+    
+    @ResponseBody
+    @PostMapping("/addFaultMessage")
+    @ApiOperation(value = "添加故障信息", tags = {"管理后台-设备监控"})
+    public AjaxResult addFaultMessage(@RequestBody TFaultMessage faultMessage){
+        faultMessageService.save(faultMessage);
+        return AjaxResult.success();
+    }
+    
+    
+    @ResponseBody
+    @DeleteMapping("/delFaultMessage/{id}")
+    @ApiOperation(value = "删除故障信息", tags = {"管理后台-设备监控"})
+    public AjaxResult delFaultMessage(@PathVariable Integer id){
+        faultMessageService.removeById(id);
+        return AjaxResult.success();
+    }
 }
 
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TRepairController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TRepairController.java
index e67572d..981cc4b 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TRepairController.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TRepairController.java
@@ -1,8 +1,17 @@
 package com.ruoyi.chargingPile.controller;
 
 
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.chargingPile.api.model.TFaultMessage;
+import com.ruoyi.chargingPile.api.model.TRepair;
+import com.ruoyi.chargingPile.service.TRepairService;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.core.web.page.BasePage;
+import com.ruoyi.common.core.web.page.PageInfo;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
 
 /**
  * <p>
@@ -16,5 +25,37 @@
 @RequestMapping("/t-repair")
 public class TRepairController {
 
+	@Resource
+	private TRepairService repairService;
+	
+	
+	@ResponseBody
+	@GetMapping("/getRepairList")
+	@ApiOperation(value = "获取报修记录列表数据", tags = {"管理后台-设备监控"})
+	public AjaxResult<PageInfo<TRepair>> getRepairList(String name, String siteId, BasePage basePage){
+		PageInfo<TRepair> pageInfo = new PageInfo<>(basePage.getPageCurr(), basePage.getPageSize());
+		List<TRepair> repairList = repairService.getRepairList(pageInfo, name, siteId);
+		return AjaxResult.success(repairList);
+	}
+	
+	
+	
+	
+	@ResponseBody
+	@PostMapping("/addRepair")
+	@ApiOperation(value = "添加报修记录", tags = {"管理后台-设备监控"})
+	public AjaxResult addRepair(@RequestBody TRepair repair){
+		repairService.save(repair);
+		return AjaxResult.success();
+	}
+	
+	
+	@ResponseBody
+	@DeleteMapping("/delRepair/{id}")
+	@ApiOperation(value = "删除报修记录", tags = {"管理后台-设备监控"})
+	public AjaxResult delRepair(@PathVariable Integer id){
+		repairService.removeById(id);
+		return AjaxResult.success();
+	}
 }
 
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TFaultMessageMapper.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TFaultMessageMapper.java
index 1b2b56e..70c0e9c 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TFaultMessageMapper.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TFaultMessageMapper.java
@@ -2,6 +2,10 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.chargingPile.api.model.TFaultMessage;
+import com.ruoyi.common.core.web.page.PageInfo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -12,5 +16,12 @@
  * @since 2024-08-08
  */
 public interface TFaultMessageMapper extends BaseMapper<TFaultMessage> {
-
+	
+	/**
+	 * 获取故障信息列表
+	 * @param pageInfo
+	 * @param siteId
+	 * @return
+	 */
+	List<TFaultMessage> getFaultMessageList(PageInfo<TFaultMessage> pageInfo, @Param("siteId") Integer siteId);
 }
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TRepairMapper.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TRepairMapper.java
index e649544..afe8e9f 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TRepairMapper.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TRepairMapper.java
@@ -2,6 +2,9 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.chargingPile.api.model.TRepair;
+import com.ruoyi.common.core.web.page.PageInfo;
+
+import java.util.List;
 
 /**
  * <p>
@@ -12,5 +15,15 @@
  * @since 2024-08-08
  */
 public interface TRepairMapper extends BaseMapper<TRepair> {
+	
+	
+	/**
+	 * 获取列表数据
+	 * @param pageInfo
+	 * @param name
+	 * @param siteId
+	 * @return
+	 */
+	List<TRepair> getRepairList(PageInfo<TRepair> pageInfo, String name, String siteId);
 
 }
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TAccountingStrategyDetailService.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TAccountingStrategyDetailService.java
index 245e8d3..835a46c 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TAccountingStrategyDetailService.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TAccountingStrategyDetailService.java
@@ -44,4 +44,12 @@
      * @return
      */
     Boolean isStrategy24Hour(List<TAccountingStrategyDetail> accountingStrategyDetails);
+
+    /**
+     * 判断同阶段是否价格不一致
+     * @param accountingStrategyDetails
+     * @return
+     */
+    Boolean isStrategyPriceConsistent(List<TAccountingStrategyDetail> accountingStrategyDetails);
+
 }
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TFaultMessageService.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TFaultMessageService.java
index 62fc81e..4c72b29 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TFaultMessageService.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TFaultMessageService.java
@@ -2,6 +2,9 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.chargingPile.api.model.TFaultMessage;
+import com.ruoyi.common.core.web.page.PageInfo;
+
+import java.util.List;
 
 /**
  * <p>
@@ -19,4 +22,13 @@
      * @return
      */
     void add(TFaultMessage dto);
+    
+    
+    /**
+     * 获取故障信息列表
+     * @param pageInfo
+     * @param siteId
+     * @return
+     */
+    List<TFaultMessage> getFaultMessageList(PageInfo<TFaultMessage> pageInfo, Integer siteId);
 }
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TRepairService.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TRepairService.java
index 8f2487a..4f85479 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TRepairService.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TRepairService.java
@@ -2,6 +2,10 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.chargingPile.api.model.TRepair;
+import com.ruoyi.common.core.web.page.BasePage;
+import com.ruoyi.common.core.web.page.PageInfo;
+
+import java.util.List;
 
 /**
  * <p>
@@ -12,5 +16,12 @@
  * @since 2024-08-08
  */
 public interface TRepairService extends IService<TRepair> {
-
+	
+	/**
+	 * 获取报修记录列表
+	 * @param name
+	 * @param siteId
+	 * @return
+	 */
+	List<TRepair> getRepairList(PageInfo<TRepair> pageInfo, String name, String siteId);
 }
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java
index 38e0916..7cf4f33 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java
@@ -31,6 +31,8 @@
 import com.ruoyi.other.api.feignClient.VipClient;
 import com.ruoyi.system.api.domain.SysUser;
 import com.ruoyi.system.api.feignClient.SysUserClient;
+import com.ruoyi.system.api.feignClient.SysUserRoleClient;
+import com.ruoyi.system.api.model.SysUserRoleVo;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
@@ -68,6 +70,8 @@
 	private AppUserClient appUserClient;
 	@Resource
 	private VipClient vipClient;
+	@Resource
+	private SysUserRoleClient sysUserRoleClient;
 
 	
 	
@@ -90,8 +94,11 @@
 			//非管理员需要根据角色和用户配置查询允许的站点数据
 			if(!SecurityUtils.isAdmin(SecurityUtils.getUserId())){
 				List<Integer> data = userSiteClient.getSiteIds(sysUser.getUserId()).getData();
-				List<Integer> data1 = roleSiteClient.getSiteIds(sysUser.getRoleId()).getData();
-				data.addAll(data1);
+				List<SysUserRoleVo> data2 = sysUserRoleClient.getRoleByUserId(sysUser.getUserId()).getData();
+				if(data2.size() > 0){
+					List<Integer> data1 = roleSiteClient.getSiteIds(data2.get(0).getRoleId()).getData();
+					data.addAll(data1);
+				}
 				ids = new HashSet<>(data);
 			}
 		}
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyDetailServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyDetailServiceImpl.java
index 9b2aaab..2412c8c 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyDetailServiceImpl.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyDetailServiceImpl.java
@@ -24,10 +24,7 @@
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.time.LocalTime;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -146,4 +143,23 @@
 
         return isFirstElementValid || !isTimeContinuous;
     }
+
+    @Override
+    public Boolean isStrategyPriceConsistent(List<TAccountingStrategyDetail> accountingStrategyDetails) {
+        Map<Integer, BigDecimal> phaseToServiceFee = new HashMap<>();
+        for (TAccountingStrategyDetail detail : accountingStrategyDetails) {
+            Integer type = detail.getType();
+            BigDecimal serviceFee = detail.getServiceCharge();
+
+            if (phaseToServiceFee.containsKey(type)) {
+                BigDecimal existingFee = phaseToServiceFee.get(type);
+                if (!existingFee.equals(serviceFee)) {
+                    return false; // 发现不一致的服务费
+                }
+            } else {
+                phaseToServiceFee.put(type, serviceFee);
+            }
+        }
+        return true; // 所有相同阶段的服务费一致
+    }
 }
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyServiceImpl.java
index 2b2bbd5..ad0bc26 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyServiceImpl.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyServiceImpl.java
@@ -1,5 +1,6 @@
 package com.ruoyi.chargingPile.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.chargingPile.api.model.TAccountingStrategy;
 import com.ruoyi.chargingPile.api.query.TAccountingStrategyQuery;
@@ -12,9 +13,13 @@
 import com.ruoyi.system.api.domain.SysUser;
 import com.ruoyi.system.api.feignClient.SysUserClient;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.Comparator;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -33,6 +38,10 @@
     public PageInfo<TAccountingStrategyVO> pageList(TAccountingStrategyQuery query) {
         PageInfo<TAccountingStrategyVO> pageInfo = new PageInfo<>(query.getPageCurr(),query.getPageSize());
         List<TAccountingStrategyVO> list = this.baseMapper.pageList(query,pageInfo);
+        List<Integer> parentIds = list.stream().map(TAccountingStrategyVO::getId).collect(Collectors.toList());
+        List<TAccountingStrategy> list1 = this.list(Wrappers.lambdaQuery(TAccountingStrategy.class)
+                .in(TAccountingStrategy::getParentId, parentIds)
+                .in(TAccountingStrategy::getAuditStatus, Arrays.asList(1,2)));
         for (TAccountingStrategyVO tAccountingStrategyVO : list) {
             SysUser data = sysUserClient.getSysUser(tAccountingStrategyVO.getUserId()).getData();
             tAccountingStrategyVO.setUserName(data.getNickName());
@@ -44,6 +53,13 @@
                 SysUser two = sysUserClient.getSysUser(tAccountingStrategyVO.getUserId()).getData();
                 tAccountingStrategyVO.setTwoUserName(two==null?null:two.getNickName());
             }
+            // 匹配编辑后的未审核的
+            List<TAccountingStrategy> accountingStrategies = list1.stream().filter(e -> e.getParentId().equals(tAccountingStrategyVO.getId()))
+                    .sorted(Comparator.comparing(TAccountingStrategy::getCreateTime).reversed()).collect(Collectors.toList());
+            if(!CollectionUtils.isEmpty(accountingStrategies)){
+                TAccountingStrategy tAccountingStrategy = accountingStrategies.get(0);
+                tAccountingStrategyVO.setAuditStatus(tAccountingStrategy.getAuditStatus());
+            }
         }
         pageInfo.setRecords(list);
         return pageInfo;
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TFaultMessageServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TFaultMessageServiceImpl.java
index 01dff45..88a97d7 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TFaultMessageServiceImpl.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TFaultMessageServiceImpl.java
@@ -11,9 +11,12 @@
 import com.ruoyi.chargingPile.service.TChargingPileService;
 import com.ruoyi.chargingPile.service.TFaultMessageService;
 import com.ruoyi.common.core.utils.MsgUtil;
+import com.ruoyi.common.core.web.page.PageInfo;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+
+import java.util.List;
 
 /**
  * <p>
@@ -48,4 +51,16 @@
         chargingPileNotificationService.saveData(4,dto.getSiteId(),dto.getChargingPileId(),site.getPhone(),"检测到"+siteName+"..."+chargingPile.getNumber()+"号桩设备离线,请及时查看处理!");
         this.save(dto);
     }
+    
+    
+    /**
+     * 获取故障信息列表
+     * @param pageInfo
+     * @param siteId
+     * @return
+     */
+    @Override
+    public List<TFaultMessage> getFaultMessageList(PageInfo<TFaultMessage> pageInfo, Integer siteId) {
+        return this.baseMapper.getFaultMessageList(pageInfo, siteId);
+    }
 }
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TRepairServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TRepairServiceImpl.java
index c2a86c8..d348ebb 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TRepairServiceImpl.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TRepairServiceImpl.java
@@ -1,10 +1,18 @@
 package com.ruoyi.chargingPile.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.chargingPile.api.feignClient.SiteClient;
+import com.ruoyi.chargingPile.api.model.Site;
 import com.ruoyi.chargingPile.api.model.TRepair;
 import com.ruoyi.chargingPile.mapper.TRepairMapper;
 import com.ruoyi.chargingPile.service.TRepairService;
+import com.ruoyi.common.core.web.page.BasePage;
+import com.ruoyi.common.core.web.page.PageInfo;
 import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.List;
 
 /**
  * <p>
@@ -16,5 +24,16 @@
  */
 @Service
 public class TRepairServiceImpl extends ServiceImpl<TRepairMapper, TRepair> implements TRepairService {
-
+	
+	
+	/**
+	 * 获取报修记录列表
+	 * @param name
+	 * @param siteId
+	 * @return
+	 */
+	@Override
+	public List<TRepair> getRepairList(PageInfo<TRepair> pageInfo, String name, String siteId) {
+		return this.baseMapper.getRepairList(pageInfo, name, siteId);
+	}
 }
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TAccountingStrategyDetailMapper.xml b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TAccountingStrategyDetailMapper.xml
index 488daf7..d347895 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TAccountingStrategyDetailMapper.xml
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TAccountingStrategyDetailMapper.xml
@@ -20,8 +20,8 @@
     </sql>
     <select id="queryAccountingStrategyDetailByStrategyId" resultType="com.ruoyi.chargingPile.api.vo.TAccountingStrategyDetailVO">
         SELECT
-            tasd.id, tasd.accounting_strategy_id, tasd.`type`, tasd.start_time, tasd.end_time, tasd.electrovalence, tasd.service_charge,
-            tasd.cost_service_charge,tas.discount
+            tasd.id, tasd.accounting_strategy_id, tasd.`type`, tasd.start_time, tasd.end_time, ROUND(tasd.electrovalence,4) AS electrovalence,
+            ROUND(tasd.service_charge,4) AS serviceCharge,ROUND(tasd.cost_service_charge,4) AS costServiceCharge,tas.discount
         FROM t_accounting_strategy_detail tasd
         LEFT JOIN t_accounting_strategy tas ON tas.id = tasd.accounting_strategy_id
         <where>
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TAccountingStrategyMapper.xml b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TAccountingStrategyMapper.xml
index 521ac63..e218c2a 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TAccountingStrategyMapper.xml
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TAccountingStrategyMapper.xml
@@ -37,6 +37,7 @@
                 AND audit_status = #{query.auditStatus}
             </if>
             AND site_id IS NULL
+            AND (parent_id IS NULL OR audit_status = 3 OR audit_status = 4)
             AND del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()}
         </where>
         ORDER BY create_time DESC
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TFaultMessageMapper.xml b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TFaultMessageMapper.xml
index fc21cd6..b3acfec 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TFaultMessageMapper.xml
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TFaultMessageMapper.xml
@@ -19,4 +19,20 @@
         id, app_user_id, site_id, charging_pile_id, status, down_time, create_time, del_flag
     </sql>
 
+    
+    
+    <select id="getFaultMessageList" resultType="com.ruoyi.chargingPile.api.model.TFaultMessage">
+        select
+        a.*,
+        b.name as chargingPileName,
+        c.name as siteName
+        from t_fault_message a
+        left join t_charging_pile b on (a.charging_pile_id = b.id)
+        left join t_site c on (a.site_id = c.id)
+        where a.del_flag = 0
+        <if test="null != siteId">
+            and a.site_id = #{siteId}
+        </if>
+        order by a.create_time desc
+    </select>
 </mapper>
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TRepairMapper.xml b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TRepairMapper.xml
index 526a1ba..6c7b52f 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TRepairMapper.xml
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TRepairMapper.xml
@@ -19,4 +19,23 @@
         id, repairman, site_id, charging_pile_id, content, repair_time, create_time, del_flag
     </sql>
 
+    
+    
+    <select id="getRepairList" resultType="com.ruoyi.chargingPile.api.model.TRepair">
+        select
+        a.*,
+        b.name as chargingPileName,
+        c.name as siteName
+        from t_repair a
+        left join t_charging_pile b on (a.charging_pile_id = b.id)
+        left join t_site c on (a.site_id = c.id)
+        where a.del_flag = 0
+        <if test="null != name and '' != name">
+            and a.repairman like CONCAT('%', #{name}, '%')
+        </if>
+        <if test="null != siteId">
+            and a.site_id = #{siteId}
+        </if>
+        order by a.create_time desc
+    </select>
 </mapper>
diff --git a/ruoyi-service/ruoyi-integration/pom.xml b/ruoyi-service/ruoyi-integration/pom.xml
index 4c146a8..571bf94 100644
--- a/ruoyi-service/ruoyi-integration/pom.xml
+++ b/ruoyi-service/ruoyi-integration/pom.xml
@@ -169,6 +169,10 @@
             <groupId>com.ruoyi</groupId>
             <artifactId>ruoyi-api-order</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-api-chargingPile</artifactId>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/PlatformStopChargingReplyController.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/PlatformStopChargingReplyController.java
new file mode 100644
index 0000000..c9a9385
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/PlatformStopChargingReplyController.java
@@ -0,0 +1,34 @@
+package com.ruoyi.integration.controller;
+
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.integration.api.model.PlatformStopChargingReply;
+import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply;
+import com.ruoyi.integration.mongodb.service.PlatformStopChargingReplyService;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/9/2 16:52
+ */
+@RestController
+@RequestMapping("/platformStopChargingReply")
+public class PlatformStopChargingReplyController {
+	
+	@Resource
+	private PlatformStopChargingReplyService platformStopChargingReplyService;
+	
+	/**
+	 * 获取远程停机命令应答
+	 * @param query
+	 * @return
+	 */
+	@PostMapping("/getPlatformStopChargingReply")
+	public R<PlatformStopChargingReply> getPlatformStopChargingReply(@RequestBody GetPlatformStopChargingReply query){
+		PlatformStopChargingReply platformStopChargingReply = platformStopChargingReplyService.getPlatformStopChargingReply(query);
+		return R.ok(platformStopChargingReply);
+	}
+	
+	
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/SendTagConstant.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/SendTagConstant.java
index 9088d1e..8466119 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/SendTagConstant.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/SendTagConstant.java
@@ -15,6 +15,10 @@
 	 */
 	public static final String PING ="ping";
 	/**
+	 * 充电结束
+	 */
+	public static final String END_CHARGE = "end_charge";
+	/**
 	 * 计费模型验证请求
 	 */
 	public static final String BILLING_MODE_VERIFY ="billing_mode_verify";
@@ -85,7 +89,7 @@
 	/**
 	 * 对时设置应答
 	 */
-	public static final String TIMING_SETTING_REPLY ="timing_setting_reply";
+	public static final String TIMING_SETTING ="timing_setting";
 	/**
 	 * 计费模型应答
 	 */
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/controller/SendMessageController.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/controller/SendMessageController.java
index 2857dfc..9a27b45 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/controller/SendMessageController.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/controller/SendMessageController.java
@@ -76,10 +76,10 @@
      * @param endCharge 实体对象
      * @return
      */
-    @PostMapping("/endCharge")
-    public String endCharge(@RequestBody EndCharge endCharge){
-        return  iotMessageProduce.sendMessage(endCharge.getCharging_pile_code(), ServiceIdMenu.END_CHARGE.getKey(),messageUtil.endCharge(endCharge));
-    }
+//    @PostMapping("/endCharge")
+//    public String endCharge(@RequestBody EndCharge endCharge){
+//        return  iotMessageProduce.sendMessage(endCharge.getCharging_pile_code(), ServiceIdMenu.END_CHARGE.getKey(),messageUtil.endCharge(endCharge));
+//    }
 
     /**
      * 运营平台确认启动充电
@@ -172,13 +172,13 @@
     }
 
     /**
-     * 对时设置
-     * @param timingSetting 实体对象
+     * 对时设置应答
+     * @param timingSettingReply 实体对象
      * @return
      */
-    @PostMapping("/timingSetting")
-    public String timingSetting(@RequestBody TimingSetting timingSetting){
-        return  iotMessageProduce.sendMessage(timingSetting.getCharging_pile_code(), ServiceIdMenu.TIMING_SETTING.getKey(),messageUtil.timingSetting(timingSetting));
+    @PostMapping("/timingSettingReply")
+    public String timingSettingReply(@RequestBody TimingSettingReply timingSettingReply){
+        return  iotMessageProduce.sendMessage(timingSettingReply.getCharging_pile_code(), ServiceIdMenu.TIMING_SETTING_REPLY.getKey(),messageUtil.timingSettingReply(timingSettingReply));
     }
 
     /**
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/enums/ServiceIdMenu.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/enums/ServiceIdMenu.java
index 2445ebf..12ea9d4 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/enums/ServiceIdMenu.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/enums/ServiceIdMenu.java
@@ -26,10 +26,10 @@
 	 * 读取实时监测数据
 	 */
 	 READ_REAL_TIME_MONITORING_DATA ("读取实时监测数据","read_real_time_monitoring_data"),
-	/**
-	 * 充电结束
-	 */
-	 END_CHARGE ("充电结束","end_charge"),
+//	/**
+//	 * 充电结束
+//	 */
+//	 END_CHARGE ("充电结束","end_charge"),
 	/**
 	 * 运营平台确认启动充电
 	 */
@@ -67,9 +67,9 @@
 	 */
 	 WORKING_PARAMETER_SETTING ("充电桩工作参数设置","working_parameter_setting"),
 	/**
-	 * 对时设置
+	 * 对时设置应答
 	 */
-	 TIMING_SETTING ("对时设置","timing_setting"),
+	 TIMING_SETTING_REPLY ("对时设置应答","timing_setting_reply"),
 	/**
 	 * 计费模型设置
 	 */
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 3640b42..51caba0 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
@@ -44,6 +44,9 @@
             case SendTagConstant.PING:
                 sendResult = enhanceProduce.pingMessage(content);
                 break;
+            case SendTagConstant.END_CHARGE:
+                sendResult = enhanceProduce.endChargeMessage(content);
+                break;
             case SendTagConstant.BILLING_MODE_VERIFY:
                 sendResult = enhanceProduce.billingModeVerifyMessage(content);
                 break;
@@ -92,8 +95,8 @@
             case SendTagConstant.WORKING_PARAMETER_SETTING_REPLY:
                 sendResult = enhanceProduce.workingParameterSettingReplyMessage(content);
                 break;
-            case SendTagConstant.TIMING_SETTING_REPLY:
-                sendResult = enhanceProduce.timingSettingReplyMessage(content);
+            case SendTagConstant.TIMING_SETTING:
+                sendResult = enhanceProduce.timingSettingMessage(content);
                 break;
             case SendTagConstant.SETUP_BILLING_MODEL_REPLY:
                 sendResult = enhanceProduce.setupBillingModelReplyMessage(content);
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/CP56Time2aConverter.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/CP56Time2aConverter.java
new file mode 100644
index 0000000..3a6b0c5
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/CP56Time2aConverter.java
@@ -0,0 +1,39 @@
+package com.ruoyi.integration.iotda.utils.tools;
+
+import javax.xml.datatype.DatatypeConfigurationException;
+import javax.xml.datatype.DatatypeFactory;
+import javax.xml.datatype.XMLGregorianCalendar;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+
+public class CP56Time2aConverter {
+ 
+    public static String convertToCP56Time2a(Date date) {
+        try {
+            DatatypeFactory datatypeFactory = DatatypeFactory.newInstance();
+            GregorianCalendar calendar = new GregorianCalendar();
+            calendar.setTime(date);
+            TimeZone timeZone = calendar.getTimeZone();
+            XMLGregorianCalendar xmlGregorianCalendar = datatypeFactory.newXMLGregorianCalendar(
+                    calendar.get(Calendar.YEAR),
+                    calendar.get(Calendar.MONTH)+1,
+                    calendar.get(Calendar.DAY_OF_MONTH),
+                    calendar.get(Calendar.HOUR_OF_DAY),
+                    calendar.get(Calendar.MINUTE),
+                    calendar.get(Calendar.SECOND),
+                    calendar.get(Calendar.MILLISECOND),
+                    (timeZone.getRawOffset() / (60 * 1000)));
+            return xmlGregorianCalendar.toXMLFormat();
+        } catch (DatatypeConfigurationException e) {
+            throw new RuntimeException("Error creating DatatypeFactory", e);
+        }
+    }
+ 
+    public static void main(String[] args) {
+        Date now = new Date();
+        String cp56Time2a = convertToCP56Time2a(now);
+        System.out.println("CP56Time2a: " + cp56Time2a);
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/MessageUtil.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/MessageUtil.java
index 7610a47..c7c76bd 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/MessageUtil.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/MessageUtil.java
@@ -44,7 +44,7 @@
     @Autowired
     private WorkingParameterSettingService workingParameterSettingService;
     @Autowired
-    private TimingSettingService timingSettingService;
+    private TimingSettingReplyService timingSettingReplyService;
     @Autowired
     private SetupBillingModelService setupBillingModelService;
     @Autowired
@@ -109,10 +109,10 @@
      * @param endCharge 实体对象
      * @return
      */
-    public String endCharge(EndCharge endCharge){
-        endChargeService.create(endCharge);
-        return  getMessageJsonString(endCharge, ServiceIdMenu.END_CHARGE.getValue());
-    }
+//    public String endCharge(EndCharge endCharge){
+//        endChargeService.create(endCharge);
+//        return  getMessageJsonString(endCharge, ServiceIdMenu.END_CHARGE.getValue());
+//    }
 
     /**
      * 运营平台确认启动充电
@@ -205,13 +205,13 @@
     }
 
     /**
-     * 对时设置
-     * @param timingSetting 实体对象
+     * 对时设置应答
+     * @param timingSettingReply 实体对象
      * @return
      */
-    public String timingSetting(TimingSetting timingSetting){
-        timingSettingService.create(timingSetting);
-        return  getMessageJsonString(timingSetting, ServiceIdMenu.TIMING_SETTING.getValue());
+    public String timingSettingReply(TimingSettingReply timingSettingReply){
+        timingSettingReplyService.create(timingSettingReply);
+        return  getMessageJsonString(timingSettingReply, ServiceIdMenu.TIMING_SETTING_REPLY.getValue());
     }
 
     /**
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/StrategyUtil.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/StrategyUtil.java
new file mode 100644
index 0000000..4ebf980
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/StrategyUtil.java
@@ -0,0 +1,271 @@
+package com.ruoyi.integration.iotda.utils.tools;
+
+import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
+import com.ruoyi.common.core.utils.DateUtils;
+import com.ruoyi.integration.api.model.AcquisitionBillingModeReply;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.Serializable;
+import java.time.LocalTime;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Slf4j
+public class StrategyUtil implements Serializable {
+
+
+    /**
+     * 获取计费模版的价格
+     * @return
+     */
+    public static Map<Integer, TAccountingStrategyDetail> getStrategyPrice(List<TAccountingStrategyDetail> accountingStrategyDetails) {
+        Map<Integer, TAccountingStrategyDetail> phaseToServiceFee = new HashMap<>();
+        for (TAccountingStrategyDetail detail : accountingStrategyDetails) {
+            Integer type = detail.getType();
+            if (!phaseToServiceFee.containsKey(type)) {
+                phaseToServiceFee.put(type, detail);
+            }
+        }
+        return phaseToServiceFee;
+    }
+    /**
+     * 计费模版的价格设置
+     * @return
+     */
+    public static void setStrategyPrice(Map<Integer, TAccountingStrategyDetail> accountingStrategyDetails,AcquisitionBillingModeReply acquisitionBillingModeReply) {
+        accountingStrategyDetails.forEach((k,v)->{
+            switch (k){
+                case 1:
+                    acquisitionBillingModeReply.setSharp_peak_electricity_rate(v.getElectrovalence());
+//                    acquisitionBillingModeReply.setSharp_peak_service_rate(v.getServiceCharge());
+                    break;
+                case 2:
+                    acquisitionBillingModeReply.setPeak_electricity_rate(v.getElectrovalence());
+//                    acquisitionBillingModeReply.setPeak_service_rate(v.getServiceCharge());
+                    break;
+                case 3:
+                    acquisitionBillingModeReply.setFlat_peak_electricity_rate(v.getElectrovalence());
+//                    acquisitionBillingModeReply.setFlat_peak_service_rate(v.getServiceCharge());
+                    break;
+                default:
+                    acquisitionBillingModeReply.setLow_peak_electricity_rate(v.getElectrovalence());
+//                    acquisitionBillingModeReply.setLow_peak_service_rate(v.getServiceCharge());
+                    break;
+            }
+        });
+    }
+
+    /**
+     * 计费模版的时段设置
+     * @return
+     */
+    public static void setTime(List<TAccountingStrategyDetail> accountingStrategyDetails,AcquisitionBillingModeReply acquisitionBillingModeReply) {
+        LocalTime time = LocalTime.of(0, 15, 0);
+        for (int i = 1; i <= 48; i++) {
+            if(i != 1){
+                time = time.plusMinutes(30);
+            }
+            accountingStrategyDetails = accountingStrategyDetails.stream().sorted(Comparator.comparing(TAccountingStrategyDetail::getStartTime)).collect(Collectors.toList());
+            for (TAccountingStrategyDetail accountingStrategyDetail : accountingStrategyDetails) {
+                if(DateUtils.string2LocalTime(accountingStrategyDetail.getStartTime()).isBefore(time)
+                        && DateUtils.string2LocalTime(accountingStrategyDetail.getEndTime()).isAfter(time)){
+                    switch (i){
+                        case 1:
+                            acquisitionBillingModeReply.setTime1(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 2:
+                            acquisitionBillingModeReply.setTime2(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 3:
+                            acquisitionBillingModeReply.setTime3(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 4:
+                            acquisitionBillingModeReply.setTime4(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 5:
+                            acquisitionBillingModeReply.setTime5(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 6:
+                            acquisitionBillingModeReply.setTime6(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 7:
+                            acquisitionBillingModeReply.setTime7(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 8:
+                            acquisitionBillingModeReply.setTime8(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 9:
+                            acquisitionBillingModeReply.setTime9(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 10:
+                            acquisitionBillingModeReply.setTime10(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 11:
+                            acquisitionBillingModeReply.setTime11(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 12:
+                            acquisitionBillingModeReply.setTime12(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 13:
+                            acquisitionBillingModeReply.setTime13(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 14:
+                            acquisitionBillingModeReply.setTime14(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 15:
+                            acquisitionBillingModeReply.setTime15(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 16:
+                            acquisitionBillingModeReply.setTime16(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 17:
+                            acquisitionBillingModeReply.setTime17(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 18:
+                            acquisitionBillingModeReply.setTime18(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 19:
+                            acquisitionBillingModeReply.setTime19(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 20:
+                            acquisitionBillingModeReply.setTime20(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 21:
+                            acquisitionBillingModeReply.setTime21(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 22:
+                            acquisitionBillingModeReply.setTime22(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 23:
+                            acquisitionBillingModeReply.setTime23(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 24:
+                            acquisitionBillingModeReply.setTime24(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 25:
+                            acquisitionBillingModeReply.setTime25(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 26:
+                            acquisitionBillingModeReply.setTime26(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 27:
+                            acquisitionBillingModeReply.setTime27(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 28:
+                            acquisitionBillingModeReply.setTime28(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 29:
+                            acquisitionBillingModeReply.setTime29(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 30:
+                            acquisitionBillingModeReply.setTime30(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 31:
+                            acquisitionBillingModeReply.setTime31(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 32:
+                            acquisitionBillingModeReply.setTime32(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 33:
+                            acquisitionBillingModeReply.setTime33(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 34:
+                            acquisitionBillingModeReply.setTime34(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 35:
+                            acquisitionBillingModeReply.setTime35(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 36:
+                            acquisitionBillingModeReply.setTime36(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 37:
+                            acquisitionBillingModeReply.setTime37(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 38:
+                            acquisitionBillingModeReply.setTime38(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 39:
+                            acquisitionBillingModeReply.setTime39(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 40:
+                            acquisitionBillingModeReply.setTime40(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 41:
+                            acquisitionBillingModeReply.setTime41(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 42:
+                            acquisitionBillingModeReply.setTime42(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 43:
+                            acquisitionBillingModeReply.setTime43(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 44:
+                            acquisitionBillingModeReply.setTime44(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 45:
+                            acquisitionBillingModeReply.setTime45(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 46:
+                            acquisitionBillingModeReply.setTime46(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 47:
+                            acquisitionBillingModeReply.setTime47(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                        case 48:
+                            acquisitionBillingModeReply.setTime48(accountingStrategyDetail.getType().equals(1)?0
+                                    :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3);
+                            break;
+                    }
+                }
+            }
+        }
+    }
+
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/PlatformStopChargingReplyService.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/PlatformStopChargingReplyService.java
index a618614..2e5f241 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/PlatformStopChargingReplyService.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/PlatformStopChargingReplyService.java
@@ -1,7 +1,15 @@
 package com.ruoyi.integration.mongodb.service;
 
 import com.ruoyi.integration.api.model.PlatformStopChargingReply;
+import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply;
 import com.ruoyi.integration.mongodb.base.BaseService;
 
 public interface PlatformStopChargingReplyService extends BaseService<PlatformStopChargingReply> {
+	
+	/**
+	 * 根据枪编号获取停机应答
+	 * @return
+	 */
+	PlatformStopChargingReply getPlatformStopChargingReply(GetPlatformStopChargingReply query);
+	
 }
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/UploadRealTimeMonitoringDataService.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/UploadRealTimeMonitoringDataService.java
index e142505..f5b92c3 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/UploadRealTimeMonitoringDataService.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/UploadRealTimeMonitoringDataService.java
@@ -17,4 +17,11 @@
 	List<UploadRealTimeMonitoringData> getDataByOrderCode(String code);
 	List<UploadRealTimeMonitoringData> getDataAll(Set<String> values, Integer page, Integer size);
 
+	/**
+	 * 查询订单最新一条数据
+	 * @param transaction_serial_number
+	 * @return
+	 */
+    UploadRealTimeMonitoringData getLastDataById(String transaction_serial_number);
+
 }
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/PlatformStopChargingReplyServiceImpl.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/PlatformStopChargingReplyServiceImpl.java
index 357de01..08535ed 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/PlatformStopChargingReplyServiceImpl.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/PlatformStopChargingReplyServiceImpl.java
@@ -1,10 +1,13 @@
 package com.ruoyi.integration.mongodb.service.impl;
 
+import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply;
 import com.ruoyi.integration.iotda.constant.IotConstant;
 import com.ruoyi.integration.api.model.PlatformStopChargingReply;
 import com.ruoyi.integration.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.util.List;
@@ -28,4 +31,16 @@
     public List<PlatformStopChargingReply> findAll() {
         return mongoTemplate.findAll(PlatformStopChargingReply.class);
     }
+    
+    
+    /**
+     * 根据枪编号获取
+     * @return
+     */
+    @Override
+    public PlatformStopChargingReply getPlatformStopChargingReply(GetPlatformStopChargingReply query) {
+        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())), PlatformStopChargingReply.class);
+        return platformStopChargingReplies.size() > 0 ? platformStopChargingReplies.get(0) : null;
+    }
 }
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java
index 89cf4d0..cbed3aa 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java
@@ -73,4 +73,17 @@
         return uploadRealTimeMonitoringData;
     }
 
+    @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);
+    }
+
 }
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/AcquisitionBillingModeMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/AcquisitionBillingModeMessageListener.java
index 28b3de3..cc9a8cc 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/AcquisitionBillingModeMessageListener.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/AcquisitionBillingModeMessageListener.java
@@ -1,7 +1,14 @@
 package com.ruoyi.integration.rocket.listener;
 
+import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyDetailClient;
+import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
 import com.ruoyi.integration.api.model.AcquisitionBillingMode;
+import com.ruoyi.integration.api.model.AcquisitionBillingModeReply;
 import com.ruoyi.integration.api.model.Online;
+import com.ruoyi.integration.iotda.enums.ServiceIdMenu;
+import com.ruoyi.integration.iotda.utils.produce.IotMessageProduce;
+import com.ruoyi.integration.iotda.utils.tools.MessageUtil;
+import com.ruoyi.integration.iotda.utils.tools.StrategyUtil;
 import com.ruoyi.integration.mongodb.service.AcquisitionBillingModeService;
 import com.ruoyi.integration.rocket.model.AcquisitionBillingModeMessage;
 import com.ruoyi.integration.rocket.util.EnhanceMessageHandler;
@@ -11,6 +18,10 @@
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 
 @Slf4j
 @Component
@@ -24,7 +35,12 @@
 
     @Autowired
     private AcquisitionBillingModeService acquisitionBillingModeService;
-
+    @Autowired
+    private AccountingStrategyDetailClient accountingStrategyDetailClient;
+    @Autowired
+    private IotMessageProduce iotMessageProduce;
+    @Autowired
+    private MessageUtil messageUtil;
     @Override
     protected void handleMessage(AcquisitionBillingModeMessage message) throws Exception {
         // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试
@@ -33,7 +49,15 @@
         AcquisitionBillingMode acquisitionBillingMode = new AcquisitionBillingMode();
         BeanUtils.copyProperties(message,acquisitionBillingMode);
         acquisitionBillingModeService.create(acquisitionBillingMode);
-        // 业务处理
+        // 业务处理  计费模型请求应答  1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段
+        List<TAccountingStrategyDetail> accountingStrategyDetails = accountingStrategyDetailClient.getDetailListByCode(message.getCharging_pile_code()).getData();
+        Map<Integer, TAccountingStrategyDetail> strategyPrice = StrategyUtil.getStrategyPrice(accountingStrategyDetails);
+        // 价格设置
+        AcquisitionBillingModeReply acquisitionBillingModeReply = new AcquisitionBillingModeReply();
+        StrategyUtil.setStrategyPrice(strategyPrice,acquisitionBillingModeReply);
+        // 时段设置
+        StrategyUtil.setTime(accountingStrategyDetails,acquisitionBillingModeReply);
+        iotMessageProduce.sendMessage(acquisitionBillingModeReply.getCharging_pile_code(), ServiceIdMenu.ACQUISITION_BILLING_MODE_REPLY.getKey(),messageUtil.acquisitionBillingModeReply(acquisitionBillingModeReply));
     }
 
     @Override
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/BillingModeVerifyMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/BillingModeVerifyMessageListener.java
index 49dcc6b..6f6e9ad 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/BillingModeVerifyMessageListener.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/BillingModeVerifyMessageListener.java
@@ -1,7 +1,15 @@
 package com.ruoyi.integration.rocket.listener;
 
+import com.ruoyi.chargingPile.api.dto.CheckChargingStrategyDTO;
+import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyDetailClient;
+import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
 import com.ruoyi.integration.api.model.AcquisitionBillingMode;
 import com.ruoyi.integration.api.model.BillingModeVerify;
+import com.ruoyi.integration.api.model.BillingModeVerifyReply;
+import com.ruoyi.integration.iotda.enums.ServiceIdMenu;
+import com.ruoyi.integration.iotda.utils.produce.IotMessageProduce;
+import com.ruoyi.integration.iotda.utils.tools.MessageUtil;
+import com.ruoyi.integration.mongodb.service.BillingModeVerifyReplyService;
 import com.ruoyi.integration.mongodb.service.BillingModeVerifyService;
 import com.ruoyi.integration.rocket.model.BillingModeVerifyMessage;
 import com.ruoyi.integration.rocket.util.EnhanceMessageHandler;
@@ -24,6 +32,12 @@
 
     @Autowired
     private BillingModeVerifyService billingModeVerifyService;
+    @Autowired
+    private IotMessageProduce iotMessageProduce;
+    @Autowired
+    private MessageUtil messageUtil;
+    @Autowired
+    private AccountingStrategyDetailClient accountingStrategyDetailClient;
 
     @Override
     protected void handleMessage(BillingModeVerifyMessage message) throws Exception {
@@ -34,6 +48,28 @@
         BeanUtils.copyProperties(message,billingModeVerify);
         billingModeVerifyService.create(billingModeVerify);
         // 业务处理
+        BillingModeVerifyReply billingModeVerifyReply = new BillingModeVerifyReply();
+        if(message.getBilling_model_code().equals("0")){
+            // 首次
+            billingModeVerifyReply.setCharging_pile_code(billingModeVerify.getCharging_pile_code());
+            billingModeVerifyReply.setBilling_model_code("0");
+            billingModeVerifyReply.setBilling_model_result(1);
+        }else {
+            // 查询桩使用的模版
+            CheckChargingStrategyDTO dto = new CheckChargingStrategyDTO();
+            dto.setCode(message.getBilling_model_code());
+            dto.setStrategyDetailId(Integer.valueOf(message.getBilling_model_code()));
+            Boolean check = accountingStrategyDetailClient.checkChargingStrategy(dto).getData();
+            // 校验计费模版是否准确
+            billingModeVerifyReply.setCharging_pile_code(billingModeVerify.getCharging_pile_code());
+            billingModeVerifyReply.setBilling_model_code(message.getBilling_model_code());
+            if(check){
+                billingModeVerifyReply.setBilling_model_result(0);
+            }else {
+                billingModeVerifyReply.setBilling_model_result(1);
+            }
+        }
+        iotMessageProduce.sendMessage(billingModeVerifyReply.getCharging_pile_code(), ServiceIdMenu.BILLING_MODE_VERIFY_REPLY.getKey(),messageUtil.billingModeVerifyReply(billingModeVerifyReply));
     }
 
     @Override
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/BmsAbortMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/BmsAbortMessageListener.java
index 9c0e654..9d6f37c 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/BmsAbortMessageListener.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/BmsAbortMessageListener.java
@@ -5,12 +5,15 @@
 import com.ruoyi.integration.mongodb.service.BmsAbortService;
 import com.ruoyi.integration.rocket.model.BmsAbortMessage;
 import com.ruoyi.integration.rocket.util.EnhanceMessageHandler;
+import com.ruoyi.order.api.feignClient.ChargingOrderClient;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
 import org.apache.rocketmq.spring.core.RocketMQListener;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
 
 @Slf4j
 @Component
@@ -24,6 +27,12 @@
 
     @Autowired
     private BmsAbortService bmsAbortService;
+    
+    @Resource
+    private ChargingOrderClient chargingOrderClient;
+    
+    
+    
     @Override
     protected void handleMessage(BmsAbortMessage message) throws Exception {
         // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试
@@ -33,6 +42,7 @@
         BeanUtils.copyProperties(message,bmsAbort);
         bmsAbortService.create(bmsAbort);
         // 业务处理
+        chargingOrderClient.excelEndCharge(bmsAbort.getTransaction_serial_number());
     }
 
     @Override
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/EndChargeMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/EndChargeMessageListener.java
new file mode 100644
index 0000000..819768c
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/EndChargeMessageListener.java
@@ -0,0 +1,98 @@
+package com.ruoyi.integration.rocket.listener;
+
+import com.ruoyi.integration.api.model.EndCharge;
+import com.ruoyi.integration.api.model.Ping;
+import com.ruoyi.integration.api.model.Pong;
+import com.ruoyi.integration.iotda.enums.ServiceIdMenu;
+import com.ruoyi.integration.iotda.utils.produce.IotMessageProduce;
+import com.ruoyi.integration.iotda.utils.tools.MessageUtil;
+import com.ruoyi.integration.mongodb.service.EndChargeService;
+import com.ruoyi.integration.mongodb.service.PingService;
+import com.ruoyi.integration.rocket.model.EndChargeMessage;
+import com.ruoyi.integration.rocket.model.PingMessage;
+import com.ruoyi.integration.rocket.util.EnhanceMessageHandler;
+import com.ruoyi.order.api.feignClient.ChargingOrderClient;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
+import org.apache.rocketmq.spring.core.RocketMQListener;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+@Slf4j
+@Component
+@RocketMQMessageListener(
+        consumerGroup = "enhance_consumer_group",
+        topic = "rocket_enhance",
+        selectorExpression = "*",
+        consumeThreadMax = 5 //默认是64个线程并发消息,配置 consumeThreadMax 参数指定并发消费线程数,避免太大导致资源不够
+)
+public class EndChargeMessageListener extends EnhanceMessageHandler<EndChargeMessage> implements RocketMQListener<EndChargeMessage> {
+
+    @Autowired
+    private EndChargeService endChargeService;
+    @Autowired
+    private MessageUtil messageUtil;
+    @Autowired
+    private IotMessageProduce iotMessageProduce;
+    
+    @Resource
+    private ChargingOrderClient chargingOrderClient;
+    
+    
+    
+    @Override
+    protected void handleMessage(EndChargeMessage message) throws Exception {
+        // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试
+        log.info("充电结束-业务消息处理:{}",message);
+        // 持久化消息
+        EndCharge endCharge = new EndCharge();
+        BeanUtils.copyProperties(message,endCharge);
+        endChargeService.create(endCharge);
+        // 业务处理
+        chargingOrderClient.endCharge(endCharge.getTransaction_serial_number());
+    }
+
+    @Override
+    protected void handleMaxRetriesExceeded(EndChargeMessage message) {
+        // 当超过指定重试次数消息时此处方法会被调用
+        // 生产中可以进行回退或其他业务操作
+        log.error("消息消费失败,请执行后续处理");
+    }
+
+
+    /**
+     * 是否执行重试机制
+     */
+    @Override
+    protected boolean isRetry() {
+        return true;
+    }
+
+    @Override
+    protected boolean throwException() {
+        // 是否抛出异常,false搭配retry自行处理异常
+        return false;
+    }
+
+    /**
+     * 若需要处理消息过滤,在父级中进行统一处理,或者在此处实现之后,自行处理
+     * @param message 待处理消息
+     * @return true: 本次消息被过滤,false:不过滤
+     */
+    @Override
+    protected boolean filter(EndChargeMessage message) {
+        // 此处可做消息过滤
+        return false;
+    }
+
+    /**
+     * 监听消费消息,不需要执行业务处理,委派给父类做基础操作,父类做完基础操作后会调用子类的实际处理类型
+     */
+    @Override
+    public void onMessage(EndChargeMessage message) {
+        super.dispatchMessage(message);
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/MotorAbortMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/MotorAbortMessageListener.java
index 9ffff0f..8b96993 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/MotorAbortMessageListener.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/MotorAbortMessageListener.java
@@ -5,12 +5,15 @@
 import com.ruoyi.integration.mongodb.service.MotorAbortService;
 import com.ruoyi.integration.rocket.model.MotorAbortMessage;
 import com.ruoyi.integration.rocket.util.EnhanceMessageHandler;
+import com.ruoyi.order.api.feignClient.ChargingOrderClient;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
 import org.apache.rocketmq.spring.core.RocketMQListener;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
 
 @Slf4j
 @Component
@@ -24,6 +27,13 @@
 
     @Autowired
     private MotorAbortService motorAbortService;
+    
+    @Resource
+    private ChargingOrderClient chargingOrderClient;
+    
+    
+    
+    
     @Override
     protected void handleMessage(MotorAbortMessage message) throws Exception {
         // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试
@@ -33,6 +43,7 @@
         BeanUtils.copyProperties(message,motorAbort);
         motorAbortService.create(motorAbort);
         // 业务处理
+        chargingOrderClient.excelEndCharge(motorAbort.getTransaction_serial_number());
     }
 
     @Override
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TimingSettingMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TimingSettingMessageListener.java
new file mode 100644
index 0000000..4269c93
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TimingSettingMessageListener.java
@@ -0,0 +1,93 @@
+package com.ruoyi.integration.rocket.listener;
+
+import com.ruoyi.integration.api.model.TimingSetting;
+import com.ruoyi.integration.api.model.TimingSettingReply;
+import com.ruoyi.integration.iotda.enums.ServiceIdMenu;
+import com.ruoyi.integration.iotda.utils.produce.IotMessageProduce;
+import com.ruoyi.integration.iotda.utils.tools.CP56Time2aConverter;
+import com.ruoyi.integration.iotda.utils.tools.MessageUtil;
+import com.ruoyi.integration.mongodb.service.TimingSettingReplyService;
+import com.ruoyi.integration.mongodb.service.TimingSettingService;
+import com.ruoyi.integration.rocket.model.TimingSettingMessage;
+import com.ruoyi.integration.rocket.util.EnhanceMessageHandler;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
+import org.apache.rocketmq.spring.core.RocketMQListener;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+
+@Slf4j
+@Component
+@RocketMQMessageListener(
+        consumerGroup = "enhance_consumer_group",
+        topic = "rocket_enhance",
+        selectorExpression = "*",
+        consumeThreadMax = 5 //默认是64个线程并发消息,配置 consumeThreadMax 参数指定并发消费线程数,避免太大导致资源不够
+)
+public class TimingSettingMessageListener extends EnhanceMessageHandler<TimingSettingMessage> implements RocketMQListener<TimingSettingMessage> {
+
+    @Autowired
+    private TimingSettingService timingSettingService;
+    @Autowired
+    private IotMessageProduce iotMessageProduce;
+    @Autowired
+    private MessageUtil messageUtil;
+    @Override
+    protected void handleMessage(TimingSettingMessage message) throws Exception {
+        // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试
+        log.info("对时设置-业务消息处理:{}",message);
+        // 持久化消息
+        TimingSetting timingSetting = new TimingSetting();
+        BeanUtils.copyProperties(message,timingSetting);
+        timingSettingService.create(timingSetting);
+        // 业务处理  对时设置应答
+        TimingSettingReply timingSettingReply = new TimingSettingReply();
+        timingSettingReply.setCharging_pile_code(message.getCharging_pile_code());
+        timingSettingReply.setCurrent_time(CP56Time2aConverter.convertToCP56Time2a(new Date()));
+        iotMessageProduce.sendMessage(timingSettingReply.getCharging_pile_code(), ServiceIdMenu.TIMING_SETTING_REPLY.getKey(),messageUtil.timingSettingReply(timingSettingReply));
+    }
+
+    @Override
+    protected void handleMaxRetriesExceeded(TimingSettingMessage message) {
+        // 当超过指定重试次数消息时此处方法会被调用
+        // 生产中可以进行回退或其他业务操作
+        log.error("消息消费失败,请执行后续处理");
+    }
+
+
+    /**
+     * 是否执行重试机制
+     */
+    @Override
+    protected boolean isRetry() {
+        return true;
+    }
+
+    @Override
+    protected boolean throwException() {
+        // 是否抛出异常,false搭配retry自行处理异常
+        return false;
+    }
+
+    /**
+     * 若需要处理消息过滤,在父级中进行统一处理,或者在此处实现之后,自行处理
+     * @param message 待处理消息
+     * @return true: 本次消息被过滤,false:不过滤
+     */
+    @Override
+    protected boolean filter(TimingSettingMessage message) {
+        // 此处可做消息过滤
+        return false;
+    }
+
+    /**
+     * 监听消费消息,不需要执行业务处理,委派给父类做基础操作,父类做完基础操作后会调用子类的实际处理类型
+     */
+    @Override
+    public void onMessage(TimingSettingMessage message) {
+        super.dispatchMessage(message);
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TimingSettingReplyMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TimingSettingReplyMessageListener.java
deleted file mode 100644
index 09cdf0d..0000000
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TimingSettingReplyMessageListener.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package com.ruoyi.integration.rocket.listener;
-
-import com.ruoyi.integration.api.model.Online;
-import com.ruoyi.integration.api.model.TimingSettingReply;
-import com.ruoyi.integration.mongodb.service.TimingSettingReplyService;
-import com.ruoyi.integration.rocket.model.TimingSettingReplyMessage;
-import com.ruoyi.integration.rocket.util.EnhanceMessageHandler;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
-import org.apache.rocketmq.spring.core.RocketMQListener;
-import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-@Slf4j
-@Component
-@RocketMQMessageListener(
-        consumerGroup = "enhance_consumer_group",
-        topic = "rocket_enhance",
-        selectorExpression = "*",
-        consumeThreadMax = 5 //默认是64个线程并发消息,配置 consumeThreadMax 参数指定并发消费线程数,避免太大导致资源不够
-)
-public class TimingSettingReplyMessageListener extends EnhanceMessageHandler<TimingSettingReplyMessage> implements RocketMQListener<TimingSettingReplyMessage> {
-
-    @Autowired
-    private TimingSettingReplyService timingSettingReplyService;
-    @Override
-    protected void handleMessage(TimingSettingReplyMessage message) throws Exception {
-        // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试
-        log.info("对时设置应答-业务消息处理:{}",message);
-        // 持久化消息
-        TimingSettingReply timingSettingReply = new TimingSettingReply();
-        BeanUtils.copyProperties(message,timingSettingReply);
-        timingSettingReplyService.create(timingSettingReply);
-        // 业务处理
-    }
-
-    @Override
-    protected void handleMaxRetriesExceeded(TimingSettingReplyMessage message) {
-        // 当超过指定重试次数消息时此处方法会被调用
-        // 生产中可以进行回退或其他业务操作
-        log.error("消息消费失败,请执行后续处理");
-    }
-
-
-    /**
-     * 是否执行重试机制
-     */
-    @Override
-    protected boolean isRetry() {
-        return true;
-    }
-
-    @Override
-    protected boolean throwException() {
-        // 是否抛出异常,false搭配retry自行处理异常
-        return false;
-    }
-
-    /**
-     * 若需要处理消息过滤,在父级中进行统一处理,或者在此处实现之后,自行处理
-     * @param message 待处理消息
-     * @return true: 本次消息被过滤,false:不过滤
-     */
-    @Override
-    protected boolean filter(TimingSettingReplyMessage message) {
-        // 此处可做消息过滤
-        return false;
-    }
-
-    /**
-     * 监听消费消息,不需要执行业务处理,委派给父类做基础操作,父类做完基础操作后会调用子类的实际处理类型
-     */
-    @Override
-    public void onMessage(TimingSettingReplyMessage message) {
-        super.dispatchMessage(message);
-    }
-}
\ No newline at end of file
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TransactionRecordMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TransactionRecordMessageListener.java
index bc3780f..d0c6380 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TransactionRecordMessageListener.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TransactionRecordMessageListener.java
@@ -1,7 +1,11 @@
 package com.ruoyi.integration.rocket.listener;
 
+import com.ruoyi.integration.api.model.ConfirmTransactionRecord;
 import com.ruoyi.integration.api.model.Online;
 import com.ruoyi.integration.api.model.TransactionRecord;
+import com.ruoyi.integration.iotda.enums.ServiceIdMenu;
+import com.ruoyi.integration.iotda.utils.produce.IotMessageProduce;
+import com.ruoyi.integration.iotda.utils.tools.MessageUtil;
 import com.ruoyi.integration.mongodb.service.TransactionRecordService;
 import com.ruoyi.integration.rocket.model.TransactionRecordMessage;
 import com.ruoyi.integration.rocket.util.EnhanceMessageHandler;
@@ -24,6 +28,10 @@
 
     @Autowired
     private TransactionRecordService transactionRecordService;
+    @Autowired
+    private IotMessageProduce iotMessageProduce;
+    @Autowired
+    private MessageUtil messageUtil;
     @Override
     protected void handleMessage(TransactionRecordMessage message) throws Exception {
         // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试
@@ -33,6 +41,10 @@
         BeanUtils.copyProperties(message,transactionRecord);
         transactionRecordService.create(transactionRecord);
         // 业务处理
+        ConfirmTransactionRecord confirmTransactionRecord = new ConfirmTransactionRecord();
+        confirmTransactionRecord.setTransaction_serial_number(message.getTransaction_serial_number());
+        confirmTransactionRecord.setConfirm_result(0);
+        iotMessageProduce.sendMessage(confirmTransactionRecord.getTransaction_serial_number(), ServiceIdMenu.CONFIRM_TRANSACTION_RECORD.getKey(),messageUtil.confirmTransactionRecord(confirmTransactionRecord));
     }
 
     @Override
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/UploadRealTimeMonitoringDataMessageListener.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/UploadRealTimeMonitoringDataMessageListener.java
index f28993e..dc6342c 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/UploadRealTimeMonitoringDataMessageListener.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/UploadRealTimeMonitoringDataMessageListener.java
@@ -1,11 +1,14 @@
 package com.ruoyi.integration.rocket.listener;
 
+import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyDetailClient;
+import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
 import com.ruoyi.integration.api.model.Online;
 import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
 import com.ruoyi.integration.mongodb.service.UploadRealTimeMonitoringDataService;
 import com.ruoyi.integration.rocket.model.UploadRealTimeMonitoringDataMessage;
 import com.ruoyi.integration.rocket.util.EnhanceMessageHandler;
 import com.ruoyi.order.api.feignClient.ChargingOrderClient;
+import com.ruoyi.order.api.model.TChargingOrder;
 import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
@@ -15,6 +18,9 @@
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Objects;
 
 @Slf4j
 @Component
@@ -31,12 +37,10 @@
     
     @Resource
     private ChargingOrderClient chargingOrderClient;
-    
-    
-    
-    
-    
-    
+    @Resource
+    private AccountingStrategyDetailClient accountingStrategyDetailClient;
+
+
     @Override
     protected void handleMessage(UploadRealTimeMonitoringDataMessage message) throws Exception {
         // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试
@@ -44,11 +48,31 @@
         // 持久化消息
         UploadRealTimeMonitoringData uploadRealTimeMonitoringData = new UploadRealTimeMonitoringData();
         BeanUtils.copyProperties(message,uploadRealTimeMonitoringData);
+        // 查询mogondb上一条数据
+        UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataService.getLastDataById(message.getTransaction_serial_number());
+        // 查询订单
+        TChargingOrder chargingOrder = chargingOrderClient.getOrderByCode(message.getTransaction_serial_number()).getData();
+        // 查询当前时间段的计费策略
+        TAccountingStrategyDetail accountingStrategyDetail = accountingStrategyDetailClient.getDetailBySiteId(chargingOrder.getSiteId()).getData();
+        uploadRealTimeMonitoringData.setElectrovalence_all(accountingStrategyDetail.getElectrovalence());
+        uploadRealTimeMonitoringData.setService_charge(accountingStrategyDetail.getServiceCharge());
+        if (Objects.nonNull(data)) {
+            uploadRealTimeMonitoringData.setLast_time(data.getLast_time());
+            uploadRealTimeMonitoringData.setPeriod_electric_price(message.getPaid_amount().divide(data.getPaid_amount()));
+            uploadRealTimeMonitoringData.setPeriod_charging_degree(message.getCharging_degree().divide(data.getCharging_degree()));
+            uploadRealTimeMonitoringData.setPeriod_service_price(message.getCharging_degree().multiply(accountingStrategyDetail.getServiceCharge()).setScale(4, RoundingMode.HALF_UP));
+        }else {
+            log.info("首次上传实时监测数据");
+            uploadRealTimeMonitoringData.setPeriod_electric_price(message.getPaid_amount());
+            uploadRealTimeMonitoringData.setPeriod_charging_degree(message.getCharging_degree());
+            uploadRealTimeMonitoringData.setPeriod_service_price(message.getCharging_degree().multiply(accountingStrategyDetail.getServiceCharge()).setScale(4, RoundingMode.HALF_UP));
+        }
         uploadRealTimeMonitoringDataService.create(uploadRealTimeMonitoringData);
         // 业务处理
         UploadRealTimeMonitoringDataQuery query = new UploadRealTimeMonitoringDataQuery();
         BeanUtils.copyProperties(uploadRealTimeMonitoringData, query);
         chargingOrderClient.chargeMonitoring(query);
+
     }
 
     @Override
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/EndChargeMessage.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/EndChargeMessage.java
new file mode 100644
index 0000000..4cfaafa
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/EndChargeMessage.java
@@ -0,0 +1,29 @@
+package com.ruoyi.integration.rocket.model;
+
+import com.ruoyi.integration.rocket.base.BaseMessage;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 充电结束
+ **/
+
+@Data
+public class EndChargeMessage extends BaseMessage {
+
+    private String transaction_serial_number; // 交易流水号
+    private String charging_pile_code; // 桩编码
+    private String charging_gun_code; // 抢号
+    private BigDecimal bms_battery_charging_status; // BMS 中止荷电状态 SOC
+    private BigDecimal bms_minimum_battery_voltage; // BMS 动力蓄电池单体最低电压
+    private BigDecimal bms_maximum_battery_voltage; // BMS 动力蓄电池单体最高电压
+    private Integer bms_minimum_battery_temperature; // BMS 动力蓄电池最低温度
+    private Integer bms_maximum_battery_temperature; // BMS 动力蓄电池最高温度
+    private BigDecimal cumulative_charging_time; // 电桩累计充电时间
+    private BigDecimal output_energy; // 电桩输出能量
+    private String charger_code; // 电桩充电机编号
+
+}
+
+
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/TimingSettingMessage.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/TimingSettingMessage.java
new file mode 100644
index 0000000..6b7186c
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/TimingSettingMessage.java
@@ -0,0 +1,17 @@
+package com.ruoyi.integration.rocket.model;
+
+import com.ruoyi.integration.rocket.base.BaseMessage;
+import lombok.Data;
+
+/**
+ * 对时设置
+ **/
+
+@Data
+public class TimingSettingMessage extends BaseMessage {
+
+    private String charging_pile_code; //桩编码
+    private String current_time; //当前时间
+}
+
+
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/EnhanceProduce.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/EnhanceProduce.java
index 5586e13..a851ff7 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/EnhanceProduce.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/EnhanceProduce.java
@@ -48,6 +48,17 @@
         message.setSource(SendTagConstant.PING);
         return rocketMQEnhanceTemplate.send(TOPIC, SendTagConstant.PING, message);
     }
+    /**
+     * 充电结束
+     */
+    public SendResult endChargeMessage(JSONObject jsonObject) {
+        PingMessage message = JSON.parseObject(jsonObject.toJSONString(),PingMessage.class);
+        // 设置业务key
+        message.setKey(UUID.randomUUID().toString());
+        // 设置消息来源,便于查询
+        message.setSource(SendTagConstant.END_CHARGE);
+        return rocketMQEnhanceTemplate.send(TOPIC, SendTagConstant.END_CHARGE, message);
+    }
 
     /**
      * 计费模型验证请求
@@ -242,15 +253,15 @@
     }
 
     /**
-     * 对时设置应答
+     * 对时设置
      */
-    public SendResult timingSettingReplyMessage(JSONObject jsonObject) {
-        TimingSettingReplyMessage message = JSON.parseObject(jsonObject.toJSONString(),TimingSettingReplyMessage.class);
+    public SendResult timingSettingMessage(JSONObject jsonObject) {
+        TimingSettingMessage message = JSON.parseObject(jsonObject.toJSONString(),TimingSettingMessage.class);
         // 设置业务key
         message.setKey(UUID.randomUUID().toString());
         // 设置消息来源,便于查询
-        message.setSource(SendTagConstant.TIMING_SETTING_REPLY);
-        return rocketMQEnhanceTemplate.send(TOPIC, SendTagConstant.TIMING_SETTING_REPLY, message);
+        message.setSource(SendTagConstant.TIMING_SETTING);
+        return rocketMQEnhanceTemplate.send(TOPIC, SendTagConstant.TIMING_SETTING, message);
     }
 
     /**
diff --git a/ruoyi-service/ruoyi-order/pom.xml b/ruoyi-service/ruoyi-order/pom.xml
index 51c211d..f5641e4 100644
--- a/ruoyi-service/ruoyi-order/pom.xml
+++ b/ruoyi-service/ruoyi-order/pom.xml
@@ -140,6 +140,18 @@
             <scope>test</scope>
         </dependency>
 
+        <dependency>
+            <groupId>cn.afterturn</groupId>
+            <artifactId>easypoi-spring-boot-starter</artifactId>
+            <version>4.0.0</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>guava</artifactId>
+                    <groupId>com.google.guava</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
     </dependencies>
 
     <build>
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/AccountingStrategyDetailOrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/AccountingStrategyDetailOrderController.java
new file mode 100644
index 0000000..ce14d4a
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/AccountingStrategyDetailOrderController.java
@@ -0,0 +1,39 @@
+package com.ruoyi.order.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.order.api.model.AccountingStrategyDetailOrder;
+import com.ruoyi.order.service.AccountingStrategyDetailOrderService;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/9/4 16:17
+ */
+@RestController
+@RequestMapping("/accountingStrategyDetailOrder")
+public class AccountingStrategyDetailOrderController {
+	
+	@Resource
+	private AccountingStrategyDetailOrderService accountingStrategyDetailOrderService;
+	
+	
+	/**
+	 * 根据订单id获取当前有效的策略
+	 * @param orderId
+	 * @return
+	 */
+	@PostMapping("/getNowAccountingStrategyDetailOrder")
+	public R<AccountingStrategyDetailOrder> getNowAccountingStrategyDetailOrder(@RequestParam("orderId") Long orderId){
+		AccountingStrategyDetailOrder one = accountingStrategyDetailOrderService.getOne(new LambdaQueryWrapper<AccountingStrategyDetailOrder>()
+				.eq(AccountingStrategyDetailOrder::getChargingOrderId, orderId)
+				.last(" and DATE_FORMAT(now(), '%H:%i') between start_time and end_time"));
+		return R.ok(one);
+	}
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChargingBillController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChargingBillController.java
new file mode 100644
index 0000000..cfed3a4
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChargingBillController.java
@@ -0,0 +1,91 @@
+package com.ruoyi.order.controller;
+
+
+import com.ruoyi.account.api.feignClient.AppUserCarClient;
+import com.ruoyi.account.api.feignClient.AppUserClient;
+import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient;
+import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient;
+import com.ruoyi.chargingPile.api.feignClient.ParkingLotClient;
+import com.ruoyi.chargingPile.api.feignClient.SiteClient;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.redis.service.RedisService;
+import com.ruoyi.common.security.service.TokenService;
+import com.ruoyi.order.api.vo.ChargingBillVO;
+import com.ruoyi.order.api.vo.ChargingOrderTimeVO;
+import com.ruoyi.order.dto.ChargingBillQuery;
+import com.ruoyi.order.dto.ChargingListQuery;
+import com.ruoyi.order.service.*;
+import com.ruoyi.order.vo.ChargingOrderListInfoVO;
+import com.ruoyi.payment.api.feignClient.AliPaymentClient;
+import com.ruoyi.payment.api.feignClient.WxPaymentClient;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author xiaochen
+ * @since 2024-08-07
+ */
+@Api(tags = "充电算帐单")
+@RestController
+@RequestMapping("/chargingBill")
+public class ChargingBillController {
+
+    @Resource
+    private TChargingOrderService chargingOrderService;
+    @Autowired
+    private TokenService tokenService;
+    @Autowired
+    private TOrderEvaluateService orderEvaluateService;
+
+    @Resource
+    private WxPaymentClient wxPaymentClient;
+
+    @Resource
+    private RedisService redisService;
+
+    @Resource
+    private AliPaymentClient aliPaymentClient;
+    @Resource
+    private TShoppingOrderService shoppingOrderService;
+
+    @Resource
+    private AppUserClient appUserClient;
+
+    @Resource
+    private TVipOrderService vipOrderService;
+    @Resource
+    private ParkingLotClient parkingLotClient;
+    @Resource
+    private TChargingOrderRefundService chargingOrderRefundService;
+
+    @Resource
+    private TShoppingOrderRefundService shoppingOrderRefundService;
+    @Resource
+    private TVipOrderRefundService vipOrderRefundService;
+    @Resource
+    private SiteClient siteClient;
+    @Resource
+    private ChargingPileClient chargingPileClient;
+    @Resource
+    private ChargingGunClient chargingGunClient;
+    @Resource
+    private AppUserCarClient appUserCarClient;
+    @Resource
+    private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService;
+    @ResponseBody
+    @PostMapping(value = "/chargingList")
+    @ApiOperation(value = "充电算帐单列表查询", tags = {"管理后台-充电算账单"})
+    public AjaxResult<ChargingBillVO> chargingList(@RequestBody ChargingListQuery dto) {
+
+        return AjaxResult.success(null);
+    }
+}
+
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 63e7ff5..9e67183 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
@@ -1,4 +1,5 @@
 package com.ruoyi.order.controller;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.google.common.collect.Lists;
 
 import java.math.BigDecimal;
@@ -457,7 +458,24 @@
     }
     
     
-
+    /**
+     * 远程启动失败后退款回调
+     * @param request
+     */
+    @ResponseBody
+    @PostMapping(value = "/chargingOrderStartupFailureWxRefund")
+    public void chargingOrderStartupFailureWxRefund(HttpServletRequest request){
+        WxRefundNotifyResp data = wxPaymentClient.refundNotify(request).getData();
+        if(null != data){
+            String out_refund_no = data.getOut_refund_no();
+            String refund_id = data.getRefund_id();
+            String tradeState = data.getTradeState();
+            String success_time = data.getSuccess_time();
+            chargingOrderService.chargingOrderStartupFailureWxRefund(out_refund_no, refund_id, tradeState, success_time);
+        }
+    }
+    
+    
     
 
 
@@ -627,7 +645,17 @@
     public void chargeMonitoring(@RequestBody UploadRealTimeMonitoringDataQuery query){
         chargingOrderService.chargeMonitoring(query);
     }
-    
+    /**
+     * 通过流水号查询订单
+     * @param code
+     * @return
+     */
+    @PostMapping(value = "/getOrderByCode/{code}")
+    public R<TChargingOrder> getOrderByCode(@PathVariable("code") String code){
+        return R.ok(chargingOrderService.getOne(Wrappers.lambdaQuery(TChargingOrder.class)
+                .eq(TChargingOrder::getCode,code)));
+    }
+
 
 
 
@@ -760,4 +788,22 @@
         return resultList;
     }
 
+
+    /**
+     * 硬件充电结束后的处理逻辑
+     * @param code
+     */
+    @PostMapping("/endCharge")
+    public void endCharge(@RequestParam("code") String code){
+        chargingOrderService.endCharge(code, 2);
+    }
+
+    /**
+     * 硬件异常结束充电后的处理逻辑
+     * @param code
+     */
+    @PostMapping("/excelEndCharge")
+    public void excelEndCharge(@RequestParam("code") String code){
+        chargingOrderService.excelEndCharge(code);
+    }
 }
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderAppealController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderAppealController.java
index 2a771c7..9a12758 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderAppealController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderAppealController.java
@@ -84,6 +84,7 @@
     public R manageFeedback(@RequestBody ManageFeedbackDto manageFeedbackDto) {
         TOrderAppeal byId = orderAppealService.getById(manageFeedbackDto.getId());
         byId.setFeedback(manageFeedbackDto.getFeedback());
+        byId.setStatus(2);
         orderAppealService.updateById(byId);
         return R.ok();
     }
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderInvoiceController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderInvoiceController.java
index 8e2cd80..5bbdf95 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderInvoiceController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderInvoiceController.java
@@ -1,18 +1,37 @@
 package com.ruoyi.order.controller;
 
 
+import cn.afterturn.easypoi.excel.ExcelExportUtil;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
+import com.ruoyi.common.core.utils.DateUtils;
+import com.ruoyi.common.core.utils.WebUtils;
 import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.core.web.page.PageInfo;
+import com.ruoyi.common.log.annotation.Log;
+import com.ruoyi.common.log.enums.BusinessType;
+import com.ruoyi.order.api.model.TOrderInvoice;
+import com.ruoyi.order.api.query.TOrderInvoiceQuery;
+import com.ruoyi.order.api.vo.TOrderInvoiceVO;
 import com.ruoyi.order.dto.AddOrderInvoice;
 import com.ruoyi.order.dto.GetOrderInvoiceList;
 import com.ruoyi.order.dto.MyOrderInvoiceInfo;
 import com.ruoyi.order.dto.OrderInvoiceList;
+import com.ruoyi.order.export.OrderInvoiceExport;
 import com.ruoyi.order.service.TOrderInvoiceService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.springframework.beans.BeanUtils;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -39,8 +58,68 @@
 	public AjaxResult addOrderInvoice(@RequestBody AddOrderInvoice addOrderInvoice){
 		return orderInvoiceService.addOrderInvoice(addOrderInvoice);
 	}
-	
-	
+
+	@PostMapping("/pageList")
+	@ApiOperation(value = "查询开票分页列表", tags = {"管理后台-发票管理"})
+	public AjaxResult<PageInfo<TOrderInvoiceVO>> pageList(@RequestBody TOrderInvoiceQuery query){
+		return AjaxResult.success(orderInvoiceService.pageList(query));
+	}
+
+	@GetMapping("/uploadPdf")
+	@ApiOperation(value = "上传发票", tags = {"管理后台-发票管理"})
+	public AjaxResult<String> uploadPdf(@RequestParam("id") Long id,
+										@RequestParam("invoiceUrl") String invoiceUrl){
+		TOrderInvoice orderInvoice = orderInvoiceService.getById(id);
+		orderInvoice.setInvoiceUrl(invoiceUrl);
+		orderInvoiceService.updateById(orderInvoice);
+		return AjaxResult.success();
+	}
+
+	@PostMapping("/statusCount")
+	@ApiOperation(value = "查询开票状态数量", tags = {"管理后台-发票管理"})
+	public AjaxResult<Map<String,Integer>> statusCount(@RequestBody TOrderInvoiceQuery query){
+		return AjaxResult.success(orderInvoiceService.statusCount(query));
+	}
+
+	/**
+	 * 发票管理导出
+	 */
+	@ApiOperation(value = "发票管理导出")
+	@Log(title = "发票管理导出", businessType = BusinessType.EXPORT)
+	@PostMapping("/export")
+	public void export(@RequestBody TOrderInvoiceQuery query)
+	{
+		List<TOrderInvoiceVO> list = orderInvoiceService.export(query);
+		List<OrderInvoiceExport> orderInvoiceExports = new ArrayList<>();
+		for (TOrderInvoiceVO orderInvoiceVO : list) {
+			OrderInvoiceExport orderInvoiceExport = new OrderInvoiceExport();
+			BeanUtils.copyProperties(orderInvoiceVO,orderInvoiceExport);
+			orderInvoiceExport.setBillingTime(DateUtils.localDateTimeToString(orderInvoiceVO.getBillingTime()));
+			orderInvoiceExports.add(orderInvoiceExport);
+		}
+		Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), OrderInvoiceExport.class, orderInvoiceExports);
+		HttpServletResponse response = WebUtils.response();
+		response.setContentType("application/vnd.ms-excel");
+		response.setCharacterEncoding("utf-8");
+		ServletOutputStream outputStream = null;
+		try {
+			String fileName = URLEncoder.encode("发票导出.xls", "utf-8");
+			response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
+			response.setContentType("application/vnd.ms-excel;charset=UTF-8");
+			response.setHeader("Pragma", "no-cache");
+			response.setHeader("Cache-Control", "no-cache");
+			outputStream = response.getOutputStream();
+			workbook.write(outputStream);
+		} catch (IOException e) {
+			e.printStackTrace();
+		} finally {
+			try {
+				outputStream.close();
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+	}
 	
 	@ResponseBody
 	@GetMapping("/getMyOrderInvoiceList")
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ChargingBillQuery.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ChargingBillQuery.java
new file mode 100644
index 0000000..92add42
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ChargingBillQuery.java
@@ -0,0 +1,37 @@
+package com.ruoyi.order.dto;
+
+import com.ruoyi.common.core.web.page.BasePage;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class ChargingBillQuery extends BasePage {
+    @ApiModelProperty("订单编号")
+    private String code;
+
+    @ApiModelProperty("电站id")
+    private Integer siteId;
+    @ApiModelProperty("状态(0=未知,1=等待中,2=启动中,3=充电中,4=停止中,5=已结束)")
+    private Integer status;
+
+    @ApiModelProperty("手机号")
+    private String phone;
+    @ApiModelProperty("车牌号")
+    private String licensePlate;
+
+    @ApiModelProperty("订单类型(1=充电订单(小程序),2=充电订单(刷卡))")
+    private Integer orderType;
+
+    @ApiModelProperty("开始时间 2020-01-01 12:00:00 - 2020-01-01 23:00:00")
+    private String startTime;
+
+    @ApiModelProperty("结束时间 2020-01-01 12:00:00 - 2020-01-01 23:00:00")
+    private String endTime;
+    @ApiModelProperty("用户ids 前端忽略")
+    private List<Long> userIds;
+    @ApiModelProperty("车辆ids 前端忽略")
+    private List<Long> carIds;
+
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ChargingListQuery.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ChargingListQuery.java
index e9187bb..875df2f 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ChargingListQuery.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ChargingListQuery.java
@@ -1,6 +1,7 @@
 package com.ruoyi.order.dto;
 
 import com.ruoyi.common.core.web.page.BasePage;
+import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -8,31 +9,12 @@
 import java.util.List;
 
 @Data
+@ApiModel(value = "充电账单列表查询参数")
 public class ChargingListQuery extends BasePage {
-    @ApiModelProperty("订单编号")
-    private String code;
-
-    @ApiModelProperty("电站id")
-    private Integer siteId;
-    @ApiModelProperty("状态(0=未知,1=等待中,2=启动中,3=充电中,4=停止中,5=已结束)")
-    private Integer status;
-
-    @ApiModelProperty("手机号")
-    private String phone;
-    @ApiModelProperty("车牌号")
-    private String licensePlate;
-
-    @ApiModelProperty("订单类型(1=充电订单(小程序),2=充电订单(刷卡))")
-    private Integer orderType;
-
-    @ApiModelProperty("开始时间 2020-01-01 12:00:00 - 2020-01-01 23:00:00")
+    @ApiModelProperty("订单分类 1全站 2各个站点")
+    private String category;
+    @ApiModelProperty("账单周期2020-01-01 - 2020-01-01")
     private String startTime;
-
-    @ApiModelProperty("结束时间 2020-01-01 12:00:00 - 2020-01-01 23:00:00")
-    private String endTime;
-    @ApiModelProperty("用户ids 前端忽略")
-    private List<Long> userIds;
-    @ApiModelProperty("车辆ids 前端忽略")
-    private List<Long> carIds;
-
+    @ApiModelProperty("1已出账 2未出账")
+    private Integer state;
 }
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderDto.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderDto.java
index 762d550..6fd7392 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderDto.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderDto.java
@@ -1,11 +1,13 @@
 package com.ruoyi.order.dto;
 
+import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.time.LocalDateTime;
 
 @Data
+@ApiModel("支付订单返回Dto")
 public class PayOrderDto {
     private String id;
     @ApiModelProperty("1充电订单2购物订单3vip订单4停车订单")
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderQueryDto.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderQueryDto.java
index f79abb4..392cebb 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderQueryDto.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderQueryDto.java
@@ -1,12 +1,15 @@
 package com.ruoyi.order.dto;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ruoyi.common.core.web.page.BasePage;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.time.LocalDateTime;
 @Data
+@ApiModel("支付订单查询dto")
 public class PayOrderQueryDto extends BasePage {
     @ApiModelProperty("订单编号")
     private String code;
@@ -18,8 +21,10 @@
     private Integer isRefund;
 
     @ApiModelProperty("下单时间1")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime createTime1;
     @ApiModelProperty("下单时间2")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime createTime2;
 
 }
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/OrderInvoiceExport.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/OrderInvoiceExport.java
new file mode 100644
index 0000000..9434e69
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/OrderInvoiceExport.java
@@ -0,0 +1,79 @@
+package com.ruoyi.order.export;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+@ApiModel(value = "导出发票")
+public class OrderInvoiceExport implements Serializable {
+
+    @Excel(name = "申请单编号",width = 30)
+    private String code;
+
+    @Excel(name  = "申请日期",width = 30)
+    private String billingTime;
+
+    @Excel(name  = "开票公司",width = 30)
+    private String invoicingCompany;
+
+    @Excel(name  = "发票类型",width = 30)
+    private String invoiceType;
+
+    @Excel(name  = "发票种类",replace = {"纸质发票_1","电子发票_2"},width = 30)
+    private Integer invoiceMaterial;
+
+    @Excel(name  = "开票方式",replace = {"人工_1","自动_2"},width = 30)
+    private Integer invoicingMethod;
+
+    @Excel(name  = "开票总金额",width = 30)
+    private BigDecimal totalAmount;
+
+    @Excel(name  = "服务费",width = 30)
+    private BigDecimal serviceCharge;
+
+    @Excel(name  = "服务费税率",width = 30)
+    private BigDecimal serviceTariff;
+
+    @Excel(name  = "增值服务费",width = 30)
+    private BigDecimal addedService;
+
+    @Excel(name  = "增值服务费税率",width = 30)
+    private BigDecimal addedServiceTariff;
+
+//    @Excel(name  = "开票订单类型",replace = {"充电订单_1","购物订单_2","兑换订单_3","会员订单_4"},width = 30)
+//    private Integer orderType;
+
+    @Excel(name  = "抬头类型",replace = {"个人_1","企业_2"},width = 30)
+    private Integer invoicingObjectType;
+
+    @Excel(name  = "发票抬头",width = 30)
+    private String name;
+
+    @Excel(name  = "开户银行",width = 30)
+    private String depositBank;
+
+    @Excel(name  = "银行账户",width = 30)
+    private String bankAccount;
+
+    @Excel(name  = "公司电话",width = 30)
+    private String companyPhone;
+
+    @Excel(name  = "纳税识别号",width = 30)
+    private String taxIdentificationNumber;
+
+    @Excel(name  = "公司地址",width = 30)
+    private String companyAddress;
+
+    @Excel(name  = "邮箱",width = 30)
+    private String mailbox;
+
+    @Excel(name  = "状态",replace = {"待开票_1","开票中_2","已开票_3"},width = 30)
+    private Integer status;
+
+    @Excel(name  = "用户电话",width = 30)
+    private String userPhone;
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/AccountingStrategyDetailOrderMapper.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/AccountingStrategyDetailOrderMapper.java
new file mode 100644
index 0000000..f40366d
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/AccountingStrategyDetailOrderMapper.java
@@ -0,0 +1,11 @@
+package com.ruoyi.order.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.order.api.model.AccountingStrategyDetailOrder;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/9/4 15:42
+ */
+public interface AccountingStrategyDetailOrderMapper extends BaseMapper<AccountingStrategyDetailOrder> {
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/AccountingStrategyOrderMapper.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/AccountingStrategyOrderMapper.java
new file mode 100644
index 0000000..db0c466
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/AccountingStrategyOrderMapper.java
@@ -0,0 +1,11 @@
+package com.ruoyi.order.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.order.api.model.AccountingStrategyOrder;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/9/4 15:37
+ */
+public interface AccountingStrategyOrderMapper extends BaseMapper<AccountingStrategyOrder> {
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TOrderInvoiceMapper.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TOrderInvoiceMapper.java
index 224b5dd..9a6fdad 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TOrderInvoiceMapper.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TOrderInvoiceMapper.java
@@ -1,8 +1,15 @@
 package com.ruoyi.order.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.common.core.web.page.PageInfo;
 import com.ruoyi.order.api.model.TOrderInvoice;
+import com.ruoyi.order.api.query.TOrderInvoiceQuery;
+import com.ruoyi.order.api.vo.TOrderInvoiceVO;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -15,4 +22,26 @@
 @Mapper
 public interface TOrderInvoiceMapper extends BaseMapper<TOrderInvoice> {
 
+    /**
+     * 发票分页查询
+     * @param query
+     * @param pageInfo
+     * @return
+     */
+    List<TOrderInvoiceVO> pageList(@Param("query") TOrderInvoiceQuery query, @Param("pageInfo")PageInfo<TOrderInvoiceVO> pageInfo);
+
+    /**
+     * 查询开票状态数量
+     * @param query
+     * @return
+     */
+    Map<String, Integer> statusCount(@Param("query")TOrderInvoiceQuery query);
+
+    /**
+     * 导出
+     * @param query
+     * @return
+     */
+    List<TOrderInvoiceVO> export(@Param("query")TOrderInvoiceQuery query);
+
 }
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/AccountingStrategyDetailOrderService.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/AccountingStrategyDetailOrderService.java
new file mode 100644
index 0000000..dc430bb
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/AccountingStrategyDetailOrderService.java
@@ -0,0 +1,11 @@
+package com.ruoyi.order.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.order.api.model.AccountingStrategyDetailOrder;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/9/4 15:41
+ */
+public interface AccountingStrategyDetailOrderService extends IService<AccountingStrategyDetailOrder> {
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/AccountingStrategyOrderService.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/AccountingStrategyOrderService.java
new file mode 100644
index 0000000..41e4657
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/AccountingStrategyOrderService.java
@@ -0,0 +1,11 @@
+package com.ruoyi.order.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.order.api.model.AccountingStrategyOrder;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/9/4 15:36
+ */
+public interface AccountingStrategyOrderService extends IService<AccountingStrategyOrder> {
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
index df5281e..78d11b6 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
@@ -17,6 +17,7 @@
 import com.ruoyi.order.dto.*;
 import com.ruoyi.order.vo.ChargingOrderListInfoVO;
 import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
@@ -140,4 +141,18 @@
 	 * @param query
 	 */
 	void chargeMonitoring(UploadRealTimeMonitoringDataQuery query);
+	
+	
+	/**
+	 * 自动结束充电后的处理逻辑
+	 * @param code
+	 */
+	void endCharge(String code, Integer endMode);
+	
+	
+	/**
+	 * 异常结束充电处理逻辑
+	 * @param orderCode
+	 */
+	void excelEndCharge(String orderCode);
 }
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TOrderInvoiceService.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TOrderInvoiceService.java
index d44196e..366df75 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TOrderInvoiceService.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TOrderInvoiceService.java
@@ -2,13 +2,17 @@
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.core.web.page.PageInfo;
 import com.ruoyi.order.api.model.TOrderInvoice;
+import com.ruoyi.order.api.query.TOrderInvoiceQuery;
+import com.ruoyi.order.api.vo.TOrderInvoiceVO;
 import com.ruoyi.order.dto.AddOrderInvoice;
 import com.ruoyi.order.dto.GetOrderInvoiceList;
 import com.ruoyi.order.dto.MyOrderInvoiceInfo;
 import com.ruoyi.order.dto.OrderInvoiceList;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -43,4 +47,26 @@
 	 * @return
 	 */
 	MyOrderInvoiceInfo getMyOrderInvoiceInfo(String id);
+
+	/**
+	 * 查询开票分页列表
+	 * @param query
+	 * @return
+	 */
+	PageInfo<TOrderInvoiceVO> pageList(TOrderInvoiceQuery query);
+
+	/**
+	 * 查询开票状态数量
+	 * @param query
+	 * @return
+	 */
+	Map<String,Integer> statusCount(TOrderInvoiceQuery query);
+
+	/**
+	 * 发票管理导出
+	 * @param query
+	 * @return
+	 */
+	List<TOrderInvoiceVO> export(TOrderInvoiceQuery query);
+
 }
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/AccountingStrategyDetailOrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/AccountingStrategyDetailOrderServiceImpl.java
new file mode 100644
index 0000000..ae06c37
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/AccountingStrategyDetailOrderServiceImpl.java
@@ -0,0 +1,15 @@
+package com.ruoyi.order.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.order.api.model.AccountingStrategyDetailOrder;
+import com.ruoyi.order.mapper.AccountingStrategyDetailOrderMapper;
+import com.ruoyi.order.service.AccountingStrategyDetailOrderService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/9/4 15:42
+ */
+@Service
+public class AccountingStrategyDetailOrderServiceImpl extends ServiceImpl<AccountingStrategyDetailOrderMapper, AccountingStrategyDetailOrder> implements AccountingStrategyDetailOrderService {
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/AccountingStrategyOrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/AccountingStrategyOrderServiceImpl.java
new file mode 100644
index 0000000..44de5c8
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/AccountingStrategyOrderServiceImpl.java
@@ -0,0 +1,15 @@
+package com.ruoyi.order.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.order.api.model.AccountingStrategyOrder;
+import com.ruoyi.order.mapper.AccountingStrategyOrderMapper;
+import com.ruoyi.order.service.AccountingStrategyOrderService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/9/4 15:36
+ */
+@Service
+public class AccountingStrategyOrderServiceImpl extends ServiceImpl<AccountingStrategyOrderMapper, AccountingStrategyOrder> implements AccountingStrategyOrderService {
+}
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 1f127de..98e14d6 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
@@ -1,24 +1,17 @@
 package com.ruoyi.order.service.impl;
 
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.account.api.feignClient.AppUserCarClient;
-import com.ruoyi.account.api.feignClient.AppUserClient;
-import com.ruoyi.account.api.feignClient.AppUserVipDetailClient;
-import com.ruoyi.account.api.model.TAppUser;
-import com.ruoyi.account.api.model.TAppUserCar;
-import com.ruoyi.account.api.model.TAppUserVipDetail;
+import com.ruoyi.account.api.feignClient.*;
+import com.ruoyi.account.api.model.*;
 import com.ruoyi.account.api.vo.GetAppUserVipDetail;
-import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyDetailClient;
-import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient;
-import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient;
-import com.ruoyi.chargingPile.api.feignClient.SiteClient;
-import com.ruoyi.chargingPile.api.model.Site;
-import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
-import com.ruoyi.chargingPile.api.model.TChargingGun;
-import com.ruoyi.chargingPile.api.model.TChargingPile;
+import com.ruoyi.account.api.vo.GetInviteUser;
+import com.ruoyi.chargingPile.api.feignClient.*;
+import com.ruoyi.chargingPile.api.model.*;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.dto.ChargingOrderGroup;
 import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
@@ -27,6 +20,7 @@
 import com.ruoyi.common.core.web.page.PageInfo;
 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;
@@ -35,6 +29,11 @@
 import com.ruoyi.integration.api.model.PlatformStartCharging;
 import com.ruoyi.integration.api.model.PlatformStartChargingReply;
 import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
+import com.ruoyi.integration.api.feignClient.*;
+import com.ruoyi.integration.api.model.*;
+import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply;
+import com.ruoyi.order.api.feignClient.AccountingStrategyDetailOrderClient;
+import com.ruoyi.order.api.feignClient.ChargingOrderAccountingStrategyClient;
 import com.ruoyi.order.api.model.*;
 import com.ruoyi.order.api.query.ChargingOrderQuery;
 import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery;
@@ -44,27 +43,35 @@
 import com.ruoyi.order.api.vo.TCharingOrderVO;
 import com.ruoyi.order.dto.*;
 import com.ruoyi.order.mapper.TChargingOrderMapper;
-import com.ruoyi.order.service.TChargingOrderAccountingStrategyService;
-import com.ruoyi.order.service.TChargingOrderRefundService;
-import com.ruoyi.order.service.TChargingOrderService;
-import com.ruoyi.order.service.TOrderEvaluateService;
+import com.ruoyi.order.service.*;
 import com.ruoyi.other.api.domain.TCoupon;
 import com.ruoyi.other.api.domain.TGoods;
 import com.ruoyi.order.vo.ChargingOrderListInfoVO;
+import com.ruoyi.other.api.domain.TIntegralRule;
+import com.ruoyi.other.api.feignClient.IntegralRuleClient;
+import com.ruoyi.other.api.feignClient.RoleSiteClient;
+import com.ruoyi.other.api.feignClient.UserSiteClient;
 import com.ruoyi.payment.api.feignClient.AliPaymentClient;
 import com.ruoyi.payment.api.feignClient.WxPaymentClient;
 import com.ruoyi.payment.api.model.RefundReq;
 import com.ruoyi.payment.api.model.RefundResp;
 import com.ruoyi.payment.api.model.WxPaymentRefundModel;
 import com.ruoyi.payment.api.vo.*;
+import com.ruoyi.system.api.domain.SysUser;
+import com.ruoyi.system.api.feignClient.SysUserClient;
 import io.seata.spring.annotation.GlobalTransactional;
 import io.swagger.annotations.ApiModelProperty;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
+import java.math.MathContext;
+import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -86,6 +93,8 @@
 @Service
 public class TChargingOrderServiceImpl extends ServiceImpl<TChargingOrderMapper, TChargingOrder> implements TChargingOrderService {
 	
+	private Logger log = LoggerFactory.getLogger(TChargingOrderServiceImpl.class);
+
 	@Resource
 	private ChargingGunClient chargingGunClient;
 	
@@ -114,7 +123,8 @@
 	private AliPaymentClient aliPaymentClient;
 	
 
-
+	@Resource
+	private AppCouponClient appCouponClient;
 
 	@Resource
 	private AppUserVipDetailClient appUserVipDetailClient;
@@ -139,10 +149,34 @@
 	private AccountingStrategyDetailClient accountingStrategyDetailClient;
 
 	@Resource
+	private AccountingStrategyDetailOrderClient accountingStrategyDetailOrderClient;
+
+	@Resource
+	private AccountingStrategyClient accountingStrategyClient;
+
+	@Resource
 	private PlatformStartChargingReplyClient platformStartChargingReplyClient;
 
 	@Resource
 	private TChargingOrderRefundService chargingOrderRefundService;
+
+	@Resource
+	private PlatformStopChargingReplyClient platformStopChargingReplyClient;
+
+	@Resource
+	private AccountingStrategyOrderService accountingStrategyOrderService;
+
+	@Resource
+	private AccountingStrategyDetailOrderService accountingStrategyDetailOrderService;
+
+	@Resource
+	private InviteUserClient inviteUserClient;
+
+	@Resource
+	private AppUserIntegralChangeClient appUserIntegralChangeClient;
+
+	@Resource
+	private IntegralRuleClient integralRuleClient;
 
 	//计数器
 	private Map<String, Integer> counter_map = new HashMap<>();
@@ -410,6 +444,23 @@
 			
 		}
 		this.save(chargingOrder);
+
+		//添加订单的计费策略
+		TAccountingStrategy accountingStrategy = accountingStrategyClient.getAccountingStrategyById(tChargingGun.getAccountingStrategyId()).getData();
+		List<TAccountingStrategyDetail> strategyDetailList = accountingStrategyDetailClient.getListByAccountingStrategyId(tChargingGun.getAccountingStrategyId()).getData();
+		AccountingStrategyOrder accountingStrategyOrder = new AccountingStrategyOrder();
+		BeanUtils.copyProperties(accountingStrategy, accountingStrategyOrder);
+		accountingStrategyOrder.setChargingOrderId(chargingOrder.getId());
+		accountingStrategyOrderService.save(accountingStrategyOrder);
+		List<AccountingStrategyDetailOrder> list1 = new ArrayList<>();
+		for (TAccountingStrategyDetail tAccountingStrategyDetail : strategyDetailList) {
+			AccountingStrategyDetailOrder accountingStrategyDetailOrder = new AccountingStrategyDetailOrder();
+			BeanUtils.copyProperties(tAccountingStrategyDetail, accountingStrategyDetailOrder);
+			accountingStrategyDetailOrder.setChargingOrderId(chargingOrder.getId());
+			list1.add(accountingStrategyDetailOrder);
+		}
+		accountingStrategyDetailOrderService.saveBatch(list1);
+
 		//会员优惠折扣将其计入增加充电时长(增加总充电金额)
 		//如果充电总金额未使用完,则需要退回费用=(原金额/总金额)*(总金额-实际充电金额)
 		if(1 == addChargingOrder.getPaymentType()){
@@ -457,7 +508,6 @@
 		chargingOrder.setRechargePaymentStatus(2);
 		chargingOrder.setRechargeSerialNumber(transaction_id);
 		chargingOrder.setStatus(2);
-		this.updateById(chargingOrder);
 
 		//添加安全检测数据到缓存中,每步安全检测完成后需要更新缓存数据
 		PreChargeCheck preChargeCheck = new PreChargeCheck();
@@ -472,7 +522,7 @@
 		BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
 		//计算充电金额,会员需要将折扣金额加入到充电总金额中
 		TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
-		TAccountingStrategyDetail strategyDetail = accountingStrategyDetailClient.getNowData(chargingGun.getAccountingStrategyId()).getData();
+		AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderClient.getNowAccountingStrategyDetailOrder(chargingOrder.getId()).getData();
 		//总单价
 		BigDecimal totalUnitPrice = strategyDetail.getServiceCharge().add(strategyDetail.getElectrovalence());
 		//计算能充电的度数
@@ -496,6 +546,8 @@
 			}
 		}
 		electrovalence = electrovalence.add(discount);
+		chargingOrder.setChargeAmount(electrovalence);
+		this.updateById(chargingOrder);
 
 
 		TChargingPile chargingPile = chargingPileClient.getChargingPileById(chargingGun.getChargingPileId()).getData();
@@ -693,6 +745,7 @@
 	 * @return
 	 */
 	@Override
+	@GlobalTransactional(rollbackFor = Exception.class)
 	public AjaxResult stopCharging(String id) {
 		TChargingOrder chargingOrder = this.getById(id);
 		Integer status = chargingOrder.getStatus();
@@ -702,14 +755,229 @@
 		chargingOrder.setStatus(4);
 		chargingOrder.setEndMode(1);
 		this.updateById(chargingOrder);
-		//调用硬件停止充电,停止成功后开始计算费用退款
-		// todo 待完善
+
+		//异步线程处理停机
+		ExecutorService cachedThreadPool = Executors.newFixedThreadPool(1);
+		cachedThreadPool.execute(()->{
+			//调用硬件停止充电,停止成功后开始计算费用退款
+			TChargingPile chargingPile = chargingPileClient.getChargingPileById(chargingOrder.getChargingPileId()).getData();
+			TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
+			PlatformStopCharging platformStopCharging = new PlatformStopCharging();
+			platformStopCharging.setCharging_pile_code(chargingPile.getCode());
+			platformStopCharging.setCharging_gun_code(chargingGun.getCode());
+			sendMessageClient.platformStopCharging(platformStopCharging);
+			//开始查询停机应答,成功后开始计费费用
+			for (int i = 0; i < 60; i++) {
+				GetPlatformStopChargingReply query = new GetPlatformStopChargingReply();
+				query.setCharging_gun_code(chargingGun.getCode());
+				query.setCharging_pile_code(chargingPile.getCode());
+				PlatformStopChargingReply reply = platformStopChargingReplyClient.getPlatformStopChargingReply(query).getData();
+				if(null == reply){
+					try {
+						Thread.sleep(1000);
+					} catch (InterruptedException e) {
+						throw new RuntimeException(e);
+					}
+					continue;
+				}
+
+				if(0 == reply.getStop_result()){
+					String failure_cause = "";
+					switch (reply.getFailure_cause()){
+						case 0:
+							failure_cause = "无";
+							break;
+						case 1:
+							failure_cause = "设备编号不匹配";
+							break;
+						case 2:
+							failure_cause = "枪未处于充电状态";
+							break;
+						case 3:
+							failure_cause = "其他";
+							break;
+					}
+					log.error("停机失败:订单号:{},失败原因:{}", chargingOrder.getCode(), failure_cause);
+					throw new RuntimeException(failure_cause);
+				}
+
+				//计算费用,处理退款
+				endCharge(chargingOrder);
+				break;
+			}
+		});
+
+
+		//处理推荐奖励(被推荐首单奖励)
+		TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
+		long count = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId())
+				.eq(TChargingOrder::getStatus, 5).isNull(TChargingOrder::getEndMode).eq(TChargingOrder::getDelFlag, 0));
+		if(null != appUser.getInviteUserId() && 1 == count){
+			TIntegralRule integralRule = integralRuleClient.getSet().getData();
+			String inviteUsersToEarnPoints = integralRule.getInviteUsersToEarnPoints();
+			JSONObject jsonObject = JSON.parseObject(inviteUsersToEarnPoints);
+			Integer num1 = jsonObject.getInteger("num1");
+			GetInviteUser query = new GetInviteUser();
+			query.setAppUserId(appUser.getInviteUserId());
+			query.setBeInvitedAppUserId(chargingOrder.getAppUserId());
+			TInviteUser inviteUser = inviteUserClient.getInviteUser(query).getData();
+			if(null == inviteUser){
+				inviteUser = new TInviteUser();
+				inviteUser.setAppUserId(appUser.getInviteUserId());
+				inviteUser.setBeInvitedAppUserId(chargingOrder.getAppUserId());
+				inviteUser.setAward(num1);
+				inviteUser.setCreateTime(LocalDateTime.now());
+				inviteUserClient.saveInviteUser(inviteUser);
+			}else{
+				inviteUser.setAward(num1);
+				inviteUserClient.updateInviteUser(inviteUser);
+			}
+			TAppUser appUser1 = appUserClient.getUserById(appUser.getInviteUserId()).getData();
+			TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
+			String code = Math.random() * 1000 + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
+			appUserIntegralChange.setCode(code);
+			appUserIntegralChange.setAppUserId(appUser.getInviteUserId());
+			appUserIntegralChange.setChangeType(5);
+			appUserIntegralChange.setHistoricalIntegral(appUser1.getPoints());
+			appUserIntegralChange.setCurrentIntegral(appUser1.getPoints() + num1);
+			appUserIntegralChange.setCreateTime(LocalDateTime.now());
+			appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
+
+			appUser1.setPoints(appUser1.getPoints() + num1);
+			appUserClient.updateAppUser(appUser1);
+		}
+
 		return AjaxResult.success();
 	}
 
 
+	/**
+	 * 手动结束后的费用计算和退款逻辑
+	 */
+	@GlobalTransactional(rollbackFor = Exception.class)
+	public void endCharge(TChargingOrder chargingOrder){
+		//如果使用优惠券需要判断优惠券是否满足使用条件
+		//根据实际的充电金额计算退款金额   退回费用=(原金额/总金额)*(总金额-实际充电金额)
+		//退款金额=优惠券金额+剩余充电金额
+		List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()));
+		BigDecimal total = BigDecimal.ZERO;
+		for (TChargingOrderAccountingStrategy chargingOrderAccountingStrategy : list) {
+			BigDecimal periodElectricPrice = chargingOrderAccountingStrategy.getPeriodElectricPrice();
+			BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodOriginalServicePrice();
+			total = total.add(periodElectricPrice).add(periodServicePrice);
+		}
+		BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
+		BigDecimal vipDiscountAmount = chargingOrder.getVipDiscountAmount();
+		BigDecimal decimal = rechargeAmount.add(vipDiscountAmount);
+		//退款金额(已经计算了折扣优惠部分)
+		BigDecimal refundAmount = rechargeAmount.divide(decimal, new MathContext(4, RoundingMode.HALF_EVEN)).multiply(decimal.subtract(total));
+		BigDecimal payAmount = BigDecimal.valueOf(total.doubleValue());
+		BigDecimal orderAmount = BigDecimal.valueOf(total.doubleValue());
+		if(null != chargingOrder.getVipDiscount()){
+			orderAmount = orderAmount.divide(chargingOrder.getVipDiscount().divide(new BigDecimal(10)));
+			chargingOrder.setOrderAmount(total);
+		}
 
-	public void endCharge(){
+		if(chargingOrder.getEndMode() == 2){
+			chargingOrder.setEndMode(refundAmount.compareTo(BigDecimal.ZERO) > 0 ? 2 : 3);
+		}
+		chargingOrder.setStatus(5);
+		chargingOrder.setPaymentAmount(payAmount);
+		this.updateById(chargingOrder);
+
+		//计算优惠券
+		if(null != chargingOrder.getAppCouponId()){
+			//判断实际充电金额是否满足优惠券使用条件,如果不满足则不适用优惠券。
+			TAppCoupon appCoupon = appCouponClient.getAppCouponById(chargingOrder.getAppCouponId()).getData();
+			String couponJson = appCoupon.getCouponJson();
+			TCoupon tCoupon = JSON.parseObject(couponJson, TCoupon.class);
+			Integer preferentialMode = tCoupon.getPreferentialMode();
+			if(1 == preferentialMode){
+				//满减
+				if(total.compareTo(tCoupon.getMeetTheConditions()) >= 0){
+					refundAmount = refundAmount.add(tCoupon.getDiscountAmount());
+					chargingOrder.setCouponDiscountAmount(tCoupon.getDiscountAmount());
+					payAmount = payAmount.subtract(tCoupon.getDiscountAmount());
+				}else{
+					chargingOrder.setAppCouponId(null);
+					chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO);
+					appCouponClient.refund(chargingOrder.getAppCouponId().toString());
+				}
+			}
+			if(2 == preferentialMode){
+				//抵扣
+				if(total.compareTo(tCoupon.getMeetTheConditions()) >= 0){
+					//折扣金额
+					BigDecimal divide = total.multiply(new BigDecimal(10).subtract(tCoupon.getDiscount())).divide(new BigDecimal(10));
+					divide = divide.compareTo(tCoupon.getMaximumDiscountAmount()) > 0 ? tCoupon.getMaximumDiscountAmount() : divide;
+					refundAmount = refundAmount.add(divide);
+					chargingOrder.setCouponDiscountAmount(divide);
+					payAmount = payAmount.subtract(divide);
+				}else{
+					chargingOrder.setAppCouponId(null);
+					chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO);
+					appCouponClient.refund(chargingOrder.getAppCouponId().toString());
+				}
+			}
+		}
+
+		if(null != chargingOrder.getVipDiscount()){
+			BigDecimal subtract = orderAmount.subtract(total);
+			chargingOrder.setVipDiscountAmount(subtract);
+			payAmount = payAmount.subtract(subtract);
+		}
+		//开始构建退款费用
+		if(refundAmount.compareTo(BigDecimal.ZERO) > 0){
+			Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
+			//构建退款明细
+			TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
+			chargingOrderRefund.setChargingOrderId(chargingOrder.getId());
+			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+			chargingOrderRefund.setRefundCode("CDF" + sdf.format(new Date()) + (Math.random() * 1000));
+			chargingOrderRefund.setRefundAmount(refundAmount);
+			chargingOrderRefund.setRefundStatus(1);
+			chargingOrderRefund.setPayType(rechargePaymentType);
+			chargingOrderRefund.setRefundStatus(1);
+			chargingOrderRefund.setCode(chargingOrder.getCode());
+			chargingOrderRefund.setRefundTitle("充电完成退款");
+			chargingOrderRefund.setRefundContent("充电完成退款");
+			chargingOrderRefund.setRefundReason("充电完成退款");
+			chargingOrderRefund.setRefundRemark("充电完成退款");
+			chargingOrderRefund.setRefundTotalAmount(refundAmount);
+			chargingOrderRefund.setPayAmount(rechargeAmount);
+			if(1 == rechargePaymentType){
+				WxPaymentRefundModel model = new WxPaymentRefundModel();
+				model.setOut_trade_no(chargingOrder.getCode());
+				model.setOut_refund_no(chargingOrderRefund.getRefundCode());
+				model.setReason("充电完成退款");
+				model.setNotify_url("http://127.0.0.1:9000/order/t-charging-order/chargingOrderStartupFailureWxRefund");
+				WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
+				amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue());
+				amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
+				amount.setCurrency("CNY");
+				model.setAmount(amount);
+				R<String> orderR = wxPaymentClient.refundOrderR(model);
+				if(200 == orderR.getCode()){
+					chargingOrderRefundService.save(chargingOrderRefund);
+				}
+			}
+			if(2 == rechargePaymentType){
+				RefundReq dto = new RefundReq();
+				dto.setOutTradeNo(chargingOrder.getCode());
+				dto.setOutRequestNo(chargingOrderRefund.getCode());
+				dto.setRefundAmount(rechargeAmount.toString());
+				dto.setRefundReason("充电完成退款");
+				RefundResp resp = aliPaymentClient.refund(dto).getData();
+				if(null != resp){
+					SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE");
+					AjaxResult success = chargingOrderStartupFailureWxRefund(resp.getOutTradeNo(), resp.getTradeNo(), "SUCCESS", sdf1.format(new Date()));
+					if(success.isSuccess()){
+						chargingOrderRefundService.save(chargingOrderRefund);
+					}
+				}
+			}
+
+		}
 
 	}
 
@@ -881,7 +1149,13 @@
 	public List<Map<String, BigDecimal>> getYearData(List<Long> chargingOrderIds) {
 		return this.baseMapper.getYearData(chargingOrderIds);
 	}
+	@Resource
+	private SysUserClient sysUserClient;
+	@Resource
+	private UserSiteClient userSiteClient;
 
+	@Resource
+	private RoleSiteClient roleSiteClient;
 	@Override
 	public ChargingOrderTimeVO chargingList(ChargingListQuery dto) {
 		String startTime1 = null;
@@ -894,13 +1168,7 @@
 			startTime1 = split[0];
 			startTime2 = split[1];
 		}
-		if (StringUtils.hasLength(dto.getEndTime())){
-			String[] split = dto.getEndTime().split(" - ");
-			endTime1 = split[0];
-			endTime2 = split[1];
-		}
 		ChargingOrderTimeVO chargingOrderTimeVO = new ChargingOrderTimeVO();
-
 
 		PageInfo<ChargingOrderListVO> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize());
 		List<ChargingOrderListVO> list = this.baseMapper.chargingList(pageInfo,dto,startTime1,startTime2,endTime1,endTime2);
@@ -1060,6 +1328,11 @@
 	}
 
 	@Override
+	public R payRefund(PayOrderRefundDto payOrderQueryDto) {
+		return null;
+	}
+
+	@Override
 	public ChargingOrderListInfoVO chargingInfo(String uid) {
 		TChargingOrder chargingOrder= this.getById(uid);
 
@@ -1079,29 +1352,35 @@
 		}
 		chargingOrderListInfoVO.setEndMode(chargingOrder.getEndMode());
 		// todo 周一完善
-//		chargingOrderListInfoVO.setStartSoc();
-//		chargingOrderListInfoVO.setEndSoc();
-//		chargingOrderListInfoVO.setChargingCapacity();
-//		chargingOrderListInfoVO.setSiteId();
-//		chargingOrderListInfoVO.setChargingPileId();
-//		chargingOrderListInfoVO.setAppUserId();
-//		chargingOrderListInfoVO.setAppUserCarId();
-//		chargingOrderListInfoVO.setChargingGunId();
-//		chargingOrderListInfoVO.setOrderType();
-//		chargingOrderListInfoVO.setChargingSecond();
-//		chargingOrderListInfoVO.setLicensePlate();
-//		chargingOrderListInfoVO.setPhone();
-//		chargingOrderListInfoVO.setPaymentAmount();
-//		chargingOrderListInfoVO.setElectrovalence();
-//		chargingOrderListInfoVO.setServiceCharge();
-//		chargingOrderListInfoVO.setStartTime();
-//		chargingOrderListInfoVO.setEndTime();
-//		chargingOrderListInfoVO.setId();
-//		chargingOrderListInfoVO.setUid();
-//		chargingOrderListInfoVO.setList();
+		// 获取开始SOC 结束soc
+		List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataClient.getDataByOrderCode(chargingOrder.getCode()).getData();
+		if (!data6.isEmpty()){
+			// 第一条数据soc为开始 最后一条数据soc为结束soc
+			chargingOrderListInfoVO.setStartSoc(data6.get(0).getSoc().toString());
+			chargingOrderListInfoVO.setEndSoc(data6.get(data6.size()-1).getSoc().toString());
+			chargingOrderListInfoVO.setChargingCapacity(data6.get(data6.size()-1).getCharging_degree());
+			chargingOrderListInfoVO.setChargingSecond(data6.get(data6.size()-1).getCumulative_charging_time()*60+"");
 
-
-		return null;
+		}
+		if (chargingOrder.getAppUserCarId()!=null){
+			List<TAppUserCar> data3 = appUserCarClient.getCarByIds(Collections.singletonList(chargingOrder.getAppUserCarId())).getData();
+			if (!data3.isEmpty())chargingOrderListInfoVO.setLicensePlate(data3.get(0).getLicensePlate());
+		}
+		chargingOrderListInfoVO.setStartTime(chargingOrder.getStartTime());
+		chargingOrderListInfoVO.setEndTime(chargingOrder.getEndTime());
+		chargingOrderListInfoVO.setId(chargingOrder.getId());
+		chargingOrderListInfoVO.setUid(chargingOrder.getId().toString());
+		chargingOrderListInfoVO.setList(data6);
+		chargingOrderListInfoVO.setCouponDiscountAmount(chargingOrder.getCouponDiscountAmount());
+		chargingOrderListInfoVO.setVipDiscountAmount(chargingOrder.getVipDiscountAmount());
+		chargingOrderListInfoVO.setSharingAmount(chargingOrder.getSharingAmount());
+		chargingOrderListInfoVO.setCommissionAmount(chargingOrder.getCommissionAmount());
+		// 查询费用明细列表
+		List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.lambdaQuery()
+				.eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId())
+				.list();
+		chargingOrderListInfoVO.setList1(list);
+		return chargingOrderListInfoVO;
 	}
 
 
@@ -1111,7 +1390,166 @@
 	 */
 	@Override
 	public void chargeMonitoring(UploadRealTimeMonitoringDataQuery query) {
-		// todo 需完善
+		if(com.ruoyi.common.core.utils.StringUtils.isNotEmpty(query.getCharging_gun_code())){
+			//获取当前的计费策略
+			TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, query.getCharging_gun_code()));
+			AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderClient.getNowAccountingStrategyDetailOrder(chargingOrder.getId()).getData();
+			TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = chargingOrderAccountingStrategyService.getOne(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>()
+					.eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()).orderByDesc(TChargingOrderAccountingStrategy::getCreateTime).last(" limit 0, 1"));
+			SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
+			if(null == chargingOrderAccountingStrategy){
+				chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy();
+				chargingOrderAccountingStrategy.setChargingOrderId(chargingOrder.getId());
+				chargingOrderAccountingStrategy.setAccountingStrategyDetailId(strategyDetail.getId());
+				chargingOrderAccountingStrategy.setType(strategyDetail.getType());
+				chargingOrderAccountingStrategy.setStartTime(sdf.format(chargingOrder.getStartTime()));
+				chargingOrderAccountingStrategy.setEndTime(sdf.format(new Date()));
+				chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence());
+				chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge());
+				chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge());
+				BigDecimal charging_degree = query.getCharging_degree();
+				BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(charging_degree);
+				BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(charging_degree);
+				BigDecimal serviceCharge = originalServicePrice;
+				//计算优惠金额
+				if(null != chargingOrder.getVipDiscount()){
+					serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount().divide(new BigDecimal(10)));
+				}
+				chargingOrderAccountingStrategy.setChargingCapacity(charging_degree);
+				chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc);
+				chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge);
+				chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice);
+				chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now());
+				chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy);
+			}else{
+				if(chargingOrderAccountingStrategy.getAccountingStrategyDetailId().equals(strategyDetail.getId())){
+					BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodServicePrice();
+					BigDecimal periodElectricPrice = chargingOrderAccountingStrategy.getPeriodElectricPrice();
+					BigDecimal periodOriginalServicePrice = chargingOrderAccountingStrategy.getPeriodOriginalServicePrice();
+					BigDecimal charging_degree = query.getCharging_degree();
+					BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(charging_degree);
+					BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(charging_degree);
+					BigDecimal serviceCharge = originalServicePrice;
+					//计算优惠金额
+					if(null != chargingOrder.getVipDiscount()){
+						serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount().divide(new BigDecimal(10)));
+					}
+					periodServicePrice = periodServicePrice.add(serviceCharge);
+					periodOriginalServicePrice = periodOriginalServicePrice.add(originalServicePrice);
+					periodElectricPrice = periodElectricPrice.add(electrovalenc);
+					chargingOrderAccountingStrategy.setPeriodServicePrice(periodServicePrice);
+					chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(periodOriginalServicePrice);
+					chargingOrderAccountingStrategy.setPeriodElectricPrice(periodElectricPrice);
+					chargingOrderAccountingStrategy.setEndTime(sdf.format(new Date()));
+					chargingOrderAccountingStrategyService.updateById(chargingOrderAccountingStrategy);
+				}else{
+					TChargingOrderAccountingStrategy chargingOrderAccountingStrategy1 = new TChargingOrderAccountingStrategy();
+					chargingOrderAccountingStrategy1.setChargingOrderId(chargingOrder.getId());
+					chargingOrderAccountingStrategy1.setAccountingStrategyDetailId(strategyDetail.getId());
+					chargingOrderAccountingStrategy1.setType(strategyDetail.getType());
+					chargingOrderAccountingStrategy1.setStartTime(sdf.format(chargingOrderAccountingStrategy.getEndTime()));
+					chargingOrderAccountingStrategy1.setEndTime(sdf.format(new Date()));
+					chargingOrderAccountingStrategy1.setElectrovalence(strategyDetail.getElectrovalence());
+					chargingOrderAccountingStrategy1.setServiceCharge(strategyDetail.getServiceCharge());
+					chargingOrderAccountingStrategy1.setCostServiceCharge(strategyDetail.getCostServiceCharge());
+					BigDecimal charging_degree = query.getCharging_degree();
+					BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(charging_degree);
+					BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(charging_degree);
+					BigDecimal serviceCharge = originalServicePrice;
+					//计算优惠金额
+					if(null != chargingOrder.getVipDiscount()){
+						serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount().divide(new BigDecimal(10)));
+					}
+					chargingOrderAccountingStrategy1.setChargingCapacity(charging_degree);
+					chargingOrderAccountingStrategy1.setPeriodElectricPrice(electrovalenc);
+					chargingOrderAccountingStrategy1.setPeriodOriginalServicePrice(originalServicePrice);
+					chargingOrderAccountingStrategy1.setPeriodServicePrice(serviceCharge);
+					chargingOrderAccountingStrategy1.setCreateTime(LocalDateTime.now());
+					chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy1);
+				}
+			}
+
+			List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>()
+					.eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()));
+			BigDecimal t = BigDecimal.ZERO;
+			for (TChargingOrderAccountingStrategy coas : list) {
+				t = t.add(coas.getPeriodServicePrice()).add(coas.getPeriodElectricPrice());
+			}
+			BigDecimal residualAmount = chargingOrder.getRechargeAmount().subtract(t).setScale(2, RoundingMode.HALF_EVEN);
+			chargingOrder.setResidualAmount(residualAmount);
+			BigDecimal divide = query.getOutput_current().multiply(query.getOutput_voltage()).divide(new BigDecimal(1000));
+			chargingOrder.setChargingPower(divide);
+			this.updateById(chargingOrder);
+		}
+	}
+
+
+	/**
+	 * 自动结束充电后的处理逻辑
+	 * @param orderCode
+	 */
+	@Override
+	@GlobalTransactional(rollbackFor = Exception.class)
+	public void endCharge(String orderCode, Integer endMode) {
+		TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, orderCode));
+		Integer status = chargingOrder.getStatus();
+		if(status == 4 || status == 5){
+			return;
+		}
+		chargingOrder.setStatus(5);
+		chargingOrder.setEndMode(endMode);
+		this.updateById(chargingOrder);
+
+		//计算费用,处理退款
+		endCharge(chargingOrder);
+
+		//处理推荐奖励(被推荐首单奖励)
+		TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
+		long count = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId())
+				.eq(TChargingOrder::getStatus, 5).isNull(TChargingOrder::getEndMode).eq(TChargingOrder::getDelFlag, 0));
+		if(null != appUser.getInviteUserId() && 1 == count){
+			TIntegralRule integralRule = integralRuleClient.getSet().getData();
+			String inviteUsersToEarnPoints = integralRule.getInviteUsersToEarnPoints();
+			JSONObject jsonObject = JSON.parseObject(inviteUsersToEarnPoints);
+			Integer num1 = jsonObject.getInteger("num1");
+			GetInviteUser query = new GetInviteUser();
+			query.setAppUserId(appUser.getInviteUserId());
+			query.setBeInvitedAppUserId(chargingOrder.getAppUserId());
+			TInviteUser inviteUser = inviteUserClient.getInviteUser(query).getData();
+			if(null == inviteUser){
+				inviteUser = new TInviteUser();
+				inviteUser.setAppUserId(appUser.getInviteUserId());
+				inviteUser.setBeInvitedAppUserId(chargingOrder.getAppUserId());
+				inviteUser.setAward(num1);
+				inviteUser.setCreateTime(LocalDateTime.now());
+				inviteUserClient.saveInviteUser(inviteUser);
+			}else{
+				inviteUser.setAward(num1);
+				inviteUserClient.updateInviteUser(inviteUser);
+			}
+			TAppUser appUser1 = appUserClient.getUserById(appUser.getInviteUserId()).getData();
+			TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
+			String code = Math.random() * 1000 + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
+			appUserIntegralChange.setCode(code);
+			appUserIntegralChange.setAppUserId(appUser.getInviteUserId());
+			appUserIntegralChange.setChangeType(5);
+			appUserIntegralChange.setHistoricalIntegral(appUser1.getPoints());
+			appUserIntegralChange.setCurrentIntegral(appUser1.getPoints() + num1);
+			appUserIntegralChange.setCreateTime(LocalDateTime.now());
+			appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
+
+			appUser1.setPoints(appUser1.getPoints() + num1);
+			appUserClient.updateAppUser(appUser1);
+		}
+	}
+
+	/**
+	 * 异常结束充电处理逻辑
+	 * @param orderCode
+	 */
+	@Override
+	public void excelEndCharge(String orderCode) {
+		endCharge(orderCode, 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 61431f4..fea0c6d 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
@@ -4,23 +4,25 @@
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.account.api.feignClient.AppUserClient;
+import com.ruoyi.account.api.model.TAppUser;
+import com.ruoyi.account.api.model.TAppUserCar;
 import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient;
 import com.ruoyi.chargingPile.api.feignClient.SiteClient;
 import com.ruoyi.chargingPile.api.model.Site;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.core.web.page.PageInfo;
 import com.ruoyi.common.security.service.TokenService;
-import com.ruoyi.order.api.model.TChargingOrder;
-import com.ruoyi.order.api.model.TOrderInvoice;
-import com.ruoyi.order.api.model.TOrderInvoiceDetail;
-import com.ruoyi.order.api.model.TShoppingOrder;
+import com.ruoyi.order.api.model.*;
+import com.ruoyi.order.api.query.TOrderInvoiceQuery;
+import com.ruoyi.order.api.vo.TOrderEvaluateVO;
+import com.ruoyi.order.api.vo.TOrderInvoiceVO;
 import com.ruoyi.order.dto.*;
 import com.ruoyi.order.mapper.TOrderInvoiceMapper;
-import com.ruoyi.order.service.TChargingOrderService;
-import com.ruoyi.order.service.TOrderInvoiceDetailService;
-import com.ruoyi.order.service.TOrderInvoiceService;
-import com.ruoyi.order.service.TShoppingOrderService;
+import com.ruoyi.order.service.*;
 import com.ruoyi.other.api.domain.TCoupon;
 import com.ruoyi.other.api.domain.TGoods;
 import com.ruoyi.other.api.domain.TInvoiceType;
@@ -30,6 +32,7 @@
 import io.seata.spring.annotation.GlobalTransactional;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
@@ -75,7 +78,12 @@
 	
 	@Resource
 	private CouponClient couponClient;
+	@Resource
+	private AppUserClient appUserClient;
 	
+	@Resource
+	private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService;
+
 	
 	
 	
@@ -117,6 +125,11 @@
 		//获取开票类型
 		TInvoiceType invoiceType = invoiceTypeClient.getInvoiceType(addOrderInvoice.getInvoiceTypeId()).getData();
 		for (Long orderId : orderIds) {
+			List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>()
+					.eq(TChargingOrderAccountingStrategy::getChargingOrderId, orderId));
+			BigDecimal electrovalence = list.stream().map(TChargingOrderAccountingStrategy::getElectrovalence).reduce(BigDecimal.ZERO, BigDecimal::add);
+			BigDecimal serviceCharge = list.stream().map(TChargingOrderAccountingStrategy::getServiceCharge).reduce(BigDecimal.ZERO, BigDecimal::add);
+			
 			TOrderInvoiceDetail orderInvoiceDetail = new TOrderInvoiceDetail();
 			orderInvoiceDetail.setOrderInvoiceId(addOrderInvoice.getId());
 			orderInvoiceDetail.setInvoiceAmount(map.get(orderId));
@@ -125,6 +138,9 @@
 			orderInvoiceDetail.setElectricityTariff(invoiceType.getElectricityTariff());
 			orderInvoiceDetail.setServiceTariff(invoiceType.getServiceTariff());
 			orderInvoiceDetail.setAddedServiceTariff(invoiceType.getAddedServiceTariff());
+			orderInvoiceDetail.setElectrovalence(electrovalence);
+			orderInvoiceDetail.setServiceCharge(serviceCharge);
+			orderInvoiceDetail.setAddedService(serviceCharge.multiply(invoiceType.getAddedServiceTariff().divide(new BigDecimal(100))));
 			orderInvoiceDetailService.save(orderInvoiceDetail);
 		}
 		return AjaxResult.success();
@@ -228,4 +244,74 @@
 		}
 		return myOrderInvoiceInfo;
 	}
+
+	@Override
+	public PageInfo<TOrderInvoiceVO> pageList(TOrderInvoiceQuery query) {
+		// 查询申请用户
+		List<TAppUser> userList = appUserClient.selectByPhoneLike(query.getUserPhone()).getData();
+		if(CollectionUtils.isEmpty(userList)){
+			return new PageInfo<>();
+		}
+		query.setUserIds(userList.stream().map(TAppUser::getId).collect(Collectors.toList()));
+		PageInfo<TOrderInvoiceVO> pageInfo = new PageInfo<>(query.getPageCurr(),query.getPageSize());
+		List<TOrderInvoiceVO> list = this.baseMapper.pageList(query,pageInfo);
+
+		List<Long> ids = list.stream().map(TOrderInvoiceVO::getId).collect(Collectors.toList());
+
+		List<TOrderInvoiceDetail> orderInvoiceDetailList = orderInvoiceDetailService.list(new LambdaQueryWrapper<TOrderInvoiceDetail>()
+				.in(TOrderInvoiceDetail::getOrderInvoiceId, ids));
+
+		list.forEach(e->{
+			e.setServiceTariff(orderInvoiceDetailList.get(0).getServiceTariff());
+			e.setElectricityTariff(orderInvoiceDetailList.get(0).getElectricityTariff());
+			e.setAddedServiceTariff(orderInvoiceDetailList.get(0).getAddedServiceTariff());
+			e.setAddedService(orderInvoiceDetailList.stream().map(TOrderInvoiceDetail::getAddedService).reduce(BigDecimal::add).get());
+			e.setElectrovalence(orderInvoiceDetailList.stream().map(TOrderInvoiceDetail::getElectrovalence).reduce(BigDecimal::add).get());
+			e.setServiceCharge(orderInvoiceDetailList.stream().map(TOrderInvoiceDetail::getServiceCharge).reduce(BigDecimal::add).get());
+			e.setUserPhone(userList.stream().filter(m->m.getId().equals(Long.parseLong(e.getBillingUserId().toString()))).findFirst().get().getPhone());
+		});
+
+		pageInfo.setRecords(list);
+		return pageInfo;
+	}
+
+	@Override
+	public Map<String, Integer> statusCount(TOrderInvoiceQuery query) {
+		Map<String, Integer> map = new HashMap<>();
+		List<TAppUser> userList = appUserClient.selectByPhoneLike(query.getUserPhone()).getData();
+		if(CollectionUtils.isEmpty(userList)){
+			map.put("notAccepted",0);
+			map.put("processing",0);
+			map.put("finished",0);
+			return map;
+		}
+		query.setUserIds(userList.stream().map(TAppUser::getId).collect(Collectors.toList()));
+		map = this.baseMapper.statusCount(query);
+		return map;
+	}
+
+	@Override
+	public List<TOrderInvoiceVO> export(TOrderInvoiceQuery query) {
+		// 查询申请用户
+		List<TAppUser> userList = appUserClient.selectByPhoneLike(query.getUserPhone()).getData();
+		if(CollectionUtils.isEmpty(userList)){
+			return new ArrayList<>();
+		}
+		query.setUserIds(userList.stream().map(TAppUser::getId).collect(Collectors.toList()));
+		PageInfo<TOrderInvoiceVO> pageInfo = new PageInfo<>(query.getPageCurr(),query.getPageSize());
+		List<TOrderInvoiceVO> list = this.baseMapper.export(query);
+		List<Long> ids = list.stream().map(TOrderInvoiceVO::getId).collect(Collectors.toList());
+		List<TOrderInvoiceDetail> orderInvoiceDetailList = orderInvoiceDetailService.list(new LambdaQueryWrapper<TOrderInvoiceDetail>()
+				.in(TOrderInvoiceDetail::getOrderInvoiceId, ids));
+		list.forEach(e->{
+			e.setServiceTariff(orderInvoiceDetailList.get(0).getServiceTariff());
+			e.setElectricityTariff(orderInvoiceDetailList.get(0).getElectricityTariff());
+			e.setAddedServiceTariff(orderInvoiceDetailList.get(0).getAddedServiceTariff());
+			e.setAddedService(orderInvoiceDetailList.stream().map(TOrderInvoiceDetail::getAddedService).reduce(BigDecimal::add).get());
+			e.setElectrovalence(orderInvoiceDetailList.stream().map(TOrderInvoiceDetail::getElectrovalence).reduce(BigDecimal::add).get());
+			e.setServiceCharge(orderInvoiceDetailList.stream().map(TOrderInvoiceDetail::getServiceCharge).reduce(BigDecimal::add).get());
+			e.setUserPhone(userList.stream().filter(m->m.getId().equals(Long.parseLong(e.getBillingUserId().toString()))).findFirst().get().getPhone());
+		});
+		return list;
+	}
 }
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/ChargingOrderListInfoVO.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/ChargingOrderListInfoVO.java
index 1611e8c..1e75523 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/ChargingOrderListInfoVO.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/ChargingOrderListInfoVO.java
@@ -2,6 +2,7 @@
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
+import com.ruoyi.order.api.model.TChargingOrderAccountingStrategy;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -44,7 +45,7 @@
     @ApiModelProperty(value = "订单类型(1=充电订单(小程序),2=充电订单(刷卡))")
     private String orderType;
     @ApiModelProperty(value = "充电时间 秒")
-    private Long chargingSecond;
+    private String chargingSecond;
     @ApiModelProperty(value = "车牌号")
     private String licensePlate;
     @ApiModelProperty(value = "客户手机号")
@@ -65,6 +66,16 @@
     private Long id;
     @ApiModelProperty(value = "订单uid")
     private String uid;
+    @ApiModelProperty(value = "费用明细-优惠券优惠金额")
+    private BigDecimal couponDiscountAmount;
+    @ApiModelProperty(value = "费用明细-会员优惠金额")
+    private BigDecimal vipDiscountAmount;
+    @ApiModelProperty(value = "费用明细-平台分佣")
+    private BigDecimal sharingAmount;
+    @ApiModelProperty(value = "费用明细-手续费")
+    private BigDecimal commissionAmount;
     @ApiModelProperty(value = "充电信息")
     List<UploadRealTimeMonitoringData> list;
+    @ApiModelProperty(value = "费用明细-费用列表")
+    List<TChargingOrderAccountingStrategy> list1;
 }
diff --git a/ruoyi-service/ruoyi-order/src/main/resources/bootstrap.yml b/ruoyi-service/ruoyi-order/src/main/resources/bootstrap.yml
index 9a41659..a08183e 100644
--- a/ruoyi-service/ruoyi-order/src/main/resources/bootstrap.yml
+++ b/ruoyi-service/ruoyi-order/src/main/resources/bootstrap.yml
@@ -24,6 +24,7 @@
         namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
         username: nacos
         password: nacos
+        ip: 192.168.110.85
       config:
         # 配置中心地址
         server-addr: 192.168.110.169:8848
diff --git a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/AccountingStrategyDetailOrderMapper.xml b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/AccountingStrategyDetailOrderMapper.xml
new file mode 100644
index 0000000..3408020
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/AccountingStrategyDetailOrderMapper.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.order.mapper.AccountingStrategyDetailOrderMapper">
+	
+	<!-- 通用查询映射结果 -->
+	<resultMap id="BaseResultMap" type="com.ruoyi.order.api.model.AccountingStrategyDetailOrder">
+		<id column="id" property="id" />
+		<result column="accounting_strategy_id" property="accountingStrategyId" />
+		<result column="`type`" property="type" />
+		<result column="start_time" property="startTime" />
+		<result column="end_time" property="endTime" />
+		<result column="electrovalence" property="electrovalence" />
+		<result column="service_charge" property="serviceCharge" />
+		<result column="cost_service_charge" property="costServiceCharge" />
+	</resultMap>
+
+</mapper>
\ No newline at end of file
diff --git a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/AccountingStrategyOrderMapper.xml b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/AccountingStrategyOrderMapper.xml
new file mode 100644
index 0000000..2d6f00c
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/AccountingStrategyOrderMapper.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.order.mapper.AccountingStrategyOrderMapper">
+	
+	<!-- 通用查询映射结果 -->
+	<resultMap id="BaseResultMap" type="com.ruoyi.order.api.model.AccountingStrategyOrder">
+		<id column="id" property="id" />
+		<result column="site_id" property="siteId" />
+		<result column="`name`" property="name" />
+		<result column="description" property="description" />
+		<result column="discount" property="discount" />
+		<result column="first_user_id" property="firstUserId" />
+		<result column="two_user_id" property="twoUserId" />
+		<result column="first_remark" property="firstRemark" />
+		<result column="two_remark" property="twoRemark" />
+		<result column="audit_status" property="auditStatus" />
+		<result column="first_audit_time" property="firstAuditTime" />
+		<result column="two_audit_time" property="twoAuditTime" />
+		<result column="create_time" property="createTime" />
+		<result column="del_flag" property="delFlag" />
+	</resultMap>
+	
+</mapper>
\ No newline at end of file
diff --git a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
index e7b466a..a320601 100644
--- a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
+++ b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
@@ -105,62 +105,75 @@
     </select>
     <select id="payOrderQuery" resultType="com.ruoyi.order.dto.PayOrderDto">
         SELECT * FROM (SELECT
-                           id,
-                           `code`,
-                           1 as type,
-                           title,
-                           phone,
-                           `status`,
-                           order_amount,
-                           payment_amount ,
-                           create_time,
-                           end_time,
-                           pay_time
-                       FROM
-                           charging_pile_order.t_charging_order UNION ALL
-                       SELECT
-                           id,
-                           `code`,
-                           2 as type,
-                           title,
-                           phone,
-                           `status`,
-                           order_amount,
-                           payment_amount ,
-                           create_time,
-                           receiving_time as end_time,
-                           pay_time
-                       FROM
-                           charging_pile_order.t_shopping_order UNION ALL
-                       SELECT
-                           id,
-                           `code`,
-                           3 as type,
-                           title,
-                           phone,
-                           payment_status AS `status`,
-                           order_amount,
-                           payment_amount ,
-                           create_time,
-                           create_time as end_time,
-                           pay_time
-                       FROM
-                           charging_pile_order.t_vip_order UNION ALL
-                       SELECT
-                           id,
-                           `code`,
-                           4 as type,
-                           title,
-                           phone,
-                           `status`,
-                           order_amount ,
-                           order_amount as payment_amount,
-                           create_time,
-                           out_parking_time as end_time,
-                           out_parking_time as pay_time
-                       FROM
-                           charging_pile_service.t_parking_record ) o
+        id,
+        `code`,
+        1 as type,
+        title,
+        phone,
+        `status`,
+        order_amount,
+        payment_amount ,
+        create_time,
+        end_time,
+        pay_time,
+        refund_status,
+        (payment_amount-refund_amount) as final_amount,
+        del_flag
+        FROM
+        charging_pile_order.t_charging_order UNION ALL
+        SELECT
+        id,
+        `code`,
+        2 as type,
+        title,
+        phone,
+        `status`,
+        order_amount,
+        payment_amount ,
+        create_time,
+        receiving_time as end_time,
+        pay_time,
+        refund_status,
+        (payment_amount-refund_amount) as final_amount,
+        del_flag
+        FROM
+        charging_pile_order.t_shopping_order UNION ALL
+        SELECT
+        id,
+        `code`,
+        3 as type,
+        title,
+        phone,
+        payment_status AS `status`,
+        order_amount,
+        payment_amount ,
+        create_time,
+        create_time as end_time,
+        pay_time,
+        refund_status,
+        (payment_amount-refund_amount) as final_amount,
+        del_flag
+        FROM
+        charging_pile_order.t_vip_order UNION ALL
+        SELECT
+        id,
+        `code`,
+        4 as type,
+        title,
+        phone,
+        `status`,
+        order_amount ,
+        order_amount as payment_amount,
+        create_time,
+        out_parking_time as end_time,
+        out_parking_time as pay_time,
+        null as refund_status,
+        0 as final_amount,
+        0 as del_flag
+        FROM
+        charging_pile_service.t_parking_record ) o
                 <where>
+                    o.del_flag = 0
                     <if test="data.code != null and data.code != ''">
                         AND o.code LIKE CONCAT('%',#{data.code},'%')
                     </if>
@@ -170,9 +183,6 @@
                     <if test="data.type != null">
                         AND o.type = #{data.type}
                     </if>
-                    <if test="data.status != null">
-                        AND o.status = #{data.status}
-                    </if>
                     <if test="data.createTime1 != null">
                         AND o.create_time &gt;= #{data.createTime1}
                     </if>
@@ -180,7 +190,7 @@
                         AND o.create_time &lt;= #{data.createTime2}
                     </if>
                 </where>
-
+        ORDER BY o.create_time desc
 
     </select>
     <select id="getRefundList" resultType="com.ruoyi.order.api.model.TChargingOrderRefund">
diff --git a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceDetailMapper.xml b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceDetailMapper.xml
index b668acb..c9db30f 100644
--- a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceDetailMapper.xml
+++ b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceDetailMapper.xml
@@ -12,11 +12,14 @@
         <result column="electricity_tariff" property="electricityTariff" />
         <result column="service_tariff" property="serviceTariff" />
         <result column="added_service_tariff" property="addedServiceTariff" />
+        <result column="electrovalence" property="electrovalence" />
+        <result column="service_charge" property="serviceCharge" />
+        <result column="added_service" property="addedService" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, order_invoice_id, order_type, order_id, invoice_amount, electricity_tariff, service_tariff, added_service_tariff
+        id, order_invoice_id, order_type, order_id, invoice_amount, electricity_tariff, service_tariff, added_service_tariff,electrovalence,service_charge,added_service
     </sql>
 
 </mapper>
diff --git a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceMapper.xml b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceMapper.xml
index d7fddbe..c7fdb2d 100644
--- a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceMapper.xml
+++ b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceMapper.xml
@@ -33,5 +33,115 @@
     <sql id="Base_Column_List">
         id, code, app_user_id, order_type, invoicing_company, invoice_type_id, invoice_type, invoice_material, invoicing_method, invoicing_object_type, name, tax_identification_number, company_address, company_phone, deposit_bank, bank_account, total_amount, invoice_url, mailbox, status, create_time, billing_time, billing_user_id
     </sql>
+    <select id="pageList" resultType="com.ruoyi.order.api.vo.TOrderInvoiceVO">
+        select toi.id, toi.code, toi.app_user_id, toi.order_type, toi.invoicing_company, toi.invoice_type_id, toi.invoice_type, toi.invoice_material,
+               toi.invoicing_method, toi.invoicing_object_type, toi.name, toi.tax_identification_number, toi.company_address, toi.company_phone,
+               toi.deposit_bank, toi.bank_account, toi.total_amount, toi.invoice_url, toi.mailbox, toi.status, toi.create_time, toi.billing_time,
+               toi.billing_user_id
+        from t_order_invoice toi
+        <where>
+            <if test="query.invoicingCompany != null and query.invoicingCompany != ''">
+                AND toi.invoicing_company LIKE concat('%',#{query.invoicingCompany},'%')
+            </if>
+            <if test="query.invoiceType != null and query.invoiceType != ''">
+                AND toi.invoice_type LIKE concat('%',#{query.invoiceType},'%')
+            </if>
+            <if test="query.invoicingObjectType != null">
+                AND toi.invoicing_object_type = #{query.invoicingObjectType}
+            </if>
+            <if test="query.invoiceMaterial != null">
+                AND toi.invoice_material = #{query.invoiceMaterial}
+            </if>
+            <if test="query.invoicingMethod != null">
+                AND toi.invoicing_method = #{query.invoicingMethod}
+            </if>
+            <if test="query.name != null and query.name != ''">
+                AND toi.name LIKE concat('%',#{query.name},'%')
+            </if>
+            <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''">
+                AND toi.billing_time BETWEEN #{query.startTime} AND #{query.endTime}
+            </if>
+            <if test="query.userIds != null and query.userIds.size()>0">
+                AND toi.billing_user_id IN
+                <foreach collection="query.userIds" close=")" open="(" item="userId" separator=",">
+                    #{userId}
+                </foreach>
+            </if>
+        </where>
+        ORDER BY toi.billing_time DESC
+    </select>
+    <select id="statusCount" resultType="java.util.Map">
+        select
+            COUNT(CASE WHEN status = 1 THEN 1 END) AS `notAccepted`,
+            COUNT(CASE WHEN status = 2 THEN 1 END) AS `processing`,
+            COUNT(CASE WHEN status = 3 THEN 1 END) AS `finished`
+        from t_order_invoice toi
+        <where>
+            <if test="query.invoicingCompany != null and query.invoicingCompany != ''">
+                AND toi.invoicing_company LIKE concat('%',#{query.invoicingCompany},'%')
+            </if>
+            <if test="query.invoiceType != null and query.invoiceType != ''">
+                AND toi.invoice_type LIKE concat('%',#{query.invoiceType},'%')
+            </if>
+            <if test="query.invoicingObjectType != null">
+                AND toi.invoicing_object_type = #{query.invoicingObjectType}
+            </if>
+            <if test="query.invoiceMaterial != null">
+                AND toi.invoice_material = #{query.invoiceMaterial}
+            </if>
+            <if test="query.invoicingMethod != null">
+                AND toi.invoicing_method = #{query.invoicingMethod}
+            </if>
+            <if test="query.name != null and query.name != ''">
+                AND toi.name LIKE concat('%',#{query.name},'%')
+            </if>
+            <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''">
+                AND toi.billing_time BETWEEN #{query.startTime} AND #{query.endTime}
+            </if>
+            <if test="query.userIds != null and query.userIds.size()>0">
+                AND toi.billing_user_id IN
+                <foreach collection="query.userIds" close=")" open="(" item="userId" separator=",">
+                    #{userId}
+                </foreach>
+            </if>
+        </where>
+    </select>
+    <select id="export" resultType="com.ruoyi.order.api.vo.TOrderInvoiceVO">
+        select toi.id, toi.code, toi.app_user_id, toi.order_type, toi.invoicing_company, toi.invoice_type_id, toi.invoice_type, toi.invoice_material,
+        toi.invoicing_method, toi.invoicing_object_type, toi.name, toi.tax_identification_number, toi.company_address, toi.company_phone,
+        toi.deposit_bank, toi.bank_account, toi.total_amount, toi.invoice_url, toi.mailbox, toi.status, toi.create_time, toi.billing_time,
+        toi.billing_user_id
+        from t_order_invoice toi
+        <where>
+            <if test="query.invoicingCompany != null and query.invoicingCompany != ''">
+                AND toi.invoicing_company LIKE concat('%',#{query.invoicingCompany},'%')
+            </if>
+            <if test="query.invoiceType != null and query.invoiceType != ''">
+                AND toi.invoice_type LIKE concat('%',#{query.invoiceType},'%')
+            </if>
+            <if test="query.invoicingObjectType != null">
+                AND toi.invoicing_object_type = #{query.invoicingObjectType}
+            </if>
+            <if test="query.invoiceMaterial != null">
+                AND toi.invoice_material = #{query.invoiceMaterial}
+            </if>
+            <if test="query.invoicingMethod != null">
+                AND toi.invoicing_method = #{query.invoicingMethod}
+            </if>
+            <if test="query.name != null and query.name != ''">
+                AND toi.name LIKE concat('%',#{query.name},'%')
+            </if>
+            <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''">
+                AND toi.billing_time BETWEEN #{query.startTime} AND #{query.endTime}
+            </if>
+            <if test="query.userIds != null and query.userIds.size()>0">
+                AND toi.billing_user_id IN
+                <foreach collection="query.userIds" close=")" open="(" item="userId" separator=",">
+                    #{userId}
+                </foreach>
+            </if>
+        </where>
+        ORDER BY toi.billing_time DESC
+    </select>
 
 </mapper>
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java
index a2a4ee5..9a1207d 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java
@@ -194,7 +194,11 @@
             total = total.add(vip.getMaximumDeduction().multiply(BigDecimal.valueOf(vip.getDiscountTimes())));
             for (VipCouponDto vipCouponDto : vipCouponDtos) {
                 TCoupon tCoupon = vipCouponDto.getTCoupon();
-                total.add(tCoupon.getMaximumDiscountAmount());
+                if (tCoupon.getPreferentialMode()==2) {
+                    total.add(tCoupon.getMaximumDiscountAmount());
+                }else {
+                    total.add(tCoupon.getDiscountAmount());
+                }
             }
             vipInfoDto.setTotalDiscount(total);
             vipInfoDto.setTimeAmount(vip.getMaximumDeduction().multiply(BigDecimal.valueOf(vip.getDiscountTimes())));

--
Gitblit v1.7.1