xuhy
2024-09-25 ca825fdfe67223b2eb8a3f9c14b4e60e2339efc6
Merge remote-tracking branch 'origin/master'

# Conflicts:
# ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingGunServiceImpl.java
69个文件已修改
4个文件已删除
4个文件已添加
2495 ■■■■■ 已修改文件
ruoyi-api/ruoyi-api-account/pom.xml 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/AppUserInfoDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserVipDetailFallbackFactory.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUser.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserVipDetail.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/pom.xml 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyDetailFallbackFactory.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyFallbackFactory.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingGunFallbackFactory.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/GunStatusStatisticsVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/pom.xml 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/SendMessageFallbackFactory.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/pom.xml 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/AccountingStrategyOrder.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/pom.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/CouponFallbackFactory.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/GoodsFallbackFactory.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/InvoiceTypeFallbackFactory.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/OtherFallbackFactory.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/UserSiteFallbackFactory.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/OtherClient.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-payment/pom.xml 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/factory/AliPaymentFallbackFactory.java 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/factory/WxPaymentFallbackFactory.java 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/pom.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserFallbackFactory.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/resources/bootstrap.yml 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/handler/GlobalExceptionHandler.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/pom.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/AntiShakeProperties.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/SignProperties.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/SignFilter.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-gateway/src/main/resources/bootstrap.yml 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/RuoYiSystemApplication.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/filter/AuthFilter.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/pom.xml 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/pom.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WxLoginController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/filter/AuthFilter.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/GiveVipUtil.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/resources/bootstrap.yml 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/RuoYiChargingPileApplication.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/filter/AuthFilter.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TChargingGunMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/PartnerServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingGunServiceImpl.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/resources/bootstrap.yml 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TChargingGunMapper.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/resources/bootstrap.yml 51 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TVipOrderController.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/TEnterpriseExport.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/filter/AuthFilter.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 131 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderEvaluateServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/bootstrap.yml 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/pom.xml 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TEnterpriseUserApplicationController.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/filter/AuthFilter.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/bootstrap.yml 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/resources/template/集团用户数据.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/ali/v2/AppletPayUtil.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/wx/model/V3.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/wx/model/WeixinProperties.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/wx/utils/WxAbstractPay.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/wx/utils/WxV3Pay.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-payment/src/main/resources/bootstrap.yml 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/quartz.sql 174 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/ry_20230223.sql 695 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/ry_config_20220929.sql 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/ry_seata_20210128.sql 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/pom.xml
@@ -28,7 +28,10 @@
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
        </dependency>
    </dependencies>
</project>
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/AppUserInfoDto.java
@@ -1,5 +1,6 @@
package com.ruoyi.account.api.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.account.api.model.TAppUserCar;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
@@ -16,6 +17,7 @@
    @ApiModelProperty("最低会员价格")
    private BigDecimal minPrice;
    @ApiModelProperty("vip结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDateTime vipExpireTime;
    @ApiModelProperty("当天是否签到")
    private Integer isSign;
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java
@@ -7,6 +7,8 @@
import com.ruoyi.account.api.model.TAppUserAddress;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.dto.PointChangeDto;
import io.seata.core.exception.TransactionException;
import io.seata.tm.api.GlobalTransactionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
@@ -36,7 +38,13 @@
    
            @Override
            public R<TAppUser> getUserById(Long id) {
                throw new RuntimeException("根据id查询用户失败:"+throwable.getMessage());
                // 手动进行全局事务回滚
                try {
                    GlobalTransactionContext.getCurrent().rollback();
                } catch (TransactionException e) {
                    throw new RuntimeException(e);
                }
                return R.fail("根据id查询用户失败:"+throwable.getMessage());
            }
            @Override
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserVipDetailFallbackFactory.java
@@ -4,6 +4,8 @@
import com.ruoyi.account.api.model.TAppUserVipDetail;
import com.ruoyi.account.api.vo.GetAppUserVipDetail;
import com.ruoyi.common.core.domain.R;
import io.seata.core.exception.TransactionException;
import io.seata.tm.api.GlobalTransactionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
@@ -26,12 +28,24 @@
    
            @Override
            public R<TAppUserVipDetail> getAppUserVipDetail(GetAppUserVipDetail getAppUserVipDetail) {
                throw new RuntimeException("获取用户当前有效的VIP明细调用失败:" + throwable.getMessage());
                // 手动进行全局事务回滚
                try {
                    GlobalTransactionContext.getCurrent().rollback();
                } catch (TransactionException e) {
                    throw new RuntimeException(e);
                }
                return R.fail("获取用户当前有效的VIP明细调用失败:" + throwable.getMessage());
            }
    
            @Override
            public void updateAppUserVipDetail(TAppUserVipDetail appUserVipDetail) {
                throw new RuntimeException(throwable.getMessage());
                // 手动进行全局事务回滚
                try {
                    GlobalTransactionContext.getCurrent().rollback();
                } catch (TransactionException e) {
                    throw new RuntimeException(e);
                }
                R.fail(throwable.getMessage());
            }
        };
    }
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUser.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.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.web.domain.BasePojo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -53,7 +54,9 @@
    private Integer vipId;
    @ApiModelProperty(value = "会员到期时间")
    @TableField("vip_end_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime vipEndTime;
    @ApiModelProperty(value = "单位id")
@@ -123,6 +126,10 @@
    @ApiModelProperty(value = "标签名称")
    @TableField(exist = false)
    private String tagName;
    @ApiModelProperty(value = "单位名称")
    @TableField(exist = false)
    private String companyName;
    @ApiModelProperty(value = "vip名称")
    @TableField(exist = false)
    private String vipName;
@@ -136,9 +143,7 @@
    @ApiModelProperty("剩余天数")
    @TableField(exist = false)
    private Long lastDays;
    @ApiModelProperty(value = "单位名称")
    @TableField(exist = false)
    private String companyName;
}
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserVipDetail.java
@@ -73,7 +73,9 @@
    @TableField("send_month")
    private Integer sendMonth;
    @ApiModelProperty(value = "当时购买的vipJson")
    @TableField("vip_json")
    private String vipJson;
    @ApiModelProperty(value = "要赠送的优惠卷")
    @TableField("coupon_ids")
    private String couponIds;
ruoyi-api/ruoyi-api-chargingPile/pom.xml
@@ -28,7 +28,10 @@
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
        </dependency>
    </dependencies>
</project>
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyDetailFallbackFactory.java
@@ -4,6 +4,8 @@
import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyDetailClient;
import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
import com.ruoyi.common.core.domain.R;
import io.seata.core.exception.TransactionException;
import io.seata.tm.api.GlobalTransactionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
@@ -42,7 +44,13 @@
            
            @Override
            public R<List<TAccountingStrategyDetail>> getListByAccountingStrategyId(Integer id) {
                throw new RuntimeException("根据计费策略主表id策略明细失败:" + throwable.getMessage());
                // 手动进行全局事务回滚
                try {
                    GlobalTransactionContext.getCurrent().rollback();
                } catch (TransactionException e) {
                    throw new RuntimeException(e);
                }
                return R.fail("根据计费策略主表id策略明细失败:" + throwable.getMessage());
            }
            @Override
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyFallbackFactory.java
@@ -3,6 +3,8 @@
import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyClient;
import com.ruoyi.chargingPile.api.model.TAccountingStrategy;
import com.ruoyi.common.core.domain.R;
import io.seata.core.exception.TransactionException;
import io.seata.tm.api.GlobalTransactionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
@@ -25,7 +27,13 @@
            
            @Override
            public R<TAccountingStrategy> getAccountingStrategyById(Integer id) {
                throw new RuntimeException("根据id查询计费策略失败:" + throwable.getMessage());
                // 手动进行全局事务回滚
                try {
                    GlobalTransactionContext.getCurrent().rollback();
                } catch (TransactionException e) {
                    throw new RuntimeException(e);
                }
                return R.fail("根据id查询计费策略失败:" + throwable.getMessage());
            }
        };
    }
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingGunFallbackFactory.java
@@ -7,6 +7,8 @@
import com.ruoyi.chargingPile.api.model.TFaultMessage;
import com.ruoyi.chargingPile.api.vo.SiteNameVO;
import com.ruoyi.common.core.domain.R;
import io.seata.core.exception.TransactionException;
import io.seata.tm.api.GlobalTransactionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
@@ -36,7 +38,13 @@
    
            @Override
            public R<TChargingGun> getChargingGunById(Integer id) {
                throw new RuntimeException("根据id获取充电枪失败:" + throwable.getMessage());
                // 手动进行全局事务回滚
                try {
                    GlobalTransactionContext.getCurrent().rollback();
                } catch (TransactionException e) {
                    throw new RuntimeException(e);
                }
                return R.fail("根据id获取充电枪失败:" + throwable.getMessage());
            }
            @Override
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/GunStatusStatisticsVO.java
@@ -13,7 +13,7 @@
public class GunStatusStatisticsVO implements Serializable {
    @ApiModelProperty(value = "充电桩类型统计 key:充电模式(1=超级快充,2=快充,3=慢充)")
    private Map<Integer,Integer> modeStatistics;
    private List<Map<Integer,Integer>> modeStatistics;
    @ApiModelProperty(value = "状态统计 key:充电模式(1=离线,2=故障,3=充电中)")
    private Map<Integer,Integer> statusStatistics;
    @ApiModelProperty(value = "状态统计根据类型分组")
ruoyi-api/ruoyi-api-integration/pom.xml
@@ -32,7 +32,10 @@
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
        </dependency>
    </dependencies>
</project>
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/SendMessageFallbackFactory.java
@@ -6,6 +6,8 @@
import com.ruoyi.integration.api.model.ChargingHandshake;
import com.ruoyi.integration.api.model.PlatformStartCharging;
import com.ruoyi.integration.api.model.PlatformStopCharging;
import io.seata.core.exception.TransactionException;
import io.seata.tm.api.GlobalTransactionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
@@ -29,12 +31,24 @@
    
            @Override
            public String platformStartCharging(PlatformStartCharging platformStartCharging) {
                throw new RuntimeException("远程启机失败" + throwable.getMessage());
                // 手动进行全局事务回滚
                try {
                    GlobalTransactionContext.getCurrent().rollback();
                } catch (TransactionException e) {
                    throw new RuntimeException(e);
                }
                return "远程启机失败";
            }
    
            @Override
            public String platformStopCharging(PlatformStopCharging platformStopCharging) {
                throw new RuntimeException("远程停机失败" + throwable.getMessage());
                // 手动进行全局事务回滚
                try {
                    GlobalTransactionContext.getCurrent().rollback();
                } catch (TransactionException e) {
                    throw new RuntimeException(e);
                }
                return "远程停机失败";
            }
        };
    }
ruoyi-api/ruoyi-api-order/pom.xml
@@ -32,7 +32,10 @@
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-api-other</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
        </dependency>
    </dependencies>
</project>
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/AccountingStrategyOrder.java
@@ -21,10 +21,6 @@
@TableName("t_accounting_strategy_order")
public class AccountingStrategyOrder extends BasePojo {
    
    @ApiModelProperty(value = "主键")
    @TableField(value = "id")
    private Integer id;
    @ApiModelProperty(value = "站点id")
    @TableField("site_id")
    private Integer siteId;
ruoyi-api/ruoyi-api-other/pom.xml
@@ -32,6 +32,10 @@
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-api-account</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
        </dependency>
    </dependencies>
</project>
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/CouponFallbackFactory.java
@@ -5,6 +5,8 @@
import com.ruoyi.other.api.domain.TGoods;
import com.ruoyi.other.api.feignClient.CouponClient;
import com.ruoyi.other.api.feignClient.GoodsClient;
import io.seata.core.exception.TransactionException;
import io.seata.tm.api.GlobalTransactionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
@@ -38,7 +40,13 @@
            
            @Override
            public R updateCoupon(TCoupon coupon) {
                throw new RuntimeException("修改优惠券失败");
                // 手动进行全局事务回滚
                try {
                    GlobalTransactionContext.getCurrent().rollback();
                } catch (TransactionException e) {
                    throw new RuntimeException(e);
                }
                return R.fail("修改优惠券失败");
            }
        };
    }
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/GoodsFallbackFactory.java
@@ -3,6 +3,8 @@
import com.ruoyi.common.core.domain.R;
import com.ruoyi.other.api.domain.TGoods;
import com.ruoyi.other.api.feignClient.GoodsClient;
import io.seata.core.exception.TransactionException;
import io.seata.tm.api.GlobalTransactionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
@@ -36,7 +38,13 @@
            
            @Override
            public R updateGoods(TGoods goods) {
                throw new RuntimeException("修改商品异常");
                // 手动进行全局事务回滚
                try {
                    GlobalTransactionContext.getCurrent().rollback();
                } catch (TransactionException e) {
                    throw new RuntimeException(e);
                }
                return R.fail("修改商品异常");
            }
        };
    }
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/InvoiceTypeFallbackFactory.java
@@ -3,6 +3,8 @@
import com.ruoyi.common.core.domain.R;
import com.ruoyi.other.api.domain.TInvoiceType;
import com.ruoyi.other.api.feignClient.InvoiceTypeClient;
import io.seata.core.exception.TransactionException;
import io.seata.tm.api.GlobalTransactionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
@@ -27,7 +29,13 @@
    
            @Override
            public R<TInvoiceType> getInvoiceType(Integer id) {
                throw new RuntimeException(throwable.getMessage());
                // 手动进行全局事务回滚
                try {
                    GlobalTransactionContext.getCurrent().rollback();
                } catch (TransactionException e) {
                    throw new RuntimeException(e);
                }
                return R.fail(throwable.getMessage());
            }
        };
    }
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/OtherFallbackFactory.java
@@ -4,6 +4,7 @@
import com.ruoyi.common.core.domain.R;
import com.ruoyi.other.api.domain.TCompany;
import com.ruoyi.other.api.domain.TCoupon;
import com.ruoyi.other.api.domain.TEnterpriseUserApplication;
import com.ruoyi.other.api.domain.TUserTag;
import com.ruoyi.other.api.dto.TagListQueryDto;
import com.ruoyi.other.api.dto.UnitListQueryDto;
@@ -91,6 +92,11 @@
            public R<TCoupon> getCouponById(Integer id) {
                return R.fail("查询优惠卷:"+throwable.getMessage());
            }
            @Override
            public R<List<TEnterpriseUserApplication>> getTnterPrise() {
                return R.fail("查询:"+throwable.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/UserSiteFallbackFactory.java
@@ -3,6 +3,8 @@
import com.ruoyi.common.core.domain.R;
import com.ruoyi.other.api.domain.TUserSite;
import com.ruoyi.other.api.feignClient.UserSiteClient;
import io.seata.core.exception.TransactionException;
import io.seata.tm.api.GlobalTransactionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
@@ -31,12 +33,24 @@
    
            @Override
            public R addUserSite(List<TUserSite> userSite) {
                throw new RuntimeException("添加用户站点失败:" + throwable.getMessage());
                // 手动进行全局事务回滚
                try {
                    GlobalTransactionContext.getCurrent().rollback();
                } catch (TransactionException e) {
                    throw new RuntimeException(e);
                }
                return R.fail("添加用户站点失败:" + throwable.getMessage());
            }
    
            @Override
            public R delUserSite(Long userId) {
                throw new RuntimeException("删除用户站点失败:" + throwable.getMessage());
                // 手动进行全局事务回滚
                try {
                    GlobalTransactionContext.getCurrent().rollback();
                } catch (TransactionException e) {
                    throw new RuntimeException(e);
                }
                return R.fail("删除用户站点失败:" + throwable.getMessage());
            }
        };
    }
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/OtherClient.java
@@ -3,19 +3,13 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.other.api.domain.TCompany;
import com.ruoyi.other.api.domain.TCoupon;
import com.ruoyi.other.api.domain.TInvoiceType;
import com.ruoyi.other.api.domain.TUserTag;
import com.ruoyi.other.api.domain.*;
import com.ruoyi.other.api.dto.TagListQueryDto;
import com.ruoyi.other.api.dto.UnitListQueryDto;
import com.ruoyi.other.api.factory.OtherFallbackFactory;
import com.ruoyi.other.api.vo.CouponListVOVO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@@ -71,12 +65,6 @@
    @PostMapping(value = "/t-coupon/getCouponById")
    R<TCoupon> getCouponById(@RequestParam("id") Integer id);
    @PutMapping(value = "/t-enterprise-user-application/export")
    R<List<TEnterpriseUserApplication>> getTnterPrise();
}
ruoyi-api/ruoyi-api-payment/pom.xml
@@ -28,7 +28,10 @@
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
        </dependency>
    </dependencies>
</project>
ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/factory/AliPaymentFallbackFactory.java
@@ -7,6 +7,8 @@
import com.ruoyi.payment.api.vo.AliPaymentReq;
import com.ruoyi.payment.api.vo.AliPaymentResp;
import com.ruoyi.payment.api.vo.AliQueryOrder;
import io.seata.core.exception.TransactionException;
import io.seata.tm.api.GlobalTransactionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
@@ -30,22 +32,46 @@
    
            @Override
            public R<AliPaymentResp> payment(AliPaymentReq req) {
                throw new RuntimeException("调起支付宝小程序支付失败:" + throwable.getMessage());
                // 手动进行全局事务回滚
                try {
                    GlobalTransactionContext.getCurrent().rollback();
                } catch (TransactionException e) {
                    throw new RuntimeException(e);
                }
                return R.fail("调起支付宝小程序支付失败:" + throwable.getMessage());
            }
    
            @Override
            public R<AliQueryOrder> query(String outTradeNo) {
                throw new RuntimeException("查询支付订单失败:" + throwable.getMessage());
                // 手动进行全局事务回滚
                try {
                    GlobalTransactionContext.getCurrent().rollback();
                } catch (TransactionException e) {
                    throw new RuntimeException(e);
                }
                return R.fail("查询支付订单失败:" + throwable.getMessage());
            }
    
            @Override
            public void close(String outTradeNo) {
                throw new RuntimeException("关闭支付订单失败:" + throwable.getMessage());
                // 手动进行全局事务回滚
                try {
                    GlobalTransactionContext.getCurrent().rollback();
                } catch (TransactionException e) {
                    throw new RuntimeException(e);
                }
                R.fail("关闭支付订单失败:" + throwable.getMessage());
            }
            @Override
            public R<RefundResp> refund(RefundReq dto) {
                throw new RuntimeException("支付宝退款失败:" + throwable.getMessage());
                // 手动进行全局事务回滚
                try {
                    GlobalTransactionContext.getCurrent().rollback();
                } catch (TransactionException e) {
                    throw new RuntimeException(e);
                }
                return R.fail("支付宝退款失败:" + throwable.getMessage());
            }
        };
    }
ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/factory/WxPaymentFallbackFactory.java
@@ -6,6 +6,8 @@
import com.ruoyi.payment.api.vo.NotifyV3PayDecodeRespBody;
import com.ruoyi.payment.api.vo.PaymentOrder;
import com.ruoyi.payment.api.vo.WxRefundNotifyResp;
import io.seata.core.exception.TransactionException;
import io.seata.tm.api.GlobalTransactionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
@@ -31,12 +33,24 @@
    
            @Override
            public R<NotifyV3PayDecodeRespBody> queryOrderInfo(String orderId) {
                throw new RuntimeException("查询支付订单信息失败:" + throwable.getMessage());
                // 手动进行全局事务回滚
                try {
                    GlobalTransactionContext.getCurrent().rollback();
                } catch (TransactionException e) {
                    throw new RuntimeException(e);
                }
                return R.fail("查询支付订单信息失败:" + throwable.getMessage());
            }
    
            @Override
            public R<Map<String, Object>> orderPay(PaymentOrder paymentOrder) {
                throw new RuntimeException("调起微信支付失败:" + throwable.getMessage());
                // 手动进行全局事务回滚
                try {
                    GlobalTransactionContext.getCurrent().rollback();
                } catch (TransactionException e) {
                    throw new RuntimeException(e);
                }
                return R.fail("调起微信支付失败:" + throwable.getMessage());
            }
    
            @Override
@@ -51,13 +65,24 @@
            @Override
            public void close(String outTradeNo) {
                throw new RuntimeException("关闭支付订单失败:" + throwable.getMessage());
                // 手动进行全局事务回滚
                try {
                    GlobalTransactionContext.getCurrent().rollback();
                } catch (TransactionException e) {
                    throw new RuntimeException(e);
                }
                R.fail("关闭支付订单失败:" + throwable.getMessage());
            }
            @Override
            public R<String> refundOrderR(WxPaymentRefundModel model) {
                // 手动进行全局事务回滚
                try {
                    GlobalTransactionContext.getCurrent().rollback();
                } catch (TransactionException e) {
                    throw new RuntimeException(e);
                }
                return R.fail("微信退款失败:" + throwable.getMessage());
            }
    
            @Override
ruoyi-api/ruoyi-api-system/pom.xml
@@ -28,6 +28,10 @@
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
        </dependency>
    </dependencies>
</project>
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserFallbackFactory.java
@@ -5,6 +5,8 @@
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.feignClient.SysUserClient;
import com.ruoyi.system.api.model.*;
import io.seata.core.exception.TransactionException;
import io.seata.tm.api.GlobalTransactionContext;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
@@ -27,7 +29,13 @@
            @Override
            public R<Boolean> updateSysUser(SysUser sysUser) {
                throw new RuntimeException("更新用户失败:" + cause.getMessage());
                // 手动进行全局事务回滚
                try {
                    GlobalTransactionContext.getCurrent().rollback();
                } catch (TransactionException e) {
                    throw new RuntimeException(e);
                }
                return R.fail("更新用户失败:" + cause.getMessage());
            }
            @Override
@@ -92,12 +100,18 @@
    
            @Override
            public R addSysUser(SysUser user) {
                throw new RuntimeException("添加用户失败:" + cause.getMessage());
                return R.fail("添加用户失败:" + cause.getMessage());
            }
            @Override
            public R resetPassword(SysUser user) {
                throw new RuntimeException("重置用户密码失败:" + cause.getMessage());
                // 手动进行全局事务回滚
                try {
                    GlobalTransactionContext.getCurrent().rollback();
                } catch (TransactionException e) {
                    throw new RuntimeException(e);
                }
                return R.fail("重置用户密码失败:" + cause.getMessage());
            }
        };
    }
ruoyi-auth/src/main/resources/bootstrap.yml
@@ -1,3 +1,7 @@
server:
  port: 9100
  tomcat:
    basedir: /data/tomcat
# Spring
spring:
  profiles:
@@ -8,6 +12,7 @@
    name: ruoyi-auth
  main:
    allow-bean-definition-overriding: true
    allow-circular-references: true
---
spring:
  config:
@@ -36,9 +41,7 @@
        # 共享配置
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
---
seata:
  enabled: true
  application-id: ${spring.application.name}
@@ -51,36 +54,57 @@
  config:
    type: nacos
    nacos:
      # 开发环境
      server-addr: 192.168.110.169:8848
      namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
      group: DEFAULT_GROUP
      data-id: seata-server.properties
      username: nacos
      password: nacos
      # 生产环境
#      server-addr: 192.168.0.137:8848,192.168.0.123:8848
#      namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
#      group: DEFAULT_GROUP
#      data-id: seata-server.properties
#      username: nacos
#      password: nacos
  registry:
    type: nacos
    nacos:
      application: seata-server
      # 开发环境
      server-addr: 192.168.110.169:8848
      namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
      group: DEFAULT_GROUP
      username: nacos
      password: nacos
      # 生产环境
#      server-addr: 192.168.0.137:8848,192.168.0.123:8848
#      namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
#      group: DEFAULT_GROUP
#      username: nacos
#      password: nacos
  cloud:
    nacos:
      discovery:
        # 开发环境
        server-addr: 192.168.110.169:8848 # nacos注册中心地址
        namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb # 命名空间
        group: DEFAULT_GROUP
        application: seata-server #Nacos 中 Seata 名称
        username: nacos
        password: nacos
        # 生产环境
#        server-addr: 192.168.0.137:8848,192.168.0.123:8848
#        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
#        group: DEFAULT_GROUP
#        application: seata-server #Nacos 中 Seata 名称
#        username: nacos
#        password: nacos
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080  #  Sentinel控制台地址
      eager: true
---
spring:
  config:
@@ -90,14 +114,18 @@
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 127.0.0.1:8848
        server-addr: 192.168.0.137:8848,192.168.0.123:8848
        service: ${spring.application.name}
        group: DEFAULT_GROUP
        namespace: 3452d750-b08d-4485-a1e9-4fb0548f1fc2
        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
        username: nacos
        password: nacos
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        namespace: 3452d750-b08d-4485-a1e9-4fb0548f1fc2
        server-addr: 192.168.0.137:8848,192.168.0.123:8848
        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
        username: nacos
        password: nacos
        group: DEFAULT_GROUP
        name: ${spring.application.name}
        # 配置文件格式
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/handler/GlobalExceptionHandler.java
@@ -31,11 +31,10 @@
 * @author ruoyi
 */
@RestControllerAdvice
public class GlobalExceptionHandler
{
public class GlobalExceptionHandler {
    private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
    @Value("${spring.servlet.multipart.max-file-size:4MB}")
    @Value("${spring.servlet.multipart.max-file-size:10MB}")
    private String maxFileSize;
    @Value("${spring.servlet.multipart.max-request-size:100MB}")
    private String maxRequestSize;
@@ -45,8 +44,7 @@
     * 权限码异常
     */
    @ExceptionHandler(NotPermissionException.class)
    public AjaxResult handleNotPermissionException(NotPermissionException e, HttpServletRequest request)
    {
    public AjaxResult handleNotPermissionException(NotPermissionException e, HttpServletRequest request) {
        String requestURI = request.getRequestURI();
        log.error("请求地址'{}',权限码校验失败'{}'", requestURI, e.getMessage());
        return AjaxResult.error(HttpStatus.FORBIDDEN, "没有访问权限,请联系管理员授权");
@@ -56,8 +54,7 @@
     * 角色权限异常
     */
    @ExceptionHandler(NotRoleException.class)
    public AjaxResult handleNotRoleException(NotRoleException e, HttpServletRequest request)
    {
    public AjaxResult handleNotRoleException(NotRoleException e, HttpServletRequest request) {
        String requestURI = request.getRequestURI();
        log.error("请求地址'{}',角色权限校验失败'{}'", requestURI, e.getMessage());
        return AjaxResult.error(HttpStatus.FORBIDDEN, "没有访问权限,请联系管理员授权");
@@ -68,8 +65,7 @@
     */
    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
    public AjaxResult handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e,
            HttpServletRequest request)
    {
                                                          HttpServletRequest request) {
        String requestURI = request.getRequestURI();
        log.error("请求地址'{}',不支持'{}'请求", requestURI, e.getMethod());
        return AjaxResult.error(e.getMessage());
@@ -79,8 +75,7 @@
     * 业务异常
     */
    @ExceptionHandler(ServiceException.class)
    public AjaxResult handleServiceException(ServiceException e, HttpServletRequest request)
    {
    public AjaxResult handleServiceException(ServiceException e, HttpServletRequest request) {
        log.error(e.getMessage(), e);
        Integer code = e.getCode();
        return StringUtils.isNotNull(code) ? AjaxResult.error(code, e.getMessage()) : AjaxResult.error(e.getMessage());
@@ -90,19 +85,17 @@
     * 拦截未知的运行时异常
     */
    @ExceptionHandler(RuntimeException.class)
    public AjaxResult handleRuntimeException(RuntimeException e, HttpServletRequest request)
    {
    public AjaxResult handleRuntimeException(RuntimeException e, HttpServletRequest request) {
        String requestURI = request.getRequestURI();
        log.error("请求地址'{}',发生未知异常.", requestURI, e);
        return AjaxResult.error(e.getMessage());
        throw new RuntimeException(e.getMessage());
    }
    /**
     * 系统异常
     */
    @ExceptionHandler(Exception.class)
    public AjaxResult handleException(Exception e, HttpServletRequest request)
    {
    public AjaxResult handleException(Exception e, HttpServletRequest request) {
        String requestURI = request.getRequestURI();
        log.error("请求地址'{}',发生系统异常.", requestURI, e);
        return AjaxResult.error(e.getMessage());
@@ -112,8 +105,7 @@
     * 自定义验证异常
     */
    @ExceptionHandler(BindException.class)
    public AjaxResult handleBindException(BindException e)
    {
    public AjaxResult handleBindException(BindException e) {
        log.error(e.getMessage(), e);
        String message = e.getAllErrors().get(0).getDefaultMessage();
        return AjaxResult.error(message);
@@ -123,8 +115,7 @@
     * 自定义验证异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e)
    {
    public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
        log.error(e.getMessage(), e);
        String message = e.getBindingResult().getFieldError().getDefaultMessage();
        return AjaxResult.error(message);
@@ -134,8 +125,7 @@
     * 内部认证异常
     */
    @ExceptionHandler(InnerAuthException.class)
    public AjaxResult handleInnerAuthException(InnerAuthException e)
    {
    public AjaxResult handleInnerAuthException(InnerAuthException e) {
        return AjaxResult.error(e.getMessage());
    }
@@ -143,8 +133,7 @@
     * 演示模式异常
     */
    @ExceptionHandler(DemoModeException.class)
    public AjaxResult handleDemoModeException(DemoModeException e)
    {
    public AjaxResult handleDemoModeException(DemoModeException e) {
        return AjaxResult.error("演示模式,不允许操作");
    }
ruoyi-gateway/pom.xml
@@ -114,18 +114,6 @@
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-api-account</artifactId>
            <version>3.6.2</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-api-system</artifactId>
            <version>3.6.2</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/AntiShakeProperties.java
New file
@@ -0,0 +1,34 @@
package com.ruoyi.gateway.config.properties;
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.anti-shake")
public class AntiShakeProperties {
    private Boolean enable;
    private Long interval;
    public Boolean getEnable() {
        return enable;
    }
    public void setEnable(Boolean enable) {
        this.enable = enable;
    }
    public Long getInterval() {
        return interval;
    }
    public void setInterval(Long interval) {
        this.interval = interval;
    }
}
ruoyi-gateway/src/main/java/com/ruoyi/gateway/config/properties/SignProperties.java
New file
@@ -0,0 +1,27 @@
package com.ruoyi.gateway.config.properties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.List;
/**
 * @author ruoyi
 */
@Configuration
@RefreshScope
@ConfigurationProperties(prefix = "security.sign")
public class SignProperties {
    private Boolean enable;
    public Boolean getEnable() {
        return enable;
    }
    public void setEnable(Boolean enable) {
        this.enable = enable;
    }
}
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/AuthFilter.java
@@ -1,5 +1,6 @@
package com.ruoyi.gateway.filter;
import com.ruoyi.gateway.config.properties.AntiShakeProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -39,9 +40,12 @@
    // 排除过滤的 uri 地址,nacos自行添加
    @Autowired
    private IgnoreWhiteProperties ignoreWhite;
    @Autowired
    private AntiShakeProperties antiShakeProperties;
    @Autowired
    private RedisService redisService;
    
    
    
@@ -59,7 +63,7 @@
        try {
            antiShake(request);
        }catch (Exception e){
            log.error("[重复提交]请求路径:{}", exchange.getRequest().getPath());
            log.error(e.getMessage());
            return ServletUtils.webFluxResponseWriter(exchange.getResponse(), e.getMessage(), HttpStatus.SUCCESS);
        }
        
@@ -129,7 +133,7 @@
     */
    public void antiShake(ServerHttpRequest request) throws Exception{
        HttpMethod method = request.getMethod();
        if(HttpMethod.OPTIONS == method){
        if(HttpMethod.OPTIONS == method || !antiShakeProperties.getEnable()){
            return;
        }
        HttpHeaders headers = request.getHeaders();
@@ -155,8 +159,8 @@
                Long old_timestamp = Long.valueOf(o.toString());
                Long new_timestamp = Long.valueOf(timestamp);
                //两个请求时间差小于1秒,判定为重复提交
                if((new_timestamp - old_timestamp) <= 500){
                    throw new RuntimeException("重复提交");
                if((new_timestamp - old_timestamp) <= antiShakeProperties.getInterval()){
                    throw new RuntimeException(url + "----->重复提交");
                }else{
                    cacheMap.put(url, timestamp);
                }
ruoyi-gateway/src/main/java/com/ruoyi/gateway/filter/SignFilter.java
@@ -3,27 +3,21 @@
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;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.constant.TokenConstants;
import com.ruoyi.common.core.utils.JwtUtils;
import com.ruoyi.common.core.utils.ServletUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.gateway.config.properties.IgnoreWhiteProperties;
import io.jsonwebtoken.Claims;
import com.ruoyi.gateway.config.properties.SignProperties;
import org.apache.commons.codec.binary.Base64;
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.core.io.buffer.DataBufferUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpRequestDecorator;
@@ -37,7 +31,6 @@
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
/**
 * 网关鉴权
@@ -48,11 +41,11 @@
public class SignFilter implements GlobalFilter, Ordered {
    private static final Logger log = LoggerFactory.getLogger(SignFilter.class);
    @Value("${security.sign}")
    private boolean parameter_signature;
    @Autowired
    private IgnoreWhiteProperties ignoreWhite;
    @Autowired
    private SignProperties signProperties;
    @Override
@@ -71,13 +64,13 @@
        }
        String sign = request.getHeaders().getFirst(TokenConstants.SIGN);
        String nonce_str = request.getHeaders().getFirst(TokenConstants.NONCE_STR);
        if (parameter_signature && StringUtils.isEmpty(sign)) {
        if (signProperties.getEnable() && StringUtils.isEmpty(sign)) {
            return unauthorizedResponse(exchange, "签名不能为空!");
        }
        if (parameter_signature && StringUtils.isEmpty(nonce_str)) {
        if (signProperties.getEnable() && StringUtils.isEmpty(nonce_str)) {
            return unauthorizedResponse(exchange, "签名不能为空!");
        }
        if(parameter_signature){
        if(signProperties.getEnable()){
            return authSign(exchange, chain, sign, nonce_str);
        }
        return chain.filter(exchange.mutate().request(mutate.build()).build());
ruoyi-gateway/src/main/resources/bootstrap.yml
@@ -1,3 +1,8 @@
server:
  port: 9000
  tomcat:
    basedir: /data/tomcat
    max-swallow-size: 100MB
# Spring
spring:
  application:
@@ -49,6 +54,8 @@
            server-addr: 192.168.110.169:8848
            dataId: sentinel-ruoyi-gateway
            groupId: DEFAULT_GROUP
            username: nacos
            password: nacos
            data-type: json
            rule-type: gw-flow
---
@@ -60,14 +67,18 @@
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 127.0.0.1:8848
        server-addr: 192.168.0.137:8848,192.168.0.123:8848
        service: ${spring.application.name}
        group: DEFAULT_GROUP
        namespace: c2f47d1c-6355-4a68-b357-7523d73b2d13
        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
        username: nacos
        password: nacos
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        namespace: c2f47d1c-6355-4a68-b357-7523d73b2d13
        server-addr: 192.168.0.137:8848,192.168.0.123:8848
        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
        username: nacos
        password: nacos
        group: DEFAULT_GROUP
        name: ${spring.application.name}
        # 配置文件格式
@@ -80,14 +91,16 @@
      eager: true
      transport:
        # 控制台地址
        dashboard: 122.9.150.46:8718
        dashboard: 192.168.0.137:8718
      # nacos配置持久化
      datasource:
        ds1:
          nacos:
            server-addr: 127.0.0.1:8848
            server-addr: 192.168.0.137:8848,192.168.0.123:8848
            dataId: sentinel-ruoyi-gateway
            groupId: DEFAULT_GROUP
            username: nacos
            password: nacos
            data-type: json
            rule-type: gw-flow
---
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/RuoYiSystemApplication.java
@@ -6,6 +6,7 @@
import com.ruoyi.common.security.annotation.EnableCustomConfig;
import com.ruoyi.common.security.annotation.EnableRyFeignClients;
import com.ruoyi.common.swagger.annotation.EnableCustomSwagger2;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
@@ -21,8 +22,7 @@
@EnableTransactionManagement
public class RuoYiSystemApplication
{
    public static void main(String[] args)
    {
    public static void main(String[] args) {
        SpringApplication.run(RuoYiSystemApplication.class, args);
        System.out.println("(♥◠‿◠)ノ゙  系统模块启动成功   ლ(´ڡ`ლ)゙  \n" +
                " .-------.       ____     __        \n" +
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
@@ -19,6 +19,7 @@
import com.ruoyi.system.query.GetSysUserList;
import com.ruoyi.system.query.ShopUserStart;
import com.ruoyi.system.service.*;
import io.seata.core.context.RootContext;
import io.seata.spring.annotation.GlobalTransactional;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -679,6 +680,7 @@
    @PostMapping("/addSysUser")
    @Transactional(rollbackFor = Exception.class)
    public R addSysUser(@RequestBody SysUser user){
        System.err.println("事务ID:" + RootContext.getXID());
        if(StringUtils.isEmpty(user.getUserName())){
            user.setUserName(user.getPhonenumber());
        }
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/filter/AuthFilter.java
@@ -12,6 +12,7 @@
import org.apache.logging.log4j.core.config.Order;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml
@@ -1,3 +1,7 @@
server:
  port: 9800
  tomcat:
    basedir: /data/tomcat
# Spring
spring: 
  application:
@@ -36,15 +40,12 @@
        # 共享配置
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
---
seata:
  enabled: true
  application-id: ${spring.application.name}
  tx-service-group: seata_tx_group    #此处配置自定义的seata事务分组名称
  enable-auto-data-source-proxy: false    #关闭数据库代理
  enable-auto-data-source-proxy: false
  service:
    vgroup-mapping:
      seata_tx_group: default
@@ -52,36 +53,57 @@
  config:
    type: nacos
    nacos:
      # 开发环境
      server-addr: 192.168.110.169:8848
      namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
      group: DEFAULT_GROUP
      data-id: seata-server.properties
      username: nacos
      password: nacos
      # 生产环境
#      server-addr: 192.168.0.137:8848,192.168.0.123:8848
#      namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
#      group: DEFAULT_GROUP
#      data-id: seata-server.properties
#      username: nacos
#      password: nacos
  registry:
    type: nacos
    nacos:
      application: seata-server
      # 开发环境
      server-addr: 192.168.110.169:8848
      namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
      group: DEFAULT_GROUP
      username: nacos
      password: nacos
      # 生产环境
#      server-addr: 192.168.0.137:8848,192.168.0.123:8848
#      namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
#      group: DEFAULT_GROUP
#      username: nacos
#      password: nacos
  cloud:
    nacos:
      discovery:
        # 开发环境
        server-addr: 192.168.110.169:8848 # nacos注册中心地址
        namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb # 命名空间
        group: DEFAULT_GROUP
        application: seata-server #Nacos 中 Seata 名称
        username: nacos
        password: nacos
        # 生产环境
#        server-addr: 192.168.0.137:8848,192.168.0.123:8848
#        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
#        group: DEFAULT_GROUP
#        application: seata-server #Nacos 中 Seata 名称
#        username: nacos
#        password: nacos
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080  #  Sentinel控制台地址
      eager: true
---
spring:
  config:
@@ -91,14 +113,18 @@
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 127.0.0.1:8848
        server-addr: 192.168.0.137:8848,192.168.0.123:8848
        service: ${spring.application.name}
        group: DEFAULT_GROUP
        namespace: 3452d750-b08d-4485-a1e9-4fb0548f1fc2
        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
        username: nacos
        password: nacos
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        namespace: 3452d750-b08d-4485-a1e9-4fb0548f1fc2
        server-addr: 192.168.0.137:8848,192.168.0.123:8848
        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
        username: nacos
        password: nacos
        group: DEFAULT_GROUP
        name: ${spring.application.name}
        # 配置文件格式
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -123,8 +123,8 @@
    <select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult">
        select user_id, email from sys_user where email = #{email} and del_flag = '0' limit 1
    </select>
    <select id="getList" resultType="com.ruoyi.system.api.domain.SysUser">
        select *,nick_name nickName,login_date loginDate,create_time createTime,user_id userId from sys_user where 1=1
    <select id="getList" resultMap="SysUserResult">
        select * from sys_user where 1=1
        <if test="req.search !=null and req.search !=''">
            and (phonenumber like concat("%", #{phonenumber},"%") or nick_name like concat("%", #{phonenumber},"%"))
        </if>
ruoyi-service/pom.xml
ruoyi-service/ruoyi-account/pom.xml
@@ -150,7 +150,13 @@
            <version>1.0.4</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.huaweicloud.apigateway</groupId>
            <artifactId>apigateway</artifactId>
            <version>3.2.5</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/lib/java-sdk-core-3.2.5.jar</systemPath>
        </dependency>
    </dependencies>
    <build>
@@ -173,6 +179,13 @@
                <directory>src/main/resources</directory>
            </resource>
            <resource>
                <directory>lib</directory>
                <targetPath>/BOOT-INF/lib/</targetPath>
                <includes>
                    <include>**/*.jar</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
@@ -446,12 +446,21 @@
            pointsQueryDto.setUserId(tokenService.getLoginUserApplet().getUserId());
        }
        List<Integer> types = new ArrayList<>();
        if (pointsQueryDto.getType()!=null){
        if (pointsQueryDto.getType()==null){
            types.add(1);
            types.add(2);
            types.add(3);
            types.add(4);
            types.add(5);
            types.add(6);
        }else if (pointsQueryDto.getType()==1){
            types.add(1);
            types.add(2);
            types.add(3);
            types.add(4);
            types.add(5);
        }else if (pointsQueryDto.getType()==2){
            types.add(6);
        }
        Page<TAppUserIntegralChange> page = integralChangeService.lambdaQuery()
                .eq(TAppUserIntegralChange::getAppUserId, pointsQueryDto.getUserId())
@@ -775,6 +784,17 @@
        if (signService.lambdaQuery().eq(TAppUserSign::getSignDay, LocalDate.now()).eq(TAppUserSign::getAppUserId, userId).count()>0){
            return R.fail("今日已签到");
        }
        //判断当前生效的vipDetail
        TAppUserVipDetail one = tAppUserVipDetailService.lambdaQuery().le(TAppUserVipDetail::getStartTime, LocalDateTime.now()).ge(TAppUserVipDetail::getEndTime, LocalDateTime.now()).eq(TAppUserVipDetail::getAppUserId, userId).last("limit 1").one();
        boolean doubleVip = false;
        if (one!=null){
            TVip tVip = JSONObject.parseObject(one.getVipJson(), TVip.class);
            if (tVip.getDoubleIntegration()==1){
                doubleVip = true;
            }
        }
        //签到业务
        TAppUserSign appUserSign = new TAppUserSign();
        appUserSign.setSignDay(LocalDate.now());
@@ -790,6 +810,9 @@
        Integer points = 0;
        Integer point = jsonObject.getInteger("num1");
        points= points+point;
        if (doubleVip){
            points= points+point;
        }
        JSONArray num2 = jsonObject.getJSONArray("num2");
        if (num2!=null) {
            //获取连续签到的规则放入map
@@ -804,6 +827,9 @@
            Integer i = map.get(days);
            if (i!=null){
                points= points+i;
                if (doubleVip){
                    points= points+i;
                }
                appUserSign.setIsGift(1);
                signService.updateById(appUserSign);
            }
@@ -813,6 +839,8 @@
        appUserService.updateById(byId);
        return R.ok();
    }
    //已签到日期
    @ApiOperation(value = "本月已签到日期", tags = {"小程序-个人中心-签到"})
    @GetMapping(value = "/user/has/sign")
@@ -872,6 +900,16 @@
        TAppUser byId = appUserService.getById(userId);
        appUserCar.setAppUserId(userId);
        //判断当前生效的vipDetail
        TAppUserVipDetail one = tAppUserVipDetailService.lambdaQuery().le(TAppUserVipDetail::getStartTime, LocalDateTime.now()).ge(TAppUserVipDetail::getEndTime, LocalDateTime.now()).eq(TAppUserVipDetail::getAppUserId, userId).last("limit 1").one();
        boolean doubleVip = false;
        if (one!=null){
             TVip tVip = JSONObject.parseObject(one.getVipJson(), TVip.class);
             if (tVip.getDoubleIntegration()==1){
                 doubleVip = true;
             }
        }
        //如果是第一次添加车辆,增加积分
        Long count = appUserCarService.lambdaQuery().eq(TAppUserCar::getAppUserId, userId).count();
@@ -885,17 +923,29 @@
            Integer point = 0;
            //增加车牌50分,必填
                point = point+jsonObject.getInteger("num1");
                if (doubleVip){
                    point = point+jsonObject.getInteger("num1");
                }
            //增加车型分
                if (StringUtils.isNotEmpty(appUserCar.getVehicleModel())){
                    point = point+jsonObject.getInteger("num2");
                    if (doubleVip){
                        point = point+jsonObject.getInteger("num2");
                    }
                }
            //增加车辆用途分
                if (StringUtils.isNotEmpty(appUserCar.getVehicleUse())){
                    point = point+jsonObject.getInteger("num3");
                    if (doubleVip){
                        point = point+jsonObject.getInteger("num3");
                    }
                }
            //增加续航分
                if (StringUtils.isNotEmpty(appUserCar.getEndurance())){
                    point = point+jsonObject.getInteger("num4");
                    if (doubleVip){
                        point = point+jsonObject.getInteger("num4");
                    }
                }
            //增加积分记录
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WxLoginController.java
@@ -67,4 +67,16 @@
        appletUserDecodeData.setOpenId(openid);
        return AjaxResult.success(appUserService.wxLogin(appletUserDecodeData,data.getInviteUserId()));
    }
    /**
     * 测试用
     * @param appletUserDecodeData
     * @return
     */
    @ApiOperation(value = "通过code获得openid,获取用户信息",tags = {"微信小程序登录"})
    @PostMapping("/openIdByJsCodeTest")
    public AjaxResult<Map<String, Object>> openIdByJsCode(@RequestBody AppletUserDecodeData appletUserDecodeData) {
        return AjaxResult.success(appUserService.wxLogin(appletUserDecodeData, null));
    }
}
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/filter/AuthFilter.java
@@ -11,6 +11,7 @@
import org.apache.logging.log4j.core.config.Order;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/GiveVipUtil.java
@@ -55,6 +55,7 @@
            tAppUserVipDetail.setChargeNum(vip.getDiscountTimes());
            tAppUserVipDetail.setDiscountMoney(vip.getMaximumDeduction());
            tAppUserVipDetail.setSendMonth(1);
            tAppUserVipDetail.setVipJson(JSON.toJSONString(info.getData()));
            tAppUserVipDetailService.save(tAppUserVipDetail);
            //直接赠送优惠卷
            for (SendCouponDto sendCouponDto : javaList) {
@@ -116,6 +117,7 @@
                tAppUserVipDetail1.setChargeNum(vip.getDiscountTimes());
                tAppUserVipDetail1.setDiscountMoney(vip.getMaximumDeduction());
                tAppUserVipDetail1.setSendMonth(1);
                tAppUserVipDetail.setVipJson(JSON.toJSONString(info.getData()));
                tAppUserVipDetailService.save(tAppUserVipDetail1);
            }
ruoyi-service/ruoyi-account/src/main/resources/bootstrap.yml
@@ -1,3 +1,7 @@
server:
  port: 9200
  tomcat:
    basedir: /data/tomcat
# Spring
spring:
  application:
@@ -38,7 +42,6 @@
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
---
seata:
  enabled: true
  application-id: ${spring.application.name}
@@ -51,36 +54,57 @@
  config:
    type: nacos
    nacos:
      # 开发环境
      server-addr: 192.168.110.169:8848
      namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
      group: DEFAULT_GROUP
      data-id: seata-server.properties
      username: nacos
      password: nacos
      # 生产环境
#      server-addr: 192.168.0.137:8848,192.168.0.123:8848
#      namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
#      group: DEFAULT_GROUP
#      data-id: seata-server.properties
#      username: nacos
#      password: nacos
  registry:
    type: nacos
    nacos:
      application: seata-server
      # 开发环境
      server-addr: 192.168.110.169:8848
      namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
      group: DEFAULT_GROUP
      username: nacos
      password: nacos
      # 生产环境
#      server-addr: 192.168.0.137:8848,192.168.0.123:8848
#      namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
#      group: DEFAULT_GROUP
#      username: nacos
#      password: nacos
  cloud:
    nacos:
      discovery:
        # 开发环境
        server-addr: 192.168.110.169:8848 # nacos注册中心地址
        namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb # 命名空间
        group: DEFAULT_GROUP
        application: seata-server #Nacos 中 Seata 名称
        username: nacos
        password: nacos
        # 生产环境
#        server-addr: 192.168.0.137:8848,192.168.0.123:8848
#        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
#        group: DEFAULT_GROUP
#        application: seata-server #Nacos 中 Seata 名称
#        username: nacos
#        password: nacos
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080  #  Sentinel控制台地址
        dashboard: 192.168.0.137:8080  #  Sentinel控制台地址
      eager: true
---
spring:
  config:
@@ -90,14 +114,18 @@
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 127.0.0.1:8848
        server-addr: 192.168.0.137:8848,192.168.0.123:8848
        service: ${spring.application.name}
        group: DEFAULT_GROUP
        namespace: 3452d750-b08d-4485-a1e9-4fb0548f1fc2
        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
        username: nacos
        password: nacos
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        namespace: 3452d750-b08d-4485-a1e9-4fb0548f1fc2
        server-addr: 192.168.0.137:8848,192.168.0.123:8848
        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
        username: nacos
        password: nacos
        group: DEFAULT_GROUP
        name: ${spring.application.name}
        # 配置文件格式
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/RuoYiChargingPileApplication.java
@@ -6,6 +6,7 @@
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.annotation.EnableTransactionManagement;
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/filter/AuthFilter.java
@@ -11,6 +11,7 @@
import org.apache.logging.log4j.core.config.Order;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TChargingGunMapper.java
@@ -37,7 +37,7 @@
     * @param siteIds
     * @return
     */
    Map<Integer, Integer> getModeStatistics(@Param("siteIds")List<Integer> siteIds);
    List<Map<Integer, Integer>> getModeStatistics(@Param("siteIds")List<Integer> siteIds);
    /**
     * 统计充电枪状态
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/PartnerServiceImpl.java
@@ -25,7 +25,10 @@
import com.ruoyi.system.api.feignClient.SysUserRoleClient;
import com.ruoyi.system.api.model.GetSysRoleByIds;
import com.ruoyi.system.api.model.SysUserRoleVo;
import io.seata.core.context.RootContext;
import io.seata.core.exception.TransactionException;
import io.seata.spring.annotation.GlobalTransactional;
import io.seata.tm.api.GlobalTransactionContext;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -111,6 +114,7 @@
    @Override
    @GlobalTransactional(rollbackFor = Exception.class)//分布式事务
    public AjaxResult addPartner(Partner partner) {
        System.err.println("事务ID:" + RootContext.getXID());
        //校验参数和重复数据
        AjaxResult ajaxResult = addPartnerParameterCheck(partner);
        if(ajaxResult.isError()){
@@ -144,7 +148,16 @@
        user.setRoleId(partner.getRoleId().longValue());
        user.setRoleType(2);
        user.setObjectId(partner.getId());
        sysUserClient.addSysUser(user);
        R r = sysUserClient.addSysUser(user);
        if(r.getCode() != 200){
            // 手动进行全局事务回滚
            try {
                GlobalTransactionContext.getCurrent().rollback();
            } catch (TransactionException e) {
                throw new RuntimeException(e);
            }
            return AjaxResult.error(r.getMsg());
        }
        return AjaxResult.success();
    }
    
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingGunServiceImpl.java
@@ -186,10 +186,10 @@
        GunStatusStatisticsVO gunStatusStatisticsVO = new GunStatusStatisticsVO();
        if(CollectionUtils.isEmpty(siteIds)){
            Map<Integer, Integer> modeStatisticsNull = new HashMap<>();
            modeStatisticsNull.put(1, 0);
            modeStatisticsNull.put(2, 0);
            modeStatisticsNull.put(3, 0);
            List<Map<Integer, Integer>> modeStatisticsNull = new ArrayList<>();
            modeStatisticsNull.add(new HashMap<>(1,0));
            modeStatisticsNull.add(new HashMap<>(2,0));
            modeStatisticsNull.add(new HashMap<>(3,0));
            gunStatusStatisticsVO.setModeStatistics(modeStatisticsNull);
            Map<Integer, Integer> statusStatisticsNull = new HashMap<>();
            statusStatisticsNull.put(1, 0);
@@ -209,7 +209,7 @@
            gunStatusStatisticsVO.setStatusModeStatistics(statusModeStatistics);
        }
        Map<Integer, Integer> modeStatistics = this.baseMapper.getModeStatistics(siteIds);
        List<Map<Integer, Integer>> modeStatistics = this.baseMapper.getModeStatistics(siteIds);
        if(CollectionUtils.isEmpty(modeStatistics)){
            modeStatistics.put(1, 0);
            modeStatistics.put(2, 0);
@@ -217,19 +217,24 @@
        }
        gunStatusStatisticsVO.setModeStatistics(modeStatistics);
        Map<Integer, Integer> statusStatistics = new HashMap<>();
        List<Map<Integer, Integer>> statusStatistics = new ArrayList<>();
        // 离线
        Long count = this.baseMapper.selectCount(Wrappers.lambdaQuery(TChargingGun.class)
                .eq(TChargingGun::getStatus, 1));
        statusStatistics.put(1, count.intValue());
        statusStatistics.add(new HashMap<>(1,count.intValue()));
//        statusStatistics.put(1, count.intValue());
        // 故障
        count = this.baseMapper.selectCount(Wrappers.lambdaQuery(TChargingGun.class)
                .eq(TChargingGun::getStatus, 7));
        statusStatistics.put(2, count.intValue());
        statusStatistics.add(new HashMap<>(2,count.intValue()));
//        statusStatistics.put(2, count.intValue());
        // 充电中
        count = this.baseMapper.selectCount(Wrappers.lambdaQuery(TChargingGun.class)
                .in(TChargingGun::getStatus, Arrays.asList(3,4,5,6)));
        statusStatistics.put(3, count.intValue());
        statusStatistics.add(new HashMap<>(3,count.intValue()));
//        statusStatistics.put(3, count.intValue());
        gunStatusStatisticsVO.setModeStatistics(statusStatistics);
        List<StatusModeStatisticsVO> statusModeStatisticsVOS = new ArrayList<>();
ruoyi-service/ruoyi-chargingPile/src/main/resources/bootstrap.yml
@@ -1,3 +1,7 @@
server:
  port: 9300
  tomcat:
    basedir: /data/tomcat
# Spring
spring:
  application:
@@ -37,14 +41,12 @@
        # 共享配置
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
---
seata:
  enabled: true
  application-id: ${spring.application.name}
  tx-service-group: seata_tx_group    #此处配置自定义的seata事务分组名称
  enable-auto-data-source-proxy: false    #关闭数据库代理
  enable-auto-data-source-proxy: false
  service:
    vgroup-mapping:
      seata_tx_group: default
@@ -52,30 +54,53 @@
  config:
    type: nacos
    nacos:
      # 开发环境
      server-addr: 192.168.110.169:8848
      namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
      group: DEFAULT_GROUP
      data-id: seata-server.properties
      username: nacos
      password: nacos
      # 生产环境
#      server-addr: 192.168.0.137:8848,192.168.0.123:8848
#      namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
#      group: DEFAULT_GROUP
#      data-id: seata-server.properties
#      username: nacos
#      password: nacos
  registry:
    type: nacos
    nacos:
      application: seata-server
      # 开发环境
      server-addr: 192.168.110.169:8848
      namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
      group: DEFAULT_GROUP
      username: nacos
      password: nacos
      # 生产环境
#      server-addr: 192.168.0.137:8848,192.168.0.123:8848
#      namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
#      group: DEFAULT_GROUP
#      username: nacos
#      password: nacos
  cloud:
    nacos:
      discovery:
        # 开发环境
        server-addr: 192.168.110.169:8848 # nacos注册中心地址
        namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb # 命名空间
        group: DEFAULT_GROUP
        application: seata-server #Nacos 中 Seata 名称
        username: nacos
        password: nacos
        # 生产环境
#        server-addr: 192.168.0.137:8848,192.168.0.123:8848
#        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
#        group: DEFAULT_GROUP
#        application: seata-server #Nacos 中 Seata 名称
#        username: nacos
#        password: nacos
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080  #  Sentinel控制台地址
@@ -89,14 +114,18 @@
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 127.0.0.1:8848
        server-addr: 192.168.0.137:8848,192.168.0.123:8848
        service: ${spring.application.name}
        group: DEFAULT_GROUP
        namespace: 3452d750-b08d-4485-a1e9-4fb0548f1fc2
        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
        username: nacos
        password: nacos
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        namespace: 3452d750-b08d-4485-a1e9-4fb0548f1fc2
        server-addr: 192.168.0.137:8848,192.168.0.123:8848
        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
        username: nacos
        password: nacos
        group: DEFAULT_GROUP
        name: ${spring.application.name}
        # 配置文件格式
ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TChargingGunMapper.xml
@@ -85,10 +85,10 @@
    <select id="getStatusModeStatistics" resultType="com.ruoyi.chargingPile.api.vo.StatusModeStatisticsVO">
        SELECT
        charge_mode,
        IFNULL((SELECT COUNT(*) FROM your_table WHERE status = 2),0) AS freeCount,
        IFNULL((SELECT COUNT(*) FROM your_table WHERE status = 5),0) AS filledCount,
        IFNULL((SELECT COUNT(*) FROM your_table WHERE status = 3),0) AS insertCount,
        IFNULL((SELECT COUNT(*) FROM your_table WHERE status = 4),0) AS chargingCount
        IFNULL((SELECT COUNT(*) FROM t_charging_gun WHERE status = 2),0) AS freeCount,
        IFNULL((SELECT COUNT(*) FROM t_charging_gun WHERE status = 5),0) AS filledCount,
        IFNULL((SELECT COUNT(*) FROM t_charging_gun WHERE status = 3),0) AS insertCount,
        IFNULL((SELECT COUNT(*) FROM t_charging_gun WHERE status = 4),0) AS chargingCount
        FROM t_charging_gun
        WHERE del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()} AND charge_mode = #{chargeMode}
        <if test="siteIds != null and siteIds.size()>0">
@@ -97,6 +97,7 @@
                #{siteId}
            </foreach>
        </if>
        GROUP BY charge_mode
    </select>
</mapper>
ruoyi-service/ruoyi-integration/src/main/resources/bootstrap.yml
@@ -1,3 +1,7 @@
server:
  port: 9700
  tomcat:
    basedir: /data/tomcat
# Spring
spring:
  application:
@@ -9,6 +13,14 @@
  profiles:
    # 环境配置
    active: dev
---
spring:
  cloud:
    stream:
      rocketmq:
        binder:
          name-server: 127.0.0.1:9876
---
spring:
  config:
@@ -37,9 +49,7 @@
        # 共享配置
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
---
seata:
  enabled: true
  application-id: ${spring.application.name}
@@ -52,36 +62,57 @@
  config:
    type: nacos
    nacos:
      # 开发环境
      server-addr: 192.168.110.169:8848
      namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
      group: DEFAULT_GROUP
      data-id: seata-server.properties
      username: nacos
      password: nacos
      # 生产环境
#      server-addr: 192.168.0.137:8848,192.168.0.123:8848
#      namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
#      group: DEFAULT_GROUP
#      data-id: seata-server.properties
#      username: nacos
#      password: nacos
  registry:
    type: nacos
    nacos:
      application: seata-server
      # 开发环境
      server-addr: 192.168.110.169:8848
      namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
      group: DEFAULT_GROUP
      username: nacos
      password: nacos
      # 生产环境
#      server-addr: 192.168.0.137:8848,192.168.0.123:8848
#      namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
#      group: DEFAULT_GROUP
#      username: nacos
#      password: nacos
  cloud:
    nacos:
      discovery:
        # 开发环境
        server-addr: 192.168.110.169:8848 # nacos注册中心地址
        namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb # 命名空间
        group: DEFAULT_GROUP
        application: seata-server #Nacos 中 Seata 名称
        username: nacos
        password: nacos
        # 生产环境
#        server-addr: 192.168.0.137:8848,192.168.0.123:8848
#        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
#        group: DEFAULT_GROUP
#        application: seata-server #Nacos 中 Seata 名称
#        username: nacos
#        password: nacos
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080  #  Sentinel控制台地址
      eager: true
---
spring:
  config:
@@ -91,14 +122,18 @@
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 127.0.0.1:8848
        server-addr: 192.168.0.137:8848,192.168.0.123:8848
        service: ${spring.application.name}
        group: DEFAULT_GROUP
        namespace: 3452d750-b08d-4485-a1e9-4fb0548f1fc2
        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
        username: nacos
        password: nacos
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        namespace: 3452d750-b08d-4485-a1e9-4fb0548f1fc2
        server-addr: 192.168.0.137:8848,192.168.0.123:8848
        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
        username: nacos
        password: nacos
        group: DEFAULT_GROUP
        name: ${spring.application.name}
        # 配置文件格式
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TVipOrderController.java
@@ -1,24 +1,40 @@
package com.ruoyi.order.controller;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import com.ruoyi.account.api.dto.GiveVipDto;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.core.utils.WebUtils;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.log.annotation.Log;
import com.ruoyi.common.log.enums.BusinessType;
import com.ruoyi.order.api.model.TExchangeOrder;
import com.ruoyi.order.api.model.TShoppingOrder;
import com.ruoyi.order.api.model.TVipOrder;
import com.ruoyi.order.api.query.ShoppingOrderQuery;
import com.ruoyi.order.api.query.VipShoppingOrderQuery;
import com.ruoyi.order.dto.TEnterpriseExport;
import com.ruoyi.order.service.TVipOrderService;
import com.ruoyi.other.api.domain.TEnterpriseUserApplication;
import com.ruoyi.other.api.feignClient.OtherClient;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.ss.usermodel.Workbook;
import org.omg.CORBA.PRIVATE_MEMBER;
import org.springframework.beans.BeanUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -85,5 +101,51 @@
    }
    @Resource
    private OtherClient otherClient;
    @ApiOperation(tags = {"后台-申请表单-集团用户"},value = "导出")
    @PutMapping(value = "/export")
    @Log(title = "【申请建桩】导出建桩申请列表", businessType = BusinessType.EXPORT)
    public void export(String landlordPhone) {
        R<List<TEnterpriseUserApplication>> tnterPrise = otherClient.getTnterPrise();
        List<TEnterpriseUserApplication> list = tnterPrise.getData();
        List<TEnterpriseExport> orderInvoiceExports = new ArrayList<>();
        for (TEnterpriseUserApplication orderInvoiceVO : list) {
            TEnterpriseExport orderInvoiceExport = new TEnterpriseExport();
            BeanUtils.copyProperties(orderInvoiceVO,orderInvoiceExport);
            orderInvoiceExport.setCreateTime(DateUtils.localDateTimeToString(orderInvoiceVO.getCreateTime()));
            orderInvoiceExports.add(orderInvoiceExport);
        }
                Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), TEnterpriseExport.class, orderInvoiceExports);
        HttpServletResponse response = WebUtils.response();
        response.setCharacterEncoding("utf-8");
        ServletOutputStream outputStream = null;
        try {
            String fileName = URLEncoder.encode("集团用户导出.xls", "utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            outputStream = response.getOutputStream();
            workbook.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                workbook.close();
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/TEnterpriseExport.java
New file
@@ -0,0 +1,36 @@
package com.ruoyi.order.dto;
import cn.afterturn.easypoi.excel.annotation.Excel;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@ApiModel(value = "导出公司")
public class TEnterpriseExport implements Serializable {
    @Excel(name = "公司名称",width = 30)
    private String companyName;
    @Excel(name = "新能源电动汽车保有量",width = 30)
    private Integer vehiclesNumber;
    @Excel(name = "联系人",width = 30)
    private String contactName;
    @Excel(name = "联系电话",width = 30)
    private String phone;
    @Excel(name = "备注",width = 30)
    private String remark;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "申请时间",width = 30,exportFormat="yyyy-MM-dd HH:mm:ss")
    private String createTime;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/filter/AuthFilter.java
@@ -11,6 +11,7 @@
import org.apache.logging.log4j.core.config.Order;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -51,10 +51,8 @@
import com.ruoyi.other.api.domain.TGoods;
import com.ruoyi.order.vo.ChargingOrderListInfoVO;
import com.ruoyi.other.api.domain.TIntegralRule;
import com.ruoyi.other.api.feignClient.IntegralRuleClient;
import com.ruoyi.other.api.feignClient.OtherClient;
import com.ruoyi.other.api.feignClient.RoleSiteClient;
import com.ruoyi.other.api.feignClient.UserSiteClient;
import com.ruoyi.other.api.domain.TVip;
import com.ruoyi.other.api.feignClient.*;
import com.ruoyi.payment.api.feignClient.AliPaymentClient;
import com.ruoyi.payment.api.feignClient.WxPaymentClient;
import com.ruoyi.payment.api.model.RefundReq;
@@ -70,6 +68,7 @@
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
@@ -181,6 +180,9 @@
    @Resource
    private IntegralRuleClient integralRuleClient;
    @Resource
    private VipClient vipClient;
    //计数器
    private Map<String, Integer> counter_map = new HashMap<>();
@@ -650,7 +652,7 @@
                model.setOut_trade_no(chargingOrder.getCode());
                model.setOut_refund_no(chargingOrderRefund.getRefundCode());
                model.setReason("充电失败,取消充电订单");
                model.setNotify_url("http://221.182.45.100:9000/order/t-charging-order/chargingOrderStartupFailureWxRefund");
                model.setNotify_url("/order/t-charging-order/chargingOrderStartupFailureWxRefund");
                WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                amount.setRefund(rechargeAmount.multiply(new BigDecimal(100)).intValue());
                amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
@@ -827,13 +829,24 @@
            String inviteUsersToEarnPoints = integralRule.getInviteUsersToEarnPoints();
            JSONObject jsonObject = JSON.parseObject(inviteUsersToEarnPoints);
            Integer num1 = jsonObject.getInteger("num1");
            TAppUser appUser1 = appUserClient.getUserById(appUser.getInviteUserId()).getData();
            if(null != appUser1.getVipId()){
                TVip vip = vipClient.getInfo(appUser1.getVipId()).getData();
                Integer doubleIntegration = vip.getDoubleIntegration();
                //双倍积分
                if(1 == doubleIntegration){
                    num1 *= 2;
                }
            }
            GetInviteUser query = new GetInviteUser();
            query.setAppUserId(appUser.getInviteUserId());
            query.setAppUserId(appUser1.getId());
            query.setBeInvitedAppUserId(chargingOrder.getAppUserId());
            TInviteUser inviteUser = inviteUserClient.getInviteUser(query).getData();
            if(null == inviteUser){
                inviteUser = new TInviteUser();
                inviteUser.setAppUserId(appUser.getInviteUserId());
                inviteUser.setAppUserId(appUser1.getId());
                inviteUser.setBeInvitedAppUserId(chargingOrder.getAppUserId());
                inviteUser.setAward(num1);
                inviteUser.setCreateTime(LocalDateTime.now());
@@ -842,11 +855,10 @@
                inviteUser.setAward(num1);
                inviteUserClient.updateInviteUser(inviteUser);
            }
            TAppUser appUser1 = appUserClient.getUserById(appUser.getInviteUserId()).getData();
            TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
            String code = Double.valueOf(Math.random() * 1000).intValue() + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
            appUserIntegralChange.setCode(code);
            appUserIntegralChange.setAppUserId(appUser.getInviteUserId());
            appUserIntegralChange.setAppUserId(appUser1.getId());
            appUserIntegralChange.setChangeType(5);
            appUserIntegralChange.setHistoricalIntegral(appUser1.getPoints());
            appUserIntegralChange.setCurrentIntegral(appUser1.getPoints() + num1);
@@ -894,6 +906,32 @@
        chargingOrder.setStatus(5);
        chargingOrder.setPaymentAmount(payAmount);
        this.updateById(chargingOrder);
        //添加积分
        TIntegralRule integralRule = integralRuleClient.getSet().getData();
        if(null != integralRule){
            TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
            Integer num1 = JSON.parseObject(integralRule.getChargeCredit()).getInteger("num1");
            Integer integral = payAmount.multiply(new BigDecimal(num1)).intValue();
            if(null != appUser.getVipId()){
                TVip vip = vipClient.getInfo(appUser.getVipId()).getData();
                Integer doubleIntegration = vip.getDoubleIntegration();
                //双倍积分
                if(1 == doubleIntegration){
                    integral *= 2;
                }
            }
            TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
            appUserIntegralChange.setAppUserId(appUser.getId());
            appUserIntegralChange.setChangeType(2);
            appUserIntegralChange.setHistoricalIntegral(appUser.getPoints());
            appUser.setPoints(appUser.getPoints() + integral);
            appUserIntegralChange.setCurrentIntegral(appUser.getPoints());
            appUserIntegralChange.setCreateTime(LocalDateTime.now());
            appUserClient.updateAppUser(appUser);
            appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
        }
        //计算优惠券
        if(null != chargingOrder.getAppCouponId()){
@@ -988,6 +1026,7 @@
            }
        }
    }
@@ -1594,13 +1633,24 @@
            String inviteUsersToEarnPoints = integralRule.getInviteUsersToEarnPoints();
            JSONObject jsonObject = JSON.parseObject(inviteUsersToEarnPoints);
            Integer num1 = jsonObject.getInteger("num1");
            TAppUser appUser1 = appUserClient.getUserById(appUser.getInviteUserId()).getData();
            if(null != appUser1.getVipId()){
                TVip vip = vipClient.getInfo(appUser1.getVipId()).getData();
                Integer doubleIntegration = vip.getDoubleIntegration();
                //双倍积分
                if(1 == doubleIntegration){
                    num1 *= 2;
                }
            }
            GetInviteUser query = new GetInviteUser();
            query.setAppUserId(appUser.getInviteUserId());
            query.setAppUserId(appUser1.getId());
            query.setBeInvitedAppUserId(chargingOrder.getAppUserId());
            TInviteUser inviteUser = inviteUserClient.getInviteUser(query).getData();
            if(null == inviteUser){
                inviteUser = new TInviteUser();
                inviteUser.setAppUserId(appUser.getInviteUserId());
                inviteUser.setAppUserId(appUser1.getId());
                inviteUser.setBeInvitedAppUserId(chargingOrder.getAppUserId());
                inviteUser.setAward(num1);
                inviteUser.setCreateTime(LocalDateTime.now());
@@ -1609,11 +1659,10 @@
                inviteUser.setAward(num1);
                inviteUserClient.updateInviteUser(inviteUser);
            }
            TAppUser appUser1 = appUserClient.getUserById(appUser.getInviteUserId()).getData();
            TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
            String code = Double.valueOf(Math.random() * 1000).intValue() + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
            appUserIntegralChange.setCode(code);
            appUserIntegralChange.setAppUserId(appUser.getInviteUserId());
            appUserIntegralChange.setAppUserId(appUser1.getId());
            appUserIntegralChange.setChangeType(5);
            appUserIntegralChange.setHistoricalIntegral(appUser1.getPoints());
            appUserIntegralChange.setCurrentIntegral(appUser1.getPoints() + num1);
@@ -1623,6 +1672,7 @@
            appUser1.setPoints(appUser1.getPoints() + num1);
            appUserClient.updateAppUser(appUser1);
        }
    }
    /**
@@ -1705,6 +1755,8 @@
    }
    @Resource
    private TShoppingOrderService shoppingOrderService;
    @Override
    public R payRefund(PayOrderRefundDto payOrderQueryDto) {
            if (payOrderQueryDto.getType()==1){
@@ -1762,10 +1814,61 @@
            }
            if (payOrderQueryDto.getType()==2){
                TShoppingOrder tChargingOrder = shoppingOrderService.getById(payOrderQueryDto.getOrderId());
                TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
                chargingOrderRefund.setChargingOrderId(tChargingOrder.getId());
                chargingOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount());
                chargingOrderRefund.setRefundStatus(1);
                chargingOrderRefund.setPayType(tChargingOrder.getPaymentType());
                chargingOrderRefund.setRefundTime(LocalDateTime.now());
                chargingOrderRefund.setCode(tChargingOrder.getCode());
                SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
                chargingOrderRefund.setRefundCode("GDF" + sdf.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
                chargingOrderRefund.setRefundTitle("后台退款");
                chargingOrderRefund.setRefundContent("后台退款");
                chargingOrderRefund.setRefundReason("后台退款");
                chargingOrderRefund.setRefundRemark("后台退款");
                chargingOrderRefund.setRefundTotalAmount(tChargingOrder.getRefundAmount().add(payOrderQueryDto.getRefundAmount()));
                chargingOrderRefund.setPayAmount(tChargingOrder.getPaymentAmount());
                if(1 == tChargingOrder.getPaymentType()){
                    WxPaymentRefundModel model = new WxPaymentRefundModel();
                    model.setOut_trade_no(tChargingOrder.getCode());
                    model.setOut_refund_no(chargingOrderRefund.getRefundCode());
                    model.setTransaction_id(tChargingOrder.getSerialNumber());
                    model.setReason("取消订单");
                    model.setNotify_url("http://221.182.45.100:9000/order/t-shopping-order/cancelShoppingOrderWxRefund");
                    WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                    amount.setRefund(payOrderQueryDto.getRefundAmount().multiply(new BigDecimal(100)).intValue());
                    amount.setTotal(tChargingOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue());
                    amount.setCurrency("CNY");
                    model.setAmount(amount);
                    R<String> orderR = wxPaymentClient.refundOrderR(model);
                    if(200 == orderR.getCode()){
                        chargingOrderRefundService.save(chargingOrderRefund);
                    }
                }
                if(2 == tChargingOrder.getPaymentType()){
                    RefundReq dto = new RefundReq();
                    dto.setOutTradeNo(tChargingOrder.getCode());
                    dto.setOutRequestNo(tChargingOrder.getCode());
                    dto.setRefundAmount(payOrderQueryDto.getRefundAmount().toString());
                    dto.setRefundReason("取消订单");
                    RefundResp resp = aliPaymentClient.refund(dto).getData();
                    if(null != resp){
                        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE");
                        chargingOrderRefundService.save(chargingOrderRefund);
                    }
                }
            }
        return null;
        return R.ok();
    }
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderEvaluateServiceImpl.java
@@ -37,8 +37,10 @@
import com.ruoyi.order.service.TOrderEvaluateService;
import com.ruoyi.other.api.domain.TEvaluationTag;
import com.ruoyi.other.api.domain.TIntegralRule;
import com.ruoyi.other.api.domain.TVip;
import com.ruoyi.other.api.feignClient.IntegralRuleClient;
import com.ruoyi.other.api.feignClient.TEvaluationTagClient;
import com.ruoyi.other.api.feignClient.VipClient;
import com.ruoyi.other.api.vo.TEvaluationTagVO;
import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.beans.BeanUtils;
@@ -92,6 +94,9 @@
    
    @Resource
    private AppUserIntegralChangeClient appUserIntegralChangeClient;
    @Resource
    private VipClient vipClient;
    
    
    
@@ -223,9 +228,11 @@
            dto.setSiteName(site.getName());
            List<TOrderEvaluateTag> tOrderEvaluateTags = orderEvaluateTagMapper.selectList(new LambdaQueryWrapper<TOrderEvaluateTag>().eq(TOrderEvaluateTag::getOrderEvaluateId, dto.getId()));
            List<Integer> tagIds = tOrderEvaluateTags.stream().map(TOrderEvaluateTag::getEvaluationTagId).collect(Collectors.toList());
            if(tagIds.size() > 0){
            List<TEvaluationTag> data = evaluationTagClient.getListByIds(tagIds).getData();
            List<String> collect = data.stream().map(TEvaluationTag::getName).collect(Collectors.toList());
            dto.setTags(collect);
            }
        }
        return pageInfo.setRecords(list);
    }
@@ -270,6 +277,14 @@
            Integer num1 = JSON.parseObject(credit).getInteger("num1");
            if(null != num1 && 0 < num1){
                TAppUser appUser = appUserClient.getUserById(userid).getData();
                if(null != appUser.getVipId()){
                    TVip vip = vipClient.getInfo(appUser.getVipId()).getData();
                    Integer doubleIntegration = vip.getDoubleIntegration();
                    //双倍积分
                    if(1 == doubleIntegration){
                        num1 *= 2;
                    }
                }
                Integer points = appUser.getPoints();
                appUser.setPoints(appUser.getPoints() + num1);
                appUserClient.updateAppUser(appUser);
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java
@@ -461,7 +461,7 @@
                name = goods.getName();
                imgUrl = goods.getCoverPicture();
            }else{
                TCoupon coupon = couponClient.getCouponById1(tShoppingOrder.getGoodsId()).getData();
                TCoupon coupon = couponClient.getCouponById1(tShoppingOrder.getCouponId()).getData();
                name = coupon.getName();
                imgUrl = coupon.getCoverPicture();
            }
ruoyi-service/ruoyi-order/src/main/resources/bootstrap.yml
@@ -1,3 +1,7 @@
server:
  port: 9400
  tomcat:
    basedir: /data/tomcat
# Spring
spring:
  application:
@@ -37,9 +41,7 @@
        # 共享配置
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
---
seata:
  enabled: true
  application-id: ${spring.application.name}
@@ -52,36 +54,57 @@
  config:
    type: nacos
    nacos:
      # 开发环境
      server-addr: 192.168.110.169:8848
      namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
      group: DEFAULT_GROUP
      data-id: seata-server.properties
      username: nacos
      password: nacos
      # 生产环境
#      server-addr: 192.168.0.137:8848,192.168.0.123:8848
#      namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
#      group: DEFAULT_GROUP
#      data-id: seata-server.properties
#      username: nacos
#      password: nacos
  registry:
    type: nacos
    nacos:
      application: seata-server
      # 开发环境
      server-addr: 192.168.110.169:8848
      namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
      group: DEFAULT_GROUP
      username: nacos
      password: nacos
      # 生产环境
#      server-addr: 192.168.0.137:8848,192.168.0.123:8848
#      namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
#      group: DEFAULT_GROUP
#      username: nacos
#      password: nacos
  cloud:
    nacos:
      discovery:
        # 开发环境
        server-addr: 192.168.110.169:8848 # nacos注册中心地址
        namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb # 命名空间
        group: DEFAULT_GROUP
        application: seata-server #Nacos 中 Seata 名称
        username: nacos
        password: nacos
        # 生产环境
#        server-addr: 192.168.0.137:8848,192.168.0.123:8848
#        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
#        group: DEFAULT_GROUP
#        application: seata-server #Nacos 中 Seata 名称
#        username: nacos
#        password: nacos
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080  #  Sentinel控制台地址
      eager: true
---
spring:
  config:
@@ -91,14 +114,18 @@
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 127.0.0.1:8848
        server-addr: 192.168.0.137:8848,192.168.0.123:8848
        service: ${spring.application.name}
        group: DEFAULT_GROUP
        namespace: 3452d750-b08d-4485-a1e9-4fb0548f1fc2
        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
        username: nacos
        password: nacos
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        namespace: 3452d750-b08d-4485-a1e9-4fb0548f1fc2
        server-addr: 192.168.0.137:8848,192.168.0.123:8848
        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
        username: nacos
        password: nacos
        group: DEFAULT_GROUP
        name: ${spring.application.name}
        # 配置文件格式
ruoyi-service/ruoyi-other/pom.xml
@@ -15,7 +15,6 @@
    </description>
    <dependencies>
        <!-- SpringCloud Alibaba Nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
@@ -135,6 +134,12 @@
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-api-payment</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel-core</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
    <build>
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TEnterpriseUserApplicationController.java
@@ -8,17 +8,18 @@
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.log.annotation.Log;
import com.ruoyi.common.log.enums.BusinessType;
import com.ruoyi.common.log.enums.OperatorType;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.other.api.domain.TEnterpriseUserApplication;
import com.ruoyi.other.query.PassDto;
import com.ruoyi.other.service.TEnterpriseUserApplicationService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
@@ -83,6 +84,41 @@
    }
    
    
    @ApiOperation(tags = {"后台-申请表单-集团用户"},value = "导出")
    @PutMapping(value = "/export")
    @Log(title = "【申请建桩】导出建桩申请列表", businessType = BusinessType.EXPORT)
    public R<List<TEnterpriseUserApplication>> export() {
        List<TEnterpriseUserApplication> list = enterpriseUserApplicationService.lambdaQuery().list();
        return R.ok(list);
//        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), TEnterpriseExport.class, orderInvoiceExports);
//        HttpServletResponse response = WebUtils.response();
//        response.setCharacterEncoding("utf-8");
//        ServletOutputStream outputStream = null;
//        try {
//            String fileName = URLEncoder.encode("公司导出.xls", "utf-8");
//            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
//            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
//            response.setHeader("Pragma", "no-cache");
//            response.setHeader("Cache-Control", "no-cache");
//            outputStream = response.getOutputStream();
//            workbook.write(outputStream);
//        } catch (IOException e) {
//            e.printStackTrace();
//        } finally {
//            try {
//                workbook.close();
//                outputStream.close();
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        }
    }
    @Log(title = "【集团用户申请】填写备注", businessType = BusinessType.INSERT)
    @ApiOperation(tags = {"后台-申请表单-集团用户"},value = "备注")
    @PostMapping(value = "/remark")
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/filter/AuthFilter.java
@@ -11,8 +11,10 @@
import org.apache.logging.log4j.core.config.Order;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
@@ -48,7 +50,7 @@
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        String userid = request.getHeader("user_id");
        if(StringUtils.isEmpty(userid)){
            filterChain.doFilter(request, response);
            filterChain.doFilter(servletRequest, servletResponse);
            return;
        }
        String userType = request.getHeader("user_type");
@@ -80,7 +82,7 @@
                return;
            }
        }
        filterChain.doFilter(request, response);
        filterChain.doFilter(servletRequest, servletResponse);
    }
    
    
ruoyi-service/ruoyi-other/src/main/resources/bootstrap.yml
@@ -1,3 +1,7 @@
server:
  port: 9600
  tomcat:
    basedir: /data/tomcat
# Spring
spring:
  application:
@@ -50,36 +54,57 @@
  config:
    type: nacos
    nacos:
      # 开发环境
      server-addr: 192.168.110.169:8848
      namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
      group: DEFAULT_GROUP
      data-id: seata-server.properties
      username: nacos
      password: nacos
      # 生产环境
#      server-addr: 192.168.0.137:8848,192.168.0.123:8848
#      namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
#      group: DEFAULT_GROUP
#      data-id: seata-server.properties
#      username: nacos
#      password: nacos
  registry:
    type: nacos
    nacos:
      application: seata-server
      # 开发环境
      server-addr: 192.168.110.169:8848
      namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
      group: DEFAULT_GROUP
      username: nacos
      password: nacos
      # 生产环境
#      server-addr: 192.168.0.137:8848,192.168.0.123:8848
#      namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
#      group: DEFAULT_GROUP
#      username: nacos
#      password: nacos
  cloud:
    nacos:
      discovery:
        # 开发环境
        server-addr: 192.168.110.169:8848 # nacos注册中心地址
        namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb # 命名空间
        group: DEFAULT_GROUP
        application: seata-server #Nacos 中 Seata 名称
        username: nacos
        password: nacos
        # 生产环境
#        server-addr: 192.168.0.137:8848,192.168.0.123:8848
#        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
#        group: DEFAULT_GROUP
#        application: seata-server #Nacos 中 Seata 名称
#        username: nacos
#        password: nacos
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080  #  Sentinel控制台地址
      eager: true
---
spring:
  config:
@@ -89,14 +114,18 @@
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 127.0.0.1:8848
        server-addr: 192.168.0.137:8848,192.168.0.123:8848
        service: ${spring.application.name}
        group: DEFAULT_GROUP
        namespace: 3452d750-b08d-4485-a1e9-4fb0548f1fc2
        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
        username: nacos
        password: nacos
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        namespace: 3452d750-b08d-4485-a1e9-4fb0548f1fc2
        server-addr: 192.168.0.137:8848,192.168.0.123:8848
        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
        username: nacos
        password: nacos
        group: DEFAULT_GROUP
        name: ${spring.application.name}
        # 配置文件格式
ruoyi-service/ruoyi-other/src/main/resources/template/集团用户数据.xlsx
Binary files differ
ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/ali/v2/AppletPayUtil.java
@@ -207,12 +207,12 @@
        alipayConfig.setSignType(SignType.RSA2.getType());
        //判断加签方式
        String signType = aliProperties.getSignType();
        if(SignType.CERT.getType().equals(signType)){
        if(SignType.SECRET_KEY.getType().equals(signType)){
            alipayConfig.setPrivateKey(aliProperties.getPrivateKey());
            alipayConfig.setAlipayPublicKey(aliProperties.getAlipayPublicKey());
            return alipayConfig;
        }
        if(SignType.SECRET_KEY.getType().equals(signType)){
        if(SignType.CERT.getType().equals(signType)){
            alipayConfig.setAppCertPath(aliProperties.getAppCertPath());
            alipayConfig.setAlipayPublicCertPath(aliProperties.getAlipayPublicCertPath());
            alipayConfig.setRootCertPath(aliProperties.getRootCertPath());
ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/wx/model/V3.java
@@ -5,6 +5,7 @@
import org.apache.poi.util.IOUtils;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -54,18 +55,23 @@
    public InputStream getPrivateKeyStream() {
        // 需要证书释放
        byte[] certData;
        InputStream certStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(this.privateKeyPath);
//        InputStream certStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(this.privateKeyPath);
        InputStream certStream = null;
        try {
            certStream = new FileInputStream(this.privateKeyPath);
            certData = IOUtils.toByteArray(certStream);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("私钥文件未找到");
        }finally {
            if(null != certStream){
            try {
                certStream.close();
            } catch (IOException e) {
                log.error("私钥流关闭异常");
            }
        }
        }
        return new ByteArrayInputStream(certData);
    }
}
ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/wx/model/WeixinProperties.java
@@ -103,4 +103,12 @@
    public void setMchId(String mchId) {
        this.mchId = mchId;
    }
    public String getCallBackUrl() {
        return callBackUrl;
    }
    public void setCallBackUrl(String callBackUrl) {
        this.callBackUrl = callBackUrl;
    }
}
ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/wx/utils/WxAbstractPay.java
@@ -1,5 +1,7 @@
package com.ruoyi.payment.wx.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.type.TypeReference;
import com.ruoyi.common.core.utils.WebUtils;
import com.ruoyi.payment.wx.model.WxCloseOrderModel;
@@ -69,7 +71,7 @@
     */
    protected String buildBaseParam(WxPaymentInfoModel requestBody, String notifyUrl) {
        // 封装基础数据
//        requestBody.setNotify_url(notifyUrl);
        requestBody.setNotify_url(notifyUrl + requestBody.getNotify_url());
        String reqBody = WxJsonUtils.toJsonString(requestBody);
        return reqBody;
    }
@@ -199,9 +201,46 @@
                url
                , socketTimeout
                , connectTimeout);
        String repBody = result(httpClient, httpGet);
        NotifyV3PayDecodeRespBody body = WxJsonUtils.parseObject(repBody, NotifyV3PayDecodeRespBody.class);
        CloseableHttpResponse response = null;
        try {
            response = httpClient.execute(httpGet);
            int statusCode = response.getStatusLine().getStatusCode();
            String respBodyStr = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
            if (WxUtils.getLogger().isDebugEnabled()) {
                WxUtils.debug("请求成功:{}", respBodyStr);
            }
            if(404 == statusCode){
               return null;
            }
            // 成功相应
            if (STATUS_CODE == statusCode || OTHER_STATUS_CODE == statusCode ) {
                NotifyV3PayDecodeRespBody body = WxJsonUtils.parseObject(respBodyStr, NotifyV3PayDecodeRespBody.class);
        return body;
            } else {
                WxUtils.error("failed,resp code = {},return body = {}", statusCode, respBodyStr);
                throw new RuntimeException(respBodyStr);
            }
        } catch (ConnectTimeoutException e) {
            e.printStackTrace();
            throw new RuntimeException("接口超时");
        } catch (SocketTimeoutException e) {
            e.printStackTrace();
            throw new RuntimeException("读取接口数据超时");
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("接口请求失败,请尝试检查网络环境或请求接口是否能正常访问");
        } finally {
            // 关闭响应
            try {
                if (response != null) {
                    //关闭结果集
                    response.getEntity().getContent().close();
                    response.close();
                }
            } catch (IOException e) {
                throw new RuntimeException("关闭流异常");
            }
        }
    }
    /**
@@ -251,7 +290,6 @@
        Map<String, Object> body = WxJsonUtils.parseObject(repBody, Map.class);
        return body;
    }
    /**
     * 请求结果
ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/wx/utils/WxV3Pay.java
@@ -191,7 +191,7 @@
     */
    @Override
    public Map<String, Object> refund(WxPaymentRefundModel refundModel) {
//        refundModel.setNotify_url(this.config.getV3().getNotifyRefundUrl());
        refundModel.setNotify_url(this.config.getV3().getNotifyRefundUrl() + refundModel.getNotify_url());
        return refund(this.httpClient, "/v3/refund/domestic/refunds", this.config.getHttpReadTimeoutMs(), this.config.getHttpConnectTimeoutMs(), refundModel);
    }
    
ruoyi-service/ruoyi-payment/src/main/resources/bootstrap.yml
@@ -1,3 +1,7 @@
server:
  port: 9500
  tomcat:
    basedir: /data/tomcat
# Spring
spring:
  application:
@@ -37,10 +41,7 @@
        # 共享配置
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
---
seata:
  enabled: true
  application-id: ${spring.application.name}
@@ -53,36 +54,57 @@
  config:
    type: nacos
    nacos:
      # 开发环境
      server-addr: 192.168.110.169:8848
      namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
      group: DEFAULT_GROUP
      data-id: seata-server.properties
      username: nacos
      password: nacos
      # 生产环境
#      server-addr: 192.168.0.137:8848,192.168.0.123:8848
#      namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
#      group: DEFAULT_GROUP
#      data-id: seata-server.properties
#      username: nacos
#      password: nacos
  registry:
    type: nacos
    nacos:
      application: seata-server
      # 开发环境
      server-addr: 192.168.110.169:8848
      namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb
      group: DEFAULT_GROUP
      username: nacos
      password: nacos
      # 生产环境
#      server-addr: 192.168.0.137:8848,192.168.0.123:8848
#      namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
#      group: DEFAULT_GROUP
#      username: nacos
#      password: nacos
  cloud:
    nacos:
      discovery:
        # 开发环境
        server-addr: 192.168.110.169:8848 # nacos注册中心地址
        namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb # 命名空间
        group: DEFAULT_GROUP
        application: seata-server #Nacos 中 Seata 名称
        username: nacos
        password: nacos
        # 生产环境
#        server-addr: 192.168.0.137:8848,192.168.0.123:8848
#        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
#        group: DEFAULT_GROUP
#        application: seata-server #Nacos 中 Seata 名称
#        username: nacos
#        password: nacos
    sentinel:
      transport:
        dashboard: 127.0.0.1:8080  #  Sentinel控制台地址
      eager: true
---
spring:
  config:
@@ -92,14 +114,18 @@
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 127.0.0.1:8848
        server-addr: 192.168.0.137:8848,192.168.0.123:8848
        service: ${spring.application.name}
        group: DEFAULT_GROUP
        namespace: 3452d750-b08d-4485-a1e9-4fb0548f1fc2
        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
        username: nacos
        password: nacos
      config:
        # 配置中心地址
        server-addr: 127.0.0.1:8848
        namespace: 3452d750-b08d-4485-a1e9-4fb0548f1fc2
        server-addr: 192.168.0.137:8848,192.168.0.123:8848
        namespace: c6cf40b5-44e8-43f9-be61-8d10fa830e2a
        username: nacos
        password: nacos
        group: DEFAULT_GROUP
        name: ${spring.application.name}
        # 配置文件格式
sql/quartz.sql
File was deleted
sql/ry_20230223.sql
File was deleted
sql/ry_config_20220929.sql
File was deleted
sql/ry_seata_20210128.sql
File was deleted