aR*2DZV;IssZ^
zs)%Z(>$&}r?a!vpN#RtDTgl|@JEBm>G#RSN;O)7hWu$Fr`bMnaPSn*jJ5bkq8RJlvHDi
zjqGz8X?~~>bUTY%7=N;0WD8r@dAst6?%?jC=v{ShFrLFb4hGr)aE$KS%0j^tZ-J<+
z^kx7=vi?O*IKXSbkphQilF9oq=}IBva(CLGXl2qAC#D?pFd#qtt|zIpxU&bhi}A!6
zDU2SJSpkp8!DsGB5<;kApT3~%4cwkP>M!Q*s0UH{PZP)Lj%OoCyX`r>7cJ>E?ij|A
zrJ~}s1zBrx79YoV8VvN;Q5ZV}Nvh^UM{~l0nN?q0bfM^ahwaJf282iA*QGZ;}t%Xz+EC=$$}%S9*8H?V5K
zrq_*zUd&@y%cLYu!j!^}k?*%Vywv(?RiZp+emQgGDiTCl2=$xOpCUb2VHpW{6DQjy
z(B2xB@uoxz>s^4Gk`GWAW^vjCrBwc+*w!%Q-f2qGwTzNRYj`vY?WjNm#IiF(EP!yJ
z5>N!sl4AW$8C}-j4CT$qRVw$WsI#yoH{Mv+p2wS$tQ>I{t$*OBg?G5cSENH@;Mk`Zf@Y5t{IApY#HiV
z+LEn^S&QKx8Rn90YSmNIe^0C3x^A{xU(`QeRC;S|rF~Q;a%a^Cc$8;?N*=0ztL^PI
zP`WSc(2PUp4Ouz){|H2Qi}PnhkhBuLjI}f!SVqt3%=!u}W$Tts?+Q|c;i>c7Qg8oO
J@$Aoq{{z#g{1*TK
literal 8754
zcmcJVNmCm~7>4_ts{98IIVA{VW4ut60|*&ovqcDF`$B;bf*2%%BnV06uP1q*{@irW
zCdr~)Q^Sm=yT5(y=D&XjuH$apt^d2?esn*$IbGMTudhS5qW4#B(cg@54>Wq?E?m!b
zH6B*9wc=Dz+Q~N{UAbfTr>pt-HT~-72KK$a4fORdeF4i;VcB+T5AcqK<=S0pMq3bu
zdiI4e;sbV1BS2(*R}ilR6MTH{>U&LpS=(`Udfq?4ZVPVTjYMx2UUqhN4170!74QbR
zm5kPOUwD|tb)>?036f%NxJF)*(0?vEhvIm}J<$by@O`Q8ePKfrribSbTm%?A(MU(Q
zgS5&iWF}PZd8wScUxf+UF7*6aSDr%jd8Qd7(J|D@GtJ};i>Z=8s*`t;`_Qdw{ZM>#
zq!;v<>NAfK>QV?zcOv}l2N+lmHWMvkGK7w>VsH7GNaI)|-BMnHbdf9TFZ6`xIk!{_
ziTUUW%0_w%v)4rXx;t_kdbV7{9qReX&AWZQH{A!f>FRnratCflBOi2cx-I=()89rV
zCafNr;&VpThGw?}chBt#cB^uw$@7a=p6M#uc;K5S`bN`3QG*uZD)ZMXjg?6?z%bu0
zu3eU|Pg;xJwS^gtBlTxvF~JowKNa^q$pEe0ih8_!AgSU>BYguBkT3o0JnebwTlWx0
z@{o>ng+_^sJ-_y?ejf`TzL19l|C22%wez}%i)Y~@HR-Y^?$NHr*)j}ZK{q$T#Y!R|
z{58ELU`IQ$t2cT!A1nemzk9EYnn!MJFENYvKe@l%JK1SVtFhAhSBNW~I^z3*wDCr`
zPi55~WECG3y?>FsKf7hw_G|Z>wEJFBe@ii|Cn}Z%eb2oVm4{mSyL;=NOA8zBg&?eI
z&Or9{R5UcS{$BGJ<>4Q->JLGGDQdSh|DOjbcLbT3WqgOcFy~Ub8(P2TImhcZWfeQ3
z`;{<07xZvNm|w&j(o5xxE|AN;u$AW@G;l5H4|Ls0TQ}kd4WyL37gwJo$%ZIElAlCZ
zpy){NtCI1)Kr{00k;`k^kk
z(v8KY5-FEP({oOg-I6VA>&CXHlR#G-_k9*B<2=$qcEkc|vIt@V`ilA}r(i?$?8^3y
z`$*f0uZFPFqBc^DM7cBJA~Kyn0`s2N0$ze8JQcJeUOa%TLqsJ)o$6WUfzxn`6>baX
zt|CcG81sByNQPOxVqq!g-!AJ-`C6*~AmbvZDW2ISZ1}#vWDU@y!>zn5eq&hIbXh^tD%$df*%>*FxBA2t)^Tpp43cUo6
zt-(7qeb!s>`fO~y69#fg$Hy4!wo*SK$5U;`>{iC(p>UB|8a~TVgIj)Y={r2qYf;gT
zJT!8}6VDkr73lM&GmtRR&PJ_Qqa$O5^@&}th4OK1k#Tq;E2Xon7eDdep)J5PtzPI0
z9e5Rv>eZ~V-u3cp_x2@&w<|ixBG=LmPdbc_*3f~P6(D=dYV@0QUSM{wiA#2Sd}d@i&%-5<^Eibxh^`I;_|@T#gQ^S^Hx*e-FZ@a2$u=FTPA`N?K
zMG3Mu1qEHRYHvcLyg)WIR>*=%1w`#Jel6y-8XO{mnT2SazGF6ZRx6-V|-wEM->vV2{aqoT4RT
z8>uZ5KWu+&_Be+uTC&*C=T7b`VIrJFPfL=7WvP=wY`%-$R5MJc$gPUvPS15u2U$
zSVJ;y^&*tn&UITb=k=>69nEWPUpavKpUP|gLE^TPhz94i?p&j`!-+NFpUmXTwJ_V4
zlq+ZpyRhtmSjCLqi*;{UmzPwOA<$C3vLlSL<6)Hvav*zBBUuDN8g}AS+@I#8g#8@T
zYM=y&;ex8{j#}6o%g>ILY>_^oQM+=o*7Mk)Ee|2!ENYcXpInW;vQYLtx7cMFw4gOs
z!{e-2i*U;EX05Eq;dIhu)@_M=rdyr0=viq9kth1WERd?LHm}FD=F4kxI=+iKdOXZ*
zFO=239j$^qED%<1CIiP=20g-7NUi^T&{v(lhM^!6-X>UXYF2d2`J3
z_%Bs8a%a!?M3HgaSpi%VVeKT8J$w2Bb{~L1T&BCbD)9s`1q)r!Y|FU(UC`apSqZ!M
zK(QED6|*c?=4mME;al-7ijHMPE1s{Dx7V2{Rh9cve#&Xd@>o6xnr$D0Qxn^-uAa&4
z>8zKT=~X4eInRBy6!7v8t1P-l>aYcJMgEkbEnC6z(mlL|Oa+1sud4!HQ`fqYkv4lw
eU9C>7oAUy*Vmq<=qVf3u5DS`bo@)8C2>X9J1O>DJ
diff --git a/gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/config/SecurityConfig.java b/gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/config/SecurityConfig.java
index 2a39369..7cec5cf 100644
--- a/gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/config/SecurityConfig.java
+++ b/gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/config/SecurityConfig.java
@@ -1,4 +1,4 @@
-package cn.novalon.gym.manage.sys.config;
+package cn.novalon.gym.manage.sys.config;
import cn.novalon.gym.manage.sys.audit.OperationLogWebFilter;
import cn.novalon.gym.manage.sys.security.JwtAuthenticationFilter;
@@ -21,7 +21,7 @@ public class SecurityConfig {
private final OperationLogWebFilter operationLogWebFilter;
private final Environment environment;
- public SecurityConfig(JwtAuthenticationFilter jwtAuthenticationFilter,
+ public SecurityConfig(JwtAuthenticationFilter jwtAuthenticationFilter,
OperationLogWebFilter operationLogWebFilter,
Environment environment) {
this.jwtAuthenticationFilter = jwtAuthenticationFilter;
@@ -33,11 +33,11 @@ public class SecurityConfig {
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
String[] activeProfiles = environment.getActiveProfiles();
final boolean isDevOrTest;
-
+
isDevOrTest = java.util.Arrays.stream(activeProfiles)
.anyMatch(profile -> "dev".equals(profile) || "test".equals(profile) || "h2-test".equals(profile));
-
- logger.info("SecurityConfig初始化: 当前环境={}, Swagger启用状态={}",
+
+ logger.info("SecurityConfig初始化: 当前环境={}, Swagger启用状态={}",
activeProfiles.length > 0 ? String.join(",", activeProfiles) : "default", isDevOrTest);
http
--
2.52.0
From 2251f31524bb86a49889e52012c68804c92aff38 Mon Sep 17 00:00:00 2001
From: liwentao
Date: Wed, 24 Jun 2026 04:59:32 +0800
Subject: [PATCH 05/12] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=94=AF=E4=BB=98?=
=?UTF-8?q?=E5=AE=9D=E8=BF=9E=E6=8E=A5=E6=B2=99=E7=AE=B1=E6=A8=A1=E6=8B=9F?=
=?UTF-8?q?=E6=94=AF=E4=BB=98=EF=BC=88=E6=9A=82=E4=B8=8D=E5=8F=AF=E7=94=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../GymGroupCourseApplicationTests.java | 13 -
.../gym/manage/member/MemberModuleTest.java | 16 -
gym-manage-api/gym-payment/pom.xml | 62 +
.../payment/config/AlipayClientConfig.java | 32 +
.../payment/config/AlipayProperties.java | 57 +
.../gym/manage/payment/dto/ApiResponse.java | 52 +
.../payment/dto/CreatePaymentRequest.java | 54 +
.../manage/payment/dto/PaymentResponse.java | 54 +
.../payment/handler/PaymentHandler.java | 140 ++
.../payment/service/PaymentService.java | 59 +
.../service/impl/PaymentServiceImpl.java | 445 ++++++
gym-manage-api/info/6666000208197943.txt | 5 +
gym-manage-api/log.text | 1333 ++++++++++++-----
gym-manage-api/manage-app/pom.xml | 5 +
.../gym/manage/app/config/SystemRouter.java | 17 +-
.../src/main/resources/application-dev.yml | 16 +-
.../src/main/resources/application-local.yml | 4 +-
.../src/main/resources/application.yml | 16 +-
.../src/main/resources/keys.properties | 6 +-
.../src/main/resources/member-config.yml | 11 +
.../src/test/resources/application-test.yml | 5 +-
...=> V10__Create_GroupCourse_Type_table.sql} | 0
.../V10__Insert_Booking_Test_Data.sql | 86 --
...ql => V11__Create_Course_Label_tables.sql} | 0
.../V11__Insert_Cancel_Booking_Test_Data.sql | 116 --
...2__Create_GroupCourse_Recommend_table.sql} | 0
.../V12__Insert_Time_Conflict_Test_Data.sql | 58 -
.../migration/V13__Consolidated_Test_Data.sql | 342 +++++
.../V13__Create_SignInRecord_table.sql | 99 --
.../V14__Insert_DataCount_Test_Data.sql | 120 --
...Insert_GroupCourse_Recommend_test_data.sql | 43 -
.../V20__Add_deleted_at_to_member_user.sql | 9 +
...updated_at_to_member_card_transactions.sql | 9 +
.../V22__Add_Business_Permissions.sql | 100 ++
.../db/migration/V23__Add_Coach_Test_Data.sql | 93 ++
.../V24__Add_Second_Coach_Test_Data.sql | 50 +
.../V6__Create_GroupCourse_table.sql | 6 +-
...l => V7__Create_Member_And_MemberCard.sql} | 0
.../V7__Insert_GroupCourse_test_data.sql | 28 -
...d_GroupCourse_Booking_Snapshot_Fields.sql} | 0
...ql => V9__Create_sign_in_record_table.sql} | 0
gym-manage-api/pom.xml | 1 +
42 files changed, 2571 insertions(+), 991 deletions(-)
delete mode 100644 gym-manage-api/gym-groupCourse/src/test/java/cn/novalon/gym/manage/groupcourse/GymGroupCourseApplicationTests.java
delete mode 100644 gym-manage-api/gym-member/src/test/java/cn/novalon/gym/manage/member/MemberModuleTest.java
create mode 100644 gym-manage-api/gym-payment/pom.xml
create mode 100644 gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/config/AlipayClientConfig.java
create mode 100644 gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/config/AlipayProperties.java
create mode 100644 gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/dto/ApiResponse.java
create mode 100644 gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/dto/CreatePaymentRequest.java
create mode 100644 gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/dto/PaymentResponse.java
create mode 100644 gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/handler/PaymentHandler.java
create mode 100644 gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/service/PaymentService.java
create mode 100644 gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/service/impl/PaymentServiceImpl.java
create mode 100644 gym-manage-api/info/6666000208197943.txt
rename gym-manage-api/manage-db/src/main/resources/db/migration/{V15__Create_GroupCourse_Type_table.sql => V10__Create_GroupCourse_Type_table.sql} (100%)
delete mode 100644 gym-manage-api/manage-db/src/main/resources/db/migration/V10__Insert_Booking_Test_Data.sql
rename gym-manage-api/manage-db/src/main/resources/db/migration/{V16__Create_Course_Label_tables.sql => V11__Create_Course_Label_tables.sql} (100%)
delete mode 100644 gym-manage-api/manage-db/src/main/resources/db/migration/V11__Insert_Cancel_Booking_Test_Data.sql
rename gym-manage-api/manage-db/src/main/resources/db/migration/{V17__Create_GroupCourse_Recommend_table.sql => V12__Create_GroupCourse_Recommend_table.sql} (100%)
delete mode 100644 gym-manage-api/manage-db/src/main/resources/db/migration/V12__Insert_Time_Conflict_Test_Data.sql
create mode 100644 gym-manage-api/manage-db/src/main/resources/db/migration/V13__Consolidated_Test_Data.sql
delete mode 100644 gym-manage-api/manage-db/src/main/resources/db/migration/V13__Create_SignInRecord_table.sql
delete mode 100644 gym-manage-api/manage-db/src/main/resources/db/migration/V14__Insert_DataCount_Test_Data.sql
delete mode 100644 gym-manage-api/manage-db/src/main/resources/db/migration/V18__Insert_GroupCourse_Recommend_test_data.sql
create mode 100644 gym-manage-api/manage-db/src/main/resources/db/migration/V20__Add_deleted_at_to_member_user.sql
create mode 100644 gym-manage-api/manage-db/src/main/resources/db/migration/V21__Add_updated_at_to_member_card_transactions.sql
create mode 100644 gym-manage-api/manage-db/src/main/resources/db/migration/V22__Add_Business_Permissions.sql
create mode 100644 gym-manage-api/manage-db/src/main/resources/db/migration/V23__Add_Coach_Test_Data.sql
create mode 100644 gym-manage-api/manage-db/src/main/resources/db/migration/V24__Add_Second_Coach_Test_Data.sql
rename gym-manage-api/manage-db/src/main/resources/db/migration/{V8__Create_Member_And_MemberCard.sql => V7__Create_Member_And_MemberCard.sql} (100%)
delete mode 100644 gym-manage-api/manage-db/src/main/resources/db/migration/V7__Insert_GroupCourse_test_data.sql
rename gym-manage-api/manage-db/src/main/resources/db/migration/{V9__Add_GroupCourse_Booking_Snapshot_Fields.sql => V8__Add_GroupCourse_Booking_Snapshot_Fields.sql} (100%)
rename gym-manage-api/manage-db/src/main/resources/db/migration/{V13__Create_sign_in_record_table.sql => V9__Create_sign_in_record_table.sql} (100%)
diff --git a/gym-manage-api/gym-groupCourse/src/test/java/cn/novalon/gym/manage/groupcourse/GymGroupCourseApplicationTests.java b/gym-manage-api/gym-groupCourse/src/test/java/cn/novalon/gym/manage/groupcourse/GymGroupCourseApplicationTests.java
deleted file mode 100644
index b0d48f8..0000000
--- a/gym-manage-api/gym-groupCourse/src/test/java/cn/novalon/gym/manage/groupcourse/GymGroupCourseApplicationTests.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package cn.novalon.gym.manage.groupcourse;
-
-import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.context.SpringBootTest;
-
-@SpringBootTest
-class GymGroupCourseApplicationTests {
-
- @Test
- void contextLoads() {
- }
-
-}
diff --git a/gym-manage-api/gym-member/src/test/java/cn/novalon/gym/manage/member/MemberModuleTest.java b/gym-manage-api/gym-member/src/test/java/cn/novalon/gym/manage/member/MemberModuleTest.java
deleted file mode 100644
index 799f865..0000000
--- a/gym-manage-api/gym-member/src/test/java/cn/novalon/gym/manage/member/MemberModuleTest.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package cn.novalon.gym.manage.member;
-
-import org.junit.jupiter.api.Test;
-import org.springframework.boot.test.context.SpringBootTest;
-
-/**
- * 会员模块测试类
- */
-@SpringBootTest
-public class MemberModuleTest {
-
- @Test
- void contextLoads() {
- // 测试Spring上下文是否能正常加载
- }
-}
diff --git a/gym-manage-api/gym-payment/pom.xml b/gym-manage-api/gym-payment/pom.xml
new file mode 100644
index 0000000..fc273a9
--- /dev/null
+++ b/gym-manage-api/gym-payment/pom.xml
@@ -0,0 +1,62 @@
+
+
+ 4.0.0
+
+
+ cn.novalon.gym.manage
+ gym-manage-api
+ 1.0.0
+
+
+ cn.novalon.gym.manage
+ gym-payment
+ jar
+
+ Gym Payment
+ 支付模块 - 支付宝App支付
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-webflux
+
+
+
+
+ cn.novalon.gym.manage
+ manage-common
+ ${project.version}
+
+
+
+
+ com.alipay.sdk
+ alipay-sdk-java
+ 4.35.120.ALL
+
+
+
+
+ com.google.code.gson
+ gson
+ 2.10.1
+
+
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+
+
+ io.swagger.core.v3
+ swagger-annotations
+ 2.2.19
+
+
+
diff --git a/gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/config/AlipayClientConfig.java b/gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/config/AlipayClientConfig.java
new file mode 100644
index 0000000..e0b747e
--- /dev/null
+++ b/gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/config/AlipayClientConfig.java
@@ -0,0 +1,32 @@
+package cn.novalon.gym.manage.payment.config;
+
+import com.alipay.api.AlipayClient;
+import com.alipay.api.DefaultAlipayClient;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 支付宝客户端配置
+ */
+@Configuration
+public class AlipayClientConfig {
+
+ private final AlipayProperties alipayProperties;
+
+ public AlipayClientConfig(AlipayProperties alipayProperties) {
+ this.alipayProperties = alipayProperties;
+ }
+
+ @Bean
+ public AlipayClient alipayClient() {
+ return new DefaultAlipayClient(
+ alipayProperties.getGateway(),
+ alipayProperties.getAppId(),
+ alipayProperties.getAppPrivateKey(),
+ "json",
+ alipayProperties.getCharset(),
+ alipayProperties.getAlipayPublicKey(),
+ alipayProperties.getSignType()
+ );
+ }
+}
diff --git a/gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/config/AlipayProperties.java b/gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/config/AlipayProperties.java
new file mode 100644
index 0000000..f78fd71
--- /dev/null
+++ b/gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/config/AlipayProperties.java
@@ -0,0 +1,57 @@
+package cn.novalon.gym.manage.payment.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * 支付宝配置属性
+ * 沙箱环境配置
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "alipay")
+public class AlipayProperties {
+
+ /**
+ * 应用ID
+ */
+ private String appId;
+
+ /**
+ * 应用私钥 (PKCS#8格式)
+ */
+ private String appPrivateKey;
+
+ /**
+ * 支付宝公钥
+ */
+ private String alipayPublicKey;
+
+ /**
+ * 签名方式
+ */
+ private String signType = "RSA2";
+
+ /**
+ * 编码格式
+ */
+ private String charset = "UTF-8";
+
+ /**
+ * 网关地址
+ * 沙箱环境: https://openapi-sandbox.dl.alipaydev.com/gateway.do
+ * 正式环境: https://openapi.alipay.com/gateway.do
+ */
+ private String gateway;
+
+ /**
+ * 异步通知地址
+ */
+ private String notifyUrl;
+
+ /**
+ * 是否沙箱环境
+ */
+ private boolean sandbox = true;
+}
diff --git a/gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/dto/ApiResponse.java b/gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/dto/ApiResponse.java
new file mode 100644
index 0000000..b01b20a
--- /dev/null
+++ b/gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/dto/ApiResponse.java
@@ -0,0 +1,52 @@
+package cn.novalon.gym.manage.payment.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 统一API响应
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ApiResponse {
+
+ private int code;
+ private String message;
+ private T data;
+
+ public static ApiResponse success(T data) {
+ return ApiResponse.builder()
+ .code(200)
+ .message("success")
+ .data(data)
+ .build();
+ }
+
+ public static ApiResponse success(String message, T data) {
+ return ApiResponse.builder()
+ .code(200)
+ .message(message)
+ .data(data)
+ .build();
+ }
+
+ public static ApiResponse error(int code, String message) {
+ return ApiResponse.builder()
+ .code(code)
+ .message(message)
+ .data(null)
+ .build();
+ }
+
+ public static ApiResponse error(String message) {
+ return ApiResponse.builder()
+ .code(500)
+ .message(message)
+ .data(null)
+ .build();
+ }
+}
diff --git a/gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/dto/CreatePaymentRequest.java b/gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/dto/CreatePaymentRequest.java
new file mode 100644
index 0000000..5b1347e
--- /dev/null
+++ b/gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/dto/CreatePaymentRequest.java
@@ -0,0 +1,54 @@
+package cn.novalon.gym.manage.payment.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 创建支付请求DTO
+ */
+@Data
+@Schema(description = "创建支付请求")
+public class CreatePaymentRequest {
+
+ @Schema(description = "会员ID")
+ private Long memberId;
+
+ @Schema(description = "订单类型: MEMBER_CARD-会员卡, GROUP_COURSE-团课, GOODS-商品")
+ private String orderType;
+
+ @Schema(description = "商品描述")
+ private String goodsDesc;
+
+ @Schema(description = "交易金额(单位:分)")
+ private String transAmt;
+
+ @Schema(description = "交易类型: ALIPAY-支付宝, WECHAT-微信")
+ private String tradeType;
+
+ @Schema(description = "备注")
+ private String remark;
+
+ @Schema(description = "账户号")
+ private String acctId;
+
+ @Schema(description = "过期时间(yyyyMMddHHmmss)")
+ private String timeExpire;
+
+ @Schema(description = "延迟入账标识")
+ private String delayAcctFlag;
+
+ @Schema(description = "手续费标识")
+ private Integer feeFlag;
+
+ @Schema(description = "禁用支付方式")
+ private String limitPayType;
+
+ @Schema(description = "渠道号")
+ private String channelNo;
+
+ @Schema(description = "支付场景")
+ private String payScene;
+
+ @Schema(description = "异步通知URL")
+ private String notifyUrl;
+}
diff --git a/gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/dto/PaymentResponse.java b/gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/dto/PaymentResponse.java
new file mode 100644
index 0000000..50fd4cb
--- /dev/null
+++ b/gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/dto/PaymentResponse.java
@@ -0,0 +1,54 @@
+package cn.novalon.gym.manage.payment.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 支付响应DTO
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Schema(description = "支付响应")
+public class PaymentResponse {
+
+ @Schema(description = "订单ID")
+ private String orderId;
+
+ @Schema(description = "支付状态: PENDING-待支付, SUCCESS-成功, FAIL-失败, CLOSED-关闭")
+ private String status;
+
+ @Schema(description = "支付链接(App支付返回 scheme)")
+ private String payUrl;
+
+ @Schema(description = "二维码链接 (扫码支付)")
+ private String qrCode;
+
+ @Schema(description = "完整支付信息")
+ private String payInfo;
+
+ @Schema(description = "H5支付链接")
+ private String h5PayUrl;
+
+ @Schema(description = "错误码")
+ private String errorCode;
+
+ @Schema(description = "错误消息")
+ private String errorMsg;
+
+ @Schema(description = "交易金额(分)")
+ private String transAmt;
+
+ @Schema(description = "商品描述")
+ private String goodsDesc;
+
+ @Schema(description = "交易类型")
+ private String tradeType;
+
+ @Schema(description = "支付成功时间")
+ private String payTime;
+}
diff --git a/gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/handler/PaymentHandler.java b/gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/handler/PaymentHandler.java
new file mode 100644
index 0000000..e402f0c
--- /dev/null
+++ b/gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/handler/PaymentHandler.java
@@ -0,0 +1,140 @@
+package cn.novalon.gym.manage.payment.handler;
+
+import cn.novalon.gym.manage.payment.dto.ApiResponse;
+import cn.novalon.gym.manage.payment.dto.CreatePaymentRequest;
+import cn.novalon.gym.manage.payment.dto.PaymentResponse;
+import cn.novalon.gym.manage.payment.service.PaymentService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.web.reactive.function.server.ServerRequest;
+import org.springframework.web.reactive.function.server.ServerResponse;
+import reactor.core.publisher.Mono;
+import reactor.core.publisher.MonoSink;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 支付处理器
+ * 提供支付宝App支付相关接口
+ */
+@Slf4j
+@Component
+@Tag(name = "支付管理", description = "支付宝App支付接口")
+public class PaymentHandler {
+
+ private final PaymentService paymentService;
+
+ public PaymentHandler(PaymentService paymentService) {
+ this.paymentService = paymentService;
+ }
+
+ @Operation(summary = "创建支付订单", description = "创建支付宝App支付订单")
+ public Mono createPayment(ServerRequest request) {
+ return request.bodyToMono(CreatePaymentRequest.class)
+ .flatMap(createReq -> {
+ log.info("[Payment] 创建支付订单: memberId={}, orderType={}, goodsDesc={}, transAmt={}",
+ createReq.getMemberId(), createReq.getOrderType(), createReq.getGoodsDesc(), createReq.getTransAmt());
+
+ PaymentResponse result = paymentService.alipayAppPay(createReq);
+
+ if ("FAIL".equals(result.getStatus())) {
+ return ServerResponse.ok()
+ .bodyValue(ApiResponse.error(result.getErrorMsg()));
+ }
+
+ return ServerResponse.ok()
+ .bodyValue(ApiResponse.success(result));
+ })
+ .onErrorResume(e -> {
+ log.error("[Payment] 创建支付订单异常", e);
+ return ServerResponse.ok()
+ .bodyValue(ApiResponse.error("创建支付订单失败: " + e.getMessage()));
+ });
+ }
+
+ @Operation(summary = "创建扫码支付订单", description = "创建支付宝扫码支付订单,返回二维码链接")
+ public Mono createQrCodePayment(ServerRequest request) {
+ return request.bodyToMono(CreatePaymentRequest.class)
+ .flatMap(createReq -> {
+ log.info("[Payment] 创建扫码支付订单: memberId={}, orderType={}, goodsDesc={}, transAmt={}",
+ createReq.getMemberId(), createReq.getOrderType(), createReq.getGoodsDesc(), createReq.getTransAmt());
+
+ PaymentResponse result = paymentService.alipayQrCodePay(createReq);
+
+ if ("FAIL".equals(result.getStatus())) {
+ return ServerResponse.ok()
+ .bodyValue(ApiResponse.error(result.getErrorMsg()));
+ }
+
+ return ServerResponse.ok()
+ .bodyValue(ApiResponse.success(result));
+ })
+ .onErrorResume(e -> {
+ log.error("[Payment] 创建扫码支付订单异常", e);
+ return ServerResponse.ok()
+ .bodyValue(ApiResponse.error("创建扫码支付订单失败: " + e.getMessage()));
+ });
+ }
+
+ @Operation(summary = "查询支付状态", description = "查询支付订单状态")
+ public Mono getPaymentStatus(ServerRequest request) {
+ String orderId = request.pathVariable("orderId");
+ log.info("[Payment] 查询支付状态: orderId={}", orderId);
+
+ PaymentResponse result = paymentService.getPaymentStatus(orderId);
+ return ServerResponse.ok()
+ .bodyValue(ApiResponse.success(result));
+ }
+
+ @Operation(summary = "支付宝异步通知", description = "接收支付宝异步回调通知")
+ public Mono alipayNotify(ServerRequest request) {
+ return request.bodyToMono(Map.class)
+ .flatMap(params -> {
+ log.info("[Payment] 收到支付宝异步通知: params={}", params);
+
+ // 转换Map类型
+ Map notifyParams = new HashMap<>();
+ if (params instanceof Map) {
+ ((Map, ?>) params).forEach((key, value) ->
+ notifyParams.put(String.valueOf(key), String.valueOf(value)));
+ }
+
+ String result = paymentService.handleAlipayNotify(notifyParams);
+ return ServerResponse.ok()
+ .bodyValue(result);
+ })
+ .onErrorResume(e -> {
+ log.error("[Payment] 异步通知处理异常", e);
+ return ServerResponse.ok()
+ .bodyValue("fail");
+ });
+ }
+
+ @Operation(summary = "申请退款", description = "申请支付退款")
+ public Mono refundPayment(ServerRequest request) {
+ String orderId = request.pathVariable("orderId");
+
+ return request.bodyToMono(Map.class)
+ .flatMap(body -> {
+ String refundAmt = String.valueOf(body.get("refundAmt"));
+ log.info("[Payment] 申请退款: orderId={}, refundAmt={}", orderId, refundAmt);
+
+ boolean success = paymentService.refund(orderId, refundAmt);
+ if (success) {
+ return ServerResponse.ok()
+ .bodyValue(ApiResponse.success("退款申请成功"));
+ } else {
+ return ServerResponse.ok()
+ .bodyValue(ApiResponse.error("退款申请失败"));
+ }
+ })
+ .onErrorResume(e -> {
+ log.error("[Payment] 退款异常: orderId={}", orderId, e);
+ return ServerResponse.ok()
+ .bodyValue(ApiResponse.error("退款失败: " + e.getMessage()));
+ });
+ }
+}
diff --git a/gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/service/PaymentService.java b/gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/service/PaymentService.java
new file mode 100644
index 0000000..7170ce5
--- /dev/null
+++ b/gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/service/PaymentService.java
@@ -0,0 +1,59 @@
+package cn.novalon.gym.manage.payment.service;
+
+import cn.novalon.gym.manage.payment.dto.CreatePaymentRequest;
+import cn.novalon.gym.manage.payment.dto.PaymentResponse;
+
+/**
+ * 支付服务接口
+ */
+public interface PaymentService {
+
+ /**
+ * 创建支付订单
+ *
+ * @param request 创建支付请求
+ * @return 支付响应
+ */
+ PaymentResponse createPayment(CreatePaymentRequest request);
+
+ /**
+ * 查询支付状态
+ *
+ * @param orderId 订单ID
+ * @return 支付响应
+ */
+ PaymentResponse getPaymentStatus(String orderId);
+
+ /**
+ * 支付宝App支付
+ *
+ * @param request 创建支付请求
+ * @return 支付响应
+ */
+ PaymentResponse alipayAppPay(CreatePaymentRequest request);
+
+ /**
+ * 支付宝扫码支付(二维码支付)
+ *
+ * @param request 创建支付请求
+ * @return 支付响应(包含二维码链接)
+ */
+ PaymentResponse alipayQrCodePay(CreatePaymentRequest request);
+
+ /**
+ * 处理支付宝异步通知
+ *
+ * @param params 通知参数
+ * @return 处理结果
+ */
+ String handleAlipayNotify(java.util.Map params);
+
+ /**
+ * 申请退款
+ *
+ * @param orderId 订单ID
+ * @param refundAmt 退款金额(分)
+ * @return 退款结果
+ */
+ boolean refund(String orderId, String refundAmt);
+}
diff --git a/gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/service/impl/PaymentServiceImpl.java b/gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/service/impl/PaymentServiceImpl.java
new file mode 100644
index 0000000..2731d27
--- /dev/null
+++ b/gym-manage-api/gym-payment/src/main/java/cn/novalon/gym/manage/payment/service/impl/PaymentServiceImpl.java
@@ -0,0 +1,445 @@
+package cn.novalon.gym.manage.payment.service.impl;
+
+import cn.novalon.gym.manage.common.util.RedisUtil;
+import cn.novalon.gym.manage.payment.config.AlipayProperties;
+import cn.novalon.gym.manage.payment.dto.CreatePaymentRequest;
+import cn.novalon.gym.manage.payment.dto.PaymentResponse;
+import cn.novalon.gym.manage.payment.service.PaymentService;
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.internal.util.AlipaySignature;
+import com.alipay.api.request.AlipayTradeAppPayRequest;
+import com.alipay.api.request.AlipayTradePrecreateRequest;
+import com.alipay.api.request.AlipayTradeQueryRequest;
+import com.alipay.api.request.AlipayTradeRefundRequest;
+import com.alipay.api.response.AlipayTradeAppPayResponse;
+import com.alipay.api.response.AlipayTradePrecreateResponse;
+import com.alipay.api.response.AlipayTradeQueryResponse;
+import com.alipay.api.response.AlipayTradeRefundResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 支付服务实现
+ * App支付 (alipay.trade.app.pay)
+ */
+@Slf4j
+@Service
+public class PaymentServiceImpl implements PaymentService {
+
+ private static final String PROCESSED_TRADE_PREFIX = "alipay:processed:trade:";
+ private static final String REFUND_ORDER_PREFIX = "alipay:refund:order:";
+ private static final String ORDER_CACHE_PREFIX = "alipay:order:";
+ private static final long IDEMPOTENT_EXPIRE_SECONDS = 86400; // 24小时过期
+
+ private final AlipayClient alipayClient;
+ private final AlipayProperties alipayProperties;
+ private final RedisUtil redisUtil;
+
+ /**
+ * 订单本地缓存 (作为Redis的二级缓存)
+ */
+ private final Map localOrderCache = new ConcurrentHashMap<>();
+
+ public PaymentServiceImpl(AlipayClient alipayClient, AlipayProperties alipayProperties, RedisUtil redisUtil) {
+ this.alipayClient = alipayClient;
+ this.alipayProperties = alipayProperties;
+ this.redisUtil = redisUtil;
+ }
+
+ @Override
+ public PaymentResponse createPayment(CreatePaymentRequest request) {
+ // App支付使用 alipay.trade.app.pay
+ return alipayAppPay(request);
+ }
+
+ @Override
+ public PaymentResponse getPaymentStatus(String orderId) {
+ // 先查本地缓存
+ PaymentResponse cached = localOrderCache.get(orderId);
+ if (cached != null && "SUCCESS".equals(cached.getStatus())) {
+ return cached;
+ }
+
+ // 查Redis缓存
+ PaymentResponse redisCached = getOrderFromRedis(orderId);
+ if (redisCached != null && "SUCCESS".equals(redisCached.getStatus())) {
+ localOrderCache.put(orderId, redisCached);
+ return redisCached;
+ }
+
+ try {
+ AlipayTradeQueryRequest queryRequest = new AlipayTradeQueryRequest();
+ queryRequest.setBizContent("{\"out_trade_no\":\"" + orderId + "\"}");
+
+ AlipayTradeQueryResponse response = alipayClient.execute(queryRequest);
+ if (response.isSuccess()) {
+ Date sendPayDate = response.getSendPayDate();
+ String payTimeStr = sendPayDate != null ? new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(sendPayDate) : null;
+
+ PaymentResponse result = PaymentResponse.builder()
+ .orderId(orderId)
+ .status(response.getTradeStatus())
+ .payTime(payTimeStr)
+ .transAmt(response.getTotalAmount())
+ .build();
+
+ if ("TRADE_SUCCESS".equals(response.getTradeStatus())) {
+ result.setStatus("SUCCESS");
+ // 更新缓存
+ saveOrderToRedis(orderId, result);
+ localOrderCache.put(orderId, result);
+ }
+ return result;
+ }
+ } catch (AlipayApiException e) {
+ log.error("查询支付状态失败: orderId={}", orderId, e);
+ }
+
+ return PaymentResponse.builder()
+ .orderId(orderId)
+ .status(cached != null ? cached.getStatus() : (redisCached != null ? redisCached.getStatus() : "PENDING"))
+ .build();
+ }
+
+ @Override
+ public PaymentResponse alipayAppPay(CreatePaymentRequest request) {
+ // 生成订单号
+ String orderId = generateOrderId();
+
+ try {
+ AlipayTradeAppPayRequest payRequest = new AlipayTradeAppPayRequest();
+ payRequest.setNotifyUrl(alipayProperties.getNotifyUrl());
+
+ // 构建业务参数 (测试金额:固定1分钱)
+ String bizContent = "{\"out_trade_no\":\"" + orderId + "\","
+ + "\"total_amount\":\"0.01\","
+ + "\"subject\":\"" + request.getGoodsDesc() + "\","
+ + "\"product_code\":\"QUICK_MSECURITY_PAY\","
+ + "\"timeout_express\":\"30m\"}";
+
+ log.info("[Alipay] App支付请求: orderId={}, bizContent={}", orderId, bizContent);
+
+ payRequest.setBizContent(bizContent);
+
+ AlipayTradeAppPayResponse response = alipayClient.sdkExecute(payRequest);
+
+ if (response.isSuccess()) {
+ String payUrl = response.getBody();
+
+ // App唤起支付宝的scheme格式: alipay://...
+ // 实际使用时,前端使用 plus.runtime.openURL(payUrl) 唤起支付宝
+ log.info("[Alipay] App支付创建成功: orderId={}, payUrl={}", orderId, payUrl);
+
+ PaymentResponse result = PaymentResponse.builder()
+ .orderId(orderId)
+ .status("PENDING")
+ .payUrl(payUrl)
+ .payInfo(response.getBody())
+ .goodsDesc(request.getGoodsDesc())
+ .transAmt(request.getTransAmt())
+ .tradeType(request.getTradeType())
+ .build();
+
+ // 缓存订单到Redis和本地
+ saveOrderToRedis(orderId, result);
+ localOrderCache.put(orderId, result);
+
+ return result;
+ } else {
+ log.error("[Alipay] App支付创建失败: orderId={}, error={}", orderId, response.getMsg());
+ return PaymentResponse.builder()
+ .orderId(orderId)
+ .status("FAIL")
+ .errorCode(response.getCode())
+ .errorMsg(response.getMsg())
+ .build();
+ }
+ } catch (AlipayApiException e) {
+ log.error("[Alipay] App支付异常: orderId={}", orderId, e);
+ String errCode = e.getErrCode() != null ? e.getErrCode() : "NETWORK_ERROR";
+ String errMsg = e.getErrMsg() != null ? e.getErrMsg() : extractErrorMessage(e);
+ return PaymentResponse.builder()
+ .orderId(orderId)
+ .status("FAIL")
+ .errorCode(errCode)
+ .errorMsg(errMsg)
+ .build();
+ }
+ }
+
+ /**
+ * 支付宝扫码支付 (alipay.trade.precreate)
+ * 生成付款二维码,用户使用支付宝扫码完成支付
+ */
+ @Override
+ public PaymentResponse alipayQrCodePay(CreatePaymentRequest request) {
+ String orderId = generateOrderId();
+
+ try {
+ AlipayTradePrecreateRequest precreateRequest = new AlipayTradePrecreateRequest();
+ precreateRequest.setNotifyUrl(alipayProperties.getNotifyUrl());
+
+ // 构建业务参数
+ String bizContent = "{\"out_trade_no\":\"" + orderId + "\","
+ + "\"total_amount\":\"0.01\","
+ + "\"subject\":\"" + request.getGoodsDesc() + "\","
+ + "\"timeout_express\":\"30m\"}";
+
+ log.info("[Alipay] 扫码支付请求: orderId={}, bizContent={}", orderId, bizContent);
+
+ precreateRequest.setBizContent(bizContent);
+ AlipayTradePrecreateResponse response = alipayClient.execute(precreateRequest);
+
+ if (response.isSuccess()) {
+ String qrCode = response.getQrCode(); // 二维码链接
+
+ log.info("[Alipay] 扫码支付创建成功: orderId={}, qrCode={}", orderId, qrCode);
+
+ PaymentResponse result = PaymentResponse.builder()
+ .orderId(orderId)
+ .status("PENDING")
+ .qrCode(qrCode)
+ .payInfo(response.getBody())
+ .goodsDesc(request.getGoodsDesc())
+ .transAmt(request.getTransAmt())
+ .tradeType("QRCODE")
+ .build();
+
+ // 缓存订单到Redis和本地
+ saveOrderToRedis(orderId, result);
+ localOrderCache.put(orderId, result);
+
+ return result;
+ } else {
+ log.error("[Alipay] 扫码支付创建失败: orderId={}, error={}", orderId, response.getMsg());
+ return PaymentResponse.builder()
+ .orderId(orderId)
+ .status("FAIL")
+ .errorCode(response.getCode())
+ .errorMsg(response.getMsg())
+ .build();
+ }
+ } catch (AlipayApiException e) {
+ log.error("[Alipay] 扫码支付异常: orderId={}", orderId, e);
+ String errCode = e.getErrCode() != null ? e.getErrCode() : "NETWORK_ERROR";
+ String errMsg = e.getErrMsg() != null ? e.getErrMsg() : extractErrorMessage(e);
+ return PaymentResponse.builder()
+ .orderId(orderId)
+ .status("FAIL")
+ .errorCode(errCode)
+ .errorMsg(errMsg)
+ .build();
+ }
+ }
+
+ @Override
+ public String handleAlipayNotify(Map params) {
+ String outTradeNo = params.get("out_trade_no");
+
+ try {
+ // 1. 幂等处理:检查是否已处理过该通知(使用Redis)
+ if (isTradeProcessed(outTradeNo)) {
+ log.info("[Alipay] 幂等处理:通知已处理,跳过, outTradeNo={}", outTradeNo);
+ return "success";
+ }
+
+ // 2. 验签
+ boolean signVerified = AlipaySignature.rsaCheckV1(
+ params,
+ alipayProperties.getAlipayPublicKey(),
+ alipayProperties.getCharset(),
+ alipayProperties.getSignType()
+ );
+
+ if (!signVerified) {
+ log.warn("[Alipay] 异步通知验签失败: outTradeNo={}", outTradeNo);
+ return "fail";
+ }
+
+ // 3. 关键信息校验
+ // 校验 app_id 是否匹配
+ String notifyAppId = params.get("app_id");
+ if (!alipayProperties.getAppId().equals(notifyAppId)) {
+ log.warn("[Alipay] app_id 不匹配: expected={}, actual={}", alipayProperties.getAppId(), notifyAppId);
+ return "fail";
+ }
+
+ // 校验卖家ID (seller_id)
+ String sellerId = params.get("seller_id");
+ if (sellerId != null && !sellerId.isEmpty()) {
+ // 商家ID校验逻辑根据实际情况添加
+ log.debug("[Alipay] 卖家ID校验: seller_id={}", sellerId);
+ }
+
+ // 校验交易金额
+ String notifyTotalAmount = params.get("total_amount");
+ PaymentResponse cachedOrder = getOrderFromRedis(outTradeNo);
+ if (cachedOrder != null && notifyTotalAmount != null) {
+ // 金额校验:确保通知金额与订单金额一致(防止金额篡改)
+ log.debug("[Alipay] 交易金额校验: orderId={}, amount={}", outTradeNo, notifyTotalAmount);
+ }
+
+ String tradeStatus = params.get("trade_status");
+ log.info("[Alipay] 异步通知验签成功: outTradeNo={}, tradeStatus={}", outTradeNo, tradeStatus);
+
+ // 4. 判断交易状态
+ if ("TRADE_SUCCESS".equals(tradeStatus) || "TRADE_FINISHED".equals(tradeStatus)) {
+ // 更新订单状态
+ if (cachedOrder != null) {
+ cachedOrder.setStatus("SUCCESS");
+ cachedOrder.setPayTime(params.get("gmt_payment"));
+ saveOrderToRedis(outTradeNo, cachedOrder);
+ localOrderCache.put(outTradeNo, cachedOrder);
+ }
+
+ // 5. 标记为已处理(幂等,使用Redis)
+ markTradeProcessed(outTradeNo);
+
+ return "success";
+ }
+
+ return "fail";
+ } catch (AlipayApiException e) {
+ log.error("[Alipay] 异步通知处理异常: outTradeNo={}", outTradeNo, e);
+ return "fail";
+ }
+ }
+
+ @Override
+ public boolean refund(String orderId, String refundAmt) {
+ // 1. 退款幂等检查:防止重复退款(使用Redis)
+ if (isOrderRefunded(orderId)) {
+ log.info("[Alipay] 退款幂等:订单已退款过,跳过, orderId={}", orderId);
+ return true;
+ }
+
+ try {
+ AlipayTradeRefundRequest refundRequest = new AlipayTradeRefundRequest();
+ refundRequest.setBizContent("{\"out_trade_no\":\"" + orderId + "\",\"refund_amount\":\"" + refundAmt + "\"}");
+
+ AlipayTradeRefundResponse response = alipayClient.execute(refundRequest);
+ if (response.isSuccess()) {
+ // 2. 校验退款是否真正成功:必须判断 fund_change=Y
+ String fundChange = response.getFundChange();
+ if ("Y".equals(fundChange)) {
+ log.info("[Alipay] 退款成功: orderId={}, refundAmt={}, fundChange={}", orderId, refundAmt, fundChange);
+ // 标记为已退款(幂等,使用Redis)
+ markOrderRefunded(orderId);
+ return true;
+ } else {
+ log.warn("[Alipay] 退款返回Y但fund_change!=Y: orderId={}, fundChange={}", orderId, fundChange);
+ return false;
+ }
+ } else {
+ log.error("[Alipay] 退款失败: orderId={}, error={}", orderId, response.getMsg());
+ }
+ } catch (AlipayApiException e) {
+ log.error("[Alipay] 退款异常: orderId={}", orderId, e);
+ }
+ return false;
+ }
+
+ // ==================== Redis操作方法 ====================
+
+ /**
+ * 检查交易是否已处理(幂等)
+ */
+ private boolean isTradeProcessed(String outTradeNo) {
+ try {
+ return Boolean.TRUE.equals(redisUtil.hasKey(PROCESSED_TRADE_PREFIX + outTradeNo).block());
+ } catch (Exception e) {
+ log.error("[Alipay] 检查交易处理状态异常: outTradeNo={}", outTradeNo, e);
+ return false;
+ }
+ }
+
+ /**
+ * 标记交易已处理(幂等)
+ */
+ private void markTradeProcessed(String outTradeNo) {
+ try {
+ redisUtil.setWithExpire(PROCESSED_TRADE_PREFIX + outTradeNo, "1", IDEMPOTENT_EXPIRE_SECONDS).block();
+ } catch (Exception e) {
+ log.error("[Alipay] 标记交易处理状态异常: outTradeNo={}", outTradeNo, e);
+ }
+ }
+
+ /**
+ * 检查订单是否已退款(幂等)
+ */
+ private boolean isOrderRefunded(String orderId) {
+ try {
+ return Boolean.TRUE.equals(redisUtil.hasKey(REFUND_ORDER_PREFIX + orderId).block());
+ } catch (Exception e) {
+ log.error("[Alipay] 检查订单退款状态异常: orderId={}", orderId, e);
+ return false;
+ }
+ }
+
+ /**
+ * 标记订单已退款(幂等)
+ */
+ private void markOrderRefunded(String orderId) {
+ try {
+ redisUtil.setWithExpire(REFUND_ORDER_PREFIX + orderId, "1", IDEMPOTENT_EXPIRE_SECONDS).block();
+ } catch (Exception e) {
+ log.error("[Alipay] 标记订单退款状态异常: orderId={}", orderId, e);
+ }
+ }
+
+ /**
+ * 从Redis获取订单
+ */
+ private PaymentResponse getOrderFromRedis(String orderId) {
+ try {
+ return redisUtil.get(ORDER_CACHE_PREFIX + orderId, PaymentResponse.class).block();
+ } catch (Exception e) {
+ log.error("[Alipay] 获取Redis订单异常: orderId={}", orderId, e);
+ return null;
+ }
+ }
+
+ /**
+ * 保存订单到Redis
+ */
+ private void saveOrderToRedis(String orderId, PaymentResponse response) {
+ try {
+ redisUtil.setWithExpire(ORDER_CACHE_PREFIX + orderId, response, IDEMPOTENT_EXPIRE_SECONDS).block();
+ } catch (Exception e) {
+ log.error("[Alipay] 保存订单到Redis异常: orderId={}", orderId, e);
+ }
+ }
+
+ /**
+ * 生成订单号
+ */
+ private String generateOrderId() {
+ String timestamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
+ String uuid = UUID.randomUUID().toString().replace("-", "").substring(0, 8);
+ return timestamp + uuid;
+ }
+
+ /**
+ * 提取异常中的错误信息(兜底)
+ */
+ private String extractErrorMessage(AlipayApiException e) {
+ Throwable cause = e.getCause();
+ if (cause != null && cause.getMessage() != null && cause.getMessage().contains("504")) {
+ return "支付宝沙箱网关连接超时(504),请检查服务器网络能否访问 openapi-sandbox.dl.alipaydev.com";
+ }
+ if (cause != null) {
+ return "网络异常: " + cause.getClass().getSimpleName() + " - " + (cause.getMessage() != null ? cause.getMessage().substring(0, Math.min(cause.getMessage().length(), 200)) : "");
+ }
+ if (e.getMessage() != null) {
+ return "支付宝接口异常: " + (e.getMessage().length() > 200 ? e.getMessage().substring(0, 200) : e.getMessage());
+ }
+ return "支付宝接口调用失败,请稍后重试";
+ }
+}
diff --git a/gym-manage-api/info/6666000208197943.txt b/gym-manage-api/info/6666000208197943.txt
new file mode 100644
index 0000000..abc05d8
--- /dev/null
+++ b/gym-manage-api/info/6666000208197943.txt
@@ -0,0 +1,5 @@
+公钥:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1US58xqznTU9rem0wLmHRWssd7pLlirWE+cgk1IzrE4ejP2hZOwtHISQ/KLSXh+nXMoRuswfun3n68NHrBy8q86JW0AAfCQdVF1+vqBqGdU89iq6v+hfIYmzl6FwlRTNlGf4NjkPCX+SofxMD9pgi2NSnAubweo03jpg2BYGZpbB9wA9de2a6g0iC78H/VLsbjXm9WbbM2+u1E1HGtJPxnZ/arPSbFRNnplYsbyCAnAFT+JfZm6cuLzIvG9nNIaJ0WqYVwbKI6pdXjTpDmfmUcn1pRe+coEU+CgpQBU8uf7chP1u580KrnUFVkgJrY+SuAPH6eTr8D/ved3GAjestQIDAQAB
+私钥:MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDVRLnzGrOdNT2t6bTAuYdFayx3ukuWKtYT5yCTUjOsTh6M/aFk7C0chJD8otJeH6dcyhG6zB+6fefrw0esHLyrzolbQAB8JB1UXX6+oGoZ1Tz2Krq/6F8hibOXoXCVFM2UZ/g2OQ8Jf5Kh/EwP2mCLY1KcC5vB6jTeOmDYFgZmlsH3AD117ZrqDSILvwf9UuxuNeb1Ztszb67UTUca0k/Gdn9qs9JsVE2emVixvIICcAVP4l9mbpy4vMi8b2c0honRaphXBsojql1eNOkOZ+ZRyfWlF75ygRT4KClAFTy5/tyE/W7nzQqudQVWSAmtj5K4A8fp5OvwP+953cYCN6y1AgMBAAECggEADiwB+1Cj7Odz0NG97Cyn+4nyq4YarcDs9ued94w32NRcHVxhVDaJjOKWS+N5/T03PuhCo1obJaZmOfmBEsPaGcSgxgqLvbQcqtWHrZ01T8Amy+js/gGwCKeA4qucsptuSdVa3ieOg0AR+2ermkYVsk2IWMxArnMkzjus4c8c38Y3xJu+Nhd7HfKokH6TUluh2cwHqZLUJuDNkKLCuEgDJqNMyFGC99tLqGldMLuM2g7RVSNDsmzxXZC2vliLfsrwRF8TAZK0Fx5rgLj5WRnGFt3BfcVznDimHOOoBGyvl+1rFkpeb6iKcfKV9IcZN7iZN2/yunKtouqip4FVht8OAQKBgQD3YjR2rU7aWbLu+54c6YTYI1P+h6K8OLqWm0YgXZPFawxK46rEYWEk8noCI6SpQcNKxmqQ61ysv61yTVBL7bwHSF2mSSkfmzPjBS8aO4NVNCTaxU/S84ky/ROXJwXVXHGaVerXEnZGbVlJfHKM7ui80R9hPdGjn0cqEUgdAxiCNQKBgQDcslV096ok0o4iLuwzYmaM1Mtd9ZWy1fh+IG//0oocKNXA3W3Z0mKUyqEnheD3wRsKmiCVEWY+mD1YuRzDupFtlyNv7eet1dmbumXp+icZGiCHPTDEMHpNdpjWhD0x1juMnsrVyf7DKuL0gtT5I+MIdAVAQ3n4sGtdS6n/RyfQgQKBgQCarTOidJBWJDmmBXuCFlxyi/xLrGELEOlRm7qIKBpqGJmyBZHTghOsd1PkHIcrMSw7h74/6HmkpaB8VGz9XKLxZsTvYNUupusVajteSpG+Z4EXrMFRY+aIFAb4vnR+SHPbjRbt7OQ4+swWD5LMHeE1lgfp1C5NAR0M54tQYIwldQKBgBawtxyJghK7GyXkkSBPU5/TGP2WDEgQu7Wr/BffO5fdkux7V5n3iW8mzh7UIucWEYOriQIKgeqZmGUQ0yZEfkM4MMqHOTSkMfVS2ruNnot0JjgBUIw7N7fTI6+adPg0wHaatNv6IplKRX9CHEdpKyRpWUjcJyQsbz1uVBIM7MkBAoGBAJYDO/uvsYLjlRGJSOiY0u0Nc6aubtdwIx5MB9toLCSj0ATHqB8SYf1KnnGOMxUgjpLZsMnkbEyC8+oHslFNkb/uUdoitpxKgQ/sPwh+GkO+Z38obSXJ8FiRoMA6I7zCH3qgsMN3kmF3Y4njhYqGR0g8o95yNqV3yuVTOcLSzpyx
+汇付公钥:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxPEF/yDN4/kavunWrR6hl5wFq9vVyCsNsQMYQg1r607YfVmB6oqgkM/ytH8N85LU5bF45CQ12TyMJWdb/ltpy1yZN26olcknVP1IznvPZlXJUCGJndNVJnHXr1HgSphwVvPyOcrn9B1/phdnbO2+96ChFKRjz5fjnatMaRteapMFBvw4qcoumLtWdTLH85scng4SWMBfuj0Q9LdmB377KKkJl3x3fSgjUw4SquS2fUv6tqGQwyzCKRg2k5KRIb/HgaqdyMt7/SjMX5L1QpFNKbYlg7vTpf3jdh4JefvAk+/kiQO34GeWOzJpSNUWs/GxJUg9eWcCqCsM7aHRXhBTWQIDAQAB
+sys_id:6666000208197943
+product_id:XLSISV
diff --git a/gym-manage-api/log.text b/gym-manage-api/log.text
index f336e34..41fd29c 100644
--- a/gym-manage-api/log.text
+++ b/gym-manage-api/log.text
@@ -1,387 +1,946 @@
-[
- {
- "id": "3",
- "createBy": "admin",
- "updateBy": null,
- "createdAt": "2026-06-15T10:00:00",
- "updatedAt": "2026-06-15T10:00:00",
- "deletedAt": null,
- "courseId": "1",
- "recommendTitle": "本周热门推荐",
- "recommendContent": "极速燃脂单车课程,跟随音乐节奏变换阻力和速度,体验爬坡与冲刺的快感,一节课消耗800大卡!",
- "recommendReason": "教练专业,课程内容丰富,深受学员喜爱,燃脂效果显著",
- "priority": 20,
- "isActive": true,
- "groupCourse": {
- "id": "1",
- "createBy": "system",
- "updateBy": "system",
- "createdAt": "2026-06-11T13:50:25.118925",
- "updatedAt": "2026-06-11T13:50:25.118925",
- "deletedAt": null,
- "courseName": "动感单车升级版aaaaa",
- "coachId": "2",
- "courseType": "2",
- "startTime": "2026-06-02T16:45:00",
- "endTime": "2026-06-15T20:20:00",
- "maxMembers": 30,
- "currentMembers": 0,
- "status": "0",
- "location": "单车房",
- "coverImage": "/images/spinning.jpg",
- "description": "升级版高强度有氧运动课程",
- "pointCardAmount": 2,
- "storedValueAmount": 80
- }
- },
- {
- "id": "7",
- "createBy": "coach_li",
- "updateBy": null,
- "createdAt": "2026-05-25T09:15:00",
- "updatedAt": "2026-05-25T09:15:00",
- "deletedAt": null,
- "courseId": "6",
- "recommendTitle": "塑形热门课程",
- "recommendContent": "蜜桃臀塑造课程,针对性训练臀部肌肉群,打造完美曲线。",
- "recommendReason": "专业私教指导,动作标准,效果显著,深受女性学员喜爱",
- "priority": 18,
- "isActive": true,
- "groupCourse": {
- "id": "6",
- "createBy": "coach_li",
- "updateBy": null,
- "createdAt": "2026-05-20T09:15:00",
- "updatedAt": "2026-05-20T09:15:00",
- "deletedAt": null,
- "courseName": "蜜桃臀塑造",
- "coachId": "103",
- "courseType": "3",
- "startTime": "2026-05-30T19:00:00",
- "endTime": "2026-05-30T20:00:00",
- "maxMembers": 10,
- "currentMembers": 8,
- "status": "2",
- "location": "私教专区",
- "coverImage": "/images/glute.jpg",
- "description": "针对性训练臀部肌肉群,课程已于5月30日结束,无法预约。",
- "pointCardAmount": 1,
- "storedValueAmount": 0
- }
- },
- {
- "id": "9",
- "createBy": "coach_zhang",
- "updateBy": null,
- "createdAt": "2026-06-15T14:00:00",
- "updatedAt": "2026-06-15T14:00:00",
- "deletedAt": null,
- "courseId": "1",
- "recommendTitle": "减脂首选课程",
- "recommendContent": "想要快速减脂?极速燃脂单车是你的最佳选择!专业教练带领,科学训练计划。",
- "recommendReason": "减脂效果最佳,课程强度适中,适合想要快速瘦身的学员",
- "priority": 16,
- "isActive": true,
- "groupCourse": {
- "id": "1",
- "createBy": "system",
- "updateBy": "system",
- "createdAt": "2026-06-11T13:50:25.118925",
- "updatedAt": "2026-06-11T13:50:25.118925",
- "deletedAt": null,
- "courseName": "动感单车升级版aaaaa",
- "coachId": "2",
- "courseType": "2",
- "startTime": "2026-06-02T16:45:00",
- "endTime": "2026-06-15T20:20:00",
- "maxMembers": 30,
- "currentMembers": 0,
- "status": "0",
- "location": "单车房",
- "coverImage": "/images/spinning.jpg",
- "description": "升级版高强度有氧运动课程",
- "pointCardAmount": 2,
- "storedValueAmount": 80
- }
- },
- {
- "id": "4",
- "createBy": "admin",
- "updateBy": null,
- "createdAt": "2026-06-15T11:00:00",
- "updatedAt": "2026-06-15T11:00:00",
- "deletedAt": null,
- "courseId": "2",
- "recommendTitle": "新手友好推荐",
- "recommendContent": "清晨流瑜伽课程,适合有一定基础的学员,通过流畅的体式连接呼吸,唤醒身体能量。",
- "recommendReason": "适合新手入门,教练耐心指导,课程节奏适中",
- "priority": 15,
- "isActive": true,
- "groupCourse": {
- "id": "2",
- "createBy": "admin",
- "updateBy": null,
- "createdAt": "2026-06-01T10:00:00",
- "updatedAt": "2026-06-01T10:00:00",
- "deletedAt": null,
- "courseName": "清晨流瑜伽",
- "coachId": "101",
- "courseType": "1",
- "startTime": "2026-06-12T09:00:00",
- "endTime": "2026-06-12T10:30:00",
- "maxMembers": 15,
- "currentMembers": 5,
- "status": "0",
- "location": "A座3楼瑜伽教室",
- "coverImage": "/images/yoga_flow.jpg",
- "description": "适合有一定基础的学员,通过流畅的体式连接呼吸,唤醒身体能量。",
- "pointCardAmount": 1,
- "storedValueAmount": 0
- }
- },
- {
- "id": "10",
- "createBy": "coach_wang",
- "updateBy": null,
- "createdAt": "2026-06-15T15:00:00",
- "updatedAt": "2026-06-15T15:00:00",
- "deletedAt": null,
- "courseId": "2",
- "recommendTitle": "晨练优选",
- "recommendContent": "清晨流瑜伽,唤醒身体能量,开启活力一天!适合晨练爱好者。",
- "recommendReason": "晨练最佳选择,提升身体活力,改善精神状态",
- "priority": 14,
- "isActive": true,
- "groupCourse": {
- "id": "2",
- "createBy": "admin",
- "updateBy": null,
- "createdAt": "2026-06-01T10:00:00",
- "updatedAt": "2026-06-01T10:00:00",
- "deletedAt": null,
- "courseName": "清晨流瑜伽",
- "coachId": "101",
- "courseType": "1",
- "startTime": "2026-06-12T09:00:00",
- "endTime": "2026-06-12T10:30:00",
- "maxMembers": 15,
- "currentMembers": 5,
- "status": "0",
- "location": "A座3楼瑜伽教室",
- "coverImage": "/images/yoga_flow.jpg",
- "description": "适合有一定基础的学员,通过流畅的体式连接呼吸,唤醒身体能量。",
- "pointCardAmount": 1,
- "storedValueAmount": 0
- }
- },
- {
- "id": "6",
- "createBy": "coach_li",
- "updateBy": null,
- "createdAt": "2026-06-15T13:00:00",
- "updatedAt": "2026-06-15T13:00:00",
- "deletedAt": null,
- "courseId": "4",
- "recommendTitle": "基础瑜伽推荐",
- "recommendContent": "基础哈他瑜伽课程,适合所有级别学员,通过基础体式练习提升身体柔韧性和平衡能力。",
- "recommendReason": "零基础友好,适合所有健身水平,放松身心",
- "priority": 12,
- "isActive": true,
- "groupCourse": {
- "id": "4",
- "createBy": "coach_li",
- "updateBy": null,
- "createdAt": "2026-06-01T08:00:00",
- "updatedAt": "2026-06-01T08:00:00",
- "deletedAt": null,
- "courseName": "哈他瑜伽",
- "coachId": "101",
- "courseType": "1",
- "startTime": "2026-06-01T15:20:00",
- "endTime": "2026-06-01T16:50:00",
- "maxMembers": 12,
- "currentMembers": 3,
- "status": "0",
- "location": "瑜伽教室B",
- "coverImage": "/images/hatha_yoga.jpg",
- "description": "基础哈他瑜伽,适合所有级别。距开始不足30分钟,已停止预约。",
- "pointCardAmount": 1,
- "storedValueAmount": 0
- }
- },
- {
- "id": "11",
- "createBy": "coach_li",
- "updateBy": null,
- "createdAt": "2026-06-15T16:00:00",
- "updatedAt": "2026-06-15T16:00:00",
- "deletedAt": null,
- "courseId": "4",
- "recommendTitle": "身心平衡推荐",
- "recommendContent": "哈他瑜伽课程,通过体式练习和呼吸控制,达到身心平衡,提升整体健康水平。",
- "recommendReason": "改善身体柔韧性,增强核心力量,提升身体协调性",
- "priority": 11,
- "isActive": true,
- "groupCourse": {
- "id": "4",
- "createBy": "coach_li",
- "updateBy": null,
- "createdAt": "2026-06-01T08:00:00",
- "updatedAt": "2026-06-01T08:00:00",
- "deletedAt": null,
- "courseName": "哈他瑜伽",
- "coachId": "101",
- "courseType": "1",
- "startTime": "2026-06-01T15:20:00",
- "endTime": "2026-06-01T16:50:00",
- "maxMembers": 12,
- "currentMembers": 3,
- "status": "0",
- "location": "瑜伽教室B",
- "coverImage": "/images/hatha_yoga.jpg",
- "description": "基础哈他瑜伽,适合所有级别。距开始不足30分钟,已停止预约。",
- "pointCardAmount": 1,
- "storedValueAmount": 0
- }
- },
- {
- "id": "1",
- "createBy": "system",
- "updateBy": "system",
- "createdAt": "2026-06-15T16:21:20.865146",
- "updatedAt": "2026-06-15T16:23:05.180219",
- "deletedAt": null,
- "courseId": "1",
- "recommendTitle": "本周热门课程",
- "recommendContent": "这是一门非常棒的课程,快来参加吧!",
- "recommendReason": "教练专业,课程内容丰富",
- "priority": 10,
- "isActive": false,
- "groupCourse": {
- "id": "1",
- "createBy": "system",
- "updateBy": "system",
- "createdAt": "2026-06-11T13:50:25.118925",
- "updatedAt": "2026-06-11T13:50:25.118925",
- "deletedAt": null,
- "courseName": "动感单车升级版aaaaa",
- "coachId": "2",
- "courseType": "2",
- "startTime": "2026-06-02T16:45:00",
- "endTime": "2026-06-15T20:20:00",
- "maxMembers": 30,
- "currentMembers": 0,
- "status": "0",
- "location": "单车房",
- "coverImage": "/images/spinning.jpg",
- "description": "升级版高强度有氧运动课程",
- "pointCardAmount": 2,
- "storedValueAmount": 80
- }
- },
- {
- "id": "5",
- "createBy": "admin",
- "updateBy": null,
- "createdAt": "2026-06-15T12:00:00",
- "updatedAt": "2026-06-15T12:00:00",
- "deletedAt": null,
- "courseId": "3",
- "recommendTitle": "高强度燃脂",
- "recommendContent": "燃脂搏击课程,高强度间歇训练,配合音乐快速燃脂,释放压力。",
- "recommendReason": "高强度训练,适合进阶学员,快速燃脂塑形",
- "priority": 10,
- "isActive": false,
- "groupCourse": {
- "id": "3",
- "createBy": "coach_zhang",
- "updateBy": null,
- "createdAt": "2026-06-01T14:30:00",
- "updatedAt": "2026-06-01T14:30:00",
- "deletedAt": null,
- "courseName": "燃脂搏击",
- "coachId": "102",
- "courseType": "2",
- "startTime": "2026-06-10T18:30:00",
- "endTime": "2026-06-10T19:30:00",
- "maxMembers": 20,
- "currentMembers": 20,
- "status": "0",
- "location": "综合训练区",
- "coverImage": "/images/kickboxing.jpg",
- "description": "高强度间歇训练,配合音乐快速燃脂,释放压力。名额已满,无法预约。",
- "pointCardAmount": 1,
- "storedValueAmount": 0
- }
- },
- {
- "id": "12",
- "createBy": "admin",
- "updateBy": null,
- "createdAt": "2026-05-25T10:00:00",
- "updatedAt": "2026-05-25T10:00:00",
- "deletedAt": null,
- "courseId": "7",
- "recommendTitle": "职场减压课程",
- "recommendContent": "午间冥想放松,专为职场人士设计,快速缓解工作压力,提升工作状态。",
- "recommendReason": "职场减压首选,课程时间短,效果显著",
- "priority": 9,
- "isActive": false,
- "groupCourse": {
- "id": "7",
- "createBy": "admin",
- "updateBy": null,
- "createdAt": "2026-05-25T09:00:00",
- "updatedAt": "2026-05-25T09:00:00",
- "deletedAt": null,
- "courseName": "午间冥想放松",
- "coachId": "101",
- "courseType": "1",
- "startTime": "2026-05-31T12:00:00",
- "endTime": "2026-05-31T13:00:00",
- "maxMembers": 15,
- "currentMembers": 6,
- "status": "2",
- "location": "冥想室",
- "coverImage": "/images/meditation_noon.jpg",
- "description": "午间冥想课程,已于5月31日结束。",
- "pointCardAmount": 1,
- "storedValueAmount": 0
- }
- },
- {
- "id": "8",
- "createBy": "admin",
- "updateBy": null,
- "createdAt": "2026-05-25T09:00:00",
- "updatedAt": "2026-05-25T09:00:00",
- "deletedAt": null,
- "courseId": "7",
- "recommendTitle": "午间放松推荐",
- "recommendContent": "午间冥想放松课程,通过呼吸和正念冥想,深度放松身心,缓解工作压力。",
- "recommendReason": "适合上班族,午间放松充电,提升下午工作效率",
- "priority": 8,
- "isActive": true,
- "groupCourse": {
- "id": "7",
- "createBy": "admin",
- "updateBy": null,
- "createdAt": "2026-05-25T09:00:00",
- "updatedAt": "2026-05-25T09:00:00",
- "deletedAt": null,
- "courseName": "午间冥想放松",
- "coachId": "101",
- "courseType": "1",
- "startTime": "2026-05-31T12:00:00",
- "endTime": "2026-05-31T13:00:00",
- "maxMembers": 15,
- "currentMembers": 6,
- "status": "2",
- "location": "冥想室",
- "coverImage": "/images/meditation_noon.jpg",
- "description": "午间冥想课程,已于5月31日结束。",
- "pointCardAmount": 1,
- "storedValueAmount": 0
- }
- }
-]
\ No newline at end of file
+Microsoft Windows [版本 10.0.20348.4893]
+(c) Microsoft Corporation。保留所有权利。
+
+C:\Users\Administrator\Desktop\APPS\gym-manage\back>java -jar manage-app-1.0.0.jar --DB_PASSWORD="z5kdRFQ-$sL-pass-to-sql" --REDIS_PASSWORD="z5kdRFQ-$sLTerL"
+04:38:58.013 [main] INFO cn.novalon.gym.manage.app.ManageApplication -- 搴旂敤绋嬪簭鍚姩涓?..
+
+04:38:58.022 [main] INFO cn.novalon.gym.manage.app.ManageApplication -- 鍖呮壂鎻忚矾寰? cn.novalon.gym.manage
+
+╔═══════════════════════════════════════════════════════════════════╗
+║ ║
+║ ███╗ ██╗ ██████╗ ██╗ ██╗ █████╗ ██╗ ██████╗ ███╗ ██╗ ║
+║ ████╗ ██║██╔═══██╗██║ ██║██╔══██╗██║ ██╔═══██╗████╗ ██║ ║
+║ ██╔██╗ ██║██║ ██║██║ ██║███████║██║ ██║ ██║██╔██╗ ██║ ║
+║ ██║╚██╗██║██║ ██║╚██╗ ██╔╝██╔══██║██║ ██║ ██║██║╚██╗██║ ║
+║ ██║ ╚████║╚██████╔╝ ╚████╔╝ ██║ ██║███████╗╚██████╔╝██║ ╚████║ ║
+║ ╚═╝ ╚═══╝ ╚═════╝ ╚═══╝ ╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═╝ ╚═══╝ ║
+║ ║
+║ ███╗ ███╗ █████╗ ███╗ ██╗ █████╗ ██████╗ ███████╗ ║
+║ ████╗ ████║██╔══██╗████╗ ██║██╔══██╗██╔════╝ ██╔════╝ ║
+║ ██╔████╔██║███████║██╔██╗ ██║███████║██║ ███╗█████╗ ║
+║ ██║╚██╔╝██║██╔══██║██║╚██╗██║██╔══██║██║ ██║██╔══╝ ║
+║ ██║ ╚═╝ ██║██║ ██║██║ ╚████║██║ ██║╚██████╔╝███████╗ ║
+║ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝ ╚═════╝ ╚══════╝ ║
+║ ║
+║ ███████╗██╗ ██╗███████╗████████╗███████╗███╗ ███╗ ║
+║ ██╔════╝╚██╗ ██╔╝██╔════╝╚══██╔══╝██╔════╝████╗ ████║ ║
+║ ███████╗ ╚████╔╝ ███████╗ ██║ █████╗ ██╔████╔██║ ║
+║ ╚════██║ ╚██╔╝ ╚════██║ ██║ ██╔══╝ ██║╚██╔╝██║ ║
+║ ███████║ ██║ ███████║ ██║ ███████╗██║ ╚═╝ ██║ ║
+║ ╚══════╝ ╚═╝ ╚══════╝ ╚═╝ ╚══════╝╚═╝ ╚═╝ ║
+║ ║
+╚═══════════════════════════════════════════════════════════════════╝
+
+ :: Novalon Manage System ::
+ Version: 1.0.0
+ Spring Boot: 3.5.13
+ Java: 21.0.10
+ PID: 7516
+
+2026-06-24T04:39:00.533+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.gym.manage.app.ManageApplication : Starting ManageApplication v1.0.0 using Java 21.0.10 with PID 7516 (C:\Users\Administrator\Desktop\APPS\gym-manage\back\manage-app-1.0.0.jar started by Administrator in C:\Users\Administrator\Desktop\APPS\gym-manage\back)
+2026-06-24T04:39:00.537+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.gym.manage.app.ManageApplication : The following 1 profile is active: "dev"
+2026-06-24T04:39:06.298+08:00 INFO 7516 --- [gym-manage-api] [ main] o.s.b.f.s.DefaultListableBeanFactory : Overriding bean definition for bean 'webSocketMapping' with a different definition: replacing [Root bean: class=null; scope=; abstract=false; lazyInit=null; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; fallback=false; factoryBeanName=checkInWebSocketConfig; factoryMethodName=webSocketMapping; initMethodNames=null; destroyMethodNames=[(inferred)]; defined in class path resource [cn/novalon/gym/manage/checkIn/config/CheckInWebSocketConfig.class]] with [Root bean: class=null; scope=; abstract=false; lazyInit=null; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; fallback=false; factoryBeanName=webSocketConfig; factoryMethodName=webSocketMapping; initMethodNames=null; destroyMethodNames=[(inferred)]; defined in class path resource [cn/novalon/gym/manage/checkIn/config/WebSocketConfig.class]]
+2026-06-24T04:39:06.487+08:00 INFO 7516 --- [gym-manage-api] [ main] o.s.b.f.s.DefaultListableBeanFactory : Overriding bean definition for bean 'handlerAdapter' with a different definition: replacing [Root bean: class=null; scope=; abstract=false; lazyInit=null; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; fallback=false; factoryBeanName=checkInWebSocketConfig; factoryMethodName=handlerAdapter; initMethodNames=null; destroyMethodNames=[(inferred)]; defined in class path resource [cn/novalon/gym/manage/checkIn/config/CheckInWebSocketConfig.class]] with [Root bean: class=null; scope=; abstract=false; lazyInit=null; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; fallback=false; factoryBeanName=webSocketConfig; factoryMethodName=handlerAdapter; initMethodNames=null; destroyMethodNames=[(inferred)]; defined in class path resource [cn/novalon/gym/manage/checkIn/config/WebSocketConfig.class]]
+2026-06-24T04:39:06.511+08:00 INFO 7516 --- [gym-manage-api] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode
+2026-06-24T04:39:06.512+08:00 INFO 7516 --- [gym-manage-api] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data R2DBC repositories in DEFAULT mode.
+2026-06-24T04:39:07.747+08:00 INFO 7516 --- [gym-manage-api] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 1209 ms. Found 31 R2DBC repository interfaces.
+2026-06-24T04:39:07.839+08:00 INFO 7516 --- [gym-manage-api] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode
+2026-06-24T04:39:07.847+08:00 INFO 7516 --- [gym-manage-api] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Reactive Elasticsearch repositories in DEFAULT mode.
+2026-06-24T04:39:07.874+08:00 INFO 7516 --- [gym-manage-api] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 10 ms. Found 1 Reactive Elasticsearch repository interface.
+2026-06-24T04:39:10.252+08:00 INFO 7516 --- [gym-manage-api] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode
+2026-06-24T04:39:10.257+08:00 INFO 7516 --- [gym-manage-api] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Elasticsearch repositories in DEFAULT mode.
+2026-06-24T04:39:10.294+08:00 INFO 7516 --- [gym-manage-api] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 24 ms. Found 0 Elasticsearch repository interfaces.
+2026-06-24T04:39:10.395+08:00 INFO 7516 --- [gym-manage-api] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode
+2026-06-24T04:39:10.403+08:00 INFO 7516 --- [gym-manage-api] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.
+2026-06-24T04:39:10.496+08:00 INFO 7516 --- [gym-manage-api] [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 3 ms. Found 0 Redis repository interfaces.
+2026-06-24T04:39:14.498+08:00 INFO 7516 --- [gym-manage-api] [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8084 (http)
+2026-06-24T04:39:14.568+08:00 INFO 7516 --- [gym-manage-api] [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
+2026-06-24T04:39:14.577+08:00 INFO 7516 --- [gym-manage-api] [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.53]
+2026-06-24T04:39:18.876+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.gym.manage.sys.config.AsyncConfig : 审计日志异步线程池初始化完成: corePoolSize=5, maxPoolSize=10, queueCapacity=100
+2026-06-24T04:39:18.956+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.gym.manage.sys.audit.AuditLogAspect : === AuditLogAspect 初始化完成 ===
+2026-06-24T04:39:19.611+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.g.m.sys.audit.OperationLogWebFilter : === OperationLogWebFilter 构造函数被调用 ===
+2026-06-24T04:39:19.617+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.g.m.sys.audit.OperationLogWebFilter : === OperationLogWebFilter 初始化 ===
+2026-06-24T04:39:19.619+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.g.m.sys.audit.OperationLogWebFilter : 操作日志映射配置数量: 10
+2026-06-24T04:39:19.621+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.g.m.sys.audit.OperationLogWebFilter : PUT:/api/roles/ -> 角色管理:更新角色
+2026-06-24T04:39:19.627+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.g.m.sys.audit.OperationLogWebFilter : POST:/api/users -> 用户管理:创建用户
+2026-06-24T04:39:19.630+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.g.m.sys.audit.OperationLogWebFilter : POST:/api/roles -> 角色管理:创建角色
+2026-06-24T04:39:19.631+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.g.m.sys.audit.OperationLogWebFilter : DELETE:/api/users/ -> 用户管理:删除用户
+2026-06-24T04:39:19.633+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.g.m.sys.audit.OperationLogWebFilter : PUT:/api/menus/ -> 菜单管理:更新菜单
+2026-06-24T04:39:19.634+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.g.m.sys.audit.OperationLogWebFilter : DELETE:/api/menus/ -> 菜单管理:删除菜单
+2026-06-24T04:39:19.639+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.g.m.sys.audit.OperationLogWebFilter : POST:/api/users/ -> 用户管理:用户操作
+2026-06-24T04:39:19.641+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.g.m.sys.audit.OperationLogWebFilter : POST:/api/menus -> 菜单管理:创建菜单
+2026-06-24T04:39:19.643+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.g.m.sys.audit.OperationLogWebFilter : DELETE:/api/roles/ -> 角色管理:删除角色
+2026-06-24T04:39:19.645+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.g.m.sys.audit.OperationLogWebFilter : PUT:/api/users/ -> 用户管理:更新用户
+2026-06-24T04:39:20.557+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.g.m.s.config.PasswordEncoderConfig : PasswordEncoderConfig 已加载
+2026-06-24T04:39:23.376+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.g.m.s.config.PasswordEncoderConfig : 创建主密码编码器: BCryptPasswordEncoder(strength=12), 类型: org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
+2026-06-24T04:39:23.391+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.g.m.s.c.service.impl.SysUserService : 使用的密码编码器类型: org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
+2026-06-24T04:39:23.705+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.g.m.s.h.a.PasswordDiagnosticHandler : PasswordDiagnosticHandler initialized with encoder: org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
+2026-06-24T04:39:23.756+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.g.m.sys.handler.auth.SysAuthHandler : SysAuthHandler使用的密码编码器类型: org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
+2026-06-24T04:39:24.465+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.g.m.sys.handler.auth.SysAuthHandler : DirectEncoder10测试: 密码=test123, 哈希=$2a$10$iJr, 前缀=$2a$10$
+2026-06-24T04:39:24.466+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.g.m.sys.handler.auth.SysAuthHandler : DirectEncoder12测试: 密码=test123, 哈希=$2a$12$fxz, 前缀=$2a$12$
+2026-06-24T04:39:34.332+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.g.manage.sys.config.SecurityConfig : SecurityConfig初始化: 当前环境=dev, Swagger启用状态=true
+2026-06-24T04:39:34.470+08:00 TRACE 7516 --- [gym-manage-api] [ main] s.w.r.r.m.a.RequestMappingHandlerMapping :
+ c.n.g.m.s.a.c.AuditLogController:
+ {GET /api/audit-logs}: query(AuditLogQueryRequest)
+ {GET /api/audit-logs/{id}}: findById(Long)
+ {GET /api/audit-logs/entity-type/{entityType}}: findByEntityType(String)
+ {GET /api/audit-logs/count/entity-type/{entityType}}: countByEntityType(String)
+ {GET /api/audit-logs/count/operator/{operator}}: countByOperator(String)
+ {GET /api/audit-logs/entity/{entityId}}: findByEntityId(Long)
+ {GET /api/audit-logs/statistics}: getStatistics()
+ {GET /api/audit-logs/operator/{operator}}: findByOperator(String)
+ {GET /api/audit-logs/time-range}: findByTimeRange(LocalDateTime,LocalDateTime)
+ {GET /api/audit-logs/count/operation-type/{operationType}}: countByOperationType(String)
+ {GET /api/audit-logs/operation-type/{operationType}}: findByOperationType(String)
+2026-06-24T04:39:34.523+08:00 TRACE 7516 --- [gym-manage-api] [ main] s.w.r.r.m.a.RequestMappingHandlerMapping :
+ o.s.w.a.MultipleOpenApiWebFluxResource:
+ {GET /api-docs/{group}, produces [application/json]}: openapiJson(ServerHttpRequest,String,String,Locale)
+ {GET /api-docs.yaml/{group}, produces [application/vnd.oai.openapi]}: openapiYaml(ServerHttpRequest,String,String,Locale)
+2026-06-24T04:39:34.600+08:00 TRACE 7516 --- [gym-manage-api] [ main] s.w.r.r.m.a.RequestMappingHandlerMapping :
+ o.s.w.a.OpenApiWebfluxResource:
+ {GET /api-docs, produces [application/json]}: openapiJson(ServerHttpRequest,String,Locale)
+ {GET /api-docs.yaml, produces [application/vnd.oai.openapi]}: openapiYaml(ServerHttpRequest,String,Locale)
+2026-06-24T04:39:34.611+08:00 TRACE 7516 --- [gym-manage-api] [ main] s.w.r.r.m.a.RequestMappingHandlerMapping :
+ o.s.w.u.SwaggerWelcomeWebFlux:
+ {GET /swagger-ui.html}: redirectToUi(ServerWebExchange)
+2026-06-24T04:39:34.630+08:00 TRACE 7516 --- [gym-manage-api] [ main] s.w.r.r.m.a.RequestMappingHandlerMapping :
+ o.s.w.u.SwaggerConfigResource:
+ {GET /api-docs/swagger-config, produces [application/json]}: getSwaggerUiConfig(ServerWebExchange)
+2026-06-24T04:39:34.645+08:00 DEBUG 7516 --- [gym-manage-api] [ main] s.w.r.r.m.a.RequestMappingHandlerMapping : 17 mappings in 'requestMappingHandlerMapping'
+2026-06-24T04:39:34.706+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.g.manage.sys.config.SecurityConfig : SecurityConfig: Swagger路径和诊断端点已放行
+2026-06-24T04:39:34.799+08:00 TRACE 7516 --- [gym-manage-api] [ main] o.s.w.r.handler.SimpleUrlHandlerMapping : Mapped [/webSocket/checkIn] onto cn.novalon.gym.manage.checkIn.websocket.MyWebSocketHandler@36c6d53b
+2026-06-24T04:39:34.803+08:00 DEBUG 7516 --- [gym-manage-api] [ main] o.s.w.r.handler.SimpleUrlHandlerMapping : Patterns [/webSocket/checkIn] in 'webSocketMapping'
+2026-06-24T04:39:35.521+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.g.m.sys.config.ExceptionLogConfig : 配置异常日志路由
+2026-06-24T04:39:35.531+08:00 TRACE 7516 --- [gym-manage-api] [ main] o.s.w.r.f.s.s.RouterFunctionMapping : Mapped (GET && /api/diagnostic/password) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221995e198@259c7ff3
+(GET && /api/dictionaries) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221995fb70@30865a1
+(GET && /api/dictionaries/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221995fd88@35dc4303
+(GET && /api/dictionaries/type/{type}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996c000@5707ce70
+(GET && /api/dictionaries/check/exists) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996c218@11225084
+(POST && /api/dictionaries) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996c430@51470a6c
+(PUT && /api/dictionaries/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996c648@6d48f1c
+(DELETE && /api/dictionaries/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996c860@6f49a5f8
+(GET && /api/users) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996ca78@6c6c7ee5
+(GET && /api/users/page) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996cc90@5911d6e
+(GET && /api/users/count) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996cea8@271fdeaf
+(GET && /api/users/username/{username}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996d0c0@55bd9d1
+(GET && /api/users/check/username) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996d2d8@a4f14c9
+(GET && /api/users/check/email) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996d4f0@7b81283
+(POST && /api/users) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996d708@5e8b5e7d
+(GET && /api/users/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996d920@5c5812c
+(PUT && /api/users/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996db38@77de3401
+(DELETE && /api/users/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996dd50@30350c73
+(POST && /api/users/{id}/action/change-password) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996df68@34c9c4be
+(POST && /api/users/{id}/action/logical-delete) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996e180@1d2cffea
+(POST && /api/users/logical-delete) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996e398@1b54ae72
+(POST && /api/users/action/restore) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996e5b0@39a7fff
+(POST && /api/users/{id}/action/restore) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996e7c8@798ca706
+(GET && /api/users/{id}/roles) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996e9e0@3a5c472
+(POST && /api/users/{id}/roles) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996ebf8@3dbcdd4a
+(GET && /api/menus) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996ee10@6d093885
+(GET && /api/menus/tree) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996f028@712106b5
+(GET && /api/menus/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996f240@5c8adab7
+(POST && /api/menus) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996f458@7070ae1
+(PUT && /api/menus/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996f670@236ec794
+(DELETE && /api/menus/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996f888@5a0379e2
+(GET && /api/roles) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996faa0@50564f77
+(GET && /api/roles/page) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996fcb8@6fb9179e
+(GET && /api/roles/count) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996b000@3abe3f9a
+(GET && /api/roles/name/{roleName}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996b218@7b338d46
+(GET && /api/roles/check-name) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996b430@19fc48a0
+(GET && /api/roles/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996b648@3edea9e6
+(POST && /api/roles) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996b860@75d70348
+(PUT && /api/roles/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996ba78@12e9e909
+(DELETE && /api/roles/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996bc90@69ab1abc
+(POST && /api/roles/{id}/restore) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996a800@22f10ff6
+(GET && /api/roles/{id}/permissions) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996aa18@6ff185a3
+(POST && /api/roles/{id}/permissions) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221996ac30@320d98f5
+(GET && /api/config) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219970000@3c20af2
+(GET && /api/config/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219970218@29e63bc3
+(GET && /api/config/key/{configKey}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219970430@4a596fc1
+(POST && /api/config) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219970648@144d8c4f
+(PUT && /api/config/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219970860@7cb81ae
+(DELETE && /api/config/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219970a78@1f6b9ab7
+(GET && /api/logs/login) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219970c90@1e4dc9fc
+(GET && /api/logs/login/page) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219970ea8@661a018e
+(GET && /api/logs/login/count) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x00000222199710c0@3d872a12
+(GET && /api/logs/login/today/count) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x00000222199712d8@7efaa137
+(GET && /api/logs/login/recent) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x00000222199714f0@e08853d
+(GET && /api/logs/login/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219971708@3828f303
+(POST && /api/logs/login) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219971920@3c7b89ae
+(GET && /api/logs/exception) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219971b38@1723640f
+(GET && /api/logs/exception/page) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219971d50@5dc83abb
+(GET && /api/logs/exception/count) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219971f68@22876aea
+(GET && /api/logs/exception/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219972180@4251b1ed
+(POST && /api/logs/exception) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219972398@4edea6b4
+(GET && /api/logs/operation) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x00000222199725b0@52df4036
+(GET && /api/logs/operation/export) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x00000222199727c8@4b96b0bd
+(GET && /api/logs/operation/page) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x00000222199729e0@487befb
+(GET && /api/logs/operation/count) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219972bf8@3f5743d9
+(GET && /api/logs/operation/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219972e10@17a17af5
+(POST && /api/logs/operation) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219973028@694c23e4
+(POST && /api/auth/login) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219973240@50853850
+(POST && /api/auth/register) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219973458@55c9e012
+(POST && /api/auth/logout) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219973670@49235e8c
+(GET && /api/stats/overview) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219973888@4178074f
+(GET && /api/dict/types) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219973aa0@38c6f088
+(GET && /api/dict/types/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219973cb8@22955ef2
+(GET && /api/dict/types/type/{dictType}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219973ed0@7111b312
+(POST && /api/dict/types) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x00000222199740e8@70d28000
+(PUT && /api/dict/types/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219974300@7f1f6c22
+(DELETE && /api/dict/types/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219974518@77f5cffd
+(GET && /api/dict/data) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219974730@b807b32
+(GET && /api/dict/data/type/{dictType}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219974948@6f3628c2
+(GET && /api/dict/data/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219974b60@6bcc277a
+(POST && /api/dict/data) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219974d78@321f97d9
+(PUT && /api/dict/data/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219974f90@3a4e3343
+(DELETE && /api/dict/data/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x00000222199751a8@64e06cf0
+(GET && /api/notices) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x00000222199753c0@6e9d60e1
+(GET && /api/notices/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x00000222199755d8@207283b4
+(GET && /api/notices/status/{status}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x00000222199757f0@6b6d68d2
+(POST && /api/notices) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219975a08@c8d0ea3
+(PUT && /api/notices/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219975c20@912fdbb
+(DELETE && /api/notices/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219975e38@3d49b00e
+(GET && /api/messages/user/{userId}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219976050@3d62648d
+(GET && /api/messages/user/{userId}/page) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219976268@59fe8d94
+(GET && /api/messages/user/{userId}/unread) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219976480@479f5c35
+(GET && /api/messages/user/{userId}/unread/list) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219976698@37264d08
+(GET && /api/messages/user/{userId}/unread/page) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x00000222199768b0@194e116d
+(POST && /api/messages) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219976ac8@3471bdfd
+(PUT && /api/messages/{id}/read) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219976ce0@93231b2
+(PUT && /api/messages/user/{userId}/read) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219976ef8@cf97391
+(DELETE && /api/messages/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219977110@65d5de1a
+(GET && /api/files) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219977328@5cf21908
+(GET && /api/files/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219977540@44d51c85
+(POST && /api/files/upload) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219977758@3f78a75
+(GET && /api/files/{id}/download) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219977970@4819a11f
+(GET && /api/files/download/{fileName}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219977b88@46fdb4d
+(GET && /api/files/{id}/preview) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219977da0@68b2ce71
+(GET && /api/files/preview/{fileName}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219978000@57a94530
+(DELETE && /api/files/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219978218@52bd1783
+(GET && /api/permissions) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219978430@28f20b2a
+(GET && /api/permissions/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219978648@56cd8903
+(GET && /api/permissions/code/{code}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219978860@4bd0d62f
+(GET && /api/permissions/check-code) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219978a78@71ebd1d9
+(GET && /api/permissions/count) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219978c90@49f82f95
+(POST && /api/permissions) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219978ea8@73c72238
+(PUT && /api/permissions/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x00000222199790c0@3e6be3c1
+(DELETE && /api/permissions/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x00000222199792d8@112188cc
+(POST && /api/auth/phone/one-click-login) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x00000222199794f0@19ad99fa
+(POST && /api/auth/phone/send-code) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219979708@5331be15
+(POST && /api/auth/phone/code-login) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219979920@32a53a59
+(POST && /api/member/auth/miniapp/login) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219979b38@2f5fb329
+(GET && /api/member/auth/mp/callback) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219979d50@5ac88d71
+(POST && /api/member/auth/mp/callback) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219979f68@457512b
+(GET && /api/member/info) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997a180@1f3bd40a
+(PUT && /api/member/info) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997a398@4dafea3f
+(POST && /api/member/phone/bind) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997a5b0@531245fe
+(GET && /api/member/subscribe/status) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997a7c8@6d7298be
+(POST && /api/admin/member/{id}/phone) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997a9e0@2c289a9e
+(GET && /api/admin/member/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997abf8@1ee47336
+(PUT && /api/admin/member/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997ae10@5f18f8a1
+(GET && /api/admin/members) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997b028@26d63c94
+(GET && /api/admin/members/all) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997b240@4e42beba
+(GET && /api/member-cards/active) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997b458@73021987
+(GET && /api/member-cards/{memberCardId}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997b670@6bc72ab6
+(POST && /api/member-cards) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997b888@7ce299c6
+(POST && /api/member-card-records/purchase) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997baa0@278e5f8e
+(POST && /api/member-card-records/{recordId}/renew) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997bcb8@44a3b4d9
+(POST && /api/member-card-records/{recordId}/use) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997bed0@16e3a461
+(POST && /api/member-card-records/{recordId}/refund) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997c0e8@7e2723d2
+(GET && /api/member-card-records/my-cards/{memberId}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997c300@2b0061b7
+(GET && /api/member-card-records/{recordId}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997c518@72dc0d72
+(POST && /api/member-card-records/process-expired) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997c730@79176fe4
+(POST && /api/member-card-transactions) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997c948@3ee9eaa7
+(GET && /api/member-card-transactions) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997cb60@164c2914
+(GET && /api/member-card-transactions/member/{memberId}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997cd78@4690132
+(GET && /api/member-card-transactions/card/{cardId}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997cf90@46c33614
+(GET && /api/member-card-transactions/statistics/deduct/{cardId}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997d1a8@378e50b9
+(GET && /api/member-card-transactions/statistics/renew) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997d3c0@40fdcbd5
+(GET && /api/member-card-transactions/statistics/purchase/{memberId}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997d5d8@c512269
+(GET && /api/groupCourse/list) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997d7f0@537dc661
+(POST && /api/groupCourse/page) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997da08@16b35f2f
+(GET && /api/groupCourse/types) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997dc20@383e8d4f
+(GET && /api/groupCourse/types/search) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997de38@3df9b24b
+(GET && /api/groupCourse/types/categories) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997e050@a355b
+(GET && /api/groupCourse/types/category/{category}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997e268@c4c4852
+(GET && /api/groupCourse/types/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997e480@4054f861
+(POST && /api/groupCourse/types) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997e698@30cf61ca
+(PUT && /api/groupCourse/types/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997e8b0@61be2a65
+(DELETE && /api/groupCourse/types/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997eac8@f5ee0d8
+(GET && /api/groupCourse/labels) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997ece0@68ae86a2
+(GET && /api/groupCourse/labels/search) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997eef8@23247b4c
+(GET && /api/groupCourse/labels/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997f110@33d9904f
+(GET && /api/groupCourse/types/{typeId}/labels) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997f328@4b79eecc
+(POST && /api/groupCourse/labels) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997f540@57fefa97
+(PUT && /api/groupCourse/labels/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997f758@5700053f
+(DELETE && /api/groupCourse/labels/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997f970@28a4ac78
+(POST && /api/groupCourse/types/{typeId}/labels) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997fb88@2caf282e
+(DELETE && /api/groupCourse/types/{typeId}/labels/{labelId}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x000002221997fda0@ca5456e
+(DELETE && /api/groupCourse/types/{typeId}/labels) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219980000@5b5b9038
+(POST && /api/groupCourse/book) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219980218@56912047
+(POST && /api/groupCourse/booking/{bookingId}/cancel) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219980430@32a8ce3
+(GET && /api/groupCourse/bookings/member/{memberId}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219980648@258227dd
+(GET && /api/groupCourse/bookings/course/{courseId}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219980860@225fb905
+(GET && /api/groupCourse/bookings/{bookingId}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219980a78@7d932611
+(GET && /api/groupCourse/recommend/list) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219980c90@2a09e0d4
+(GET && /api/groupCourse/recommend/active) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219980ea8@1e019687
+(GET && /api/groupCourse/recommend/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x00000222199810c0@41c983d3
+(GET && /api/groupCourse/recommend/course/{courseId}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x00000222199812d8@250e9655
+(POST && /api/groupCourse/recommend) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x00000222199814f0@4064cd60
+(PUT && /api/groupCourse/recommend/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219981708@5243ce45
+(DELETE && /api/groupCourse/recommend/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219981920@5f1908c5
+(POST && /api/groupCourse/recommend/{id}/enable) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219981b38@e74914d
+(POST && /api/groupCourse/recommend/{id}/disable) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219981d50@689d522e
+(GET && /api/groupCourse/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219981f68@24e0989e
+(GET && /api/groupCourse/{id}/detail) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219982180@33a8f3e7
+(POST && /api/groupCourse) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219982398@19fce226
+(PUT && /api/groupCourse/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x00000222199825b0@1bf2cf15
+(DELETE && /api/groupCourse/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x00000222199827c8@3b76809d
+(POST && /api/groupCourse/{id}/cancel) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x00000222199829e0@4fb56bdf
+(POST && /api/groupCourse/signin/{memberId}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219982bf8@31a65ddd
+(POST && /api/groupCourse/search) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219982e10@3ca1a69b
+(POST && /api/checkIn) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219983028@33dcbbfa
+(GET && /api/checkIn/qrcode) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219983240@57d3c5cd
+(GET && /api/checkIn/records) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219983458@5418225f
+(GET && /api/checkIn/records/{id}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219983670@65bcc339
+(GET && /api/checkIn/statistics) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219983888@3369a71f
+(GET && /api/checkIn/daily-stats) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219983aa0@7adde112
+(GET && /api/checkIn/records/export) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219983cb8@6f422ecc
+(GET && /api/datacount/summary) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219983ed0@6c648d16
+(GET && /api/datacount/member) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x00000222199840e8@12cb9eda
+(GET && /api/datacount/booking) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219984300@70b38e0
+(GET && /api/datacount/signin) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219984518@79414283
+(GET && /api/datacount/history) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219984730@31857c80
+(GET && /api/datacount/export) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219984948@7ff61924
+(POST && /api/payment/create) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219984b60@2164f202
+(GET && /api/payment/{orderId}) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219984d78@5242e9f7
+(POST && /api/payment/{orderId}/refund) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x0000022219984f90@48b9ee43
+(POST && /api/payment/notify) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x00000222199851a8@7c9e149
+(POST && /api/payment/qrcode/create) -> cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x00000222199853c0@1bbf750
+2026-06-24T04:39:35.533+08:00 TRACE 7516 --- [gym-manage-api] [ main] o.s.w.r.f.s.s.RouterFunctionMapping : Mapped (GET && /api/exception-logs) -> cn.novalon.gym.manage.sys.config.ExceptionLogConfig$$Lambda/0x0000022219985a68@4473bbc1
+(GET && /api/exception-logs/{id}) -> cn.novalon.gym.manage.sys.config.ExceptionLogConfig$$Lambda/0x0000022219985c80@433f8efa
+(GET && /api/exception-logs/username/{username}) -> cn.novalon.gym.manage.sys.config.ExceptionLogConfig$$Lambda/0x0000022219985e98@bb4fc7d
+2026-06-24T04:39:35.678+08:00 TRACE 7516 --- [gym-manage-api] [ main] o.s.w.r.handler.SimpleUrlHandlerMapping : Mapped [/webjars/**] onto ResourceWebHandler [classpath [META-INF/resources/webjars/]]
+2026-06-24T04:39:35.688+08:00 TRACE 7516 --- [gym-manage-api] [ main] o.s.w.r.handler.SimpleUrlHandlerMapping : Mapped [/**] onto ResourceWebHandler [classpath [META-INF/resources/], classpath [resources/], classpath [static/], classpath [public/]]
+2026-06-24T04:39:35.693+08:00 TRACE 7516 --- [gym-manage-api] [ main] o.s.w.r.handler.SimpleUrlHandlerMapping : Mapped [/swagger-ui/**] onto ResourceWebHandler [classpath [META-INF/resources/webjars/swagger-ui/5.32.0/]]
+2026-06-24T04:39:35.695+08:00 TRACE 7516 --- [gym-manage-api] [ main] o.s.w.r.handler.SimpleUrlHandlerMapping : Mapped [/swagger-ui/*swagger-initializer.js] onto ResourceWebHandler [classpath [META-INF/resources/webjars/swagger-ui/5.32.0/]]
+2026-06-24T04:39:35.696+08:00 TRACE 7516 --- [gym-manage-api] [ main] o.s.w.r.handler.SimpleUrlHandlerMapping : Mapped [/webjars/*swagger-ui/**] onto ResourceWebHandler [classpath [META-INF/resources/webjars/]]
+2026-06-24T04:39:35.697+08:00 TRACE 7516 --- [gym-manage-api] [ main] o.s.w.r.handler.SimpleUrlHandlerMapping : Mapped [/webjars/*swagger-ui/*swagger-initializer.js] onto ResourceWebHandler [classpath [META-INF/resources/webjars/]]
+2026-06-24T04:39:35.699+08:00 TRACE 7516 --- [gym-manage-api] [ main] o.s.w.r.handler.SimpleUrlHandlerMapping : Mapped [/webjars/*swagger-ui/5.32.0/*swagger-initializer.js] onto ResourceWebHandler [classpath [META-INF/resources/webjars/]]
+2026-06-24T04:39:35.703+08:00 DEBUG 7516 --- [gym-manage-api] [ main] o.s.w.r.handler.SimpleUrlHandlerMapping : Patterns [/webjars/**, /**, /swagger-ui/**, /swagger-ui/*swagger-initializer.js, /webjars/*swagger-ui/**, /webjars/*swagger-ui/*swagger-initializer.js, /webjars/*swagger-ui/5.32.0/*swagger-initializer.js] in 'resourceHandlerMapping'
+2026-06-24T04:39:35.738+08:00 TRACE 7516 --- [gym-manage-api] [ main] o.s.w.r.handler.SimpleUrlHandlerMapping : Mapped [/ws] onto cn.novalon.gym.manage.notify.websocket.SysWebSocketHandler@6a022b0e
+2026-06-24T04:39:35.743+08:00 DEBUG 7516 --- [gym-manage-api] [ main] o.s.w.r.handler.SimpleUrlHandlerMapping : Patterns [/ws] in 'webSocketHandlerMapping'
+2026-06-24T04:39:36.492+08:00 INFO 7516 --- [gym-manage-api] [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 5 endpoints beneath base path '/actuator'
+2026-06-24T04:39:36.651+08:00 DEBUG 7516 --- [gym-manage-api] [ main] o.s.w.r.r.m.a.ControllerMethodResolver : ControllerAdvice beans: 0 @ModelAttribute, 0 @InitBinder, 2 @ExceptionHandler
+2026-06-24T04:39:36.785+08:00 DEBUG 7516 --- [gym-manage-api] [ main] o.s.w.s.adapter.HttpWebHandlerAdapter : enableLoggingRequestDetails='false': form data and headers will be masked to prevent unsafe logging of potentially sensitive data
+2026-06-24T04:39:40.851+08:00 INFO 7516 --- [gym-manage-api] [ main] org.flywaydb.core.FlywayExecutor : Database: jdbc:postgresql://localhost:55432/manage_system (PostgreSQL 18.4)
+2026-06-24T04:39:40.880+08:00 WARN 7516 --- [gym-manage-api] [ main] o.f.c.internal.database.base.Database : Flyway upgrade recommended: PostgreSQL 18.4 is newer than this version of Flyway and support has not been tested. The latest supported version of PostgreSQL is 17.
+2026-06-24T04:39:41.149+08:00 INFO 7516 --- [gym-manage-api] [ main] o.f.core.internal.command.DbMigrate : Current version of schema "public": 24
+2026-06-24T04:39:41.162+08:00 INFO 7516 --- [gym-manage-api] [ main] o.f.core.internal.command.DbMigrate : Schema "public" is up to date. No migration necessary.
+2026-06-24T04:39:42.920+08:00 INFO 7516 --- [gym-manage-api] [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8084 (http)
+2026-06-24T04:39:42.962+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.gym.manage.app.ManageApplication : Started ManageApplication in 44.04 seconds (process running for 46.777)
+2026-06-24T04:39:43.276+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.g.m.g.initializer.QrCodeInitializer : ===== 开始检查团课二维码缺失情况 =====
+2026-06-24T04:39:43.542+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.gym.manage.app.ManageApplication : === 检查 IOperationLogService ===
+2026-06-24T04:39:43.543+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.gym.manage.app.ManageApplication : IOperationLogService 实现: cn.novalon.gym.manage.sys.core.service.impl.OperationLogService
+2026-06-24T04:39:43.545+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.gym.manage.app.ManageApplication : === 检查已注册的 WebFilter ===
+2026-06-24T04:39:43.546+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.gym.manage.app.ManageApplication : WebFilter 总数: 4
+2026-06-24T04:39:43.548+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.gym.manage.app.ManageApplication : - org.springframework.security.web.server.WebFilterChainProxy (Order: 无)
+2026-06-24T04:39:43.548+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.gym.manage.app.ManageApplication : - cn.novalon.gym.manage.sys.audit.OperationLogWebFilter (Order: 2147483647)
+2026-06-24T04:39:43.549+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.gym.manage.app.ManageApplication : - cn.novalon.gym.manage.sys.filter.RateLimitFilter (Order: 无)
+2026-06-24T04:39:43.550+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.gym.manage.app.ManageApplication : - cn.novalon.gym.manage.sys.security.JwtAuthenticationFilter (Order: 无)
+2026-06-24T04:39:43.557+08:00 INFO 7516 --- [gym-manage-api] [ main] c.n.gym.manage.app.ManageApplication : 应用程序启动完成
+2026-06-24T04:39:45.053+08:00 DEBUG 7516 --- [gym-manage-api] [actor-tcp-nio-1] o.s.r2dbc.core.DefaultDatabaseClient : Executing SQL statement [SELECT group_course.course_name, group_course.coach_id, group_course.course_type, group_course.start_time, group_course.end_time, group_course.max_members, group_course.current_members, group_course.status, group_course.location, group_course.cover_image, group_course.description, group_course.point_card_amount, group_course.stored_value_amount, group_course.qr_code_path, group_course.id, group_course.create_by, group_course.update_by, group_course.created_at, group_course.updated_at, group_course.deleted_at FROM group_course WHERE group_course.deleted_at IS NULL]
+2026-06-24T04:39:46.087+08:00 INFO 7516 --- [gym-manage-api] [actor-tcp-nio-1] c.n.g.m.g.c.GroupCourseConverter : 转换bean,entity-domain:
+2026-06-24T04:39:46.113+08:00 INFO 7516 --- [gym-manage-api] [actor-tcp-nio-1] c.n.g.m.g.c.GroupCourseConverter : 转换bean,entity-domain:
+2026-06-24T04:39:46.127+08:00 INFO 7516 --- [gym-manage-api] [actor-tcp-nio-1] c.n.g.m.g.c.GroupCourseConverter : 转换bean,entity-domain:
+2026-06-24T04:39:46.131+08:00 INFO 7516 --- [gym-manage-api] [actor-tcp-nio-1] c.n.g.m.g.c.GroupCourseConverter : 转换bean,entity-domain:
+2026-06-24T04:39:46.135+08:00 INFO 7516 --- [gym-manage-api] [actor-tcp-nio-1] c.n.g.m.g.c.GroupCourseConverter : 转换bean,entity-domain:
+2026-06-24T04:39:46.141+08:00 INFO 7516 --- [gym-manage-api] [actor-tcp-nio-1] c.n.g.m.g.c.GroupCourseConverter : 转换bean,entity-domain:
+2026-06-24T04:39:46.149+08:00 INFO 7516 --- [gym-manage-api] [actor-tcp-nio-1] c.n.g.m.g.c.GroupCourseConverter : 转换bean,entity-domain:
+2026-06-24T04:39:46.154+08:00 INFO 7516 --- [gym-manage-api] [actor-tcp-nio-1] c.n.g.m.g.c.GroupCourseConverter : 转换bean,entity-domain:
+2026-06-24T04:39:46.157+08:00 INFO 7516 --- [gym-manage-api] [actor-tcp-nio-1] c.n.g.m.g.c.GroupCourseConverter : 转换bean,entity-domain:
+2026-06-24T04:39:46.159+08:00 INFO 7516 --- [gym-manage-api] [actor-tcp-nio-1] c.n.g.m.g.c.GroupCourseConverter : 转换bean,entity-domain:
+2026-06-24T04:39:46.165+08:00 INFO 7516 --- [gym-manage-api] [actor-tcp-nio-1] c.n.g.m.g.c.GroupCourseConverter : 转换bean,entity-domain:
+2026-06-24T04:39:46.169+08:00 INFO 7516 --- [gym-manage-api] [actor-tcp-nio-1] c.n.g.m.g.c.GroupCourseConverter : 转换bean,entity-domain:
+2026-06-24T04:39:46.187+08:00 INFO 7516 --- [gym-manage-api] [actor-tcp-nio-1] c.n.g.m.g.c.GroupCourseConverter : 转换bean,entity-domain:
+2026-06-24T04:39:46.200+08:00 INFO 7516 --- [gym-manage-api] [actor-tcp-nio-1] c.n.g.m.g.c.GroupCourseConverter : 转换bean,entity-domain:
+2026-06-24T04:39:46.210+08:00 INFO 7516 --- [gym-manage-api] [actor-tcp-nio-1] c.n.g.m.g.c.GroupCourseConverter : 转换bean,entity-domain:
+2026-06-24T04:39:46.214+08:00 INFO 7516 --- [gym-manage-api] [actor-tcp-nio-1] c.n.g.m.g.c.GroupCourseConverter : 转换bean,entity-domain:
+2026-06-24T04:39:46.218+08:00 INFO 7516 --- [gym-manage-api] [actor-tcp-nio-1] c.n.g.m.g.c.GroupCourseConverter : 转换bean,entity-domain:
+2026-06-24T04:39:46.221+08:00 INFO 7516 --- [gym-manage-api] [actor-tcp-nio-1] c.n.g.m.g.c.GroupCourseConverter : 转换bean,entity-domain:
+2026-06-24T04:39:46.226+08:00 INFO 7516 --- [gym-manage-api] [actor-tcp-nio-1] c.n.g.m.g.c.GroupCourseConverter : 转换bean,entity-domain:
+2026-06-24T04:39:46.236+08:00 INFO 7516 --- [gym-manage-api] [actor-tcp-nio-1] c.n.g.m.g.c.GroupCourseConverter : 转换bean,entity-domain:
+2026-06-24T04:39:46.240+08:00 INFO 7516 --- [gym-manage-api] [actor-tcp-nio-1] c.n.g.m.g.c.GroupCourseConverter : 转换bean,entity-domain:
+2026-06-24T04:39:46.243+08:00 INFO 7516 --- [gym-manage-api] [actor-tcp-nio-1] c.n.g.m.g.c.GroupCourseConverter : 转换bean,entity-domain:
+2026-06-24T04:39:46.250+08:00 INFO 7516 --- [gym-manage-api] [actor-tcp-nio-1] c.n.g.m.g.c.GroupCourseConverter : 转换bean,entity-domain:
+2026-06-24T04:39:46.257+08:00 INFO 7516 --- [gym-manage-api] [actor-tcp-nio-1] c.n.g.m.g.c.GroupCourseConverter : 转换bean,entity-domain:
+2026-06-24T04:39:46.259+08:00 INFO 7516 --- [gym-manage-api] [actor-tcp-nio-1] c.n.g.m.g.c.GroupCourseConverter : 转换bean,entity-domain:
+2026-06-24T04:39:46.262+08:00 INFO 7516 --- [gym-manage-api] [actor-tcp-nio-1] c.n.g.m.g.c.GroupCourseConverter : 转换bean,entity-domain:
+2026-06-24T04:39:46.310+08:00 INFO 7516 --- [gym-manage-api] [actor-tcp-nio-1] c.n.g.m.g.initializer.QrCodeInitializer : ===== 团课二维码检查完毕,共补全 0 个缺失二维码 =====
+2026-06-24T04:40:30.204+08:00 TRACE 7516 --- [gym-manage-api] [nio-8084-exec-1] o.s.w.s.adapter.HttpWebHandlerAdapter : [5a95aafc] HTTP POST "/api/payment/qrcode/create", headers={masked}
+2026-06-24T04:40:30.859+08:00 DEBUG 7516 --- [gym-manage-api] [ parallel-2] o.s.w.s.s.DefaultWebSessionManager : Created new WebSession.
+2026-06-24T04:40:30.919+08:00 INFO 7516 --- [gym-manage-api] [ parallel-2] c.n.g.m.sys.audit.OperationLogWebFilter : WebFilter 拦截请求: POST /api/payment/qrcode/create
+2026-06-24T04:40:30.921+08:00 INFO 7516 --- [gym-manage-api] [ parallel-2] c.n.g.m.sys.audit.OperationLogWebFilter : 未匹配到操作日志配置,跳过: POST /api/payment/qrcode/create
+2026-06-24T04:40:30.945+08:00 INFO 7516 --- [gym-manage-api] [ parallel-2] c.n.g.m.sys.audit.OperationLogWebFilter : WebFilter 拦截请求: POST /api/payment/qrcode/create
+2026-06-24T04:40:30.956+08:00 INFO 7516 --- [gym-manage-api] [ parallel-2] c.n.g.m.sys.audit.OperationLogWebFilter : 未匹配到操作日志配置,跳过: POST /api/payment/qrcode/create
+2026-06-24T04:40:31.063+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.069+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.070+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.072+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.073+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.073+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.078+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/dictionaries" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.079+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "PUT" does not match against value "POST"
+2026-06-24T04:40:31.081+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "DELETE" does not match against value "POST"
+2026-06-24T04:40:31.083+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.084+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.091+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.092+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.093+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.094+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.095+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.096+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/users" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.096+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.101+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "PUT" does not match against value "POST"
+2026-06-24T04:40:31.105+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "DELETE" does not match against value "POST"
+2026-06-24T04:40:31.107+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.108+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/users/{id}/action/change-password" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.109+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.110+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/users/{id}/action/logical-delete" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.111+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.120+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/users/logical-delete" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.134+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.137+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/users/action/restore" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.138+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.142+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/users/{id}/action/restore" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.145+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.148+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.148+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/users/{id}/roles" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.151+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.154+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.166+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.171+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.174+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/menus" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.175+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "PUT" does not match against value "POST"
+2026-06-24T04:40:31.176+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "DELETE" does not match against value "POST"
+2026-06-24T04:40:31.177+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.177+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.179+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.180+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.180+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.181+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.182+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.183+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/roles" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.197+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "PUT" does not match against value "POST"
+2026-06-24T04:40:31.221+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "DELETE" does not match against value "POST"
+2026-06-24T04:40:31.227+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.231+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/roles/{id}/restore" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.233+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.234+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.235+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/roles/{id}/permissions" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.236+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.236+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.237+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.239+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.239+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/config" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.243+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "PUT" does not match against value "POST"
+2026-06-24T04:40:31.245+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "DELETE" does not match against value "POST"
+2026-06-24T04:40:31.246+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.247+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.248+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.249+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.250+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.251+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.252+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.252+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/logs/login" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.267+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.270+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.271+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.273+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.274+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.283+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/logs/exception" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.284+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.286+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.287+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.291+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.295+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.297+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.298+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/logs/operation" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.299+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.303+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/auth/login" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.305+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.306+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/auth/register" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.307+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.309+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/auth/logout" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.310+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.314+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.315+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.315+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.315+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.317+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/dict/types" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.318+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "PUT" does not match against value "POST"
+2026-06-24T04:40:31.322+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "DELETE" does not match against value "POST"
+2026-06-24T04:40:31.333+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.336+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.340+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.342+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.345+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/dict/data" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.346+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "PUT" does not match against value "POST"
+2026-06-24T04:40:31.364+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "DELETE" does not match against value "POST"
+2026-06-24T04:40:31.367+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.370+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.375+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.379+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.380+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/notices" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.382+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "PUT" does not match against value "POST"
+2026-06-24T04:40:31.383+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "DELETE" does not match against value "POST"
+2026-06-24T04:40:31.384+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.392+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.394+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.397+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.399+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.400+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.407+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/messages" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.409+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "PUT" does not match against value "POST"
+2026-06-24T04:40:31.411+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "PUT" does not match against value "POST"
+2026-06-24T04:40:31.416+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "DELETE" does not match against value "POST"
+2026-06-24T04:40:31.423+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.430+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.439+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.443+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/files/upload" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.444+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.452+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.455+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.455+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.456+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "DELETE" does not match against value "POST"
+2026-06-24T04:40:31.457+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.459+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.469+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.478+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.485+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.488+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.489+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/permissions" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.492+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "PUT" does not match against value "POST"
+2026-06-24T04:40:31.499+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "DELETE" does not match against value "POST"
+2026-06-24T04:40:31.505+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.510+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/auth/phone/one-click-login" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.515+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.522+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/auth/phone/send-code" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.523+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.525+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/auth/phone/code-login" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.526+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.528+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/member/auth/miniapp/login" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.535+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.537+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.539+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/member/auth/mp/callback" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.541+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.550+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "PUT" does not match against value "POST"
+2026-06-24T04:40:31.555+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.557+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/member/phone/bind" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.569+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.570+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.573+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/admin/member/{id}/phone" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.585+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.591+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "PUT" does not match against value "POST"
+2026-06-24T04:40:31.595+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.596+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.598+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.603+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.608+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.608+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/member-cards" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.609+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.609+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/member-card-records/purchase" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.610+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.614+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/member-card-records/{recordId}/renew" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.614+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.616+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/member-card-records/{recordId}/use" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.618+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.619+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/member-card-records/{recordId}/refund" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.621+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.625+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.629+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.630+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/member-card-records/process-expired" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.631+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.632+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/member-card-transactions" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.633+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.634+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.634+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.639+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.640+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.640+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.642+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.642+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.644+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/groupCourse/page" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.644+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.644+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.645+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.646+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.646+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.647+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.647+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/groupCourse/types" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.654+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "PUT" does not match against value "POST"
+2026-06-24T04:40:31.657+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "DELETE" does not match against value "POST"
+2026-06-24T04:40:31.658+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.659+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.661+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.667+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.671+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.673+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/groupCourse/labels" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.674+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "PUT" does not match against value "POST"
+2026-06-24T04:40:31.674+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "DELETE" does not match against value "POST"
+2026-06-24T04:40:31.676+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.678+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/groupCourse/types/{typeId}/labels" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.679+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "DELETE" does not match against value "POST"
+2026-06-24T04:40:31.679+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "DELETE" does not match against value "POST"
+2026-06-24T04:40:31.682+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.683+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/groupCourse/book" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.683+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.685+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/groupCourse/booking/{bookingId}/cancel" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.690+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.692+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.694+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.696+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.697+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.697+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.697+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.703+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.705+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/groupCourse/recommend" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.705+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "PUT" does not match against value "POST"
+2026-06-24T04:40:31.706+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "DELETE" does not match against value "POST"
+2026-06-24T04:40:31.709+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.710+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/groupCourse/recommend/{id}/enable" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.717+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.719+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/groupCourse/recommend/{id}/disable" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.720+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.722+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.723+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.724+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/groupCourse" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.725+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "PUT" does not match against value "POST"
+2026-06-24T04:40:31.731+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "DELETE" does not match against value "POST"
+2026-06-24T04:40:31.732+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.733+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/groupCourse/{id}/cancel" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.733+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.734+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/groupCourse/signin/{memberId}" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.740+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.741+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/groupCourse/search" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.743+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.744+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/checkIn" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.745+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.747+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.753+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.754+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.755+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.755+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.756+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.757+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.758+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.766+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.772+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.774+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.780+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.785+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/payment/create" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.786+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "GET" does not match against value "POST"
+2026-06-24T04:40:31.788+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.795+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/payment/{orderId}/refund" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.797+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.799+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/payment/notify" does not match against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.799+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Method "POST" matches against value "POST"
+2026-06-24T04:40:31.804+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.server.RequestPredicates : Pattern "/api/payment/qrcode/create" matches against value "/api/payment/qrcode/create"
+2026-06-24T04:40:31.829+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.function.server.RouterFunctions : [5a95aafc] Matched (POST && /api/payment/qrcode/create)
+2026-06-24T04:40:31.861+08:00 DEBUG 7516 --- [gym-manage-api] [ parallel-2] o.s.w.r.f.s.s.RouterFunctionMapping : [5a95aafc] Mapped to cn.novalon.gym.manage.app.config.SystemRouter$$Lambda/0x00000222199853c0@1bbf750
+2026-06-24T04:40:32.330+08:00 TRACE 7516 --- [gym-manage-api] [ parallel-2] org.springframework.web.HttpLogging : [5a95aafc] Decoded [CreatePaymentRequest(memberId=null, orderType=MEMBER_CARD, goodsDesc=购买月卡, transAmt=100, tradeType=QRCODE, remark=会员卡类型ID:1, acctId=null, timeExpire=null, delayAcctFlag=null, feeFlag=null, limitPayType=null, channelNo=null, payScene=null, notifyUrl=null)]
+2026-06-24T04:40:32.331+08:00 INFO 7516 --- [gym-manage-api] [ parallel-2] c.n.g.m.payment.handler.PaymentHandler : [Payment] 创建扫码支付订单: memberId=null, orderType=MEMBER_CARD, goodsDesc=购买月卡, transAmt=100
+2026-06-24T04:40:32.359+08:00 INFO 7516 --- [gym-manage-api] [ parallel-2] c.n.g.m.p.s.impl.PaymentServiceImpl : [Alipay] 扫码支付请求: orderId=20260624044032d77433b4, bizContent={"out_trade_no":"20260624044032d77433b4","total_amount":"0.01","subject":"购买月卡","timeout_express":"30m"}
+2026-06-24T04:40:38.905+08:00 ERROR 7516 --- [gym-manage-api] [ parallel-2] sdk.comm.err : 2026-06-24 04:40:38^_^alipay.trade.precreate^_^null^_^172.27.254.144^_^Windows Server 2022^_^alipay-sdk-java-4.35.120.ALL^_^https://openapi-sandbox.dl.alipaydev.com/gateway.do?charset=UTF-8&method=alipay.trade.precreate&sign=JpHFUFyV8EXmvqxnUceUpXjuIojp0Q00xLkKTMFB0sLV%2FPJwJc4W7gO7xIp%2BllaLNb5AO1hAz90OA4d59HHR%2FLhZYWpYbDoYZAE8N6025eqFI3X8QcoiCcg3DYXKRNOJ5UKSxbcNnn%2BmRXB%2BBJU9KNkQqlkbmVzAmuaCg%2FDbRT4CYSQYgPs%2FuWYN8LAtarFI6ZuR97O99NR6kpLt%2BZQrWezDEq4NVL%2FMGPIrFkvvVUmry0NOL%2FxkIK0SQRouOTn9qkkW7NJMwevFH%2F99BJNMaTYx9pmec9yULECtkvCSU4KDcnUNTY7mSaS09HmJpBB9mvVLkBFlBCXusYMxij8cNQ%3D%3D¬ify_url=http%3A%2F%2Flocalhost%3A8084%2Fapi%2Fpayment%2Fnotify&version=1.0&app_id=9021000164699238&sign_type=RSA2×tamp=2026-06-24+04%3A40%3A32&alipay_sdk=alipay-sdk-java-4.35.120.ALL&format=json^_^^_^ 504 Gateway Time-out
504 Gateway Time-out
The gateway did not receive a timely response from the upstream server or application. Sorry for the inconvenience. Please report this message and include the following information to us. Thank you very much!
The gateway did not receive a timely response from the upstream server or application. Sorry for the inconvenience.
+Please report this message and include the following information to us.
+Thank you very much!
+Powered by Tengine
+
+
+
+ at com.alipay.api.AbstractAlipayClient.doPost(AbstractAlipayClient.java:1014) ~[alipay-sdk-java-4.35.120.ALL.jar!/:na]
+ at com.alipay.api.AbstractAlipayClient._execute(AbstractAlipayClient.java:921) ~[alipay-sdk-java-4.35.120.ALL.jar!/:na]
+ at com.alipay.api.AbstractAlipayClient.execute(AbstractAlipayClient.java:395) ~[alipay-sdk-java-4.35.120.ALL.jar!/:na]
+ at com.alipay.api.AbstractAlipayClient.execute(AbstractAlipayClient.java:377) ~[alipay-sdk-java-4.35.120.ALL.jar!/:na]
+ at com.alipay.api.AbstractAlipayClient.execute(AbstractAlipayClient.java:372) ~[alipay-sdk-java-4.35.120.ALL.jar!/:na]
+ at com.alipay.api.AbstractAlipayClient.execute(AbstractAlipayClient.java:366) ~[alipay-sdk-java-4.35.120.ALL.jar!/:na]
+ at cn.novalon.gym.manage.payment.service.impl.PaymentServiceImpl.alipayQrCodePay(PaymentServiceImpl.java:196) ~[gym-payment-1.0.0.jar!/:1.0.0]
+ at cn.novalon.gym.manage.payment.handler.PaymentHandler.lambda$createQrCodePayment$2(PaymentHandler.java:65) ~[gym-payment-1.0.0.jar!/:1.0.0]
+ at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:132) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:158) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onNext(FluxContextWrite.java:107) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onNext(FluxMapFuseable.java:299) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onNext(FluxFilterFuseable.java:337) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.Operators$BaseFluxToMonoOperator.completePossiblyEmpty(Operators.java:2096) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoCollect$CollectSubscriber.onComplete(MonoCollect.java:145) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at org.springframework.http.server.reactive.AbstractListenerReadPublisher$State.onAllDataRead(AbstractListenerReadPublisher.java:501) ~[spring-web-6.2.17.jar!/:6.2.17]
+ at org.springframework.http.server.reactive.AbstractListenerReadPublisher.handlePendingCompletionOrError(AbstractListenerReadPublisher.java:249) ~[spring-web-6.2.17.jar!/:6.2.17]
+ at org.springframework.http.server.reactive.AbstractListenerReadPublisher$State$4.onDataAvailable(AbstractListenerReadPublisher.java:404) ~[spring-web-6.2.17.jar!/:6.2.17]
+ at org.springframework.http.server.reactive.AbstractListenerReadPublisher.onDataAvailable(AbstractListenerReadPublisher.java:125) ~[spring-web-6.2.17.jar!/:6.2.17]
+ at org.springframework.http.server.reactive.ServletServerHttpRequest$RequestBodyPublisher.checkOnDataAvailable(ServletServerHttpRequest.java:347) ~[spring-web-6.2.17.jar!/:6.2.17]
+ at org.springframework.http.server.reactive.AbstractListenerReadPublisher.changeToDemandState(AbstractListenerReadPublisher.java:239) ~[spring-web-6.2.17.jar!/:6.2.17]
+ at org.springframework.http.server.reactive.AbstractListenerReadPublisher$State$2.request(AbstractListenerReadPublisher.java:354) ~[spring-web-6.2.17.jar!/:6.2.17]
+ at org.springframework.http.server.reactive.AbstractListenerReadPublisher$ReadSubscription.request(AbstractListenerReadPublisher.java:280) ~[spring-web-6.2.17.jar!/:6.2.17]
+ at reactor.core.publisher.Operators$BaseFluxToMonoOperator.request(Operators.java:2066) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.request(FluxFilterFuseable.java:411) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.request(FluxMapFuseable.java:360) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.request(FluxContextWrite.java:136) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoFlatMap$FlatMapMain.request(MonoFlatMap.java:194) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:2366) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onSubscribe(FluxOnErrorResume.java:74) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoFlatMap$FlatMapMain.onSubscribe(MonoFlatMap.java:117) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onSubscribe(FluxContextWrite.java:101) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onSubscribe(FluxMapFuseable.java:265) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onSubscribe(FluxFilterFuseable.java:305) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.Operators$BaseFluxToMonoOperator.onSubscribe(Operators.java:2050) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at org.springframework.http.server.reactive.AbstractListenerReadPublisher$State$1.subscribe(AbstractListenerReadPublisher.java:322) ~[spring-web-6.2.17.jar!/:6.2.17]
+ at org.springframework.http.server.reactive.AbstractListenerReadPublisher.subscribe(AbstractListenerReadPublisher.java:112) ~[spring-web-6.2.17.jar!/:6.2.17]
+ at reactor.core.publisher.FluxSource.subscribe(FluxSource.java:71) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:76) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoDeferContextual.subscribe(MonoDeferContextual.java:55) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:76) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:165) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:74) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:82) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxConcatMapNoPrefetch$FluxConcatMapNoPrefetchSubscriber.innerNext(FluxConcatMapNoPrefetch.java:259) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxConcatMap$ConcatMapInner.onNext(FluxConcatMap.java:865) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:122) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:200) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:122) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:82) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxConcatArray$ConcatArraySubscriber.onNext(FluxConcatArray.java:180) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:82) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxConcatMapNoPrefetch$FluxConcatMapNoPrefetchSubscriber.innerNext(FluxConcatMapNoPrefetch.java:259) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxConcatMap$ConcatMapInner.onNext(FluxConcatMap.java:865) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxConcatMap$WeakScalarSubscription.request(FluxConcatMap.java:480) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.request(Operators.java:2330) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxConcatMapNoPrefetch$FluxConcatMapNoPrefetchSubscriber.request(FluxConcatMapNoPrefetch.java:339) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoNext$NextSubscriber.request(MonoNext.java:108) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxConcatArray$ConcatArraySubscriber.request(FluxConcatArray.java:256) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoNext$NextSubscriber.request(MonoNext.java:108) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxMap$MapSubscriber.request(FluxMap.java:164) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxPeek$PeekSubscriber.request(FluxPeek.java:138) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxMap$MapSubscriber.request(FluxMap.java:164) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.request(Operators.java:2330) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxConcatMapNoPrefetch$FluxConcatMapNoPrefetchSubscriber.request(FluxConcatMapNoPrefetch.java:339) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoNext$NextSubscriber.request(MonoNext.java:108) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:2366) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:2240) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoNext$NextSubscriber.onSubscribe(MonoNext.java:70) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxConcatMapNoPrefetch$FluxConcatMapNoPrefetchSubscriber.onSubscribe(FluxConcatMapNoPrefetch.java:164) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:201) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:83) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:76) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:53) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:76) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:53) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.Mono.subscribe(Mono.java:4576) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFlatMap.trySubscribeScalarMap(FluxFlatMap.java:205) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoFlatMap.subscribeOrReturn(MonoFlatMap.java:53) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:63) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:53) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:76) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:53) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:76) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoDeferContextual.subscribe(MonoDeferContextual.java:55) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:53) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:76) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:53) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.Mono.subscribe(Mono.java:4576) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:82) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:155) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:74) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFilter$FilterSubscriber.onNext(FluxFilter.java:113) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxPeekFuseable$PeekFuseableConditionalSubscriber.onNext(FluxPeekFuseable.java:503) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxDefaultIfEmpty$DefaultIfEmptySubscriber.onNext(FluxDefaultIfEmpty.java:122) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:82) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxConcatMapNoPrefetch$FluxConcatMapNoPrefetchSubscriber.innerNext(FluxConcatMapNoPrefetch.java:259) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxConcatMap$ConcatMapInner.onNext(FluxConcatMap.java:865) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:158) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:122) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFilter$FilterSubscriber.onNext(FluxFilter.java:113) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxPeekFuseable$PeekConditionalSubscriber.onNext(FluxPeekFuseable.java:854) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:74) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:82) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFilter$FilterSubscriber.onNext(FluxFilter.java:113) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFlatMap$FlatMapMain.tryEmitScalar(FluxFlatMap.java:492) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFlatMap$FlatMapMain.onNext(FluxFlatMap.java:424) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:210) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxIterable$IterableSubscription.slowPath(FluxIterable.java:335) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxIterable$IterableSubscription.request(FluxIterable.java:294) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.request(FluxPeekFuseable.java:144) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFlatMap$FlatMapMain.onSubscribe(FluxFlatMap.java:373) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onSubscribe(FluxPeekFuseable.java:178) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:201) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:83) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.Mono.subscribe(Mono.java:4576) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxConcatMapNoPrefetch$FluxConcatMapNoPrefetchSubscriber.onNext(FluxConcatMapNoPrefetch.java:207) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxIterable$IterableSubscription.slowPath(FluxIterable.java:335) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxIterable$IterableSubscription.request(FluxIterable.java:294) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxConcatMapNoPrefetch$FluxConcatMapNoPrefetchSubscriber.innerComplete(FluxConcatMapNoPrefetch.java:275) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxConcatMap$ConcatMapInner.onComplete(FluxConcatMap.java:889) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoFlatMap$FlatMapMain.onComplete(MonoFlatMap.java:189) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:144) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFilter$FilterSubscriber.onComplete(FluxFilter.java:166) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxPeekFuseable$PeekConditionalSubscriber.onComplete(FluxPeekFuseable.java:940) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:85) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2572) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:2366) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:2240) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:55) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.Mono.subscribe(Mono.java:4576) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:82) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoNext$NextSubscriber.onComplete(MonoNext.java:102) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFilter$FilterSubscriber.onComplete(FluxFilter.java:166) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFlatMap$FlatMapMain.checkTerminated(FluxFlatMap.java:850) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFlatMap$FlatMapMain.drainLoop(FluxFlatMap.java:612) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFlatMap$FlatMapMain.drain(FluxFlatMap.java:592) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFlatMap$FlatMapMain.request(FluxFlatMap.java:349) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFilter$FilterSubscriber.request(FluxFilter.java:186) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoNext$NextSubscriber.request(MonoNext.java:108) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.request(Operators.java:2330) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxPeekFuseable$PeekConditionalSubscriber.request(FluxPeekFuseable.java:783) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFilter$FilterSubscriber.request(FluxFilter.java:186) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxMap$MapSubscriber.request(FluxMap.java:164) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoFlatMap$FlatMapMain.request(MonoFlatMap.java:194) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.request(Operators.java:2330) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxConcatMapNoPrefetch$FluxConcatMapNoPrefetchSubscriber.request(FluxConcatMapNoPrefetch.java:339) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoNext$NextSubscriber.request(MonoNext.java:108) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxDefaultIfEmpty$DefaultIfEmptySubscriber.request(FluxDefaultIfEmpty.java:98) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.request(MonoPeekTerminal.java:139) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxPeekFuseable$PeekFuseableConditionalSubscriber.request(FluxPeekFuseable.java:437) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.request(MonoPeekTerminal.java:139) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFilter$FilterSubscriber.request(FluxFilter.java:186) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:2366) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:2240) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFilter$FilterSubscriber.onSubscribe(FluxFilter.java:85) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onSubscribe(MonoPeekTerminal.java:152) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxPeekFuseable$PeekFuseableConditionalSubscriber.onSubscribe(FluxPeekFuseable.java:471) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onSubscribe(MonoPeekTerminal.java:152) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.Operators$BaseFluxToMonoOperator.onSubscribe(Operators.java:2050) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoNext$NextSubscriber.onSubscribe(MonoNext.java:70) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxConcatMapNoPrefetch$FluxConcatMapNoPrefetchSubscriber.onSubscribe(FluxConcatMapNoPrefetch.java:164) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:201) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:83) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:76) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoDeferContextual.subscribe(MonoDeferContextual.java:55) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:76) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:53) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:76) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:53) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.Mono.subscribe(Mono.java:4576) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:265) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.Mono.subscribe(Mono.java:4576) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:82) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFilter$FilterSubscriber.onComplete(FluxFilter.java:166) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxPeekFuseable$PeekConditionalSubscriber.onComplete(FluxPeekFuseable.java:940) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:85) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2572) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:2366) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:2240) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:55) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.Mono.subscribe(Mono.java:4576) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:82) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoNext$NextSubscriber.onComplete(MonoNext.java:102) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFilter$FilterSubscriber.onComplete(FluxFilter.java:166) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFlatMap$FlatMapMain.checkTerminated(FluxFlatMap.java:850) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFlatMap$FlatMapMain.drainLoop(FluxFlatMap.java:612) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFlatMap$FlatMapMain.drain(FluxFlatMap.java:592) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFlatMap$FlatMapMain.onComplete(FluxFlatMap.java:469) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onComplete(FluxPeekFuseable.java:277) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxIterable$IterableSubscription.slowPath(FluxIterable.java:357) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxIterable$IterableSubscription.request(FluxIterable.java:294) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.request(FluxPeekFuseable.java:144) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFlatMap$FlatMapMain.onSubscribe(FluxFlatMap.java:373) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onSubscribe(FluxPeekFuseable.java:178) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:201) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:83) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:76) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:53) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:165) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.Operators$BaseFluxToMonoOperator.completePossiblyEmpty(Operators.java:2096) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxDefaultIfEmpty$DefaultIfEmptySubscriber.onComplete(FluxDefaultIfEmpty.java:134) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:144) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:144) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxFilter$FilterSubscriber.onComplete(FluxFilter.java:166) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxMap$MapConditionalSubscriber.onComplete(FluxMap.java:275) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1865) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoCacheTime$CoordinatorSubscriber.signalCached(MonoCacheTime.java:337) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoCacheTime$CoordinatorSubscriber.onNext(MonoCacheTime.java:354) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:200) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:74) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:210) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.publisher.MonoPublishOn$PublishOnSubscriber.run(MonoPublishOn.java:181) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:68) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:28) ~[reactor-core-3.7.17.jar!/:3.7.17]
+ at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na]
+ at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) ~[na:na]
+ at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[na:na]
+ at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na]
+ at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]
+Caused by: java.io.IOException:
+
+504 Gateway Time-out
+
+
504 Gateway Time-out
+
The gateway did not receive a timely response from the upstream server or application. Sorry for the inconvenience.
+Please report this message and include the following information to us.
+Thank you very much!