From ff169f9a0417b73f0afac554cf2f9d048ac56c80 Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期一, 19 八月 2024 20:57:08 +0800
Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/mx_charging_pile

---
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserServiceImpl.java                             |   19 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java                           |   30 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TInvoiceTypeController.java                                |   28 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java                            |    5 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java                           |  188 ++
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderList.java                                          |   30 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/GetNoInvoicedOrder.java                                           |   17 
 ruoyi-service/ruoyi-other/src/main/resources/bootstrap.yml                                                                    |    2 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderInvoiceController.java                               |   45 
 ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/SentinelFallbackHandler.java                                            |   44 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TActivityStatisticsController.java                         |    3 
 ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/SwaggerProvider.java                                                     |  113 
 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserSign.java                                       |    3 
 ruoyi-gateway/src/main/java/com/ruoyi/gateway/service/impl/ValidateCodeServiceImpl.java                                       |  168 +-
 ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml                                            |   14 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TEnterpriseUserApplicationController.java                  |    2 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/JwtUtils.java                                        |   25 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TNoticeController.java                                     |   18 
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/SignDayUtil.java                                             |   76 +
 ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java                                                       |   35 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java                              |   70 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java                            |  213 +++
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TFaultMessageServiceImpl.java              |   31 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/CodeController.java                          |   53 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/OrderInvoiceList.java                                             |   26 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/THtmlController.java                                       |    5 
 pom.xml                                                                                                                       |    5 
 ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/CacheRequestFilter.java                                                  |  122 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/GetOrderInvoiceList.java                                          |   17 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/MsgUtil.java                                         |    2 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java                                      |   16 
 ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TUserTagMapper.xml                                                  |    4 
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java                                |  231 +++
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserTagController.java                             |    2 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TChargingPileNotificationService.java           |    9 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java                              |   19 
 ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/GatewayConfig.java                                                       |   16 
 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TInvoiceInformation.java                                |    6 
 ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/XssFilter.java                                                           |  172 +-
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TAdvertisingController.java                                |    3 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TFaultMessageController.java                 |    5 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TIntegralRuleController.java                               |    3 
 ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TShoppingOrderMapper.xml                                            |   15 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/AddOrderInvoice.java                                              |   18 
 ruoyi-gateway/pom.xml                                                                                                         |   20 
 ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/GatewayExceptionHandler.java                                            |   60 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCouponController.java                                     |   19 
 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/UnitChangeDto.java                                        |   10 
 ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/SwaggerHandler.java                                                     |   68 
 ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TIntegralRule.java                                         |    2 
 ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/ValidateCodeHandler.java                                                |   34 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoice.java                                          |   22 
 ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/CaptchaConfig.java                                                       |  135 -
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/TAppUserService.java                                      |    6 
 ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/KaptchaTextCreator.java                                                  |  116 
 ruoyi-service/ruoyi-account/src/main/resources/mapper/account/TInvoiceInformationMapper.xml                                   |    4 
 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TChargingPileNotification.java                |   13 
 ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TUserTag.java                                              |    8 
 ruoyi-gateway/src/main/java/com/ruoyi/gateway/service/ValidateCodeService.java                                                |   22 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java                                        |   19 
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TInvoiceInformationController.java                     |   79 +
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TExchangeOrderController.java                              |   18 
 ruoyi-gateway/src/main/java/com/ruoyi/gateway/RuoYiGatewayApplication.java                                                    |   34 
 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/AppUserStatusEnum.java                        |   46 
 ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java                                                          |  305 ++-
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/GiveVipUtil.java                                             |    2 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderInfo.java                                          |   56 
 ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/HMACSHA1.java                                                            |   14 
 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUser.java                                           |    2 
 ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/SignFilter.java                                                          |   28 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TActivityController.java                                   |    1 
 ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/XssProperties.java                                            |   60 
 ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TSystemConfiguration.java                                  |    2 
 ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java                          |    2 
 ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/RouterFunctionConfiguration.java                                         |   89 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java                                      |   16 
 ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceMapper.xml                                             |    6 
 ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/RequestParamGlobalFilter.java                                            |  102 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TOrderInvoiceService.java                                     |   32 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TShoppingOrderService.java                                    |   41 
 ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/ValidateCodeFilter.java                                                  |   94 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java                                    |   12 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java                          |    2 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TShoppingOrderMapper.java                                      |   12 
 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/GiveVipDto.java                                           |    2 
 ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/IgnoreWhiteProperties.java                                    |   32 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/GetMyShoppingOrderList.java                                       |   17 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileNotificationServiceImpl.java  |   20 
 ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/BlackListUrlFilter.java                                                  |   91 
 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/TAppUserDto.java                                          |  118 +
 ruoyi-api/ruoyi-api-other/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports |    3 
 ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/CaptchaProperties.java                                        |   59 
 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/PointsQueryDto.java                                       |    1 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyOrderInvoiceInfo.java                                           |   38 
 /dev/null                                                                                                                     |   21 
 ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TInvoiceType.java                                          |    7 
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TSystemConfigurationController.java                        |    6 
 ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/InvoiceTypeFallbackFactory.java                           |   34 
 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TFaultMessageService.java                       |    6 
 ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/InvoiceTypeClient.java                                |   26 
 100 files changed, 2,873 insertions(+), 1,149 deletions(-)

diff --git a/pom.xml b/pom.xml
index 9fd5f56..24b8e84 100644
--- a/pom.xml
+++ b/pom.xml
@@ -204,6 +204,11 @@
                 <artifactId>ruoyi-api-system</artifactId>
                 <version>${ruoyi.version}</version>
             </dependency>
+            <dependency>
+                <groupId>com.ruoyi</groupId>
+                <artifactId>ruoyi-api-account</artifactId>
+                <version>${ruoyi.version}</version>
+            </dependency>
 
         </dependencies>
     </dependencyManagement>
diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/GiveVipDto.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/GiveVipDto.java
index 2a7c132..c21ca03 100644
--- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/GiveVipDto.java
+++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/GiveVipDto.java
@@ -10,5 +10,5 @@
     @ApiModelProperty("1月2季3年")
     private Integer type;
     @ApiModelProperty("用户Id")
-    private Long userId;
+    private String userIds;
 }
diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/PointsQueryDto.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/PointsQueryDto.java
index 09ba2f5..90326db 100644
--- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/PointsQueryDto.java
+++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/PointsQueryDto.java
@@ -7,6 +7,7 @@
 
 @Data
 public class PointsQueryDto extends BasePage {
+    @ApiModelProperty("用户id")
    private   Long userId;
     @ApiModelProperty("1收入0支出")
     private    Integer type;
diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/TAppUserDto.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/TAppUserDto.java
new file mode 100644
index 0000000..a16200e
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/TAppUserDto.java
@@ -0,0 +1,118 @@
+package com.ruoyi.account.api.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.web.domain.BasePojo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author luodangjia
+ * @since 2024-08-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("t_app_user")
+@ApiModel(value="TAppUser对象", description="")
+public class TAppUserDto extends BasePojo {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键")
+    @TableId("id")
+    private String id;
+
+    @ApiModelProperty(value = "用户")
+    @TableField("name")
+    private String name;
+
+    @ApiModelProperty(value = "手机号")
+    @TableField("phone")
+    private String phone;
+
+    @ApiModelProperty(value = "头像")
+    @TableField("avatar")
+    private String avatar;
+
+    @ApiModelProperty(value = "会员id")
+    @TableField("vip_id")
+    private Integer vipId;
+
+    @ApiModelProperty(value = "会员到期时间")
+    @TableField("vip_end_time")
+    private LocalDateTime vipEndTime;
+
+    @ApiModelProperty(value = "单位id")
+    @TableField("company_id")
+    private Integer companyId;
+
+    @ApiModelProperty(value = "身份证号")
+    @TableField("id_card")
+    private String idCard;
+
+    @ApiModelProperty(value = "认证状态(0=否,1=是)")
+    @TableField("auth_status")
+    private Integer authStatus;
+
+    @ApiModelProperty(value = "微信openid")
+    @TableField("wx_openid")
+    private String wxOpenid;
+
+    @ApiModelProperty(value = "支付宝openid")
+    @TableField("ali_openid")
+    private String aliOpenid;
+
+    @ApiModelProperty(value = "积分")
+    @TableField("points")
+    private Integer points;
+
+    @ApiModelProperty(value = "省名称")
+    @TableField("province")
+    private String province;
+
+    @ApiModelProperty(value = "省区划代码")
+    @TableField("province_code")
+    private String provinceCode;
+
+    @ApiModelProperty(value = "市名称")
+    @TableField("city")
+    private String city;
+
+    @ApiModelProperty(value = "市区划代码")
+    @TableField("city_code")
+    private String cityCode;
+
+    @ApiModelProperty(value = "状态(1=正常,2=冻结,3=注销)")
+    @TableField("status")
+    private Integer status;
+
+
+
+    @ApiModelProperty(value = "最后一次登录时间")
+    @TableField("last_login_time")
+    private LocalDateTime lastLoginTime;
+
+
+
+
+    @ApiModelProperty(value = "标签名称")
+    @TableField(exist = false)
+    private String tagName;
+    @ApiModelProperty(value = "vip名称")
+    @TableField(exist = false)
+    private String vipName;
+    @ApiModelProperty("累计充电数")
+    @TableField(exist = false)
+    private Long orderCount;
+
+
+}
diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/UnitChangeDto.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/UnitChangeDto.java
new file mode 100644
index 0000000..5fe9319
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/UnitChangeDto.java
@@ -0,0 +1,10 @@
+package com.ruoyi.account.api.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class UnitChangeDto {
+    private String ids;
+    private Integer unitId;
+}
diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUser.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUser.java
index decb469..4ddbf88 100644
--- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUser.java
+++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUser.java
@@ -32,6 +32,8 @@
     @ApiModelProperty(value = "主键")
     @TableId("id")
     private Long id;
+    @TableField(exist = false)
+    private String uid;
 
     @ApiModelProperty(value = "用户")
     @TableField("name")
diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserSign.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserSign.java
index a3e77c3..ea350ac 100644
--- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserSign.java
+++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserSign.java
@@ -44,6 +44,9 @@
     @ApiModelProperty(value = "奖励积分")
     @TableField("reward_points")
     private Integer rewardPoints;
+    @ApiModelProperty(value = "礼盒标记")
+    @TableField("is_gift")
+    private Integer isGift;
 
     @ApiModelProperty(value = "添加时间")
     @TableField("create_time")
diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TInvoiceInformation.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TInvoiceInformation.java
index c3d62b5..439ced7 100644
--- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TInvoiceInformation.java
+++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TInvoiceInformation.java
@@ -68,9 +68,9 @@
     @TableField("bank_account")
     private String bankAccount;
 
-//    @ApiModelProperty(value = "设置默认(0=否,1=是)")
-//    @TableField("default")
-//    private Integer default;
+    @ApiModelProperty(value = "设置默认(0=否,1=是)")
+    @TableField("is_default")
+    private Integer isDefault;
 
 
 
diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TChargingPileNotification.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TChargingPileNotification.java
index 23a5d14..3bd2b7e 100644
--- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TChargingPileNotification.java
+++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TChargingPileNotification.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.web.domain.BasePojo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -24,7 +25,7 @@
 @EqualsAndHashCode(callSuper = false)
 @TableName("t_charging_pile_notification")
 @ApiModel(value="TChargingPileNotification对象", description="")
-public class TChargingPileNotification implements Serializable {
+public class TChargingPileNotification extends BasePojo {
 
     private static final long serialVersionUID = 1L;
 
@@ -51,15 +52,5 @@
     @ApiModelProperty(value = "通知内容")
     @TableField("content")
     private String content;
-
-    @ApiModelProperty(value = "发送时间")
-    @TableField("create_time")
-    private LocalDateTime createTime;
-
-    @ApiModelProperty(value = "删除状态(0=否,1=是)")
-    @TableField("del_flag")
-    @TableLogic
-    private Integer delFlag;
-
 
 }
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 f7f675c..280b1b0 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
@@ -11,6 +11,7 @@
 
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
 
 /**
  * <p>
@@ -47,10 +48,14 @@
     @ApiModelProperty(value = "开票公司")
     @TableField("invoicing_company")
     private String invoicingCompany;
+    
+    @ApiModelProperty(value = "发票类型id")
+    @TableField("invoice_type_id")
+    private Integer invoiceTypeId;
 
-    @ApiModelProperty(value = "发票类型(1=增值税普通发票,2=增值税专用发票)")
+    @ApiModelProperty(value = "发票类型")
     @TableField("invoice_type")
-    private Integer invoiceType;
+    private String invoiceType;
 
     @ApiModelProperty(value = "发票材质(1=纸质发票,2=电子发票)")
     @TableField("invoice_material")
@@ -103,6 +108,17 @@
     @ApiModelProperty(value = "状态(1=待开票,2=开票中,3=已开票)")
     @TableField("status")
     private Integer status;
-
+    
+    @ApiModelProperty(value = "添加时间")
+    @TableField("create_time")
+    private LocalDateTime createTime;
+    
+    @ApiModelProperty(value = "开票时间")
+    @TableField("billing_time")
+    private LocalDateTime billingTime;
+    
+    @ApiModelProperty(value = "开票人id")
+    @TableField("billing_user_id")
+    private Integer billingUserId;
 
 }
diff --git a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TIntegralRule.java b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TIntegralRule.java
index 9e0a6bb..0d5a429 100644
--- a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TIntegralRule.java
+++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TIntegralRule.java
@@ -48,7 +48,7 @@
     @TableField("invite_users_to_earn_points")
     private String inviteUsersToEarnPoints;
 
-    @ApiModelProperty(value = "签到得积分{\"num1\":1,\"num2\":[{\"num1\":1,\"num2\":1}]}")
+    @ApiModelProperty(value = "签到得积分{\"num1\":1,\"num2\":[\"1(多少天),2(多少分)\"]}")
     @TableField("sign_in_for_points")
     private String signInForPoints;
 
diff --git a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TInvoiceType.java b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TInvoiceType.java
index 0fb7f18..e0be5a0 100644
--- a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TInvoiceType.java
+++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TInvoiceType.java
@@ -8,6 +8,7 @@
 import lombok.EqualsAndHashCode;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
 /**
@@ -44,15 +45,15 @@
 
     @ApiModelProperty(value = "电费税率")
     @TableField("electricity_tariff")
-    private Double electricityTariff;
+    private BigDecimal electricityTariff;
 
     @ApiModelProperty(value = "服务费税率")
     @TableField("service_tariff")
-    private Double serviceTariff;
+    private BigDecimal serviceTariff;
 
     @ApiModelProperty(value = "增值服务费税率")
     @TableField("added_service_tariff")
-    private Double addedServiceTariff;
+    private BigDecimal addedServiceTariff;
 
 
 
diff --git a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TSystemConfiguration.java b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TSystemConfiguration.java
index 154cd93..1a43603 100644
--- a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TSystemConfiguration.java
+++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TSystemConfiguration.java
@@ -24,7 +24,7 @@
 @EqualsAndHashCode(callSuper = false)
 @TableName("t_system_configuration")
 @ApiModel(value="TSystemConfiguration对象", description="")
-public class TSystemConfiguration extends BasePojo {
+public class TSystemConfiguration implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
diff --git a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TUserTag.java b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TUserTag.java
index 1032e02..9449897 100644
--- a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TUserTag.java
+++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TUserTag.java
@@ -39,8 +39,8 @@
     private Integer standardCondition;
 
     @ApiModelProperty(value = "达标条件值JSON({\"day\":1,\"times\":5})")
-    @TableField("condition")
-    private String condition;
+    @TableField("conditions")
+    private String conditions;
 
 
 
@@ -49,6 +49,10 @@
     @TableField(exist = false)
     private Long count;
 
+    @ApiModelProperty(value = "前端展示用")
+    @TableField("type")
+    private Integer type;
+
 
 
 }
diff --git a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/InvoiceTypeFallbackFactory.java b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/InvoiceTypeFallbackFactory.java
new file mode 100644
index 0000000..d1a16c0
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/InvoiceTypeFallbackFactory.java
@@ -0,0 +1,34 @@
+package com.ruoyi.other.api.factory;
+
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.other.api.domain.TInvoiceType;
+import com.ruoyi.other.api.feignClient.InvoiceTypeClient;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+
+/**
+ * 商品服务降级处理
+ * 
+ * @author ruoyi
+ */
+@Component
+public class InvoiceTypeFallbackFactory implements FallbackFactory<InvoiceTypeClient>
+{
+    private static final Logger log = LoggerFactory.getLogger(InvoiceTypeFallbackFactory.class);
+
+    @Override
+    public InvoiceTypeClient create(Throwable throwable) {
+        log.error("开票类型失败:{}", throwable.getMessage());
+        return new InvoiceTypeClient() {
+    
+    
+            @Override
+            public R<TInvoiceType> getInvoiceType(Integer id) {
+                throw new RuntimeException(throwable.getMessage());
+            }
+        };
+    }
+}
diff --git a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/InvoiceTypeClient.java b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/InvoiceTypeClient.java
new file mode 100644
index 0000000..896f3db
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/InvoiceTypeClient.java
@@ -0,0 +1,26 @@
+package com.ruoyi.other.api.feignClient;
+
+import com.ruoyi.common.core.constant.ServiceNameConstants;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.other.api.domain.TInvoiceType;
+import com.ruoyi.other.api.factory.InvoiceTypeFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/8/19 15:57
+ */
+@FeignClient(contextId = "IntegralRuleClient", value = ServiceNameConstants.OTHER_SERVICE, fallbackFactory = InvoiceTypeFallbackFactory.class)
+public interface InvoiceTypeClient {
+	
+	
+	/**
+	 * 根据id获取发票类型
+	 * @param id
+	 * @return
+	 */
+	@PostMapping("/t-invoice-type/getInvoiceType/{id}")
+	R<TInvoiceType> getInvoiceType(@PathVariable("id") Integer id);
+}
diff --git a/ruoyi-api/ruoyi-api-other/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-api/ruoyi-api-other/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
index 8ca6c74..9033994 100644
--- a/ruoyi-api/ruoyi-api-other/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ b/ruoyi-api/ruoyi-api-other/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -5,4 +5,5 @@
 com.ruoyi.other.api.factory.VipFallbackFactory
 com.ruoyi.other.api.factory.IntegralRuleFallbackFactory
 com.ruoyi.other.api.factory.GoodsFallbackFactory
-com.ruoyi.other.api.factory.CouponFallbackFactory
\ No newline at end of file
+com.ruoyi.other.api.factory.CouponFallbackFactory
+com.ruoyi.other.api.factory.InvoiceTypeFallbackFactory
\ No newline at end of file
diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
index 7f333d2..9c6b8fd 100644
--- a/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
+++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
@@ -51,10 +51,6 @@
     private SysLoginService sysLoginService;
     @Resource
     private SysUserClient userClient;
-    @Autowired
-    private RedisService redisService;
-    @Autowired
-    private AppUserClient appUserClient;
 
     
     
@@ -97,16 +93,6 @@
         return R.ok();
     }
 
-    @DeleteMapping("logoutApplet")
-    public R<?> logoutApplet(HttpServletRequest request) {
-        String token = SecurityUtils.getToken(request);
-        if (StringUtils.isNotEmpty(token))
-        {
-            // 删除用户缓存记录
-            AuthUtil.logoutByToken(token);
-        }
-        return R.ok();
-    }
 
     @PostMapping("refresh")
     public R<?> refresh(HttpServletRequest request)
@@ -127,27 +113,6 @@
         // 用户注册
         sysLoginService.register(registerBody.getUsername(), registerBody.getPassword(), request);
         return R.ok();
-    }
-
-    /**
-     * 获取验证码
-     *
-     * @param phone 手机号
-     * @return 结果
-     */
-    @ApiOperation(value = "获取验证码",notes = "获取验证码",tags = {"更换手机号获取验证码"})
-    @GetMapping("getCode")
-    public AjaxResult getCode(@RequestParam("phone") String phone)
-    {
-        TAppUser appUser = appUserClient.selectByPhone(phone).getData();
-        if (Objects.nonNull(appUser)){
-            return AjaxResult.error("该手机号已绑定账号");
-        }
-        String code = MsgUtil.createCode();
-        redisService.setCacheObject(phone+Constants.APPLET,code,5L, TimeUnit.MINUTES);
-        String reqStr = MsgUtil.codeMsg(phone, code);
-        String result = HttpUtils.post(MsgConstants.SEND_URL, reqStr);
-        return AjaxResult.success(result);
     }
 
 }
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java
index 8f56ebf..be3a1e7 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/SecurityConstants.java
@@ -36,6 +36,11 @@
      * 用户标识
      */
     public static final String USER_KEY = "user_key";
+    
+    /**
+     * 用户类型(system/applet)
+     */
+    public static final String USER_TYPE = "user_type";
     /**
      * 小程序登录用户标识
      */
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/AppUserStatusEnum.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/AppUserStatusEnum.java
new file mode 100644
index 0000000..a9d6f08
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/status/AppUserStatusEnum.java
@@ -0,0 +1,46 @@
+package com.ruoyi.common.core.enums.status;
+
+import lombok.Getter;
+
+/**
+ * @Description
+ * @Author xiaochen
+ * @Date 2023/6/8 16:42
+ */
+public enum AppUserStatusEnum {
+
+
+    NORMAL(1, "正常"),
+    FREEZE(2, "冻结"),
+    LOGOFF(3, "注销");
+
+    @Getter
+    private String desc;
+
+
+    @Getter
+    private int code;
+
+
+    AppUserStatusEnum(int code, String desc) {
+        this.code = code;
+        this.desc = desc;
+    }
+
+    /**
+     * 通过code获取枚举
+     *
+     * @param code
+     * @return
+     */
+    public static AppUserStatusEnum fromCode(Integer code) {
+        AppUserStatusEnum[] resultTypes = AppUserStatusEnum.values();
+        for (AppUserStatusEnum resultType : resultTypes) {
+            if (code.equals(resultType.getCode())) {
+                return resultType;
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/JwtUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/JwtUtils.java
index b5f5b92..c70bcd2 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/JwtUtils.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/JwtUtils.java
@@ -62,6 +62,31 @@
     {
         return getValue(claims, SecurityConstants.USER_KEY);
     }
+    
+    /**
+     * 根据令牌获取用户类型
+     *
+     * @param token 令牌
+     * @return 用户类型
+     */
+    public static String getUserType(String token)
+    {
+        Claims claims = parseToken(token);
+        return getValue(claims, SecurityConstants.USER_TYPE);
+    }
+    
+    /**
+     * 根据令牌获取用户类型
+     *
+     * @param claims 身份信息
+     * @return 用户类型
+     */
+    public static String getUserType(Claims claims)
+    {
+        return getValue(claims, SecurityConstants.USER_TYPE);
+    }
+    
+    
 
     /**
      * 小程序根据令牌获取用户标识
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/MsgUtil.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/MsgUtil.java
index 188900d..54eb150 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/MsgUtil.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/MsgUtil.java
@@ -112,7 +112,7 @@
         return encode;
     }
 
-    /**
+    /**  phone  单词可拼接5000个号码
      * 桩故障(自动/手动):检测到【电站1】【编号】号桩设备离线,请及时查看处理!
      * @param phone 手机号
      * @param site 站点名称
diff --git a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java
index 2735380..2cdbed5 100644
--- a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java
+++ b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java
@@ -60,6 +60,7 @@
         Map<String, Object> claimsMap = new HashMap<String, Object>();
         claimsMap.put(SecurityConstants.USER_KEY, token);
         claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId);
+        claimsMap.put(SecurityConstants.USER_TYPE, "system");
         claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName);
 
         // 接口返回信息
@@ -82,6 +83,7 @@
         Map<String, Object> claimsMap = new HashMap<String, Object>();
         claimsMap.put(SecurityConstants.USER_APPLET_KEY, token);
         claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId);
+        claimsMap.put(SecurityConstants.USER_TYPE, "applet");
         claimsMap.put(SecurityConstants.DETAILS_USERNAME, name);
         // 接口返回信息
         Map<String, Object> rspMap = new HashMap<String, Object>();
diff --git a/ruoyi-gateway/pom.xml b/ruoyi-gateway/pom.xml
index 055df92..ade8e7d 100644
--- a/ruoyi-gateway/pom.xml
+++ b/ruoyi-gateway/pom.xml
@@ -114,18 +114,14 @@
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
         </dependency>
-
-<!--        <dependency>-->
-<!--            <groupId>org.springframework.boot</groupId>-->
-<!--            <artifactId>spring-boot-starter-websocket</artifactId>-->
-<!--            <optional>true</optional>-->
-<!--        </dependency>-->
-        <!--hutool-all-->
-<!--        <dependency>-->
-<!--            <groupId>cn.hutool</groupId>-->
-<!--            <artifactId>hutool-all</artifactId>-->
-<!--            <version>5.0.3</version>-->
-<!--        </dependency>-->
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-api-account</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-api-system</artifactId>
+        </dependency>
 
     </dependencies>
 
diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/RuoYiGatewayApplication.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/RuoYiGatewayApplication.java
index 3c54b77..b67f5ef 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/RuoYiGatewayApplication.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/RuoYiGatewayApplication.java
@@ -6,24 +6,22 @@
 
 /**
  * 网关启动程序
- * 
+ *
  * @author ruoyi
  */
-@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class })
-public class RuoYiGatewayApplication
-{
-    public static void main(String[] args)
-    {
-        SpringApplication.run(RuoYiGatewayApplication.class, args);
-        System.out.println("(♥◠‿◠)ノ゙  若依网关启动成功   ლ(´ڡ`ლ)゙  \n" +
-                " .-------.       ____     __        \n" +
-                " |  _ _   \\      \\   \\   /  /    \n" +
-                " | ( ' )  |       \\  _. /  '       \n" +
-                " |(_ o _) /        _( )_ .'         \n" +
-                " | (_,_).' __  ___(_ o _)'          \n" +
-                " |  |\\ \\  |  ||   |(_,_)'         \n" +
-                " |  | \\ `'   /|   `-'  /           \n" +
-                " |  |  \\    /  \\      /           \n" +
-                " ''-'   `'-'    `-..-'              ");
-    }
+@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
+public class RuoYiGatewayApplication {
+	public static void main(String[] args) {
+		SpringApplication.run(RuoYiGatewayApplication.class, args);
+		System.out.println("(♥◠‿◠)ノ゙  若依网关启动成功   ლ(´ڡ`ლ)゙  \n" +
+				" .-------.       ____     __        \n" +
+				" |  _ _   \\      \\   \\   /  /    \n" +
+				" | ( ' )  |       \\  _. /  '       \n" +
+				" |(_ o _) /        _( )_ .'         \n" +
+				" | (_,_).' __  ___(_ o _)'          \n" +
+				" |  |\\ \\  |  ||   |(_,_)'         \n" +
+				" |  | \\ `'   /|   `-'  /           \n" +
+				" |  |  \\    /  \\      /           \n" +
+				" ''-'   `'-'    `-..-'              ");
+	}
 }
diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/CaptchaConfig.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/CaptchaConfig.java
index e6c6d9d..bc27c00 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/CaptchaConfig.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/CaptchaConfig.java
@@ -1,83 +1,82 @@
 package com.ruoyi.gateway.config;
 
 import java.util.Properties;
+
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import com.google.code.kaptcha.impl.DefaultKaptcha;
 import com.google.code.kaptcha.util.Config;
+
 import static com.google.code.kaptcha.Constants.*;
 
 /**
  * 验证码配置
- * 
+ *
  * @author ruoyi
  */
 @Configuration
-public class CaptchaConfig
-{
-    @Bean(name = "captchaProducer")
-    public DefaultKaptcha getKaptchaBean()
-    {
-        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
-        Properties properties = new Properties();
-        // 是否有边框 默认为true 我们可以自己设置yes,no
-        properties.setProperty(KAPTCHA_BORDER, "yes");
-        // 验证码文本字符颜色 默认为Color.BLACK
-        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black");
-        // 验证码图片宽度 默认为200
-        properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");
-        // 验证码图片高度 默认为50
-        properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");
-        // 验证码文本字符大小 默认为40
-        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38");
-        // KAPTCHA_SESSION_KEY
-        properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode");
-        // 验证码文本字符长度 默认为5
-        properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");
-        // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)
-        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");
-        // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy
-        properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");
-        Config config = new Config(properties);
-        defaultKaptcha.setConfig(config);
-        return defaultKaptcha;
-    }
-    
-    @Bean(name = "captchaProducerMath")
-    public DefaultKaptcha getKaptchaBeanMath()
-    {
-        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
-        Properties properties = new Properties();
-        // 是否有边框 默认为true 我们可以自己设置yes,no
-        properties.setProperty(KAPTCHA_BORDER, "yes");
-        // 边框颜色 默认为Color.BLACK
-        properties.setProperty(KAPTCHA_BORDER_COLOR, "105,179,90");
-        // 验证码文本字符颜色 默认为Color.BLACK
-        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue");
-        // 验证码图片宽度 默认为200
-        properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");
-        // 验证码图片高度 默认为50
-        properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");
-        // 验证码文本字符大小 默认为40
-        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "35");
-        // KAPTCHA_SESSION_KEY
-        properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath");
-        // 验证码文本生成器
-        properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.ruoyi.gateway.config.KaptchaTextCreator");
-        // 验证码文本字符间距 默认为2
-        properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3");
-        // 验证码文本字符长度 默认为5
-        properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6");
-        // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)
-        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");
-        // 验证码噪点颜色 默认为Color.BLACK
-        properties.setProperty(KAPTCHA_NOISE_COLOR, "white");
-        // 干扰实现类
-        properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise");
-        // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy
-        properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");
-        Config config = new Config(properties);
-        defaultKaptcha.setConfig(config);
-        return defaultKaptcha;
-    }
+public class CaptchaConfig {
+	@Bean(name = "captchaProducer")
+	public DefaultKaptcha getKaptchaBean() {
+		DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
+		Properties properties = new Properties();
+		// 是否有边框 默认为true 我们可以自己设置yes,no
+		properties.setProperty(KAPTCHA_BORDER, "yes");
+		// 验证码文本字符颜色 默认为Color.BLACK
+		properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black");
+		// 验证码图片宽度 默认为200
+		properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");
+		// 验证码图片高度 默认为50
+		properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");
+		// 验证码文本字符大小 默认为40
+		properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38");
+		// KAPTCHA_SESSION_KEY
+		properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode");
+		// 验证码文本字符长度 默认为5
+		properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");
+		// 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)
+		properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");
+		// 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy
+		properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");
+		Config config = new Config(properties);
+		defaultKaptcha.setConfig(config);
+		return defaultKaptcha;
+	}
+	
+	@Bean(name = "captchaProducerMath")
+	public DefaultKaptcha getKaptchaBeanMath() {
+		DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
+		Properties properties = new Properties();
+		// 是否有边框 默认为true 我们可以自己设置yes,no
+		properties.setProperty(KAPTCHA_BORDER, "yes");
+		// 边框颜色 默认为Color.BLACK
+		properties.setProperty(KAPTCHA_BORDER_COLOR, "105,179,90");
+		// 验证码文本字符颜色 默认为Color.BLACK
+		properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue");
+		// 验证码图片宽度 默认为200
+		properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");
+		// 验证码图片高度 默认为50
+		properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");
+		// 验证码文本字符大小 默认为40
+		properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "35");
+		// KAPTCHA_SESSION_KEY
+		properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath");
+		// 验证码文本生成器
+		properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.ruoyi.gateway.config.KaptchaTextCreator");
+		// 验证码文本字符间距 默认为2
+		properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3");
+		// 验证码文本字符长度 默认为5
+		properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6");
+		// 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)
+		properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");
+		// 验证码噪点颜色 默认为Color.BLACK
+		properties.setProperty(KAPTCHA_NOISE_COLOR, "white");
+		// 干扰实现类
+		properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise");
+		// 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy
+		properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");
+		Config config = new Config(properties);
+		defaultKaptcha.setConfig(config);
+		return defaultKaptcha;
+	}
 }
\ No newline at end of file
diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/GatewayConfig.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/GatewayConfig.java
index 3bb6d8e..7fc604d 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/GatewayConfig.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/GatewayConfig.java
@@ -8,16 +8,14 @@
 
 /**
  * 网关限流配置
- * 
+ *
  * @author ruoyi
  */
 @Configuration
-public class GatewayConfig
-{
-    @Bean
-    @Order(Ordered.HIGHEST_PRECEDENCE)
-    public SentinelFallbackHandler sentinelGatewayExceptionHandler()
-    {
-        return new SentinelFallbackHandler();
-    }
+public class GatewayConfig {
+	@Bean
+	@Order(Ordered.HIGHEST_PRECEDENCE)
+	public SentinelFallbackHandler sentinelGatewayExceptionHandler() {
+		return new SentinelFallbackHandler();
+	}
 }
\ No newline at end of file
diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/KaptchaTextCreator.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/KaptchaTextCreator.java
index f68e0fa..8485afa 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/KaptchaTextCreator.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/KaptchaTextCreator.java
@@ -1,75 +1,61 @@
 package com.ruoyi.gateway.config;
 
 import java.util.Random;
+
 import com.google.code.kaptcha.text.impl.DefaultTextCreator;
 
 /**
  * 验证码文本生成器
- * 
+ *
  * @author ruoyi
  */
-public class KaptchaTextCreator extends DefaultTextCreator
-{
-    private static final String[] CNUMBERS = "0,1,2,3,4,5,6,7,8,9,10".split(",");
-
-    @Override
-    public String getText()
-    {
-        Integer result = 0;
-        Random random = new Random();
-        int x = random.nextInt(10);
-        int y = random.nextInt(10);
-        StringBuilder suChinese = new StringBuilder();
-        int randomoperands = random.nextInt(3);
-        if (randomoperands == 0)
-        {
-            result = x * y;
-            suChinese.append(CNUMBERS[x]);
-            suChinese.append("*");
-            suChinese.append(CNUMBERS[y]);
-        }
-        else if (randomoperands == 1)
-        {
-            if ((x != 0) && y % x == 0)
-            {
-                result = y / x;
-                suChinese.append(CNUMBERS[y]);
-                suChinese.append("/");
-                suChinese.append(CNUMBERS[x]);
-            }
-            else
-            {
-                result = x + y;
-                suChinese.append(CNUMBERS[x]);
-                suChinese.append("+");
-                suChinese.append(CNUMBERS[y]);
-            }
-        }
-        else if (randomoperands == 2)
-        {
-            if (x >= y)
-            {
-                result = x - y;
-                suChinese.append(CNUMBERS[x]);
-                suChinese.append("-");
-                suChinese.append(CNUMBERS[y]);
-            }
-            else
-            {
-                result = y - x;
-                suChinese.append(CNUMBERS[y]);
-                suChinese.append("-");
-                suChinese.append(CNUMBERS[x]);
-            }
-        }
-        else
-        {
-            result = x + y;
-            suChinese.append(CNUMBERS[x]);
-            suChinese.append("+");
-            suChinese.append(CNUMBERS[y]);
-        }
-        suChinese.append("=?@" + result);
-        return suChinese.toString();
-    }
+public class KaptchaTextCreator extends DefaultTextCreator {
+	private static final String[] CNUMBERS = "0,1,2,3,4,5,6,7,8,9,10".split(",");
+	
+	@Override
+	public String getText() {
+		Integer result = 0;
+		Random random = new Random();
+		int x = random.nextInt(10);
+		int y = random.nextInt(10);
+		StringBuilder suChinese = new StringBuilder();
+		int randomoperands = random.nextInt(3);
+		if (randomoperands == 0) {
+			result = x * y;
+			suChinese.append(CNUMBERS[x]);
+			suChinese.append("*");
+			suChinese.append(CNUMBERS[y]);
+		} else if (randomoperands == 1) {
+			if ((x != 0) && y % x == 0) {
+				result = y / x;
+				suChinese.append(CNUMBERS[y]);
+				suChinese.append("/");
+				suChinese.append(CNUMBERS[x]);
+			} else {
+				result = x + y;
+				suChinese.append(CNUMBERS[x]);
+				suChinese.append("+");
+				suChinese.append(CNUMBERS[y]);
+			}
+		} else if (randomoperands == 2) {
+			if (x >= y) {
+				result = x - y;
+				suChinese.append(CNUMBERS[x]);
+				suChinese.append("-");
+				suChinese.append(CNUMBERS[y]);
+			} else {
+				result = y - x;
+				suChinese.append(CNUMBERS[y]);
+				suChinese.append("-");
+				suChinese.append(CNUMBERS[x]);
+			}
+		} else {
+			result = x + y;
+			suChinese.append(CNUMBERS[x]);
+			suChinese.append("+");
+			suChinese.append(CNUMBERS[y]);
+		}
+		suChinese.append("=?@" + result);
+		return suChinese.toString();
+	}
 }
\ No newline at end of file
diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/RouterFunctionConfiguration.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/RouterFunctionConfiguration.java
index 6c20c07..05bdc0b 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/RouterFunctionConfiguration.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/RouterFunctionConfiguration.java
@@ -25,55 +25,50 @@
  * @author ruoyi
  */
 @Configuration
-public class RouterFunctionConfiguration
-{
+public class RouterFunctionConfiguration {
 
-    /**
-     * 这里为支持的请求头,如果有自定义的header字段请自己添加
-     */
-    private static final String ALLOWED_HEADERS = "X-Requested-With, Content-Type, Authorization, credential, X-XSRF-TOKEN, token, username, client, request-origion, sign, nonce_str";
-    private static final String ALLOWED_METHODS = "GET,POST,PUT,DELETE,OPTIONS,HEAD";
-    private static final String ALLOWED_ORIGIN = "*";
-    private static final String ALLOWED_EXPOSE = "*";
-    private static final String MAX_AGE = "18000L";
+	/**
+	 * 这里为支持的请求头,如果有自定义的header字段请自己添加
+	 */
+	private static final String ALLOWED_HEADERS = "X-Requested-With, Content-Type, Authorization, credential, X-XSRF-TOKEN, token, username, client, request-origion, sign, nonce_str, timestamp";
+	private static final String ALLOWED_METHODS = "GET,POST,PUT,DELETE,OPTIONS,HEAD";
+	private static final String ALLOWED_ORIGIN = "*";
+	private static final String ALLOWED_EXPOSE = "*";
+	private static final String MAX_AGE = "18000L";
 
-    @Autowired
-    private ValidateCodeHandler validateCodeHandler;
+	@Autowired
+	private ValidateCodeHandler validateCodeHandler;
 
-    @SuppressWarnings("rawtypes")
-    @Bean
-    public RouterFunction routerFunction()
-    {
-        return RouterFunctions.route(
-                RequestPredicates.GET("/code").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)),
-                validateCodeHandler);
-    }
+	@SuppressWarnings("rawtypes")
+	@Bean
+	public RouterFunction routerFunction() {
+		return RouterFunctions.route(
+				RequestPredicates.GET("/code").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)),
+				validateCodeHandler);
+	}
 
-    /**
-     * 跨域配置
-     */
-    @Bean
-    public WebFilter corsFilter()
-    {
-        return (ServerWebExchange ctx, WebFilterChain chain) -> {
-            ServerHttpRequest request = ctx.getRequest();
-            if (CorsUtils.isCorsRequest(request))
-            {
-                ServerHttpResponse response = ctx.getResponse();
-                HttpHeaders headers = response.getHeaders();
-                headers.add("Access-Control-Allow-Headers", ALLOWED_HEADERS);
-                headers.add("Access-Control-Allow-Methods", ALLOWED_METHODS);
-                headers.add("Access-Control-Allow-Origin", ALLOWED_ORIGIN);
-                headers.add("Access-Control-Expose-Headers", ALLOWED_EXPOSE);
-                headers.add("Access-Control-Max-Age", MAX_AGE);
-                headers.add("Access-Control-Allow-Credentials", "true");
-                if (request.getMethod() == HttpMethod.OPTIONS)
-                {
-                    response.setStatusCode(HttpStatus.OK);
-                    return Mono.empty();
-                }
-            }
-            return chain.filter(ctx);
-        };
-    }
+	/**
+	 * 跨域配置
+	 */
+	@Bean
+	public WebFilter corsFilter() {
+		return (ServerWebExchange ctx, WebFilterChain chain) -> {
+			ServerHttpRequest request = ctx.getRequest();
+			if (CorsUtils.isCorsRequest(request)) {
+				ServerHttpResponse response = ctx.getResponse();
+				HttpHeaders headers = response.getHeaders();
+				headers.add("Access-Control-Allow-Headers", ALLOWED_HEADERS);
+				headers.add("Access-Control-Allow-Methods", ALLOWED_METHODS);
+				headers.add("Access-Control-Allow-Origin", ALLOWED_ORIGIN);
+				headers.add("Access-Control-Expose-Headers", ALLOWED_EXPOSE);
+				headers.add("Access-Control-Max-Age", MAX_AGE);
+				headers.add("Access-Control-Allow-Credentials", "true");
+				if (request.getMethod() == HttpMethod.OPTIONS) {
+					response.setStatusCode(HttpStatus.OK);
+					return Mono.empty();
+				}
+			}
+			return chain.filter(ctx);
+		};
+	}
 }
diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/SwaggerProvider.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/SwaggerProvider.java
index 7c58673..495dd46 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/SwaggerProvider.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/SwaggerProvider.java
@@ -2,6 +2,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cloud.gateway.config.GatewayProperties;
 import org.springframework.cloud.gateway.route.RouteLocator;
@@ -15,65 +16,61 @@
 
 /**
  * 聚合系统接口
- * 
+ *
  * @author ruoyi
  */
 @Component
-public class SwaggerProvider implements SwaggerResourcesProvider, WebFluxConfigurer
-{
-    /**
-     * Swagger2默认的url后缀
-     */
-    public static final String SWAGGER2URL = "/v2/api-docs";
-
-    /**
-     * 网关路由
-     */
-    @Lazy
-    @Autowired
-    private RouteLocator routeLocator;
-
-    @Autowired
-    private GatewayProperties gatewayProperties;
-
-    /**
-     * 聚合其他服务接口
-     * 
-     * @return
-     */
-    @Override
-    public List<SwaggerResource> get()
-    {
-        List<SwaggerResource> resourceList = new ArrayList<>();
-        List<String> routes = new ArrayList<>();
-        // 获取网关中配置的route
-        routeLocator.getRoutes().subscribe(route -> routes.add(route.getId()));
-        gatewayProperties.getRoutes().stream()
-                .filter(routeDefinition -> routes
-                        .contains(routeDefinition.getId()))
-                .forEach(routeDefinition -> routeDefinition.getPredicates().stream()
-                        .filter(predicateDefinition -> "Path".equalsIgnoreCase(predicateDefinition.getName()))
-                        .filter(predicateDefinition -> !"ruoyi-auth".equalsIgnoreCase(routeDefinition.getId()))
-                        .forEach(predicateDefinition -> resourceList
-                                .add(swaggerResource(routeDefinition.getId(), predicateDefinition.getArgs()
-                                        .get(NameUtils.GENERATED_NAME_PREFIX + "0").replace("/**", SWAGGER2URL)))));
-        return resourceList;
-    }
-
-    private SwaggerResource swaggerResource(String name, String location)
-    {
-        SwaggerResource swaggerResource = new SwaggerResource();
-        swaggerResource.setName(name);
-        swaggerResource.setLocation(location);
-        swaggerResource.setSwaggerVersion("2.0");
-        return swaggerResource;
-    }
-
-    @Override
-    public void addResourceHandlers(ResourceHandlerRegistry registry)
-    {
-        /** swagger-ui 地址 */
-        registry.addResourceHandler("/swagger-ui/**","*/doc.html")
-                .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/");
-    }
+public class SwaggerProvider implements SwaggerResourcesProvider, WebFluxConfigurer {
+	/**
+	 * Swagger2默认的url后缀
+	 */
+	public static final String SWAGGER2URL = "/v2/api-docs";
+	
+	/**
+	 * 网关路由
+	 */
+	@Lazy
+	@Autowired
+	private RouteLocator routeLocator;
+	
+	@Autowired
+	private GatewayProperties gatewayProperties;
+	
+	/**
+	 * 聚合其他服务接口
+	 *
+	 * @return
+	 */
+	@Override
+	public List<SwaggerResource> get() {
+		List<SwaggerResource> resourceList = new ArrayList<>();
+		List<String> routes = new ArrayList<>();
+		// 获取网关中配置的route
+		routeLocator.getRoutes().subscribe(route -> routes.add(route.getId()));
+		gatewayProperties.getRoutes().stream()
+				.filter(routeDefinition -> routes
+						.contains(routeDefinition.getId()))
+				.forEach(routeDefinition -> routeDefinition.getPredicates().stream()
+						.filter(predicateDefinition -> "Path".equalsIgnoreCase(predicateDefinition.getName()))
+						.filter(predicateDefinition -> !"ruoyi-auth".equalsIgnoreCase(routeDefinition.getId()))
+						.forEach(predicateDefinition -> resourceList
+								.add(swaggerResource(routeDefinition.getId(), predicateDefinition.getArgs()
+										.get(NameUtils.GENERATED_NAME_PREFIX + "0").replace("/**", SWAGGER2URL)))));
+		return resourceList;
+	}
+	
+	private SwaggerResource swaggerResource(String name, String location) {
+		SwaggerResource swaggerResource = new SwaggerResource();
+		swaggerResource.setName(name);
+		swaggerResource.setLocation(location);
+		swaggerResource.setSwaggerVersion("2.0");
+		return swaggerResource;
+	}
+	
+	@Override
+	public void addResourceHandlers(ResourceHandlerRegistry registry) {
+		/** swagger-ui 地址 */
+		registry.addResourceHandler("/swagger-ui/**", "*/doc.html")
+				.addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/");
+	}
 }
diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/CaptchaProperties.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/CaptchaProperties.java
index f6bb000..fb086bc 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/CaptchaProperties.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/CaptchaProperties.java
@@ -6,41 +6,36 @@
 
 /**
  * 验证码配置
- * 
+ *
  * @author ruoyi
  */
 @Configuration
 @RefreshScope
 @ConfigurationProperties(prefix = "security.captcha")
-public class CaptchaProperties
-{
-    /**
-     * 验证码开关
-     */
-    private Boolean enabled;
-
-    /**
-     * 验证码类型(math 数组计算 char 字符)
-     */
-    private String type;
-
-    public Boolean getEnabled()
-    {
-        return enabled;
-    }
-
-    public void setEnabled(Boolean enabled)
-    {
-        this.enabled = enabled;
-    }
-
-    public String getType()
-    {
-        return type;
-    }
-
-    public void setType(String type)
-    {
-        this.type = type;
-    }
+public class CaptchaProperties {
+	/**
+	 * 验证码开关
+	 */
+	private Boolean enabled;
+	
+	/**
+	 * 验证码类型(math 数组计算 char 字符)
+	 */
+	private String type;
+	
+	public Boolean getEnabled() {
+		return enabled;
+	}
+	
+	public void setEnabled(Boolean enabled) {
+		this.enabled = enabled;
+	}
+	
+	public String getType() {
+		return type;
+	}
+	
+	public void setType(String type) {
+		this.type = type;
+	}
 }
diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/IgnoreWhiteProperties.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/IgnoreWhiteProperties.java
index 1d2c56a..5797322 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/IgnoreWhiteProperties.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/IgnoreWhiteProperties.java
@@ -2,32 +2,30 @@
 
 import java.util.ArrayList;
 import java.util.List;
+
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.cloud.context.config.annotation.RefreshScope;
 import org.springframework.context.annotation.Configuration;
 
 /**
  * 放行白名单配置
- * 
+ *
  * @author ruoyi
  */
 @Configuration
 @RefreshScope
 @ConfigurationProperties(prefix = "security.ignore")
-public class IgnoreWhiteProperties
-{
-    /**
-     * 放行白名单配置,网关不校验此处的白名单
-     */
-    private List<String> whites = new ArrayList<>();
-
-    public List<String> getWhites()
-    {
-        return whites;
-    }
-
-    public void setWhites(List<String> whites)
-    {
-        this.whites = whites;
-    }
+public class IgnoreWhiteProperties {
+	/**
+	 * 放行白名单配置,网关不校验此处的白名单
+	 */
+	private List<String> whites = new ArrayList<>();
+	
+	public List<String> getWhites() {
+		return whites;
+	}
+	
+	public void setWhites(List<String> whites) {
+		this.whites = whites;
+	}
 }
diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/XssProperties.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/XssProperties.java
index 891679e..39441b8 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/XssProperties.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/XssProperties.java
@@ -2,47 +2,43 @@
 
 import java.util.ArrayList;
 import java.util.List;
+
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.cloud.context.config.annotation.RefreshScope;
 import org.springframework.context.annotation.Configuration;
 
 /**
  * XSS跨站脚本配置
- * 
+ *
  * @author ruoyi
  */
 @Configuration
 @RefreshScope
 @ConfigurationProperties(prefix = "security.xss")
-public class XssProperties
-{
-    /**
-     * Xss开关
-     */
-    private Boolean enabled;
-
-    /**
-     * 排除路径
-     */
-    private List<String> excludeUrls = new ArrayList<>();
-
-    public Boolean getEnabled()
-    {
-        return enabled;
-    }
-
-    public void setEnabled(Boolean enabled)
-    {
-        this.enabled = enabled;
-    }
-
-    public List<String> getExcludeUrls()
-    {
-        return excludeUrls;
-    }
-
-    public void setExcludeUrls(List<String> excludeUrls)
-    {
-        this.excludeUrls = excludeUrls;
-    }
+public class XssProperties {
+	/**
+	 * Xss开关
+	 */
+	private Boolean enabled;
+	
+	/**
+	 * 排除路径
+	 */
+	private List<String> excludeUrls = new ArrayList<>();
+	
+	public Boolean getEnabled() {
+		return enabled;
+	}
+	
+	public void setEnabled(Boolean enabled) {
+		this.enabled = enabled;
+	}
+	
+	public List<String> getExcludeUrls() {
+		return excludeUrls;
+	}
+	
+	public void setExcludeUrls(List<String> excludeUrls) {
+		this.excludeUrls = excludeUrls;
+	}
 }
diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java
index e829417..f46470c 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java
@@ -1,18 +1,17 @@
 package com.ruoyi.gateway.filter;
 
-import com.alibaba.fastjson.JSONObject;
-import org.apache.commons.codec.binary.Base64;
+import com.ruoyi.account.api.feignClient.AppUserClient;
+import com.ruoyi.account.api.model.TAppUser;
+import com.ruoyi.system.api.domain.SysUser;
+import com.ruoyi.system.api.feignClient.SysUserClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.cloud.gateway.filter.GatewayFilterChain;
 import org.springframework.cloud.gateway.filter.GlobalFilter;
 import org.springframework.core.Ordered;
-import org.springframework.core.io.buffer.DataBuffer;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.server.reactive.ServerHttpRequest;
-import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
 import org.springframework.stereotype.Component;
 import org.springframework.web.server.ServerWebExchange;
 import com.ruoyi.common.core.constant.CacheConstants;
@@ -25,113 +24,209 @@
 import com.ruoyi.common.redis.service.RedisService;
 import com.ruoyi.gateway.config.properties.IgnoreWhiteProperties;
 import io.jsonwebtoken.Claims;
-import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicReference;
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+
 
 /**
  * 网关鉴权
- * 
+ *
  * @author ruoyi
  */
 @Component
 public class AuthFilter implements GlobalFilter, Ordered {
-    private static final Logger log = LoggerFactory.getLogger(AuthFilter.class);
-
-    // 排除过滤的 uri 地址,nacos自行添加
-    @Autowired
-    private IgnoreWhiteProperties ignoreWhite;
-
-    @Autowired
-    private RedisService redisService;
-
-
-    @Override
-    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
-        ServerHttpRequest request = exchange.getRequest();
-        ServerHttpRequest.Builder mutate = request.mutate();
-
-        String url = request.getURI().getPath();
-        // 跳过不需要验证的路径
-        if (StringUtils.matches(url, ignoreWhite.getWhites())) {
-            return chain.filter(exchange);
-        }
-        String token = getToken(request);
-        if (StringUtils.isEmpty(token)) {
-            return unauthorizedResponse(exchange, "令牌不能为空");
-        }
-        Claims claims = JwtUtils.parseToken(token);
-        if (claims == null) {
-            return unauthorizedResponse(exchange, "令牌已过期或验证不正确!");
-        }
-        String userkey = JwtUtils.getUserKey(claims);
-        boolean islogin = redisService.hasKey(getTokenKey(userkey));
-        if (!islogin) {
-            return unauthorizedResponse(exchange, "登录状态已过期");
-        }
-        String userid = JwtUtils.getUserId(claims);
-        String username = JwtUtils.getUserName(claims);
-        if (StringUtils.isEmpty(userid) || StringUtils.isEmpty(username)) {
-            return unauthorizedResponse(exchange, "令牌验证失败");
-        }
-
-        // 设置用户信息到请求
-        addHeader(mutate, SecurityConstants.USER_KEY, userkey);
-        addHeader(mutate, SecurityConstants.DETAILS_USER_ID, userid);
-        addHeader(mutate, SecurityConstants.DETAILS_USERNAME, username);
-        // 内部请求来源参数清除
-        removeHeader(mutate, SecurityConstants.FROM_SOURCE);
-        return chain.filter(exchange.mutate().request(mutate.build()).build());
-    }
-
-    private void addHeader(ServerHttpRequest.Builder mutate, String name, Object value) {
-        if (value == null) {
-            return;
-        }
-        String valueStr = value.toString();
-        String valueEncode = ServletUtils.urlEncode(valueStr);
-        mutate.header(name, valueEncode);
-    }
-
-    private void removeHeader(ServerHttpRequest.Builder mutate, String name) {
-        mutate.headers(httpHeaders -> httpHeaders.remove(name)).build();
-    }
-
-    private Mono<Void> unauthorizedResponse(ServerWebExchange exchange, String msg) {
-        log.error("[鉴权异常处理]请求路径:{}", exchange.getRequest().getPath());
-        return ServletUtils.webFluxResponseWriter(exchange.getResponse(), msg, HttpStatus.UNAUTHORIZED);
-    }
-
-    /**
-     * 获取缓存key
-     */
-    private String getTokenKey(String token)
-    {
-        return CacheConstants.LOGIN_TOKEN_KEY + token;
-    }
-
-    /**
-     * 获取请求token
-     */
-    private String getToken(ServerHttpRequest request) {
-        String token = request.getHeaders().getFirst(TokenConstants.AUTHENTICATION);
-        // 如果前端设置了令牌前缀,则裁剪掉前缀
-        if (StringUtils.isNotEmpty(token) && token.startsWith(TokenConstants.PREFIX))
-        {
-            token = token.replaceFirst(TokenConstants.PREFIX, StringUtils.EMPTY);
-        }
-        return token;
-    }
-    
-    
-    @Override
-    public int getOrder()
-    {
-        return -300;
-    }
+	private static final Logger log = LoggerFactory.getLogger(AuthFilter.class);
+	
+	// 排除过滤的 uri 地址,nacos自行添加
+	@Autowired
+	private IgnoreWhiteProperties ignoreWhite;
+	
+	@Autowired
+	private RedisService redisService;
+	
+	@Resource
+	private AppUserClient appUserClient;
+	
+	@Resource
+	private SysUserClient sysUserClient;
+	
+	
+	
+	@Override
+	public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+		ServerHttpRequest request = exchange.getRequest();
+		ServerHttpRequest.Builder mutate = request.mutate();
+		
+		String url = request.getURI().getPath();
+		// 跳过不需要验证的路径
+		if (StringUtils.matches(url, ignoreWhite.getWhites())) {
+			return chain.filter(exchange);
+		}
+		//防抖校验
+		try {
+			antiShake(request);
+		}catch (Exception e){
+			log.error("[重复提交]请求路径:{}", exchange.getRequest().getPath());
+			return ServletUtils.webFluxResponseWriter(exchange.getResponse(), e.getMessage(), HttpStatus.SUCCESS);
+		}
+		
+		//校验账户是否有效
+		try {
+			verifyToken(request);
+			verifyAccount(request);
+		}catch (Exception e){
+			return unauthorizedResponse(exchange, e.getMessage());
+		}
+		String token = getToken(request);
+		Claims claims = JwtUtils.parseToken(token);
+		String userkey = JwtUtils.getUserKey(claims);
+		String userid = JwtUtils.getUserId(claims);
+		String username = JwtUtils.getUserName(claims);
+		
+		// 设置用户信息到请求
+		addHeader(mutate, SecurityConstants.USER_KEY, userkey);
+		addHeader(mutate, SecurityConstants.DETAILS_USER_ID, userid);
+		addHeader(mutate, SecurityConstants.DETAILS_USERNAME, username);
+		// 内部请求来源参数清除
+		removeHeader(mutate, SecurityConstants.FROM_SOURCE);
+		return chain.filter(exchange.mutate().request(mutate.build()).build());
+	}
+	
+	private void addHeader(ServerHttpRequest.Builder mutate, String name, Object value) {
+		if (value == null) {
+			return;
+		}
+		String valueStr = value.toString();
+		String valueEncode = ServletUtils.urlEncode(valueStr);
+		mutate.header(name, valueEncode);
+	}
+	
+	private void removeHeader(ServerHttpRequest.Builder mutate, String name) {
+		mutate.headers(httpHeaders -> httpHeaders.remove(name)).build();
+	}
+	
+	private Mono<Void> unauthorizedResponse(ServerWebExchange exchange, String msg) {
+		log.error("[鉴权异常处理]请求路径:{}", exchange.getRequest().getPath());
+		return ServletUtils.webFluxResponseWriter(exchange.getResponse(), msg, HttpStatus.UNAUTHORIZED);
+	}
+	
+	/**
+	 * 获取缓存key
+	 */
+	private String getTokenKey(String token) {
+		return CacheConstants.LOGIN_TOKEN_KEY + token;
+	}
+	
+	/**
+	 * 获取请求token
+	 */
+	private String getToken(ServerHttpRequest request) {
+		String token = request.getHeaders().getFirst(TokenConstants.AUTHENTICATION);
+		// 如果前端设置了令牌前缀,则裁剪掉前缀
+		if (StringUtils.isNotEmpty(token) && token.startsWith(TokenConstants.PREFIX)) {
+			token = token.replaceFirst(TokenConstants.PREFIX, StringUtils.EMPTY);
+		}
+		return token;
+	}
+	
+	
+	/**
+	 * 防抖处理
+	 */
+	public void antiShake(ServerHttpRequest request) throws Exception{
+		HttpHeaders headers = request.getHeaders();
+		String client = headers.getFirst("client");
+		String timestamp = headers.getFirst("timestamp");
+		String url = request.getURI().getPath();
+		Map<String, Object> cacheMap = redisService.getCacheMap(client);
+		if(null == cacheMap){
+			cacheMap = new HashMap<>();
+			cacheMap.put(url, timestamp);
+			redisService.setCacheMap(client, cacheMap);
+		}else{
+			Object o = cacheMap.get(url);
+			if(null == o){
+				cacheMap.put(url, timestamp);
+			}else{
+				Long old_timestamp = Long.valueOf(o.toString());
+				Long new_timestamp = Long.valueOf(timestamp);
+				//两个请求时间差小于1秒,判定为重复提交
+				if((new_timestamp - old_timestamp) <= 1000){
+					throw new RuntimeException("重复提交");
+				}else{
+					cacheMap.put(url, timestamp);
+				}
+			}
+			redisService.setCacheMap(client, cacheMap);
+		}
+	}
+	
+	
+	
+	/**
+	 * 验证token
+	 * @param request
+	 * @throws Exception
+	 */
+	public void verifyToken(ServerHttpRequest request) throws Exception{
+		String token = getToken(request);
+		if (StringUtils.isEmpty(token)) {
+			throw new RuntimeException("令牌不能为空");
+		}
+		Claims claims = JwtUtils.parseToken(token);
+		if (claims == null) {
+			throw new RuntimeException("令牌已过期或验证不正确!");
+		}
+		String userkey = JwtUtils.getUserKey(claims);
+		boolean islogin = redisService.hasKey(getTokenKey(userkey));
+		if (!islogin) {
+			throw new RuntimeException("登录状态已过期");
+		}
+		String userid = JwtUtils.getUserId(claims);
+		String username = JwtUtils.getUserName(claims);
+		if (StringUtils.isEmpty(userid) || StringUtils.isEmpty(username)) {
+			throw new RuntimeException("令牌验证失败");
+		}
+	}
+	
+	/**
+	 * 校验账户是否有效
+	 * @param request
+	 * @throws Exception
+	 */
+	public void verifyAccount(ServerHttpRequest request) throws Exception{
+		String token = getToken(request);
+		Claims claims = JwtUtils.parseToken(token);
+		String userid = JwtUtils.getUserId(claims);
+		String userType = JwtUtils.getUserType(claims);
+		//管理后台用户
+		if ("system".equals(userType)) {
+			SysUser sysUser = sysUserClient.getSysUser(Long.valueOf(userid)).getData();
+			if(null == sysUser || "2".equals(sysUser.getDelFlag())){
+				throw new RuntimeException("无效的账户");
+			}
+			if("1".equals(sysUser.getStatus())){
+				throw new RuntimeException("账户已被停用,请联系系统管理员!");
+			}
+		}
+		//小程序用户
+		if ("applet".equals(userType)) {
+			TAppUser appUser = appUserClient.getUserById(Long.valueOf(userid)).getData();
+			if(null == appUser || appUser.getDelFlag() || 3 == appUser.getStatus()){
+				throw new RuntimeException("无效的账户");
+			}
+			if(2 == appUser.getStatus()){
+				throw new RuntimeException("账户已被冻结,请联系系统管理员!");
+			}
+		}
+	}
+	
+	
+	@Override
+	public int getOrder() {
+		return -300;
+	}
 }
\ No newline at end of file
diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/BlackListUrlFilter.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/BlackListUrlFilter.java
index 343bd01..8a56dcf 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/BlackListUrlFilter.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/BlackListUrlFilter.java
@@ -3,6 +3,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.regex.Pattern;
+
 import org.springframework.cloud.gateway.filter.GatewayFilter;
 import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
 import org.springframework.stereotype.Component;
@@ -10,56 +11,48 @@
 
 /**
  * 黑名单过滤器
- * 
+ *
  * @author ruoyi
  */
 @Component
-public class BlackListUrlFilter extends AbstractGatewayFilterFactory<BlackListUrlFilter.Config>
-{
-    @Override
-    public GatewayFilter apply(Config config)
-    {
-        return (exchange, chain) -> {
-
-            String url = exchange.getRequest().getURI().getPath();
-            if (config.matchBlacklist(url))
-            {
-                return ServletUtils.webFluxResponseWriter(exchange.getResponse(), "请求地址不允许访问");
-            }
-
-            return chain.filter(exchange);
-        };
-    }
-
-    public BlackListUrlFilter()
-    {
-        super(Config.class);
-    }
-
-    public static class Config
-    {
-        private List<String> blacklistUrl;
-
-        private List<Pattern> blacklistUrlPattern = new ArrayList<>();
-
-        public boolean matchBlacklist(String url)
-        {
-            return !blacklistUrlPattern.isEmpty() && blacklistUrlPattern.stream().anyMatch(p -> p.matcher(url).find());
-        }
-
-        public List<String> getBlacklistUrl()
-        {
-            return blacklistUrl;
-        }
-
-        public void setBlacklistUrl(List<String> blacklistUrl)
-        {
-            this.blacklistUrl = blacklistUrl;
-            this.blacklistUrlPattern.clear();
-            this.blacklistUrl.forEach(url -> {
-                this.blacklistUrlPattern.add(Pattern.compile(url.replaceAll("\\*\\*", "(.*?)"), Pattern.CASE_INSENSITIVE));
-            });
-        }
-    }
-
+public class BlackListUrlFilter extends AbstractGatewayFilterFactory<BlackListUrlFilter.Config> {
+	public BlackListUrlFilter() {
+		super(Config.class);
+	}
+	
+	@Override
+	public GatewayFilter apply(Config config) {
+		return (exchange, chain) -> {
+			
+			String url = exchange.getRequest().getURI().getPath();
+			if (config.matchBlacklist(url)) {
+				return ServletUtils.webFluxResponseWriter(exchange.getResponse(), "请求地址不允许访问");
+			}
+			
+			return chain.filter(exchange);
+		};
+	}
+	
+	public static class Config {
+		private List<String> blacklistUrl;
+		
+		private List<Pattern> blacklistUrlPattern = new ArrayList<>();
+		
+		public boolean matchBlacklist(String url) {
+			return !blacklistUrlPattern.isEmpty() && blacklistUrlPattern.stream().anyMatch(p -> p.matcher(url).find());
+		}
+		
+		public List<String> getBlacklistUrl() {
+			return blacklistUrl;
+		}
+		
+		public void setBlacklistUrl(List<String> blacklistUrl) {
+			this.blacklistUrl = blacklistUrl;
+			this.blacklistUrlPattern.clear();
+			this.blacklistUrl.forEach(url -> {
+				this.blacklistUrlPattern.add(Pattern.compile(url.replaceAll("\\*\\*", "(.*?)"), Pattern.CASE_INSENSITIVE));
+			});
+		}
+	}
+	
 }
diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/CacheRequestFilter.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/CacheRequestFilter.java
index 94c6cb5..2228c96 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/CacheRequestFilter.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/CacheRequestFilter.java
@@ -2,6 +2,7 @@
 
 import java.util.Collections;
 import java.util.List;
+
 import org.springframework.cloud.gateway.filter.GatewayFilter;
 import org.springframework.cloud.gateway.filter.GatewayFilterChain;
 import org.springframework.cloud.gateway.filter.OrderedGatewayFilter;
@@ -14,74 +15,61 @@
 
 /**
  * 获取body请求数据(解决流不能重复读取问题)
- * 
+ *
  * @author ruoyi
  */
 @Component
-public class CacheRequestFilter extends AbstractGatewayFilterFactory<CacheRequestFilter.Config>
-{
-    public CacheRequestFilter()
-    {
-        super(Config.class);
-    }
-
-    @Override
-    public String name()
-    {
-        return "CacheRequestFilter";
-    }
-
-    @Override
-    public GatewayFilter apply(Config config)
-    {
-        CacheRequestGatewayFilter cacheRequestGatewayFilter = new CacheRequestGatewayFilter();
-        Integer order = config.getOrder();
-        if (order == null)
-        {
-            return cacheRequestGatewayFilter;
-        }
-        return new OrderedGatewayFilter(cacheRequestGatewayFilter, order);
-    }
-
-    public static class CacheRequestGatewayFilter implements GatewayFilter
-    {
-        @Override
-        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain)
-        {
-            // GET DELETE 不过滤
-            HttpMethod method = exchange.getRequest().getMethod();
-            if (method == null || method == HttpMethod.GET || method == HttpMethod.DELETE)
-            {
-                return chain.filter(exchange);
-            }
-            return ServerWebExchangeUtils.cacheRequestBodyAndRequest(exchange, (serverHttpRequest) -> {
-                if (serverHttpRequest == exchange.getRequest())
-                {
-                    return chain.filter(exchange);
-                }
-                return chain.filter(exchange.mutate().request(serverHttpRequest).build());
-            });
-        }
-    }
-
-    @Override
-    public List<String> shortcutFieldOrder()
-    {
-        return Collections.singletonList("order");
-    }
-
-    static class Config
-    {
-        private Integer order;
-
-        public Integer getOrder()
-        {
-            return order;
-        }
-
-        public void setOrder(Integer order)
-        {
-            this.order = order;
-        }
-    }
+public class CacheRequestFilter extends AbstractGatewayFilterFactory<CacheRequestFilter.Config> {
+	public CacheRequestFilter() {
+		super(Config.class);
+	}
+	
+	@Override
+	public String name() {
+		return "CacheRequestFilter";
+	}
+	
+	@Override
+	public GatewayFilter apply(Config config) {
+		CacheRequestGatewayFilter cacheRequestGatewayFilter = new CacheRequestGatewayFilter();
+		Integer order = config.getOrder();
+		if (order == null) {
+			return cacheRequestGatewayFilter;
+		}
+		return new OrderedGatewayFilter(cacheRequestGatewayFilter, order);
+	}
+	
+	@Override
+	public List<String> shortcutFieldOrder() {
+		return Collections.singletonList("order");
+	}
+	
+	public static class CacheRequestGatewayFilter implements GatewayFilter {
+		@Override
+		public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+			// GET DELETE 不过滤
+			HttpMethod method = exchange.getRequest().getMethod();
+			if (method == null || method == HttpMethod.GET || method == HttpMethod.DELETE) {
+				return chain.filter(exchange);
+			}
+			return ServerWebExchangeUtils.cacheRequestBodyAndRequest(exchange, (serverHttpRequest) -> {
+				if (serverHttpRequest == exchange.getRequest()) {
+					return chain.filter(exchange);
+				}
+				return chain.filter(exchange.mutate().request(serverHttpRequest).build());
+			});
+		}
+	}
+	
+	static class Config {
+		private Integer order;
+		
+		public Integer getOrder() {
+			return order;
+		}
+		
+		public void setOrder(Integer order) {
+			this.order = order;
+		}
+	}
 }
\ No newline at end of file
diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/HMACSHA1.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/HMACSHA1.java
index 976f086..5b7782d 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/HMACSHA1.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/HMACSHA1.java
@@ -6,17 +6,15 @@
 import javax.crypto.spec.SecretKeySpec;
 
 public class HMACSHA1 {
-
+	
 	private static final String MAC_NAME = "HmacSHA1";
 	private static final String ENCODING = "UTF-8";
-
+	
 	/**
 	 * 使用 HMAC-SHA1 签名方法对对encryptText进行签名
-	 * 
-	 * @param encryptText
-	 *            被签名的字符串
-	 * @param encryptKey
-	 *            密钥
+	 *
+	 * @param encryptText 被签名的字符串
+	 * @param encryptKey  密钥
 	 * @return
 	 * @throws Exception
 	 */
@@ -28,7 +26,7 @@
 		// 生成一个指定 Mac 算法 的 Mac 对象
 		// 用给定密钥初始化 Mac 对象
 		mac.init(secretKey);
-
+		
 		byte[] text = encryptText.getBytes(ENCODING);
 		// 完成 Mac 操作
 		return mac.doFinal(text);
diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/RequestParamGlobalFilter.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/RequestParamGlobalFilter.java
index c13f096..dd622ed 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/RequestParamGlobalFilter.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/RequestParamGlobalFilter.java
@@ -42,57 +42,53 @@
  */
 @Component
 public class RequestParamGlobalFilter implements GlobalFilter, Ordered {
-    
-
-    
-    @Override
-    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
-        ServerHttpRequestDecorator httpRequestDecorator = requestDecorator(exchange);
-        return chain.filter(exchange.mutate().request(httpRequestDecorator).build());
-    }
-
-    
-    
-    
-    private ServerHttpRequestDecorator requestDecorator(ServerWebExchange exchange) {
-        ServerHttpRequestDecorator serverHttpRequestDecorator = new ServerHttpRequestDecorator(exchange.getRequest()) {
-            @Override
-            public Flux<DataBuffer> getBody() {
-                Flux<DataBuffer> body = super.getBody();
-                return body.buffer().map(dataBuffers -> {
-                    DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
-                    DataBuffer join = dataBufferFactory.join(dataBuffers);
-                    byte[] content = new byte[join.readableByteCount()];
-                    join.read(content);
-                    DataBufferUtils.release(join);
-                    String bodyStr = new String(content, StandardCharsets.UTF_8);
-                    // 转成字节
-                    byte[] bytes = bodyStr.getBytes();
-                    NettyDataBufferFactory nettyDataBufferFactory = new NettyDataBufferFactory(ByteBufAllocator.DEFAULT);
-                    DataBuffer buffer = nettyDataBufferFactory.allocateBuffer(bytes.length);
-                    buffer.write(bytes);
-                    return buffer;
-                });
-            }
-
-            @Override
-            public HttpHeaders getHeaders() {
-                HttpHeaders httpHeaders = new HttpHeaders();
-                httpHeaders.putAll(super.getHeaders());
-                // 由于修改了请求体的body,导致content-length长度不确定,因此需要删除原先的content-length
-                httpHeaders.remove(HttpHeaders.CONTENT_LENGTH);
-                httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked");
-                return httpHeaders;
-            }
-
-        };
-        return serverHttpRequestDecorator;
-    }
-    
-    
-    @Override
-    public int getOrder()
-    {
-        return HIGHEST_PRECEDENCE;
-    }
+	
+	
+	@Override
+	public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+		ServerHttpRequestDecorator httpRequestDecorator = requestDecorator(exchange);
+		return chain.filter(exchange.mutate().request(httpRequestDecorator).build());
+	}
+	
+	
+	private ServerHttpRequestDecorator requestDecorator(ServerWebExchange exchange) {
+		ServerHttpRequestDecorator serverHttpRequestDecorator = new ServerHttpRequestDecorator(exchange.getRequest()) {
+			@Override
+			public Flux<DataBuffer> getBody() {
+				Flux<DataBuffer> body = super.getBody();
+				return body.buffer().map(dataBuffers -> {
+					DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
+					DataBuffer join = dataBufferFactory.join(dataBuffers);
+					byte[] content = new byte[join.readableByteCount()];
+					join.read(content);
+					DataBufferUtils.release(join);
+					String bodyStr = new String(content, StandardCharsets.UTF_8);
+					// 转成字节
+					byte[] bytes = bodyStr.getBytes();
+					NettyDataBufferFactory nettyDataBufferFactory = new NettyDataBufferFactory(ByteBufAllocator.DEFAULT);
+					DataBuffer buffer = nettyDataBufferFactory.allocateBuffer(bytes.length);
+					buffer.write(bytes);
+					return buffer;
+				});
+			}
+			
+			@Override
+			public HttpHeaders getHeaders() {
+				HttpHeaders httpHeaders = new HttpHeaders();
+				httpHeaders.putAll(super.getHeaders());
+				// 由于修改了请求体的body,导致content-length长度不确定,因此需要删除原先的content-length
+				httpHeaders.remove(HttpHeaders.CONTENT_LENGTH);
+				httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked");
+				return httpHeaders;
+			}
+			
+		};
+		return serverHttpRequestDecorator;
+	}
+	
+	
+	@Override
+	public int getOrder() {
+		return HIGHEST_PRECEDENCE;
+	}
 }
diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/SignFilter.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/SignFilter.java
index 7ea17ff..ba04854 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/SignFilter.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/SignFilter.java
@@ -1,6 +1,7 @@
 package com.ruoyi.gateway.filter;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.ruoyi.common.core.constant.CacheConstants;
 import com.ruoyi.common.core.constant.HttpStatus;
@@ -47,13 +48,6 @@
 public class SignFilter implements GlobalFilter, Ordered {
     private static final Logger log = LoggerFactory.getLogger(SignFilter.class);
 
-    // 排除过滤的 uri 地址,nacos自行添加
-    @Autowired
-    private IgnoreWhiteProperties ignoreWhite;
-
-    @Autowired
-    private RedisService redisService;
-    
     @Value("${security.sign}")
     private boolean parameter_signature;
 
@@ -62,7 +56,7 @@
     public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
         ServerHttpRequest request = exchange.getRequest();
         ServerHttpRequest.Builder mutate = request.mutate();
-    
+
         HttpMethod method = request.getMethod();
         if(method != HttpMethod.POST){
             return chain.filter(exchange.mutate().request(mutate.build()).build());
@@ -87,8 +81,8 @@
         log.error("[签名异常处理]请求路径:{}", exchange.getRequest().getPath());
         return ServletUtils.webFluxResponseWriter(exchange.getResponse(), msg, HttpStatus.BAD_REQUEST);
     }
-    
-    
+
+
     /**
      * 校验签名
      * @return
@@ -119,9 +113,9 @@
                             .build());
         });
     }
-    
-    
-    
+
+
+
     /**
      * 签名校验
      * @return
@@ -137,8 +131,8 @@
         System.err.println("签名值:" + signUrlEncode);
         return false;
     }
-    
-    
+
+
     /**
      * 组装签名路径
      * @param params
@@ -156,6 +150,10 @@
         // 构造签名键值对的格式
         StringBuilder sb = new StringBuilder();
         for (String k : keySet) {
+            Object o = params.get(k);
+            if(o instanceof JSONObject || o instanceof JSONArray){
+                continue;
+            }
             String v = params.getString(k);
             if(StringUtils.isNotEmpty(v)){
                 sb.append(k + "=" + v + "&");
diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/ValidateCodeFilter.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/ValidateCodeFilter.java
index d5b75fd..02d7bb4 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/ValidateCodeFilter.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/ValidateCodeFilter.java
@@ -3,6 +3,7 @@
 import java.nio.CharBuffer;
 import java.nio.charset.StandardCharsets;
 import java.util.concurrent.atomic.AtomicReference;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cloud.gateway.filter.GatewayFilter;
 import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
@@ -24,56 +25,45 @@
  * @author ruoyi
  */
 @Component
-public class ValidateCodeFilter extends AbstractGatewayFilterFactory<Object>
-{
-    private final static String[] VALIDATE_URL = new String[] { "/auth/login", "/auth/register" };
-
-    @Autowired
-    private ValidateCodeService validateCodeService;
-
-    @Autowired
-    private CaptchaProperties captchaProperties;
-
-    private static final String CODE = "code";
-
-    private static final String UUID = "uuid";
-
-    @Override
-    public GatewayFilter apply(Object config)
-    {
-        return (exchange, chain) -> {
-            ServerHttpRequest request = exchange.getRequest();
-
-            // 非登录/注册请求或验证码关闭,不处理
-            if (!StringUtils.containsAnyIgnoreCase(request.getURI().getPath(), VALIDATE_URL) || !captchaProperties.getEnabled())
-            {
-                return chain.filter(exchange);
-            }
-
-            try
-            {
-                String rspStr = resolveBodyFromRequest(request);
-                JSONObject obj = JSON.parseObject(rspStr);
-                validateCodeService.checkCaptcha(obj.getString(CODE), obj.getString(UUID));
-            }
-            catch (Exception e)
-            {
-                return ServletUtils.webFluxResponseWriter(exchange.getResponse(), e.getMessage());
-            }
-            return chain.filter(exchange);
-        };
-    }
-
-    private String resolveBodyFromRequest(ServerHttpRequest serverHttpRequest)
-    {
-        // 获取请求体
-        Flux<DataBuffer> body = serverHttpRequest.getBody();
-        AtomicReference<String> bodyRef = new AtomicReference<>();
-        body.subscribe(buffer -> {
-            CharBuffer charBuffer = StandardCharsets.UTF_8.decode(buffer.asByteBuffer());
-            DataBufferUtils.release(buffer);
-            bodyRef.set(charBuffer.toString());
-        });
-        return bodyRef.get();
-    }
+public class ValidateCodeFilter extends AbstractGatewayFilterFactory<Object> {
+	private final static String[] VALIDATE_URL = new String[]{"/auth/login", "/auth/register"};
+	private static final String CODE = "code";
+	private static final String UUID = "uuid";
+	@Autowired
+	private ValidateCodeService validateCodeService;
+	@Autowired
+	private CaptchaProperties captchaProperties;
+	
+	@Override
+	public GatewayFilter apply(Object config) {
+		return (exchange, chain) -> {
+			ServerHttpRequest request = exchange.getRequest();
+			
+			// 非登录/注册请求或验证码关闭,不处理
+			if (!StringUtils.containsAnyIgnoreCase(request.getURI().getPath(), VALIDATE_URL) || !captchaProperties.getEnabled()) {
+				return chain.filter(exchange);
+			}
+			
+			try {
+				String rspStr = resolveBodyFromRequest(request);
+				JSONObject obj = JSON.parseObject(rspStr);
+				validateCodeService.checkCaptcha(obj.getString(CODE), obj.getString(UUID));
+			} catch (Exception e) {
+				return ServletUtils.webFluxResponseWriter(exchange.getResponse(), e.getMessage());
+			}
+			return chain.filter(exchange);
+		};
+	}
+	
+	private String resolveBodyFromRequest(ServerHttpRequest serverHttpRequest) {
+		// 获取请求体
+		Flux<DataBuffer> body = serverHttpRequest.getBody();
+		AtomicReference<String> bodyRef = new AtomicReference<>();
+		body.subscribe(buffer -> {
+			CharBuffer charBuffer = StandardCharsets.UTF_8.decode(buffer.asByteBuffer());
+			DataBufferUtils.release(buffer);
+			bodyRef.set(charBuffer.toString());
+		});
+		return bodyRef.get();
+	}
 }
diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/XssFilter.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/XssFilter.java
index 6d3e498..72a2e08 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/XssFilter.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/XssFilter.java
@@ -44,93 +44,87 @@
  */
 @Component
 @ConditionalOnProperty(value = "security.xss.enabled", havingValue = "true")
-public class XssFilter implements GlobalFilter, Ordered
-{
-    private static final Logger log = LoggerFactory.getLogger(XssFilter.class);
-    // 跨站脚本的 xss 配置,nacos自行添加
-    @Autowired
-    private XssProperties xss;
-
-    @Override
-    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
-        ServerHttpRequest request = exchange.getRequest();
-        // xss开关未开启 或 通过nacos关闭,不过滤
-        if (!xss.getEnabled()) {
-            return chain.filter(exchange);
-        }
-        // GET DELETE 不过滤
-        HttpMethod method = request.getMethod();
-        if (method == null || method == HttpMethod.GET || method == HttpMethod.DELETE) {
-            return chain.filter(exchange);
-        }
-        // 非json类型,不过滤
-        if (!isJsonRequest(exchange)) {
-            return chain.filter(exchange);
-        }
-        // excludeUrls 不过滤
-        String url = request.getURI().getPath();
-        if (StringUtils.matches(url, xss.getExcludeUrls())) {
-            return chain.filter(exchange);
-        }
-        ServerHttpRequestDecorator httpRequestDecorator = requestDecorator(exchange);
-        return chain.filter(exchange.mutate().request(httpRequestDecorator).build());
-    }
-
-    
-    
-    
-    
-    
-    private ServerHttpRequestDecorator requestDecorator(ServerWebExchange exchange) {
-        ServerHttpRequestDecorator serverHttpRequestDecorator = new ServerHttpRequestDecorator(exchange.getRequest()) {
-            @Override
-            public Flux<DataBuffer> getBody() {
-                Flux<DataBuffer> body = super.getBody();
-                return body.buffer().map(dataBuffers -> {
-                    DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
-                    DataBuffer join = dataBufferFactory.join(dataBuffers);
-                    byte[] content = new byte[join.readableByteCount()];
-                    join.read(content);
-                    DataBufferUtils.release(join);
-                    String bodyStr = new String(content, StandardCharsets.UTF_8);
-                    // 防xss攻击过滤
-                    bodyStr = EscapeUtil.clean(bodyStr);
-                    // 转成字节
-                    byte[] bytes = bodyStr.getBytes();
-                    NettyDataBufferFactory nettyDataBufferFactory = new NettyDataBufferFactory(ByteBufAllocator.DEFAULT);
-                    DataBuffer buffer = nettyDataBufferFactory.allocateBuffer(bytes.length);
-                    buffer.write(bytes);
-                    return buffer;
-                });
-            }
-
-            @Override
-            public HttpHeaders getHeaders() {
-                HttpHeaders httpHeaders = new HttpHeaders();
-                httpHeaders.putAll(super.getHeaders());
-                // 由于修改了请求体的body,导致content-length长度不确定,因此需要删除原先的content-length
-                httpHeaders.remove(HttpHeaders.CONTENT_LENGTH);
-                httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked");
-                return httpHeaders;
-            }
-
-        };
-        return serverHttpRequestDecorator;
-    }
-
-    /**
-     * 是否是Json请求
-     * 
-     * @param exchange HTTP请求
-     */
-    public boolean isJsonRequest(ServerWebExchange exchange) {
-        String header = exchange.getRequest().getHeaders().getFirst(HttpHeaders.CONTENT_TYPE);
-        return StringUtils.startsWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE);
-    }
-    
-    @Override
-    public int getOrder()
-    {
-        return -100;
-    }
+public class XssFilter implements GlobalFilter, Ordered {
+	private static final Logger log = LoggerFactory.getLogger(XssFilter.class);
+	// 跨站脚本的 xss 配置,nacos自行添加
+	@Autowired
+	private XssProperties xss;
+	
+	@Override
+	public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+		ServerHttpRequest request = exchange.getRequest();
+		// xss开关未开启 或 通过nacos关闭,不过滤
+		if (!xss.getEnabled()) {
+			return chain.filter(exchange);
+		}
+		// GET DELETE 不过滤
+		HttpMethod method = request.getMethod();
+		if (method == null || method == HttpMethod.GET || method == HttpMethod.DELETE) {
+			return chain.filter(exchange);
+		}
+		// 非json类型,不过滤
+		if (!isJsonRequest(exchange)) {
+			return chain.filter(exchange);
+		}
+		// excludeUrls 不过滤
+		String url = request.getURI().getPath();
+		if (StringUtils.matches(url, xss.getExcludeUrls())) {
+			return chain.filter(exchange);
+		}
+		ServerHttpRequestDecorator httpRequestDecorator = requestDecorator(exchange);
+		return chain.filter(exchange.mutate().request(httpRequestDecorator).build());
+	}
+	
+	
+	private ServerHttpRequestDecorator requestDecorator(ServerWebExchange exchange) {
+		ServerHttpRequestDecorator serverHttpRequestDecorator = new ServerHttpRequestDecorator(exchange.getRequest()) {
+			@Override
+			public Flux<DataBuffer> getBody() {
+				Flux<DataBuffer> body = super.getBody();
+				return body.buffer().map(dataBuffers -> {
+					DataBufferFactory dataBufferFactory = new DefaultDataBufferFactory();
+					DataBuffer join = dataBufferFactory.join(dataBuffers);
+					byte[] content = new byte[join.readableByteCount()];
+					join.read(content);
+					DataBufferUtils.release(join);
+					String bodyStr = new String(content, StandardCharsets.UTF_8);
+					// 防xss攻击过滤
+					bodyStr = EscapeUtil.clean(bodyStr);
+					// 转成字节
+					byte[] bytes = bodyStr.getBytes();
+					NettyDataBufferFactory nettyDataBufferFactory = new NettyDataBufferFactory(ByteBufAllocator.DEFAULT);
+					DataBuffer buffer = nettyDataBufferFactory.allocateBuffer(bytes.length);
+					buffer.write(bytes);
+					return buffer;
+				});
+			}
+			
+			@Override
+			public HttpHeaders getHeaders() {
+				HttpHeaders httpHeaders = new HttpHeaders();
+				httpHeaders.putAll(super.getHeaders());
+				// 由于修改了请求体的body,导致content-length长度不确定,因此需要删除原先的content-length
+				httpHeaders.remove(HttpHeaders.CONTENT_LENGTH);
+				httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked");
+				return httpHeaders;
+			}
+			
+		};
+		return serverHttpRequestDecorator;
+	}
+	
+	/**
+	 * 是否是Json请求
+	 *
+	 * @param exchange HTTP请求
+	 */
+	public boolean isJsonRequest(ServerWebExchange exchange) {
+		String header = exchange.getRequest().getHeaders().getFirst(HttpHeaders.CONTENT_TYPE);
+		return StringUtils.startsWithIgnoreCase(header, MediaType.APPLICATION_JSON_VALUE);
+	}
+	
+	@Override
+	public int getOrder() {
+		return -100;
+	}
 }
diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/GatewayExceptionHandler.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/GatewayExceptionHandler.java
index 29ea5e3..cb88f5f 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/GatewayExceptionHandler.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/GatewayExceptionHandler.java
@@ -19,38 +19,30 @@
  */
 @Order(-1)
 @Configuration
-public class GatewayExceptionHandler implements ErrorWebExceptionHandler
-{
-    private static final Logger log = LoggerFactory.getLogger(GatewayExceptionHandler.class);
-
-    @Override
-    public Mono<Void> handle(ServerWebExchange exchange, Throwable ex)
-    {
-        ServerHttpResponse response = exchange.getResponse();
-
-        if (exchange.getResponse().isCommitted())
-        {
-            return Mono.error(ex);
-        }
-
-        String msg;
-
-        if (ex instanceof NotFoundException)
-        {
-            msg = "服务未找到";
-        }
-        else if (ex instanceof ResponseStatusException)
-        {
-            ResponseStatusException responseStatusException = (ResponseStatusException) ex;
-            msg = responseStatusException.getMessage();
-        }
-        else
-        {
-            msg = "内部服务器错误";
-        }
-
-        log.error("[网关异常处理]请求路径:{},异常信息:{}", exchange.getRequest().getPath(), ex.getMessage());
-
-        return ServletUtils.webFluxResponseWriter(response, msg);
-    }
+public class GatewayExceptionHandler implements ErrorWebExceptionHandler {
+	private static final Logger log = LoggerFactory.getLogger(GatewayExceptionHandler.class);
+	
+	@Override
+	public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
+		ServerHttpResponse response = exchange.getResponse();
+		
+		if (exchange.getResponse().isCommitted()) {
+			return Mono.error(ex);
+		}
+		
+		String msg;
+		
+		if (ex instanceof NotFoundException) {
+			msg = "服务未找到";
+		} else if (ex instanceof ResponseStatusException) {
+			ResponseStatusException responseStatusException = (ResponseStatusException) ex;
+			msg = responseStatusException.getMessage();
+		} else {
+			msg = "内部服务器错误";
+		}
+		
+		log.error("[网关异常处理]请求路径:{},异常信息:{}", exchange.getRequest().getPath(), ex.getMessage());
+		
+		return ServletUtils.webFluxResponseWriter(response, msg);
+	}
 }
\ No newline at end of file
diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/SentinelFallbackHandler.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/SentinelFallbackHandler.java
index 86abf88..0974811 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/SentinelFallbackHandler.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/SentinelFallbackHandler.java
@@ -13,29 +13,23 @@
  *
  * @author ruoyi
  */
-public class SentinelFallbackHandler implements WebExceptionHandler
-{
-    private Mono<Void> writeResponse(ServerResponse response, ServerWebExchange exchange)
-    {
-        return ServletUtils.webFluxResponseWriter(exchange.getResponse(), "请求超过最大数,请稍候再试");
-    }
-
-    @Override
-    public Mono<Void> handle(ServerWebExchange exchange, Throwable ex)
-    {
-        if (exchange.getResponse().isCommitted())
-        {
-            return Mono.error(ex);
-        }
-        if (!BlockException.isBlockException(ex))
-        {
-            return Mono.error(ex);
-        }
-        return handleBlockedRequest(exchange, ex).flatMap(response -> writeResponse(response, exchange));
-    }
-
-    private Mono<ServerResponse> handleBlockedRequest(ServerWebExchange exchange, Throwable throwable)
-    {
-        return GatewayCallbackManager.getBlockHandler().handleRequest(exchange, throwable);
-    }
+public class SentinelFallbackHandler implements WebExceptionHandler {
+	private Mono<Void> writeResponse(ServerResponse response, ServerWebExchange exchange) {
+		return ServletUtils.webFluxResponseWriter(exchange.getResponse(), "请求超过最大数,请稍候再试");
+	}
+	
+	@Override
+	public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
+		if (exchange.getResponse().isCommitted()) {
+			return Mono.error(ex);
+		}
+		if (!BlockException.isBlockException(ex)) {
+			return Mono.error(ex);
+		}
+		return handleBlockedRequest(exchange, ex).flatMap(response -> writeResponse(response, exchange));
+	}
+	
+	private Mono<ServerResponse> handleBlockedRequest(ServerWebExchange exchange, Throwable throwable) {
+		return GatewayCallbackManager.getBlockHandler().handleRequest(exchange, throwable);
+	}
 }
diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/SwaggerHandler.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/SwaggerHandler.java
index daa21af..eeb58a1 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/SwaggerHandler.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/SwaggerHandler.java
@@ -1,6 +1,7 @@
 package com.ruoyi.gateway.handler;
 
 import java.util.Optional;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
@@ -16,41 +17,34 @@
 
 @RestController
 @RequestMapping("/swagger-resources")
-public class SwaggerHandler
-{
-    @Autowired(required = false)
-    private SecurityConfiguration securityConfiguration;
-
-    @Autowired(required = false)
-    private UiConfiguration uiConfiguration;
-
-    private final SwaggerResourcesProvider swaggerResources;
-
-    @Autowired
-    public SwaggerHandler(SwaggerResourcesProvider swaggerResources)
-    {
-        this.swaggerResources = swaggerResources;
-    }
-
-    @GetMapping("/configuration/security")
-    public Mono<ResponseEntity<SecurityConfiguration>> securityConfiguration()
-    {
-        return Mono.just(new ResponseEntity<>(
-                Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()),
-                HttpStatus.OK));
-    }
-
-    @GetMapping("/configuration/ui")
-    public Mono<ResponseEntity<UiConfiguration>> uiConfiguration()
-    {
-        return Mono.just(new ResponseEntity<>(
-                Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK));
-    }
-
-    @SuppressWarnings("rawtypes")
-    @GetMapping("")
-    public Mono<ResponseEntity> swaggerResources()
-    {
-        return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK)));
-    }
+public class SwaggerHandler {
+	private final SwaggerResourcesProvider swaggerResources;
+	@Autowired(required = false)
+	private SecurityConfiguration securityConfiguration;
+	@Autowired(required = false)
+	private UiConfiguration uiConfiguration;
+	
+	@Autowired
+	public SwaggerHandler(SwaggerResourcesProvider swaggerResources) {
+		this.swaggerResources = swaggerResources;
+	}
+	
+	@GetMapping("/configuration/security")
+	public Mono<ResponseEntity<SecurityConfiguration>> securityConfiguration() {
+		return Mono.just(new ResponseEntity<>(
+				Optional.ofNullable(securityConfiguration).orElse(SecurityConfigurationBuilder.builder().build()),
+				HttpStatus.OK));
+	}
+	
+	@GetMapping("/configuration/ui")
+	public Mono<ResponseEntity<UiConfiguration>> uiConfiguration() {
+		return Mono.just(new ResponseEntity<>(
+				Optional.ofNullable(uiConfiguration).orElse(UiConfigurationBuilder.builder().build()), HttpStatus.OK));
+	}
+	
+	@SuppressWarnings("rawtypes")
+	@GetMapping("")
+	public Mono<ResponseEntity> swaggerResources() {
+		return Mono.just((new ResponseEntity<>(swaggerResources.get(), HttpStatus.OK)));
+	}
 }
diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/ValidateCodeHandler.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/ValidateCodeHandler.java
index 45e7b15..3dc68d6 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/ValidateCodeHandler.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/handler/ValidateCodeHandler.java
@@ -1,6 +1,7 @@
 package com.ruoyi.gateway.handler;
 
 import java.io.IOException;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Component;
@@ -19,23 +20,18 @@
  * @author ruoyi
  */
 @Component
-public class ValidateCodeHandler implements HandlerFunction<ServerResponse>
-{
-    @Autowired
-    private ValidateCodeService validateCodeService;
-
-    @Override
-    public Mono<ServerResponse> handle(ServerRequest serverRequest)
-    {
-        AjaxResult ajax;
-        try
-        {
-            ajax = validateCodeService.createCaptcha();
-        }
-        catch (CaptchaException | IOException e)
-        {
-            return Mono.error(e);
-        }
-        return ServerResponse.status(HttpStatus.OK).body(BodyInserters.fromValue(ajax));
-    }
+public class ValidateCodeHandler implements HandlerFunction<ServerResponse> {
+	@Autowired
+	private ValidateCodeService validateCodeService;
+	
+	@Override
+	public Mono<ServerResponse> handle(ServerRequest serverRequest) {
+		AjaxResult ajax;
+		try {
+			ajax = validateCodeService.createCaptcha();
+		} catch (CaptchaException | IOException e) {
+			return Mono.error(e);
+		}
+		return ServerResponse.status(HttpStatus.OK).body(BodyInserters.fromValue(ajax));
+	}
 }
diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/service/ValidateCodeService.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/service/ValidateCodeService.java
index 8a74aeb..8747e48 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/service/ValidateCodeService.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/service/ValidateCodeService.java
@@ -1,6 +1,7 @@
 package com.ruoyi.gateway.service;
 
 import java.io.IOException;
+
 import com.ruoyi.common.core.exception.CaptchaException;
 import com.ruoyi.common.core.web.domain.AjaxResult;
 
@@ -9,15 +10,14 @@
  *
  * @author ruoyi
  */
-public interface ValidateCodeService
-{
-    /**
-     * 生成验证码
-     */
-    public AjaxResult createCaptcha() throws IOException, CaptchaException;
-
-    /**
-     * 校验验证码
-     */
-    public void checkCaptcha(String key, String value) throws CaptchaException;
+public interface ValidateCodeService {
+	/**
+	 * 生成验证码
+	 */
+	public AjaxResult createCaptcha() throws IOException, CaptchaException;
+	
+	/**
+	 * 校验验证码
+	 */
+	public void checkCaptcha(String key, String value) throws CaptchaException;
 }
diff --git a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/service/impl/ValidateCodeServiceImpl.java b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/service/impl/ValidateCodeServiceImpl.java
index 2ae87bd..365cad6 100644
--- a/ruoyi-gateway/src/main/java/com/ruoyi/gateway/service/impl/ValidateCodeServiceImpl.java
+++ b/ruoyi-gateway/src/main/java/com/ruoyi/gateway/service/impl/ValidateCodeServiceImpl.java
@@ -5,6 +5,7 @@
 import java.util.concurrent.TimeUnit;
 import javax.annotation.Resource;
 import javax.imageio.ImageIO;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.FastByteArrayOutputStream;
@@ -26,94 +27,81 @@
  * @author ruoyi
  */
 @Service
-public class ValidateCodeServiceImpl implements ValidateCodeService
-{
-    @Resource(name = "captchaProducer")
-    private Producer captchaProducer;
-
-    @Resource(name = "captchaProducerMath")
-    private Producer captchaProducerMath;
-
-    @Autowired
-    private RedisService redisService;
-
-    @Autowired
-    private CaptchaProperties captchaProperties;
-
-    /**
-     * 生成验证码
-     */
-    @Override
-    public AjaxResult createCaptcha() throws IOException, CaptchaException
-    {
-        AjaxResult ajax = AjaxResult.success();
-        boolean captchaEnabled = captchaProperties.getEnabled();
-        ajax.put("captchaEnabled", captchaEnabled);
-        if (!captchaEnabled)
-        {
-            return ajax;
-        }
-
-        // 保存验证码信息
-        String uuid = IdUtils.simpleUUID();
-        String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid;
-
-        String capStr = null, code = null;
-        BufferedImage image = null;
-
-        String captchaType = captchaProperties.getType();
-        // 生成验证码
-        if ("math".equals(captchaType))
-        {
-            String capText = captchaProducerMath.createText();
-            capStr = capText.substring(0, capText.lastIndexOf("@"));
-            code = capText.substring(capText.lastIndexOf("@") + 1);
-            image = captchaProducerMath.createImage(capStr);
-        }
-        else if ("char".equals(captchaType))
-        {
-            capStr = code = captchaProducer.createText();
-            image = captchaProducer.createImage(capStr);
-        }
-
-        redisService.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
-        // 转换流信息写出
-        FastByteArrayOutputStream os = new FastByteArrayOutputStream();
-        try
-        {
-            ImageIO.write(image, "jpg", os);
-        }
-        catch (IOException e)
-        {
-            return AjaxResult.error(e.getMessage());
-        }
-
-        ajax.put("uuid", uuid);
-        ajax.put("img", Base64.encode(os.toByteArray()));
-        return ajax;
-    }
-
-    /**
-     * 校验验证码
-     */
-    @Override
-    public void checkCaptcha(String code, String uuid) throws CaptchaException
-    {
-        if (StringUtils.isEmpty(code))
-        {
-            throw new CaptchaException("验证码不能为空");
-        }
-        if (StringUtils.isEmpty(uuid))
-        {
-            throw new CaptchaException("验证码已失效");
-        }
-        String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid;
-        String captcha = redisService.getCacheObject(verifyKey);
-        redisService.deleteObject(verifyKey);
-
-        if (!code.equalsIgnoreCase(captcha))
-        {
-            throw new CaptchaException("验证码错误");
-        }
-    }
+public class ValidateCodeServiceImpl implements ValidateCodeService {
+	@Resource(name = "captchaProducer")
+	private Producer captchaProducer;
+	
+	@Resource(name = "captchaProducerMath")
+	private Producer captchaProducerMath;
+	
+	@Autowired
+	private RedisService redisService;
+	
+	@Autowired
+	private CaptchaProperties captchaProperties;
+	
+	/**
+	 * 生成验证码
+	 */
+	@Override
+	public AjaxResult createCaptcha() throws IOException, CaptchaException {
+		AjaxResult ajax = AjaxResult.success();
+		boolean captchaEnabled = captchaProperties.getEnabled();
+		ajax.put("captchaEnabled", captchaEnabled);
+		if (!captchaEnabled) {
+			return ajax;
+		}
+		
+		// 保存验证码信息
+		String uuid = IdUtils.simpleUUID();
+		String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid;
+		
+		String capStr = null, code = null;
+		BufferedImage image = null;
+		
+		String captchaType = captchaProperties.getType();
+		// 生成验证码
+		if ("math".equals(captchaType)) {
+			String capText = captchaProducerMath.createText();
+			capStr = capText.substring(0, capText.lastIndexOf("@"));
+			code = capText.substring(capText.lastIndexOf("@") + 1);
+			image = captchaProducerMath.createImage(capStr);
+		} else if ("char".equals(captchaType)) {
+			capStr = code = captchaProducer.createText();
+			image = captchaProducer.createImage(capStr);
+		}
+		
+		redisService.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
+		// 转换流信息写出
+		FastByteArrayOutputStream os = new FastByteArrayOutputStream();
+		try {
+			ImageIO.write(image, "jpg", os);
+		} catch (IOException e) {
+			return AjaxResult.error(e.getMessage());
+		}
+		
+		ajax.put("uuid", uuid);
+		ajax.put("img", Base64.encode(os.toByteArray()));
+		return ajax;
+	}
+	
+	/**
+	 * 校验验证码
+	 */
+	@Override
+	public void checkCaptcha(String code, String uuid) throws CaptchaException {
+		if (StringUtils.isEmpty(code)) {
+			throw new CaptchaException("验证码不能为空");
+		}
+		if (StringUtils.isEmpty(uuid)) {
+			throw new CaptchaException("验证码已失效");
+		}
+		String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid;
+		String captcha = redisService.getCacheObject(verifyKey);
+		redisService.deleteObject(verifyKey);
+		
+		if (!code.equalsIgnoreCase(captcha)) {
+			throw new CaptchaException("验证码错误");
+		}
+	}
 }
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 6915db6..597afdd 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
@@ -1,7 +1,10 @@
 package com.ruoyi.account.controller;
 
-
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
@@ -11,6 +14,8 @@
 import com.ruoyi.account.api.model.*;
 import com.ruoyi.account.api.vo.CouponListVOVO;
 import com.ruoyi.account.service.*;
+import com.ruoyi.account.util.PointDetailUtil;
+import com.ruoyi.account.util.SignDayUtil;
 import com.ruoyi.account.wx.body.resp.Code2SessionRespBody;
 import com.ruoyi.account.wx.body.resq.Code2SessionResqBody;
 import com.ruoyi.account.wx.model.WeixinProperties;
@@ -18,6 +23,8 @@
 import com.ruoyi.account.util.GiveVipUtil;
 import com.ruoyi.common.core.constant.Constants;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.enums.status.AppUserStatusEnum;
+import com.ruoyi.common.core.utils.JwtUtils;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.core.utils.bean.BeanUtils;
 import com.ruoyi.common.core.web.domain.AjaxResult;
@@ -25,16 +32,21 @@
 import com.ruoyi.common.core.web.page.PageInfo;
 import com.ruoyi.common.redis.service.RedisService;
 import com.ruoyi.common.security.annotation.RequiresPermissions;
+import com.ruoyi.common.security.auth.AuthUtil;
 import com.ruoyi.common.security.service.TokenService;
+import com.ruoyi.common.security.utils.SecurityUtils;
 import com.ruoyi.order.api.feignClient.ChargingOrderClient;
 import com.ruoyi.order.api.feignClient.ExchangeOrderClient;
 import com.ruoyi.order.api.model.TChargingOrder;
 import com.ruoyi.order.api.model.TExchangeOrder;
 import com.ruoyi.other.api.domain.TCompany;
 import com.ruoyi.other.api.domain.TCoupon;
+import com.ruoyi.other.api.domain.TIntegralRule;
 import com.ruoyi.other.api.domain.TUserTag;
+import com.ruoyi.other.api.feignClient.IntegralRuleClient;
 import com.ruoyi.other.api.feignClient.OtherClient;
 import com.ruoyi.system.api.domain.SysRole;
+import com.ruoyi.system.api.model.LoginUser;
 import com.ruoyi.system.api.model.LoginUserApplet;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -48,6 +60,7 @@
 import org.springframework.web.client.RestTemplate;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 import java.time.Duration;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -84,6 +97,8 @@
 
     @Resource
     private TAppUserIntegralChangeService integralChangeService;
+    @Resource
+    private SignDayUtil signDayUtil;
 
     @Resource
     private ExchangeOrderClient exchangeOrderClient;
@@ -91,6 +106,12 @@
     private TokenService tokenService;
     @Autowired
     private RedisService redisService;
+    @Autowired
+    private WeixinProperties wxConfig;
+    @Autowired
+    private RestTemplate wxRestTemplate;
+    @Resource
+    private PointDetailUtil pointDetailUtil;
 
     @Resource
     private  TAppUserSignService signService;
@@ -98,6 +119,10 @@
     private TAppCouponService appCouponService;
     @Resource
     private TAppUserCarService carService;
+    @Resource
+    private IntegralRuleClient integralRuleClient;
+
+
 
 
     @ApiOperation(value = "查询当前用户是否为会员 0否1是", tags = {"小程序--查询当前用户是否为会员"})
@@ -135,7 +160,7 @@
 
 
     @ApiOperation(value = "单位下拉框", tags = {"用户管理-单位管理"})
-    @PostMapping(value = "/unit/select")
+    @GetMapping(value = "/unit/select")
     public R<List<TCompany>> unitSelect() {
         UnitListQueryDto unitListQueryDto = new UnitListQueryDto();
         unitListQueryDto.setPageCurr(1);
@@ -192,6 +217,52 @@
         }
         List<Integer> vipIds = new ArrayList<>();
               vipIds     = page.getRecords().stream().map(TAppUser::getVipId).collect(Collectors.toList());
+        //获取会员map
+        R<Map<Integer, String>> vipMap = otherClient.getVipMap(vipIds);
+        //循环处理
+        for (TAppUser appUser : page.getRecords()) {
+            //拿到最新的tagId
+            TAppUserTag one = appUserTagService.lambdaQuery().eq(TAppUserTag::getAppUserId, appUser.getId()).orderByDesc(TAppUserTag::getCreateTime).last("limit 1").one();
+            if (one!=null) {
+                //设置最新的tagName
+                R<TUserTag> byIdTag = otherClient.getByIdTag(one.getUserTagId());
+                if (byIdTag.getData() != null) {
+                    appUser.setTagName(byIdTag.getData().getName());
+                }
+            }
+            //匹配vipMap的值
+            appUser.setVipName(vipMap.getData().get(appUser.getVipId()));
+            //累计充电次数
+            R<Long> useOrderCount = chargingOrderClient.useOrderCount(appUser.getId());
+            appUser.setOrderCount(useOrderCount.getData());
+            appUser.setUid(appUser.getId().toString());
+
+        }
+        return R.ok(page);
+    }
+
+    @ApiOperation(value = "会员列表", tags = {"用户管理-会员列表"})
+    @PostMapping(value = "/user/vip/page")
+    public R<Page<TAppUser>> vipPage(@RequestBody UserListQueryDto userListQueryDto) {
+        List<Long> userIds = new ArrayList<>();
+        //如果要筛选标签。用标签获取useids
+        if (userListQueryDto.getUserTagId() != null){
+            userIds = appUserTagService.lambdaQuery().eq(TAppUserTag::getUserTagId, userListQueryDto.getUserTagId()).list().stream().map(TAppUserTag::getAppUserId).collect(Collectors.toList());
+        }
+        //列表查询
+        Page<TAppUser> page = appUserService.lambdaQuery()
+                .like(userListQueryDto.getUserPhone() != null && !"".equals(userListQueryDto.getUserPhone()), TAppUser::getPhone, userListQueryDto.getUserPhone())
+                .eq(userListQueryDto.getCompanyId() != null, TAppUser::getCompanyId, userListQueryDto.getCompanyId())
+                .eq(userListQueryDto.getCityCode() != null && !"".equals(userListQueryDto.getCityCode()), TAppUser::getCityCode, userListQueryDto.getCityCode())
+                .eq(userListQueryDto.getStatus() != null, TAppUser::getStatus, userListQueryDto.getStatus())
+                .eq(userListQueryDto.getVipTypeId() != null, TAppUser::getVipId, userListQueryDto.getVipTypeId())
+                .in(!userIds.isEmpty(),TAppUser::getId,userIds)
+                .page(Page.of(userListQueryDto.getPageCurr(), userListQueryDto.getPageSize()));
+        if (page.getRecords().isEmpty()){
+            return R.ok(page);
+        }
+        List<Integer> vipIds = new ArrayList<>();
+        vipIds     = page.getRecords().stream().map(TAppUser::getVipId).collect(Collectors.toList());
         //获取会员map
         R<Map<Integer, String>> vipMap = otherClient.getVipMap(vipIds);
         //循环处理
@@ -299,7 +370,7 @@
     }
 
     @ApiOperation(value = "用户详情", tags = {"用户管理-用户列表"})
-    @PostMapping(value = "/user/detail/{id}")
+    @GetMapping(value = "/user/detail/{id}")
     public R<UserDetailDto> userDetail(@PathVariable Long id) {
         TAppUser user = appUserService.getById(id);
         UserDetailDto userDetailDto =  new UserDetailDto();
@@ -320,7 +391,9 @@
 
         List<Integer> tagIds = appUserTagService.lambdaQuery().eq(TAppUserTag::getAppUserId, id).orderByDesc(TAppUserTag::getCreateTime).list().stream().map(TAppUserTag::getUserTagId).collect(Collectors.toList());
         R<Map<Integer, String>> tagMap = otherClient.getTagMap(tagIds);
-        userDetailDto.setTagName(tagMap.getData().values().toString());
+        userDetailDto.setTagName(tagMap.getData().values()
+                .stream()
+                .collect(Collectors.joining(",")));
         return R.ok(userDetailDto);
     }
 
@@ -367,6 +440,28 @@
         appUser.setStatus(userChangeDto.getStatus());
         appUserService.updateById(appUser);
         return R.ok();
+    }
+
+    @ApiOperation(value = "修改单位", tags = {"后台-用户管理-用户列表"})
+    @PostMapping(value = "/user/unit/change")
+    public R unitChange(@RequestBody UnitChangeDto unitChangeDto) {
+        for (String s : unitChangeDto.getIds().split(",")) {
+            TAppUser byId = appUserService.getById(s);
+            byId.setCompanyId(unitChangeDto.getUnitId());
+            appUserService.updateById(byId);
+        }
+    return R.ok();
+    }
+
+    @ApiOperation(value = "删除用户", tags = {"后台-用户管理-用户列表"})
+    @DeleteMapping(value = "/user/delete")
+    public R userDelete(String ids) {
+        String[] split = ids.split(",");
+        for (String s : split) {
+            appUserService.removeById(s);
+        }
+        return R.ok();
+
     }
 
     @ApiOperation(value = "个人中心信息", tags = {"小程序-个人中心"})
@@ -423,7 +518,11 @@
     @ApiOperation(value = "赠送会员", tags = {"用户管理-用户列表"})
     @PostMapping(value = "/user/give/vip")
     public R giveVip(@RequestBody GiveVipDto  giveVipDto) {
-        TAppUser nowUser = appUserService.getById(giveVipDto.getUserId());
+        String[] split = giveVipDto.getUserIds().split(",");
+        for (String s : split) {
+
+
+        TAppUser nowUser = appUserService.getById(s);
 
         int plusDay = 0;
         if (giveVipDto.getType() == 1) {
@@ -439,7 +538,7 @@
 
         appUserService.updateById(nowUser);
         //执行一次赠送优惠卷的定时任务
-
+        }
         return R.ok();
     }
 
@@ -458,6 +557,21 @@
         TAppUser appUser = appUserService.getById(userId);
         appUser.setPhone(dto.getPhone());
         appUserService.updateById(appUser);
+        return AjaxResult.success();
+    }
+
+    @ApiOperation(value = "注销接口", tags = {"小程序-用户管理-注销账号"})
+    @DeleteMapping("/logoff")
+    public AjaxResult<?> logoff(HttpServletRequest request) {
+        String token = SecurityUtils.getToken(request);
+        if (StringUtils.isNotEmpty(token))
+        {
+            String userId = JwtUtils.getUserId(token);
+            // 账号注销
+            appUserService.update(Wrappers.<TAppUser>lambdaUpdate().set(TAppUser::getStatus, AppUserStatusEnum.LOGOFF.getCode()).eq(TAppUser::getId, userId));
+            // 删除用户缓存记录
+            AuthUtil.logoutByToken(token);
+        }
         return AjaxResult.success();
     }
 
@@ -508,10 +622,105 @@
                 .last("LIMIT 1")));
     }
 
-//    @ApiOperation(value = "签到", tags = {"小程序-个人中心-签到"})
-//    @PostMapping(value = "/user/sign")
-//    public R sign() {
-//
-//    }
+    @ApiOperation(value = "签到", tags = {"小程序-个人中心-签到"})
+    @PostMapping(value = "/user/sign")
+    public R sign() {
+        LoginUserApplet loginUserApplet = tokenService.getLoginUserApplet();
+        Long userId = loginUserApplet.getUserId();
+
+        TAppUser byId = appUserService.getById(userId);
+
+
+        if (signService.lambdaQuery().eq(TAppUserSign::getSignDay, LocalDate.now()).eq(TAppUserSign::getAppUserId, userId).count()>0){
+            return R.fail("今日已签到");
+        }
+        //签到业务
+        TAppUserSign appUserSign = new TAppUserSign();
+        appUserSign.setSignDay(LocalDate.now());
+        appUserSign.setRewardPoints(2);
+        appUserSign.setCreateTime(LocalDateTime.now());
+        appUserSign.setAppUserId(userId);
+        signService.save(appUserSign);
+        //签到加积分记录
+        R<TIntegralRule> set = integralRuleClient.getSet();
+        TIntegralRule data = set.getData();
+        JSONObject jsonObject = JSON.parseObject(data.getAddVehiclesEarnsPoints());
+        //增加每日积分
+        Integer points = 0;
+        Integer point = jsonObject.getInteger("num1");
+        points= points+point;
+        JSONArray num2 = jsonObject.getJSONArray("num2");
+        if (num2!=null) {
+            //获取连续签到的规则放入map
+            Map<Integer,Integer> map = new HashMap<>();
+            for (Object o : num2) {
+                String o1 = (String) o;
+                String[] split = o1.split(",");
+                map.put(Integer.parseInt(split[0]), Integer.parseInt(split[1]));
+            }
+            //加上今日签到,计算连续了多少天,如果到达就增加奖励的分数
+            int days = signDayUtil.calculateContinuousSignDays(userId);
+            Integer i = map.get(days);
+            if (i!=null){
+                points= points+i;
+                appUserSign.setIsGift(1);
+                signService.updateById(appUserSign);
+            }
+        }
+        pointDetailUtil.addDetail(byId.getPoints(),byId.getPoints()+points,1,userId,"每日签到","");
+        byId.setPoints(byId.getPoints()+points);
+        appUserService.updateById(byId);
+        return R.ok();
+    }
+
+
+    @ApiOperation(value = "添加编辑车辆", tags = {"小程序-个人中心-车辆"})
+    @PostMapping(value = "/user/car/addOrUpdate")
+    public R carAdd(@RequestBody TAppUserCar appUserCar) {
+
+        LoginUserApplet loginUserApplet = tokenService.getLoginUserApplet();
+        Long userId = loginUserApplet.getUserId();
+        TAppUser byId = appUserService.getById(userId);
+
+
+        //如果是第一次添加车辆,增加积分
+        Long count = appUserCarService.lambdaQuery().eq(TAppUserCar::getAppUserId, userId).count();
+
+
+        if (count==0){
+            R<TIntegralRule> set = integralRuleClient.getSet();
+            TIntegralRule data = set.getData();
+            JSONObject jsonObject = JSON.parseObject(data.getAddVehiclesEarnsPoints());
+
+
+            Integer point = 0;
+            //增加车牌50分,必填
+                point = point+jsonObject.getInteger("num1");
+            //增加车型分
+                if (StringUtils.isNotEmpty(appUserCar.getVehicleModel())){
+                    point = point+jsonObject.getInteger("num2");
+                }
+            //增加车辆用途分
+                if (StringUtils.isNotEmpty(appUserCar.getVehicleUse())){
+                    point = point+jsonObject.getInteger("num3");
+                }
+            //增加续航分
+                if (StringUtils.isNotEmpty(appUserCar.getEndurance())){
+                    point = point+jsonObject.getInteger("num4");
+                }
+
+            //增加积分记录
+            pointDetailUtil.addDetail(byId.getPoints(),byId.getPoints()+point,5,userId,appUserCar.getLicensePlate(),"");
+            byId.setPoints(byId.getPoints()+point);
+            appUserService.updateById(byId);
+
+
+        }
+
+        //
+        appUserCarService.saveOrUpdate(appUserCar);
+
+        return R.ok();
+    }
 }
 
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserTagController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserTagController.java
index c39f5a1..872fa64 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserTagController.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserTagController.java
@@ -56,7 +56,7 @@
 
     @ApiOperation(value = "标签删除", tags = {"用户管理-用户标签管理"})
     @DeleteMapping(value = "/tags/delete")
-    public R delete(@PathVariable String ids) {
+    public R delete(String ids) {
         //拿到单位列表
         String[] split = ids.split(",");
         for (String id : split) {
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TInvoiceInformationController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TInvoiceInformationController.java
index 4a6346b..29a90fb 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TInvoiceInformationController.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TInvoiceInformationController.java
@@ -1,8 +1,16 @@
 package com.ruoyi.account.controller;
 
 
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.account.api.model.TInvoiceInformation;
+import com.ruoyi.account.service.TInvoiceInformationService;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.security.service.TokenService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
 
 /**
  * <p>
@@ -16,5 +24,72 @@
 @RequestMapping("/t-invoice-information")
 public class TInvoiceInformationController {
 
+	@Resource
+	private TInvoiceInformationService invoiceInformationService;
+	
+	@Resource
+	private TokenService tokenService;
+	
+	
+	@ResponseBody
+	@GetMapping(value = "/getInvoiceInformationList")
+	@ApiOperation(value = "获取开票抬头数据列表", tags = {"小程序-充电发票"})
+	public AjaxResult<List<TInvoiceInformation>> getInvoiceInformationList(){
+		Long userId = tokenService.getLoginUserApplet().getUserId();
+		List<TInvoiceInformation> list = invoiceInformationService.list(new LambdaQueryWrapper<TInvoiceInformation>().eq(TInvoiceInformation::getAppUserId, userId).eq(TInvoiceInformation::getDelFlag, 0));
+		return AjaxResult.success(list);
+	}
+	
+	
+	
+	@ResponseBody
+	@PostMapping(value = "/addInvoiceInformation")
+	@ApiOperation(value = "添加开票抬头数据", tags = {"小程序-充电发票"})
+	public AjaxResult addInvoiceInformation(@RequestBody TInvoiceInformation invoiceInformation){
+		Long userId = tokenService.getLoginUserApplet().getUserId();
+		//如果当前是默认抬头,则需要去除其他的默认配置
+		if(1 == invoiceInformation.getIsDefault()){
+			TInvoiceInformation one = invoiceInformationService.getOne(new LambdaQueryWrapper<TInvoiceInformation>().eq(TInvoiceInformation::getDelFlag, 0)
+					.eq(TInvoiceInformation::getIsDefault, 1).eq(TInvoiceInformation::getAppUserId, userId));
+			if(null != one){
+				one.setIsDefault(0);
+				invoiceInformationService.updateById(one);
+			}
+		}
+		
+		invoiceInformation.setAppUserId(userId);
+		invoiceInformationService.save(invoiceInformation);
+		return AjaxResult.success();
+	}
+	
+	
+	@ResponseBody
+	@GetMapping(value = "/getInvoiceInformationInfo/{id}")
+	@ApiOperation(value = "获取开票抬头详情数据", tags = {"小程序-充电发票"})
+	public AjaxResult<TInvoiceInformation> getInvoiceInformationInfo(@PathVariable String id){
+		TInvoiceInformation information = invoiceInformationService.getById(id);
+		return AjaxResult.success(information);
+	}
+	
+	
+	
+	@ResponseBody
+	@PostMapping(value = "/editInvoiceInformation")
+	@ApiOperation(value = "编辑开票抬头数据", tags = {"小程序-充电发票"})
+	public AjaxResult editInvoiceInformation(@RequestBody TInvoiceInformation invoiceInformation){
+		Long userId = tokenService.getLoginUserApplet().getUserId();
+		//如果当前是默认抬头,则需要去除其他的默认配置
+		if(1 == invoiceInformation.getIsDefault()){
+			TInvoiceInformation one = invoiceInformationService.getOne(new LambdaQueryWrapper<TInvoiceInformation>().eq(TInvoiceInformation::getDelFlag, 0)
+					.eq(TInvoiceInformation::getIsDefault, 1).eq(TInvoiceInformation::getAppUserId, userId));
+			if(null != one && !one.getId().equals(invoiceInformation.getId())){
+				one.setIsDefault(0);
+				invoiceInformationService.updateById(one);
+			}
+		}
+		invoiceInformationService.updateById(invoiceInformation);
+		return AjaxResult.success();
+	}
+	
 }
 
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/TAppUserService.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/TAppUserService.java
index 0a9a179..fbed3d2 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/TAppUserService.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/TAppUserService.java
@@ -38,4 +38,10 @@
      * @return
      */
     Map<String, Object> getUserInfo(TAppUser appUser);
+
+    /**
+     * 账号判断
+     * @param status
+     */
+    public void throwInfo(Integer status);
 }
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserServiceImpl.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserServiceImpl.java
index f8cfe72..7fd0ff1 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserServiceImpl.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppUserServiceImpl.java
@@ -11,6 +11,7 @@
 import com.ruoyi.account.service.TAppUserService;
 import com.ruoyi.account.wx.model.WeixinProperties;
 import com.ruoyi.account.wx.pojo.AppletUserDecodeData;
+import com.ruoyi.common.core.exception.ServiceException;
 import com.ruoyi.common.security.service.TokenService;
 import com.ruoyi.system.api.model.LoginUserApplet;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -51,6 +52,9 @@
                 appUser.setPhone(appletUserDecodeData.getPhoneNumber());
             }
         }
+        if(Objects.nonNull(appUser.getStatus())){
+            throwInfo(appUser.getStatus());
+        }
         appUser.setAvatar(appletUserDecodeData.getAvatarUrl());
         appUser.setCity(appletUserDecodeData.getCity());
         appUser.setName(appletUserDecodeData.getNickName());
@@ -78,6 +82,9 @@
                 appUser.setPhone(userInfo.getMobile());
             }
         }
+        if(Objects.nonNull(appUser.getStatus())){
+            throwInfo(appUser.getStatus());
+        }
         appUser.setAvatar(userInfo.getAvatar());
         appUser.setCity(userInfo.getCity());
         appUser.setName(userInfo.getNickName());
@@ -102,4 +109,16 @@
         tokenInfos.put("info",loginUserApplet);
         return tokenInfos;
     }
+
+    @Override
+    public void throwInfo(Integer status){
+        switch (status){
+            case 2:
+                throw new ServiceException("账号被冻结,请联系管理员");
+            case 3:
+                throw new ServiceException("账号已注销,请重新注册使用");
+            default:
+                break;
+        }
+    }
 }
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/GiveVipUtil.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/GiveVipUtil.java
index b477141..a20ac1c 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/GiveVipUtil.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/GiveVipUtil.java
@@ -42,7 +42,7 @@
             tAppUserVipDetail.setEndTime(LocalDateTime.now().plusMonths(plusDay).minusDays(1));
             tAppUserVipDetail.setVipId(vipId);
 
-            R<TVip> info = vipClient.getInfo(vipId);
+            R<TVip> info = vipClient.getInfo1(vipId);
             TVip vip = info.getData();
             List<SendCouponDto> javaList = JSON.parseArray(vip.getCoupon()).toJavaList(SendCouponDto.class);
 
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/SignDayUtil.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/SignDayUtil.java
new file mode 100644
index 0000000..5a287f5
--- /dev/null
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/SignDayUtil.java
@@ -0,0 +1,76 @@
+package com.ruoyi.account.util;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import com.ruoyi.account.api.model.TAppUserSign;
+import com.ruoyi.account.service.TAppUserSignService;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.time.LocalDate;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+@Component
+public class SignDayUtil {
+
+    // 假设这是你的 signService 接口或者实现类
+    @Resource
+    private TAppUserSignService signService;
+
+    /**
+     * 计算用户的最近连续签到天数
+     * @param userId 用户ID
+     * @return 连续签到的最大天数
+     */
+    public int calculateContinuousSignDays(Long userId) {
+        DateTime startOfMonth = DateUtil.beginOfMonth(new Date());
+        DateTime endOfMonth = DateUtil.endOfMonth(new Date());
+        // 获取用户的所有签到记录
+        List<TAppUserSign> signRecords = signService.lambdaQuery()
+                .between(TAppUserSign::getSignDay, startOfMonth, endOfMonth)
+                .eq(TAppUserSign::getAppUserId, userId)
+                .orderByDesc(TAppUserSign::getSignDay)
+                .list();
+
+        // 如果没有签到记录,则返回0
+        if (signRecords.isEmpty()) {
+            return 0;
+        }
+
+        // 将签到日期转换为 LocalDate 列表,并按照日期排序
+        List<LocalDate> signDays = signRecords.stream()
+                .map(TAppUserSign::getSignDay)
+                .sorted()
+                .collect(Collectors.toList());
+
+        // 计算连续签到的最大天数
+        return calculateMaxContinuousSignDays(signDays);
+    }
+
+    /**
+     * 根据签到日期列表计算连续签到的最大天数
+     * @param signDays 签到日期列表
+     * @return 最大连续签到天数
+     */
+    private int calculateMaxContinuousSignDays(List<LocalDate> signDays) {
+        int maxContinuousDays = 0;
+        int currentContinuousDays = 0;
+        LocalDate lastSignDay = null;
+
+        for (LocalDate signDay : signDays) {
+            if (lastSignDay != null && signDay.equals(lastSignDay.plusDays(1))) {
+                currentContinuousDays++;
+            } else {
+                maxContinuousDays = Math.max(maxContinuousDays, currentContinuousDays);
+                currentContinuousDays = 1;
+            }
+            lastSignDay = signDay;
+        }
+
+        // 更新最后的连续天数
+        maxContinuousDays = Math.max(maxContinuousDays, currentContinuousDays);
+
+        return maxContinuousDays;
+    }
+}
diff --git a/ruoyi-service/ruoyi-account/src/main/resources/mapper/account/TInvoiceInformationMapper.xml b/ruoyi-service/ruoyi-account/src/main/resources/mapper/account/TInvoiceInformationMapper.xml
index 113c0f6..262bb81 100644
--- a/ruoyi-service/ruoyi-account/src/main/resources/mapper/account/TInvoiceInformationMapper.xml
+++ b/ruoyi-service/ruoyi-account/src/main/resources/mapper/account/TInvoiceInformationMapper.xml
@@ -14,14 +14,14 @@
         <result column="company_phone" property="companyPhone" />
         <result column="deposit_bank" property="depositBank" />
         <result column="bank_account" property="bankAccount" />
-        <result column="default" property="default" />
+        <result column="is_default" property="isDefault" />
         <result column="create_time" property="createTime" />
         <result column="del_flag" property="delFlag" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, app_user_id, invoice_type, invoicing_object_type, name, tax_identification_number, company_address, company_phone, deposit_bank, bank_account, default, create_time, del_flag
+        id, app_user_id, invoice_type, invoicing_object_type, name, tax_identification_number, company_address, company_phone, deposit_bank, bank_account, is_default, create_time, del_flag
     </sql>
 
 </mapper>
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/CodeController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/CodeController.java
new file mode 100644
index 0000000..14b8403
--- /dev/null
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/CodeController.java
@@ -0,0 +1,53 @@
+package com.ruoyi.chargingPile.controller;
+
+import com.ruoyi.account.api.feignClient.AppUserClient;
+import com.ruoyi.account.api.model.TAppUser;
+import com.ruoyi.chargingPile.api.model.TChargingPile;
+import com.ruoyi.chargingPile.service.TChargingPileNotificationService;
+import com.ruoyi.common.core.constant.Constants;
+import com.ruoyi.common.core.constant.MsgConstants;
+import com.ruoyi.common.core.utils.HttpUtils;
+import com.ruoyi.common.core.utils.MsgUtil;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.redis.service.RedisService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+
+public class CodeController {
+
+    @Autowired
+    private RedisService redisService;
+    @Autowired
+    private AppUserClient appUserClient;
+    @Autowired
+    private TChargingPileNotificationService chargingPileNotificationService;
+
+    /**
+     * 获取验证码
+     *
+     * @param phone 手机号
+     * @return 结果
+     */
+    @ApiOperation(value = "获取验证码",notes = "获取验证码",tags = {"更换手机号获取验证码"})
+    @GetMapping("getCode")
+    public AjaxResult getCode(@RequestParam("phone") String phone)
+    {
+        TAppUser appUser = appUserClient.selectByPhone(phone).getData();
+        if (Objects.nonNull(appUser)){
+            return AjaxResult.error("该手机号已绑定账号");
+        }
+        String code = MsgUtil.createCode();
+        redisService.setCacheObject(phone+ Constants.APPLET,code,5L, TimeUnit.MINUTES);
+        String reqStr = MsgUtil.codeMsg(phone, code);
+        String result = HttpUtils.post(MsgConstants.SEND_URL, reqStr);
+        // 记录短信发送
+        chargingPileNotificationService.saveData(1,null,null,phone,"验证码:"+code+",用于更换手机号。请勿转发。");
+        return AjaxResult.success(result);
+    }
+
+}
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java
index 8ddb212..6bd43d4 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java
@@ -156,7 +156,7 @@
 
 	
 	@ResponseBody
-	@PostMapping("/getSiteList")
+	@PostMapping("/addSite")
 	@ApiOperation(value = "添加站点", tags = {"管理后台-站点管理"})
 	public AjaxResult addSite(@RequestBody Site site){
 		return siteService.addSite(site);
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 47190e3..9acebda 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
@@ -42,8 +42,9 @@
     @Log(title = "添加故障报修管理", businessType = BusinessType.INSERT,operatorType = OperatorType.MOBILE)
     @ApiOperation(tags = {"小程序-故障报修"},value = "添加故障报修管理")
     @PostMapping(value = "/add")
-    public AjaxResult<Boolean> add(@Validated @RequestBody TFaultMessage dto) {
-        return AjaxResult.ok(faultMessageService.save(dto));
+    public AjaxResult<String> add(@Validated @RequestBody TFaultMessage dto) {
+        faultMessageService.add(dto);
+        return AjaxResult.success();
     }
 
 
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TChargingPileNotificationService.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TChargingPileNotificationService.java
index 28287dd..aa630d2 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TChargingPileNotificationService.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TChargingPileNotificationService.java
@@ -23,4 +23,13 @@
 	 * @return
 	 */
 	PageInfo<TChargingPileNotification> chargingPileNotificationPageList(Integer siteId, BasePage basePage);
+
+	/**
+	 *
+	 * @param type 1=验证码 2=停车占位 3=充电结束 4=桩故障
+	 * @param phone 手机号
+	 * @param data 内容
+	 */
+    void saveData(Integer type,Integer siteId,Integer chargingPileId, String phone, String data);
+
 }
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 3605b47..62fc81e 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
@@ -13,4 +13,10 @@
  */
 public interface TFaultMessageService extends IService<TFaultMessage> {
 
+    /**
+     * 添加故障报修管理
+     * @param dto
+     * @return
+     */
+    void add(TFaultMessage dto);
 }
diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileNotificationServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileNotificationServiceImpl.java
index b38a11d..8297e9e 100644
--- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileNotificationServiceImpl.java
+++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileNotificationServiceImpl.java
@@ -84,4 +84,24 @@
 		pageInfo.setRecords(list);
 		return pageInfo;
 	}
+
+	@Override
+	public void saveData(Integer type,Integer siteId,Integer chargingPileId, String phone, String data) {
+		TChargingPileNotification notification = new TChargingPileNotification();
+		switch (type){
+			case 1:
+				// 验证码
+				notification.setPhone(phone);
+				notification.setContent(data);
+				break;
+			default:
+				// 停车占位
+				notification.setSiteId(siteId);
+				notification.setChargingPileId(chargingPileId);
+				notification.setPhone(phone);
+				notification.setContent(data);
+				break;
+		}
+	}
+
 }
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 c5e9e20..01dff45 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
@@ -1,9 +1,18 @@
 package com.ruoyi.chargingPile.service.impl;
 
+import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.chargingPile.api.model.Site;
+import com.ruoyi.chargingPile.api.model.TChargingPile;
 import com.ruoyi.chargingPile.api.model.TFaultMessage;
 import com.ruoyi.chargingPile.mapper.TFaultMessageMapper;
+import com.ruoyi.chargingPile.service.ISiteService;
+import com.ruoyi.chargingPile.service.TChargingPileNotificationService;
+import com.ruoyi.chargingPile.service.TChargingPileService;
 import com.ruoyi.chargingPile.service.TFaultMessageService;
+import com.ruoyi.common.core.utils.MsgUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 /**
@@ -14,7 +23,29 @@
  * @author xiaochen
  * @since 2024-08-08
  */
+@Slf4j
 @Service
 public class TFaultMessageServiceImpl extends ServiceImpl<TFaultMessageMapper, TFaultMessage> implements TFaultMessageService {
 
+    @Autowired
+    private ISiteService siteService;
+    @Autowired
+    private TChargingPileService chargingPileService;
+    @Autowired
+    private TChargingPileNotificationService chargingPileNotificationService;
+
+    @Override
+    public void add(TFaultMessage dto) {
+        // 故障短信提醒
+        Site site = siteService.getById(dto.getSiteId());
+        TChargingPile chargingPile = chargingPileService.getById(dto.getChargingPileId());
+        String siteName = site.getName();
+        String result = MsgUtil.faultMsg(site.getPhone(), site.getName(), chargingPile.getNumber() + "");
+        log.info("故障短信提醒:{}",result);
+        if(siteName.length()>10){
+            siteName = siteName.substring(0,10);
+        }
+        chargingPileNotificationService.saveData(4,dto.getSiteId(),dto.getChargingPileId(),site.getPhone(),"检测到"+siteName+"..."+chargingPile.getNumber()+"号桩设备离线,请及时查看处理!");
+        this.save(dto);
+    }
 }
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 713e8f2..f20b8af 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
@@ -11,7 +11,9 @@
 import com.ruoyi.order.api.model.TOrderEvaluate;
 import com.ruoyi.order.api.query.TChargingCountQuery;
 import com.ruoyi.order.dto.GetMyChargingOrderList;
+import com.ruoyi.order.dto.GetNoInvoicedOrder;
 import com.ruoyi.order.dto.MyChargingOrderInfo;
+import com.ruoyi.order.dto.MyChargingOrderList;
 import com.ruoyi.order.dto.OrderEvaluateVo;
 import com.ruoyi.order.service.TChargingOrderService;
 import com.ruoyi.order.service.TOrderEvaluateService;
@@ -112,9 +114,9 @@
                 .eq(TChargingOrder::getDelFlag, 0).eq(TChargingOrder::getStatus, 3));
         return R.ok(one);
     }
-
-
-
+    
+    
+    
     
     @ResponseBody
     @GetMapping(value = "/getMyChargingOrderList")
@@ -132,5 +134,16 @@
         MyChargingOrderInfo myChargingOrderInfo = chargingOrderService.getMyChargingOrderInfo(id);
         return AjaxResult.success(myChargingOrderInfo);
     }
+    
+    
+    
+    @ResponseBody
+    @GetMapping(value = "/getNoInvoicedOrder")
+    @ApiOperation(value = "获取未开票的订单数据", tags = {"小程序-充电发票"})
+    public AjaxResult<List<MyChargingOrderList>> getNoInvoicedOrder(@RequestBody GetNoInvoicedOrder query){
+        List<MyChargingOrderList> list = chargingOrderService.getNoInvoicedOrder(query);
+        return AjaxResult.success(list);
+    }
+    
 }
 
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TExchangeOrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TExchangeOrderController.java
index d5dc5e8..5f4fb2a 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TExchangeOrderController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TExchangeOrderController.java
@@ -166,5 +166,23 @@
         return AjaxResult.success(goodsExchangeOrder);
     }
     
+    
+    @PutMapping("/confirmReceipt/{id}")
+    @ApiOperation(value = "确认收货操作", tags = {"小程序-兑换记录"})
+    public AjaxResult confirmReceipt(@PathVariable String id){
+        TExchangeOrder tExchangeOrder = exchangeOrderService.getById(id);
+        if(tExchangeOrder.getStatus() == 3){
+            return AjaxResult.error("不能重复确认收货");
+        }
+        if(tExchangeOrder.getStatus() == 1){
+            return AjaxResult.error("订单还未发货呢");
+        }
+        if(tExchangeOrder.getStatus() == 4){
+            return AjaxResult.error("订单已取消,不允许操作。");
+        }
+        tExchangeOrder.setStatus(3);
+        exchangeOrderService.updateById(tExchangeOrder);
+        return AjaxResult.success();
+    }
 }
 
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 664a0dc..8e2cd80 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,9 +1,18 @@
 package com.ruoyi.order.controller;
 
 
+import com.ruoyi.common.core.web.domain.AjaxResult;
+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.service.TOrderInvoiceService;
 import io.swagger.annotations.Api;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
 
 /**
  * <p>
@@ -18,5 +27,37 @@
 @RequestMapping("/t-order-invoice")
 public class TOrderInvoiceController {
 
+	@Resource
+	private TOrderInvoiceService orderInvoiceService;
+	
+	
+	
+	
+	@ResponseBody
+	@PostMapping("/addOrderInvoice")
+	@ApiOperation(value = "添加开票申请", tags = {"小程序-充电发票"})
+	public AjaxResult addOrderInvoice(@RequestBody AddOrderInvoice addOrderInvoice){
+		return orderInvoiceService.addOrderInvoice(addOrderInvoice);
+	}
+	
+	
+	
+	@ResponseBody
+	@GetMapping("/getMyOrderInvoiceList")
+	@ApiOperation(value = "获取开票记录列表", tags = {"小程序-充电发票"})
+	public AjaxResult<List<OrderInvoiceList>> getMyOrderInvoiceList(GetOrderInvoiceList query){
+		List<OrderInvoiceList> myOrderInvoiceList = orderInvoiceService.getMyOrderInvoiceList(query);
+		return AjaxResult.success(myOrderInvoiceList);
+	}
+	
+	
+	
+	@ResponseBody
+	@GetMapping("/getMyOrderInvoiceInfo/{id}")
+	@ApiOperation(value = "获取开票记录详情", tags = {"小程序-充电发票"})
+	public AjaxResult<MyOrderInvoiceInfo> getMyOrderInvoiceInfo(@PathVariable String id){
+		MyOrderInvoiceInfo myOrderInvoiceInfo = orderInvoiceService.getMyOrderInvoiceInfo(id);
+		return AjaxResult.success(myOrderInvoiceInfo);
+	}
 }
 
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java
index 186eaed..e853464 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java
@@ -1,9 +1,17 @@
 package com.ruoyi.order.controller;
 
 
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.order.api.model.TExchangeOrder;
+import com.ruoyi.order.api.model.TShoppingOrder;
+import com.ruoyi.order.dto.*;
+import com.ruoyi.order.service.TShoppingOrderService;
 import io.swagger.annotations.Api;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
 
 /**
  * <p>
@@ -17,6 +25,62 @@
 @RestController
 @RequestMapping("/t-shopping-order")
 public class TShoppingOrderController {
-
+	
+	@Resource
+	private TShoppingOrderService shoppingOrderService;
+	
+	
+	@GetMapping("/getMyShoppingOrderList")
+	@ApiOperation(value = "获取购买订单列表", tags = {"小程序-商城购买订单"})
+	public AjaxResult<List<MyShoppingOrderList>> getMyShoppingOrderList(GetMyShoppingOrderList query){
+		List<MyShoppingOrderList> list = shoppingOrderService.getMyShoppingOrderList(query);
+		return AjaxResult.success(list);
+	}
+	
+	
+	
+	@GetMapping("/getMyShoppingOrderInfo/{id}")
+	@ApiOperation(value = "获取购买订单详情", tags = {"小程序-商城购买订单"})
+	public AjaxResult<MyShoppingOrderInfo> getMyShoppingOrderInfo(@PathVariable String id){
+		MyShoppingOrderInfo info = shoppingOrderService.getMyShoppingOrderInfo(id);
+		return AjaxResult.success(info);
+	}
+	
+	
+	
+	@PutMapping("/confirmReceipt/{id}")
+	@ApiOperation(value = "确认收货操作", tags = {"小程序-商城购买订单"})
+	public AjaxResult confirmReceipt(@PathVariable String id){
+		TShoppingOrder shoppingOrder = shoppingOrderService.getById(id);
+		if(shoppingOrder.getStatus() == 3){
+			return AjaxResult.error("不能重复确认收货");
+		}
+		if(shoppingOrder.getStatus() == 1){
+			return AjaxResult.error("订单还未发货呢");
+		}
+		if(shoppingOrder.getStatus() == 4){
+			return AjaxResult.error("订单已取消,不允许操作。");
+		}
+		shoppingOrder.setStatus(3);
+		shoppingOrderService.updateById(shoppingOrder);
+		return AjaxResult.success();
+	}
+	
+	
+	@PutMapping("/cancelOrder/{id}")
+	@ApiOperation(value = "取消订单操作", tags = {"小程序-商城购买订单"})
+	public AjaxResult cancelOrder(@PathVariable String id){
+		return shoppingOrderService.cancelOrder(id);
+	}
+	
+	
+	
+	@ResponseBody
+	@GetMapping(value = "/getNoInvoicedOrder")
+	@ApiOperation(value = "获取未开票的订单数据", tags = {"小程序-充电发票"})
+	public AjaxResult<List<MyShoppingOrderList>> getNoInvoicedOrder(GetNoInvoicedOrder query){
+		List<MyShoppingOrderList> list = shoppingOrderService.getNoInvoicedOrder(query);
+		return AjaxResult.success(list);
+	}
 }
 
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/AddOrderInvoice.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/AddOrderInvoice.java
new file mode 100644
index 0000000..988ec28
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/AddOrderInvoice.java
@@ -0,0 +1,18 @@
+package com.ruoyi.order.dto;
+
+import com.ruoyi.order.api.model.TOrderInvoice;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/8/19 15:29
+ */
+@Data
+@ApiModel
+public class AddOrderInvoice extends TOrderInvoice {
+	@ApiModelProperty("订单数据数组[{\"id\":111,\"amount\":30}]")
+	private String orders;
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/GetMyShoppingOrderList.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/GetMyShoppingOrderList.java
new file mode 100644
index 0000000..d724d96
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/GetMyShoppingOrderList.java
@@ -0,0 +1,17 @@
+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;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/8/19 13:43
+ */
+@Data
+@ApiModel
+public class GetMyShoppingOrderList extends BasePage {
+	@ApiModelProperty(value = "状态(0=全部,1=待发货,2=待收货,3=已完成)")
+	private Integer status;
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/GetNoInvoicedOrder.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/GetNoInvoicedOrder.java
new file mode 100644
index 0000000..5884a8f
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/GetNoInvoicedOrder.java
@@ -0,0 +1,17 @@
+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;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/8/19 14:33
+ */
+@Data
+@ApiModel
+public class GetNoInvoicedOrder extends BasePage {
+	@ApiModelProperty("日期")
+	private String month;
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/GetOrderInvoiceList.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/GetOrderInvoiceList.java
new file mode 100644
index 0000000..0e8c0ca
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/GetOrderInvoiceList.java
@@ -0,0 +1,17 @@
+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;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/8/19 16:17
+ */
+@Data
+@ApiModel
+public class GetOrderInvoiceList extends BasePage {
+	@ApiModelProperty("状态(1=已申请,2=开票中,3=开票成功)")
+	private Integer status;
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyOrderInvoiceInfo.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyOrderInvoiceInfo.java
new file mode 100644
index 0000000..620e5e1
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyOrderInvoiceInfo.java
@@ -0,0 +1,38 @@
+package com.ruoyi.order.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/8/19 16:58
+ */
+@Data
+@ApiModel
+public class MyOrderInvoiceInfo {
+	@ApiModelProperty("订单id")
+	private String id;
+	@ApiModelProperty("订单号")
+	private String code;
+	@ApiModelProperty("发票类型")
+	private String invoiceType;
+	@ApiModelProperty("开票订单类型(1=充电订单,2=购物订单,3=兑换订单,4=会员订单)")
+	private Integer orderType;
+	@ApiModelProperty("抬头类型(1=个人,2=企业)")
+	private Integer invoicingObjectType;
+	@ApiModelProperty("发票金额")
+	private BigDecimal totalAmount;
+	@ApiModelProperty("电子发票地址")
+	private String invoiceUrl;
+	@ApiModelProperty(value = "状态(1=待开票,2=开票中,3=已开票)")
+	private Integer status;
+	@ApiModelProperty("关联订单(商城订单)")
+	private List<MyShoppingOrderList> shoppingOrder;
+	@ApiModelProperty("关联订单(充电订单)")
+	private List<MyChargingOrderList> chargingOrder;
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderInfo.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderInfo.java
new file mode 100644
index 0000000..307d58f
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderInfo.java
@@ -0,0 +1,56 @@
+package com.ruoyi.order.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/8/19 14:04
+ */
+@Data
+@ApiModel
+public class MyShoppingOrderInfo {
+	@ApiModelProperty("订单id")
+	private String id;
+	@ApiModelProperty("状态(1=待发货,2=待收货,3=已完成,4=已取消)")
+	private Integer status;
+	@ApiModelProperty("收货人姓名")
+	private String consignee;
+	@ApiModelProperty("电话")
+	private String phone;
+	@ApiModelProperty("地址")
+	private String address;
+	@ApiModelProperty("快递公司")
+	private String expressCompany;
+	@ApiModelProperty("快递单号")
+	private String expressNumber;
+	@ApiModelProperty("商品名称")
+	private String name;
+	@ApiModelProperty("商品图片")
+	private String imgUrl;
+	@ApiModelProperty("数量")
+	private Integer number;
+	@ApiModelProperty("单价")
+	private BigDecimal unitPrice;
+	@ApiModelProperty("订单编号")
+	private String code;
+	@ApiModelProperty("下单时间")
+	private String createTime;
+	@ApiModelProperty("支付金额")
+	private BigDecimal paymentAmount;
+	@ApiModelProperty("备注")
+	private String remark;
+	@ApiModelProperty("发货时间")
+	private String deliveryTime;
+	@ApiModelProperty("完成时间")
+	private String finishTime;
+	@ApiModelProperty("优惠券类型(1=充电优惠券,2=购物优惠券)")
+	private Integer couponType;
+	@ApiModelProperty("优惠券有效天数")
+	private Integer days;
+	@ApiModelProperty("有效期截止时间")
+	private String endTime;
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderList.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderList.java
new file mode 100644
index 0000000..6cc1346
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderList.java
@@ -0,0 +1,30 @@
+package com.ruoyi.order.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/8/19 13:45
+ */
+@Data
+@ApiModel
+public class MyShoppingOrderList {
+	@ApiModelProperty(value = "订单id")
+	private String id;
+	@ApiModelProperty("封面图")
+	private String imgUrl;
+	@ApiModelProperty("商品名称")
+	private String name;
+	@ApiModelProperty("状态(1=待发货,2=待收货,3=已完成,4=已取消)")
+	private Integer status;
+	@ApiModelProperty("单价")
+	private BigDecimal unitPrice;
+	@ApiModelProperty("数量")
+	private Integer number;
+	@ApiModelProperty("支付金额")
+	private BigDecimal paymentAmount;
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/OrderInvoiceList.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/OrderInvoiceList.java
new file mode 100644
index 0000000..928876f
--- /dev/null
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/OrderInvoiceList.java
@@ -0,0 +1,26 @@
+package com.ruoyi.order.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author zhibing.pu
+ * @Date 2024/8/19 16:18
+ */
+@Data
+@ApiModel
+public class OrderInvoiceList {
+	@ApiModelProperty("数据id")
+	private String id;
+	@ApiModelProperty("订单类型(1=充电订单,2=购物订单,3=兑换订单,4=会员订单)")
+	private Integer orderType;
+	@ApiModelProperty("开票金额")
+	private BigDecimal totalAmount;
+	@ApiModelProperty("抬头名称")
+	private String name;
+	@ApiModelProperty("申请时间")
+	private String createTime;
+}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java
index 1b186da..2cb8469 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java
@@ -2,7 +2,9 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.order.api.model.TChargingOrder;
+import com.ruoyi.order.dto.GetNoInvoicedOrder;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
@@ -27,5 +29,17 @@
 	 * @param pageSize
 	 * @return
 	 */
-	List<TChargingOrder> getMyChargingOrderList(Long appUserId, Integer type, Integer pageCurr, Integer pageSize);
+	List<TChargingOrder> getMyChargingOrderList(@Param("appUserId") Long appUserId, @Param("type") Integer type,
+	                                            @Param("pageCurr") Integer pageCurr, @Param("pageSize") Integer pageSize);
+	
+	
+	/**
+	 * 获取待开票订单列表
+	 * @param month 筛选时间2024-01-01
+	 * @param pageCurr
+	 * @param pageSize
+	 * @return
+	 */
+	List<TChargingOrder> getNoInvoicedOrder(@Param("appUserId") Long appUserId, @Param("month") String month,
+	                                        @Param("pageCurr") Integer pageCurr, @Param("pageSize") Integer pageSize);
 }
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TShoppingOrderMapper.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TShoppingOrderMapper.java
index da4a11c..5cb1c33 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TShoppingOrderMapper.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TShoppingOrderMapper.java
@@ -22,4 +22,16 @@
 public interface TShoppingOrderMapper extends BaseMapper<TShoppingOrder> {
 
     List<TActivityStatisticslVO> activityStatistics(@Param("pageInfo") PageInfo<TActivityStatisticslVO> pageInfo, @Param("req")TActivityStatisticsQuery dto);
+    
+    
+    /**
+     * 获取未开票的订单数据
+     * @param appUserId
+     * @param month
+     * @param pageCurr
+     * @param pageSize
+     * @return
+     */
+    List<TShoppingOrder> getNoInvoicedOrder(@Param("appUserId") Long appUserId, @Param("month") String month,
+                                            @Param("pageCurr") Integer pageCurr, @Param("pageSize") Integer pageSize);
 }
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 d5e9755..d4b0897 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
@@ -4,8 +4,12 @@
 import com.ruoyi.common.core.web.page.BasePage;
 import com.ruoyi.order.api.model.TChargingOrder;
 import com.ruoyi.order.dto.GetMyChargingOrderList;
+import com.ruoyi.order.dto.GetNoInvoicedOrder;
 import com.ruoyi.order.dto.MyChargingOrderInfo;
+import com.ruoyi.order.dto.MyChargingOrderList;
+import org.springframework.web.bind.annotation.RequestBody;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -33,4 +37,12 @@
 	 * @return
 	 */
 	MyChargingOrderInfo getMyChargingOrderInfo(String id);
+	
+	
+	/**
+	 * 获取待开票订单列表
+	 * @param query
+	 * @return
+	 */
+	List<MyChargingOrderList> getNoInvoicedOrder(GetNoInvoicedOrder query);
 }
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 ee4cbb5..d44196e 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
@@ -1,7 +1,14 @@
 package com.ruoyi.order.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.core.web.domain.AjaxResult;
 import com.ruoyi.order.api.model.TOrderInvoice;
+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;
 
 /**
  * <p>
@@ -12,5 +19,28 @@
  * @since 2024-08-07
  */
 public interface TOrderInvoiceService extends IService<TOrderInvoice> {
-
+	
+	
+	/**
+	 * 添加开票申请
+	 * @param addOrderInvoice
+	 * @return
+	 */
+	AjaxResult addOrderInvoice(AddOrderInvoice addOrderInvoice);
+	
+	
+	/**
+	 * 获取小程序用户开票记录
+	 * @param query
+	 * @return
+	 */
+	List<OrderInvoiceList> getMyOrderInvoiceList(GetOrderInvoiceList query);
+	
+	
+	/**
+	 * 获取开票申请详情
+	 * @param id
+	 * @return
+	 */
+	MyOrderInvoiceInfo getMyOrderInvoiceInfo(String id);
 }
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TShoppingOrderService.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TShoppingOrderService.java
index da59889..c503367 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TShoppingOrderService.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TShoppingOrderService.java
@@ -1,11 +1,20 @@
 package com.ruoyi.order.service;
 
 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.TShoppingOrder;
 import com.ruoyi.order.api.query.TActivityStatisticsQuery;
 import com.ruoyi.order.api.vo.TActivityStatisticslVO;
 import com.ruoyi.order.api.vo.TActivityVO;
+import com.ruoyi.order.dto.GetMyShoppingOrderList;
+import com.ruoyi.order.dto.GetNoInvoicedOrder;
+import com.ruoyi.order.dto.MyShoppingOrderInfo;
+import com.ruoyi.order.dto.MyShoppingOrderList;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.List;
 
 /**
  * <p>
@@ -18,4 +27,36 @@
 public interface TShoppingOrderService extends IService<TShoppingOrder> {
 
     TActivityVO activityStatistics(TActivityStatisticsQuery dto);
+    
+    
+    /**
+     * 获取小程序商城购买订单列表
+     * @param query
+     * @return
+     */
+    List<MyShoppingOrderList> getMyShoppingOrderList(GetMyShoppingOrderList query);
+    
+    
+    /**
+     * 获取购买订单详情
+     * @param id
+     * @return
+     */
+    MyShoppingOrderInfo getMyShoppingOrderInfo(String id);
+    
+    
+    /**
+     * 取消订单
+     * @param id
+     * @return
+     */
+    AjaxResult cancelOrder(String id);
+    
+    
+    /**
+     * 获取未开票的订单列表
+     * @param query
+     * @return
+     */
+    List<MyShoppingOrderList> getNoInvoicedOrder(GetNoInvoicedOrder query);
 }
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 ae4d583..d22e59a 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
@@ -15,6 +15,7 @@
 import com.ruoyi.order.api.model.TChargingOrder;
 import com.ruoyi.order.api.model.TChargingOrderAccountingStrategy;
 import com.ruoyi.order.dto.GetMyChargingOrderList;
+import com.ruoyi.order.dto.GetNoInvoicedOrder;
 import com.ruoyi.order.dto.MyChargingOrderInfo;
 import com.ruoyi.order.dto.MyChargingOrderList;
 import com.ruoyi.order.mapper.TChargingOrderMapper;
@@ -137,4 +138,33 @@
 		myChargingOrderInfo.setActionable(myChargingOrderInfo.getEndTime() + 604800000L > System.currentTimeMillis() ? 0 : 1);
 		return myChargingOrderInfo;
 	}
+	
+	
+	/**
+	 * 获取待开票订单列表
+	 * @param query
+	 * @return
+	 */
+	@Override
+	public List<MyChargingOrderList> getNoInvoicedOrder(GetNoInvoicedOrder query) {
+		Long appUserId = tokenService.getLoginUserApplet().getUserId();
+		List<TChargingOrder> orderList = this.baseMapper.getNoInvoicedOrder(appUserId, query.getMonth(), query.getPageCurr(), query.getPageSize());
+		List<MyChargingOrderList> list = new ArrayList<>();
+		for (TChargingOrder tChargingOrder : orderList) {
+			MyChargingOrderList myChargingOrderList = new MyChargingOrderList();
+			myChargingOrderList.setId(tChargingOrder.getId().toString());
+			myChargingOrderList.setStatus(tChargingOrder.getStatus());
+			Site site = siteClient.getSiteByIds(Arrays.asList(tChargingOrder.getSiteId())).getData().get(0);
+			myChargingOrderList.setTitle(site.getName());
+			myChargingOrderList.setChargingDegree(tChargingOrder.getChargingCapacity());
+			String name = chargingGunClient.getAllName(tChargingOrder.getChargingGunId()).getData();
+			myChargingOrderList.setName(name);
+			myChargingOrderList.setEndMode(tChargingOrder.getEndMode());
+			BigDecimal payMoney = tChargingOrder.getStatus() < 4 ? tChargingOrder.getRechargeAmount() : tChargingOrder.getPaymentAmount();
+			myChargingOrderList.setPayMoney(payMoney);
+			myChargingOrderList.setCreateTime(tChargingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+			list.add(myChargingOrderList);
+		}
+		return list;
+	}
 }
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 2440069..ac22a39 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
@@ -1,10 +1,42 @@
 package com.ruoyi.order.service.impl;
 
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+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.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.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.other.api.domain.TCoupon;
+import com.ruoyi.other.api.domain.TGoods;
+import com.ruoyi.other.api.domain.TInvoiceType;
+import com.ruoyi.other.api.feignClient.CouponClient;
+import com.ruoyi.other.api.feignClient.GoodsClient;
+import com.ruoyi.other.api.feignClient.InvoiceTypeClient;
+import io.seata.spring.annotation.GlobalTransactional;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -16,5 +48,184 @@
  */
 @Service
 public class TOrderInvoiceServiceImpl extends ServiceImpl<TOrderInvoiceMapper, TOrderInvoice> implements TOrderInvoiceService {
-
+	
+	@Resource
+	private TokenService tokenService;
+	
+	@Resource
+	private TOrderInvoiceDetailService orderInvoiceDetailService;
+	
+	@Resource
+	private InvoiceTypeClient invoiceTypeClient;
+	
+	@Resource
+	private TChargingOrderService chargingOrderService;
+	
+	@Resource
+	private TShoppingOrderService shoppingOrderService;
+	
+	@Resource
+	private ChargingGunClient chargingGunClient;
+	
+	@Resource
+	private SiteClient siteClient;
+	
+	@Resource
+	private GoodsClient goodsClient;
+	
+	@Resource
+	private CouponClient couponClient;
+	
+	
+	
+	
+	
+	/**
+	 * 添加开票申请
+	 * @param addOrderInvoice
+	 * @return
+	 */
+	@Override
+	@GlobalTransactional(rollbackFor = Exception.class)
+	public AjaxResult addOrderInvoice(AddOrderInvoice addOrderInvoice) {
+		Long userId = tokenService.getLoginUserApplet().getUserId();
+		String orders = addOrderInvoice.getOrders();
+		if(StringUtils.isNotEmpty(orders)){
+			return AjaxResult.error("请选择有效的订单");
+		}
+		JSONArray parse = JSONArray.parse(orders);
+		List<Long> orderIds = new ArrayList<>();
+		Map<Long, BigDecimal> map = new HashMap<>();
+		for (int i = 0; i < parse.size(); i++) {
+			JSONObject jsonObject = parse.getJSONObject(i);
+			Long id = jsonObject.getLong("id");
+			BigDecimal amount = jsonObject.getBigDecimal("amount");
+			orderIds.add(id);
+			map.put(id, amount);
+		}
+		long count = orderInvoiceDetailService.count(new LambdaQueryWrapper<TOrderInvoiceDetail>().eq(TOrderInvoiceDetail::getOrderType, addOrderInvoice.getOrderType())
+				.in(TOrderInvoiceDetail::getOrderId, orderIds));
+		if(count > 0){
+			return AjaxResult.error("不能重复申请开票,请刷新数据后重试");
+		}
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+		String code = Math.random() * 1000 + sdf.format(new Date());
+		addOrderInvoice.setAppUserId(userId);
+		addOrderInvoice.setCode(code);
+		addOrderInvoice.setStatus(1);
+		this.save(addOrderInvoice);
+		//获取开票类型
+		TInvoiceType invoiceType = invoiceTypeClient.getInvoiceType(addOrderInvoice.getInvoiceTypeId()).getData();
+		for (Long orderId : orderIds) {
+			TOrderInvoiceDetail orderInvoiceDetail = new TOrderInvoiceDetail();
+			orderInvoiceDetail.setOrderInvoiceId(addOrderInvoice.getId());
+			orderInvoiceDetail.setInvoiceAmount(map.get(orderId));
+			orderInvoiceDetail.setOrderType(addOrderInvoice.getOrderType());
+			orderInvoiceDetail.setOrderId(orderId);
+			orderInvoiceDetail.setElectricityTariff(invoiceType.getElectricityTariff());
+			orderInvoiceDetail.setServiceTariff(invoiceType.getServiceTariff());
+			orderInvoiceDetail.setAddedServiceTariff(invoiceType.getAddedServiceTariff());
+			orderInvoiceDetailService.save(orderInvoiceDetail);
+		}
+		return AjaxResult.success();
+	}
+	
+	
+	/**
+	 * 获取开票记录列表
+	 * @param query
+	 * @return
+	 */
+	@Override
+	public List<OrderInvoiceList> getMyOrderInvoiceList(GetOrderInvoiceList query) {
+		Long userId = tokenService.getLoginUserApplet().getUserId();
+		List<TOrderInvoice> list = this.list(new LambdaQueryWrapper<TOrderInvoice>().eq(TOrderInvoice::getAppUserId, userId)
+				.eq(TOrderInvoice::getStatus, query.getStatus()).orderByDesc(TOrderInvoice::getCreateTime)
+				.last(" limit " + query.getPageCurr() + ", " + query.getPageSize()));
+		List<OrderInvoiceList> pageList = new ArrayList<>();
+		for (TOrderInvoice tOrderInvoice : list) {
+			OrderInvoiceList orderInvoiceList = new OrderInvoiceList();
+			orderInvoiceList.setId(tOrderInvoice.getId().toString());
+			orderInvoiceList.setOrderType(tOrderInvoice.getOrderType());
+			orderInvoiceList.setTotalAmount(tOrderInvoice.getTotalAmount());
+			orderInvoiceList.setName(tOrderInvoice.getName());
+			orderInvoiceList.setCreateTime(tOrderInvoice.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+			pageList.add(orderInvoiceList);
+		}
+		return pageList;
+	}
+	
+	
+	/**
+	 * 获取开票申请详情
+	 * @param id
+	 * @return
+	 */
+	@Override
+	public MyOrderInvoiceInfo getMyOrderInvoiceInfo(String id) {
+		TOrderInvoice orderInvoice = this.getById(id);
+		MyOrderInvoiceInfo myOrderInvoiceInfo = new MyOrderInvoiceInfo();
+		myOrderInvoiceInfo.setId(id);
+		myOrderInvoiceInfo.setCode(orderInvoice.getCode());
+		myOrderInvoiceInfo.setInvoiceType(orderInvoice.getInvoiceType());
+		myOrderInvoiceInfo.setOrderType(orderInvoice.getOrderType());
+		myOrderInvoiceInfo.setInvoicingObjectType(orderInvoice.getInvoicingObjectType());
+		myOrderInvoiceInfo.setTotalAmount(orderInvoice.getTotalAmount());
+		myOrderInvoiceInfo.setInvoiceUrl(orderInvoice.getInvoiceUrl());
+		myOrderInvoiceInfo.setStatus(orderInvoice.getStatus());
+		Integer orderType = orderInvoice.getOrderType();
+		List<TOrderInvoiceDetail> list = orderInvoiceDetailService.list(new LambdaQueryWrapper<TOrderInvoiceDetail>().eq(TOrderInvoiceDetail::getOrderInvoiceId, id));
+		List<Long> orderIds = list.stream().map(TOrderInvoiceDetail::getOrderId).collect(Collectors.toList());
+		//充电订单
+		if(orderType == 1){
+			List<TChargingOrder> orderList = chargingOrderService.listByIds(orderIds);
+			List<MyChargingOrderList> chargingOrder = new ArrayList<>();
+			for (TChargingOrder tChargingOrder : orderList) {
+				MyChargingOrderList myChargingOrderList = new MyChargingOrderList();
+				myChargingOrderList.setId(tChargingOrder.getId().toString());
+				myChargingOrderList.setStatus(tChargingOrder.getStatus());
+				Site site = siteClient.getSiteByIds(Arrays.asList(tChargingOrder.getSiteId())).getData().get(0);
+				myChargingOrderList.setTitle(site.getName());
+				myChargingOrderList.setChargingDegree(tChargingOrder.getChargingCapacity());
+				String name = chargingGunClient.getAllName(tChargingOrder.getChargingGunId()).getData();
+				myChargingOrderList.setName(name);
+				myChargingOrderList.setEndMode(tChargingOrder.getEndMode());
+				BigDecimal payMoney = tChargingOrder.getStatus() < 4 ? tChargingOrder.getRechargeAmount() : tChargingOrder.getPaymentAmount();
+				myChargingOrderList.setPayMoney(payMoney);
+				myChargingOrderList.setCreateTime(tChargingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+				chargingOrder.add(myChargingOrderList);
+			}
+			myOrderInvoiceInfo.setChargingOrder(chargingOrder);
+		}
+		//购物订单
+		if(orderType == 2){
+			List<TShoppingOrder> orderList = shoppingOrderService.listByIds(orderIds);
+			List<MyShoppingOrderList> shoppingOrder = new ArrayList<>();
+			for (TShoppingOrder tShoppingOrder : orderList) {
+				MyShoppingOrderList myShoppingOrderList = new MyShoppingOrderList();
+				myShoppingOrderList.setId(tShoppingOrder.getId().toString());
+				String name = "";
+				String imgUrl = "";
+				if(tShoppingOrder.getOrderType() == 1){
+					TGoods goods = goodsClient.getGoodsById(tShoppingOrder.getGoodsId()).getData();
+					name = goods.getName();
+					imgUrl = goods.getCoverPicture();
+				}else{
+					TCoupon coupon = couponClient.getCouponById1(tShoppingOrder.getGoodsId()).getData();
+					name = coupon.getName();
+					imgUrl = coupon.getCoverPicture();
+				}
+				myShoppingOrderList.setName(name);
+				myShoppingOrderList.setImgUrl(imgUrl);
+				myShoppingOrderList.setStatus(tShoppingOrder.getStatus());
+				BigDecimal unitPrice = tShoppingOrder.getPaymentAmount().divide(new BigDecimal(tShoppingOrder.getPurchaseQuantity())).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+				myShoppingOrderList.setUnitPrice(unitPrice);
+				myShoppingOrderList.setNumber(tShoppingOrder.getPurchaseQuantity());
+				myShoppingOrderList.setPaymentAmount(tShoppingOrder.getPaymentAmount());
+				shoppingOrder.add(myShoppingOrderList);
+			}
+			myOrderInvoiceInfo.setShoppingOrder(shoppingOrder);
+		}
+		return myOrderInvoiceInfo;
+	}
 }
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java
index ab1b1d6..b809d8f 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java
@@ -1,17 +1,31 @@
 package com.ruoyi.order.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.account.api.feignClient.AppUserAddressClient;
+import com.ruoyi.account.api.model.TAppUserAddress;
+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.TExchangeOrder;
 import com.ruoyi.order.api.model.TShoppingOrder;
 import com.ruoyi.order.api.query.TActivityStatisticsQuery;
 import com.ruoyi.order.api.vo.TActivityStatisticslVO;
 import com.ruoyi.order.api.vo.TActivityVO;
+import com.ruoyi.order.dto.*;
 import com.ruoyi.order.mapper.TShoppingOrderMapper;
 import com.ruoyi.order.service.TShoppingOrderService;
+import com.ruoyi.other.api.domain.TCoupon;
+import com.ruoyi.other.api.domain.TGoods;
+import com.ruoyi.other.api.feignClient.CouponClient;
+import com.ruoyi.other.api.feignClient.GoodsClient;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -24,6 +38,21 @@
  */
 @Service
 public class TShoppingOrderServiceImpl extends ServiceImpl<TShoppingOrderMapper, TShoppingOrder> implements TShoppingOrderService {
+    
+    @Resource
+    private TokenService tokenService;
+    
+    @Resource
+    private GoodsClient goodsClient;
+    
+    @Resource
+    private CouponClient couponClient;
+    
+    @Resource
+    private AppUserAddressClient appUserAddressClient;
+    
+    
+    
 
     @Override
     public TActivityVO activityStatistics(TActivityStatisticsQuery dto) {
@@ -121,4 +150,163 @@
         res.setGrantVip(grantVip);
         return res;
     }
+    
+    
+    /**
+     * 获取小程序商城购买订单列表
+     * @param query
+     * @return
+     */
+    @Override
+    public List<MyShoppingOrderList> getMyShoppingOrderList(GetMyShoppingOrderList query) {
+        Long userId = tokenService.getLoginUserApplet().getUserId();
+        LambdaQueryWrapper<TShoppingOrder> wrapper = new LambdaQueryWrapper<TShoppingOrder>().eq(TShoppingOrder::getDelFlag, 0)
+                .eq(TShoppingOrder::getAppUserId, userId);
+        if(query.getStatus() != 0){
+            wrapper.eq(TShoppingOrder::getStatus, query.getStatus());
+        }
+        List<TShoppingOrder> list = this.list(wrapper.orderByDesc(TShoppingOrder::getCreateTime).last(" limit " + query.getPageCurr() + ", " + query.getPageSize()));
+        List<MyShoppingOrderList> pageList = new ArrayList<>();
+        for (TShoppingOrder tShoppingOrder : list) {
+            MyShoppingOrderList myShoppingOrderList = new MyShoppingOrderList();
+            myShoppingOrderList.setId(tShoppingOrder.getId().toString());
+            String name = "";
+            String imgUrl = "";
+            if(tShoppingOrder.getOrderType() == 1){
+                TGoods goods = goodsClient.getGoodsById(tShoppingOrder.getGoodsId()).getData();
+                name = goods.getName();
+                imgUrl = goods.getCoverPicture();
+            }else{
+                TCoupon coupon = couponClient.getCouponById1(tShoppingOrder.getGoodsId()).getData();
+                name = coupon.getName();
+                imgUrl = coupon.getCoverPicture();
+            }
+            myShoppingOrderList.setName(name);
+            myShoppingOrderList.setImgUrl(imgUrl);
+            myShoppingOrderList.setStatus(tShoppingOrder.getStatus());
+            BigDecimal unitPrice = tShoppingOrder.getPaymentAmount().divide(new BigDecimal(tShoppingOrder.getPurchaseQuantity())).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+            myShoppingOrderList.setUnitPrice(unitPrice);
+            myShoppingOrderList.setNumber(tShoppingOrder.getPurchaseQuantity());
+            myShoppingOrderList.setPaymentAmount(tShoppingOrder.getPaymentAmount());
+            pageList.add(myShoppingOrderList);
+        }
+        return pageList;
+    }
+    
+    
+    /**
+     * 获取购买订单详情
+     * @param id
+     * @return
+     */
+    @Override
+    public MyShoppingOrderInfo getMyShoppingOrderInfo(String id) {
+        TShoppingOrder shoppingOrder = this.getById(id);
+        MyShoppingOrderInfo info = new MyShoppingOrderInfo();
+        info.setId(id);
+        info.setStatus(shoppingOrder.getStatus());
+        TAppUserAddress userAddress = appUserAddressClient.getAppUserAddressById(shoppingOrder.getAppUserAddressId()).getData();
+        info.setConsignee(userAddress.getName());
+        info.setPhone(userAddress.getPhone());
+        info.setAddress(userAddress.getAddress());
+        info.setExpressCompany(shoppingOrder.getExpressCompany());
+        info.setExpressNumber(shoppingOrder.getExpressNumber());
+        String name = "";
+        String imgUrl = "";
+        if(shoppingOrder.getOrderType() == 1){
+            TGoods goods = goodsClient.getGoodsById(shoppingOrder.getGoodsId()).getData();
+            name = goods.getName();
+            imgUrl = goods.getCoverPicture();
+        }else{
+            TCoupon coupon = couponClient.getCouponById1(shoppingOrder.getGoodsId()).getData();
+            info.setCouponType(coupon.getType());
+            info.setDays(coupon.getDays());
+            info.setEndTime(coupon.getEndTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            name = coupon.getName();
+            imgUrl = coupon.getCoverPicture();
+        }
+        info.setName(name);
+        info.setImgUrl(imgUrl);
+        info.setNumber(shoppingOrder.getPurchaseQuantity());
+        BigDecimal unitPrice = shoppingOrder.getPaymentAmount().divide(new BigDecimal(shoppingOrder.getPurchaseQuantity())).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+        info.setUnitPrice(unitPrice);
+        info.setCode(shoppingOrder.getCode());
+        info.setCreateTime(shoppingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        info.setPaymentAmount(shoppingOrder.getPaymentAmount());
+        info.setRemark(shoppingOrder.getRemark());
+        info.setDeliveryTime(shoppingOrder.getConsignerTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        info.setFinishTime(shoppingOrder.getReceivingTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+        return info;
+    }
+    
+    
+    /**
+     * 取消订单
+     * @param id
+     * @return
+     */
+    @Override
+    public AjaxResult cancelOrder(String id) {
+        TShoppingOrder shoppingOrder = this.getById(id);
+        if(shoppingOrder.getStatus() == 2){
+            return AjaxResult.error("订单已发货,不能取消");
+        }
+        if(shoppingOrder.getStatus() == 3){
+            return AjaxResult.error("订单已完成,不能取消");
+        }
+        if(shoppingOrder.getStatus() == 4){
+            return AjaxResult.error("订单已取消,不能重复操作");
+        }
+        //先查询第三方订单状态订单是否退款
+        //支付方式(1=微信,2=支付宝) todo 待完善
+        Integer paymentType = shoppingOrder.getPaymentType();
+        if(1 == paymentType){
+        
+        }
+        if(2 == paymentType){
+        
+        }
+        //退款成功后需要判断商品库存类型后决定是否需要回退库存
+        //加redis锁处理高并发
+        
+        
+        return AjaxResult.success();
+    }
+    
+    
+    /**
+     * 获取未开票的订单列表
+     * @param query
+     * @return
+     */
+    @Override
+    public List<MyShoppingOrderList> getNoInvoicedOrder(GetNoInvoicedOrder query) {
+        Long userId = tokenService.getLoginUserApplet().getUserId();
+        List<TShoppingOrder> list = this.baseMapper.getNoInvoicedOrder(userId, query.getMonth(), query.getPageCurr(), query.getPageSize());
+        List<MyShoppingOrderList> pageList = new ArrayList<>();
+        for (TShoppingOrder tShoppingOrder : list) {
+            MyShoppingOrderList myShoppingOrderList = new MyShoppingOrderList();
+            myShoppingOrderList.setId(tShoppingOrder.getId().toString());
+            String name = "";
+            String imgUrl = "";
+            if(tShoppingOrder.getOrderType() == 1){
+                TGoods goods = goodsClient.getGoodsById(tShoppingOrder.getGoodsId()).getData();
+                name = goods.getName();
+                imgUrl = goods.getCoverPicture();
+            }else{
+                TCoupon coupon = couponClient.getCouponById1(tShoppingOrder.getGoodsId()).getData();
+                name = coupon.getName();
+                imgUrl = coupon.getCoverPicture();
+            }
+            myShoppingOrderList.setName(name);
+            myShoppingOrderList.setImgUrl(imgUrl);
+            myShoppingOrderList.setStatus(tShoppingOrder.getStatus());
+            BigDecimal unitPrice = tShoppingOrder.getPaymentAmount().divide(new BigDecimal(tShoppingOrder.getPurchaseQuantity())).setScale(2, BigDecimal.ROUND_HALF_EVEN);
+            myShoppingOrderList.setUnitPrice(unitPrice);
+            myShoppingOrderList.setNumber(tShoppingOrder.getPurchaseQuantity());
+            myShoppingOrderList.setPaymentAmount(tShoppingOrder.getPaymentAmount());
+            pageList.add(myShoppingOrderList);
+        }
+        return pageList;
+    }
 }
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 418f126..20c1eb3 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
@@ -55,4 +55,18 @@
             limit #{pageCurr}, #{pageSize}
         </if>
     </select>
+    
+    
+    
+    <select id="getNoInvoicedOrder" resultMap="BaseResultMap">
+        select * from t_charging_order where del_flag = 0 and app_user_id = #{appUserId}
+        <if test="null != month and '' != month">
+            and DATE_FORMAT(end_time, '%Y-%m') = #{month}
+        </if>
+        and id not in (select order_id from t_order_invoice_detail where order_type = 1)
+        order by create_time desc
+        <if test="null != pageCurr and null != pageSize">
+            limit #{pageCurr}, #{pageSize}
+        </if>
+    </select>
 </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 b5c6c33..d7fddbe 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
@@ -9,6 +9,7 @@
         <result column="app_user_id" property="appUserId" />
         <result column="order_type" property="orderType" />
         <result column="invoicing_company" property="invoicingCompany" />
+        <result column="invoice_type_id" property="invoiceTypeId"/>
         <result column="invoice_type" property="invoiceType" />
         <result column="invoice_material" property="invoiceMaterial" />
         <result column="invoicing_method" property="invoicingMethod" />
@@ -23,11 +24,14 @@
         <result column="invoice_url" property="invoiceUrl" />
         <result column="mailbox" property="mailbox" />
         <result column="status" property="status" />
+        <result column="create_time" property="createTime" />
+        <result column="billing_time" property="billingTime" />
+        <result column="billing_user_id" property="billingUserId" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, code, app_user_id, order_type, invoicing_company, 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
+        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>
 
 </mapper>
diff --git a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TShoppingOrderMapper.xml b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TShoppingOrderMapper.xml
index f5636c2..b7b0d0b 100644
--- a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TShoppingOrderMapper.xml
+++ b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TShoppingOrderMapper.xml
@@ -204,5 +204,18 @@
             </if>
         </if>
     </select>
-
+    
+    
+    
+    <select id="getNoInvoicedOrder" resultMap="BaseResultMap">
+        select * from t_shopping_order where del_flag = 0 and app_user_id = #{appUserId}
+        <if test="null != month and '' != month">
+            and DATE_FORMAT(create_time, '%Y-%m') = #{month}
+        </if>
+        and id not in (select order_id from t_order_invoice_detail where order_type = 2)
+        order by create_time desc
+        <if test="null != pageCurr and null != pageSize">
+            limit #{pageCurr}, #{pageSize}
+        </if>
+    </select>
 </mapper>
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/config/DataSourceProxyConfig.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/config/DataSourceProxyConfig.java
deleted file mode 100644
index 5749262..0000000
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/config/DataSourceProxyConfig.java
+++ /dev/null
@@ -1,21 +0,0 @@
-//package com.ruoyi.other.config;
-//
-//import io.seata.rm.datasource.DataSourceProxy;
-//import org.springframework.context.annotation.Bean;
-//import org.springframework.context.annotation.Configuration;
-//
-//import javax.sql.DataSource;
-//
-///**
-// * @author zhibing.pu
-// * @date 2024/8/17 11:10
-// */
-//@Configuration
-//public class DataSourceProxyConfig {
-//
-//
-//    @Bean
-//    public DataSource dataSource(DataSource druidDataSource){
-//        return new DataSourceProxy(druidDataSource);
-//    }
-//}
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TActivityController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TActivityController.java
index 140d0d7..84e3376 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TActivityController.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TActivityController.java
@@ -50,6 +50,7 @@
         return AjaxResult.ok(activityService.getById(id));
     }
     @ApiOperation(tags = {"管理后台-活动管理","小程序-个人中心-活动列表"},value = "活动列表分页查询")
+
     @PostMapping(value = "/pageList")
     public AjaxResult<PageInfo<TActivity>> pageList(@RequestBody AdvertisingDTO dto) {
         return AjaxResult.ok(activityService.pageList(dto));
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TActivityStatisticsController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TActivityStatisticsController.java
index 43d551d..cf3a218 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TActivityStatisticsController.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TActivityStatisticsController.java
@@ -32,6 +32,9 @@
 public class TActivityStatisticsController {
     @Autowired
     private OrderClient orderClient;
+
+
+
     @ApiOperation(tags = {"管理后台-活动费用统计"},value = "管理后台活动费用统计")
     @PostMapping(value = "/pageList")
     public AjaxResult<TActivityVO> pageList(@RequestBody TActivityStatisticsQuery query) {
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TAdvertisingController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TAdvertisingController.java
index 7d2b0bd..57ed784 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TAdvertisingController.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TAdvertisingController.java
@@ -57,6 +57,9 @@
     public AjaxResult<TAdvertising> getInfo(Integer id) {
         return AjaxResult.ok(advertisingService.getById(id));
     }
+
+
+
     @ApiOperation(tags = {"管理后台-广告管理"},value = "广告列表分页查询")
     @PostMapping(value = "/pageList")
     public AjaxResult<PageInfo<TAdvertising>> pageList(@RequestBody AdvertisingDTO dto) {
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCouponController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCouponController.java
index eede80e..4dc48ac 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCouponController.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCouponController.java
@@ -45,24 +45,35 @@
 
     @Autowired
     private AppCouponClient appCouponClient;
+
+
     @PostMapping("/saveGoods")
     @ApiOperation(tags = {"管理后台-优惠券管理"},value = "优惠券添加")
     public AjaxResult saveActivity(@RequestBody TCoupon dto) {
         tCouponService.save(dto);
         return AjaxResult.success();
     }
+
+
+
     @GetMapping("/delete")
     @ApiOperation(tags = {"管理后台-优惠券管理"},value = "优惠券删除")
     public AjaxResult delete(Integer id) {
         tCouponService.removeById(id);
         return AjaxResult.success();
     }
+
+
+
     @PostMapping("/updateVip")
     @ApiOperation(tags = {"管理后台-优惠券管理"},value = "优惠券修改")
     public AjaxResult updateActivity(@RequestBody TCoupon dto) {
         tCouponService.updateById(dto);
         return AjaxResult.success();
     }
+
+
+
     @GetMapping("/getInfo")
     @ApiOperation(tags = {"管理后台-优惠券管理"},value = "优惠券查看详情")
     public AjaxResult<TCoupon> getInfo(Integer id) {
@@ -73,6 +84,9 @@
         byId.setUseCount(appCouponClient.getUseCountByCouponId(id).getData());
         return AjaxResult.ok(byId);
     }
+
+
+
     @PostMapping("/exchangeRecord")
     @ApiOperation(tags = {"管理后台-优惠券管理"},value = "优惠券查看详情-兑换记录")
     public AjaxResult<PageInfo<ExchangeRecordVO>> exchangeRecord(@RequestBody ExchangeRecordGoodsQuery dto) {
@@ -93,6 +107,9 @@
         }
         return AjaxResult.ok(data);
     }
+
+
+
     @ApiOperation(tags = {"管理后台-优惠券管理"},value = "发放优惠券")
     @GetMapping(value = "/grantCoupon")
     public AjaxResult grantCoupon(@RequestBody GrantCouponDto dto) {
@@ -111,6 +128,8 @@
         return AjaxResult.success();
     }
 
+
+
     @ApiOperation(tags = {"管理后台-优惠券管理"},value = "优惠券列表分页查询")
     @PostMapping(value = "/pageList")
     public AjaxResult<PageInfo<TCoupon>> pageList(@RequestBody CouponQuery dto) {
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TEnterpriseUserApplicationController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TEnterpriseUserApplicationController.java
index 113df1d..f612c11 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TEnterpriseUserApplicationController.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TEnterpriseUserApplicationController.java
@@ -48,6 +48,8 @@
         return AjaxResult.ok(enterpriseUserApplicationService.save(dto));
     }
 
+
+
     @ApiOperation(tags = {"后台-申请表单-集团用户"},value = "集团用户列表")
     @PostMapping(value = "/page")
     public AjaxResult<Boolean> page(@RequestBody TEnterpriseUserApplication dto) {
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java
index bea875b..29dd21b 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java
@@ -30,29 +30,45 @@
     private TGoodsService goodsService;
     @Autowired
     private TActivityService activityService;
+
+
+
+
     @PostMapping("/saveGoods")
     @ApiOperation(tags = {"管理后台-商品管理"},value = "商品添加")
     public AjaxResult saveActivity(@RequestBody TGoods dto) {
         goodsService.save(dto);
         return AjaxResult.success();
     }
+
+
+
     @GetMapping("/delete")
     @ApiOperation(tags = {"管理后台-商品管理"},value = "商品删除")
     public AjaxResult delete(Integer id) {
         goodsService.removeById(id);
         return AjaxResult.success();
     }
+
+
+
     @PostMapping("/updateVip")
     @ApiOperation(tags = {"管理后台-商品管理"},value = "商品修改")
     public AjaxResult updateActivity(@RequestBody TGoods dto) {
         goodsService.updateById(dto);
         return AjaxResult.success();
     }
+
+
+
     @GetMapping("/getInfo")
     @ApiOperation(tags = {"管理后台-商品管理"},value = "商品查看详情")
     public AjaxResult<TGoods> getInfo(Integer id) {
         return AjaxResult.ok(goodsService.getById(id));
     }
+
+
+
     @ApiOperation(tags = {"管理后台-商品管理"},value = "商品列表分页查询")
     @PostMapping(value = "/pageList")
     public AjaxResult<PageInfo<TGoods>> pageList(@RequestBody GoodsDTO dto) {
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/THtmlController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/THtmlController.java
index 46b995a..35e15af 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/THtmlController.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/THtmlController.java
@@ -23,6 +23,9 @@
 public class THtmlController {
     @Resource
     private THtmlService htmlService;
+
+
+
     @ApiOperation(tags = {"后台-内容设置-协议服务"},value = "新增修改")
     @PostMapping(value = "/saveOrUpdate")
     public AjaxResult saveOrUpdate(@RequestBody THtml tHtml) {
@@ -31,7 +34,7 @@
     }
 
     @ApiOperation(tags = {"后台-内容设置-协议服务"},value = "查询")
-    @PostMapping(value = "/selectByType/{type}")
+    @GetMapping(value = "/selectByType/{type}")
     public AjaxResult selectByType(@PathVariable Integer type) {
         THtml one = htmlService.lambdaQuery().eq(THtml::getType, type).last("limit 1").one();
         return AjaxResult.success(one);
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TIntegralRuleController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TIntegralRuleController.java
index b19e461..5027933 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TIntegralRuleController.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TIntegralRuleController.java
@@ -67,6 +67,9 @@
         }
         return R.ok(g.getContent());
     }
+
+
+
     @GetMapping("/saveInfo")
     @ApiOperation(tags = {"管理后台-积分管理"},value = "保存积分说明")
     @ApiImplicitParams({
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TInvoiceTypeController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TInvoiceTypeController.java
index 9eacc23..f69c779 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TInvoiceTypeController.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TInvoiceTypeController.java
@@ -1,6 +1,8 @@
 package com.ruoyi.other.controller;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.web.domain.AjaxResult;
 import com.ruoyi.common.core.web.page.PageInfo;
 import com.ruoyi.other.api.domain.TInvoiceType;
@@ -67,12 +69,36 @@
 	@ResponseBody
 	@DeleteMapping("/delInvoiceType")
 	@ApiOperation(value = "删除发票类型", tags = {"管理后台-发票类型管理"})
-	public AjaxResult<TInvoiceType> delInvoiceType(@RequestParam("id") Integer[] id){
+	public AjaxResult<TInvoiceType> delInvoiceType(Integer[] id){
 		List<TInvoiceType> tInvoiceTypes = invoiceTypeService.listByIds(Arrays.asList(id));
 		for (TInvoiceType invoiceType : tInvoiceTypes) {
 			invoiceTypeService.removeById(invoiceType);
 		}
 		return AjaxResult.success();
 	}
+	
+	
+	
+	@ResponseBody
+	@DeleteMapping("/getInvoiceTypeList")
+	@ApiOperation(value = "获取开票类型", tags = {"小程序-充电发票"})
+	public AjaxResult<List<TInvoiceType>> getInvoiceTypeList(){
+		List<TInvoiceType> list = invoiceTypeService.list(new LambdaQueryWrapper<TInvoiceType>()
+				.eq(TInvoiceType::getDelFlag, 0).orderByAsc(TInvoiceType::getCreateTime));
+		return AjaxResult.success(list);
+	}
+	
+	
+	/**
+	 * 根据id获取发票类型
+	 * @param id
+	 * @return
+	 */
+	@ResponseBody
+	@PostMapping("/getInvoiceType/{id}")
+	public R<TInvoiceType> getInvoiceType(@PathVariable Integer id){
+		TInvoiceType invoiceType = invoiceTypeService.getById(id);
+		return R.ok(invoiceType);
+	}
 }
 
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TNoticeController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TNoticeController.java
index 06838a6..de7171d 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TNoticeController.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TNoticeController.java
@@ -35,15 +35,27 @@
     }
 
     @ApiOperation(tags = {"后台-内容设置-公告管理"},value = "删除")
-    @PostMapping(value = "/deleteById/{id}")
-    public AjaxResult deleteById(@PathVariable Integer id) {
-        noticeService.removeById(id);
+    @DeleteMapping(value = "/deleteById")
+    public AjaxResult deleteById(String ids) {
+        String[] split = ids.split(",");
+        for (String id : split) {
+            noticeService.removeById(id);
+        }
+
         return AjaxResult.success();
     }
 
     @ApiOperation(tags = {"后台-内容设置-公告管理"},value = "查询")
     @PostMapping(value = "/pageList")
     public AjaxResult<Page<TNotice>> authPageList(@RequestBody NoticeQueryDto query) {
+        if (query.getStatus()==null){
+
+                return AjaxResult.success(noticeService.lambdaQuery()
+                        .like(query.getContent()!=null&&query.getContent()!="",TNotice::getContent,query.getContent())
+                        .page(Page.of(query.getPageCurr(),query.getPageSize())));
+
+        }
+
             if (query.getStatus()==0){
                 return AjaxResult.success(noticeService.lambdaQuery()
                         .le(TNotice::getStartTime, LocalDateTime.now())
diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TSystemConfigurationController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TSystemConfigurationController.java
index f63f4a5..6b2b408 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TSystemConfigurationController.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TSystemConfigurationController.java
@@ -34,13 +34,15 @@
      */
     @ApiOperation(tags = {"小程序-系统设置","后台-内容设置"},value = "联系客服,查询设置")
     @GetMapping(value = "/getDetailById")
-    public AjaxResult<TSystemConfiguration> getDetailById(@RequestParam(name = "type")@ApiParam(value = "1=客服信息,2=系统设置") Integer type) {
+    public AjaxResult<TSystemConfiguration> getDetailById(@RequestParam("type")@ApiParam(value = "1=客服信息,2=系统设置") Integer type) {
         return AjaxResult.ok(systemConfigurationService.getOne(Wrappers.lambdaQuery(TSystemConfiguration.class)
                 .eq(TSystemConfiguration::getType, type)));
     }
 
+
+
     @ApiOperation(tags = {"后台-内容设置"},value = "客户信息,系统内容设置")
-    @GetMapping(value = "/save")
+    @PostMapping(value = "/save")
     public AjaxResult getDetailById(@RequestBody TSystemConfiguration systemConfiguration) {
         systemConfigurationService.saveOrUpdate(systemConfiguration);
         return AjaxResult.success();
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 a460fb0..b02586b 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
@@ -6,6 +6,7 @@
 import com.ruoyi.account.api.dto.SendCouponDto;
 import com.ruoyi.common.core.domain.R;
 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.other.api.domain.TCoupon;
 import com.ruoyi.other.api.domain.TIntegralRule;
@@ -84,22 +85,18 @@
     public R<TVip> getInfo1(@RequestParam("id")Integer id) {
         return R.ok(vipService.getById(id));
     }
+
+
+
+
     @ApiOperation(tags = {"管理后台-会员管理"},value = "会员列表分页查询")
     @PostMapping(value = "/pageList")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "pageCurr", value = "分页参数,当前页码", required = true),
-            @ApiImplicitParam(name = "pageSize", value = "分页参数,每页数量",required = true)
-    })
-    public AjaxResult<PageInfo<TVip>> pageList(Integer pageCurr,Integer pageSize) {
-        return AjaxResult.ok(vipService.pageList(pageCurr,pageSize));
+    public AjaxResult<PageInfo<TVip>> pageList(@RequestBody BasePage basePage) {
+        return AjaxResult.ok(vipService.pageList(basePage.getPageCurr(), basePage.getPageSize()));
     }
 
     @ApiOperation(tags = {"会员下拉框"},value = "会员列表分页查询")
-    @PostMapping(value = "/select")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "pageCurr", value = "分页参数,当前页码", required = true),
-            @ApiImplicitParam(name = "pageSize", value = "分页参数,每页数量",required = true)
-    })
+    @GetMapping(value = "/select")
     public AjaxResult<List<TVip>> select() {
         return AjaxResult.ok(vipService.list());
     }
diff --git a/ruoyi-service/ruoyi-other/src/main/resources/bootstrap.yml b/ruoyi-service/ruoyi-other/src/main/resources/bootstrap.yml
index 0976d0b..887402d 100644
--- a/ruoyi-service/ruoyi-other/src/main/resources/bootstrap.yml
+++ b/ruoyi-service/ruoyi-other/src/main/resources/bootstrap.yml
@@ -42,7 +42,7 @@
   enabled: true
   application-id: ${spring.application.name}
   tx-service-group: seata_tx_group    #此处配置自定义的seata事务分组名称
-  enable-auto-data-source-proxy: true    #关闭数据库代理
+  enable-auto-data-source-proxy: false    #关闭数据库代理
   service:
     vgroup-mapping:
       seata_tx_group: default
diff --git a/ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TUserTagMapper.xml b/ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TUserTagMapper.xml
index 16399de..7ce0890 100644
--- a/ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TUserTagMapper.xml
+++ b/ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TUserTagMapper.xml
@@ -7,14 +7,14 @@
         <id column="id" property="id" />
         <result column="name" property="name" />
         <result column="standard_condition" property="standardCondition" />
-        <result column="condition" property="condition" />
+        <result column="conditions" property="conditions" />
         <result column="create_time" property="createTime" />
         <result column="del_flag" property="delFlag" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, name, standard_condition, condition, create_time, del_flag
+        id, name, standard_condition, conditions, create_time, del_flag
     </sql>
 
 </mapper>

--
Gitblit v1.7.1